@nexus-cross/design-system 1.0.13 → 1.1.0

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 (285) hide show
  1. package/claude-rules/nexus/CLAUDE.md +85 -0
  2. package/claude-rules/nexus/commands/nexus-audit.md +79 -0
  3. package/claude-rules/nexus/commands/nexus-component-map.md +85 -0
  4. package/claude-rules/nexus/commands/nexus-token-check.md +68 -0
  5. package/claude-rules/nexus/skills/nexus-design-system/SKILL.md +92 -0
  6. package/cursor-rules/nexus-ui-api.mdc +824 -41
  7. package/cursor-rules/nexus-ui-decisions.mdc +259 -0
  8. package/dist/accordion.js +0 -1
  9. package/dist/accordion.mjs +0 -1
  10. package/dist/alert.js +0 -1
  11. package/dist/alert.mjs +0 -1
  12. package/dist/avatar.js +0 -1
  13. package/dist/avatar.mjs +0 -1
  14. package/dist/badge.js +0 -1
  15. package/dist/badge.mjs +0 -1
  16. package/dist/breadcrumb.js +0 -1
  17. package/dist/breadcrumb.mjs +0 -1
  18. package/dist/button.js +0 -1
  19. package/dist/button.mjs +0 -1
  20. package/dist/carousel.js +0 -1
  21. package/dist/carousel.mjs +0 -1
  22. package/dist/checkbox.js +0 -1
  23. package/dist/checkbox.mjs +0 -1
  24. package/dist/chip.js +0 -1
  25. package/dist/chip.mjs +0 -1
  26. package/dist/chunks/chunk-2Z52NPWB.js +78 -0
  27. package/dist/chunks/chunk-46P52MFM.mjs +56 -0
  28. package/dist/chunks/{chunk-X3CTJ7TD.js → chunk-4KBFVIKX.js} +41 -11
  29. package/dist/chunks/chunk-56ZOOQFE.mjs +514 -0
  30. package/dist/chunks/chunk-5ASTWFJW.js +538 -0
  31. package/dist/chunks/{chunk-33UFQJIO.mjs → chunk-BJMXZJWO.mjs} +16 -5
  32. package/dist/chunks/chunk-EILXBLEV.mjs +5 -0
  33. package/dist/chunks/chunk-G3RLK2HS.js +7 -0
  34. package/dist/chunks/{chunk-YZV6FWE7.js → chunk-JLDQNDFT.js} +16 -5
  35. package/dist/chunks/{chunk-K574BYHQ.js → chunk-K3CK7NTP.js} +22 -4
  36. package/dist/chunks/{chunk-Z4YM7LU3.mjs → chunk-PIGHBDK5.mjs} +22 -4
  37. package/dist/chunks/{chunk-PEIEVKD5.js → chunk-RCIBLLSF.js} +11 -12
  38. package/dist/chunks/{chunk-MMCA33FW.mjs → chunk-RSFLNWOM.mjs} +41 -11
  39. package/dist/chunks/{chunk-K2TBLM3F.mjs → chunk-THBE27U3.mjs} +11 -12
  40. package/dist/client-only.js +0 -1
  41. package/dist/client-only.mjs +0 -1
  42. package/dist/combobox.js +16 -0
  43. package/dist/combobox.mjs +3 -0
  44. package/dist/components/Combobox.d.ts +48 -0
  45. package/dist/components/Combobox.d.ts.map +1 -0
  46. package/dist/components/DataGrid.d.ts +44 -0
  47. package/dist/components/DataGrid.d.ts.map +1 -0
  48. package/dist/components/DataList.d.ts +3 -1
  49. package/dist/components/DataList.d.ts.map +1 -1
  50. package/dist/components/RadioGroup.d.ts +4 -0
  51. package/dist/components/RadioGroup.d.ts.map +1 -1
  52. package/dist/components/Stepper.d.ts.map +1 -1
  53. package/dist/components/ToggleGroup.d.ts +2 -1
  54. package/dist/components/ToggleGroup.d.ts.map +1 -1
  55. package/dist/countdown.js +0 -1
  56. package/dist/countdown.mjs +0 -1
  57. package/dist/counter.js +0 -1
  58. package/dist/counter.mjs +0 -1
  59. package/dist/data-grid.js +14 -0
  60. package/dist/data-grid.mjs +5 -0
  61. package/dist/data-list.js +2 -3
  62. package/dist/data-list.mjs +1 -2
  63. package/dist/date-picker.js +0 -1
  64. package/dist/date-picker.mjs +0 -1
  65. package/dist/divider.js +0 -1
  66. package/dist/divider.mjs +0 -1
  67. package/dist/drawer.js +0 -1
  68. package/dist/drawer.mjs +0 -1
  69. package/dist/dropdown-menu.js +0 -1
  70. package/dist/dropdown-menu.mjs +0 -1
  71. package/dist/ellipsis.js +0 -1
  72. package/dist/ellipsis.mjs +0 -1
  73. package/dist/empty-state.js +0 -1
  74. package/dist/empty-state.mjs +0 -1
  75. package/dist/error-boundary.js +0 -1
  76. package/dist/error-boundary.mjs +0 -1
  77. package/dist/hooks/useCheckDevice.js +0 -1
  78. package/dist/hooks/useCheckDevice.mjs +0 -1
  79. package/dist/hooks/useClickOutside.js +0 -1
  80. package/dist/hooks/useClickOutside.mjs +0 -1
  81. package/dist/hooks/useDraggableBottomSheet.js +0 -1
  82. package/dist/hooks/useDraggableBottomSheet.mjs +0 -1
  83. package/dist/hooks/useDraggableWindow.js +0 -1
  84. package/dist/hooks/useDraggableWindow.mjs +0 -1
  85. package/dist/hooks/useInView.js +0 -1
  86. package/dist/hooks/useInView.mjs +0 -1
  87. package/dist/hooks/useModal.js +0 -1
  88. package/dist/hooks/useModal.mjs +0 -1
  89. package/dist/image-upload.js +0 -1
  90. package/dist/image-upload.mjs +0 -1
  91. package/dist/index.d.ts +4 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +92 -88
  94. package/dist/index.mjs +12 -12
  95. package/dist/infinite-scroll.js +0 -1
  96. package/dist/infinite-scroll.mjs +0 -1
  97. package/dist/marquee.js +0 -1
  98. package/dist/marquee.mjs +0 -1
  99. package/dist/modal/index.js +11 -12
  100. package/dist/modal/index.mjs +2 -3
  101. package/dist/number-input.js +0 -1
  102. package/dist/number-input.mjs +0 -1
  103. package/dist/nx-image.js +0 -1
  104. package/dist/nx-image.mjs +0 -1
  105. package/dist/pagination.js +0 -1
  106. package/dist/pagination.mjs +0 -1
  107. package/dist/popover.js +0 -1
  108. package/dist/popover.mjs +0 -1
  109. package/dist/price-input.js +0 -1
  110. package/dist/price-input.mjs +0 -1
  111. package/dist/progress.js +0 -1
  112. package/dist/progress.mjs +0 -1
  113. package/dist/radio-group.js +5 -6
  114. package/dist/radio-group.mjs +1 -2
  115. package/dist/schemas/_all.json +308 -117
  116. package/dist/schemas/accordion.d.ts.map +1 -1
  117. package/dist/schemas/accordion.json +1 -1
  118. package/dist/schemas/alert.d.ts.map +1 -1
  119. package/dist/schemas/alert.json +1 -1
  120. package/dist/schemas/avatar.d.ts.map +1 -1
  121. package/dist/schemas/avatar.json +1 -1
  122. package/dist/schemas/badge.d.ts.map +1 -1
  123. package/dist/schemas/badge.json +1 -1
  124. package/dist/schemas/breadcrumb.d.ts.map +1 -1
  125. package/dist/schemas/breadcrumb.json +1 -1
  126. package/dist/schemas/button.d.ts.map +1 -1
  127. package/dist/schemas/button.json +1 -1
  128. package/dist/schemas/carousel.d.ts.map +1 -1
  129. package/dist/schemas/carousel.json +1 -1
  130. package/dist/schemas/checkBox.json +1 -1
  131. package/dist/schemas/checkbox.d.ts.map +1 -1
  132. package/dist/schemas/chip.d.ts.map +1 -1
  133. package/dist/schemas/chip.json +1 -1
  134. package/dist/schemas/client-only.d.ts.map +1 -1
  135. package/dist/schemas/clientOnly.json +1 -1
  136. package/dist/schemas/combobox.d.ts +85 -0
  137. package/dist/schemas/combobox.d.ts.map +1 -0
  138. package/dist/schemas/combobox.json +98 -0
  139. package/dist/schemas/comboboxOption.json +30 -0
  140. package/dist/schemas/countdown.d.ts.map +1 -1
  141. package/dist/schemas/countdown.json +1 -1
  142. package/dist/schemas/counter.d.ts.map +1 -1
  143. package/dist/schemas/counter.json +1 -1
  144. package/dist/schemas/data-grid.d.ts +74 -0
  145. package/dist/schemas/data-grid.d.ts.map +1 -0
  146. package/dist/schemas/data-list.d.ts.map +1 -1
  147. package/dist/schemas/dataGrid.json +102 -0
  148. package/dist/schemas/dataList.json +1 -1
  149. package/dist/schemas/date-picker.d.ts.map +1 -1
  150. package/dist/schemas/datePicker.json +1 -1
  151. package/dist/schemas/divider.d.ts.map +1 -1
  152. package/dist/schemas/divider.json +1 -1
  153. package/dist/schemas/drawer.d.ts.map +1 -1
  154. package/dist/schemas/drawer.json +1 -1
  155. package/dist/schemas/dropdown-menu.d.ts.map +1 -1
  156. package/dist/schemas/dropdownMenu.json +1 -1
  157. package/dist/schemas/ellipsis.d.ts.map +1 -1
  158. package/dist/schemas/ellipsis.json +1 -1
  159. package/dist/schemas/empty-state.d.ts.map +1 -1
  160. package/dist/schemas/emptyState.json +1 -1
  161. package/dist/schemas/error-boundary.d.ts.map +1 -1
  162. package/dist/schemas/errorBoundary.json +1 -1
  163. package/dist/schemas/image-upload.d.ts.map +1 -1
  164. package/dist/schemas/imageUpload.json +1 -1
  165. package/dist/schemas/index.d.ts +2 -1
  166. package/dist/schemas/index.d.ts.map +1 -1
  167. package/dist/schemas/infinite-scroll.d.ts.map +1 -1
  168. package/dist/schemas/infiniteScroll.json +1 -1
  169. package/dist/schemas/marquee.d.ts.map +1 -1
  170. package/dist/schemas/marquee.json +1 -1
  171. package/dist/schemas/modal.d.ts.map +1 -1
  172. package/dist/schemas/modalTemplate.json +1 -1
  173. package/dist/schemas/number-input.d.ts.map +1 -1
  174. package/dist/schemas/numberInput.json +1 -1
  175. package/dist/schemas/nx-image.d.ts.map +1 -1
  176. package/dist/schemas/nxImage.json +1 -1
  177. package/dist/schemas/pagination.d.ts.map +1 -1
  178. package/dist/schemas/pagination.json +1 -1
  179. package/dist/schemas/popover.d.ts.map +1 -1
  180. package/dist/schemas/popover.json +1 -1
  181. package/dist/schemas/price-input.d.ts.map +1 -1
  182. package/dist/schemas/priceInput.json +1 -1
  183. package/dist/schemas/progress.d.ts.map +1 -1
  184. package/dist/schemas/progress.json +1 -1
  185. package/dist/schemas/radio-group.d.ts +9 -0
  186. package/dist/schemas/radio-group.d.ts.map +1 -1
  187. package/dist/schemas/radioGroup.json +10 -1
  188. package/dist/schemas/radioItem.json +11 -0
  189. package/dist/schemas/select.d.ts.map +1 -1
  190. package/dist/schemas/select.json +1 -1
  191. package/dist/schemas/skeleton.d.ts.map +1 -1
  192. package/dist/schemas/skeleton.json +1 -1
  193. package/dist/schemas/slider.d.ts.map +1 -1
  194. package/dist/schemas/slider.json +1 -1
  195. package/dist/schemas/spinner.d.ts.map +1 -1
  196. package/dist/schemas/spinner.json +1 -1
  197. package/dist/schemas/stepper.d.ts.map +1 -1
  198. package/dist/schemas/stepper.json +1 -1
  199. package/dist/schemas/switch.d.ts.map +1 -1
  200. package/dist/schemas/switch.json +1 -1
  201. package/dist/schemas/tab.d.ts.map +1 -1
  202. package/dist/schemas/tab.json +1 -1
  203. package/dist/schemas/table.d.ts.map +1 -1
  204. package/dist/schemas/table.json +1 -1
  205. package/dist/schemas/tableRow.json +1 -1
  206. package/dist/schemas/tag-input.d.ts.map +1 -1
  207. package/dist/schemas/tagInput.json +1 -1
  208. package/dist/schemas/tdColumn.json +1 -1
  209. package/dist/schemas/text-area.d.ts.map +1 -1
  210. package/dist/schemas/text-input.d.ts +2 -2
  211. package/dist/schemas/text-input.d.ts.map +1 -1
  212. package/dist/schemas/textArea.json +1 -1
  213. package/dist/schemas/textInput.json +1 -1
  214. package/dist/schemas/toast.d.ts.map +1 -1
  215. package/dist/schemas/toastOptions.json +1 -1
  216. package/dist/schemas/toaster.json +1 -1
  217. package/dist/schemas/toggle-group.d.ts +6 -3
  218. package/dist/schemas/toggle-group.d.ts.map +1 -1
  219. package/dist/schemas/toggleGroup.json +9 -3
  220. package/dist/schemas/tooltip.d.ts.map +1 -1
  221. package/dist/schemas/tooltip.json +1 -1
  222. package/dist/schemas/virtual-scroll.d.ts.map +1 -1
  223. package/dist/schemas/virtualGrid.json +1 -1
  224. package/dist/schemas/virtualList.json +1 -1
  225. package/dist/schemas.js +867 -66
  226. package/dist/schemas.mjs +865 -66
  227. package/dist/select.js +0 -1
  228. package/dist/select.mjs +0 -1
  229. package/dist/skeleton.js +0 -1
  230. package/dist/skeleton.mjs +0 -1
  231. package/dist/slider.js +0 -1
  232. package/dist/slider.mjs +0 -1
  233. package/dist/spinner.js +0 -1
  234. package/dist/spinner.mjs +0 -1
  235. package/dist/stepper.js +3 -4
  236. package/dist/stepper.mjs +1 -2
  237. package/dist/styles/.generated/built.d.ts +1 -1
  238. package/dist/styles/.generated/built.d.ts.map +1 -1
  239. package/dist/styles/layer.js +2 -3
  240. package/dist/styles/layer.mjs +1 -2
  241. package/dist/styles.css +554 -51
  242. package/dist/styles.js +2 -3
  243. package/dist/styles.layered.css +554 -51
  244. package/dist/styles.mjs +1 -2
  245. package/dist/switch.js +0 -1
  246. package/dist/switch.mjs +0 -1
  247. package/dist/tab.js +0 -1
  248. package/dist/tab.mjs +0 -1
  249. package/dist/table.js +0 -1
  250. package/dist/table.mjs +0 -1
  251. package/dist/tag-input.js +0 -1
  252. package/dist/tag-input.mjs +0 -1
  253. package/dist/text-area.js +0 -1
  254. package/dist/text-area.mjs +0 -1
  255. package/dist/text-input.js +0 -1
  256. package/dist/text-input.mjs +0 -1
  257. package/dist/toast.js +0 -1
  258. package/dist/toast.mjs +0 -1
  259. package/dist/toggle-group.js +3 -4
  260. package/dist/toggle-group.mjs +1 -2
  261. package/dist/tooltip.js +0 -1
  262. package/dist/tooltip.mjs +0 -1
  263. package/dist/utils/cn.js +0 -1
  264. package/dist/utils/cn.mjs +0 -1
  265. package/dist/utils/scroll.js +0 -1
  266. package/dist/utils/scroll.mjs +0 -1
  267. package/dist/virtual-scroll.js +0 -1
  268. package/dist/virtual-scroll.mjs +0 -1
  269. package/package.json +14 -8
  270. package/scripts/setup-cursor-rules.cjs +164 -27
  271. package/dist/chunks/chunk-22ULI3BF.js +0 -21
  272. package/dist/chunks/chunk-6ECGMUT6.mjs +0 -5
  273. package/dist/chunks/chunk-CVYXRSXT.mjs +0 -8
  274. package/dist/chunks/chunk-I252NERB.mjs +0 -21
  275. package/dist/chunks/chunk-JNMCYWGY.js +0 -10
  276. package/dist/chunks/chunk-V35IEPRL.js +0 -7
  277. package/dist/components/ThemeProvider.d.ts +0 -25
  278. package/dist/components/ThemeProvider.d.ts.map +0 -1
  279. package/dist/schemas/theme-provider.d.ts +0 -36
  280. package/dist/schemas/theme-provider.d.ts.map +0 -1
  281. package/dist/schemas/themeProvider.json +0 -65
  282. package/dist/theme-provider.js +0 -15
  283. package/dist/theme-provider.mjs +0 -2
  284. package/dist/chunks/{chunk-CWMLTXOH.mjs → chunk-5ZVPTIL3.mjs} +1 -1
  285. package/dist/chunks/{chunk-HFBTS42N.js → chunk-7F4SOLAC.js} +1 -1
