odt-ui-rails 2.2.7 → 2.2.8

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,2707 @@
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-sm, 0.875rem);
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-base, 1rem);
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-sm, 0.875rem);
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-base, 1rem);
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
+ }
44
1831
 
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); }
1832
+ .odt-checkbox--success:checked,
1833
+ .odt-radio--success:checked {
1834
+ background-color: var(--color-success);
1835
+ color: #ffffff;
1836
+ }
386
1837
 
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); }
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
+ }
450
1842
 
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
- }
1843
+ .odt-checkbox--warning:checked,
1844
+ .odt-radio--warning:checked {
1845
+ background-color: var(--color-warning);
1846
+ color: var(--color-fg-strong);
1847
+ }
593
1848
 
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
- }
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
+ }
643
1853
 
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
- }
1854
+ .odt-checkbox--danger:checked,
1855
+ .odt-radio--danger:checked {
1856
+ background-color: var(--color-danger);
1857
+ color: #ffffff;
1858
+ }
697
1859
 
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
- }
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
+ }
740
1864
 
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
- }
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
+ }
1027
1872
 
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
- }
1873
+ .odt-checkbox:disabled,
1874
+ .odt-radio:disabled {
1875
+ opacity: 0.45;
1876
+ cursor: not-allowed;
1877
+ pointer-events: none;
1878
+ }
1218
1879
 
1219
- /* ==========================================================================
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
+ /* ==========================================================================
1220
1903
  * 10. Toast & Toaster Component (.odt-toaster, .odt-toast)
1221
1904
  * ========================================================================== */
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
- }
1905
+ .odt-toaster {
1906
+ position: fixed;
1907
+ z-index: 9999;
1908
+ box-sizing: border-box;
1909
+ font-family: inherit;
1910
+ width: 100%;
1911
+ max-width: 24rem;
1912
+ /* 384px */
1913
+ padding: var(--spacing-4, 1rem);
1914
+ pointer-events: none;
1915
+ display: flex;
1916
+ flex-direction: column;
1917
+ gap: var(--spacing-2-5, 0.625rem);
1918
+ }
1459
1919
 
