- Weight
- Medium 500
- Size
- 20px
- Line
- 28px
- Tracking
- -1%
The quick brown fox jumps over the lazy dog.
A precise component system where colour only ever means something.
The system rests on a warm-neutral spine — Inter for type, Tabler for icons, the full shadcn set on Base UI — and spends colour only where it carries meaning: the nine state-roles that mark status, and the brand orange on exactly two objects.
This page is the rendered form of docs/design-system.md — the foundations below follow that document section by section.
A white crown on the glossy orange tile — the same square that opens the marketing header and the sign-in screen. Clear space ≥ the tile's height on every side. Never re-colour the tile, and never set the crown on a bare canvas.
Tile plus the wordmark in one weight, all ink. The tile carries the only colour — the wordmark is never orange.
One colour, calmer on dark (#D67137) so it does not glare against the near-black canvas. It appears on exactly two objects — this mark and the primary button. Red is not part of the identity: the red in this system is --signal, reserved for the danger zone, and the error state-role. Brand is not danger.
The system rests on a calm, warm-neutral spine — type, surface, hairline. Colour is never decoration: it appears only as signal — the nine state-roles that mark status, and the brand orange that lives on exactly two objects, the mark and the primary button. If the vivid fills stop being rare, they stop being signal.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
No number exceeds 20px. There is deliberately no display tier — a KPI is set in the same text-title-h1 as a page title. Hierarchy among numbers comes from weight, colour, position and the card around them, never from size. Numbers always carry tabular-nums so columns of figures line up.
One intentional variant: the dashboard greets you at text-title-h2 (16px) with a text-paragraph-sm subtitle, instead of a formal 20px page title.
The logo tile and the primary button. Nowhere else — the vivid fill lives on exactly those two objects.
The chart accent — line and series colour, and the fill of the progress bar inside a StatCard.
The danger red, reserved for the workspace danger zone and destructive confirmations. Never decoration — which is why this swatch is grey.
The information role (#335CFF) is our blue and is used sparingly — it is deliberately not the global accent. The reference system this palette descends from leads with blue; we do not.
dark · base · light · lighter — text/icon · solid fill · hairline · tint. Neutral by default; colour only ever as signal.
Every green or red is paired with an icon and a label, so a reader who cannot separate the two hues still reads the direction. Arrow and tone are independent — a shorter sales cycle is a down arrow with a success tone.
AI-native surfaces may use gradient, glow and animated colour — the flourish marks the boundary between the deterministic CRM and the probabilistic thing beside it. Keep it in a box: a contained card on the ordinary canvas, never a full-bleed band, and still honouring reduced motion.
The glossy button family is the other: a solid fill, an inset white top-highlight and top-glow, and a same-colour 1px edge ring — flat on the canvas, no elevation. Everything else uses solid fills.
The default tile is the glossy grey one — a muted fill, a white top-highlight, a soft bottom inner-shadow and a hairline ring, flat on the canvas. Never hand-roll an icon chip, and never drop a bare glyph on a card title.
A tinted tile is lighter fill + dark glyph — the pairing badges use, so it holds in both themes. Tinted tiles drop the glossy grey treatment: its highlight and hairline muddy a coloured fill.
Use a tint when the tile is labelling a subject — a feature card, a capability, an activity kind. Keep neutral for the everyday furniture, or the colour stops meaning anything. A reader who scrolls past the same hue twice should be seeing the same subject twice.
Tabler only — the same import works in server and client components, so there is no second icon set and no SSR subpath to reach for. No emoji, anywhere. Section and card titles take a leading tile; other inline glyphs stay a plain muted size-4 Tabler icon. Colour is never the only signal — every tinted tile still carries its glyph and a text label.
Structure is drawn with a single hairline rule — one border-border stroke, never heavier. Surfaces sit on a warm neutral; grids are built from gap-px seams over a bg-border ground, so every division reads as one crisp line. Elevation stays whisper-quiet and radii stay restrained. The page is calm by construction; the only colour is signal.
Motion is feedback, never spectacle: no large travel, no bounce, no long durations. Every interaction still gets a response — hover, press, a visible focus ring, a loading skeleton, a toast on success. Trees are wrapped in <MotionConfig reducedMotion="user"> and primitives branch on useReducedMotion, so a reader who asks for stillness gets the final frame, not a slower animation.
New contact, edit contact, the deal form. The user stays in context — never route to a /new or /edit page. The shared form takes onSuccess (close + router.refresh()) and onCancel; without them it falls back to navigation.
Opening a board card IS the full record: its fields plus an Activity section (notes & tasks, loaded through a server action and refetched on add/complete) and an Edit button. Map fields to the record type — don't copy another tool's fields wholesale.
Your team's display name.
Up to 10 members.
| Contact | Stage | Value |
|---|---|---|
| Acme Co. | Won | ₹4,20,000 |
| Nimbus Ltd. | At risk | ₹1,10,000 |
| Vertex Inc. | Open | ₹2,75,000 |
Search for a command to run...
Built on Inter, Tabler and Base UI, through shadcn base-vega.