@nexus-cross/design-system 1.0.4-beta.1 → 1.0.4

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 (327) hide show
  1. package/cursor-rules/nexus-project-setup.mdc +167 -145
  2. package/cursor-rules/nexus-ui-api.mdc +894 -311
  3. package/cursor-rules/nexus-ui-components.mdc +179 -91
  4. package/dist/accordion.js +7 -7
  5. package/dist/accordion.mjs +2 -2
  6. package/dist/alert.d.mts +17 -0
  7. package/dist/alert.d.ts +17 -0
  8. package/dist/alert.js +16 -0
  9. package/dist/alert.mjs +3 -0
  10. package/dist/avatar.js +4 -4
  11. package/dist/avatar.mjs +2 -2
  12. package/dist/badge.d.mts +18 -0
  13. package/dist/badge.d.ts +18 -0
  14. package/dist/badge.js +16 -0
  15. package/dist/badge.mjs +3 -0
  16. package/dist/breadcrumb.d.mts +15 -0
  17. package/dist/breadcrumb.d.ts +15 -0
  18. package/dist/breadcrumb.js +12 -0
  19. package/dist/breadcrumb.mjs +3 -0
  20. package/dist/button.js +4 -4
  21. package/dist/button.mjs +2 -2
  22. package/dist/carousel.js +8 -8
  23. package/dist/carousel.mjs +2 -2
  24. package/dist/checkbox.js +5 -5
  25. package/dist/checkbox.mjs +2 -2
  26. package/dist/chip.d.mts +1 -1
  27. package/dist/chip.d.ts +1 -1
  28. package/dist/chip.js +4 -4
  29. package/dist/chip.mjs +2 -2
  30. package/dist/chunks/{chunk-5TBXVD56.js → chunk-2MC7XJSE.js} +16 -6
  31. package/dist/chunks/chunk-2N2EPBO4.js +120 -0
  32. package/dist/chunks/{chunk-BEA727LO.mjs → chunk-2RPRCWKV.mjs} +57 -26
  33. package/dist/chunks/chunk-2UPGFY6E.mjs +76 -0
  34. package/dist/chunks/{chunk-5I2VRWWU.js → chunk-2ZXDXO4I.js} +32 -38
  35. package/dist/chunks/{chunk-RLP3U52D.mjs → chunk-33UFQJIO.mjs} +22 -40
  36. package/dist/chunks/{chunk-AOVU67NI.mjs → chunk-3HHJORN7.mjs} +23 -25
  37. package/dist/chunks/{chunk-TWHDXCKR.js → chunk-3PCNRCTB.js} +8 -8
  38. package/dist/chunks/chunk-3ZWN66YH.js +53 -0
  39. package/dist/chunks/chunk-4ENXP7WH.js +224 -0
  40. package/dist/chunks/{chunk-YEGPB7A7.js → chunk-5JHJNN2K.js} +4 -4
  41. package/dist/chunks/chunk-5PQ3UCKF.js +99 -0
  42. package/dist/chunks/chunk-6BWOKTVQ.mjs +87 -0
  43. package/dist/chunks/chunk-6DBRL6NA.mjs +81 -0
  44. package/dist/chunks/{chunk-C3E7CSKG.mjs → chunk-6FMDO6TT.mjs} +7 -8
  45. package/dist/chunks/{chunk-76CY4STF.js → chunk-7G65JBTN.js} +34 -66
  46. package/dist/chunks/{chunk-GMIGQ5VP.mjs → chunk-ADO7PDLY.mjs} +15 -35
  47. package/dist/chunks/{chunk-ZINDMFOI.js → chunk-AFSEYJZT.js} +24 -32
  48. package/dist/chunks/chunk-B5O6W3Z4.mjs +73 -0
  49. package/dist/chunks/{chunk-6FHK6CBR.js → chunk-B6G5TJRO.js} +7 -8
  50. package/dist/chunks/chunk-BBLBTOP4.js +205 -0
  51. package/dist/chunks/{chunk-5XVEYVYA.js → chunk-BLGQHR3M.js} +5 -8
  52. package/dist/chunks/{chunk-LVTD2UQN.mjs → chunk-BPUQ2CO2.mjs} +2 -2
  53. package/dist/chunks/{chunk-AWBGWBFS.js → chunk-BSZ2LN6E.js} +21 -27
  54. package/dist/chunks/chunk-C2DSAJTL.js +109 -0
  55. package/dist/chunks/{chunk-KWPIEHD2.mjs → chunk-CA3SOLI3.mjs} +1 -1
  56. package/dist/chunks/{chunk-MPKRXMCJ.js → chunk-CSJDDREF.js} +7 -10
  57. package/dist/chunks/chunk-CUTMLBC3.mjs +86 -0
  58. package/dist/chunks/chunk-CV4GMFWP.js +174 -0
  59. package/dist/chunks/{chunk-SXLMI7CZ.mjs → chunk-CWMLTXOH.mjs} +162 -234
  60. package/dist/chunks/chunk-CZC76ZD5.js +10 -0
  61. package/dist/chunks/chunk-DICN6GKE.js +99 -0
  62. package/dist/chunks/{chunk-TLTEUIBY.js → chunk-DLFV7ZZV.js} +4 -4
  63. package/dist/chunks/chunk-DO6VK2QQ.mjs +108 -0
  64. package/dist/chunks/chunk-DYPPVXQF.js +143 -0
  65. package/dist/chunks/{chunk-GQP7IXH2.mjs → chunk-ECVAVQUY.mjs} +23 -31
  66. package/dist/chunks/{chunk-3CHRUKSJ.mjs → chunk-EHAUUUWB.mjs} +3 -3
  67. package/dist/chunks/chunk-EJY7IVSK.mjs +31 -0
  68. package/dist/chunks/{chunk-G4XJG7XI.js → chunk-EVOOTSY5.js} +3 -10
  69. package/dist/chunks/chunk-FUIBYZZ4.mjs +98 -0
  70. package/dist/chunks/{chunk-VH5FF6DZ.mjs → chunk-GX6GSWX3.mjs} +7 -7
  71. package/dist/chunks/chunk-H2G5FMRN.mjs +75 -0
  72. package/dist/chunks/chunk-H2V7RHYV.mjs +120 -0
  73. package/dist/chunks/{chunk-DDMZSNTG.js → chunk-HFBTS42N.js} +168 -240
  74. package/dist/chunks/{chunk-OGUTGD4J.mjs → chunk-HNLI646G.mjs} +71 -39
  75. package/dist/chunks/{chunk-C6H2UNOX.js → chunk-IE4DGLMH.js} +13 -21
  76. package/dist/chunks/{chunk-U76LT5GE.js → chunk-IOSIQLZL.js} +2 -2
  77. package/dist/chunks/{chunk-ZCMKIB5U.js → chunk-J5ZKGPBY.js} +33 -41
  78. package/dist/chunks/{chunk-JUZHWKGS.mjs → chunk-K2TBLM3F.mjs} +6 -12
  79. package/dist/chunks/chunk-KZ7S5VN2.js +7 -0
  80. package/dist/chunks/{chunk-FHPHDK3O.mjs → chunk-LI7SFBUQ.mjs} +4 -4
  81. package/dist/chunks/{chunk-7OEK2KX3.mjs → chunk-LMMON5AU.mjs} +4 -4
  82. package/dist/chunks/{chunk-6DZVNFVY.js → chunk-LOQXCHKL.js} +4 -12
  83. package/dist/chunks/{chunk-377KBJQG.js → chunk-MA2VCCIY.js} +19 -22
  84. package/dist/chunks/chunk-MCKOWMLS.mjs +8 -0
  85. package/dist/chunks/chunk-MMCA33FW.mjs +85 -0
  86. package/dist/chunks/{chunk-TR5JBBEA.mjs → chunk-MRRKW5QN.mjs} +31 -39
  87. package/dist/chunks/{chunk-76K6KXCT.js → chunk-NFIPQZ4O.js} +1 -1
  88. package/dist/chunks/chunk-NZHK76R3.js +109 -0
  89. package/dist/chunks/{chunk-I7YJB2F5.js → chunk-OMN5YQCE.js} +3 -3
  90. package/dist/chunks/{chunk-B7UU3FSS.mjs → chunk-P2T72N62.mjs} +4 -7
  91. package/dist/chunks/chunk-P3DZKXG4.js +116 -0
  92. package/dist/chunks/chunk-P73MEU7N.mjs +150 -0
  93. package/dist/chunks/chunk-PDJTSQOC.js +59 -0
  94. package/dist/chunks/{chunk-RXVYL4AU.js → chunk-PEIEVKD5.js} +7 -13
  95. package/dist/chunks/chunk-PI464222.mjs +5 -0
  96. package/dist/chunks/{chunk-IJG7J2VU.mjs → chunk-QZ4QR3XV.mjs} +30 -36
  97. package/dist/chunks/{chunk-6NTASYZO.js → chunk-RS3SBY3I.js} +61 -30
  98. package/dist/chunks/{chunk-AKIBUO5A.mjs → chunk-RX5UKRYK.mjs} +19 -26
  99. package/dist/chunks/chunk-S2GMEC43.js +109 -0
  100. package/dist/chunks/{chunk-WJ2OVQD3.mjs → chunk-SGNRVYYQ.mjs} +19 -25
  101. package/dist/chunks/{chunk-IB5UCYQY.mjs → chunk-SJMCPSVH.mjs} +15 -5
  102. package/dist/chunks/chunk-UKRU46PH.mjs +182 -0
  103. package/dist/chunks/{chunk-WNFJ4NJN.mjs → chunk-ULGYTBCT.mjs} +3 -11
  104. package/dist/chunks/{chunk-TXYYBJBQ.js → chunk-VGO4Z2WH.js} +73 -41
  105. package/dist/chunks/{chunk-LBKBCI2K.mjs → chunk-VIGRCJAE.mjs} +3 -10
  106. package/dist/chunks/chunk-VVXQZ4XH.mjs +93 -0
  107. package/dist/chunks/{chunk-Z7OKV6NW.mjs → chunk-W4GG5A7K.mjs} +12 -20
  108. package/dist/chunks/chunk-WGGBE4ZD.mjs +201 -0
  109. package/dist/chunks/{chunk-WSWD5ZUJ.js → chunk-WKCXACMZ.js} +20 -27
  110. package/dist/chunks/{chunk-GSLIY6WW.js → chunk-X2SHTVZQ.js} +17 -37
  111. package/dist/chunks/chunk-X3CTJ7TD.js +108 -0
  112. package/dist/chunks/{chunk-U6KOUYWX.mjs → chunk-XG6QG65W.mjs} +7 -10
  113. package/dist/chunks/chunk-XGIJZ3NZ.js +160 -0
  114. package/dist/chunks/chunk-YB5ZKHVB.js +64 -0
  115. package/dist/chunks/{chunk-Q7H6LCNN.js → chunk-YCG4FZC3.js} +23 -25
  116. package/dist/chunks/{chunk-JZ3PWHKS.mjs → chunk-YLO4UKSC.mjs} +18 -21
  117. package/dist/chunks/chunk-YO5MSDPX.mjs +36 -0
  118. package/dist/chunks/{chunk-Q2TMXHPK.js → chunk-YZV6FWE7.js} +25 -43
  119. package/dist/chunks/chunk-ZI4LN2B2.js +96 -0
  120. package/dist/chunks/chunk-ZU4AWAFT.mjs +137 -0
  121. package/dist/chunks/chunk-ZWSIIGA3.mjs +58 -0
  122. package/dist/countdown.js +4 -4
  123. package/dist/countdown.mjs +2 -2
  124. package/dist/counter.js +2 -2
  125. package/dist/counter.mjs +1 -1
  126. package/dist/data-list.js +5 -5
  127. package/dist/data-list.mjs +4 -4
  128. package/dist/date-picker.d.mts +17 -0
  129. package/dist/date-picker.d.ts +17 -0
  130. package/dist/date-picker.js +12 -0
  131. package/dist/date-picker.mjs +3 -0
  132. package/dist/divider.js +4 -4
  133. package/dist/divider.mjs +2 -2
  134. package/dist/drawer.d.mts +1 -1
  135. package/dist/drawer.d.ts +1 -1
  136. package/dist/drawer.js +11 -11
  137. package/dist/drawer.mjs +2 -2
  138. package/dist/dropdown-menu.d.mts +30 -0
  139. package/dist/dropdown-menu.d.ts +30 -0
  140. package/dist/dropdown-menu.js +32 -0
  141. package/dist/dropdown-menu.mjs +3 -0
  142. package/dist/ellipsis.js +3 -3
  143. package/dist/ellipsis.mjs +2 -2
  144. package/dist/empty-state.d.mts +16 -0
  145. package/dist/empty-state.d.ts +16 -0
  146. package/dist/empty-state.js +16 -0
  147. package/dist/empty-state.mjs +3 -0
  148. package/dist/error-boundary.d.mts +1 -1
  149. package/dist/error-boundary.d.ts +1 -1
  150. package/dist/error-boundary.js +2 -2
  151. package/dist/error-boundary.mjs +1 -1
  152. package/dist/index.d.mts +15 -0
  153. package/dist/index.d.ts +15 -0
  154. package/dist/index.js +322 -200
  155. package/dist/index.mjs +49 -35
  156. package/dist/infinite-scroll.js +3 -3
  157. package/dist/infinite-scroll.mjs +2 -2
  158. package/dist/marquee.js +3 -3
  159. package/dist/marquee.mjs +2 -2
  160. package/dist/modal/index.js +13 -13
  161. package/dist/modal/index.mjs +4 -4
  162. package/dist/number-input.d.mts +1 -1
  163. package/dist/number-input.d.ts +1 -1
  164. package/dist/number-input.js +5 -5
  165. package/dist/number-input.mjs +2 -2
  166. package/dist/nx-image.d.mts +13 -0
  167. package/dist/nx-image.d.ts +13 -0
  168. package/dist/nx-image.js +12 -0
  169. package/dist/nx-image.mjs +3 -0
  170. package/dist/pagination.d.mts +1 -0
  171. package/dist/pagination.d.ts +1 -0
  172. package/dist/pagination.js +5 -5
  173. package/dist/pagination.mjs +2 -2
  174. package/dist/popover.d.mts +1 -1
  175. package/dist/popover.d.ts +1 -1
  176. package/dist/popover.js +8 -8
  177. package/dist/popover.mjs +2 -2
  178. package/dist/price-input.d.mts +36 -0
  179. package/dist/price-input.d.ts +36 -0
  180. package/dist/price-input.js +16 -0
  181. package/dist/price-input.mjs +3 -0
  182. package/dist/progress.d.mts +18 -0
  183. package/dist/progress.d.ts +18 -0
  184. package/dist/progress.js +16 -0
  185. package/dist/progress.mjs +3 -0
  186. package/dist/radio-group.js +6 -6
  187. package/dist/radio-group.mjs +2 -2
  188. package/dist/schemas/_all.json +2356 -404
  189. package/dist/schemas/accordion.json +14 -11
  190. package/dist/schemas/alert.json +49 -0
  191. package/dist/schemas/avatar.json +13 -7
  192. package/dist/schemas/badge.json +76 -0
  193. package/dist/schemas/breadcrumb.json +47 -0
  194. package/dist/schemas/button.json +27 -9
  195. package/dist/schemas/carousel.json +10 -4
  196. package/dist/schemas/carouselButton.json +20 -0
  197. package/dist/schemas/carouselDots.json +17 -0
  198. package/dist/schemas/carouselSlide.json +20 -0
  199. package/dist/schemas/checkBox.json +33 -8
  200. package/dist/schemas/chip.json +15 -6
  201. package/dist/schemas/clientOnly.json +19 -0
  202. package/dist/schemas/countdown.json +10 -7
  203. package/dist/schemas/counter.json +15 -9
  204. package/dist/schemas/dataList.json +10 -10
  205. package/dist/schemas/datePicker.json +56 -0
  206. package/dist/schemas/divider.json +8 -5
  207. package/dist/schemas/drawer.json +24 -2
  208. package/dist/schemas/drawerClose.json +24 -0
  209. package/dist/schemas/drawerContent.json +9 -6
  210. package/dist/schemas/drawerDescription.json +20 -0
  211. package/dist/schemas/drawerTitle.json +20 -0
  212. package/dist/schemas/drawerTrigger.json +24 -0
  213. package/dist/schemas/dropdownMenu.json +83 -0
  214. package/dist/schemas/ellipsis.json +17 -7
  215. package/dist/schemas/emptyState.json +44 -0
  216. package/dist/schemas/errorBoundary.json +22 -0
  217. package/dist/schemas/infiniteScroll.json +18 -9
  218. package/dist/schemas/marquee.json +12 -6
  219. package/dist/schemas/modalCall.json +81 -3
  220. package/dist/schemas/modalTemplate.json +67 -14
  221. package/dist/schemas/numberInput.json +42 -12
  222. package/dist/schemas/nxImage.json +56 -0
  223. package/dist/schemas/pagination.json +13 -6
  224. package/dist/schemas/popover.json +18 -9
  225. package/dist/schemas/priceInput.json +104 -0
  226. package/dist/schemas/progress.json +63 -0
  227. package/dist/schemas/radioGroup.json +19 -9
  228. package/dist/schemas/radioItem.json +12 -5
  229. package/dist/schemas/select.json +15 -9
  230. package/dist/schemas/selectItem.json +7 -4
  231. package/dist/schemas/skeleton.json +12 -6
  232. package/dist/schemas/slider.json +78 -0
  233. package/dist/schemas/spinner.json +11 -4
  234. package/dist/schemas/stepper.json +73 -0
  235. package/dist/schemas/switch.json +23 -5
  236. package/dist/schemas/tab.json +17 -14
  237. package/dist/schemas/table.json +75 -0
  238. package/dist/schemas/tableRow.json +32 -0
  239. package/dist/schemas/tagInput.json +70 -0
  240. package/dist/schemas/tdColumn.json +107 -0
  241. package/dist/schemas/textArea.json +72 -7
  242. package/dist/schemas/textInput.json +72 -10
  243. package/dist/schemas/themeProvider.json +65 -0
  244. package/dist/schemas/toastOptions.json +81 -0
  245. package/dist/schemas/toaster.json +76 -0
  246. package/dist/schemas/toggleGroup.json +88 -0
  247. package/dist/schemas/tooltip.json +12 -9
  248. package/dist/schemas/virtualGrid.json +22 -11
  249. package/dist/schemas/virtualList.json +14 -8
  250. package/dist/schemas.d.mts +1360 -81
  251. package/dist/schemas.d.ts +1360 -81
  252. package/dist/schemas.js +725 -273
  253. package/dist/schemas.mjs +698 -273
  254. package/dist/select.js +6 -6
  255. package/dist/select.mjs +2 -2
  256. package/dist/skeleton.js +3 -3
  257. package/dist/skeleton.mjs +2 -2
  258. package/dist/slider.d.mts +20 -0
  259. package/dist/slider.d.ts +20 -0
  260. package/dist/slider.js +16 -0
  261. package/dist/slider.mjs +3 -0
  262. package/dist/spinner.js +3 -3
  263. package/dist/spinner.mjs +2 -2
  264. package/dist/stepper.d.mts +20 -0
  265. package/dist/stepper.d.ts +20 -0
  266. package/dist/stepper.js +16 -0
  267. package/dist/stepper.mjs +3 -0
  268. package/dist/styles/layer.d.mts +3 -0
  269. package/dist/styles/layer.d.ts +3 -0
  270. package/dist/styles/layer.js +18 -0
  271. package/dist/styles/layer.mjs +16 -0
  272. package/dist/styles.css +3872 -2
  273. package/dist/styles.js +2 -5
  274. package/dist/styles.layered.css +3875 -0
  275. package/dist/styles.mjs +1 -4
  276. package/dist/switch.js +4 -4
  277. package/dist/switch.mjs +2 -2
  278. package/dist/tab.js +5 -5
  279. package/dist/tab.mjs +2 -2
  280. package/dist/table.d.mts +2 -2
  281. package/dist/table.d.ts +2 -2
  282. package/dist/table.js +9 -9
  283. package/dist/table.mjs +3 -3
  284. package/dist/tag-input.d.mts +21 -0
  285. package/dist/tag-input.d.ts +21 -0
  286. package/dist/tag-input.js +16 -0
  287. package/dist/tag-input.mjs +3 -0
  288. package/dist/text-area.d.mts +5 -1
  289. package/dist/text-area.d.ts +5 -1
  290. package/dist/text-area.js +4 -4
  291. package/dist/text-area.mjs +2 -2
  292. package/dist/text-input.d.mts +5 -1
  293. package/dist/text-input.d.ts +5 -1
  294. package/dist/text-input.js +4 -4
  295. package/dist/text-input.mjs +2 -2
  296. package/dist/toast.js +5 -5
  297. package/dist/toast.mjs +2 -2
  298. package/dist/toggle-group.d.mts +36 -0
  299. package/dist/toggle-group.d.ts +36 -0
  300. package/dist/toggle-group.js +16 -0
  301. package/dist/toggle-group.mjs +3 -0
  302. package/dist/tooltip.js +5 -5
  303. package/dist/tooltip.mjs +2 -2
  304. package/dist/utils/cn.d.mts +0 -10
  305. package/dist/utils/cn.d.ts +0 -10
  306. package/dist/utils/cn.js +2 -2
  307. package/dist/utils/cn.mjs +1 -1
  308. package/dist/virtual-scroll.js +4 -4
  309. package/dist/virtual-scroll.mjs +2 -2
  310. package/package.json +90 -17
  311. package/scripts/setup-cursor-rules.cjs +6 -6
  312. package/dist/chunks/chunk-7MT3QYE6.js +0 -92
  313. package/dist/chunks/chunk-FA2OPP3U.mjs +0 -140
  314. package/dist/chunks/chunk-FKZI2HTI.js +0 -104
  315. package/dist/chunks/chunk-NCQDOPBR.mjs +0 -86
  316. package/dist/chunks/chunk-NTN55ZIX.mjs +0 -113
  317. package/dist/chunks/chunk-Q7GQVAYY.js +0 -88
  318. package/dist/chunks/chunk-QJNQCLMV.js +0 -25
  319. package/dist/chunks/chunk-UDQXLI5Y.mjs +0 -81
  320. package/dist/chunks/chunk-UR6JOKVB.mjs +0 -65
  321. package/dist/chunks/chunk-WVIEIRK2.js +0 -136
  322. package/dist/chunks/chunk-XALPBGSC.mjs +0 -23
  323. package/dist/schemas/typography.json +0 -70
  324. package/dist/typography.d.mts +0 -19
  325. package/dist/typography.d.ts +0 -19
  326. package/dist/typography.js +0 -102
  327. package/dist/typography.mjs +0 -79