package/dist/styles.css CHANGED
@@ -148,9 +148,12 @@
148
148
  }
149
149
  .nexus-btn:disabled,
150
150
  .nexus-btn[aria-disabled='true'] {
151
- pointer-events: none;
151
+ cursor: not-allowed;
152
152
  opacity: var(--opacity-comp-btn-disabled);
153
153
  }
154
+ .nexus-btn[aria-disabled='true'] {
155
+ pointer-events: none;
156
+ }
154
157
  .nexus-btn:focus-visible {
155
158
  outline: 2px solid
156
159
  color-mix(in srgb, var(--color-comp-btn-focus-ring) 50%, transparent);
@@ -855,6 +858,9 @@
855
858
  border-color: var(--color-status-danger-focus);
856
859
  outline-color: var(--color-status-danger-focus);
857
860
  }
861
+ .nexus-number-input--disabled {
862
+ cursor: not-allowed;
863
+ }
858
864
  .nexus-number-input--disabled .nexus-number-input__container {
859
865
  background: var(--color-surface-strong);
860
866
  border-color: var(--color-border-medium);
@@ -957,7 +963,7 @@
957
963
  }
958
964
  .nexus-number-input__step:disabled {
959
965
  color: var(--color-text-muted);
960
- pointer-events: none;
966
+ cursor: not-allowed;
961
967
  }
