Skip to main content

form-refactorer

Refactor legacy forms to use modern Redpanda UI Registry Field components with react-hook-form and Zod validation. Use when user requests: (1) Form refactoring or modernization, (2) Updating forms to use Field components, (3) Migrating from legacy form patterns, (4) Implementing forms with react-hook-form and Zod validation.

Source facts

Repository
redpanda-data/console
Last source activity
September 16, 2026 at 14:00
Detected SKILL.md language
English
Stars
4,336
Forks
429

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
form-refactorer
description
Refactor legacy forms to use modern Redpanda UI Registry Field components with react-hook-form and Zod validation. Use when user requests: (1) Form refactoring or modernization, (2) Updating forms to use Field components, (3) Migrating from legacy form patterns, (4) Implementing forms with react-hook-form and Zod validation.
# Form Refactorer Refactor legacy forms to modern Redpanda UI Registry Field components with react-hook-form and Zod validation. ## Core Requirements ### MUST USE (Modern Pattern) - Field component family from `components/redpanda-ui/components/field` - react-hook-form for form state management - Zod for validation schemas via `zodResolver` ### FORBIDDEN (Legacy Patterns) See [no-legacy](../code-standards/rules/no-legacy.md) for prohibited patterns. Also never import `Form` from `components/redpanda-ui/components/form`. ## Component Hierarchy ``` FieldSet - Semantic fieldset container for related fields ├─ FieldLegend - Title for the fieldset ├─ FieldDescription - Description for entire fieldset └─ FieldGroup - Layout wrapper that stacks fields ├─ Field - Individual field wrapper │ ├─ FieldLabel - Label for input (use htmlFor) │ ├─ Input/Select/... - Form control │ ├─ FieldDescription - Helper text │ └─ FieldError - Error message ├─ FieldSeparator - Visual divider between fields └─ Field - Another field ``` ## Key Patterns **Vertical field:** ```tsx <Field data-invalid={!!errors.fieldName}> <FieldLabel htmlFor="fieldName">Label</FieldLabel> <Input id="fieldName" {...register("fieldName")} aria-invalid={!!errors.fieldName} /> {errors.fieldName && <FieldError>{errors.fieldName.message}</FieldError>} </Field> ``` **Horizontal field (switch/checkbox):** ```tsx <Field orientation="horizontal"> <Switch id="toggle" {...register("toggle")} /> <FieldContent> <FieldLabel htmlFor="toggle">Enable Feature</FieldLabel> <FieldDescription>Description</FieldDescription> </FieldContent> </Field> ``` ## Checklist Before completing refactoring, verify: - [ ] All legacy form imports removed (the legacy `Form` component) - [ ] Field components used for all fields - [ ] FieldLabel has `htmlFor` matching Input `id` - [ ] Errors show `data-invalid` on Field and `aria-invalid` on Input - [ ] Yup replaced with Zod + zodResolver - [ ] FieldSet + FieldLegend used for semantic grouping - [ ] FieldError conditionally rendered: `{errors.field && <FieldError>...` - [ ] Form submission handled via react-hook-form `handleSubmit` ## References - [Common Patterns](references/common-patterns.md) — Dynamic fields, field arrays, multi-section forms, pitfalls, Zod patterns - [Field Component Docs](https://redpanda-ui-registry.netlify.app/docs/field)
View on GitHub