@nexus-cross/design-system 1.0.6-beta.2 → 1.0.6

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.
Files changed (135) hide show
  1. package/DESIGN.md +185 -0
  2. package/cursor-rules/nexus-ui-api.mdc +223 -7
  3. package/cursor-rules/nexus-ui-components.mdc +44 -17
  4. package/dist/alert.d.mts +17 -0
  5. package/dist/alert.d.ts +17 -0
  6. package/dist/alert.js +16 -0
  7. package/dist/alert.mjs +3 -0
  8. package/dist/badge.d.mts +18 -0
  9. package/dist/badge.d.ts +18 -0
  10. package/dist/badge.js +16 -0
  11. package/dist/badge.mjs +3 -0
  12. package/dist/breadcrumb.d.mts +15 -0
  13. package/dist/breadcrumb.d.ts +15 -0
  14. package/dist/breadcrumb.js +12 -0
  15. package/dist/breadcrumb.mjs +3 -0
  16. package/dist/chunks/chunk-2N2EPBO4.js +120 -0
  17. package/dist/chunks/{chunk-AFSEYJZT.js → chunk-2T7RUYEK.js} +175 -50
  18. package/dist/chunks/chunk-2UPGFY6E.mjs +76 -0
  19. package/dist/chunks/chunk-3ZWN66YH.js +53 -0
  20. package/dist/chunks/chunk-5PQ3UCKF.js +99 -0
  21. package/dist/chunks/chunk-6BWOKTVQ.mjs +87 -0
  22. package/dist/chunks/chunk-6DBRL6NA.mjs +81 -0
  23. package/dist/chunks/chunk-B5O6W3Z4.mjs +73 -0
  24. package/dist/chunks/chunk-BJM3NDT2.mjs +368 -0
  25. package/dist/chunks/chunk-C2DSAJTL.js +109 -0
  26. package/dist/chunks/chunk-CUTMLBC3.mjs +86 -0
  27. package/dist/chunks/chunk-CV4GMFWP.js +174 -0
  28. package/dist/chunks/chunk-DICN6GKE.js +99 -0
  29. package/dist/chunks/chunk-DYPPVXQF.js +143 -0
  30. package/dist/chunks/chunk-EJY7IVSK.mjs +31 -0
  31. package/dist/chunks/chunk-FUIBYZZ4.mjs +98 -0
  32. package/dist/chunks/{chunk-HNLI646G.mjs → chunk-GN6X27QI.mjs} +9 -2
  33. package/dist/chunks/chunk-H2G5FMRN.mjs +75 -0
  34. package/dist/chunks/chunk-H2V7RHYV.mjs +120 -0
  35. package/dist/chunks/chunk-MMCA33FW.mjs +85 -0
  36. package/dist/chunks/chunk-NZHK76R3.js +109 -0
  37. package/dist/chunks/chunk-P73MEU7N.mjs +150 -0
  38. package/dist/chunks/chunk-PDJTSQOC.js +59 -0
  39. package/dist/chunks/chunk-PXBZEAZQ.mjs +5 -0
  40. package/dist/chunks/chunk-QRNHFOLG.js +7 -0
  41. package/dist/chunks/chunk-S2GMEC43.js +109 -0
  42. package/dist/chunks/{chunk-VGO4Z2WH.js → chunk-SUIT4XKB.js} +8 -1
  43. package/dist/chunks/chunk-X3CTJ7TD.js +108 -0
  44. package/dist/chunks/chunk-XGIJZ3NZ.js +160 -0
  45. package/dist/chunks/chunk-YO5MSDPX.mjs +36 -0
  46. package/dist/chunks/chunk-ZI4LN2B2.js +96 -0
  47. package/dist/chunks/chunk-ZU4AWAFT.mjs +137 -0
  48. package/dist/date-picker.d.mts +17 -0
  49. package/dist/date-picker.d.ts +17 -0
  50. package/dist/date-picker.js +12 -0
  51. package/dist/date-picker.mjs +3 -0
  52. package/dist/dropdown-menu.d.mts +30 -0
  53. package/dist/dropdown-menu.d.ts +30 -0
  54. package/dist/dropdown-menu.js +32 -0
  55. package/dist/dropdown-menu.mjs +3 -0
  56. package/dist/empty-state.d.mts +16 -0
  57. package/dist/empty-state.d.ts +16 -0
  58. package/dist/empty-state.js +16 -0
  59. package/dist/empty-state.mjs +3 -0
  60. package/dist/index.d.mts +14 -0
  61. package/dist/index.d.ts +14 -0
  62. package/dist/index.js +269 -157
  63. package/dist/index.mjs +30 -18
  64. package/dist/modal/index.js +12 -12
  65. package/dist/modal/index.mjs +3 -3
  66. package/dist/number-input.d.mts +5 -6
  67. package/dist/number-input.d.ts +5 -6
  68. package/dist/number-input.js +4 -4
  69. package/dist/number-input.mjs +1 -1
  70. package/dist/nx-image.d.mts +13 -0
  71. package/dist/nx-image.d.ts +13 -0
  72. package/dist/nx-image.js +12 -0
  73. package/dist/nx-image.mjs +3 -0
  74. package/dist/progress.d.mts +18 -0
  75. package/dist/progress.d.ts +18 -0
  76. package/dist/progress.js +16 -0
  77. package/dist/progress.mjs +3 -0
  78. package/dist/schemas/_all.json +840 -13
  79. package/dist/schemas/alert.json +49 -0
  80. package/dist/schemas/badge.json +76 -0
  81. package/dist/schemas/breadcrumb.json +47 -0
  82. package/dist/schemas/datePicker.json +56 -0
  83. package/dist/schemas/dropdownMenu.json +83 -0
  84. package/dist/schemas/emptyState.json +44 -0
  85. package/dist/schemas/numberInput.json +27 -8
  86. package/dist/schemas/nxImage.json +56 -0
  87. package/dist/schemas/progress.json +63 -0
  88. package/dist/schemas/slider.json +78 -0
  89. package/dist/schemas/stepper.json +73 -0
  90. package/dist/schemas/tagInput.json +70 -0
  91. package/dist/schemas/textArea.json +26 -1
  92. package/dist/schemas/toggleGroup.json +88 -0
  93. package/dist/schemas.d.mts +628 -144
  94. package/dist/schemas.d.ts +628 -144
  95. package/dist/schemas.js +177 -7
  96. package/dist/schemas.mjs +166 -8
  97. package/dist/slider.d.mts +20 -0
  98. package/dist/slider.d.ts +20 -0
  99. package/dist/slider.js +16 -0
  100. package/dist/slider.mjs +3 -0
  101. package/dist/stepper.d.mts +20 -0
  102. package/dist/stepper.d.ts +20 -0
  103. package/dist/stepper.js +16 -0
  104. package/dist/stepper.mjs +3 -0
  105. package/dist/styles/layer.js +2 -2
  106. package/dist/styles/layer.mjs +1 -1
  107. package/dist/styles.css +1615 -185
  108. package/dist/styles.js +2 -2
  109. package/dist/styles.layered.css +1615 -185
  110. package/dist/styles.mjs +1 -1
  111. package/dist/table.d.mts +40 -25
  112. package/dist/table.d.ts +40 -25
  113. package/dist/table.js +7 -7
  114. package/dist/table.mjs +1 -1
  115. package/dist/tag-input.d.mts +21 -0
  116. package/dist/tag-input.d.ts +21 -0
  117. package/dist/tag-input.js +16 -0
  118. package/dist/tag-input.mjs +3 -0
  119. package/dist/text-area.d.mts +5 -1
  120. package/dist/text-area.d.ts +5 -1
  121. package/dist/text-area.js +3 -3
  122. package/dist/text-area.mjs +1 -1
  123. package/dist/toggle-group.d.mts +36 -0
  124. package/dist/toggle-group.d.ts +36 -0
  125. package/dist/toggle-group.js +16 -0
  126. package/dist/toggle-group.mjs +3 -0
  127. package/package.json +69 -3
  128. package/scripts/setup-cursor-rules.cjs +15 -1
  129. package/dist/chunks/chunk-26BUGBOY.mjs +0 -57
  130. package/dist/chunks/chunk-CLGH2RTS.js +0 -7
  131. package/dist/chunks/chunk-ECVAVQUY.mjs +0 -243
  132. package/dist/chunks/chunk-UPCWJWXR.mjs +0 -5
  133. package/dist/chunks/chunk-WR55D4ZS.js +0 -80
  134. package/dist/chunks/{chunk-3VFBPFZF.mjs → chunk-CWMLTXOH.mjs} +2 -2
  135. package/dist/chunks/{chunk-U53UA76K.js → chunk-HFBTS42N.js} +2 -2
package/dist/styles.css CHANGED
@@ -92,7 +92,10 @@
92
92
  /* ── Shared: Shadow ── */
93
93
  --shadow-comp-sm: var(--shadow-elevation-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
94
94
  --shadow-comp-md: var(--shadow-elevation-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));
95
- --shadow-comp-lg: var(--shadow-elevation-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
95
+ --shadow-comp-lg: var(
96
+ --shadow-elevation-lg,
97
+ 0 10px 15px -3px rgb(0 0 0 / 0.1)
98
+ );
96
99
 
97
100
  /* ── Shared: Overlay ── */
98
101
  --color-comp-overlay: var(--color-overlay-dim, rgba(0, 0, 0, 0.6));
@@ -134,6 +137,14 @@
134
137
  box-shadow: var(--shadow-comp-btn);
135
138
  transition-property: color, background-color, border-color;
136
139
  transition-duration: 200ms;
140
+ border: none;
141
+ background: none;
142
+ cursor: pointer;
143
+ font: inherit;
144
+ color: inherit;
145
+ padding: 0;
146
+ margin: 0;
147
+ text-decoration: none;
137
148
  }
138
149
  .nexus-btn:disabled,
139
150
  .nexus-btn[aria-disabled='true'] {
@@ -368,7 +379,9 @@
368
379
  font-weight: 500;
369
380
  line-height: 1;
370
381
  color: var(--color-text-primary);
371
- transition: border-color 200ms, box-shadow 200ms;
382
+ transition:
383
+ border-color 200ms,
384
+ box-shadow 200ms;
372
385
  }
373
386
  :where(.nexus-text-input) {
374
387
  width: 100%;
@@ -397,15 +410,18 @@
397
410
 
398
411
  /* ── Sizes ── */
399
412
  .nexus-text-input--xl {
400
- padding: calc(var(--spacing-padding-md, 1rem) - 1px) var(--spacing-padding-md, 1rem);
413
+ padding: calc(var(--spacing-padding-md, 1rem) - 1px)
414
+ var(--spacing-padding-md, 1rem);
401
415
  font-size: var(--text-text-base, 1rem);
402
416
  }
403
417
  .nexus-text-input--lg {
404
- padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px) var(--spacing-padding-sm, 0.75rem);
418
+ padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px)
419
+ var(--spacing-padding-sm, 0.75rem);
405
420
  font-size: var(--text-text-base, 1rem);
406
421
  }
407
422
  .nexus-text-input--md {
408
- padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px) var(--spacing-padding-sm, 0.75rem);
423
+ padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px)
424
+ var(--spacing-padding-sm, 0.75rem);
409
425
  font-size: var(--text-text-sm, 0.875rem);
410
426
  }
411
427
 
@@ -501,13 +517,15 @@
501
517
  text-decoration: underline;
502
518
  transition: color 150ms;
503
519
  }
