@colletdev/core 0.1.3

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 (119) hide show
  1. package/README.md +77 -0
  2. package/custom-elements.json +6037 -0
  3. package/generated/.gitattributes +2 -0
  4. package/generated/index.d.ts +120 -0
  5. package/generated/index.js +521 -0
  6. package/generated/styles.js +2845 -0
  7. package/package.json +56 -0
  8. package/src/elements/accordion.d.ts +20 -0
  9. package/src/elements/accordion.js +92 -0
  10. package/src/elements/activity_group.d.ts +19 -0
  11. package/src/elements/activity_group.js +27 -0
  12. package/src/elements/alert.d.ts +24 -0
  13. package/src/elements/alert.js +40 -0
  14. package/src/elements/autocomplete.d.ts +30 -0
  15. package/src/elements/autocomplete.js +671 -0
  16. package/src/elements/avatar.d.ts +18 -0
  17. package/src/elements/avatar.js +28 -0
  18. package/src/elements/backdrop.d.ts +14 -0
  19. package/src/elements/backdrop.js +28 -0
  20. package/src/elements/badge.d.ts +21 -0
  21. package/src/elements/badge.js +42 -0
  22. package/src/elements/breadcrumb.d.ts +17 -0
  23. package/src/elements/breadcrumb.js +41 -0
  24. package/src/elements/button.d.ts +24 -0
  25. package/src/elements/button.js +36 -0
  26. package/src/elements/card.d.ts +21 -0
  27. package/src/elements/card.js +67 -0
  28. package/src/elements/carousel.d.ts +23 -0
  29. package/src/elements/carousel.js +895 -0
  30. package/src/elements/chat_input.d.ts +22 -0
  31. package/src/elements/chat_input.js +78 -0
  32. package/src/elements/checkbox.d.ts +21 -0
  33. package/src/elements/checkbox.js +114 -0
  34. package/src/elements/code_block.d.ts +21 -0
  35. package/src/elements/code_block.js +27 -0
  36. package/src/elements/collapsible.d.ts +20 -0
  37. package/src/elements/collapsible.js +93 -0
  38. package/src/elements/date_picker.d.ts +30 -0
  39. package/src/elements/date_picker.js +528 -0
  40. package/src/elements/dialog.d.ts +20 -0
  41. package/src/elements/dialog.js +314 -0
  42. package/src/elements/drawer.d.ts +20 -0
  43. package/src/elements/drawer.js +318 -0
  44. package/src/elements/fab.d.ts +22 -0
  45. package/src/elements/fab.js +36 -0
  46. package/src/elements/file_upload.d.ts +26 -0
  47. package/src/elements/file_upload.js +59 -0
  48. package/src/elements/listbox.d.ts +19 -0
  49. package/src/elements/listbox.js +250 -0
  50. package/src/elements/menu.d.ts +20 -0
  51. package/src/elements/menu.js +224 -0
  52. package/src/elements/message_bubble.d.ts +23 -0
  53. package/src/elements/message_bubble.js +29 -0
  54. package/src/elements/message_group.d.ts +18 -0
  55. package/src/elements/message_group.js +28 -0
  56. package/src/elements/message_part.d.ts +35 -0
  57. package/src/elements/message_part.js +153 -0
  58. package/src/elements/pagination.d.ts +22 -0
  59. package/src/elements/pagination.js +36 -0
  60. package/src/elements/popover.d.ts +26 -0
  61. package/src/elements/popover.js +191 -0
  62. package/src/elements/profile_menu.d.ts +20 -0
  63. package/src/elements/profile_menu.js +213 -0
  64. package/src/elements/progress.d.ts +18 -0
  65. package/src/elements/progress.js +31 -0
  66. package/src/elements/radio_group.d.ts +22 -0
  67. package/src/elements/radio_group.js +70 -0
  68. package/src/elements/scrollbar.d.ts +19 -0
  69. package/src/elements/scrollbar.js +299 -0
  70. package/src/elements/search_bar.d.ts +27 -0
  71. package/src/elements/search_bar.js +98 -0
  72. package/src/elements/select.d.ts +26 -0
  73. package/src/elements/select.js +485 -0
  74. package/src/elements/sidebar.d.ts +21 -0
  75. package/src/elements/sidebar.js +322 -0
  76. package/src/elements/skeleton.d.ts +17 -0
  77. package/src/elements/skeleton.js +31 -0
  78. package/src/elements/slider.d.ts +28 -0
  79. package/src/elements/slider.js +93 -0
  80. package/src/elements/speed_dial.d.ts +23 -0
  81. package/src/elements/speed_dial.js +370 -0
  82. package/src/elements/spinner.d.ts +15 -0
  83. package/src/elements/spinner.js +28 -0
  84. package/src/elements/split_button.d.ts +23 -0
  85. package/src/elements/split_button.js +281 -0
  86. package/src/elements/stepper.d.ts +20 -0
  87. package/src/elements/stepper.js +31 -0
  88. package/src/elements/switch.d.ts +22 -0
  89. package/src/elements/switch.js +129 -0
  90. package/src/elements/table.d.ts +29 -0
  91. package/src/elements/table.js +371 -0
  92. package/src/elements/tabs.d.ts +19 -0
  93. package/src/elements/tabs.js +139 -0
  94. package/src/elements/text.d.ts +26 -0
  95. package/src/elements/text.js +32 -0
  96. package/src/elements/text_input.d.ts +36 -0
  97. package/src/elements/text_input.js +121 -0
  98. package/src/elements/thinking.d.ts +17 -0
  99. package/src/elements/thinking.js +28 -0
  100. package/src/elements/toast.d.ts +23 -0
  101. package/src/elements/toast.js +209 -0
  102. package/src/elements/toggle_group.d.ts +22 -0
  103. package/src/elements/toggle_group.js +176 -0
  104. package/src/elements/tooltip.d.ts +18 -0
  105. package/src/elements/tooltip.js +64 -0
  106. package/src/markdown.d.ts +24 -0
  107. package/src/markdown.js +66 -0
  108. package/src/runtime.d.ts +35 -0
  109. package/src/runtime.js +790 -0
  110. package/src/server.d.ts +69 -0
  111. package/src/server.js +176 -0
  112. package/src/streaming-markdown.js +43 -0
  113. package/src/vite-plugin.d.ts +46 -0
  114. package/src/vite-plugin.js +221 -0
  115. package/wasm/package.json +16 -0
  116. package/wasm/wasm_api.d.ts +72 -0
  117. package/wasm/wasm_api.js +593 -0
  118. package/wasm/wasm_api_bg.wasm +0 -0
  119. package/wasm/wasm_api_bg.wasm.d.ts +10 -0