962
968
  .nexus-number-input__step--up {
963
969
  border-bottom: 1px solid var(--color-border-default);
@@ -996,7 +1002,7 @@
996
1002
  }
997
1003
  .nexus-number-input__bind-btn:disabled {
998
1004
  color: var(--color-text-muted);
999
- pointer-events: none;
1005
+ cursor: not-allowed;
1000
1006
  }
1001
1007
  .nexus-number-input--xl .nexus-number-input__bind-btn {
1002
1008
  width: 30px;
@@ -1275,6 +1281,15 @@
1275
1281
  .nexus-radio-item--md {
1276
1282
  font-size: var(--text-text-sm, 0.875rem);
1277
1283
  }
1284
+ /* When description is present: align radio with the first line of label */
1285
+ .nexus-radio-item--with-description {
1286
+ align-items: flex-start;
1287
+ gap: var(--spacing-gap-xs, 0.375rem);
1288
+ }
1289
+ .nexus-radio-item--with-description .nexus-radio__circle {
1290
+ /* Vertically center the circle to the label's first-line cap height */
1291
+ margin-top: 0.125rem;
1292
+ }
1278
1293
  .nexus-radio-item--pointer {
1279
1294
  cursor: pointer;
1280
1295
  }
@@ -1312,6 +1327,25 @@
1312
1327
  border-color: var(--color-border-default);
1313
1328
  background: var(--color-surface-default);
1314
1329
  }
