text-[18px] md:text-[28px] matches auth form pattern.
font-medium (500) replaces font-semibold (600) per design system rules.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
font-['var(--font-display)'] → font-[var(--font-display)] so Fraunces
display font is applied correctly to the h1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Email/password fields, client-side validation, password show/hide,
server error display via form prop, signup link.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Parameterized test verifying the exact boundary of the 8-character
minimum password requirement.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Verifies all three validation errors (name, email, password) appear
simultaneously when submitting a completely empty form.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SignupForm now uses use:enhance for progressive enhancement.
Accepts form prop for server-side error display. Shows general
form errors in a banner and field-specific errors inline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spec shows green text with font-weight 500, no underline by default.
Was dark text with underline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
--green (#3D8C4A) gives 4.16:1 against white — fails AA.
--green-dark (#2E6E39) passes comfortably.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Form with name/email/password fields, client-side validation,
inline error messages, and password show/hide toggle.
Uses native form action for progressive enhancement.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Renders brand identity with logo, app name, tagline, and feature icons
on green-dark background. Responsive: banner on mobile, 440px column
on desktop.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Applies hover:bg-[var(--color-subtle)] to inactive nav links for
visual feedback on pointer devices.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Renders emoji icons in MobileTabBar (stacked above label),
TabletNavBar (inline), and DesktopSidebar (16px, 20px column).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Proves active state logic generalizes beyond /planner by testing
all 4 mobile nav routes with writable page store.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extracts isActiveRoute() into shared nav module. Matches exact path
or path + '/' prefix, preventing /settings from matching /settings-advanced.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- (app) group with AppShell layout, loads user/household from locals
- (public) group with full-viewport split layout, /login placeholder
- Root / redirects to /planner for authenticated users
- Placeholder stubs for planner, recipes, shopping, settings, members
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Load Fraunces, DM Sans, DM Mono via Google Fonts preconnect in app.html
- Define all design tokens in @theme block: neutrals, green/yellow/blue/
purple/orange scales, spacing (--space-1..20), radii, shadows, button base
- Note --green-dark as button background (--green fails WCAG AA with white)
- Add @types/node for Node fs/path usage in design-system tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
White on --green-dark (not --green) is the correct button background;
--green (#3D8C4A) gives only 4.16:1 which fails AA for normal-size text.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>