Components
Every Catalyst component, isolated on its own preview page. Use these as a sandbox while designing — copy a page, tweak it, and commit your variants.
Form
- Button
Primary, secondary, outline, plain, and color variants.
- Input
Text inputs with optional invalid and disabled states.
- Textarea
Multiline text input.
- Select
Native select wrapper, styled.
- Checkbox
Single and grouped checkboxes with labels.
- Radio
Radio groups with labels and descriptions.
- Switch
Toggle switch for boolean state.
- Fieldset
Fieldset, legend, field, label, description, error.
- Combobox
Searchable single-select dropdown.
- Listbox
Headless UI listbox-based select.
- Choice Cards
Card-styled single-select with in-place selection motion.
- Segmented
Pill segmented control with a sliding active pill (hairline inset stroke, canvas pill, spring). Shared by the log-hours toggles and three Console scheduling surfaces.
- Contact Method
Email / phone account-identifier toggle.
- Location Picker
Map + list store chooser in a modal: matte Google map, distances when located, and a use-my-location trigger.
- Address Search
Search-first address entry (Uber pattern): typed query → mock autocomplete suggestions + use-my-current-location + manual entry. No map (no geocoding). No product surface takes an address since pick-up came out; kept as a built control.
- Field Inputs
Purpose-optimised masked fields: card number (with live brand detection), expiry, phone, numeric.
- Payment Fields
The shared payment primitives behind checkout and the in-app payment sheet: the radio-dot indicator, the accepted-cards strip (with overflow popover), the card-on-file network mark, and the card-entry fieldset — one source so the two surfaces can’t drift.
- Password Input
Password field with a show/hide eye toggle.
- Dropzone
Click-or-drag upload zone, plus the badge and button that overlay a media preview (fixed dark scrim, legible in both themes).
- Signature Pad
Drawn ("wet") signature canvas for documents that need a hand signature rather than the typed e-signature; strokes survive a resize and the ink follows the theme.
- Copy Button
Copy-to-clipboard control with the house green-success beat (icon cross-fade + label rise); shared by the invite dialog and the referral link field.
Display
- Location Map
Matte-styled Google map (with keyless fallback) plotting selectable SafeWay locations; the map half of Location Picker.
- Avatar
Image, initials, square or round.
- Badge
Colored status badges.
- Table
Data table with striped, bleeding edge, and dense variants.
- Description List
Label/value pairs.
- Divider
Horizontal rule, soft or strong.
- Empty State
Quiet placeholder for empty tables, lists, and search results.
- Stat
KPI metric card with a delta badge; StatGroup lays a row out in a responsive grid.
- Disclosure
Animated expand/collapse (accordion).
- Place List
The address/place results list — hairline rows, capped height with the overlay scroll cue; shared by the booking route picker and AddressSearch.
- Card
The generic surface shell — hairline ring + soft radius; composition-first (the base for cards/panels).
- Package Card
A driving-ed enrollment package for the catalog — includes, location-aware price, Enroll CTA.
- Checklist
Task list with per-row status (done / to-do) and actions — the setup-dashboard core.
- Seat-Time Badge
The on-brand per-package "SEAT TIME TRAINING" medallion; the hours numeral is the only variable.
- Journey Folders
The student-home progress tracker — a cyclic deck of status-striped folders; tap a header (or swipe the front card on mobile) to flip through, the next card previewing as it rises.
- Plan Wallet
The billing signature object — a plan card + payment card in a slot, with the update-payment dialog.
- Course Workbook
The Online course signature object — a bound spiral workbook: a Driver Education cover with a session-progress ring, the graded assessments (Reality Checks + Final Exam), and a foot-anchored "Continue in the classroom" launch.
- Behind the Wheel Card
The Driving-lessons signature object — a permit-style card (brand-yellow band over the state, or the student’s name on a guardian’s). One template for every viewer: two stacked zones that both FILL — an hours meter (observation + practice, 37h) over a “Your SafeWay package” punch-card that stamps as each prepaid drive is used, with the use-by date beneath. Only the label and the foot change: a TEEN sees “Practice hours” and just books; a GUARDIAN sees “Hours you log” (their responsibility — students can’t log) and gets Log hours beside Book; an ADULT (credit-based, no logged-hours requirement) drops the meter and shows just the package + book/buy. The identity fields and the old serif ring were dropped for this clearer two-zone read.
- Sticker Art
The imagery language — fanned decks of the product’s own UI fragments as die-cut stickers that deal in on entry; the stage-hero scenes and the invite header share it.
Feedback
- Notice
Inline, non-modal feedback banner (neutral / success / warning / critical).
- Toast
Transient bottom-center confirmation receipt for a completed async action; auto-dismissed.
- Info Hint
The quiet inline help affordance: a muted circle-i on a group / section / field label that opens a small self-contained popover with one short answer (~40 words, no “learn more”). Anchored to labels only — never page titles, values, buttons, or Notices — and held to a strict density budget (explain once, one dot per glance). The on-demand sibling to Notice. See THEME.md §16.
- Spinner
Small indeterminate spinner in the current text colour, for standalone busy states outside a Button.
Typography
Overlay
- Dialog Face
One step of a multi-step dialog: the standard cross-dissolve plus the focus handoff a face swap needs.
- Payment Dialog
In-app payment sheet for a transactional charge (outstanding balance, late-cancel fee): pay with the card on file or a different card, on the same picker as checkout. Not for purchases that need a selection step first.
- Buy Drive Hours Dialog
The buy-drive-hours flow: single-select one of three preset packages (with a "Save X%" cue on the bigger bundles), then morph into the shared payment sheet. Paying adds the drive hours to the package. Opened app-wide via openBuyDrives().
- Solo Popover
The two pieces a surface needs when its floating cards are one Popover per trigger: OnlyOne keeps a single card open across all of them, and PopoverTrigger forwards the ref Headless anchors against.
- Alert
Modal confirmation dialog.
- Dialog
Larger modal dialog.
- Dropdown
Menu dropdown with sections and icons.
- Overlay Scrollbar
The scroll cue for padded, rounded surfaces — painted over the content so it costs no layout width, keeping the gutter symmetric and the panel from shifting when it becomes scrollable.
Navigation
- Tabs
Underline tabs for in-page navigation and filtering.
- Pagination
Previous / next / page links.
- Navbar
Top navigation bar — consumed inside a layout.
- Sidebar
Sidebar navigation — consumed inside a layout.
Layout
- Auto Height
Animates a container’s height as its content changes, so multi-step panels morph instead of snapping.
- Scroll Fade
A soft gradient fade at the bottom of a bounded, scrolling list, so the last rows dissolve into the surface below instead of ending on a hard cut. The house treatment for every capped list (location picker, booking route/times lists, AddressSearch); pairs with OverlayScrollbar.
- Sidebar Layout
App shell with sidebar (this page is rendered inside one).
- Stacked Layout
App shell with a top navbar only.
- Auth Layout
Centered layout for login / register screens.
- Enrollment Layout
Split-screen (form + brand panel) for enrollment-process screens.