# @form-schema Shared schema contract and schema-driven behaviors for Crewli form rendering. Consumed by apps/portal (public submission) and apps/app (organizer builder + submissions review). ## What lives here - `types/` — TypeScript types and enum constants mirroring backend `FormBuilder` enums and `PublicForm(Schema|Submission)Resource` - `utils/formValidation.ts` — validation rule builders driven by `FormFieldValidationRules` - `composables/useConditionalLogic.ts` — evaluate `conditional_logic.show_when` against field values - `composables/useFormSteps.ts` — step navigation logic for multi-step forms - `composables/formatFieldValue.ts` — render a stored submission value as a human-readable string ## What does NOT live here Vue components. Each app renders its own UI. Portal has full-fidelity submit components; app has builder-preview and submissions-review components. Sharing renderers would couple the two apps' visual styles, which we explicitly want to avoid. ## Contract stability This is an alias-only shared directory inside the monorepo — no npm package, no semver. Breaking changes (new field type, new validation key, new conditional operator) require updating both apps in the same PR. TypeScript will flag missing cases in dispatchers.