504
- .nexus-price-input-field__balance:hover .nexus-price-input-field__balance-value {
520
+ .nexus-price-input-field__balance:hover
521
+ .nexus-price-input-field__balance-value {
505
522
  color: var(--color-text-primary);
506
523
  }
507
524
  .nexus-price-input-field__balance-value--exceeded {
508
525
  color: var(--color-status-danger);
509
526
  }
510
- .nexus-price-input-field__balance:hover .nexus-price-input-field__balance-value--exceeded {
527
+ .nexus-price-input-field__balance:hover
528
+ .nexus-price-input-field__balance-value--exceeded {
511
529
  color: var(--color-status-danger);
512
530
  }
513
531
  .nexus-price-input-field__description {
@@ -532,7 +550,9 @@
532
550
  font-weight: 500;
533
551
  line-height: 1;
534
552
  color: var(--color-text-primary);
535
- transition: border-color 200ms, box-shadow 200ms;
553
+ transition:
554
+ border-color 200ms,
555
+ box-shadow 200ms;
536
556
  }
537
557
  :where(.nexus-price-input) {
538
558
  width: 100%;
@@ -561,15 +581,18 @@
561
581
 
562
582
  /* ── Sizes ── */
563
583
  .nexus-price-input--xl {
564
- padding: calc(var(--spacing-padding-md, 1rem) - 1px) var(--spacing-padding-md, 1rem);
584
+ padding: calc(var(--spacing-padding-md, 1rem) - 1px)
585
+ var(--spacing-padding-md, 1rem);
565
586
  font-size: var(--text-text-base, 1rem);
566
587
  }
567
588
  .nexus-price-input--lg {
568
- padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px) var(--spacing-padding-sm, 0.75rem);
589
+ padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px)
590
+ var(--spacing-padding-sm, 0.75rem);
569
591
  font-size: var(--text-text-base, 1rem);
570
592
  }
571
593
  .nexus-price-input--md {
572
- padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px) var(--spacing-padding-sm, 0.75rem);
594
+ padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px)
595
+ var(--spacing-padding-sm, 0.75rem);
573
596
  font-size: var(--text-text-sm, 0.875rem);
574
597
  }
575
598
 
@@ -611,52 +634,137 @@
611
634
  TextArea
612
635
  ═══════════════════════════════════════════ */
613
636
 
