@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.
- package/README.md +77 -0
- package/custom-elements.json +6037 -0
- package/generated/.gitattributes +2 -0
- package/generated/index.d.ts +120 -0
- package/generated/index.js +521 -0
- package/generated/styles.js +2845 -0
- package/package.json +56 -0
- package/src/elements/accordion.d.ts +20 -0
- package/src/elements/accordion.js +92 -0
- package/src/elements/activity_group.d.ts +19 -0
- package/src/elements/activity_group.js +27 -0
- package/src/elements/alert.d.ts +24 -0
- package/src/elements/alert.js +40 -0
- package/src/elements/autocomplete.d.ts +30 -0
- package/src/elements/autocomplete.js +671 -0
- package/src/elements/avatar.d.ts +18 -0
- package/src/elements/avatar.js +28 -0
- package/src/elements/backdrop.d.ts +14 -0
- package/src/elements/backdrop.js +28 -0
- package/src/elements/badge.d.ts +21 -0
- package/src/elements/badge.js +42 -0
- package/src/elements/breadcrumb.d.ts +17 -0
- package/src/elements/breadcrumb.js +41 -0
- package/src/elements/button.d.ts +24 -0
- package/src/elements/button.js +36 -0
- package/src/elements/card.d.ts +21 -0
- package/src/elements/card.js +67 -0
- package/src/elements/carousel.d.ts +23 -0
- package/src/elements/carousel.js +895 -0
- package/src/elements/chat_input.d.ts +22 -0
- package/src/elements/chat_input.js +78 -0
- package/src/elements/checkbox.d.ts +21 -0
- package/src/elements/checkbox.js +114 -0
- package/src/elements/code_block.d.ts +21 -0
- package/src/elements/code_block.js +27 -0
- package/src/elements/collapsible.d.ts +20 -0
- package/src/elements/collapsible.js +93 -0
- package/src/elements/date_picker.d.ts +30 -0
- package/src/elements/date_picker.js +528 -0
- package/src/elements/dialog.d.ts +20 -0
- package/src/elements/dialog.js +314 -0
- package/src/elements/drawer.d.ts +20 -0
- package/src/elements/drawer.js +318 -0
- package/src/elements/fab.d.ts +22 -0
- package/src/elements/fab.js +36 -0
- package/src/elements/file_upload.d.ts +26 -0
- package/src/elements/file_upload.js +59 -0
- package/src/elements/listbox.d.ts +19 -0
- package/src/elements/listbox.js +250 -0
- package/src/elements/menu.d.ts +20 -0
- package/src/elements/menu.js +224 -0
- package/src/elements/message_bubble.d.ts +23 -0
- package/src/elements/message_bubble.js +29 -0
- package/src/elements/message_group.d.ts +18 -0
- package/src/elements/message_group.js +28 -0
- package/src/elements/message_part.d.ts +35 -0
- package/src/elements/message_part.js +153 -0
- package/src/elements/pagination.d.ts +22 -0
- package/src/elements/pagination.js +36 -0
- package/src/elements/popover.d.ts +26 -0
- package/src/elements/popover.js +191 -0
- package/src/elements/profile_menu.d.ts +20 -0
- package/src/elements/profile_menu.js +213 -0
- package/src/elements/progress.d.ts +18 -0
- package/src/elements/progress.js +31 -0
- package/src/elements/radio_group.d.ts +22 -0
- package/src/elements/radio_group.js +70 -0
- package/src/elements/scrollbar.d.ts +19 -0
- package/src/elements/scrollbar.js +299 -0
- package/src/elements/search_bar.d.ts +27 -0
- package/src/elements/search_bar.js +98 -0
- package/src/elements/select.d.ts +26 -0
- package/src/elements/select.js +485 -0
- package/src/elements/sidebar.d.ts +21 -0
- package/src/elements/sidebar.js +322 -0
- package/src/elements/skeleton.d.ts +17 -0
- package/src/elements/skeleton.js +31 -0
- package/src/elements/slider.d.ts +28 -0
- package/src/elements/slider.js +93 -0
- package/src/elements/speed_dial.d.ts +23 -0
- package/src/elements/speed_dial.js +370 -0
- package/src/elements/spinner.d.ts +15 -0
- package/src/elements/spinner.js +28 -0
- package/src/elements/split_button.d.ts +23 -0
- package/src/elements/split_button.js +281 -0
- package/src/elements/stepper.d.ts +20 -0
- package/src/elements/stepper.js +31 -0
- package/src/elements/switch.d.ts +22 -0
- package/src/elements/switch.js +129 -0
- package/src/elements/table.d.ts +29 -0
- package/src/elements/table.js +371 -0
- package/src/elements/tabs.d.ts +19 -0
- package/src/elements/tabs.js +139 -0
- package/src/elements/text.d.ts +26 -0
- package/src/elements/text.js +32 -0
- package/src/elements/text_input.d.ts +36 -0
- package/src/elements/text_input.js +121 -0
- package/src/elements/thinking.d.ts +17 -0
- package/src/elements/thinking.js +28 -0
- package/src/elements/toast.d.ts +23 -0
- package/src/elements/toast.js +209 -0
- package/src/elements/toggle_group.d.ts +22 -0
- package/src/elements/toggle_group.js +176 -0
- package/src/elements/tooltip.d.ts +18 -0
- package/src/elements/tooltip.js +64 -0
- package/src/markdown.d.ts +24 -0
- package/src/markdown.js +66 -0
- package/src/runtime.d.ts +35 -0
- package/src/runtime.js +790 -0
- package/src/server.d.ts +69 -0
- package/src/server.js +176 -0
- package/src/streaming-markdown.js +43 -0
- package/src/vite-plugin.d.ts +46 -0
- package/src/vite-plugin.js +221 -0
- package/wasm/package.json +16 -0
- package/wasm/wasm_api.d.ts +72 -0
- package/wasm/wasm_api.js +593 -0
- package/wasm/wasm_api_bg.wasm +0 -0
- 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}}`;
|