@@ -0,0 +1,3875 @@
1
+ @layer nexus {
2
+ /*
3
+ * @nexus-cross/design-system — Pure CSS
4
+ *
5
+ * BEM 클래스 네이밍(.nexus-*)으로 CSS specificity 기반 동작.
6
+ * 소비자 CSS는 디자인 시스템 이후에 로드되므로 className으로 오버라이드 가능.
7
+ */
8
+
9
+ /* ═══════════════════════════════════════════
10
+ Component Tokens (:root)
11
+ 소비자가 :root에서 오버라이드 가능
12
+ ═══════════════════════════════════════════ */
13
+
14
+ :root {
15
+ /* ── Button: Color ── */
16
+ --color-comp-btn-focus-ring: var(--color-accent-primary);
17
+
18
+ --color-comp-btn-primary-base: var(--color-accent-primary);
19
+ --color-comp-btn-primary-hover: var(--color-accent-primary-hover);
20
+ --color-comp-btn-primary-pressed: var(--color-accent-primary-pressed);
21
+ --color-comp-btn-primary-on: var(--color-accent-on-primary);
22
+ --color-comp-btn-primary-text: var(
23
+ --color-accent-primary-intense,
24
+ var(--color-accent-primary)
25
+ );
26
+ --color-comp-btn-primary-subtle-fill: var(--color-accent-primary-disabled);
27
+ --color-comp-btn-primary-subtle-bg: var(--color-accent-primary-bg);
28
+
29
+ --color-comp-btn-secondary-base: var(--color-accent-secondary);
30
+ --color-comp-btn-secondary-hover: var(--color-accent-secondary-hover);
31
+ --color-comp-btn-secondary-pressed: var(--color-accent-secondary-pressed);
32
+ --color-comp-btn-secondary-on: var(--color-accent-on-secondary);
33
+ --color-comp-btn-secondary-text: var(
34
+ --color-accent-secondary-intense,
35
+ var(--color-accent-secondary)
36
+ );
37
+ --color-comp-btn-secondary-subtle-fill: var(
38
+ --color-accent-secondary-disabled
39
+ );
40
+ --color-comp-btn-secondary-subtle-bg: var(--color-accent-secondary-bg);
41
+
42
+ --color-comp-btn-normal-base: var(--color-surface-subtle);
43
+ --color-comp-btn-normal-hover: var(--color-surface-subtle-hover);
44
+ --color-comp-btn-normal-pressed: var(--color-surface-subtle-hover);
45
+ --color-comp-btn-normal-on: var(--color-text-primary);
46
+ --color-comp-btn-normal-text: var(--color-text-primary);
47
+ --color-comp-btn-normal-subtle-fill: var(--color-surface-subtle);
48
+ --color-comp-btn-normal-subtle-bg: var(--color-surface-subtle-hover);
49
+ --color-comp-btn-normal-border: var(--color-border-default);
50
+ --color-comp-btn-normal-border-hover: var(
51
+ --color-border-default-hover,
52
+ var(--color-border-default)
53
+ );
54
+
55
+ --color-comp-btn-danger-base: var(--color-status-danger);
56
+ --color-comp-btn-danger-hover: var(--color-status-danger-hover);
57
+ --color-comp-btn-danger-pressed: var(--color-status-danger-pressed);
58
+ --color-comp-btn-danger-on: var(--color-static-white);
59
+ --color-comp-btn-danger-text: var(
60
+ --color-status-danger-intense,
61
+ var(--color-status-danger)
62
+ );
63
+ --color-comp-btn-danger-subtle-fill: var(--color-status-danger-disabled);
64
+ --color-comp-btn-danger-subtle-bg: var(--color-status-danger-bg);
65
+
66
+ /* ── Button: Radius ── */
67
+ --radius-comp-btn-xl: 0.75rem;
68
+ --radius-comp-btn-lg: 0.5rem;
69
+ --radius-comp-btn-md: 0.5rem;
70
+ --radius-comp-btn-sm: 0.25rem;
71
+
72
+ /* ── Button: Spacing ── */
73
+ --spacing-comp-btn-gap: var(--spacing-gap-sm, 0.5rem);
74
+ --spacing-comp-btn-xl-h: 3rem;
75
+ --spacing-comp-btn-xl-px: var(--spacing-padding-lg, 1.5rem);
76
+ --spacing-comp-btn-lg-h: 2.5rem;
77
+ --spacing-comp-btn-lg-px: var(--spacing-padding-lg, 1.5rem);
78
+ --spacing-comp-btn-md-h: 1.875rem;
79
+ --spacing-comp-btn-md-px: var(--spacing-padding-sm, 0.75rem);
80
+ --spacing-comp-btn-sm-px: var(--spacing-padding-xs, 0.5rem);
81
+ --spacing-comp-btn-sm-py: var(--spacing-padding-2xs, 0.25rem);
82
+
83
+ /* ── Button: Font ── */
84
+ --text-comp-btn-xl: var(--text-text-base, 1rem);
85
+ --text-comp-btn-lg: var(--text-text-base, 1rem);
86
+ --text-comp-btn-md: var(--text-text-sm, 0.875rem);
87
+ --text-comp-btn-sm: var(--text-text-xs, 0.75rem);
88
+
89
+ /* ── Button: Misc ── */
90
+ --shadow-comp-btn: none;
91
+ --opacity-comp-btn-disabled: 0.5;
92
+
93
+ /* ── Shared: Shadow ── */
94
+ --shadow-comp-sm: var(--shadow-elevation-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
95
+ --shadow-comp-md: var(--shadow-elevation-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));
96
+ --shadow-comp-lg: var(
97
+ --shadow-elevation-lg,
98
+ 0 10px 15px -3px rgb(0 0 0 / 0.1)
99
+ );
100
+
101
+ /* ── Shared: Overlay ── */
102
+ --color-comp-overlay: var(--color-overlay-dim, rgba(0, 0, 0, 0.6));
103
+
104
+ /* ── ErrorBoundary ── */
105
+ --color-comp-error-border: var(--color-status-danger);
106
+ --color-comp-error-bg: var(--color-status-danger-bg, #fef2f2);
107
+ --color-comp-error-text: var(--color-status-danger-intense, #991b1b);
108
+ }
109
+
110
+ /* ═══════════════════════════════════════════
111
+ 컴포넌트 스타일
112
+ ═══════════════════════════════════════════ */
113
+
114
+ /* ─── Shared: sr-only ─── */
115
+ .nexus-sr-only {
116
+ position: absolute;
117
+ width: 1px;
118
+ height: 1px;
119
+ padding: 0;
120
+ margin: -1px;
121
+ overflow: hidden;
122
+ clip: rect(0, 0, 0, 0);
123
+ white-space: nowrap;
124
+ border-width: 0;
125
+ }
126
+
127
+ /* ═══════════════════════════════════════════
128
+ Button
129
+ ═══════════════════════════════════════════ */
130
+
131
+ .nexus-btn {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ gap: var(--spacing-comp-btn-gap);
136
+ white-space: nowrap;
137
+ user-select: none;
138
+ box-shadow: var(--shadow-comp-btn);
139
+ transition-property: color, background-color, border-color;
140
+ transition-duration: 200ms;
141
+ border: none;
142
+ background: none;
143
+ cursor: pointer;
144
+ font: inherit;
145
+ color: inherit;
146
+ padding: 0;
147
+ margin: 0;
148
+ text-decoration: none;
149
+ }
150
+ .nexus-btn:disabled,
151
+ .nexus-btn[aria-disabled='true'] {
152
+ pointer-events: none;
153
+ opacity: var(--opacity-comp-btn-disabled);
154
+ }
155
+ .nexus-btn:focus-visible {
156
+ outline: 2px solid
157
+ color-mix(in srgb, var(--color-comp-btn-focus-ring) 50%, transparent);
158
+ outline-offset: 2px;
159
+ }
160
+
161
+ /* Variant: contained */
162
+ .nexus-btn--contained {
163
+ background: var(--_btn-base);
164
+ color: var(--_btn-on);
165
+ }
166
+ .nexus-btn--contained:hover {
167
+ background: var(--_btn-hover);
168
+ }
169
+ .nexus-btn--contained:active {
170
+ background: var(--_btn-pressed);
171
+ }
172
+
173
+ /* Variant: outlined */
174
+ .nexus-btn--outlined {
175
+ border: 1px solid var(--_btn-border);
176
+ color: var(--_btn-text);
177
+ background: var(--_btn-outlined-bg);
178
+ }
179
+ .nexus-btn--outlined:hover {
180
+ background: var(--_btn-outlined-hover-bg);
181
+ border-color: var(--_btn-border-hover);
182
+ }
183
+ .nexus-btn--outlined:active {
184
+ background: var(--_btn-outlined-pressed-bg);
185
+ border-color: var(--_btn-border-hover);
186
+ }
187
+
188
+ /* Variant: subtle */
189
+ .nexus-btn--subtle {
190
+ background: var(--_btn-subtle-fill);
191
+ color: var(--_btn-text);
192
+ }
193
+ .nexus-btn--subtle:hover {
194
+ background: var(--_btn-light-bg);
195
+ }
196
+ .nexus-btn--subtle:active {
197
+ background: var(--_btn-light-bg);
198
+ }
199
+
200
+ /* Variant: ghost */
201
+ .nexus-btn--ghost {
202
+ background: transparent;
203
+ color: var(--_btn-text);
204
+ }
205
+ .nexus-btn--ghost:hover {
206
+ background: var(--_btn-ghost-hover-bg);
207
+ }
208
+ .nexus-btn--ghost:active {
209
+ background: var(--_btn-ghost-pressed-bg);
210
+ }
211
+
212
+ /* Sizes */
213
+ .nexus-btn--xl {
214
+ height: var(--spacing-comp-btn-xl-h);
215
+ padding-inline: var(--spacing-comp-btn-xl-px);
216
+ font-size: var(--text-comp-btn-xl);
217
+ font-weight: 600;
218
+ border-radius: var(--radius-comp-btn-xl);
219
+ }
220
+ .nexus-btn--lg {
221
+ height: var(--spacing-comp-btn-lg-h);
222
+ padding-inline: var(--spacing-comp-btn-lg-px);
223
+ font-size: var(--text-comp-btn-lg);
224
+ font-weight: 600;
225
+ border-radius: var(--radius-comp-btn-lg);
226
+ }
227
+ .nexus-btn--md {
228
+ height: var(--spacing-comp-btn-md-h);
229
+ padding-inline: var(--spacing-comp-btn-md-px);
230
+ font-size: var(--text-comp-btn-md);
231
+ font-weight: 500;
232
+ border-radius: var(--radius-comp-btn-md);
233
+ }
234
+ .nexus-btn--sm {
235
+ padding-inline: var(--spacing-comp-btn-sm-px);
236
+ padding-block: var(--spacing-comp-btn-sm-py);
237
+ font-size: var(--text-comp-btn-sm);
238
+ font-weight: 500;
239
+ border-radius: var(--radius-comp-btn-sm);
240
+ }
241
+
242
+ /* Radius override */
243
+ .nexus-btn--circle {
244
+ border-radius: 9999px !important;
245
+ }
246
+
247
+ /* Semantic palette — compound selectors (cascade 방지) */
248
+ .nexus-btn--primary {
249
+ --_btn-base: var(--color-comp-btn-primary-base);
250
+ --_btn-hover: var(--color-comp-btn-primary-hover);
251
+ --_btn-pressed: var(--color-comp-btn-primary-pressed);
252
+ --_btn-on: var(--color-comp-btn-primary-on);
253
+ --_btn-text: var(--color-comp-btn-primary-text);
254
+ --_btn-subtle-fill: var(--color-comp-btn-primary-subtle-fill);
255
+ --_btn-light-bg: var(--color-comp-btn-primary-subtle-bg);
256
+ --_btn-border: var(--color-accent-primary-focus, var(--color-accent-primary));
257
+ --_btn-border-hover: var(
258
+ --color-accent-primary-focus,
259
+ var(--color-accent-primary)
260
+ );
261
+ --_btn-outlined-bg: var(--color-surface-default);
262
+ --_btn-outlined-hover-bg: var(--color-comp-btn-primary-subtle-bg);
263
+ --_btn-outlined-pressed-bg: var(--color-surface-default);
264
+ --_btn-ghost-hover-bg: var(--color-comp-btn-primary-subtle-bg);
265
+ --_btn-ghost-pressed-bg: var(--color-comp-btn-primary-subtle-fill);
266
+ }
267
+ .nexus-btn--secondary {
268
+ --_btn-base: var(--color-comp-btn-secondary-base);
269
+ --_btn-hover: var(--color-comp-btn-secondary-hover);
270
+ --_btn-pressed: var(--color-comp-btn-secondary-pressed);
271
+ --_btn-on: var(--color-comp-btn-secondary-on);
272
+ --_btn-text: var(--color-comp-btn-secondary-text);
273
+ --_btn-subtle-fill: var(--color-comp-btn-secondary-subtle-fill);
274
+ --_btn-light-bg: var(--color-comp-btn-secondary-subtle-bg);
275
+ --_btn-border: var(
276
+ --color-accent-secondary-focus,
277
+ var(--color-accent-secondary)
278
+ );
279
+ --_btn-border-hover: var(
280
+ --color-accent-secondary-focus,
281
+ var(--color-accent-secondary)
282
+ );
283
+ --_btn-outlined-bg: var(--color-surface-default);
284
+ --_btn-outlined-hover-bg: var(--color-comp-btn-secondary-subtle-bg);
285
+ --_btn-outlined-pressed-bg: var(--color-surface-default);
286
+ --_btn-ghost-hover-bg: var(--color-comp-btn-secondary-subtle-bg);
287
+ --_btn-ghost-pressed-bg: var(--color-comp-btn-secondary-subtle-fill);
288
+ }
289
+ .nexus-btn--normal {
290
+ --_btn-base: var(--color-comp-btn-normal-base);
291
+ --_btn-hover: var(--color-comp-btn-normal-hover);
292
+ --_btn-pressed: var(--color-comp-btn-normal-pressed);
293
+ --_btn-on: var(--color-comp-btn-normal-on);
294
+ --_btn-text: var(--color-comp-btn-normal-text);
295
+ --_btn-subtle-fill: var(--color-comp-btn-normal-subtle-fill);
296
+ --_btn-light-bg: var(--color-comp-btn-normal-subtle-bg);
297
+ --_btn-border: var(--color-comp-btn-normal-border);
298
+ --_btn-border-hover: var(--color-comp-btn-normal-border-hover);
299
+ --_btn-outlined-bg: var(--color-surface-default);
300
+ --_btn-outlined-hover-bg: var(--color-comp-btn-normal-subtle-bg);
301
+ --_btn-outlined-pressed-bg: var(
302
+ --color-surface-pressed,
303
+ var(--color-surface-strong)
304
+ );
305
+ --_btn-ghost-hover-bg: var(--color-comp-btn-normal-subtle-bg);
306
+ --_btn-ghost-pressed-bg: var(
307
+ --color-surface-pressed,
308
+ var(--color-surface-strong)
309
+ );
310
+ }
311
+ .nexus-btn--danger {
312
+ --_btn-base: var(--color-comp-btn-danger-base);
313
+ --_btn-hover: var(--color-comp-btn-danger-hover);
314
+ --_btn-pressed: var(--color-comp-btn-danger-pressed);
315
+ --_btn-on: var(--color-comp-btn-danger-on);
316
+ --_btn-text: var(--color-comp-btn-danger-text);
317
+ --_btn-subtle-fill: var(--color-comp-btn-danger-subtle-fill);
318
+ --_btn-light-bg: var(--color-comp-btn-danger-subtle-bg);
319
+ --_btn-border: var(--color-status-danger-focus, var(--color-status-danger));
320
+ --_btn-border-hover: var(
321
+ --color-status-danger-focus,
322
+ var(--color-status-danger)
323
+ );
324
+ --_btn-outlined-bg: var(--color-surface-default);
325
+ --_btn-outlined-hover-bg: var(--color-comp-btn-danger-subtle-bg);
326
+ --_btn-outlined-pressed-bg: var(--color-surface-default);
327
+ --_btn-ghost-hover-bg: var(--color-comp-btn-danger-subtle-bg);
328
+ --_btn-ghost-pressed-bg: var(--color-comp-btn-danger-subtle-fill);
329
+ }
330
+
331
+ /* ═══════════════════════════════════════════
332
+ TextInput
333
+ ═══════════════════════════════════════════ */
334
+
335
+ /* ── Field wrapper ── */
336
+ .nexus-text-input-field {
337
+ display: flex;
338
+ flex-direction: column;
339
+ gap: 0.25rem;
340
+ }
341
+ .nexus-text-input-field__label {
342
+ font-size: var(--text-text-sm, 0.875rem);
343
+ font-weight: 600;
344
+ color: var(--color-text-muted);
345
+ line-height: 1;
346
+ }
347
+ .nexus-text-input-field__footer {
348
+ display: flex;
349
+ align-items: center;
350
+ gap: 0.5rem;
351
+ }
352
+ .nexus-text-input-field__description {
353
+ font-size: var(--text-text-xs, 0.75rem);
354
+ color: var(--color-text-muted);
355
+ line-height: 1.5;
356
+ letter-spacing: -0.12px;
357
+ }
358
+ .nexus-text-input-field__description--error {
359
+ color: var(--color-status-danger);
360
+ }
361
+ .nexus-text-input-field__count {
362
+ font-size: var(--text-text-xs, 0.75rem);
363
+ color: var(--color-text-muted);
364
+ margin-left: auto;
365
+ flex-shrink: 0;
366
+ }
367
+ .nexus-text-input-field__count--error {
368
+ color: var(--color-status-danger);
369
+ }
370
+
371
+ /* ── Input box ── */
372
+ .nexus-text-input {
373
+ display: flex;
374
+ align-items: center;
375
+ gap: 0.5rem;
376
+ border-radius: var(--radius-corner-md, 0.5rem);
377
+ border: 1px solid var(--color-border-default);
378
+ background: var(--color-surface-default);
379
+ font-size: var(--text-text-sm, 0.875rem);
380
+ font-weight: 500;
381
+ line-height: 1;
382
+ color: var(--color-text-primary);
383
+ transition:
384
+ border-color 200ms,
385
+ box-shadow 200ms;
386
+ }
387
+ :where(.nexus-text-input) {
388
+ width: 100%;
389
+ }
390
+ .nexus-text-input:hover:not(.nexus-text-input--disabled):not(:focus-within) {
391
+ border-color: var(--color-border-default-hover);
392
+ box-shadow: 0 0 0 0.5px var(--color-border-default-hover);
393
+ }
394
+ .nexus-text-input--default:focus-within {
395
+ border-color: var(--color-accent-primary);
396
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
397
+ }
398
+ .nexus-text-input--error {
399
+ border-color: var(--color-status-danger);
400
+ }
401
+ .nexus-text-input--error:focus-within {
402
+ border-color: var(--color-status-danger);
403
+ box-shadow: 0 0 0 0.5px var(--color-status-danger);
404
+ }
405
+ .nexus-text-input--disabled {
406
+ cursor: not-allowed;
407
+ background: var(--color-surface-strong);
408
+ border-color: var(--color-border-medium);
409
+ color: var(--color-text-muted);
410
+ }
411
+
412
+ /* ── Sizes ── */
413
+ .nexus-text-input--xl {
414
+ padding: calc(var(--spacing-padding-md, 1rem) - 1px)
415
+ var(--spacing-padding-md, 1rem);
416
+ font-size: var(--text-text-base, 1rem);
417
+ }
418
+ .nexus-text-input--lg {
419
+ padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px)
420
+ var(--spacing-padding-sm, 0.75rem);
421
+ font-size: var(--text-text-base, 1rem);
422
+ }
423
+ .nexus-text-input--md {
424
+ padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px)
425
+ var(--spacing-padding-sm, 0.75rem);
426
+ font-size: var(--text-text-sm, 0.875rem);
427
+ }
428
+
429
+ /* ── Inner elements ── */
430
+ .nexus-text-input__inner {
431
+ flex: 1;
432
+ min-width: 0;
433
+ padding: 0;
434
+ background: transparent;
435
+ border: none;
436
+ outline: none;
437
+ color: inherit;
438
+ font: inherit;
439
+ }
440
+ .nexus-text-input__inner:focus-visible {
441
+ outline: none;
442
+ }
443
+ .nexus-text-input__inner::placeholder {
444
+ color: var(--color-text-muted);
445
+ }
446
+ .nexus-text-input__icon {
447
+ display: flex;
448
+ flex-shrink: 0;
449
+ color: var(--color-text-muted);
450
+ }
451
+ .nexus-text-input__clear {
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ flex-shrink: 0;
456
+ width: 1rem;
457
+ height: 1rem;
458
+ border: none;
459
+ background: transparent;
460
+ color: var(--color-text-muted);
461
+ cursor: pointer;
462
+ padding: 0;
463
+ transition: color 150ms;
464
+ }
465
+ .nexus-text-input__clear:hover {
466
+ color: var(--color-icon-tertiary-hover);
467
+ background: transparent;
468
+ }
469
+
470
+ /* ═══════════════════════════════════════════
471
+ PriceInput
472
+ ═══════════════════════════════════════════ */
473
+
474
+ /* ── Field wrapper ── */
475
+ .nexus-price-input-field {
476
+ display: flex;
477
+ flex-direction: column;
478
+ gap: 0.25rem;
479
+ }
480
+ .nexus-price-input-field__header {
481
+ display: flex;
482
+ align-items: baseline;
483
+ justify-content: space-between;
484
+ gap: 0.5rem;
485
+ }
486
+ .nexus-price-input-field__label {
487
+ font-size: var(--text-text-sm, 0.875rem);
488
+ font-weight: 600;
489
+ color: var(--color-text-tertiary);
490
+ line-height: 1;
491
+ }
492
+ .nexus-price-input-field__balance {
493
+ display: inline-flex;
494
+ align-items: baseline;
495
+ gap: 0.375rem;
496
+ margin-left: auto;
497
+ padding: 0;
498
+ border: none;
499
+ background: transparent;
500
+ font-size: var(--text-text-xs, 0.75rem);
501
+ font-weight: 400;
502
+ color: var(--color-text-tertiary);
503
+ cursor: pointer;
504
+ line-height: 1.5;
505
+ letter-spacing: -0.12px;
506
+ transition: color 150ms;
507
+ }
508
+ .nexus-price-input-field__balance:hover {
509
+ color: var(--color-text-tertiary);
510
+ }
511
+ .nexus-price-input-field__balance:disabled {
512
+ cursor: not-allowed;
513
+ opacity: var(--opacity-disabled-text, 0.5);
514
+ }
515
+ .nexus-price-input-field__balance-value {
516
+ font-weight: 400;
517
+ color: var(--color-text-secondary);
518
+ text-decoration: underline;
519
+ transition: color 150ms;
520
+ }
521
+ .nexus-price-input-field__balance:hover
522
+ .nexus-price-input-field__balance-value {
523
+ color: var(--color-text-primary);
524
+ }
525
+ .nexus-price-input-field__balance-value--exceeded {
526
+ color: var(--color-status-danger);
527
+ }
528
+ .nexus-price-input-field__balance:hover
529
+ .nexus-price-input-field__balance-value--exceeded {
530
+ color: var(--color-status-danger);
531
+ }
532
+ .nexus-price-input-field__description {
533
+ font-size: var(--text-text-xs, 0.75rem);
534
+ color: var(--color-text-tertiary);
535
+ line-height: 1.5;
536
+ letter-spacing: -0.12px;
537
+ }
538
+ .nexus-price-input-field__description--error {
539
+ color: var(--color-status-danger);
540
+ }
541
+
542
+ /* ── Input box ── */
543
+ .nexus-price-input {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 0.5rem;
547
+ border-radius: var(--radius-corner-md, 0.5rem);
548
+ border: 1px solid var(--color-border-default);
549
+ background: var(--color-surface-default);
550
+ font-size: var(--text-text-sm, 0.875rem);
551
+ font-weight: 500;
552
+ line-height: 1;
553
+ color: var(--color-text-primary);
554
+ transition:
555
+ border-color 200ms,
556
+ box-shadow 200ms;
557
+ }
558
+ :where(.nexus-price-input) {
559
+ width: 100%;
560
+ }
561
+ .nexus-price-input:hover:not(.nexus-price-input--disabled):not(:focus-within) {
562
+ border-color: var(--color-border-default-hover);
563
+ box-shadow: 0 0 0 0.5px var(--color-border-default-hover);
564
+ }
565
+ .nexus-price-input--default:focus-within {
566
+ border-color: var(--color-accent-primary);
567
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
568
+ }
569
+ .nexus-price-input--error {
570
+ border-color: var(--color-status-danger);
571
+ }
572
+ .nexus-price-input--error:focus-within {
573
+ border-color: var(--color-status-danger);
574
+ box-shadow: 0 0 0 0.5px var(--color-status-danger);
575
+ }
576
+ .nexus-price-input--disabled {
577
+ cursor: not-allowed;
578
+ background: var(--color-surface-strong);
579
+ border-color: var(--color-border-medium);
580
+ color: var(--color-text-muted);
581
+ }
582
+
583
+ /* ── Sizes ── */
584
+ .nexus-price-input--xl {
585
+ padding: calc(var(--spacing-padding-md, 1rem) - 1px)
586
+ var(--spacing-padding-md, 1rem);
587
+ font-size: var(--text-text-base, 1rem);
588
+ }
589
+ .nexus-price-input--lg {
590
+ padding: calc(var(--spacing-padding-sm, 0.75rem) - 1px)
591
+ var(--spacing-padding-sm, 0.75rem);
592
+ font-size: var(--text-text-base, 1rem);
593
+ }
594
+ .nexus-price-input--md {
595
+ padding: calc(var(--spacing-padding-xs, 0.5rem) - 1px)
596
+ var(--spacing-padding-sm, 0.75rem);
597
+ font-size: var(--text-text-sm, 0.875rem);
598
+ }
599
+
600
+ /* ── Inner elements ── */
601
+ .nexus-price-input__prefix {
602
+ flex-shrink: 0;
603
+ color: var(--color-text-secondary);
604
+ font: inherit;
605
+ user-select: none;
606
+ }
607
+ .nexus-price-input__suffix {
608
+ flex-shrink: 0;
609
+ color: var(--color-text-secondary);
610
+ font: inherit;
611
+ white-space: nowrap;
612
+ user-select: none;
613
+ }
614
+ .nexus-price-input__inner {
615
+ flex: 1;
616
+ min-width: 0;
617
+ padding: 0;
618
+ background: transparent;
619
+ border: none;
620
+ outline: none;
621
+ color: inherit;
622
+ font: inherit;
623
+ }
624
+ .nexus-price-input__inner:focus-visible {
625
+ outline: none;
626
+ }
627
+ .nexus-price-input__inner::placeholder {
628
+ color: var(--color-text-muted);
629
+ }
630
+ .nexus-price-input__inner--right {
631
+ text-align: right;
632
+ }
633
+
634
+ /* ═══════════════════════════════════════════
635
+ TextArea
636
+ ═══════════════════════════════════════════ */
637
+
638
+ /* ── Field wrapper ── */
639
+ .nexus-textarea-field {
640
+ display: flex;
641
+ flex-direction: column;
642
+ gap: 0.25rem;
643
+ }
644
+ .nexus-textarea-field__label {
645
+ font-size: var(--text-label-semibold-md, 0.875rem);
646
+ font-weight: 600;
647
+ color: var(--color-text-tertiary);
648
+ line-height: 1;
649
+ }
650
+ .nexus-textarea-field__footer {
651
+ display: flex;
652
+ align-items: center;
653
+ gap: 0.5rem;
654
+ }
655
+ .nexus-textarea-field__description {
656
+ flex: 1;
657
+ min-width: 0;
658
+ font-size: var(--text-text-xs, 0.75rem);
659
+ color: var(--color-text-tertiary);
660
+ line-height: 1.5;
661
+ letter-spacing: -0.12px;
662
+ }
663
+ .nexus-textarea-field__description--error {
664
+ color: var(--color-status-danger-intense, #d20625);
665
+ }
666
+ .nexus-textarea-field__count {
667
+ font-size: var(--text-text-xs, 0.75rem);
668
+ color: var(--color-text-tertiary);
669
+ line-height: 1.5;
670
+ letter-spacing: -0.12px;
671
+ text-align: right;
672
+ flex-shrink: 0;
673
+ margin-left: auto;
674
+ }
675
+ .nexus-textarea-field__count--error {
676
+ color: var(--color-status-danger-intense, #d20625);
677
+ }
678
+
679
+ /* ── Textarea box ── */
680
+ .nexus-textarea {
681
+ border-radius: var(--radius-corner-md, 0.5rem);
682
+ border: 1px solid var(--color-border-default);
683
+ background: var(--color-surface-default);
684
+ color: var(--color-text-primary);
685
+ font-weight: 500;
686
+ line-height: 1.5;
687
+ transition:
688
+ border-color 200ms,
689
+ box-shadow 200ms;
690
+ resize: none;
691
+ min-height: 100px;
692
+ padding: var(--spacing-padding-sm, 0.75rem);
693
+ }
694
+ :where(.nexus-textarea) {
695
+ width: 100%;
696
+ }
697
+ .nexus-textarea::placeholder {
698
+ color: var(--color-text-muted);
699
+ }
700
+ .nexus-textarea:focus-visible {
701
+ outline: none;
702
+ }
703
+
704
+ /* Hover */
705
+ .nexus-textarea:hover:not(.nexus-textarea--disabled):not(:focus) {
706
+ border-color: var(--color-border-default-hover);
707
+ box-shadow: 0 0 0 0.5px var(--color-border-default-hover);
708
+ }
709
+
710
+ /* Focus — default */
711
+ .nexus-textarea--default:focus {
712
+ border-color: var(--color-accent-primary);
713
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
714
+ }
715
+
716
+ /* Error */
717
+ .nexus-textarea--error {
718
+ border-color: var(--color-status-danger-focus, #e62848);
719
+ box-shadow: 0 0 0 0.5px var(--color-status-danger-focus, #e62848);
720
+ }
721
+ .nexus-textarea--error:focus {
722
+ border-color: var(--color-status-danger-focus, #e62848);
723
+ box-shadow: 0 0 0 0.5px var(--color-status-danger-focus, #e62848);
724
+ }
725
+
726
+ /* Disabled */
727
+ .nexus-textarea--disabled {
728
+ cursor: not-allowed;
729
+ background: var(
730
+ --color-surface-default-disabled,
731
+ var(--color-surface-strong)
732
+ );
733
+ border-color: var(--color-border-medium);
734
+ color: var(--color-text-muted);
735
+ }
736
+
737
+ /* ── Sizes ── */
738
+ .nexus-textarea--lg {
739
+ font-size: var(--text-text-medium-base, 1rem);
740
+ letter-spacing: -0.16px;
741
+ }
742
+ .nexus-textarea--md {
743
+ font-size: var(--text-text-medium-sm, 0.875rem);
744
+ letter-spacing: -0.14px;
745
+ }
746
+
747
+ /* ── Resize modes ── */
748
+ .nexus-textarea--resize-default {
749
+ resize: vertical;
750
+ }
751
+ .nexus-textarea--resize-auto {
752
+ resize: none;
753
+ overflow: hidden;
754
+ }
755
+
756
+ /* ── Custom scrollbar ── */
757
+ .nexus-textarea:not(.nexus-textarea--resize-auto) {
758
+ overflow-y: auto;
759
+ }
760
+ .nexus-textarea::-webkit-scrollbar {
761
+ width: 5px;
762
+ }
763
+ .nexus-textarea::-webkit-scrollbar-track {
764
+ background: transparent;
765
+ }
766
+ .nexus-textarea::-webkit-scrollbar-thumb {
767
+ background: var(--color-icon-muted, #c6d0da);
768
+ border-radius: var(--radius-corner-full, 9999px);
769
+ }
770
+
771
+ /* ═══════════════════════════════════════════
772
+ NumberInput
773
+ ═══════════════════════════════════════════ */
774
+
775
+ .nexus-number-input {
776
+ display: flex;
777
+ align-items: center;
778
+ border-radius: var(--radius-corner-md, 0.375rem);
779
+ border: 1px solid var(--color-border-default);
780
+ background: var(--color-surface-default);
781
+ color: var(--color-text-primary);
782
+ transition:
783
+ border-color 200ms,
784
+ box-shadow 200ms;
785
+ }
786
+ :where(.nexus-number-input) {
787
+ width: 100%;
788
+ }
789
+ .nexus-number-input:hover:not(.nexus-number-input--disabled):not(
790
+ :focus-within
791
+ ) {
792
+ box-shadow: 0 0 0 0.5px var(--color-border-default);
793
+ }
794
+ .nexus-number-input--default:focus-within {
795
+ border-color: var(--color-accent-primary);
796
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
797
+ }
798
+ .nexus-number-input--error {
799
+ border-color: var(--color-status-danger);
800
+ }
801
+ .nexus-number-input--error:focus-within {
802
+ border-color: var(--color-status-danger);
803
+ box-shadow: 0 0 0 0.5px var(--color-status-danger);
804
+ }
805
+ .nexus-number-input--xl {
806
+ height: 3.5rem;
807
+ font-size: var(--text-text-base, 1rem);
808
+ }
809
+ .nexus-number-input--lg {
810
+ height: 3rem;
811
+ font-size: var(--text-text-base, 1rem);
812
+ }
813
+ .nexus-number-input--md {
814
+ height: 2.5rem;
815
+ font-size: var(--text-text-sm, 0.875rem);
816
+ }
817
+ .nexus-number-input--sm {
818
+ height: 2rem;
819
+ font-size: var(--text-text-xs, 0.75rem);
820
+ }
821
+ .nexus-number-input--disabled {
822
+ opacity: 0.5;
823
+ cursor: not-allowed;
824
+ }
825
+ .nexus-number-input__field {
826
+ height: 100%;
827
+ width: 100%;
828
+ min-width: 0;
829
+ flex: 1;
830
+ padding: 0;
831
+ border: none;
832
+ background: transparent;
833
+ outline: none;
834
+ font: inherit;
835
+ color: inherit;
836
+ }
837
+ .nexus-number-input__field::placeholder {
838
+ color: var(--color-text-tertiary);
839
+ }
840
+ .nexus-number-input__field:focus-visible {
841
+ outline: none;
842
+ }
843
+ .nexus-number-input__field--xl {
844
+ padding-inline: var(--spacing-padding-lg, 1.25rem);
845
+ }
846
+ .nexus-number-input__field--lg {
847
+ padding-inline: var(--spacing-padding-md, 1rem);
848
+ }
849
+ .nexus-number-input__field--md {
850
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
851
+ }
852
+ .nexus-number-input__field--sm {
853
+ padding-inline: 0.625rem;
854
+ }
855
+ .nexus-number-input__buttons {
856
+ display: flex;
857
+ flex-direction: column;
858
+ border-left: 1px solid var(--color-border-default);
859
+ height: 100%;
860
+ flex-shrink: 0;
861
+ }
862
+ .nexus-number-input__step {
863
+ display: flex;
864
+ flex: 1;
865
+ align-items: center;
866
+ justify-content: center;
867
+ padding: 0;
868
+ padding-inline: 0.375rem;
869
+ margin: 0;
870
+ border: none;
871
+ background: transparent;
872
+ cursor: pointer;
873
+ font: inherit;
874
+ color: var(--color-text-tertiary);
875
+ transition-property: color, background-color;
876
+ transition-duration: 150ms;
877
+ }
878
+ .nexus-number-input__step:hover {
879
+ color: var(--color-text-primary);
880
+ background: var(--color-surface-hover);
881
+ }
882
+ .nexus-number-input__step:disabled {
883
+ opacity: 0.4;
884
+ pointer-events: none;
885
+ }
886
+ .nexus-number-input__step--up {
887
+ border-top-right-radius: var(--radius-corner-md, 0.375rem);
888
+ border-bottom: 1px solid var(--color-border-default);
889
+ }
890
+ .nexus-number-input__step--down {
891
+ border-bottom-right-radius: var(--radius-corner-md, 0.375rem);
892
+ }
893
+ .nexus-number-input__step-icon {
894
+ width: 0.75rem;
895
+ height: 0.75rem;
896
+ }
897
+
898
+ /* ═══════════════════════════════════════════
899
+ Divider
900
+ ═══════════════════════════════════════════ */
901
+
902
+ .nexus-divider {
903
+ flex-shrink: 0;
904
+ border-color: var(--color-border-default);
905
+ }
906
+ .nexus-divider--horizontal {
907
+ width: 100%;
908
+ border-top-width: 1px;
909
+ }
910
+ .nexus-divider--vertical {
911
+ align-self: stretch;
912
+ border-left-width: 1px;
913
+ }
914
+ .nexus-divider--solid {
915
+ border-style: solid;
916
+ }
917
+ .nexus-divider--dashed {
918
+ border-style: dashed;
919
+ }
920
+ .nexus-divider--dotted {
921
+ border-style: dotted;
922
+ }
923
+
924
+ /* ═══════════════════════════════════════════
925
+ Avatar
926
+ ═══════════════════════════════════════════ */
927
+
928
+ .nexus-avatar {
929
+ position: relative;
930
+ display: inline-flex;
931
+ flex-shrink: 0;
932
+ align-items: center;
933
+ justify-content: center;
934
+ overflow: hidden;
935
+ background: var(--color-surface-hover);
936
+ color: var(--color-text-tertiary);
937
+ }
938
+ .nexus-avatar--xs {
939
+ width: 1.5rem;
940
+ height: 1.5rem;
941
+ font-size: 10px;
942
+ }
943
+ .nexus-avatar--sm {
944
+ width: 2rem;
945
+ height: 2rem;
946
+ font-size: var(--text-text-xs, 0.75rem);
947
+ }
948
+ .nexus-avatar--md {
949
+ width: 2.5rem;
950
+ height: 2.5rem;
951
+ font-size: var(--text-text-sm, 0.875rem);
952
+ }
953
+ .nexus-avatar--lg {
954
+ width: 3rem;
955
+ height: 3rem;
956
+ font-size: var(--text-text-base, 1rem);
957
+ }
958
+ .nexus-avatar--xl {
959
+ width: 4rem;
960
+ height: 4rem;
961
+ font-size: var(--text-text-lg, 1.125rem);
962
+ }
963
+ .nexus-avatar--circle {
964
+ border-radius: 9999px;
965
+ }
966
+ .nexus-avatar--square {
967
+ border-radius: var(--radius-corner-md, 0.375rem);
968
+ }
969
+ .nexus-avatar__icon--xs {
970
+ width: 1rem;
971
+ height: 1rem;
972
+ }
973
+ .nexus-avatar__icon--sm {
974
+ width: 1.25rem;
975
+ height: 1.25rem;
976
+ }
977
+ .nexus-avatar__icon--md {
978
+ width: 1.5rem;
979
+ height: 1.5rem;
980
+ }
981
+ .nexus-avatar__icon--lg {
982
+ width: 2rem;
983
+ height: 2rem;
984
+ }
985
+ .nexus-avatar__icon--xl {
986
+ width: 2.5rem;
987
+ height: 2.5rem;
988
+ }
989
+ .nexus-avatar__img {
990
+ width: 100%;
991
+ height: 100%;
992
+ object-fit: cover;
993
+ }
994
+
995
+ /* ═══════════════════════════════════════════
996
+ Switch
997
+ ═══════════════════════════════════════════ */
998
+
999
+ .nexus-switch {
1000
+ position: relative;
1001
+ display: inline-flex;
1002
+ flex-shrink: 0;
1003
+ cursor: pointer;
1004
+ border-radius: 9999px;
1005
+ transition-property: background-color;
1006
+ transition-duration: 200ms;
1007
+ border: 2px solid transparent;
1008
+ }
1009
+ .nexus-switch:has(input:disabled) {
1010
+ cursor: not-allowed;
1011
+ opacity: 0.5;
1012
+ }
1013
+ .nexus-switch--sm {
1014
+ height: 1.25rem;
1015
+ width: 2.25rem;
1016
+ }
1017
+ .nexus-switch--md {
1018
+ height: 1.5rem;
1019
+ width: 2.75rem;
1020
+ }
1021
+ .nexus-switch--checked {
1022
+ background: var(--color-accent-primary);
1023
+ }
1024
+ .nexus-switch--unchecked {
1025
+ background: var(--color-border-default);
1026
+ }
1027
+ .nexus-switch__thumb {
1028
+ pointer-events: none;
1029
+ display: block;
1030
+ border-radius: 9999px;
1031
+ background: var(--color-static-white);
1032
+ box-shadow: var(--shadow-comp-sm);
1033
+ transition-property: transform;
1034
+ transition-duration: 200ms;
1035
+ }
1036
+ .nexus-switch__thumb--sm {
1037
+ width: 1rem;
1038
+ height: 1rem;
1039
+ }
1040
+ .nexus-switch__thumb--md {
1041
+ width: 1.25rem;
1042
+ height: 1.25rem;
1043
+ }
1044
+ .nexus-switch__thumb--sm-on {
1045
+ transform: translateX(1rem);
1046
+ }
1047
+ .nexus-switch__thumb--md-on {
1048
+ transform: translateX(1.25rem);
1049
+ }
1050
+ .nexus-switch__thumb--off {
1051
+ transform: translateX(0);
1052
+ }
1053
+
1054
+ /* ═══════════════════════════════════════════
1055
+ CheckBox
1056
+ ═══════════════════════════════════════════ */
1057
+
1058
+ .nexus-checkbox {
1059
+ display: inline-flex;
1060
+ align-items: center;
1061
+ gap: var(--spacing-gap-sm, 0.5rem);
1062
+ user-select: none;
1063
+ }
1064
+ .nexus-checkbox--sm {
1065
+ font-size: var(--text-text-xs, 0.75rem);
1066
+ }
1067
+ .nexus-checkbox--md {
1068
+ font-size: var(--text-text-sm, 0.875rem);
1069
+ }
1070
+ .nexus-checkbox--pointer {
1071
+ cursor: pointer;
1072
+ }
1073
+ .nexus-checkbox--disabled {
1074
+ cursor: not-allowed;
1075
+ opacity: 0.5;
1076
+ }
1077
+ .nexus-checkbox__box {
1078
+ display: inline-flex;
1079
+ flex-shrink: 0;
1080
+ align-items: center;
1081
+ justify-content: center;
1082
+ border: 1px solid var(--color-border-default);
1083
+ transition-property: border-color, background-color;
1084
+ transition-duration: 150ms;
1085
+ }
1086
+ .nexus-checkbox__box:has(~ .nexus-sr-only:disabled) {
1087
+ opacity: 0.5;
1088
+ cursor: not-allowed;
1089
+ }
1090
+ .nexus-checkbox__box--sm {
1091
+ width: 1rem;
1092
+ height: 1rem;
1093
+ }
1094
+ .nexus-checkbox__box--md {
1095
+ width: 1.25rem;
1096
+ height: 1.25rem;
1097
+ }
1098
+ .nexus-checkbox__box--square {
1099
+ border-radius: var(--radius-corner-sm, 0.25rem);
1100
+ }
1101
+ .nexus-checkbox__box--round {
1102
+ border-radius: 9999px;
1103
+ }
1104
+ .nexus-checkbox__box--checked {
1105
+ border-color: var(--color-accent-primary);
1106
+ background: var(--color-accent-primary);
1107
+ color: var(--color-static-white);
1108
+ }
1109
+ .nexus-checkbox__box--unchecked {
1110
+ border-color: var(--color-border-default);
1111
+ background: var(--color-surface-default);
1112
+ }
1113
+ .nexus-checkbox__icon--sm {
1114
+ width: 0.75rem;
1115
+ height: 0.75rem;
1116
+ }
1117
+ .nexus-checkbox__icon--md {
1118
+ width: 0.875rem;
1119
+ height: 0.875rem;
1120
+ }
1121
+ .nexus-checkbox__label {
1122
+ color: var(--color-text-primary);
1123
+ }
1124
+
1125
+ /* ═══════════════════════════════════════════
1126
+ RadioGroup
1127
+ ═══════════════════════════════════════════ */
1128
+
1129
+ .nexus-radio-group {
1130
+ display: flex;
1131
+ }
1132
+ .nexus-radio-group--horizontal {
1133
+ flex-direction: row;
1134
+ gap: var(--spacing-gap-lg, 1rem);
1135
+ }
1136
+ .nexus-radio-group--vertical {
1137
+ flex-direction: column;
1138
+ gap: var(--spacing-gap-sm, 0.5rem);
1139
+ }
1140
+ .nexus-radio-item {
1141
+ display: inline-flex;
1142
+ align-items: center;
1143
+ gap: var(--spacing-gap-sm, 0.5rem);
1144
+ user-select: none;
1145
+ }
1146
+ .nexus-radio-item--sm {
1147
+ font-size: var(--text-text-xs, 0.75rem);
1148
+ }
1149
+ .nexus-radio-item--md {
1150
+ font-size: var(--text-text-sm, 0.875rem);
1151
+ }
1152
+ .nexus-radio-item--pointer {
1153
+ cursor: pointer;
1154
+ }
1155
+ .nexus-radio-item--disabled {
1156
+ cursor: not-allowed;
1157
+ opacity: 0.5;
1158
+ }
1159
+ .nexus-radio__circle {
1160
+ display: inline-flex;
1161
+ flex-shrink: 0;
1162
+ align-items: center;
1163
+ justify-content: center;
1164
+ border-radius: 9999px;
1165
+ border: 1px solid var(--color-border-default);
1166
+ transition-property: border-color;
1167
+ transition-duration: 150ms;
1168
+ }
1169
+ .nexus-radio__circle:has(~ .nexus-sr-only:disabled) {
1170
+ opacity: 0.5;
1171
+ cursor: not-allowed;
1172
+ }
1173
+ .nexus-radio__circle--sm {
1174
+ width: 1rem;
1175
+ height: 1rem;
1176
+ }
1177
+ .nexus-radio__circle--md {
1178
+ width: 1.25rem;
1179
+ height: 1.25rem;
1180
+ }
1181
+ .nexus-radio__circle--checked {
1182
+ border-color: var(--color-accent-primary);
1183
+ color: var(--color-accent-primary);
1184
+ }
1185
+ .nexus-radio__circle--unchecked {
1186
+ border-color: var(--color-border-default);
1187
+ background: var(--color-surface-default);
1188
+ }
1189
+ .nexus-radio__dot {
1190
+ border-radius: 9999px;
1191
+ background: currentColor;
1192
+ }
1193
+ .nexus-radio__dot--sm {
1194
+ width: 0.375rem;
1195
+ height: 0.375rem;
1196
+ }
1197
+ .nexus-radio__dot--md {
1198
+ width: 0.5rem;
1199
+ height: 0.5rem;
1200
+ }
1201
+ .nexus-radio__label {
1202
+ color: var(--color-text-primary);
1203
+ }
1204
+
1205
+ /* ═══════════════════════════════════════════
1206
+ Chip
1207
+ ═══════════════════════════════════════════ */
1208
+
1209
+ .nexus-chip {
1210
+ display: inline-flex;
1211
+ align-items: center;
1212
+ gap: 0.375rem;
1213
+ white-space: nowrap;
1214
+ font-weight: 500;
1215
+ transition-property: color, background-color, border-color;
1216
+ transition-duration: 150ms;
1217
+ user-select: none;
1218
+ border-radius: 9999px;
1219
+ border: 1px solid transparent;
1220
+ background: transparent;
1221
+ cursor: pointer;
1222
+ font-family: inherit;
1223
+ padding: 0;
1224
+ margin: 0;
1225
+ text-decoration: none;
1226
+ }
1227
+ .nexus-chip[aria-disabled='true'] {
1228
+ opacity: 0.5;
1229
+ pointer-events: none;
1230
+ }
1231
+ .nexus-chip--default {
1232
+ border-color: var(--color-border-default);
1233
+ background: var(--color-surface-default);
1234
+ color: var(--color-text-primary);
1235
+ }
1236
+ .nexus-chip--filled {
1237
+ border-color: transparent;
1238
+ background: var(--color-surface-hover);
1239
+ color: var(--color-text-primary);
1240
+ }
1241
+ .nexus-chip--outline {
1242
+ border-color: var(--color-border-default);
1243
+ background: transparent;
1244
+ color: var(--color-text-primary);
1245
+ }
1246
+ .nexus-chip--accent {
1247
+ border-color: transparent;
1248
+ background: color-mix(in srgb, var(--color-accent-primary) 10%, transparent);
1249
+ color: var(--color-accent-primary);
1250
+ }
1251
+ .nexus-chip--sm {
1252
+ height: 1.5rem;
1253
+ padding-inline: var(--spacing-padding-xs, 0.5rem);
1254
+ font-size: var(--text-text-xs, 0.75rem);
1255
+ }
1256
+ .nexus-chip--md {
1257
+ height: 1.75rem;
1258
+ padding-inline: 0.625rem;
1259
+ font-size: var(--text-text-xs, 0.75rem);
1260
+ }
1261
+ .nexus-chip--lg {
1262
+ height: 2rem;
1263
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
1264
+ font-size: var(--text-text-sm, 0.875rem);
1265
+ }
1266
+ .nexus-chip__close {
1267
+ display: inline-flex;
1268
+ flex-shrink: 0;
1269
+ align-items: center;
1270
+ justify-content: center;
1271
+ border-radius: 9999px;
1272
+ padding: 0.125rem;
1273
+ opacity: 0.6;
1274
+ transition-property: opacity;
1275
+ transition-duration: 150ms;
1276
+ }
1277
+ .nexus-chip__close:hover {
1278
+ opacity: 1;
1279
+ }
1280
+ .nexus-chip__close-icon {
1281
+ width: 0.75rem;
1282
+ height: 0.75rem;
1283
+ }
1284
+
1285
+ /* ═══════════════════════════════════════════
1286
+ Badge
1287
+ ═══════════════════════════════════════════ */
1288
+
1289
+ .nexus-badge-wrapper {
1290
+ position: relative;
1291
+ }
1292
+ .nexus-badge {
1293
+ --nexus-badge-offset-x: 0px;
1294
+ --nexus-badge-offset-y: 0px;
1295
+ box-sizing: border-box;
1296
+ display: inline-flex;
1297
+ align-items: center;
1298
+ justify-content: center;
1299
+ min-width: 1.25rem;
1300
+ height: 1.25rem;
1301
+ padding: 0 0.35rem;
1302
+ border-radius: var(--radius-corner-full, 9999px);
1303
+ font-size: var(--text-text-xs, 0.75rem);
1304
+ font-weight: var(--font-weight-label-semibold-sm, 600);
1305
+ line-height: 1;
1306
+ color: var(--color-text-inverted);
1307
+ }
1308
+ .nexus-badge--positioned {
1309
+ position: absolute;
1310
+ top: 0;
1311
+ right: 0;
1312
+ z-index: 1;
1313
+ transform: translate(
1314
+ calc(50% + var(--nexus-badge-offset-x)),
1315
+ calc(-50% + var(--nexus-badge-offset-y))
1316
+ );
1317
+ }
1318
+ .nexus-badge--dot {
1319
+ min-width: 0;
1320
+ padding: 0;
1321
+ }
1322
+ .nexus-badge--dot.nexus-badge--sm {
1323
+ width: 0.375rem;
1324
+ height: 0.375rem;
1325
+ }
1326
+ .nexus-badge--dot.nexus-badge--md {
1327
+ width: 0.5rem;
1328
+ height: 0.5rem;
1329
+ }
1330
+ .nexus-badge--dot.nexus-badge--lg {
1331
+ width: 0.625rem;
1332
+ height: 0.625rem;
1333
+ }
1334
+ .nexus-badge--danger {
1335
+ background: var(--color-status-danger);
1336
+ color: var(--color-static-white);
1337
+ }
1338
+ .nexus-badge--primary {
1339
+ background: var(--color-accent-primary);
1340
+ color: var(--color-accent-on-primary);
1341
+ }
1342
+ .nexus-badge--secondary {
1343
+ background: var(--color-accent-secondary);
1344
+ color: var(--color-accent-on-secondary);
1345
+ }
1346
+ .nexus-badge--info {
1347
+ background: var(--color-status-info);
1348
+ color: var(--color-static-white);
1349
+ }
1350
+ .nexus-badge--success {
1351
+ background: var(--color-status-success);
1352
+ color: var(--color-static-white);
1353
+ }
1354
+ .nexus-badge--warning {
1355
+ background: var(--color-status-warning);
1356
+ color: var(--color-static-black);
1357
+ }
1358
+ .nexus-badge--sm:not(.nexus-badge--dot) {
1359
+ min-width: 1rem;
1360
+ height: 1rem;
1361
+ padding: 0 0.25rem;
1362
+ font-size: 0.625rem;
1363
+ }
1364
+ .nexus-badge--lg:not(.nexus-badge--dot) {
1365
+ min-width: 1.5rem;
1366
+ height: 1.5rem;
1367
+ padding: 0 0.45rem;
1368
+ font-size: var(--text-text-sm, 0.875rem);
1369
+ }
1370
+
1371
+ /* ═══════════════════════════════════════════
1372
+ Progress
1373
+ ═══════════════════════════════════════════ */
1374
+
1375
+ .nexus-progress-wrapper {
1376
+ display: flex;
1377
+ flex-direction: column;
1378
+ gap: var(--spacing-gap-xs, 0.25rem);
1379
+ width: 100%;
1380
+ }
1381
+ .nexus-progress__header {
1382
+ display: flex;
1383
+ justify-content: space-between;
1384
+ align-items: center;
1385
+ gap: var(--spacing-gap-sm, 0.5rem);
1386
+ }
1387
+ .nexus-progress__label {
1388
+ font-size: var(--text-text-sm, 0.875rem);
1389
+ color: var(--color-text-primary);
1390
+ }
1391
+ .nexus-progress__value {
1392
+ font-size: var(--text-text-sm, 0.875rem);
1393
+ color: var(--color-text-secondary);
1394
+ font-variant-numeric: tabular-nums;
1395
+ }
1396
+ .nexus-progress {
1397
+ position: relative;
1398
+ width: 100%;
1399
+ overflow: hidden;
1400
+ border-radius: var(--radius-corner-full, 9999px);
1401
+ background: var(--color-surface-strong);
1402
+ }
1403
+ .nexus-progress--sm {
1404
+ height: 0.25rem;
1405
+ }
1406
+ .nexus-progress--md {
1407
+ height: 0.375rem;
1408
+ }
1409
+ .nexus-progress--lg {
1410
+ height: 0.5rem;
1411
+ }
1412
+ .nexus-progress__bar {
1413
+ height: 100%;
1414
+ border-radius: inherit;
1415
+ transition:
1416
+ width var(--duration-transition-normal, 200ms) var(--ease-transition-normal, cubic-bezier(0, 0, 0.2, 1));
1417
+ }
1418
+ .nexus-progress--primary .nexus-progress__bar {
1419
+ background: var(--color-accent-primary);
1420
+ }
1421
+ .nexus-progress--success .nexus-progress__bar {
1422
+ background: var(--color-status-success);
1423
+ }
1424
+ .nexus-progress--warning .nexus-progress__bar {
1425
+ background: var(--color-status-warning);
1426
+ }
1427
+ .nexus-progress--danger .nexus-progress__bar {
1428
+ background: var(--color-status-danger);
1429
+ }
1430
+ .nexus-progress--info .nexus-progress__bar {
1431
+ background: var(--color-status-info);
1432
+ }
1433
+ .nexus-progress__bar--indeterminate {
1434
+ position: absolute;
1435
+ left: 0;
1436
+ top: 0;
1437
+ bottom: 0;
1438
+ width: 35% !important;
1439
+ animation: nexus-progress-indeterminate 1.1s var(--ease-transition-normal, cubic-bezier(0, 0, 0.2, 1))
1440
+ infinite;
1441
+ }
1442
+ @keyframes nexus-progress-indeterminate {
1443
+ 0% {
1444
+ transform: translateX(-100%);
1445
+ }
1446
+ 100% {
1447
+ transform: translateX(calc(100% / 0.35 * 3));
1448
+ }
1449
+ }
1450
+
1451
+ /* ═══════════════════════════════════════════
1452
+ Alert
1453
+ ═══════════════════════════════════════════ */
1454
+
1455
+ .nexus-alert {
1456
+ display: flex;
1457
+ align-items: flex-start;
1458
+ gap: var(--spacing-gap-sm, 0.5rem);
1459
+ padding: var(--spacing-padding-md, 1rem);
1460
+ border-radius: var(--radius-corner-md, 8px);
1461
+ border-width: var(--border-width-stroke-thin, 1px);
1462
+ border-style: solid;
1463
+ }
1464
+ .nexus-alert__icon {
1465
+ flex-shrink: 0;
1466
+ margin-top: 0.125rem;
1467
+ line-height: 0;
1468
+ }
1469
+ .nexus-alert__icon-svg {
1470
+ width: 1.25rem;
1471
+ height: 1.25rem;
1472
+ }
1473
+ .nexus-alert__body {
1474
+ flex: 1;
1475
+ min-width: 0;
1476
+ }
1477
+ .nexus-alert__title {
1478
+ margin: 0;
1479
+ font-weight: var(--font-weight-heading-h7, 600);
1480
+ font-size: var(--text-text-sm, 0.875rem);
1481
+ color: var(--color-text-primary);
1482
+ }
1483
+ .nexus-alert__description {
1484
+ margin-top: var(--spacing-gap-xs, 0.25rem);
1485
+ font-size: var(--text-text-sm, 0.875rem);
1486
+ color: var(--color-text-secondary);
1487
+ }
1488
+ .nexus-alert__action {
1489
+ flex-shrink: 0;
1490
+ align-self: center;
1491
+ }
1492
+ .nexus-alert__close {
1493
+ flex-shrink: 0;
1494
+ display: inline-flex;
1495
+ align-items: center;
1496
+ justify-content: center;
1497
+ margin: 0;
1498
+ padding: var(--spacing-padding-2xs, 0.25rem);
1499
+ border: none;
1500
+ border-radius: var(--radius-corner-sm, 4px);
1501
+ background: transparent;
1502
+ cursor: pointer;
1503
+ font: inherit;
1504
+ color: var(--color-icon-secondary);
1505
+ transition: color var(--duration-transition-fast, 150ms) var(--ease-transition-fast, ease);
1506
+ }
1507
+ .nexus-alert__close:hover {
1508
+ color: var(--color-icon-primary);
1509
+ }
1510
+ .nexus-alert__close-icon {
1511
+ width: 1rem;
1512
+ height: 1rem;
1513
+ }
1514
+ .nexus-alert--info {
1515
+ background: color-mix(in srgb, var(--color-status-info-dim) 45%, var(--color-surface-default));
1516
+ border-color: color-mix(in srgb, var(--color-status-info) 28%, var(--color-border-default));
1517
+ }
1518
+ .nexus-alert--info .nexus-alert__icon {
1519
+ color: var(--color-status-info-intense);
1520
+ }
1521
+ .nexus-alert--success {
1522
+ background: color-mix(in srgb, var(--color-status-success-dim) 45%, var(--color-surface-default));
1523
+ border-color: color-mix(in srgb, var(--color-status-success) 28%, var(--color-border-default));
1524
+ }
1525
+ .nexus-alert--success .nexus-alert__icon {
1526
+ color: var(--color-status-success-intense);
1527
+ }
1528
+ .nexus-alert--warning {
1529
+ background: color-mix(in srgb, var(--color-status-warning-dim) 45%, var(--color-surface-default));
1530
+ border-color: color-mix(in srgb, var(--color-status-warning) 28%, var(--color-border-default));
1531
+ }
1532
+ .nexus-alert--warning .nexus-alert__icon {
1533
+ color: var(--color-status-warning-intense);
1534
+ }
1535
+ .nexus-alert--danger {
1536
+ background: color-mix(in srgb, var(--color-status-danger-dim) 45%, var(--color-surface-default));
1537
+ border-color: color-mix(in srgb, var(--color-status-danger) 28%, var(--color-border-default));
1538
+ }
1539
+ .nexus-alert--danger .nexus-alert__icon {
1540
+ color: var(--color-status-danger-intense);
1541
+ }
1542
+
1543
+ /* ═══════════════════════════════════════════
1544
+ Pagination
1545
+ ═══════════════════════════════════════════ */
1546
+
1547
+ .nexus-pagination {
1548
+ display: flex;
1549
+ align-items: center;
1550
+ gap: var(--spacing-gap-xs, 0.25rem);
1551
+ }
1552
+ .nexus-pagination--sm {
1553
+ font-size: var(--text-text-xs, 0.75rem);
1554
+ }
1555
+ .nexus-pagination--md {
1556
+ font-size: var(--text-text-sm, 0.875rem);
1557
+ }
1558
+ .nexus-page-btn {
1559
+ display: inline-flex;
1560
+ align-items: center;
1561
+ justify-content: center;
1562
+ border-radius: var(--radius-corner-md, 0.375rem);
1563
+ font-weight: 500;
1564
+ transition-property: color, background-color;
1565
+ transition-duration: 150ms;
1566
+ user-select: none;
1567
+ border: 1px solid transparent;
1568
+ background: transparent;
1569
+ cursor: pointer;
1570
+ font-family: inherit;
1571
+ padding: 0;
1572
+ margin: 0;
1573
+ }
1574
+ .nexus-page-btn:disabled {
1575
+ opacity: 0.4;
1576
+ pointer-events: none;
1577
+ }
1578
+ .nexus-page-btn--sm {
1579
+ width: 1.75rem;
1580
+ height: 1.75rem;
1581
+ font-size: var(--text-text-xs, 0.75rem);
1582
+ }
1583
+ .nexus-page-btn--md {
1584
+ width: 2.25rem;
1585
+ height: 2.25rem;
1586
+ font-size: var(--text-text-sm, 0.875rem);
1587
+ }
1588
+ .nexus-page-btn--active {
1589
+ background: var(--color-accent-primary);
1590
+ color: var(--color-static-white);
1591
+ border-color: var(--color-accent-primary);
1592
+ }
1593
+ .nexus-page-btn--inactive {
1594
+ color: var(--color-text-primary);
1595
+ }
1596
+ .nexus-page-btn--inactive:hover {
1597
+ background: var(--color-surface-hover);
1598
+ }
1599
+ .nexus-page-icon--sm {
1600
+ width: 0.875rem;
1601
+ height: 0.875rem;
1602
+ }
1603
+ .nexus-page-icon--md {
1604
+ width: 1rem;
1605
+ height: 1rem;
1606
+ }
1607
+
1608
+ /* ═══════════════════════════════════════════
1609
+ Tab
1610
+ ═══════════════════════════════════════════ */
1611
+
1612
+ .nexus-tab-list {
1613
+ position: relative;
1614
+ display: flex;
1615
+ border-bottom: 1px solid var(--color-border-default);
1616
+ }
1617
+ .nexus-tab-list--pill {
1618
+ gap: var(--spacing-gap-xs, 0.25rem);
1619
+ border-bottom: none;
1620
+ background: var(--color-surface-hover);
1621
+ border-radius: var(--radius-corner-lg, 0.5rem);
1622
+ padding: 0.25rem;
1623
+ }
1624
+ .nexus-tab-trigger {
1625
+ position: relative;
1626
+ display: inline-flex;
1627
+ align-items: center;
1628
+ justify-content: center;
1629
+ white-space: nowrap;
1630
+ font-weight: 500;
1631
+ user-select: none;
1632
+ outline: none;
1633
+ transition-property: color, background-color, border-color;
1634
+ transition-duration: 150ms;
1635
+ border: none;
1636
+ background: transparent;
1637
+ cursor: pointer;
1638
+ font-family: inherit;
1639
+ padding: 0;
1640
+ margin: 0;
1641
+ }
1642
+ .nexus-tab-trigger--line {
1643
+ padding: 0.625rem var(--spacing-padding-md, 1rem);
1644
+ color: var(--color-text-tertiary);
1645
+ border-bottom: 2px solid transparent;
1646
+ margin-bottom: -1px;
1647
+ }
1648
+ .nexus-tab-trigger--line:hover {
1649
+ color: var(--color-text-primary);
1650
+ }
1651
+ .nexus-tab-trigger--line-active {
1652
+ color: var(--color-text-primary);
1653
+ border-bottom-color: var(--color-accent-primary);
1654
+ }
1655
+ .nexus-tab-trigger--pill {
1656
+ padding: 0.375rem var(--spacing-padding-sm, 0.75rem);
1657
+ border-radius: var(--radius-corner-md, 0.375rem);
1658
+ color: var(--color-text-tertiary);
1659
+ }
1660
+ .nexus-tab-trigger--pill:hover {
1661
+ color: var(--color-text-primary);
1662
+ }
1663
+ .nexus-tab-trigger--pill-active {
1664
+ color: var(--color-text-primary);
1665
+ background: var(--color-surface-default);
1666
+ box-shadow: var(--shadow-comp-sm);
1667
+ }
1668
+ .nexus-tab-trigger--sm {
1669
+ font-size: var(--text-text-xs, 0.75rem);
1670
+ }
1671
+ .nexus-tab-trigger--md {
1672
+ font-size: var(--text-text-sm, 0.875rem);
1673
+ }
1674
+ .nexus-tab-trigger--disabled {
1675
+ opacity: 0.4;
1676
+ pointer-events: none;
1677
+ }
1678
+
1679
+ /* ═══════════════════════════════════════════
1680
+ Skeleton
1681
+ ═══════════════════════════════════════════ */
1682
+
1683
+ .nexus-skeleton {
1684
+ position: relative;
1685
+ overflow: hidden;
1686
+ background: linear-gradient(
1687
+ to right,
1688
+ var(--color-surface-hover),
1689
+ var(--color-surface-default),
1690
+ var(--color-surface-hover)
1691
+ );
1692
+ background-size: 300% 100%;
1693
+ animation: nexus-skeleton-shimmer 2.5s ease-in-out infinite;
1694
+ }
1695
+ .nexus-skeleton--rect {
1696
+ border-radius: var(--radius-corner-md, 0.375rem);
1697
+ }
1698
+ .nexus-skeleton--circle {
1699
+ border-radius: 9999px;
1700
+ }
1701
+ .nexus-skeleton__children {
1702
+ opacity: 0;
1703
+ }
1704
+
1705
+ /* ═══════════════════════════════════════════
1706
+ Spinner
1707
+ ═══════════════════════════════════════════ */
1708
+
1709
+ .nexus-spinner {
1710
+ animation: nexus-spin 1s linear infinite;
1711
+ color: currentColor;
1712
+ }
1713
+
1714
+ /* ═══════════════════════════════════════════
1715
+ ErrorBoundary
1716
+ ═══════════════════════════════════════════ */
1717
+
1718
+ .nexus-error-boundary {
1719
+ padding: 1rem;
1720
+ border-radius: var(--radius-corner-lg, 0.5rem);
1721
+ border: 1px solid var(--color-comp-error-border);
1722
+ background: var(--color-comp-error-bg);
1723
+ color: var(--color-comp-error-text);
1724
+ font-size: var(--text-text-sm, 0.875rem);
1725
+ }
1726
+ .nexus-error-boundary__title {
1727
+ margin: 0;
1728
+ font-weight: 600;
1729
+ }
1730
+ .nexus-error-boundary__message {
1731
+ margin: 0.5rem 0 0;
1732
+ opacity: 0.8;
1733
+ }
1734
+
1735
+ /* ═══════════════════════════════════════════
1736
+ Divider & Simple components
1737
+ ═══════════════════════════════════════════ */
1738
+
1739
+ .nexus-virtual-scroll {
1740
+ overflow: auto;
1741
+ }
1742
+ .nexus-modal-portal-target {
1743
+ position: absolute;
1744
+ z-index: 9999;
1745
+ }
1746
+
1747
+ /* ═══════════════════════════════════════════
1748
+ DataList
1749
+ ═══════════════════════════════════════════ */
1750
+
1751
+ .nexus-datalist-center {
1752
+ display: flex;
1753
+ align-items: center;
1754
+ justify-content: center;
1755
+ padding-block: var(--spacing-padding-xl, 2rem);
1756
+ }
1757
+ .nexus-datalist-empty {
1758
+ display: flex;
1759
+ align-items: center;
1760
+ justify-content: center;
1761
+ padding-block: var(--spacing-padding-xl, 2rem);
1762
+ font-size: var(--text-text-sm, 0.875rem);
1763
+ color: var(--color-text-tertiary);
1764
+ }
1765
+
1766
+ /* ═══════════════════════════════════════════
1767
+ InfiniteScroll
1768
+ ═══════════════════════════════════════════ */
1769
+
1770
+ .nexus-infinite-scroll {
1771
+ position: relative;
1772
+ }
1773
+ .nexus-infinite-sentinel {
1774
+ position: relative;
1775
+ height: 1px;
1776
+ width: 100%;
1777
+ }
1778
+ .nexus-infinite-spinner {
1779
+ display: flex;
1780
+ align-items: center;
1781
+ justify-content: center;
1782
+ padding-block: var(--spacing-padding-md, 1rem);
1783
+ }
1784
+ .nexus-infinite-spinner-icon {
1785
+ width: 1.5rem;
1786
+ height: 1.5rem;
1787
+ animation: nexus-spin 1s linear infinite;
1788
+ border-radius: 9999px;
1789
+ border: 2px solid var(--color-border-default);
1790
+ border-top-color: var(--color-accent-primary);
1791
+ }
1792
+
1793
+ /* ═══════════════════════════════════════════
1794
+ Countdown
1795
+ ═══════════════════════════════════════════ */
1796
+
1797
+ .nexus-countdown {
1798
+ display: inline-flex;
1799
+ align-items: center;
1800
+ gap: var(--spacing-gap-xs, 0.25rem);
1801
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1802
+ font-variant-numeric: tabular-nums;
1803
+ }
1804
+ .nexus-countdown__separator {
1805
+ color: var(--color-text-tertiary);
1806
+ margin-inline: 0.125rem;
1807
+ }
1808
+ .nexus-countdown__label {
1809
+ color: var(--color-text-tertiary);
1810
+ font-size: var(--text-text-xs, 0.75rem);
1811
+ margin-left: 0.125rem;
1812
+ }
1813
+
1814
+ /* ═══════════════════════════════════════════
1815
+ Select
1816
+ ═══════════════════════════════════════════ */
1817
+
1818
+ .nexus-select-trigger {
1819
+ position: relative;
1820
+ display: flex;
1821
+ height: 2.5rem;
1822
+ align-items: center;
1823
+ justify-content: space-between;
1824
+ border-radius: var(--radius-corner-sm, 0.25rem);
1825
+ border: 1px solid var(--color-border-default);
1826
+ background: var(--color-surface-default, transparent);
1827
+ color: var(--color-text-primary);
1828
+ font-size: var(--text-text-sm, 0.875rem);
1829
+ font-family: inherit;
1830
+ cursor: pointer;
1831
+ padding: 0;
1832
+ margin: 0;
1833
+ transition-property: border-color;
1834
+ transition-duration: 200ms;
1835
+ }
1836
+ .nexus-select-trigger:hover {
1837
+ border-color: var(--color-border-strong);
1838
+ }
1839
+ .nexus-select-trigger:has(:disabled) {
1840
+ cursor: not-allowed;
1841
+ opacity: 0.5;
1842
+ }
1843
+ .nexus-select-trigger::placeholder {
1844
+ color: var(--color-text-tertiary);
1845
+ }
1846
+ .nexus-select-trigger--default {
1847
+ background: var(--color-surface-hover);
1848
+ }
1849
+ .nexus-select-trigger--outline {
1850
+ background: var(--color-surface-default);
1851
+ }
1852
+ .nexus-select-trigger--sm {
1853
+ width: 4rem;
1854
+ }
1855
+ .nexus-select-trigger--md {
1856
+ width: 8rem;
1857
+ }
1858
+ .nexus-select-trigger--lg {
1859
+ width: 12rem;
1860
+ }
1861
+ .nexus-select-trigger--full {
1862
+ width: 100%;
1863
+ }
1864
+ .nexus-select-trigger--justify-end {
1865
+ justify-content: flex-end;
1866
+ }
1867
+ .nexus-select-trigger__display {
1868
+ position: absolute;
1869
+ top: 0;
1870
+ left: 0;
1871
+ display: flex;
1872
+ height: 100%;
1873
+ width: calc(100% - 30px);
1874
+ align-items: center;
1875
+ }
1876
+ .nexus-select-trigger__inner {
1877
+ display: flex;
1878
+ height: 100%;
1879
+ width: 100%;
1880
+ flex-direction: row-reverse;
1881
+ align-items: center;
1882
+ justify-content: space-between;
1883
+ border-radius: var(--radius-corner-sm, 0.25rem);
1884
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
1885
+ }
1886
+ .nexus-select-trigger__inner:focus {
1887
+ outline: none;
1888
+ }
1889
+ .nexus-select-chevron {
1890
+ width: 0.75rem;
1891
+ height: 0.75rem;
1892
+ opacity: 0.5;
1893
+ transition: transform 200ms;
1894
+ }
1895
+ .nexus-select-chevron--open {
1896
+ transform: rotate(180deg);
1897
+ }
1898
+
1899
+ .nexus-select-content {
1900
+ position: relative;
1901
+ z-index: 50;
1902
+ max-height: 24rem;
1903
+ overflow: hidden;
1904
+ border-radius: var(--radius-corner-sm, 0.25rem);
1905
+ border: 1px solid var(--color-border-default);
1906
+ background: var(--color-surface-default);
1907
+ box-shadow: var(--shadow-comp-lg);
1908
+ transform-origin: top center;
1909
+ will-change: transform, opacity;
1910
+ }
1911
+ .nexus-select-content[data-state='open'] {
1912
+ animation: nexus-select-slide-in 150ms ease-out;
1913
+ }
1914
+ .nexus-select-content[data-state='closed'] {
1915
+ animation: nexus-select-slide-out 100ms ease-in forwards;
1916
+ }
1917
+ @keyframes nexus-select-slide-in {
1918
+ from {
1919
+ opacity: 0;
1920
+ transform: translateY(-4px) scaleY(0.96);
1921
+ }
1922
+ to {
1923
+ opacity: 1;
1924
+ transform: translateY(0) scaleY(1);
1925
+ }
1926
+ }
1927
+ @keyframes nexus-select-slide-out {
1928
+ from {
1929
+ opacity: 1;
1930
+ transform: translateY(0) scaleY(1);
1931
+ }
1932
+ to {
1933
+ opacity: 0;
1934
+ transform: translateY(-4px) scaleY(0.96);
1935
+ }
1936
+ }
1937
+ .nexus-select-content--sm {
1938
+ width: 4rem;
1939
+ }
1940
+ .nexus-select-content--md {
1941
+ width: 8rem;
1942
+ }
1943
+ .nexus-select-content--lg {
1944
+ width: 12rem;
1945
+ }
1946
+ .nexus-select-content--full {
1947
+ width: var(--radix-popper-anchor-width);
1948
+ }
1949
+ .nexus-select-viewport {
1950
+ padding: 0.25rem;
1951
+ }
1952
+
1953
+ .nexus-select-item {
1954
+ position: relative;
1955
+ display: flex;
1956
+ width: 100%;
1957
+ cursor: pointer;
1958
+ align-items: center;
1959
+ border-radius: var(--radius-corner-sm, 0.25rem);
1960
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
1961
+ color: var(--color-text-primary);
1962
+ font-size: var(--text-text-sm, 0.875rem);
1963
+ transition-property: background-color;
1964
+ transition-duration: 150ms;
1965
+ outline: none;
1966
+ user-select: none;
1967
+ }
1968
+ .nexus-select-item:hover,
1969
+ .nexus-select-item:focus,
1970
+ .nexus-select-item[data-highlighted] {
1971
+ background: var(--color-surface-hover);
1972
+ }
1973
+ .nexus-select-item[data-disabled] {
1974
+ pointer-events: none;
1975
+ opacity: 0.5;
1976
+ }
1977
+
1978
+ /* ═══════════════════════════════════════════
1979
+ DropdownMenu
1980
+ ═══════════════════════════════════════════ */
1981
+
1982
+ .nexus-dropdown-content {
1983
+ position: relative;
1984
+ z-index: var(--z-index-layer-dropdown, 10);
1985
+ min-width: 10rem;
1986
+ overflow: hidden;
1987
+ border-radius: var(--radius-corner-md, 0.5rem);
1988
+ border: 1px solid var(--color-border-default);
1989
+ background: var(--color-surface-default);
1990
+ padding: var(--spacing-padding-xs, 0.5rem);
1991
+ box-shadow: var(--shadow-comp-lg);
1992
+ color: var(--color-text-primary);
1993
+ transform-origin: var(--radix-dropdown-menu-content-transform-origin);
1994
+ will-change: transform, opacity;
1995
+ }
1996
+ .nexus-dropdown-content[data-state='open'] {
1997
+ animation: nexus-dropdown-in 150ms ease-out;
1998
+ }
1999
+ .nexus-dropdown-content[data-state='closed'] {
2000
+ animation: nexus-dropdown-out 100ms ease-in forwards;
2001
+ }
2002
+ @keyframes nexus-dropdown-in {
2003
+ from {
2004
+ opacity: 0;
2005
+ transform: scale(0.96);
2006
+ }
2007
+ to {
2008
+ opacity: 1;
2009
+ transform: scale(1);
2010
+ }
2011
+ }
2012
+ @keyframes nexus-dropdown-out {
2013
+ from {
2014
+ opacity: 1;
2015
+ transform: scale(1);
2016
+ }
2017
+ to {
2018
+ opacity: 0;
2019
+ transform: scale(0.96);
2020
+ }
2021
+ }
2022
+ .nexus-dropdown-separator {
2023
+ margin: var(--spacing-padding-xs, 0.5rem) calc(-1 * var(--spacing-padding-xs, 0.5rem));
2024
+ height: 1px;
2025
+ background: var(--color-border-default);
2026
+ }
2027
+ .nexus-dropdown-item {
2028
+ position: relative;
2029
+ display: flex;
2030
+ width: 100%;
2031
+ cursor: default;
2032
+ align-items: center;
2033
+ gap: var(--spacing-gap-sm, 0.5rem);
2034
+ border-radius: var(--radius-corner-sm, 0.25rem);
2035
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
2036
+ font-size: var(--text-text-sm, 0.875rem);
2037
+ color: var(--color-text-primary);
2038
+ outline: none;
2039
+ user-select: none;
2040
+ transition: background-color 150ms ease;
2041
+ }
2042
+ .nexus-dropdown-item[data-highlighted] {
2043
+ background: var(--color-surface-hover);
2044
+ }
2045
+ .nexus-dropdown-item[data-disabled] {
2046
+ pointer-events: none;
2047
+ opacity: var(--opacity-disabled-element, 0.4);
2048
+ }
2049
+ .nexus-dropdown-item--danger {
2050
+ color: var(--color-status-danger);
2051
+ }
2052
+ .nexus-dropdown-item--danger[data-highlighted] {
2053
+ background: var(--color-status-danger-dim);
2054
+ color: var(--color-status-danger-intense);
2055
+ }
2056
+ .nexus-dropdown-item__icon {
2057
+ display: inline-flex;
2058
+ flex-shrink: 0;
2059
+ color: var(--color-icon-secondary);
2060
+ }
2061
+ .nexus-dropdown-item--danger .nexus-dropdown-item__icon {
2062
+ color: var(--color-status-danger);
2063
+ }
2064
+
2065
+ /* ═══════════════════════════════════════════
2066
+ ToggleGroup
2067
+ ═══════════════════════════════════════════ */
2068
+
2069
+ .nexus-toggle-group {
2070
+ display: inline-flex;
2071
+ align-items: stretch;
2072
+ position: relative;
2073
+ border-radius: var(--radius-corner-md, 0.5rem);
2074
+ }
2075
+ .nexus-toggle-group--default {
2076
+ background: var(--color-surface-subtle);
2077
+ padding: var(--spacing-padding-2xs, 0.25rem);
2078
+ gap: var(--spacing-gap-xs, 0.25rem);
2079
+ }
2080
+
2081
+ /* ── Sliding indicator ── */
2082
+ .nexus-toggle-group__indicator {
2083
+ position: absolute;
2084
+ top: 0;
2085
+ left: 0;
2086
+ border-radius: var(--radius-corner-sm, 0.25rem);
2087
+ background: var(--color-surface-default);
2088
+ box-shadow: var(--shadow-sm);
2089
+ pointer-events: none;
2090
+ z-index: 0;
2091
+ will-change: transform, width;
2092
+ }
2093
+ .nexus-toggle-group__indicator--animated {
2094
+ transition:
2095
+ transform 200ms cubic-bezier(0, 0, 0.2, 1),
2096
+ width 200ms cubic-bezier(0, 0, 0.2, 1);
2097
+ }
2098
+ .nexus-toggle-group--outline {
2099
+ border: 1px solid var(--color-border-default);
2100
+ padding: var(--spacing-padding-2xs, 0.25rem);
2101
+ gap: 0;
2102
+ }
2103
+ .nexus-toggle-group__item {
2104
+ display: inline-flex;
2105
+ align-items: center;
2106
+ justify-content: center;
2107
+ gap: var(--spacing-gap-xs, 0.25rem);
2108
+ border-radius: var(--radius-corner-sm, 0.25rem);
2109
+ border: none;
2110
+ background: transparent;
2111
+ font-size: var(--text-text-sm, 0.875rem);
2112
+ font-weight: var(--font-weight-text-medium-sm, 500);
2113
+ color: var(--color-text-secondary);
2114
+ cursor: pointer;
2115
+ transition: color var(--duration-transition-normal, 200ms) var(--ease-transition-fast);
2116
+ outline: none;
2117
+ position: relative;
2118
+ z-index: 1;
2119
+ }
2120
+ .nexus-toggle-group__item:focus-visible {
2121
+ box-shadow: 0 0 0 2px var(--color-surface-default), 0 0 0 4px var(--color-accent-primary-focus);
2122
+ }
2123
+ .nexus-toggle-group__item[data-disabled] {
2124
+ pointer-events: none;
2125
+ opacity: var(--opacity-disabled-element, 0.4);
2126
+ }
2127
+ .nexus-toggle-group--default .nexus-toggle-group__item[data-state='on'] {
2128
+ color: var(--color-text-primary);
2129
+ }
2130
+ .nexus-toggle-group--outline .nexus-toggle-group__item {
2131
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
2132
+ }
2133
+ .nexus-toggle-group--outline .nexus-toggle-group__item[data-state='on'] {
2134
+ background: var(--color-accent-primary-dim);
2135
+ color: var(--color-accent-primary-intense);
2136
+ }
2137
+ .nexus-toggle-group--outline .nexus-toggle-group__item:not([data-state='on']):hover {
2138
+ background: var(--color-surface-hover);
2139
+ color: var(--color-text-primary);
2140
+ }
2141
+ .nexus-toggle-group--sm .nexus-toggle-group__item {
2142
+ min-height: var(--size-control-sm, 2rem);
2143
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
2144
+ }
2145
+ .nexus-toggle-group--md .nexus-toggle-group__item {
2146
+ min-height: var(--size-control-md, 2.5rem);
2147
+ padding-inline: var(--spacing-padding-md, 1rem);
2148
+ }
2149
+ .nexus-toggle-group--lg .nexus-toggle-group__item {
2150
+ min-height: var(--size-control-lg, 3rem);
2151
+ padding-inline: var(--spacing-padding-lg, 1.5rem);
2152
+ }
2153
+ .nexus-toggle-group__icon {
2154
+ display: inline-flex;
2155
+ flex-shrink: 0;
2156
+ color: var(--color-icon-secondary);
2157
+ }
2158
+ .nexus-toggle-group__item[data-state='on'] .nexus-toggle-group__icon {
2159
+ color: var(--color-icon-primary);
2160
+ }
2161
+
2162
+ /* ═══════════════════════════════════════════
2163
+ Slider
2164
+ ═══════════════════════════════════════════ */
2165
+
2166
+ .nexus-slider-wrapper {
2167
+ display: flex;
2168
+ width: 100%;
2169
+ flex-direction: column;
2170
+ gap: var(--spacing-gap-sm, 0.5rem);
2171
+ }
2172
+ .nexus-slider__header {
2173
+ display: flex;
2174
+ align-items: center;
2175
+ justify-content: space-between;
2176
+ gap: var(--spacing-gap-md, 1rem);
2177
+ }
2178
+ .nexus-slider__label {
2179
+ font-size: var(--text-label-md, 0.875rem);
2180
+ font-weight: var(--font-weight-label-md, 500);
2181
+ color: var(--color-text-primary);
2182
+ }
2183
+ .nexus-slider__value {
2184
+ font-size: var(--text-text-sm, 0.875rem);
2185
+ font-variant-numeric: tabular-nums;
2186
+ color: var(--color-text-secondary);
2187
+ }
2188
+ .nexus-slider {
2189
+ position: relative;
2190
+ display: flex;
2191
+ width: 100%;
2192
+ touch-action: none;
2193
+ user-select: none;
2194
+ align-items: center;
2195
+ }
2196
+ .nexus-slider[data-disabled] {
2197
+ opacity: var(--opacity-disabled-element, 0.4);
2198
+ pointer-events: none;
2199
+ }
2200
+ .nexus-slider__track {
2201
+ position: relative;
2202
+ flex-grow: 1;
2203
+ overflow: hidden;
2204
+ border-radius: var(--radius-corner-full, 9999px);
2205
+ background: var(--color-surface-strong);
2206
+ }
2207
+ .nexus-slider__range {
2208
+ position: absolute;
2209
+ height: 100%;
2210
+ border-radius: var(--radius-corner-full, 9999px);
2211
+ background: var(--color-accent-primary);
2212
+ }
2213
+ .nexus-slider__thumb {
2214
+ display: block;
2215
+ flex-shrink: 0;
2216
+ border-radius: var(--radius-corner-full, 9999px);
2217
+ border: 2px solid var(--color-accent-primary);
2218
+ background: var(--color-surface-default);
2219
+ box-shadow: var(--shadow-sm);
2220
+ outline: none;
2221
+ transition:
2222
+ box-shadow 150ms ease,
2223
+ transform 150ms ease;
2224
+ }
2225
+ .nexus-slider__thumb:hover {
2226
+ box-shadow: var(--shadow-md);
2227
+ }
2228
+ .nexus-slider__thumb:focus-visible {
2229
+ box-shadow:
2230
+ 0 0 0 2px var(--color-surface-default),
2231
+ 0 0 0 4px var(--color-accent-primary-focus);
2232
+ }
2233
+ .nexus-slider--sm .nexus-slider__track {
2234
+ height: 0.25rem;
2235
+ }
2236
+ .nexus-slider--sm .nexus-slider__thumb {
2237
+ width: 0.875rem;
2238
+ height: 0.875rem;
2239
+ }
2240
+ .nexus-slider--md .nexus-slider__track {
2241
+ height: 0.375rem;
2242
+ }
2243
+ .nexus-slider--md .nexus-slider__thumb {
2244
+ width: 1.125rem;
2245
+ height: 1.125rem;
2246
+ }
2247
+ .nexus-slider--lg .nexus-slider__track {
2248
+ height: 0.5rem;
2249
+ }
2250
+ .nexus-slider--lg .nexus-slider__thumb {
2251
+ width: 1.25rem;
2252
+ height: 1.25rem;
2253
+ }
2254
+
2255
+ /* ═══════════════════════════════════════════
2256
+ Tooltip
2257
+ ═══════════════════════════════════════════ */
2258
+
2259
+ .nexus-tooltip-content {
2260
+ z-index: 50;
2261
+ display: flex;
2262
+ overflow: hidden;
2263
+ border-radius: var(--radius-corner-md, 0.375rem);
2264
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
2265
+ font-size: var(--text-text-sm, 0.875rem);
2266
+ }
2267
+ .nexus-tooltip--light {
2268
+ border: 1px solid var(--color-border-default);
2269
+ background: var(--color-static-white);
2270
+ color: var(--color-static-black);
2271
+ box-shadow: var(--shadow-comp-md);
2272
+ }
2273
+ .nexus-tooltip--dark {
2274
+ border: none;
2275
+ background: var(--color-static-black);
2276
+ color: var(--color-static-white);
2277
+ }
2278
+ .nexus-tooltip-arrow--dark {
2279
+ fill: var(--color-static-black);
2280
+ }
2281
+ .nexus-tooltip-arrow--light {
2282
+ fill: var(--color-static-white);
2283
+ }
2284
+ .nexus-tooltip-trigger {
2285
+ cursor: default;
2286
+ }
2287
+
2288
+ /* ═══════════════════════════════════════════
2289
+ Popover
2290
+ ═══════════════════════════════════════════ */
2291
+
2292
+ .nexus-popover-content {
2293
+ z-index: 50;
2294
+ border-radius: var(--radius-corner-lg, 0.5rem);
2295
+ border: 1px solid var(--color-border-default);
2296
+ padding: var(--spacing-padding-md, 1rem);
2297
+ box-shadow: var(--shadow-comp-lg);
2298
+ outline: none;
2299
+ background: var(--color-surface-default);
2300
+ color: var(--color-text-primary);
2301
+ transform-origin: var(--radix-popover-content-transform-origin);
2302
+ will-change: transform, opacity;
2303
+ }
2304
+ .nexus-popover-content[data-state='open'] {
2305
+ animation: nexus-popover-in 150ms ease-out;
2306
+ }
2307
+ .nexus-popover-content[data-state='closed'] {
2308
+ animation: nexus-popover-out 100ms ease-in forwards;
2309
+ }
2310
+ @keyframes nexus-popover-in {
2311
+ from {
2312
+ opacity: 0;
2313
+ transform: scale(0.95);
2314
+ }
2315
+ to {
2316
+ opacity: 1;
2317
+ transform: scale(1);
2318
+ }
2319
+ }
2320
+ @keyframes nexus-popover-out {
2321
+ from {
2322
+ opacity: 1;
2323
+ transform: scale(1);
2324
+ }
2325
+ to {
2326
+ opacity: 0;
2327
+ transform: scale(0.95);
2328
+ }
2329
+ }
2330
+ .nexus-popover-arrow {
2331
+ fill: var(--color-surface-default);
2332
+ }
2333
+
2334
+ /* ═══════════════════════════════════════════
2335
+ Drawer
2336
+ ═══════════════════════════════════════════ */
2337
+
2338
+ .nexus-drawer-overlay {
2339
+ position: fixed;
2340
+ inset: 0;
2341
+ z-index: 50;
2342
+ background: var(--color-comp-overlay);
2343
+ }
2344
+ .nexus-drawer-overlay--blur-sm {
2345
+ backdrop-filter: blur(4px);
2346
+ }
2347
+ .nexus-drawer-overlay--blur-md {
2348
+ backdrop-filter: blur(12px);
2349
+ }
2350
+ .nexus-drawer-content {
2351
+ position: fixed;
2352
+ z-index: 50;
2353
+ display: flex;
2354
+ flex-direction: column;
2355
+ background: var(--color-surface-default);
2356
+ }
2357
+ .nexus-drawer-content--bottom {
2358
+ inset-inline: 0;
2359
+ bottom: 0;
2360
+ margin-top: 6rem;
2361
+ border-top-left-radius: 1rem;
2362
+ border-top-right-radius: 1rem;
2363
+ border-top: 1px solid var(--color-border-default);
2364
+ }
2365
+ .nexus-drawer-content--top {
2366
+ inset-inline: 0;
2367
+ top: 0;
2368
+ margin-bottom: 6rem;
2369
+ border-bottom-left-radius: 1rem;
2370
+ border-bottom-right-radius: 1rem;
2371
+ border-bottom: 1px solid var(--color-border-default);
2372
+ }
2373
+ .nexus-drawer-content--left {
2374
+ inset-block: 0;
2375
+ left: 0;
2376
+ margin-right: 6rem;
2377
+ width: 85vw;
2378
+ max-width: 24rem;
2379
+ border-top-right-radius: 1rem;
2380
+ border-bottom-right-radius: 1rem;
2381
+ border-right: 1px solid var(--color-border-default);
2382
+ }
2383
+ .nexus-drawer-content--right {
2384
+ inset-block: 0;
2385
+ right: 0;
2386
+ margin-left: 6rem;
2387
+ width: 85vw;
2388
+ max-width: 24rem;
2389
+ border-top-left-radius: 1rem;
2390
+ border-bottom-left-radius: 1rem;
2391
+ border-left: 1px solid var(--color-border-default);
2392
+ }
2393
+ .nexus-drawer-handle {
2394
+ display: flex;
2395
+ justify-content: center;
2396
+ }
2397
+ .nexus-drawer-handle--bottom {
2398
+ padding-top: var(--spacing-padding-md, 1rem);
2399
+ }
2400
+ .nexus-drawer-handle--top {
2401
+ padding-bottom: var(--spacing-padding-md, 1rem);
2402
+ }
2403
+ .nexus-drawer-handle__bar {
2404
+ background: var(--color-border-strong);
2405
+ height: 0.375rem;
2406
+ width: 3rem;
2407
+ border-radius: 9999px;
2408
+ }
2409
+ .nexus-drawer-title {
2410
+ font-size: var(--text-text-lg, 1.125rem);
2411
+ font-weight: 600;
2412
+ color: var(--color-text-primary);
2413
+ }
2414
+ .nexus-drawer-description {
2415
+ font-size: var(--text-text-sm, 0.875rem);
2416
+ color: var(--color-text-secondary);
2417
+ }
2418
+
2419
+ /* ═══════════════════════════════════════════
2420
+ Accordion
2421
+ ═══════════════════════════════════════════ */
2422
+
2423
+ .nexus-accordion-item {
2424
+ border-bottom: 1px solid var(--color-border-default);
2425
+ }
2426
+ .nexus-accordion-header {
2427
+ display: flex;
2428
+ }
2429
+ .nexus-accordion-trigger {
2430
+ display: flex;
2431
+ flex: 1;
2432
+ align-items: center;
2433
+ justify-content: space-between;
2434
+ padding: 0;
2435
+ padding-block: var(--spacing-padding-md, 1rem);
2436
+ margin: 0;
2437
+ border: none;
2438
+ background: transparent;
2439
+ cursor: pointer;
2440
+ font: inherit;
2441
+ color: inherit;
2442
+ text-align: left;
2443
+ transition: all 150ms;
2444
+ }
2445
+ .nexus-accordion-trigger[data-state='open'] > .nexus-accordion-chevron {
2446
+ transform: rotate(180deg);
2447
+ }
2448
+ .nexus-accordion-chevron {
2449
+ width: 0.75rem;
2450
+ height: 0.75rem;
2451
+ flex-shrink: 0;
2452
+ transition: transform 200ms;
2453
+ }
2454
+ .nexus-accordion-content {
2455
+ overflow: hidden;
2456
+ transition: all 200ms;
2457
+ }
2458
+ .nexus-accordion-content[data-state='open'] {
2459
+ animation: nexus-accordion-down 200ms ease-out;
2460
+ }
2461
+ .nexus-accordion-content[data-state='closed'] {
2462
+ animation: nexus-accordion-up 200ms ease-in;
2463
+ }
2464
+ .nexus-accordion-content__inner {
2465
+ padding-top: 0;
2466
+ padding-bottom: var(--spacing-padding-md, 1rem);
2467
+ }
2468
+
2469
+ /* ═══════════════════════════════════════════
2470
+ Ellipsis
2471
+ ═══════════════════════════════════════════ */
2472
+
2473
+ .nexus-ellipsis {
2474
+ position: relative;
2475
+ }
2476
+ .nexus-ellipsis__content {
2477
+ overflow: hidden;
2478
+ transition: height 300ms;
2479
+ }
2480
+ .nexus-ellipsis__trigger {
2481
+ margin-top: 0.25rem;
2482
+ display: flex;
2483
+ align-items: center;
2484
+ gap: var(--spacing-gap-xs, 0.25rem);
2485
+ font-size: var(--text-text-sm, 0.875rem);
2486
+ color: var(--color-text-secondary);
2487
+ transition-property: color;
2488
+ transition-duration: 150ms;
2489
+ }
2490
+ .nexus-ellipsis__trigger:hover {
2491
+ color: var(--color-text-primary);
2492
+ }
2493
+ .nexus-ellipsis__trigger--expanded > svg {
2494
+ transform: rotate(180deg);
2495
+ }
2496
+ .nexus-ellipsis__chevron {
2497
+ width: 0.875rem;
2498
+ height: 0.875rem;
2499
+ transition: transform 200ms;
2500
+ }
2501
+
2502
+ /* ═══════════════════════════════════════════
2503
+ Marquee
2504
+ ═══════════════════════════════════════════ */
2505
+
2506
+ .nexus-marquee {
2507
+ overflow: hidden;
2508
+ }
2509
+ .nexus-marquee--pause-on-hover:hover > div {
2510
+ animation-play-state: paused !important;
2511
+ }
2512
+
2513
+ /* ═══════════════════════════════════════════
2514
+ Carousel
2515
+ ═══════════════════════════════════════════ */
2516
+
2517
+ .nexus-carousel {
2518
+ position: relative;
2519
+ }
2520
+ .nexus-carousel__viewport {
2521
+ overflow: hidden;
2522
+ }
2523
+ .nexus-carousel__container {
2524
+ display: flex;
2525
+ }
2526
+ .nexus-carousel-slide {
2527
+ min-width: 0;
2528
+ flex-shrink: 0;
2529
+ flex-grow: 0;
2530
+ flex-basis: 100%;
2531
+ }
2532
+ .nexus-carousel-btn {
2533
+ position: absolute;
2534
+ top: 50%;
2535
+ transform: translateY(-50%);
2536
+ z-index: 10;
2537
+ width: 2rem;
2538
+ height: 2rem;
2539
+ display: inline-flex;
2540
+ align-items: center;
2541
+ justify-content: center;
2542
+ border-radius: 9999px;
2543
+ background: var(--color-surface-default);
2544
+ border: 1px solid var(--color-border-default);
2545
+ box-shadow: var(--shadow-comp-sm);
2546
+ color: var(--color-text-primary);
2547
+ cursor: pointer;
2548
+ font: inherit;
2549
+ padding: 0;
2550
+ margin: 0;
2551
+ transition-property: background-color;
2552
+ transition-duration: 150ms;
2553
+ }
2554
+ .nexus-carousel-btn:hover {
2555
+ background: var(--color-surface-hover);
2556
+ }
2557
+ .nexus-carousel-btn:disabled {
2558
+ opacity: 0.4;
2559
+ pointer-events: none;
2560
+ }
2561
+ .nexus-carousel-btn--prev {
2562
+ left: 0.5rem;
2563
+ }
2564
+ .nexus-carousel-btn--next {
2565
+ right: 0.5rem;
2566
+ }
2567
+ .nexus-carousel-btn__icon {
2568
+ width: 1rem;
2569
+ height: 1rem;
2570
+ }
2571
+ .nexus-carousel-dots {
2572
+ display: flex;
2573
+ justify-content: center;
2574
+ gap: 0.375rem;
2575
+ margin-top: var(--spacing-padding-sm, 0.75rem);
2576
+ }
2577
+ .nexus-carousel-dot {
2578
+ width: 0.5rem;
2579
+ height: 0.5rem;
2580
+ border-radius: 9999px;
2581
+ border: none;
2582
+ padding: 0;
2583
+ cursor: pointer;
2584
+ transition-property: background-color;
2585
+ transition-duration: 150ms;
2586
+ }
2587
+ .nexus-carousel-dot--active {
2588
+ background: var(--color-accent-primary);
2589
+ }
2590
+ .nexus-carousel-dot--inactive {
2591
+ background: var(--color-border-default);
2592
+ }
2593
+ .nexus-carousel-dot--inactive:hover {
2594
+ background: var(--color-text-tertiary);
2595
+ }
2596
+
2597
+ /* ═══════════════════════════════════════════
2598
+ Toast
2599
+ ═══════════════════════════════════════════ */
2600
+
2601
+ .nexus-toast {
2602
+ display: flex;
2603
+ align-items: center;
2604
+ gap: var(--spacing-gap-sm, 0.75rem);
2605
+ border-radius: var(--radius-corner-lg, 0.5rem);
2606
+ border: 1px solid var(--color-border-default);
2607
+ padding: var(--spacing-padding-sm, 0.75rem) var(--spacing-padding-md, 1rem);
2608
+ box-shadow: var(--shadow-comp-lg);
2609
+ background: var(--color-surface-default);
2610
+ color: var(--color-text-primary);
2611
+ }
2612
+ .nexus-toast__title {
2613
+ font-size: var(--text-text-sm, 0.875rem);
2614
+ font-weight: 500;
2615
+ }
2616
+ .nexus-toast__desc {
2617
+ font-size: var(--text-text-xs, 0.75rem);
2618
+ color: var(--color-text-secondary);
2619
+ }
2620
+ .nexus-toast--success {
2621
+ border-color: color-mix(
2622
+ in srgb,
2623
+ var(--color-status-positive) 30%,
2624
+ transparent
2625
+ );
2626
+ background: color-mix(in srgb, var(--color-status-positive) 10%, transparent);
2627
+ color: var(--color-status-positive);
2628
+ }
2629
+ .nexus-toast--error {
2630
+ border-color: color-mix(in srgb, var(--color-status-danger) 30%, transparent);
2631
+ background: color-mix(in srgb, var(--color-status-danger) 10%, transparent);
2632
+ color: var(--color-status-danger);
2633
+ }
2634
+ .nexus-toast--warning {
2635
+ border-color: color-mix(
2636
+ in srgb,
2637
+ var(--color-status-caution) 30%,
2638
+ transparent
2639
+ );
2640
+ background: color-mix(in srgb, var(--color-status-caution) 10%, transparent);
2641
+ color: var(--color-status-caution);
2642
+ }
2643
+ .nexus-toast--info {
2644
+ border-color: color-mix(
2645
+ in srgb,
2646
+ var(--color-accent-primary) 30%,
2647
+ transparent
2648
+ );
2649
+ background: color-mix(in srgb, var(--color-accent-primary) 10%, transparent);
2650
+ color: var(--color-accent-primary);
2651
+ }
2652
+ .nexus-toast__action-btn {
2653
+ background: var(--color-accent-primary);
2654
+ color: var(--color-accent-on-primary);
2655
+ border-radius: var(--radius-corner-sm, 0.25rem);
2656
+ padding: 0.375rem var(--spacing-padding-sm, 0.75rem);
2657
+ font-size: var(--text-text-xs, 0.75rem);
2658
+ font-weight: 500;
2659
+ }
2660
+ .nexus-toast__cancel-btn {
2661
+ background: var(--color-surface-hover);
2662
+ color: var(--color-text-secondary);
2663
+ border-radius: var(--radius-corner-sm, 0.25rem);
2664
+ padding: 0.375rem var(--spacing-padding-sm, 0.75rem);
2665
+ font-size: var(--text-text-xs, 0.75rem);
2666
+ font-weight: 500;
2667
+ }
2668
+ .nexus-toast__close-btn {
2669
+ color: var(--color-text-tertiary);
2670
+ }
2671
+ .nexus-toast__close-btn:hover {
2672
+ color: var(--color-text-primary);
2673
+ }
2674
+
2675
+ /* ═══════════════════════════════════════════
2676
+ Table
2677
+ ═══════════════════════════════════════════ */
2678
+
2679
+ .nexus-table-wrap {
2680
+ overflow-x: auto;
2681
+ }
2682
+ .nexus-table {
2683
+ width: 100%;
2684
+ }
2685
+ .nexus-table-thead {
2686
+ display: flex;
2687
+ background: var(--color-surface-default);
2688
+ }
2689
+ .nexus-table-th {
2690
+ display: flex;
2691
+ }
2692
+ .nexus-table-th--sortable {
2693
+ cursor: pointer;
2694
+ }
2695
+ .nexus-table-th__sort-btn {
2696
+ display: inline-flex;
2697
+ align-items: center;
2698
+ gap: var(--spacing-gap-xs, 0.25rem);
2699
+ background: none;
2700
+ border: none;
2701
+ padding: 0;
2702
+ margin: 0;
2703
+ font: inherit;
2704
+ color: inherit;
2705
+ cursor: pointer;
2706
+ text-align: inherit;
2707
+ width: 100%;
2708
+ }
2709
+ .nexus-table-sort-icon {
2710
+ width: 1rem;
2711
+ height: 1rem;
2712
+ }
2713
+ .nexus-table-center {
2714
+ display: flex;
2715
+ align-items: center;
2716
+ justify-content: center;
2717
+ padding-block: 3rem;
2718
+ }
2719
+ .nexus-table-nodata {
2720
+ color: var(--color-text-tertiary);
2721
+ }
2722
+ .nexus-table-loading-icon {
2723
+ width: 2rem;
2724
+ height: 2rem;
2725
+ animation: nexus-spin 1s linear infinite;
2726
+ border-radius: 9999px;
2727
+ border: 2px solid var(--color-border-default);
2728
+ border-top-color: var(--color-accent-primary);
2729
+ }
2730
+ .nexus-table-skeleton-row {
2731
+ display: flex;
2732
+ cursor: default;
2733
+ }
2734
+ .nexus-table-skeleton-td {
2735
+ height: 100%;
2736
+ width: 100%;
2737
+ padding-block: var(--spacing-padding-md, 1rem);
2738
+ }
2739
+ .nexus-table-skeleton-bar {
2740
+ height: 1rem;
2741
+ width: 100%;
2742
+ }
2743
+
2744
+ /* TableRow */
2745
+ .nexus-table-row {
2746
+ border-bottom: 1px solid var(--color-border-default);
2747
+ display: flex;
2748
+ min-width: 0;
2749
+ }
2750
+ .nexus-table-row::-webkit-scrollbar {
2751
+ display: none;
2752
+ }
2753
+ .nexus-table-row--default:hover {
2754
+ background: var(--color-surface-hover);
2755
+ }
2756
+ .nexus-table-row--accent:hover {
2757
+ background: color-mix(in srgb, var(--color-accent-primary) 5%, transparent);
2758
+ }
2759
+
2760
+ /* TdColumn */
2761
+ .nexus-td {
2762
+ min-width: 0;
2763
+ width: 100%;
2764
+ }
2765
+ .nexus-td__inner {
2766
+ border-radius: var(--radius-corner-md, 0.375rem);
2767
+ padding: 2px 0.25rem;
2768
+ transition-property: background-color;
2769
+ transition-duration: 150ms;
2770
+ }
2771
+ .nexus-td__inner--flex {
2772
+ display: flex;
2773
+ }
2774
+ .nexus-td__inner--highlight {
2775
+ background: color-mix(in srgb, var(--color-accent-primary) 10%, transparent);
2776
+ outline: 1px dashed var(--color-accent-primary);
2777
+ outline-offset: -1px;
2778
+ }
2779
+ .nexus-td--nowrap {
2780
+ white-space: nowrap;
2781
+ }
2782
+ .nexus-td--truncate {
2783
+ overflow: hidden;
2784
+ text-overflow: ellipsis;
2785
+ white-space: nowrap;
2786
+ }
2787
+ .nexus-td--wrap {
2788
+ white-space: normal;
2789
+ overflow-wrap: break-word;
2790
+ }
2791
+ .nexus-td--break-all {
2792
+ white-space: normal;
2793
+ word-break: break-all;
2794
+ }
2795
+ .nexus-td--center {
2796
+ text-align: center;
2797
+ justify-content: center;
2798
+ }
2799
+ .nexus-td--left {
2800
+ text-align: left;
2801
+ justify-content: flex-start;
2802
+ }
2803
+ .nexus-td--right {
2804
+ text-align: right;
2805
+ justify-content: flex-end;
2806
+ }
2807
+
2808
+ /* ═══════════════════════════════════════════
2809
+ Modal
2810
+ ═══════════════════════════════════════════ */
2811
+
2812
+ .nexus-modal-wrap {
2813
+ pointer-events: none;
2814
+ position: fixed;
2815
+ inset: 0;
2816
+ z-index: 99999;
2817
+ display: flex;
2818
+ height: 100%;
2819
+ align-items: center;
2820
+ justify-content: center;
2821
+ color: var(--color-text-primary);
2822
+ }
2823
+ .nexus-modal-wrap--bottom-sheet {
2824
+ align-items: flex-end;
2825
+ }
2826
+ .nexus-modal-wrap--slide-left {
2827
+ height: 100%;
2828
+ justify-content: flex-start;
2829
+ }
2830
+ .nexus-modal-wrap--slide-right {
2831
+ height: 100%;
2832
+ justify-content: flex-end;
2833
+ }
2834
+ .nexus-modal-wrap--full-page,
2835
+ .nexus-modal-wrap--full-page-reverse {
2836
+ height: 100%;
2837
+ justify-content: flex-start;
2838
+ }
2839
+
2840
+ .nexus-modal-inner {
2841
+ position: relative;
2842
+ z-index: 2;
2843
+ overflow: hidden;
2844
+ pointer-events: auto;
2845
+ border-radius: var(--radius-corner-lg, 12px);
2846
+ border: 1px solid var(--color-border-default);
2847
+ background: var(--color-surface-default);
2848
+ color: var(--color-text-primary);
2849
+ }
2850
+ :where(.nexus-modal-inner) {
2851
+ width: 100%;
2852
+ min-height: 200px;
2853
+ }
2854
+ .nexus-modal-inner > div {
2855
+ display: contents;
2856
+ }
2857
+ @media (min-width: 640px) {
2858
+ :where(.nexus-modal-inner) {
2859
+ width: 480px;
2860
+ min-height: auto;
2861
+ }
2862
+ }
2863
+ .nexus-modal-inner--bottom-sheet {
2864
+ margin: 0;
2865
+ width: 100%;
2866
+ border-top-left-radius: 1rem;
2867
+ border-top-right-radius: 1rem;
2868
+ border-bottom-left-radius: 0;
2869
+ border-bottom-right-radius: 0;
2870
+ border-top: 1px solid var(--color-border-default);
2871
+ padding: 1.5rem 1rem 0;
2872
+ }
2873
+ .nexus-modal-inner--slide-left,
2874
+ .nexus-modal-inner--slide-right {
2875
+ height: 100%;
2876
+ border-radius: 0;
2877
+ }
2878
+ .nexus-modal-inner--full-page,
2879
+ .nexus-modal-inner--full-page-reverse {
2880
+ height: 100%;
2881
+ width: 100%;
2882
+ border-radius: 0;
2883
+ border-color: transparent;
2884
+ }
2885
+ @media (min-width: 640px) {
2886
+ .nexus-modal-inner--full-page,
2887
+ .nexus-modal-inner--full-page-reverse {
2888
+ width: 100%;
2889
+ }
2890
+ }
2891
+ .nexus-modal-inner--draggable {
2892
+ min-width: 320px;
2893
+ overflow: visible;
2894
+ }
2895
+ .nexus-modal-inner--has-footer {
2896
+ padding-bottom: 88px;
2897
+ }
2898
+ .nexus-modal-inner--bottom-sheet.nexus-modal-inner--has-footer {
2899
+ padding-bottom: 5rem;
2900
+ }
2901
+
2902
+ .nexus-modal-header {
2903
+ position: relative;
2904
+ padding: 1.5rem 1.25rem 0;
2905
+ }
2906
+ .nexus-modal-header--bottom-sheet {
2907
+ padding: 0;
2908
+ }
2909
+ .nexus-modal-header--draggable {
2910
+ cursor: grab;
2911
+ user-select: none;
2912
+ }
2913
+ .nexus-modal-header--draggable:active {
2914
+ cursor: grabbing;
2915
+ }
2916
+
2917
+ .nexus-modal-close-btn {
2918
+ position: absolute;
2919
+ top: 1.5rem;
2920
+ right: 1.25rem;
2921
+ z-index: 1;
2922
+ margin-left: auto;
2923
+ display: flex;
2924
+ cursor: pointer;
2925
+ align-items: center;
2926
+ justify-content: flex-end;
2927
+ border: none;
2928
+ background: transparent;
2929
+ padding: 0;
2930
+ }
2931
+ .nexus-modal-close-btn--bottom-sheet {
2932
+ position: relative;
2933
+ top: 0;
2934
+ right: 0;
2935
+ }
2936
+ .nexus-modal-close-icon {
2937
+ width: 1.25rem;
2938
+ height: 1.25rem;
2939
+ color: var(--color-text-muted);
2940
+ }
2941
+
2942
+ .nexus-modal-title {
2943
+ margin: 0;
2944
+ padding-right: 42px;
2945
+ font-size: var(--text-text-lg, 1.125rem);
2946
+ font-weight: 600;
2947
+ line-height: 26px;
2948
+ letter-spacing: -0.002em;
2949
+ color: var(--color-text-primary);
2950
+ }
2951
+ .nexus-modal-title--bottom-sheet {
2952
+ padding-top: 0.375rem;
2953
+ line-height: 1.75rem;
2954
+ letter-spacing: -0.012em;
2955
+ }
2956
+ .nexus-modal-desc {
2957
+ color: var(--color-text-muted);
2958
+ font-size: var(--text-text-xs, 0.75rem);
2959
+ margin-top: 0.25rem;
2960
+ }
2961
+
2962
+ .nexus-modal-body {
2963
+ position: relative;
2964
+ overflow-y: auto;
2965
+ padding: 1.5rem 1.25rem 0;
2966
+ }
2967
+ .nexus-modal-body::-webkit-scrollbar {
2968
+ display: none;
2969
+ }
2970
+ .nexus-modal-body--no-footer {
2971
+ padding-bottom: 1.5rem;
2972
+ }
2973
+ .nexus-modal-body--bottom-sheet {
2974
+ margin-top: 1.5rem;
2975
+ max-height: calc(100vh - 108px);
2976
+ padding: 0 0 1.5rem;
2977
+ }
2978
+ .nexus-modal-body--slide,
2979
+ .nexus-modal-body--full-page {
2980
+ height: 100%;
2981
+ max-height: 100%;
2982
+ overflow-y: auto;
2983
+ }
2984
+ .nexus-modal-body--full-page {
2985
+ padding-bottom: 0;
2986
+ }
2987
+
2988
+ .nexus-modal-footer {
2989
+ position: absolute;
2990
+ bottom: 0;
2991
+ left: 0;
2992
+ z-index: 2;
2993
+ display: flex;
2994
+ width: 100%;
2995
+ padding: 1.5rem 1.25rem 1.25rem;
2996
+ }
2997
+ .nexus-modal-footer button {
2998
+ height: 3rem;
2999
+ flex: 1;
3000
+ }
3001
+ .nexus-modal-footer--bottom-sheet {
3002
+ padding: 0.75rem 1rem 1.5rem;
3003
+ }
3004
+ .nexus-modal-footer--draggable {
3005
+ position: relative;
3006
+ }
3007
+
3008
+ .nexus-modal-dim {
3009
+ pointer-events: auto;
3010
+ position: fixed;
3011
+ inset: 0;
3012
+ z-index: 1;
3013
+ display: block;
3014
+ height: 100vh;
3015
+ width: 100vw;
3016
+ background: color-mix(
3017
+ in srgb,
3018
+ var(--color-static-black, #000) 75%,
3019
+ transparent
3020
+ );
3021
+ }
3022
+ .nexus-modal-dim--hidden {
3023
+ display: none;
3024
+ }
3025
+ .nexus-modal-dim--draggable {
3026
+ background: color-mix(
3027
+ in srgb,
3028
+ var(--color-static-black, #000) 30%,
3029
+ transparent
3030
+ );
3031
+ }
3032
+
3033
+ .nexus-modal-bottom-sheet-handle {
3034
+ display: flex;
3035
+ width: 100%;
3036
+ justify-content: center;
3037
+ padding-top: 0.75rem;
3038
+ padding-bottom: 0.5rem;
3039
+ }
3040
+ .nexus-modal-bottom-sheet-bar {
3041
+ background: var(--color-border-default);
3042
+ height: 0.375rem;
3043
+ width: 4rem;
3044
+ border-radius: 9999px;
3045
+ }
3046
+
3047
+ .nexus-modal-component {
3048
+ opacity: 0;
3049
+ }
3050
+ .nexus-modal-component--visible {
3051
+ opacity: 1;
3052
+ }
3053
+ .nexus-modal-component--portal {
3054
+ position: relative;
3055
+ }
3056
+ .nexus-modal-component--enter .nexus-modal-inner {
3057
+ animation-direction: var(--modal-animation-direction);
3058
+ animation-duration: var(--modal-animation-duration);
3059
+ animation-name: var(--modal-animation-name);
3060
+ animation-timing-function: var(--modal-animation-timing-function);
3061
+ }
3062
+ .nexus-modal-component--leave .nexus-modal-inner {
3063
+ animation-direction: reverse;
3064
+ animation-duration: var(--modal-animation-duration);
3065
+ animation-fill-mode: var(--modal-animation-fill-mode);
3066
+ animation-name: var(--modal-animation-name);
3067
+ animation-timing-function: var(--modal-animation-timing-function);
3068
+ }
3069
+
3070
+ .nexus-contents {
3071
+ display: contents;
3072
+ }
3073
+
3074
+ /* ═══════════════════════════════════════════
3075
+ Animation utilities (Radix enter/exit)
3076
+ ═══════════════════════════════════════════ */
3077
+
3078
+ .nexus-animate-in {
3079
+ animation: nexus-enter 200ms ease-out;
3080
+ --nx-enter-opacity: 1;
3081
+ --nx-enter-scale: 1;
3082
+ --nx-enter-translate-x: 0;
3083
+ --nx-enter-translate-y: 0;
3084
+ }
3085
+ .nexus-animate-out {
3086
+ animation: nexus-exit 150ms ease-in forwards;
3087
+ --nx-exit-opacity: 1;
3088
+ --nx-exit-scale: 1;
3089
+ --nx-exit-translate-x: 0;
3090
+ --nx-exit-translate-y: 0;
3091
+ }
3092
+ .nexus-fade-in-0 {
3093
+ --nx-enter-opacity: 0;
3094
+ }
3095
+ .nexus-fade-out-0 {
3096
+ --nx-exit-opacity: 0;
3097
+ }
3098
+ .nexus-zoom-in-95 {
3099
+ --nx-enter-scale: 0.95;
3100
+ }
3101
+ .nexus-zoom-out-95 {
3102
+ --nx-exit-scale: 0.95;
3103
+ }
3104
+ .nexus-slide-in-from-top-2 {
3105
+ --nx-enter-translate-y: -0.5rem;
3106
+ }
3107
+ .nexus-slide-in-from-bottom-2 {
3108
+ --nx-enter-translate-y: 0.5rem;
3109
+ }
3110
+ .nexus-slide-in-from-left-2 {
3111
+ --nx-enter-translate-x: -0.5rem;
3112
+ }
3113
+ .nexus-slide-in-from-right-2 {
3114
+ --nx-enter-translate-x: 0.5rem;
3115
+ }
3116
+
3117
+ /* ═══════════════════════════════════════════
3118
+ Keyframes
3119
+ ═══════════════════════════════════════════ */
3120
+
3121
+ @keyframes nexus-spin {
3122
+ from {
3123
+ transform: rotate(0deg);
3124
+ }
3125
+ to {
3126
+ transform: rotate(360deg);
3127
+ }
3128
+ }
3129
+
3130
+ @keyframes nexus-enter {
3131
+ from {
3132
+ opacity: var(--nx-enter-opacity, 1);
3133
+ transform: translate3d(
3134
+ var(--nx-enter-translate-x, 0),
3135
+ var(--nx-enter-translate-y, 0),
3136
+ 0
3137
+ )
3138
+ scale3d(
3139
+ var(--nx-enter-scale, 1),
3140
+ var(--nx-enter-scale, 1),
3141
+ var(--nx-enter-scale, 1)
3142
+ );
3143
+ }
3144
+ }
3145
+
3146
+ @keyframes nexus-exit {
3147
+ to {
3148
+ opacity: var(--nx-exit-opacity, 1);
3149
+ transform: translate3d(
3150
+ var(--nx-exit-translate-x, 0),
3151
+ var(--nx-exit-translate-y, 0),
3152
+ 0
3153
+ )
3154
+ scale3d(
3155
+ var(--nx-exit-scale, 1),
3156
+ var(--nx-exit-scale, 1),
3157
+ var(--nx-exit-scale, 1)
3158
+ );
3159
+ }
3160
+ }
3161
+
3162
+ @keyframes nexus-accordion-down {
3163
+ from {
3164
+ height: 0;
3165
+ }
3166
+ to {
3167
+ height: var(--radix-accordion-content-height);
3168
+ }
3169
+ }
3170
+
3171
+ @keyframes nexus-accordion-up {
3172
+ from {
3173
+ height: var(--radix-accordion-content-height);
3174
+ }
3175
+ to {
3176
+ height: 0;
3177
+ }
3178
+ }
3179
+
3180
+ @keyframes nexus-skeleton-shimmer {
3181
+ 0% {
3182
+ background-position: 300% 0;
3183
+ }
3184
+ 100% {
3185
+ background-position: -300% 0;
3186
+ }
3187
+ }
3188
+
3189
+ @keyframes modal-fade {
3190
+ from {
3191
+ opacity: 0;
3192
+ }
3193
+ to {
3194
+ opacity: 1;
3195
+ }
3196
+ }
3197
+
3198
+ @keyframes modal-fade-in {
3199
+ from {
3200
+ opacity: 0;
3201
+ }
3202
+ to {
3203
+ opacity: 1;
3204
+ }
3205
+ }
3206
+
3207
+ @keyframes modal-scale {
3208
+ from {
3209
+ transform: scale(0);
3210
+ }
3211
+ to {
3212
+ transform: scale(1);
3213
+ }
3214
+ }
3215
+
3216
+ @keyframes modal-small-scale {
3217
+ from {
3218
+ transform: scale(0.9);
3219
+ }
3220
+ to {
3221
+ transform: scale(1);
3222
+ }
3223
+ }
3224
+
3225
+ @keyframes modal-pop-fade {
3226
+ 0% {
3227
+ transform: scale(0.95);
3228
+ opacity: 0;
3229
+ }
3230
+ 60% {
3231
+ transform: scale(1.03);
3232
+ opacity: 1;
3233
+ }
3234
+ 100% {
3235
+ transform: scale(1);
3236
+ opacity: 1;
3237
+ }
3238
+ }
3239
+
3240
+ @keyframes modal-bottom-sheet {
3241
+ from {
3242
+ transform: translateY(calc(100% + 60px));
3243
+ }
3244
+ to {
3245
+ transform: translateY(0);
3246
+ }
3247
+ }
3248
+
3249
+ @keyframes modal-slide-left {
3250
+ from {
3251
+ transform: translateX(-100%);
3252
+ }
3253
+ to {
3254
+ transform: translateX(0);
3255
+ }
3256
+ }
3257
+
3258
+ @keyframes modal-slide-right {
3259
+ from {
3260
+ transform: translateX(100%);
3261
+ }
3262
+ to {
3263
+ transform: translateX(0);
3264
+ }
3265
+ }
3266
+
3267
+ @keyframes modal-full-page {
3268
+ from {
3269
+ transform: translateY(60%);
3270
+ opacity: 0.5;
3271
+ }
3272
+ to {
3273
+ transform: translateY(0);
3274
+ opacity: 1;
3275
+ }
3276
+ }
3277
+
3278
+ @keyframes modal-full-page-reverse {
3279
+ from {
3280
+ transform: translateY(-60%);
3281
+ opacity: 0.5;
3282
+ }
3283
+ to {
3284
+ transform: translateY(0);
3285
+ opacity: 1;
3286
+ }
3287
+ }
3288
+
3289
+ /* ═══════════════════════════════════════════
3290
+ EmptyState
3291
+ ═══════════════════════════════════════════ */
3292
+
3293
+ .nexus-empty-state {
3294
+ display: flex;
3295
+ flex-direction: column;
3296
+ align-items: center;
3297
+ justify-content: center;
3298
+ text-align: center;
3299
+ gap: var(--spacing-gap-sm, 0.5rem);
3300
+ padding: var(--spacing-padding-lg, 1.5rem);
3301
+ color: var(--color-text-primary);
3302
+ }
3303
+ .nexus-empty-state__icon {
3304
+ display: flex;
3305
+ align-items: center;
3306
+ justify-content: center;
3307
+ margin-bottom: var(--spacing-gap-xs, 0.25rem);
3308
+ color: var(--color-icon-muted);
3309
+ }
3310
+ .nexus-empty-state__default-icon {
3311
+ width: var(--size-icon-xl, 2rem);
3312
+ height: var(--size-icon-xl, 2rem);
3313
+ }
3314
+ .nexus-empty-state--sm .nexus-empty-state__default-icon {
3315
+ width: var(--size-icon-lg, 1.5rem);
3316
+ height: var(--size-icon-lg, 1.5rem);
3317
+ }
3318
+ .nexus-empty-state--lg .nexus-empty-state__default-icon {
3319
+ width: var(--size-control-md, 2.5rem);
3320
+ height: var(--size-control-md, 2.5rem);
3321
+ }
3322
+ .nexus-empty-state__title {
3323
+ margin: 0;
3324
+ font-size: var(--text-heading-h6, 1rem);
3325
+ font-weight: var(--font-weight-heading-h6, 600);
3326
+ letter-spacing: var(--letter-spacing-heading-h6, 0);
3327
+ color: var(--color-text-primary);
3328
+ }
3329
+ .nexus-empty-state__description {
3330
+ margin: 0;
3331
+ max-width: 24rem;
3332
+ font-size: var(--text-text-sm, 0.875rem);
3333
+ font-weight: var(--font-weight-text-sm, 400);
3334
+ letter-spacing: var(--letter-spacing-text-sm, -0.01em);
3335
+ color: var(--color-text-secondary);
3336
+ }
3337
+ .nexus-empty-state__action {
3338
+ margin-top: var(--spacing-gap-sm, 0.5rem);
3339
+ }
3340
+ .nexus-empty-state--sm {
3341
+ padding: var(--spacing-padding-md, 1rem);
3342
+ gap: var(--spacing-gap-xs, 0.25rem);
3343
+ }
3344
+ .nexus-empty-state--sm .nexus-empty-state__title {
3345
+ font-size: var(--text-text-semibold-sm, 0.875rem);
3346
+ }
3347
+ .nexus-empty-state--sm .nexus-empty-state__description {
3348
+ font-size: var(--text-text-xs, 0.75rem);
3349
+ }
3350
+ .nexus-empty-state--lg {
3351
+ padding: var(--spacing-padding-xl, 2rem);
3352
+ gap: var(--spacing-gap-md, 1rem);
3353
+ }
3354
+ .nexus-empty-state--lg .nexus-empty-state__title {
3355
+ font-size: var(--text-heading-h5, 1.125rem);
3356
+ }
3357
+
3358
+ /* ═══════════════════════════════════════════
3359
+ Breadcrumb
3360
+ ═══════════════════════════════════════════ */
3361
+
3362
+ .nexus-breadcrumb {
3363
+ font-size: var(--text-text-sm, 0.875rem);
3364
+ line-height: 1.25;
3365
+ }
3366
+ .nexus-breadcrumb__list {
3367
+ display: flex;
3368
+ flex-wrap: wrap;
3369
+ align-items: center;
3370
+ list-style: none;
3371
+ margin: 0;
3372
+ padding: 0;
3373
+ gap: 0;
3374
+ }
3375
+ .nexus-breadcrumb__item {
3376
+ display: inline-flex;
3377
+ align-items: center;
3378
+ }
3379
+ .nexus-breadcrumb__separator {
3380
+ display: inline-flex;
3381
+ align-items: center;
3382
+ margin: 0 var(--spacing-gap-xs, 0.25rem);
3383
+ color: var(--color-icon-tertiary);
3384
+ user-select: none;
3385
+ }
3386
+ .nexus-breadcrumb__separator-icon {
3387
+ width: var(--size-icon-xs, 0.75rem);
3388
+ height: var(--size-icon-xs, 0.75rem);
3389
+ }
3390
+ .nexus-breadcrumb__link {
3391
+ color: var(--color-text-secondary);
3392
+ text-decoration: none;
3393
+ transition: color 150ms ease;
3394
+ }
3395
+ .nexus-breadcrumb__link:hover {
3396
+ color: var(--color-text-primary);
3397
+ }
3398
+ .nexus-breadcrumb__link--btn {
3399
+ border: none;
3400
+ background: none;
3401
+ cursor: pointer;
3402
+ font: inherit;
3403
+ padding: 0;
3404
+ }
3405
+ .nexus-breadcrumb__current {
3406
+ color: var(--color-text-primary);
3407
+ font-weight: var(--font-weight-text-medium-sm, 500);
3408
+ }
3409
+ .nexus-breadcrumb__ellipsis {
3410
+ color: var(--color-text-tertiary);
3411
+ user-select: none;
3412
+ }
3413
+
3414
+ /* ═══════════════════════════════════════════
3415
+ Stepper
3416
+ ═══════════════════════════════════════════ */
3417
+
3418
+ .nexus-stepper {
3419
+ width: 100%;
3420
+ }
3421
+
3422
+ /* ── Horizontal ── */
3423
+ .nexus-stepper--horizontal {
3424
+ display: flex;
3425
+ flex-direction: row;
3426
+ align-items: flex-start;
3427
+ }
3428
+ .nexus-stepper--horizontal .nexus-stepper__step {
3429
+ flex: 1;
3430
+ min-width: 0;
3431
+ display: flex;
3432
+ flex-direction: column;
3433
+ align-items: center;
3434
+ text-align: center;
3435
+ }
3436
+ .nexus-stepper--horizontal .nexus-stepper__indicator-wrap {
3437
+ display: flex;
3438
+ flex-direction: row;
3439
+ align-items: center;
3440
+ width: 100%;
3441
+ justify-content: center;
3442
+ }
3443
+ .nexus-stepper--horizontal .nexus-stepper__connector {
3444
+ flex: 1;
3445
+ height: 2px;
3446
+ background: var(--color-border-default);
3447
+ transition: background var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3448
+ }
3449
+ .nexus-stepper--horizontal .nexus-stepper__connector--hidden {
3450
+ visibility: hidden;
3451
+ }
3452
+ .nexus-stepper--horizontal .nexus-stepper__connector--completed {
3453
+ background: var(--color-accent-primary);
3454
+ }
3455
+ .nexus-stepper--horizontal .nexus-stepper__content {
3456
+ margin-top: var(--spacing-gap-sm, 0.5rem);
3457
+ padding: 0 var(--spacing-padding-2xs, 0.25rem);
3458
+ }
3459
+
3460
+ /* ── Vertical ── */
3461
+ .nexus-stepper--vertical {
3462
+ display: flex;
3463
+ flex-direction: column;
3464
+ gap: 0;
3465
+ }
3466
+ .nexus-stepper--vertical .nexus-stepper__step {
3467
+ display: flex;
3468
+ flex-direction: row;
3469
+ align-items: stretch;
3470
+ gap: var(--spacing-gap-sm, 0.5rem);
3471
+ }
3472
+ .nexus-stepper--vertical .nexus-stepper__indicator-wrap {
3473
+ display: flex;
3474
+ flex-direction: column;
3475
+ align-items: center;
3476
+ flex-shrink: 0;
3477
+ }
3478
+ .nexus-stepper--vertical .nexus-stepper__connector {
3479
+ width: 2px;
3480
+ flex: 1;
3481
+ min-height: var(--spacing-padding-sm, 0.75rem);
3482
+ background: var(--color-border-default);
3483
+ transition: background var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3484
+ }
3485
+ .nexus-stepper--vertical .nexus-stepper__connector--completed {
3486
+ background: var(--color-accent-primary);
3487
+ }
3488
+ .nexus-stepper--vertical .nexus-stepper__content {
3489
+ padding: var(--spacing-padding-xs, 0.5rem) 0;
3490
+ }
3491
+
3492
+ /* ── Indicator (공통) ── */
3493
+ .nexus-stepper__indicator {
3494
+ display: inline-flex;
3495
+ align-items: center;
3496
+ justify-content: center;
3497
+ flex-shrink: 0;
3498
+ width: var(--size-control-sm, 2rem);
3499
+ height: var(--size-control-sm, 2rem);
3500
+ border-radius: var(--radius-corner-full, 9999px);
3501
+ border: 2px solid var(--color-border-medium);
3502
+ background: var(--color-surface-default);
3503
+ font-size: var(--text-text-sm, 0.875rem);
3504
+ font-weight: var(--font-weight-text-medium-sm, 500);
3505
+ color: var(--color-text-secondary);
3506
+ transition: all var(--duration-transition-normal, 200ms) var(--ease-transition-normal);
3507
+ }
3508
+ .nexus-stepper--sm .nexus-stepper__indicator {
3509
+ width: 1.75rem;
3510
+ height: 1.75rem;
3511
+ font-size: var(--text-text-xs, 0.75rem);
3512
+ }
3513
+ .nexus-stepper__check {
3514
+ width: var(--size-icon-sm, 1rem);
3515
+ height: var(--size-icon-sm, 1rem);
3516
+ }
3517
+ .nexus-stepper--sm .nexus-stepper__check {
3518
+ width: var(--size-icon-xs, 0.75rem);
3519
+ height: var(--size-icon-xs, 0.75rem);
3520
+ }
3521
+
3522
+ /* ── State colors ── */
3523
+ .nexus-stepper__step--completed .nexus-stepper__indicator {
3524
+ border-color: var(--color-accent-primary);
3525
+ background: var(--color-accent-primary);
3526
+ color: var(--color-accent-on-primary);
3527
+ }
3528
+ .nexus-stepper__step--active .nexus-stepper__indicator {
3529
+ border-color: var(--color-accent-primary);
3530
+ color: var(--color-accent-primary);
3531
+ background: var(--color-surface-default);
3532
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent-primary) 20%, transparent);
3533
+ }
3534
+ .nexus-stepper__step--error .nexus-stepper__indicator {
3535
+ border-color: var(--color-status-danger);
3536
+ color: var(--color-status-danger);
3537
+ background: var(--color-surface-default);
3538
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-status-danger) 20%, transparent);
3539
+ }
3540
+ .nexus-stepper__step--pending .nexus-stepper__indicator {
3541
+ border-color: var(--color-border-default);
3542
+ color: var(--color-text-tertiary);
3543
+ }
3544
+
3545
+ /* ── Labels ── */
3546
+ .nexus-stepper__label {
3547
+ display: block;
3548
+ font-size: var(--text-text-sm, 0.875rem);
3549
+ font-weight: var(--font-weight-text-medium-sm, 500);
3550
+ color: var(--color-text-primary);
3551
+ }
3552
+ .nexus-stepper--sm .nexus-stepper__label {
3553
+ font-size: var(--text-text-xs, 0.75rem);
3554
+ }
3555
+ .nexus-stepper__description {
3556
+ display: block;
3557
+ margin-top: var(--spacing-gap-xs, 0.25rem);
3558
+ font-size: var(--text-text-xs, 0.75rem);
3559
+ color: var(--color-text-secondary);
3560
+ }
3561
+ .nexus-stepper__step--pending .nexus-stepper__label {
3562
+ color: var(--color-text-secondary);
3563
+ }
3564
+ .nexus-stepper__step--pending .nexus-stepper__description {
3565
+ color: var(--color-text-muted);
3566
+ }
3567
+
3568
+ /* ═══════════════════════════════════════════
3569
+ TagInput
3570
+ ═══════════════════════════════════════════ */
3571
+
3572
+ .nexus-tag-input-wrapper {
3573
+ display: flex;
3574
+ flex-direction: column;
3575
+ gap: var(--spacing-gap-xs, 0.25rem);
3576
+ }
3577
+ .nexus-tag-input__label {
3578
+ font-size: var(--text-label-md, 0.875rem);
3579
+ font-weight: var(--font-weight-label-md, 500);
3580
+ color: var(--color-text-primary);
3581
+ }
3582
+ .nexus-tag-input {
3583
+ display: flex;
3584
+ flex-wrap: wrap;
3585
+ align-items: center;
3586
+ gap: var(--spacing-gap-xs, 0.25rem);
3587
+ padding: var(--spacing-padding-xs, 0.5rem);
3588
+ border: var(--border-width-stroke-default, 1px) solid var(--color-border-default);
3589
+ border-radius: var(--radius-corner-md, 0.5rem);
3590
+ background: var(--color-surface-default);
3591
+ cursor: text;
3592
+ transition: border-color 150ms ease;
3593
+ }
3594
+ .nexus-tag-input:focus-within {
3595
+ border-color: var(--color-border-default-focus, var(--color-accent-primary));
3596
+ }
3597
+ .nexus-tag-input--disabled {
3598
+ opacity: var(--opacity-disabled-element, 0.4);
3599
+ cursor: not-allowed;
3600
+ pointer-events: none;
3601
+ }
3602
+ .nexus-tag-input--sm {
3603
+ padding: var(--spacing-padding-2xs, 0.25rem);
3604
+ gap: 0.125rem;
3605
+ font-size: var(--text-text-xs, 0.75rem);
3606
+ }
3607
+ .nexus-tag-input--md {
3608
+ font-size: var(--text-text-sm, 0.875rem);
3609
+ }
3610
+ .nexus-tag-input--lg {
3611
+ padding: var(--spacing-padding-sm, 0.75rem);
3612
+ font-size: var(--text-text-base, 1rem);
3613
+ }
3614
+ .nexus-tag-input__tag {
3615
+ display: inline-flex;
3616
+ align-items: center;
3617
+ gap: 0.25rem;
3618
+ padding: 0.125rem 0.5rem;
3619
+ border-radius: var(--radius-corner-sm, 0.25rem);
3620
+ background: var(--color-surface-subtle);
3621
+ color: var(--color-text-primary);
3622
+ font-size: inherit;
3623
+ line-height: 1.5;
3624
+ white-space: nowrap;
3625
+ }
3626
+ .nexus-tag-input__tag-close {
3627
+ display: inline-flex;
3628
+ align-items: center;
3629
+ justify-content: center;
3630
+ border: none;
3631
+ background: transparent;
3632
+ cursor: pointer;
3633
+ padding: 0;
3634
+ margin: 0;
3635
+ color: var(--color-icon-tertiary);
3636
+ transition: color 150ms;
3637
+ }
3638
+ .nexus-tag-input__tag-close:hover {
3639
+ color: var(--color-icon-primary);
3640
+ }
3641
+ .nexus-tag-input__tag-close-icon {
3642
+ width: 0.75rem;
3643
+ height: 0.75rem;
3644
+ }
3645
+ .nexus-tag-input__input {
3646
+ flex: 1;
3647
+ min-width: 4rem;
3648
+ border: none;
3649
+ outline: none;
3650
+ background: transparent;
3651
+ font: inherit;
3652
+ color: var(--color-text-primary);
3653
+ padding: 0.125rem 0;
3654
+ }
3655
+ .nexus-tag-input__input::placeholder {
3656
+ color: var(--color-text-muted);
3657
+ }
3658
+ .nexus-tag-input__description {
3659
+ font-size: var(--text-text-xs, 0.75rem);
3660
+ color: var(--color-text-secondary);
3661
+ }
3662
+
3663
+ /* ═══════════════════════════════════════════
3664
+ NxImage
3665
+ ═══════════════════════════════════════════ */
3666
+
3667
+ .nexus-image {
3668
+ position: relative;
3669
+ overflow: hidden;
3670
+ display: block;
3671
+ background: var(--color-surface-subtle);
3672
+ }
3673
+ .nexus-image__fallback {
3674
+ display: flex;
3675
+ align-items: center;
3676
+ justify-content: center;
3677
+ width: 100%;
3678
+ height: 100%;
3679
+ min-height: 4rem;
3680
+ color: var(--color-icon-muted);
3681
+ }
3682
+ .nexus-image__fallback-icon {
3683
+ width: var(--size-icon-xl, 2rem);
3684
+ height: var(--size-icon-xl, 2rem);
3685
+ }
3686
+ .nexus-image__skeleton {
3687
+ position: absolute;
3688
+ inset: 0;
3689
+ background: linear-gradient(90deg, var(--color-surface-subtle) 25%, var(--color-surface-default) 50%, var(--color-surface-subtle) 75%);
3690
+ background-size: 200% 100%;
3691
+ animation: nexus-shimmer 1.5s infinite;
3692
+ }
3693
+ .nexus-image__img {
3694
+ display: block;
3695
+ width: 100%;
3696
+ height: 100%;
3697
+ opacity: 0;
3698
+ transition: opacity 300ms ease;
3699
+ }
3700
+ .nexus-image__img--loaded {
3701
+ opacity: 1;
3702
+ }
3703
+ .nexus-image__img--cover {
3704
+ object-fit: cover;
3705
+ }
3706
+ .nexus-image__img--contain {
3707
+ object-fit: contain;
3708
+ }
3709
+ .nexus-image__img--fill {
3710
+ object-fit: fill;
3711
+ }
3712
+ .nexus-image__img--none {
3713
+ object-fit: none;
3714
+ }
3715
+
3716
+ @keyframes nexus-shimmer {
3717
+ 0% { background-position: -200% 0; }
3718
+ 100% { background-position: 200% 0; }
3719
+ }
3720
+
3721
+ /* ═══════════════════════════════════════════
3722
+ DatePicker / Calendar
3723
+ ═══════════════════════════════════════════ */
3724
+
3725
+ .nexus-datepicker {
3726
+ position: relative;
3727
+ display: inline-block;
3728
+ }
3729
+ .nexus-datepicker__trigger {
3730
+ display: inline-flex;
3731
+ align-items: center;
3732
+ gap: var(--spacing-gap-sm, 0.5rem);
3733
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
3734
+ border: var(--border-width-stroke-default, 1px) solid var(--color-border-default);
3735
+ border-radius: var(--radius-corner-md, 0.5rem);
3736
+ background: var(--color-surface-default);
3737
+ font: inherit;
3738
+ font-size: var(--text-text-sm, 0.875rem);
3739
+ color: var(--color-text-primary);
3740
+ cursor: pointer;
3741
+ transition: border-color 150ms;
3742
+ min-width: 10rem;
3743
+ }
3744
+ .nexus-datepicker__trigger:hover {
3745
+ border-color: var(--color-border-default-hover);
3746
+ }
3747
+ .nexus-datepicker__trigger:disabled {
3748
+ opacity: var(--opacity-disabled-element, 0.4);
3749
+ cursor: not-allowed;
3750
+ }
3751
+ .nexus-datepicker__trigger--placeholder span {
3752
+ color: var(--color-text-muted);
3753
+ }
3754
+ .nexus-datepicker__icon {
3755
+ width: var(--size-icon-sm, 1rem);
3756
+ height: var(--size-icon-sm, 1rem);
3757
+ flex-shrink: 0;
3758
+ color: var(--color-icon-secondary);
3759
+ }
3760
+ .nexus-datepicker__popover {
3761
+ position: absolute;
3762
+ top: calc(100% + 4px);
3763
+ left: 0;
3764
+ z-index: var(--z-index-layer-popover, 30);
3765
+ background: var(--color-surface-default);
3766
+ border: var(--border-width-stroke-default, 1px) solid var(--color-border-default);
3767
+ border-radius: var(--radius-corner-lg, 0.75rem);
3768
+ box-shadow: var(--shadow-lg, 0 2px 8px -1px rgb(0 0 0 / 0.12));
3769
+ padding: var(--spacing-padding-sm, 0.75rem);
3770
+ animation: nexus-fade-in 150ms ease;
3771
+ }
3772
+
3773
+ .nexus-calendar {
3774
+ font-size: var(--text-text-sm, 0.875rem);
3775
+ }
3776
+ .nexus-calendar__months {
3777
+ display: flex;
3778
+ flex-direction: column;
3779
+ gap: var(--spacing-gap-sm, 0.5rem);
3780
+ }
3781
+ .nexus-calendar__caption {
3782
+ display: flex;
3783
+ justify-content: center;
3784
+ align-items: center;
3785
+ padding: var(--spacing-padding-2xs, 0.25rem) 0;
3786
+ font-weight: var(--font-weight-text-semibold-sm, 600);
3787
+ color: var(--color-text-primary);
3788
+ }
3789
+ .nexus-calendar__nav {
3790
+ display: flex;
3791
+ gap: var(--spacing-gap-xs, 0.25rem);
3792
+ }
3793
+ .nexus-calendar__nav-btn {
3794
+ display: inline-flex;
3795
+ align-items: center;
3796
+ justify-content: center;
3797
+ width: var(--size-control-sm, 2rem);
3798
+ height: var(--size-control-sm, 2rem);
3799
+ border: none;
3800
+ background: transparent;
3801
+ border-radius: var(--radius-corner-sm, 0.25rem);
3802
+ cursor: pointer;
3803
+ color: var(--color-icon-secondary);
3804
+ transition: background 150ms;
3805
+ }
3806
+ .nexus-calendar__nav-btn:hover {
3807
+ background: var(--color-surface-default-hover);
3808
+ }
3809
+ .nexus-calendar__grid {
3810
+ width: 100%;
3811
+ border-collapse: collapse;
3812
+ }
3813
+ .nexus-calendar__head-row {
3814
+ display: flex;
3815
+ }
3816
+ .nexus-calendar__head-cell {
3817
+ width: var(--size-control-sm, 2rem);
3818
+ text-align: center;
3819
+ font-size: var(--text-text-xs, 0.75rem);
3820
+ font-weight: var(--font-weight-text-medium-xs, 500);
3821
+ color: var(--color-text-tertiary);
3822
+ padding: var(--spacing-padding-2xs, 0.25rem) 0;
3823
+ }
3824
+ .nexus-calendar__row {
3825
+ display: flex;
3826
+ }
3827
+ .nexus-calendar__cell {
3828
+ text-align: center;
3829
+ }
3830
+ .nexus-calendar__day {
3831
+ display: inline-flex;
3832
+ align-items: center;
3833
+ justify-content: center;
3834
+ width: var(--size-control-sm, 2rem);
3835
+ height: var(--size-control-sm, 2rem);
3836
+ border: none;
3837
+ background: transparent;
3838
+ border-radius: var(--radius-corner-sm, 0.25rem);
3839
+ cursor: pointer;
3840
+ font: inherit;
3841
+ font-size: var(--text-text-sm, 0.875rem);
3842
+ color: var(--color-text-primary);
3843
+ transition: background 150ms, color 150ms;
3844
+ }
3845
+ .nexus-calendar__day:hover {
3846
+ background: var(--color-surface-default-hover);
3847
+ }
3848
+ .nexus-calendar__day--selected {
3849
+ background: var(--color-accent-primary);
3850
+ color: var(--color-accent-on-primary);
3851
+ }
3852
+ .nexus-calendar__day--selected:hover {
3853
+ background: var(--color-accent-primary-hover);
3854
+ }
3855
+ .nexus-calendar__day--today {
3856
+ font-weight: var(--font-weight-text-semibold-sm, 600);
3857
+ border: var(--border-width-stroke-default, 1px) solid var(--color-accent-primary);
3858
+ }
3859
+ .nexus-calendar__day--outside {
3860
+ color: var(--color-text-muted);
3861
+ opacity: 0.5;
3862
+ }
3863
+ .nexus-calendar__day--disabled {
3864
+ color: var(--color-text-muted);
3865
+ opacity: var(--opacity-disabled-element, 0.4);
3866
+ cursor: not-allowed;
3867
+ pointer-events: none;
3868
+ }
3869
+
3870
+ @keyframes nexus-fade-in {
3871
+ from { opacity: 0; transform: translateY(-4px); }
3872
+ to { opacity: 1; transform: translateY(0); }
3873
+ }
3874
+
3875
+ }