Table of contents
UIBook
Roboto · 4 themes (light / dark / sepia / ocean) · 5 sizes (xs–xl) · rounded
Foundations
The tokens every other section is built from — colour, type, radius, spacing and the eleven layout tiers.
Colour palette
light
Surface
Content
Border · Focus
Primary
Secondary
Accent
Danger
Success · Warning · Info
Link
dark
Surface
Content
Border · Focus
Primary
Secondary
Accent
Danger
Success · Warning · Info
Link
sepia
Surface
Content
Border · Focus
Primary
Secondary
Accent
Danger
Success · Warning · Info
Link
ocean
Surface
Content
Border · Focus
Primary
Secondary
Accent
Danger
Success · Warning · Info
Link
Interaction states — rest / hover / active
primary
secondary
accent
danger
Type scale
Aatext-xs · 12px
Aatext-sm · 14px
Aatext-base · 16px
Aatext-lg · 18px
Aatext-xl · 20px
Aatext-2xl · 24px
Aatext-3xl · 30px
Aatext-4xl · 36px
Radius — rounded only
Spacing scale
Container caps
Motion — durations & easings
Durations
duration-(--duration-fast)fast · 120ms
duration-(--duration-base)base · 200ms
duration-(--duration-slow)slow · 320ms
duration-(--duration-slower)slower · 500ms
Easings
ease-(--ease-standard)cubic-bezier(0.2, 0, 0, 1)
ease-(--ease-out-soft)cubic-bezier(0, 0, 0, 1)
ease-(--ease-in-soft)cubic-bezier(0.3, 0, 1, 1)
Layout tiers (src/config/layoutTiers.ts)
| Tier | Min width | Navbar h | Grid cols | Gutter | Container |
|---|---|---|---|---|---|
| base | 0px | 56px | 4 | 12px | fluid |
| xxs | 320px | 56px | 4 | 16px | fluid |
| xs | 390px | 56px | 4 | 16px | fluid |
| sm | 640px | 56px | 8 | 24px | narrow |
| md | 768px | 60px | 8 | 24px | narrow |
| lg | 1024px | 64px | 12 | 32px | default |
| xl | 1280px | 64px | 12 | 32px | default |
| 2xl | 1536px | 64px | 12 | 40px | wide |
| 3xl | 1920px | 64px | 12 | 48px | wide |
| 4xl | 2560px | 72px | 12 | 54px | wide |
| 5xl | 3840px | 96px | 12 | 72px | wide |
Brand
The 'launch slot' mark — a caret and a detached slot reading as an A.
Navbar tile sizes
Mark-only
Container
Content-width cap, gutter from the layout tier — never a breakpoint ladder.
Widths
Content area
max-w-narrow (720)
Content area
max-w-default (1280)
Content area
max-w-wide (1536)
Input
Input, Select, Textarea and FormField — appearance, size, invalid/success states.
Appearances
Sizes — XS · SM · MD · LG · XL
States
With icon
Select
Textarea
FormField — label, helper text and error
We never share your email address.
Required
Selection Controls
Checkbox, Radio and Switch — states and sizes.
Checkbox — states
Checkbox — sizes
Radio
Radio — sizes
Switch — states
Switch — sizes
Segmented · Upload
SegmentedControl, Slider, Rating and FileUpload.
Segmented control
Segmented control — sizes
Slider
Slider — sizes
Rating — read-only
Rating — interactive
Rating — sizes
File upload
Badge
8 tones x 3 appearances, dot, dismissible, 5 sizes.
Tones — SOLID
Appearances
Sizes — XS · SM · MD · LG · XL
With dot
Dismissible
Avatar
Initials, decorative-icon fallback and photo modes, presence dot, grouping, 5 sizes.
Modes
Sizes — XS · SM · MD · LG · XL
Presence
Group — overflow at 2
Alert
5 tones, leading accent border, optional actions row, optional close, live announcement.
Tones
neutral alert
Sample body text for the neutral tone.
info alert
Sample body text for the info tone.
success alert
Sample body text for the success tone.
warning alert
Sample body text for the warning tone.
danger alert
Sample body text for the danger tone.
With actions
Unsaved changes
Your edits have not been saved yet.
Dismissible
Heads up
A new version of the design system is available.
Card
Orientation, sized body padding/gap, footer, StatCard and PricingCard compositions.
Orientation — vertical / horizontal

