用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/aiFabricoCom/fabrico-collections-codex --skill fabrico-implementing-forms命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | fabrico-implementing-forms |
| description | Form architecture, schema validation, and multi-step flows. |
Provides patterns and workflows for building robust, accessible forms with schema-based validation, composable field components, and multi-step form flows.
Define validation rules as a separate schema, co-located with but decoupled from UI code. The schema is the single source of truth for what constitutes valid data. Infer TypeScript types from schemas to eliminate drift between validation rules and form types. Never duplicate type definitions manually — derive them from the schema. Show validation errors at the right moment: on field blur or form submission, not on every keystroke. Help users fix errors rather than frustrate them with premature feedback. After the first validation pass, switch to on-change validation so users see errors clear as they correct them. Every form field must have a visible label. Error messages must be announced to screen readers via `role="alert"` or `aria-live` regions. The form must be fully navigable by keyboard alone — Tab through fields, Enter to submit, Escape to cancel where applicable. Associate error messages with their fields using `aria-describedby`.Use the checklist below and track progress:
Progress:
- [ ] Step 1: Define the data model
- [ ] Step 2: Build field components
- [ ] Step 3: Compose the form
- [ ] Step 4: Handle multi-step flows (if applicable)
- [ ] Step 5: Verify accessibility
Step 1: Define the data model
*.schema.ts or validation/ directory). The schema declares every constraint: required fields, min/max lengths, patterns, custom rules, cross-field dependencies.Step 2: Build field components
Create composable field wrapper components that connect the form library's state to the component library's inputs. Each field wrapper:
<label>, the input element, and an error message container.aria-invalid="true" when the field has an error.aria-describedby pointing to the error message element's id.aria-required="true" for required fields.<input type="file"> visually and use a styled trigger button with aria-label. Display selected file name(s), size, and a remove action. Validate file type and size in the schema — reject invalid files before upload begins.Step 3: Compose the form
Assemble field components into a form:
novalidate attribute to the <form> element when using custom validation — this disables browser-native validation bubbles that conflict with the form library's error display. The schema-based validation from Step 1 replaces the browser's built-in constraints.<form> behavior — do not break it with preventDefault on the wrong element).Step 4: Handle multi-step flows (if applicable)
When a form spans multiple steps or pages:
Step 5: Verify accessibility
Use the fabrico-ensuring-accessibility skill for a thorough audit. At minimum, verify:
<input>, <select>, and <textarea> has an associated <label> element (via for/id pairing or wrapping).role="alert" or are in an aria-live="polite" region so screen readers announce them.aria-required).| Validation mode | When to use | Behavior |
|---|---|---|
| On submit | Simple forms, few fields | Validate all fields on submit, show all errors at once |
| On blur | Complex forms, many required fields | Validate each field when the user leaves it |
| On change (with debounce) | Real-time feedback needed (password strength, username availability) | Validate as user types, debounced to avoid excessive checks |
| Mixed | Best UX for most forms | Validate on blur initially; after the first error, switch to on-change so errors clear immediately when corrected |
| Pattern | Description |
|---|---|
| Inline below field | Error message directly under the invalid field — most common, recommended default |
| Summary at top | List of all errors at the top of the form — useful for long forms, aids screen readers |
| Inline + summary | Both inline and summary — best accessibility (screen reader reads summary, sighted users see inline) |
| Toast/notification | Only for server-side submission errors, never for field-level validation |
Form:
- [ ] Validation schema defined separately from UI
- [ ] TypeScript type inferred from schema (no manual duplication)
- [ ] Every field has a visible label
- [ ] Error messages shown inline below fields
- [ ] Errors announced to screen readers (role="alert" or aria-live)
- [ ] Submit button disabled during submission
- [ ] Server-side errors mapped to specific fields
- [ ] Tab order follows visual layout
- [ ] Form submittable via Enter key
- [ ] Loading state during async submission
| Anti-Pattern | Instead Do |
|---|---|
| Manual validation in event handlers | Use a schema-based validation library |
| Duplicating types between schema and form | Infer types from the schema |
| Showing errors on every keystroke | Use blur or mixed-mode validation |
| Unlabeled inputs (placeholder as label) | Always use visible <label> elements |
| Generic "Form has errors" message | Specific per-field error messages |
| Losing form data on back-navigation | Persist state across steps |
| Ignoring server-side errors | Map API errors to specific form fields |
| Submit button without loading state | Disable button + show spinner during submission |
fabrico-implementing-frontend — for component composition patterns and framework-specific references (form library integration, validation library choice)fabrico-ensuring-accessibility — for WCAG compliance in form fields, labels, and error announcementsfabrico-writing-hooks — for custom form-related hooks/composables (useFormField, useMultiStepForm)fabrico-reviewing-frontend — for form-specific review criteria during code review