odt-ui-rails 2.2.7 → 2.2.9

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