Add Footer + ServiceSelector organisms

Footer:
- Dark espresso (brand.950) bg, inverse white text
- Logo, tagline, contact (phone/email), link group columns, legal bar
- Semantic HTML: <footer>, <nav> per group, <ul> for lists
- Critique 38/40, P2 fixes applied (legal link size, nav landmarks)

ServiceSelector:
- Single-select panel for arrangement flow
- Composes ServiceOption × n + Typography + Button (radiogroup)
- Auto-disables continue when nothing selected
- 7 stories incl. InArrangementFlow with StepIndicator

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-25 22:04:30 +11:00
parent d52fb0c4ee
commit 9ce8a7e120
8 changed files with 908 additions and 4 deletions

View File

@@ -796,7 +796,51 @@ Each entry follows this structure:
- **Planned (4 organisms):** ServiceSelector, PricingTable, ArrangementForm, Footer
**Next steps:**
- Build Footer organism (Link + Typography + Divider — dependencies ready)
- Build ServiceSelector organism (ServiceOption × n + Typography + Button)
- ~~Build Footer organism~~ ✓ Done
- ~~Build ServiceSelector organism~~ ✓ Done
- Consider FormField molecule if Input's built-in label/helperText proves insufficient
- Remaining P3s: InfoOutlinedIcon sizing in ProviderCard, image loading placeholder, accent bar 3px→4px
### Session 2026-03-25p (continued) — Footer + ServiceSelector organisms
**Agent(s):** Claude Opus (via conversation)
**Work completed:**
- Built Footer organism (`src/components/organisms/Footer/`):
- Dark espresso (brand.950) surface with inverse white text
- Logo + tagline + contact info (phone/email with tel:/mailto: links) in left column
- Configurable link group columns with heading + `<ul>` list
- Bottom legal bar: copyright + legal links (Privacy, Terms, Accessibility)
- Semantic HTML: `<footer>`, `<nav aria-label>` per link group, `<ul>` for link lists
- Responsive: stacks to single column on mobile, side-by-side on desktop
- 5 stories: Default, Minimal, WithContactOnly, TwoColumns, FullPage (Nav + content + Footer)
- Critique: 38/40 (Excellent). P2 fixes applied: legal links bumped from 11px → 12px, nav landmarks added
- Built ServiceSelector organism (`src/components/organisms/ServiceSelector/`):
- Single-select panel composing Typography + ServiceOption × n + Button
- Heading + optional subheading + radiogroup of ServiceOption cards + optional continue button
- Continue button auto-disables when nothing selected (overridable via `continueDisabled`)
- `maxDescriptionLines` pass-through to ServiceOption for truncation
- 7 stories: Default, PreSelected, Interactive, CoffinSelection, WithTruncatedDescriptions, WithoutContinue, WithDisabledOptions, InArrangementFlow (with StepIndicator)
- No new tokens needed — both organisms reuse existing token system
- TypeScript compiles, Storybook builds
**Decisions made:**
- Footer uses brand.950 (espresso) background — darkest brand tone for maximum contrast with white text, warm but professional
- Footer link groups get individual `<nav aria-label>` landmarks — better screen reader navigation
- ServiceSelector is a controlled component: parent manages `selectedId` + `onSelect`. Keeps state lifting simple for arrangement flow.
- Continue button defaults to disabled when nothing selected — prevents empty submissions without explicit error messages
**Component status at end of session:**
- **Done (11 atoms):** Button, Typography, Input, Card, Badge, Chip, Switch, Radio, IconButton, Divider, Link
- **Done (6 molecules):** ProviderCard, VenueCard, ServiceOption, SearchBar, AddOnOption, StepIndicator
- **Done (1 organism):** Navigation
- **Review (2 organisms):** Footer (critique 38/40), ServiceSelector
- **Planned (3 atoms):** Icon, Avatar, ColourToggle, Slider
- **Planned (2 molecules):** MapCard, FormField
- **Planned (2 organisms):** PricingTable, ArrangementForm
**Next steps:**
- User to review Footer + ServiceSelector in Storybook
- Build ArrangementForm organism (StepIndicator + ServiceSelector + AddOnOption — multi-step flow)
- Consider FormField molecule if Input's built-in label/helperText proves insufficient
- P3 cleanup: inverse logo SVG, InfoOutlinedIcon sizing, image placeholder, accent bar 3px→4px