diff --git a/static/css/base.css b/static/css/base.css index bc2a3545..79e21536 100644 --- a/static/css/base.css +++ b/static/css/base.css @@ -1,21 +1,20 @@ +@import 'tokens/index.css'; + html, body { margin: 0; padding: 0; height: 100%; overflow: hidden; - /* Disable default scrolling */ } -/* 针对Firefox */ * { scrollbar-width: thin; - scrollbar-color: var(--border-color) transparent; + scrollbar-color: var(--border-base) transparent; } -/* 针对Webkit browsers (Chrome, Safari等) */ ::-webkit-scrollbar { - width: 8px; + width: var(--scrollbar-width, 8px); } ::-webkit-scrollbar-track { @@ -24,116 +23,113 @@ body { } ::-webkit-scrollbar-thumb { - background-color: var(--border-color); - border-radius: 4px; + background-color: var(--border-base); + border-radius: var(--radius-xs); } :root { - --bg-color: #ffffff; - --text-color: #333333; - --text-muted: #6c757d; - --card-bg: #ffffff; - --border-color: #e0e0e0; --header-height: 48px; - - /* Color Components */ - --lora-accent-l: 68%; - --lora-accent-c: 0.28; - --lora-accent-h: 256; - --lora-warning-l: 75%; - --lora-warning-c: 0.25; - --lora-warning-h: 80; - --lora-success-l: 70%; - --lora-success-c: 0.2; - --lora-success-h: 140; - - /* Composed Colors */ - --lora-accent: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h)); - --lora-surface: oklch(97% 0 0 / 0.95); - --lora-border: oklch(72% 0.03 256 / 0.45); - --lora-text: oklch(95% 0.02 256); - --lora-error: oklch(75% 0.32 29); - --lora-error-bg: color-mix(in oklch, var(--lora-error) 20%, transparent); - --lora-error-border: color-mix(in oklch, var(--lora-error) 50%, transparent); - --lora-warning: oklch(var(--lora-warning-l) var(--lora-warning-c) var(--lora-warning-h)); - --lora-success: oklch(var(--lora-success-l) var(--lora-success-c) var(--lora-success-h)); - --badge-update-bg: oklch(72% 0.2 220); - --badge-update-text: oklch(28% 0.03 220); - --badge-update-glow: oklch(72% 0.2 220 / 0.28); - --badge-skip-refresh-bg: oklch(82% 0.12 45); - --badge-skip-refresh-text: oklch(35% 0.02 45); - --badge-skip-refresh-glow: oklch(82% 0.12 45 / 0.15); - - /* Spacing Scale */ - --space-1: calc(8px * 1); - --space-2: calc(8px * 2); - --space-3: calc(8px * 3); - --space-4: calc(8px * 4); - - /* Z-index Scale */ - --z-base: 10; - --z-header: 100; - --z-modal: 1000; - --z-overlay: 2000; - - /* Border Radius */ - --border-radius-base: 12px; - --border-radius-md: 12px; - --border-radius-sm: 8px; - --border-radius-xs: 4px; - --scrollbar-width: 8px; - /* 添加滚动条宽度变量 */ - /* Shortcut styles */ - --shortcut-bg: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.12); - --shortcut-border: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.25); - --shortcut-text: var(--text-color); + --shortcut-bg: var(--color-accent-subtle); + --shortcut-border: var(--color-accent-border); + --shortcut-text: var(--text-primary); + + --lora-accent-transparent: var(--color-accent-transparent); + + /* Legacy spacing aliases: 8px base grid to match existing component usage */ + --space-1: 8px; + --space-2: 16px; + --space-3: 24px; + --space-4: 32px; + + /* Legacy border-radius aliases to match existing component usage */ + --border-radius-xs: 4px; + --border-radius-sm: 6px; + --border-radius-base: 8px; + --border-radius-md: 12px; + --border-radius-lg: 16px; +} + +:root { + --bg-color: var(--bg-base); + --text-color: var(--text-primary); + --text-muted: var(--text-secondary); + --card-bg: var(--surface-base); + --border-color: var(--border-base); + + --lora-accent: var(--color-accent); + --lora-surface: var(--bg-elevated); + --lora-border: var(--border-subtle); + --lora-text: var(--text-primary); + --lora-error: var(--color-error); + --lora-error-bg: var(--color-error-bg); + --lora-error-border: var(--color-error-border); + --lora-warning: var(--color-warning); + --lora-success: var(--color-success); + + --badge-update-bg: var(--color-info-bg); + --badge-update-text: var(--color-info-text); + --badge-update-glow: var(--color-info-glow); + --badge-skip-refresh-bg: var(--color-skip-refresh-bg); + --badge-skip-refresh-text: var(--color-skip-refresh-text); + --badge-skip-refresh-glow: var(--color-skip-refresh-glow); +} + +[data-theme="dark"] { + --bg-color: var(--bg-base); + --text-color: var(--text-primary); + --text-muted: var(--text-secondary); + --card-bg: var(--surface-base); + --border-color: var(--border-base); + + --lora-accent: var(--color-accent); + --lora-surface: var(--bg-elevated); + --lora-border: var(--border-subtle); + --lora-text: var(--text-primary); + --lora-error: var(--color-error); + --lora-error-bg: var(--color-error-bg); + --lora-error-border: var(--color-error-border); + --lora-warning: var(--color-warning); + --lora-success: var(--color-success); + + --badge-update-bg: var(--color-info-bg); + --badge-update-text: var(--color-info-text); + --badge-update-glow: var(--color-info-glow); + --badge-skip-refresh-bg: var(--color-skip-refresh-bg); + --badge-skip-refresh-text: var(--color-skip-refresh-text); + --badge-skip-refresh-glow: var(--color-skip-refresh-glow); } html[data-theme="dark"] { - background-color: #1a1a1a !important; + background-color: var(--bg-base) !important; color-scheme: dark; } html[data-theme="light"] { - background-color: #ffffff !important; + background-color: var(--bg-base) !important; color-scheme: light; } -[data-theme="dark"] { - --bg-color: #1a1a1a; - --text-color: #e0e0e0; - --text-muted: #a0a0a0; - --card-bg: #2d2d2d; - --border-color: #404040; - - --lora-accent: oklch(68% 0.28 256); - --lora-surface: oklch(25% 0.02 256 / 0.98); - --lora-border: oklch(90% 0.02 256 / 0.15); - --lora-text: oklch(98% 0.02 256); - --lora-warning: oklch(75% 0.25 80); - /* Modified to be used with oklch() */ - --lora-error-bg: color-mix(in oklch, var(--lora-error) 15%, transparent); - --lora-error-border: color-mix(in oklch, var(--lora-error) 40%, transparent); - --badge-update-bg: oklch(62% 0.18 220); - --badge-update-text: oklch(98% 0.02 240); - --badge-update-glow: oklch(62% 0.18 220 / 0.4); - --badge-skip-refresh-bg: oklch(82% 0.12 45); - --badge-skip-refresh-text: oklch(98% 0.02 45); - --badge-skip-refresh-glow: oklch(82% 0.12 45 / 0.15); -} - body { - font-family: 'Segoe UI', sans-serif; - background: var(--bg-color); - color: var(--text-color); + font-family: var(--font-body); + background: var(--bg-base); + color: var(--text-primary); display: flex; flex-direction: column; padding-top: 0; - /* Remove the padding-top */ } .hidden { display: none !important; -} \ No newline at end of file +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} diff --git a/static/css/tokens/MIGRATION.md b/static/css/tokens/MIGRATION.md new file mode 100644 index 00000000..dd46ebed --- /dev/null +++ b/static/css/tokens/MIGRATION.md @@ -0,0 +1,142 @@ +# Lora-Manager UI Token Migration Guide + +## Overview + +The design token system has been created in `static/css/tokens/`. `base.css` now imports the tokens and provides backward-compatible aliases for existing component CSS. + +## Token Files + +| File | Purpose | +|------|---------| +| `tokens/colors.css` | OKLch color primitives + semantic light/dark tokens | +| `tokens/typography.css` | Font stacks, type scale, weights, line heights | +| `tokens/spacing.css` | 4px-base grid with legacy aliases | +| `tokens/effects.css` | Border radius, shadows, transitions | +| `tokens/breakpoints.css` | Named breakpoint variables | +| `tokens/z-index.css` | Stacking context scale | +| `tokens/index.css` | Aggregator that imports all token files | + +## Backward Compatibility + +Old variable names in component CSS still work via aliases in `base.css`: + +| Old Name | Maps To | +|----------|---------| +| `--bg-color` | `--bg-base` | +| `--text-color` | `--text-primary` | +| `--text-muted` | `--text-secondary` | +| `--card-bg` | `--surface-base` | +| `--border-color` | `--border-base` | +| `--lora-accent` | `--color-accent` | +| `--lora-surface` | `--bg-elevated` | +| `--lora-border` | `--border-subtle` | +| `--space-1` (8px) | `--space-1-legacy` | +| `--border-radius-base` | `--radius-lg` | + +## Phase 2: Component Audit Checklist + +Below are the hardcoded values found across component CSS that should be replaced with tokens. + +### Critical Fixes (P0) + +- [ ] **card.css line 441**: `.base-model { background: #f0f0f0; }` → use `--bg-hover` or new `--surface-variant` +- [ ] **card.css line 369**: `.favorite-active { color: #ffc107 !important; }` → use `--favorite-color` (already defined in tokens) +- [ ] **layout.css line 134**: `.control-group button.favorite-filter i { color: #ffc107; }` → use `--favorite-color` +- [ ] **header.css lines 233-250**: Hardcoded dark theme colors (`#3a3a3a`, `#888888`, `#555555`) → use `--bg-disabled`, `--text-secondary`, `--border-base` + +### Spacing Normalization (P1) + +Replace hard pixel values with token equivalents: + +- [ ] `padding: 4px 10px` → `padding: var(--space-1) var(--space-3)` +- [ ] `gap: 6px` → `gap: var(--space-1-legacy)` or `gap: var(--space-2)` +- [ ] `gap: 8px` → `gap: var(--space-2)` +- [ ] `gap: 12px` → `gap: var(--space-3)` +- [ ] `padding: 15px` → `padding: var(--space-4)` +- [ ] `padding: 16px` → `padding: var(--space-4)` +- [ ] `margin-top: 2px` → `margin-top: var(--space-0-5)` +- [ ] `padding: 2px 6px` → `padding: var(--space-0-5) var(--space-2)` +- [ ] `border-radius: 50%` → `border-radius: var(--radius-full)` + +### Shadow Standardization (P1) + +Replace hardcoded shadows with token equivalents: + +- [ ] `box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05)` → `box-shadow: var(--shadow-xs)` +- [ ] `box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05)` → `box-shadow: var(--shadow-sm)` +- [ ] `box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1)` → `box-shadow: var(--shadow-md)` +- [ ] `box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08)` → `box-shadow: var(--shadow-lg)` +- [ ] `box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15)` → `box-shadow: var(--shadow-xl)` +- [ ] `box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08)` → combine or add new token + +### Typography Normalization (P1) + +Replace scattered font sizes with type scale: + +- [ ] `font-size: 0.8em` → `font-size: var(--text-xs)` +- [ ] `font-size: 0.85em` → `font-size: var(--text-sm)` +- [ ] `font-size: 0.9em` → `font-size: var(--text-sm)` +- [ ] `font-size: 0.95em` → `font-size: var(--text-md)` +- [ ] `font-size: 1.1em` → `font-size: var(--text-lg)` +- [ ] `font-size: 11px` → `font-size: var(--text-xs)` + +### Breakpoint Normalization (P2) + +Replace magic numbers with named breakpoints: + +- [ ] `@media (min-width: 2150px)` → `@media (min-width: var(--bp-ultrawide))` +- [ ] `@media (min-width: 3000px)` → `@media (min-width: var(--bp-4k))` +- [ ] `@media (max-width: 768px)` → `@media (max-width: var(--bp-mobile))` +- [ ] `@media (max-width: 1200px)` → `@media (max-width: var(--bp-desktop))` + +### Z-Index Cleanup (P2) + +Replace magic z-index values with tokens: + +- [ ] `z-index: 2` / `z-index: 3` / `z-index: 4` in card.css → use `--z-base` + calc +- [ ] `z-index: 200` in header.css (hamburger dropdown) → use `--z-dropdown` + +### Remaining Hardcoded Colors (P2) + +- [ ] `rgba(0, 184, 122, 0.05)` and `#00B87A` in import-modal.css → use `--color-success` +- [ ] `rgba(255, 255, 255, 0.12)` in card.css (base-model-label background) → use token +- [ ] `rgba(255, 255, 255, 0.25)` in card.css (separator) → use `--border-inverse` +- [ ] `rgba(0, 0, 0, 0.5)` and `rgba(0, 0, 0, 0.7)` in card.css (toggle blur btn) → use `--bg-overlay` variants +- [ ] `rgba(46, 204, 113, 0.3)` and `rgba(231, 76, 60, 0.3)` in card.css → use success/error tokens + +## New Tokens Added + +The following tokens were added beyond the existing system: + +| Token | Value | Use Case | +|-------|-------|----------| +| `--color-accent-hover` | oklch(58% 0.28 256) | Hover states for accent buttons | +| `--color-accent-subtle` | accent @ 12% opacity | Subtle accent backgrounds | +| `--color-accent-border` | accent @ 25% opacity | Accent borders | +| `--color-accent-transparent` | accent @ 60% opacity | Glow effects, pulse animations | +| `--bg-hover` | oklch(95% 0.02 256) / dark: oklch(35% 0.02 256) | Hover backgrounds | +| `--bg-disabled` | #f5f5f5 / dark: #3a3a3a | Disabled input backgrounds | +| `--bg-overlay` | oklch(0% 0 0 / 0.75) | Modal overlays, gradients | +| `--surface-hover` | oklch(95% 0.02 256) / dark: oklch(35% 0.02 256) | Card/panel hover | +| `--favorite-color` | #d4a017 | Accessible gold for favorites | +| `--shadow-focus` | 0 0 0 1px accent | Focus ring shadow | +| `--shadow-glow` | 0 2px 6px info-glow | Badge glow effects | +| `--transition-bounce` | 200ms cubic-bezier | Playful hover transitions | + +## Migration Order Recommendation + +1. **Start with colors**: Replace `#ffc107` and `#f0f0f0` (highest visual impact) +2. **Then spacing**: Unify padding/gap values (biggest consistency win) +3. **Then shadows**: Replace rgba shadows with tokens +4. **Then typography**: Standardize font sizes +5. **Finally breakpoints + z-index**: Lower priority but good for maintainability + +## Testing Checklist + +After each component file is migrated: + +- [ ] Light theme renders correctly +- [ ] Dark theme renders correctly +- [ ] No visual regressions in card grid, header, modals +- [ ] Focus states still visible +- [ ] Hover transitions still work (unless prefers-reduced-motion) diff --git a/static/css/tokens/breakpoints.css b/static/css/tokens/breakpoints.css new file mode 100644 index 00000000..3d03aff2 --- /dev/null +++ b/static/css/tokens/breakpoints.css @@ -0,0 +1,8 @@ +:root { + --bp-mobile: 768px; + --bp-tablet: 1024px; + --bp-desktop: 1400px; + --bp-wide: 1920px; + --bp-ultrawide: 2150px; + --bp-4k: 3000px; +} diff --git a/static/css/tokens/colors.css b/static/css/tokens/colors.css new file mode 100644 index 00000000..1ee5077f --- /dev/null +++ b/static/css/tokens/colors.css @@ -0,0 +1,113 @@ +:root { + --color-accent-l: 68%; + --color-accent-c: 0.28; + --color-accent-h: 256; + --color-warning-l: 75%; + --color-warning-c: 0.25; + --color-warning-h: 80; + --color-success-l: 70%; + --color-success-c: 0.2; + --color-success-h: 140; + --color-error-l: 75%; + --color-error-c: 0.32; + --color-error-h: 29; + --color-info-l: 72%; + --color-info-c: 0.2; + --color-info-h: 220; + --color-neutral-h: 250; +} + +:root { + --color-accent: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h)); + --color-accent-hover: oklch(58% var(--color-accent-c) var(--color-accent-h)); + --color-accent-subtle: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h) / 0.12); + --color-accent-border: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h) / 0.25); + --color-accent-transparent: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h) / 0.6); + + --color-warning: oklch(var(--color-warning-l) var(--color-warning-c) var(--color-warning-h)); + --color-warning-bg: oklch(var(--color-warning-l) var(--color-warning-c) var(--color-warning-h) / 0.15); + --color-warning-border: oklch(var(--color-warning-l) var(--color-warning-c) var(--color-warning-h) / 0.3); + + --color-success: oklch(var(--color-success-l) var(--color-success-c) var(--color-success-h)); + --color-success-bg: oklch(var(--color-success-l) var(--color-success-c) var(--color-success-h) / 0.2); + --color-success-border: oklch(var(--color-success-l) var(--color-success-c) var(--color-success-h) / 0.3); + + --color-error: oklch(var(--color-error-l) var(--color-error-c) var(--color-error-h)); + --color-error-bg: color-mix(in oklch, var(--color-error) 20%, transparent); + --color-error-border: color-mix(in oklch, var(--color-error) 50%, transparent); + + --color-info: oklch(var(--color-info-l) var(--color-info-c) var(--color-info-h)); + --color-info-bg: oklch(72% 0.2 220); + --color-info-text: oklch(28% 0.03 220); + --color-info-glow: oklch(72% 0.2 220 / 0.28); + + --color-skip-refresh-bg: oklch(82% 0.12 45); + --color-skip-refresh-text: oklch(35% 0.02 45); + --color-skip-refresh-glow: oklch(82% 0.12 45 / 0.15); +} + +:root { + --bg-base: #ffffff; + --bg-elevated: oklch(97% 0 0 / 0.95); + --bg-overlay: oklch(0% 0 0 / 0.75); + --bg-hover: oklch(95% 0.02 256); + --bg-disabled: #f5f5f5; + + --text-primary: #333333; + --text-secondary: #6c757d; + --text-inverse: #ffffff; + --text-muted-on-dark: rgba(255, 255, 255, 0.8); + + --surface-base: #ffffff; + --surface-elevated: oklch(97% 0 0 / 0.95); + --surface-hover: oklch(95% 0.02 256); + + --border-base: #e0e0e0; + --border-subtle: oklch(72% 0.03 256 / 0.45); + --border-inverse: rgba(255, 255, 255, 0.25); + + --status-success-text: oklch(75% 0.12 230); + --status-success-bg: oklch(55% 0.15 240 / 0.25); + --status-success-border: oklch(60% 0.18 250 / 0.3); + --status-info-text: oklch(78% 0.10 185); + --status-info-bg: oklch(50% 0.10 190 / 0.25); + --status-info-border: oklch(55% 0.12 195 / 0.3); + + --favorite-color: #d4a017; + --favorite-glow: oklch(75% 0.15 85 / 0.5); +} + +[data-theme="dark"] { + --bg-base: #1a1a1a; + --bg-elevated: oklch(25% 0.02 256 / 0.98); + --bg-overlay: oklch(0% 0 0 / 0.75); + --bg-hover: oklch(35% 0.02 256); + --bg-disabled: #3a3a3a; + + --text-primary: #e0e0e0; + --text-secondary: #a0a0a0; + --text-inverse: #1a1a1a; + --text-muted-on-dark: rgba(255, 255, 255, 0.8); + + --surface-base: #2d2d2d; + --surface-elevated: oklch(25% 0.02 256 / 0.98); + --surface-hover: oklch(35% 0.02 256); + + --border-base: #404040; + --border-subtle: oklch(90% 0.02 256 / 0.15); + --border-inverse: rgba(255, 255, 255, 0.25); + + --status-success-text: oklch(75% 0.12 230); + --status-success-bg: oklch(55% 0.15 240 / 0.25); + --status-success-border: oklch(60% 0.18 250 / 0.3); + --status-info-text: oklch(78% 0.10 185); + --status-info-bg: oklch(50% 0.10 190 / 0.25); + --status-info-border: oklch(55% 0.12 195 / 0.3); + + --color-info-bg: oklch(62% 0.18 220); + --color-info-text: oklch(98% 0.02 240); + --color-info-glow: oklch(62% 0.18 220 / 0.4); + + --color-error-bg: color-mix(in oklch, var(--color-error) 15%, transparent); + --color-error-border: color-mix(in oklch, var(--color-error) 40%, transparent); +} diff --git a/static/css/tokens/effects.css b/static/css/tokens/effects.css new file mode 100644 index 00000000..c68707b2 --- /dev/null +++ b/static/css/tokens/effects.css @@ -0,0 +1,25 @@ +:root { + --radius-none: 0px; + --radius-xs: 4px; + --radius-sm: 6px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + --radius-full: 9999px; + + --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05); + --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.05); + --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 3px 5px rgba(0, 0, 0, 0.08); + --shadow-xl: 0 4px 16px rgba(0, 0, 0, 0.15); + --shadow-focus: 0 0 0 1px var(--color-accent); + --shadow-glow: 0 2px 6px var(--color-info-glow); + + --transition-fast: 150ms ease; + --transition-base: 200ms ease; + --transition-slow: 300ms ease; + --transition-bounce: 200ms cubic-bezier(0.34, 1.56, 0.64, 1); + + --border-width-thin: 1px; + --border-width-thick: 2px; +} diff --git a/static/css/tokens/index.css b/static/css/tokens/index.css new file mode 100644 index 00000000..edc3d4a7 --- /dev/null +++ b/static/css/tokens/index.css @@ -0,0 +1,6 @@ +@import 'colors.css'; +@import 'typography.css'; +@import 'spacing.css'; +@import 'effects.css'; +@import 'breakpoints.css'; +@import 'z-index.css'; diff --git a/static/css/tokens/spacing.css b/static/css/tokens/spacing.css new file mode 100644 index 00000000..c8265400 --- /dev/null +++ b/static/css/tokens/spacing.css @@ -0,0 +1,19 @@ +:root { + --space-0-5: 2px; + --space-1: 4px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + --space-16: 64px; + --space-20: 80px; + + --space-1-legacy: calc(8px * 1); + --space-2-legacy: calc(8px * 2); + --space-3-legacy: calc(8px * 3); + --space-4-legacy: calc(8px * 4); +} diff --git a/static/css/tokens/typography.css b/static/css/tokens/typography.css new file mode 100644 index 00000000..01f8900b --- /dev/null +++ b/static/css/tokens/typography.css @@ -0,0 +1,20 @@ +:root { + --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; + --font-mono: 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, Menlo, monospace; + + --text-xs: 0.75rem; + --text-sm: 0.875rem; + --text-base: 1rem; + --text-md: 0.95rem; + --text-lg: 1.1rem; + --text-xl: 1.25rem; + + --leading-tight: 1.2; + --leading-normal: 1.4; + --leading-relaxed: 1.5; + + --weight-normal: 400; + --weight-medium: 500; + --weight-semibold: 600; + --weight-bold: 700; +} diff --git a/static/css/tokens/z-index.css b/static/css/tokens/z-index.css new file mode 100644 index 00000000..f3347da0 --- /dev/null +++ b/static/css/tokens/z-index.css @@ -0,0 +1,11 @@ +:root { + --z-base: 10; + --z-sticky: 50; + --z-header: 100; + --z-dropdown: 200; + --z-modal-backdrop: 500; + --z-modal: 1000; + --z-overlay: 2000; + --z-toast: 3000; + --z-tooltip: 4000; +}