Living reference
Design system
Every base component with its states. Rules and tokens live in docs/design.md.
Button
ui/components/base/button.tsxPills that press to 0.97. Loading keeps width and focus, and swaps the label for a spinner with a soft blur.
Field, Form
ui/components/base/field.tsx · form.tsxBase UI wires labels, hints and validity. Errors fade in under the input; the form blocks invalid submits and focuses the first problem.
Badge, Spinner, Switch
ui/components/base/badge.tsx · spinner.tsx · switch.tsxSmall status and toggles. The switch thumb stretches while pressed.
NeutralMintOpen nowOverdue
Email reminders
Tabs
ui/components/base/tabs.tsxSegmented control. The indicator glides; panels fade in.
Six bookings, two courts free after 6pm.
Menu, Dialog, Drawer, Toast
ui/components/base/menu.tsx · dialog.tsx · drawer.tsx · toast.tsxMenus grow from their trigger; dialogs stay centred; drawers follow your finger; toasts stack and expand on hover.
Presence and layout
motion/react · ui/motion/presets.tsItems fade in and out. Motion here is opacity first: position and size change only when they carry meaning (drawers, tab indicators).
- Court 1
- Court 2
- Court 3