Material 3
Foundations
Every Material 3 foundation chapter, judged for this CSS-first site. Adopt means use the tokens and patterns. Reject means do not build it. Partial means logical properties and familiar gestures only.
Spec: m3.material.io/foundations. Destination UX still governs hierarchy and trip chrome — this page is the visual contract, not a second product.
-
Design tokens
Adopt
Single source: --md-sys-* in wod-m3-tokens.css, with --wod-* aliases. Dark remaps roles once. Do not add a third palette.
-
Interaction
Adopt
Buttons, icon buttons, chips use ::before state layers + cyan focus ring (--md-sys-focus-ring-color). Filled CTAs scale 1→1.02 on hover (spatial spring). Pill radius stays on press.
-
Gestures
Partial
Keep: horizontal scroll-snap, event swipe-nav, /plan HTML5 drag. Reject: custom swipe-only IA with no visible handle (Jakob + Norman affordance).
-
Inputs
Adopt
Outlined fields 56dp (.wod-field) rest on surface-lowest + outline-variant. Search bar full-shape 56dp (.wod-search) — not a gray well. Date cells 40dp.
-
Selection
Adopt
Filter chips: secondary-container when selected; .wod-chip--emphasis uses volt tertiary for “new” CMS markers. Day chips: secondary-container when active. One filled CTA per view.
-
States
Adopt
Enabled, hovered, focused, pressed, dragged (16%), disabled (38%). Error uses error / error-container. Dragged is a state layer + elevation, not a 55% ghost.
-
Layout — overview & scaffold
Adopt
Window, bars, body (#main), pane, spacer, rulers. Bottom nav at every breakpoint — no rail, no drawer.
-
Grids, spacing, breakpoints
Adopt
4 / 8 / 12 columns. Micro ≤370 margin 12dp; compact 16 / medium+ 24 / XL 32. Feed 1–4 cards. Minimum supported viewport: 370px.
-
Bidirectionality & RTL
Partial
New layout uses padding-inline / margin-inline / inset-inline. Site lang is en; do not hardcode left/right for chrome or fields.
-
Canonical examples
Adopt
Feed = listings. List–detail = /plan from 840dp. Supporting pane = /near-me full page. Single pane = passport, submit, reading.
-
Usability
Adopt (product)
48dp targets, one primary CTA, empty states with a next step, Dark as toolbar not prefers-color-scheme. Destination books still trump decoration.
-
Color system / roles / schemes
Adopt
Primary lavender #B593FF with black labels. Secondary cyan for focus ring + selected nav. Tertiary volt for “new” chips only. Engagement purple via --md-ref-color-engagement. Dark is a11y toolbar (aubergine surface).
-
Color — advanced / resources
Reject extras
No content/fidelity/expressive scheme variants, no MCU in the bundle. Tone mapping lives in tokens; /design/color is the role chart.
-
Elevation
Tonal first
surface-container* for lists and bands. --md-sys-elevation-0–5 only for overlays, nav, FAB, and drag. Do not shadow every card.
-
Icons
Adopt
Material Symbols Rounded via MdSymbol. Idle FILL 0, FILL 1 when aria-pressed, aria-current, or .is-selected. Subset icon_names stays sorted.
-
Motion
Adopt (web)
Emphasized easing, dual-declare springs on CTAs, press 0.96, prefers-reduced-motion. No hold-to-squash morph. No GSAP.
-
Shape
Adopt
Full buttons, extra-large cards (28), medium fields (12), small chips (8). Web keeps pill radius on press.
-
Typography
Adopt
Fifteen roles in wod-typescale.css. Brand = Inter Tight (Display/Headline); plain = Inter (Body/Label/buttons). Prefer .wod-type-* over one-off font-size.
State layers (live)
Hover, focus, and press are CSS overlays on on-surface / currentColor — not a darker hex. Disabled is 38% opacity.