@keboola/design 6.5.0 → 8.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 (49) hide show
  1. package/AGENTS.md +7 -7
  2. package/COMPONENT-API.md +3 -9
  3. package/README.md +1 -1
  4. package/dist/charts.cjs +22 -22
  5. package/dist/charts.cjs.map +1 -1
  6. package/dist/charts.d.cts +5 -5
  7. package/dist/charts.d.ts +5 -5
  8. package/dist/charts.js +22 -22
  9. package/dist/charts.js.map +1 -1
  10. package/dist/editors.cjs +590 -432
  11. package/dist/editors.cjs.map +1 -1
  12. package/dist/editors.d.cts +8 -4
  13. package/dist/editors.d.ts +8 -4
  14. package/dist/editors.js +591 -416
  15. package/dist/editors.js.map +1 -1
  16. package/dist/icons.cjs +23817 -45
  17. package/dist/icons.cjs.map +1 -1
  18. package/dist/icons.d.cts +12 -3
  19. package/dist/icons.d.ts +12 -3
  20. package/dist/icons.js +297 -40
  21. package/dist/icons.js.map +1 -1
  22. package/dist/index.cjs +4702 -4755
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +183 -169
  25. package/dist/index.d.ts +183 -169
  26. package/dist/index.js +4700 -4754
  27. package/dist/index.js.map +1 -1
  28. package/dist/markdown-editor.cjs +817 -923
  29. package/dist/markdown-editor.cjs.map +1 -1
  30. package/dist/markdown-editor.js +818 -923
  31. package/dist/markdown-editor.js.map +1 -1
  32. package/dist/mermaid.cjs +308 -425
  33. package/dist/mermaid.cjs.map +1 -1
  34. package/dist/mermaid.d.cts +5 -1
  35. package/dist/mermaid.d.ts +5 -1
  36. package/dist/mermaid.js +310 -408
  37. package/dist/mermaid.js.map +1 -1
  38. package/dist/rjsf.cjs +1398 -1225
  39. package/dist/rjsf.cjs.map +1 -1
  40. package/dist/rjsf.js +1399 -1225
  41. package/dist/rjsf.js.map +1 -1
  42. package/dist/styles.css +2 -5
  43. package/dist/testing.cjs +86 -82
  44. package/dist/testing.cjs.map +1 -1
  45. package/dist/testing.js +86 -82
  46. package/dist/testing.js.map +1 -1
  47. package/package.json +26 -19
  48. package/src/styles.css +125 -105
  49. package/src/theme.css +264 -0
package/src/styles.css CHANGED
@@ -1,84 +1,104 @@
1
- /* react-day-picker structural CSS (the `.rdp-*` grid/layout). Imported here so
2
- * it is inlined into the compiled `dist/styles.css` by postcss-import, keeping
3
- * the JS entry free of a bare `.css` side-effect import (which breaks plain
4
- * Node/Vitest ESM resolution). Consumers get it via `@keboola/design/styles`. */
1
+ /* Tailwind v4, CSS-first. We import `theme` + `utilities` only (NOT the bundled
2
+ * `tailwindcss`), so no *global* preflight is emitted — the scoped-preflight
3
+ * @plugin below injects the reset confined to `.tailwindcss-preflight` instead.
4
+ * The `tw` prefix is declared here (v4 variant-style: `tw:flex`). */
5
+ @layer theme, base, components, utilities;
6
+ @import 'tailwindcss/theme.css' layer(theme) prefix(tw);
7
+ @import 'tailwindcss/utilities.css' layer(utilities) prefix(tw);
8
+ /* Animation utilities — v4 successor to `tailwindcss-animate`. Imported without a
9
+ * `layer()` wrapper: it declares `@utility` rules, which cannot be nested in a layer. */
10
+ @import 'tw-animate-css' prefix(tw);
11
+ /* react-day-picker structural CSS (the `.rdp-*` grid/layout). v4 inlines this
12
+ * `@import` natively (no postcss-import). Consumers get it via `@keboola/design/styles`. */
5
13
  @import 'react-day-picker/src/style.css';
6
-
7
- @tailwind base;
8
- @tailwind utilities;
9
- @tailwind components;
14
+ @import './theme.css';
15
+
16
+ /* Tokens, the (extended) theme, typography + our custom variants/utilities stay
17
+ * in JS, loaded via v4's `@config` bridge — this keeps `colors.ts` and the
18
+ * ThemeProvider/brand runtime-swap model unchanged (channel triples consumed as
19
+ * `rgb(var(--*) / <alpha>)`). */
20
+ @config '../tailwind.config.js';
21
+
22
+ /* Scoped, opt-in preflight — the v4 replacement for v3's
23
+ * `corePlugins.preflight:false` + `isolateInsideOfContainer`. The reset applies
24
+ * only inside `.tailwindcss-preflight` (and descendants), so host apps with
25
+ * their own global CSS (e.g. kbc-ui's Bootstrap) are left untouched. */
26
+ @plugin 'tailwindcss-scoped-preflight' {
27
+ isolation-strategy: inside;
28
+ selector: '.tailwindcss-preflight';
29
+ }
10
30
 
11
31
  /*
12
- * Semantic color tokens — read by Tailwind via rgb(var(--color-*) / <alpha-value>) in
32
+ * Semantic color tokens — read by Tailwind via rgb(var(--*) / <alpha-value>) in
13
33
  * packages/tailwind-config/colors.ts. Channel values are stored as space-separated RGB so
14
34
  * Tailwind opacity modifiers (e.g. `tw-bg-muted/50`) resolve correctly.
15
35
  * Primitive scales (neutral-*, primary-*, error-*, warning-*, etc.) remain hardcoded in colors.ts.
16
36
  */
17
37
  :root {
18
38
  /* Card — raised container chrome (Modal/Card/Sheet). */
19
- --color-card: 255 255 255; /* #ffffff */
20
- --color-card-foreground: 30 41 59; /* #1e293b */
21
- --color-background: 249 250 251; /* #f9fafb */
22
- --color-foreground: 30 41 59; /* #1e293b */
39
+ --card: 255 255 255; /* #ffffff */
40
+ --card-foreground: 30 41 59; /* #1e293b */
41
+ --background: 249 250 251; /* #f9fafb */
42
+ --foreground: 30 41 59; /* #1e293b */
23
43
 
24
44
  /* Primary — Keboola blue, AA-tuned to blue-600 (5.17:1 white-on-fill) for
25
45
  interactive labels. The dark block keeps the lighter blue-500. */
26
- --color-primary: 37 99 235; /* #2563eb */
27
- --color-primary-foreground: 255 255 255; /* #ffffff */
46
+ --primary: 37 99 235; /* #2563eb */
47
+ --primary-foreground: 255 255 255; /* #ffffff */
28
48
 
29
49
  /* Secondary */
30
- --color-secondary: 226 232 240; /* #e2e8f0 */
31
- --color-secondary-foreground: 30 41 59; /* #1e293b */
50
+ --secondary: 226 232 240; /* #e2e8f0 */
51
+ --secondary-foreground: 30 41 59; /* #1e293b */
32
52
 
33
53
  /* Popover */
34
- --color-popover: 255 255 255; /* #ffffff */
35
- --color-popover-foreground: 30 41 59; /* #1e293b */
54
+ --popover: 255 255 255; /* #ffffff */
55
+ --popover-foreground: 30 41 59; /* #1e293b */
36
56
 
37
57
  /* Accent */
38
- --color-accent: 224 242 254; /* #e0f2fe */
39
- --color-accent-foreground: 13 65 127; /* #0d417f */
58
+ --accent: 224 242 254; /* #e0f2fe */
59
+ --accent-foreground: 13 65 127; /* #0d417f */
40
60
 
41
61
  /* Border / Input / Ring */
42
- --color-border: 229 231 235; /* #e5e7eb */
43
- --color-input: 203 213 225; /* #cbd5e1 */
44
- --color-ring: var(--color-primary); /* follows brand primary (default #2563eb) */
45
- --color-ring-offset: 255 255 255; /* #ffffff — focus-ring offset gap */
62
+ --border: 229 231 235; /* #e5e7eb */
63
+ --input: 203 213 225; /* #cbd5e1 */
64
+ --ring: var(--primary); /* follows brand primary (default #2563eb) */
65
+ --ring-offset: 255 255 255; /* #ffffff — focus-ring offset gap */
46
66
 
47
67
  /* Chart — categorical palette (brand-derived, mutually distinct). */
48
- --color-chart-1: 31 143 255; /* #1f8fff */
49
- --color-chart-2: 0 194 135; /* #00c287 */
50
- --color-chart-3: 146 92 255; /* #925cff */
51
- --color-chart-4: 245 147 0; /* #f59300 */
52
- --color-chart-5: 237 94 223; /* #ed5edf */
68
+ --chart-1: 31 143 255; /* #1f8fff */
69
+ --chart-2: 0 194 135; /* #00c287 */
70
+ --chart-3: 146 92 255; /* #925cff */
71
+ --chart-4: 245 147 0; /* #f59300 */
72
+ --chart-5: 237 94 223; /* #ed5edf */
53
73
 
54
74
  /* Status — themeable semantic tokens; defaults ship AA-legible as text/icon on their own tint. */
55
- --color-destructive: 220 38 38; /* #dc2626 */
56
- --color-destructive-foreground: 255 255 255; /* #ffffff */
57
- --color-success: 24 122 76; /* #187a4c — AA-legible (≥4.5:1) as text/icon on its tint */
58
- --color-success-foreground: 255 255 255; /* #ffffff */
59
- --color-warning: 138 82 16; /* #8a5210 — AA-legible as text/icon on its tint */
60
- --color-warning-foreground: 255 255 255; /* #ffffff — token is now dark, so solid fills take white text */
61
- --color-info: 22 104 196; /* #1668c4 — AA-legible as text/icon on its tint (decoupled from brand blue) */
62
- --color-info-foreground: 255 255 255; /* #ffffff */
75
+ --destructive: 220 38 38; /* #dc2626 */
76
+ --destructive-foreground: 255 255 255; /* #ffffff */
77
+ --success: 24 122 76; /* #187a4c — AA-legible (≥4.5:1) as text/icon on its tint */
78
+ --success-foreground: 255 255 255; /* #ffffff */
79
+ --warning: 138 82 16; /* #8a5210 — AA-legible as text/icon on its tint */
80
+ --warning-foreground: 255 255 255; /* #ffffff — token is now dark, so solid fills take white text */
81
+ --info: 22 104 196; /* #1668c4 — AA-legible as text/icon on its tint (decoupled from brand blue) */
82
+ --info-foreground: 255 255 255; /* #ffffff */
63
83
 
64
84
  /* Muted */
65
- --color-muted: 241 245 249; /* #f1f5f9 */
66
- --color-muted-foreground: 100 116 139; /* #64748b */
85
+ --muted: 241 245 249; /* #f1f5f9 */
86
+ --muted-foreground: 100 116 139; /* #64748b */
67
87
 
68
88
  /* Skeleton placeholder fill — a touch darker than `muted` so the loading
69
89
  block stays perceptible on white cards / off-white background (muted is
70
90
  too close to both), and the shimmer highlight reads against it. */
71
- --color-skeleton: 219 225 235; /* #dbe1eb */
91
+ --skeleton: 219 225 235; /* #dbe1eb */
72
92
 
73
93
  /* Sidebar */
74
- --color-sidebar: 255 255 255; /* #ffffff */
75
- --color-sidebar-foreground: 30 41 59; /* #1e293b */
76
- --color-sidebar-primary: var(--color-primary); /* follows brand primary (default #2563eb) */
77
- --color-sidebar-primary-foreground: 255 255 255; /* #ffffff */
78
- --color-sidebar-accent: 219 234 254; /* #dbeafe */
79
- --color-sidebar-accent-foreground: 30 41 59; /* #1e293b */
80
- --color-sidebar-border: 229 231 235; /* #e5e7eb */
81
- --color-sidebar-ring: var(--color-primary); /* follows brand primary (default #2563eb) */
94
+ --sidebar: 255 255 255; /* #ffffff */
95
+ --sidebar-foreground: 30 41 59; /* #1e293b */
96
+ --sidebar-primary: var(--primary); /* follows brand primary (default #2563eb) */
97
+ --sidebar-primary-foreground: 255 255 255; /* #ffffff */
98
+ --sidebar-accent: 219 234 254; /* #dbeafe */
99
+ --sidebar-accent-foreground: 30 41 59; /* #1e293b */
100
+ --sidebar-border: 229 231 235; /* #e5e7eb */
101
+ --sidebar-ring: var(--primary); /* follows brand primary (default #2563eb) */
82
102
 
83
103
  --radius-md: 0.375rem;
84
104
  --radius-lg: 0.5rem;
@@ -149,75 +169,75 @@
149
169
  /* Brand gradient — defaults to a primary→accent sweep; override via `theme.gradient`. */
150
170
  --gradient-brand: linear-gradient(
151
171
  135deg,
152
- rgb(var(--color-primary)),
153
- rgb(var(--color-accent, var(--color-primary)))
172
+ rgb(var(--primary)),
173
+ rgb(var(--accent, var(--primary)))
154
174
  );
155
175
  }
156
176
 
157
177
  /* Dark mode (Graphite) — Keboola-blue accent, not reachable until the theme toggle ships. */
158
178
  [data-theme='dark'] {
159
179
  /* Card — raised container chrome (Modal/Card/Sheet), lifted off background. */
160
- --color-card: 34 34 40; /* #222228 */
161
- --color-card-foreground: 229 230 236; /* #e5e6ec */
162
- --color-background: 19 19 23; /* #131317 */
163
- --color-foreground: 229 230 236; /* #e5e6ec */
180
+ --card: 34 34 40; /* #222228 */
181
+ --card-foreground: 229 230 236; /* #e5e6ec */
182
+ --background: 19 19 23; /* #131317 */
183
+ --foreground: 229 230 236; /* #e5e6ec */
164
184
 
165
185
  /* Primary — Keboola blue (kept consistent across themes). */
166
- --color-primary: 31 143 255; /* #1f8fff */
167
- --color-primary-foreground: 255 255 255; /* #ffffff */
186
+ --primary: 31 143 255; /* #1f8fff */
187
+ --primary-foreground: 255 255 255; /* #ffffff */
168
188
 
169
189
  /* Secondary */
170
- --color-secondary: 47 48 55; /* #2f3037 */
171
- --color-secondary-foreground: 229 230 236; /* #e5e6ec */
190
+ --secondary: 47 48 55; /* #2f3037 */
191
+ --secondary-foreground: 229 230 236; /* #e5e6ec */
172
192
 
173
193
  /* Popover */
174
- --color-popover: 38 38 45; /* #26262d */
175
- --color-popover-foreground: 229 230 236; /* #e5e6ec */
194
+ --popover: 38 38 45; /* #26262d */
195
+ --popover-foreground: 229 230 236; /* #e5e6ec */
176
196
 
177
197
  /* Accent */
178
- --color-accent: 30 58 95; /* #1e3a5f */
179
- --color-accent-foreground: 147 197 253; /* #93c5fd */
198
+ --accent: 30 58 95; /* #1e3a5f */
199
+ --accent-foreground: 147 197 253; /* #93c5fd */
180
200
 
181
201
  /* Border / Input / Ring */
182
- --color-border: 52 53 62; /* #34353e */
183
- --color-input: 60 61 71; /* #3c3d47 */
184
- --color-ring: var(--color-primary); /* follows brand primary (default #1f8fff) */
185
- --color-ring-offset: 19 19 23; /* #131317 — focus-ring offset gap (dark background) */
202
+ --border: 52 53 62; /* #34353e */
203
+ --input: 60 61 71; /* #3c3d47 */
204
+ --ring: var(--primary); /* follows brand primary (default #1f8fff) */
205
+ --ring-offset: 19 19 23; /* #131317 — focus-ring offset gap (dark background) */
186
206
 
187
207
  /* Chart — categorical palette (brand-derived, lightened for dark surfaces). */
188
- --color-chart-1: 92 173 255; /* #5cadff */
189
- --color-chart-2: 0 230 161; /* #00e6a1 */
190
- --color-chart-3: 173 133 255; /* #ad85ff */
191
- --color-chart-4: 255 190 92; /* #ffbe5c */
192
- --color-chart-5: 242 140 232; /* #f28ce8 */
208
+ --chart-1: 92 173 255; /* #5cadff */
209
+ --chart-2: 0 230 161; /* #00e6a1 */
210
+ --chart-3: 173 133 255; /* #ad85ff */
211
+ --chart-4: 255 190 92; /* #ffbe5c */
212
+ --chart-5: 242 140 232; /* #f28ce8 */
193
213
 
194
214
  /* Status — themeable semantic tokens, tuned lighter for dark surfaces. */
195
- --color-destructive: 229 72 77; /* #e5484d */
196
- --color-destructive-foreground: 255 255 255; /* #ffffff */
197
- --color-success: 62 207 127; /* #3ecf7f */
198
- --color-success-foreground: 255 255 255; /* #ffffff */
199
- --color-warning: 255 190 92; /* #ffbe5c */
200
- --color-warning-foreground: 26 18 5; /* #1a1205 — dark text for legibility on amber */
201
- --color-info: 92 173 255; /* #5cadff */
202
- --color-info-foreground: 255 255 255; /* #ffffff */
215
+ --destructive: 229 72 77; /* #e5484d */
216
+ --destructive-foreground: 255 255 255; /* #ffffff */
217
+ --success: 62 207 127; /* #3ecf7f */
218
+ --success-foreground: 255 255 255; /* #ffffff */
219
+ --warning: 255 190 92; /* #ffbe5c */
220
+ --warning-foreground: 26 18 5; /* #1a1205 — dark text for legibility on amber */
221
+ --info: 92 173 255; /* #5cadff */
222
+ --info-foreground: 255 255 255; /* #ffffff */
203
223
 
204
224
  /* Muted */
205
- --color-muted: 38 38 45; /* #26262d */
206
- --color-muted-foreground: 141 144 153; /* #8d9099 */
225
+ --muted: 38 38 45; /* #26262d */
226
+ --muted-foreground: 141 144 153; /* #8d9099 */
207
227
 
208
228
  /* Skeleton — lighter than `muted` so it stays visible on both the dark
209
229
  background and the (lighter) card surface. */
210
- --color-skeleton: 52 53 62; /* #34353e */
230
+ --skeleton: 52 53 62; /* #34353e */
211
231
 
212
232
  /* Sidebar */
213
- --color-sidebar: 14 14 18; /* #0e0e12 */
214
- --color-sidebar-foreground: 229 230 236; /* #e5e6ec */
215
- --color-sidebar-primary: var(--color-primary); /* follows brand primary (default #1f8fff) */
216
- --color-sidebar-primary-foreground: 255 255 255; /* #ffffff */
217
- --color-sidebar-accent: 38 38 45; /* #26262d */
218
- --color-sidebar-accent-foreground: 229 230 236; /* #e5e6ec */
219
- --color-sidebar-border: 48 49 57; /* #303139 */
220
- --color-sidebar-ring: var(--color-primary); /* follows brand primary (default #1f8fff) */
233
+ --sidebar: 14 14 18; /* #0e0e12 */
234
+ --sidebar-foreground: 229 230 236; /* #e5e6ec */
235
+ --sidebar-primary: var(--primary); /* follows brand primary (default #1f8fff) */
236
+ --sidebar-primary-foreground: 255 255 255; /* #ffffff */
237
+ --sidebar-accent: 38 38 45; /* #26262d */
238
+ --sidebar-accent-foreground: 229 230 236; /* #e5e6ec */
239
+ --sidebar-border: 48 49 57; /* #303139 */
240
+ --sidebar-ring: var(--primary); /* follows brand primary (default #1f8fff) */
221
241
 
222
242
  /* Raised-surface elevation — black shadow instead of the light-tuned pale
223
243
  blue-gray, which reads as a halo around Card / Search on dark surfaces. */
@@ -225,7 +245,7 @@
225
245
 
226
246
  /* Table header — lighter than card so the header row reads as raised on dark
227
247
  (light value is the tailwind-config fallback: 219 225 235). */
228
- --color-table-header: 54 55 65;
248
+ --table-header: 54 55 65;
229
249
  }
230
250
 
231
251
  @layer base {
@@ -292,7 +312,7 @@
292
312
  }
293
313
 
294
314
  body {
295
- @apply tw-text-sm/[1.42857143];
315
+ @apply tw:text-sm/[1.42857143];
296
316
  }
297
317
 
298
318
  h1 {
@@ -304,14 +324,14 @@
304
324
  h2 {
305
325
  font-size: 22px;
306
326
  line-height: 32px;
307
- @apply tw-text-foreground;
327
+ @apply tw:text-foreground;
308
328
  font-weight: 500;
309
329
  }
310
330
 
311
331
  h3 {
312
332
  font-size: 16px;
313
333
  line-height: 24px;
314
- @apply tw-text-foreground;
334
+ @apply tw:text-foreground;
315
335
  font-weight: 500;
316
336
  margin: 0;
317
337
  }
@@ -320,7 +340,7 @@
320
340
  font-size: 14px;
321
341
  line-height: 20px;
322
342
  font-weight: 500;
323
- @apply tw-text-foreground;
343
+ @apply tw:text-foreground;
324
344
  margin: 0;
325
345
  }
326
346
 
@@ -328,7 +348,7 @@
328
348
  font-size: 12px;
329
349
  line-height: 20px;
330
350
  font-weight: 500;
331
- @apply tw-text-foreground;
351
+ @apply tw:text-foreground;
332
352
  margin: 0;
333
353
  }
334
354
 
@@ -338,27 +358,27 @@
338
358
  h4 small,
339
359
  h5 small,
340
360
  h6 small {
341
- @apply tw-text-muted-foreground;
361
+ @apply tw:text-muted-foreground;
342
362
  font-size: 75%;
343
363
  }
344
364
 
345
365
  b,
346
366
  strong {
347
- @apply tw-font-semibold;
367
+ @apply tw:font-semibold;
348
368
  }
349
369
  }
350
370
 
351
371
  @layer components {
352
- [data-tooltip-content='true'] .tw-prose {
353
- @apply tw-prose-invert;
372
+ [data-tooltip-content='true'] .tw\:prose {
373
+ @apply tw:prose-invert;
354
374
  }
355
375
 
356
- .tw-prose blockquote {
357
- border-left: 4px solid theme('colors.border');
358
- background-color: theme('colors.muted.DEFAULT');
376
+ .tw\:prose blockquote {
377
+ border-left: 4px solid rgb(var(--border));
378
+ background-color: rgb(var(--muted));
359
379
  padding: 12px 16px;
360
380
  border-radius: 2px;
361
- color: theme('colors.foreground');
381
+ color: rgb(var(--foreground));
362
382
  font-size: 14px;
363
383
  font-style: italic;
364
384
  font-weight: normal;
package/src/theme.css ADDED
@@ -0,0 +1,264 @@
1
+ /* Portable CSS-first design theme (colors today; more tokens as migrated).
2
+ * Imported by design's own styles.css AND by v4 apps that need to generate
3
+ * their own themed utilities without pulling design's @config/@plugin. */
4
+
5
+ /* Custom theme tokens ported from the v3 `@keboola/tailwind-config` `theme.extend`.
6
+ * The v4 migration ported colors (below) but not these, so app-authored utilities
7
+ * that reference them (`gap-gutter`, `p-inset`, `bg-brand`, `shadow-lift`,
8
+ * `font-display`, `tracking-chrome`, the brand animations, legacy breakpoints)
9
+ * generated NOTHING in every app — collapsing all brand-density spacing/padding
10
+ * to 0 and leaving the whole UI too compact vs v3. Registered here (imported by
11
+ * design AND every v4 app) so those utilities resolve again. Each token keeps the
12
+ * v3 `var(--runtime-var, fallback)` shape so `ThemeProvider` can still re-skin it. */
13
+ @theme {
14
+ /* Legacy Bootstrap-era breakpoints (screens). */
15
+ --breakpoint-sm-legacy: 992px;
16
+ --breakpoint-md-legacy: 1092px;
17
+
18
+ /* Brand-driven density — `gap-gutter`, `p-inset`, `m-gutter`, … */
19
+ --spacing-gutter: var(--space-gutter, 1.5rem);
20
+ --spacing-inset: var(--space-inset, 1.5rem);
21
+
22
+ /* Chrome letter-spacing — `tracking-chrome`. */
23
+ --tracking-chrome: var(--letter-spacing-chrome, 1px);
24
+
25
+ /* App-authored elevation + radius. Fixed values (no runtime-override var), so safe as
26
+ * @theme tokens. Ported because apps author these DIRECTLY — `shadow-card` (12 files),
27
+ * `shadow-table` + `hover:shadow-table`, `rounded-card` (19 files) — and can't rely on
28
+ * design's compiled CSS happening to emit the exact string. v4 gotcha: without
29
+ * `--shadow-card`, `shadow-card` silently resolves against the `--color-card` token and
30
+ * emits a shadow *colour* (no elevation) — registering it makes it a box-shadow utility. */
31
+ --shadow-card: 0px 1px 4px rgba(100, 135, 153, 0.15);
32
+ --shadow-table: 0px 6px 6px -4px rgba(100, 135, 153, 0.13);
33
+ --radius-card: 10px;
34
+
35
+ /* Brand easing — `ease-brand`. The runtime override var (`--motion-easing`) differs from
36
+ * this @theme token name, so registering it here drops no fallback (unlike bg-brand /
37
+ * shadow-lift, whose runtime var name collides → they stay @utility below). */
38
+ --ease-brand: var(--motion-easing, cubic-bezier(0.2, 0.7, 0.2, 1));
39
+
40
+ /* Brand animations used from app source — keyframes defined below. */
41
+ --animate-progress-bar: progress-bar var(--progress-bar-duration, 3s) linear forwards;
42
+ --animate-spinner-dots: spinner-dots 1s ease-in-out infinite;
43
+ --animate-marching-ants: marching-ants 1s linear infinite;
44
+ }
45
+
46
+ @keyframes progress-bar {
47
+ from {
48
+ width: 0%;
49
+ }
50
+ to {
51
+ width: 100%;
52
+ }
53
+ }
54
+ @keyframes spinner-dots {
55
+ 0%,
56
+ 100% {
57
+ opacity: 0;
58
+ }
59
+ 12.5% {
60
+ opacity: 1;
61
+ }
62
+ 25% {
63
+ opacity: 0;
64
+ }
65
+ }
66
+ @keyframes marching-ants {
67
+ to {
68
+ stroke-dashoffset: -12;
69
+ }
70
+ }
71
+
72
+ /* Fallback-chain utilities (kept as @utility, not @theme, so the runtime-var +
73
+ * fallback chain is preserved exactly as v3 emitted it — a @theme token whose name
74
+ * collides with the brand override var would drop the fallbacks). */
75
+ @utility bg-brand {
76
+ background-image: var(
77
+ --gradient-brand,
78
+ linear-gradient(
79
+ 135deg,
80
+ rgb(var(--color-primary)),
81
+ rgb(var(--color-accent, var(--color-primary)))
82
+ )
83
+ );
84
+ }
85
+ @utility shadow-lift {
86
+ box-shadow: var(--shadow-lift, 0 10px 30px -12px rgb(0 0 0 / 0.28), 0 2px 6px rgb(0 0 0 / 0.06));
87
+ }
88
+ @utility duration-brand {
89
+ /* v4 has no themeable transition-duration namespace, so keep this as a fallback-chain
90
+ * utility (like bg-brand / shadow-lift) to preserve the runtime var + v3 fallback. */
91
+ transition-duration: var(--motion-duration, 200ms);
92
+ }
93
+ @utility font-display {
94
+ font-family:
95
+ var(--font-display, var(--font-sans, Inter)),
96
+ system-ui,
97
+ -apple-system,
98
+ 'Segoe UI',
99
+ Roboto,
100
+ sans-serif;
101
+ }
102
+
103
+ @theme inline {
104
+ --color-inherit: inherit;
105
+ --color-transparent: rgba(255, 255, 255, 0);
106
+ --color-white: #fff;
107
+ --color-black: #000;
108
+ --color-prose-code: #c7254e;
109
+ --color-prose-preCode: #33373d;
110
+ --color-prose-preCodeBg: #f5f5f5;
111
+ --color-background: rgb(var(--background));
112
+ --color-foreground: rgb(var(--foreground));
113
+ --color-card: rgb(var(--card));
114
+ --color-card-foreground: rgb(var(--card-foreground));
115
+ --color-popover: rgb(var(--popover));
116
+ --color-popover-foreground: rgb(var(--popover-foreground));
117
+ --color-accent: rgb(var(--accent));
118
+ --color-accent-foreground: rgb(var(--accent-foreground));
119
+ --color-border: rgb(var(--border));
120
+ --color-input: rgb(var(--input));
121
+ --color-ring: rgb(var(--ring));
122
+ --color-ring-offset: rgb(var(--ring-offset));
123
+ --color-chart-1: rgb(var(--chart-1));
124
+ --color-chart-2: rgb(var(--chart-2));
125
+ --color-chart-3: rgb(var(--chart-3));
126
+ --color-chart-4: rgb(var(--chart-4));
127
+ --color-chart-5: rgb(var(--chart-5));
128
+ --color-destructive: rgb(var(--destructive));
129
+ --color-destructive-foreground: rgb(var(--destructive-foreground));
130
+ --color-success: rgb(var(--success));
131
+ --color-success-foreground: rgb(var(--success-foreground));
132
+ --color-info: rgb(var(--info));
133
+ --color-info-foreground: rgb(var(--info-foreground));
134
+ --color-muted: rgb(var(--muted));
135
+ --color-muted-foreground: rgb(var(--muted-foreground));
136
+ --color-skeleton: rgb(var(--skeleton));
137
+ --color-table-header: rgb(var(--table-header, 219 225 235));
138
+ --color-sidebar: rgb(var(--sidebar));
139
+ --color-sidebar-foreground: rgb(var(--sidebar-foreground));
140
+ --color-sidebar-primary: rgb(var(--sidebar-primary));
141
+ --color-sidebar-primary-foreground: rgb(var(--sidebar-primary-foreground));
142
+ --color-sidebar-accent: rgb(var(--sidebar-accent));
143
+ --color-sidebar-accent-foreground: rgb(var(--sidebar-accent-foreground));
144
+ --color-sidebar-border: rgb(var(--sidebar-border));
145
+ --color-sidebar-ring: rgb(var(--sidebar-ring));
146
+ --color-neutral-50: #f2f4f7;
147
+ --color-neutral-100: #edf0f5;
148
+ --color-neutral-150: #d9dde5;
149
+ --color-neutral-200: #c5cbd6;
150
+ --color-neutral-300: #a2aab8;
151
+ --color-neutral-400: #7c8594;
152
+ --color-neutral-500: #565c66;
153
+ --color-neutral-600: #454952;
154
+ --color-neutral-700: #33373d;
155
+ --color-neutral-800: #222529;
156
+ --color-neutral-900: #101114;
157
+ --color-primary-100: #e0ffe0;
158
+ --color-primary-200: #baf5ba;
159
+ --color-primary-300: #93f593;
160
+ --color-primary-400: #51e051;
161
+ --color-primary-500: #1ec71e;
162
+ --color-primary-600: #1bb31b;
163
+ --color-primary-700: #189f18;
164
+ --color-primary-800: #158b15;
165
+ --color-primary-900: #0f630f;
166
+ --color-primary: rgb(var(--primary));
167
+ --color-primary-foreground: rgb(var(--primary-foreground));
168
+ --color-secondary-100: #e0f0ff;
169
+ --color-secondary-200: #c2e0ff;
170
+ --color-secondary-300: #99ccff;
171
+ --color-secondary-400: #5cadff;
172
+ --color-secondary-500: #1f8fff;
173
+ --color-secondary-600: #0975e0;
174
+ --color-secondary-700: #075fb8;
175
+ --color-secondary-800: #064a8f;
176
+ --color-secondary-900: #043566;
177
+ --color-secondary: rgb(var(--secondary));
178
+ --color-secondary-foreground: rgb(var(--secondary-foreground));
179
+ --color-error-100: #ffe0e6;
180
+ --color-error-200: #ffc2cc;
181
+ --color-error-300: #ff99aa;
182
+ --color-error-400: #ff5c77;
183
+ --color-error-500: #e00025;
184
+ --color-error-550: #c40021;
185
+ --color-error-600: #b8001f;
186
+ --color-error-700: #a3001b;
187
+ --color-error-800: #7a0014;
188
+ --color-error-900: #52000e;
189
+ --color-warning-100: #fff3e0;
190
+ --color-warning-200: #ffe7c2;
191
+ --color-warning-300: #ffd699;
192
+ --color-warning-400: #ffbe5c;
193
+ --color-warning-500: #f59300;
194
+ --color-warning-550: #e38800;
195
+ --color-warning-600: #d17d00;
196
+ --color-warning-700: #a36200;
197
+ --color-warning-800: #7a4900;
198
+ --color-warning-900: #523100;
199
+ --color-warning: rgb(var(--warning));
200
+ --color-warning-foreground: rgb(var(--warning-foreground));
201
+ --color-purple-100: #ebe0ff;
202
+ --color-purple-200: #d6c2ff;
203
+ --color-purple-300: #c9adff;
204
+ --color-purple-400: #ad85ff;
205
+ --color-purple-500: #925cff;
206
+ --color-purple-600: #6f36e0;
207
+ --color-purple-700: #5b2cb8;
208
+ --color-purple-800: #46228f;
209
+ --color-purple-900: #321866;
210
+ --color-cyan-100: #e0f9ff;
211
+ --color-cyan-200: #bef3ff;
212
+ --color-cyan-300: #83ebff;
213
+ --color-cyan-400: #00def7;
214
+ --color-cyan-500: #00bbd1;
215
+ --color-cyan-600: #00a0b2;
216
+ --color-cyan-700: #007d8c;
217
+ --color-cyan-800: #005d69;
218
+ --color-cyan-900: #003f47;
219
+ --color-teal-100: #cfffe6;
220
+ --color-teal-200: #96ffce;
221
+ --color-teal-300: #00faaf;
222
+ --color-teal-400: #00e6a1;
223
+ --color-teal-500: #00c287;
224
+ --color-teal-600: #00a673;
225
+ --color-teal-700: #008159;
226
+ --color-teal-800: #006141;
227
+ --color-teal-900: #00422b;
228
+ --color-yellow-100: #ffffcc;
229
+ --color-yellow-200: #ffff99;
230
+ --color-yellow-300: #ffff33;
231
+ --color-yellow-400: #f5f500;
232
+ --color-yellow-500: #e5e500;
233
+ --color-yellow-600: #cccc00;
234
+ --color-yellow-700: #b2b200;
235
+ --color-yellow-800: #999900;
236
+ --color-yellow-900: #808000;
237
+ --color-pink-100: #fde8fb;
238
+ --color-pink-200: #fad1f6;
239
+ --color-pink-300: #f7bbf2;
240
+ --color-pink-400: #f28ce8;
241
+ --color-pink-500: #ed5edf;
242
+ --color-pink-600: #e619d1;
243
+ --color-pink-700: #b814a7;
244
+ --color-pink-800: #8a0f7d;
245
+ --color-pink-900: #5c0a54;
246
+ --color-green-100: #e0ffe0;
247
+ --color-green-200: #baf5ba;
248
+ --color-green-300: #93f593;
249
+ --color-green-400: #51e051;
250
+ --color-green-500: #1ec71e;
251
+ --color-green-600: #1bb31b;
252
+ --color-green-700: #189f18;
253
+ --color-green-800: #158b15;
254
+ --color-green-900: #0f630f;
255
+ --color-blue-100: #e0f0ff;
256
+ --color-blue-200: #c2e0ff;
257
+ --color-blue-300: #99ccff;
258
+ --color-blue-400: #5cadff;
259
+ --color-blue-500: #1f8fff;
260
+ --color-blue-600: #0975e0;
261
+ --color-blue-700: #075fb8;
262
+ --color-blue-800: #064a8f;
263
+ --color-blue-900: #043566;
264
+ }