|
1 | 1 | /** |
2 | | - * Bloom — light lavender app shell; cream secondary/accent surfaces (inverse of Tailor light). |
| 2 | + * Bloom — lavender shell + indigo brand (light + dark). |
| 3 | + * |
| 4 | + * Token tiers (see default.css for the full explanation): |
| 5 | + * BRAND — re-skin knobs: primary/secondary (+foregrounds) + shell gradient. |
| 6 | + * DERIVED — computed from BRAND; declared once and re-resolves in dark. |
| 7 | + * SYSTEM — neutral surfaces/text; accessibility-locked. |
| 8 | + * STATUS — semantic status, charts, radius, shadows; fixed. |
| 9 | + * |
| 10 | + * Mode = `.dark` class; palette = `data-theme="bloom"`. |
3 | 11 | */ |
4 | 12 | html[data-theme="bloom"] { |
5 | 13 | color-scheme: light; |
6 | | - --background: rgba(239, 232, 255, 1); |
7 | | - /* Shell gradient stops (globals.css): light lavender tint at top → white at bottom. */ |
8 | | - --shell-gradient-start: color-mix(in srgb, var(--background) 55%, rgb(255, 255, 255)); |
9 | | - --shell-gradient-end: rgb(255, 255, 255); |
| 14 | + |
| 15 | + /* ───── BRAND — override to re-skin ───── */ |
| 16 | + --primary: rgba(83, 90, 232, 1); |
| 17 | + --primary-foreground: rgba(255, 255, 255, 1); |
| 18 | + --secondary: rgba(245, 245, 245, 1); |
| 19 | + --secondary-foreground: rgba(23, 23, 23, 1); |
| 20 | + --shell-gradient-base: rgba(239, 232, 255, 1); |
| 21 | + --shell-gradient-tint: rgb(255, 255, 255); |
| 22 | + |
| 23 | + /* ───── DERIVED from brand (do not edit; re-resolves in dark) ───── */ |
| 24 | + --accent: color-mix(in srgb, var(--primary) 15%, var(--card)); |
| 25 | + --accent-foreground: var(--foreground); |
| 26 | + --ring: color-mix(in srgb, var(--primary) 45%, transparent); |
| 27 | + --sidebar-primary: var(--primary); |
| 28 | + --sidebar-primary-foreground: var(--primary-foreground); |
| 29 | + --sidebar-accent: var(--accent); |
| 30 | + --sidebar-accent-foreground: var(--accent-foreground); |
| 31 | + --sidebar-ring: var(--ring); |
| 32 | + --shell-gradient-start: color-mix( |
| 33 | + in srgb, |
| 34 | + var(--shell-gradient-base) 55%, |
| 35 | + var(--shell-gradient-tint) |
| 36 | + ); |
| 37 | + --shell-gradient-end: var(--shell-gradient-tint); |
| 38 | + |
| 39 | + /* ───── SYSTEM — neutral surfaces/text (accessibility-locked) ───── */ |
| 40 | + --background: rgba(250, 250, 250, 1); |
10 | 41 | --foreground: rgba(16, 18, 43, 1); |
11 | 42 | --card: rgba(255, 255, 255, 1); |
12 | 43 | --card-foreground: rgba(16, 18, 43, 1); |
13 | 44 | --popover: rgba(255, 255, 255, 1); |
14 | 45 | --popover-foreground: rgba(16, 18, 43, 1); |
15 | | - --primary: rgba(83, 90, 232, 1); |
16 | | - --primary-foreground: rgba(255, 255, 255, 1); |
17 | | - /* Match light theme — neutral pale grey reads as a soft pill on the lavender shell. */ |
18 | | - --secondary: rgba(245, 245, 245, 1); |
19 | | - --secondary-foreground: rgba(23, 23, 23, 1); |
20 | | - /* Row hovers / `bg-muted`: subtle neutral lift (same alpha family as `--border`). */ |
21 | | - --muted: rgba(0, 0, 0, 0.08); |
| 46 | + /* Lighter lavender (gradient top) so muted surfaces read on-theme on white cards. */ |
| 47 | + --muted: rgba(246, 242, 255, 1); |
22 | 48 | --muted-foreground: rgba(16, 18, 43, 0.72); |
23 | | - --accent: rgba(248, 243, 228, 1); |
24 | | - --accent-foreground: rgba(16, 18, 43, 1); |
25 | | - /* Destructive matches default light theme so the brand red stays consistent across light/cream/bloom. */ |
26 | | - --destructive: rgba(220, 38, 38, 1); |
27 | | - --destructive-foreground: rgba(254, 242, 242, 1); |
28 | 49 | --border: rgba(0, 0, 0, 0.08); |
29 | 50 | --input: rgba(0, 0, 0, 0.08); |
30 | | - --ring: rgba(83, 90, 232, 0.45); |
| 51 | + --sidebar: rgba(250, 250, 250, 1); |
| 52 | + --sidebar-foreground: rgba(16, 18, 43, 1); |
| 53 | + --sidebar-border: rgba(0, 0, 0, 0.08); |
| 54 | + |
| 55 | + /* ───── STATUS / STRUCTURAL — semantic, fixed ───── */ |
| 56 | + --destructive: rgba(220, 38, 38, 1); |
| 57 | + --destructive-foreground: rgba(254, 242, 242, 1); |
| 58 | + --radius: 1rem; |
31 | 59 | --chart-1: rgba(83, 90, 232, 1); |
32 | 60 | --chart-2: rgba(0, 151, 156, 1); |
33 | 61 | --chart-3: rgba(1, 55, 66, 1); |
34 | 62 | --chart-4: rgba(110, 95, 195, 1); |
35 | 63 | --chart-5: rgba(217, 119, 6, 1); |
36 | | - --radius: 1rem; |
37 | | - --sidebar: rgba(239, 232, 255, 1); |
38 | | - --sidebar-foreground: rgba(16, 18, 43, 1); |
39 | | - --sidebar-primary: rgba(83, 90, 232, 1); |
40 | | - --sidebar-primary-foreground: rgba(255, 255, 255, 1); |
41 | | - /* White elevated row on lavender shell (readable vs lavender-on-lavender) */ |
42 | | - --sidebar-accent: rgba(255, 255, 255, 1); |
43 | | - --sidebar-accent-foreground: rgba(16, 18, 43, 1); |
44 | | - --sidebar-border: rgba(0, 0, 0, 0.08); |
45 | | - --sidebar-ring: rgba(83, 90, 232, 0.45); |
46 | | - --status-default: rgba(16, 18, 43, 0.55); |
47 | | - /* Bloom: teal + violet-tint foregrounds; amber + dusty rose harmonize with shell */ |
48 | | - --status-neutral: #0b8c9a; |
49 | | - --status-completed: #0d7668; |
50 | | - --status-attention: #ae6f12; |
51 | | - --status-danger: #ae2438; |
| 64 | + /* --status-* inherited from the default palette (semantic, theme-independent). */ |
52 | 65 | --semantic-shadow-xs: 0 1px 2px 0 rgb(16 18 43 / 0.07); |
53 | 66 | --semantic-shadow-sm: 0 1px 3px 0 rgb(16 18 43 / 0.08), 0 1px 2px -1px rgb(16 18 43 / 0.06); |
54 | 67 | --semantic-shadow-md: 0 4px 6px -1px rgb(16 18 43 / 0.1), 0 2px 4px -2px rgb(16 18 43 / 0.08); |
55 | 68 | --semantic-shadow-lg: 0 10px 15px -3px rgb(16 18 43 / 0.12), 0 4px 6px -4px rgb(83 90 232 / 0.1); |
56 | 69 | } |
57 | 70 |
|
| 71 | +/* |
| 72 | + * Dark variant — overrides BRAND + SYSTEM (+ differing STATUS); the DERIVED tier |
| 73 | + * re-resolves against the dark `--primary` / `--card` / `--shell-gradient-base`. |
| 74 | + * Surfaces reuse the default-dark neutrals so cards sit clearly above the canvas. |
| 75 | + */ |
| 76 | +html[data-theme="bloom"].dark { |
| 77 | + color-scheme: dark; |
| 78 | + |
| 79 | + /* ───── BRAND ───── */ |
| 80 | + --primary: rgba(131, 138, 247, 1); |
| 81 | + --primary-foreground: rgba(16, 18, 43, 1); |
| 82 | + --secondary: rgba(40, 43, 62, 1); |
| 83 | + --secondary-foreground: rgba(248, 249, 252, 1); |
| 84 | + --shell-gradient-base: rgba(9, 10, 17, 1); |
| 85 | + --shell-gradient-tint: rgb(16, 17, 26); |
| 86 | + |
| 87 | + /* ───── SYSTEM ───── */ |
| 88 | + --background: rgba(10, 10, 10, 1); |
| 89 | + --foreground: rgba(248, 249, 252, 1); |
| 90 | + --card: rgba(26, 28, 42, 1); |
| 91 | + --card-foreground: rgba(248, 249, 252, 1); |
| 92 | + --popover: rgba(34, 37, 54, 1); |
| 93 | + --popover-foreground: rgba(248, 249, 252, 1); |
| 94 | + --muted: rgba(36, 39, 58, 1); |
| 95 | + --muted-foreground: rgba(180, 183, 200, 1); |
| 96 | + --border: rgba(255, 255, 255, 0.08); |
| 97 | + --input: rgba(255, 255, 255, 0.12); |
| 98 | + --sidebar: rgba(10, 10, 10, 1); |
| 99 | + --sidebar-foreground: rgba(248, 249, 252, 1); |
| 100 | + --sidebar-border: rgba(255, 255, 255, 0.08); |
| 101 | + |
| 102 | + /* ───── STATUS / STRUCTURAL (dark) ───── */ |
| 103 | + --destructive: rgba(248, 113, 113, 1); |
| 104 | + --destructive-foreground: rgba(254, 242, 242, 1); |
| 105 | + --chart-1: rgba(131, 138, 247, 1); |
| 106 | + --chart-2: rgba(45, 191, 196, 1); |
| 107 | + --chart-3: rgba(94, 234, 212, 1); |
| 108 | + --chart-4: rgba(167, 139, 250, 1); |
| 109 | + --chart-5: rgba(251, 191, 36, 1); |
| 110 | + /* --status-* inherited from the default palette (semantic, theme-independent). */ |
| 111 | + --semantic-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.35); |
| 112 | + --semantic-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.38), 0 1px 2px -1px rgb(0 0 0 / 0.32); |
| 113 | + --semantic-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.35), 0 2px 4px -2px rgb(0 0 0 / 0.28); |
| 114 | + --semantic-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.42), 0 4px 6px -4px rgb(0 0 0 / 0.35); |
| 115 | +} |
| 116 | + |
58 | 117 | /* |
59 | 118 | * Structural overrides — shell gradient, transparent chrome, squircle corners, |
60 | | - * tighter heading rhythm. These rules give Bloom its distinctive branded look. |
| 119 | + * tighter heading rhythm. Apply in both modes (gradient reads `--shell-gradient-base` |
| 120 | + * + the per-mode `--shell-gradient-tint`). |
61 | 121 | */ |
62 | 122 |
|
63 | 123 | @layer base { |
64 | | - /* Vertical shell gradient: light lavender tint at top -> white at bottom. */ |
| 124 | + /* Vertical shell gradient: tinted lift at top -> base surface at bottom. */ |
65 | 125 | html[data-theme="bloom"] { |
66 | 126 | min-height: 100vh; |
67 | 127 | min-height: 100dvh; |
68 | | - background-color: var(--background); |
| 128 | + background-color: var(--shell-gradient-base); |
69 | 129 | background-image: linear-gradient( |
70 | 130 | to bottom, |
71 | 131 | var(--shell-gradient-start) 0%, |
72 | | - color-mix(in srgb, var(--background) 45%, white) 20%, |
73 | | - color-mix(in srgb, var(--background) 30%, white) 40%, |
74 | | - color-mix(in srgb, var(--background) 15%, white) 55%, |
75 | | - color-mix(in srgb, var(--background) 6%, white) 65%, |
| 132 | + color-mix(in srgb, var(--shell-gradient-base) 45%, var(--shell-gradient-tint)) 20%, |
| 133 | + color-mix(in srgb, var(--shell-gradient-base) 30%, var(--shell-gradient-tint)) 40%, |
| 134 | + color-mix(in srgb, var(--shell-gradient-base) 15%, var(--shell-gradient-tint)) 55%, |
| 135 | + color-mix(in srgb, var(--shell-gradient-base) 6%, var(--shell-gradient-tint)) 65%, |
76 | 136 | var(--shell-gradient-end) 70%, |
77 | 137 | var(--shell-gradient-end) 100% |
78 | 138 | ); |
|
0 commit comments