Skip to content

Design Tokens

read as .md

Every @ggui-ai/design primitive — and by extension every gadget that ships with the OSS renderer — reads its visual state from DTCG tokens exposed as CSS custom properties. Tokens themselves need no runtime: override the variables on any ancestor and the cascade does the rest on the next paint.

Operator theming builds on these same variables: ggui.json#theme selects one of the shipped presets (or a DTCG file), and per-app overlays are validated --ggui-* maps injected after the base token block, so a partial overlay keeps token defaults. Agents can enumerate presets with ggui_list_themes and pick one per render via ggui_render({themeId}) — see Custom Theming.

/* Every primitive uses var(--ggui-…) with a hardcoded fallback */
color: var(--ggui-color-primary-600, #0284c7);
padding: var(--ggui-spacing-md, 16px);
border-radius: var(--ggui-shape-radius-md, 8px);

Primary (Sky Blue)

50
#f0f9ff --ggui-color-primary-50
100
#e0f2fe --ggui-color-primary-100
200
#bae6fd --ggui-color-primary-200
300
#7dd3fc --ggui-color-primary-300
400
#38bdf8 --ggui-color-primary-400
500
#0ea5e9 --ggui-color-primary-500
600
#0284c7 --ggui-color-primary-600
700
#0369a1 --ggui-color-primary-700
800
#075985 --ggui-color-primary-800
900
#0c4a6e --ggui-color-primary-900

Gray

50
#f9fafb --ggui-color-neutral-50
100
#f3f4f6 --ggui-color-neutral-100
200
#e5e7eb --ggui-color-neutral-200
300
#d1d5db --ggui-color-neutral-300
400
#9ca3af --ggui-color-neutral-400
500
#6b7280 --ggui-color-neutral-500
600
#4b5563 --ggui-color-neutral-600
700
#374151 --ggui-color-neutral-700
800
#1f2937 --ggui-color-neutral-800
900
#111827 --ggui-color-neutral-900

Success

50
#f0fdf4 --ggui-color-success-50
100
#dcfce7 --ggui-color-success-100
200
#bbf7d0 --ggui-color-success-200
500
#22c55e --ggui-color-success-500
600
#16a34a --ggui-color-success-600
700
#15803d --ggui-color-success-700
800
#166534 --ggui-color-success-800

Warning

50
#fffbeb --ggui-color-warning-50
100
#fef3c7 --ggui-color-warning-100
200
#fde68a --ggui-color-warning-200
500
#f59e0b --ggui-color-warning-500
600
#d97706 --ggui-color-warning-600
700
#b45309 --ggui-color-warning-700
800
#92400e --ggui-color-warning-800

Error

50
#fef2f2 --ggui-color-error-50
100
#fee2e2 --ggui-color-error-100
200
#fecaca --ggui-color-error-200
500
#ef4444 --ggui-color-error-500
600
#dc2626 --ggui-color-error-600
700
#b91c1c --ggui-color-error-700
800
#991b1b --ggui-color-error-800

Info

50
#ecfeff --ggui-color-info-50
100
#cffafe --ggui-color-info-100
200
#a5f3fc --ggui-color-info-200
500
#06b6d4 --ggui-color-info-500
600
#0891b2 --ggui-color-info-600
700
#0e7490 --ggui-color-info-700
800
#155e75 --ggui-color-info-800

These tokens map to specific UI roles and adapt between light and dark themes.

Surface#ffffff--ggui-color-surface
Surface Variant#f3f4f6--ggui-color-surfaceVariant
On Surface#111827--ggui-color-onSurface
On Surface Variant#6b7280--ggui-color-onSurfaceVariant
Outline#9ca3af--ggui-color-outline
Outline Variant#d1d5db--ggui-color-outlineVariant
Container#f9fafb--ggui-color-container
On Container#111827--ggui-color-onContainer

The canonical theme adds eight Material 3-inspired role pairs for surface/content layering. They sit alongside (and extend) the legacy text tokens — primitives use these to keep contrast right across nested surfaces.

CSS variableRole
--ggui-color-surfaceDefault page / sheet background
--ggui-color-onSurfacePrimary text and icons on surface
--ggui-color-surfaceVariantSubtle alternate background (cards, rails)
--ggui-color-onSurfaceVariantSecondary text/icons on surfaceVariant
--ggui-color-containerFilled container (chips, banners, soft buttons)
--ggui-color-onContainerText/icons on container
--ggui-color-outlineStandard borders + dividers
--ggui-color-outlineVariantFaint borders, disabled outlines

A consistent spacing scale ensures visual rhythm across all components.

xs 4px
--ggui-spacing-xs
sm 8px
--ggui-spacing-sm
md 16px
--ggui-spacing-md
lg 24px
--ggui-spacing-lg
xl 32px
--ggui-spacing-xl
2xl 48px
--ggui-spacing-2xl
3xl 64px
--ggui-spacing-3xl

Canonical theme path: font.{family,size,weight,lineHeight}.*. Emitted as --ggui-font-family-*, --ggui-font-size-*, --ggui-font-weight-*, --ggui-font-lineHeight-*.

Font Families

The quick brown fox jumps over the lazy dog
Sans --ggui-typography-fontFamily-sans
The quick brown fox jumps over the lazy dog
Mono --ggui-typography-fontFamily-mono

Font Sizes

xs 12px
The quick brown fox --ggui-typography-fontSize-xs
sm 14px
The quick brown fox --ggui-typography-fontSize-sm
base 16px
The quick brown fox --ggui-typography-fontSize-base
lg 18px
The quick brown fox --ggui-typography-fontSize-lg
xl 20px
The quick brown fox --ggui-typography-fontSize-xl
2xl 24px
The quick brown fox --ggui-typography-fontSize-2xl
3xl 30px
The quick brown fox --ggui-typography-fontSize-3xl
4xl 36px
The quick brown fox --ggui-typography-fontSize-4xl

Font Weights

Normal The quick brown fox jumps over the lazy dog 400
Medium The quick brown fox jumps over the lazy dog 500
Semibold The quick brown fox jumps over the lazy dog 600
Bold The quick brown fox jumps over the lazy dog 700

Line Heights

Tight
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
1.25
Normal
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
1.5
Relaxed
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
1.75

Canonical theme path: shape.radius.*. Emitted as --ggui-shape-radius-{none,sm,md,lg,xl,2xl,full}.

none0
--ggui-shape-radius-none
sm4px
--ggui-shape-radius-sm
md8px
--ggui-shape-radius-md
lg12px
--ggui-shape-radius-lg
xl16px
--ggui-shape-radius-xl
2xl24px
--ggui-shape-radius-2xl
full9999px
--ggui-shape-radius-full

Canonical theme path: shape.shadow.*. Emitted as --ggui-shape-shadow-{none,xs,sm,md,lg,xl,2xl}.

none 0 0 0 0 transparent --ggui-shape-shadow-none
xs 0 1px 2px 0 rgba(15, 23, 42, 0.04) --ggui-shape-shadow-xs
sm 0 1px 3px 0 rgba(15, 23, 42, 0.06) --ggui-shape-shadow-sm
md 0 8px 16px -4px rgba(15, 23, 42, 0.10) --ggui-shape-shadow-md
lg 0 16px 32px -8px rgba(15, 23, 42, 0.14) --ggui-shape-shadow-lg
xl 0 24px 48px -12px rgba(15, 23, 42, 0.18) --ggui-shape-shadow-xl
2xl 0 25px 50px -12px rgba(0, 0, 0, 0.25) --ggui-shape-shadow-2xl

The canonical motion group covers durations, easings, keyframes, and ready-made transition shorthands. Durations + transitions both surface as CSS custom properties; transitions are pre-composed so primitives can drop in a single var(--ggui-motion-transition-…) without rewriting the curve.

VariableTypical valueWhen to use
--ggui-motion-duration-instant0msImmediate state flips (no animation)
--ggui-motion-duration-fast100msHover, focus, small icon swaps
--ggui-motion-duration-normal200msDefault for color/opacity transitions
--ggui-motion-duration-slow300msLayout shifts, large fades
--ggui-motion-transition-colorscolor/background-color/border-color 200msTheme-aware color changes
--ggui-motion-transition-opacityopacity 200msFades, show/hide
--ggui-motion-transition-transformtransform 200msTranslate/scale interactions
--ggui-motion-transition-allall 200msCatch-all when several properties move

Respect accessibility.reducedMotion — set durations to 0ms (or override the transitions to none) when it’s 'reduce'.


Top-level accessibility tokens make a11y intent explicit instead of leaving it implicit in component styles. They emit as --ggui-accessibility-* and pair with the standard media queries.

VariableTypeNotes
--ggui-accessibility-focusRingshadow / outline shorthandThe focus indicator used by every primitive
--ggui-accessibility-reducedMotion'no-preference' | 'reduce'Mirror of prefers-reduced-motion; drives motion
--ggui-accessibility-highContrast'standard' | 'increased'Mirror of prefers-contrast; thickens borders

Override focusRing at the theme level to brand the focus indicator across every primitive at once.


A canonical layering scale prevents floating UIs from fighting each other. Values are unitless integers and increase with elevation.

VariableLayerTypical occupant
--ggui-zIndex-hide-1Off-screen / underlay
--ggui-zIndex-base0Page content
--ggui-zIndex-docked10Docked sidebars, sticky toolbars
--ggui-zIndex-dropdown1000Menus, select popovers
--ggui-zIndex-sticky1100Sticky table headers
--ggui-zIndex-banner1200Announcement / cookie banners
--ggui-zIndex-overlay1300Backdrop scrims
--ggui-zIndex-modal1400Modal dialogs
--ggui-zIndex-popover1500Floating popovers anchored to content
--ggui-zIndex-skipLink1600Keyboard skip-link (must beat modals)
--ggui-zIndex-toast1700Toast notifications
--ggui-zIndex-tooltip1800Tooltips (topmost interactive element)

Nothing to wire — every primitive already consumes the tokens:

import { Button, Card, Input } from '@ggui-ai/design';
<Card>
<Input placeholder="Enter your name" />
<Button variant="primary">Submit</Button>
</Card>;

Reference tokens by their CSS variable, with a hardcoded fallback for environments where the theme provider hasn’t loaded yet:

.my-component {
background: var(--ggui-color-surface, #ffffff);
padding: var(--ggui-spacing-md, 16px);
border-radius: var(--ggui-shape-radius-lg, 12px);
box-shadow: var(--ggui-shape-shadow-md, 0 8px 16px -4px rgba(15, 23, 42, 0.10));
font-family: var(--ggui-font-family-sans, system-ui, -apple-system, sans-serif);
font-size: var(--ggui-font-size-sm, 14px);
color: var(--ggui-color-onSurface, #111827);
transition: var(--ggui-motion-transition-colors, color 200ms ease);
}

Override on any element — :root for global, a wrapper for per-subtree:

:root {
--ggui-color-primary-600: #7c3aed; /* Purple instead of sky blue */
--ggui-color-surface: #fefce8; /* Warm paper background */
--ggui-color-onSurface: #1f1410; /* Ink for the new surface */
--ggui-shape-radius-md: 16px; /* Pillier corners */
--ggui-motion-duration-normal: 240ms; /* Slightly more deliberate */
}

See Custom Theming for the full recipe — global overrides, dark-mode pairs, and scoped subtrees.