odt-ui-rails 2.2.3 → 2.2.4

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,2048 @@
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
+ background-color: var(--color-primary-500);
595
+ color: var(--color-btn-primary-fg, #ffffff);
596
+ }
597
+ .odt-btn--filled-primary:hover:not(:disabled) {
598
+ background-color: var(--color-primary-600);
599
+ }
600
+ .odt-btn--filled-primary:active:not(:disabled) {
601
+ background-color: var(--color-primary-700);
602
+ }
603
+
604
+ .odt-btn--filled-secondary {
605
+ background-color: var(--color-secondary-500);
606
+ color: var(--color-btn-secondary-fg, hsl(224 25% 6%));
607
+ }
608
+ .odt-btn--filled-secondary:hover:not(:disabled) {
609
+ background-color: var(--color-secondary-400);
610
+ }
611
+ .odt-btn--filled-secondary:active:not(:disabled) {
612
+ background-color: var(--color-secondary-600);
613
+ }
614
+
615
+ .odt-btn--filled-surface {
616
+ background-color: var(--color-surface);
617
+ color: var(--color-btn-surface-fg, var(--color-fg-strong));
618
+ }
619
+ .odt-btn--filled-surface:hover:not(:disabled) {
620
+ background-color: var(--color-surface-muted);
621
+ }
622
+ .odt-btn--filled-surface:active:not(:disabled) {
623
+ background-color: var(--color-surface-subtle);
624
+ }
625
+
626
+ .odt-btn--filled-muted {
627
+ background-color: var(--color-surface-muted);
628
+ color: var(--color-btn-muted-fg, var(--color-fg));
629
+ }
630
+ .odt-btn--filled-muted:hover:not(:disabled) {
631
+ background-color: var(--color-surface-subtle);
632
+ color: var(--color-fg-strong);
633
+ }
634
+ .odt-btn--filled-muted:active:not(:disabled) {
635
+ background-color: var(--color-surface);
636
+ }
637
+
638
+ .odt-btn--filled-inverse {
639
+ background-color: var(--color-fg-strong);
640
+ color: var(--color-btn-inverse-fg, var(--color-surface));
641
+ }
642
+ .odt-btn--filled-inverse:hover:not(:disabled) { opacity: 0.9; }
643
+ .odt-btn--filled-inverse:active:not(:disabled) { opacity: 0.8; }
644
+
645
+ .odt-btn--filled-success {
646
+ background-color: var(--color-success);
647
+ color: var(--color-btn-success-fg, #ffffff);
648
+ }
649
+ .odt-btn--filled-success:hover:not(:disabled) { opacity: 0.9; }
650
+ .odt-btn--filled-success:active:not(:disabled) { opacity: 0.8; }
651
+
652
+ .odt-btn--filled-warning {
653
+ background-color: var(--color-warning);
654
+ color: var(--color-btn-warning-fg, var(--color-fg-strong));
655
+ }
656
+ .odt-btn--filled-warning:hover:not(:disabled) { opacity: 0.9; }
657
+ .odt-btn--filled-warning:active:not(:disabled) { opacity: 0.8; }
658
+
659
+ .odt-btn--filled-danger {
660
+ background-color: var(--color-danger);
661
+ color: var(--color-btn-danger-fg, #ffffff);
662
+ }
663
+ .odt-btn--filled-danger:hover:not(:disabled) { opacity: 0.9; }
664
+ .odt-btn--filled-danger:active:not(:disabled) { opacity: 0.8; }
665
+
666
+ .odt-btn--filled-info {
667
+ background-color: var(--color-info);
668
+ color: var(--color-btn-info-fg, #ffffff);
669
+ }
670
+ .odt-btn--filled-info:hover:not(:disabled) { opacity: 0.9; }
671
+ .odt-btn--filled-info:active:not(:disabled) { opacity: 0.8; }
672
+
673
+ .odt-btn--filled-neutral {
674
+ background-color: var(--color-neutral-800);
675
+ color: #ffffff;
676
+ }
677
+ .odt-btn--filled-neutral:hover:not(:disabled) {
678
+ background-color: var(--color-neutral-900);
679
+ }
680
+
681
+ /* Button - Capsule Variant */
682
+ .odt-btn--capsule {
683
+ border-radius: var(--radius-full, 9999px) !important;
684
+ box-shadow: var(--shadow-card);
685
+ }
686
+ .odt-btn--capsule.odt-btn--sm { padding: 0.375rem 1.125rem; }
687
+ .odt-btn--capsule.odt-btn--md { padding: 0.625rem 1.5rem; }
688
+ .odt-btn--capsule.odt-btn--lg { padding: 0.75rem 2rem; }
689
+
690
+ /* Button - Frosted Variant */
691
+ .odt-btn--frosted {
692
+ backdrop-filter: blur(var(--frosted-blur, 16px));
693
+ -webkit-backdrop-filter: blur(var(--frosted-blur, 16px));
694
+ box-shadow: var(--shadow-card);
695
+ }
696
+ .odt-btn--frosted-primary {
697
+ background-color: hsl(from var(--color-primary-500) h s l / 0.85);
698
+ color: var(--color-btn-primary-fg, #ffffff);
699
+ }
700
+ .odt-btn--frosted-primary:hover:not(:disabled) {
701
+ background-color: hsl(from var(--color-primary-500) h s l / 0.95);
702
+ }
703
+ .odt-btn--frosted-secondary {
704
+ background-color: hsl(from var(--color-secondary-500) h s l / 0.85);
705
+ color: var(--color-btn-secondary-fg, hsl(224 25% 6%));
706
+ }
707
+ .odt-btn--frosted-secondary:hover:not(:disabled) {
708
+ background-color: hsl(from var(--color-secondary-500) h s l / 0.95);
709
+ }
710
+ .odt-btn--frosted-surface {
711
+ background-color: var(--frosted-surface-bg);
712
+ color: var(--color-btn-surface-fg, var(--color-fg-strong));
713
+ }
714
+ .odt-btn--frosted-surface:hover:not(:disabled) {
715
+ background-color: var(--frosted-muted-bg);
716
+ }
717
+ .odt-btn--frosted-muted {
718
+ background-color: var(--frosted-muted-bg);
719
+ color: var(--color-btn-muted-fg, var(--color-fg));
720
+ }
721
+ .odt-btn--frosted-muted:hover:not(:disabled) {
722
+ background-color: var(--frosted-subtle-bg);
723
+ }
724
+ .odt-btn--frosted-inverse {
725
+ background-color: hsl(from var(--color-fg-strong) h s l / 0.85);
726
+ color: var(--color-btn-inverse-fg, var(--color-surface));
727
+ }
728
+ .odt-btn--frosted-inverse:hover:not(:disabled) {
729
+ background-color: hsl(from var(--color-fg-strong) h s l / 0.95);
730
+ }
731
+ .odt-btn--frosted-success {
732
+ background-color: hsl(from var(--color-success) h s l / 0.85);
733
+ color: var(--color-btn-success-fg, #ffffff);
734
+ }
735
+ .odt-btn--frosted-warning {
736
+ background-color: hsl(from var(--color-warning) h s l / 0.85);
737
+ color: var(--color-btn-warning-fg, var(--color-fg-strong));
738
+ }
739
+ .odt-btn--frosted-danger {
740
+ background-color: hsl(from var(--color-danger) h s l / 0.85);
741
+ color: var(--color-btn-danger-fg, #ffffff);
742
+ }
743
+ .odt-btn--frosted-info {
744
+ background-color: hsl(from var(--color-info) h s l / 0.85);
745
+ color: var(--color-btn-info-fg, #ffffff);
746
+ }
747
+
748
+ /* Button - Ghost Variant */
749
+ .odt-btn--ghost {
750
+ background-color: transparent;
751
+ box-shadow: none;
752
+ }
753
+ .odt-btn--ghost-primary { color: var(--color-fg-primary); }
754
+ .odt-btn--ghost-primary:hover:not(:disabled) { background-color: var(--color-primary-50); }
755
+ .odt-btn--ghost-primary:active:not(:disabled) { background-color: var(--color-primary-100); }
756
+
757
+ .odt-btn--ghost-secondary { color: var(--color-fg-secondary); }
758
+ .odt-btn--ghost-secondary:hover:not(:disabled) { background-color: var(--color-secondary-50); }
759
+ .odt-btn--ghost-secondary:active:not(:disabled) { background-color: var(--color-secondary-100); }
760
+
761
+ .odt-btn--ghost-surface,
762
+ .odt-btn--ghost-muted,
763
+ .odt-btn--ghost-inverse { color: var(--color-fg-strong); }
764
+ .odt-btn--ghost-surface:hover:not(:disabled),
765
+ .odt-btn--ghost-muted:hover:not(:disabled),
766
+ .odt-btn--ghost-inverse:hover:not(:disabled) { background-color: var(--color-surface-muted); }
767
+
768
+ .odt-btn--ghost-success { color: var(--color-fg-success); }
769
+ .odt-btn--ghost-success:hover:not(:disabled) { background-color: var(--color-surface-success); }
770
+
771
+ .odt-btn--ghost-warning { color: var(--color-fg-warning); }
772
+ .odt-btn--ghost-warning:hover:not(:disabled) { background-color: var(--color-surface-warning); }
773
+
774
+ .odt-btn--ghost-danger { color: var(--color-fg-danger); }
775
+ .odt-btn--ghost-danger:hover:not(:disabled) { background-color: var(--color-surface-danger); }
776
+
777
+ .odt-btn--ghost-info { color: var(--color-fg-info); }
778
+ .odt-btn--ghost-info:hover:not(:disabled) { background-color: var(--color-surface-info); }
779
+
780
+ .odt-btn--ghost-neutral { color: var(--color-fg-muted); }
781
+ .odt-btn--ghost-neutral:hover:not(:disabled) { color: var(--color-fg); background-color: var(--color-surface-muted); }
782
+
783
+ /* Legacy / Secondary Button Variants Compatibility */
784
+ .odt-btn--light-primary { background-color: var(--color-primary-50); color: var(--color-primary-700); }
785
+ .odt-btn--light-primary:hover:not(:disabled) { background-color: var(--color-primary-100); }
786
+ .odt-btn--light-secondary { background-color: var(--color-secondary-50); color: var(--color-secondary-900); }
787
+ .odt-btn--light-secondary:hover:not(:disabled) { background-color: var(--color-secondary-100); }
788
+ .odt-btn--light-success { background-color: var(--color-surface-success); color: var(--color-fg-success); }
789
+ .odt-btn--light-warning { background-color: var(--color-surface-warning); color: var(--color-fg-warning); }
790
+ .odt-btn--light-danger { background-color: var(--color-surface-danger); color: var(--color-fg-danger); }
791
+ .odt-btn--light-neutral { background-color: var(--color-surface-muted); color: var(--color-fg-muted); }
792
+
793
+ .odt-btn--outline-primary, .odt-btn--outlined-primary { border-color: var(--color-primary-300); color: var(--color-primary-600); background-color: transparent; }
794
+ .odt-btn--outline-primary:hover:not(:disabled) { background-color: var(--color-primary-50); }
795
+ .odt-btn--outline-secondary, .odt-btn--outlined-secondary { border-color: var(--color-secondary-300); color: var(--color-secondary-900); background-color: transparent; }
796
+ .odt-btn--outline-secondary:hover:not(:disabled) { background-color: var(--color-secondary-50); }
797
+ .odt-btn--outline-danger, .odt-btn--outlined-danger { border-color: var(--color-danger); color: var(--color-danger); background-color: transparent; }
798
+ .odt-btn--outline-danger:hover:not(:disabled) { background-color: var(--color-surface-danger); }
799
+ .odt-btn--outline-neutral, .odt-btn--outlined-neutral { border-color: var(--color-line); color: var(--color-fg); background-color: transparent; }
800
+ .odt-btn--outline-neutral:hover:not(:disabled) { background-color: var(--color-surface-subtle); }
801
+
802
+ .odt-btn--subtle-primary { background-color: transparent; color: var(--color-primary-600); }
803
+ .odt-btn--subtle-primary:hover:not(:disabled) { background-color: var(--color-primary-50); }
804
+ .odt-btn--subtle-secondary { background-color: transparent; color: var(--color-secondary-900); }
805
+ .odt-btn--subtle-secondary:hover:not(:disabled) { background-color: var(--color-secondary-50); }
806
+ .odt-btn--subtle-neutral { background-color: transparent; color: var(--color-fg); }
807
+ .odt-btn--subtle-neutral:hover:not(:disabled) { background-color: var(--color-surface-subtle); }
808
+ .odt-btn--subtle-danger { background-color: transparent; color: var(--color-danger); }
809
+ .odt-btn--subtle-danger:hover:not(:disabled) { background-color: var(--color-surface-danger); }
810
+
811
+ /* ==========================================================================
812
+ * 3. Badge Component (.odt-badge)
813
+ * ========================================================================== */
814
+ .odt-badge {
815
+ display: inline-flex;
816
+ align-items: center;
817
+ gap: var(--spacing-1-5, 0.375rem);
818
+ border-radius: var(--radius-full, 9999px);
819
+ font-family: inherit;
820
+ font-weight: var(--font-weight-semibold, 600);
821
+ line-height: 1;
822
+ white-space: nowrap;
823
+ box-sizing: border-box;
824
+ width: fit-content;
825
+ flex-shrink: 0;
826
+ }
827
+
828
+ .odt-badge--sm {
829
+ padding: 0.25rem 0.625rem;
830
+ font-size: var(--font-size-xs, 0.75rem);
831
+ }
832
+
833
+ .odt-badge--md {
834
+ padding: 0.375rem 0.875rem;
835
+ font-size: var(--font-size-sm, 0.875rem);
836
+ }
837
+
838
+ .odt-badge__dot {
839
+ width: 0.5rem;
840
+ height: 0.5rem;
841
+ border-radius: 50%;
842
+ background-color: currentColor;
843
+ display: inline-block;
844
+ flex-shrink: 0;
845
+ }
846
+
847
+ /* Badge - Subtle Variant */
848
+ .odt-badge--subtle-primary { background-color: var(--color-primary-50); color: var(--color-primary-600); }
849
+ .odt-badge--subtle-secondary { background-color: var(--color-secondary-100); color: var(--color-secondary-900); }
850
+ .odt-badge--subtle-success { background-color: var(--color-surface-success); color: var(--color-success); }
851
+ .odt-badge--subtle-warning { background-color: var(--color-surface-warning); color: var(--color-warning); }
852
+ .odt-badge--subtle-danger { background-color: var(--color-surface-danger); color: var(--color-danger); }
853
+ .odt-badge--subtle-info { background-color: var(--color-surface-info); color: var(--color-info); }
854
+ .odt-badge--subtle-neutral { background-color: var(--color-surface-muted); color: var(--color-fg-muted); }
855
+
856
+ /* Badge - Filled Variant */
857
+ .odt-badge--filled-primary { background-color: var(--color-primary-500); color: var(--color-badge-primary-fg, #ffffff); }
858
+ .odt-badge--filled-secondary { background-color: var(--color-secondary-500); color: var(--color-badge-secondary-fg, var(--color-fg-strong)); }
859
+ .odt-badge--filled-success { background-color: var(--color-success); color: var(--color-badge-success-fg, #ffffff); }
860
+ .odt-badge--filled-warning { background-color: var(--color-warning); color: var(--color-badge-warning-fg, var(--color-fg-strong)); }
861
+ .odt-badge--filled-danger { background-color: var(--color-danger); color: var(--color-badge-danger-fg, #ffffff); }
862
+ .odt-badge--filled-info { background-color: var(--color-info); color: var(--color-badge-info-fg, #ffffff); }
863
+ .odt-badge--filled-neutral { background-color: var(--color-neutral-800); color: var(--color-badge-neutral-fg, #ffffff); }
864
+
865
+ /* Badge - Outlined Variant */
866
+ .odt-badge--outlined, .odt-badge--outline { background-color: transparent; border: 1px solid currentColor; }
867
+ .odt-badge--outlined-primary, .odt-badge--outline-primary { color: var(--color-primary-600); border-color: var(--color-primary-300); }
868
+ .odt-badge--outlined-secondary, .odt-badge--outline-secondary { color: var(--color-secondary-800); border-color: var(--color-secondary-300); }
869
+ .odt-badge--outlined-success, .odt-badge--outline-success { color: var(--color-success); border-color: var(--color-line-success); }
870
+ .odt-badge--outlined-warning, .odt-badge--outline-warning { color: var(--color-warning); border-color: var(--color-line-warning); }
871
+ .odt-badge--outlined-danger, .odt-badge--outline-danger { color: var(--color-danger); border-color: var(--color-line-danger); }
872
+ .odt-badge--outlined-info, .odt-badge--outline-info { color: var(--color-info); border-color: var(--color-info); }
873
+ .odt-badge--outlined-neutral, .odt-badge--outline-neutral { color: var(--color-fg-muted); border-color: var(--color-line); }
874
+
875
+ /* ==========================================================================
876
+ * 4. Card Component (.odt-card)
877
+ * ========================================================================== */
878
+ .odt-card {
879
+ box-sizing: border-box;
880
+ border-radius: var(--radius-2xl, 1rem);
881
+ padding: var(--spacing-6, 1.5rem);
882
+ display: flex;
883
+ flex-direction: column;
884
+ gap: var(--spacing-4, 1rem);
885
+ position: relative;
886
+ transition: box-shadow 0.2s ease, transform 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
887
+ border: 1px solid transparent;
888
+ }
889
+
890
+ .odt-card--elevated {
891
+ background-color: var(--color-surface-base);
892
+ box-shadow: var(--shadow-card);
893
+ }
894
+
895
+ .odt-card--outlined {
896
+ background-color: var(--color-surface-base);
897
+ border: 1px solid var(--color-line);
898
+ }
899
+
900
+ .odt-card--subtle {
901
+ background-color: var(--color-surface-subtle);
902
+ }
903
+
904
+ .odt-card--muted {
905
+ background-color: var(--color-surface-muted);
906
+ }
907
+
908
+ .odt-card--ghost {
909
+ background-color: transparent;
910
+ }
911
+
912
+ .odt-card--frosted {
913
+ background-color: var(--frosted-surface-bg);
914
+ backdrop-filter: blur(var(--frosted-blur, 16px));
915
+ -webkit-backdrop-filter: blur(var(--frosted-blur, 16px));
916
+ box-shadow: var(--shadow-card);
917
+ border: 1px solid var(--frosted-surface-border);
918
+ }
919
+
920
+ /* Card Background Modifiers */
921
+ .odt-card--bg-base, .odt-card--bg-surface-base { background-color: var(--color-surface-base); }
922
+ .odt-card--bg-surface { background-color: var(--color-surface); }
923
+ .odt-card--bg-surface-elevated { background-color: var(--color-surface-elevated); }
924
+ .odt-card--bg-surface-muted { background-color: var(--color-surface-muted); }
925
+ .odt-card--bg-surface-subtle { background-color: var(--color-surface-subtle); }
926
+ .odt-card--bg-gradient-primary { background: var(--gradient-card); }
927
+ .odt-card--bg-gradient-secondary { background: var(--gradient-secondary-to-white); }
928
+ .odt-card--bg-gradient-vibrant { background: var(--gradient-vibrant); }
929
+ .odt-card--bg-gradient-hero { background: var(--gradient-hero-primary); }
930
+ .odt-card--bg-transparent { background-color: transparent; }
931
+
932
+ .odt-card--bg-frosted,
933
+ .odt-card--bg-frosted-muted,
934
+ .odt-card--bg-frosted-subtle,
935
+ .odt-card--bg-frosted-gradient-primary,
936
+ .odt-card--bg-frosted-gradient-secondary {
937
+ backdrop-filter: blur(var(--frosted-blur, 16px));
938
+ -webkit-backdrop-filter: blur(var(--frosted-blur, 16px));
939
+ }
940
+ .odt-card--bg-frosted { background-color: var(--frosted-surface-bg); }
941
+ .odt-card--bg-frosted-muted { background-color: var(--frosted-muted-bg); }
942
+ .odt-card--bg-frosted-subtle { background-color: var(--frosted-subtle-bg); }
943
+ .odt-card--bg-frosted-gradient-primary { background: var(--frosted-gradient-primary); }
944
+ .odt-card--bg-frosted-gradient-secondary { background: var(--frosted-gradient-secondary); }
945
+
946
+ /* Card Border Modifiers */
947
+ .odt-card--border-none { border: none; }
948
+ .odt-card--border-muted { border: 1px solid var(--color-line-muted); }
949
+ .odt-card--border-base { border: 1px solid var(--color-line); }
950
+ .odt-card--border-strong { border: 1px solid var(--color-line-strong); }
951
+ .odt-card--border-primary { border: 1px solid var(--color-line-primary); }
952
+ .odt-card--border-secondary { border: 1px solid var(--color-secondary-500); }
953
+ .odt-card--border-danger { border: 1px solid var(--color-line-danger); }
954
+ .odt-card--border-success { border: 1px solid var(--color-line-success); }
955
+
956
+ /* Card Padding Modifiers */
957
+ .odt-card--padding-none { padding: 0; }
958
+ .odt-card--padding-xs { padding: var(--spacing-2, 0.5rem); }
959
+ .odt-card--padding-sm { padding: var(--spacing-3, 0.75rem); }
960
+ .odt-card--padding-md { padding: var(--spacing-4, 1rem); }
961
+ .odt-card--padding-lg { padding: var(--spacing-6, 1.5rem); }
962
+ .odt-card--padding-xl { padding: var(--spacing-8, 2rem); }
963
+ .odt-card--padding-2xl { padding: var(--spacing-10, 2.5rem); }
964
+
965
+ .odt-card--hoverable {
966
+ cursor: pointer;
967
+ }
968
+ .odt-card--hoverable:hover {
969
+ transform: translateY(-2px);
970
+ box-shadow: var(--shadow-dropdown);
971
+ }
972
+
973
+ /* Card Sub-components */
974
+ .odt-card__header {
975
+ display: flex;
976
+ flex-direction: column;
977
+ gap: var(--spacing-1, 0.25rem);
978
+ }
979
+
980
+ .odt-card__header-with-action {
981
+ display: flex;
982
+ flex-direction: row;
983
+ align-items: flex-start;
984
+ justify-content: space-between;
985
+ gap: var(--spacing-3, 0.75rem);
986
+ width: 100%;
987
+ }
988
+
989
+ .odt-card__title {
990
+ font-size: var(--font-size-xl, 1.25rem);
991
+ font-weight: var(--font-weight-bold, 700);
992
+ color: var(--color-fg-strong);
993
+ margin: 0;
994
+ line-height: var(--line-height-tight, 1.25);
995
+ }
996
+
997
+ .odt-card__subtitle,
998
+ .odt-card__description {
999
+ font-size: var(--font-size-sm, 0.875rem);
1000
+ color: var(--color-fg-muted);
1001
+ margin: 0;
1002
+ }
1003
+
1004
+ .odt-card__content {
1005
+ color: var(--color-fg);
1006
+ font-size: var(--font-size-base, 1rem);
1007
+ line-height: var(--line-height-normal, 1.5);
1008
+ flex: 1 1 auto;
1009
+ }
1010
+
1011
+ .odt-card__footer {
1012
+ display: flex;
1013
+ align-items: center;
1014
+ gap: var(--spacing-3, 0.75rem);
1015
+ margin-top: auto;
1016
+ }
1017
+
1018
+ /* ==========================================================================
1019
+ * 5. Alert Component (.odt-alert)
1020
+ * ========================================================================== */
1021
+ .odt-alert {
1022
+ display: flex;
1023
+ align-items: flex-start;
1024
+ gap: var(--spacing-3, 0.75rem);
1025
+ padding: var(--spacing-4, 1rem);
1026
+ border-radius: var(--radius-2xl, 1rem);
1027
+ font-size: var(--font-size-sm, 0.875rem);
1028
+ box-sizing: border-box;
1029
+ border: 1px solid transparent;
1030
+ box-shadow: var(--shadow-card);
1031
+ }
1032
+
1033
+ .odt-alert--success {
1034
+ background-color: var(--color-surface-success);
1035
+ color: var(--color-fg-success);
1036
+ border-color: hsl(142 71% 85%);
1037
+ }
1038
+
1039
+ .odt-alert--warning {
1040
+ background-color: var(--color-surface-warning);
1041
+ color: var(--color-fg-warning);
1042
+ border-color: hsl(38 92% 85%);
1043
+ }
1044
+
1045
+ .odt-alert--danger {
1046
+ background-color: var(--color-surface-danger);
1047
+ color: var(--color-fg-danger);
1048
+ border-color: hsl(0 84% 90%);
1049
+ }
1050
+
1051
+ .odt-alert--info {
1052
+ background-color: var(--color-surface-info);
1053
+ color: var(--color-fg-info);
1054
+ border-color: hsl(217 91% 90%);
1055
+ }
1056
+
1057
+ .odt-alert__icon {
1058
+ font-size: 1.125rem;
1059
+ flex-shrink: 0;
1060
+ margin-top: 0.0625rem;
1061
+ }
1062
+
1063
+ .odt-alert__content {
1064
+ flex: 1 1 auto;
1065
+ font-weight: var(--font-weight-medium, 500);
1066
+ }
1067
+
1068
+ /* ==========================================================================
1069
+ * 6. Typography (.odt-heading, .odt-text)
1070
+ * ========================================================================== */
1071
+ .odt-heading,
1072
+ .odt-text {
1073
+ margin: 0;
1074
+ box-sizing: border-box;
1075
+ font-family: inherit;
1076
+ }
1077
+
1078
+ .odt-heading--5xl { font-size: var(--font-size-5xl, 3rem); line-height: 1; }
1079
+ .odt-heading--4xl { font-size: var(--font-size-4xl, 2.25rem); line-height: 2.5rem; }
1080
+ .odt-heading--3xl { font-size: var(--font-size-3xl, 1.875rem); line-height: 2.25rem; }
1081
+ .odt-heading--2xl { font-size: var(--font-size-2xl, 1.5rem); line-height: 2rem; }
1082
+ .odt-heading--xl { font-size: var(--font-size-xl, 1.25rem); line-height: 1.75rem; }
1083
+ .odt-heading--lg { font-size: var(--font-size-lg, 1.125rem); line-height: 1.75rem; }
1084
+
1085
+ .odt-text--2xl { font-size: var(--font-size-2xl, 1.5rem); line-height: 2rem; }
1086
+ .odt-text--xl { font-size: var(--font-size-xl, 1.25rem); line-height: 1.75rem; }
1087
+ .odt-text--lg { font-size: var(--font-size-lg, 1.125rem); line-height: 1.75rem; }
1088
+ .odt-text--base{ font-size: var(--font-size-base, 1rem); line-height: 1.5; }
1089
+ .odt-text--sm { font-size: var(--font-size-sm, 0.875rem); line-height: 1.25rem; }
1090
+ .odt-text--xs { font-size: var(--font-size-xs, 0.75rem); line-height: 1rem; }
1091
+
1092
+ .odt-weight-light { font-weight: var(--font-weight-light, 300); }
1093
+ .odt-weight-normal { font-weight: var(--font-weight-normal, 400); }
1094
+ .odt-weight-medium { font-weight: var(--font-weight-medium, 500); }
1095
+ .odt-weight-semibold { font-weight: var(--font-weight-semibold, 600); }
1096
+ .odt-weight-bold { font-weight: var(--font-weight-bold, 700); }
1097
+ .odt-weight-extrabold { font-weight: var(--font-weight-extrabold, 800); }
1098
+
1099
+ .odt-color-strong { color: var(--color-fg-strong); }
1100
+ .odt-color-default { color: var(--color-fg); }
1101
+ .odt-color-muted { color: var(--color-fg-muted); }
1102
+ .odt-color-subtle { color: var(--color-fg-subtle); }
1103
+ .odt-color-disabled { color: var(--color-fg-disabled); }
1104
+ .odt-color-primary { color: var(--color-fg-primary); }
1105
+ .odt-color-secondary { color: var(--color-fg-secondary); }
1106
+ .odt-color-success { color: var(--color-fg-success); }
1107
+ .odt-color-warning { color: var(--color-fg-warning); }
1108
+ .odt-color-danger { color: var(--color-fg-danger); }
1109
+ .odt-color-info { color: var(--color-fg-info); }
1110
+
1111
+ .odt-truncate {
1112
+ overflow: hidden;
1113
+ text-overflow: ellipsis;
1114
+ white-space: nowrap;
1115
+ }
1116
+
1117
+ /* ==========================================================================
1118
+ * 7. Avatar Component (.odt-avatar)
1119
+ * ========================================================================== */
1120
+ .odt-avatar {
1121
+ display: inline-flex;
1122
+ align-items: center;
1123
+ justify-content: center;
1124
+ border-radius: var(--radius-full, 9999px);
1125
+ overflow: hidden;
1126
+ position: relative;
1127
+ user-select: none;
1128
+ font-weight: var(--font-weight-bold, 700);
1129
+ box-sizing: border-box;
1130
+ flex-shrink: 0;
1131
+ box-shadow: var(--shadow-card);
1132
+ }
1133
+
1134
+ .odt-avatar--xs { width: 1.5rem; height: 1.5rem; font-size: 0.625rem; }
1135
+ .odt-avatar--sm { width: 2rem; height: 2rem; font-size: var(--font-size-xs, 0.75rem); }
1136
+ .odt-avatar--md { width: 2.5rem; height: 2.5rem; font-size: var(--font-size-sm, 0.875rem); }
1137
+ .odt-avatar--lg { width: 3rem; height: 3rem; font-size: var(--font-size-base, 1rem); }
1138
+ .odt-avatar--xl { width: 4rem; height: 4rem; font-size: var(--font-size-xl, 1.25rem); }
1139
+ .odt-avatar--2xl { width: 4.5rem; height: 4.5rem; font-size: var(--font-size-2xl, 1.5rem); }
1140
+
1141
+ .odt-avatar--secondary { background-color: var(--color-secondary-100); color: var(--color-secondary-900); }
1142
+ .odt-avatar--primary { background-color: var(--color-primary-100); color: var(--color-primary-600); }
1143
+ .odt-avatar--neutral { background-color: var(--color-surface-muted); color: var(--color-fg); }
1144
+
1145
+ .odt-avatar__image {
1146
+ width: 100%;
1147
+ height: 100%;
1148
+ object-fit: cover;
1149
+ }
1150
+
1151
+ .odt-avatar__fallback {
1152
+ width: 100%;
1153
+ height: 100%;
1154
+ display: flex;
1155
+ align-items: center;
1156
+ justify-content: center;
1157
+ text-transform: uppercase;
1158
+ }
1159
+
1160
+ /* ==========================================================================
1161
+ * 8. Form Controls (Input, Textarea, Select, Form Group)
1162
+ * ========================================================================== */
1163
+ .odt-input-container,
1164
+ .odt-form-group {
1165
+ display: inline-flex;
1166
+ flex-direction: column;
1167
+ gap: var(--spacing-1-5, 0.375rem);
1168
+ box-sizing: border-box;
1169
+ width: 100%;
1170
+ font-family: inherit;
1171
+ }
1172
+
1173
+ .odt-label {
1174
+ font-size: var(--font-size-sm, 0.875rem);
1175
+ font-weight: 500;
1176
+ color: var(--color-fg-strong);
1177
+ line-height: 1.25rem;
1178
+ }
1179
+
1180
+ .odt-label--required::after {
1181
+ content: " *";
1182
+ color: var(--color-danger);
1183
+ }
1184
+
1185
+ .odt-input-wrapper {
1186
+ position: relative;
1187
+ display: flex;
1188
+ align-items: center;
1189
+ width: 100%;
1190
+ box-sizing: border-box;
1191
+ }
1192
+
1193
+ .odt-input,
1194
+ .odt-textarea,
1195
+ .odt-select {
1196
+ width: 100%;
1197
+ box-sizing: border-box;
1198
+ background-color: var(--color-surface, #ffffff);
1199
+ color: var(--color-fg);
1200
+ font-family: inherit;
1201
+ outline: none;
1202
+ border: 1px solid transparent;
1203
+ transition: border-color 140ms ease, box-shadow 140ms ease;
1204
+ line-height: 1.25;
1205
+ }
1206
+
1207
+ .odt-input::placeholder,
1208
+ .odt-textarea::placeholder {
1209
+ color: var(--color-fg-subtle);
1210
+ }
1211
+
1212
+ /* Form Variants */
1213
+ .odt-input--outlined,
1214
+ .odt-textarea--outlined,
1215
+ .odt-select--outlined {
1216
+ background-color: var(--color-surface, #ffffff);
1217
+ border: 1px solid var(--color-line, #e4e4e9);
1218
+ }
1219
+ .odt-input--outlined:hover:not(:disabled):not(:focus),
1220
+ .odt-textarea--outlined:hover:not(:disabled):not(:focus),
1221
+ .odt-select--outlined:hover:not(:disabled):not(:focus) {
1222
+ border-color: var(--color-line-strong, #d4d4db);
1223
+ }
1224
+ .odt-input--outlined:focus,
1225
+ .odt-textarea--outlined:focus,
1226
+ .odt-select--outlined:focus {
1227
+ border-color: var(--color-ring);
1228
+ }
1229
+
1230
+ .odt-input--filled,
1231
+ .odt-textarea--filled,
1232
+ .odt-select--filled {
1233
+ background-color: var(--color-surface, #ffffff);
1234
+ border: 1px solid transparent;
1235
+ }
1236
+ .odt-input--filled:focus,
1237
+ .odt-textarea--filled:focus,
1238
+ .odt-select--filled:focus {
1239
+ border-color: var(--color-ring);
1240
+ }
1241
+
1242
+ .odt-input--frosted,
1243
+ .odt-textarea--frosted,
1244
+ .odt-select--frosted {
1245
+ background-color: hsl(from var(--color-surface) h s l / 0.85);
1246
+ backdrop-filter: blur(16px);
1247
+ -webkit-backdrop-filter: blur(16px);
1248
+ border: 1px solid transparent;
1249
+ box-shadow: var(--shadow-card);
1250
+ }
1251
+ .odt-input--frosted:focus,
1252
+ .odt-textarea--frosted:focus,
1253
+ .odt-select--frosted:focus {
1254
+ border-color: var(--color-ring);
1255
+ }
1256
+
1257
+ /* Form Sizes */
1258
+ .odt-input--sm, .odt-select--sm {
1259
+ height: 2rem;
1260
+ padding: 0 var(--spacing-3, 0.75rem);
1261
+ font-size: var(--font-size-xs, 0.75rem);
1262
+ border-radius: var(--radius-lg, 0.5rem);
1263
+ }
1264
+ .odt-input--md, .odt-select--md {
1265
+ height: 2.625rem;
1266
+ padding: 0 var(--spacing-4, 1rem);
1267
+ font-size: var(--font-size-sm, 0.875rem);
1268
+ border-radius: var(--radius-xl, 0.75rem);
1269
+ }
1270
+ .odt-input--lg, .odt-select--lg {
1271
+ height: 3.125rem;
1272
+ padding: 0 var(--spacing-5, 1.25rem);
1273
+ font-size: var(--font-size-base, 1rem);
1274
+ border-radius: var(--radius-2xl, 1rem);
1275
+ }
1276
+
1277
+ .odt-textarea {
1278
+ line-height: 1.5;
1279
+ height: auto;
1280
+ min-height: 5rem;
1281
+ }
1282
+ .odt-textarea--sm {
1283
+ padding: var(--spacing-2, 0.5rem) var(--spacing-3, 0.75rem);
1284
+ font-size: var(--font-size-xs, 0.75rem);
1285
+ min-height: 4rem;
1286
+ border-radius: var(--radius-lg, 0.5rem);
1287
+ }
1288
+ .odt-textarea--md {
1289
+ padding: var(--spacing-3, 0.75rem) var(--spacing-4, 1rem);
1290
+ font-size: var(--font-size-sm, 0.875rem);
1291
+ min-height: 5rem;
1292
+ border-radius: var(--radius-xl, 0.75rem);
1293
+ }
1294
+ .odt-textarea--lg {
1295
+ padding: var(--spacing-4, 1rem) var(--spacing-5, 1.25rem);
1296
+ font-size: var(--font-size-base, 1rem);
1297
+ min-height: 6.5rem;
1298
+ border-radius: var(--radius-2xl, 1rem);
1299
+ }
1300
+
1301
+ .odt-textarea--resize-none { resize: none; }
1302
+ .odt-textarea--resize-vertical { resize: vertical; }
1303
+ .odt-textarea--resize-horizontal { resize: horizontal; }
1304
+ .odt-textarea--resize-both { resize: both; }
1305
+
1306
+ /* Select Dropdown */
1307
+ .odt-select {
1308
+ appearance: none;
1309
+ -webkit-appearance: none;
1310
+ padding-right: 2.5rem;
1311
+ cursor: pointer;
1312
+ 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");
1313
+ background-repeat: no-repeat;
1314
+ background-position: right 0.75rem center;
1315
+ }
1316
+
1317
+ /* Icons & Addons */
1318
+ .odt-input__left-icon {
1319
+ position: absolute;
1320
+ left: var(--spacing-3, 0.75rem);
1321
+ display: flex;
1322
+ align-items: center;
1323
+ justify-content: center;
1324
+ color: var(--color-fg-muted);
1325
+ pointer-events: none;
1326
+ z-index: 1;
1327
+ }
1328
+
1329
+ .odt-input__right-icon {
1330
+ position: absolute;
1331
+ right: var(--spacing-3, 0.75rem);
1332
+ display: flex;
1333
+ align-items: center;
1334
+ justify-content: center;
1335
+ color: var(--color-fg-muted);
1336
+ z-index: 2;
1337
+ }
1338
+
1339
+ .odt-input--has-left-icon.odt-input--sm { padding-left: 2rem; }
1340
+ .odt-input--has-left-icon.odt-input--md { padding-left: 2.5rem; }
1341
+ .odt-input--has-left-icon.odt-input--lg { padding-left: 3rem; }
1342
+
1343
+ .odt-input--has-right-icon.odt-input--sm { padding-right: 2rem; }
1344
+ .odt-input--has-right-icon.odt-input--md { padding-right: 2.5rem; }
1345
+ .odt-input--has-right-icon.odt-input--lg { padding-right: 3rem; }
1346
+
1347
+ /* Addon Groups */
1348
+ .odt-input__addon-group {
1349
+ display: flex;
1350
+ align-items: stretch;
1351
+ width: 100%;
1352
+ }
1353
+ .odt-input__addon-before,
1354
+ .odt-input__addon-after {
1355
+ display: inline-flex;
1356
+ align-items: center;
1357
+ justify-content: center;
1358
+ padding: 0 var(--spacing-3, 0.75rem);
1359
+ background-color: var(--color-surface, #ffffff);
1360
+ color: var(--color-fg-muted);
1361
+ font-size: var(--font-size-sm, 0.875rem);
1362
+ font-weight: 500;
1363
+ white-space: nowrap;
1364
+ user-select: none;
1365
+ border: 1px solid var(--color-line, #e4e4e9);
1366
+ }
1367
+ .odt-input__addon-before {
1368
+ border-right: none;
1369
+ border-top-left-radius: var(--radius-xl, 0.75rem);
1370
+ border-bottom-left-radius: var(--radius-xl, 0.75rem);
1371
+ }
1372
+ .odt-input__addon-after {
1373
+ border-left: none;
1374
+ border-top-right-radius: var(--radius-xl, 0.75rem);
1375
+ border-bottom-right-radius: var(--radius-xl, 0.75rem);
1376
+ }
1377
+ .odt-input--has-addon-before {
1378
+ border-top-left-radius: 0 !important;
1379
+ border-bottom-left-radius: 0 !important;
1380
+ }
1381
+ .odt-input--has-addon-after {
1382
+ border-top-right-radius: 0 !important;
1383
+ border-bottom-right-radius: 0 !important;
1384
+ }
1385
+
1386
+ /* States */
1387
+ .odt-input--error,
1388
+ .odt-textarea--error,
1389
+ .odt-select--error,
1390
+ .odt-input--error:focus,
1391
+ .odt-textarea--error:focus,
1392
+ .odt-select--error:focus {
1393
+ border-color: var(--color-danger) !important;
1394
+ }
1395
+
1396
+ .odt-input--success,
1397
+ .odt-textarea--success,
1398
+ .odt-select--success,
1399
+ .odt-input--success:focus,
1400
+ .odt-textarea--success:focus,
1401
+ .odt-select--success:focus {
1402
+ border-color: var(--color-success) !important;
1403
+ }
1404
+
1405
+ .odt-input:disabled,
1406
+ .odt-textarea:disabled,
1407
+ .odt-select:disabled {
1408
+ background-color: var(--color-surface-subtle);
1409
+ color: var(--color-fg-disabled);
1410
+ cursor: not-allowed;
1411
+ border-color: var(--color-line-muted, rgba(0, 0, 0, 0.05));
1412
+ opacity: 0.7;
1413
+ }
1414
+
1415
+ /* Help & Error Messages */
1416
+ .odt-helper-text {
1417
+ font-size: var(--font-size-xs, 0.75rem);
1418
+ color: var(--color-fg-muted);
1419
+ margin: 0;
1420
+ line-height: 1rem;
1421
+ }
1422
+
1423
+ .odt-error-text {
1424
+ font-size: var(--font-size-xs, 0.75rem);
1425
+ color: var(--color-danger);
1426
+ font-weight: 500;
1427
+ margin: 0;
1428
+ line-height: 1rem;
1429
+ }
1430
+
1431
+ .odt-success-text {
1432
+ font-size: var(--font-size-xs, 0.75rem);
1433
+ color: var(--color-success);
1434
+ font-weight: 500;
1435
+ margin: 0;
1436
+ line-height: 1rem;
1437
+ }
1438
+
1439
+ /* ==========================================================================
1440
+ * 9. Checkbox & Radio (.odt-checkbox, .odt-radio)
1441
+ * ========================================================================== */
1442
+ .odt-checkbox-wrapper,
1443
+ .odt-radio-wrapper {
1444
+ display: inline-flex;
1445
+ flex-direction: column;
1446
+ gap: 0.25rem;
1447
+ }
1448
+
1449
+ .odt-checkbox-container,
1450
+ .odt-radio-container {
1451
+ display: inline-flex;
1452
+ align-items: flex-start;
1453
+ gap: var(--spacing-2-5, 0.625rem);
1454
+ cursor: pointer;
1455
+ user-select: none;
1456
+ }
1457
+
1458
+ .odt-checkbox,
1459
+ .odt-radio {
1460
+ appearance: none;
1461
+ -webkit-appearance: none;
1462
+ position: relative;
1463
+ display: inline-flex;
1464
+ align-items: center;
1465
+ justify-content: center;
1466
+ flex-shrink: 0;
1467
+ background-color: var(--color-surface-subtle, #e4e4e9);
1468
+ border: none;
1469
+ color: #ffffff;
1470
+ cursor: pointer;
1471
+ padding: 0;
1472
+ outline: none;
1473
+ box-sizing: border-box;
1474
+ transition: background-color 140ms ease, box-shadow 140ms ease, transform 100ms ease;
1475
+ margin-top: 0.125rem;
1476
+ }
1477
+
1478
+ .odt-checkbox {
1479
+ width: 1.125rem;
1480
+ height: 1.125rem;
1481
+ border-radius: var(--radius-md, 0.375rem);
1482
+ }
1483
+
1484
+ .odt-radio {
1485
+ width: 1.125rem;
1486
+ height: 1.125rem;
1487
+ border-radius: var(--radius-full, 9999px);
1488
+ }
1489
+
1490
+ .odt-checkbox:active:not(:disabled),
1491
+ .odt-radio:active:not(:disabled) {
1492
+ transform: scale(0.94);
1493
+ }
1494
+
1495
+ /* Checkbox & Radio Sizes */
1496
+ .odt-checkbox--sm, .odt-radio--sm {
1497
+ width: 0.9375rem;
1498
+ height: 0.9375rem;
1499
+ margin-top: 0.1875rem;
1500
+ }
1501
+
1502
+ .odt-checkbox--md, .odt-radio--md {
1503
+ width: 1.125rem;
1504
+ height: 1.125rem;
1505
+ margin-top: 0.125rem;
1506
+ }
1507
+
1508
+ .odt-checkbox--lg, .odt-radio--lg {
1509
+ width: 1.375rem;
1510
+ height: 1.375rem;
1511
+ margin-top: 0.0625rem;
1512
+ }
1513
+
1514
+ /* Checkmark indicator */
1515
+ .odt-checkbox:checked::after {
1516
+ content: "";
1517
+ display: block;
1518
+ width: 4px;
1519
+ height: 8px;
1520
+ border: solid currentColor;
1521
+ border-width: 0 2px 2px 0;
1522
+ transform: rotate(45deg);
1523
+ margin-bottom: 2px;
1524
+ animation: odt-pop 140ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
1525
+ }
1526
+
1527
+ .odt-checkbox--sm:checked::after {
1528
+ width: 3px;
1529
+ height: 6px;
1530
+ border-width: 0 1.5px 1.5px 0;
1531
+ margin-bottom: 1px;
1532
+ }
1533
+
1534
+ .odt-checkbox--lg:checked::after {
1535
+ width: 5px;
1536
+ height: 10px;
1537
+ border-width: 0 2.5px 2.5px 0;
1538
+ margin-bottom: 2px;
1539
+ }
1540
+
1541
+ /* Radio Dot indicator */
1542
+ .odt-radio:checked::after {
1543
+ content: "";
1544
+ display: block;
1545
+ width: 0.5rem;
1546
+ height: 0.5rem;
1547
+ border-radius: var(--radius-full, 9999px);
1548
+ background-color: currentColor;
1549
+ animation: odt-pop 140ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
1550
+ }
1551
+ .odt-radio--sm:checked::after { width: 0.375rem; height: 0.375rem; }
1552
+ .odt-radio--lg:checked::after { width: 0.625rem; height: 0.625rem; }
1553
+
1554
+ /* Checkbox & Radio Color Themes */
1555
+ .odt-checkbox--primary:checked, .odt-radio--primary:checked {
1556
+ background-color: var(--color-primary-500);
1557
+ color: #ffffff;
1558
+ }
1559
+ .odt-checkbox--primary:focus-visible, .odt-radio--primary:focus-visible {
1560
+ box-shadow: 0 0 0 3px hsl(from var(--color-primary-500) h s l / 0.35);
1561
+ }
1562
+
1563
+ .odt-checkbox--secondary:checked, .odt-radio--secondary:checked {
1564
+ background-color: var(--color-secondary-500);
1565
+ color: var(--color-fg-strong);
1566
+ }
1567
+ .odt-checkbox--secondary:focus-visible, .odt-radio--secondary:focus-visible {
1568
+ box-shadow: 0 0 0 3px hsl(from var(--color-secondary-500) h s l / 0.35);
1569
+ }
1570
+
1571
+ .odt-checkbox--success:checked, .odt-radio--success:checked {
1572
+ background-color: var(--color-success);
1573
+ color: #ffffff;
1574
+ }
1575
+ .odt-checkbox--success:focus-visible, .odt-radio--success:focus-visible {
1576
+ box-shadow: 0 0 0 3px hsl(from var(--color-success) h s l / 0.35);
1577
+ }
1578
+
1579
+ .odt-checkbox--warning:checked, .odt-radio--warning:checked {
1580
+ background-color: var(--color-warning);
1581
+ color: var(--color-fg-strong);
1582
+ }
1583
+ .odt-checkbox--warning:focus-visible, .odt-radio--warning:focus-visible {
1584
+ box-shadow: 0 0 0 3px hsl(from var(--color-warning) h s l / 0.35);
1585
+ }
1586
+
1587
+ .odt-checkbox--danger:checked, .odt-radio--danger:checked {
1588
+ background-color: var(--color-danger);
1589
+ color: #ffffff;
1590
+ }
1591
+ .odt-checkbox--danger:focus-visible, .odt-radio--danger:focus-visible {
1592
+ box-shadow: 0 0 0 3px hsl(from var(--color-danger) h s l / 0.35);
1593
+ }
1594
+
1595
+ .odt-checkbox--dark:checked, .odt-radio--dark:checked,
1596
+ .odt-checkbox--neutral:checked, .odt-radio--neutral:checked {
1597
+ background-color: var(--color-neutral-900);
1598
+ color: #ffffff;
1599
+ }
1600
+
1601
+ .odt-checkbox:disabled,
1602
+ .odt-radio:disabled {
1603
+ opacity: 0.45;
1604
+ cursor: not-allowed;
1605
+ pointer-events: none;
1606
+ }
1607
+
1608
+ .odt-checkbox__label-content,
1609
+ .odt-radio__label-content {
1610
+ display: flex;
1611
+ flex-direction: column;
1612
+ gap: 0.125rem;
1613
+ }
1614
+
1615
+ .odt-checkbox__label,
1616
+ .odt-radio__label {
1617
+ font-size: var(--font-size-sm, 0.875rem);
1618
+ color: var(--color-fg);
1619
+ font-weight: 500;
1620
+ line-height: 1.25rem;
1621
+ }
1622
+
1623
+ .odt-checkbox__description,
1624
+ .odt-radio__description {
1625
+ font-size: var(--font-size-xs, 0.75rem);
1626
+ color: var(--color-fg-muted);
1627
+ line-height: 1rem;
1628
+ }
1629
+
1630
+ /* ==========================================================================
1631
+ * 10. Toast & Toaster Component (.odt-toaster, .odt-toast)
1632
+ * ========================================================================== */
1633
+ .odt-toaster {
1634
+ position: fixed;
1635
+ z-index: 9999;
1636
+ box-sizing: border-box;
1637
+ font-family: inherit;
1638
+ width: 100%;
1639
+ max-width: 24rem; /* 384px */
1640
+ padding: var(--spacing-4, 1rem);
1641
+ pointer-events: none;
1642
+ display: flex;
1643
+ flex-direction: column;
1644
+ gap: var(--spacing-2-5, 0.625rem);
1645
+ }
1646
+
1647
+ /* Positions */
1648
+ .odt-toaster--top-right {
1649
+ top: 0;
1650
+ right: 0;
1651
+ }
1652
+
1653
+ .odt-toaster--top-center {
1654
+ top: 0;
1655
+ left: 50%;
1656
+ transform: translateX(-50%);
1657
+ }
1658
+
1659
+ .odt-toaster--top-left {
1660
+ top: 0;
1661
+ left: 0;
1662
+ }
1663
+
1664
+ .odt-toaster--bottom-right {
1665
+ bottom: 0;
1666
+ right: 0;
1667
+ flex-direction: column-reverse;
1668
+ }
1669
+
1670
+ .odt-toaster--bottom-center {
1671
+ bottom: 0;
1672
+ left: 50%;
1673
+ transform: translateX(-50%);
1674
+ flex-direction: column-reverse;
1675
+ }
1676
+
1677
+ .odt-toaster--bottom-left {
1678
+ bottom: 0;
1679
+ left: 0;
1680
+ flex-direction: column-reverse;
1681
+ }
1682
+
1683
+ /* Toast Item */
1684
+ .odt-toast {
1685
+ position: relative;
1686
+ width: 100%;
1687
+ box-sizing: border-box;
1688
+ display: flex;
1689
+ align-items: flex-start;
1690
+ gap: var(--spacing-3, 0.75rem);
1691
+ padding: var(--spacing-3-5, 0.875rem) var(--spacing-4, 1rem);
1692
+ background-color: var(--color-surface-elevated, #ffffff);
1693
+ color: var(--color-fg);
1694
+ border-radius: var(--radius-2xl, 1rem);
1695
+ box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.08), 0 2px 6px -2px rgba(0, 0, 0, 0.04);
1696
+ border: 1px solid var(--color-line-muted, #f4f4f5);
1697
+ pointer-events: auto;
1698
+ user-select: none;
1699
+ font-family: inherit;
1700
+ overflow: hidden;
1701
+ animation: odt-toast-enter 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1702
+ transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.25s ease, margin 0.25s ease;
1703
+ }
1704
+
1705
+ .odt-toast--exiting {
1706
+ animation: odt-toast-exit 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1707
+ }
1708
+
1709
+ @keyframes odt-toast-enter {
1710
+ 0% {
1711
+ opacity: 0;
1712
+ transform: translateY(-12px) scale(0.96);
1713
+ }
1714
+ 100% {
1715
+ opacity: 1;
1716
+ transform: translateY(0) scale(1);
1717
+ }
1718
+ }
1719
+
1720
+ @keyframes odt-toast-exit {
1721
+ 0% {
1722
+ opacity: 1;
1723
+ transform: translateY(0) scale(1);
1724
+ }
1725
+ 100% {
1726
+ opacity: 0;
1727
+ transform: translateY(-8px) scale(0.94);
1728
+ }
1729
+ }
1730
+
1731
+ .odt-toaster--bottom-right .odt-toast,
1732
+ .odt-toaster--bottom-center .odt-toast,
1733
+ .odt-toaster--bottom-left .odt-toast {
1734
+ animation-name: odt-toast-enter-bottom;
1735
+ }
1736
+
1737
+ .odt-toaster--bottom-right .odt-toast--exiting,
1738
+ .odt-toaster--bottom-center .odt-toast--exiting,
1739
+ .odt-toaster--bottom-left .odt-toast--exiting {
1740
+ animation-name: odt-toast-exit-bottom;
1741
+ }
1742
+
1743
+ @keyframes odt-toast-enter-bottom {
1744
+ 0% {
1745
+ opacity: 0;
1746
+ transform: translateY(12px) scale(0.96);
1747
+ }
1748
+ 100% {
1749
+ opacity: 1;
1750
+ transform: translateY(0) scale(1);
1751
+ }
1752
+ }
1753
+
1754
+ @keyframes odt-toast-exit-bottom {
1755
+ 0% {
1756
+ opacity: 1;
1757
+ transform: translateY(0) scale(1);
1758
+ }
1759
+ 100% {
1760
+ opacity: 0;
1761
+ transform: translateY(8px) scale(0.94);
1762
+ }
1763
+ }
1764
+
1765
+ /* Toast Variants / Semantic Themes */
1766
+ .odt-toast--success {
1767
+ background-color: var(--color-surface-success, hsl(142 71% 96%));
1768
+ border-color: var(--color-line-success, hsl(142 71% 85%));
1769
+ }
1770
+
1771
+ .odt-toast--warning {
1772
+ background-color: var(--color-surface-warning, hsl(38 92% 96%));
1773
+ border-color: var(--color-line-warning, hsl(38 92% 85%));
1774
+ }
1775
+
1776
+ .odt-toast--danger,
1777
+ .odt-toast--error {
1778
+ background-color: var(--color-surface-danger, hsl(0 84% 97%));
1779
+ border-color: var(--color-line-danger, hsl(0 84% 88%));
1780
+ }
1781
+
1782
+ .odt-toast--info {
1783
+ background-color: var(--color-surface-info, hsl(217 91% 97%));
1784
+ border-color: var(--color-info, hsl(217 91% 88%));
1785
+ }
1786
+
1787
+ .odt-toast--frosted {
1788
+ background-color: var(--frosted-surface-bg, rgba(255, 255, 255, 0.70));
1789
+ backdrop-filter: blur(16px);
1790
+ -webkit-backdrop-filter: blur(16px);
1791
+ border: 1px solid var(--frosted-surface-border, rgba(255, 255, 255, 0.80));
1792
+ }
1793
+
1794
+ /* Toast Sub-elements */
1795
+ .odt-toast__icon {
1796
+ display: flex;
1797
+ align-items: center;
1798
+ justify-content: center;
1799
+ width: 1.375rem;
1800
+ height: 1.375rem;
1801
+ flex-shrink: 0;
1802
+ font-size: 1.125rem;
1803
+ margin-top: 0.0625rem;
1804
+ }
1805
+
1806
+ .odt-toast__icon--success { color: var(--color-success, #16a34a); }
1807
+ .odt-toast__icon--warning { color: var(--color-warning, #d97706); }
1808
+ .odt-toast__icon--danger,
1809
+ .odt-toast__icon--error { color: var(--color-danger, #dc2626); }
1810
+ .odt-toast__icon--info { color: var(--color-info, #2563eb); }
1811
+ .odt-toast__icon--loading {
1812
+ color: var(--color-primary-500, #3b82f6);
1813
+ animation: odt-spin 0.8s linear infinite;
1814
+ }
1815
+
1816
+ .odt-toast__content {
1817
+ display: flex;
1818
+ flex-direction: column;
1819
+ gap: var(--spacing-0-5, 0.125rem);
1820
+ flex: 1;
1821
+ min-width: 0;
1822
+ }
1823
+
1824
+ .odt-toast__title {
1825
+ font-size: var(--font-size-sm, 0.875rem);
1826
+ font-weight: var(--font-weight-semibold, 600);
1827
+ color: var(--color-fg-strong);
1828
+ line-height: 1.35;
1829
+ margin: 0;
1830
+ }
1831
+
1832
+ .odt-toast__message,
1833
+ .odt-toast__description {
1834
+ font-size: var(--font-size-xs, 0.75rem);
1835
+ color: var(--color-fg-muted);
1836
+ line-height: 1.4;
1837
+ margin: 0;
1838
+ }
1839
+
1840
+ .odt-toast__close {
1841
+ display: inline-flex;
1842
+ align-items: center;
1843
+ justify-content: center;
1844
+ width: 1.5rem;
1845
+ height: 1.5rem;
1846
+ padding: 0;
1847
+ border-radius: var(--radius-md, 0.375rem);
1848
+ border: none;
1849
+ background: transparent;
1850
+ color: var(--color-fg-muted);
1851
+ cursor: pointer;
1852
+ flex-shrink: 0;
1853
+ margin-left: auto;
1854
+ transition: background-color 0.15s ease, color 0.15s ease;
1855
+ font-size: 1.125rem;
1856
+ line-height: 1;
1857
+ }
1858
+
1859
+ .odt-toast__close:hover {
1860
+ background-color: var(--color-surface-subtle);
1861
+ color: var(--color-fg-strong);
1862
+ }
1863
+
1864
+ /* ==========================================================================
1865
+ * 11. Modal Component (.odt-modal-overlay, .odt-modal)
1866
+ * ========================================================================== */
1867
+ @keyframes odt-overlay-fade-in {
1868
+ from { opacity: 0; }
1869
+ to { opacity: 1; }
1870
+ }
1871
+
1872
+ @keyframes odt-overlay-fade-out {
1873
+ from { opacity: 1; }
1874
+ to { opacity: 0; }
1875
+ }
1876
+
1877
+ @keyframes odt-modal-scale-in {
1878
+ from {
1879
+ opacity: 0;
1880
+ transform: scale(0.95) translateY(10px);
1881
+ }
1882
+ to {
1883
+ opacity: 1;
1884
+ transform: scale(1) translateY(0);
1885
+ }
1886
+ }
1887
+
1888
+ @keyframes odt-modal-scale-out {
1889
+ from {
1890
+ opacity: 1;
1891
+ transform: scale(1) translateY(0);
1892
+ }
1893
+ to {
1894
+ opacity: 0;
1895
+ transform: scale(0.96) translateY(8px);
1896
+ }
1897
+ }
1898
+
1899
+ .odt-modal-overlay {
1900
+ position: fixed;
1901
+ inset: 0;
1902
+ z-index: 1000;
1903
+ display: flex;
1904
+ justify-content: center;
1905
+ align-items: center;
1906
+ padding: var(--spacing-4, 1rem);
1907
+ background-color: var(--color-overlay-backdrop, rgba(0, 0, 0, 0.6));
1908
+ overflow-y: auto;
1909
+ box-sizing: border-box;
1910
+ font-family: inherit;
1911
+ animation: odt-overlay-fade-in 0.22s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1912
+ }
1913
+
1914
+ .odt-modal-overlay.hidden {
1915
+ display: none !important;
1916
+ }
1917
+
1918
+ .odt-modal-overlay--exiting {
1919
+ animation: odt-overlay-fade-out 0.18s cubic-bezier(0.4, 0, 1, 1) forwards;
1920
+ pointer-events: none;
1921
+ }
1922
+
1923
+ /* Modal Content Box */
1924
+ .odt-modal {
1925
+ position: relative;
1926
+ width: 100%;
1927
+ box-sizing: border-box;
1928
+ font-family: inherit;
1929
+ background-color: var(--color-surface-elevated, #ffffff);
1930
+ color: var(--color-fg);
1931
+ border-radius: var(--radius-2xl, 1rem);
1932
+ box-shadow: var(--shadow-modal);
1933
+ border: 1px solid var(--color-line-muted, rgba(226, 232, 240, 0.8));
1934
+ display: flex;
1935
+ flex-direction: column;
1936
+ outline: none;
1937
+ animation: odt-modal-scale-in 0.24s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1938
+ margin: auto 0;
1939
+ }
1940
+
1941
+ .odt-modal--exiting {
1942
+ animation: odt-modal-scale-out 0.18s cubic-bezier(0.4, 0, 1, 1) forwards;
1943
+ }
1944
+
1945
+ /* Modal Sizes */
1946
+ .odt-modal--sm {
1947
+ max-width: 24rem; /* 384px */
1948
+ }
1949
+
1950
+ .odt-modal--md {
1951
+ max-width: 32rem; /* 512px */
1952
+ }
1953
+
1954
+ .odt-modal--lg {
1955
+ max-width: 42rem; /* 672px */
1956
+ }
1957
+
1958
+ .odt-modal--xl {
1959
+ max-width: 56rem; /* 896px */
1960
+ }
1961
+
1962
+ .odt-modal--full {
1963
+ max-width: calc(100vw - 2rem);
1964
+ min-height: calc(100vh - 3rem);
1965
+ }
1966
+
1967
+ /* Modal Sub-components */
1968
+ .odt-modal__header {
1969
+ display: flex;
1970
+ align-items: flex-start;
1971
+ justify-content: space-between;
1972
+ padding: var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem) var(--spacing-2, 0.5rem);
1973
+ gap: var(--spacing-3, 0.75rem);
1974
+ }
1975
+
1976
+ .odt-modal__header-content {
1977
+ display: flex;
1978
+ flex-direction: column;
1979
+ gap: var(--spacing-1, 0.25rem);
1980
+ flex: 1;
1981
+ }
1982
+
1983
+ .odt-modal__title {
1984
+ font-family: inherit;
1985
+ font-size: var(--font-size-xl, 1.25rem);
1986
+ font-weight: var(--font-weight-bold, 700);
1987
+ color: var(--color-fg-strong);
1988
+ margin: 0;
1989
+ line-height: var(--line-height-tight, 1.25);
1990
+ }
1991
+
1992
+ .odt-modal__subtitle {
1993
+ font-family: inherit;
1994
+ font-size: var(--font-size-sm, 0.875rem);
1995
+ color: var(--color-fg-muted);
1996
+ margin: 0;
1997
+ }
1998
+
1999
+ .odt-modal__body {
2000
+ font-family: inherit;
2001
+ padding: var(--spacing-2, 0.5rem) var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem);
2002
+ font-size: var(--font-size-base, 1rem);
2003
+ line-height: var(--line-height-normal, 1.5);
2004
+ color: var(--color-fg);
2005
+ overflow-y: auto;
2006
+ max-height: 70vh;
2007
+ }
2008
+
2009
+ .odt-modal__footer {
2010
+ font-family: inherit;
2011
+ display: flex;
2012
+ align-items: center;
2013
+ justify-content: flex-end;
2014
+ gap: var(--spacing-3, 0.75rem);
2015
+ padding: var(--spacing-2, 0.5rem) var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem);
2016
+ border-bottom-left-radius: inherit;
2017
+ border-bottom-right-radius: inherit;
2018
+ }
2019
+
2020
+ .odt-modal__close {
2021
+ display: inline-flex;
2022
+ align-items: center;
2023
+ justify-content: center;
2024
+ width: 2rem;
2025
+ height: 2rem;
2026
+ padding: 0;
2027
+ border-radius: var(--radius-lg, 0.5rem);
2028
+ border: none;
2029
+ background: transparent;
2030
+ color: var(--color-fg-muted);
2031
+ cursor: pointer;
2032
+ transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;
2033
+ flex-shrink: 0;
2034
+ margin-left: auto;
2035
+ font-size: 1.25rem;
2036
+ line-height: 1;
2037
+ }
2038
+
2039
+ .odt-modal__close:hover {
2040
+ background-color: var(--color-surface-subtle);
2041
+ color: var(--color-fg-strong);
2042
+ }
2043
+
2044
+ .odt-modal__close:active {
2045
+ transform: scale(0.94);
2046
+ }
2047
+
2048
+