1330
+ /* ── Ring variant: thick border replaces inner dot ── */
1331
+ .nexus-radio__circle--ring {
1332
+ background: transparent;
1333
+ transition-property: border-color, border-width;
1334
+ transition-duration: 150ms;
1335
+ }
1336
+ .nexus-radio__circle--ring.nexus-radio__circle--unchecked {
1337
+ border-width: 1px;
1338
+ border-color: var(--color-border-default);
1339
+ }
1340
+ .nexus-radio__circle--ring.nexus-radio__circle--checked {
1341
+ border-color: var(--color-accent-primary);
1342
+ }
1343
+ .nexus-radio__circle--ring.nexus-radio__circle--sm.nexus-radio__circle--checked {
1344
+ border-width: 4px;
1345
+ }
1346
+ .nexus-radio__circle--ring.nexus-radio__circle--md.nexus-radio__circle--checked {
1347
+ border-width: 5px;
1348
+ }
1315
1349
  .nexus-radio__dot {
1316
1350
  border-radius: 9999px;
1317
1351
  background: currentColor;
@@ -1326,6 +1360,20 @@
1326
1360
  }
1327
1361
  .nexus-radio__label {
1328
1362
  color: var(--color-text-primary);
1363
+ line-height: 1;
1364
+ }
1365
+ .nexus-radio__text {
1366
+ display: inline-flex;
1367
+ flex-direction: column;
1368
+ gap: var(--spacing-gap-xs, 0.25rem);
1369
+ min-width: 0;
1370
+ }
1371
+ .nexus-radio__description {
1372
+ color: var(--color-text-tertiary);
1373
+ font-size: var(--text-text-xs, 0.75rem);
1374
+ font-weight: 400;
1375
+ line-height: 1.5;
1376
+ letter-spacing: -0.01em;
1329
1377
  }
1330
1378
 
1331
1379
  /* ═══════════════════════════════════════════
@@ -1352,7 +1400,7 @@
1352
1400
  }
1353
1401
  .nexus-chip[aria-disabled='true'] {
1354
1402
  opacity: 0.5;
1355
- pointer-events: none;
1403
+ cursor: not-allowed;
1356
1404
  }
1357
1405
  .nexus-chip--default {
1358
1406
  border-color: var(--color-border-default);
@@ -1732,7 +1780,7 @@
1732
1780
  }
1733
1781
  .nexus-page-btn:disabled {
1734
1782
  opacity: 0.4;
1735
- pointer-events: none;
1783
+ cursor: not-allowed;
1736
1784
  }
1737
1785
  .nexus-page-btn--sm {
1738
1786
  width: 1.75rem;
@@ -1832,7 +1880,7 @@
1832
1880
  }
1833
1881
  .nexus-tab-trigger--disabled {
1834
1882
  opacity: 0.4;
1835
- pointer-events: none;
1883
+ cursor: not-allowed;
1836
1884
  }
1837
1885
 
1838
1886
  /* ═══════════════════════════════════════════
@@ -1922,6 +1970,84 @@
1922
1970
  color: var(--color-text-tertiary);
1923
1971
  }
1924
1972
 
1973
+ /* ═══════════════════════════════════════════
1974
+ DataGrid
1975
+ ═══════════════════════════════════════════ */
1976
+
1977
+ .nexus-data-grid {
1978
+ display: grid;
1979
+ grid-template-columns: repeat(var(--nexus-dg-cols, 1), minmax(0, 1fr));
1980
+ gap: var(--nexus-dg-gap, 0);
1981
+ }
1982
+ /* Loading / empty 상태일 때는 단일 자식이 그리드 전체 너비를 점유하도록 강제 */
1983
+ .nexus-data-grid[data-state='loading'] > *,
1984
+ .nexus-data-grid[data-state='empty'] > * {
1985
+ grid-column: 1 / -1;
1986
+ justify-self: stretch;
1987
+ }
1988
+ .nexus-data-grid > .nexus-datalist-center,
1989
+ .nexus-data-grid > .nexus-datalist-empty {
1990
+ grid-column: 1 / -1;
1991
+ }
1992
+ @media (min-width: 640px) {
1993
+ .nexus-data-grid {
1994
+ grid-template-columns: repeat(
1995
+ var(--nexus-dg-cols-sm, var(--nexus-dg-cols, 1)),
1996
+ minmax(0, 1fr)
1997
+ );
1998
+ }
1999
+ }
2000
+ @media (min-width: 768px) {
2001
+ .nexus-data-grid {
2002
+ grid-template-columns: repeat(
2003
+ var(--nexus-dg-cols-md, var(--nexus-dg-cols-sm, var(--nexus-dg-cols, 1))),
2004
+ minmax(0, 1fr)
2005
+ );
2006
+ }
2007
+ }
2008
+ @media (min-width: 1024px) {
2009
+ .nexus-data-grid {
2010
+ grid-template-columns: repeat(
2011
+ var(
2012
+ --nexus-dg-cols-lg,
2013
+ var(--nexus-dg-cols-md, var(--nexus-dg-cols-sm, var(--nexus-dg-cols, 1)))
2014
+ ),
2015
+ minmax(0, 1fr)
2016
+ );
2017
+ }
2018
+ }
2019
+ @media (min-width: 1280px) {
2020
+ .nexus-data-grid {
2021
+ grid-template-columns: repeat(
2022
+ var(
2023
+ --nexus-dg-cols-xl,
2024
+ var(
2025
+ --nexus-dg-cols-lg,
2026
+ var(--nexus-dg-cols-md, var(--nexus-dg-cols-sm, var(--nexus-dg-cols, 1)))
2027
+ )
2028
+ ),
2029
+ minmax(0, 1fr)
2030
+ );
2031
+ }
2032
+ }
2033
+ @media (min-width: 1536px) {
2034
+ .nexus-data-grid {
2035
+ grid-template-columns: repeat(
2036
+ var(
2037
+ --nexus-dg-cols-2xl,
2038
+ var(
2039
+ --nexus-dg-cols-xl,
2040
+ var(
2041
+ --nexus-dg-cols-lg,
2042
+ var(--nexus-dg-cols-md, var(--nexus-dg-cols-sm, var(--nexus-dg-cols, 1)))
2043
+ )
2044
+ )
2045
+ ),
2046
+ minmax(0, 1fr)
2047
+ );
2048
+ }
2049
+ }
2050
+
1925
2051
  /* ═══════════════════════════════════════════
1926
2052
  InfiniteScroll
1927
2053
  ═══════════════════════════════════════════ */
