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