@@ -0,0 +1,2845 @@
1
+ // Auto-generated by scripts/inline-css.mjs — DO NOT EDIT
2
+ // Embedded CSS for zero-config initialization (no fetch required).
3
+ //
4
+ // TOKENS_CSS: Full design tokens for document <head> (vars, fonts, themes).
5
+ // TOKENS_SHADOW_CSS: Shadow DOM subset (animations, motion, component rules).
6
+ // CSS vars inherit from <head> — no runtime filtering needed.
7
+ // UTILITIES_CSS: Tailwind utility classes for Shadow DOM adopted stylesheets.
8
+ export const TOKENS_CSS = `/* ═══════════════════════════════════════════
9
+ DESIGN TOKENS — Auto-generated from Rust
10
+ Do NOT edit manually. Change the Rust enums.
11
+ ═══════════════════════════════════════════ */
12
+
13
+
14
+ /* ─── Typography ─── */
15
+
16
+ /* Variable font: Inter (body) */
17
+ @font-face {
18
+ font-family: 'Inter Variable';
19
+ font-style: normal;
20
+ font-weight: 100 900;
21
+ font-display: swap;
22
+ src: local('Inter'), url('https://rsms.me/inter/font-files/InterVariable.woff2') format('woff2');
23
+ }
24
+
25
+ /* Display font: Instrument Serif (headings) */
26
+ @font-face {
27
+ font-family: 'Instrument Serif';
28
+ font-style: normal;
29
+ font-weight: 400;
30
+ font-display: swap;
31
+ src: local('Instrument Serif'), url('https://fonts.gstatic.com/s/instrumentserif/v4/jizBRFtNs2ka5fCjGE3QLi2Iqb-kz0WB.woff2') format('woff2');
32
+ }
33
+
34
+ /* Mono font: JetBrains Mono (code) */
35
+ @font-face {
36
+ font-family: 'JetBrains Mono';
37
+ font-style: normal;
38
+ font-weight: 100 800;
39
+ font-display: swap;
40
+ src: local('JetBrains Mono'), url('https://cdn.jsdelivr.net/gh/JetBrains/JetBrainsMono@2.304/fonts/variable/JetBrainsMono[wght].woff2') format('woff2');
41
+ }
42
+
43
+ /* ─── Animatable Custom Properties ─── */
44
+ /* Disabled: @property + oklch causes override issues in some browsers. */
45
+
46
+ /* ─── Light Theme (default) ─── */
47
+ :root, :host {
48
+ --color-bg: oklch(0.955 0.005 90.0);
49
+ --color-surface: oklch(1.000 0.000 0.0);
50
+ --color-surface-raised: oklch(1.000 0.000 0.0);
51
+ --color-surface-overlay: oklch(1.000 0.000 0.0);
52
+ --color-text: oklch(0.270 0.003 90.0);
53
+ --color-text-secondary: oklch(0.420 0.003 90.0);
54
+ --color-text-muted: oklch(0.570 0.003 90.0);
55
+ --color-text-inverse: oklch(0.955 0.005 90.0);
56
+ --color-primary: oklch(0.355 0.003 90.0);
57
+ --color-primary-hover: oklch(0.300 0.003 90.0);
58
+ --color-primary-active: oklch(0.260 0.003 90.0);
59
+ --color-secondary: oklch(0.930 0.004 90.0);
60
+ --color-secondary-hover: oklch(0.900 0.004 90.0);
61
+ --color-destructive: oklch(0.535 0.095 25.0);
62
+ --color-destructive-hover: oklch(0.485 0.095 25.0);
63
+ --color-success: oklch(0.535 0.075 145.0);
64
+ --color-warning: oklch(0.650 0.100 75.0);
65
+ --color-error: oklch(0.535 0.095 25.0);
66
+ --color-info: oklch(0.555 0.080 250.0);
67
+ --color-border: oklch(0.870 0.003 90.0);
68
+ --color-border-focus: oklch(0.355 0.003 90.0);
69
+ --color-ring: oklch(0.355 0.003 90.0 / 0.50);
70
+ --color-overlay: oklch(0.000 0.000 0.0 / 0.50);
71
+ --color-scrim: oklch(1.000 0.000 0.0 / 0.80);
72
+ --color-inverse-surface: oklch(0.270 0.003 90.0);
73
+ --color-inverse-text: oklch(0.930 0.003 90.0);
74
+ }
75
+
76
+ html[data-theme="light"], :host([data-theme="light"]) {
77
+ --color-bg: oklch(0.955 0.005 90.0);
78
+ --color-surface: oklch(1.000 0.000 0.0);
79
+ --color-surface-raised: oklch(1.000 0.000 0.0);
80
+ --color-surface-overlay: oklch(1.000 0.000 0.0);
81
+ --color-text: oklch(0.270 0.003 90.0);
82
+ --color-text-secondary: oklch(0.420 0.003 90.0);
83
+ --color-text-muted: oklch(0.570 0.003 90.0);
84
+ --color-text-inverse: oklch(0.955 0.005 90.0);
85
+ --color-primary: oklch(0.355 0.003 90.0);
86
+ --color-primary-hover: oklch(0.300 0.003 90.0);
87
+ --color-primary-active: oklch(0.260 0.003 90.0);
88
+ --color-secondary: oklch(0.930 0.004 90.0);
89
+ --color-secondary-hover: oklch(0.900 0.004 90.0);
90
+ --color-destructive: oklch(0.535 0.095 25.0);
91
+ --color-destructive-hover: oklch(0.485 0.095 25.0);
92
+ --color-success: oklch(0.535 0.075 145.0);
93
+ --color-warning: oklch(0.650 0.100 75.0);
94
+ --color-error: oklch(0.535 0.095 25.0);
95
+ --color-info: oklch(0.555 0.080 250.0);
96
+ --color-border: oklch(0.870 0.003 90.0);
97
+ --color-border-focus: oklch(0.355 0.003 90.0);
98
+ --color-ring: oklch(0.355 0.003 90.0 / 0.50);
99
+ --color-overlay: oklch(0.000 0.000 0.0 / 0.50);
100
+ --color-scrim: oklch(1.000 0.000 0.0 / 0.80);
101
+ --color-inverse-surface: oklch(0.270 0.003 90.0);
102
+ --color-inverse-text: oklch(0.930 0.003 90.0);
103
+ }
104
+
105
+ /* ─── Dark Theme ─── */
106
+ @media (prefers-color-scheme: dark) {
107
+ :root, :host {
108
+ --color-bg: oklch(0.185 0.000 0.0);
109
+ --color-surface: oklch(0.050 0.000 0.0);
110
+ --color-surface-raised: oklch(0.225 0.000 0.0);
111
+ --color-surface-overlay: oklch(0.260 0.000 0.0);
112
+ --color-text: oklch(0.870 0.000 0.0);
113
+ --color-text-secondary: oklch(0.680 0.000 0.0);
114
+ --color-text-muted: oklch(0.520 0.000 0.0);
115
+ --color-text-inverse: oklch(0.955 0.000 0.0);
116
+ --color-primary: oklch(0.500 0.000 0.0);
117
+ --color-primary-hover: oklch(0.545 0.000 0.0);
118
+ --color-primary-active: oklch(0.580 0.000 0.0);
119
+ --color-secondary: oklch(0.230 0.000 0.0);
120
+ --color-secondary-hover: oklch(0.270 0.000 0.0);
121
+ --color-destructive: oklch(0.580 0.095 25.0);
122
+ --color-destructive-hover: oklch(0.620 0.095 25.0);
123
+ --color-success: oklch(0.580 0.075 145.0);
124
+ --color-warning: oklch(0.690 0.100 75.0);
125
+ --color-error: oklch(0.580 0.095 25.0);
126
+ --color-info: oklch(0.600 0.080 250.0);
127
+ --color-border: oklch(0.300 0.000 0.0);
128
+ --color-border-focus: oklch(0.500 0.000 0.0);
129
+ --color-ring: oklch(0.500 0.000 0.0 / 0.50);
130
+ --color-overlay: oklch(0.000 0.000 0.0 / 0.70);
131
+ --color-scrim: oklch(0.185 0.000 0.0 / 0.90);
132
+ --color-inverse-surface: oklch(0.870 0.000 0.0);
133
+ --color-inverse-text: oklch(0.230 0.000 0.0);
134
+ }
135
+ }
136
+
137
+ html[data-theme="dark"], :host([data-theme="dark"]) {
138
+ --color-bg: oklch(0.185 0.000 0.0);
139
+ --color-surface: oklch(0.050 0.000 0.0);
140
+ --color-surface-raised: oklch(0.225 0.000 0.0);
141
+ --color-surface-overlay: oklch(0.260 0.000 0.0);
142
+ --color-text: oklch(0.870 0.000 0.0);
143
+ --color-text-secondary: oklch(0.680 0.000 0.0);
144
+ --color-text-muted: oklch(0.520 0.000 0.0);
145
+ --color-text-inverse: oklch(0.955 0.000 0.0);
146
+ --color-primary: oklch(0.500 0.000 0.0);
147
+ --color-primary-hover: oklch(0.545 0.000 0.0);
148
+ --color-primary-active: oklch(0.580 0.000 0.0);
149
+ --color-secondary: oklch(0.230 0.000 0.0);
150
+ --color-secondary-hover: oklch(0.270 0.000 0.0);
151
+ --color-destructive: oklch(0.580 0.095 25.0);
152
+ --color-destructive-hover: oklch(0.620 0.095 25.0);
153
+ --color-success: oklch(0.580 0.075 145.0);
154
+ --color-warning: oklch(0.690 0.100 75.0);
155
+ --color-error: oklch(0.580 0.095 25.0);
156
+ --color-info: oklch(0.600 0.080 250.0);
157
+ --color-border: oklch(0.300 0.000 0.0);
158
+ --color-border-focus: oklch(0.500 0.000 0.0);
159
+ --color-ring: oklch(0.500 0.000 0.0 / 0.50);
160
+ --color-overlay: oklch(0.000 0.000 0.0 / 0.70);
161
+ --color-scrim: oklch(0.185 0.000 0.0 / 0.90);
162
+ --color-inverse-surface: oklch(0.870 0.000 0.0);
163
+ --color-inverse-text: oklch(0.230 0.000 0.0);
164
+ }
165
+
166
+ /* ─── Spacing Scale (4px base grid) ─── */
167
+ :root, :host {
168
+ --space-0: 0;
169
+ --space-px: 1px;
170
+ --space-0-5: 0.125rem;
171
+ --space-1: 0.25rem;
172
+ --space-1-5: 0.375rem;
173
+ --space-2: 0.5rem;
174
+ --space-3: 0.75rem;
175
+ --space-4: 1rem;
176
+ --space-5: 1.25rem;
177
+ --space-6: 1.5rem;
178
+ --space-8: 2rem;
179
+ --space-10: 2.5rem;
180
+ --space-12: 3rem;
181
+ --space-16: 4rem;
182
+ --space-20: 5rem;
183
+ --space-24: 6rem;
184
+ }
185
+
186
+ /* ─── Border Radius ─── */
187
+ :root, :host {
188
+ --radius-none: 0;
189
+ --radius-sm: 0.25rem;
190
+ --radius-md: 0.375rem;
191
+ --radius-lg: 0.5rem;
192
+ --radius-xl: 0.75rem;
193
+ --radius-2xl: 1rem;
194
+ --radius-3xl: 1.5rem;
195
+ --radius-full: 9999px;
196
+ }
197
+
198
+ /* ─── Elevation (Shadows) ─── */
199
+ :root, :host {
200
+ --shadow-none: none;
201
+ --shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.05);
202
+ --shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.07), 0 2px 4px -2px oklch(0 0 0 / 0.05);
203
+ --shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.08), 0 4px 6px -4px oklch(0 0 0 / 0.04);
204
+ --shadow-xl: 0 20px 25px -5px oklch(0 0 0 / 0.10), 0 8px 10px -6px oklch(0 0 0 / 0.05);
205
+ }
206
+
207
+ /* ─── Typography ─── */
208
+ :root, :host {
209
+ --font-sans: 'Inter Variable', 'Inter', system-ui, -apple-system, sans-serif;
210
+ --font-display: 'Instrument Serif', 'Georgia', serif;
211
+ --font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
212
+ }
213
+
214
+ /* ─── Motion Durations ─── */
215
+ :root, :host {
216
+ --duration-instant: 0ms;
217
+ --duration-fastest: 50ms;
218
+ --duration-fast: 100ms;
219
+ --duration-normal: 200ms;
220
+ --duration-smooth: 300ms;
221
+ --duration-slow: 500ms;
222
+ --duration-slowest: 700ms;
223
+ }
224
+
225
+ /* ─── Easing Curves ─── */
226
+ :root, :host {
227
+ --ease-linear: linear;
228
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
229
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
230
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
231
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
232
+ --ease-bounce: cubic-bezier(0.34, 1.8, 0.64, 1);
233
+ --ease-snappy: cubic-bezier(0.2, 0, 0, 1);
234
+ }
235
+
236
+ /* ─── Keyframe Animations ─── */
237
+
238
+ @keyframes fade-in { from { opacity: 0; }to { opacity: 1; } }
239
+
240
+ @keyframes fade-out { from { opacity: 1; }to { opacity: 0; } }
241
+
242
+ @keyframes slide-in-up { from { opacity: 0; transform: translateY(8px); }to { opacity: 1; transform: translateY(0); } }
243
+
244
+ @keyframes slide-in-down { from { opacity: 0; transform: translateY(-8px); }to { opacity: 1; transform: translateY(0); } }
245
+
246
+ @keyframes slide-in-left { from { opacity: 0; transform: translateX(-8px); }to { opacity: 1; transform: translateX(0); } }
247
+
248
+ @keyframes slide-in-right { from { opacity: 0; transform: translateX(8px); }to { opacity: 1; transform: translateX(0); } }
249
+
250
+ @keyframes scale-in { from { opacity: 0; transform: scale(0.95); }to { opacity: 1; transform: scale(1); } }
251
+
252
+ @keyframes scale-out { from { opacity: 1; transform: scale(1); }to { opacity: 0; transform: scale(0.95); } }
253
+
254
+ @keyframes slide-out-up { from { opacity: 1; transform: translateY(0); }to { opacity: 0; transform: translateY(-8px); } }
255
+
256
+ @keyframes slide-out-down { from { opacity: 1; transform: translateY(0); }to { opacity: 0; transform: translateY(8px); } }
257
+
258
+ @keyframes expand-height { from { opacity: 0; max-height: 0; overflow: hidden; }to { opacity: 1; max-height: var(--expand-to, 500px); overflow: hidden; } }
259
+
260
+ @keyframes collapse-height { from { opacity: 1; max-height: var(--expand-to, 500px); overflow: hidden; }to { opacity: 0; max-height: 0; overflow: hidden; } }
261
+
262
+ @keyframes spin { from { transform: rotate(0deg); }to { transform: rotate(360deg); } }
263
+
264
+ @keyframes pulse { 0%, 100% { opacity: 1; }50% { opacity: 0.5; } }
265
+
266
+ @keyframes bounce { 0%, 100% { transform: translateY(0); }50% { transform: translateY(-4px); } }
267
+
268
+
269
+
270
+ /* ─── Interactive Utilities ─── */
271
+
272
+ /* CSS-only press ripple — add class="ripple" to any interactive element.
273
+ Uses ::after pseudo-element with radial-gradient.
274
+ The ripple color inherits from currentColor (adapts to theme). */
275
+ .ripple {
276
+ position: relative;
277
+ overflow: hidden;
278
+ }
279
+ .ripple::after {
280
+ content: '';
281
+ display: block;
282
+ position: absolute;
283
+ width: 100%;
284
+ height: 100%;
285
+ top: 0;
286
+ left: 0;
287
+ pointer-events: none;
288
+ background-image: radial-gradient(circle, currentColor 10%, transparent 10.01%);
289
+ background-repeat: no-repeat;
290
+ background-position: 50%;
291
+ transform: scale(10, 10);
292
+ opacity: 0;
293
+ transition: transform 0.3s, opacity 0.5s;
294
+ }
295
+ .ripple:active::after {
296
+ transform: scale(0, 0);
297
+ opacity: 0.1;
298
+ transition: 0s;
299
+ }
300
+
301
+ @media (prefers-reduced-motion: reduce) {
302
+ :root {
303
+ --duration-instant: 0ms;
304
+ --duration-fastest: 0.01ms;
305
+ --duration-fast: 0.01ms;
306
+ --duration-normal: 0.01ms;
307
+ --duration-smooth: 0.01ms;
308
+ --duration-slow: 0.01ms;
309
+ --duration-slowest: 0.01ms;
310
+ --ease-spring: linear;
311
+ --ease-bounce: linear;
312
+ --ease-snappy: linear;
313
+ }
314
+ *, *::before, *::after {
315
+ animation-duration: 0.01ms !important;
316
+ animation-iteration-count: 1 !important;
317
+ scroll-behavior: auto !important;
318
+ }
319
+ ::view-transition-group(*),
320
+ ::view-transition-old(*),
321
+ ::view-transition-new(*) {
322
+ animation-duration: 0.01ms !important;
323
+ }
324
+ }
325
+
326
+ /* ─── Floating Positioning ─── */
327
+ /* Loader.js manages position: fixed, coordinates, and data-open attribute.
328
+ These rules handle visibility, animation, and reduced-motion. */
329
+
330
+ [data-floating] {
331
+ pointer-events: none;
332
+ opacity: 0;
333
+ }
334
+ [data-floating][data-open] {
335
+ pointer-events: auto;
336
+ opacity: 1;
337
+ }
338
+ [data-floating][data-open][data-placement="bottom"] {
339
+ animation: float-in-bottom var(--duration-smooth) var(--ease-spring) forwards;
340
+ }
341
+ [data-floating][data-open][data-placement="top"] {
342
+ animation: float-in-top var(--duration-smooth) var(--ease-spring) forwards;
343
+ }
344
+ @keyframes float-in-bottom {
345
+ from { opacity: 0; transform: translateY(-4px) scale(0.98); }
346
+ to { opacity: 1; transform: translateY(0) scale(1); }
347
+ }
348
+ @keyframes float-in-top {
349
+ from { opacity: 0; transform: translateY(4px) scale(0.98); }
350
+ to { opacity: 1; transform: translateY(0) scale(1); }
351
+ }
352
+ [data-floating][data-open][data-placement="left"] {
353
+ animation: float-in-left var(--duration-smooth) var(--ease-spring) forwards;
354
+ }
355
+ [data-floating][data-open][data-placement="right"] {
356
+ animation: float-in-right var(--duration-smooth) var(--ease-spring) forwards;
357
+ }
358
+ @keyframes float-in-left {
359
+ from { opacity: 0; transform: translateX(4px) scale(0.98); }
360
+ to { opacity: 1; transform: translateX(0) scale(1); }
361
+ }
362
+ @keyframes float-in-right {
363
+ from { opacity: 0; transform: translateX(-4px) scale(0.98); }
364
+ to { opacity: 1; transform: translateX(0) scale(1); }
365
+ }
366
+ @media (prefers-reduced-motion: reduce) {
367
+ [data-floating][data-open] {
368
+ animation: none;
369
+ }
370
+ }
371
+ /* Chevron rotation — spring easing for satisfying overshoot */
372
+ [data-floating-trigger] .transition-transform {
373
+ transition: transform var(--duration-smooth) var(--ease-spring);
374
+ }
375
+ [aria-expanded="true"] .transition-transform {
376
+ transform: rotate(180deg);
377
+ }
378
+ /* Opt-out: elements inside [data-no-rotate] keep their original transform */
379
+ [data-no-rotate] .transition-transform {
380
+ transform: none !important;
381
+ }
382
+
383
+ /* ─── Component Motion ─── */
384
+ /* Spring scale for checkbox/radio indicators on state change.
385
+ Background fills first (100ms EaseOut via transition-colors),
386
+ then the check/dot springs in (300ms Spring with overshoot). */
387
+
388
+ input.peer + [aria-hidden="true"] > svg {
389
+ transform: scale(0);
390
+ transition: transform var(--duration-smooth) var(--ease-spring);
391
+ }
392
+ input.peer:checked + [aria-hidden="true"] > svg {
393
+ transform: scale(1);
394
+ }
395
+ /* Indeterminate checkbox — show dash at full scale */
396
+ [data-state="indeterminate"] > svg {
397
+ transform: scale(1);
398
+ }
399
+
400
+ /* Switch thumb — spring slide on toggle.
401
+ The thumb translateX is set via inline classes; this rule
402
+ adds spring easing so the slide overshoots slightly. */
403
+ button[role="switch"] > span[aria-hidden="true"] {
404
+ transition: transform var(--duration-smooth) var(--ease-spring);
405
+ }
406
+ /* Switch track — smooth color transition (EaseOut, not Spring).
407
+ Spring on color looks wrong; EaseOut gives a clean fill. */
408
+ button[role="switch"] {
409
+ transition: background-color var(--duration-fast) var(--ease-out),
410
+ border-color var(--duration-fast) var(--ease-out);
411
+ }
412
+
413
+ /* Tooltip — spring entrance + smooth exit via CSS group-hover/focus-within.
414
+ Opacity fades fast (EaseOut, no overshoot), translate/scale spring with
415
+ satisfying overshoot. Individual transform properties (not shorthand)
416
+ match Tailwind v4's output for correct transition targeting. */
417
+ .group\\/tooltip [role="tooltip"] {
418
+ transition: opacity var(--duration-fast) var(--ease-out),
419
+ visibility var(--duration-fast) var(--ease-out),
420
+ translate var(--duration-smooth) var(--ease-spring),
421
+ scale var(--duration-smooth) var(--ease-spring);
422
+ }
423
+
424
+ /* Shared floating tooltip — JS-enhanced, slides between triggers.
425
+ Positioned via CSS custom properties (--tt-x, --tt-y) set by
426
+ tooltip.js. Spring-eased translate creates fluid movement when
427
+ the tooltip slides between adjacent triggers. */
428
+ [data-tooltip-floating] {
429
+ position: fixed;
430
+ inset: 0 auto auto 0;
431
+ translate: var(--tt-x, 0) var(--tt-y, 0);
432
+ scale: 0.96;
433
+ opacity: 0;
434
+ pointer-events: none;
435
+ z-index: 50;
436
+ max-width: min(300px, 90vw);
437
+ white-space: normal;
438
+ word-wrap: break-word;
439
+ transition: translate var(--duration-smooth) var(--ease-spring),
440
+ scale var(--duration-fast) var(--ease-spring),
441
+ opacity var(--duration-fast) var(--ease-out);
442
+ }
443
+ [data-tooltip-floating][data-open] {
444
+ scale: 1;
445
+ opacity: 1;
446
+ pointer-events: auto;
447
+ }
448
+
449
+ /* Progressive enhancement: per-trigger tooltips become sr-only
450
+ when the behavior module activates the shared floating tooltip.
451
+ aria-describedby still references these elements for screen readers. */
452
+ [data-tooltip-enhanced] [data-tooltip-wrapper] [role="tooltip"] {
453
+ position: absolute !important;
454
+ width: 1px !important;
455
+ height: 1px !important;
456
+ padding: 0 !important;
457
+ margin: -1px !important;
458
+ overflow: hidden !important;
459
+ clip: rect(0, 0, 0, 0) !important;
460
+ white-space: nowrap !important;
461
+ border-width: 0 !important;
462
+ }
463
+
464
+ /* Arrow positioning by data-placement — the rotated square
465
+ tracks the trigger center via --tt-arrow-x / --tt-arrow-y. */
466
+ [data-tooltip-floating] [data-tooltip-arrow-el] {
467
+ position: absolute;
468
+ width: 8px;
469
+ height: 8px;
470
+ background: inherit;
471
+ transform: rotate(45deg);
472
+ }
473
+ [data-tooltip-floating][data-placement="top"] [data-tooltip-arrow-el] {
474
+ bottom: -4px;
475
+ left: var(--tt-arrow-x, 50%);
476
+ transform: translateX(-50%) rotate(45deg);
477
+ }
478
+ [data-tooltip-floating][data-placement="bottom"] [data-tooltip-arrow-el] {
479
+ top: -4px;
480
+ left: var(--tt-arrow-x, 50%);
481
+ transform: translateX(-50%) rotate(45deg);
482
+ }
483
+ [data-tooltip-floating][data-placement="left"] [data-tooltip-arrow-el] {
484
+ right: -4px;
485
+ top: var(--tt-arrow-y, 50%);
486
+ transform: translateY(-50%) rotate(45deg);
487
+ }
488
+ [data-tooltip-floating][data-placement="right"] [data-tooltip-arrow-el] {
489
+ left: -4px;
490
+ top: var(--tt-arrow-y, 50%);
491
+ transform: translateY(-50%) rotate(45deg);
492
+ }
493
+
494
+ /* Tabs — active tab text color transition (indicator handles visual sweep) */
495
+ [data-tabs] [role="tab"] {
496
+ transition: color var(--duration-fast) var(--ease-out),
497
+ background-color var(--duration-fast) var(--ease-out);
498
+ }
499
+ /* Tabs — hover/active only on non-selected tabs. Selected tabs are styled
500
+ by the sliding indicator — hover bg would paint over it (z-10 button). */
501
+ [data-tabs] [role="tab"]:not([aria-selected="true"]):hover {
502
+ color: var(--color-text);
503
+ background-color: var(--color-secondary);
504
+ }
505
+ [data-tabs] [role="tab"]:not([aria-selected="true"]):active {
506
+ background-color: var(--color-secondary-hover);
507
+ }
508
+ /* Tabs — sliding indicator sweep (Spring easing for satisfying overshoot).
509
+ Uses --duration-slow (500ms) because Spring's fast attack makes shorter
510
+ durations feel instant — 500ms gives ~300ms of visible motion.
511
+ [data-ready] prevents transition on initial page load. */
512
+ [data-tab-indicator][data-ready] {
513
+ transition: left var(--duration-slow) var(--ease-spring),
514
+ top var(--duration-slow) var(--ease-spring),
515
+ width var(--duration-slow) var(--ease-spring),
516
+ height var(--duration-slow) var(--ease-spring);
517
+ }
518
+
519
+
520
+ /* Dialog/Drawer ::backdrop — transparent in production.
521
+ Visual backdrop is a JS-created overlay <div> animated via Web Animations API.
522
+ See dialog.js and drawer.js for the overlay implementation. */
523
+ dialog[data-dialog]::backdrop {
524
+ background: transparent;
525
+ backdrop-filter: none;
526
+ -webkit-backdrop-filter: none;
527
+ }
528
+
529
+
530
+ /* Dialog/Drawer panel animations are handled by Web Animations API in
531
+ dialog.js and drawer.js. CSS @keyframes removed from this stylesheet
532
+ to prevent double animation — CSS and JS both fire on [data-open] /
533
+ [data-closing] attrs. SSR gallery keeps its own copy in gallery.rs. */
534
+
535
+ /* Accordion — panel height transition (grid-template-rows: 0fr -> 1fr).
536
+ Spring easing gives a satisfying overshoot on expand. */
537
+ [data-accordion-panel] {
538
+ display: grid;
539
+ grid-template-rows: 0fr;
540
+ transition: grid-template-rows var(--duration-smooth) var(--ease-spring);
541
+ }
542
+
543
+ /* Accordion — chevron rotation (Spring overshoot past 180 then settles) */
544
+ [data-accordion-trigger] [data-accordion-chevron] {
545
+ transition: transform var(--duration-normal) var(--ease-spring);
546
+ }
547
+ [data-accordion-trigger][aria-expanded="true"] [data-accordion-chevron] {
548
+ transform: rotate(180deg);
549
+ }
550
+
551
+ /* Accordion — trigger text/bg color transitions */
552
+ [data-accordion-trigger] {
553
+ transition: color var(--duration-fast) var(--ease-out),
554
+ background-color var(--duration-fast) var(--ease-out);
555
+ }
556
+ /* Accordion — trigger hover/active */
557
+ [data-accordion-trigger]:not([disabled]):hover {
558
+ background-color: var(--color-secondary);
559
+ }
560
+ [data-accordion-trigger]:not([disabled]):active {
561
+ background-color: var(--color-secondary-hover);
562
+ }
563
+
564
+ /* Popover — absolute positioning within relative trigger wrapper.
565
+ Horizontal alignment via data-floating-align on the trigger,
566
+ reflected onto the panel by loader.js via data-align. */
567
+ [data-popover] {
568
+ position: absolute;
569
+ z-index: 30;
570
+ }
571
+ [data-popover][data-align="start"] {
572
+ left: 0;
573
+ right: auto;
574
+ }
575
+ [data-popover][data-align="center"] {
576
+ left: 50%;
577
+ right: auto;
578
+ transform: translateX(-50%);
579
+ }
580
+ [data-popover][data-align="end"] {
581
+ right: 0;
582
+ left: auto;
583
+ }
584
+
585
+ /* Popover — arrow positioning based on runtime data-placement.
586
+ Arrow is a rotated square that inherits panel bg, positioned to
587
+ point toward the trigger. Uses border on two sides for continuity
588
+ with panel border. */
589
+ [data-popover] [data-popover-arrow] {
590
+ position: absolute;
591
+ left: 50%;
592
+ transform: translateX(-50%) rotate(45deg);
593
+ border-color: var(--color-border);
594
+ }
595
+ [data-popover][data-placement="bottom"] [data-popover-arrow] {
596
+ top: -0.25rem;
597
+ border-top-width: 1px;
598
+ border-left-width: 1px;
599
+ }
600
+ [data-popover][data-placement="top"] [data-popover-arrow] {
601
+ bottom: -0.25rem;
602
+ border-bottom-width: 1px;
603
+ border-right-width: 1px;
604
+ }
605
+
606
+ /* Menu — absolute positioning within relative trigger wrapper.
607
+ Like popover, menus use a relative parent and absolute panel.
608
+ Always left-aligned (start alignment). */
609
+ [data-menu] {
610
+ position: absolute;
611
+ z-index: 30;
612
+ left: 0;
613
+ right: auto;
614
+ }
615
+
616
+ /* Drawer top — also handled by Web Animations API in drawer.js.
617
+ CSS @keyframes removed (see comment above dialog/drawer section). */
618
+
619
+ /* Toast entrance — slide + scale + fade, snappy easing (matches Drawer).
620
+ The behavior module (toast.js) drives [data-open]/[data-closing] attrs. */
621
+ [data-toast][data-open][data-position^="top"] {
622
+ animation: toast-in-top 350ms var(--ease-snappy) forwards;
623
+ }
624
+ [data-toast][data-open][data-position^="bottom"] {
625
+ animation: toast-in-bottom 350ms var(--ease-snappy) forwards;
626
+ }
627
+
628
+ /* Toast exit — slide + fade out, ease-out for smooth departure */
629
+ [data-toast][data-closing][data-position^="top"] {
630
+ animation: toast-out-top 250ms var(--ease-out) forwards;
631
+ }
632
+ [data-toast][data-closing][data-position^="bottom"] {
633
+ animation: toast-out-bottom 250ms var(--ease-out) forwards;
634
+ }
635
+
636
+ /* Toast progress bar — auto-dismiss countdown indicator */
637
+ [data-toast] [data-toast-progress] {
638
+ position: absolute;
639
+ bottom: 0;
640
+ left: 0;
641
+ height: 2px;
642
+ background: currentColor;
643
+ opacity: 0.25;
644
+ border-radius: inherit;
645
+ transform-origin: left;
646
+ transition: none;
647
+ }
648
+
649
+ /* Pause progress when hovered */
650
+ [data-toast]:hover [data-toast-progress] {
651
+ animation-play-state: paused !important;
652
+ }
653
+
654
+ @keyframes toast-in-top {
655
+ from { opacity: 0; transform: translateY(-1rem) scale(0.95); }
656
+ to { opacity: 1; transform: translateY(0) scale(1); }
657
+ }
658
+ @keyframes toast-in-bottom {
659
+ from { opacity: 0; transform: translateY(1rem) scale(0.95); }
660
+ to { opacity: 1; transform: translateY(0) scale(1); }
661
+ }
662
+ @keyframes toast-out-top {
663
+ from { opacity: 1; transform: translateY(0) scale(1); }
664
+ to { opacity: 0; transform: translateY(-1rem) scale(0.95); }
665
+ }
666
+ @keyframes toast-out-bottom {
667
+ from { opacity: 1; transform: translateY(0) scale(1); }
668
+ to { opacity: 0; transform: translateY(1rem) scale(0.95); }
669
+ }
670
+
671
+ @keyframes toast-progress {
672
+ from { transform: scaleX(1); }
673
+ to { transform: scaleX(0); }
674
+ }
675
+
676
+ /* Spinner square variant — tumbling cube with 3D perspective rotation.
677
+ Uses ease-in-out (not Spring) for smooth infinite looping. */
678
+ .animate-spin-square {
679
+ animation: spin-square 1.8s ease-in-out infinite;
680
+ }
681
+ @keyframes spin-square {
682
+ 0% { transform: perspective(120px) rotateX(0) rotateY(0); }
683
+ 25% { transform: perspective(120px) rotateX(180deg) rotateY(0); }
684
+ 50% { transform: perspective(120px) rotateX(180deg) rotateY(180deg); }
685
+ 75% { transform: perspective(120px) rotateX(360deg) rotateY(180deg); }
686
+ 100% { transform: perspective(120px) rotateX(360deg) rotateY(360deg); }
687
+ }
688
+
689
+ /* Skeleton wave — gradient shimmer sweep (premium loading effect).
690
+ Uses ::after pseudo-element with a translating gradient.
691
+ The highlight color is the surface background, creating a natural
692
+ shimmer against the skeleton fill (ColorRole::Border). */
693
+ .animate-skeleton-wave {
694
+ position: relative;
695
+ overflow: hidden;
696
+ }
697
+ .animate-skeleton-wave::after {
698
+ content: '';
699
+ position: absolute;
700
+ inset: 0;
701
+ transform: translateX(-100%);
702
+ background: linear-gradient(90deg, transparent, var(--color-surface), transparent);
703
+ animation: skeleton-wave 2s linear infinite;
704
+ }
705
+ @keyframes skeleton-wave {
706
+ 0% { transform: translateX(-100%); }
707
+ 60%, 100% { transform: translateX(100%); }
708
+ }
709
+
710
+ /* Progress bar — indeterminate sliding animation.
711
+ Slides a 40%-width fill bar back and forth within the track.
712
+ Uses ease-in-out (not Spring) for smooth infinite looping. */
713
+ .animate-progress-indeterminate {
714
+ animation: progress-indeterminate 1.5s ease-in-out infinite;
715
+ }
716
+ @keyframes progress-indeterminate {
717
+ 0% { transform: translateX(-100%); }
718
+ 50% { transform: translateX(150%); }
719
+ 100% { transform: translateX(-100%); }
720
+ }
721
+
722
+ /* Sidebar — width transition with Spring easing */
723
+ [data-sidebar] {
724
+ transition: width var(--duration-smooth) var(--ease-spring);
725
+ }
726
+
727
+ /* Narrow mode: hide text labels, badges, sub-group labels */
728
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-item-label],
729
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-badge],
730
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-group-label] {
731
+ display: none;
732
+ }
733
+
734
+ /* Collapsible group panel: grid-template-rows animation (same as Accordion) */
735
+ [data-sidebar-group-panel] {
736
+ display: grid;
737
+ grid-template-rows: 1fr;
738
+ transition: grid-template-rows var(--duration-normal) var(--ease-spring);
739
+ }
740
+ [data-sidebar-group-panel][data-collapsed] {
741
+ grid-template-rows: 0fr;
742
+ }
743
+ [data-sidebar-group-panel] > * {
744
+ overflow: hidden;
745
+ }
746
+
747
+ /* Chevron rotation for collapsible sidebar groups */
748
+ [data-sidebar-group-trigger] [data-chevron] {
749
+ transition: transform var(--duration-normal) var(--ease-spring);
750
+ }
751
+ [data-sidebar-group-trigger][aria-expanded="false"] [data-chevron] {
752
+ transform: rotate(-90deg);
753
+ }
754
+
755
+ /* Narrow mode: center items as comfortable square targets */
756
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-item],
757
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-group-trigger] {
758
+ justify-content: center;
759
+ gap: 0;
760
+ padding: 0.5rem;
761
+ }
762
+
763
+ /* Narrow mode: center items within the rail */
764
+ [data-sidebar][data-sidebar-state="narrow"] ul {
765
+ padding-inline: 0.25rem;
766
+ align-items: center;
767
+ }
768
+
769
+ /* Narrow mode: center header, reduce padding */
770
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-header] {
771
+ justify-content: center;
772
+ padding-inline: 0.5rem;
773
+ }
774
+
775
+ /* Narrow mode: reduce footer padding */
776
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-footer] {
777
+ padding-inline: 0.5rem;
778
+ }
779
+
780
+ /* Narrow mode: hide collapsible panels (unusable without labels) */
781
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-group-panel] {
782
+ display: none;
783
+ }
784
+
785
+ /* Narrow mode: hide chevron indicators */
786
+ [data-sidebar][data-sidebar-state="narrow"] [data-chevron] {
787
+ display: none;
788
+ }
789
+
790
+ /* Sidebar tooltip integration — uses centralized Tooltip component */
791
+ /* Make tooltip wrappers fill sidebar width */
792
+ [data-sidebar] [data-tooltip-wrapper] {
793
+ display: flex;
794
+ width: 100%;
795
+ }
796
+ /* Hide tooltip content in expanded mode (labels are visible) */
797
+ [data-sidebar]:not([data-sidebar-state="narrow"]) [data-tooltip-wrapper] [role="tooltip"] {
798
+ display: none !important;
799
+ }
800
+ /* In narrow mode, allow tooltips to escape overflow */
801
+ [data-sidebar][data-sidebar-state="narrow"] {
802
+ overflow: visible;
803
+ }
804
+ [data-sidebar][data-sidebar-state="narrow"] nav {
805
+ overflow: visible;
806
+ }
807
+
808
+ /* ─── Pressed State Design Tokens ─── */
809
+ /* Centralized tint + text tokens for pressed/selected states.
810
+ Reusable by any component needing theme-adaptive pressed highlighting.
811
+ Light: subtle primary tint + primary text.
812
+ Dark: stronger tint + full-contrast text (primary has lower luminance than text on dark surfaces). */
813
+ :root, :host {
814
+ --cx-pressed-tint: 15%;
815
+ --cx-pressed-text: var(--color-primary);
816
+ }
817
+ html[data-theme="dark"], :host([data-theme="dark"]) {
818
+ --cx-pressed-tint: 25%;
819
+ --cx-pressed-text: var(--color-text);
820
+ }
821
+ @media (prefers-color-scheme: dark) {
822
+ :root:not([data-theme]), :host:not([data-theme]) {
823
+ --cx-pressed-tint: 25%;
824
+ --cx-pressed-text: var(--color-text);
825
+ }
826
+ }
827
+
828
+ /* Toggle Group — connected button border overrides.
829
+ Resets individual button radii using longhand properties to avoid
830
+ shorthand/longhand cascade interactions. z-index stacking for hover/focus/pressed.
831
+ overflow:hidden on edge buttons ensures hover bg clips to the rounded shape. */
832
+ [data-toggle-group] > button {
833
+ border-top-left-radius: 0; border-top-right-radius: 0;
834
+ border-bottom-left-radius: 0; border-bottom-right-radius: 0;
835
+ position: relative;
836
+ }
837
+ [data-toggle-group] > button:hover,
838
+ [data-toggle-group] > button:focus-visible { z-index: 1; }
839
+ [data-toggle-group] > button[data-pressed="true"] { z-index: 2; }
840
+
841
+ /* Toggle Group horizontal — border collapse + first/last radius.
842
+ Uses first-of-type/last-of-type (not first-child/last-child) because the
843
+ sliding indicator <span> is the first child in single-select mode.
844
+ No overflow:hidden — backgrounds clip to border-radius natively, and
845
+ overflow:hidden on edge buttons clips the sliding indicator behind them. */
846
+ [data-toggle-group][aria-orientation="horizontal"] > button + button { margin-left: -1px; }
847
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="rounded"] > button:first-of-type {
848
+ border-top-left-radius: var(--radius-lg, 0.5rem); border-bottom-left-radius: var(--radius-lg, 0.5rem); }
849
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="rounded"] > button:last-of-type {
850
+ border-top-right-radius: var(--radius-lg, 0.5rem); border-bottom-right-radius: var(--radius-lg, 0.5rem); }
851
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="pill"] > button:first-of-type {
852
+ border-top-left-radius: 9999px; border-bottom-left-radius: 9999px; }
853
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="pill"] > button:last-of-type {
854
+ border-top-right-radius: 9999px; border-bottom-right-radius: 9999px; }
855
+
856
+ /* Toggle Group vertical — border collapse + first/last radius */
857
+ [data-toggle-group][aria-orientation="vertical"] { flex-direction: column; }
858
+ [data-toggle-group][aria-orientation="vertical"] > button + button { margin-top: -1px; }
859
+ [data-toggle-group][aria-orientation="vertical"][data-shape="rounded"] > button:first-of-type {
860
+ border-top-left-radius: var(--radius-lg, 0.5rem); border-top-right-radius: var(--radius-lg, 0.5rem); }
861
+ [data-toggle-group][aria-orientation="vertical"][data-shape="rounded"] > button:last-of-type {
862
+ border-bottom-left-radius: var(--radius-lg, 0.5rem); border-bottom-right-radius: var(--radius-lg, 0.5rem); }
863
+ [data-toggle-group][aria-orientation="vertical"][data-shape="pill"] > button:first-of-type {
864
+ border-top-left-radius: 9999px; border-top-right-radius: 9999px; }
865
+ [data-toggle-group][aria-orientation="vertical"][data-shape="pill"] > button:last-of-type {
866
+ border-bottom-left-radius: 9999px; border-bottom-right-radius: 9999px; }
867
+
868
+ /* Toggle Group — pressed button text color.
869
+ !important overrides inline style="color:..." set by Button's StyleBundle.
870
+ Uses centralized --cx-pressed-text: primary in light, full-contrast text in dark.
871
+ Filled: inverse text stays bright on the indicator bg. */
872
+ [data-toggle-group] > button[data-pressed="true"] {
873
+ color: var(--cx-pressed-text) !important;
874
+ font-weight: 600 !important;
875
+ }
876
+ [data-toggle-group][data-variant="filled"] > button[data-pressed="true"] {
877
+ color: var(--color-inverse-text) !important;
878
+ font-weight: 600 !important;
879
+ }
880
+
881
+ /* Toggle Group — Filled variant: dim unpressed buttons so pressed stands out.
882
+ Creates clear visual hierarchy: pressed = full brightness, unpressed = dimmed.
883
+ Works in both light and dark modes. */
884
+ [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]) {
885
+ opacity: 0.7;
886
+ }
887
+
888
+ /* Toggle Group — in single mode, indicator provides the bg highlight.
889
+ Suppress button's own pressed bg AND hover bg to avoid double-paint.
890
+ !important overrides inline style="background-color:..." from Button. */
891
+ [data-toggle-group][data-toggle-mode="single"] > button[data-pressed="true"] {
892
+ background-color: transparent !important;
893
+ }
894
+ [data-toggle-group][data-toggle-mode="single"] > button[data-pressed="true"]:hover {
895
+ background-color: transparent !important;
896
+ }
897
+
898
+ /* Toggle Group — in multi mode, per-button pressed bg highlight.
899
+ !important overrides Button's inline style="background-color:...".
900
+ Uses centralized --cx-pressed-tint for theme-adaptive visibility.
901
+ Outline/Ghost: tinted primary bg. Filled: full primary shade. */
902
+ [data-toggle-group][data-toggle-mode="multiple"] > button[data-pressed="true"] {
903
+ background-color: color-mix(in oklch, var(--color-primary) var(--cx-pressed-tint, 15%), transparent) !important;
904
+ }
905
+ [data-toggle-group][data-variant="filled"][data-toggle-mode="multiple"] > button[data-pressed="true"] {
906
+ background-color: var(--color-primary) !important;
907
+ opacity: 1 !important;
908
+ }
909
+
910
+ /* Toggle Group — Filled hover: brightness tuned per theme.
911
+ Light mode: dark surfaces need strong 1.65 boost to show hover.
912
+ Dark mode: lighter surfaces only need subtle 1.25.
913
+ Uses html[data-theme] (specificity 0,0,1,1) which beats base rules
914
+ and works regardless of OS prefers-color-scheme. */
915
+ [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover {
916
+ filter: brightness(1.65);
917
+ opacity: 0.9;
918
+ }
919
+ [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator] {
920
+ filter: brightness(1.65);
921
+ }
922
+ html[data-theme="dark"] [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover,
923
+ :host([data-theme="dark"]) [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover {
924
+ filter: brightness(1.25);
925
+ opacity: 0.9;
926
+ }
927
+ html[data-theme="dark"] [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator],
928
+ :host([data-theme="dark"]) [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator] {
929
+ filter: brightness(1.25);
930
+ }
931
+ @media (prefers-color-scheme: dark) {
932
+ :root:not([data-theme]) [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover,
933
+ :host:not([data-theme]) [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover {
934
+ filter: brightness(1.25);
935
+ opacity: 0.9;
936
+ }
937
+ :root:not([data-theme]) [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator],
938
+ :host:not([data-theme]) [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator] {
939
+ filter: brightness(1.25);
940
+ }
941
+ }
942
+ [data-toggle-indicator] {
943
+ transition: filter var(--duration-fast) var(--ease-out);
944
+ }
945
+
946
+ /* Toggle Group — sliding indicator sweep (Spring easing, same as Tabs).
947
+ Uses --duration-slow (500ms) because Spring's fast attack makes shorter
948
+ durations feel instant — 500ms gives ~300ms of visible motion.
949
+ [data-ready] prevents transition on initial page load.
950
+ border-radius transitions to match the pressed button's computed radius. */
951
+ [data-toggle-indicator][data-ready] {
952
+ transition: left var(--duration-slow) var(--ease-spring),
953
+ top var(--duration-slow) var(--ease-spring),
954
+ width var(--duration-slow) var(--ease-spring),
955
+ height var(--duration-slow) var(--ease-spring),
956
+ border-radius var(--duration-slow) var(--ease-spring),
957
+ opacity var(--duration-fast) var(--ease-out);
958
+ }
959
+
960
+ /* Collapsible — panel height transition (grid-template-rows: 0fr -> 1fr).
961
+ Same animation technique as Accordion. Spring easing gives satisfying overshoot. */
962
+ [data-collapsible-panel] {
963
+ display: grid;
964
+ grid-template-rows: 1fr;
965
+ transition: grid-template-rows var(--duration-smooth) var(--ease-spring);
966
+ }
967
+ [data-collapsible-panel][data-collapsed] {
968
+ grid-template-rows: 0fr;
969
+ }
970
+ [data-collapsible-panel] > * {
971
+ overflow: hidden;
972
+ }
973
+
974
+ /* Collapsible — chevron rotation (Spring easing, -90deg -> 0deg on expand) */
975
+ [data-collapsible-trigger] [data-chevron] {
976
+ transition: transform var(--duration-normal) var(--ease-spring);
977
+ }
978
+ [data-collapsible-trigger][aria-expanded="false"] [data-chevron] {
979
+ transform: rotate(-90deg);
980
+ }
981
+
982
+ /* Collapsible — trigger text/bg color transitions */
983
+ [data-collapsible-trigger] {
984
+ transition: color var(--duration-fast) var(--ease-out),
985
+ background-color var(--duration-fast) var(--ease-out);
986
+ }
987
+ /* Collapsible — trigger hover/active */
988
+ [data-collapsible-trigger]:not([disabled]):hover {
989
+ background-color: var(--color-secondary);
990
+ }
991
+ [data-collapsible-trigger]:not([disabled]):active {
992
+ background-color: var(--color-secondary-hover);
993
+ }
994
+
995
+ /* Activity/tool expand chevron — hidden by default, revealed on hover.
996
+ Uses Icon::ChevronRight, rotates 90deg when expanded. */
997
+ [data-collapsible-trigger] [data-expand] {
998
+ opacity: 0;
999
+ transition: opacity var(--duration-fast) var(--ease-out),
1000
+ transform var(--duration-normal) var(--ease-spring);
1001
+ }
1002
+ [data-collapsible-trigger]:hover [data-expand],
1003
+ [data-collapsible-trigger][aria-expanded="true"] [data-expand] {
1004
+ opacity: 1;
1005
+ }
1006
+ [data-collapsible-trigger][aria-expanded="true"] [data-expand] {
1007
+ transform: rotate(90deg);
1008
+ }
1009
+
1010
+ /* Thinking — shimmer text sweep animation.
1011
+ A gradient sweeps left-to-right across the text using background-clip: text.
1012
+ Ghost uses text color vars; Filled uses inverse-text color vars. */
1013
+ @keyframes cx-shimmer {
1014
+ from { background-position: 200% center; }
1015
+ to { background-position: -200% center; }
1016
+ }
1017
+ .cx-thinking-ghost {
1018
+ background: linear-gradient(90deg,
1019
+ color-mix(in oklch, var(--color-text) 20%, transparent),
1020
+ var(--color-text),
1021
+ color-mix(in oklch, var(--color-text) 20%, transparent));
1022
+ background-size: 200% 100%;
1023
+ -webkit-background-clip: text;
1024
+ background-clip: text;
1025
+ color: transparent;
1026
+ animation: cx-shimmer var(--cx-thinking-speed, 3.1s) linear infinite;
1027
+ }
1028
+ .cx-thinking-filled {
1029
+ background: linear-gradient(90deg,
1030
+ color-mix(in oklch, var(--color-inverse-text) 40%, transparent),
1031
+ var(--color-inverse-text),
1032
+ color-mix(in oklch, var(--color-inverse-text) 40%, transparent));
1033
+ background-size: 200% 100%;
1034
+ -webkit-background-clip: text;
1035
+ background-clip: text;
1036
+ color: transparent;
1037
+ animation: cx-shimmer var(--cx-thinking-speed, 3.1s) linear infinite;
1038
+ }
1039
+
1040
+ /* SearchBar — hide native browser clear/cancel button on type="search" inputs.
1041
+ We render our own clear button with proper styling and accessibility. */
1042
+ input[type="search"]::-webkit-search-cancel-button,
1043
+ input[type="search"]::-webkit-search-decoration {
1044
+ -webkit-appearance: none;
1045
+ appearance: none;
1046
+ display: none;
1047
+ }
1048
+
1049
+ /* SearchBar — one-shot focus shimmer on placeholder text.
1050
+ Dedicated keyframes with a tight sweep range (100% → -100%) so the bright
1051
+ spot crosses the visible text exactly once, left to right. Uses the same
1052
+ background-clip:text technique as Thinking but with a sharper gradient
1053
+ falloff for a cleaner single pass. JS adds the class on focusin and
1054
+ removes it on animationend, with a 10-second cooldown. */
1055
+ @keyframes cx-search-shimmer {
1056
+ 0% {
1057
+ background-position: 100% center;
1058
+ color: transparent;
1059
+ -webkit-background-clip: text;
1060
+ background-clip: text;
1061
+ }
1062
+ 90% {
1063
+ background-position: 0% center;
1064
+ color: transparent;
1065
+ -webkit-background-clip: text;
1066
+ background-clip: text;
1067
+ }
1068
+ 100% {
1069
+ color: var(--color-text-muted);
1070
+ background: none;
1071
+ }
1072
+ }
1073
+ [data-search-shimmer] .cx-search-shimmer-text {
1074
+ background: linear-gradient(90deg,
1075
+ transparent 0%,
1076
+ transparent 42%,
1077
+ color-mix(in oklch, var(--color-text) 30%, transparent) 46%,
1078
+ var(--color-text) 50%,
1079
+ color-mix(in oklch, var(--color-text) 30%, transparent) 54%,
1080
+ transparent 58%,
1081
+ transparent 100%);
1082
+ background-size: 300% 100%;
1083
+ animation: cx-search-shimmer 2.7s linear 1 forwards;
1084
+ }
1085
+
1086
+ /* Message — spring entrance animation for chat messages.
1087
+ Used by MessageBubble (single) and MessageGroup (staggered). */
1088
+ @keyframes cx-message-enter {
1089
+ from {
1090
+ opacity: 0;
1091
+ transform: translateY(8px) scale(0.98);
1092
+ }
1093
+ to {
1094
+ opacity: 1;
1095
+ transform: translateY(0) scale(1);
1096
+ }
1097
+ }
1098
+ .cx-message-enter {
1099
+ animation: cx-message-enter var(--duration-smooth) var(--ease-spring) both;
1100
+ }
1101
+ /* Staggered entrance for grouped message parts */
1102
+ .cx-message-group > [data-connection] {
1103
+ animation: cx-message-enter var(--duration-smooth) var(--ease-spring) both;
1104
+ }
1105
+ .cx-message-group > :nth-child(1) { animation-delay: 0ms; }
1106
+ .cx-message-group > :nth-child(2) { animation-delay: 50ms; }
1107
+ .cx-message-group > :nth-child(3) { animation-delay: 100ms; }
1108
+ .cx-message-group > :nth-child(4) { animation-delay: 150ms; }
1109
+ .cx-message-group > :nth-child(5) { animation-delay: 200ms; }
1110
+ .cx-message-group > :nth-child(6) { animation-delay: 250ms; }
1111
+ .cx-message-group > :nth-child(7) { animation-delay: 300ms; }
1112
+ .cx-message-group > :nth-child(8) { animation-delay: 350ms; }
1113
+ .cx-message-group > :nth-child(9) { animation-delay: 400ms; }
1114
+ .cx-message-group > :nth-child(10) { animation-delay: 450ms; }
1115
+
1116
+ /* Streaming cursor — blinking caret for streaming markdown content.
1117
+ Appears at the end of the text during token arrival, removed on stream end.
1118
+ Essential loading feedback — retains animation under reduced-motion. */
1119
+ .cx-stream-cursor {
1120
+ display: inline-block;
1121
+ width: 2px;
1122
+ height: 1.1em;
1123
+ background: currentColor;
1124
+ vertical-align: text-bottom;
1125
+ margin-left: 1px;
1126
+ animation: cx-cursor-blink 1s step-end infinite;
1127
+ }
1128
+ @keyframes cx-cursor-blink {
1129
+ 50% { opacity: 0; }
1130
+ }
1131
+
1132
+ @media (prefers-reduced-motion: reduce) {
1133
+ dialog[data-dialog]::backdrop,
1134
+ dialog[data-dialog][data-open] [data-dialog-panel],
1135
+ dialog[data-dialog][data-closing] [data-dialog-panel],
1136
+ dialog[data-dialog][data-closing]::backdrop,
1137
+ [data-toast][data-open],
1138
+ [data-toast][data-closing],
1139
+ .animate-progress-indeterminate {
1140
+ animation: none;
1141
+ }
1142
+ /* Message — disable entrance animation */
1143
+ .cx-message-enter,
1144
+ .cx-message-group > [data-connection],
1145
+ .cx-message-group > * {
1146
+ animation: none;
1147
+ opacity: 1;
1148
+ transform: none;
1149
+ }
1150
+ /* Thinking — stop animation, show static text */
1151
+ .cx-thinking-ghost {
1152
+ animation: none;
1153
+ background: none;
1154
+ -webkit-background-clip: unset;
1155
+ background-clip: unset;
1156
+ color: var(--color-text-muted);
1157
+ }
1158
+ .cx-thinking-filled {
1159
+ animation: none;
1160
+ background: none;
1161
+ -webkit-background-clip: unset;
1162
+ background-clip: unset;
1163
+ color: var(--color-inverse-text);
1164
+ }
1165
+ /* SearchBar — disable shimmer sweep */
1166
+ [data-search-shimmer] .cx-search-shimmer-text {
1167
+ animation: none;
1168
+ background: none;
1169
+ -webkit-background-clip: unset;
1170
+ background-clip: unset;
1171
+ color: var(--color-text-muted);
1172
+ }
1173
+ }
1174
+
1175
+ /* ─── Slider Cross-Browser Styling ─── */
1176
+ /* Native <input type="range"> with appearance-none requires vendor
1177
+ pseudo-elements for track, thumb, and fill. CSS custom properties
1178
+ set inline by render.rs drive all dimensions and radii. */
1179
+
1180
+ /* WebKit (Chrome, Safari, Edge) — track */
1181
+ input[data-slider]::-webkit-slider-runnable-track {
1182
+ height: var(--slider-track-h);
1183
+ border-radius: var(--slider-track-r);
1184
+ background: linear-gradient(
1185
+ to right,
1186
+ var(--slider-fill) calc(var(--slider-percent) * 1%),
1187
+ var(--color-border) calc(var(--slider-percent) * 1%)
1188
+ );
1189
+ }
1190
+
1191
+ /* WebKit — thumb */
1192
+ input[data-slider]::-webkit-slider-thumb {
1193
+ -webkit-appearance: none;
1194
+ appearance: none;
1195
+ width: var(--slider-thumb-sz);
1196
+ height: var(--slider-thumb-sz);
1197
+ border-radius: var(--slider-thumb-r);
1198
+ background: var(--color-surface);
1199
+ border: 2px solid var(--slider-fill);
1200
+ box-shadow: 0 1px 3px oklch(0 0 0 / 0.15);
1201
+ margin-top: calc((var(--slider-track-h) - var(--slider-thumb-sz)) / 2);
1202
+ cursor: pointer;
1203
+ transition: transform var(--duration-normal) var(--ease-spring),
1204
+ box-shadow var(--duration-fast) var(--ease-out);
1205
+ }
1206
+ input[data-slider]:hover::-webkit-slider-thumb {
1207
+ transform: scale(1.15);
1208
+ box-shadow: 0 2px 6px oklch(0 0 0 / 0.2);
1209
+ }
1210
+ input[data-slider]:active::-webkit-slider-thumb {
1211
+ transform: scale(0.95);
1212
+ }
1213
+
1214
+ /* Firefox — track (unfilled portion) */
1215
+ input[data-slider]::-moz-range-track {
1216
+ height: var(--slider-track-h);
1217
+ border-radius: var(--slider-track-r);
1218
+ background: var(--color-border);
1219
+ border: none;
1220
+ }
1221
+
1222
+ /* Firefox — fill (filled portion, native pseudo) */
1223
+ input[data-slider]::-moz-range-progress {
1224
+ height: var(--slider-track-h);
1225
+ border-radius: var(--slider-track-r);
1226
+ background: var(--slider-fill);
1227
+ }
1228
+
1229
+ /* Firefox — thumb */
1230
+ input[data-slider]::-moz-range-thumb {
1231
+ width: var(--slider-thumb-sz);
1232
+ height: var(--slider-thumb-sz);
1233
+ border-radius: var(--slider-thumb-r);
1234
+ background: var(--color-surface);
1235
+ border: 2px solid var(--slider-fill);
1236
+ box-shadow: 0 1px 3px oklch(0 0 0 / 0.15);
1237
+ cursor: pointer;
1238
+ transition: transform var(--duration-normal) var(--ease-spring),
1239
+ box-shadow var(--duration-fast) var(--ease-out);
1240
+ }
1241
+ input[data-slider]:hover::-moz-range-thumb {
1242
+ transform: scale(1.15);
1243
+ box-shadow: 0 2px 6px oklch(0 0 0 / 0.2);
1244
+ }
1245
+ input[data-slider]:active::-moz-range-thumb {
1246
+ transform: scale(0.95);
1247
+ }
1248
+
1249
+ /* Disabled slider — reduced opacity on thumb/track */
1250
+ input[data-slider]:disabled::-webkit-slider-thumb {
1251
+ cursor: not-allowed;
1252
+ }
1253
+ input[data-slider]:disabled::-moz-range-thumb {
1254
+ cursor: not-allowed;
1255
+ }
1256
+
1257
+ /* Reduced motion — disable thumb scale transitions */
1258
+ @media (prefers-reduced-motion: reduce) {
1259
+ input[data-slider]::-webkit-slider-thumb,
1260
+ input[data-slider]::-moz-range-thumb {
1261
+ transition: none;
1262
+ }
1263
+ input[data-slider]:hover::-webkit-slider-thumb,
1264
+ input[data-slider]:hover::-moz-range-thumb {
1265
+ transform: none;
1266
+ }
1267
+ }
1268
+
1269
+ /* ─── Scrollbar Theming ─── */
1270
+
1271
+ /* Custom property overrides — consumers can set these anywhere.
1272
+ --scrollbar-thumb: thumb color (default: --color-text-muted)
1273
+ --scrollbar-track: track color (default: transparent)
1274
+ --scrollbar-idle-opacity: opacity when idle/scrolling (default: 0.2)
1275
+ --scrollbar-hover-opacity: opacity on container hover (default: 1)
1276
+ */
1277
+
1278
+ /* Global: thin themed scrollbars with idle opacity.
1279
+ Uses color-mix to apply the idle opacity to the thumb color.
1280
+ Skipped when --scrollbar-native is set or on [data-scrollbar-native] elements. */
1281
+ :root:not([data-scrollbar-native]) {
1282
+ scrollbar-width: thin;
1283
+ scrollbar-color:
1284
+ color-mix(in oklch, var(--scrollbar-thumb, var(--color-text-muted)) calc(var(--scrollbar-idle-opacity, 0.2) * 100%), transparent)
1285
+ var(--scrollbar-track, transparent);
1286
+ }
1287
+
1288
+ /* Full opacity when hovering over ANY scrollable container. */
1289
+ :root:not([data-scrollbar-native]) *:hover {
1290
+ scrollbar-color:
1291
+ var(--scrollbar-thumb, var(--color-text-muted))
1292
+ var(--scrollbar-track, transparent);
1293
+ }
1294
+
1295
+ /* Per-element opt-out: restore native scrollbar */
1296
+ [data-scrollbar-native],
1297
+ [data-scrollbar-native] * {
1298
+ scrollbar-width: auto !important;
1299
+ scrollbar-color: auto !important;
1300
+ }
1301
+
1302
+ /* Utility: completely hide native scrollbar (used by Scrollbar component).
1303
+ Content remains scrollable via overflow. */
1304
+ .scrollbar-none {
1305
+ scrollbar-width: none;
1306
+ }
1307
+ .scrollbar-none::-webkit-scrollbar {
1308
+ display: none;
1309
+ }
1310
+
1311
+ /* Keyboard focus indicator on the scrollable viewport (WCAG 2.2 AA). */
1312
+ [data-scrollbar-viewport]:focus-visible {
1313
+ outline: 2px solid var(--color-ring, currentColor);
1314
+ outline-offset: -2px;
1315
+ }
1316
+
1317
+ /* ─── Custom Scrollbar Component States ─── */
1318
+
1319
+ /* Thumb interaction states — driven by data attributes from behavior module.
1320
+ CSS-only fallback: visible at idle opacity with approximate sizing.
1321
+ JS-enhanced (data-scrollbar-ready): hidden until scroll/hover/drag. */
1322
+
1323
+ [data-scrollbar] [data-scrollbar-thumb],
1324
+ [data-scrollbar] [data-scrollbar-thumb="y"],
1325
+ [data-scrollbar] [data-scrollbar-thumb="x"] {
1326
+ opacity: var(--scrollbar-idle-opacity, 0.2);
1327
+ transition: opacity var(--duration-fast, 150ms) var(--ease-out, ease-out),
1328
+ width var(--duration-fastest, 75ms) var(--ease-out, ease-out);
1329
+ }
1330
+
1331
+ /* CSS-only fallback sizing — overridden by JS inline styles */
1332
+ [data-scrollbar][data-scrollbar-axis="y"] [data-scrollbar-thumb],
1333
+ [data-scrollbar] [data-scrollbar-thumb="y"] {
1334
+ height: 30%;
1335
+ min-height: 20px;
1336
+ }
1337
+ [data-scrollbar][data-scrollbar-axis="x"] [data-scrollbar-thumb],
1338
+ [data-scrollbar] [data-scrollbar-thumb="x"] {
1339
+ width: 30%;
1340
+ min-width: 20px;
1341
+ }
1342
+
1343
+ /* JS-enhanced: hide thumb when idle (behavior module manages visibility) */
1344
+ [data-scrollbar][data-scrollbar-ready] [data-scrollbar-thumb],
1345
+ [data-scrollbar][data-scrollbar-ready] [data-scrollbar-thumb="y"],
1346
+ [data-scrollbar][data-scrollbar-ready] [data-scrollbar-thumb="x"] {
1347
+ opacity: 0;
1348
+ }
1349
+
1350
+ /* Scrolling: thumb fades in at idle opacity */
1351
+ [data-scrollbar][data-scrolling] [data-scrollbar-thumb],
1352
+ [data-scrollbar][data-scrolling] [data-scrollbar-thumb="y"],
1353
+ [data-scrollbar][data-scrolling] [data-scrollbar-thumb="x"] {
1354
+ opacity: var(--scrollbar-idle-opacity, 0.2);
1355
+ }
1356
+
1357
+ /* Hovering over the scrollbar track area: full opacity */
1358
+ [data-scrollbar][data-scroll-hover] [data-scrollbar-thumb],
1359
+ [data-scrollbar][data-scroll-hover] [data-scrollbar-thumb="y"],
1360
+ [data-scrollbar][data-scroll-hover] [data-scrollbar-thumb="x"] {
1361
+ opacity: var(--scrollbar-hover-opacity, 1);
1362
+ }
1363
+
1364
+ /* Actively dragging the thumb: full opacity */
1365
+ [data-scrollbar][data-scroll-active] [data-scrollbar-thumb],
1366
+ [data-scrollbar][data-scroll-active] [data-scrollbar-thumb="y"],
1367
+ [data-scrollbar][data-scroll-active] [data-scrollbar-thumb="x"] {
1368
+ opacity: var(--scrollbar-hover-opacity, 1);
1369
+ }
1370
+
1371
+ /* Reduced motion: instant transitions */
1372
+ @media (prefers-reduced-motion: reduce) {
1373
+ [data-scrollbar] [data-scrollbar-thumb],
1374
+ [data-scrollbar] [data-scrollbar-thumb="y"],
1375
+ [data-scrollbar] [data-scrollbar-thumb="x"] {
1376
+ transition: none;
1377
+ }
1378
+ }
1379
+
1380
+
1381
+
1382
+ /* Touch devices: hide custom scrollbar, let native overlay handle it.
1383
+ pointer:coarse targets the input method (touch), not screen size —
1384
+ a 12" iPad still gets native scrollbars while a 768px desktop keeps
1385
+ the custom ones. Native mobile overlay scrollbars have momentum,
1386
+ edge bounce, and auto-hide — strictly better UX than a custom thumb
1387
+ on touch. */
1388
+ @media (pointer: coarse) {
1389
+ [data-scrollbar] [data-scrollbar-track],
1390
+ [data-scrollbar] [data-scrollbar-track="y"],
1391
+ [data-scrollbar] [data-scrollbar-track="x"] {
1392
+ display: none !important;
1393
+ }
1394
+ [data-scrollbar] [data-scrollbar-viewport] {
1395
+ padding-right: 0 !important;
1396
+ padding-bottom: 0 !important;
1397
+ }
1398
+ }
1399
+
1400
+ /* ─── Texture Grain System ─── */
1401
+
1402
+ /* Opt-in noise overlay — add \`cx-texture\` class to any element.
1403
+ Uses SVG feTurbulence for organic, resolution-independent grain.
1404
+
1405
+ Custom properties:
1406
+ --texture-opacity: grain visibility (light: 0.12, dark: 0.18)
1407
+ --texture-url: swap to a custom noise image/SVG
1408
+
1409
+ Usage:
1410
+ <div class="cx-texture"> ... </div>
1411
+ style="--texture-opacity: 0.2" (stronger grain)
1412
+ style="--texture-url: url(my-noise.svg)" (custom pattern)
1413
+ */
1414
+
1415
+ .cx-texture {
1416
+ position: relative;
1417
+ }
1418
+
1419
+ .cx-texture::after {
1420
+ content: '';
1421
+ position: absolute;
1422
+ inset: 0;
1423
+ background-image: var(--texture-url, url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/></filter><rect width='200' height='200' filter='url(%23n)' opacity='1'/></svg>"));
1424
+ background-repeat: repeat;
1425
+ background-size: 200px 200px;
1426
+ opacity: var(--texture-opacity, 0.12);
1427
+ pointer-events: none;
1428
+ z-index: 1;
1429
+ border-radius: inherit;
1430
+ mix-blend-mode: multiply;
1431
+ }
1432
+
1433
+ /* Ensure card content stays above the grain overlay */
1434
+ .cx-texture > * {
1435
+ position: relative;
1436
+ z-index: 2;
1437
+ }
1438
+
1439
+ /* Dark theme: stronger grain + additive blend for visibility on dark surfaces */
1440
+ [data-theme="dark"] .cx-texture::after,
1441
+ @media (prefers-color-scheme: dark) {
1442
+ :root:not([data-theme="light"]) .cx-texture::after {
1443
+ opacity: var(--texture-opacity, 0.18);
1444
+ mix-blend-mode: soft-light;
1445
+ }
1446
+ }
1447
+
1448
+ /* Reduced motion: disable blend mode animation (static grain is fine) */
1449
+ @media (prefers-reduced-motion: reduce) {
1450
+ .cx-texture::after {
1451
+ animation: none;
1452
+ }
1453
+ }
1454
+
1455
+ /* ─── Prose Typography ─── */
1456
+ /* Styles for rendered GFM markdown content (.cx-prose wrapper).
1457
+ All colors use CSS vars for theme compatibility. */
1458
+
1459
+ .cx-prose {
1460
+ line-height: 1.7;
1461
+ word-wrap: break-word;
1462
+ overflow-wrap: break-word;
1463
+ }
1464
+
1465
+ /* Headings */
1466
+ .cx-prose h1 { font-size: 1.875rem; font-weight: 700; margin: 1.5rem 0 0.75rem; line-height: 1.2; }
1467
+ .cx-prose h2 { font-size: 1.5rem; font-weight: 600; margin: 1.25rem 0 0.625rem; line-height: 1.25; }
1468
+ .cx-prose h3 { font-size: 1.25rem; font-weight: 600; margin: 1rem 0 0.5rem; line-height: 1.3; }
1469
+ .cx-prose h4 { font-size: 1.125rem; font-weight: 600; margin: 0.875rem 0 0.375rem; line-height: 1.35; }
1470
+ .cx-prose h5 { font-size: 1rem; font-weight: 600; margin: 0.75rem 0 0.25rem; line-height: 1.4; }
1471
+ .cx-prose h6 { font-size: 0.875rem; font-weight: 600; margin: 0.75rem 0 0.25rem; line-height: 1.4; opacity: 0.8; }
1472
+ .cx-prose :first-child { margin-top: 0; }
1473
+
1474
+ /* Paragraphs */
1475
+ .cx-prose p { margin: 0 0 0.75rem; }
1476
+ .cx-prose p:last-child { margin-bottom: 0; }
1477
+
1478
+ /* Lists */
1479
+ .cx-prose ul { list-style-type: disc; padding-left: 1.5rem; margin: 0 0 0.75rem; }
1480
+ .cx-prose ol { list-style-type: decimal; padding-left: 1.5rem; margin: 0 0 0.75rem; }
1481
+ .cx-prose li { margin: 0.125rem 0; }
1482
+ .cx-prose li > ul, .cx-prose li > ol { margin: 0.25rem 0; }
1483
+ .cx-prose ul ul { list-style-type: circle; }
1484
+ .cx-prose ul ul ul { list-style-type: square; }
1485
+
1486
+ /* Task lists — remove bullet, align checkbox */
1487
+ .cx-prose ul:has(> li > input[type="checkbox"]) { list-style: none; padding-left: 0.25rem; }
1488
+ .cx-prose li > input[type="checkbox"] { margin-right: 0.5rem; vertical-align: middle; }
1489
+
1490
+ /* Tables */
1491
+ .cx-prose table { border-collapse: collapse; width: 100%; margin: 0.75rem 0; font-size: 0.875rem; }
1492
+ .cx-prose thead th {
1493
+ text-align: left; font-weight: 600; padding: 0.5rem 0.75rem;
1494
+ border-bottom: 2px solid var(--color-border);
1495
+ }
1496
+ .cx-prose tbody td { padding: 0.375rem 0.75rem; border-bottom: 1px solid var(--color-border); }
1497
+ .cx-prose tbody tr:last-child td { border-bottom: none; }
1498
+
1499
+ /* Inline code */
1500
+ .cx-prose code {
1501
+ font-family: var(--font-mono);
1502
+ font-size: 0.85em;
1503
+ padding: 0.15em 0.35em;
1504
+ border-radius: 0.25rem;
1505
+ background: var(--color-surface);
1506
+ }
1507
+
1508
+ /* Fenced code blocks — reset inline code styles inside pre */
1509
+ .cx-prose pre {
1510
+ margin: 0.75rem 0;
1511
+ padding: 0.875rem 1rem;
1512
+ border-radius: 0.5rem;
1513
+ overflow-x: auto;
1514
+ background: var(--color-inverse-surface);
1515
+ color: var(--color-inverse-text);
1516
+ }
1517
+ .cx-prose pre code {
1518
+ font-family: var(--font-mono);
1519
+ font-size: 0.8125rem;
1520
+ padding: 0;
1521
+ border-radius: 0;
1522
+ background: transparent;
1523
+ color: inherit;
1524
+ white-space: pre;
1525
+ }
1526
+
1527
+ /* Blockquotes */
1528
+ .cx-prose blockquote {
1529
+ border-left: 3px solid var(--color-border);
1530
+ padding: 0.25rem 0 0.25rem 1rem;
1531
+ margin: 0.75rem 0;
1532
+ opacity: 0.85;
1533
+ }
1534
+ .cx-prose blockquote p:last-child { margin-bottom: 0; }
1535
+
1536
+ /* Links */
1537
+ .cx-prose a {
1538
+ color: var(--color-primary);
1539
+ text-decoration: underline;
1540
+ text-underline-offset: 2px;
1541
+ text-decoration-thickness: 1px;
1542
+ }
1543
+ .cx-prose a:hover { text-decoration-thickness: 2px; }
1544
+
1545
+ /* Horizontal rules */
1546
+ .cx-prose hr {
1547
+ border: none;
1548
+ border-top: 1px solid var(--color-border);
1549
+ margin: 1.25rem 0;
1550
+ }
1551
+
1552
+ /* Images */
1553
+ .cx-prose img { max-width: 100%; height: auto; border-radius: 0.375rem; margin: 0.5rem 0; }
1554
+
1555
+ /* Strong + emphasis */
1556
+ .cx-prose strong { font-weight: 600; }
1557
+ .cx-prose em { font-style: italic; }
1558
+ .cx-prose del { text-decoration: line-through; opacity: 0.7; }
1559
+
1560
+ /* Footnotes */
1561
+ .cx-prose .footnote-definition { font-size: 0.8125rem; opacity: 0.8; margin-top: 1rem; }
1562
+ .cx-prose sup { font-size: 0.75em; }
1563
+
1564
+ @view-transition { navigation: auto; }
1565
+ `;
1566
+ export const TOKENS_SHADOW_CSS = `/* ═══════════════════════════════════════════
1567
+ SHADOW DOM TOKENS — Auto-generated from Rust
1568
+ Subset of tokens.css for adopted stylesheets.
1569
+ CSS vars inherit from document <head>.
1570
+ Do NOT edit manually. Change the Rust enums.
1571
+ ═══════════════════════════════════════════ */
1572
+
1573
+
1574
+ /* ─── Keyframe Animations ─── */
1575
+
1576
+ @keyframes fade-in { from { opacity: 0; }to { opacity: 1; } }
1577
+
1578
+ @keyframes fade-out { from { opacity: 1; }to { opacity: 0; } }
1579
+
1580
+ @keyframes slide-in-up { from { opacity: 0; transform: translateY(8px); }to { opacity: 1; transform: translateY(0); } }
1581
+
1582
+ @keyframes slide-in-down { from { opacity: 0; transform: translateY(-8px); }to { opacity: 1; transform: translateY(0); } }
1583
+
1584
+ @keyframes slide-in-left { from { opacity: 0; transform: translateX(-8px); }to { opacity: 1; transform: translateX(0); } }
1585
+
1586
+ @keyframes slide-in-right { from { opacity: 0; transform: translateX(8px); }to { opacity: 1; transform: translateX(0); } }
1587
+
1588
+ @keyframes scale-in { from { opacity: 0; transform: scale(0.95); }to { opacity: 1; transform: scale(1); } }
1589
+
1590
+ @keyframes scale-out { from { opacity: 1; transform: scale(1); }to { opacity: 0; transform: scale(0.95); } }
1591
+
1592
+ @keyframes slide-out-up { from { opacity: 1; transform: translateY(0); }to { opacity: 0; transform: translateY(-8px); } }
1593
+
1594
+ @keyframes slide-out-down { from { opacity: 1; transform: translateY(0); }to { opacity: 0; transform: translateY(8px); } }
1595
+
1596
+ @keyframes expand-height { from { opacity: 0; max-height: 0; overflow: hidden; }to { opacity: 1; max-height: var(--expand-to, 500px); overflow: hidden; } }
1597
+
1598
+ @keyframes collapse-height { from { opacity: 1; max-height: var(--expand-to, 500px); overflow: hidden; }to { opacity: 0; max-height: 0; overflow: hidden; } }
1599
+
1600
+ @keyframes spin { from { transform: rotate(0deg); }to { transform: rotate(360deg); } }
1601
+
1602
+ @keyframes pulse { 0%, 100% { opacity: 1; }50% { opacity: 0.5; } }
1603
+
1604
+ @keyframes bounce { 0%, 100% { transform: translateY(0); }50% { transform: translateY(-4px); } }
1605
+
1606
+
1607
+
1608
+ /* ─── Interactive Utilities ─── */
1609
+
1610
+ /* CSS-only press ripple — add class="ripple" to any interactive element.
1611
+ Uses ::after pseudo-element with radial-gradient.
1612
+ The ripple color inherits from currentColor (adapts to theme). */
1613
+ .ripple {
1614
+ position: relative;
1615
+ overflow: hidden;
1616
+ }
1617
+ .ripple::after {
1618
+ content: '';
1619
+ display: block;
1620
+ position: absolute;
1621
+ width: 100%;
1622
+ height: 100%;
1623
+ top: 0;
1624
+ left: 0;
1625
+ pointer-events: none;
1626
+ background-image: radial-gradient(circle, currentColor 10%, transparent 10.01%);
1627
+ background-repeat: no-repeat;
1628
+ background-position: 50%;
1629
+ transform: scale(10, 10);
1630
+ opacity: 0;
1631
+ transition: transform 0.3s, opacity 0.5s;
1632
+ }
1633
+ .ripple:active::after {
1634
+ transform: scale(0, 0);
1635
+ opacity: 0.1;
1636
+ transition: 0s;
1637
+ }
1638
+
1639
+ @media (prefers-reduced-motion: reduce) {
1640
+ :root {
1641
+ --duration-instant: 0ms;
1642
+ --duration-fastest: 0.01ms;
1643
+ --duration-fast: 0.01ms;
1644
+ --duration-normal: 0.01ms;
1645
+ --duration-smooth: 0.01ms;
1646
+ --duration-slow: 0.01ms;
1647
+ --duration-slowest: 0.01ms;
1648
+ --ease-spring: linear;
1649
+ --ease-bounce: linear;
1650
+ --ease-snappy: linear;
1651
+ }
1652
+ *, *::before, *::after {
1653
+ animation-duration: 0.01ms !important;
1654
+ animation-iteration-count: 1 !important;
1655
+ scroll-behavior: auto !important;
1656
+ }
1657
+ ::view-transition-group(*),
1658
+ ::view-transition-old(*),
1659
+ ::view-transition-new(*) {
1660
+ animation-duration: 0.01ms !important;
1661
+ }
1662
+ }
1663
+
1664
+ /* ─── Component Motion ─── */
1665
+ /* Spring scale for checkbox/radio indicators on state change.
1666
+ Background fills first (100ms EaseOut via transition-colors),
1667
+ then the check/dot springs in (300ms Spring with overshoot). */
1668
+
1669
+ input.peer + [aria-hidden="true"] > svg {
1670
+ transform: scale(0);
1671
+ transition: transform var(--duration-smooth) var(--ease-spring);
1672
+ }
1673
+ input.peer:checked + [aria-hidden="true"] > svg {
1674
+ transform: scale(1);
1675
+ }
1676
+ /* Indeterminate checkbox — show dash at full scale */
1677
+ [data-state="indeterminate"] > svg {
1678
+ transform: scale(1);
1679
+ }
1680
+
1681
+ /* Switch thumb — spring slide on toggle.
1682
+ The thumb translateX is set via inline classes; this rule
1683
+ adds spring easing so the slide overshoots slightly. */
1684
+ button[role="switch"] > span[aria-hidden="true"] {
1685
+ transition: transform var(--duration-smooth) var(--ease-spring);
1686
+ }
1687
+ /* Switch track — smooth color transition (EaseOut, not Spring).
1688
+ Spring on color looks wrong; EaseOut gives a clean fill. */
1689
+ button[role="switch"] {
1690
+ transition: background-color var(--duration-fast) var(--ease-out),
1691
+ border-color var(--duration-fast) var(--ease-out);
1692
+ }
1693
+
1694
+ /* Tooltip — spring entrance + smooth exit via CSS group-hover/focus-within.
1695
+ Opacity fades fast (EaseOut, no overshoot), translate/scale spring with
1696
+ satisfying overshoot. Individual transform properties (not shorthand)
1697
+ match Tailwind v4's output for correct transition targeting. */
1698
+ .group\\/tooltip [role="tooltip"] {
1699
+ transition: opacity var(--duration-fast) var(--ease-out),
1700
+ visibility var(--duration-fast) var(--ease-out),
1701
+ translate var(--duration-smooth) var(--ease-spring),
1702
+ scale var(--duration-smooth) var(--ease-spring);
1703
+ }
1704
+
1705
+ /* Shared floating tooltip — JS-enhanced, slides between triggers.
1706
+ Positioned via CSS custom properties (--tt-x, --tt-y) set by
1707
+ tooltip.js. Spring-eased translate creates fluid movement when
1708
+ the tooltip slides between adjacent triggers. */
1709
+ [data-tooltip-floating] {
1710
+ position: fixed;
1711
+ inset: 0 auto auto 0;
1712
+ translate: var(--tt-x, 0) var(--tt-y, 0);
1713
+ scale: 0.96;
1714
+ opacity: 0;
1715
+ pointer-events: none;
1716
+ z-index: 50;
1717
+ max-width: min(300px, 90vw);
1718
+ white-space: normal;
1719
+ word-wrap: break-word;
1720
+ transition: translate var(--duration-smooth) var(--ease-spring),
1721
+ scale var(--duration-fast) var(--ease-spring),
1722
+ opacity var(--duration-fast) var(--ease-out);
1723
+ }
1724
+ [data-tooltip-floating][data-open] {
1725
+ scale: 1;
1726
+ opacity: 1;
1727
+ pointer-events: auto;
1728
+ }
1729
+
1730
+ /* Progressive enhancement: per-trigger tooltips become sr-only
1731
+ when the behavior module activates the shared floating tooltip.
1732
+ aria-describedby still references these elements for screen readers. */
1733
+ [data-tooltip-enhanced] [data-tooltip-wrapper] [role="tooltip"] {
1734
+ position: absolute !important;
1735
+ width: 1px !important;
1736
+ height: 1px !important;
1737
+ padding: 0 !important;
1738
+ margin: -1px !important;
1739
+ overflow: hidden !important;
1740
+ clip: rect(0, 0, 0, 0) !important;
1741
+ white-space: nowrap !important;
1742
+ border-width: 0 !important;
1743
+ }
1744
+
1745
+ /* Arrow positioning by data-placement — the rotated square
1746
+ tracks the trigger center via --tt-arrow-x / --tt-arrow-y. */
1747
+ [data-tooltip-floating] [data-tooltip-arrow-el] {
1748
+ position: absolute;
1749
+ width: 8px;
1750
+ height: 8px;
1751
+ background: inherit;
1752
+ transform: rotate(45deg);
1753
+ }
1754
+ [data-tooltip-floating][data-placement="top"] [data-tooltip-arrow-el] {
1755
+ bottom: -4px;
1756
+ left: var(--tt-arrow-x, 50%);
1757
+ transform: translateX(-50%) rotate(45deg);
1758
+ }
1759
+ [data-tooltip-floating][data-placement="bottom"] [data-tooltip-arrow-el] {
1760
+ top: -4px;
1761
+ left: var(--tt-arrow-x, 50%);
1762
+ transform: translateX(-50%) rotate(45deg);
1763
+ }
1764
+ [data-tooltip-floating][data-placement="left"] [data-tooltip-arrow-el] {
1765
+ right: -4px;
1766
+ top: var(--tt-arrow-y, 50%);
1767
+ transform: translateY(-50%) rotate(45deg);
1768
+ }
1769
+ [data-tooltip-floating][data-placement="right"] [data-tooltip-arrow-el] {
1770
+ left: -4px;
1771
+ top: var(--tt-arrow-y, 50%);
1772
+ transform: translateY(-50%) rotate(45deg);
1773
+ }
1774
+
1775
+ /* Tabs — active tab text color transition (indicator handles visual sweep) */
1776
+ [data-tabs] [role="tab"] {
1777
+ transition: color var(--duration-fast) var(--ease-out),
1778
+ background-color var(--duration-fast) var(--ease-out);
1779
+ }
1780
+ /* Tabs — hover/active only on non-selected tabs. Selected tabs are styled
1781
+ by the sliding indicator — hover bg would paint over it (z-10 button). */
1782
+ [data-tabs] [role="tab"]:not([aria-selected="true"]):hover {
1783
+ color: var(--color-text);
1784
+ background-color: var(--color-secondary);
1785
+ }
1786
+ [data-tabs] [role="tab"]:not([aria-selected="true"]):active {
1787
+ background-color: var(--color-secondary-hover);
1788
+ }
1789
+ /* Tabs — sliding indicator sweep (Spring easing for satisfying overshoot).
1790
+ Uses --duration-slow (500ms) because Spring's fast attack makes shorter
1791
+ durations feel instant — 500ms gives ~300ms of visible motion.
1792
+ [data-ready] prevents transition on initial page load. */
1793
+ [data-tab-indicator][data-ready] {
1794
+ transition: left var(--duration-slow) var(--ease-spring),
1795
+ top var(--duration-slow) var(--ease-spring),
1796
+ width var(--duration-slow) var(--ease-spring),
1797
+ height var(--duration-slow) var(--ease-spring);
1798
+ }
1799
+
1800
+
1801
+ /* Dialog/Drawer ::backdrop — transparent in production.
1802
+ Visual backdrop is a JS-created overlay <div> animated via Web Animations API.
1803
+ See dialog.js and drawer.js for the overlay implementation. */
1804
+ dialog[data-dialog]::backdrop {
1805
+ background: transparent;
1806
+ backdrop-filter: none;
1807
+ -webkit-backdrop-filter: none;
1808
+ }
1809
+
1810
+
1811
+ /* Dialog/Drawer panel animations are handled by Web Animations API in
1812
+ dialog.js and drawer.js. CSS @keyframes removed from this stylesheet
1813
+ to prevent double animation — CSS and JS both fire on [data-open] /
1814
+ [data-closing] attrs. SSR gallery keeps its own copy in gallery.rs. */
1815
+
1816
+ /* Accordion — panel height transition (grid-template-rows: 0fr -> 1fr).
1817
+ Spring easing gives a satisfying overshoot on expand. */
1818
+ [data-accordion-panel] {
1819
+ display: grid;
1820
+ grid-template-rows: 0fr;
1821
+ transition: grid-template-rows var(--duration-smooth) var(--ease-spring);
1822
+ }
1823
+
1824
+ /* Accordion — chevron rotation (Spring overshoot past 180 then settles) */
1825
+ [data-accordion-trigger] [data-accordion-chevron] {
1826
+ transition: transform var(--duration-normal) var(--ease-spring);
1827
+ }
1828
+ [data-accordion-trigger][aria-expanded="true"] [data-accordion-chevron] {
1829
+ transform: rotate(180deg);
1830
+ }
1831
+
1832
+ /* Accordion — trigger text/bg color transitions */
1833
+ [data-accordion-trigger] {
1834
+ transition: color var(--duration-fast) var(--ease-out),
1835
+ background-color var(--duration-fast) var(--ease-out);
1836
+ }
1837
+ /* Accordion — trigger hover/active */
1838
+ [data-accordion-trigger]:not([disabled]):hover {
1839
+ background-color: var(--color-secondary);
1840
+ }
1841
+ [data-accordion-trigger]:not([disabled]):active {
1842
+ background-color: var(--color-secondary-hover);
1843
+ }
1844
+
1845
+ /* Popover — absolute positioning within relative trigger wrapper.
1846
+ Horizontal alignment via data-floating-align on the trigger,
1847
+ reflected onto the panel by loader.js via data-align. */
1848
+ [data-popover] {
1849
+ position: absolute;
1850
+ z-index: 30;
1851
+ }
1852
+ [data-popover][data-align="start"] {
1853
+ left: 0;
1854
+ right: auto;
1855
+ }
1856
+ [data-popover][data-align="center"] {
1857
+ left: 50%;
1858
+ right: auto;
1859
+ transform: translateX(-50%);
1860
+ }
1861
+ [data-popover][data-align="end"] {
1862
+ right: 0;
1863
+ left: auto;
1864
+ }
1865
+
1866
+ /* Popover — arrow positioning based on runtime data-placement.
1867
+ Arrow is a rotated square that inherits panel bg, positioned to
1868
+ point toward the trigger. Uses border on two sides for continuity
1869
+ with panel border. */
1870
+ [data-popover] [data-popover-arrow] {
1871
+ position: absolute;
1872
+ left: 50%;
1873
+ transform: translateX(-50%) rotate(45deg);
1874
+ border-color: var(--color-border);
1875
+ }
1876
+ [data-popover][data-placement="bottom"] [data-popover-arrow] {
1877
+ top: -0.25rem;
1878
+ border-top-width: 1px;
1879
+ border-left-width: 1px;
1880
+ }
1881
+ [data-popover][data-placement="top"] [data-popover-arrow] {
1882
+ bottom: -0.25rem;
1883
+ border-bottom-width: 1px;
1884
+ border-right-width: 1px;
1885
+ }
1886
+
1887
+ /* Menu — absolute positioning within relative trigger wrapper.
1888
+ Like popover, menus use a relative parent and absolute panel.
1889
+ Always left-aligned (start alignment). */
1890
+ [data-menu] {
1891
+ position: absolute;
1892
+ z-index: 30;
1893
+ left: 0;
1894
+ right: auto;
1895
+ }
1896
+
1897
+ /* Drawer top — also handled by Web Animations API in drawer.js.
1898
+ CSS @keyframes removed (see comment above dialog/drawer section). */
1899
+
1900
+ /* Toast entrance — slide + scale + fade, snappy easing (matches Drawer).
1901
+ The behavior module (toast.js) drives [data-open]/[data-closing] attrs. */
1902
+ [data-toast][data-open][data-position^="top"] {
1903
+ animation: toast-in-top 350ms var(--ease-snappy) forwards;
1904
+ }
1905
+ [data-toast][data-open][data-position^="bottom"] {
1906
+ animation: toast-in-bottom 350ms var(--ease-snappy) forwards;
1907
+ }
1908
+
1909
+ /* Toast exit — slide + fade out, ease-out for smooth departure */
1910
+ [data-toast][data-closing][data-position^="top"] {
1911
+ animation: toast-out-top 250ms var(--ease-out) forwards;
1912
+ }
1913
+ [data-toast][data-closing][data-position^="bottom"] {
1914
+ animation: toast-out-bottom 250ms var(--ease-out) forwards;
1915
+ }
1916
+
1917
+ /* Toast progress bar — auto-dismiss countdown indicator */
1918
+ [data-toast] [data-toast-progress] {
1919
+ position: absolute;
1920
+ bottom: 0;
1921
+ left: 0;
1922
+ height: 2px;
1923
+ background: currentColor;
1924
+ opacity: 0.25;
1925
+ border-radius: inherit;
1926
+ transform-origin: left;
1927
+ transition: none;
1928
+ }
1929
+
1930
+ /* Pause progress when hovered */
1931
+ [data-toast]:hover [data-toast-progress] {
1932
+ animation-play-state: paused !important;
1933
+ }
1934
+
1935
+ @keyframes toast-in-top {
1936
+ from { opacity: 0; transform: translateY(-1rem) scale(0.95); }
1937
+ to { opacity: 1; transform: translateY(0) scale(1); }
1938
+ }
1939
+ @keyframes toast-in-bottom {
1940
+ from { opacity: 0; transform: translateY(1rem) scale(0.95); }
1941
+ to { opacity: 1; transform: translateY(0) scale(1); }
1942
+ }
1943
+ @keyframes toast-out-top {
1944
+ from { opacity: 1; transform: translateY(0) scale(1); }
1945
+ to { opacity: 0; transform: translateY(-1rem) scale(0.95); }
1946
+ }
1947
+ @keyframes toast-out-bottom {
1948
+ from { opacity: 1; transform: translateY(0) scale(1); }
1949
+ to { opacity: 0; transform: translateY(1rem) scale(0.95); }
1950
+ }
1951
+
1952
+ @keyframes toast-progress {
1953
+ from { transform: scaleX(1); }
1954
+ to { transform: scaleX(0); }
1955
+ }
1956
+
1957
+ /* Spinner square variant — tumbling cube with 3D perspective rotation.
1958
+ Uses ease-in-out (not Spring) for smooth infinite looping. */
1959
+ .animate-spin-square {
1960
+ animation: spin-square 1.8s ease-in-out infinite;
1961
+ }
1962
+ @keyframes spin-square {
1963
+ 0% { transform: perspective(120px) rotateX(0) rotateY(0); }
1964
+ 25% { transform: perspective(120px) rotateX(180deg) rotateY(0); }
1965
+ 50% { transform: perspective(120px) rotateX(180deg) rotateY(180deg); }
1966
+ 75% { transform: perspective(120px) rotateX(360deg) rotateY(180deg); }
1967
+ 100% { transform: perspective(120px) rotateX(360deg) rotateY(360deg); }
1968
+ }
1969
+
1970
+ /* Skeleton wave — gradient shimmer sweep (premium loading effect).
1971
+ Uses ::after pseudo-element with a translating gradient.
1972
+ The highlight color is the surface background, creating a natural
1973
+ shimmer against the skeleton fill (ColorRole::Border). */
1974
+ .animate-skeleton-wave {
1975
+ position: relative;
1976
+ overflow: hidden;
1977
+ }
1978
+ .animate-skeleton-wave::after {
1979
+ content: '';
1980
+ position: absolute;
1981
+ inset: 0;
1982
+ transform: translateX(-100%);
1983
+ background: linear-gradient(90deg, transparent, var(--color-surface), transparent);
1984
+ animation: skeleton-wave 2s linear infinite;
1985
+ }
1986
+ @keyframes skeleton-wave {
1987
+ 0% { transform: translateX(-100%); }
1988
+ 60%, 100% { transform: translateX(100%); }
1989
+ }
1990
+
1991
+ /* Progress bar — indeterminate sliding animation.
1992
+ Slides a 40%-width fill bar back and forth within the track.
1993
+ Uses ease-in-out (not Spring) for smooth infinite looping. */
1994
+ .animate-progress-indeterminate {
1995
+ animation: progress-indeterminate 1.5s ease-in-out infinite;
1996
+ }
1997
+ @keyframes progress-indeterminate {
1998
+ 0% { transform: translateX(-100%); }
1999
+ 50% { transform: translateX(150%); }
2000
+ 100% { transform: translateX(-100%); }
2001
+ }
2002
+
2003
+ /* Sidebar — width transition with Spring easing */
2004
+ [data-sidebar] {
2005
+ transition: width var(--duration-smooth) var(--ease-spring);
2006
+ }
2007
+
2008
+ /* Narrow mode: hide text labels, badges, sub-group labels */
2009
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-item-label],
2010
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-badge],
2011
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-group-label] {
2012
+ display: none;
2013
+ }
2014
+
2015
+ /* Collapsible group panel: grid-template-rows animation (same as Accordion) */
2016
+ [data-sidebar-group-panel] {
2017
+ display: grid;
2018
+ grid-template-rows: 1fr;
2019
+ transition: grid-template-rows var(--duration-normal) var(--ease-spring);
2020
+ }
2021
+ [data-sidebar-group-panel][data-collapsed] {
2022
+ grid-template-rows: 0fr;
2023
+ }
2024
+ [data-sidebar-group-panel] > * {
2025
+ overflow: hidden;
2026
+ }
2027
+
2028
+ /* Chevron rotation for collapsible sidebar groups */
2029
+ [data-sidebar-group-trigger] [data-chevron] {
2030
+ transition: transform var(--duration-normal) var(--ease-spring);
2031
+ }
2032
+ [data-sidebar-group-trigger][aria-expanded="false"] [data-chevron] {
2033
+ transform: rotate(-90deg);
2034
+ }
2035
+
2036
+ /* Narrow mode: center items as comfortable square targets */
2037
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-item],
2038
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-group-trigger] {
2039
+ justify-content: center;
2040
+ gap: 0;
2041
+ padding: 0.5rem;
2042
+ }
2043
+
2044
+ /* Narrow mode: center items within the rail */
2045
+ [data-sidebar][data-sidebar-state="narrow"] ul {
2046
+ padding-inline: 0.25rem;
2047
+ align-items: center;
2048
+ }
2049
+
2050
+ /* Narrow mode: center header, reduce padding */
2051
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-header] {
2052
+ justify-content: center;
2053
+ padding-inline: 0.5rem;
2054
+ }
2055
+
2056
+ /* Narrow mode: reduce footer padding */
2057
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-footer] {
2058
+ padding-inline: 0.5rem;
2059
+ }
2060
+
2061
+ /* Narrow mode: hide collapsible panels (unusable without labels) */
2062
+ [data-sidebar][data-sidebar-state="narrow"] [data-sidebar-group-panel] {
2063
+ display: none;
2064
+ }
2065
+
2066
+ /* Narrow mode: hide chevron indicators */
2067
+ [data-sidebar][data-sidebar-state="narrow"] [data-chevron] {
2068
+ display: none;
2069
+ }
2070
+
2071
+ /* Sidebar tooltip integration — uses centralized Tooltip component */
2072
+ /* Make tooltip wrappers fill sidebar width */
2073
+ [data-sidebar] [data-tooltip-wrapper] {
2074
+ display: flex;
2075
+ width: 100%;
2076
+ }
2077
+ /* Hide tooltip content in expanded mode (labels are visible) */
2078
+ [data-sidebar]:not([data-sidebar-state="narrow"]) [data-tooltip-wrapper] [role="tooltip"] {
2079
+ display: none !important;
2080
+ }
2081
+ /* In narrow mode, allow tooltips to escape overflow */
2082
+ [data-sidebar][data-sidebar-state="narrow"] {
2083
+ overflow: visible;
2084
+ }
2085
+ [data-sidebar][data-sidebar-state="narrow"] nav {
2086
+ overflow: visible;
2087
+ }
2088
+
2089
+ /* ─── Pressed State Design Tokens ─── */
2090
+ /* Centralized tint + text tokens for pressed/selected states.
2091
+ Reusable by any component needing theme-adaptive pressed highlighting.
2092
+ Light: subtle primary tint + primary text.
2093
+ Dark: stronger tint + full-contrast text (primary has lower luminance than text on dark surfaces). */
2094
+ :root, :host {
2095
+ --cx-pressed-tint: 15%;
2096
+ --cx-pressed-text: var(--color-primary);
2097
+ }
2098
+ html[data-theme="dark"], :host([data-theme="dark"]) {
2099
+ --cx-pressed-tint: 25%;
2100
+ --cx-pressed-text: var(--color-text);
2101
+ }
2102
+ @media (prefers-color-scheme: dark) {
2103
+ :root:not([data-theme]), :host:not([data-theme]) {
2104
+ --cx-pressed-tint: 25%;
2105
+ --cx-pressed-text: var(--color-text);
2106
+ }
2107
+ }
2108
+
2109
+ /* Toggle Group — connected button border overrides.
2110
+ Resets individual button radii using longhand properties to avoid
2111
+ shorthand/longhand cascade interactions. z-index stacking for hover/focus/pressed.
2112
+ overflow:hidden on edge buttons ensures hover bg clips to the rounded shape. */
2113
+ [data-toggle-group] > button {
2114
+ border-top-left-radius: 0; border-top-right-radius: 0;
2115
+ border-bottom-left-radius: 0; border-bottom-right-radius: 0;
2116
+ position: relative;
2117
+ }
2118
+ [data-toggle-group] > button:hover,
2119
+ [data-toggle-group] > button:focus-visible { z-index: 1; }
2120
+ [data-toggle-group] > button[data-pressed="true"] { z-index: 2; }
2121
+
2122
+ /* Toggle Group horizontal — border collapse + first/last radius.
2123
+ Uses first-of-type/last-of-type (not first-child/last-child) because the
2124
+ sliding indicator <span> is the first child in single-select mode.
2125
+ No overflow:hidden — backgrounds clip to border-radius natively, and
2126
+ overflow:hidden on edge buttons clips the sliding indicator behind them. */
2127
+ [data-toggle-group][aria-orientation="horizontal"] > button + button { margin-left: -1px; }
2128
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="rounded"] > button:first-of-type {
2129
+ border-top-left-radius: var(--radius-lg, 0.5rem); border-bottom-left-radius: var(--radius-lg, 0.5rem); }
2130
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="rounded"] > button:last-of-type {
2131
+ border-top-right-radius: var(--radius-lg, 0.5rem); border-bottom-right-radius: var(--radius-lg, 0.5rem); }
2132
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="pill"] > button:first-of-type {
2133
+ border-top-left-radius: 9999px; border-bottom-left-radius: 9999px; }
2134
+ [data-toggle-group][aria-orientation="horizontal"][data-shape="pill"] > button:last-of-type {
2135
+ border-top-right-radius: 9999px; border-bottom-right-radius: 9999px; }
2136
+
2137
+ /* Toggle Group vertical — border collapse + first/last radius */
2138
+ [data-toggle-group][aria-orientation="vertical"] { flex-direction: column; }
2139
+ [data-toggle-group][aria-orientation="vertical"] > button + button { margin-top: -1px; }
2140
+ [data-toggle-group][aria-orientation="vertical"][data-shape="rounded"] > button:first-of-type {
2141
+ border-top-left-radius: var(--radius-lg, 0.5rem); border-top-right-radius: var(--radius-lg, 0.5rem); }
2142
+ [data-toggle-group][aria-orientation="vertical"][data-shape="rounded"] > button:last-of-type {
2143
+ border-bottom-left-radius: var(--radius-lg, 0.5rem); border-bottom-right-radius: var(--radius-lg, 0.5rem); }
2144
+ [data-toggle-group][aria-orientation="vertical"][data-shape="pill"] > button:first-of-type {
2145
+ border-top-left-radius: 9999px; border-top-right-radius: 9999px; }
2146
+ [data-toggle-group][aria-orientation="vertical"][data-shape="pill"] > button:last-of-type {
2147
+ border-bottom-left-radius: 9999px; border-bottom-right-radius: 9999px; }
2148
+
2149
+ /* Toggle Group — pressed button text color.
2150
+ !important overrides inline style="color:..." set by Button's StyleBundle.
2151
+ Uses centralized --cx-pressed-text: primary in light, full-contrast text in dark.
2152
+ Filled: inverse text stays bright on the indicator bg. */
2153
+ [data-toggle-group] > button[data-pressed="true"] {
2154
+ color: var(--cx-pressed-text) !important;
2155
+ font-weight: 600 !important;
2156
+ }
2157
+ [data-toggle-group][data-variant="filled"] > button[data-pressed="true"] {
2158
+ color: var(--color-inverse-text) !important;
2159
+ font-weight: 600 !important;
2160
+ }
2161
+
2162
+ /* Toggle Group — Filled variant: dim unpressed buttons so pressed stands out.
2163
+ Creates clear visual hierarchy: pressed = full brightness, unpressed = dimmed.
2164
+ Works in both light and dark modes. */
2165
+ [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]) {
2166
+ opacity: 0.7;
2167
+ }
2168
+
2169
+ /* Toggle Group — in single mode, indicator provides the bg highlight.
2170
+ Suppress button's own pressed bg AND hover bg to avoid double-paint.
2171
+ !important overrides inline style="background-color:..." from Button. */
2172
+ [data-toggle-group][data-toggle-mode="single"] > button[data-pressed="true"] {
2173
+ background-color: transparent !important;
2174
+ }
2175
+ [data-toggle-group][data-toggle-mode="single"] > button[data-pressed="true"]:hover {
2176
+ background-color: transparent !important;
2177
+ }
2178
+
2179
+ /* Toggle Group — in multi mode, per-button pressed bg highlight.
2180
+ !important overrides Button's inline style="background-color:...".
2181
+ Uses centralized --cx-pressed-tint for theme-adaptive visibility.
2182
+ Outline/Ghost: tinted primary bg. Filled: full primary shade. */
2183
+ [data-toggle-group][data-toggle-mode="multiple"] > button[data-pressed="true"] {
2184
+ background-color: color-mix(in oklch, var(--color-primary) var(--cx-pressed-tint, 15%), transparent) !important;
2185
+ }
2186
+ [data-toggle-group][data-variant="filled"][data-toggle-mode="multiple"] > button[data-pressed="true"] {
2187
+ background-color: var(--color-primary) !important;
2188
+ opacity: 1 !important;
2189
+ }
2190
+
2191
+ /* Toggle Group — Filled hover: brightness tuned per theme.
2192
+ Light mode: dark surfaces need strong 1.65 boost to show hover.
2193
+ Dark mode: lighter surfaces only need subtle 1.25.
2194
+ Uses html[data-theme] (specificity 0,0,1,1) which beats base rules
2195
+ and works regardless of OS prefers-color-scheme. */
2196
+ [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover {
2197
+ filter: brightness(1.65);
2198
+ opacity: 0.9;
2199
+ }
2200
+ [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator] {
2201
+ filter: brightness(1.65);
2202
+ }
2203
+ html[data-theme="dark"] [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover,
2204
+ :host([data-theme="dark"]) [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover {
2205
+ filter: brightness(1.25);
2206
+ opacity: 0.9;
2207
+ }
2208
+ html[data-theme="dark"] [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator],
2209
+ :host([data-theme="dark"]) [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator] {
2210
+ filter: brightness(1.25);
2211
+ }
2212
+ @media (prefers-color-scheme: dark) {
2213
+ :root:not([data-theme]) [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover,
2214
+ :host:not([data-theme]) [data-toggle-group][data-variant="filled"] > button:not([data-pressed="true"]):not([disabled]):hover {
2215
+ filter: brightness(1.25);
2216
+ opacity: 0.9;
2217
+ }
2218
+ :root:not([data-theme]) [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator],
2219
+ :host:not([data-theme]) [data-toggle-group][data-variant="filled"]:has(> button[data-pressed="true"]:hover) > [data-toggle-indicator] {
2220
+ filter: brightness(1.25);
2221
+ }
2222
+ }
2223
+ [data-toggle-indicator] {
2224
+ transition: filter var(--duration-fast) var(--ease-out);
2225
+ }
2226
+
2227
+ /* Toggle Group — sliding indicator sweep (Spring easing, same as Tabs).
2228
+ Uses --duration-slow (500ms) because Spring's fast attack makes shorter
2229
+ durations feel instant — 500ms gives ~300ms of visible motion.
2230
+ [data-ready] prevents transition on initial page load.
2231
+ border-radius transitions to match the pressed button's computed radius. */
2232
+ [data-toggle-indicator][data-ready] {
2233
+ transition: left var(--duration-slow) var(--ease-spring),
2234
+ top var(--duration-slow) var(--ease-spring),
2235
+ width var(--duration-slow) var(--ease-spring),
2236
+ height var(--duration-slow) var(--ease-spring),
2237
+ border-radius var(--duration-slow) var(--ease-spring),
2238
+ opacity var(--duration-fast) var(--ease-out);
2239
+ }
2240
+
2241
+ /* Collapsible — panel height transition (grid-template-rows: 0fr -> 1fr).
2242
+ Same animation technique as Accordion. Spring easing gives satisfying overshoot. */
2243
+ [data-collapsible-panel] {
2244
+ display: grid;
2245
+ grid-template-rows: 1fr;
2246
+ transition: grid-template-rows var(--duration-smooth) var(--ease-spring);
2247
+ }
2248
+ [data-collapsible-panel][data-collapsed] {
2249
+ grid-template-rows: 0fr;
2250
+ }
2251
+ [data-collapsible-panel] > * {
2252
+ overflow: hidden;
2253
+ }
2254
+
2255
+ /* Collapsible — chevron rotation (Spring easing, -90deg -> 0deg on expand) */
2256
+ [data-collapsible-trigger] [data-chevron] {
2257
+ transition: transform var(--duration-normal) var(--ease-spring);
2258
+ }
2259
+ [data-collapsible-trigger][aria-expanded="false"] [data-chevron] {
2260
+ transform: rotate(-90deg);
2261
+ }
2262
+
2263
+ /* Collapsible — trigger text/bg color transitions */
2264
+ [data-collapsible-trigger] {
2265
+ transition: color var(--duration-fast) var(--ease-out),
2266
+ background-color var(--duration-fast) var(--ease-out);
2267
+ }
2268
+ /* Collapsible — trigger hover/active */
2269
+ [data-collapsible-trigger]:not([disabled]):hover {
2270
+ background-color: var(--color-secondary);
2271
+ }
2272
+ [data-collapsible-trigger]:not([disabled]):active {
2273
+ background-color: var(--color-secondary-hover);
2274
+ }
2275
+
2276
+ /* Activity/tool expand chevron — hidden by default, revealed on hover.
2277
+ Uses Icon::ChevronRight, rotates 90deg when expanded. */
2278
+ [data-collapsible-trigger] [data-expand] {
2279
+ opacity: 0;
2280
+ transition: opacity var(--duration-fast) var(--ease-out),
2281
+ transform var(--duration-normal) var(--ease-spring);
2282
+ }
2283
+ [data-collapsible-trigger]:hover [data-expand],
2284
+ [data-collapsible-trigger][aria-expanded="true"] [data-expand] {
2285
+ opacity: 1;
2286
+ }
2287
+ [data-collapsible-trigger][aria-expanded="true"] [data-expand] {
2288
+ transform: rotate(90deg);
2289
+ }
2290
+
2291
+ /* Thinking — shimmer text sweep animation.
2292
+ A gradient sweeps left-to-right across the text using background-clip: text.
2293
+ Ghost uses text color vars; Filled uses inverse-text color vars. */
2294
+ @keyframes cx-shimmer {
2295
+ from { background-position: 200% center; }
2296
+ to { background-position: -200% center; }
2297
+ }
2298
+ .cx-thinking-ghost {
2299
+ background: linear-gradient(90deg,
2300
+ color-mix(in oklch, var(--color-text) 20%, transparent),
2301
+ var(--color-text),
2302
+ color-mix(in oklch, var(--color-text) 20%, transparent));
2303
+ background-size: 200% 100%;
2304
+ -webkit-background-clip: text;
2305
+ background-clip: text;
2306
+ color: transparent;
2307
+ animation: cx-shimmer var(--cx-thinking-speed, 3.1s) linear infinite;
2308
+ }
2309
+ .cx-thinking-filled {
2310
+ background: linear-gradient(90deg,
2311
+ color-mix(in oklch, var(--color-inverse-text) 40%, transparent),
2312
+ var(--color-inverse-text),
2313
+ color-mix(in oklch, var(--color-inverse-text) 40%, transparent));
2314
+ background-size: 200% 100%;
2315
+ -webkit-background-clip: text;
2316
+ background-clip: text;
2317
+ color: transparent;
2318
+ animation: cx-shimmer var(--cx-thinking-speed, 3.1s) linear infinite;
2319
+ }
2320
+
2321
+ /* SearchBar — hide native browser clear/cancel button on type="search" inputs.
2322
+ We render our own clear button with proper styling and accessibility. */
2323
+ input[type="search"]::-webkit-search-cancel-button,
2324
+ input[type="search"]::-webkit-search-decoration {
2325
+ -webkit-appearance: none;
2326
+ appearance: none;
2327
+ display: none;
2328
+ }
2329
+
2330
+ /* SearchBar — one-shot focus shimmer on placeholder text.
2331
+ Dedicated keyframes with a tight sweep range (100% → -100%) so the bright
2332
+ spot crosses the visible text exactly once, left to right. Uses the same
2333
+ background-clip:text technique as Thinking but with a sharper gradient
2334
+ falloff for a cleaner single pass. JS adds the class on focusin and
2335
+ removes it on animationend, with a 10-second cooldown. */
2336
+ @keyframes cx-search-shimmer {
2337
+ 0% {
2338
+ background-position: 100% center;
2339
+ color: transparent;
2340
+ -webkit-background-clip: text;
2341
+ background-clip: text;
2342
+ }
2343
+ 90% {
2344
+ background-position: 0% center;
2345
+ color: transparent;
2346
+ -webkit-background-clip: text;
2347
+ background-clip: text;
2348
+ }
2349
+ 100% {
2350
+ color: var(--color-text-muted);
2351
+ background: none;
2352
+ }
2353
+ }
2354
+ [data-search-shimmer] .cx-search-shimmer-text {
2355
+ background: linear-gradient(90deg,
2356
+ transparent 0%,
2357
+ transparent 42%,
2358
+ color-mix(in oklch, var(--color-text) 30%, transparent) 46%,
2359
+ var(--color-text) 50%,
2360
+ color-mix(in oklch, var(--color-text) 30%, transparent) 54%,
2361
+ transparent 58%,
2362
+ transparent 100%);
2363
+ background-size: 300% 100%;
2364
+ animation: cx-search-shimmer 2.7s linear 1 forwards;
2365
+ }
2366
+
2367
+ /* Message — spring entrance animation for chat messages.
2368
+ Used by MessageBubble (single) and MessageGroup (staggered). */
2369
+ @keyframes cx-message-enter {
2370
+ from {
2371
+ opacity: 0;
2372
+ transform: translateY(8px) scale(0.98);
2373
+ }
2374
+ to {
2375
+ opacity: 1;
2376
+ transform: translateY(0) scale(1);
2377
+ }
2378
+ }
2379
+ .cx-message-enter {
2380
+ animation: cx-message-enter var(--duration-smooth) var(--ease-spring) both;
2381
+ }
2382
+ /* Staggered entrance for grouped message parts */
2383
+ .cx-message-group > [data-connection] {
2384
+ animation: cx-message-enter var(--duration-smooth) var(--ease-spring) both;
2385
+ }
2386
+ .cx-message-group > :nth-child(1) { animation-delay: 0ms; }
2387
+ .cx-message-group > :nth-child(2) { animation-delay: 50ms; }
2388
+ .cx-message-group > :nth-child(3) { animation-delay: 100ms; }
2389
+ .cx-message-group > :nth-child(4) { animation-delay: 150ms; }
2390
+ .cx-message-group > :nth-child(5) { animation-delay: 200ms; }
2391
+ .cx-message-group > :nth-child(6) { animation-delay: 250ms; }
2392
+ .cx-message-group > :nth-child(7) { animation-delay: 300ms; }
2393
+ .cx-message-group > :nth-child(8) { animation-delay: 350ms; }
2394
+ .cx-message-group > :nth-child(9) { animation-delay: 400ms; }
2395
+ .cx-message-group > :nth-child(10) { animation-delay: 450ms; }
2396
+
2397
+ /* Streaming cursor — blinking caret for streaming markdown content.
2398
+ Appears at the end of the text during token arrival, removed on stream end.
2399
+ Essential loading feedback — retains animation under reduced-motion. */
2400
+ .cx-stream-cursor {
2401
+ display: inline-block;
2402
+ width: 2px;
2403
+ height: 1.1em;
2404
+ background: currentColor;
2405
+ vertical-align: text-bottom;
2406
+ margin-left: 1px;
2407
+ animation: cx-cursor-blink 1s step-end infinite;
2408
+ }
2409
+ @keyframes cx-cursor-blink {
2410
+ 50% { opacity: 0; }
2411
+ }
2412
+
2413
+ @media (prefers-reduced-motion: reduce) {
2414
+ dialog[data-dialog]::backdrop,
2415
+ dialog[data-dialog][data-open] [data-dialog-panel],
2416
+ dialog[data-dialog][data-closing] [data-dialog-panel],
2417
+ dialog[data-dialog][data-closing]::backdrop,
2418
+ [data-toast][data-open],
2419
+ [data-toast][data-closing],
2420
+ .animate-progress-indeterminate {
2421
+ animation: none;
2422
+ }
2423
+ /* Message — disable entrance animation */
2424
+ .cx-message-enter,
2425
+ .cx-message-group > [data-connection],
2426
+ .cx-message-group > * {
2427
+ animation: none;
2428
+ opacity: 1;
2429
+ transform: none;
2430
+ }
2431
+ /* Thinking — stop animation, show static text */
2432
+ .cx-thinking-ghost {
2433
+ animation: none;
2434
+ background: none;
2435
+ -webkit-background-clip: unset;
2436
+ background-clip: unset;
2437
+ color: var(--color-text-muted);
2438
+ }
2439
+ .cx-thinking-filled {
2440
+ animation: none;
2441
+ background: none;
2442
+ -webkit-background-clip: unset;
2443
+ background-clip: unset;
2444
+ color: var(--color-inverse-text);
2445
+ }
2446
+ /* SearchBar — disable shimmer sweep */
2447
+ [data-search-shimmer] .cx-search-shimmer-text {
2448
+ animation: none;
2449
+ background: none;
2450
+ -webkit-background-clip: unset;
2451
+ background-clip: unset;
2452
+ color: var(--color-text-muted);
2453
+ }
2454
+ }
2455
+
2456
+ /* ─── Slider Cross-Browser Styling ─── */
2457
+ /* Native <input type="range"> with appearance-none requires vendor
2458
+ pseudo-elements for track, thumb, and fill. CSS custom properties
2459
+ set inline by render.rs drive all dimensions and radii. */
2460
+
2461
+ /* WebKit (Chrome, Safari, Edge) — track */
2462
+ input[data-slider]::-webkit-slider-runnable-track {
2463
+ height: var(--slider-track-h);
2464
+ border-radius: var(--slider-track-r);
2465
+ background: linear-gradient(
2466
+ to right,
2467
+ var(--slider-fill) calc(var(--slider-percent) * 1%),
2468
+ var(--color-border) calc(var(--slider-percent) * 1%)
2469
+ );
2470
+ }
2471
+
2472
+ /* WebKit — thumb */
2473
+ input[data-slider]::-webkit-slider-thumb {
2474
+ -webkit-appearance: none;
2475
+ appearance: none;
2476
+ width: var(--slider-thumb-sz);
2477
+ height: var(--slider-thumb-sz);
2478
+ border-radius: var(--slider-thumb-r);
2479
+ background: var(--color-surface);
2480
+ border: 2px solid var(--slider-fill);
2481
+ box-shadow: 0 1px 3px oklch(0 0 0 / 0.15);
2482
+ margin-top: calc((var(--slider-track-h) - var(--slider-thumb-sz)) / 2);
2483
+ cursor: pointer;
2484
+ transition: transform var(--duration-normal) var(--ease-spring),
2485
+ box-shadow var(--duration-fast) var(--ease-out);
2486
+ }
2487
+ input[data-slider]:hover::-webkit-slider-thumb {
2488
+ transform: scale(1.15);
2489
+ box-shadow: 0 2px 6px oklch(0 0 0 / 0.2);
2490
+ }
2491
+ input[data-slider]:active::-webkit-slider-thumb {
2492
+ transform: scale(0.95);
2493
+ }
2494
+
2495
+ /* Firefox — track (unfilled portion) */
2496
+ input[data-slider]::-moz-range-track {
2497
+ height: var(--slider-track-h);
2498
+ border-radius: var(--slider-track-r);
2499
+ background: var(--color-border);
2500
+ border: none;
2501
+ }
2502
+
2503
+ /* Firefox — fill (filled portion, native pseudo) */
2504
+ input[data-slider]::-moz-range-progress {
2505
+ height: var(--slider-track-h);
2506
+ border-radius: var(--slider-track-r);
2507
+ background: var(--slider-fill);
2508
+ }
2509
+
2510
+ /* Firefox — thumb */
2511
+ input[data-slider]::-moz-range-thumb {
2512
+ width: var(--slider-thumb-sz);
2513
+ height: var(--slider-thumb-sz);
2514
+ border-radius: var(--slider-thumb-r);
2515
+ background: var(--color-surface);
2516
+ border: 2px solid var(--slider-fill);
2517
+ box-shadow: 0 1px 3px oklch(0 0 0 / 0.15);
2518
+ cursor: pointer;
2519
+ transition: transform var(--duration-normal) var(--ease-spring),
2520
+ box-shadow var(--duration-fast) var(--ease-out);
2521
+ }
2522
+ input[data-slider]:hover::-moz-range-thumb {
2523
+ transform: scale(1.15);
2524
+ box-shadow: 0 2px 6px oklch(0 0 0 / 0.2);
2525
+ }
2526
+ input[data-slider]:active::-moz-range-thumb {
2527
+ transform: scale(0.95);
2528
+ }
2529
+
2530
+ /* Disabled slider — reduced opacity on thumb/track */
2531
+ input[data-slider]:disabled::-webkit-slider-thumb {
2532
+ cursor: not-allowed;
2533
+ }
2534
+ input[data-slider]:disabled::-moz-range-thumb {
2535
+ cursor: not-allowed;
2536
+ }
2537
+
2538
+ /* Reduced motion — disable thumb scale transitions */
2539
+ @media (prefers-reduced-motion: reduce) {
2540
+ input[data-slider]::-webkit-slider-thumb,
2541
+ input[data-slider]::-moz-range-thumb {
2542
+ transition: none;
2543
+ }
2544
+ input[data-slider]:hover::-webkit-slider-thumb,
2545
+ input[data-slider]:hover::-moz-range-thumb {
2546
+ transform: none;
2547
+ }
2548
+ }
2549
+
2550
+ /* ─── Scrollbar Theming ─── */
2551
+
2552
+ /* Custom property overrides — consumers can set these anywhere.
2553
+ --scrollbar-thumb: thumb color (default: --color-text-muted)
2554
+ --scrollbar-track: track color (default: transparent)
2555
+ --scrollbar-idle-opacity: opacity when idle/scrolling (default: 0.2)
2556
+ --scrollbar-hover-opacity: opacity on container hover (default: 1)
2557
+ */
2558
+
2559
+ /* Global: thin themed scrollbars with idle opacity.
2560
+ Uses color-mix to apply the idle opacity to the thumb color.
2561
+ Skipped when --scrollbar-native is set or on [data-scrollbar-native] elements. */
2562
+ :root:not([data-scrollbar-native]) {
2563
+ scrollbar-width: thin;
2564
+ scrollbar-color:
2565
+ color-mix(in oklch, var(--scrollbar-thumb, var(--color-text-muted)) calc(var(--scrollbar-idle-opacity, 0.2) * 100%), transparent)
2566
+ var(--scrollbar-track, transparent);
2567
+ }
2568
+
2569
+ /* Full opacity when hovering over ANY scrollable container. */
2570
+ :root:not([data-scrollbar-native]) *:hover {
2571
+ scrollbar-color:
2572
+ var(--scrollbar-thumb, var(--color-text-muted))
2573
+ var(--scrollbar-track, transparent);
2574
+ }
2575
+
2576
+ /* Per-element opt-out: restore native scrollbar */
2577
+ [data-scrollbar-native],
2578
+ [data-scrollbar-native] * {
2579
+ scrollbar-width: auto !important;
2580
+ scrollbar-color: auto !important;
2581
+ }
2582
+
2583
+ /* Utility: completely hide native scrollbar (used by Scrollbar component).
2584
+ Content remains scrollable via overflow. */
2585
+ .scrollbar-none {
2586
+ scrollbar-width: none;
2587
+ }
2588
+ .scrollbar-none::-webkit-scrollbar {
2589
+ display: none;
2590
+ }
2591
+
2592
+ /* Keyboard focus indicator on the scrollable viewport (WCAG 2.2 AA). */
2593
+ [data-scrollbar-viewport]:focus-visible {
2594
+ outline: 2px solid var(--color-ring, currentColor);
2595
+ outline-offset: -2px;
2596
+ }
2597
+
2598
+ /* ─── Custom Scrollbar Component States ─── */
2599
+
2600
+ /* Thumb interaction states — driven by data attributes from behavior module.
2601
+ CSS-only fallback: visible at idle opacity with approximate sizing.
2602
+ JS-enhanced (data-scrollbar-ready): hidden until scroll/hover/drag. */
2603
+
2604
+ [data-scrollbar] [data-scrollbar-thumb],
2605
+ [data-scrollbar] [data-scrollbar-thumb="y"],
2606
+ [data-scrollbar] [data-scrollbar-thumb="x"] {
2607
+ opacity: var(--scrollbar-idle-opacity, 0.2);
2608
+ transition: opacity var(--duration-fast, 150ms) var(--ease-out, ease-out),
2609
+ width var(--duration-fastest, 75ms) var(--ease-out, ease-out);
2610
+ }
2611
+
2612
+ /* CSS-only fallback sizing — overridden by JS inline styles */
2613
+ [data-scrollbar][data-scrollbar-axis="y"] [data-scrollbar-thumb],
2614
+ [data-scrollbar] [data-scrollbar-thumb="y"] {
2615
+ height: 30%;
2616
+ min-height: 20px;
2617
+ }
2618
+ [data-scrollbar][data-scrollbar-axis="x"] [data-scrollbar-thumb],
2619
+ [data-scrollbar] [data-scrollbar-thumb="x"] {
2620
+ width: 30%;
2621
+ min-width: 20px;
2622
+ }
2623
+
2624
+ /* JS-enhanced: hide thumb when idle (behavior module manages visibility) */
2625
+ [data-scrollbar][data-scrollbar-ready] [data-scrollbar-thumb],
2626
+ [data-scrollbar][data-scrollbar-ready] [data-scrollbar-thumb="y"],
2627
+ [data-scrollbar][data-scrollbar-ready] [data-scrollbar-thumb="x"] {
2628
+ opacity: 0;
2629
+ }
2630
+
2631
+ /* Scrolling: thumb fades in at idle opacity */
2632
+ [data-scrollbar][data-scrolling] [data-scrollbar-thumb],
2633
+ [data-scrollbar][data-scrolling] [data-scrollbar-thumb="y"],
2634
+ [data-scrollbar][data-scrolling] [data-scrollbar-thumb="x"] {
2635
+ opacity: var(--scrollbar-idle-opacity, 0.2);
2636
+ }
2637
+
2638
+ /* Hovering over the scrollbar track area: full opacity */
2639
+ [data-scrollbar][data-scroll-hover] [data-scrollbar-thumb],
2640
+ [data-scrollbar][data-scroll-hover] [data-scrollbar-thumb="y"],
2641
+ [data-scrollbar][data-scroll-hover] [data-scrollbar-thumb="x"] {
2642
+ opacity: var(--scrollbar-hover-opacity, 1);
2643
+ }
2644
+
2645
+ /* Actively dragging the thumb: full opacity */
2646
+ [data-scrollbar][data-scroll-active] [data-scrollbar-thumb],
2647
+ [data-scrollbar][data-scroll-active] [data-scrollbar-thumb="y"],
2648
+ [data-scrollbar][data-scroll-active] [data-scrollbar-thumb="x"] {
2649
+ opacity: var(--scrollbar-hover-opacity, 1);
2650
+ }
2651
+
2652
+ /* Reduced motion: instant transitions */
2653
+ @media (prefers-reduced-motion: reduce) {
2654
+ [data-scrollbar] [data-scrollbar-thumb],
2655
+ [data-scrollbar] [data-scrollbar-thumb="y"],
2656
+ [data-scrollbar] [data-scrollbar-thumb="x"] {
2657
+ transition: none;
2658
+ }
2659
+ }
2660
+
2661
+
2662
+
2663
+ /* Touch devices: hide custom scrollbar, let native overlay handle it.
2664
+ pointer:coarse targets the input method (touch), not screen size —
2665
+ a 12" iPad still gets native scrollbars while a 768px desktop keeps
2666
+ the custom ones. Native mobile overlay scrollbars have momentum,
2667
+ edge bounce, and auto-hide — strictly better UX than a custom thumb
2668
+ on touch. */
2669
+ @media (pointer: coarse) {
2670
+ [data-scrollbar] [data-scrollbar-track],
2671
+ [data-scrollbar] [data-scrollbar-track="y"],
2672
+ [data-scrollbar] [data-scrollbar-track="x"] {
2673
+ display: none !important;
2674
+ }
2675
+ [data-scrollbar] [data-scrollbar-viewport] {
2676
+ padding-right: 0 !important;
2677
+ padding-bottom: 0 !important;
2678
+ }
2679
+ }
2680
+
2681
+ /* ─── Texture Grain System ─── */
2682
+
2683
+ /* Opt-in noise overlay — add \`cx-texture\` class to any element.
2684
+ Uses SVG feTurbulence for organic, resolution-independent grain.
2685
+
2686
+ Custom properties:
2687
+ --texture-opacity: grain visibility (light: 0.12, dark: 0.18)
2688
+ --texture-url: swap to a custom noise image/SVG
2689
+
2690
+ Usage:
2691
+ <div class="cx-texture"> ... </div>
2692
+ style="--texture-opacity: 0.2" (stronger grain)
2693
+ style="--texture-url: url(my-noise.svg)" (custom pattern)
2694
+ */
2695
+
2696
+ .cx-texture {
2697
+ position: relative;
2698
+ }
2699
+
2700
+ .cx-texture::after {
2701
+ content: '';
2702
+ position: absolute;
2703
+ inset: 0;
2704
+ background-image: var(--texture-url, url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/></filter><rect width='200' height='200' filter='url(%23n)' opacity='1'/></svg>"));
2705
+ background-repeat: repeat;
2706
+ background-size: 200px 200px;
2707
+ opacity: var(--texture-opacity, 0.12);
2708
+ pointer-events: none;
2709
+ z-index: 1;
2710
+ border-radius: inherit;
2711
+ mix-blend-mode: multiply;
2712
+ }
2713
+
2714
+ /* Ensure card content stays above the grain overlay */
2715
+ .cx-texture > * {
2716
+ position: relative;
2717
+ z-index: 2;
2718
+ }
2719
+
2720
+ /* Dark theme: stronger grain + additive blend for visibility on dark surfaces */
2721
+ [data-theme="dark"] .cx-texture::after,
2722
+ @media (prefers-color-scheme: dark) {
2723
+ :root:not([data-theme="light"]) .cx-texture::after {
2724
+ opacity: var(--texture-opacity, 0.18);
2725
+ mix-blend-mode: soft-light;
2726
+ }
2727
+ }
2728
+
2729
+ /* Reduced motion: disable blend mode animation (static grain is fine) */
2730
+ @media (prefers-reduced-motion: reduce) {
2731
+ .cx-texture::after {
2732
+ animation: none;
2733
+ }
2734
+ }
2735
+
2736
+ /* ─── Prose Typography ─── */
2737
+ /* Styles for rendered GFM markdown content (.cx-prose wrapper).
2738
+ All colors use CSS vars for theme compatibility. */
2739
+
2740
+ .cx-prose {
2741
+ line-height: 1.7;
2742
+ word-wrap: break-word;
2743
+ overflow-wrap: break-word;
2744
+ }
2745
+
2746
+ /* Headings */
2747
+ .cx-prose h1 { font-size: 1.875rem; font-weight: 700; margin: 1.5rem 0 0.75rem; line-height: 1.2; }
2748
+ .cx-prose h2 { font-size: 1.5rem; font-weight: 600; margin: 1.25rem 0 0.625rem; line-height: 1.25; }
2749
+ .cx-prose h3 { font-size: 1.25rem; font-weight: 600; margin: 1rem 0 0.5rem; line-height: 1.3; }
2750
+ .cx-prose h4 { font-size: 1.125rem; font-weight: 600; margin: 0.875rem 0 0.375rem; line-height: 1.35; }
2751
+ .cx-prose h5 { font-size: 1rem; font-weight: 600; margin: 0.75rem 0 0.25rem; line-height: 1.4; }
2752
+ .cx-prose h6 { font-size: 0.875rem; font-weight: 600; margin: 0.75rem 0 0.25rem; line-height: 1.4; opacity: 0.8; }
2753
+ .cx-prose :first-child { margin-top: 0; }
2754
+
2755
+ /* Paragraphs */
2756
+ .cx-prose p { margin: 0 0 0.75rem; }
2757
+ .cx-prose p:last-child { margin-bottom: 0; }
2758
+
2759
+ /* Lists */
2760
+ .cx-prose ul { list-style-type: disc; padding-left: 1.5rem; margin: 0 0 0.75rem; }
2761
+ .cx-prose ol { list-style-type: decimal; padding-left: 1.5rem; margin: 0 0 0.75rem; }
2762
+ .cx-prose li { margin: 0.125rem 0; }
2763
+ .cx-prose li > ul, .cx-prose li > ol { margin: 0.25rem 0; }
2764
+ .cx-prose ul ul { list-style-type: circle; }
2765
+ .cx-prose ul ul ul { list-style-type: square; }
2766
+
2767
+ /* Task lists — remove bullet, align checkbox */
2768
+ .cx-prose ul:has(> li > input[type="checkbox"]) { list-style: none; padding-left: 0.25rem; }
2769
+ .cx-prose li > input[type="checkbox"] { margin-right: 0.5rem; vertical-align: middle; }
2770
+
2771
+ /* Tables */
2772
+ .cx-prose table { border-collapse: collapse; width: 100%; margin: 0.75rem 0; font-size: 0.875rem; }
2773
+ .cx-prose thead th {
2774
+ text-align: left; font-weight: 600; padding: 0.5rem 0.75rem;
2775
+ border-bottom: 2px solid var(--color-border);
2776
+ }
2777
+ .cx-prose tbody td { padding: 0.375rem 0.75rem; border-bottom: 1px solid var(--color-border); }
2778
+ .cx-prose tbody tr:last-child td { border-bottom: none; }
2779
+
2780
+ /* Inline code */
2781
+ .cx-prose code {
2782
+ font-family: var(--font-mono);
2783
+ font-size: 0.85em;
2784
+ padding: 0.15em 0.35em;
2785
+ border-radius: 0.25rem;
2786
+ background: var(--color-surface);
2787
+ }
2788
+
2789
+ /* Fenced code blocks — reset inline code styles inside pre */
2790
+ .cx-prose pre {
2791
+ margin: 0.75rem 0;
2792
+ padding: 0.875rem 1rem;
2793
+ border-radius: 0.5rem;
2794
+ overflow-x: auto;
2795
+ background: var(--color-inverse-surface);
2796
+ color: var(--color-inverse-text);
2797
+ }
2798
+ .cx-prose pre code {
2799
+ font-family: var(--font-mono);
2800
+ font-size: 0.8125rem;
2801
+ padding: 0;
2802
+ border-radius: 0;
2803
+ background: transparent;
2804
+ color: inherit;
2805
+ white-space: pre;
2806
+ }
2807
+
2808
+ /* Blockquotes */
2809
+ .cx-prose blockquote {
2810
+ border-left: 3px solid var(--color-border);
2811
+ padding: 0.25rem 0 0.25rem 1rem;
2812
+ margin: 0.75rem 0;
2813
+ opacity: 0.85;
2814
+ }
2815
+ .cx-prose blockquote p:last-child { margin-bottom: 0; }
2816
+
2817
+ /* Links */
2818
+ .cx-prose a {
2819
+ color: var(--color-primary);
2820
+ text-decoration: underline;
2821
+ text-underline-offset: 2px;
2822
+ text-decoration-thickness: 1px;
2823
+ }
2824
+ .cx-prose a:hover { text-decoration-thickness: 2px; }
2825
+
2826
+ /* Horizontal rules */
2827
+ .cx-prose hr {
2828
+ border: none;
2829
+ border-top: 1px solid var(--color-border);
2830
+ margin: 1.25rem 0;
2831
+ }
2832
+
2833
+ /* Images */
2834
+ .cx-prose img { max-width: 100%; height: auto; border-radius: 0.375rem; margin: 0.5rem 0; }
2835
+
2836
+ /* Strong + emphasis */
2837
+ .cx-prose strong { font-weight: 600; }
2838
+ .cx-prose em { font-style: italic; }
2839
+ .cx-prose del { text-decoration: line-through; opacity: 0.7; }
2840
+
2841
+ /* Footnotes */
2842
+ .cx-prose .footnote-definition { font-size: 0.8125rem; opacity: 0.8; margin-top: 1rem; }
2843
+ .cx-prose sup { font-size: 0.75em; }`;
2844
+ export const UTILITIES_CSS = `/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
2845
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-blue-500:oklch(62.3% .214 259.815);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.end\\!{inset-inline-end:var(--spacing)!important}.-top-1{top:calc(var(--spacing) * -1)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-full{top:100%}.-right-1{right:calc(var(--spacing) * -1)}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.right-2{right:calc(var(--spacing) * 2)}.right-full{right:100%}.-bottom-1{bottom:calc(var(--spacing) * -1)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-full{bottom:100%}.-left-1{left:calc(var(--spacing) * -1)}.left-0{left:calc(var(--spacing) * 0)}.left-1{left:calc(var(--spacing) * 1)}.left-1\\/2{left:50%}.left-3{left:calc(var(--spacing) * 3)}.left-full{left:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.row-1{grid-row:1}.row-2{grid-row:2}.row-3{grid-row:3}.row-4{grid-row:4}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing) * -1)}.m-0{margin:calc(var(--spacing) * 0)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-6{margin-inline:calc(var(--spacing) * -6)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.my-1{margin-block:calc(var(--spacing) * 1)}.my-2{margin-block:calc(var(--spacing) * 2)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-0\\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-\\[50\\%\\]{margin-left:50%}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-0{width:calc(var(--spacing) * 0);height:calc(var(--spacing) * 0)}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.size-full{width:100%;height:100%}.h-0{height:calc(var(--spacing) * 0)}.h-0\\.5{height:calc(var(--spacing) * .5)}.h-1{height:calc(var(--spacing) * 1)}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-56{height:calc(var(--spacing) * 56)}.h-64{height:calc(var(--spacing) * 64)}.h-72{height:calc(var(--spacing) * 72)}.h-96{height:calc(var(--spacing) * 96)}.h-\\[18px\\]{height:18px}.h-\\[20rem\\]{height:20rem}.h-\\[400px\\]{height:400px}.h-\\[480px\\]{height:480px}.h-\\[560px\\]{height:560px}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-\\[30vh\\]{max-height:30vh}.max-h-\\[50vh\\]{max-height:50vh}.max-h-\\[70vh\\]{max-height:70vh}.max-h-\\[85dvh\\]{max-height:85dvh}.max-h-\\[85vh\\]{max-height:85vh}.max-h-\\[calc\\(100dvh-2rem\\)\\]{max-height:calc(100dvh - 2rem)}.max-h-full{max-height:100%}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-\\[120px\\]{min-height:120px}.w-0{width:calc(var(--spacing) * 0)}.w-0\\.5{width:calc(var(--spacing) * .5)}.w-1{width:calc(var(--spacing) * 1)}.w-1\\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\\.5{width:calc(var(--spacing) * 2.5)}.w-2\\/5{width:40%}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-24{width:calc(var(--spacing) * 24)}.w-48{width:calc(var(--spacing) * 48)}.w-64{width:calc(var(--spacing) * 64)}.w-80{width:calc(var(--spacing) * 80)}.w-\\[28rem\\]{width:28rem}.w-\\[36rem\\]{width:36rem}.w-\\[85\\%\\]{width:85%}.w-\\[85vw\\]{width:85vw}.w-\\[256px\\]{width:256px}.w-\\[284px\\]{width:284px}.w-\\[312px\\]{width:312px}.w-\\[N\\%\\]{width:N%}.w-auto{width:auto}.w-dvw{width:100dvw}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\\[16rem\\]{max-width:16rem}.max-w-\\[20rem\\]{max-width:20rem}.max-w-\\[24rem\\]{max-width:24rem}.max-w-\\[28rem\\]{max-width:28rem}.max-w-\\[80\\%\\]{max-width:80%}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-7{min-width:calc(var(--spacing) * 7)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-16{min-width:calc(var(--spacing) * 16)}.min-w-24{min-width:calc(var(--spacing) * 24)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-\\[17\\.5rem\\]{min-width:17.5rem}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:50%}.-translate-x-1{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3{--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3\\.5{--tw-translate-x:calc(var(--spacing) * 3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-\\[0\\.98\\]{scale:.98}.-rotate-90{rotate:-90deg}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-px{gap:1px}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-t-3xl{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-2xl{border-top-left-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-l-3xl{border-top-left-radius:var(--radius-3xl);border-bottom-left-radius:var(--radius-3xl)}.rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-2xl{border-top-right-radius:var(--radius-2xl);border-bottom-right-radius:var(--radius-2xl)}.rounded-r-3xl{border-top-right-radius:var(--radius-3xl);border-bottom-right-radius:var(--radius-3xl)}.rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-b-3xl{border-bottom-right-radius:var(--radius-3xl);border-bottom-left-radius:var(--radius-3xl)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\\[var\\(--color-border\\)\\]{border-color:var(--color-border)}.border-\\[var\\(--color-danger\\)\\]{border-color:var(--color-danger)}.border-\\[var\\(--color-inverse-text\\)\\]\\/80{border-color:var(--color-inverse-text)}@supports (color:color-mix(in lab, red, red)){.border-\\[var\\(--color-inverse-text\\)\\]\\/80{border-color:color-mix(in oklab, var(--color-inverse-text) 80%, transparent)}}.border-\\[var\\(--color-primary\\)\\]{border-color:var(--color-primary)}.border-transparent{border-color:#0000}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-l-\\[rgba\\(255\\,255\\,255\\,0\\.2\\)\\]{border-left-color:#fff3}.border-l-\\[var\\(--color-border\\)\\]{border-left-color:var(--color-border)}.bg-\\[\\#28C840\\]{background-color:#28c840}.bg-\\[\\#FEBC2E\\]{background-color:#febc2e}.bg-\\[\\#FF5F57\\]{background-color:#ff5f57}.bg-\\[color-mix\\(in_oklch\\,var\\(--color-inverse-surface\\)_80\\%\\,transparent\\)\\]{background-color:var(--color-inverse-surface)}@supports (color:color-mix(in lab, red, red)){.bg-\\[color-mix\\(in_oklch\\,var\\(--color-inverse-surface\\)_80\\%\\,transparent\\)\\]{background-color:color-mix(in oklch,var(--color-inverse-surface) 80%,transparent)}}.bg-\\[color-mix\\(in_oklch\\,var\\(--color-primary\\)_10\\%\\,transparent\\)\\]{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-\\[color-mix\\(in_oklch\\,var\\(--color-primary\\)_10\\%\\,transparent\\)\\]{background-color:color-mix(in oklch,var(--color-primary) 10%,transparent)}}.bg-\\[color-mix\\(in_oklch\\,var\\(--color-secondary\\)_40\\%\\,transparent\\)\\]{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-\\[color-mix\\(in_oklch\\,var\\(--color-secondary\\)_40\\%\\,transparent\\)\\]{background-color:color-mix(in oklch,var(--color-secondary) 40%,transparent)}}.bg-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_15\\%\\,var\\(--color-bg\\)\\)\\]{background-color:var(--color-text)}@supports (color:color-mix(in lab, red, red)){.bg-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_15\\%\\,var\\(--color-bg\\)\\)\\]{background-color:color-mix(in oklch,var(--color-text) 15%,var(--color-bg))}}.bg-\\[var\\(--color-border\\)\\]{background-color:var(--color-border)}.bg-\\[var\\(--color-danger\\)\\]{background-color:var(--color-danger)}.bg-\\[var\\(--color-inverse-surface\\)\\]\\/20{background-color:var(--color-inverse-surface)}@supports (color:color-mix(in lab, red, red)){.bg-\\[var\\(--color-inverse-surface\\)\\]\\/20{background-color:color-mix(in oklab, var(--color-inverse-surface) 20%, transparent)}}.bg-\\[var\\(--color-primary\\)\\]{background-color:var(--color-primary)}.bg-\\[var\\(--color-secondary\\)\\]{background-color:var(--color-secondary)}.bg-\\[var\\(--color-surface\\)\\]{background-color:var(--color-surface)}.bg-\\[var\\(--color-surface-overlay\\)\\]{background-color:var(--color-surface-overlay)}.bg-\\[var\\(--scrollbar-thumb\\,var\\(--color-text-muted\\)\\)\\]{background-color:var(--scrollbar-thumb,var(--color-text-muted))}.bg-\\[var\\(--scrollbar-track\\,var\\(--color-secondary\\)\\)\\]{background-color:var(--scrollbar-track,var(--color-secondary))}.bg-black{background-color:var(--color-black)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-1\\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-3\\.5{padding-right:calc(var(--spacing) * 3.5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-24{padding-right:calc(var(--spacing) * 24)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-3\\.5{padding-bottom:calc(var(--spacing) * 3.5)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[0\\.5rem\\]{font-size:.5rem}.text-\\[0\\.625rem\\]{font-size:.625rem}.text-\\[10px\\]{font-size:10px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-9{--tw-leading:calc(var(--spacing) * 9);line-height:calc(var(--spacing) * 9)}.leading-10{--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10)}.leading-loose{--tw-leading:var(--leading-loose);line-height:var(--leading-loose)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.\\[text-wrap\\:balance\\],.text-balance{text-wrap:balance}.text-wrap{text-wrap:wrap}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[color-mix\\(in_oklch\\,var\\(--color-inverse-text\\)_70\\%\\,transparent\\)\\]{color:var(--color-inverse-text)}@supports (color:color-mix(in lab, red, red)){.text-\\[color-mix\\(in_oklch\\,var\\(--color-inverse-text\\)_70\\%\\,transparent\\)\\]{color:color-mix(in oklch,var(--color-inverse-text) 70%,transparent)}}.text-\\[var\\(--color-danger\\)\\]{color:var(--color-danger)}.text-\\[var\\(--color-error\\)\\]{color:var(--color-error)}.text-\\[var\\(--color-inverse-text\\)\\],.text-\\[var\\(--color-inverse-text\\)\\]\\/80{color:var(--color-inverse-text)}@supports (color:color-mix(in lab, red, red)){.text-\\[var\\(--color-inverse-text\\)\\]\\/80{color:color-mix(in oklab, var(--color-inverse-text) 80%, transparent)}}.text-\\[var\\(--color-on-primary\\)\\]{color:var(--color-on-primary)}.text-\\[var\\(--color-primary\\)\\]{color:var(--color-primary)}.text-\\[var\\(--color-success\\)\\]{color:var(--color-success)}.text-\\[var\\(--color-text\\)\\]{color:var(--color-text)}.text-\\[var\\(--color-text-inverse\\)\\]{color:var(--color-text-inverse)}.text-\\[var\\(--color-text-inverted\\)\\]{color:var(--color-text-inverted)}.text-\\[var\\(--color-text-muted\\)\\]{color:var(--color-text-muted)}.text-\\[var\\(--color-text-primary\\)\\]{color:var(--color-text-primary)}.text-\\[var\\(--color-text-secondary\\)\\]{color:var(--color-text-secondary)}.text-black{color:var(--color-black)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.decoration-1{text-decoration-thickness:1px}.decoration-2{text-decoration-thickness:2px}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-\\[var\\(--color-border\\)\\]{--tw-ring-color:var(--color-border)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.brightness-110{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[border-radius\\,padding\\,background-color\\]{transition-property:border-radius,padding,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-0{--tw-duration:0s;transition-duration:0s}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-\\[10ms\\]{--tw-duration:10ms;transition-duration:10ms}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\\[rq\\:hmr\\]{rq:hmr}.\\[rq\\:tier0\\]{rq:tier0}.\\[rq\\:tier1\\]{rq:tier1}.\\[rq\\:tier2\\]{rq:tier2}.\\[rq\\:tier3\\]{rq:tier3}.\\[rq\\:watch\\]{rq:watch}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}@media (hover:hover){.group-hover\\:opacity-70:is(:where(.group):hover *){opacity:.7}.group-hover\\/tooltip\\:visible:is(:where(.group\\/tooltip):hover *){visibility:visible}.group-hover\\/tooltip\\:translate-x-0:is(:where(.group\\/tooltip):hover *){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\\/tooltip\\:translate-y-0:is(:where(.group\\/tooltip):hover *){--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\\/tooltip\\:scale-100:is(:where(.group\\/tooltip):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\\/tooltip\\:opacity-100:is(:where(.group\\/tooltip):hover *){opacity:1}}.group-has-\\[\\:focus-visible\\]\\/tooltip\\:visible:is(:where(.group\\/tooltip):has(:focus-visible) *){visibility:visible}.group-has-\\[\\:focus-visible\\]\\/tooltip\\:translate-x-0:is(:where(.group\\/tooltip):has(:focus-visible) *){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-has-\\[\\:focus-visible\\]\\/tooltip\\:translate-y-0:is(:where(.group\\/tooltip):has(:focus-visible) *){--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-has-\\[\\:focus-visible\\]\\/tooltip\\:scale-100:is(:where(.group\\/tooltip):has(:focus-visible) *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-has-\\[\\:focus-visible\\]\\/tooltip\\:opacity-100:is(:where(.group\\/tooltip):has(:focus-visible) *){opacity:1}.group-data-\\[multiline\\]\\:flex:is(:where(.group)[data-multiline] *){display:flex}.group-data-\\[multiline\\]\\:hidden:is(:where(.group)[data-multiline] *){display:none}.group-data-\\[multiline\\]\\:w-full:is(:where(.group)[data-multiline] *){width:100%}.peer-checked\\:border-\\[var\\(--color-primary\\)\\]:is(:where(.peer):checked~*){border-color:var(--color-primary)}.peer-checked\\:bg-\\[var\\(--color-primary\\)\\]:is(:where(.peer):checked~*){background-color:var(--color-primary)}.peer-checked\\:text-\\[var\\(--color-text-inverse\\)\\]:is(:where(.peer):checked~*){color:var(--color-text-inverse)}.peer-focus-visible\\:ring-2:is(:where(.peer):focus-visible~*){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.peer-focus-visible\\:ring-\\[var\\(--color-ring\\)\\]:is(:where(.peer):focus-visible~*){--tw-ring-color:var(--color-ring)}.peer-focus-visible\\:ring-offset-2:is(:where(.peer):focus-visible~*){--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.peer-focus-visible\\:ring-offset-\\[var\\(--color-bg\\)\\]:is(:where(.peer):focus-visible~*){--tw-ring-offset-color:var(--color-bg)}.placeholder\\:text-\\[var\\(--color-text-muted\\)\\]::placeholder{color:var(--color-text-muted)}.placeholder\\:text-zinc-400::placeholder{color:var(--color-zinc-400)}.even\\:bg-\\[var\\(--color-surface-overlay\\)\\]:nth-child(2n){background-color:var(--color-surface-overlay)}.open\\:flex:is([open],:popover-open,:open){display:flex}.open\\:grid:is([open],:popover-open,:open){display:grid}.focus-within\\:border-\\[var\\(--color-border-focus\\)\\]:focus-within{border-color:var(--color-border-focus)}.focus-within\\:border-\\[var\\(--color-error\\)\\]:focus-within{border-color:var(--color-error)}.focus-within\\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\\:ring-\\[var\\(--color-ring\\)\\]:focus-within{--tw-ring-color:var(--color-ring)}.focus-within\\:ring-offset-2:focus-within{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-within\\:ring-offset-\\[var\\(--color-bg\\)\\]:focus-within{--tw-ring-offset-color:var(--color-bg)}.focus-within\\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\\:border-\\[var\\(--color-border-focus\\)\\]:hover{border-color:var(--color-border-focus)}.hover\\:border-\\[var\\(--color-error\\)\\]:hover{border-color:var(--color-error)}.hover\\:border-\\[var\\(--color-info\\)\\]:hover{border-color:var(--color-info)}.hover\\:border-\\[var\\(--color-primary\\)\\]:hover{border-color:var(--color-primary)}.hover\\:border-\\[var\\(--color-success\\)\\]:hover{border-color:var(--color-success)}.hover\\:border-\\[var\\(--color-warning\\)\\]:hover{border-color:var(--color-warning)}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_4\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_4\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 4%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_5\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_5\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 5%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_6\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_6\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 6%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_8\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_8\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 8%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_10\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_10\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 10%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_12\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_12\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 12%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_15\\%\\,transparent\\)\\]:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,currentColor_15\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,currentColor 15%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_5\\%\\,transparent\\)\\]:hover{background-color:var(--color-text)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_5\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,var(--color-text) 5%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_20\\%\\,var\\(--color-bg\\)\\)\\]:hover{background-color:var(--color-text)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_20\\%\\,var\\(--color-bg\\)\\)\\]:hover{background-color:color-mix(in oklch,var(--color-text) 20%,var(--color-bg))}}.hover\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-text-muted\\)_12\\%\\,transparent\\)\\]:hover{background-color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-text-muted\\)_12\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklch,var(--color-text-muted) 12%,transparent)}}.hover\\:bg-\\[var\\(--color-inverse-surface\\)\\]\\/40:hover{background-color:var(--color-inverse-surface)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[var\\(--color-inverse-surface\\)\\]\\/40:hover{background-color:color-mix(in oklab, var(--color-inverse-surface) 40%, transparent)}}.hover\\:bg-\\[var\\(--color-primary\\)\\]:hover{background-color:var(--color-primary)}.hover\\:bg-\\[var\\(--color-primary-hover\\)\\]:hover{background-color:var(--color-primary-hover)}.hover\\:bg-\\[var\\(--color-secondary\\)\\]:hover{background-color:var(--color-secondary)}.hover\\:bg-\\[var\\(--color-secondary-hover\\)\\]:hover{background-color:var(--color-secondary-hover)}.hover\\:bg-\\[var\\(--color-surface-overlay\\)\\]:hover{background-color:var(--color-surface-overlay)}.hover\\:text-\\[var\\(--color-inverse-text\\)\\]:hover,.hover\\:text-\\[var\\(--color-inverse-text\\)\\]\\/80:hover{color:var(--color-inverse-text)}@supports (color:color-mix(in lab, red, red)){.hover\\:text-\\[var\\(--color-inverse-text\\)\\]\\/80:hover{color:color-mix(in oklab, var(--color-inverse-text) 80%, transparent)}}.hover\\:text-\\[var\\(--color-primary\\)\\]:hover{color:var(--color-primary)}.hover\\:text-\\[var\\(--color-primary-hover\\)\\]:hover{color:var(--color-primary-hover)}.hover\\:text-\\[var\\(--color-text\\)\\]:hover{color:var(--color-text)}.hover\\:decoration-solid:hover{text-decoration-style:solid}.hover\\:\\!opacity-100:hover{opacity:1!important}.hover\\:opacity-100:hover{opacity:1}.hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\\:ring-\\[var\\(--color-ring\\)\\]:hover{--tw-ring-color:var(--color-ring)}.hover\\:brightness-95:hover{--tw-brightness:brightness(95%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.hover\\:brightness-\\[0\\.98\\]:hover{--tw-brightness:brightness(.98);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.hover\\:brightness-\\[1\\.03\\]:hover{--tw-brightness:brightness(1.03);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\\:ring-offset-zinc-900:focus{--tw-ring-offset-color:var(--color-zinc-900)}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:border-\\[var\\(--color-border-focus\\)\\]:focus-visible{border-color:var(--color-border-focus)}.focus-visible\\:border-\\[var\\(--color-error\\)\\]:focus-visible{border-color:var(--color-error)}.focus-visible\\:bg-\\[var\\(--color-primary\\)\\]:focus-visible{background-color:var(--color-primary)}.focus-visible\\:bg-\\[var\\(--color-secondary\\)\\]:focus-visible{background-color:var(--color-secondary)}.focus-visible\\:\\!opacity-100:focus-visible{opacity:1!important}.focus-visible\\:opacity-100:focus-visible{opacity:1}.focus-visible\\:ring:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-\\[var\\(--color-primary\\)\\]:focus-visible{--tw-ring-color:var(--color-primary)}.focus-visible\\:ring-\\[var\\(--color-ring\\)\\]:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\\:ring-offset-\\[var\\(--color-bg\\)\\]:focus-visible{--tw-ring-offset-color:var(--color-bg)}.focus-visible\\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-offset-1:focus-visible{outline-offset:1px}.focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\\:outline-\\[var\\(--color-inverse-text\\)\\]:focus-visible{outline-color:var(--color-inverse-text)}.focus-visible\\:outline-\\[var\\(--color-ring\\)\\]:focus-visible{outline-color:var(--color-ring)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\\:translate-y-0:active{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.active\\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\\:scale-\\[0\\.97\\]:active{scale:.97}.active\\:cursor-grabbing:active{cursor:grabbing}.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_8\\%\\,transparent\\)\\]:active{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_8\\%\\,transparent\\)\\]:active{background-color:color-mix(in oklch,currentColor 8%,transparent)}}.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_15\\%\\,transparent\\)\\]:active{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_15\\%\\,transparent\\)\\]:active{background-color:color-mix(in oklch,currentColor 15%,transparent)}}.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_18\\%\\,transparent\\)\\]:active{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_18\\%\\,transparent\\)\\]:active{background-color:color-mix(in oklch,currentColor 18%,transparent)}}.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_25\\%\\,transparent\\)\\]:active{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.active\\:bg-\\[color-mix\\(in_oklch\\,currentColor_25\\%\\,transparent\\)\\]:active{background-color:color-mix(in oklch,currentColor 25%,transparent)}}.active\\:bg-\\[var\\(--color-primary-active\\)\\]:active{background-color:var(--color-primary-active)}.active\\:bg-\\[var\\(--color-secondary-hover\\)\\]:active{background-color:var(--color-secondary-hover)}.active\\:shadow-sm:active{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.active\\:brightness-95:active{--tw-brightness:brightness(95%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:opacity-50:disabled{opacity:.5}.has-\\[input\\:focus\\]\\:ring-2:has(:is(input:focus)){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.has-\\[input\\:focus\\]\\:ring-\\[var\\(--color-ring\\)\\]:has(:is(input:focus)){--tw-ring-color:var(--color-ring)}.has-\\[input\\:focus\\]\\:ring-offset-2:has(:is(input:focus)){--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.has-\\[input\\:focus\\]\\:ring-offset-\\[var\\(--color-bg\\)\\]:has(:is(input:focus)){--tw-ring-offset-color:var(--color-bg)}.has-\\[input\\:focus\\]\\:outline-none:has(:is(input:focus)){--tw-outline-style:none;outline-style:none}.data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\\[disabled\\=true\\]\\:cursor-default[data-disabled=true]{cursor:default}.data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.data-\\[drag\\=accept\\]\\:outline-2[data-drag=accept]{outline-style:var(--tw-outline-style);outline-width:2px}.data-\\[drag\\=accept\\]\\:outline-offset-8[data-drag=accept]{outline-offset:8px}.data-\\[drag\\=accept\\]\\:outline-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_15\\%\\,var\\(--color-bg\\)\\)\\][data-drag=accept]{outline-color:var(--color-text)}@supports (color:color-mix(in lab, red, red)){.data-\\[drag\\=accept\\]\\:outline-\\[color-mix\\(in_oklch\\,var\\(--color-text\\)_15\\%\\,var\\(--color-bg\\)\\)\\][data-drag=accept]{outline-color:color-mix(in oklch,var(--color-text) 15%,var(--color-bg))}}.data-\\[drag\\=accept\\]\\:outline-\\[var\\(--color-inverse-surface\\)\\][data-drag=accept]{outline-color:var(--color-inverse-surface)}.data-\\[drag\\=accept\\]\\:outline-\\[var\\(--color-surface-raised\\)\\][data-drag=accept]{outline-color:var(--color-surface-raised)}.data-\\[drag\\=accept\\]\\:brightness-110[data-drag=accept]{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.data-\\[drag\\=accept\\]\\:outline-dashed[data-drag=accept]{--tw-outline-style:dashed;outline-style:dashed}.data-\\[drag\\=reject\\]\\:outline-2[data-drag=reject]{outline-style:var(--tw-outline-style);outline-width:2px}.data-\\[drag\\=reject\\]\\:outline-offset-8[data-drag=reject]{outline-offset:8px}.data-\\[drag\\=reject\\]\\:outline-\\[var\\(--color-error\\)\\][data-drag=reject]{outline-color:var(--color-error)}.data-\\[drag\\=reject\\]\\:outline-dashed[data-drag=reject]{--tw-outline-style:dashed;outline-style:dashed}.data-\\[focused\\=true\\]\\:bg-\\[var\\(--color-secondary\\)\\][data-focused=true]{background-color:var(--color-secondary)}.data-\\[multiline\\]\\:flex-col[data-multiline]{flex-direction:column}.data-\\[multiline\\]\\:items-stretch[data-multiline]{align-items:stretch}.data-\\[multiline\\]\\:gap-0[data-multiline]{gap:calc(var(--spacing) * 0)}.data-\\[multiline\\]\\:rounded-2xl[data-multiline]{border-radius:var(--radius-2xl)}.data-\\[multiline\\]\\:px-2[data-multiline]{padding-inline:calc(var(--spacing) * 2)}.data-\\[multiline\\]\\:px-2\\.5[data-multiline]{padding-inline:calc(var(--spacing) * 2.5)}.data-\\[multiline\\]\\:px-3[data-multiline]{padding-inline:calc(var(--spacing) * 3)}.data-\\[multiline\\]\\:px-3\\.5[data-multiline]{padding-inline:calc(var(--spacing) * 3.5)}.data-\\[multiline\\]\\:px-4[data-multiline]{padding-inline:calc(var(--spacing) * 4)}.data-\\[multiline\\]\\:pt-2[data-multiline]{padding-top:calc(var(--spacing) * 2)}.data-\\[multiline\\]\\:pt-2\\.5[data-multiline]{padding-top:calc(var(--spacing) * 2.5)}.data-\\[multiline\\]\\:pt-3[data-multiline]{padding-top:calc(var(--spacing) * 3)}.data-\\[multiline\\]\\:pt-3\\.5[data-multiline]{padding-top:calc(var(--spacing) * 3.5)}.data-\\[multiline\\]\\:pt-4[data-multiline]{padding-top:calc(var(--spacing) * 4)}.data-\\[open\\]\\:block[data-open]{display:block}.data-\\[open\\]\\:flex[data-open]{display:flex}.data-\\[open\\]\\:grid[data-open]{display:grid}.data-\\[open\\]\\:inline-flex[data-open]{display:inline-flex}.data-\\[selected\\=true\\]\\:font-medium[data-selected=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}@media not all and (min-width:48rem){.max-md\\:block{display:block}.max-md\\:hidden{display:none}}@media (min-width:40rem){.sm\\:right-2{right:calc(var(--spacing) * 2)}.sm\\:left-2{left:calc(var(--spacing) * 2)}.sm\\:w-\\[80\\%\\]{width:80%}.sm\\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\\:right-0{right:calc(var(--spacing) * 0)}.md\\:right-4{right:calc(var(--spacing) * 4)}.md\\:left-0{left:calc(var(--spacing) * 0)}.md\\:left-4{left:calc(var(--spacing) * 4)}.md\\:left-auto{left:auto}.md\\:m-4{margin:calc(var(--spacing) * 4)}.md\\:block{display:block}.md\\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.md\\:size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.md\\:h-6{height:calc(var(--spacing) * 6)}.md\\:h-9{height:calc(var(--spacing) * 9)}.md\\:h-auto{height:auto}.md\\:max-h-\\[calc\\(100dvh-4rem\\)\\]{max-height:calc(100dvh - 4rem)}.md\\:max-h-none{max-height:none}.md\\:w-11{width:calc(var(--spacing) * 11)}.md\\:w-\\[60\\%\\]{width:60%}.md\\:w-full{width:100%}.md\\:max-w-full{max-width:100%}.md\\:max-w-lg{max-width:var(--container-lg)}.md\\:max-w-md{max-width:var(--container-md)}.md\\:max-w-sm{max-width:var(--container-sm)}.md\\:max-w-xl{max-width:var(--container-xl)}.md\\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:place-items-center{place-items:center}.md\\:justify-normal{justify-content:normal}.md\\:gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.md\\:gap-2{gap:calc(var(--spacing) * 2)}.md\\:gap-3{gap:calc(var(--spacing) * 3)}.md\\:gap-4{gap:calc(var(--spacing) * 4)}.md\\:overflow-y-auto{overflow-y:auto}.md\\:overscroll-contain{overscroll-behavior:contain}.md\\:rounded-xl{border-radius:var(--radius-xl)}.md\\:p-4{padding:calc(var(--spacing) * 4)}.md\\:p-6{padding:calc(var(--spacing) * 6)}.md\\:p-8{padding:calc(var(--spacing) * 8)}.md\\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\\:py-8{padding-block:calc(var(--spacing) * 8)}.md\\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.md\\:open\\:grid:is([open],:popover-open,:open){display:grid}}@media (min-width:64rem){.lg\\:m-6{margin:calc(var(--spacing) * 6)}.lg\\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.lg\\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.lg\\:h-10{height:calc(var(--spacing) * 10)}.lg\\:h-\\[480px\\]{height:480px}.lg\\:w-\\[55\\%\\]{width:55%}.lg\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\\:gap-5{gap:calc(var(--spacing) * 5)}.lg\\:gap-x-4{column-gap:calc(var(--spacing) * 4)}.lg\\:p-5{padding:calc(var(--spacing) * 5)}.lg\\:p-8{padding:calc(var(--spacing) * 8)}.lg\\:p-10{padding:calc(var(--spacing) * 10)}.lg\\:px-3{padding-inline:calc(var(--spacing) * 3)}.lg\\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\\:px-12{padding-inline:calc(var(--spacing) * 12)}.lg\\:py-10{padding-block:calc(var(--spacing) * 10)}.lg\\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.lg\\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.lg\\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}@media (min-width:80rem){.xl\\:w-\\[50\\%\\]{width:50%}.xl\\:gap-6{gap:calc(var(--spacing) * 6)}.xl\\:px-16{padding-inline:calc(var(--spacing) * 16)}}@media (min-width:96rem){.\\32 xl\\:px-8{padding-inline:calc(var(--spacing) * 8)}}@media (prefers-color-scheme:dark){.dark\\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\\:text-zinc-100{color:var(--color-zinc-100)}.dark\\:text-zinc-300{color:var(--color-zinc-300)}.dark\\:focus\\:ring-offset-zinc-900:focus{--tw-ring-offset-color:var(--color-zinc-900)}}.\\[data-pressed\\=true\\]\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-primary\\)_var\\(--cx-pressed-tint\\,15\\%\\)\\,transparent\\)\\]:is(){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.\\[data-pressed\\=true\\]\\:bg-\\[color-mix\\(in_oklch\\,var\\(--color-primary\\)_var\\(--cx-pressed-tint\\,15\\%\\)\\,transparent\\)\\]:is(){background-color:color-mix(in oklch,var(--color-primary) var(--cx-pressed-tint,15%),transparent)}}.\\[data-pressed\\=true\\]\\:text-\\[var\\(--cx-pressed-text\\)\\]:is(){color:var(--cx-pressed-text)}.\\[data-state\\=indeterminate\\]\\:border-\\[var\\(--color-primary\\)\\]:is(){border-color:var(--color-primary)}.\\[data-state\\=indeterminate\\]\\:bg-\\[var\\(--color-primary\\)\\]:is(){background-color:var(--color-primary)}.\\[data-state\\=indeterminate\\]\\:text-\\[var\\(--color-text-inverse\\)\\]:is(){color:var(--color-text-inverse)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}`;