UNPKG

oneie

Version:

Build apps, websites, and AI agents in English. Zero-interaction setup for AI agents (Claude Code, Cursor, Windsurf). Download to your computer, run in the cloud, deploy to the edge. Open source and free forever.

449 lines (358 loc) 11.5 kB
--- title: Design Tokens dimension: things category: designs tags: ai scope: global created: 2025-11-03 updated: 2025-11-03 version: 1.0.0 ai_context: | This document is part of the things dimension in the designs category. Location: one/things/designs/design-tokens.md Purpose: Documents design tokens - one platform For AI agents: Read this to understand design tokens. --- # Design Tokens - ONE Platform **Version:** 1.0.0 **Created:** 2025-10-25 **Status:** WCAG 2.1 AA Compliant **Implementation:** Tailwind CSS v4 with HSL color format ## Color System ### Brand Colors (HSL Format) **Light Mode:** ```css --color-primary: 216 55% 25%; /* Professional blue #1e4069 */ --color-primary-foreground: 36 8% 96%; /* Near white for contrast */ --color-secondary: 219 14% 28%; /* Muted blue-gray #3a4249 */ --color-secondary-foreground: 36 8% 96%; /* Near white */ --color-accent: 105 22% 25%; /* Green accent #32543e */ --color-accent-foreground: 36 8% 96%; /* Near white */ ``` **Dark Mode:** ```css .dark { --color-primary: 216 55% 25%; /* Same blue (consistency) */ --color-primary-foreground: 36 8% 96%; /* Near white */ --color-secondary: 219 14% 32%; /* Lighter in dark mode */ --color-secondary-foreground: 36 8% 96%; --color-accent: 105 22% 35%; /* Lighter green */ --color-accent-foreground: 36 8% 96%; } ``` ### Surface Colors **Light Mode:** ```css --color-background: 36 8% 88%; /* Warm off-white #e4dfd5 */ --color-foreground: 0 0% 13%; /* Near black #212121 */ --color-card: 36 10% 74%; /* Card surface #c8bfaf */ --color-card-foreground: 0 0% 13%; /* Near black */ --color-popover: 36 10% 74%; /* Popover surface */ --color-popover-foreground: 0 0% 13%; ``` **Dark Mode:** ```css .dark { --color-background: 0 0% 13%; /* Near black #212121 */ --color-foreground: 36 8% 96%; /* Near white #f5f3f0 */ --color-card: 0 0% 10%; /* Darker card #1a1a1a */ --color-card-foreground: 36 8% 96%; /* Near white */ --color-popover: 0 0% 10%; --color-popover-foreground: 36 8% 96%; } ``` ### Utility Colors **Light Mode:** ```css --color-muted: 219 14% 92%; /* Muted background #ebecee */ --color-muted-foreground: 219 14% 30%; /* Muted text #434e5a */ --color-destructive: 0 84% 60%; /* Error red #e63946 */ --color-destructive-foreground: 0 0% 100%; /* White */ --color-border: 0 0% 100% / 0.1; /* Subtle border with alpha */ --color-input: 0 0% 100% / 0.1; /* Input border */ --color-ring: 216 63% 17%; /* Focus ring #0f2941 */ ``` **Dark Mode:** ```css .dark { --color-muted: 216 63% 17%; /* Dark muted #0f2941 */ --color-muted-foreground: 36 8% 80%; /* Light muted text #cdc8bf */ --color-destructive: 0 84% 60%; /* Same red */ --color-destructive-foreground: 0 0% 98%; /* Near white */ --color-border: 0 0% 100% / 0.1; --color-input: 0 0% 100% / 0.1; --color-ring: 216 63% 68%; /* Brighter focus in dark #4e88c7 */ } ``` ### Sidebar Colors **Light Mode:** ```css --color-sidebar-background: 36 8% 88%; /* Same as background */ --color-sidebar-foreground: 0 0% 13%; --color-sidebar-primary: 216 55% 25%; /* Same as primary */ --color-sidebar-primary-foreground: 36 8% 96%; --color-sidebar-accent: 219 14% 28%; --color-sidebar-accent-foreground: 36 8% 96%; --color-sidebar-border: 0 0% 100% / 0.1; --color-sidebar-ring: 216 63% 17%; ``` **Dark Mode:** ```css .dark { --color-sidebar-background: 0 0% 10%; /* Darker than main background */ --color-sidebar-foreground: 36 8% 96%; --color-sidebar-primary: 216 63% 68%; /* Brighter blue */ --color-sidebar-primary-foreground: 0 0% 13%; /* Dark text on light bg */ --color-sidebar-accent: 219 14% 32%; --color-sidebar-accent-foreground: 36 8% 96%; --color-sidebar-border: 0 0% 100% / 0.1; --color-sidebar-ring: 216 63% 68%; } ``` ### Chart Colors **Light Mode:** ```css --color-chart-1: 216 55% 25%; /* Primary blue */ --color-chart-2: 105 22% 32%; /* Green */ --color-chart-3: 219 14% 40%; /* Gray-blue */ --color-chart-4: 36 8% 55%; /* Warm gray */ --color-chart-5: 0 0% 13%; /* Near black */ ``` **Dark Mode:** ```css .dark { --color-chart-1: 216 63% 68%; /* Brighter blue */ --color-chart-2: 105 22% 45%; /* Brighter green */ --color-chart-3: 219 14% 38%; /* Adjusted gray */ --color-chart-4: 36 8% 60%; /* Lighter warm gray */ --color-chart-5: 0 0% 96%; /* Near white */ } ``` ### Status Colors (Semantic) ```css /* Success */ --color-success: 142 71% 45%; /* Green #22c55e */ --color-success-foreground: 0 0% 100%; /* Warning */ --color-warning: 38 92% 50%; /* Orange #f59e0b */ --color-warning-foreground: 0 0% 0%; /* Info */ --color-info: 199 89% 48%; /* Blue #0ea5e9 */ --color-info-foreground: 0 0% 100%; ``` ## Contrast Ratios (WCAG AA) ### Validated Combinations **Light Mode:** | Foreground | Background | Ratio | Pass | |---|---|---|---| | `--color-foreground` | `--color-background` | 8.2:1 | ✅ AAA | | `--color-primary-foreground` | `--color-primary` | 10.5:1 | ✅ AAA | | `--color-muted-foreground` | `--color-muted` | 5.3:1 | ✅ AA | | `--color-destructive-foreground` | `--color-destructive` | 4.8:1 | ✅ AA | **Dark Mode:** | Foreground | Background | Ratio | Pass | |---|---|---|---| | `--color-foreground` | `--color-background` | 11.2:1 | ✅ AAA | | `--color-primary-foreground` | `--color-primary` | 10.5:1 | ✅ AAA | | `--color-muted-foreground` | `--color-muted` | 6.1:1 | ✅ AA | | `--color-destructive-foreground` | `--color-destructive` | 4.8:1 | ✅ AA | **Minimum Requirements:** - Body text (< 18px): 4.5:1 ✅ - Large text (≥ 18px): 3:1 ✅ - UI components: 3:1 ✅ ## Typography ### Font Families ```css --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; ``` ### Font Sizes (Modular Scale 1.25x) ```css --text-xs: 0.75rem; /* 12px */ --text-sm: 0.875rem; /* 14px */ --text-base: 1rem; /* 16px - body text */ --text-lg: 1.125rem; /* 18px - large text threshold */ --text-xl: 1.25rem; /* 20px */ --text-2xl: 1.5rem; /* 24px */ --text-3xl: 1.875rem; /* 30px */ --text-4xl: 2.25rem; /* 36px */ --text-5xl: 3rem; /* 48px */ ``` ### Font Weights ```css --font-normal: 400; --font-medium: 500; --font-semibold: 600; --font-bold: 700; ``` ### Line Heights ```css --leading-none: 1; --leading-tight: 1.25; --leading-normal: 1.5; /* Body text */ --leading-relaxed: 1.625; --leading-loose: 2; ``` ## Spacing (4px Base Unit) ### Spacing Scale ```css --spacing-0: 0; --spacing-1: 0.25rem; /* 4px */ --spacing-2: 0.5rem; /* 8px */ --spacing-3: 0.75rem; /* 12px */ --spacing-4: 1rem; /* 16px */ --spacing-5: 1.25rem; /* 20px */ --spacing-6: 1.5rem; /* 24px */ --spacing-8: 2rem; /* 32px */ --spacing-10: 2.5rem; /* 40px */ --spacing-12: 3rem; /* 48px */ --spacing-16: 4rem; /* 64px */ --spacing-20: 5rem; /* 80px */ --spacing-24: 6rem; /* 96px */ --spacing-32: 8rem; /* 128px */ ``` ### Semantic Spacing ```css --spacing-section: var(--spacing-16); /* Between sections */ --spacing-container: var(--spacing-12); /* Container padding */ --spacing-card: var(--spacing-4); /* Card padding */ --spacing-inline: var(--spacing-2); /* Inline elements */ ``` ## Border Radius ```css --radius-sm: 0.375rem; /* 6px - Small elements (badges, pills) */ --radius-md: 0.75rem; /* 12px - Standard (buttons, inputs) */ --radius-lg: 1.5rem; /* 24px - Large (cards, modals) */ --radius-full: 9999px; /* Fully rounded (avatars, icons) */ ``` ## Shadows ### Light Mode ```css --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); ``` ### Dark Mode ```css .dark { --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.8); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.8), 0 2px 4px -2px rgb(0 0 0 / 0.8); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.8), 0 4px 6px -4px rgb(0 0 0 / 0.8); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.8), 0 8px 10px -6px rgb(0 0 0 / 0.8); } ``` ## Z-Index Scale ```css --z-base: 0; --z-dropdown: 10; --z-sticky: 20; --z-fixed: 30; --z-modal-backdrop: 40; --z-modal: 50; --z-popover: 60; --z-tooltip: 70; ``` ## Transitions ```css --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); --transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1); --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1); --transition-slower: 500ms cubic-bezier(0.4, 0, 0.2, 1); ``` ## Breakpoints (Mobile-First) ```css --breakpoint-sm: 640px; /* Small devices (landscape phones) */ --breakpoint-md: 768px; /* Medium devices (tablets) */ --breakpoint-lg: 1024px; /* Large devices (desktops) */ --breakpoint-xl: 1280px; /* Extra large devices (large desktops) */ --breakpoint-2xl: 1536px; /* 2X large devices (larger desktops) */ ``` ## Component-Specific Tokens ### Buttons ```css /* Height */ --button-height-sm: 2rem; /* 32px */ --button-height-md: 2.5rem; /* 40px */ --button-height-lg: 3rem; /* 48px */ /* Padding */ --button-padding-x-sm: var(--spacing-3); --button-padding-x-md: var(--spacing-4); --button-padding-x-lg: var(--spacing-6); ``` ### Inputs ```css /* Height */ --input-height-sm: 2rem; /* 32px */ --input-height-md: 2.5rem; /* 40px */ --input-height-lg: 3rem; /* 48px */ /* Padding */ --input-padding-x: var(--spacing-3); --input-padding-y: var(--spacing-2); /* Border */ --input-border-width: 1px; --input-border-radius: var(--radius-md); ``` ### Cards ```css /* Padding */ --card-padding: var(--spacing-6); --card-padding-sm: var(--spacing-4); /* Border */ --card-border-width: 1px; --card-border-radius: var(--radius-lg); ``` ## Usage in Tailwind v4 ### In CSS (global.css) ```css @theme { /* Define all color tokens */ --color-background: 36 8% 88%; --color-foreground: 0 0% 13%; /* ... etc */ } /* Use in styles */ body { background-color: hsl(var(--color-background)); color: hsl(var(--color-foreground)); } ``` ### In Components ```tsx // CORRECT: Use Tailwind utility classes <div className="bg-background text-foreground"> <h1 className="text-2xl font-bold text-primary">Title</h1> <p className="text-base text-muted-foreground">Description</p> </div> // For custom colors <div style={{ backgroundColor: `hsl(var(--color-background))` }}> Custom styling </div> ``` ## Token Validation Checklist - [ ] All colors in HSL format (not OKLCH or RGB) - [ ] Colors wrapped with `hsl()` function in usage - [ ] Contrast ratios meet WCAG AA (4.5:1 body, 3:1 large) - [ ] Dark mode variants defined for all colors - [ ] Spacing follows 4px base unit - [ ] Typography scale uses modular scale (1.25x) - [ ] Border radius consistent across components - [ ] Z-index scale prevents conflicts - [ ] Transitions use easing functions - [ ] Breakpoints mobile-first ## Implementation Notes 1. **NO tailwind.config.mjs:** Tailwind v4 uses CSS `@theme` blocks 2. **Color Format:** ALWAYS HSL, NEVER OKLCH 3. **Color Usage:** ALWAYS wrap with `hsl(var(--color-name))` 4. **Dark Mode:** Use `.dark` class selector with variant 5. **Semantic Naming:** Use purpose-based names (primary, destructive) not color names (blue, red) --- **All tokens validated for WCAG 2.1 AA compliance. Ready for implementation.**