odt-ui-rails 2.2.3 → 2.2.5

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.
@@ -1,2 +1,2428 @@
1
- @import "odt_ui/tokens.css";
2
- @import "odt_ui/styles.css";
1
+ /* ==========================================================================
2
+ * ODT UI Standalone Bundle (Tokens + Components)
3
+ * ========================================================================== */
4
+
5
+ /* Design Tokens */
6
+ :root {
7
+ /* ==========================================================================
8
+ * Primary Brand Colors (ODT)
9
+ * ========================================================================== */
10
+ --color-primary-0: hsl(240 78.3% 100%);
11
+ --color-primary-50: hsl(240 78.3% 95%);
12
+ --color-primary-100: hsl(240 78.3% 90%);
13
+ --color-primary-200: hsl(240 78.3% 85%);
14
+ --color-primary-300: hsl(240 78.3% 80%);
15
+ --color-primary-400: hsl(240 78.3% 75%);
16
+ --color-primary-500: hsl(240 78.3% 65%);
17
+ --color-primary-600: hsl(240 78.3% 60%);
18
+ --color-primary-700: hsl(240 78.3% 55%);
19
+ --color-primary-800: hsl(240 78.3% 45%);
20
+ --color-primary-900: hsl(240 78.3% 34.3%);
21
+
22
+ /* ==========================================================================
23
+ * Secondary Brand Colors (ODT)
24
+ * ========================================================================== */
25
+ --color-secondary-0: hsl(47 100% 100%);
26
+ --color-secondary-50: hsl(47 100% 95%);
27
+ --color-secondary-100: hsl(47 100% 85%);
28
+ --color-secondary-200: hsl(47 100% 80%);
29
+ --color-secondary-300: hsl(47 100% 75%);
30
+ --color-secondary-400: hsl(47 100% 70%);
31
+ --color-secondary-500: hsl(47 100% 65%);
32
+ --color-secondary-600: hsl(47 100% 60%);
33
+ --color-secondary-700: hsl(47 100% 55%);
34
+ --color-secondary-800: hsl(47 100% 50%);
35
+ --color-secondary-900: hsl(47 100% 45%);
36
+
37
+ /* ==========================================================================
38
+ * Neutral Palette
39
+ * ========================================================================== */
40
+ --color-neutral-0: hsl(0 0% 100%);
41
+ --color-neutral-50: hsl(240 10% 98%);
42
+ --color-neutral-100: hsl(240 10% 96%);
43
+ --color-neutral-200: hsl(240 9% 90%);
44
+ --color-neutral-300: hsl(240 8% 82%);
45
+ --color-neutral-400: hsl(240 8% 64%);
46
+ --color-neutral-500: hsl(240 7% 46%);
47
+ --color-neutral-600: hsl(240 7% 32%);
48
+ --color-neutral-700: hsl(240 8% 25%);
49
+ --color-neutral-800: hsl(240 10% 15%);
50
+ --color-neutral-900: hsl(240 12% 9%);
51
+ --color-neutral-950: hsl(240 14% 4%);
52
+
53
+ /* ==========================================================================
54
+ * Semantic Colors
55
+ * ========================================================================== */
56
+ --color-success: hsl(142 71% 45%);
57
+ --color-warning: hsl(38 92% 50%);
58
+ --color-danger: hsl(0 84% 60%);
59
+ --color-info: hsl(217 91% 60%);
60
+
61
+ /* Semantic surface tint */
62
+ --color-success-subtle: hsl(142 71% 96%);
63
+ --color-warning-subtle: hsl(38 92% 96%);
64
+ --color-danger-subtle: hsl(0 84% 97%);
65
+ --color-info-subtle: hsl(217 91% 97%);
66
+
67
+ /* ==========================================================================
68
+ * Foreground (Text & Icon)
69
+ * ========================================================================== */
70
+ /* Base */
71
+ --color-fg-strong: var(--color-neutral-800);
72
+ --color-fg: var(--color-neutral-700);
73
+ --color-fg-muted: var(--color-neutral-500);
74
+ --color-fg-subtle: var(--color-neutral-400);
75
+ --color-fg-disabled: var(--color-neutral-300);
76
+
77
+ /* Inverse */
78
+ --color-fg-inverse-strong: var(--color-neutral-0);
79
+ --color-fg-inverse: var(--color-neutral-50);
80
+ --color-fg-inverse-muted: var(--color-neutral-100);
81
+ --color-fg-inverse-subtle: var(--color-neutral-300);
82
+ --color-fg-inverse-disabled: var(--color-neutral-400);
83
+
84
+ /* Brand Foreground */
85
+ --color-fg-primary: var(--color-primary-900);
86
+ --color-fg-secondary: var(--color-secondary-900);
87
+
88
+ /* Semantic Foreground */
89
+ --color-fg-success: var(--color-success);
90
+ --color-fg-warning: var(--color-warning);
91
+ --color-fg-danger: var(--color-danger);
92
+ --color-fg-info: var(--color-info);
93
+
94
+ /* ==========================================================================
95
+ * Button & Solid Controls Foreground (Text & Icon on Solid Controls)
96
+ * ========================================================================== */
97
+ --color-btn-primary-fg: hsl(0 0% 100%);
98
+ --color-btn-secondary-fg: hsl(224 25% 6%);
99
+ --color-btn-surface-fg: var(--color-fg-strong);
100
+ --color-btn-muted-fg: var(--color-fg);
101
+ --color-btn-inverse-fg: var(--color-surface);
102
+ --color-btn-success-fg: hsl(0 0% 100%);
103
+ --color-btn-warning-fg: var(--color-fg-strong);
104
+ --color-btn-danger-fg: hsl(0 0% 100%);
105
+ --color-btn-info-fg: hsl(0 0% 100%);
106
+
107
+ /* Badge Foreground */
108
+ --color-badge-primary-fg: var(--color-btn-primary-fg);
109
+ --color-badge-secondary-fg: var(--color-btn-secondary-fg);
110
+ --color-badge-success-fg: var(--color-btn-success-fg);
111
+ --color-badge-warning-fg: var(--color-btn-warning-fg);
112
+ --color-badge-danger-fg: var(--color-btn-danger-fg);
113
+ --color-badge-info-fg: var(--color-btn-info-fg);
114
+ --color-badge-neutral-fg: var(--color-neutral-0);
115
+
116
+ /* Control (Checkbox / Radio / Switch) Tokens */
117
+ --color-control-checked-fg: hsl(0 0% 100%);
118
+ --color-control-checked-dark-fg: hsl(224 25% 6%);
119
+ --color-switch-thumb: var(--color-neutral-0);
120
+
121
+ /* ==========================================================================
122
+ * Focus Ring
123
+ * ========================================================================== */
124
+ --color-ring: var(--color-primary-300);
125
+ }
126
+
127
+ :root {
128
+ /* ==========================================================================
129
+ * Surfaces & Backgrounds
130
+ * ========================================================================== */
131
+ --color-surface-base: var(--color-surface);
132
+ --color-surface: var(--color-neutral-0);
133
+ --color-surface-muted: var(--color-neutral-50);
134
+ --color-surface-subtle: var(--color-neutral-100);
135
+ --color-surface-elevated: var(--color-neutral-0);
136
+
137
+ --color-surface-primary: var(--color-primary-500);
138
+ --color-surface-secondary: var(--color-secondary-500);
139
+
140
+ --color-surface-success: hsl(142 71% 96%);
141
+ --color-surface-warning: hsl(38 92% 96%);
142
+ --color-surface-danger: hsl(0 84% 97%);
143
+ --color-surface-info: hsl(217 91% 97%);
144
+
145
+ /* ==========================================================================
146
+ * Borders & Lines
147
+ * ========================================================================== */
148
+ --color-line: var(--color-neutral-200);
149
+ --color-line-muted: var(--color-neutral-100);
150
+ --color-line-strong: var(--color-neutral-300);
151
+
152
+ --color-line-primary: var(--color-primary-500);
153
+ --color-line-success: var(--color-success);
154
+ --color-line-warning: var(--color-warning);
155
+ --color-line-danger: var(--color-danger);
156
+
157
+ /* ==========================================================================
158
+ * Overlays & Backdrops
159
+ * ========================================================================== */
160
+ --color-overlay-light: rgb(255 255 255 / 0.6);
161
+ --color-overlay-dark: rgb(0 0 0 / 0.4);
162
+ --color-overlay-backdrop: rgb(0 0 0 / 0.3);
163
+
164
+ /* ==========================================================================
165
+ * Gradients (ODT Standard)
166
+ * ========================================================================== */
167
+ /* Primary subtle background gradient */
168
+ --gradient-subtle: linear-gradient(to top right, var(--color-primary-50), var(--color-primary-0) 60%, var(--color-secondary-50));
169
+ --gradient-hero-primary: var(--gradient-subtle);
170
+
171
+ /* Vibrant accent gradient */
172
+ --gradient-vibrant: linear-gradient(to top right, var(--color-primary-200), var(--color-primary-50) 50%, var(--color-secondary-100));
173
+ --gradient-hero-vibrant: var(--gradient-vibrant);
174
+
175
+ /* Card surface gradients */
176
+ --gradient-card: linear-gradient(to bottom, var(--color-primary-50), var(--color-neutral-0));
177
+ --gradient-primary-to-white: linear-gradient(to bottom right, var(--color-primary-50), #ffffff);
178
+ --gradient-secondary-to-white: linear-gradient(to bottom right, var(--color-secondary-50), #ffffff);
179
+ --gradient-primary-h: linear-gradient(to right, var(--color-primary-50), #ffffff);
180
+ --gradient-secondary-h: linear-gradient(to right, var(--color-secondary-50), #ffffff);
181
+
182
+ /* ==========================================================================
183
+ * Frosted Glass Tokens
184
+ * ========================================================================== */
185
+ --frosted-blur: 16px;
186
+ --frosted-surface-bg: rgb(255 255 255 / 0.60);
187
+ --frosted-surface-border: rgb(255 255 255 / 0.70);
188
+ --frosted-muted-bg: hsl(240 10% 98% / 0.60);
189
+ --frosted-muted-border: hsl(240 10% 98% / 0.70);
190
+ --frosted-subtle-bg: hsl(240 10% 96% / 0.60);
191
+ --frosted-subtle-border: hsl(240 10% 96% / 0.70);
192
+ --frosted-gradient-primary: linear-gradient(to bottom right, hsl(240 78.3% 95% / 0.60), hsl(0 0% 100% / 0.60));
193
+ --frosted-gradient-secondary: linear-gradient(to bottom right, hsl(47 100% 95% / 0.60), hsl(0 0% 100% / 0.60));
194
+ }
195
+
196
+ :root {
197
+ /* ==========================================================================
198
+ * Shadows (Tinted with brand shadow color)
199
+ * ========================================================================== */
200
+ --color-shadow: hsl(240 78.3% 70%);
201
+
202
+ --shadow-card: 0 8px 26px hsl(from var(--color-shadow) h s l / 0.10);
203
+ --shadow-dropdown: 0 8px 24px hsl(from var(--color-shadow) h s l / 0.12);
204
+ --shadow-modal: 0 16px 40px hsl(from var(--color-shadow) h s l / 0.16);
205
+ --shadow-popover: 0 24px 64px hsl(from var(--color-shadow) h s l / 0.20);
206
+ }
207
+
208
+ :root {
209
+ /* ==========================================================================
210
+ * Border Radius Scale
211
+ * ========================================================================== */
212
+ --radius-xs: 0.125rem; /* 2px */
213
+ --radius-sm: 0.25rem; /* 4px */
214
+ --radius-md: 0.375rem; /* 6px */
215
+ --radius-lg: 0.5rem; /* 8px */
216
+ --radius-xl: 0.75rem; /* 12px */
217
+ --radius-2xl: 1rem; /* 16px */
218
+ --radius-3xl: 1.5rem; /* 24px */
219
+ --radius-4xl: 2rem; /* 32px */
220
+ --radius-full: 9999px;
221
+ }
222
+
223
+ :root {
224
+ /* ==========================================================================
225
+ * Spacing Scale
226
+ * ========================================================================== */
227
+ --spacing-0: 0px;
228
+ --spacing-0-5: 0.125rem; /* 2px */
229
+ --spacing-1: 0.25rem; /* 4px */
230
+ --spacing-1-5: 0.375rem; /* 6px */
231
+ --spacing-2: 0.5rem; /* 8px */
232
+ --spacing-2-5: 0.625rem; /* 10px */
233
+ --spacing-3: 0.75rem; /* 12px */
234
+ --spacing-3-5: 0.875rem; /* 14px */
235
+ --spacing-4: 1rem; /* 16px */
236
+ --spacing-5: 1.25rem; /* 20px */
237
+ --spacing-6: 1.5rem; /* 24px */
238
+ --spacing-8: 2rem; /* 32px */
239
+ --spacing-10: 2.5rem; /* 40px */
240
+ --spacing-12: 3rem; /* 48px */
241
+ --spacing-16: 4rem; /* 64px */
242
+ --spacing-20: 5rem; /* 80px */
243
+ --spacing-24: 6rem; /* 96px */
244
+ }
245
+
246
+ :root {
247
+ /* ==========================================================================
248
+ * Typography System
249
+ * ========================================================================== */
250
+ --font-family-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
251
+ --font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
252
+
253
+ /* Font Sizes */
254
+ --font-size-xs: 0.75rem; /* 12px */
255
+ --font-size-sm: 0.875rem; /* 14px */
256
+ --font-size-base: 1rem; /* 16px */
257
+ --font-size-lg: 1.125rem; /* 18px */
258
+ --font-size-xl: 1.25rem; /* 20px */
259
+ --font-size-2xl: 1.5rem; /* 24px */
260
+ --font-size-3xl: 1.875rem; /* 30px */
261
+ --font-size-4xl: 2.25rem; /* 36px */
262
+ --font-size-5xl: 3rem; /* 48px */
263
+
264
+ /* Line Heights */
265
+ --line-height-none: 1;
266
+ --line-height-tight: 1.25;
267
+ --line-height-snug: 1.375;
268
+ --line-height-normal: 1.5;
269
+ --line-height-relaxed: 1.625;
270
+ --line-height-loose: 2;
271
+
272
+ /* Font Weights */
273
+ --font-weight-light: 300;
274
+ --font-weight-normal: 400;
275
+ --font-weight-medium: 500;
276
+ --font-weight-semibold: 600;
277
+ --font-weight-bold: 700;
278
+ --font-weight-extrabold: 800;
279
+ }
280
+
281
+ /* ==========================================================================
282
+ * ODT Lightweight UI - Dark Mode Theme Tokens
283
+ * Active when [data-theme="dark"] or class="dark" is applied
284
+ * ========================================================================== */
285
+
286
+ :root[data-theme="dark"],
287
+ [data-theme="dark"],
288
+ .dark {
289
+ /* ==========================================================================
290
+ * Primary Brand Colors (Dark Scale)
291
+ * ========================================================================== */
292
+ --color-primary-0: hsl(240 78.3% 10%);
293
+ --color-primary-50: hsla(240, 78.3%, 65%, 0.18);
294
+ --color-primary-100: hsla(240, 78.3%, 65%, 0.28);
295
+ --color-primary-200: hsl(240 78.3% 34.3%);
296
+ --color-primary-300: hsl(240 78.3% 45%);
297
+ --color-primary-400: hsl(240 78.3% 55%);
298
+ --color-primary-500: hsl(240 78.3% 65%);
299
+ --color-primary-600: hsl(240 78.3% 72%);
300
+ --color-primary-700: hsl(240 78.3% 80%);
301
+ --color-primary-800: hsl(240 78.3% 88%);
302
+ --color-primary-900: hsl(240 78.3% 96%);
303
+
304
+ /* ==========================================================================
305
+ * Secondary Brand Colors (Dark Scale)
306
+ * ========================================================================== */
307
+ --color-secondary-0: hsl(47 100% 10%);
308
+ --color-secondary-50: hsla(47, 100%, 60%, 0.16);
309
+ --color-secondary-100: hsla(47, 100%, 60%, 0.25);
310
+ --color-secondary-200: hsl(47 100% 30%);
311
+ --color-secondary-300: hsl(47 100% 40%);
312
+ --color-secondary-400: hsl(47 100% 50%);
313
+ --color-secondary-500: hsl(47 100% 60%);
314
+ --color-secondary-600: hsl(47 100% 68%);
315
+ --color-secondary-700: hsl(47 100% 75%);
316
+ --color-secondary-800: hsl(47 100% 82%);
317
+ --color-secondary-900: hsl(47 100% 90%);
318
+
319
+ /* ==========================================================================
320
+ * Neutral Palette (Dark Scale)
321
+ * ========================================================================== */
322
+ --color-neutral-0: hsl(224 25% 6%);
323
+ --color-neutral-50: hsl(224 20% 10%);
324
+ --color-neutral-100: hsl(224 16% 15%);
325
+ --color-neutral-200: hsl(224 14% 18%);
326
+ --color-neutral-300: hsl(224 14% 26%);
327
+ --color-neutral-400: hsl(215 14% 48%);
328
+ --color-neutral-500: hsl(215 16% 62%);
329
+ --color-neutral-600: hsl(215 18% 74%);
330
+ --color-neutral-700: hsl(215 20% 84%);
331
+ --color-neutral-800: hsl(215 22% 92%);
332
+ --color-neutral-900: hsl(215 24% 97%);
333
+ --color-neutral-950: hsl(0 0% 100%);
334
+
335
+ /* ==========================================================================
336
+ * Semantic Colors
337
+ * ========================================================================== */
338
+ --color-success: hsl(142 71% 45%);
339
+ --color-warning: hsl(38 92% 58%);
340
+ --color-danger: hsl(0 78% 64%);
341
+ --color-info: hsl(217 91% 64%);
342
+
343
+ /* Semantic surface tint */
344
+ --color-surface-success: hsl(152 68% 12%);
345
+ --color-surface-warning: hsl(38 92% 13%);
346
+ --color-surface-danger: hsl(0 78% 14%);
347
+ --color-surface-info: hsl(217 91% 14%);
348
+
349
+ /* ==========================================================================
350
+ * Surfaces & Backgrounds
351
+ * ========================================================================== */
352
+ --color-surface-base: var(--color-surface-elevated);
353
+ --color-surface: var(--color-neutral-0);
354
+ --color-surface-elevated: var(--color-neutral-50);
355
+ --color-surface-muted: hsl(224 22% 8%);
356
+ --color-surface-subtle: var(--color-neutral-100);
357
+ --color-surface-primary: var(--color-primary-500);
358
+ --color-surface-secondary: var(--color-secondary-500);
359
+
360
+ /* ==========================================================================
361
+ * Foreground (Text & Icon)
362
+ * ========================================================================== */
363
+ --color-fg-strong: var(--color-neutral-900);
364
+ --color-fg: var(--color-neutral-700);
365
+ --color-fg-muted: var(--color-neutral-500);
366
+ --color-fg-subtle: var(--color-neutral-400);
367
+ --color-fg-disabled: hsl(215 12% 32%);
368
+
369
+ /* Inverse */
370
+ --color-fg-inverse-strong: var(--color-neutral-0);
371
+ --color-fg-inverse: var(--color-neutral-50);
372
+ --color-fg-inverse-muted: var(--color-neutral-100);
373
+ --color-fg-inverse-subtle: var(--color-neutral-300);
374
+ --color-fg-inverse-disabled: var(--color-neutral-400);
375
+
376
+ /* Brand Foreground */
377
+ --color-fg-primary: var(--color-primary-600);
378
+ --color-fg-secondary: var(--color-secondary-600);
379
+
380
+ /* Semantic Foreground */
381
+ --color-fg-success: var(--color-success);
382
+ --color-fg-warning: var(--color-warning);
383
+ --color-fg-danger: var(--color-danger);
384
+ --color-fg-info: var(--color-info);
385
+
386
+ /* Focus Ring */
387
+ --color-ring: hsl(240, 42%, 39%);
388
+
389
+ /* ==========================================================================
390
+ * Borders & Lines
391
+ * ========================================================================== */
392
+ --color-line: var(--color-neutral-200);
393
+ --color-line-muted: var(--color-neutral-100);
394
+ --color-line-strong: hsl(224, 44%, 27%);
395
+
396
+ --color-line-primary: var(--color-primary-500);
397
+ --color-line-success: var(--color-success);
398
+ --color-line-warning: var(--color-warning);
399
+ --color-line-danger: var(--color-danger);
400
+
401
+ /* ==========================================================================
402
+ * Shadows & Depth Elevations
403
+ * ========================================================================== */
404
+ --color-shadow: hsl(0 0% 0%);
405
+
406
+ --shadow-card: 0 8px 26px hsl(0 0% 0% / 0.50);
407
+ --shadow-dropdown: 0 8px 24px hsl(0 0% 0% / 0.60);
408
+ --shadow-modal: 0 16px 40px hsl(0 0% 0% / 0.70);
409
+ --shadow-popover: 0 24px 64px hsl(0 0% 0% / 0.80);
410
+
411
+ /* ==========================================================================
412
+ * Gradients
413
+ * ========================================================================== */
414
+ --gradient-subtle: linear-gradient(to top right, var(--color-primary-50), var(--color-primary-0) 60%, var(--color-secondary-50));
415
+ --gradient-hero-primary: var(--gradient-subtle);
416
+
417
+ /* Vibrant accent gradient */
418
+ --gradient-vibrant: linear-gradient(to top right, var(--color-primary-200), var(--color-primary-50) 50%, var(--color-secondary-100));
419
+ --gradient-hero-vibrant: var(--gradient-vibrant);
420
+
421
+ /* Card surface gradients */
422
+ --gradient-card: linear-gradient(to bottom, hsla(240, 78.3%, 65%, 0.25), var(--color-neutral-50));
423
+ --gradient-primary-to-white: linear-gradient(to bottom, var(--color-primary-50), var(--color-surface));
424
+ --gradient-secondary-to-white: linear-gradient(to bottom, var(--color-secondary-50), var(--color-surface));
425
+ --gradient-primary-h: linear-gradient(to right, var(--color-primary-50), var(--color-surface));
426
+ --gradient-secondary-h: linear-gradient(to right, var(--color-secondary-50), var(--color-surface));
427
+
428
+ /* ==========================================================================
429
+ * Button & Solid Controls Foreground
430
+ * ========================================================================== */
431
+ --color-btn-surface-fg: var(--color-fg-strong);
432
+ --color-btn-muted-fg: var(--color-fg);
433
+ --color-btn-inverse-fg: var(--color-surface);
434
+ --color-btn-warning-fg: hsl(224 25% 6%);
435
+ --color-badge-neutral-fg: var(--color-neutral-0);
436
+ --color-switch-thumb: hsl(0 0% 100%);
437
+
438
+ /* ==========================================================================
439
+ * Frosted Glass Tokens
440
+ * ========================================================================== */
441
+ --frosted-surface-bg: hsl(224 25% 6% / 0.60);
442
+ --frosted-surface-border: hsl(224 14% 26% / 0.70);
443
+ --frosted-muted-bg: hsl(224 22% 8% / 0.60);
444
+ --frosted-muted-border: hsl(224 22% 8% / 0.70);
445
+ --frosted-subtle-bg: hsl(224 16% 15% / 0.60);
446
+ --frosted-subtle-border: hsl(224 16% 15% / 0.70);
447
+ --frosted-gradient-primary: linear-gradient(to bottom right, hsla(240, 78.3%, 65%, 0.18), hsl(224 25% 6% / 0.60));
448
+ --frosted-gradient-secondary: linear-gradient(to bottom right, hsla(47, 100%, 60%, 0.16), hsl(224 25% 6% / 0.60));
449
+ }
450
+
451
+
452
+
453
+ /* Component Styles */
454
+ /* ==========================================================================
455
+ * ODT Lightweight UI - Standalone Component Styles (Rails)
456
+ * ========================================================================== */
457
+
458
+ /* ==========================================================================
459
+ * 1. Utility Tokens & Base Resets
460
+ * ========================================================================== */
461
+ .odt-radius-none { border-radius: var(--radius-none, 0px) !important; }
462
+ .odt-radius-xs { border-radius: var(--radius-xs, 0.125rem) !important; }
463
+ .odt-radius-sm { border-radius: var(--radius-sm, 0.25rem) !important; }
464
+ .odt-radius-md { border-radius: var(--radius-md, 0.375rem) !important; }
465
+ .odt-radius-lg { border-radius: var(--radius-lg, 0.5rem) !important; }
466
+ .odt-radius-xl { border-radius: var(--radius-xl, 0.75rem) !important; }
467
+ .odt-radius-2xl { border-radius: var(--radius-2xl, 1rem) !important; }
468
+ .odt-radius-3xl { border-radius: var(--radius-3xl, 1.5rem) !important; }
469
+ .odt-radius-4xl { border-radius: var(--radius-4xl, 2rem) !important; }
470
+ .odt-radius-full { border-radius: var(--radius-full, 9999px) !important; }
471
+
472
+ .odt-shadow-none { box-shadow: none !important; }
473
+ .odt-shadow-card { box-shadow: var(--shadow-card) !important; }
474
+ .odt-shadow-dropdown { box-shadow: var(--shadow-dropdown) !important; }
475
+ .odt-shadow-modal { box-shadow: var(--shadow-modal) !important; }
476
+ .odt-shadow-popover { box-shadow: var(--shadow-popover) !important; }
477
+
478
+ .odt-spinner {
479
+ display: inline-block;
480
+ width: 1em;
481
+ height: 1em;
482
+ border: 2px solid currentColor;
483
+ border-right-color: transparent;
484
+ border-radius: 50%;
485
+ animation: odt-spin 0.75s linear infinite;
486
+ }
487
+
488
+ @keyframes odt-spin {
489
+ from { transform: rotate(0deg); }
490
+ to { transform: rotate(360deg); }
491
+ }
492
+
493
+ @keyframes odt-pop {
494
+ 0% { opacity: 0; transform: scale(0.5); }
495
+ 100% { opacity: 1; transform: scale(1); }
496
+ }
497
+
498
+ /* ==========================================================================
499
+ * 2. Button Component (.odt-btn)
500
+ * ========================================================================== */
501
+ .odt-btn {
502
+ display: inline-flex;
503
+ align-items: center;
504
+ justify-content: center;
505
+ gap: var(--spacing-2, 0.5rem);
506
+ font-family: inherit;
507
+ font-weight: var(--font-weight-medium, 500);
508
+ line-height: var(--line-height-tight, 1.25);
509
+ border: 1px solid transparent;
510
+ border-radius: var(--radius-xl, 0.75rem);
511
+ cursor: pointer;
512
+ text-decoration: none;
513
+ white-space: nowrap;
514
+ user-select: none;
515
+ transition: all 0.15s ease-in-out;
516
+ outline: none;
517
+ position: relative;
518
+ box-sizing: border-box;
519
+ }
520
+
521
+ .odt-btn:focus-visible {
522
+ box-shadow: 0 0 0 3px var(--color-ring), var(--shadow-card);
523
+ }
524
+
525
+ /* Button Sizes */
526
+ .odt-btn--xs {
527
+ padding: 0.25rem 0.625rem;
528
+ font-size: var(--font-size-xs, 0.75rem);
529
+ border-radius: var(--radius-md, 0.375rem);
530
+ gap: 0.25rem;
531
+ }
532
+
533
+ .odt-btn--sm {
534
+ padding: 0.375rem 0.875rem;
535
+ font-size: var(--font-size-xs, 0.75rem);
536
+ border-radius: var(--radius-lg, 0.5rem);
537
+ gap: 0.375rem;
538
+ }
539
+
540
+ .odt-btn--md {
541
+ padding: 0.625rem 1.25rem;
542
+ font-size: var(--font-size-sm, 0.875rem);
543
+ border-radius: var(--radius-xl, 0.75rem);
544
+ gap: 0.5rem;
545
+ }
546
+
547
+ .odt-btn--lg {
548
+ padding: 0.75rem 1.75rem;
549
+ font-size: var(--font-size-base, 1rem);
550
+ border-radius: var(--radius-2xl, 1rem);
551
+ gap: 0.625rem;
552
+ }
553
+
554
+ .odt-btn--xl {
555
+ padding: 0.875rem 2rem;
556
+ font-size: var(--font-size-lg, 1.125rem);
557
+ border-radius: var(--radius-2xl, 1rem);
558
+ gap: 0.75rem;
559
+ }
560
+
561
+ /* Button Modifiers */
562
+ .odt-btn--full-width {
563
+ width: 100%;
564
+ }
565
+
566
+ .odt-btn--loading {
567
+ cursor: wait;
568
+ pointer-events: none;
569
+ }
570
+
571
+ .odt-btn:disabled,
572
+ .odt-btn--disabled {
573
+ opacity: 0.6;
574
+ cursor: not-allowed;
575
+ pointer-events: none;
576
+ box-shadow: none;
577
+ }
578
+
579
+ .odt-btn--icon-only {
580
+ padding: 0 !important;
581
+ flex-shrink: 0;
582
+ }
583
+ .odt-btn--icon-only.odt-btn--xs { width: 1.75rem; height: 1.75rem; }
584
+ .odt-btn--icon-only.odt-btn--sm { width: 2rem; height: 2rem; }
585
+ .odt-btn--icon-only.odt-btn--md { width: 2.5rem; height: 2.5rem; }
586
+ .odt-btn--icon-only.odt-btn--lg { width: 3rem; height: 3rem; }
587
+ .odt-btn--icon-only.odt-btn--xl { width: 3.5rem; height: 3.5rem; }
588
+
589
+ /* Button - Filled Variant (Default) */
590
+ .odt-btn--filled {
591
+ box-shadow: var(--shadow-card);
592
+ }
593
+ .odt-btn--filled-primary,
594
+ .odt-btn--capsule-primary {
595
+ background-color: var(--color-primary-500);
596
+ color: var(--color-btn-primary-fg, #ffffff);
597
+ }
598
+ .odt-btn--filled-primary:hover:not(:disabled),
599
+ .odt-btn--capsule-primary:hover:not(:disabled) {
600
+ background-color: var(--color-primary-600);
601
+ }
602
+ .odt-btn--filled-primary:active:not(:disabled),
603
+ .odt-btn--capsule-primary:active:not(:disabled) {
604
+ background-color: var(--color-primary-700);
605
+ }
606
+
607
+ .odt-btn--filled-secondary,
608
+ .odt-btn--capsule-secondary {
609
+ background-color: var(--color-secondary-500);
610
+ color: var(--color-btn-secondary-fg, hsl(224 25% 6%));
611
+ }
612
+ .odt-btn--filled-secondary:hover:not(:disabled),
613
+ .odt-btn--capsule-secondary:hover:not(:disabled) {
614
+ background-color: var(--color-secondary-400);
615
+ }
616
+ .odt-btn--filled-secondary:active:not(:disabled),
617
+ .odt-btn--capsule-secondary:active:not(:disabled) {
618
+ background-color: var(--color-secondary-600);
619
+ }
620
+
621
+ .odt-btn--filled-surface,
622
+ .odt-btn--capsule-surface {
623
+ background-color: var(--color-surface);
624
+ color: var(--color-btn-surface-fg, var(--color-fg-strong));
625
+ }
626
+ .odt-btn--filled-surface:hover:not(:disabled),
627
+ .odt-btn--capsule-surface:hover:not(:disabled) {
628
+ background-color: var(--color-surface-muted);
629
+ }
630
+ .odt-btn--filled-surface:active:not(:disabled),
631
+ .odt-btn--capsule-surface:active:not(:disabled) {
632
+ background-color: var(--color-surface-subtle);
633
+ }
634
+
635
+ .odt-btn--filled-muted,
636
+ .odt-btn--capsule-muted {
637
+ background-color: var(--color-surface-muted);
638
+ color: var(--color-btn-muted-fg, var(--color-fg));
639
+ }
640
+ .odt-btn--filled-muted:hover:not(:disabled),
641
+ .odt-btn--capsule-muted:hover:not(:disabled) {
642
+ background-color: var(--color-surface-subtle);
643
+ color: var(--color-fg-strong);
644
+ }
645
+ .odt-btn--filled-muted:active:not(:disabled),
646
+ .odt-btn--capsule-muted:active:not(:disabled) {
647
+ background-color: var(--color-surface);
648
+ }
649
+
650
+ .odt-btn--filled-inverse,
651
+ .odt-btn--capsule-inverse {
652
+ background-color: var(--color-fg-strong);
653
+ color: var(--color-btn-inverse-fg, var(--color-surface));
654
+ }
655
+ .odt-btn--filled-inverse:hover:not(:disabled),
656
+ .odt-btn--capsule-inverse:hover:not(:disabled) { opacity: 0.9; }
657
+ .odt-btn--filled-inverse:active:not(:disabled),
658
+ .odt-btn--capsule-inverse:active:not(:disabled) { opacity: 0.8; }
659
+
660
+ .odt-btn--filled-success,
661
+ .odt-btn--capsule-success {
662
+ background-color: var(--color-success);
663
+ color: var(--color-btn-success-fg, #ffffff);
664
+ }
665
+ .odt-btn--filled-success:hover:not(:disabled),
666
+ .odt-btn--capsule-success:hover:not(:disabled) { opacity: 0.9; }
667
+ .odt-btn--filled-success:active:not(:disabled),
668
+ .odt-btn--capsule-success:active:not(:disabled) { opacity: 0.8; }
669
+
670
+ .odt-btn--filled-warning,
671
+ .odt-btn--capsule-warning {
672
+ background-color: var(--color-warning);
673
+ color: var(--color-btn-warning-fg, var(--color-fg-strong));
674
+ }
675
+ .odt-btn--filled-warning:hover:not(:disabled),
676
+ .odt-btn--capsule-warning:hover:not(:disabled) { opacity: 0.9; }
677
+ .odt-btn--filled-warning:active:not(:disabled),
678
+ .odt-btn--capsule-warning:active:not(:disabled) { opacity: 0.8; }
679
+
680
+ .odt-btn--filled-danger,
681
+ .odt-btn--capsule-danger {
682
+ background-color: var(--color-danger);
683
+ color: var(--color-btn-danger-fg, #ffffff);
684
+ }
685
+ .odt-btn--filled-danger:hover:not(:disabled),
686
+ .odt-btn--capsule-danger:hover:not(:disabled) { opacity: 0.9; }
687
+ .odt-btn--filled-danger:active:not(:disabled),
688
+ .odt-btn--capsule-danger:active:not(:disabled) { opacity: 0.8; }
689
+
690
+ .odt-btn--filled-info,
691
+ .odt-btn--capsule-info {
692
+ background-color: var(--color-info);
693
+ color: var(--color-btn-info-fg, #ffffff);
694
+ }
695
+ .odt-btn--filled-info:hover:not(:disabled),
696
+ .odt-btn--capsule-info:hover:not(:disabled) { opacity: 0.9; }
697
+ .odt-btn--filled-info:active:not(:disabled),
698
+ .odt-btn--capsule-info:active:not(:disabled) { opacity: 0.8; }
699
+
700
+ .odt-btn--filled-neutral,
701
+ .odt-btn--capsule-neutral {
702
+ background-color: var(--color-neutral-800);
703
+ color: #ffffff;
704
+ }
705
+ .odt-btn--filled-neutral:hover:not(:disabled),
706
+ .odt-btn--capsule-neutral:hover:not(:disabled) {
707
+ background-color: var(--color-neutral-900);
708
+ }
709
+
710
+ /* Button - Capsule Variant */
711
+ .odt-btn--capsule {
712
+ border-radius: var(--radius-full, 9999px) !important;
713
+ box-shadow: var(--shadow-card);
714
+ }
715
+ .odt-btn--capsule.odt-btn--sm { padding: 0.375rem 1.125rem; }
716
+ .odt-btn--capsule.odt-btn--md { padding: 0.625rem 1.5rem; }
717
+ .odt-btn--capsule.odt-btn--lg { padding: 0.75rem 2rem; }
718
+
719
+ /* Button - Frosted Variant */
720
+ .odt-btn--frosted {
721
+ backdrop-filter: blur(var(--frosted-blur, 16px));
722
+ -webkit-backdrop-filter: blur(var(--frosted-blur, 16px));
723
+ box-shadow: var(--shadow-card);
724
+ }
725
+ .odt-btn--frosted-primary {
726
+ background-color: hsl(from var(--color-primary-500) h s l / 0.85);
727
+ color: var(--color-btn-primary-fg, #ffffff);
728
+ }
729
+ .odt-btn--frosted-primary:hover:not(:disabled) {
730
+ background-color: hsl(from var(--color-primary-500) h s l / 0.95);
731
+ }
732
+ .odt-btn--frosted-secondary {
733
+ background-color: hsl(from var(--color-secondary-500) h s l / 0.85);
734
+ color: var(--color-btn-secondary-fg, hsl(224 25% 6%));
735
+ }
736
+ .odt-btn--frosted-secondary:hover:not(:disabled) {
737
+ background-color: hsl(from var(--color-secondary-500) h s l / 0.95);
738
+ }
739
+ .odt-btn--frosted-surface {
740
+ background-color: var(--frosted-surface-bg);
741
+ color: var(--color-btn-surface-fg, var(--color-fg-strong));
742
+ }
743
+ .odt-btn--frosted-surface:hover:not(:disabled) {
744
+ background-color: var(--frosted-muted-bg);
745
+ }
746
+ .odt-btn--frosted-muted {
747
+ background-color: var(--frosted-muted-bg);
748
+ color: var(--color-btn-muted-fg, var(--color-fg));
749
+ }
750
+ .odt-btn--frosted-muted:hover:not(:disabled) {
751
+ background-color: var(--frosted-subtle-bg);
752
+ }
753
+ .odt-btn--frosted-inverse {
754
+ background-color: hsl(from var(--color-fg-strong) h s l / 0.85);
755
+ color: var(--color-btn-inverse-fg, var(--color-surface));
756
+ }
757
+ .odt-btn--frosted-inverse:hover:not(:disabled) {
758
+ background-color: hsl(from var(--color-fg-strong) h s l / 0.95);
759
+ }
760
+ .odt-btn--frosted-success {
761
+ background-color: hsl(from var(--color-success) h s l / 0.85);
762
+ color: var(--color-btn-success-fg, #ffffff);
763
+ }
764
+ .odt-btn--frosted-warning {
765
+ background-color: hsl(from var(--color-warning) h s l / 0.85);
766
+ color: var(--color-btn-warning-fg, var(--color-fg-strong));
767
+ }
768
+ .odt-btn--frosted-danger {
769
+ background-color: hsl(from var(--color-danger) h s l / 0.85);
770
+ color: var(--color-btn-danger-fg, #ffffff);
771
+ }
772
+ .odt-btn--frosted-info {
773
+ background-color: hsl(from var(--color-info) h s l / 0.85);
774
+ color: var(--color-btn-info-fg, #ffffff);
775
+ }
776
+
777
+ /* Button - Ghost Variant */
778
+ .odt-btn--ghost {
779
+ background-color: transparent;
780
+ box-shadow: none;
781
+ }
782
+ .odt-btn--ghost-primary { color: var(--color-fg-primary); }
783
+ .odt-btn--ghost-primary:hover:not(:disabled) { background-color: var(--color-primary-50); }
784
+ .odt-btn--ghost-primary:active:not(:disabled) { background-color: var(--color-primary-100); }
785
+
786
+ .odt-btn--ghost-secondary { color: var(--color-fg-secondary); }
787
+ .odt-btn--ghost-secondary:hover:not(:disabled) { background-color: var(--color-secondary-50); }
788
+ .odt-btn--ghost-secondary:active:not(:disabled) { background-color: var(--color-secondary-100); }
789
+
790
+ .odt-btn--ghost-surface,
791
+ .odt-btn--ghost-muted,
792
+ .odt-btn--ghost-inverse { color: var(--color-fg-strong); }
793
+ .odt-btn--ghost-surface:hover:not(:disabled),
794
+ .odt-btn--ghost-muted:hover:not(:disabled),
795
+ .odt-btn--ghost-inverse:hover:not(:disabled) { background-color: var(--color-surface-muted); }
796
+
797
+ .odt-btn--ghost-success { color: var(--color-fg-success); }
798
+ .odt-btn--ghost-success:hover:not(:disabled) { background-color: var(--color-surface-success); }
799
+
800
+ .odt-btn--ghost-warning { color: var(--color-fg-warning); }
801
+ .odt-btn--ghost-warning:hover:not(:disabled) { background-color: var(--color-surface-warning); }
802
+
803
+ .odt-btn--ghost-danger { color: var(--color-fg-danger); }
804
+ .odt-btn--ghost-danger:hover:not(:disabled) { background-color: var(--color-surface-danger); }
805
+
806
+ .odt-btn--ghost-info { color: var(--color-fg-info); }
807
+ .odt-btn--ghost-info:hover:not(:disabled) { background-color: var(--color-surface-info); }
808
+
809
+ .odt-btn--ghost-neutral { color: var(--color-fg-muted); }
810
+ .odt-btn--ghost-neutral:hover:not(:disabled) { color: var(--color-fg); background-color: var(--color-surface-muted); }
811
+
812
+ /* Legacy / Secondary Button Variants Compatibility */
813
+ .odt-btn--light-primary { background-color: var(--color-primary-50); color: var(--color-primary-700); }
814
+ .odt-btn--light-primary:hover:not(:disabled) { background-color: var(--color-primary-100); }
815
+ .odt-btn--light-secondary { background-color: var(--color-secondary-50); color: var(--color-secondary-900); }
816
+ .odt-btn--light-secondary:hover:not(:disabled) { background-color: var(--color-secondary-100); }
817
+ .odt-btn--light-success { background-color: var(--color-surface-success); color: var(--color-fg-success); }
818
+ .odt-btn--light-warning { background-color: var(--color-surface-warning); color: var(--color-fg-warning); }
819
+ .odt-btn--light-danger { background-color: var(--color-surface-danger); color: var(--color-fg-danger); }
820
+ .odt-btn--light-neutral { background-color: var(--color-surface-muted); color: var(--color-fg-muted); }
821
+
822
+ .odt-btn--outline-primary, .odt-btn--outlined-primary { border-color: var(--color-primary-300); color: var(--color-primary-600); background-color: transparent; }
823
+ .odt-btn--outline-primary:hover:not(:disabled) { background-color: var(--color-primary-50); }
824
+ .odt-btn--outline-secondary, .odt-btn--outlined-secondary { border-color: var(--color-secondary-300); color: var(--color-secondary-900); background-color: transparent; }
825
+ .odt-btn--outline-secondary:hover:not(:disabled) { background-color: var(--color-secondary-50); }
826
+ .odt-btn--outline-danger, .odt-btn--outlined-danger { border-color: var(--color-danger); color: var(--color-danger); background-color: transparent; }
827
+ .odt-btn--outline-danger:hover:not(:disabled) { background-color: var(--color-surface-danger); }
828
+ .odt-btn--outline-neutral, .odt-btn--outlined-neutral { border-color: var(--color-line); color: var(--color-fg); background-color: transparent; }
829
+ .odt-btn--outline-neutral:hover:not(:disabled) { background-color: var(--color-surface-subtle); }
830
+
831
+ .odt-btn--subtle-primary { background-color: transparent; color: var(--color-primary-600); }
832
+ .odt-btn--subtle-primary:hover:not(:disabled) { background-color: var(--color-primary-50); }
833
+ .odt-btn--subtle-secondary { background-color: transparent; color: var(--color-secondary-900); }
834
+ .odt-btn--subtle-secondary:hover:not(:disabled) { background-color: var(--color-secondary-50); }
835
+ .odt-btn--subtle-neutral { background-color: transparent; color: var(--color-fg); }
836
+ .odt-btn--subtle-neutral:hover:not(:disabled) { background-color: var(--color-surface-subtle); }
837
+ .odt-btn--subtle-danger { background-color: transparent; color: var(--color-danger); }
838
+ .odt-btn--subtle-danger:hover:not(:disabled) { background-color: var(--color-surface-danger); }
839
+
840
+ /* ==========================================================================
841
+ * 3. Badge Component (.odt-badge)
842
+ * ========================================================================== */
843
+ .odt-badge {
844
+ display: inline-flex;
845
+ align-items: center;
846
+ gap: var(--spacing-1-5, 0.375rem);
847
+ border-radius: var(--radius-full, 9999px);
848
+ font-family: inherit;
849
+ font-weight: var(--font-weight-semibold, 600);
850
+ line-height: 1;
851
+ white-space: nowrap;
852
+ box-sizing: border-box;
853
+ width: fit-content;
854
+ flex-shrink: 0;
855
+ }
856
+
857
+ .odt-badge--sm {
858
+ padding: 0.25rem 0.625rem;
859
+ font-size: var(--font-size-xs, 0.75rem);
860
+ }
861
+
862
+ .odt-badge--md {
863
+ padding: 0.375rem 0.875rem;
864
+ font-size: var(--font-size-sm, 0.875rem);
865
+ }
866
+
867
+ .odt-badge__dot {
868
+ width: 0.5rem;
869
+ height: 0.5rem;
870
+ border-radius: 50%;
871
+ background-color: currentColor;
872
+ display: inline-block;
873
+ flex-shrink: 0;
874
+ }
875
+
876
+ /* Badge - Subtle Variant */
877
+ .odt-badge--subtle-primary { background-color: var(--color-primary-50); color: var(--color-primary-600); }
878
+ .odt-badge--subtle-secondary { background-color: var(--color-secondary-100); color: var(--color-secondary-900); }
879
+ .odt-badge--subtle-success { background-color: var(--color-surface-success); color: var(--color-success); }
880
+ .odt-badge--subtle-warning { background-color: var(--color-surface-warning); color: var(--color-warning); }
881
+ .odt-badge--subtle-danger { background-color: var(--color-surface-danger); color: var(--color-danger); }
882
+ .odt-badge--subtle-info { background-color: var(--color-surface-info); color: var(--color-info); }
883
+ .odt-badge--subtle-neutral { background-color: var(--color-surface-muted); color: var(--color-fg-muted); }
884
+
885
+ /* Badge - Filled Variant */
886
+ .odt-badge--filled-primary { background-color: var(--color-primary-500); color: var(--color-badge-primary-fg, #ffffff); }
887
+ .odt-badge--filled-secondary { background-color: var(--color-secondary-500); color: var(--color-badge-secondary-fg, var(--color-fg-strong)); }
888
+ .odt-badge--filled-success { background-color: var(--color-success); color: var(--color-badge-success-fg, #ffffff); }
889
+ .odt-badge--filled-warning { background-color: var(--color-warning); color: var(--color-badge-warning-fg, var(--color-fg-strong)); }
890
+ .odt-badge--filled-danger { background-color: var(--color-danger); color: var(--color-badge-danger-fg, #ffffff); }
891
+ .odt-badge--filled-info { background-color: var(--color-info); color: var(--color-badge-info-fg, #ffffff); }
892
+ .odt-badge--filled-neutral { background-color: var(--color-neutral-800); color: var(--color-badge-neutral-fg, #ffffff); }
893
+
894
+ /* Badge - Outlined Variant */
895
+ .odt-badge--outlined, .odt-badge--outline { background-color: transparent; border: 1px solid currentColor; }
896
+ .odt-badge--outlined-primary, .odt-badge--outline-primary { color: var(--color-primary-600); border-color: var(--color-primary-300); }
897
+ .odt-badge--outlined-secondary, .odt-badge--outline-secondary { color: var(--color-secondary-800); border-color: var(--color-secondary-300); }
898
+ .odt-badge--outlined-success, .odt-badge--outline-success { color: var(--color-success); border-color: var(--color-line-success); }
899
+ .odt-badge--outlined-warning, .odt-badge--outline-warning { color: var(--color-warning); border-color: var(--color-line-warning); }
900
+ .odt-badge--outlined-danger, .odt-badge--outline-danger { color: var(--color-danger); border-color: var(--color-line-danger); }
901
+ .odt-badge--outlined-info, .odt-badge--outline-info { color: var(--color-info); border-color: var(--color-info); }
902
+ .odt-badge--outlined-neutral, .odt-badge--outline-neutral { color: var(--color-fg-muted); border-color: var(--color-line); }
903
+
904
+ /* ==========================================================================
905
+ * 4. Card Component (.odt-card)
906
+ * ========================================================================== */
907
+ .odt-card {
908
+ box-sizing: border-box;
909
+ border-radius: var(--radius-2xl, 1rem);
910
+ padding: var(--spacing-6, 1.5rem);
911
+ display: flex;
912
+ flex-direction: column;
913
+ gap: var(--spacing-4, 1rem);
914
+ position: relative;
915
+ transition: box-shadow 0.2s ease, transform 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
916
+ border: 1px solid transparent;
917
+ }
918
+
919
+ .odt-card--elevated {
920
+ background-color: var(--color-surface-base);
921
+ box-shadow: var(--shadow-card);
922
+ }
923
+
924
+ .odt-card--outlined {
925
+ background-color: var(--color-surface-base);
926
+ border: 1px solid var(--color-line);
927
+ }
928
+
929
+ .odt-card--subtle {
930
+ background-color: var(--color-surface-subtle);
931
+ }
932
+
933
+ .odt-card--muted {
934
+ background-color: var(--color-surface-muted);
935
+ }
936
+
937
+ .odt-card--ghost {
938
+ background-color: transparent;
939
+ }
940
+
941
+ .odt-card--frosted {
942
+ background-color: var(--frosted-surface-bg);
943
+ backdrop-filter: blur(var(--frosted-blur, 16px));
944
+ -webkit-backdrop-filter: blur(var(--frosted-blur, 16px));
945
+ box-shadow: var(--shadow-card);
946
+ border: 1px solid var(--frosted-surface-border);
947
+ }
948
+
949
+ /* Card Background Modifiers */
950
+ .odt-card--bg-base, .odt-card--bg-surface-base { background-color: var(--color-surface-base); }
951
+ .odt-card--bg-surface { background-color: var(--color-surface); }
952
+ .odt-card--bg-surface-elevated { background-color: var(--color-surface-elevated); }
953
+ .odt-card--bg-surface-muted { background-color: var(--color-surface-muted); }
954
+ .odt-card--bg-surface-subtle { background-color: var(--color-surface-subtle); }
955
+ .odt-card--bg-gradient-primary { background: var(--gradient-card); }
956
+ .odt-card--bg-gradient-secondary { background: var(--gradient-secondary-to-white); }
957
+ .odt-card--bg-gradient-vibrant { background: var(--gradient-vibrant); }
958
+ .odt-card--bg-gradient-hero { background: var(--gradient-hero-primary); }
959
+ .odt-card--bg-transparent { background-color: transparent; }
960
+
961
+ .odt-card--bg-frosted,
962
+ .odt-card--bg-frosted-muted,
963
+ .odt-card--bg-frosted-subtle,
964
+ .odt-card--bg-frosted-gradient-primary,
965
+ .odt-card--bg-frosted-gradient-secondary {
966
+ backdrop-filter: blur(var(--frosted-blur, 16px));
967
+ -webkit-backdrop-filter: blur(var(--frosted-blur, 16px));
968
+ }
969
+ .odt-card--bg-frosted { background-color: var(--frosted-surface-bg); }
970
+ .odt-card--bg-frosted-muted { background-color: var(--frosted-muted-bg); }
971
+ .odt-card--bg-frosted-subtle { background-color: var(--frosted-subtle-bg); }
972
+ .odt-card--bg-frosted-gradient-primary { background: var(--frosted-gradient-primary); }
973
+ .odt-card--bg-frosted-gradient-secondary { background: var(--frosted-gradient-secondary); }
974
+
975
+ /* Card Border Modifiers */
976
+ .odt-card--border-none { border: none; }
977
+ .odt-card--border-muted { border: 1px solid var(--color-line-muted); }
978
+ .odt-card--border-base { border: 1px solid var(--color-line); }
979
+ .odt-card--border-strong { border: 1px solid var(--color-line-strong); }
980
+ .odt-card--border-primary { border: 1px solid var(--color-line-primary); }
981
+ .odt-card--border-secondary { border: 1px solid var(--color-secondary-500); }
982
+ .odt-card--border-danger { border: 1px solid var(--color-line-danger); }
983
+ .odt-card--border-success { border: 1px solid var(--color-line-success); }
984
+
985
+ /* Card Padding Modifiers */
986
+ .odt-card--padding-none { padding: 0; }
987
+ .odt-card--padding-xs { padding: var(--spacing-2, 0.5rem); }
988
+ .odt-card--padding-sm { padding: var(--spacing-3, 0.75rem); }
989
+ .odt-card--padding-md { padding: var(--spacing-4, 1rem); }
990
+ .odt-card--padding-lg { padding: var(--spacing-6, 1.5rem); }
991
+ .odt-card--padding-xl { padding: var(--spacing-8, 2rem); }
992
+ .odt-card--padding-2xl { padding: var(--spacing-10, 2.5rem); }
993
+
994
+ .odt-card--hoverable {
995
+ cursor: pointer;
996
+ }
997
+ .odt-card--hoverable:hover {
998
+ transform: translateY(-2px);
999
+ box-shadow: var(--shadow-dropdown);
1000
+ }
1001
+
1002
+ /* Card Sub-components */
1003
+ .odt-card__header {
1004
+ display: flex;
1005
+ flex-direction: column;
1006
+ gap: var(--spacing-1, 0.25rem);
1007
+ }
1008
+
1009
+ .odt-card__header-with-action {
1010
+ display: flex;
1011
+ flex-direction: row;
1012
+ align-items: flex-start;
1013
+ justify-content: space-between;
1014
+ gap: var(--spacing-3, 0.75rem);
1015
+ width: 100%;
1016
+ }
1017
+
1018
+ .odt-card__title {
1019
+ font-size: var(--font-size-xl, 1.25rem);
1020
+ font-weight: var(--font-weight-bold, 700);
1021
+ color: var(--color-fg-strong);
1022
+ margin: 0;
1023
+ line-height: var(--line-height-tight, 1.25);
1024
+ }
1025
+
1026
+ .odt-card__subtitle,
1027
+ .odt-card__description {
1028
+ font-size: var(--font-size-sm, 0.875rem);
1029
+ color: var(--color-fg-muted);
1030
+ margin: 0;
1031
+ }
1032
+
1033
+ .odt-card__content {
1034
+ color: var(--color-fg);
1035
+ font-size: var(--font-size-base, 1rem);
1036
+ line-height: var(--line-height-normal, 1.5);
1037
+ flex: 1 1 auto;
1038
+ }
1039
+
1040
+ .odt-card__footer {
1041
+ display: flex;
1042
+ align-items: center;
1043
+ gap: var(--spacing-3, 0.75rem);
1044
+ margin-top: auto;
1045
+ }
1046
+
1047
+ /* ==========================================================================
1048
+ * 5. Alert Component (.odt-alert)
1049
+ * ========================================================================== */
1050
+ .odt-alert {
1051
+ display: flex;
1052
+ align-items: flex-start;
1053
+ gap: var(--spacing-3, 0.75rem);
1054
+ padding: var(--spacing-4, 1rem);
1055
+ border-radius: var(--radius-2xl, 1rem);
1056
+ font-size: var(--font-size-sm, 0.875rem);
1057
+ box-sizing: border-box;
1058
+ border: 1px solid transparent;
1059
+ box-shadow: var(--shadow-card);
1060
+ }
1061
+
1062
+ .odt-alert--success {
1063
+ background-color: var(--color-surface-success);
1064
+ color: var(--color-fg-success);
1065
+ border-color: hsl(142 71% 85%);
1066
+ }
1067
+
1068
+ .odt-alert--warning {
1069
+ background-color: var(--color-surface-warning);
1070
+ color: var(--color-fg-warning);
1071
+ border-color: hsl(38 92% 85%);
1072
+ }
1073
+
1074
+ .odt-alert--danger {
1075
+ background-color: var(--color-surface-danger);
1076
+ color: var(--color-fg-danger);
1077
+ border-color: hsl(0 84% 90%);
1078
+ }
1079
+
1080
+ .odt-alert--info {
1081
+ background-color: var(--color-surface-info);
1082
+ color: var(--color-fg-info);
1083
+ border-color: hsl(217 91% 90%);
1084
+ }
1085
+
1086
+ .odt-alert__icon {
1087
+ font-size: 1.125rem;
1088
+ flex-shrink: 0;
1089
+ margin-top: 0.0625rem;
1090
+ }
1091
+
1092
+ .odt-alert__content {
1093
+ flex: 1 1 auto;
1094
+ font-weight: var(--font-weight-medium, 500);
1095
+ }
1096
+
1097
+ /* ==========================================================================
1098
+ * 6. Typography (.odt-heading, .odt-text)
1099
+ * ========================================================================== */
1100
+ .odt-heading,
1101
+ .odt-text {
1102
+ margin: 0;
1103
+ box-sizing: border-box;
1104
+ font-family: inherit;
1105
+ }
1106
+
1107
+ .odt-heading--5xl { font-size: var(--font-size-5xl, 3rem); line-height: 1; }
1108
+ .odt-heading--4xl { font-size: var(--font-size-4xl, 2.25rem); line-height: 2.5rem; }
1109
+ .odt-heading--3xl { font-size: var(--font-size-3xl, 1.875rem); line-height: 2.25rem; }
1110
+ .odt-heading--2xl { font-size: var(--font-size-2xl, 1.5rem); line-height: 2rem; }
1111
+ .odt-heading--xl { font-size: var(--font-size-xl, 1.25rem); line-height: 1.75rem; }
1112
+ .odt-heading--lg { font-size: var(--font-size-lg, 1.125rem); line-height: 1.75rem; }
1113
+
1114
+ .odt-text--2xl { font-size: var(--font-size-2xl, 1.5rem); line-height: 2rem; }
1115
+ .odt-text--xl { font-size: var(--font-size-xl, 1.25rem); line-height: 1.75rem; }
1116
+ .odt-text--lg { font-size: var(--font-size-lg, 1.125rem); line-height: 1.75rem; }
1117
+ .odt-text--base{ font-size: var(--font-size-base, 1rem); line-height: 1.5; }
1118
+ .odt-text--sm { font-size: var(--font-size-sm, 0.875rem); line-height: 1.25rem; }
1119
+ .odt-text--xs { font-size: var(--font-size-xs, 0.75rem); line-height: 1rem; }
1120
+
1121
+ .odt-weight-light { font-weight: var(--font-weight-light, 300); }
1122
+ .odt-weight-normal { font-weight: var(--font-weight-normal, 400); }
1123
+ .odt-weight-medium { font-weight: var(--font-weight-medium, 500); }
1124
+ .odt-weight-semibold { font-weight: var(--font-weight-semibold, 600); }
1125
+ .odt-weight-bold { font-weight: var(--font-weight-bold, 700); }
1126
+ .odt-weight-extrabold { font-weight: var(--font-weight-extrabold, 800); }
1127
+
1128
+ .odt-color-strong { color: var(--color-fg-strong); }
1129
+ .odt-color-default { color: var(--color-fg); }
1130
+ .odt-color-muted { color: var(--color-fg-muted); }
1131
+ .odt-color-subtle { color: var(--color-fg-subtle); }
1132
+ .odt-color-disabled { color: var(--color-fg-disabled); }
1133
+ .odt-color-inverse-strong { color: var(--color-fg-inverse-strong); }
1134
+ .odt-color-inverse { color: var(--color-fg-inverse); }
1135
+ .odt-color-inverse-muted { color: var(--color-fg-inverse-muted); }
1136
+ .odt-color-inverse-subtle { color: var(--color-fg-inverse-subtle); }
1137
+ .odt-color-inverse-disabled { color: var(--color-fg-inverse-disabled); }
1138
+ .odt-color-primary { color: var(--color-fg-primary); }
1139
+ .odt-color-secondary { color: var(--color-fg-secondary); }
1140
+ .odt-color-success { color: var(--color-fg-success); }
1141
+ .odt-color-warning { color: var(--color-fg-warning); }
1142
+ .odt-color-danger { color: var(--color-fg-danger); }
1143
+ .odt-color-info { color: var(--color-fg-info); }
1144
+
1145
+ .odt-truncate {
1146
+ overflow: hidden;
1147
+ text-overflow: ellipsis;
1148
+ white-space: nowrap;
1149
+ }
1150
+
1151
+ /* ==========================================================================
1152
+ * 7. Avatar Component (.odt-avatar)
1153
+ * ========================================================================== */
1154
+ .odt-avatar {
1155
+ display: inline-flex;
1156
+ align-items: center;
1157
+ justify-content: center;
1158
+ border-radius: var(--radius-full, 9999px);
1159
+ overflow: hidden;
1160
+ position: relative;
1161
+ user-select: none;
1162
+ font-weight: var(--font-weight-bold, 700);
1163
+ box-sizing: border-box;
1164
+ flex-shrink: 0;
1165
+ box-shadow: var(--shadow-card);
1166
+ }
1167
+
1168
+ .odt-avatar--xs { width: 1.5rem; height: 1.5rem; font-size: 0.625rem; }
1169
+ .odt-avatar--sm { width: 2rem; height: 2rem; font-size: var(--font-size-xs, 0.75rem); }
1170
+ .odt-avatar--md { width: 2.5rem; height: 2.5rem; font-size: var(--font-size-sm, 0.875rem); }
1171
+ .odt-avatar--lg { width: 3rem; height: 3rem; font-size: var(--font-size-base, 1rem); }
1172
+ .odt-avatar--xl { width: 4rem; height: 4rem; font-size: var(--font-size-xl, 1.25rem); }
1173
+ .odt-avatar--2xl { width: 4.5rem; height: 4.5rem; font-size: var(--font-size-2xl, 1.5rem); }
1174
+
1175
+ .odt-avatar--secondary { background-color: var(--color-secondary-100); color: var(--color-secondary-900); }
1176
+ .odt-avatar--primary { background-color: var(--color-primary-100); color: var(--color-primary-600); }
1177
+ .odt-avatar--neutral { background-color: var(--color-surface-muted); color: var(--color-fg); }
1178
+
1179
+ .odt-avatar__image {
1180
+ width: 100%;
1181
+ height: 100%;
1182
+ object-fit: cover;
1183
+ }
1184
+
1185
+ .odt-avatar__fallback {
1186
+ width: 100%;
1187
+ height: 100%;
1188
+ display: flex;
1189
+ align-items: center;
1190
+ justify-content: center;
1191
+ text-transform: uppercase;
1192
+ }
1193
+
1194
+ /* ==========================================================================
1195
+ * 8. Form Controls (Input, Textarea, Select, Form Group)
1196
+ * ========================================================================== */
1197
+ .odt-input-container,
1198
+ .odt-form-group {
1199
+ display: inline-flex;
1200
+ flex-direction: column;
1201
+ gap: var(--spacing-1-5, 0.375rem);
1202
+ box-sizing: border-box;
1203
+ width: 100%;
1204
+ font-family: inherit;
1205
+ }
1206
+
1207
+ .odt-label {
1208
+ font-size: var(--font-size-sm, 0.875rem);
1209
+ font-weight: 500;
1210
+ color: var(--color-fg-strong);
1211
+ line-height: 1.25rem;
1212
+ }
1213
+
1214
+ .odt-label--required::after {
1215
+ content: " *";
1216
+ color: var(--color-danger);
1217
+ }
1218
+
1219
+ .odt-input-wrapper {
1220
+ position: relative;
1221
+ display: flex;
1222
+ align-items: center;
1223
+ width: 100%;
1224
+ box-sizing: border-box;
1225
+ }
1226
+
1227
+ .odt-input,
1228
+ .odt-textarea,
1229
+ .odt-select {
1230
+ width: 100%;
1231
+ box-sizing: border-box;
1232
+ background-color: var(--color-surface, #ffffff);
1233
+ color: var(--color-fg);
1234
+ font-family: inherit;
1235
+ outline: none;
1236
+ border: 1px solid transparent;
1237
+ transition: border-color 140ms ease, box-shadow 140ms ease;
1238
+ line-height: 1.25;
1239
+ }
1240
+
1241
+ .odt-input::placeholder,
1242
+ .odt-textarea::placeholder {
1243
+ color: var(--color-fg-subtle);
1244
+ }
1245
+
1246
+ /* Form Variants */
1247
+ .odt-input--outlined,
1248
+ .odt-textarea--outlined,
1249
+ .odt-select--outlined {
1250
+ background-color: var(--color-surface, #ffffff);
1251
+ border: 1px solid var(--color-line, #e4e4e9);
1252
+ }
1253
+ .odt-input--outlined:hover:not(:disabled):not(:focus),
1254
+ .odt-textarea--outlined:hover:not(:disabled):not(:focus),
1255
+ .odt-select--outlined:hover:not(:disabled):not(:focus) {
1256
+ border-color: var(--color-line-strong, #d4d4db);
1257
+ }
1258
+ .odt-input--outlined:focus,
1259
+ .odt-textarea--outlined:focus,
1260
+ .odt-select--outlined:focus {
1261
+ border-color: var(--color-ring);
1262
+ }
1263
+
1264
+ .odt-input--filled,
1265
+ .odt-textarea--filled,
1266
+ .odt-select--filled {
1267
+ background-color: var(--color-surface, #ffffff);
1268
+ border: 1px solid transparent;
1269
+ }
1270
+ .odt-input--filled:focus,
1271
+ .odt-textarea--filled:focus,
1272
+ .odt-select--filled:focus {
1273
+ border-color: var(--color-ring);
1274
+ }
1275
+
1276
+ .odt-input--frosted,
1277
+ .odt-textarea--frosted,
1278
+ .odt-select--frosted {
1279
+ background-color: hsl(from var(--color-surface) h s l / 0.85);
1280
+ backdrop-filter: blur(16px);
1281
+ -webkit-backdrop-filter: blur(16px);
1282
+ border: 1px solid transparent;
1283
+ box-shadow: var(--shadow-card);
1284
+ }
1285
+ .odt-input--frosted:focus,
1286
+ .odt-textarea--frosted:focus,
1287
+ .odt-select--frosted:focus {
1288
+ border-color: var(--color-ring);
1289
+ }
1290
+
1291
+ .odt-input--unstyled,
1292
+ .odt-textarea--unstyled {
1293
+ background: transparent;
1294
+ border: none;
1295
+ padding: 0;
1296
+ box-shadow: none;
1297
+ }
1298
+
1299
+ /* Form Sizes */
1300
+ .odt-input--sm, .odt-select--sm {
1301
+ height: 2rem;
1302
+ padding: 0 var(--spacing-3, 0.75rem);
1303
+ font-size: var(--font-size-xs, 0.75rem);
1304
+ border-radius: var(--radius-lg, 0.5rem);
1305
+ }
1306
+ .odt-input--md, .odt-select--md {
1307
+ height: 2.625rem;
1308
+ padding: 0 var(--spacing-4, 1rem);
1309
+ font-size: var(--font-size-sm, 0.875rem);
1310
+ border-radius: var(--radius-xl, 0.75rem);
1311
+ }
1312
+ .odt-input--lg, .odt-select--lg {
1313
+ height: 3.125rem;
1314
+ padding: 0 var(--spacing-5, 1.25rem);
1315
+ font-size: var(--font-size-base, 1rem);
1316
+ border-radius: var(--radius-2xl, 1rem);
1317
+ }
1318
+
1319
+ .odt-textarea {
1320
+ line-height: 1.5;
1321
+ height: auto;
1322
+ min-height: 5rem;
1323
+ }
1324
+ .odt-textarea--sm {
1325
+ padding: var(--spacing-2, 0.5rem) var(--spacing-3, 0.75rem);
1326
+ font-size: var(--font-size-xs, 0.75rem);
1327
+ min-height: 4rem;
1328
+ border-radius: var(--radius-lg, 0.5rem);
1329
+ }
1330
+ .odt-textarea--md {
1331
+ padding: var(--spacing-3, 0.75rem) var(--spacing-4, 1rem);
1332
+ font-size: var(--font-size-sm, 0.875rem);
1333
+ min-height: 5rem;
1334
+ border-radius: var(--radius-xl, 0.75rem);
1335
+ }
1336
+ .odt-textarea--lg {
1337
+ padding: var(--spacing-4, 1rem) var(--spacing-5, 1.25rem);
1338
+ font-size: var(--font-size-base, 1rem);
1339
+ min-height: 6.5rem;
1340
+ border-radius: var(--radius-2xl, 1rem);
1341
+ }
1342
+
1343
+ .odt-textarea--resize-none { resize: none; }
1344
+ .odt-textarea--resize-vertical { resize: vertical; }
1345
+ .odt-textarea--resize-horizontal { resize: horizontal; }
1346
+ .odt-textarea--resize-both { resize: both; }
1347
+
1348
+ /* Select Dropdown */
1349
+ .odt-select {
1350
+ appearance: none;
1351
+ -webkit-appearance: none;
1352
+ padding-right: 2.5rem;
1353
+ cursor: pointer;
1354
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2371717a' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
1355
+ background-repeat: no-repeat;
1356
+ background-position: right 0.75rem center;
1357
+ }
1358
+
1359
+ /* Icons & Addons */
1360
+ .odt-input__left-icon {
1361
+ position: absolute;
1362
+ left: var(--spacing-3, 0.75rem);
1363
+ display: flex;
1364
+ align-items: center;
1365
+ justify-content: center;
1366
+ color: var(--color-fg-muted);
1367
+ pointer-events: none;
1368
+ z-index: 1;
1369
+ }
1370
+
1371
+ .odt-input__right-icon {
1372
+ position: absolute;
1373
+ right: var(--spacing-3, 0.75rem);
1374
+ display: flex;
1375
+ align-items: center;
1376
+ justify-content: center;
1377
+ color: var(--color-fg-muted);
1378
+ z-index: 2;
1379
+ }
1380
+
1381
+ .odt-input--has-left-icon.odt-input--sm { padding-left: 2rem; }
1382
+ .odt-input--has-left-icon.odt-input--md { padding-left: 2.5rem; }
1383
+ .odt-input--has-left-icon.odt-input--lg { padding-left: 3rem; }
1384
+
1385
+ .odt-input--has-right-icon.odt-input--sm { padding-right: 2rem; }
1386
+ .odt-input--has-right-icon.odt-input--md { padding-right: 2.5rem; }
1387
+ .odt-input--has-right-icon.odt-input--lg { padding-right: 3rem; }
1388
+
1389
+ /* Addon Groups */
1390
+ .odt-input__addon-group {
1391
+ display: flex;
1392
+ align-items: stretch;
1393
+ width: 100%;
1394
+ }
1395
+ .odt-input__addon-before,
1396
+ .odt-input__addon-after {
1397
+ display: inline-flex;
1398
+ align-items: center;
1399
+ justify-content: center;
1400
+ padding: 0 var(--spacing-3, 0.75rem);
1401
+ background-color: var(--color-surface, #ffffff);
1402
+ color: var(--color-fg-muted);
1403
+ font-size: var(--font-size-sm, 0.875rem);
1404
+ font-weight: 500;
1405
+ white-space: nowrap;
1406
+ user-select: none;
1407
+ border: 1px solid var(--color-line, #e4e4e9);
1408
+ }
1409
+ .odt-input__addon-before {
1410
+ border-right: none;
1411
+ border-top-left-radius: var(--radius-xl, 0.75rem);
1412
+ border-bottom-left-radius: var(--radius-xl, 0.75rem);
1413
+ }
1414
+ .odt-input__addon-after {
1415
+ border-left: none;
1416
+ border-top-right-radius: var(--radius-xl, 0.75rem);
1417
+ border-bottom-right-radius: var(--radius-xl, 0.75rem);
1418
+ }
1419
+ .odt-input--has-addon-before {
1420
+ border-top-left-radius: 0 !important;
1421
+ border-bottom-left-radius: 0 !important;
1422
+ }
1423
+ .odt-input--has-addon-after {
1424
+ border-top-right-radius: 0 !important;
1425
+ border-bottom-right-radius: 0 !important;
1426
+ }
1427
+
1428
+ /* States */
1429
+ .odt-input--error,
1430
+ .odt-textarea--error,
1431
+ .odt-select--error,
1432
+ .odt-input--error:focus,
1433
+ .odt-textarea--error:focus,
1434
+ .odt-select--error:focus {
1435
+ border-color: var(--color-danger) !important;
1436
+ }
1437
+
1438
+ .odt-input--success,
1439
+ .odt-textarea--success,
1440
+ .odt-select--success,
1441
+ .odt-input--success:focus,
1442
+ .odt-textarea--success:focus,
1443
+ .odt-select--success:focus {
1444
+ border-color: var(--color-success) !important;
1445
+ }
1446
+
1447
+ .odt-input:disabled,
1448
+ .odt-textarea:disabled,
1449
+ .odt-select:disabled {
1450
+ background-color: var(--color-surface-subtle);
1451
+ color: var(--color-fg-disabled);
1452
+ cursor: not-allowed;
1453
+ border-color: var(--color-line-muted, rgba(0, 0, 0, 0.05));
1454
+ opacity: 0.7;
1455
+ }
1456
+
1457
+ /* Help & Error Messages */
1458
+ .odt-helper-text {
1459
+ font-size: var(--font-size-xs, 0.75rem);
1460
+ color: var(--color-fg-muted);
1461
+ margin: 0;
1462
+ line-height: 1rem;
1463
+ }
1464
+
1465
+ .odt-error-text {
1466
+ font-size: var(--font-size-xs, 0.75rem);
1467
+ color: var(--color-danger);
1468
+ font-weight: 500;
1469
+ margin: 0;
1470
+ line-height: 1rem;
1471
+ }
1472
+
1473
+ .odt-success-text {
1474
+ font-size: var(--font-size-xs, 0.75rem);
1475
+ color: var(--color-success);
1476
+ font-weight: 500;
1477
+ margin: 0;
1478
+ line-height: 1rem;
1479
+ }
1480
+
1481
+ /* ==========================================================================
1482
+ * 9. Checkbox & Radio (.odt-checkbox, .odt-radio)
1483
+ * ========================================================================== */
1484
+ .odt-checkbox-wrapper,
1485
+ .odt-radio-wrapper {
1486
+ display: inline-flex;
1487
+ flex-direction: column;
1488
+ gap: 0.25rem;
1489
+ }
1490
+
1491
+ .odt-checkbox-container,
1492
+ .odt-radio-container {
1493
+ display: inline-flex;
1494
+ align-items: flex-start;
1495
+ gap: var(--spacing-2-5, 0.625rem);
1496
+ cursor: pointer;
1497
+ user-select: none;
1498
+ }
1499
+
1500
+ .odt-checkbox,
1501
+ .odt-radio {
1502
+ appearance: none;
1503
+ -webkit-appearance: none;
1504
+ position: relative;
1505
+ display: inline-flex;
1506
+ align-items: center;
1507
+ justify-content: center;
1508
+ flex-shrink: 0;
1509
+ background-color: var(--color-surface-subtle, #e4e4e9);
1510
+ border: none;
1511
+ color: #ffffff;
1512
+ cursor: pointer;
1513
+ padding: 0;
1514
+ outline: none;
1515
+ box-sizing: border-box;
1516
+ transition: background-color 140ms ease, box-shadow 140ms ease, transform 100ms ease;
1517
+ margin-top: 0.125rem;
1518
+ }
1519
+
1520
+ .odt-checkbox {
1521
+ width: 1.125rem;
1522
+ height: 1.125rem;
1523
+ border-radius: var(--radius-md, 0.375rem);
1524
+ }
1525
+
1526
+ .odt-radio {
1527
+ width: 1.125rem;
1528
+ height: 1.125rem;
1529
+ border-radius: var(--radius-full, 9999px);
1530
+ }
1531
+
1532
+ .odt-checkbox:active:not(:disabled),
1533
+ .odt-radio:active:not(:disabled) {
1534
+ transform: scale(0.94);
1535
+ }
1536
+
1537
+ /* Checkbox & Radio Sizes */
1538
+ .odt-checkbox--sm, .odt-radio--sm {
1539
+ width: 0.9375rem;
1540
+ height: 0.9375rem;
1541
+ margin-top: 0.1875rem;
1542
+ }
1543
+
1544
+ .odt-checkbox--md, .odt-radio--md {
1545
+ width: 1.125rem;
1546
+ height: 1.125rem;
1547
+ margin-top: 0.125rem;
1548
+ }
1549
+
1550
+ .odt-checkbox--lg, .odt-radio--lg {
1551
+ width: 1.375rem;
1552
+ height: 1.375rem;
1553
+ margin-top: 0.0625rem;
1554
+ }
1555
+
1556
+ /* Checkmark indicator */
1557
+ .odt-checkbox:checked::after {
1558
+ content: "";
1559
+ display: block;
1560
+ width: 4px;
1561
+ height: 8px;
1562
+ border: solid currentColor;
1563
+ border-width: 0 2px 2px 0;
1564
+ transform: rotate(45deg);
1565
+ margin-bottom: 2px;
1566
+ animation: odt-pop 140ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
1567
+ }
1568
+
1569
+ .odt-checkbox--sm:checked::after {
1570
+ width: 3px;
1571
+ height: 6px;
1572
+ border-width: 0 1.5px 1.5px 0;
1573
+ margin-bottom: 1px;
1574
+ }
1575
+
1576
+ .odt-checkbox--lg:checked::after {
1577
+ width: 5px;
1578
+ height: 10px;
1579
+ border-width: 0 2.5px 2.5px 0;
1580
+ margin-bottom: 2px;
1581
+ }
1582
+
1583
+ /* Radio Dot indicator */
1584
+ .odt-radio:checked::after {
1585
+ content: "";
1586
+ display: block;
1587
+ width: 0.5rem;
1588
+ height: 0.5rem;
1589
+ border-radius: var(--radius-full, 9999px);
1590
+ background-color: currentColor;
1591
+ animation: odt-pop 140ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
1592
+ }
1593
+ .odt-radio--sm:checked::after { width: 0.375rem; height: 0.375rem; }
1594
+ .odt-radio--lg:checked::after { width: 0.625rem; height: 0.625rem; }
1595
+
1596
+ /* Checkbox & Radio Color Themes */
1597
+ .odt-checkbox--primary:checked, .odt-radio--primary:checked {
1598
+ background-color: var(--color-primary-500);
1599
+ color: #ffffff;
1600
+ }
1601
+ .odt-checkbox--primary:focus-visible, .odt-radio--primary:focus-visible {
1602
+ box-shadow: 0 0 0 3px hsl(from var(--color-primary-500) h s l / 0.35);
1603
+ }
1604
+
1605
+ .odt-checkbox--secondary:checked, .odt-radio--secondary:checked {
1606
+ background-color: var(--color-secondary-500);
1607
+ color: var(--color-fg-strong);
1608
+ }
1609
+ .odt-checkbox--secondary:focus-visible, .odt-radio--secondary:focus-visible {
1610
+ box-shadow: 0 0 0 3px hsl(from var(--color-secondary-500) h s l / 0.35);
1611
+ }
1612
+
1613
+ .odt-checkbox--success:checked, .odt-radio--success:checked {
1614
+ background-color: var(--color-success);
1615
+ color: #ffffff;
1616
+ }
1617
+ .odt-checkbox--success:focus-visible, .odt-radio--success:focus-visible {
1618
+ box-shadow: 0 0 0 3px hsl(from var(--color-success) h s l / 0.35);
1619
+ }
1620
+
1621
+ .odt-checkbox--warning:checked, .odt-radio--warning:checked {
1622
+ background-color: var(--color-warning);
1623
+ color: var(--color-fg-strong);
1624
+ }
1625
+ .odt-checkbox--warning:focus-visible, .odt-radio--warning:focus-visible {
1626
+ box-shadow: 0 0 0 3px hsl(from var(--color-warning) h s l / 0.35);
1627
+ }
1628
+
1629
+ .odt-checkbox--danger:checked, .odt-radio--danger:checked {
1630
+ background-color: var(--color-danger);
1631
+ color: #ffffff;
1632
+ }
1633
+ .odt-checkbox--danger:focus-visible, .odt-radio--danger:focus-visible {
1634
+ box-shadow: 0 0 0 3px hsl(from var(--color-danger) h s l / 0.35);
1635
+ }
1636
+
1637
+ .odt-checkbox--dark:checked, .odt-radio--dark:checked,
1638
+ .odt-checkbox--neutral:checked, .odt-radio--neutral:checked {
1639
+ background-color: var(--color-neutral-900);
1640
+ color: #ffffff;
1641
+ }
1642
+
1643
+ .odt-checkbox:disabled,
1644
+ .odt-radio:disabled {
1645
+ opacity: 0.45;
1646
+ cursor: not-allowed;
1647
+ pointer-events: none;
1648
+ }
1649
+
1650
+ .odt-checkbox__label-content,
1651
+ .odt-radio__label-content {
1652
+ display: flex;
1653
+ flex-direction: column;
1654
+ gap: 0.125rem;
1655
+ }
1656
+
1657
+ .odt-checkbox__label,
1658
+ .odt-radio__label {
1659
+ font-size: var(--font-size-sm, 0.875rem);
1660
+ color: var(--color-fg);
1661
+ font-weight: 500;
1662
+ line-height: 1.25rem;
1663
+ }
1664
+
1665
+ .odt-checkbox__description,
1666
+ .odt-radio__description {
1667
+ font-size: var(--font-size-xs, 0.75rem);
1668
+ color: var(--color-fg-muted);
1669
+ line-height: 1rem;
1670
+ }
1671
+
1672
+ /* ==========================================================================
1673
+ * 10. Toast & Toaster Component (.odt-toaster, .odt-toast)
1674
+ * ========================================================================== */
1675
+ .odt-toaster {
1676
+ position: fixed;
1677
+ z-index: 9999;
1678
+ box-sizing: border-box;
1679
+ font-family: inherit;
1680
+ width: 100%;
1681
+ max-width: 24rem; /* 384px */
1682
+ padding: var(--spacing-4, 1rem);
1683
+ pointer-events: none;
1684
+ display: flex;
1685
+ flex-direction: column;
1686
+ gap: var(--spacing-2-5, 0.625rem);
1687
+ }
1688
+
1689
+ /* Positions */
1690
+ .odt-toaster--top-right {
1691
+ top: 0;
1692
+ right: 0;
1693
+ }
1694
+
1695
+ .odt-toaster--top-center {
1696
+ top: 0;
1697
+ left: 50%;
1698
+ transform: translateX(-50%);
1699
+ }
1700
+
1701
+ .odt-toaster--top-left {
1702
+ top: 0;
1703
+ left: 0;
1704
+ }
1705
+
1706
+ .odt-toaster {
1707
+ position: fixed;
1708
+ z-index: 9999;
1709
+ box-sizing: border-box;
1710
+ font-family: inherit;
1711
+ width: 100%;
1712
+ max-width: 24rem; /* 384px */
1713
+ padding: var(--spacing-4, 1rem);
1714
+ pointer-events: none;
1715
+ min-height: 5rem;
1716
+ }
1717
+
1718
+ /* Positions */
1719
+ .odt-toaster--top-right {
1720
+ top: 0;
1721
+ right: 0;
1722
+ }
1723
+
1724
+ .odt-toaster--top-center {
1725
+ top: 0;
1726
+ left: 50%;
1727
+ transform: translateX(-50%);
1728
+ }
1729
+
1730
+ .odt-toaster--top-left {
1731
+ top: 0;
1732
+ left: 0;
1733
+ }
1734
+
1735
+ .odt-toaster--bottom-right {
1736
+ bottom: 0;
1737
+ right: 0;
1738
+ }
1739
+
1740
+ .odt-toaster--bottom-center {
1741
+ bottom: 0;
1742
+ left: 50%;
1743
+ transform: translateX(-50%);
1744
+ }
1745
+
1746
+ .odt-toaster--bottom-left {
1747
+ bottom: 0;
1748
+ left: 0;
1749
+ }
1750
+
1751
+ /* Toast Item Card (Absolute within Toaster for 3D stacking) */
1752
+ .odt-toast {
1753
+ position: absolute;
1754
+ left: var(--spacing-4, 1rem);
1755
+ right: var(--spacing-4, 1rem);
1756
+ box-sizing: border-box;
1757
+ display: flex;
1758
+ align-items: flex-start;
1759
+ gap: var(--spacing-3, 0.75rem);
1760
+ padding: var(--spacing-4, 1rem) var(--spacing-4-5, 1.125rem);
1761
+ background-color: var(--color-surface-elevated, #ffffff);
1762
+ color: var(--color-fg);
1763
+ border-radius: var(--radius-2xl, 1rem);
1764
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.04);
1765
+ pointer-events: auto;
1766
+ user-select: none;
1767
+ font-family: inherit;
1768
+ overflow: hidden;
1769
+ transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1),
1770
+ opacity 0.28s cubic-bezier(0.16, 1, 0.3, 1),
1771
+ box-shadow 0.25s ease;
1772
+ will-change: transform, opacity;
1773
+ }
1774
+
1775
+ .odt-toaster--top-right .odt-toast,
1776
+ .odt-toaster--top-center .odt-toast,
1777
+ .odt-toaster--top-left .odt-toast {
1778
+ top: var(--spacing-4, 1rem);
1779
+ bottom: auto;
1780
+ transform-origin: top center;
1781
+ }
1782
+
1783
+ .odt-toaster--bottom-right .odt-toast,
1784
+ .odt-toaster--bottom-center .odt-toast,
1785
+ .odt-toaster--bottom-left .odt-toast {
1786
+ bottom: var(--spacing-4, 1rem);
1787
+ top: auto;
1788
+ transform-origin: bottom center;
1789
+ }
1790
+
1791
+ .odt-toast--exiting {
1792
+ opacity: 0 !important;
1793
+ transform: scale(0.92) translateY(-12px) !important;
1794
+ pointer-events: none !important;
1795
+ transition: transform 0.24s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.24s ease !important;
1796
+ }
1797
+
1798
+ .odt-toaster--bottom-right .odt-toast--exiting,
1799
+ .odt-toaster--bottom-center .odt-toast--exiting,
1800
+ .odt-toaster--bottom-left .odt-toast--exiting {
1801
+ transform: scale(0.92) translateY(12px) !important;
1802
+ }
1803
+
1804
+ /* Surface Variants */
1805
+ .odt-toast--variant-frosted {
1806
+ background-color: var(--frosted-surface-bg, rgba(255, 255, 255, 0.70));
1807
+ backdrop-filter: blur(16px);
1808
+ -webkit-backdrop-filter: blur(16px);
1809
+ }
1810
+
1811
+ .odt-toast--variant-subtle {
1812
+ background-color: var(--color-surface-subtle);
1813
+ }
1814
+
1815
+ .odt-toast--variant-outlined {
1816
+ background-color: var(--color-surface);
1817
+ }
1818
+
1819
+ /* Rich Color Tints (Optional) */
1820
+ .odt-toast--rich-success {
1821
+ background-color: var(--color-surface-success, hsl(142 71% 96%));
1822
+ }
1823
+
1824
+ .odt-toast--rich-warning {
1825
+ background-color: var(--color-surface-warning, hsl(38 92% 96%));
1826
+ }
1827
+
1828
+ .odt-toast--rich-danger,
1829
+ .odt-toast--rich-error {
1830
+ background-color: var(--color-surface-danger, hsl(0 84% 97%));
1831
+ }
1832
+
1833
+ .odt-toast--rich-info {
1834
+ background-color: var(--color-surface-info, hsl(217 91% 97%));
1835
+ }
1836
+
1837
+ /* Toast Sub-elements */
1838
+ .odt-toast__icon {
1839
+ display: flex;
1840
+ align-items: center;
1841
+ justify-content: center;
1842
+ width: 1.375rem;
1843
+ height: 1.375rem;
1844
+ flex-shrink: 0;
1845
+ margin-top: 0.0625rem;
1846
+ }
1847
+
1848
+ .odt-toast__icon svg {
1849
+ display: block;
1850
+ }
1851
+
1852
+ .odt-toast__icon--success { color: var(--color-success, #16a34a); }
1853
+ .odt-toast__icon--warning { color: var(--color-warning, #d97706); }
1854
+ .odt-toast__icon--danger,
1855
+ .odt-toast__icon--error { color: var(--color-danger, #dc2626); }
1856
+ .odt-toast__icon--info { color: var(--color-info, #2563eb); }
1857
+ .odt-toast__icon--loading {
1858
+ color: var(--color-primary-500, #3b82f6);
1859
+ animation: odt-spin 0.8s linear infinite;
1860
+ }
1861
+
1862
+ .odt-toast__content {
1863
+ display: flex;
1864
+ flex-direction: column;
1865
+ gap: var(--spacing-0-5, 0.125rem);
1866
+ flex: 1;
1867
+ min-width: 0;
1868
+ }
1869
+
1870
+ .odt-toast__title {
1871
+ font-size: var(--font-size-base, 0.9375rem);
1872
+ font-weight: var(--font-weight-semibold, 600);
1873
+ color: var(--color-fg-strong);
1874
+ line-height: 1.35;
1875
+ margin: 0;
1876
+ }
1877
+
1878
+ .odt-toast__description,
1879
+ .odt-toast__message {
1880
+ font-size: var(--font-size-sm, 0.8125rem);
1881
+ color: var(--color-fg-muted);
1882
+ line-height: 1.45;
1883
+ margin: 0;
1884
+ }
1885
+
1886
+ .odt-toast__close {
1887
+ display: inline-flex;
1888
+ align-items: center;
1889
+ justify-content: center;
1890
+ width: 1.5rem;
1891
+ height: 1.5rem;
1892
+ padding: 0;
1893
+ border-radius: var(--radius-md, 0.375rem);
1894
+ border: none;
1895
+ background: transparent;
1896
+ color: var(--color-fg-muted);
1897
+ cursor: pointer;
1898
+ flex-shrink: 0;
1899
+ margin-left: auto;
1900
+ margin-top: -0.125rem;
1901
+ transition: background-color 0.15s ease, color 0.15s ease;
1902
+ }
1903
+
1904
+ .odt-toast__close:hover {
1905
+ background-color: var(--color-surface-subtle);
1906
+ color: var(--color-fg-strong);
1907
+ }
1908
+
1909
+ .odt-toast__close svg {
1910
+ display: block;
1911
+ }
1912
+
1913
+ /* ==========================================================================
1914
+ * 11. Modal Component (.odt-modal-overlay, .odt-modal)
1915
+ * ========================================================================== */
1916
+ @keyframes odt-overlay-fade-in {
1917
+ from { opacity: 0; }
1918
+ to { opacity: 1; }
1919
+ }
1920
+
1921
+ @keyframes odt-overlay-fade-out {
1922
+ from { opacity: 1; }
1923
+ to { opacity: 0; }
1924
+ }
1925
+
1926
+ @keyframes odt-modal-scale-in {
1927
+ from {
1928
+ opacity: 0;
1929
+ transform: scale(0.95) translateY(10px);
1930
+ }
1931
+ to {
1932
+ opacity: 1;
1933
+ transform: scale(1) translateY(0);
1934
+ }
1935
+ }
1936
+
1937
+ @keyframes odt-modal-scale-out {
1938
+ from {
1939
+ opacity: 1;
1940
+ transform: scale(1) translateY(0);
1941
+ }
1942
+ to {
1943
+ opacity: 0;
1944
+ transform: scale(0.96) translateY(8px);
1945
+ }
1946
+ }
1947
+
1948
+ .odt-modal-overlay {
1949
+ position: fixed;
1950
+ inset: 0;
1951
+ z-index: 1000;
1952
+ display: flex;
1953
+ justify-content: center;
1954
+ align-items: center;
1955
+ padding: var(--spacing-4, 1rem);
1956
+ background-color: var(--color-overlay-backdrop, rgba(0, 0, 0, 0.6));
1957
+ overflow-y: auto;
1958
+ box-sizing: border-box;
1959
+ font-family: inherit;
1960
+ animation: odt-overlay-fade-in 0.22s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1961
+ }
1962
+
1963
+ .odt-modal-overlay.hidden {
1964
+ display: none !important;
1965
+ }
1966
+
1967
+ .odt-modal-overlay--exiting {
1968
+ animation: odt-overlay-fade-out 0.18s cubic-bezier(0.4, 0, 1, 1) forwards;
1969
+ pointer-events: none;
1970
+ }
1971
+
1972
+ /* Modal Content Box */
1973
+ .odt-modal {
1974
+ position: relative;
1975
+ width: 100%;
1976
+ box-sizing: border-box;
1977
+ font-family: inherit;
1978
+ background-color: var(--color-surface-elevated, #ffffff);
1979
+ color: var(--color-fg);
1980
+ border-radius: var(--radius-2xl, 1rem);
1981
+ box-shadow: var(--shadow-modal);
1982
+ border: 1px solid var(--color-line-muted, rgba(226, 232, 240, 0.8));
1983
+ display: flex;
1984
+ flex-direction: column;
1985
+ outline: none;
1986
+ animation: odt-modal-scale-in 0.24s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1987
+ margin: auto 0;
1988
+ }
1989
+
1990
+ .odt-modal--exiting {
1991
+ animation: odt-modal-scale-out 0.18s cubic-bezier(0.4, 0, 1, 1) forwards;
1992
+ }
1993
+
1994
+ /* Modal Sizes */
1995
+ .odt-modal--sm {
1996
+ max-width: 24rem; /* 384px */
1997
+ }
1998
+
1999
+ .odt-modal--md {
2000
+ max-width: 32rem; /* 512px */
2001
+ }
2002
+
2003
+ .odt-modal--lg {
2004
+ max-width: 42rem; /* 672px */
2005
+ }
2006
+
2007
+ .odt-modal--xl {
2008
+ max-width: 56rem; /* 896px */
2009
+ }
2010
+
2011
+ .odt-modal--full {
2012
+ max-width: calc(100vw - 2rem);
2013
+ min-height: calc(100vh - 3rem);
2014
+ }
2015
+
2016
+ /* Modal Sub-components */
2017
+ .odt-modal__header {
2018
+ display: flex;
2019
+ align-items: flex-start;
2020
+ justify-content: space-between;
2021
+ padding: var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem) var(--spacing-2, 0.5rem);
2022
+ gap: var(--spacing-3, 0.75rem);
2023
+ }
2024
+
2025
+ .odt-modal__header-content {
2026
+ display: flex;
2027
+ flex-direction: column;
2028
+ gap: var(--spacing-1, 0.25rem);
2029
+ flex: 1;
2030
+ }
2031
+
2032
+ .odt-modal__title {
2033
+ font-family: inherit;
2034
+ font-size: var(--font-size-xl, 1.25rem);
2035
+ font-weight: var(--font-weight-bold, 700);
2036
+ color: var(--color-fg-strong);
2037
+ margin: 0;
2038
+ line-height: var(--line-height-tight, 1.25);
2039
+ }
2040
+
2041
+ .odt-modal__subtitle {
2042
+ font-family: inherit;
2043
+ font-size: var(--font-size-sm, 0.875rem);
2044
+ color: var(--color-fg-muted);
2045
+ margin: 0;
2046
+ }
2047
+
2048
+ .odt-modal__body {
2049
+ font-family: inherit;
2050
+ padding: var(--spacing-2, 0.5rem) var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem);
2051
+ font-size: var(--font-size-base, 1rem);
2052
+ line-height: var(--line-height-normal, 1.5);
2053
+ color: var(--color-fg);
2054
+ overflow-y: auto;
2055
+ max-height: 70vh;
2056
+ }
2057
+
2058
+ .odt-modal__footer {
2059
+ font-family: inherit;
2060
+ display: flex;
2061
+ align-items: center;
2062
+ justify-content: flex-end;
2063
+ gap: var(--spacing-3, 0.75rem);
2064
+ padding: var(--spacing-2, 0.5rem) var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem);
2065
+ border-bottom-left-radius: inherit;
2066
+ border-bottom-right-radius: inherit;
2067
+ }
2068
+
2069
+ .odt-modal__close {
2070
+ display: inline-flex;
2071
+ align-items: center;
2072
+ justify-content: center;
2073
+ width: 2rem;
2074
+ height: 2rem;
2075
+ padding: 0;
2076
+ border-radius: var(--radius-lg, 0.5rem);
2077
+ border: none;
2078
+ background: transparent;
2079
+ color: var(--color-fg-muted);
2080
+ cursor: pointer;
2081
+ transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;
2082
+ flex-shrink: 0;
2083
+ margin-left: auto;
2084
+ font-size: 1.25rem;
2085
+ line-height: 1;
2086
+ }
2087
+
2088
+ .odt-modal__close:hover {
2089
+ background-color: var(--color-surface-subtle);
2090
+ color: var(--color-fg-strong);
2091
+ }
2092
+
2093
+ .odt-modal__close:active {
2094
+ transform: scale(0.94);
2095
+ }
2096
+
2097
+ /* ==========================================================================
2098
+ * 12. DropdownMenu Component (.odt-dropdown)
2099
+ * ========================================================================== */
2100
+ .odt-dropdown {
2101
+ position: relative;
2102
+ display: inline-block;
2103
+ }
2104
+
2105
+ .odt-dropdown--full-width {
2106
+ width: 100%;
2107
+ }
2108
+
2109
+ .odt-dropdown__container {
2110
+ display: inline-flex;
2111
+ flex-direction: column;
2112
+ gap: var(--spacing-1-5, 0.375rem);
2113
+ box-sizing: border-box;
2114
+ font-family: inherit;
2115
+ }
2116
+
2117
+ .odt-dropdown__container--full-width {
2118
+ width: 100%;
2119
+ }
2120
+
2121
+ .odt-dropdown__label {
2122
+ font-size: var(--font-size-sm, 0.875rem);
2123
+ font-weight: 500;
2124
+ color: var(--color-fg-strong);
2125
+ line-height: 1.25rem;
2126
+ user-select: none;
2127
+ cursor: default;
2128
+ }
2129
+
2130
+ .odt-dropdown__trigger {
2131
+ display: inline-flex;
2132
+ align-items: center;
2133
+ justify-content: space-between;
2134
+ box-sizing: border-box;
2135
+ background-color: var(--color-surface, #ffffff);
2136
+ color: var(--color-fg);
2137
+ font-family: inherit;
2138
+ font-weight: 500;
2139
+ outline: none;
2140
+ border: 1px solid transparent;
2141
+ cursor: pointer;
2142
+ user-select: none;
2143
+ gap: 0.5rem;
2144
+ transition: border-color 140ms ease, box-shadow 140ms ease, background-color 140ms ease;
2145
+ }
2146
+
2147
+ .odt-dropdown__trigger--outlined {
2148
+ background-color: var(--color-surface, #ffffff);
2149
+ border: 1px solid var(--color-line, #e4e4e9);
2150
+ }
2151
+ .odt-dropdown__trigger--outlined:hover:not(:disabled):not(:focus):not(.odt-dropdown__trigger--open) {
2152
+ border-color: var(--color-line-strong, #d4d4db);
2153
+ }
2154
+ .odt-dropdown__trigger--outlined:focus,
2155
+ .odt-dropdown__trigger--outlined.odt-dropdown__trigger--open {
2156
+ border-color: var(--color-ring);
2157
+ }
2158
+
2159
+ .odt-dropdown__trigger--filled {
2160
+ background-color: var(--color-surface, #ffffff);
2161
+ border: 1px solid transparent;
2162
+ }
2163
+ .odt-dropdown__trigger--filled:focus,
2164
+ .odt-dropdown__trigger--filled.odt-dropdown__trigger--open {
2165
+ border-color: var(--color-ring);
2166
+ }
2167
+
2168
+ .odt-dropdown__trigger--frosted {
2169
+ background-color: hsl(from var(--color-surface) h s l / 0.85);
2170
+ backdrop-filter: blur(16px);
2171
+ -webkit-backdrop-filter: blur(16px);
2172
+ border: 1px solid transparent;
2173
+ box-shadow: var(--shadow-card);
2174
+ }
2175
+ .odt-dropdown__trigger--frosted:focus,
2176
+ .odt-dropdown__trigger--frosted.odt-dropdown__trigger--open {
2177
+ border-color: var(--color-ring);
2178
+ }
2179
+
2180
+ .odt-dropdown__trigger--sm {
2181
+ height: 2rem;
2182
+ padding: 0 var(--spacing-3, 0.75rem);
2183
+ font-size: var(--font-size-xs, 0.75rem);
2184
+ }
2185
+ .odt-dropdown__trigger--md {
2186
+ height: 2.625rem;
2187
+ padding: 0 var(--spacing-4, 1rem);
2188
+ font-size: var(--font-size-sm, 0.875rem);
2189
+ }
2190
+ .odt-dropdown__trigger--lg {
2191
+ height: 3.125rem;
2192
+ padding: 0 var(--spacing-5, 1.25rem);
2193
+ font-size: var(--font-size-base, 1rem);
2194
+ }
2195
+
2196
+ .odt-dropdown__trigger-text {
2197
+ flex: 1 1 auto;
2198
+ text-align: left;
2199
+ overflow: hidden;
2200
+ text-overflow: ellipsis;
2201
+ white-space: nowrap;
2202
+ }
2203
+
2204
+ .odt-dropdown__placeholder {
2205
+ color: var(--color-fg-subtle);
2206
+ font-weight: 400;
2207
+ }
2208
+
2209
+ .odt-dropdown__chevron {
2210
+ display: inline-flex;
2211
+ align-items: center;
2212
+ justify-content: center;
2213
+ color: var(--color-fg-muted);
2214
+ flex-shrink: 0;
2215
+ transition: transform 180ms cubic-bezier(0.16, 1, 0.3, 1), color 140ms ease;
2216
+ }
2217
+
2218
+ .odt-dropdown__chevron--open {
2219
+ transform: rotate(180deg);
2220
+ color: var(--color-fg-strong);
2221
+ }
2222
+
2223
+ .odt-dropdown__trigger--error {
2224
+ border-color: var(--color-danger) !important;
2225
+ }
2226
+
2227
+ .odt-dropdown__trigger:disabled {
2228
+ background-color: var(--color-surface-subtle);
2229
+ color: var(--color-fg-disabled);
2230
+ cursor: not-allowed;
2231
+ opacity: 0.7;
2232
+ }
2233
+
2234
+ .odt-dropdown__content {
2235
+ position: absolute;
2236
+ z-index: 1000;
2237
+ display: flex;
2238
+ flex-direction: column;
2239
+ box-sizing: border-box;
2240
+ padding: 0.3125rem;
2241
+ background-color: var(--color-surface, #ffffff);
2242
+ border: 1px solid var(--color-line-muted, rgba(226, 232, 240, 0.8));
2243
+ border-radius: var(--radius-xl, 0.75rem);
2244
+ color: var(--color-neutral-900);
2245
+ outline: none;
2246
+ min-width: 12rem;
2247
+ box-shadow: 0 10px 28px -4px rgba(0, 0, 0, 0.08), 0 4px 10px -2px rgba(0, 0, 0, 0.03);
2248
+ transform-origin: top center;
2249
+ animation: odt-dropdown-enter 150ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
2250
+ }
2251
+
2252
+ .odt-dropdown__content.hidden {
2253
+ display: none !important;
2254
+ }
2255
+
2256
+ .odt-dropdown__content--align-start { left: 0; }
2257
+ .odt-dropdown__content--align-end { right: 0; }
2258
+ .odt-dropdown__content--align-center { left: 50%; transform: translateX(-50%); }
2259
+
2260
+ .odt-dropdown__content--side-bottom { top: calc(100% + 6px); }
2261
+ .odt-dropdown__content--side-top { bottom: calc(100% + 6px); }
2262
+
2263
+ .odt-dropdown__content--exiting {
2264
+ animation: odt-dropdown-exit 110ms cubic-bezier(0.4, 0, 1, 1) forwards;
2265
+ pointer-events: none;
2266
+ }
2267
+
2268
+ @keyframes odt-dropdown-enter {
2269
+ from {
2270
+ opacity: 0;
2271
+ transform: scale(0.97) translateY(-4px);
2272
+ }
2273
+ to {
2274
+ opacity: 1;
2275
+ transform: scale(1) translateY(0);
2276
+ }
2277
+ }
2278
+
2279
+ @keyframes odt-dropdown-exit {
2280
+ from {
2281
+ opacity: 1;
2282
+ transform: scale(1) translateY(0);
2283
+ }
2284
+ to {
2285
+ opacity: 0;
2286
+ transform: scale(0.97) translateY(-4px);
2287
+ }
2288
+ }
2289
+
2290
+ .odt-dropdown__item {
2291
+ position: relative;
2292
+ display: flex;
2293
+ align-items: center;
2294
+ width: 100%;
2295
+ box-sizing: border-box;
2296
+ padding: 0.4375rem 0.625rem;
2297
+ border-radius: var(--radius-lg, 0.5rem);
2298
+ font-size: 0.8125rem;
2299
+ font-weight: 500;
2300
+ line-height: 1.25rem;
2301
+ letter-spacing: -0.01em;
2302
+ color: var(--color-neutral-700);
2303
+ background: transparent;
2304
+ border: none;
2305
+ cursor: pointer;
2306
+ user-select: none;
2307
+ text-decoration: none;
2308
+ transition: background-color 120ms ease, color 120ms ease, transform 100ms ease;
2309
+ outline: none;
2310
+ gap: 0.5rem;
2311
+ }
2312
+
2313
+ .odt-dropdown__item:hover,
2314
+ .odt-dropdown__item:focus-visible,
2315
+ .odt-dropdown__item[data-highlighted="true"] {
2316
+ background-color: var(--color-surface-subtle);
2317
+ color: var(--color-neutral-950);
2318
+ }
2319
+
2320
+ .odt-dropdown__item:active {
2321
+ background-color: var(--color-neutral-200);
2322
+ transform: scale(0.99);
2323
+ }
2324
+
2325
+ .odt-dropdown__item--inset {
2326
+ padding-left: 2.125rem;
2327
+ }
2328
+
2329
+ .odt-dropdown__item:disabled,
2330
+ .odt-dropdown__item--disabled {
2331
+ opacity: 0.4;
2332
+ cursor: not-allowed;
2333
+ pointer-events: none;
2334
+ }
2335
+
2336
+ .odt-dropdown__item--destructive {
2337
+ color: var(--color-danger);
2338
+ }
2339
+
2340
+ .odt-dropdown__item--destructive:hover,
2341
+ .odt-dropdown__item--destructive:focus-visible,
2342
+ .odt-dropdown__item--destructive[data-highlighted="true"] {
2343
+ background-color: var(--color-surface-danger);
2344
+ color: var(--color-danger);
2345
+ }
2346
+
2347
+ .odt-dropdown__item-content {
2348
+ flex: 1 1 auto;
2349
+ display: flex;
2350
+ align-items: center;
2351
+ overflow: hidden;
2352
+ text-overflow: ellipsis;
2353
+ white-space: nowrap;
2354
+ }
2355
+
2356
+ .odt-dropdown__item-icon {
2357
+ display: inline-flex;
2358
+ align-items: center;
2359
+ justify-content: center;
2360
+ flex-shrink: 0;
2361
+ width: 1rem;
2362
+ height: 1rem;
2363
+ color: var(--color-neutral-400);
2364
+ transition: color 120ms ease;
2365
+ }
2366
+
2367
+ .odt-dropdown__item:hover .odt-dropdown__item-icon,
2368
+ .odt-dropdown__item:focus-visible .odt-dropdown__item-icon {
2369
+ color: var(--color-neutral-800);
2370
+ }
2371
+
2372
+ .odt-dropdown__item--destructive .odt-dropdown__item-icon {
2373
+ color: var(--color-danger);
2374
+ }
2375
+
2376
+ .odt-dropdown__item-right-icon {
2377
+ display: inline-flex;
2378
+ align-items: center;
2379
+ justify-content: center;
2380
+ flex-shrink: 0;
2381
+ margin-left: auto;
2382
+ color: var(--color-neutral-400);
2383
+ }
2384
+
2385
+ .odt-dropdown__shortcut {
2386
+ margin-left: auto;
2387
+ font-size: 0.6875rem;
2388
+ font-weight: 500;
2389
+ letter-spacing: 0.04em;
2390
+ font-family: var(--font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);
2391
+ color: var(--color-neutral-400);
2392
+ background: none;
2393
+ border: none;
2394
+ padding: 0;
2395
+ line-height: 1rem;
2396
+ display: inline-flex;
2397
+ align-items: center;
2398
+ }
2399
+
2400
+ .odt-dropdown__label-heading {
2401
+ padding: 0.375rem 0.625rem 0.25rem;
2402
+ font-size: 0.6875rem;
2403
+ font-weight: 600;
2404
+ text-transform: uppercase;
2405
+ letter-spacing: 0.05em;
2406
+ color: var(--color-neutral-400);
2407
+ user-select: none;
2408
+ }
2409
+
2410
+ .odt-dropdown__label-heading--inset {
2411
+ padding-left: 2.125rem;
2412
+ }
2413
+
2414
+ .odt-dropdown__separator {
2415
+ height: 1px;
2416
+ margin: 0.25rem 0.25rem;
2417
+ background-color: var(--color-line-muted, rgba(226, 232, 240, 0.8));
2418
+ border: none;
2419
+ }
2420
+
2421
+ .odt-dropdown__group {
2422
+ display: flex;
2423
+ flex-direction: column;
2424
+ width: 100%;
2425
+ }
2426
+
2427
+
2428
+