@@ -2137,7 +2263,7 @@
2137
2263
  background: var(--color-surface-hover);
2138
2264
  }
2139
2265
  .nexus-select-item[data-disabled] {
2140
- pointer-events: none;
2266
+ cursor: not-allowed;
2141
2267
  opacity: 0.5;
2142
2268
  }
2143
2269
 
@@ -2210,7 +2336,7 @@
2210
2336
  background: var(--color-surface-hover);
2211
2337
  }
2212
2338
  .nexus-dropdown-item[data-disabled] {
2213
- pointer-events: none;
2339
+ cursor: not-allowed;
2214
2340
  opacity: var(--opacity-disabled-element, 0.4);
2215
2341
  }
2216
2342
  .nexus-dropdown-item--danger {
@@ -2276,6 +2402,50 @@
2276
2402
  padding: var(--spacing-padding-2xs, 0.25rem);
2277
2403
  gap: 0;
2278
2404
  }
2405
+
2406
+ /* ── Outline variant: independent bordered buttons ── */
2407
+ .nexus-toggle-group--outline {
2408
+ display: inline-flex;
2409
+ background: transparent;
2410
+ padding: 0;
2411
+ gap: var(--spacing-gap-sm, 0.5rem);
2412
+ border-radius: 0;
2413
+ }
2414
+ .nexus-toggle-group--outline .nexus-toggle-group__indicator {
2415
+ display: none;
2416
+ }
2417
+ .nexus-toggle-group--outline .nexus-toggle-group__item {
2418
+ border: 0.5px solid var(--color-border-medium);
2419
+ border-radius: var(--radius-corner-md, 0.5rem);
2420
+ background: transparent;
2421
+ color: var(--color-text-tertiary);
2422
+ font-weight: var(--font-weight-text-medium-sm, 500);
2423
+ transition:
2424
+ border-color var(--duration-transition-normal, 200ms)
2425
+ var(--ease-transition-fast),
2426
+ color var(--duration-transition-normal, 200ms) var(--ease-transition-fast);
2427
+ }
2428
+ .nexus-toggle-group--outline .nexus-toggle-group__item:hover:not([data-state='on']):not([data-disabled]) {
2429
+ border-color: var(--color-border-default-hover);
2430
+ color: var(--color-text-secondary);
2431
+ }
2432
+ .nexus-toggle-group--outline .nexus-toggle-group__item[data-state='on'] {
2433
+ border-color: var(--color-border-strong);
2434
+ color: var(--color-text-primary);
2435
+ }
2436
+ .nexus-toggle-group--outline .nexus-toggle-group__item[data-state='on'] .nexus-toggle-group__icon {
2437
+ color: var(--color-icon-primary);
2438
+ }
2439
+
2440
+ /* ── Full width: stretch group + equal-width items ── */
2441
+ .nexus-toggle-group--full-width {
2442
+ display: flex;
2443
+ width: 100%;
2444
+ }
2445
+ .nexus-toggle-group--full-width .nexus-toggle-group__item {
2446
+ flex: 1 1 0;
2447
+ min-width: 0;
2448
+ }
2279
2449
  .nexus-toggle-group__item {
2280
2450
  display: inline-flex;
2281
2451
  align-items: center;
@@ -2300,7 +2470,7 @@
2300
2470
  0 0 0 4px var(--color-accent-primary-focus);
2301
2471
  }
2302
2472
  .nexus-toggle-group__item[data-disabled] {
2303
- pointer-events: none;
2473
+ cursor: not-allowed;
2304
2474
  opacity: var(--opacity-disabled-element, 0.4);
2305
2475
  }
2306
2476
  .nexus-toggle-group--default .nexus-toggle-group__item[data-state='on'] {
@@ -2378,7 +2548,7 @@
2378
2548
  }
2379
2549
  .nexus-slider[data-disabled] {
2380
2550
  opacity: var(--opacity-disabled-element, 0.4);
2381
- pointer-events: none;
2551
+ cursor: not-allowed;
2382
2552
  }
2383
2553
  .nexus-slider__track {
2384
2554
  position: relative;
@@ -2739,7 +2909,7 @@
2739
2909
  }
2740
2910
  .nexus-carousel-btn:disabled {
2741
2911
  opacity: 0.4;
2742
- pointer-events: none;
2912
+ cursor: not-allowed;
2743
2913
  }
2744
2914
  .nexus-carousel-btn--prev {
2745
2915
  left: 0.5rem;
@@ -2914,12 +3084,14 @@
2914
3084
  display: flex;
2915
3085
  cursor: default;
2916
3086
  }
