Design Consistency Audit — Ticket #3273 (Forgot Password Flow) Gate 6 | 2026-09-08 ================================================================ Skill resolution: - nextjs-tailwind-design-system-audit: Option 3 (read_file) — /opt/drcarrot-deploy/cross-repo-orchestration/skills/nextjs-tailwind-design-system-audit/SKILL.md - nextjs-tailwind-accessibility-audit: Option 3 (read_file) — /opt/drcarrot-deploy/cross-repo-orchestration/skills/nextjs-tailwind-accessibility-audit/SKILL.md Files audited: - app/(auth)/forgot-password/page.tsx - app/(auth)/forgot-password/verify/page.tsx - app/(auth)/forgot-password/reset/page.tsx - components/auth/ForgotPasswordForm.tsx - components/auth/VerifyOtpForm.tsx - components/auth/ResetPasswordForm.tsx - components/auth/SignInForm.tsx Design spec: docs/specs/ticket-3273-design.md Tailwind config: tailwind.config.ts (read and cross-referenced) ================================================================ PART 1 — DESIGN SYSTEM AUDIT ================================================================ Methodology: Read tailwind.config.ts token definitions, then inspected every Tailwind class in each feature file against the design spec's Token Mapping table and the Layout / Spacing Values table. Checked for: - Arbitrary hex/rgb values that duplicate an existing token - Inconsistent typography/spacing for the same UI role - Components that should reuse the shared component library but don't Positive baseline (consistency confirmed): - All four form components reuse BrandPanel, SubmitButton, Button, and PasswordField from the shared component library where the design calls for existing components. - All semantic colors (accent, text, text-subtle, text-faint, border-field, status-success, status-danger, surface) use their Tailwind token classes consistently across all files. - Typography scale is consistent: auth headings use text-[26px]/leading-8/ font-bold (same as SignInForm from #3252), reset heading uses text-[20px]/ font-semibold (per spec), body uses text-sm, footnotes use text-xs/ leading-[18px]. - Spacing matches the design spec's arbitrary-value table exactly: w-[360px] (steps 1-2), max-w-[480px] (step 3), h-[52px] (OTP boxes), gap-[10px] (OTP row), mb-[14px] (back nav), mt-[10px] (forgot link). - The two-panel auth layout (fixed inset-0 bg-surface flex overflow-hidden z-[100] + BrandPanel + flex-grow centered column) is structurally identical across all four forms. Findings: [DS-1] P3 — SVG hardcoded stroke values (pre-existing pattern, not new) File: components/auth/ResetPasswordForm.tsx, lines 138, 164 Problem: SVG check icons use inline stroke={rulesMet[i] ? "rgb(34,158,75)" : "rgb(163,163,163)"} and stroke="rgb(163,163,163)" instead of Tailwind stroke-status-success / stroke-text-faint classes. Values correct: rgb(34,158,75) = #229e4b = status.success; rgb(163,163,163) = #a3a3a3 = text.faint. Token values match exactly. Context: Copied from components/forms/ResetPasswordForm.tsx (lines 130, 137) as instructed by the design spec. Pre-existing pattern, not a regression. Recommended fix: Refactor both files to use className="stroke-status-success" / className="stroke-text-faint" and remove inline stroke attributes. Risk: None — values identical, only mechanism changes. [DS-2] P3 — Inactive strength bar hardcoded color (pre-existing, documented) File: components/auth/ResetPasswordForm.tsx, line 112 Problem: bg-[rgb(230,230,230)] for empty strength bar segments has no named token. Context: Design spec explicitly documents this as "Existing pattern — copy verbatim." Same usage in components/forms/ResetPasswordForm.tsx. No token needed per spec. [DS-3] P3 — BrandPanel SVG fill attributes (pre-existing, not this ticket) File: components/auth/BrandPanel.tsx, lines 33-39 Problem: Decorative SVG uses inline fill="rgb(226,205,176)" (accent.selected), fill="rgb(247,241,233)" (accent.subtle), fill="rgb(69,40,40)" (accent.DEFAULT) as raw values. Context: BrandPanel predates this ticket (#3252). Decorative, aria-hidden. SVG fill attributes in this pattern are standard. No P1 or P2 design-system findings. All design-spec token mappings verified correct. No off-token colors introduced by this ticket. ================================================================ PART 2 — ACCESSIBILITY AUDIT ================================================================ Methodology: Grepped for outline-none, onClick on non-interactive elements, aria-describedby, aria-live, role attributes. Read each form component checking: focus indicators, keyboard navigation, label association, semantic HTML, error message association, state announcements, disabled-state correctness. Positive baseline (correctly handled): - All interactive elements are proper semantic HTML: