@stll/ui 0.0.1-placeholder.0 → 0.3.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 (149) hide show
  1. package/README.md +84 -0
  2. package/dist/components/accordion.d.ts +8 -0
  3. package/dist/components/accordion.js +38 -0
  4. package/dist/components/alert-dialog.d.ts +32 -0
  5. package/dist/components/alert-dialog.js +75 -0
  6. package/dist/components/avatar.d.ts +7 -0
  7. package/dist/components/avatar.js +22 -0
  8. package/dist/components/bidi-text.d.ts +24 -0
  9. package/dist/components/bidi-text.js +38 -0
  10. package/dist/components/brand-icons.d.ts +7 -0
  11. package/dist/components/brand-icons.js +18 -0
  12. package/dist/components/breadcrumb.d.ts +12 -0
  13. package/dist/components/breadcrumb.js +61 -0
  14. package/dist/components/button-variants.d.ts +17 -0
  15. package/dist/components/button-variants.js +43 -0
  16. package/dist/components/button.d.ts +20 -0
  17. package/dist/components/button.js +53 -0
  18. package/dist/components/checkbox.d.ts +5 -0
  19. package/dist/components/checkbox.js +44 -0
  20. package/dist/components/color-picker.d.ts +47 -0
  21. package/dist/components/color-picker.js +249 -0
  22. package/dist/components/combobox.d.ts +40 -0
  23. package/dist/components/combobox.js +208 -0
  24. package/dist/components/command.d.ts +34 -0
  25. package/dist/components/command.js +100 -0
  26. package/dist/components/date-picker-popover.d.ts +29 -0
  27. package/dist/components/date-picker-popover.js +548 -0
  28. package/dist/components/date-picker-popover.logic.d.ts +14 -0
  29. package/dist/components/date-picker-popover.logic.js +26 -0
  30. package/dist/components/destructive-action-confirmation.d.ts +21 -0
  31. package/dist/components/destructive-action-confirmation.js +60 -0
  32. package/dist/components/destructive-confirm-dialog.d.ts +17 -0
  33. package/dist/components/destructive-confirm-dialog.js +49 -0
  34. package/dist/components/dialog.d.ts +37 -0
  35. package/dist/components/dialog.js +92 -0
  36. package/dist/components/directional-icon.d.ts +30 -0
  37. package/dist/components/directional-icon.js +12 -0
  38. package/dist/components/field.d.ts +11 -0
  39. package/dist/components/field.js +34 -0
  40. package/dist/components/form.d.ts +5 -0
  41. package/dist/components/form.js +12 -0
  42. package/dist/components/frame.d.ts +10 -0
  43. package/dist/components/frame.js +35 -0
  44. package/dist/components/hex-color-picker.d.ts +11 -0
  45. package/dist/components/hex-color-picker.js +366 -0
  46. package/dist/components/input-group.d.ts +15 -0
  47. package/dist/components/input-group.js +53 -0
  48. package/dist/components/input-otp.d.ts +13 -0
  49. package/dist/components/input-otp.js +39 -0
  50. package/dist/components/input.d.ts +12 -0
  51. package/dist/components/input.js +46 -0
  52. package/dist/components/label.d.ts +5 -0
  53. package/dist/components/label.js +18 -0
  54. package/dist/components/menu.d.ts +44 -0
  55. package/dist/components/menu.js +152 -0
  56. package/dist/components/outline-rail.d.ts +43 -0
  57. package/dist/components/outline-rail.js +416 -0
  58. package/dist/components/pagination.d.ts +17 -0
  59. package/dist/components/pagination.js +78 -0
  60. package/dist/components/popover.d.ts +34 -0
  61. package/dist/components/popover.js +67 -0
  62. package/dist/components/preview-card.d.ts +12 -0
  63. package/dist/components/preview-card.js +25 -0
  64. package/dist/components/preview-pane.d.ts +23 -0
  65. package/dist/components/preview-pane.js +33 -0
  66. package/dist/components/scroll-area.d.ts +19 -0
  67. package/dist/components/scroll-area.js +38 -0
  68. package/dist/components/scroll-to-top.d.ts +12 -0
  69. package/dist/components/scroll-to-top.js +43 -0
  70. package/dist/components/secret-input.d.ts +9 -0
  71. package/dist/components/secret-input.js +38 -0
  72. package/dist/components/segmented-icon-toggle.d.ts +22 -0
  73. package/dist/components/segmented-icon-toggle.js +30 -0
  74. package/dist/components/select.d.ts +25 -0
  75. package/dist/components/select.js +196 -0
  76. package/dist/components/separator.d.ts +16 -0
  77. package/dist/components/separator.js +26 -0
  78. package/dist/components/sheet.d.ts +29 -0
  79. package/dist/components/sheet.js +87 -0
  80. package/dist/components/skeleton.d.ts +4 -0
  81. package/dist/components/skeleton.js +10 -0
  82. package/dist/components/stella-mark.d.ts +5 -0
  83. package/dist/components/stella-mark.js +12 -0
  84. package/dist/components/stella-wordmark.d.ts +5 -0
  85. package/dist/components/stella-wordmark.js +21 -0
  86. package/dist/components/table.d.ts +20 -0
  87. package/dist/components/table.js +80 -0
  88. package/dist/components/tabs.d.ts +11 -0
  89. package/dist/components/tabs.js +46 -0
  90. package/dist/components/textarea.d.ts +9 -0
  91. package/dist/components/textarea.js +31 -0
  92. package/dist/components/toast.d.ts +60 -0
  93. package/dist/components/toast.js +261 -0
  94. package/dist/components/tooltip-trigger-helper.d.ts +11 -0
  95. package/dist/components/tooltip-trigger-helper.js +14 -0
  96. package/dist/components/tooltip.d.ts +15 -0
  97. package/dist/components/tooltip.js +32 -0
  98. package/dist/data-table/index.d.ts +2 -0
  99. package/dist/data-table/index.js +2 -0
  100. package/dist/data-table/schema.d.ts +70 -0
  101. package/dist/data-table/schema.js +40 -0
  102. package/dist/hooks/use-contained-handler.d.ts +55 -0
  103. package/dist/hooks/use-contained-handler.js +54 -0
  104. package/dist/hooks/use-content-dir.d.ts +48 -0
  105. package/dist/hooks/use-content-dir.js +45 -0
  106. package/dist/hooks/use-mobile.d.ts +4 -0
  107. package/dist/hooks/use-mobile.js +16 -0
  108. package/dist/hooks/use-viewport-width.d.ts +5 -0
  109. package/dist/hooks/use-viewport-width.js +14 -0
  110. package/dist/index.d.ts +67 -0
  111. package/dist/index.js +65 -0
  112. package/dist/inspector/chrome.d.ts +72 -0
  113. package/dist/inspector/chrome.js +153 -0
  114. package/dist/inspector/dock.d.ts +48 -0
  115. package/dist/inspector/dock.js +36 -0
  116. package/dist/inspector/index.d.ts +6 -0
  117. package/dist/inspector/index.js +6 -0
  118. package/dist/inspector/layout-tokens.d.ts +28 -0
  119. package/dist/inspector/layout-tokens.js +28 -0
  120. package/dist/inspector/pane-width.d.ts +64 -0
  121. package/dist/inspector/pane-width.js +53 -0
  122. package/dist/inspector/use-pane-width.d.ts +99 -0
  123. package/dist/inspector/use-pane-width.js +149 -0
  124. package/dist/kanban/card-properties.d.ts +27 -0
  125. package/dist/kanban/card-properties.js +19 -0
  126. package/dist/kanban/card-shell.d.ts +32 -0
  127. package/dist/kanban/card-shell.js +46 -0
  128. package/dist/kanban/column-header.d.ts +23 -0
  129. package/dist/kanban/column-header.js +24 -0
  130. package/dist/kanban/grouping.d.ts +84 -0
  131. package/dist/kanban/grouping.js +76 -0
  132. package/dist/kanban/index.d.ts +5 -0
  133. package/dist/kanban/index.js +5 -0
  134. package/dist/lib/button-disposition.d.ts +63 -0
  135. package/dist/lib/button-disposition.js +52 -0
  136. package/dist/lib/option-color.d.ts +28 -0
  137. package/dist/lib/option-color.js +59 -0
  138. package/dist/lib/overlay-layer.d.ts +22 -0
  139. package/dist/lib/overlay-layer.js +21 -0
  140. package/dist/lib/tab-order.d.ts +15 -0
  141. package/dist/lib/tab-order.js +15 -0
  142. package/dist/lib/tooltip-content.d.ts +13 -0
  143. package/dist/lib/tooltip-content.js +12 -0
  144. package/dist/lib/utils.d.ts +20 -0
  145. package/dist/lib/utils.js +41 -0
  146. package/dist/lib/week.d.ts +25 -0
  147. package/dist/lib/week.js +40 -0
  148. package/dist/styles/theme.css +1209 -0
  149. package/package.json +518 -2
