Design system
Tokens, type and components for Crackwits OS. Build modules against what is documented here — if something you need is missing, add it here first.
One accent, used only for primary actions and active state. Everything else is carbon and elevation.
Carbon
The neutral ramp. Hue drifts as it lightens — warm magenta-tinted charcoals at the dark end, cool blue-tinted greys at the light end. Chroma never exceeds 0.015, so it reads as depth rather than colour.
carbon-25#f5f4f5carbon-50carbon-100#c5cbd4frenchgreycarbon-200carbon-300carbon-400carbon-500#51565bashcarbon-600#4a464acarbon-700#3d3a3dcarbon-750#312f31charcoalcarbon-800#252325charcoaldarkcarbon-850#1c1b1ccarbon-900#161516carbon-950App canvas, dark themeAccent
The one decisive colour. Primary actions and active state only — never decoration, never a background wash. If two accents appear on a screen, one of them is wrong.
accent-100accent-200accent-300accent-400accent-500#d7586cbringpinkaccent-600Primary in the light themeaccent-700accent-800accent-900Status
Deliberately quieter than the accent — lower chroma so a page of green ticks never out-shouts its primary button. Danger sits at hue 37 to stay readable against the accent's hue 13.
success-500#3fa795greensjadewarning-500#d99a3fdanger-500#d36342info-500#5b8fc7What application and module code consumes. Never reach past these to a raw scale.
Surfaces
--backgroundon --foreground | The page canvas. One per screen. | |
--cardon --card-foreground | Content sitting on the canvas. | |
--popoveron --popover-foreground | Menus, popovers, command palette. | |
--mutedon --muted-foreground | Recessed rows, table headers, disabled fills. | |
--accenton --accent-foreground | Hover and active surface. Not the brand accent. | |
--secondaryon --secondary-foreground | Secondary buttons and quiet chips. | |
--sidebaron --sidebar-foreground | Navigation rail. |
Action
--primaryon --primary-foreground | The primary action. One per view. | |
--destructiveon --destructive-foreground | Irreversible actions only. | |
--ring | Focus ring. Never removed, never restyled per component. |
Lines
--border | Hairline separation. Elevation does the heavy lifting. | |
--border-strong | Where a line genuinely has to be seen. | |
--input | Form control outlines. |
Status
--successon --success-foreground | Completed, approved, healthy. | |
--warningon --warning-foreground | Needs attention, not yet broken. | |
--dangeron --danger-foreground | Failed, rejected, over limit. | |
--infoon --info-foreground | Neutral context and hints. |
Charts
--chart-1 | Categorical series 1 — the reporting module's ordering. | |
--chart-2 | Categorical series 2. | |
--chart-3 | Categorical series 3. | |
--chart-4 | Categorical series 4. | |
--chart-5 | Categorical series 5. | |
--chart-6 | Categorical series 6 — neutral, for 'other'. |
URW Geometric carries the display voice, Montserrat the working voice. Arabic swaps both for IBM Plex Sans Arabic.
Display — URW Geometric
Headings and numerals. Tight tracking, set in font-display.
text-display-xl64px / -0.035emLogin, marketing-weight momentstext-display-lg48px / -0.03emDashboard herotext-display-md36px / -0.025emSection openertext-display-sm28px / -0.02emPage titletext-display-xs22px / -0.015emCard and panel titleInterface — Montserrat
Body, controls, tables. Body sits at 14px.
text-lg18pxSub-headingtext-base16pxLong-form readingtext-sm14pxBody default — set on <body>text-xs12pxMetadata, timestamps, help texteyebrow11px / 0.14emSection labels, table headersArabic — IBM Plex Sans Arabic
Neither brand face carries Arabic. :lang(ar) swaps --font-sans and --font-display to this.
Numerals
Tabular by default so currency and duration columns align. Never proportional in a table.
Depth comes from surface lightness, not from outlines. Shadows are reserved for things that genuinely float.
Surfaces
Depth is lightness. Each step is one level further forward.
--backgroundThe page--cardContent on the page--popoverFloating over content--mutedRecessed within a cardShadows
Reserved for things that genuinely float. Not for separation.
shadow-raisedSits just off the surfaceshadow-liftedDialogs, dragged itemsGlass
Overlays, the command palette and sticky headers. Restrained.
A 4px base step. Radius scales from a single token so a white-label theme is one value away.
Spacing
A 4px base step. Tailwind's default scale, unmodified.
1 · 4px2 · 8px3 · 12px4 · 16px6 · 24px8 · 32px12 · 48px16 · 64pxRadius
Everything scales from --radius. A white-label theme is one value away.
rounded-smChips, badges, checkboxesrounded-mdInputs, buttonsrounded-lgCards, popovers — the base valuerounded-xlDialogs, sheetsrounded-2xlFeature panels150 to 250 milliseconds, always purposeful. Everything respects reduced motion.
Duration
Hover a row to see it. Anything past 250ms is a defect.
--duration-instant100ms--duration-fast150ms--duration-base200ms--duration-slow250msEasing
--ease-brandcubic-bezier(0.22, 1, 0.36, 1)--ease-brand-incubic-bezier(0.55, 0, 1, 0.45)Every transition above is disabled under prefers-reduced-motion: reduce, globally, in src/styles/base.css. Modules do not need to handle this themselves.
Every shadcn primitive, in each of its states, on the brand tokens.
Buttons
Every variant, at default size, plus each interactive state.
Status
Colour is never the only signal — pair the tone with a dot or a word.
Form controls
Enter a valid email address.
Overlays
Dialog, sheet, popover, dropdown, tooltip and the command palette.
Command Palette
Search for a command to run...
Alerts
Data
Dense and scannable. Numerals are tabular, money aligns to the inline end.
| Project | Client | Status | Value (KWD) |
|---|---|---|---|
| Al Mulla rebrand | ALAl Mulla Group | On track | 12,400.000 |
| Zain campaign Q3 | ZAZain | At risk | 8,150.500 |
| NBK portal | NBNBK | Blocked | 31,000.000 |
| Boubyan microsite | BOBoubyan Bank | Archived | 4,275.250 |
Disclosure
Loading and empty
No spinner-only states. Skeletons match the shape of what is coming.
No projects yet
Projects scope everything below the organisation. Create the first one to get moving.
The compositions modules are expected to reuse rather than reinvent.
Direction
Logical properties only. If a component breaks here, it is using a physical one.
حملة زين للربع الثالث
الحدّ الجانبي والحشو يستخدمان خصائص منطقية، لذا ينعكسان تلقائيًا.