1460
- /* ==========================================================================
1920
+ /* Positions */
1921
+ .odt-toaster--top-right {
1922
+ top: 0;
1923
+ right: 0;
1924
+ }
1925
+
1926
+ .odt-toaster--top-center {
1927
+ top: 0;
1928
+ left: 50%;
1929
+ transform: translateX(-50%);
1930
+ }
1931
+
1932
+ .odt-toaster--top-left {
1933
+ top: 0;
1934
+ left: 0;
1935
+ }
1936
+
1937
+ .odt-toaster {
1938
+ position: fixed;
1939
+ z-index: 9999;
1940
+ box-sizing: border-box;
1941
+ font-family: inherit;
1942
+ width: 100%;
1943
+ max-width: 24rem;
1944
+ /* 384px */
1945
+ padding: var(--spacing-4, 1rem);
1946
+ pointer-events: none;
1947
+ min-height: 5rem;
1948
+ }
1949
+
1950
+ /* Positions */
1951
+ .odt-toaster--top-right {
1952
+ top: 0;
1953
+ right: 0;
1954
+ }
1955
+
1956
+ .odt-toaster--top-center {
1957
+ top: 0;
1958
+ left: 50%;
1959
+ transform: translateX(-50%);
1960
+ }
1961
+
1962
+ .odt-toaster--top-left {
1963
+ top: 0;
1964
+ left: 0;
1965
+ }
1966
+
1967
+ .odt-toaster--bottom-right {
1968
+ bottom: 0;
1969
+ right: 0;
1970
+ }
1971
+
1972
+ .odt-toaster--bottom-center {
1973
+ bottom: 0;
1974
+ left: 50%;
1975
+ transform: translateX(-50%);
1976
+ }
1977
+
1978
+ .odt-toaster--bottom-left {
1979
+ bottom: 0;
1980
+ left: 0;
1981
+ }
1982
+
1983
+ /* Toast Item Card (Absolute within Toaster for 3D stacking) */
1984
+ .odt-toast {
1985
+ position: absolute;
1986
+ left: var(--spacing-4, 1rem);
1987
+ right: var(--spacing-4, 1rem);
1988
+ box-sizing: border-box;
1989
+ display: flex;
1990
+ align-items: flex-start;
1991
+ gap: var(--spacing-3, 0.75rem);
1992
+ padding: var(--spacing-4, 1rem) var(--spacing-4-5, 1.125rem);
1993
+ background-color: var(--color-surface-elevated, #ffffff);
1994
+ color: var(--color-fg);
1995
+ border-radius: var(--radius-2xl, 1rem);
1996
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.04);
1997
+ pointer-events: auto;
1998
+ user-select: none;
1999
+ font-family: inherit;
2000
+ overflow: hidden;
2001
+ transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1),
2002
+ opacity 0.28s cubic-bezier(0.16, 1, 0.3, 1),
2003
+ box-shadow 0.25s ease;
2004
+ will-change: transform, opacity;
2005
+ }
2006
+
2007
+ .odt-toaster--top-right .odt-toast,
2008
+ .odt-toaster--top-center .odt-toast,
2009
+ .odt-toaster--top-left .odt-toast {
2010
+ top: var(--spacing-4, 1rem);
2011
+ bottom: auto;
2012
+ transform-origin: top center;
2013
+ }
2014
+
2015
+ .odt-toaster--bottom-right .odt-toast,
2016
+ .odt-toaster--bottom-center .odt-toast,
2017
+ .odt-toaster--bottom-left .odt-toast {
2018
+ bottom: var(--spacing-4, 1rem);
2019
+ top: auto;
2020
+ transform-origin: bottom center;
2021
+ }
2022
+
2023
+ .odt-toast--exiting {
2024
+ opacity: 0 !important;
2025
+ transform: scale(0.92) translateY(-12px) !important;
2026
+ pointer-events: none !important;
2027
+ transition: transform 0.24s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.24s ease !important;
2028
+ }
2029
+
2030
+ .odt-toaster--bottom-right .odt-toast--exiting,
2031
+ .odt-toaster--bottom-center .odt-toast--exiting,
2032
+ .odt-toaster--bottom-left .odt-toast--exiting {
2033
+ transform: scale(0.92) translateY(12px) !important;
2034
+ }
2035
+
2036
+ /* Surface Variants */
2037
+ .odt-toast--variant-frosted {
2038
+ background-color: var(--frosted-surface-bg, rgba(255, 255, 255, 0.70));
2039
+ backdrop-filter: blur(16px);
2040
+ -webkit-backdrop-filter: blur(16px);
2041
+ }
2042
+
2043
+ .odt-toast--variant-subtle {
2044
+ background-color: var(--color-surface-subtle);
2045
+ }
2046
+
2047
+ .odt-toast--variant-outlined {
2048
+ background-color: var(--color-surface);
2049
+ }
2050
+
2051
+ /* Rich Color Tints (Optional) */
2052
+ .odt-toast--rich-success {
2053
+ background-color: var(--color-surface-success, hsl(142 71% 96%));
2054
+ }
2055
+
2056
+ .odt-toast--rich-warning {
2057
+ background-color: var(--color-surface-warning, hsl(38 92% 96%));
2058
+ }
2059
+
2060
+ .odt-toast--rich-danger,
2061
+ .odt-toast--rich-error {
2062
+ background-color: var(--color-surface-danger, hsl(0 84% 97%));
2063
+ }
2064
+
2065
+ .odt-toast--rich-info {
2066
+ background-color: var(--color-surface-info, hsl(217 91% 97%));
2067
+ }
2068
+
2069
+ /* Toast Sub-elements */
2070
+ .odt-toast__icon {
2071
+ display: flex;
2072
+ align-items: center;
2073
+ justify-content: center;
2074
+ width: 1.375rem;
2075
+ height: 1.375rem;
2076
+ flex-shrink: 0;
2077
+ margin-top: 0.0625rem;
2078
+ }
2079
+
2080
+ .odt-toast__icon svg {
2081
+ display: block;
2082
+ }
2083
+
2084
+ .odt-toast__icon--success {
2085
+ color: var(--color-success, #16a34a);
2086
+ }
2087
+
2088
+ .odt-toast__icon--warning {
2089
+ color: var(--color-warning, #d97706);
2090
+ }
2091
+
2092
+ .odt-toast__icon--danger,
2093
+ .odt-toast__icon--error {
2094
+ color: var(--color-danger, #dc2626);
2095
+ }
2096
+
2097
+ .odt-toast__icon--info {
2098
+ color: var(--color-info, #2563eb);
2099
+ }
2100
+
2101
+ .odt-toast__icon--loading {
2102
+ color: var(--color-primary-500, #3b82f6);
2103
+ animation: odt-spin 0.8s linear infinite;
2104
+ }
2105
+
2106
+ .odt-toast__content {
2107
+ display: flex;
2108
+ flex-direction: column;
2109
+ gap: var(--spacing-0-5, 0.125rem);
2110
+ flex: 1;
2111
+ min-width: 0;
2112
+ }
2113
+
2114
+ .odt-toast__title {
2115
+ font-size: var(--font-size-base, 0.9375rem);
2116
+ font-weight: var(--font-weight-semibold, 600);
2117
+ color: var(--color-fg-strong);
2118
+ line-height: 1.35;
2119
+ margin: 0;
2120
+ }
2121
+
2122
+ .odt-toast__description,
2123
+ .odt-toast__message {
2124
+ font-size: var(--font-size-sm, 0.8125rem);
2125
+ color: var(--color-fg-muted);
2126
+ line-height: 1.45;
2127
+ margin: 0;
2128
+ }
2129
+
2130
+ .odt-toast__close {
2131
+ display: inline-flex;
2132
+ align-items: center;
2133
+ justify-content: center;
2134
+ width: 1.5rem;
2135
+ height: 1.5rem;
2136
+ padding: 0;
2137
+ border-radius: var(--radius-md, 0.375rem);
2138
+ border: none;
2139
+ background: transparent;
2140
+ color: var(--color-fg-muted);
2141
+ cursor: pointer;
2142
+ flex-shrink: 0;
2143
+ margin-left: auto;
2144
+ margin-top: -0.125rem;
2145
+ transition: background-color 0.15s ease, color 0.15s ease;
2146
+ }
2147
+
2148
+ .odt-toast__close:hover {
2149
+ background-color: var(--color-surface-subtle);
2150
+ color: var(--color-fg-strong);
2151
+ }
2152
+
2153
+ .odt-toast__close svg {
2154
+ display: block;
2155
+ }
2156
+
2157
+ /* ==========================================================================
1461
2158
  * 11. Modal Component (.odt-modal-overlay, .odt-modal)
1462
2159
  * ========================================================================== */
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
- }
2160
+ @keyframes odt-overlay-fade-in {
2161
+ from {
2162
+ opacity: 0;
2163
+ }
2164
+
2165
+ to {
2166
+ opacity: 1;
2167
+ }
2168
+ }
1643
2169
 
1644
- /* ==========================================================================
2170
+ @keyframes odt-overlay-fade-out {
2171
+ from {
2172
+ opacity: 1;
2173
+ }
2174
+
2175
+ to {
2176
+ opacity: 0;
2177
+ }
2178
+ }
2179
+
2180
+ @keyframes odt-modal-scale-in {
2181
+ from {
2182
+ opacity: 0;
2183
+ transform: scale(0.95) translateY(10px);
2184
+ }
2185
+
2186
+ to {
2187
+ opacity: 1;
2188
+ transform: scale(1) translateY(0);
2189
+ }
2190
+ }
2191
+
2192
+ @keyframes odt-modal-scale-out {
2193
+ from {
2194
+ opacity: 1;
2195
+ transform: scale(1) translateY(0);
2196
+ }
2197
+
2198
+ to {
2199
+ opacity: 0;
2200
+ transform: scale(0.96) translateY(8px);
2201
+ }
2202
+ }
2203
+
2204
+ .odt-modal-overlay {
2205
+ position: fixed;
2206
+ inset: 0;
2207
+ z-index: 1000;
2208
+ display: flex;
2209
+ justify-content: center;
2210
+ align-items: center;
2211
+ padding: var(--spacing-4, 1rem);
2212
+ background-color: var(--color-overlay-backdrop, rgba(0, 0, 0, 0.6));
2213
+ overflow-y: auto;
2214
+ box-sizing: border-box;
2215
+ font-family: inherit;
2216
+ animation: odt-overlay-fade-in 0.22s cubic-bezier(0.16, 1, 0.3, 1) forwards;
2217
+ }
2218
+
2219
+ .odt-modal-overlay.hidden {
2220
+ display: none !important;
2221
+ }
2222
+
2223
+ .odt-modal-overlay--exiting {
2224
+ animation: odt-overlay-fade-out 0.18s cubic-bezier(0.4, 0, 1, 1) forwards;
2225
+ pointer-events: none;
2226
+ }
2227
+
2228
+ /* Modal Content Box */
2229
+ .odt-modal {
2230
+ position: relative;
2231
+ width: 100%;
2232
+ box-sizing: border-box;
2233
+ font-family: inherit;
2234
+ background-color: var(--color-surface-elevated, #ffffff);
2235
+ color: var(--color-fg);
2236
+ border-radius: var(--radius-2xl, 1rem);
2237
+ box-shadow: var(--shadow-modal);
2238
+ border: 1px solid var(--color-line-muted, rgba(226, 232, 240, 0.8));
2239
+ display: flex;
2240
+ flex-direction: column;
2241
+ outline: none;
2242
+ animation: odt-modal-scale-in 0.24s cubic-bezier(0.16, 1, 0.3, 1) forwards;
2243
+ margin: auto 0;
2244
+ }
2245
+
2246
+ .odt-modal--exiting {
2247
+ animation: odt-modal-scale-out 0.18s cubic-bezier(0.4, 0, 1, 1) forwards;
2248
+ }
2249
+
2250
+ /* Modal Sizes */
2251
+ .odt-modal--sm {
2252
+ max-width: 24rem;
2253
+ /* 384px */
2254
+ }
2255
+
2256
+ .odt-modal--md {
2257
+ max-width: 32rem;
2258
+ /* 512px */
2259
+ }
2260
+
2261
+ .odt-modal--lg {
2262
+ max-width: 42rem;
2263
+ /* 672px */
2264
+ }
2265
+
2266
+ .odt-modal--xl {
2267
+ max-width: 56rem;
2268
+ /* 896px */
2269
+ }
2270
+
2271
+ .odt-modal--full {
2272
+ max-width: calc(100vw - 2rem);
2273
+ min-height: calc(100vh - 3rem);
2274
+ }
2275
+
2276
+ /* Modal Sub-components */
2277
+ .odt-modal__header {
2278
+ display: flex;
2279
+ align-items: flex-start;
2280
+ justify-content: space-between;
2281
+ padding: var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem) var(--spacing-2, 0.5rem);
2282
+ gap: var(--spacing-3, 0.75rem);
2283
+ }
2284
+
2285
+ .odt-modal__header-content {
2286
+ display: flex;
2287
+ flex-direction: column;
2288
+ gap: var(--spacing-1, 0.25rem);
2289
+ flex: 1;
2290
+ }
2291
+
2292
+ .odt-modal__title {
2293
+ font-family: inherit;
2294
+ font-size: var(--font-size-xl, 1.25rem);
2295
+ font-weight: var(--font-weight-bold, 700);
2296
+ color: var(--color-fg-strong);
2297
+ margin: 0;
2298
+ line-height: var(--line-height-tight, 1.25);
2299
+ }
2300
+
2301
+ .odt-modal__subtitle {
2302
+ font-family: inherit;
2303
+ font-size: var(--font-size-sm, 0.875rem);
2304
+ color: var(--color-fg-muted);
2305
+ margin: 0;
2306
+ }
2307
+
2308
+ .odt-modal__body {
2309
+ font-family: inherit;
2310
+ padding: var(--spacing-2, 0.5rem) var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem);
2311
+ font-size: var(--font-size-base, 1rem);
2312
+ line-height: var(--line-height-normal, 1.5);
2313
+ color: var(--color-fg);
2314
+ overflow-y: auto;
2315
+ max-height: 70vh;
2316
+ }
2317
+
2318
+ .odt-modal__footer {
2319
+ font-family: inherit;
2320
+ display: flex;
2321
+ align-items: center;
2322
+ justify-content: flex-end;
2323
+ gap: var(--spacing-3, 0.75rem);
2324
+ padding: var(--spacing-2, 0.5rem) var(--spacing-6, 1.5rem) var(--spacing-6, 1.5rem);
2325
+ border-bottom-left-radius: inherit;
2326
+ border-bottom-right-radius: inherit;
2327
+ }
2328
+
2329
+ .odt-modal__close {
2330
+ display: inline-flex;
2331
+ align-items: center;
2332
+ justify-content: center;
2333
+ width: 2rem;
2334
+ height: 2rem;
2335
+ padding: 0;
2336
+ border-radius: var(--radius-lg, 0.5rem);
2337
+ border: none;
2338
+ background: transparent;
2339
+ color: var(--color-fg-muted);
2340
+ cursor: pointer;
2341
+ transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;
2342
+ flex-shrink: 0;
2343
+ margin-left: auto;
2344
+ font-size: 1.25rem;
2345
+ line-height: 1;
2346
+ }
2347
+
2348
+ .odt-modal__close:hover {
2349
+ background-color: var(--color-surface-subtle);
2350
+ color: var(--color-fg-strong);
2351
+ }
2352
+
2353
+ .odt-modal__close:active {
2354
+ transform: scale(0.94);
2355
+ }
2356
+
2357
+ /* ==========================================================================
1645
2358
  * 12. DropdownMenu Component (.odt-dropdown)
1646
2359
  * ========================================================================== */
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
- }
2360
+ .odt-dropdown {
2361
+ position: relative;
2362
+ display: inline-block;
2363
+ }
2364
+
2365
+ .odt-dropdown--full-width {
2366
+ width: 100%;
2367
+ }
2368
+
2369
+ .odt-dropdown__container {
2370
+ display: inline-flex;
2371
+ flex-direction: column;
2372
+ gap: var(--spacing-1-5, 0.375rem);
2373
+ box-sizing: border-box;
2374
+ font-family: inherit;
2375
+ }
2376
+
2377
+ .odt-dropdown__container--full-width {
2378
+ width: 100%;
2379
+ }
2380
+
2381
+ .odt-dropdown__label {
2382
+ font-size: var(--font-size-sm, 0.875rem);
2383
+ font-weight: 500;
2384
+ color: var(--color-fg-strong);
2385
+ line-height: 1.25rem;
2386
+ user-select: none;
2387
+ cursor: default;
2388
+ }
2389
+
2390
+ .odt-dropdown__trigger {
2391
+ display: inline-flex;
2392
+ align-items: center;
2393
+ justify-content: space-between;
2394
+ box-sizing: border-box;
2395
+ background-color: var(--color-surface, #ffffff);
2396
+ color: var(--color-fg);
2397
+ font-family: inherit;
2398
+ font-weight: 500;
2399
+ outline: none;
2400
+ border: 1px solid transparent;
2401
+ cursor: pointer;
2402
+ user-select: none;
2403
+ gap: 0.5rem;
2404
+ transition: border-color 140ms ease, box-shadow 140ms ease, background-color 140ms ease;
2405
+ }
2406
+
2407
+ .odt-dropdown__trigger--outlined {
2408
+ background-color: var(--color-surface, #ffffff);
2409
+ border: 1px solid var(--color-line, #e4e4e9);
2410
+ }
2411
+
2412
+ .odt-dropdown__trigger--outlined:hover:not(:disabled):not(:focus):not(.odt-dropdown__trigger--open) {
2413
+ border-color: var(--color-line-strong, #d4d4db);
2414
+ }
2415
+
2416
+ .odt-dropdown__trigger--outlined:focus,
2417
+ .odt-dropdown__trigger--outlined.odt-dropdown__trigger--open {
2418
+ border-color: var(--color-ring);
2419
+ }
2420
+
2421
+ .odt-dropdown__trigger--filled {
2422
+ background-color: var(--color-surface, #ffffff);
2423
+ border: 1px solid transparent;
2424
+ }
2425
+
2426
+ .odt-dropdown__trigger--filled:focus,
2427
+ .odt-dropdown__trigger--filled.odt-dropdown__trigger--open {
2428
+ border-color: var(--color-ring);
2429
+ }
2430
+
2431
+ .odt-dropdown__trigger--frosted {
2432
+ background-color: hsl(from var(--color-surface) h s l / 0.85);
2433
+ backdrop-filter: blur(16px);
2434
+ -webkit-backdrop-filter: blur(16px);
2435
+ border: 1px solid transparent;
2436
+ box-shadow: var(--shadow-card);
2437
+ }
2438
+
2439
+ .odt-dropdown__trigger--frosted:focus,
2440
+ .odt-dropdown__trigger--frosted.odt-dropdown__trigger--open {
2441
+ border-color: var(--color-ring);
2442
+ }
2443
+
2444
+ .odt-dropdown__trigger--sm {
2445
+ height: 2rem;
2446
+ padding: 0 var(--spacing-3, 0.75rem);
2447
+ font-size: var(--font-size-xs, 0.75rem);
2448
+ }
2449
+
2450
+ .odt-dropdown__trigger--md {
2451
+ height: 2.625rem;
2452
+ padding: 0 var(--spacing-4, 1rem);
2453
+ font-size: var(--font-size-sm, 0.875rem);
2454
+ }
2455
+
2456
+ .odt-dropdown__trigger--lg {
2457
+ height: 3.125rem;
2458
+ padding: 0 var(--spacing-5, 1.25rem);
2459
+ font-size: var(--font-size-base, 1rem);
2460
+ }
2461
+
2462
+ .odt-dropdown__trigger-text {
2463
+ flex: 1 1 auto;
2464
+ text-align: left;
2465
+ overflow: hidden;
2466
+ text-overflow: ellipsis;
2467
+ white-space: nowrap;
2468
+ }
2469
+
2470
+ .odt-dropdown__placeholder {
2471
+ color: var(--color-fg-subtle);
2472
+ font-weight: 400;
2473
+ }
2474
+
2475
+ .odt-dropdown__chevron {
2476
+ display: inline-flex;
2477
+ align-items: center;
2478
+ justify-content: center;
2479
+ color: var(--color-fg-muted);
2480
+ flex-shrink: 0;
2481
+ transition: transform 180ms cubic-bezier(0.16, 1, 0.3, 1), color 140ms ease;
2482
+ }
2483
+
2484
+ .odt-dropdown__chevron--open {
2485
+ transform: rotate(180deg);
2486
+ color: var(--color-fg-strong);
2487
+ }
2488
+
2489
+ .odt-dropdown__trigger--error {
2490
+ border-color: var(--color-danger) !important;
2491
+ }
2492
+
2493
+ .odt-dropdown__trigger:disabled {
2494
+ background-color: var(--color-surface-subtle);
2495
+ color: var(--color-fg-disabled);
2496
+ cursor: not-allowed;
2497
+ opacity: 0.7;
2498
+ }
2499
+
2500
+ .odt-dropdown__content {
2501
+ position: absolute;
2502
+ z-index: 1000;
2503
+ display: flex;
2504
+ flex-direction: column;
2505
+ box-sizing: border-box;
2506
+ padding: 0.3125rem;
2507
+ background-color: var(--color-surface, #ffffff);
2508
+ border: 1px solid var(--color-line-muted, rgba(226, 232, 240, 0.8));
2509
+ border-radius: var(--radius-xl, 0.75rem);
2510
+ color: var(--color-neutral-900);
2511
+ outline: none;
2512
+ min-width: 12rem;
2513
+ box-shadow: 0 10px 28px -4px rgba(0, 0, 0, 0.08), 0 4px 10px -2px rgba(0, 0, 0, 0.03);
2514
+ transform-origin: top center;
2515
+ animation: odt-dropdown-enter 150ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
2516
+ }
2517
+
2518
+ .odt-dropdown__content.hidden {
2519
+ display: none !important;
2520
+ }
2521
+
2522
+ .odt-dropdown__content--align-start {
2523
+ left: 0;
2524
+ }
2525
+
2526
+ .odt-dropdown__content--align-end {
2527
+ right: 0;
2528
+ }
2529
+
2530
+ .odt-dropdown__content--align-center {
2531
+ left: 50%;
2532
+ transform: translateX(-50%);
2533
+ }
2534
+
2535
+ .odt-dropdown__content--side-bottom {
2536
+ top: calc(100% + 6px);
2537
+ }
2538
+
2539
+ .odt-dropdown__content--side-top {
2540
+ bottom: calc(100% + 6px);
2541
+ }
2542
+
2543
+ .odt-dropdown__content--exiting {
2544
+ animation: odt-dropdown-exit 110ms cubic-bezier(0.4, 0, 1, 1) forwards;
2545
+ pointer-events: none;
2546
+ }
2547
+
2548
+ @keyframes odt-dropdown-enter {
2549
+ from {
2550
+ opacity: 0;
2551
+ transform: scale(0.97) translateY(-4px);
2552
+ }
2553
+
2554
+ to {
2555
+ opacity: 1;
2556
+ transform: scale(1) translateY(0);
2557
+ }
2558
+ }
2559
+
2560
+ @keyframes odt-dropdown-exit {
2561
+ from {
2562
+ opacity: 1;
2563
+ transform: scale(1) translateY(0);
2564
+ }
2565
+
2566
+ to {
2567
+ opacity: 0;
2568
+ transform: scale(0.97) translateY(-4px);
2569
+ }
2570
+ }
2571
+
2572
+ .odt-dropdown__item {
2573
+ position: relative;
2574
+ display: flex;
2575
+ align-items: center;
2576
+ width: 100%;
2577
+ box-sizing: border-box;
2578
+ padding: 0.4375rem 0.625rem;
2579
+ border-radius: var(--radius-lg, 0.5rem);
2580
+ font-size: 0.8125rem;
2581
+ font-weight: 500;
2582
+ line-height: 1.25rem;
2583
+ letter-spacing: -0.01em;
2584
+ color: var(--color-neutral-700);
2585
+ background: transparent;
2586
+ border: none;
2587
+ cursor: pointer;
2588
+ user-select: none;
2589
+ text-decoration: none;
2590
+ transition: background-color 120ms ease, color 120ms ease, transform 100ms ease;
2591
+ outline: none;
2592
+ gap: 0.5rem;
2593
+ }
2594
+
2595
+ .odt-dropdown__item:hover,
2596
+ .odt-dropdown__item:focus-visible,
2597
+ .odt-dropdown__item[data-highlighted="true"] {
2598
+ background-color: var(--color-surface-subtle);
2599
+ color: var(--color-neutral-950);
2600
+ }
2601
+
2602
+ .odt-dropdown__item:active {
2603
+ background-color: var(--color-neutral-200);
2604
+ transform: scale(0.99);
2605
+ }
2606
+
2607
+ .odt-dropdown__item--inset {
2608
+ padding-left: 2.125rem;
2609
+ }
2610
+
2611
+ .odt-dropdown__item:disabled,
2612
+ .odt-dropdown__item--disabled {
2613
+ opacity: 0.4;
2614
+ cursor: not-allowed;
2615
+ pointer-events: none;
2616
+ }
2617
+
2618
+ .odt-dropdown__item--destructive {
2619
+ color: var(--color-danger);
2620
+ }
2621
+
2622
+ .odt-dropdown__item--destructive:hover,
2623
+ .odt-dropdown__item--destructive:focus-visible,
2624
+ .odt-dropdown__item--destructive[data-highlighted="true"] {
2625
+ background-color: var(--color-surface-danger);
2626
+ color: var(--color-danger);
2627
+ }
2628
+
2629
+ .odt-dropdown__item-content {
2630
+ flex: 1 1 auto;
2631
+ display: flex;
2632
+ align-items: center;
2633
+ overflow: hidden;
2634
+ text-overflow: ellipsis;
2635
+ white-space: nowrap;
2636
+ }
2637
+
2638
+ .odt-dropdown__item-icon {
2639
+ display: inline-flex;
2640
+ align-items: center;
2641
+ justify-content: center;
2642
+ flex-shrink: 0;
2643
+ width: 1rem;
2644
+ height: 1rem;
2645
+ color: var(--color-neutral-400);
2646
+ transition: color 120ms ease;
2647
+ }
2648
+
2649
+ .odt-dropdown__item:hover .odt-dropdown__item-icon,
2650
+ .odt-dropdown__item:focus-visible .odt-dropdown__item-icon {
2651
+ color: var(--color-neutral-800);
2652
+ }
2653
+
2654
+ .odt-dropdown__item--destructive .odt-dropdown__item-icon {
2655
+ color: var(--color-danger);
2656
+ }
2657
+
2658
+ .odt-dropdown__item-right-icon {
2659
+ display: inline-flex;
2660
+ align-items: center;
2661
+ justify-content: center;
2662
+ flex-shrink: 0;
2663
+ margin-left: auto;
2664
+ color: var(--color-neutral-400);
2665
+ }
2666
+
2667
+ .odt-dropdown__shortcut {
2668
+ margin-left: auto;
2669
+ font-size: 0.6875rem;
2670
+ font-weight: 500;
2671
+ letter-spacing: 0.04em;
2672
+ font-family: var(--font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);
2673
+ color: var(--color-neutral-400);
2674
+ background: none;
2675
+ border: none;
2676
+ padding: 0;
2677
+ line-height: 1rem;
2678
+ display: inline-flex;
2679
+ align-items: center;
2680
+ }
2681
+
2682
+ .odt-dropdown__label-heading {
2683
+ padding: 0.375rem 0.625rem 0.25rem;
2684
+ font-size: 0.6875rem;
2685
+ font-weight: 600;
2686
+ text-transform: uppercase;
2687
+ letter-spacing: 0.05em;
2688
+ color: var(--color-neutral-400);
2689
+ user-select: none;
2690
+ }
1973
2691
 
2692
+ .odt-dropdown__label-heading--inset {
2693
+ padding-left: 2.125rem;
2694
+ }
1974
2695
 
2696
+ .odt-dropdown__separator {
2697
+ height: 1px;
2698
+ margin: 0.25rem 0.25rem;
2699
+ background-color: var(--color-line-muted, rgba(226, 232, 240, 0.8));
2700
+ border: none;
2701
+ }
1975
2702
 
2703
+ .odt-dropdown__group {
2704
+ display: flex;
2705
+ flex-direction: column;
2706
+ width: 100%;
2707
+ }
2708
+ }