@@ -0,0 +1,1209 @@
1
+ /* Stella's design-system theme: the `@theme` token map, the palettes, the
2
+ * base layer, and the custom utilities the components are written against.
3
+ *
4
+ * Exported as `@stll/ui/theme.css`. No compiled utility CSS ships with the
5
+ * package — the components carry Tailwind class names, so the Tailwind build
6
+ * stays where the application is:
7
+ *
8
+ * @import "tailwindcss";
9
+ * @import "@stll/ui/theme.css";
10
+ * @source "../node_modules/@stll/ui/dist";
11
+ *
12
+ * The `@source` line is what makes Tailwind scan the shipped components for
13
+ * the utilities they use; node_modules is outside its default detection.
14
+ * Tailwind v4 is a peer dependency, and this file assumes its default theme
15
+ * is already in scope (the palettes derive from `--color-*-500`).
16
+ */
17
+ @custom-variant dark (&:is(.dark *));
18
+
19
+ @theme inline {
20
+ --font-sans:
21
+ "DM Sans", "Noto Sans Arabic", ui-sans-serif, system-ui, sans-serif,
22
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
23
+ --color-background: var(--background);
24
+ --color-foreground: var(--foreground);
25
+ --color-sidebar-ring: var(--sidebar-ring);
26
+ --color-sidebar-border: var(--sidebar-border);
27
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
28
+ --color-sidebar-accent: var(--sidebar-accent);
29
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
30
+ --color-sidebar-primary: var(--sidebar-primary);
31
+ --color-sidebar-foreground: var(--sidebar-foreground);
32
+ --color-sidebar: var(--sidebar);
33
+ --color-ring: var(--ring);
34
+ --color-input: var(--input);
35
+ --color-border: var(--border);
36
+ --color-destructive: var(--destructive);
37
+ --color-destructive-foreground: var(--destructive-foreground);
38
+ --color-info: var(--info);
39
+ --color-info-foreground: var(--info-foreground);
40
+ --color-success: var(--success);
41
+ --color-success-foreground: var(--success-foreground);
42
+ --color-warning: var(--warning);
43
+ --color-warning-foreground: var(--warning-foreground);
44
+ --color-highlight: var(--highlight);
45
+ --color-highlight-foreground: var(--highlight-foreground);
46
+ --color-accent-foreground: var(--accent-foreground);
47
+ --color-accent: var(--accent);
48
+ --color-muted-foreground: var(--muted-foreground);
49
+ --color-foreground-disabled: var(--foreground-disabled);
50
+ --color-foreground-subtle: var(--foreground-subtle);
51
+ --color-foreground-muted: var(--foreground-muted);
52
+ --color-foreground-placeholder: var(--foreground-placeholder);
53
+ --color-foreground-ghost: var(--foreground-ghost);
54
+ --color-foreground-label: var(--foreground-label);
55
+ --color-foreground-strong-muted: var(--foreground-strong-muted);
56
+ --color-muted: var(--muted);
57
+ --color-secondary-foreground: var(--secondary-foreground);
58
+ --color-secondary: var(--secondary);
59
+ --color-primary-foreground: var(--primary-foreground);
60
+ --color-primary: var(--primary);
61
+ --color-popover-foreground: var(--popover-foreground);
62
+ --color-popover: var(--popover);
63
+ --color-card-foreground: var(--card-foreground);
64
+ --color-card: var(--card);
65
+ --animate-skeleton: skeleton 2s -1s infinite linear;
66
+ --animate-caret-blink: caret-blink 1.25s ease-out infinite;
67
+ /* One-shot tint pulse for a surface that just became relevant.
68
+ The `-twice` variant blinks the same curve twice, for an
69
+ affordance the user has to notice, not merely acknowledge. */
70
+ --animate-attention-flash: attention-flash 700ms ease-out;
71
+ --animate-attention-flash-twice: attention-flash 700ms ease-out 2;
72
+ @keyframes skeleton {
73
+ to {
74
+ background-position: -200% 0;
75
+ }
76
+ }
77
+ @keyframes caret-blink {
78
+ 0%,
79
+ 70%,
80
+ 100% {
81
+ opacity: 1;
82
+ }
83
+ 20%,
84
+ 50% {
85
+ opacity: 0;
86
+ }
87
+ }
88
+ @keyframes attention-flash {
89
+ 0% {
90
+ opacity: 0;
91
+ }
92
+ 18% {
93
+ opacity: 1;
94
+ }
95
+ 100% {
96
+ opacity: 0;
97
+ }
98
+ }
99
+ }
100
+
101
+ /* The RTL counterpart of the skeleton sweep.
102
+ *
103
+ * Outside `@theme inline` on purpose: Tailwind emits a themed `@keyframes`
104
+ * only when a used `--animate-*` variable names it, and nothing declares
105
+ * `--animate-skeleton-rtl` — the RTL rules override `animation-name` on the
106
+ * shared `--animate-skeleton`. Declared here it always reaches the stylesheet,
107
+ * so the shimmer keeps sweeping toward the reader in RTL instead of silently
108
+ * animating nothing. */
109
+ @keyframes skeleton-rtl {
110
+ to {
111
+ background-position: 200% 0;
112
+ }
113
+ }
114
+
115
+ :root {
116
+ --radius: 0.625rem;
117
+ --background: var(--color-white);
118
+ --foreground: var(--color-neutral-800);
119
+ --card: var(--color-white);
120
+ --card-foreground: var(--color-neutral-800);
121
+ --popover: var(--color-white);
122
+ --popover-foreground: var(--color-neutral-800);
123
+ --primary: var(--color-neutral-800);
124
+ --primary-foreground: var(--color-neutral-50);
125
+ --secondary: --alpha(var(--color-black) / 4%);
126
+ --secondary-foreground: var(--color-neutral-800);
127
+ --muted: --alpha(var(--color-black) / 4%);
128
+ --muted-foreground: color-mix(
129
+ in srgb,
130
+ var(--color-neutral-500) 90%,
131
+ var(--color-black)
132
+ );
133
+ --foreground-disabled: color-mix(in srgb, var(--foreground) 40%, transparent);
134
+ --foreground-subtle: color-mix(in srgb, var(--foreground) 50%, transparent);
135
+ --foreground-muted: color-mix(in srgb, var(--foreground) 60%, transparent);
136
+ --foreground-placeholder: color-mix(
137
+ in srgb,
138
+ var(--foreground) 64%,
139
+ transparent
140
+ );
141
+ --foreground-ghost: color-mix(in srgb, var(--foreground) 70%, transparent);
142
+ --foreground-label: color-mix(in srgb, var(--foreground) 72%, transparent);
143
+ --foreground-strong-muted: color-mix(
144
+ in srgb,
145
+ var(--foreground) 80%,
146
+ transparent
147
+ );
148
+ --accent: --alpha(var(--color-black) / 4%);
149
+ --accent-foreground: var(--color-neutral-800);
150
+ --destructive: var(--color-red-500);
151
+ --destructive-foreground: var(--color-red-700);
152
+ --info: var(--color-blue-500);
153
+ --info-foreground: var(--color-blue-700);
154
+ --success: var(--color-emerald-500);
155
+ --success-foreground: var(--color-emerald-700);
156
+ --warning: var(--color-amber-500);
157
+ --warning-foreground: var(--color-amber-700);
158
+ --highlight: --alpha(var(--color-yellow-300) / 50%);
159
+ --highlight-foreground: var(--color-neutral-800);
160
+ --border: --alpha(var(--color-black) / 10%);
161
+ --input: --alpha(var(--color-black) / 12%);
162
+ --ring: var(--color-neutral-400);
163
+ --sidebar: var(--color-neutral-50);
164
+ --sidebar-foreground: color-mix(
165
+ in srgb,
166
+ var(--color-neutral-800) 64%,
167
+ var(--sidebar)
168
+ );
169
+ --sidebar-primary: var(--color-neutral-800);
170
+ --sidebar-primary-foreground: var(--color-neutral-50);
171
+ --sidebar-accent: --alpha(var(--color-black) / 4%);
172
+ --sidebar-accent-foreground: var(--color-neutral-800);
173
+ --sidebar-border: --alpha(var(--color-black) / 8%);
174
+ --sidebar-ring: var(--color-neutral-400);
175
+ }
176
+
177
+ .dark {
178
+ --background: color-mix(
179
+ in srgb,
180
+ var(--color-neutral-950) 95%,
181
+ var(--color-white)
182
+ );
183
+ --foreground: var(--color-neutral-100);
184
+ --card: color-mix(in srgb, var(--background) 98%, var(--color-white));
185
+ --card-foreground: var(--color-neutral-100);
186
+ --popover: color-mix(in srgb, var(--background) 98%, var(--color-white));
187
+ --popover-foreground: var(--color-neutral-100);
188
+ --primary: var(--color-neutral-100);
189
+ --primary-foreground: var(--color-neutral-800);
190
+ --secondary: --alpha(var(--color-white) / 4%);
191
+ --secondary-foreground: var(--color-neutral-100);
192
+ --muted: --alpha(var(--color-white) / 4%);
193
+ --muted-foreground: color-mix(
194
+ in srgb,
195
+ var(--color-neutral-500) 90%,
196
+ var(--color-white)
197
+ );
198
+ --accent: --alpha(var(--color-white) / 4%);
199
+ --accent-foreground: var(--color-neutral-100);
200
+ --destructive: color-mix(
201
+ in srgb,
202
+ var(--color-red-500) 90%,
203
+ var(--color-white)
204
+ );
205
+ --destructive-foreground: var(--color-red-400);
206
+ --info: var(--color-blue-500);
207
+ --info-foreground: var(--color-blue-400);
208
+ --success: var(--color-emerald-500);
209
+ --success-foreground: var(--color-emerald-400);
210
+ --warning: var(--color-amber-500);
211
+ --warning-foreground: var(--color-amber-400);
212
+ --highlight: --alpha(var(--color-yellow-500) / 20%);
213
+ --highlight-foreground: var(--color-neutral-100);
214
+ --border: --alpha(var(--color-white) / 8%);
215
+ --input: --alpha(var(--color-white) / 10%);
216
+ --ring: var(--color-neutral-500);
217
+ --sidebar: color-mix(
218
+ in srgb,
219
+ var(--color-neutral-950) 97%,
220
+ var(--color-white)
221
+ );
222
+ --sidebar-foreground: color-mix(
223
+ in srgb,
224
+ var(--color-neutral-100) 64%,
225
+ var(--sidebar)
226
+ );
227
+ --sidebar-primary: var(--color-neutral-100);
228
+ --sidebar-primary-foreground: var(--color-neutral-800);
229
+ --sidebar-accent: --alpha(var(--color-white) / 4%);
230
+ --sidebar-accent-foreground: var(--color-neutral-100);
231
+ --sidebar-border: --alpha(var(--color-white) / 7%);
232
+ --sidebar-ring: var(--color-neutral-400);
233
+ }
234
+
235
+ /* Flexoki by Steph Ango (https://stephango.com/flexoki), MIT license */
236
+
237
+ /* Flexoki palette — light */
238
+ .palette-flexoki {
239
+ --background: #fffcf0;
240
+ --foreground: #100f0f;
241
+ --card: #f2f0e5;
242
+ --card-foreground: #100f0f;
243
+ --popover: #fffcf0;
244
+ --popover-foreground: #100f0f;
245
+ --primary: #100f0f;
246
+ --primary-foreground: #fffcf0;
247
+ --secondary: #e6e4d9;
248
+ --secondary-foreground: #100f0f;
249
+ --muted: #e6e4d9;
250
+ --muted-foreground: #6f6e69;
251
+ --accent: #e6e4d9;
252
+ --accent-foreground: #100f0f;
253
+ --destructive: #af3029;
254
+ --destructive-foreground: #af3029;
255
+ --info: #205ea6;
256
+ --info-foreground: #205ea6;
257
+ --success: #66800b;
258
+ --success-foreground: #66800b;
259
+ --warning: #ad8301;
260
+ --warning-foreground: #ad8301;
261
+ --highlight: color-mix(in srgb, #ad8301 25%, #fffcf0);
262
+ --highlight-foreground: #100f0f;
263
+ --border: #dad8ce;
264
+ --input: #cecdc3;
265
+ --ring: #b7b5ac;
266
+ --sidebar: #f2f0e5;
267
+ --sidebar-foreground: #1c1b1a;
268
+ --sidebar-primary: #100f0f;
269
+ --sidebar-primary-foreground: #fffcf0;
270
+ --sidebar-accent: #e6e4d9;
271
+ --sidebar-accent-foreground: #100f0f;
272
+ --sidebar-border: #dad8ce;
273
+ --sidebar-ring: #b7b5ac;
274
+ }
275
+
276
+ /* Flexoki palette — dark */
277
+ .palette-flexoki.dark {
278
+ --background: #100f0f;
279
+ --foreground: #cecdc3;
280
+ --card: #1c1b1a;
281
+ --card-foreground: #cecdc3;
282
+ --popover: #1c1b1a;
283
+ --popover-foreground: #cecdc3;
284
+ --primary: #cecdc3;
285
+ --primary-foreground: #100f0f;
286
+ --secondary: #282726;
287
+ --secondary-foreground: #cecdc3;
288
+ --muted: #282726;
289
+ --muted-foreground: #878580;
290
+ --accent: #282726;
291
+ --accent-foreground: #cecdc3;
292
+ --destructive: #d14d41;
293
+ --destructive-foreground: #d14d41;
294
+ --info: #4385be;
295
+ --info-foreground: #4385be;
296
+ --success: #879a39;
297
+ --success-foreground: #879a39;
298
+ --warning: #d0a215;
299
+ --warning-foreground: #d0a215;
300
+ --highlight: color-mix(in srgb, #d0a215 20%, #100f0f);
301
+ --highlight-foreground: #cecdc3;
302
+ --border: #343331;
303
+ --input: #403e3c;
304
+ --ring: #575653;
305
+ --sidebar: #1c1b1a;
306
+ --sidebar-foreground: #b7b5ac;
307
+ --sidebar-primary: #cecdc3;
308
+ --sidebar-primary-foreground: #100f0f;
309
+ --sidebar-accent: #282726;
310
+ --sidebar-accent-foreground: #cecdc3;
311
+ --sidebar-border: #343331;
312
+ --sidebar-ring: #575653;
313
+ }
314
+
315
+ /* Nord palette — light
316
+ * Based on Nord by Arctic Ice Studio (https://www.nordtheme.com), MIT license.
317
+ * nord0 #2e3440 .. nord3 #4c566a,
318
+ * nord4 #d8dee9, nord5 #e5e9f0, nord6 #eceff4 */
319
+ .palette-nord {
320
+ --background: #eceff4;
321
+ --foreground: #2e3440;
322
+ --card: #e5e9f0;
323
+ --card-foreground: #2e3440;
324
+ --popover: #eceff4;
325
+ --popover-foreground: #2e3440;
326
+ --primary: #2e3440;
327
+ --primary-foreground: #eceff4;
328
+ --secondary: #e5e9f0;
329
+ --secondary-foreground: #2e3440;
330
+ --muted: #e5e9f0;
331
+ --muted-foreground: #4c566a;
332
+ --accent: #e5e9f0;
333
+ --accent-foreground: #2e3440;
334
+ --destructive: #bf616a;
335
+ --destructive-foreground: #a5454e;
336
+ --info: #5e81ac;
337
+ --info-foreground: #4c6e96;
338
+ --success: #a3be8c;
339
+ --success-foreground: #6d8b5e;
340
+ --warning: #ebcb8b;
341
+ --warning-foreground: #a68c3e;
342
+ --highlight: color-mix(in srgb, #ebcb8b 30%, #eceff4);
343
+ --highlight-foreground: #2e3440;
344
+ --border: #d8dee9;
345
+ --input: #cdd4e0;
346
+ --ring: #b8c1cf;
347
+ --sidebar: #e5e9f0;
348
+ --sidebar-foreground: #3b4252;
349
+ --sidebar-primary: #2e3440;
350
+ --sidebar-primary-foreground: #eceff4;
351
+ --sidebar-accent: #dce1eb;
352
+ --sidebar-accent-foreground: #2e3440;
353
+ --sidebar-border: #d8dee9;
354
+ --sidebar-ring: #b8c1cf;
355
+ }
356
+
357
+ /* Nord palette — dark */
358
+ .palette-nord.dark {
359
+ --background: #2e3440;
360
+ --foreground: #d8dee9;
361
+ --card: #3b4252;
362
+ --card-foreground: #d8dee9;
363
+ --popover: #3b4252;
364
+ --popover-foreground: #d8dee9;
365
+ --primary: #d8dee9;
366
+ --primary-foreground: #2e3440;
367
+ --secondary: #3b4252;
368
+ --secondary-foreground: #d8dee9;
369
+ --muted: #3b4252;
370
+ --muted-foreground: #6d7a8f;
371
+ --accent: #3b4252;
372
+ --accent-foreground: #d8dee9;
373
+ --destructive: #bf616a;
374
+ --destructive-foreground: #bf616a;
375
+ --info: #81a1c1;
376
+ --info-foreground: #81a1c1;
377
+ --success: #a3be8c;
378
+ --success-foreground: #a3be8c;
379
+ --warning: #ebcb8b;
380
+ --warning-foreground: #ebcb8b;
381
+ --highlight: color-mix(in srgb, #ebcb8b 20%, #2e3440);
382
+ --highlight-foreground: #d8dee9;
383
+ --border: #434c5e;
384
+ --input: #4c566a;
385
+ --ring: #616e88;
386
+ --sidebar: #3b4252;
387
+ --sidebar-foreground: #d8dee9;
388
+ --sidebar-primary: #d8dee9;
389
+ --sidebar-primary-foreground: #2e3440;
390
+ --sidebar-accent: #434c5e;
391
+ --sidebar-accent-foreground: #d8dee9;
392
+ --sidebar-border: #434c5e;
393
+ --sidebar-ring: #616e88;
394
+ }
395
+
396
+ /* ==================================================================
397
+ * Option tag colors
398
+ *
399
+ * Each palette defines swatch colors (--option-{name}). Backgrounds
400
+ * and foregrounds are derived automatically via color-mix() using the
401
+ * palette's --background and --foreground, so badges adapt to every
402
+ * palette and dark-mode combination without extra overrides.
403
+ * ================================================================== */
404
+
405
+ /* ---- Swatches: neutral (Tailwind defaults) ---- */
406
+ :root {
407
+ --option-red: var(--color-red-500);
408
+ --option-orange: var(--color-orange-500);
409
+ --option-amber: var(--color-amber-500);
410
+ --option-yellow: var(--color-yellow-500);
411
+ --option-lime: var(--color-lime-500);
412
+ --option-green: var(--color-green-500);
413
+ --option-emerald: var(--color-emerald-500);
414
+ --option-teal: var(--color-teal-500);
415
+ --option-cyan: var(--color-cyan-500);
416
+ --option-sky: var(--color-sky-500);
417
+ --option-blue: var(--color-blue-500);
418
+ --option-indigo: var(--color-indigo-500);
419
+ --option-violet: var(--color-violet-500);
420
+ --option-purple: var(--color-purple-500);
421
+ --option-fuchsia: var(--color-fuchsia-500);
422
+ --option-gray: var(--color-gray-400);
423
+ --option-empty: var(--color-slate-400);
424
+ }
425
+
426
+ /* ---- Swatches: Flexoki light (400 series) ---- */
427
+ .palette-flexoki {
428
+ --option-red: #af3029;
429
+ --option-orange: #bc5215;
430
+ --option-amber: color-mix(in oklch, #bc5215, #ad8301);
431
+ --option-yellow: #ad8301;
432
+ --option-lime: color-mix(in oklch, #ad8301, #66800b);
433
+ --option-green: #66800b;
434
+ --option-emerald: color-mix(in oklch, #66800b, #24837b);
435
+ --option-teal: color-mix(in oklch, #24837b 65%, #66800b);
436
+ --option-cyan: #24837b;
437
+ --option-sky: color-mix(in oklch, #24837b, #205ea6);
438
+ --option-blue: #205ea6;
439
+ --option-indigo: color-mix(in oklch, #205ea6, #5e409d);
440
+ --option-violet: color-mix(in oklch, #5e409d 65%, #205ea6);
441
+ --option-purple: #5e409d;
442
+ --option-fuchsia: #a02f6f;
443
+ --option-gray: #878580;
444
+ --option-empty: #b7b5ac;
445
+ }
446
+
447
+ /* ---- Swatches: Flexoki dark (300 series) ---- */
448
+ .palette-flexoki.dark {
449
+ --option-red: #d14d41;
450
+ --option-orange: #da702c;
451
+ --option-amber: color-mix(in oklch, #da702c, #d0a215);
452
+ --option-yellow: #d0a215;
453
+ --option-lime: color-mix(in oklch, #d0a215, #879a39);
454
+ --option-green: #879a39;
455
+ --option-emerald: color-mix(in oklch, #879a39, #3aa99f);
456
+ --option-teal: color-mix(in oklch, #3aa99f 65%, #879a39);
457
+ --option-cyan: #3aa99f;
458
+ --option-sky: color-mix(in oklch, #3aa99f, #4385be);
459
+ --option-blue: #4385be;
460
+ --option-indigo: color-mix(in oklch, #4385be, #8b7ec8);
461
+ --option-violet: color-mix(in oklch, #8b7ec8 65%, #4385be);
462
+ --option-purple: #8b7ec8;
463
+ --option-fuchsia: #ce5d97;
464
+ --option-gray: #878580;
465
+ --option-empty: #575653;
466
+ }
467
+
468
+ /* ---- Swatches: Nord (Aurora + Frost, same in light and dark) ---- */
469
+ .palette-nord {
470
+ --option-red: #bf616a;
471
+ --option-orange: #d08770;
472
+ --option-amber: color-mix(in oklch, #d08770, #ebcb8b);
473
+ --option-yellow: #ebcb8b;
474
+ --option-lime: color-mix(in oklch, #ebcb8b, #a3be8c);
475
+ --option-green: #a3be8c;
476
+ --option-emerald: color-mix(in oklch, #a3be8c, #8fbcbb);
477
+ --option-teal: #8fbcbb;
478
+ --option-cyan: color-mix(in oklch, #8fbcbb, #88c0d0);
479
+ --option-sky: #88c0d0;
480
+ --option-blue: #81a1c1;
481
+ --option-indigo: #5e81ac;
482
+ --option-violet: color-mix(in oklch, #5e81ac, #b48ead);
483
+ --option-purple: #b48ead;
484
+ --option-fuchsia: color-mix(in oklch, #b48ead, #bf616a);
485
+ --option-gray: color-mix(in oklch, #4c566a, #d8dee9);
486
+ --option-empty: color-mix(in oklch, #4c566a 60%, #d8dee9);
487
+ }
488
+
489
+ /* ---- Derived backgrounds and foregrounds: light ---- */
490
+ :root {
491
+ --option-red-bg: color-mix(in srgb, var(--option-red) 12%, var(--background));
492
+ --option-red-fg: color-mix(
493
+ in oklch,
494
+ var(--option-red) 50%,
495
+ var(--foreground)
496
+ );
497
+ --option-orange-bg: color-mix(
498
+ in srgb,
499
+ var(--option-orange) 12%,
500
+ var(--background)
501
+ );
502
+ --option-orange-fg: color-mix(
503
+ in oklch,
504
+ var(--option-orange) 50%,
505
+ var(--foreground)
506
+ );
507
+ --option-amber-bg: color-mix(
508
+ in srgb,
509
+ var(--option-amber) 12%,
510
+ var(--background)
511
+ );
512
+ --option-amber-fg: color-mix(
513
+ in oklch,
514
+ var(--option-amber) 50%,
515
+ var(--foreground)
516
+ );
517
+ --option-yellow-bg: color-mix(
518
+ in srgb,
519
+ var(--option-yellow) 12%,
520
+ var(--background)
521
+ );
522
+ --option-yellow-fg: color-mix(
523
+ in oklch,
524
+ var(--option-yellow) 50%,
525
+ var(--foreground)
526
+ );
527
+ --option-lime-bg: color-mix(
528
+ in srgb,
529
+ var(--option-lime) 12%,
530
+ var(--background)
531
+ );
532
+ --option-lime-fg: color-mix(
533
+ in oklch,
534
+ var(--option-lime) 50%,
535
+ var(--foreground)
536
+ );
537
+ --option-green-bg: color-mix(
538
+ in srgb,
539
+ var(--option-green) 12%,
540
+ var(--background)
541
+ );
542
+ --option-green-fg: color-mix(
543
+ in oklch,
544
+ var(--option-green) 50%,
545
+ var(--foreground)
546
+ );
547
+ --option-emerald-bg: color-mix(
548
+ in srgb,
549
+ var(--option-emerald) 12%,
550
+ var(--background)
551
+ );
552
+ --option-emerald-fg: color-mix(
553
+ in oklch,
554
+ var(--option-emerald) 50%,
555
+ var(--foreground)
556
+ );
557
+ --option-teal-bg: color-mix(
558
+ in srgb,
559
+ var(--option-teal) 12%,
560
+ var(--background)
561
+ );
562
+ --option-teal-fg: color-mix(
563
+ in oklch,
564
+ var(--option-teal) 50%,
565
+ var(--foreground)
566
+ );
567
+ --option-cyan-bg: color-mix(
568
+ in srgb,
569
+ var(--option-cyan) 12%,
570
+ var(--background)
571
+ );
572
+ --option-cyan-fg: color-mix(
573
+ in oklch,
574
+ var(--option-cyan) 50%,
575
+ var(--foreground)
576
+ );
577
+ --option-sky-bg: color-mix(in srgb, var(--option-sky) 12%, var(--background));
578
+ --option-sky-fg: color-mix(
579
+ in oklch,
580
+ var(--option-sky) 50%,
581
+ var(--foreground)
582
+ );
583
+ --option-blue-bg: color-mix(
584
+ in srgb,
585
+ var(--option-blue) 12%,
586
+ var(--background)
587
+ );
588
+ --option-blue-fg: color-mix(
589
+ in oklch,
590
+ var(--option-blue) 50%,
591
+ var(--foreground)
592
+ );
593
+ --option-indigo-bg: color-mix(
594
+ in srgb,
595
+ var(--option-indigo) 12%,
596
+ var(--background)
597
+ );
598
+ --option-indigo-fg: color-mix(
599
+ in oklch,
600
+ var(--option-indigo) 50%,
601
+ var(--foreground)
602
+ );
603
+ --option-violet-bg: color-mix(
604
+ in srgb,
605
+ var(--option-violet) 12%,
606
+ var(--background)
607
+ );
608
+ --option-violet-fg: color-mix(
609
+ in oklch,
610
+ var(--option-violet) 50%,
611
+ var(--foreground)
612
+ );
613
+ --option-purple-bg: color-mix(
614
+ in srgb,
615
+ var(--option-purple) 12%,
616
+ var(--background)
617
+ );
618
+ --option-purple-fg: color-mix(
619
+ in oklch,
620
+ var(--option-purple) 50%,
621
+ var(--foreground)
622
+ );
623
+ --option-fuchsia-bg: color-mix(
624
+ in srgb,
625
+ var(--option-fuchsia) 12%,
626
+ var(--background)
627
+ );
628
+ --option-fuchsia-fg: color-mix(
629
+ in oklch,
630
+ var(--option-fuchsia) 50%,
631
+ var(--foreground)
632
+ );
633
+ --option-gray-bg: color-mix(
634
+ in srgb,
635
+ var(--option-gray) 15%,
636
+ var(--background)
637
+ );
638
+ --option-gray-fg: color-mix(
639
+ in oklch,
640
+ var(--option-gray) 45%,
641
+ var(--foreground)
642
+ );
643
+ --option-empty-bg: color-mix(
644
+ in srgb,
645
+ var(--option-empty) 20%,
646
+ var(--background)
647
+ );
648
+ --option-empty-fg: color-mix(
649
+ in oklch,
650
+ var(--option-empty) 40%,
651
+ var(--foreground)
652
+ );
653
+ }
654
+
655
+ /* ---- Derived backgrounds and foregrounds: dark ---- */
656
+ .dark {
657
+ --option-red-bg: color-mix(in srgb, var(--option-red) 18%, var(--background));
658
+ --option-red-fg: color-mix(
659
+ in oklch,
660
+ var(--option-red) 70%,
661
+ var(--foreground)
662
+ );
663
+ --option-orange-bg: color-mix(
664
+ in srgb,
665
+ var(--option-orange) 18%,
666
+ var(--background)
667
+ );
668
+ --option-orange-fg: color-mix(
669
+ in oklch,
670
+ var(--option-orange) 70%,
671
+ var(--foreground)
672
+ );
673
+ --option-amber-bg: color-mix(
674
+ in srgb,
675
+ var(--option-amber) 18%,
676
+ var(--background)
677
+ );
678
+ --option-amber-fg: color-mix(
679
+ in oklch,
680
+ var(--option-amber) 70%,
681
+ var(--foreground)
682
+ );
683
+ --option-yellow-bg: color-mix(
684
+ in srgb,
685
+ var(--option-yellow) 18%,
686
+ var(--background)
687
+ );
688
+ --option-yellow-fg: color-mix(
689
+ in oklch,
690
+ var(--option-yellow) 70%,
691
+ var(--foreground)
692
+ );
693
+ --option-lime-bg: color-mix(
694
+ in srgb,
695
+ var(--option-lime) 18%,
696
+ var(--background)
697
+ );
698
+ --option-lime-fg: color-mix(
699
+ in oklch,
700
+ var(--option-lime) 70%,
701
+ var(--foreground)
702
+ );
703
+ --option-green-bg: color-mix(
704
+ in srgb,
705
+ var(--option-green) 18%,
706
+ var(--background)
707
+ );
708
+ --option-green-fg: color-mix(
709
+ in oklch,
710
+ var(--option-green) 70%,
711
+ var(--foreground)
712
+ );
713
+ --option-emerald-bg: color-mix(
714
+ in srgb,
715
+ var(--option-emerald) 18%,
716
+ var(--background)
717
+ );
718
+ --option-emerald-fg: color-mix(
719
+ in oklch,
720
+ var(--option-emerald) 70%,
721
+ var(--foreground)
722
+ );
723
+ --option-teal-bg: color-mix(
724
+ in srgb,
725
+ var(--option-teal) 18%,
726
+ var(--background)
727
+ );
728
+ --option-teal-fg: color-mix(
729
+ in oklch,
730
+ var(--option-teal) 70%,
731
+ var(--foreground)
732
+ );
733
+ --option-cyan-bg: color-mix(
734
+ in srgb,
735
+ var(--option-cyan) 18%,
736
+ var(--background)
737
+ );
738
+ --option-cyan-fg: color-mix(
739
+ in oklch,
740
+ var(--option-cyan) 70%,
741
+ var(--foreground)
742
+ );
743
+ --option-sky-bg: color-mix(in srgb, var(--option-sky) 18%, var(--background));
744
+ --option-sky-fg: color-mix(
745
+ in oklch,
746
+ var(--option-sky) 70%,
747
+ var(--foreground)
748
+ );
749
+ --option-blue-bg: color-mix(
750
+ in srgb,
751
+ var(--option-blue) 18%,
752
+ var(--background)
753
+ );
754
+ --option-blue-fg: color-mix(
755
+ in oklch,
756
+ var(--option-blue) 70%,
757
+ var(--foreground)
758
+ );
759
+ --option-indigo-bg: color-mix(
760
+ in srgb,
761
+ var(--option-indigo) 18%,
762
+ var(--background)
763
+ );
764
+ --option-indigo-fg: color-mix(
765
+ in oklch,
766
+ var(--option-indigo) 70%,
767
+ var(--foreground)
768
+ );
769
+ --option-violet-bg: color-mix(
770
+ in srgb,
771
+ var(--option-violet) 18%,
772
+ var(--background)
773
+ );
774
+ --option-violet-fg: color-mix(
775
+ in oklch,
776
+ var(--option-violet) 70%,
777
+ var(--foreground)
778
+ );
779
+ --option-purple-bg: color-mix(
780
+ in srgb,
781
+ var(--option-purple) 18%,
782
+ var(--background)
783
+ );
784
+ --option-purple-fg: color-mix(
785
+ in oklch,
786
+ var(--option-purple) 70%,
787
+ var(--foreground)
788
+ );
789
+ --option-fuchsia-bg: color-mix(
790
+ in srgb,
791
+ var(--option-fuchsia) 18%,
792
+ var(--background)
793
+ );
794
+ --option-fuchsia-fg: color-mix(
795
+ in oklch,
796
+ var(--option-fuchsia) 70%,
797
+ var(--foreground)
798
+ );
799
+ --option-gray-bg: color-mix(
800
+ in srgb,
801
+ var(--option-gray) 20%,
802
+ var(--background)
803
+ );
804
+ --option-gray-fg: color-mix(
805
+ in oklch,
806
+ var(--option-gray) 60%,
807
+ var(--foreground)
808
+ );
809
+ --option-empty-bg: color-mix(
810
+ in srgb,
811
+ var(--option-empty) 25%,
812
+ var(--background)
813
+ );
814
+ --option-empty-fg: color-mix(
815
+ in oklch,
816
+ var(--option-empty) 55%,
817
+ var(--foreground)
818
+ );
819
+ }
820
+
821
+ /* Force light mode when printing to avoid wasting toner
822
+ * and ensure readable output on paper. */
823
+ @media print {
824
+ .dark,
825
+ .palette-flexoki.dark,
826
+ .palette-nord.dark {
827
+ --background: var(--color-white);
828
+ --foreground: var(--color-neutral-800);
829
+ --card: var(--color-white);
830
+ --card-foreground: var(--color-neutral-800);
831
+ --popover: var(--color-white);
832
+ --popover-foreground: var(--color-neutral-800);
833
+ --primary: var(--color-neutral-800);
834
+ --primary-foreground: var(--color-neutral-50);
835
+ --secondary: --alpha(var(--color-black) / 4%);
836
+ --secondary-foreground: var(--color-neutral-800);
837
+ --muted: --alpha(var(--color-black) / 4%);
838
+ --muted-foreground: var(--color-neutral-500);
839
+ --accent: --alpha(var(--color-black) / 4%);
840
+ --accent-foreground: var(--color-neutral-800);
841
+ --destructive: var(--color-red-500);
842
+ --destructive-foreground: var(--color-red-700);
843
+ --info: var(--color-blue-500);
844
+ --info-foreground: var(--color-blue-700);
845
+ --success: var(--color-emerald-500);
846
+ --success-foreground: var(--color-emerald-700);
847
+ --warning: var(--color-amber-500);
848
+ --warning-foreground: var(--color-amber-700);
849
+ --highlight: --alpha(var(--color-yellow-300) / 50%);
850
+ --highlight-foreground: var(--color-neutral-800);
851
+ --border: --alpha(var(--color-black) / 10%);
852
+ --input: --alpha(var(--color-black) / 12%);
853
+ --ring: var(--color-neutral-400);
854
+ --sidebar: var(--color-neutral-50);
855
+ --sidebar-foreground: var(--color-neutral-800);
856
+ --sidebar-primary: var(--color-neutral-800);
857
+ --sidebar-primary-foreground: var(--color-neutral-50);
858
+ --sidebar-accent: --alpha(var(--color-black) / 4%);
859
+ --sidebar-accent-foreground: var(--color-neutral-800);
860
+ --sidebar-border: --alpha(var(--color-black) / 8%);
861
+ --sidebar-ring: var(--color-neutral-400);
862
+
863
+ /* Reset option tag derived colors to light-mode ratios so
864
+ * badges printed from dark mode match those from light. */
865
+ --option-red-bg: color-mix(
866
+ in srgb,
867
+ var(--option-red) 12%,
868
+ var(--background)
869
+ );
870
+ --option-red-fg: color-mix(
871
+ in oklch,
872
+ var(--option-red) 50%,
873
+ var(--foreground)
874
+ );
875
+ --option-orange-bg: color-mix(
876
+ in srgb,
877
+ var(--option-orange) 12%,
878
+ var(--background)
879
+ );
880
+ --option-orange-fg: color-mix(
881
+ in oklch,
882
+ var(--option-orange) 50%,
883
+ var(--foreground)
884
+ );
885
+ --option-amber-bg: color-mix(
886
+ in srgb,
887
+ var(--option-amber) 12%,
888
+ var(--background)
889
+ );
890
+ --option-amber-fg: color-mix(
891
+ in oklch,
892
+ var(--option-amber) 50%,
893
+ var(--foreground)
894
+ );
895
+ --option-yellow-bg: color-mix(
896
+ in srgb,
897
+ var(--option-yellow) 12%,
898
+ var(--background)
899
+ );
900
+ --option-yellow-fg: color-mix(
901
+ in oklch,
902
+ var(--option-yellow) 50%,
903
+ var(--foreground)
904
+ );
905
+ --option-lime-bg: color-mix(
906
+ in srgb,
907
+ var(--option-lime) 12%,
908
+ var(--background)
909
+ );
910
+ --option-lime-fg: color-mix(
911
+ in oklch,
912
+ var(--option-lime) 50%,
913
+ var(--foreground)
914
+ );
915
+ --option-green-bg: color-mix(
916
+ in srgb,
917
+ var(--option-green) 12%,
918
+ var(--background)
919
+ );
920
+ --option-green-fg: color-mix(
921
+ in oklch,
922
+ var(--option-green) 50%,
923
+ var(--foreground)
924
+ );
925
+ --option-emerald-bg: color-mix(
926
+ in srgb,
927
+ var(--option-emerald) 12%,
928
+ var(--background)
929
+ );
930
+ --option-emerald-fg: color-mix(
931
+ in oklch,
932
+ var(--option-emerald) 50%,
933
+ var(--foreground)
934
+ );
935
+ --option-teal-bg: color-mix(
936
+ in srgb,
937
+ var(--option-teal) 12%,
938
+ var(--background)
939
+ );
940
+ --option-teal-fg: color-mix(
941
+ in oklch,
942
+ var(--option-teal) 50%,
943
+ var(--foreground)
944
+ );
945
+ --option-cyan-bg: color-mix(
946
+ in srgb,
947
+ var(--option-cyan) 12%,
948
+ var(--background)
949
+ );
950
+ --option-cyan-fg: color-mix(
951
+ in oklch,
952
+ var(--option-cyan) 50%,
953
+ var(--foreground)
954
+ );
955
+ --option-sky-bg: color-mix(
956
+ in srgb,
957
+ var(--option-sky) 12%,
958
+ var(--background)
959
+ );
960
+ --option-sky-fg: color-mix(
961
+ in oklch,
962
+ var(--option-sky) 50%,
963
+ var(--foreground)
964
+ );
965
+ --option-blue-bg: color-mix(
966
+ in srgb,
967
+ var(--option-blue) 12%,
968
+ var(--background)
969
+ );
970
+ --option-blue-fg: color-mix(
971
+ in oklch,
972
+ var(--option-blue) 50%,
973
+ var(--foreground)
974
+ );
975
+ --option-indigo-bg: color-mix(
976
+ in srgb,
977
+ var(--option-indigo) 12%,
978
+ var(--background)
979
+ );
980
+ --option-indigo-fg: color-mix(
981
+ in oklch,
982
+ var(--option-indigo) 50%,
983
+ var(--foreground)
984
+ );
985
+ --option-violet-bg: color-mix(
986
+ in srgb,
987
+ var(--option-violet) 12%,
988
+ var(--background)
989
+ );
990
+ --option-violet-fg: color-mix(
991
+ in oklch,
992
+ var(--option-violet) 50%,
993
+ var(--foreground)
994
+ );
995
+ --option-purple-bg: color-mix(
996
+ in srgb,
997
+ var(--option-purple) 12%,
998
+ var(--background)
999
+ );
1000
+ --option-purple-fg: color-mix(
1001
+ in oklch,
1002
+ var(--option-purple) 50%,
1003
+ var(--foreground)
1004
+ );
1005
+ --option-fuchsia-bg: color-mix(
1006
+ in srgb,
1007
+ var(--option-fuchsia) 12%,
1008
+ var(--background)
1009
+ );
1010
+ --option-fuchsia-fg: color-mix(
1011
+ in oklch,
1012
+ var(--option-fuchsia) 50%,
1013
+ var(--foreground)
1014
+ );
1015
+ --option-gray-bg: color-mix(
1016
+ in srgb,
1017
+ var(--option-gray) 15%,
1018
+ var(--background)
1019
+ );
1020
+ --option-gray-fg: color-mix(
1021
+ in oklch,
1022
+ var(--option-gray) 45%,
1023
+ var(--foreground)
1024
+ );
1025
+ --option-empty-bg: color-mix(
1026
+ in srgb,
1027
+ var(--option-empty) 20%,
1028
+ var(--background)
1029
+ );
1030
+ --option-empty-fg: color-mix(
1031
+ in oklch,
1032
+ var(--option-empty) 40%,
1033
+ var(--foreground)
1034
+ );
1035
+ }
1036
+
1037
+ /* Flexoki dark uses brighter 300-series swatches; reset to the
1038
+ * 400-series light swatches so print output matches light mode.
1039
+ * Nord uses identical swatches in light and dark, so no reset. */
1040
+ .palette-flexoki.dark {
1041
+ --option-red: #af3029;
1042
+ --option-orange: #bc5215;
1043
+ --option-amber: color-mix(in oklch, #bc5215, #ad8301);
1044
+ --option-yellow: #ad8301;
1045
+ --option-lime: color-mix(in oklch, #ad8301, #66800b);
1046
+ --option-green: #66800b;
1047
+ --option-emerald: color-mix(in oklch, #66800b, #24837b);
1048
+ --option-teal: color-mix(in oklch, #24837b 65%, #66800b);
1049
+ --option-cyan: #24837b;
1050
+ --option-sky: color-mix(in oklch, #24837b, #205ea6);
1051
+ --option-blue: #205ea6;
1052
+ --option-indigo: color-mix(in oklch, #205ea6, #5e409d);
1053
+ --option-violet: color-mix(in oklch, #5e409d 65%, #205ea6);
1054
+ --option-purple: #5e409d;
1055
+ --option-fuchsia: #a02f6f;
1056
+ --option-gray: #878580;
1057
+ --option-empty: #b7b5ac;
1058
+ }
1059
+ }
1060
+
1061
+ @layer base {
1062
+ * {
1063
+ @apply border-border outline-ring/50;
1064
+ }
1065
+ html {
1066
+ @apply antialiased;
1067
+ /* Paint native UI (scrollbars, form controls, spellcheck) in the active
1068
+ * palette. Without this the browser renders default scrollbars light even
1069
+ * in dark mode, so they read as bright strips against the dark surface. */
1070
+ color-scheme: light;
1071
+ }
1072
+ html.dark {
1073
+ color-scheme: dark;
1074
+ }
1075
+ body {
1076
+ @apply bg-background text-foreground text-pretty;
1077
+ }
1078
+
1079
+ /* Letter-spacing breaks Arabic's cursive joins; never apply tracking
1080
+ * under RTL. `!important` overrides per-element Tailwind tracking-*
1081
+ * utilities (which set letter-spacing directly, so a plain inherited
1082
+ * reset would not reach them). Latin runs inside RTL stay isolated via
1083
+ * <bdi>, so this does not regress embedded Latin spacing. */
1084
+ html[dir="rtl"] * {
1085
+ letter-spacing: normal !important;
1086
+ }
1087
+
1088
+ /* Arabic script sits taller and needs more leading than Latin; bump the
1089
+ * inherited line-height under RTL so dense legal copy stays readable.
1090
+ * Inherited (not !important) so component line-clamp/leading utilities
1091
+ * still win where they set their own value. */
1092
+ html[dir="rtl"] {
1093
+ line-height: 1.6;
1094
+ }
1095
+
1096
+ /* Truncated cells almost always hold a single data value (a name, file,
1097
+ * client, title). A Latin value in the RTL UI has its neutral trailing
1098
+ * characters (".", "/", "()") reordered by the bidi algorithm — e.g.
1099
+ * "Tatra Motor a.s." renders as ".Tatra Motor a.s". `unicode-bidi:
1100
+ * plaintext` resolves each such element's base direction from its own
1101
+ * content (the CSS form of dir="auto") so the value keeps its order.
1102
+ * Scoped to `.truncate` (single-value displays) to avoid touching
1103
+ * mixed-direction running text, which should use <bdi> instead. */
1104
+ html[dir="rtl"] :where(.truncate) {
1105
+ unicode-bidi: plaintext;
1106
+ }
1107
+
1108
+ /* The skeleton shimmer sweeps a fixed physical direction; mirror it
1109
+ * under RTL so the highlight travels with the reading direction. */
1110
+ html[dir="rtl"] [data-slot="skeleton"] {
1111
+ animation-name: skeleton-rtl;
1112
+ }
1113
+
1114
+ /* https://tailwindcss.com/docs/upgrade-guide#buttons-use-the-default-cursor */
1115
+ button:not(:disabled),
1116
+ [role="button"]:not(:disabled) {
1117
+ cursor: pointer;
1118
+ }
1119
+
1120
+ /* pdfjs text layer - font size and transform rules required by pdfjs-dist TextLayer */
1121
+ [data-text-layer] {
1122
+ --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size));
1123
+ --min-font-size-inv: calc(1 / var(--min-font-size));
1124
+ }
1125
+
1126
+ [data-text-layer] > :not(.markedContent),
1127
+ [data-text-layer] .markedContent span:not(.markedContent) {
1128
+ --font-height: 0;
1129
+ font-size: calc(var(--text-scale-factor) * var(--font-height));
1130
+ --scale-x: 1;
1131
+ --rotate: 0deg;
1132
+ transform: rotate(var(--rotate)) scaleX(var(--scale-x))
1133
+ scale(var(--min-font-size-inv));
1134
+ }
1135
+ }
1136
+
1137
+ /*
1138
+ * pdfjs-dist injects a measurement canvas into <body>.
1139
+ * Without this rule it contributes height and makes the
1140
+ * root document scrollable.
1141
+ */
1142
+ .hiddenCanvasElement {
1143
+ position: fixed !important;
1144
+ visibility: hidden !important;
1145
+ width: 0 !important;
1146
+ height: 0 !important;
1147
+ }
1148
+
1149
+ /*
1150
+ * Thin, low-contrast scrollbar for dense scroll regions (tables, panels)
1151
+ * where the default bar competes for attention. Track is transparent; the
1152
+ * thumb uses the border token and lifts to muted-foreground on hover.
1153
+ */
1154
+ @utility scrollbar-subtle {
1155
+ scrollbar-width: thin;
1156
+ scrollbar-color: var(--color-border) transparent;
1157
+
1158
+ &::-webkit-scrollbar {
1159
+ width: 0.5rem;
1160
+ height: 0.5rem;
1161
+ }
1162
+
1163
+ &::-webkit-scrollbar-track {
1164
+ background: transparent;
1165
+ }
1166
+
1167
+ &::-webkit-scrollbar-thumb {
1168
+ border-radius: 9999px;
1169
+ background-color: var(--color-border);
1170
+ }
1171
+
1172
+ &::-webkit-scrollbar-thumb:hover {
1173
+ background-color: var(--color-muted-foreground);
1174
+ }
1175
+ }
1176
+
1177
+ /* Horizontal prompt rows stay visually quiet until the pointer confirms that
1178
+ * the clipped content is relevant. The track keeps a stable thin gutter so
1179
+ * revealing the thumb does not shift the chips. */
1180
+ @utility scrollbar-hover {
1181
+ scrollbar-width: thin;
1182
+ scrollbar-color: transparent transparent;
1183
+
1184
+ &::-webkit-scrollbar {
1185
+ width: 0.5rem;
1186
+ height: 0.5rem;
1187
+ }
1188
+
1189
+ &::-webkit-scrollbar-track {
1190
+ background: transparent;
1191
+ }
1192
+
1193
+ &::-webkit-scrollbar-thumb {
1194
+ border-radius: 9999px;
1195
+ background-color: transparent;
1196
+ }
1197
+
1198
+ &:hover {
1199
+ scrollbar-color: var(--color-border) transparent;
1200
+ }
1201
+
1202
+ &:hover::-webkit-scrollbar-thumb {
1203
+ background-color: var(--color-border);
1204
+ }
1205
+
1206
+ &:hover::-webkit-scrollbar-thumb:hover {
1207
+ background-color: var(--color-muted-foreground);
1208
+ }
1209
+ }