@warmio/design 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSES/geist-OFL-1.1.txt +93 -0
  2. package/LICENSES/geist-mono-OFL-1.1.txt +93 -0
  3. package/LICENSES/inter-OFL-1.1.txt +93 -0
  4. package/README.md +13 -0
  5. package/base.css +10 -0
  6. package/fonts/geist-cyrillic-ext-wght-italic.woff2 +0 -0
  7. package/fonts/geist-cyrillic-ext-wght-normal.woff2 +0 -0
  8. package/fonts/geist-cyrillic-wght-italic.woff2 +0 -0
  9. package/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  10. package/fonts/geist-latin-ext-wght-italic.woff2 +0 -0
  11. package/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  12. package/fonts/geist-latin-wght-italic.woff2 +0 -0
  13. package/fonts/geist-latin-wght-normal.woff2 +0 -0
  14. package/fonts/geist-mono-cyrillic-ext-wght-italic.woff2 +0 -0
  15. package/fonts/geist-mono-cyrillic-ext-wght-normal.woff2 +0 -0
  16. package/fonts/geist-mono-cyrillic-wght-italic.woff2 +0 -0
  17. package/fonts/geist-mono-cyrillic-wght-normal.woff2 +0 -0
  18. package/fonts/geist-mono-latin-ext-wght-italic.woff2 +0 -0
  19. package/fonts/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  20. package/fonts/geist-mono-latin-wght-italic.woff2 +0 -0
  21. package/fonts/geist-mono-latin-wght-normal.woff2 +0 -0
  22. package/fonts/geist-mono-symbols2-wght-italic.woff2 +0 -0
  23. package/fonts/geist-mono-symbols2-wght-normal.woff2 +0 -0
  24. package/fonts/geist-mono-vietnamese-wght-italic.woff2 +0 -0
  25. package/fonts/geist-mono-vietnamese-wght-normal.woff2 +0 -0
  26. package/fonts/geist-vietnamese-wght-italic.woff2 +0 -0
  27. package/fonts/geist-vietnamese-wght-normal.woff2 +0 -0
  28. package/fonts/inter-cyrillic-ext-wght-italic.woff2 +0 -0
  29. package/fonts/inter-cyrillic-ext-wght-normal.woff2 +0 -0
  30. package/fonts/inter-cyrillic-wght-italic.woff2 +0 -0
  31. package/fonts/inter-cyrillic-wght-normal.woff2 +0 -0
  32. package/fonts/inter-greek-ext-wght-italic.woff2 +0 -0
  33. package/fonts/inter-greek-ext-wght-normal.woff2 +0 -0
  34. package/fonts/inter-greek-wght-italic.woff2 +0 -0
  35. package/fonts/inter-greek-wght-normal.woff2 +0 -0
  36. package/fonts/inter-latin-ext-wght-italic.woff2 +0 -0
  37. package/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
  38. package/fonts/inter-latin-wght-italic.woff2 +0 -0
  39. package/fonts/inter-latin-wght-normal.woff2 +0 -0
  40. package/fonts/inter-vietnamese-wght-italic.woff2 +0 -0
  41. package/fonts/inter-vietnamese-wght-normal.woff2 +0 -0
  42. package/fonts.css +414 -0
  43. package/globals.css +3 -0
  44. package/package.json +38 -0
  45. package/theme.css +592 -0
  46. package/themes.css +48 -0