2917
- .nexus-table-skeleton-td {
3087
+ :where(.nexus-table-skeleton-td) {
3088
+ display: flex;
3089
+ align-items: center;
2918
3090
  height: 100%;
2919
3091
  width: 100%;
2920
3092
  padding-block: var(--spacing-padding-md, 1rem);
2921
3093
  }
2922
- .nexus-table-skeleton-bar {
3094
+ :where(.nexus-table-skeleton-bar) {
2923
3095
  height: 1rem;
2924
3096
  width: 100%;
2925
3097
  }
@@ -3624,17 +3796,14 @@
3624
3796
  }
3625
3797
  .nexus-stepper--horizontal .nexus-stepper__connector {
3626
3798
  flex: 1;
3627
- height: 2px;
3628
- background: var(--color-border-default);
3629
- transition: background var(--duration-transition-normal, 200ms)
3799
+ height: 0;
3800
+ border-top: 1px dashed var(--color-border-default);
3801
+ transition: border-color var(--duration-transition-normal, 200ms)
3630
3802
  var(--ease-transition-normal);
3631
3803
  }
3632
3804
  .nexus-stepper--horizontal .nexus-stepper__connector--hidden {
3633
3805
  visibility: hidden;
3634
3806
  }
3635
- .nexus-stepper--horizontal .nexus-stepper__connector--completed {
3636
- background: var(--color-accent-primary);
3637
- }
3638
3807
  .nexus-stepper--horizontal .nexus-stepper__content {
3639
3808
  margin-top: var(--spacing-gap-sm, 0.5rem);
3640
3809
  padding: 0 var(--spacing-padding-2xs, 0.25rem);
@@ -3659,16 +3828,13 @@
3659
3828
  flex-shrink: 0;
3660
3829
  }
3661
3830
  .nexus-stepper--vertical .nexus-stepper__connector {
3662
- width: 2px;
3831
+ width: 0;
3663
3832
  flex: 1;
3664
3833
  min-height: var(--spacing-padding-sm, 0.75rem);
3665
- background: var(--color-border-default);
3666
- transition: background var(--duration-transition-normal, 200ms)
3834
+ border-left: 1px dashed var(--color-border-default);
3835
+ transition: border-color var(--duration-transition-normal, 200ms)
3667
3836
  var(--ease-transition-normal);
3668
3837
  }
3669
- .nexus-stepper--vertical .nexus-stepper__connector--completed {
3670
- background: var(--color-accent-primary);
3671
- }
3672
3838
  .nexus-stepper--vertical .nexus-stepper__content {
3673
3839
  padding: var(--spacing-padding-xs, 0.5rem) 0;
3674
3840
  }
@@ -3679,25 +3845,27 @@
3679
3845
  align-items: center;
3680
3846
  justify-content: center;
3681
3847
  flex-shrink: 0;
3682
- width: var(--size-control-sm, 2rem);
3683
- height: var(--size-control-sm, 2rem);
3848
+ width: 30px;
3849
+ height: 30px;
3684
3850
  border-radius: var(--radius-corner-full, 9999px);
3685
- border: 2px solid var(--color-border-medium);
3686
- background: var(--color-surface-default);
3687
- font-size: var(--text-text-sm, 0.875rem);
3688
- font-weight: var(--font-weight-text-medium-sm, 500);
3689
- color: var(--color-text-secondary);
3690
- transition: all var(--duration-transition-normal, 200ms)
3691
- var(--ease-transition-normal);
3851
+ border: 1px solid var(--color-border-medium);
3852
+ background: transparent;
3853
+ font-size: var(--text-label-semibold-md, 0.875rem);
3854
+ font-weight: var(--font-weight-label-semibold-md, 600);
3855
+ color: var(--color-text-tertiary);
3856
+ transition:
3857
+ border-color var(--duration-transition-normal, 200ms) var(--ease-transition-normal),
3858
+ background-color var(--duration-transition-normal, 200ms) var(--ease-transition-normal),
3859
+ color var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3692
3860
  }
3693
3861
  .nexus-stepper--sm .nexus-stepper__indicator {
3694
- width: 1.75rem;
3695
- height: 1.75rem;
3862
+ width: 1.5rem;
3863
+ height: 1.5rem;
3696
3864
  font-size: var(--text-text-xs, 0.75rem);
3697
3865
  }
3698
3866
  .nexus-stepper__check {
3699
- width: var(--size-icon-sm, 1rem);
3700
- height: var(--size-icon-sm, 1rem);
3867
+ width: 13px;
3868
+ height: 13px;
3701
3869
  }
3702
3870
  .nexus-stepper--sm .nexus-stepper__check {
3703
3871
  width: var(--size-icon-xs, 0.75rem);
@@ -3707,33 +3875,31 @@
3707
3875
  /* ── State colors ── */
3708
3876
  .nexus-stepper__step--completed .nexus-stepper__indicator {
3709
3877
  border-color: var(--color-accent-primary);
3710
- background: var(--color-accent-primary);
3711
- color: var(--color-accent-on-primary);
3878
+ background: transparent;
3879
+ color: var(--color-accent-primary);
3712
3880
  }
3713
3881
  .nexus-stepper__step--active .nexus-stepper__indicator {
3714
3882
  border-color: var(--color-accent-primary);
3715
- color: var(--color-accent-primary);
3716
- background: var(--color-surface-default);
3717
- box-shadow: 0 0 0 3px
3718
- color-mix(in srgb, var(--color-accent-primary) 20%, transparent);
3883
+ background: var(--color-accent-primary);
3884
+ color: var(--color-accent-on-primary);
3719
3885
  }
3720
3886
  .nexus-stepper__step--error .nexus-stepper__indicator {
3721
3887
  border-color: var(--color-status-danger);
3722
3888
  color: var(--color-status-danger);
3723
- background: var(--color-surface-default);
3724
- box-shadow: 0 0 0 3px
3725
- color-mix(in srgb, var(--color-status-danger) 20%, transparent);
3889
+ background: transparent;
3726
3890
  }
3727
3891
  .nexus-stepper__step--pending .nexus-stepper__indicator {
3728
- border-color: var(--color-border-default);
3892
+ border-color: var(--color-border-medium);
3729
3893
  color: var(--color-text-tertiary);
3730
3894
  }
3731
3895
 
3732
3896
  /* ── Labels ── */
3733
3897
  .nexus-stepper__label {
3734
3898
  display: block;
3735
- font-size: var(--text-text-sm, 0.875rem);
3736
- font-weight: var(--font-weight-text-medium-sm, 500);
3899
+ font-size: var(--text-text-medium-xs, 0.75rem);
3900
+ font-weight: var(--font-weight-text-medium-xs, 500);
3901
+ line-height: 1.5;
3902
+ letter-spacing: var(--letter-spacing-text-medium-xs, -0.01em);
3737
3903
  color: var(--color-text-primary);
3738
3904
  }
3739
3905
  .nexus-stepper--sm .nexus-stepper__label {
@@ -3745,13 +3911,64 @@
3745
3911
  font-size: var(--text-text-xs, 0.75rem);
3746
3912
  color: var(--color-text-secondary);
3747
3913
  }
3748
- .nexus-stepper__step--pending .nexus-stepper__label {
3914
+ .nexus-stepper__step--completed .nexus-stepper__label {
3749
3915
  color: var(--color-text-secondary);
3750
3916
  }
3917
+ .nexus-stepper__step--completed .nexus-stepper__description {
3918
+ color: var(--color-text-muted);
3919
+ }
3920
+ .nexus-stepper__step--pending .nexus-stepper__label {
3921
+ color: var(--color-text-tertiary);
3922
+ }
3751
3923
  .nexus-stepper__step--pending .nexus-stepper__description {
3752
3924
  color: var(--color-text-muted);
3753
3925
  }
3754
3926
 
3927
+ /* ── Animations ── */
3928
+
3929
+ @keyframes nexus-stepper-pulse {
3930
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(9, 180, 152, 0.25); }
3931
+ 50% { box-shadow: 0 0 0 3px rgba(9, 180, 152, 0.25); }
3932
+ }
3933
+ @keyframes nexus-stepper-pop {
3934
+ 0% { transform: scale(0.7); opacity: 0.5; }
3935
+ 60% { transform: scale(1.15); opacity: 1; }
3936
+ 100% { transform: scale(1); opacity: 1; }
3937
+ }
3938
+ @keyframes nexus-stepper-check-in {
3939
+ 0% { opacity: 0; transform: scale(0) rotate(-45deg); }
3940
+ 60% { opacity: 1; transform: scale(1.2) rotate(0deg); }
3941
+ 100% { opacity: 1; transform: scale(1) rotate(0deg); }
3942
+ }
3943
+ @keyframes nexus-stepper-label-slide {
3944
+ 0% { opacity: 0; transform: translateY(4px); }
3945
+ 100% { opacity: 1; transform: translateY(0); }
3946
+ }
3947
+
3948
+ .nexus-stepper__step--active .nexus-stepper__indicator {
3949
+ animation: nexus-stepper-pulse 2s ease-in-out infinite;
3950
+ }
3951
+
3952
+ .nexus-stepper__step--animating.nexus-stepper__step--active .nexus-stepper__indicator {
3953
+ animation:
3954
+ nexus-stepper-pop 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275) both,
3955
+ nexus-stepper-pulse 2s ease-in-out 500ms infinite;
3956
+ }
3957
+ .nexus-stepper__step--animating.nexus-stepper__step--active .nexus-stepper__label {
3958
+ animation: nexus-stepper-label-slide 350ms ease-out both;
3959
+ }
3960
+ .nexus-stepper__step--animating.nexus-stepper__step--active .nexus-stepper__description {
3961
+ animation: nexus-stepper-label-slide 350ms ease-out 50ms both;
3962
+ }
3963
+
3964
+ @media (prefers-reduced-motion: reduce) {
3965
+ .nexus-stepper__step--active .nexus-stepper__indicator,
3966
+ .nexus-stepper__step--animating .nexus-stepper__indicator,
3967
+ .nexus-stepper__step--animating .nexus-stepper__label,
3968
+ .nexus-stepper__step--animating .nexus-stepper__description,
3969
+ .nexus-stepper__check { animation: none !important; }
3970
+ }
3971
+
3755
3972
  /* ═══════════════════════════════════════════
3756
3973
  TagInput
3757
3974
  ═══════════════════════════════════════════ */
