--- phase: 09-md3-components plan: 04 type: execute wave: 1 depends_on: [] files_modified: - src/components/wizard/BackendSelectionStep.tsx autonomous: true gap_closure: true requirements: - COMP-01 - COMP-02 - COMP-03 - COMP-04 - DEBT-01 must_haves: truths: - "BackendSelectionStep 'Remote name' input renders as a TextFieldMD3 with floating label" - "Existing BackendSelectionStep tests pass without modification" - "Full test suite remains green (179+ tests)" artifacts: - path: "src/components/wizard/BackendSelectionStep.tsx" provides: "TextFieldMD3 integration for Remote name field" contains: "TextFieldMD3" key_links: - from: "src/components/wizard/BackendSelectionStep.tsx" to: "src/components/ui/TextFieldMD3.tsx" via: "import { TextFieldMD3 }" pattern: "import.*TextFieldMD3.*from" - from: "src/components/wizard/BackendSelectionStep.tsx" to: "react-hook-form" via: "register('name') passed as registration prop" pattern: "registration=.*register" --- Close verification gap: BackendSelectionStep "Remote name" input is the only text input in the wizard that does not use TextFieldMD3 with a floating label. This violates COMP-01's "All text inputs" requirement. Purpose: Achieve 12/12 must-have truths for Phase 9 verification (currently 11/12 partial). Output: Updated BackendSelectionStep.tsx with TextFieldMD3 replacing the plain label+input. @C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md @C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.md @.planning/phases/09-md3-components/09-03-SUMMARY.md From src/components/ui/TextFieldMD3.tsx: ```typescript interface TextFieldMD3Props { id: string; label: string; error?: FieldError; registration: UseFormRegisterReturn; type?: 'text' | 'password'; helpText?: string; required?: boolean; suffix?: React.ReactNode; } export function TextFieldMD3({ id, label, error, registration, type, helpText, required, suffix }: TextFieldMD3Props): JSX.Element; ``` From src/styles/md3-buttons.ts: ```typescript export const MD3_BTN_FILLED: string; ``` Task 1: Replace plain Remote name input with TextFieldMD3 src/components/wizard/BackendSelectionStep.tsx In BackendSelectionStep.tsx, replace the plain label+input block (lines 57-63) with a TextFieldMD3 component: 1. Add import: `import { TextFieldMD3 } from '../ui/TextFieldMD3';` 2. Replace this block: ```tsx
{errors.name && (

{errors.name.message}

)}
``` With: ```tsx ``` Key constraints: - Keep `id="remote-name"` unchanged (matches existing test selectors via getByRole('textbox')) - Pass `register('name')` as `registration` prop (same pattern as FieldRenderer, line 103 of FieldRenderer.tsx) - Pass `errors.name` as `error` prop — TextFieldMD3 already renders `role="alert"` on error messages - Remove the manual `{errors.name && ...}` block since TextFieldMD3 handles error display internally - Add `required` prop since the name field is required (schema has `.min(1)`) The existing tests use `screen.getByRole('textbox')` to find the input and `screen.getByRole('alert')` for error messages. TextFieldMD3 preserves both: the `` retains its textbox role, and the error `

` has `role="alert"`. npx vitest run src/components/wizard/BackendSelectionStep.test.tsx --reporter=dot && npx vitest run --reporter=dot BackendSelectionStep renders "Remote name" as a TextFieldMD3 with floating label. All 5 BackendSelectionStep tests pass. Full test suite (179+ tests) remains green. COMP-01 "All text inputs" requirement is fully satisfied. 1. `npx vitest run src/components/wizard/BackendSelectionStep.test.tsx` — all 7 tests pass (WIZD-01 + WIZD-04) 2. `npx vitest run --reporter=dot` — full suite green, zero regressions 3. Grep check: no remaining plain `