package/theme.css ADDED
@@ -0,0 +1,592 @@
1
+ /* ════════════════════════════════════════════════════════════════════════════
2
+ 4-COLOR THEME SYSTEM
3
+
4
+ Theme definitions are in themes.css. This file contains the derivation system.
5
+
6
+ INPUT (defined per-theme in themes.css as hex colors):
7
+ --brand-primary Main identity (buttons, links, primary actions)
8
+ --brand-accent Complementary accent (secondary elements, highlights)
9
+ --brand-muted Subtle tone (charts, badges, tertiary elements)
10
+ --brand-neutral Base for surfaces (backgrounds, borders, text)
11
+
12
+ DERIVED:
13
+ All UI colors are derived from these 4 base colors using CSS relative
14
+ color syntax: oklch(from var(--color) l c h)
15
+
16
+ MODE: Light/dark controlled via .dark class
17
+
18
+ Semantic colors (success, warning, error, info) are FIXED because their
19
+ meanings are universal and culturally established.
20
+ ════════════════════════════════════════════════════════════════════════════ */
21
+
22
+ /* Import theme definitions */
23
+ @import './themes.css';
24
+
25
+ :root {
26
+ /* ══════════════════════════════════════════════════════════════════════════
27
+ PRIMARY — From brand-primary
28
+ Main identity color for buttons, links, and primary actions.
29
+ ══════════════════════════════════════════════════════════════════════════ */
30
+ --primary: oklch(0.214 0.009 43.1);
31
+ --primary-foreground: oklch(0.986 0.002 67.8);
32
+ --ring: oklch(0.714 0.014 41.2);
33
+ --focus: oklch(0.714 0.014 41.2 / 0.5);
34
+ --active: oklch(0.214 0.009 43.1 / 0.18);
35
+ /* Unified focus ring base color for outline + pseudo ring */
36
+ --focus-ring: oklch(0.714 0.014 41.2);
37
+
38
+ /* ══════════════════════════════════════════════════════════════════════════
39
+ ACCENT — From brand-accent
40
+ Complementary color for secondary elements and highlights.
41
+ ══════════════════════════════════════════════════════════════════════════ */
42
+ --accent: oklch(0.96 0.002 17.2);
43
+ --accent-foreground: oklch(0.214 0.009 43.1);
44
+
45
+ /* Interactive hover background - single source of truth for all hover states */
46
+ --hover-bg: color-mix(in oklch, var(--foreground) 4%, transparent);
47
+
48
+ /* ══════════════════════════════════════════════════════════════════════════
49
+ SECONDARY — Derived from brand-primary (lighter, desaturated)
50
+ For secondary buttons and less prominent actions.
51
+ ══════════════════════════════════════════════════════════════════════════ */
52
+ --secondary: oklch(0.96 0.002 17.2);
53
+ --secondary-foreground: oklch(0.214 0.009 43.1);
54
+
55
+ /* ══════════════════════════════════════════════════════════════════════════
56
+ SURFACES — From brand-neutral
57
+ Backgrounds, cards, borders - subtle tinted neutrals.
58
+ ══════════════════════════════════════════════════════════════════════════ */
59
+ --background: oklch(1 0 0);
60
+ --foreground: oklch(0.147 0 0);
61
+ --card: oklch(1 0 0);
62
+ --card-gradient-start: oklch(1 0 0);
63
+ --card-foreground: var(--foreground);
64
+ --popover: var(--card);
65
+ --popover-foreground: var(--foreground);
66
+ --muted: oklch(0.96 0 0);
67
+ --muted-foreground: oklch(0.547 0 0);
68
+ --border: oklch(0.922 0 0);
69
+ --input: var(--border);
70
+
71
+ /* Alternating section backgrounds for marketing pages */
72
+ --section-alt: oklch(0.986 0 0);
73
+
74
+ /* Charts */
75
+ --chart-1: oklch(0.32 0 none);
76
+ --chart-2: oklch(0.41 0 none);
77
+ --chart-3: oklch(0.54 0 none);
78
+ --chart-4: oklch(0.71 0 none);
79
+ --chart-5: oklch(0.89 0 none);
80
+
81
+ /* Logo */
82
+ --logo-accent: var(--logo-primary);
83
+
84
+ /* ══════════════════════════════════════════════════════════════════════════
85
+ SIDEBAR — Transparent to show body texture
86
+ ══════════════════════════════════════════════════════════════════════════ */
87
+ --sidebar: oklch(0.986 0 0);
88
+ --sidebar-foreground: var(--foreground);
89
+ --sidebar-primary: var(--primary);
90
+ --sidebar-primary-foreground: var(--primary-foreground);
91
+ --sidebar-accent: oklch(0.96 0 0);
92
+ --sidebar-accent-foreground: oklch(0.214 0.009 43.1);
93
+ --sidebar-border: oklch(0.922 0 0);
94
+ --sidebar-ring: oklch(0.714 0.014 41.2);
95
+
96
+ /* ══════════════════════════════════════════════════════════════════════════
97
+ FIXED SEMANTIC COLORS
98
+ These are universal - green=success, amber=warning, red=error, blue=info
99
+ ══════════════════════════════════════════════════════════════════════════ */
100
+
101
+ /* Success = Green (H: 145) */
102
+ --success: oklch(0.65 0.16 145);
103
+ --success-text: oklch(0.35 0.16 145);
104
+ --success-bg-subtle: oklch(0.96 0.03 145);
105
+ --success-bg-muted: oklch(0.9 0.08 145);
106
+ --success-border: oklch(0.75 0.12 145);
107
+
108
+ /* Warning = Amber (H: 85) */
109
+ --warning: oklch(0.75 0.17 85);
110
+ --warning-text: oklch(0.35 0.17 85);
111
+ --warning-bg-subtle: oklch(0.96 0.03 85);
112
+ --warning-bg-muted: oklch(0.9 0.1 85);
113
+ --warning-border: oklch(0.75 0.12 85);
114
+ --warning-card-surface: color-mix(
115
+ in oklch,
116
+ var(--card) 82%,
117
+ oklch(from var(--warning) l calc(c + 0.08) h) 18%
118
+ );
119
+
120
+ /* Destructive/Error = Red (H: 30) */
121
+ --destructive: oklch(0.55 0.12 30);
122
+ --destructive-foreground: oklch(1 0 0);
123
+ --danger: var(--destructive);
124
+ --error-text: oklch(0.35 0.14 30);
125
+ --error-bg-subtle: oklch(0.96 0.02 30);
126
+ --error-bg-muted: oklch(0.9 0.06 30);
127
+ --error-border: oklch(0.75 0.08 30);
128
+ --danger-card-surface: color-mix(
129
+ in oklch,
130
+ var(--card) 98%,
131
+ oklch(from var(--destructive) l calc(c + 0.1) h) 2%
132
+ );
133
+
134
+ /* Info = Blue (H: 250) */
135
+ --info-text: oklch(0.35 0.1 250);
136
+ --info-bg-subtle: oklch(0.96 0.02 250);
137
+ --info-bg-muted: oklch(0.9 0.06 250);
138
+ --info-border: oklch(0.75 0.06 250);
139
+
140
+ /* ══════════════════════════════════════════════════════════════════════════
141
+ EFFECTS & OVERLAYS (Light Mode)
142
+ ══════════════════════════════════════════════════════════════════════════ */
143
+
144
+ --overlay-subtle: rgb(0 0 0 / 0.05);
145
+ --overlay-light: rgb(0 0 0 / 0.1);
146
+ --overlay-medium: rgb(0 0 0 / 0.2);
147
+ --overlay-strong: rgb(0 0 0 / 0.25);
148
+ --overlay-heavy: rgb(0 0 0 / 0.33);
149
+
150
+ --highlight-subtle: rgb(255 255 255 / 0.3);
151
+ --highlight-light: rgb(255 255 255 / 0.5);
152
+ --highlight-medium: rgb(255 255 255 / 0.8);
153
+ --highlight-strong: rgb(255 255 255 / 1);
154
+
155
+ --glass-background: rgb(0 0 0 / 0.02);
156
+ --glass-border: rgb(255 255 255 / 0.5);
157
+ --backdrop-blur: rgb(0 0 0 / 0.1);
158
+
159
+ /* Shadows */
160
+ --shadow-2xs: 0px 1px 2px 0px var(--overlay-subtle);
161
+ --shadow-xs: 0px 1px 2px 0px var(--overlay-subtle);
162
+ --shadow-sm: 0px 1px 2px 0px var(--overlay-light), 0px 1px 2px -1px var(--overlay-light);
163
+ --shadow: 0px 1px 2px 0px var(--overlay-light), 0px 1px 2px -1px var(--overlay-light);
164
+ --shadow-md: 0px 1px 2px 0px var(--overlay-light), 0px 2px 4px -1px var(--overlay-light);
165
+ --shadow-lg: 0px 1px 2px 0px var(--overlay-light), 0px 4px 6px -1px var(--overlay-light);
166
+ --shadow-xl: 0px 1px 2px 0px var(--overlay-light), 0px 8px 10px -1px var(--overlay-light);
167
+ --shadow-2xl: 0px 1px 2px 0px var(--overlay-strong);
168
+ --shadow-border:
169
+ 0 0 0 1px var(--border), 0 1px 2px -1px var(--overlay-subtle), 0 2px 4px 0 var(--overlay-subtle);
170
+
171
+ /* ══════════════════════════════════════════════════════════════════════════
172
+ NON-COLOR TOKENS (shared across all themes)
173
+ ══════════════════════════════════════════════════════════════════════════ */
174
+
175
+ /* Typography — CSS variables (--font-sans, --font-serif, --font-mono, --font-display)
176
+ are defined in the shared font styles and consumed across the app runtime. */
177
+ --tracking-normal: 0em;
178
+
179
+ /* Spacing Scale */
180
+ --spacing: 0.25rem;
181
+ --spacing-xs: 0.25rem;
182
+ --spacing-sm: 0.5rem;
183
+ --spacing-md: 0.75rem;
184
+ --spacing-lg: 1rem;
185
+ --spacing-xl: 1.5rem;
186
+ --spacing-2xl: 2rem;
187
+
188
+ /* Transitions */
189
+ --transition-fast: 100ms;
190
+ --transition-normal: 300ms;
191
+ --transition-slow: 600ms;
192
+ --chart-animation-duration: 1000ms;
193
+
194
+ /* Button Specific */
195
+ --button-padding-x-sm: 0.5rem;
196
+ --button-padding-y-sm: 0.25rem;
197
+ --button-padding-x-md: 0.75rem;
198
+ --button-padding-y-md: 0.5rem;
199
+ --button-padding-x-lg: 1rem;
200
+ --button-padding-y-lg: 0.75rem;
201
+ --button-font-size: 0.875rem;
202
+ --button-gap: 0.5rem;
203
+ --default-button-gradient-start: oklch(1 0 0);
204
+ --default-button-gradient-end: oklch(0.92 0 0);
205
+ --default-button-active: oklch(0.91 0 0);
206
+ --button-primary-bg: var(--primary);
207
+ --button-primary-foreground: var(--primary-foreground);
208
+ --button-primary-border: oklch(0 0 0 / 0.18);
209
+ --button-primary-hover: oklch(from var(--primary) calc(l + 0.08) c h);
210
+ --button-primary-active: oklch(from var(--primary) calc(l - 0.04) c h);
211
+
212
+ /* Form Specific */
213
+ --input-height: 2.25rem;
214
+ --input-height-sm: 2.5rem;
215
+ --input-padding-x: 0.75rem;
216
+ --input-padding-y: 0.5rem;
217
+ --input-border-width: 1px;
218
+ --input-font-size: 0.875rem;
219
+
220
+ /* Unified Control Heights */
221
+ --control-height-xs: 1.75rem;
222
+ --control-height-sm: 2.25rem;
223
+ --control-height-md: 2.5rem;
224
+ --control-height-lg: 2.75rem;
225
+
226
+ /* Table Density */
227
+ --table-padding-normal-x: 0.75rem;
228
+ --table-padding-normal-y: 0.75rem;
229
+ --table-padding-compact-x: 0.75rem;
230
+ --table-padding-compact-y: 0.5rem;
231
+ --table-header-padding-x: 0.75rem;
232
+ --table-header-padding-y: 0.5rem;
233
+
234
+ /* Card Specific */
235
+ --card-padding: 1rem;
236
+ --card-header-padding: 1.5rem;
237
+
238
+ /* Border Radius */
239
+ --radius: 0.5rem;
240
+ --radius-sm: 0.125rem;
241
+ --radius-md: 0.375rem;
242
+ --radius-lg: 0.75rem;
243
+ --radius-xl: 1rem;
244
+
245
+ /* Interactive element radius — applied to buttons and form inputs */
246
+ --radius-interactive: 0.25rem;
247
+
248
+ /* Page Layout */
249
+ --page-padding-mobile: 0.5rem;
250
+ --page-padding-tablet: 1rem;
251
+ --page-padding-desktop: 1rem;
252
+ --page-gap: 1rem;
253
+ --header-height: 4rem;
254
+
255
+ /* Sidebar Dimensions */
256
+ --sidebar-width: 12.8rem;
257
+ --sidebar-width-mobile: 18rem;
258
+ --sidebar-width-icon: 3rem;
259
+
260
+ /* Breakpoint Variables */
261
+ --breakpoint-sm: theme('screens.sm');
262
+ --breakpoint-md: theme('screens.md');
263
+ --breakpoint-lg: theme('screens.lg');
264
+ --breakpoint-xl: theme('screens.xl');
265
+ --breakpoint-2xl: theme('screens.2xl');
266
+ }
267
+
268
+ /* ════════════════════════════════════════════════════════════════════════════
269
+ DARK MODE
270
+ Inverts lightness calculations for surfaces and adjusts brand brightness
271
+ ════════════════════════════════════════════════════════════════════════════ */
272
+ .dark {
273
+ /* ─── Surfaces (dark backgrounds from neutral) ─── */
274
+ --background: oklch(0.275 0 0);
275
+ --foreground: oklch(0.915 0 0);
276
+ --card: oklch(0.295 0 0);
277
+ --card-gradient-start: oklch(0.325 0 0);
278
+ --card-foreground: var(--foreground);
279
+ --muted: var(--card);
280
+ --muted-foreground: oklch(0.795 0 0 / 0.6);
281
+ --border: oklch(0.385 0 0);
282
+
283
+ /* Alternating section backgrounds - notably darker for visual distinction */
284
+ --section-alt: oklch(0.2 0 0);
285
+
286
+ /* ─── Primary (brighter for dark mode) ─── */
287
+ --primary: oklch(from var(--brand-primary) calc(l + 0.115) calc(c - 0.01) h);
288
+ --primary-foreground: var(--background);
289
+
290
+ /* ─── Secondary/Accent (adjusted for dark mode) ─── */
291
+ --secondary: oklch(from var(--brand-primary) calc(l - 0.22) calc(c - 0.03) h);
292
+ --secondary-foreground: var(--foreground);
293
+ --accent: oklch(from var(--brand-accent) calc(l + 0.08) calc(c - 0.02) h);
294
+ --accent-foreground: var(--foreground);
295
+
296
+ /* Default button gradient (dark) */
297
+ --default-button-gradient-start: oklch(0.4 0 0);
298
+ --default-button-gradient-end: oklch(0.3 0 0);
299
+ --default-button-active: oklch(0.15 0 0);
300
+ --button-primary-bg: oklch(0.99 0 0);
301
+ --button-primary-foreground: oklch(0.17 0 0);
302
+ --button-primary-border: oklch(1 0 0 / 0.18);
303
+ --button-primary-hover: oklch(1 0 0);
304
+ --button-primary-active: oklch(0.94 0 0);
305
+
306
+ /* Sidebar = solid dark surface */
307
+ --sidebar: var(--background);
308
+ --sidebar-foreground: var(--foreground);
309
+ --sidebar-primary-foreground: var(--background);
310
+ --sidebar-accent: oklch(0.34 0 0);
311
+ --sidebar-accent-foreground: var(--foreground);
312
+ --sidebar-border: oklch(0.36 0 0 / 0.55);
313
+ --sidebar-ring: oklch(0.52 0 0 / 0.45);
314
+
315
+ /* Charts */
316
+ --chart-1: oklch(1 0 none);
317
+ --chart-2: oklch(0.73 0 none);
318
+ --chart-3: oklch(0.51 0 none);
319
+ --chart-4: oklch(0.39 0 none);
320
+ --chart-5: oklch(0.32 0 none);
321
+
322
+ /* ─── Fixed Semantic (dark variants) ─── */
323
+ --success-text: oklch(0.7 0.14 145);
324
+ --success-bg-subtle: oklch(0.2 0.05 145);
325
+ --success-bg-muted: oklch(0.25 0.08 145);
326
+ --success-border: oklch(0.35 0.1 145);
327
+
328
+ --warning-text: oklch(0.7 0.15 85);
329
+ --warning-bg-subtle: oklch(0.2 0.05 85);
330
+ --warning-bg-muted: oklch(0.25 0.08 85);
331
+ --warning-border: oklch(0.35 0.12 85);
332
+ --warning-card-surface: color-mix(
333
+ in oklch,
334
+ var(--card) 80%,
335
+ oklch(from var(--warning) l calc(c + 0.06) h) 20%
336
+ );
337
+
338
+ --destructive-foreground: oklch(1 0 0);
339
+ --error-text: oklch(0.7 0.12 30);
340
+ --error-bg-subtle: oklch(0.2 0.05 30);
341
+ --error-bg-muted: oklch(0.25 0.06 30);
342
+ --error-border: oklch(0.35 0.08 30);
343
+ --danger-card-surface: color-mix(
344
+ in oklch,
345
+ var(--card) 92%,
346
+ oklch(from var(--destructive) l calc(c + 0.1) h) 8%
347
+ );
348
+
349
+ --info-text: oklch(0.7 0.08 250);
350
+ --info-bg-subtle: oklch(0.2 0.02 250);
351
+ --info-bg-muted: oklch(0.25 0.04 250);
352
+ --info-border: oklch(0.35 0.05 250);
353
+
354
+ /* ─── Effects (dark mode) ─── */
355
+ --overlay-subtle: rgb(0 0 0 / 0.2);
356
+ --overlay-light: rgb(0 0 0 / 0.3);
357
+ --overlay-medium: rgb(0 0 0 / 0.4);
358
+ --overlay-strong: rgb(0 0 0 / 0.5);
359
+ --overlay-heavy: rgb(0 0 0 / 0.6);
360
+
361
+ --highlight-subtle: rgb(255 255 255 / 0.08);
362
+ --highlight-light: rgb(255 255 255 / 0.1);
363
+ --highlight-medium: rgb(255 255 255 / 0.2);
364
+ --highlight-strong: rgb(255 255 255 / 0.5);
365
+
366
+ --glass-background: rgb(255 255 255 / 0.05);
367
+ --glass-border: rgb(255 255 255 / 0.08);
368
+ --backdrop-blur: rgb(0 0 0 / 0.33);
369
+
370
+ /* Shadows (stronger in dark) */
371
+ --shadow-2xs: 0px 1px 2px 0px var(--overlay-strong);
372
+ --shadow-xs: 0px 1px 2px 0px var(--overlay-strong);
373
+ --shadow-sm: 0px 1px 2px 0px var(--overlay-strong), 0px 1px 2px -1px var(--overlay-strong);
374
+ --shadow: 0px 1px 2px 0px var(--overlay-strong), 0px 1px 2px -1px var(--overlay-strong);
375
+ --shadow-md: 0px 1px 2px 0px var(--overlay-strong), 0px 2px 4px -1px var(--overlay-strong);
376
+ --shadow-lg: 0px 1px 2px 0px var(--overlay-strong), 0px 4px 6px -1px var(--overlay-strong);
377
+ --shadow-xl: 0px 1px 2px 0px var(--overlay-strong), 0px 8px 10px -1px var(--overlay-strong);
378
+ --shadow-2xl: 0px 1px 2px 0px var(--overlay-heavy);
379
+ }
380
+
381
+ /* ════════════════════════════════════════════════════════════════════════════
382
+ LIGHT MODE (explicit)
383
+ Used to force light mode within a dark context (e.g., kitchen sink demos)
384
+ ════════════════════════════════════════════════════════════════════════════ */
385
+ .light {
386
+ /* ─── Surfaces (light backgrounds from neutral) ─── */
387
+ --background: oklch(0.99 0 0);
388
+ --foreground: oklch(0.35 0 0);
389
+ --card: oklch(0.998 0 0);
390
+ --card-gradient-start: oklch(1 0 0);
391
+ --card-foreground: var(--foreground);
392
+ --muted: oklch(0.917 0 0);
393
+ --muted-foreground: oklch(0.532 0 0 / 0.8);
394
+ --border: oklch(0.852 0 0);
395
+
396
+ /* ─── Primary (standard for light mode) ─── */
397
+ --primary: var(--brand-primary);
398
+ --primary-foreground: oklch(1 0 0);
399
+
400
+ /* ─── Secondary/Accent ─── */
401
+ --secondary: oklch(from var(--brand-primary) calc(l + 0.27) calc(c - 0.025) h);
402
+ --secondary-foreground: oklch(from var(--brand-neutral) 0.35 0.015 h);
403
+ --accent: var(--brand-accent);
404
+ --accent-foreground: oklch(from var(--brand-neutral) 0.25 0.01 h);
405
+
406
+ /* Default button gradient (light) */
407
+ --default-button-gradient-start: oklch(1 0 0);
408
+ --default-button-gradient-end: oklch(0.92 0 0);
409
+ --default-button-active: oklch(0.91 0 0);
410
+
411
+ /* Charts */
412
+ --chart-1: var(--brand-primary);
413
+ --chart-2: var(--brand-accent);
414
+ --chart-3: var(--brand-muted);
415
+ --chart-4: oklch(from var(--brand-primary) calc(l + 0.12) calc(c - 0.01) h);
416
+ --chart-5: oklch(from var(--brand-accent) calc(l + 0.12) calc(c - 0.01) h);
417
+
418
+ /* ─── Fixed Semantic (light variants) ─── */
419
+ /* Darker text (L=0.35) for better contrast on light backgrounds */
420
+ --success-text: oklch(0.35 0.16 145);
421
+ --success-bg-subtle: oklch(0.96 0.03 145);
422
+ --success-bg-muted: oklch(0.9 0.08 145);
423
+ --success-border: oklch(0.75 0.12 145);
424
+
425
+ --warning-text: oklch(0.35 0.17 85);
426
+ --warning-bg-subtle: oklch(0.96 0.03 85);
427
+ --warning-bg-muted: oklch(0.9 0.1 85);
428
+ --warning-border: oklch(0.75 0.12 85);
429
+ --warning-card-surface: color-mix(
430
+ in oklch,
431
+ var(--card) 82%,
432
+ oklch(from var(--warning) l calc(c + 0.08) h) 18%
433
+ );
434
+
435
+ --destructive-foreground: oklch(1 0 0);
436
+ --error-text: oklch(0.35 0.14 30);
437
+ --error-bg-subtle: oklch(0.96 0.02 30);
438
+ --error-bg-muted: oklch(0.9 0.06 30);
439
+ --error-border: oklch(0.75 0.08 30);
440
+ --danger-card-surface: color-mix(
441
+ in oklch,
442
+ var(--card) 98%,
443
+ oklch(from var(--destructive) l calc(c + 0.1) h) 2%
444
+ );
445
+
446
+ --info-text: oklch(0.35 0.1 250);
447
+ --info-bg-subtle: oklch(0.96 0.02 250);
448
+ --info-bg-muted: oklch(0.9 0.06 250);
449
+ --info-border: oklch(0.75 0.06 250);
450
+
451
+ /* ─── Effects (light mode) ─── */
452
+ --overlay-subtle: rgb(0 0 0 / 0.05);
453
+ --overlay-light: rgb(0 0 0 / 0.1);
454
+ --overlay-medium: rgb(0 0 0 / 0.2);
455
+ --overlay-strong: rgb(0 0 0 / 0.25);
456
+ --overlay-heavy: rgb(0 0 0 / 0.33);
457
+
458
+ --highlight-subtle: rgb(255 255 255 / 0.3);
459
+ --highlight-light: rgb(255 255 255 / 0.5);
460
+ --highlight-medium: rgb(255 255 255 / 0.8);
461
+ --highlight-strong: rgb(255 255 255 / 1);
462
+
463
+ --glass-background: rgb(0 0 0 / 0.02);
464
+ --glass-border: rgb(255 255 255 / 0.5);
465
+ --backdrop-blur: rgb(0 0 0 / 0.1);
466
+
467
+ /* Shadows (light mode) */
468
+ --shadow-2xs: 0px 1px 2px 0px var(--overlay-subtle);
469
+ --shadow-xs: 0px 1px 2px 0px var(--overlay-subtle);
470
+ --shadow-sm: 0px 1px 2px 0px var(--overlay-light), 0px 1px 2px -1px var(--overlay-light);
471
+ --shadow: 0px 1px 2px 0px var(--overlay-light), 0px 1px 2px -1px var(--overlay-light);
472
+ --shadow-md: 0px 1px 2px 0px var(--overlay-light), 0px 2px 4px -1px var(--overlay-light);
473
+ --shadow-lg: 0px 1px 2px 0px var(--overlay-light), 0px 4px 6px -1px var(--overlay-light);
474
+ --shadow-xl: 0px 1px 2px 0px var(--overlay-light), 0px 8px 10px -1px var(--overlay-light);
475
+ --shadow-2xl: 0px 1px 2px 0px var(--overlay-strong);
476
+ }
477
+
478
+ /* ════════════════════════════════════════════════════════════════════════════
479
+ TAILWIND THEME MAPPING
480
+ ════════════════════════════════════════════════════════════════════════════ */
481
+ @theme inline {
482
+ /* Core colors */
483
+ --color-background: var(--background);
484
+ --color-foreground: var(--foreground);
485
+ --color-card: var(--card);
486
+ --color-card-foreground: var(--card-foreground);
487
+ --color-popover: var(--popover);
488
+ --color-popover-foreground: var(--popover-foreground);
489
+ --color-primary: var(--primary);
490
+ --color-primary-foreground: var(--primary-foreground);
491
+ --color-secondary: var(--secondary);
492
+ --color-secondary-foreground: var(--secondary-foreground);
493
+ --color-muted: var(--muted);
494
+ --color-muted-foreground: var(--muted-foreground);
495
+ --color-accent: var(--accent);
496
+ --color-accent-foreground: var(--accent-foreground);
497
+ --color-destructive: var(--destructive);
498
+ --color-destructive-foreground: var(--destructive-foreground);
499
+ --color-success: var(--success);
500
+ --color-warning: var(--warning);
501
+ --color-danger: var(--danger);
502
+ --color-logo-accent: var(--logo-accent);
503
+ --color-logo-gradient-start: var(--logo-gradient-start);
504
+ --color-logo-gradient-end: var(--logo-gradient-end);
505
+
506
+ /* Semantic color derivatives */
507
+ --color-success-text: var(--success-text);
508
+ --color-success-bg-subtle: var(--success-bg-subtle);
509
+ --color-success-bg-muted: var(--success-bg-muted);
510
+ --color-success-border: var(--success-border);
511
+ --color-error-text: var(--error-text);
512
+ --color-error-bg-subtle: var(--error-bg-subtle);
513
+ --color-error-bg-muted: var(--error-bg-muted);
514
+ --color-error-border: var(--error-border);
515
+ --color-warning-text: var(--warning-text);
516
+ --color-warning-bg-subtle: var(--warning-bg-subtle);
517
+ --color-warning-bg-muted: var(--warning-bg-muted);
518
+ --color-warning-border: var(--warning-border);
519
+ --color-info-text: var(--info-text);
520
+ --color-info-bg-subtle: var(--info-bg-subtle);
521
+ --color-info-bg-muted: var(--info-bg-muted);
522
+ --color-info-border: var(--info-border);
523
+
524
+ /* UI elements */
525
+ --color-border: var(--border);
526
+ --color-input: var(--input);
527
+ --color-ring: var(--ring);
528
+ --color-focus: var(--focus);
529
+ --color-active: var(--active);
530
+
531
+ /* Section alternating background */
532
+ --color-section-alt: var(--section-alt);
533
+
534
+ /* Charts */
535
+ --color-chart-1: var(--chart-1);
536
+ --color-chart-2: var(--chart-2);
537
+ --color-chart-3: var(--chart-3);
538
+ --color-chart-4: var(--chart-4);
539
+ --color-chart-5: var(--chart-5);
540
+
541
+ /* Sidebar */
542
+ --color-sidebar: var(--sidebar);
543
+ --color-sidebar-foreground: var(--sidebar-foreground);
544
+ --color-sidebar-primary: var(--sidebar-primary);
545
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
546
+ --color-sidebar-accent: var(--sidebar-accent);
547
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
548
+ --color-sidebar-border: var(--sidebar-border);
549
+ --color-sidebar-ring: var(--sidebar-ring);
550
+
551
+ /* Overlay & Effects */
552
+ --color-overlay-subtle: var(--overlay-subtle);
553
+ --color-overlay-light: var(--overlay-light);
554
+ --color-overlay-medium: var(--overlay-medium);
555
+ --color-overlay-strong: var(--overlay-strong);
556
+ --color-overlay-heavy: var(--overlay-heavy);
557
+ --color-highlight-subtle: var(--highlight-subtle);
558
+ --color-highlight-light: var(--highlight-light);
559
+ --color-highlight-medium: var(--highlight-medium);
560
+ --color-highlight-strong: var(--highlight-strong);
561
+ --color-glass-background: var(--glass-background);
562
+ --color-glass-border: var(--glass-border);
563
+ --color-backdrop-blur: var(--backdrop-blur);
564
+
565
+ /* Typography */
566
+ --font-heading: var(--font-heading);
567
+ --font-sans: var(--font-sans);
568
+ --font-mono: var(--font-mono);
569
+ --font-serif: var(--font-serif);
570
+ --font-display: var(--font-display);
571
+ --font-editorial: var(--font-editorial-sans);
572
+ --font-marketing: var(--font-marketing-sans);
573
+
574
+ /* Border Radius */
575
+ --radius-xs: calc(var(--radius) - 0.375rem);
576
+ --radius-sm: calc(var(--radius) - 0.25rem);
577
+ --radius: var(--radius);
578
+ --radius-md: var(--radius);
579
+ --radius-lg: calc(var(--radius) + 0.25rem);
580
+ --radius-xl: calc(var(--radius) + 0.5rem);
581
+ --radius-interactive: var(--radius-interactive);
582
+
583
+ /* Shadows */
584
+ --shadow-2xs: var(--shadow-2xs);
585
+ --shadow-xs: var(--shadow-xs);
586
+ --shadow-sm: var(--shadow-sm);
587
+ --shadow: var(--shadow);
588
+ --shadow-md: var(--shadow-md);
589
+ --shadow-lg: var(--shadow-lg);
590
+ --shadow-xl: var(--shadow-xl);
591
+ --shadow-2xl: var(--shadow-2xl);
592
+ }
package/themes.css ADDED
@@ -0,0 +1,48 @@
1
+ /* ════════════════════════════════════════════════════════════════════════════
2
+ THEME DEFINITIONS — 4-Color System
3
+
4
+ Each theme defines 4 base colors that work together harmoniously.
5
+ The derivation system in theme.css uses these to calculate all UI colors.
6
+
7
+ REQUIRED (4 colors per theme):
8
+ --brand-primary Main identity (buttons, links, primary actions)
9
+ --brand-accent Complementary accent (secondary elements, highlights)
10
+ --brand-muted Subtle tone (charts, badges, tertiary elements)
11
+ --brand-neutral Base for surfaces (backgrounds, borders, text)
12
+
13
+ OPTIONAL:
14
+ --logo-gradient-start/end Logo gradient colors
15
+
16
+ ════════════════════════════════════════════════════════════════════════════ */
17
+
18
+ /* ─────────────────────────────────────────────────────────────────────────────
19
+ DEFAULT — Warm Fog
20
+ Subtle amber/brown warmth meets cool mauve/blue fog. Nearly neutral.
21
+ ───────────────────────────────────────────────────────────────────────────── */
22
+ :root {
23
+ --brand-primary: #85807a;
24
+ --brand-accent: #7e7a8a;
25
+ --brand-muted: #848079;
26
+ --brand-neutral: #837f7c;
27
+ --logo-gradient-start: #85807a;
28
+ --logo-gradient-end: #7e7a8a;
29
+
30
+ /* Light Pillar effect colors */
31
+ --pillar-top: #9a8e82;
32
+ --pillar-bottom: #a89e94;
33
+ }
34
+
35
+ /* ─────────────────────────────────────────────────────────────────────────────
36
+ OCEAN — Deep Blue
37
+ Cool blue primary with teal accents. Calm and professional.
38
+ ───────────────────────────────────────────────────────────────────────────── */
39
+ [data-theme='ocean'] {
40
+ --brand-primary: #4a6fa5;
41
+ --brand-accent: #5a8a7a;
42
+ --brand-muted: #6b7f99;
43
+ --brand-neutral: #6e7a85;
44
+ --logo-gradient-start: #4a6fa5;
45
+ --logo-gradient-end: #5a8a7a;
46
+ --pillar-top: #6a8eb5;
47
+ --pillar-bottom: #7aa09a;
48
+ }