Vertical card
Media above the body.

Horizontal card
Media on the leading edge.
Sizes — body padding/gap, XS · SM · MD · LG · XL
xs
Body text.
sm
Body text.
md
Body text.
lg
Body text.
xl
Body text.
With footer
Deployment protection
Require a review before any change reaches the production branch.
StatCard
$48,260
PricingCard
- Unlimited projects
- 4 themes included
- Priority support
Progress & Feedback
Linear and radial progress, three Loader placements, three Skeleton shapes.
Progress — tones
RadialProgress
Loader — placements
Skeleton — shapes
Data Table
Presentational — the @container collapses rows into cards below @md, shown for real in the narrow frame below, no viewport resize needed.
Members
| Member | Status | Last active | |
|---|---|---|---|
| Ada Moreau | ada@studio.dev | Active | 2 minutes ago |
| Tomas Reid | tomas@studio.dev | Invited | Yesterday |
| Kirill Ivanov | kirill@studio.dev | Suspended | 2 weeks ago |
Members — narrow frame (@container below @md, no viewport resize)
| Member | Status | Last active | |
|---|---|---|---|
| Ada Moreau | ada@studio.dev | Active | 2 minutes ago |
| Tomas Reid | tomas@studio.dev | Invited | Yesterday |
| Kirill Ivanov | kirill@studio.dev | Suspended | 2 weeks ago |
Timeline · Empty State
An ordered-list Timeline, EmptyState with an actions slot, Divider and Kbd.
Timeline
- Design tokens lockedCompleted
- Components drawnCompleted
- Code exportIn progress
- Docs sitePlanned
EmptyState
No projects yet
Create your first project to start composing screens.
Divider
Kbd
Overlay
Menu, Tooltip and Popover — details-based disclosures with no ARIA menu role.
Menu
Account
Tooltip
Popover
Delete project
Dialog
Modal, Drawer and BottomSheet — the same native <dialog popover> base, opened with zero JS and upgraded to showModal() once the delegated listener runs.
Modal
Drawer
BottomSheet
Feedback — Toast
Alpine.store('toasts') — several notifications at once, timed out one by one in the order they arrived.
Toast
Disclosure
Tabs (roving tabindex, three variants) and Accordion (<details name>, zero JS).
Tabs — Underline
Tabs — Pills
Tabs — Boxed
Accordion
What is included in the licence?
Can I use it commercially?
How do themes work?
App Shell
Theme and locale switching, plus the two page-wide dialogs the Navbar and Layout already mount once for the whole site.
Theme Switcher
Locale Switcher
Locale Dialog
Mounted once by `Layout` — every `LocaleSwitcher` trigger above, and the real Navbar's and Footer's own, all open this same instance: centred modal from `md`, bottom sheet below it.
Mobile Menu
Mounted once by `Navbar`, opened by its hamburger button below the `md` tier — resize the viewport narrower to reach it; the trigger stays hidden at this width by design.
Flag
Consent
The first-layer consent card, the preferences dialog, the recipients block the policy page embeds, and the confirmation the deletion page answers with. On a page the card is server-rendered as an open, explicitly modal <dialog closedby="none"> over an inert shell, and the dialog opens with showModal() or, without JavaScript, through ?consent=settings; here both sit in flow.
Card
Preferences dialog · every theme
light
dark
sepia
ocean
Preferences dialog · reopened
stored choice: Analytics and Marketing
Global Privacy Control: Marketing off and locked
Recipients block · every theme
light
Who receives your data
Necessary
Remembers your consent choice. Always on.
Recipients: none outside this site
Analytics
Counts page views, marked clicks and form submissions, time on page and page speed, so the site can be improved.
Recipients: GA4
Marketing
Reports page views to advertising platforms, so the ads for this site can be measured and targeted.
Recipients: Google Ads
How long it is kept
- Your consent choice (
consent): 365 days from the moment you choose - Client identifier (
mcid): 365 days at most, and never longer than your consent - Session identifier (
msid): 30 minutes after the last measured event - Analytics identifier set by our tagging server (
FPID): 730 days at most - Tag Manager preview session (site staff only) (
gtm_auth): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_debug): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_preview): 5 minutes after opening a preview
If your browser sends a Global Privacy Control signal, Marketing stays off and cannot be switched on.
Delete my datadark
Who receives your data
Necessary
Remembers your consent choice. Always on.
Recipients: none outside this site
Analytics
Counts page views, marked clicks and form submissions, time on page and page speed, so the site can be improved.
Recipients: GA4
Marketing
Reports page views to advertising platforms, so the ads for this site can be measured and targeted.
Recipients: Google Ads
How long it is kept
- Your consent choice (
consent): 365 days from the moment you choose - Client identifier (
mcid): 365 days at most, and never longer than your consent - Session identifier (
msid): 30 minutes after the last measured event - Analytics identifier set by our tagging server (
FPID): 730 days at most - Tag Manager preview session (site staff only) (
gtm_auth): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_debug): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_preview): 5 minutes after opening a preview
If your browser sends a Global Privacy Control signal, Marketing stays off and cannot be switched on.
Delete my datasepia
Who receives your data
Necessary
Remembers your consent choice. Always on.
Recipients: none outside this site
Analytics
Counts page views, marked clicks and form submissions, time on page and page speed, so the site can be improved.
Recipients: GA4
Marketing
Reports page views to advertising platforms, so the ads for this site can be measured and targeted.
Recipients: Google Ads
How long it is kept
- Your consent choice (
consent): 365 days from the moment you choose - Client identifier (
mcid): 365 days at most, and never longer than your consent - Session identifier (
msid): 30 minutes after the last measured event - Analytics identifier set by our tagging server (
FPID): 730 days at most - Tag Manager preview session (site staff only) (
gtm_auth): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_debug): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_preview): 5 minutes after opening a preview
If your browser sends a Global Privacy Control signal, Marketing stays off and cannot be switched on.
Delete my dataocean
Who receives your data
Necessary
Remembers your consent choice. Always on.
Recipients: none outside this site
Analytics
Counts page views, marked clicks and form submissions, time on page and page speed, so the site can be improved.
Recipients: GA4
Marketing
Reports page views to advertising platforms, so the ads for this site can be measured and targeted.
Recipients: Google Ads
How long it is kept
- Your consent choice (
consent): 365 days from the moment you choose - Client identifier (
mcid): 365 days at most, and never longer than your consent - Session identifier (
msid): 30 minutes after the last measured event - Analytics identifier set by our tagging server (
FPID): 730 days at most - Tag Manager preview session (site staff only) (
gtm_auth): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_debug): 5 minutes after opening a preview - Tag Manager preview session (site staff only) (
gtm_preview): 5 minutes after opening a preview
If your browser sends a Global Privacy Control signal, Marketing stays off and cannot be switched on.
Delete my dataDeletion confirmation · every theme
light
Your data was deleted
- Your consent choice on this browser
- The client and session identifiers on this browser
- The stored record of your choice
The site owner has your request on record and deletes the data held by Google within the period the privacy policy states.
Read the privacy policydark
Your data was deleted
- Your consent choice on this browser
- The client and session identifiers on this browser
- The stored record of your choice
The site owner has your request on record and deletes the data held by Google within the period the privacy policy states.
Read the privacy policysepia
Your data was deleted
- Your consent choice on this browser
- The client and session identifiers on this browser
- The stored record of your choice
The site owner has your request on record and deletes the data held by Google within the period the privacy policy states.
Read the privacy policyocean
Your data was deleted
- Your consent choice on this browser
- The client and session identifiers on this browser
- The stored record of your choice
The site owner has your request on record and deletes the data held by Google within the period the privacy policy states.
Read the privacy policyTheme Matrix
The design's Theme × Radius Matrix (e8UIBn), rounded column only — the radius axis was dropped. Identical component instances; only each cell's data-theme changes.
light · rounded
LiveTheme
Tokens re-resolved for this theme.
dark · rounded
LiveTheme
Tokens re-resolved for this theme.
sepia · rounded
LiveTheme
Tokens re-resolved for this theme.
ocean · rounded
LiveTheme
Tokens re-resolved for this theme.