637
+ /* ── Field wrapper ── */
638
+ .nexus-textarea-field {
639
+ display: flex;
640
+ flex-direction: column;
641
+ gap: 0.25rem;
642
+ }
643
+ .nexus-textarea-field__label {
644
+ font-size: var(--text-label-semibold-md, 0.875rem);
645
+ font-weight: 600;
646
+ color: var(--color-text-tertiary);
647
+ line-height: 1;
648
+ }
649
+ .nexus-textarea-field__footer {
650
+ display: flex;
651
+ align-items: center;
652
+ gap: 0.5rem;
653
+ }
654
+ .nexus-textarea-field__description {
655
+ flex: 1;
656
+ min-width: 0;
657
+ font-size: var(--text-text-xs, 0.75rem);
658
+ color: var(--color-text-tertiary);
659
+ line-height: 1.5;
660
+ letter-spacing: -0.12px;
661
+ }
662
+ .nexus-textarea-field__description--error {
663
+ color: var(--color-status-danger-intense, #d20625);
664
+ }
665
+ .nexus-textarea-field__count {
666
+ font-size: var(--text-text-xs, 0.75rem);
667
+ color: var(--color-text-tertiary);
668
+ line-height: 1.5;
669
+ letter-spacing: -0.12px;
670
+ text-align: right;
671
+ flex-shrink: 0;
672
+ margin-left: auto;
673
+ }
674
+ .nexus-textarea-field__count--error {
675
+ color: var(--color-status-danger-intense, #d20625);
676
+ }
677
+
678
+ /* ── Textarea box ── */
614
679
  .nexus-textarea {
615
- border-radius: var(--radius-corner-md, 0.375rem);
680
+ border-radius: var(--radius-corner-md, 0.5rem);
616
681
  border: 1px solid var(--color-border-default);
617
682
  background: var(--color-surface-default);
618
- padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
619
- font-size: var(--text-text-sm, 0.875rem);
620
683
  color: var(--color-text-primary);
621
- transition-property: border-color;
622
- transition-duration: 200ms;
684
+ font-weight: 500;
685
+ line-height: 1.5;
686
+ transition:
687
+ border-color 200ms,
688
+ box-shadow 200ms;
623
689
  resize: none;
690
+ min-height: 100px;
691
+ padding: var(--spacing-padding-sm, 0.75rem);
624
692
  }
625
693
  :where(.nexus-textarea) {
626
694
  width: 100%;
627
695
  }
628
696
  .nexus-textarea::placeholder {
629
- color: var(--color-text-tertiary);
697
+ color: var(--color-text-muted);
630
698
  }
631
699
  .nexus-textarea:focus-visible {
632
700
  outline: none;
633
701
  }
634
- .nexus-textarea:disabled {
635
- cursor: not-allowed;
636
- opacity: 0.5;
702
+
703
+ /* Hover */
704
+ .nexus-textarea:hover:not(.nexus-textarea--disabled):not(:focus) {
705
+ border-color: var(--color-border-default-hover);
706
+ box-shadow: 0 0 0 0.5px var(--color-border-default-hover);
637
707
  }
708
+
709
+ /* Focus — default */
638
710
  .nexus-textarea--default:focus {
639
- border-color: var(--color-text-primary);
711
+ border-color: var(--color-accent-primary);
712
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
640
713
  }
714
+
715
+ /* Error */
641
716
  .nexus-textarea--error {
642
- border-color: var(--color-status-danger);
717
+ border-color: var(--color-status-danger-focus, #e62848);
718
+ box-shadow: 0 0 0 0.5px var(--color-status-danger-focus, #e62848);
643
719
  }
644
720
  .nexus-textarea--error:focus {
645
- border-color: var(--color-status-danger);
721
+ border-color: var(--color-status-danger-focus, #e62848);
722
+ box-shadow: 0 0 0 0.5px var(--color-status-danger-focus, #e62848);
646
723
  }
647
- .nexus-textarea-wrap {
648
- display: flex;
649
- flex-direction: column;
724
+
725
+ /* Disabled */
726
+ .nexus-textarea--disabled {
727
+ cursor: not-allowed;
728
+ background: var(
729
+ --color-surface-default-disabled,
730
+ var(--color-surface-strong)
731
+ );
732
+ border-color: var(--color-border-medium);
733
+ color: var(--color-text-muted);
650
734
  }
651
- .nexus-textarea-count {
652
- margin-top: 0.25rem;
653
- text-align: right;
654
- font-size: var(--text-text-xs, 0.75rem);
655
- color: var(--color-text-tertiary);
735
+
736
+ /* ── Sizes ── */
737
+ .nexus-textarea--lg {
738
+ font-size: var(--text-text-medium-base, 1rem);
739
+ letter-spacing: -0.16px;
656
740
  }
657
- .nexus-textarea-count__current {
658
- color: var(--color-text-primary);
659
- font-weight: 500;
741
+ .nexus-textarea--md {
742
+ font-size: var(--text-text-medium-sm, 0.875rem);
743
+ letter-spacing: -0.14px;
744
+ }
745
+
746
+ /* ── Resize modes ── */
747
+ .nexus-textarea--resize-default {
748
+ resize: vertical;
749
+ }
750
+ .nexus-textarea--resize-auto {
751
+ resize: none;
752
+ overflow: hidden;
753
+ }
754
+
755
+ /* ── Custom scrollbar ── */
756
+ .nexus-textarea:not(.nexus-textarea--resize-auto) {
757
+ overflow-y: auto;
758
+ }
759
+ .nexus-textarea::-webkit-scrollbar {
760
+ width: 5px;
761
+ }
762
+ .nexus-textarea::-webkit-scrollbar-track {
763
+ background: transparent;
764
+ }
765
+ .nexus-textarea::-webkit-scrollbar-thumb {
766
+ background: var(--color-icon-muted, #c6d0da);
767
+ border-radius: var(--radius-corner-full, 9999px);
660
768
  }
661
769
 
662
770
  /* ═══════════════════════════════════════════
@@ -665,81 +773,167 @@
665
773
 
666
774
  .nexus-number-input {
667
775
  display: flex;
668
- align-items: center;
669
- border-radius: var(--radius-corner-md, 0.375rem);
670
- border: 1px solid var(--color-border-default);
671
- background: var(--color-surface-default);
672
- color: var(--color-text-primary);
673
- transition: border-color 200ms, box-shadow 200ms;
776
+ flex-direction: column;
777
+ align-items: stretch;
674
778
  }
675
779
  :where(.nexus-number-input) {
676
780
  width: 100%;
677
781
  }
678
- .nexus-number-input:hover:not(.nexus-number-input--disabled):not(:focus-within) {
679
- box-shadow: 0 0 0 0.5px var(--color-border-default);
782
+
783
+ /* ── Header (label + max) ── */
784
+ .nexus-number-input__header {
785
+ display: flex;
786
+ align-items: center;
787
+ justify-content: space-between;
788
+ margin-bottom: 4px;
680
789
  }
681
- .nexus-number-input--default:focus-within {
682
- border-color: var(--color-accent-primary);
683
- box-shadow: 0 0 0 0.5px var(--color-accent-primary);
790
+ .nexus-number-input__label {
791
+ font-size: var(--text-label-semibold-md, 0.875rem);
792
+ font-weight: var(--font-weight-label-semibold-md, 600);
793
+ line-height: 1;
794
+ color: var(--color-text-tertiary);
684
795
  }
685
- .nexus-number-input--error {
686
- border-color: var(--color-status-danger);
796
+ .nexus-number-input__max {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 4px;
800
+ margin: 0;
801
+ margin-left: auto;
802
+ padding: 0;
803
+ border: none;
804
+ background: none;
805
+ font-size: var(--text-text-xs, 0.75rem);
806
+ font-weight: 400;
807
+ line-height: 1.5;
808
+ letter-spacing: -0.01em;
809
+ cursor: pointer;
687
810
  }
688
- .nexus-number-input--error:focus-within {
689
- border-color: var(--color-status-danger);
690
- box-shadow: 0 0 0 0.5px var(--color-status-danger);
811
+ .nexus-number-input__max:disabled {
812
+ cursor: default;
691
813
  }
692
- .nexus-number-input--xl {
693
- height: 3.5rem;
694
- font-size: var(--text-text-base, 1rem);
814
+ .nexus-number-input__max-text {
815
+ color: var(--color-text-tertiary);
695
816
  }
696
- .nexus-number-input--lg {
697
- height: 3rem;
698
- font-size: var(--text-text-base, 1rem);
817
+ .nexus-number-input__max-value {
818
+ color: var(--color-text-secondary);
819
+ text-decoration: underline;
699
820
  }
700
- .nexus-number-input--md {
701
- height: 2.5rem;
702
- font-size: var(--text-text-sm, 0.875rem);
821
+ .nexus-number-input__max-value--exceeded {
822
+ color: var(--color-status-danger-intense);
703
823
  }
704
- .nexus-number-input--sm {
705
- height: 2rem;
706
- font-size: var(--text-text-xs, 0.75rem);
824
+
825
+ /* ── Container (the bordered input box) ── */
826
+ .nexus-number-input__container {
827
+ display: flex;
828
+ align-items: center;
829
+ border-radius: var(--radius-corner-md, 0.5rem);
830
+ border: 1px solid var(--color-border-default);
831
+ background: var(--color-surface-default);
832
+ outline: 0.5px solid transparent;
833
+ transition:
834
+ border-color var(--duration-transition-fast, 150ms),
835
+ outline-color var(--duration-transition-fast, 150ms);
836
+ }
837
+ .nexus-number-input--basic .nexus-number-input__container {
838
+ overflow: clip;
839
+ }
840
+ .nexus-number-input:not(.nexus-number-input--disabled):not(
841
+ .nexus-number-input--error
842
+ )
843
+ .nexus-number-input__container:hover {
844
+ border-color: var(--color-border-default-hover);
845
+ outline-color: var(--color-border-default-hover);
707
846
  }
708
- .nexus-number-input--disabled {
709
- opacity: 0.5;
710
- cursor: not-allowed;
847
+ .nexus-number-input:not(.nexus-number-input--disabled):not(
848
+ .nexus-number-input--error
849
+ )
850
+ .nexus-number-input__container:focus-within {
851
+ border-color: var(--color-accent-primary-focus);
852
+ outline-color: var(--color-accent-primary-focus);
853
+ }
854
+ .nexus-number-input--error .nexus-number-input__container {
855
+ border-color: var(--color-status-danger-focus);
856
+ outline-color: var(--color-status-danger-focus);
857
+ }
858
+ .nexus-number-input--disabled .nexus-number-input__container {
859
+ background: var(--color-surface-strong);
860
+ border-color: var(--color-border-medium);
861
+ pointer-events: none;
862
+ }
863
+ .nexus-number-input--disabled .nexus-number-input__label {
864
+ color: var(--color-text-muted);
865
+ }
866
+ .nexus-number-input--disabled .nexus-number-input__max {
867
+ cursor: default;
868
+ }
869
+ .nexus-number-input--disabled .nexus-number-input__max-text,
870
+ .nexus-number-input--disabled .nexus-number-input__max-value {
871
+ color: var(--color-text-muted);
872
+ text-decoration: none;
873
+ }
874
+ .nexus-number-input--disabled .nexus-number-input__step {
875
+ color: var(--color-text-muted);
876
+ }
877
+ .nexus-number-input--disabled .nexus-number-input__bind-btn {
878
+ background: var(--color-surface-strong);
879
+ color: var(--color-text-muted);
711
880
  }
881
+ .nexus-number-input--disabled .nexus-number-input__description {
882
+ color: var(--color-text-muted);
883
+ }
884
+
885
+ /* ── Input field ── */
712
886
  .nexus-number-input__field {
713
- height: 100%;
714
- width: 100%;
715
- min-width: 0;
716
887
  flex: 1;
888
+ min-width: 0;
889
+ border: none;
717
890
  background: transparent;
718
891
  outline: none;
892
+ font-size: var(--text-label-lg, 1rem);
893
+ font-weight: var(--font-weight-label-lg, 500);
894
+ line-height: 1;
895
+ color: var(--color-text-primary);
719
896
  }
720
897
  .nexus-number-input__field::placeholder {
721
- color: var(--color-text-tertiary);
898
+ color: var(--color-text-muted);
722
899
  }
723
900
  .nexus-number-input__field:focus-visible {
724
901
  outline: none;
725
902
  }
726
- .nexus-number-input__field--xl {
727
- padding-inline: var(--spacing-padding-lg, 1.25rem);
903
+ .nexus-number-input--disabled .nexus-number-input__field {
904
+ color: var(--color-text-muted);
905
+ cursor: not-allowed;
728
906
  }
729
- .nexus-number-input__field--lg {
730
- padding-inline: var(--spacing-padding-md, 1rem);
907
+
908
+ /* ── Size: field padding (basic) ── */
909
+ .nexus-number-input--basic.nexus-number-input--lg .nexus-number-input__field {
910
+ padding: var(--spacing-padding-sm, 0.75rem);
731
911
  }
732
- .nexus-number-input__field--md {
733
- padding-inline: var(--spacing-padding-sm, 0.75rem);
912
+ .nexus-number-input--basic.nexus-number-input--xl .nexus-number-input__field {
913
+ padding: var(--spacing-padding-md, 1rem);
734
914
  }
735
- .nexus-number-input__field--sm {
736
- padding-inline: 0.625rem;
915
+
916
+ /* ── Size: field padding (bind) ── */
917
+ .nexus-number-input--bind .nexus-number-input__container {
918
+ padding-inline: var(--spacing-padding-xs, 0.5rem);
919
+ }
920
+ .nexus-number-input--bind .nexus-number-input__field {
921
+ text-align: center;
922
+ }
923
+ .nexus-number-input--bind.nexus-number-input--lg .nexus-number-input__field {
924
+ padding: var(--spacing-padding-sm, 0.75rem);
737
925
  }
926
+ .nexus-number-input--bind.nexus-number-input--xl .nexus-number-input__field {
927
+ padding: var(--spacing-padding-md, 1rem) var(--spacing-padding-sm, 0.75rem);
928
+ }
929
+
930
+ /* ── Basic variant: chevron buttons column ── */
738
931
  .nexus-number-input__buttons {
739
932
  display: flex;
740
933
  flex-direction: column;
934
+ align-self: stretch;
741
935
  border-left: 1px solid var(--color-border-default);
742
- height: 100%;
936
+ width: 24px;
743
937
  flex-shrink: 0;
744
938
  }
745
939
  .nexus-number-input__step {
@@ -747,29 +941,84 @@
747
941
  flex: 1;
748
942
  align-items: center;
749
943
  justify-content: center;
750
- padding-inline: 0.375rem;
751
- color: var(--color-text-tertiary);
752
- transition-property: color, background-color;
753
- transition-duration: 150ms;
944
+ padding: 0;
945
+ margin: 0;
946
+ border: none;
947
+ background: var(--color-surface-subtle);
948
+ cursor: pointer;
949
+ color: var(--color-icon-secondary);
950
+ transition:
951
+ color var(--duration-transition-fast, 150ms),
952
+ background-color var(--duration-transition-fast, 150ms);
754
953
  }
755
954
  .nexus-number-input__step:hover {
756
- color: var(--color-text-primary);
757
- background: var(--color-surface-hover);
955
+ background: var(--color-surface-subtle-hover);
956
+ color: var(--color-icon-primary);
758
957
  }
759
958
  .nexus-number-input__step:disabled {
760
- opacity: 0.4;
959
+ color: var(--color-text-muted);
761
960
  pointer-events: none;
762
961
  }
763
962
  .nexus-number-input__step--up {
764
- border-top-right-radius: var(--radius-corner-md, 0.375rem);
765
963
  border-bottom: 1px solid var(--color-border-default);
766
964
  }
767
- .nexus-number-input__step--down {
768
- border-bottom-right-radius: var(--radius-corner-md, 0.375rem);
965
+ .nexus-number-input__chevron-icon {
966
+ width: 8px;
967
+ height: 5px;
769
968
  }
770
- .nexus-number-input__step-icon {
771
- width: 0.75rem;
772
- height: 0.75rem;
969
+ .nexus-number-input__chevron-icon--down {
970
+ transform: scaleY(-1);
971
+ }
972
+
973
+ /* ── Bind variant: +/- buttons ── */
974
+ .nexus-number-input__bind-btn {
975
+ display: flex;
976
+ align-items: center;
977
+ justify-content: center;
978
+ flex-shrink: 0;
979
+ width: 24px;
980
+ height: 24px;
981
+ padding: 0;
982
+ margin: 0;
983
+ border: none;
984
+ border-radius: var(--radius-corner-sm, 0.25rem);
985
+ background: var(--color-surface-subtle);
986
+ color: var(--color-icon-secondary);
987
+ cursor: pointer;
988
+ overflow: clip;
989
+ transition:
990
+ color var(--duration-transition-fast, 150ms),
991
+ background-color var(--duration-transition-fast, 150ms);
992
+ }
993
+ .nexus-number-input__bind-btn:hover {
994
+ background: var(--color-surface-subtle-hover);
995
+ color: var(--color-icon-primary);
996
+ }
997
+ .nexus-number-input__bind-btn:disabled {
998
+ color: var(--color-text-muted);
999
+ pointer-events: none;
1000
+ }
1001
+ .nexus-number-input--xl .nexus-number-input__bind-btn {
1002
+ width: 30px;
1003
+ height: 30px;
1004
+ }
1005
+ .nexus-number-input__bind-icon {
1006
+ width: 16px;
1007
+ height: 16px;
1008
+ }
1009
+
1010
+ /* ── Description ── */
1011
+ .nexus-number-input__description {
1012
+ margin: 0;
1013
+ font-size: var(--text-text-xs, 0.75rem);
1014
+ font-weight: 400;
1015
+ line-height: 1.5;
1016
+ letter-spacing: -0.01em;
1017
+ color: var(--color-text-tertiary);
1018
+ height: 18px;
1019
+ }
1020
+ .nexus-number-input__description--error {
1021
+ color: var(--color-status-danger-intense);
773
1022
  }
774
1023
 
775
1024
  /* ═══════════════════════════════════════════
@@ -1094,6 +1343,12 @@
1094
1343
  user-select: none;
1095
1344
  border-radius: 9999px;
1096
1345
  border: 1px solid transparent;
1346
+ background: transparent;
1347
+ cursor: pointer;
1348
+ font-family: inherit;
1349
+ padding: 0;
1350
+ margin: 0;
1351
+ text-decoration: none;
1097
1352
  }
1098
1353
  .nexus-chip[aria-disabled='true'] {
1099
1354
  opacity: 0.5;
@@ -1154,45 +1409,308 @@
1154
1409
  }
1155
1410
 
1156
1411
  /* ═══════════════════════════════════════════
1157
- Pagination
1412
+ Badge
1158
1413
  ═══════════════════════════════════════════ */
1159
1414
 
1160
- .nexus-pagination {
1161
- display: flex;
1162
- align-items: center;
1163
- gap: var(--spacing-gap-xs, 0.25rem);
1164
- }
1165
- .nexus-pagination--sm {
1166
- font-size: var(--text-text-xs, 0.75rem);
1167
- }
1168
- .nexus-pagination--md {
1169
- font-size: var(--text-text-sm, 0.875rem);
1415
+ .nexus-badge-wrapper {
1416
+ position: relative;
1170
1417
  }
1171
- .nexus-page-btn {
1418
+ .nexus-badge {
1419
+ --nexus-badge-offset-x: 0px;
1420
+ --nexus-badge-offset-y: 0px;
1421
+ box-sizing: border-box;
1172
1422
  display: inline-flex;
1173
1423
  align-items: center;
1174
1424
  justify-content: center;
1175
- border-radius: var(--radius-corner-md, 0.375rem);
1176
- font-weight: 500;
1177
- transition-property: color, background-color;
1178
- transition-duration: 150ms;
1179
- user-select: none;
1180
- border: 1px solid transparent;
1181
- }
1182
- .nexus-page-btn:disabled {
1183
- opacity: 0.4;
1184
- pointer-events: none;
1185
- }
1186
- .nexus-page-btn--sm {
1187
- width: 1.75rem;
1188
- height: 1.75rem;
1425
+ min-width: 1.25rem;
1426
+ height: 1.25rem;
1427
+ padding: 0 0.35rem;
1428
+ border-radius: var(--radius-corner-full, 9999px);
1189
1429
  font-size: var(--text-text-xs, 0.75rem);
1430
+ font-weight: var(--font-weight-label-semibold-sm, 600);
1431
+ line-height: 1;
1432
+ color: var(--color-text-inverted);
1433
+ }
1434
+ .nexus-badge--positioned {
1435
+ position: absolute;
1436
+ top: 0;
1437
+ right: 0;
1438
+ z-index: 1;
1439
+ transform: translate(
1440
+ calc(50% + var(--nexus-badge-offset-x)),
1441
+ calc(-50% + var(--nexus-badge-offset-y))
1442
+ );
1443
+ }
1444
+ .nexus-badge--dot {
1445
+ min-width: 0;
1446
+ padding: 0;
1447
+ }
1448
+ .nexus-badge--dot.nexus-badge--sm {
1449
+ width: 0.375rem;
1450
+ height: 0.375rem;
1451
+ }
1452
+ .nexus-badge--dot.nexus-badge--md {
1453
+ width: 0.5rem;
1454
+ height: 0.5rem;
1455
+ }
1456
+ .nexus-badge--dot.nexus-badge--lg {
1457
+ width: 0.625rem;
1458
+ height: 0.625rem;
1459
+ }
1460
+ .nexus-badge--danger {
1461
+ background: var(--color-status-danger);
1462
+ color: var(--color-static-white);
1463
+ }
1464
+ .nexus-badge--primary {
1465
+ background: var(--color-accent-primary);
1466
+ color: var(--color-accent-on-primary);
1467
+ }
1468
+ .nexus-badge--secondary {
1469
+ background: var(--color-accent-secondary);
1470
+ color: var(--color-accent-on-secondary);
1471
+ }
1472
+ .nexus-badge--info {
1473
+ background: var(--color-status-info);
1474
+ color: var(--color-static-white);
1475
+ }
1476
+ .nexus-badge--success {
1477
+ background: var(--color-status-success);
1478
+ color: var(--color-static-white);
1479
+ }
1480
+ .nexus-badge--warning {
1481
+ background: var(--color-status-warning);
1482
+ color: var(--color-static-black);
1483
+ }
1484
+ .nexus-badge--sm:not(.nexus-badge--dot) {
1485
+ min-width: 1rem;
1486
+ height: 1rem;
1487
+ padding: 0 0.25rem;
1488
+ font-size: 0.625rem;
1489
+ }
1490
+ .nexus-badge--lg:not(.nexus-badge--dot) {
1491
+ min-width: 1.5rem;
1492
+ height: 1.5rem;
1493
+ padding: 0 0.45rem;
1494
+ font-size: var(--text-text-sm, 0.875rem);
1495
+ }
1496
+
1497
+ /* ═══════════════════════════════════════════
1498
+ Progress
1499
+ ═══════════════════════════════════════════ */
1500
+
1501
+ .nexus-progress-wrapper {
1502
+ display: flex;
1503
+ flex-direction: column;
1504
+ gap: var(--spacing-gap-xs, 0.25rem);
1505
+ width: 100%;
1506
+ }
1507
+ .nexus-progress__header {
1508
+ display: flex;
1509
+ justify-content: space-between;
1510
+ align-items: center;
1511
+ gap: var(--spacing-gap-sm, 0.5rem);
1512
+ }
1513
+ .nexus-progress__label {
1514
+ font-size: var(--text-text-sm, 0.875rem);
1515
+ color: var(--color-text-primary);
1516
+ }
1517
+ .nexus-progress__value {
1518
+ font-size: var(--text-text-sm, 0.875rem);
1519
+ color: var(--color-text-secondary);
1520
+ font-variant-numeric: tabular-nums;
1521
+ }
1522
+ .nexus-progress {
1523
+ position: relative;
1524
+ width: 100%;
1525
+ overflow: hidden;
1526
+ border-radius: var(--radius-corner-full, 9999px);
1527
+ background: var(--color-surface-strong);
1528
+ }
1529
+ .nexus-progress--sm {
1530
+ height: 0.25rem;
1531
+ }
1532
+ .nexus-progress--md {
1533
+ height: 0.375rem;
1534
+ }
1535
+ .nexus-progress--lg {
1536
+ height: 0.5rem;
1537
+ }
1538
+ .nexus-progress__bar {
1539
+ height: 100%;
1540
+ border-radius: inherit;
1541
+ transition:
1542
+ width var(--duration-transition-normal, 200ms) var(--ease-transition-normal, cubic-bezier(0, 0, 0.2, 1));
1543
+ }
1544
+ .nexus-progress--primary .nexus-progress__bar {
1545
+ background: var(--color-accent-primary);
1546
+ }
1547
+ .nexus-progress--success .nexus-progress__bar {
1548
+ background: var(--color-status-success);
1549
+ }
1550
+ .nexus-progress--warning .nexus-progress__bar {
1551
+ background: var(--color-status-warning);
1552
+ }
1553
+ .nexus-progress--danger .nexus-progress__bar {
1554
+ background: var(--color-status-danger);
1555
+ }
1556
+ .nexus-progress--info .nexus-progress__bar {
1557
+ background: var(--color-status-info);
1558
+ }
1559
+ .nexus-progress__bar--indeterminate {
1560
+ position: absolute;
1561
+ left: 0;
1562
+ top: 0;
1563
+ bottom: 0;
1564
+ width: 35% !important;
1565
+ animation: nexus-progress-indeterminate 1.1s var(--ease-transition-normal, cubic-bezier(0, 0, 0.2, 1))
1566
+ infinite;
1567
+ }
1568
+ @keyframes nexus-progress-indeterminate {
1569
+ 0% {
1570
+ transform: translateX(-100%);
1571
+ }
1572
+ 100% {
1573
+ transform: translateX(calc(100% / 0.35 * 3));
1574
+ }
1575
+ }
1576
+
1577
+ /* ═══════════════════════════════════════════
1578
+ Alert
1579
+ ═══════════════════════════════════════════ */
1580
+
1581
+ .nexus-alert {
1582
+ display: flex;
1583
+ align-items: flex-start;
1584
+ gap: var(--spacing-gap-sm, 0.5rem);
1585
+ padding: var(--spacing-padding-md, 1rem);
1586
+ border-radius: var(--radius-corner-md, 8px);
1587
+ border-width: var(--border-width-stroke-thin, 1px);
1588
+ border-style: solid;
1589
+ }
1590
+ .nexus-alert__icon {
1591
+ flex-shrink: 0;
1592
+ margin-top: 0.125rem;
1593
+ line-height: 0;
1594
+ }
1595
+ .nexus-alert__icon-svg {
1596
+ width: 1.25rem;
1597
+ height: 1.25rem;
1598
+ }
1599
+ .nexus-alert__body {
1600
+ flex: 1;
1601
+ min-width: 0;
1602
+ }
1603
+ .nexus-alert__title {
1604
+ margin: 0;
1605
+ font-weight: var(--font-weight-heading-h7, 600);
1606
+ font-size: var(--text-text-sm, 0.875rem);
1607
+ color: var(--color-text-primary);
1608
+ }
1609
+ .nexus-alert__description {
1610
+ margin-top: var(--spacing-gap-xs, 0.25rem);
1611
+ font-size: var(--text-text-sm, 0.875rem);
1612
+ color: var(--color-text-secondary);
1613
+ }
1614
+ .nexus-alert__action {
1615
+ flex-shrink: 0;
1616
+ align-self: center;
1617
+ }
1618
+ .nexus-alert__close {
1619
+ flex-shrink: 0;
1620
+ display: inline-flex;
1621
+ align-items: center;
1622
+ justify-content: center;
1623
+ margin: 0;
1624
+ padding: var(--spacing-padding-2xs, 0.25rem);
1625
+ border: none;
1626
+ border-radius: var(--radius-corner-sm, 4px);
1627
+ background: transparent;
1628
+ cursor: pointer;
1629
+ font: inherit;
1630
+ color: var(--color-icon-secondary);
1631
+ transition: color var(--duration-transition-fast, 150ms) var(--ease-transition-fast, ease);
1632
+ }
1633
+ .nexus-alert__close:hover {
1634
+ color: var(--color-icon-primary);
1635
+ }
1636
+ .nexus-alert__close-icon {
1637
+ width: 1rem;
1638
+ height: 1rem;
1639
+ }
1640
+ .nexus-alert--info {
1641
+ background: color-mix(in srgb, var(--color-status-info-dim) 45%, var(--color-surface-default));
1642
+ border-color: color-mix(in srgb, var(--color-status-info) 28%, var(--color-border-default));
1643
+ }
1644
+ .nexus-alert--info .nexus-alert__icon {
1645
+ color: var(--color-status-info-intense);
1646
+ }
1647
+ .nexus-alert--success {
1648
+ background: color-mix(in srgb, var(--color-status-success-dim) 45%, var(--color-surface-default));
1649
+ border-color: color-mix(in srgb, var(--color-status-success) 28%, var(--color-border-default));
1650
+ }
1651
+ .nexus-alert--success .nexus-alert__icon {
1652
+ color: var(--color-status-success-intense);
1653
+ }
1654
+ .nexus-alert--warning {
1655
+ background: color-mix(in srgb, var(--color-status-warning-dim) 45%, var(--color-surface-default));
1656
+ border-color: color-mix(in srgb, var(--color-status-warning) 28%, var(--color-border-default));
1657
+ }
1658
+ .nexus-alert--warning .nexus-alert__icon {
1659
+ color: var(--color-status-warning-intense);
1660
+ }
1661
+ .nexus-alert--danger {
1662
+ background: color-mix(in srgb, var(--color-status-danger-dim) 45%, var(--color-surface-default));
1663
+ border-color: color-mix(in srgb, var(--color-status-danger) 28%, var(--color-border-default));
1664
+ }
1665
+ .nexus-alert--danger .nexus-alert__icon {
1666
+ color: var(--color-status-danger-intense);
1667
+ }
1668
+
1669
+ /* ═══════════════════════════════════════════
1670
+ Pagination
1671
+ ═══════════════════════════════════════════ */
1672
+
1673
+ .nexus-pagination {
1674
+ display: flex;
1675
+ align-items: center;
1676
+ gap: var(--spacing-gap-xs, 0.25rem);
1677
+ }
1678
+ .nexus-pagination--sm {
1679
+ font-size: var(--text-text-xs, 0.75rem);
1680
+ }
1681
+ .nexus-pagination--md {
1682
+ font-size: var(--text-text-sm, 0.875rem);
1683
+ }
1684
+ .nexus-page-btn {
1685
+ display: inline-flex;
1686
+ align-items: center;
1687
+ justify-content: center;
1688
+ border-radius: var(--radius-corner-md, 0.375rem);
1689
+ font-weight: 500;
1690
+ transition-property: color, background-color;
1691
+ transition-duration: 150ms;
1692
+ user-select: none;
1693
+ border: 1px solid transparent;
1694
+ background: transparent;
1695
+ cursor: pointer;
1696
+ font-family: inherit;
1697
+ padding: 0;
1698
+ margin: 0;
1699
+ }
1700
+ .nexus-page-btn:disabled {
1701
+ opacity: 0.4;
1702
+ pointer-events: none;
1703
+ }
1704
+ .nexus-page-btn--sm {
1705
+ width: 1.75rem;
1706
+ height: 1.75rem;
1707
+ font-size: var(--text-text-xs, 0.75rem);
1708
+ }
1709
+ .nexus-page-btn--md {
1710
+ width: 2.25rem;
1711
+ height: 2.25rem;
1712
+ font-size: var(--text-text-sm, 0.875rem);
1190
1713
  }
1191
- .nexus-page-btn--md {
1192
- width: 2.25rem;
1193
- height: 2.25rem;
1194
- font-size: var(--text-text-sm, 0.875rem);
1195
- }
1196
1714
  .nexus-page-btn--active {
1197
1715
  background: var(--color-accent-primary);
1198
1716
  color: var(--color-static-white);
@@ -1240,6 +1758,12 @@
1240
1758
  outline: none;
1241
1759
  transition-property: color, background-color, border-color;
1242
1760
  transition-duration: 150ms;
1761
+ border: none;
1762
+ background: transparent;
1763
+ cursor: pointer;
1764
+ font-family: inherit;
1765
+ padding: 0;
1766
+ margin: 0;
1243
1767
  }
1244
1768
  .nexus-tab-trigger--line {
1245
1769
  padding: 0.625rem var(--spacing-padding-md, 1rem);
@@ -1425,8 +1949,13 @@
1425
1949
  justify-content: space-between;
1426
1950
  border-radius: var(--radius-corner-sm, 0.25rem);
1427
1951
  border: 1px solid var(--color-border-default);
1952
+ background: var(--color-surface-default, transparent);
1428
1953
  color: var(--color-text-primary);
1429
1954
  font-size: var(--text-text-sm, 0.875rem);
1955
+ font-family: inherit;
1956
+ cursor: pointer;
1957
+ padding: 0;
1958
+ margin: 0;
1430
1959
  transition-property: border-color;
1431
1960
  transition-duration: 200ms;
1432
1961
  }
@@ -1512,12 +2041,24 @@
1512
2041
  animation: nexus-select-slide-out 100ms ease-in forwards;
1513
2042
  }
1514
2043
  @keyframes nexus-select-slide-in {
1515
- from { opacity: 0; transform: translateY(-4px) scaleY(0.96); }
1516
- to { opacity: 1; transform: translateY(0) scaleY(1); }
2044
+ from {
2045
+ opacity: 0;
2046
+ transform: translateY(-4px) scaleY(0.96);
2047
+ }
2048
+ to {
2049
+ opacity: 1;
2050
+ transform: translateY(0) scaleY(1);
2051
+ }
1517
2052
  }
1518
2053
  @keyframes nexus-select-slide-out {
1519
- from { opacity: 1; transform: translateY(0) scaleY(1); }
1520
- to { opacity: 0; transform: translateY(-4px) scaleY(0.96); }
2054
+ from {
2055
+ opacity: 1;
2056
+ transform: translateY(0) scaleY(1);
2057
+ }
2058
+ to {
2059
+ opacity: 0;
2060
+ transform: translateY(-4px) scaleY(0.96);
2061
+ }
1521
2062
  }
1522
2063
  .nexus-select-content--sm {
1523
2064
  width: 4rem;
@@ -1561,70 +2102,359 @@
1561
2102
  }
1562
2103
 
1563
2104
  /* ═══════════════════════════════════════════
1564
- Tooltip
2105
+ DropdownMenu
1565
2106
  ═══════════════════════════════════════════ */
1566
2107
 
1567
- .nexus-tooltip-content {
1568
- z-index: 50;
1569
- display: flex;
2108
+ .nexus-dropdown-content {
2109
+ position: relative;
2110
+ z-index: var(--z-index-layer-dropdown, 10);
2111
+ min-width: 10rem;
1570
2112
  overflow: hidden;
1571
- border-radius: var(--radius-corner-md, 0.375rem);
1572
- padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
1573
- font-size: var(--text-text-sm, 0.875rem);
1574
- }
1575
- .nexus-tooltip--light {
1576
- border: 1px solid var(--color-border-default);
1577
- background: var(--color-static-white);
1578
- color: var(--color-static-black);
1579
- box-shadow: var(--shadow-comp-md);
1580
- }
1581
- .nexus-tooltip--dark {
1582
- border: none;
1583
- background: var(--color-static-black);
1584
- color: var(--color-static-white);
1585
- }
1586
- .nexus-tooltip-arrow--dark {
1587
- fill: var(--color-static-black);
1588
- }
1589
- .nexus-tooltip-arrow--light {
1590
- fill: var(--color-static-white);
1591
- }
1592
- .nexus-tooltip-trigger {
1593
- cursor: default;
1594
- }
1595
-
1596
- /* ═══════════════════════════════════════════
1597
- Popover
1598
- ═══════════════════════════════════════════ */
1599
-
1600
- .nexus-popover-content {
1601
- z-index: 50;
1602
- border-radius: var(--radius-corner-lg, 0.5rem);
2113
+ border-radius: var(--radius-corner-md, 0.5rem);
1603
2114
  border: 1px solid var(--color-border-default);
1604
- padding: var(--spacing-padding-md, 1rem);
1605
- box-shadow: var(--shadow-comp-lg);
1606
- outline: none;
1607
2115
  background: var(--color-surface-default);
2116
+ padding: var(--spacing-padding-xs, 0.5rem);
2117
+ box-shadow: var(--shadow-comp-lg);
1608
2118
  color: var(--color-text-primary);
1609
- transform-origin: var(--radix-popover-content-transform-origin);
2119
+ transform-origin: var(--radix-dropdown-menu-content-transform-origin);
1610
2120
  will-change: transform, opacity;
1611
2121
  }
1612
- .nexus-popover-content[data-state='open'] {
1613
- animation: nexus-popover-in 150ms ease-out;
1614
- }
1615
- .nexus-popover-content[data-state='closed'] {
1616
- animation: nexus-popover-out 100ms ease-in forwards;
1617
- }
1618
- @keyframes nexus-popover-in {
1619
- from { opacity: 0; transform: scale(0.95); }
1620
- to { opacity: 1; transform: scale(1); }
2122
+ .nexus-dropdown-content[data-state='open'] {
2123
+ animation: nexus-dropdown-in 150ms ease-out;
1621
2124
  }
1622
- @keyframes nexus-popover-out {
1623
- from { opacity: 1; transform: scale(1); }
1624
- to { opacity: 0; transform: scale(0.95); }
2125
+ .nexus-dropdown-content[data-state='closed'] {
2126
+ animation: nexus-dropdown-out 100ms ease-in forwards;
1625
2127
  }
1626
- .nexus-popover-arrow {
1627
- fill: var(--color-surface-default);
2128
+ @keyframes nexus-dropdown-in {
2129
+ from {
2130
+ opacity: 0;
2131
+ transform: scale(0.96);
2132
+ }
2133
+ to {
2134
+ opacity: 1;
2135
+ transform: scale(1);
2136
+ }
2137
+ }
2138
+ @keyframes nexus-dropdown-out {
2139
+ from {
2140
+ opacity: 1;
2141
+ transform: scale(1);
2142
+ }
2143
+ to {
2144
+ opacity: 0;
2145
+ transform: scale(0.96);
2146
+ }
2147
+ }
2148
+ .nexus-dropdown-separator {
2149
+ margin: var(--spacing-padding-xs, 0.5rem) calc(-1 * var(--spacing-padding-xs, 0.5rem));
2150
+ height: 1px;
2151
+ background: var(--color-border-default);
2152
+ }
2153
+ .nexus-dropdown-item {
2154
+ position: relative;
2155
+ display: flex;
2156
+ width: 100%;
2157
+ cursor: default;
2158
+ align-items: center;
2159
+ gap: var(--spacing-gap-sm, 0.5rem);
2160
+ border-radius: var(--radius-corner-sm, 0.25rem);
2161
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
2162
+ font-size: var(--text-text-sm, 0.875rem);
2163
+ color: var(--color-text-primary);
2164
+ outline: none;
2165
+ user-select: none;
2166
+ transition: background-color 150ms ease;
2167
+ }
2168
+ .nexus-dropdown-item[data-highlighted] {
2169
+ background: var(--color-surface-hover);
2170
+ }
2171
+ .nexus-dropdown-item[data-disabled] {
2172
+ pointer-events: none;
2173
+ opacity: var(--opacity-disabled-element, 0.4);
2174
+ }
2175
+ .nexus-dropdown-item--danger {
2176
+ color: var(--color-status-danger);
2177
+ }
2178
+ .nexus-dropdown-item--danger[data-highlighted] {
2179
+ background: var(--color-status-danger-dim);
2180
+ color: var(--color-status-danger-intense);
2181
+ }
2182
+ .nexus-dropdown-item__icon {
2183
+ display: inline-flex;
2184
+ flex-shrink: 0;
2185
+ color: var(--color-icon-secondary);
2186
+ }
2187
+ .nexus-dropdown-item--danger .nexus-dropdown-item__icon {
2188
+ color: var(--color-status-danger);
2189
+ }
2190
+
2191
+ /* ═══════════════════════════════════════════
2192
+ ToggleGroup
2193
+ ═══════════════════════════════════════════ */
2194
+
2195
+ .nexus-toggle-group {
2196
+ display: inline-flex;
2197
+ align-items: stretch;
2198
+ position: relative;
2199
+ border-radius: var(--radius-corner-md, 0.5rem);
2200
+ }
2201
+ .nexus-toggle-group--default {
2202
+ background: var(--color-surface-subtle);
2203
+ padding: var(--spacing-padding-2xs, 0.25rem);
2204
+ gap: var(--spacing-gap-xs, 0.25rem);
2205
+ }
2206
+
2207
+ /* ── Sliding indicator ── */
2208
+ .nexus-toggle-group__indicator {
2209
+ position: absolute;
2210
+ top: 0;
2211
+ left: 0;
2212
+ border-radius: var(--radius-corner-sm, 0.25rem);
2213
+ background: var(--color-surface-default);
2214
+ box-shadow: var(--shadow-sm);
2215
+ pointer-events: none;
2216
+ z-index: 0;
2217
+ will-change: transform, width;
2218
+ }
2219
+ .nexus-toggle-group__indicator--animated {
2220
+ transition:
2221
+ transform 200ms cubic-bezier(0, 0, 0.2, 1),
2222
+ width 200ms cubic-bezier(0, 0, 0.2, 1);
2223
+ }
2224
+ .nexus-toggle-group--outline {
2225
+ border: 1px solid var(--color-border-default);
2226
+ padding: var(--spacing-padding-2xs, 0.25rem);
2227
+ gap: 0;
2228
+ }
2229
+ .nexus-toggle-group__item {
2230
+ display: inline-flex;
2231
+ align-items: center;
2232
+ justify-content: center;
2233
+ gap: var(--spacing-gap-xs, 0.25rem);
2234
+ border-radius: var(--radius-corner-sm, 0.25rem);
2235
+ border: none;
2236
+ background: transparent;
2237
+ font-size: var(--text-text-sm, 0.875rem);
2238
+ font-weight: var(--font-weight-text-medium-sm, 500);
2239
+ color: var(--color-text-secondary);
2240
+ cursor: pointer;
2241
+ transition: color var(--duration-transition-normal, 200ms) var(--ease-transition-fast);
2242
+ outline: none;
2243
+ position: relative;
2244
+ z-index: 1;
2245
+ }
2246
+ .nexus-toggle-group__item:focus-visible {
2247
+ box-shadow: 0 0 0 2px var(--color-surface-default), 0 0 0 4px var(--color-accent-primary-focus);
2248
+ }
2249
+ .nexus-toggle-group__item[data-disabled] {
2250
+ pointer-events: none;
2251
+ opacity: var(--opacity-disabled-element, 0.4);
2252
+ }
2253
+ .nexus-toggle-group--default .nexus-toggle-group__item[data-state='on'] {
2254
+ color: var(--color-text-primary);
2255
+ }
2256
+ .nexus-toggle-group--outline .nexus-toggle-group__item {
2257
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
2258
+ }
2259
+ .nexus-toggle-group--outline .nexus-toggle-group__item[data-state='on'] {
2260
+ background: var(--color-accent-primary-dim);
2261
+ color: var(--color-accent-primary-intense);
2262
+ }
2263
+ .nexus-toggle-group--outline .nexus-toggle-group__item:not([data-state='on']):hover {
2264
+ background: var(--color-surface-hover);
2265
+ color: var(--color-text-primary);
2266
+ }
2267
+ .nexus-toggle-group--sm .nexus-toggle-group__item {
2268
+ min-height: var(--size-control-sm, 2rem);
2269
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
2270
+ }
2271
+ .nexus-toggle-group--md .nexus-toggle-group__item {
2272
+ min-height: var(--size-control-md, 2.5rem);
2273
+ padding-inline: var(--spacing-padding-md, 1rem);
2274
+ }
2275
+ .nexus-toggle-group--lg .nexus-toggle-group__item {
2276
+ min-height: var(--size-control-lg, 3rem);
2277
+ padding-inline: var(--spacing-padding-lg, 1.5rem);
2278
+ }
2279
+ .nexus-toggle-group__icon {
2280
+ display: inline-flex;
2281
+ flex-shrink: 0;
2282
+ color: var(--color-icon-secondary);
2283
+ }
2284
+ .nexus-toggle-group__item[data-state='on'] .nexus-toggle-group__icon {
2285
+ color: var(--color-icon-primary);
2286
+ }
2287
+
2288
+ /* ═══════════════════════════════════════════
2289
+ Slider
2290
+ ═══════════════════════════════════════════ */
2291
+
2292
+ .nexus-slider-wrapper {
2293
+ display: flex;
2294
+ width: 100%;
2295
+ flex-direction: column;
2296
+ gap: var(--spacing-gap-sm, 0.5rem);
2297
+ }
2298
+ .nexus-slider__header {
2299
+ display: flex;
2300
+ align-items: center;
2301
+ justify-content: space-between;
2302
+ gap: var(--spacing-gap-md, 1rem);
2303
+ }
2304
+ .nexus-slider__label {
2305
+ font-size: var(--text-label-md, 0.875rem);
2306
+ font-weight: var(--font-weight-label-md, 500);
2307
+ color: var(--color-text-primary);
2308
+ }
2309
+ .nexus-slider__value {
2310
+ font-size: var(--text-text-sm, 0.875rem);
2311
+ font-variant-numeric: tabular-nums;
2312
+ color: var(--color-text-secondary);
2313
+ }
2314
+ .nexus-slider {
2315
+ position: relative;
2316
+ display: flex;
2317
+ width: 100%;
2318
+ touch-action: none;
2319
+ user-select: none;
2320
+ align-items: center;
2321
+ }
2322
+ .nexus-slider[data-disabled] {
2323
+ opacity: var(--opacity-disabled-element, 0.4);
2324
+ pointer-events: none;
2325
+ }
2326
+ .nexus-slider__track {
2327
+ position: relative;
2328
+ flex-grow: 1;
2329
+ overflow: hidden;
2330
+ border-radius: var(--radius-corner-full, 9999px);
2331
+ background: var(--color-surface-strong);
2332
+ }
2333
+ .nexus-slider__range {
2334
+ position: absolute;
2335
+ height: 100%;
2336
+ border-radius: var(--radius-corner-full, 9999px);
2337
+ background: var(--color-accent-primary);
2338
+ }
2339
+ .nexus-slider__thumb {
2340
+ display: block;
2341
+ flex-shrink: 0;
2342
+ border-radius: var(--radius-corner-full, 9999px);
2343
+ border: 2px solid var(--color-accent-primary);
2344
+ background: var(--color-surface-default);
2345
+ box-shadow: var(--shadow-sm);
2346
+ outline: none;
2347
+ transition:
2348
+ box-shadow 150ms ease,
2349
+ transform 150ms ease;
2350
+ }
2351
+ .nexus-slider__thumb:hover {
2352
+ box-shadow: var(--shadow-md);
2353
+ }
2354
+ .nexus-slider__thumb:focus-visible {
2355
+ box-shadow:
2356
+ 0 0 0 2px var(--color-surface-default),
2357
+ 0 0 0 4px var(--color-accent-primary-focus);
2358
+ }
2359
+ .nexus-slider--sm .nexus-slider__track {
2360
+ height: 0.25rem;
2361
+ }
2362
+ .nexus-slider--sm .nexus-slider__thumb {
2363
+ width: 0.875rem;
2364
+ height: 0.875rem;
2365
+ }
2366
+ .nexus-slider--md .nexus-slider__track {
2367
+ height: 0.375rem;
2368
+ }
2369
+ .nexus-slider--md .nexus-slider__thumb {
2370
+ width: 1.125rem;
2371
+ height: 1.125rem;
2372
+ }
2373
+ .nexus-slider--lg .nexus-slider__track {
2374
+ height: 0.5rem;
2375
+ }
2376
+ .nexus-slider--lg .nexus-slider__thumb {
2377
+ width: 1.25rem;
2378
+ height: 1.25rem;
2379
+ }
2380
+
2381
+ /* ═══════════════════════════════════════════
2382
+ Tooltip
2383
+ ═══════════════════════════════════════════ */
2384
+
2385
+ .nexus-tooltip-content {
2386
+ z-index: 50;
2387
+ display: flex;
2388
+ overflow: hidden;
2389
+ border-radius: var(--radius-corner-md, 0.375rem);
2390
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
2391
+ font-size: var(--text-text-sm, 0.875rem);
2392
+ }
2393
+ .nexus-tooltip--light {
2394
+ border: 1px solid var(--color-border-default);
2395
+ background: var(--color-static-white);
2396
+ color: var(--color-static-black);
2397
+ box-shadow: var(--shadow-comp-md);
2398
+ }
2399
+ .nexus-tooltip--dark {
2400
+ border: none;
2401
+ background: var(--color-static-black);
2402
+ color: var(--color-static-white);
2403
+ }
2404
+ .nexus-tooltip-arrow--dark {
2405
+ fill: var(--color-static-black);
2406
+ }
2407
+ .nexus-tooltip-arrow--light {
2408
+ fill: var(--color-static-white);
2409
+ }
2410
+ .nexus-tooltip-trigger {
2411
+ cursor: default;
2412
+ }
2413
+
2414
+ /* ═══════════════════════════════════════════
2415
+ Popover
2416
+ ═══════════════════════════════════════════ */
2417
+
2418
+ .nexus-popover-content {
2419
+ z-index: 50;
2420
+ border-radius: var(--radius-corner-lg, 0.5rem);
2421
+ border: 1px solid var(--color-border-default);
2422
+ padding: var(--spacing-padding-md, 1rem);
2423
+ box-shadow: var(--shadow-comp-lg);
2424
+ outline: none;
2425
+ background: var(--color-surface-default);
2426
+ color: var(--color-text-primary);
2427
+ transform-origin: var(--radix-popover-content-transform-origin);
2428
+ will-change: transform, opacity;
2429
+ }
2430
+ .nexus-popover-content[data-state='open'] {
2431
+ animation: nexus-popover-in 150ms ease-out;
2432
+ }
2433
+ .nexus-popover-content[data-state='closed'] {
2434
+ animation: nexus-popover-out 100ms ease-in forwards;
2435
+ }
2436
+ @keyframes nexus-popover-in {
2437
+ from {
2438
+ opacity: 0;
2439
+ transform: scale(0.95);
2440
+ }
2441
+ to {
2442
+ opacity: 1;
2443
+ transform: scale(1);
2444
+ }
2445
+ }
2446
+ @keyframes nexus-popover-out {
2447
+ from {
2448
+ opacity: 1;
2449
+ transform: scale(1);
2450
+ }
2451
+ to {
2452
+ opacity: 0;
2453
+ transform: scale(0.95);
2454
+ }
2455
+ }
2456
+ .nexus-popover-arrow {
2457
+ fill: var(--color-surface-default);
1628
2458
  }
1629
2459
 
1630
2460
  /* ═══════════════════════════════════════════
@@ -1727,7 +2557,15 @@
1727
2557
  flex: 1;
1728
2558
  align-items: center;
1729
2559
  justify-content: space-between;
2560
+ padding: 0;
1730
2561
  padding-block: var(--spacing-padding-md, 1rem);
2562
+ margin: 0;
2563
+ border: none;
2564
+ background: transparent;
2565
+ cursor: pointer;
2566
+ font: inherit;
2567
+ color: inherit;
2568
+ text-align: left;
1731
2569
  transition: all 150ms;
1732
2570
  }
1733
2571
  .nexus-accordion-trigger[data-state='open'] > .nexus-accordion-chevron {
@@ -1832,6 +2670,10 @@
1832
2670
  border: 1px solid var(--color-border-default);
1833
2671
  box-shadow: var(--shadow-comp-sm);
1834
2672
  color: var(--color-text-primary);
2673
+ cursor: pointer;
2674
+ font: inherit;
2675
+ padding: 0;
2676
+ margin: 0;
1835
2677
  transition-property: background-color;
1836
2678
  transition-duration: 150ms;
1837
2679
  }
@@ -1862,6 +2704,9 @@
1862
2704
  width: 0.5rem;
1863
2705
  height: 0.5rem;
1864
2706
  border-radius: 9999px;
2707
+ border: none;
2708
+ padding: 0;
2709
+ cursor: pointer;
1865
2710
  transition-property: background-color;
1866
2711
  transition-duration: 150ms;
1867
2712
  }
@@ -1908,11 +2753,7 @@
1908
2753
  color: var(--color-status-positive);
1909
2754
  }
1910
2755
  .nexus-toast--error {
1911
- border-color: color-mix(
1912
- in srgb,
1913
- var(--color-status-danger) 30%,
1914
- transparent
1915
- );
2756
+ border-color: color-mix(in srgb, var(--color-status-danger) 30%, transparent);
1916
2757
  background: color-mix(in srgb, var(--color-status-danger) 10%, transparent);
1917
2758
  color: var(--color-status-danger);
1918
2759
  }
@@ -2209,6 +3050,9 @@
2209
3050
  cursor: pointer;
2210
3051
  align-items: center;
2211
3052
  justify-content: flex-end;
3053
+ border: none;
3054
+ background: transparent;
3055
+ padding: 0;
2212
3056
  }
2213
3057
  .nexus-modal-close-btn--bottom-sheet {
2214
3058
  position: relative;
@@ -2567,3 +3411,589 @@
2567
3411
  opacity: 1;
2568
3412
  }
2569
3413
  }
3414
+
3415
+ /* ═══════════════════════════════════════════
3416
+ EmptyState
3417
+ ═══════════════════════════════════════════ */
3418
+
3419
+ .nexus-empty-state {
3420
+ display: flex;
3421
+ flex-direction: column;
3422
+ align-items: center;
3423
+ justify-content: center;
3424
+ text-align: center;
3425
+ gap: var(--spacing-gap-sm, 0.5rem);
3426
+ padding: var(--spacing-padding-lg, 1.5rem);
3427
+ color: var(--color-text-primary);
3428
+ }
3429
+ .nexus-empty-state__icon {
3430
+ display: flex;
3431
+ align-items: center;
3432
+ justify-content: center;
3433
+ margin-bottom: var(--spacing-gap-xs, 0.25rem);
3434
+ color: var(--color-icon-muted);
3435
+ }
3436
+ .nexus-empty-state__default-icon {
3437
+ width: var(--size-icon-xl, 2rem);
3438
+ height: var(--size-icon-xl, 2rem);
3439
+ }
3440
+ .nexus-empty-state--sm .nexus-empty-state__default-icon {
3441
+ width: var(--size-icon-lg, 1.5rem);
3442
+ height: var(--size-icon-lg, 1.5rem);
3443
+ }
3444
+ .nexus-empty-state--lg .nexus-empty-state__default-icon {
3445
+ width: var(--size-control-md, 2.5rem);
3446
+ height: var(--size-control-md, 2.5rem);
3447
+ }
3448
+ .nexus-empty-state__title {
3449
+ margin: 0;
3450
+ font-size: var(--text-heading-h6, 1rem);
3451
+ font-weight: var(--font-weight-heading-h6, 600);
3452
+ letter-spacing: var(--letter-spacing-heading-h6, 0);
3453
+ color: var(--color-text-primary);
3454
+ }
3455
+ .nexus-empty-state__description {
3456
+ margin: 0;
3457
+ max-width: 24rem;
3458
+ font-size: var(--text-text-sm, 0.875rem);
3459
+ font-weight: var(--font-weight-text-sm, 400);
3460
+ letter-spacing: var(--letter-spacing-text-sm, -0.01em);
3461
+ color: var(--color-text-secondary);
3462
+ }
3463
+ .nexus-empty-state__action {
3464
+ margin-top: var(--spacing-gap-sm, 0.5rem);
3465
+ }
3466
+ .nexus-empty-state--sm {
3467
+ padding: var(--spacing-padding-md, 1rem);
3468
+ gap: var(--spacing-gap-xs, 0.25rem);
3469
+ }
3470
+ .nexus-empty-state--sm .nexus-empty-state__title {
3471
+ font-size: var(--text-text-semibold-sm, 0.875rem);
3472
+ }
3473
+ .nexus-empty-state--sm .nexus-empty-state__description {
3474
+ font-size: var(--text-text-xs, 0.75rem);
3475
+ }
3476
+ .nexus-empty-state--lg {
3477
+ padding: var(--spacing-padding-xl, 2rem);
3478
+ gap: var(--spacing-gap-md, 1rem);
3479
+ }
3480
+ .nexus-empty-state--lg .nexus-empty-state__title {
3481
+ font-size: var(--text-heading-h5, 1.125rem);
3482
+ }
3483
+
3484
+ /* ═══════════════════════════════════════════
3485
+ Breadcrumb
3486
+ ═══════════════════════════════════════════ */
3487
+
3488
+ .nexus-breadcrumb {
3489
+ font-size: var(--text-text-sm, 0.875rem);
3490
+ line-height: 1.25;
3491
+ }
3492
+ .nexus-breadcrumb__list {
3493
+ display: flex;
3494
+ flex-wrap: wrap;
3495
+ align-items: center;
3496
+ list-style: none;
3497
+ margin: 0;
3498
+ padding: 0;
3499
+ gap: 0;
3500
+ }
3501
+ .nexus-breadcrumb__item {
3502
+ display: inline-flex;
3503
+ align-items: center;
3504
+ }
3505
+ .nexus-breadcrumb__separator {
3506
+ display: inline-flex;
3507
+ align-items: center;
3508
+ margin: 0 var(--spacing-gap-xs, 0.25rem);
3509
+ color: var(--color-icon-tertiary);
3510
+ user-select: none;
3511
+ }
3512
+ .nexus-breadcrumb__separator-icon {
3513
+ width: var(--size-icon-xs, 0.75rem);
3514
+ height: var(--size-icon-xs, 0.75rem);
3515
+ }
3516
+ .nexus-breadcrumb__link {
3517
+ color: var(--color-text-secondary);
3518
+ text-decoration: none;
3519
+ transition: color 150ms ease;
3520
+ }
3521
+ .nexus-breadcrumb__link:hover {
3522
+ color: var(--color-text-primary);
3523
+ }
3524
+ .nexus-breadcrumb__link--btn {
3525
+ border: none;
3526
+ background: none;
3527
+ cursor: pointer;
3528
+ font: inherit;
3529
+ padding: 0;
3530
+ }
3531
+ .nexus-breadcrumb__current {
3532
+ color: var(--color-text-primary);
3533
+ font-weight: var(--font-weight-text-medium-sm, 500);
3534
+ }
3535
+ .nexus-breadcrumb__ellipsis {
3536
+ color: var(--color-text-tertiary);
3537
+ user-select: none;
3538
+ }
3539
+
3540
+ /* ═══════════════════════════════════════════
3541
+ Stepper
3542
+ ═══════════════════════════════════════════ */
3543
+
3544
+ .nexus-stepper {
3545
+ width: 100%;
3546
+ }
3547
+
3548
+ /* ── Horizontal ── */
3549
+ .nexus-stepper--horizontal {
3550
+ display: flex;
3551
+ flex-direction: row;
3552
+ align-items: flex-start;
3553
+ }
3554
+ .nexus-stepper--horizontal .nexus-stepper__step {
3555
+ flex: 1;
3556
+ min-width: 0;
3557
+ display: flex;
3558
+ flex-direction: column;
3559
+ align-items: center;
3560
+ text-align: center;
3561
+ }
3562
+ .nexus-stepper--horizontal .nexus-stepper__indicator-wrap {
3563
+ display: flex;
3564
+ flex-direction: row;
3565
+ align-items: center;
3566
+ width: 100%;
3567
+ justify-content: center;
3568
+ }
3569
+ .nexus-stepper--horizontal .nexus-stepper__connector {
3570
+ flex: 1;
3571
+ height: 2px;
3572
+ background: var(--color-border-default);
3573
+ transition: background var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3574
+ }
3575
+ .nexus-stepper--horizontal .nexus-stepper__connector--hidden {
3576
+ visibility: hidden;
3577
+ }
3578
+ .nexus-stepper--horizontal .nexus-stepper__connector--completed {
3579
+ background: var(--color-accent-primary);
3580
+ }
3581
+ .nexus-stepper--horizontal .nexus-stepper__content {
3582
+ margin-top: var(--spacing-gap-sm, 0.5rem);
3583
+ padding: 0 var(--spacing-padding-2xs, 0.25rem);
3584
+ }
3585
+
3586
+ /* ── Vertical ── */
3587
+ .nexus-stepper--vertical {
3588
+ display: flex;
3589
+ flex-direction: column;
3590
+ gap: 0;
3591
+ }
3592
+ .nexus-stepper--vertical .nexus-stepper__step {
3593
+ display: flex;
3594
+ flex-direction: row;
3595
+ align-items: stretch;
3596
+ gap: var(--spacing-gap-sm, 0.5rem);
3597
+ }
3598
+ .nexus-stepper--vertical .nexus-stepper__indicator-wrap {
3599
+ display: flex;
3600
+ flex-direction: column;
3601
+ align-items: center;
3602
+ flex-shrink: 0;
3603
+ }
3604
+ .nexus-stepper--vertical .nexus-stepper__connector {
3605
+ width: 2px;
3606
+ flex: 1;
3607
+ min-height: var(--spacing-padding-sm, 0.75rem);
3608
+ background: var(--color-border-default);
3609
+ transition: background var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3610
+ }
3611
+ .nexus-stepper--vertical .nexus-stepper__connector--completed {
3612
+ background: var(--color-accent-primary);
3613
+ }
3614
+ .nexus-stepper--vertical .nexus-stepper__content {
3615
+ padding: var(--spacing-padding-xs, 0.5rem) 0;
3616
+ }
3617
+
3618
+ /* ── Indicator (공통) ── */
3619
+ .nexus-stepper__indicator {
3620
+ display: inline-flex;
3621
+ align-items: center;
3622
+ justify-content: center;
3623
+ flex-shrink: 0;
3624
+ width: var(--size-control-sm, 2rem);
3625
+ height: var(--size-control-sm, 2rem);
3626
+ border-radius: var(--radius-corner-full, 9999px);
3627
+ border: 2px solid var(--color-border-medium);
3628
+ background: var(--color-surface-default);
3629
+ font-size: var(--text-text-sm, 0.875rem);
3630
+ font-weight: var(--font-weight-text-medium-sm, 500);
3631
+ color: var(--color-text-secondary);
3632
+ transition: all var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3633
+ }
3634
+ .nexus-stepper--sm .nexus-stepper__indicator {
3635
+ width: 1.75rem;
3636
+ height: 1.75rem;
3637
+ font-size: var(--text-text-xs, 0.75rem);
3638
+ }
3639
+ .nexus-stepper__check {
3640
+ width: var(--size-icon-sm, 1rem);
3641
+ height: var(--size-icon-sm, 1rem);
3642
+ }
3643
+ .nexus-stepper--sm .nexus-stepper__check {
3644
+ width: var(--size-icon-xs, 0.75rem);
3645
+ height: var(--size-icon-xs, 0.75rem);
3646
+ }
3647
+
3648
+ /* ── State colors ── */
3649
+ .nexus-stepper__step--completed .nexus-stepper__indicator {
3650
+ border-color: var(--color-accent-primary);
3651
+ background: var(--color-accent-primary);
3652
+ color: var(--color-accent-on-primary);
3653
+ }
3654
+ .nexus-stepper__step--active .nexus-stepper__indicator {
3655
+ border-color: var(--color-accent-primary);
3656
+ color: var(--color-accent-primary);
3657
+ background: var(--color-surface-default);
3658
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent-primary) 20%, transparent);
3659
+ }
3660
+ .nexus-stepper__step--error .nexus-stepper__indicator {
3661
+ border-color: var(--color-status-danger);
3662
+ color: var(--color-status-danger);
3663
+ background: var(--color-surface-default);
3664
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-status-danger) 20%, transparent);
3665
+ }
3666
+ .nexus-stepper__step--pending .nexus-stepper__indicator {
3667
+ border-color: var(--color-border-default);
3668
+ color: var(--color-text-tertiary);
3669
+ }
3670
+
3671
+ /* ── Labels ── */
3672
+ .nexus-stepper__label {
3673
+ display: block;
3674
+ font-size: var(--text-text-sm, 0.875rem);
3675
+ font-weight: var(--font-weight-text-medium-sm, 500);
3676
+ color: var(--color-text-primary);
3677
+ }
3678
+ .nexus-stepper--sm .nexus-stepper__label {
3679
+ font-size: var(--text-text-xs, 0.75rem);
3680
+ }
3681
+ .nexus-stepper__description {
3682
+ display: block;
3683
+ margin-top: var(--spacing-gap-xs, 0.25rem);
3684
+ font-size: var(--text-text-xs, 0.75rem);
3685
+ color: var(--color-text-secondary);
3686
+ }
3687
+ .nexus-stepper__step--pending .nexus-stepper__label {
3688
+ color: var(--color-text-secondary);
3689
+ }
3690
+ .nexus-stepper__step--pending .nexus-stepper__description {
3691
+ color: var(--color-text-muted);
3692
+ }
3693
+
3694
+ /* ═══════════════════════════════════════════
3695
+ TagInput
3696
+ ═══════════════════════════════════════════ */
3697
+
3698
+ .nexus-tag-input-wrapper {
3699
+ display: flex;
3700
+ flex-direction: column;
3701
+ gap: var(--spacing-gap-xs, 0.25rem);
3702
+ }
3703
+ .nexus-tag-input__label {
3704
+ font-size: var(--text-label-md, 0.875rem);
3705
+ font-weight: var(--font-weight-label-md, 500);
3706
+ color: var(--color-text-primary);
3707
+ }
3708
+ .nexus-tag-input {
3709
+ display: flex;
3710
+ flex-wrap: wrap;
3711
+ align-items: center;
3712
+ gap: var(--spacing-gap-xs, 0.25rem);
3713
+ padding: var(--spacing-padding-xs, 0.5rem);
3714
+ border: var(--border-width-stroke-default, 1px) solid var(--color-border-default);
3715
+ border-radius: var(--radius-corner-md, 0.5rem);
3716
+ background: var(--color-surface-default);
3717
+ cursor: text;
3718
+ transition: border-color 150ms ease;
3719
+ }
3720
+ .nexus-tag-input:focus-within {
3721
+ border-color: var(--color-border-default-focus, var(--color-accent-primary));
3722
+ }
3723
+ .nexus-tag-input--disabled {
3724
+ opacity: var(--opacity-disabled-element, 0.4);
3725
+ cursor: not-allowed;
3726
+ pointer-events: none;
3727
+ }
3728
+ .nexus-tag-input--sm {
3729
+ padding: var(--spacing-padding-2xs, 0.25rem);
3730
+ gap: 0.125rem;
3731
+ font-size: var(--text-text-xs, 0.75rem);
3732
+ }
3733
+ .nexus-tag-input--md {
3734
+ font-size: var(--text-text-sm, 0.875rem);
3735
+ }
3736
+ .nexus-tag-input--lg {
3737
+ padding: var(--spacing-padding-sm, 0.75rem);
3738
+ font-size: var(--text-text-base, 1rem);
3739
+ }
3740
+ .nexus-tag-input__tag {
3741
+ display: inline-flex;
3742
+ align-items: center;
3743
+ gap: 0.25rem;
3744
+ padding: 0.125rem 0.5rem;
3745
+ border-radius: var(--radius-corner-sm, 0.25rem);
3746
+ background: var(--color-surface-subtle);
3747
+ color: var(--color-text-primary);
3748
+ font-size: inherit;
3749
+ line-height: 1.5;
3750
+ white-space: nowrap;
3751
+ }
3752
+ .nexus-tag-input__tag-close {
3753
+ display: inline-flex;
3754
+ align-items: center;
3755
+ justify-content: center;
3756
+ border: none;
3757
+ background: transparent;
3758
+ cursor: pointer;
3759
+ padding: 0;
3760
+ margin: 0;
3761
+ color: var(--color-icon-tertiary);
3762
+ transition: color 150ms;
3763
+ }
3764
+ .nexus-tag-input__tag-close:hover {
3765
+ color: var(--color-icon-primary);
3766
+ }
3767
+ .nexus-tag-input__tag-close-icon {
3768
+ width: 0.75rem;
3769
+ height: 0.75rem;
3770
+ }
3771
+ .nexus-tag-input__input {
3772
+ flex: 1;
3773
+ min-width: 4rem;
3774
+ border: none;
3775
+ outline: none;
3776
+ background: transparent;
3777
+ font: inherit;
3778
+ color: var(--color-text-primary);
3779
+ padding: 0.125rem 0;
3780
+ }
3781
+ .nexus-tag-input__input::placeholder {
3782
+ color: var(--color-text-muted);
3783
+ }
3784
+ .nexus-tag-input__description {
3785
+ font-size: var(--text-text-xs, 0.75rem);
3786
+ color: var(--color-text-secondary);
3787
+ }
3788
+
3789
+ /* ═══════════════════════════════════════════
3790
+ NxImage
3791
+ ═══════════════════════════════════════════ */
3792
+
3793
+ .nexus-image {
3794
+ position: relative;
3795
+ overflow: hidden;
3796
+ display: block;
3797
+ background: var(--color-surface-subtle);
3798
+ }
3799
+ .nexus-image__fallback {
3800
+ display: flex;
3801
+ align-items: center;
3802
+ justify-content: center;
3803
+ width: 100%;
3804
+ height: 100%;
3805
+ min-height: 4rem;
3806
+ color: var(--color-icon-muted);
3807
+ }
3808
+ .nexus-image__fallback-icon {
3809
+ width: var(--size-icon-xl, 2rem);
3810
+ height: var(--size-icon-xl, 2rem);
3811
+ }
3812
+ .nexus-image__skeleton {
3813
+ position: absolute;
3814
+ inset: 0;
3815
+ background: linear-gradient(90deg, var(--color-surface-subtle) 25%, var(--color-surface-default) 50%, var(--color-surface-subtle) 75%);
3816
+ background-size: 200% 100%;
3817
+ animation: nexus-shimmer 1.5s infinite;
3818
+ }
3819
+ .nexus-image__img {
3820
+ display: block;
3821
+ width: 100%;
3822
+ height: 100%;
3823
+ opacity: 0;
3824
+ transition: opacity 300ms ease;
3825
+ }
3826
+ .nexus-image__img--loaded {
3827
+ opacity: 1;
3828
+ }
3829
+ .nexus-image__img--cover {
3830
+ object-fit: cover;
3831
+ }
3832
+ .nexus-image__img--contain {
3833
+ object-fit: contain;
3834
+ }
3835
+ .nexus-image__img--fill {
3836
+ object-fit: fill;
3837
+ }
3838
+ .nexus-image__img--none {
3839
+ object-fit: none;
3840
+ }
3841
+
3842
+ @keyframes nexus-shimmer {
3843
+ 0% { background-position: -200% 0; }
3844
+ 100% { background-position: 200% 0; }
3845
+ }
3846
+
3847
+ /* ═══════════════════════════════════════════
3848
+ DatePicker / Calendar
3849
+ ═══════════════════════════════════════════ */
3850
+
3851
+ .nexus-datepicker {
3852
+ position: relative;
3853
+ display: inline-block;
3854
+ }
3855
+ .nexus-datepicker__trigger {
3856
+ display: inline-flex;
3857
+ align-items: center;
3858
+ gap: var(--spacing-gap-sm, 0.5rem);
3859
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
3860
+ border: var(--border-width-stroke-default, 1px) solid var(--color-border-default);
3861
+ border-radius: var(--radius-corner-md, 0.5rem);
3862
+ background: var(--color-surface-default);
3863
+ font: inherit;
3864
+ font-size: var(--text-text-sm, 0.875rem);
3865
+ color: var(--color-text-primary);
3866
+ cursor: pointer;
3867
+ transition: border-color 150ms;
3868
+ min-width: 10rem;
3869
+ }
3870
+ .nexus-datepicker__trigger:hover {
3871
+ border-color: var(--color-border-default-hover);
3872
+ }
3873
+ .nexus-datepicker__trigger:disabled {
3874
+ opacity: var(--opacity-disabled-element, 0.4);
3875
+ cursor: not-allowed;
3876
+ }
3877
+ .nexus-datepicker__trigger--placeholder span {
3878
+ color: var(--color-text-muted);
3879
+ }
3880
+ .nexus-datepicker__icon {
3881
+ width: var(--size-icon-sm, 1rem);
3882
+ height: var(--size-icon-sm, 1rem);
3883
+ flex-shrink: 0;
3884
+ color: var(--color-icon-secondary);
3885
+ }
3886
+ .nexus-datepicker__popover {
3887
+ position: absolute;
3888
+ top: calc(100% + 4px);
3889
+ left: 0;
3890
+ z-index: var(--z-index-layer-popover, 30);
3891
+ background: var(--color-surface-default);
3892
+ border: var(--border-width-stroke-default, 1px) solid var(--color-border-default);
3893
+ border-radius: var(--radius-corner-lg, 0.75rem);
3894
+ box-shadow: var(--shadow-lg, 0 2px 8px -1px rgb(0 0 0 / 0.12));
3895
+ padding: var(--spacing-padding-sm, 0.75rem);
3896
+ animation: nexus-fade-in 150ms ease;
3897
+ }
3898
+
3899
+ .nexus-calendar {
3900
+ font-size: var(--text-text-sm, 0.875rem);
3901
+ }
3902
+ .nexus-calendar__months {
3903
+ display: flex;
3904
+ flex-direction: column;
3905
+ gap: var(--spacing-gap-sm, 0.5rem);
3906
+ }
3907
+ .nexus-calendar__caption {
3908
+ display: flex;
3909
+ justify-content: center;
3910
+ align-items: center;
3911
+ padding: var(--spacing-padding-2xs, 0.25rem) 0;
3912
+ font-weight: var(--font-weight-text-semibold-sm, 600);
3913
+ color: var(--color-text-primary);
3914
+ }
3915
+ .nexus-calendar__nav {
3916
+ display: flex;
3917
+ gap: var(--spacing-gap-xs, 0.25rem);
3918
+ }
3919
+ .nexus-calendar__nav-btn {
3920
+ display: inline-flex;
3921
+ align-items: center;
3922
+ justify-content: center;
3923
+ width: var(--size-control-sm, 2rem);
3924
+ height: var(--size-control-sm, 2rem);
3925
+ border: none;
3926
+ background: transparent;
3927
+ border-radius: var(--radius-corner-sm, 0.25rem);
3928
+ cursor: pointer;
3929
+ color: var(--color-icon-secondary);
3930
+ transition: background 150ms;
3931
+ }
3932
+ .nexus-calendar__nav-btn:hover {
3933
+ background: var(--color-surface-default-hover);
3934
+ }
3935
+ .nexus-calendar__grid {
3936
+ width: 100%;
3937
+ border-collapse: collapse;
3938
+ }
3939
+ .nexus-calendar__head-row {
3940
+ display: flex;
3941
+ }
3942
+ .nexus-calendar__head-cell {
3943
+ width: var(--size-control-sm, 2rem);
3944
+ text-align: center;
3945
+ font-size: var(--text-text-xs, 0.75rem);
3946
+ font-weight: var(--font-weight-text-medium-xs, 500);
3947
+ color: var(--color-text-tertiary);
3948
+ padding: var(--spacing-padding-2xs, 0.25rem) 0;
3949
+ }
3950
+ .nexus-calendar__row {
3951
+ display: flex;
3952
+ }
3953
+ .nexus-calendar__cell {
3954
+ text-align: center;
3955
+ }
3956
+ .nexus-calendar__day {
3957
+ display: inline-flex;
3958
+ align-items: center;
3959
+ justify-content: center;
3960
+ width: var(--size-control-sm, 2rem);
3961
+ height: var(--size-control-sm, 2rem);
3962
+ border: none;
3963
+ background: transparent;
3964
+ border-radius: var(--radius-corner-sm, 0.25rem);
3965
+ cursor: pointer;
3966
+ font: inherit;
3967
+ font-size: var(--text-text-sm, 0.875rem);
3968
+ color: var(--color-text-primary);
3969
+ transition: background 150ms, color 150ms;
3970
+ }
3971
+ .nexus-calendar__day:hover {
3972
+ background: var(--color-surface-default-hover);
3973
+ }
3974
+ .nexus-calendar__day--selected {
3975
+ background: var(--color-accent-primary);
3976
+ color: var(--color-accent-on-primary);
3977
+ }
3978
+ .nexus-calendar__day--selected:hover {
3979
+ background: var(--color-accent-primary-hover);
3980
+ }
3981
+ .nexus-calendar__day--today {
3982
+ font-weight: var(--font-weight-text-semibold-sm, 600);
3983
+ border: var(--border-width-stroke-default, 1px) solid var(--color-accent-primary);
3984
+ }
3985
+ .nexus-calendar__day--outside {
3986
+ color: var(--color-text-muted);
3987
+ opacity: 0.5;
3988
+ }
3989
+ .nexus-calendar__day--disabled {
3990
+ color: var(--color-text-muted);
3991
+ opacity: var(--opacity-disabled-element, 0.4);
3992
+ cursor: not-allowed;
3993
+ pointer-events: none;
3994
+ }
3995
+
3996
+ @keyframes nexus-fade-in {
3997
+ from { opacity: 0; transform: translateY(-4px); }
3998
+ to { opacity: 1; transform: translateY(0); }
3999
+ }