@@ -4413,3 +4630,289 @@
4413
4630
  color: var(--color-text-tertiary);
4414
4631
  margin: 0;
4415
4632
  }
4633
+
4634
+ /* ═══════════════════════════════════════════
4635
+ Combobox (Searchable Select)
4636
+ ═══════════════════════════════════════════ */
4637
+ .nexus-combobox {
4638
+ display: flex;
4639
+ align-items: center;
4640
+ flex-wrap: nowrap;
4641
+ gap: var(--spacing-gap-xs, 0.25rem);
4642
+ border-radius: var(--radius-corner-md, 0.5rem);
4643
+ border: 1px solid var(--color-border-default);
4644
+ background: var(--color-surface-default);
4645
+ font-size: var(--text-text-sm, 0.875rem);
4646
+ font-weight: 500;
4647
+ line-height: 1;
4648
+ color: var(--color-text-primary);
4649
+ cursor: text;
4650
+ transition:
4651
+ border-color 200ms,
4652
+ box-shadow 200ms;
4653
+ }
4654
+
4655
+ /* Left content area: chips + input wrap together, suffix stays vertically centered */
4656
+ .nexus-combobox__content {
4657
+ display: flex;
4658
+ flex: 1 1 auto;
4659
+ align-items: center;
4660
+ flex-wrap: wrap;
4661
+ gap: var(--spacing-gap-xs, 0.25rem);
4662
+ min-width: 0;
4663
+ }
4664
+
4665
+ /* Right suffix area: clear / loading / chevron — always vertically centered */
4666
+ .nexus-combobox__suffix {
4667
+ display: inline-flex;
4668
+ align-items: center;
4669
+ flex-shrink: 0;
4670
+ gap: var(--spacing-gap-xs, 0.25rem);
4671
+ align-self: center;
4672
+ }
4673
+ :where(.nexus-combobox) {
4674
+ width: 100%;
4675
+ }
4676
+ .nexus-combobox:hover:not(.nexus-combobox--disabled):not(:focus-within) {
4677
+ border-color: var(--color-border-default-hover);
4678
+ box-shadow: 0 0 0 0.5px var(--color-border-default-hover);
4679
+ }
4680
+ .nexus-combobox--default:focus-within,
4681
+ .nexus-combobox--default.nexus-combobox--open {
4682
+ border-color: var(--color-accent-primary);
4683
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
4684
+ }
4685
+ .nexus-combobox--error {
4686
+ border-color: var(--color-status-danger);
4687
+ }
4688
+ .nexus-combobox--error:focus-within,
4689
+ .nexus-combobox--error.nexus-combobox--open {
4690
+ border-color: var(--color-status-danger);
4691
+ box-shadow: 0 0 0 0.5px var(--color-status-danger);
4692
+ }
4693
+ .nexus-combobox--disabled {
4694
+ cursor: not-allowed;
4695
+ background: var(--color-surface-strong);
4696
+ border-color: var(--color-border-medium);
4697
+ color: var(--color-text-muted);
4698
+ }
4699
+ .nexus-combobox--disabled .nexus-combobox__input {
4700
+ cursor: not-allowed;
4701
+ }
4702
+
4703
+ /* ── Sizes (mirror TextInput tokens) ── */
4704
+ .nexus-combobox--xl {
4705
+ padding: calc(var(--spacing-padding-md, 1rem) - 1px)
4706
+ var(--spacing-padding-md, 1rem);
4707
+ font-size: var(--text-text-base, 1rem);
4708
+ }
4709
+ .nexus-combobox--lg {
4710
+ padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px)
4711
+ var(--spacing-padding-sm, 0.75rem);
4712
+ font-size: var(--text-text-base, 1rem);
4713
+ }
4714
+ .nexus-combobox--md {
4715
+ padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px)
4716
+ var(--spacing-padding-sm, 0.75rem);
4717
+ font-size: var(--text-text-sm, 0.875rem);
4718
+ }
4719
+
4720
+ /* ── Inner input ── */
4721
+ .nexus-combobox__input {
4722
+ flex: 1 1 auto;
4723
+ min-width: 4rem;
4724
+ background: transparent;
4725
+ border: 0;
4726
+ outline: none;
4727
+ box-shadow: none;
4728
+ color: inherit;
4729
+ font: inherit;
4730
+ padding: 0;
4731
+ appearance: none;
4732
+ -webkit-appearance: none;
4733
+ }
4734
+ .nexus-combobox__input:focus,
4735
+ .nexus-combobox__input:focus-visible {
4736
+ outline: none;
4737
+ box-shadow: none;
4738
+ border: 0;
4739
+ }
4740
+ .nexus-combobox__input::placeholder {
4741
+ color: var(--color-text-muted);
4742
+ }
4743
+ .nexus-combobox__input:disabled {
4744
+ color: var(--color-text-muted);
4745
+ }
4746
+
4747
+ /* ── Suffix icons (clear / loading / chevron) ── */
4748
+ .nexus-combobox__icon {
4749
+ display: inline-flex;
4750
+ align-items: center;
4751
+ justify-content: center;
4752
+ flex-shrink: 0;
4753
+ color: var(--color-icon-secondary);
4754
+ }
4755
+ .nexus-combobox__icon--loading {
4756
+ color: var(--color-accent-primary);
4757
+ }
4758
+ .nexus-combobox__clear {
4759
+ display: inline-flex;
4760
+ align-items: center;
4761
+ justify-content: center;
4762
+ flex-shrink: 0;
4763
+ width: 1.125rem;
4764
+ height: 1.125rem;
4765
+ border-radius: 999px;
4766
+ border: 0;
4767
+ background: transparent;
4768
+ color: var(--color-icon-secondary);
4769
+ cursor: pointer;
4770
+ padding: 0;
4771
+ }
4772
+ .nexus-combobox__clear:hover {
4773
+ background: var(--color-surface-hover);
4774
+ color: var(--color-icon-primary);
4775
+ }
4776
+ .nexus-combobox__chevron {
4777
+ display: inline-flex;
4778
+ align-items: center;
4779
+ justify-content: center;
4780
+ flex-shrink: 0;
4781
+ color: var(--color-icon-secondary);
4782
+ transition: transform 150ms ease;
4783
+ }
4784
+ .nexus-combobox__chevron--open {
4785
+ transform: rotate(180deg);
4786
+ }
4787
+
4788
+ /* ── Multi-select chips inside input ── */
4789
+ .nexus-combobox__chip {
4790
+ display: inline-flex;
4791
+ align-items: center;
4792
+ gap: 0.25rem;
4793
+ padding: 0.125rem 0.375rem 0.125rem 0.5rem;
4794
+ border-radius: var(--radius-corner-sm, 0.25rem);
4795
+ background: var(--color-surface-subtle);
4796
+ color: var(--color-text-primary);
4797
+ font-size: var(--text-text-xs, 0.75rem);
4798
+ font-weight: 500;
4799
+ line-height: 1.25;
4800
+ max-width: 100%;
4801
+ }
4802
+ .nexus-combobox__chip-label {
4803
+ overflow: hidden;
4804
+ text-overflow: ellipsis;
4805
+ white-space: nowrap;
4806
+ }
4807
+ .nexus-combobox__chip-remove {
4808
+ display: inline-flex;
4809
+ align-items: center;
4810
+ justify-content: center;
4811
+ width: 1rem;
4812
+ height: 1rem;
4813
+ border-radius: 999px;
4814
+ border: 0;
4815
+ background: transparent;
4816
+ color: var(--color-icon-secondary);
4817
+ cursor: pointer;
4818
+ padding: 0;
4819
+ flex-shrink: 0;
4820
+ }
4821
+ .nexus-combobox__chip-remove:hover {
4822
+ background: var(--color-surface-hover);
4823
+ color: var(--color-icon-primary);
4824
+ }
4825
+
4826
+ /* ── Field wrapper (label/description) ── */
4827
+ .nexus-combobox-field {
4828
+ display: flex;
4829
+ flex-direction: column;
4830
+ gap: var(--spacing-gap-xs, 0.25rem);
4831
+ }
4832
+ .nexus-combobox-field__label {
4833
+ font-size: var(--text-label-semibold-md);
4834
+ font-weight: var(--font-weight-label-semibold-md, 600);
4835
+ line-height: 1;
4836
+ color: var(--color-text-tertiary);
4837
+ }
4838
+ .nexus-combobox-field__description {
4839
+ font-size: var(--text-text-xs);
4840
+ font-weight: var(--font-weight-text-xs, 400);
4841
+ line-height: 1.5;
4842
+ color: var(--color-text-tertiary);
4843
+ margin: 0;
4844
+ }
4845
+ .nexus-combobox-field__description--error {
4846
+ color: var(--color-status-danger);
4847
+ }
4848
+
4849
+ /* ── Popover / Listbox ── */
4850
+ .nexus-combobox-popover {
4851
+ z-index: 50;
4852
+ border-radius: var(--radius-corner-md, 0.5rem);
4853
+ border: 1px solid var(--color-border-default);
4854
+ background: var(--color-surface-default);
4855
+ box-shadow: var(--shadow-md, 0 8px 24px rgba(0, 0, 0, 0.08));
4856
+ overflow: hidden;
4857
+ }
4858
+ .nexus-combobox-listbox {
4859
+ max-height: 18rem;
4860
+ overflow-y: auto;
4861
+ padding: 0.25rem;
4862
+ }
4863
+ .nexus-combobox-popover__status {
4864
+ display: flex;
4865
+ align-items: center;
4866
+ justify-content: center;
4867
+ gap: 0.5rem;
4868
+ padding: 1rem;
4869
+ color: var(--color-text-muted);
4870
+ font-size: var(--text-text-sm, 0.875rem);
4871
+ }
4872
+
4873
+ /* ── Option ── */
4874
+ .nexus-combobox-option {
4875
+ display: flex;
4876
+ align-items: center;
4877
+ gap: 0.5rem;
4878
+ padding: 0.5rem 0.625rem;
4879
+ border-radius: var(--radius-corner-sm, 0.25rem);
4880
+ cursor: pointer;
4881
+ color: var(--color-text-primary);
4882
+ font-size: var(--text-text-sm, 0.875rem);
4883
+ line-height: 1.25;
4884
+ user-select: none;
4885
+ }
4886
+ .nexus-combobox-option--active {
4887
+ background: var(--color-surface-hover);
4888
+ }
4889
+ .nexus-combobox-option--selected {
4890
+ color: var(--color-accent-primary);
4891
+ font-weight: 600;
4892
+ }
4893
+ .nexus-combobox-option--disabled {
4894
+ opacity: 0.5;
4895
+ cursor: not-allowed;
4896
+ }
4897
+ .nexus-combobox-option__body {
4898
+ flex: 1 1 auto;
4899
+ min-width: 0;
4900
+ }
4901
+ .nexus-combobox-option__label {
4902
+ overflow: hidden;
4903
+ text-overflow: ellipsis;
4904
+ white-space: nowrap;
4905
+ }
4906
+ .nexus-combobox-option__description {
4907
+ margin-top: 0.125rem;
4908
+ color: var(--color-text-muted);
4909
+ font-size: var(--text-text-xs, 0.75rem);
4910
+ font-weight: 400;
4911
+ overflow: hidden;
4912
+ text-overflow: ellipsis;
4913
+ white-space: nowrap;
4914
+ }
4915
+ .nexus-combobox-option__check {
4916
+ flex-shrink: 0;
4917
+ color: var(--color-accent-primary);
4918
+ }