# Garage design system The look of every Garage app — the hub, the payment portal, Arcs & Angles — as tokens, CSS and preview cards, for designing new Garage screens. It's generated from the Flutter package, not drawn separately: `tokens.css` and `tokens.json` come out of `garage_ui/tool/export_design_tokens_test.dart`, and `components.css` only uses those tokens. Don't edit the token files by hand — change garage_ui and rerun: ```sh cd garage_ui && flutter test tool/export_design_tokens_test.dart ``` ``` design_system/ tokens.css, tokens.json colours, density, type, shape — generated components.css the components, built on the tokens foundations/ colour, type, spacing, shape, density components/ buttons, fields, selects, lists, dialogs, … patterns/ whole screens from the hub and Arcs & Angles ``` ## The one rule: let the theme speak The colour scheme, the density and the component's variant decide every colour, font size, weight, icon size, padding, radius and gap. Designing a Garage screen is choosing **which component** and **which variant**. Then leave it alone. - No custom colours, font sizes or weights on a component or its contents. - No icon sizes or colours — an icon takes them from where it sits. - No hand-picked padding, gaps or radii. Use the `--gap-*` and `--radius-*` tokens, and let components that already carry spacing keep it. - No home-made badges, pills, warning boxes or popovers built from a box with a fill and a border. If a component doesnt exist, that's a gap in the system, not an invitation. - No shadows. Everything is flat — surfaces are separated by a step in lightness and a hairline border. If something looks wrong, the answer is a different variant or a different component. ## Setting up a screen ```html ``` - **Scheme:** `carbon` (default — true black, no accent hue; what the Garage apps run), `dark`, `light`. - **Density:** `product` (default — web and product apps, 12px text, 33px controls), `compact` (dense desktop tools like Arcs & Angles, 10px text, 23px controls), `normal` (compact but roomier). Pick one per app. Don't mix. Type is Geist, and Geist Mono for numbers and readouts. Body text is weight 300, control labels 400, primary buttons 600. ## Layout Every Garage screen is the same shape: a `chrome` ground, `panel`s standing on it, and `panel-gap` gutters between them. ```html