@nexus-cross/design-system 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/cursor-rules/nexus-project-setup.mdc +292 -0
  2. package/cursor-rules/nexus-ui-api.mdc +698 -0
  3. package/cursor-rules/nexus-ui-components.mdc +136 -0
  4. package/dist/accordion.d.mts +28 -0
  5. package/dist/accordion.d.ts +28 -0
  6. package/dist/accordion.js +28 -0
  7. package/dist/accordion.mjs +3 -0
  8. package/dist/avatar.d.mts +17 -0
  9. package/dist/avatar.d.ts +17 -0
  10. package/dist/avatar.js +16 -0
  11. package/dist/avatar.mjs +3 -0
  12. package/dist/button.d.mts +17 -0
  13. package/dist/button.d.ts +17 -0
  14. package/dist/button.js +16 -0
  15. package/dist/button.mjs +3 -0
  16. package/dist/carousel.d.mts +36 -0
  17. package/dist/carousel.d.ts +36 -0
  18. package/dist/carousel.js +32 -0
  19. package/dist/carousel.mjs +3 -0
  20. package/dist/checkbox.d.mts +21 -0
  21. package/dist/checkbox.d.ts +21 -0
  22. package/dist/checkbox.js +20 -0
  23. package/dist/checkbox.mjs +3 -0
  24. package/dist/chip.d.mts +16 -0
  25. package/dist/chip.d.ts +16 -0
  26. package/dist/chip.js +16 -0
  27. package/dist/chip.mjs +3 -0
  28. package/dist/chunks/chunk-22ULI3BF.js +21 -0
  29. package/dist/chunks/chunk-26BUGBOY.mjs +57 -0
  30. package/dist/chunks/chunk-2JTPRBHZ.mjs +36 -0
  31. package/dist/chunks/chunk-2MC7XJSE.js +98 -0
  32. package/dist/chunks/chunk-2RPRCWKV.mjs +139 -0
  33. package/dist/chunks/chunk-2ZXDXO4I.js +166 -0
  34. package/dist/chunks/chunk-33UFQJIO.mjs +135 -0
  35. package/dist/chunks/chunk-3HHJORN7.mjs +137 -0
  36. package/dist/chunks/chunk-3PCNRCTB.js +61 -0
  37. package/dist/chunks/chunk-3VFBPFZF.mjs +640 -0
  38. package/dist/chunks/chunk-4J3GCZ7W.mjs +102 -0
  39. package/dist/chunks/chunk-54IA2P2Z.mjs +40 -0
  40. package/dist/chunks/chunk-54RBL7J4.mjs +179 -0
  41. package/dist/chunks/chunk-5JHJNN2K.js +83 -0
  42. package/dist/chunks/chunk-5JHN4FCY.mjs +58 -0
  43. package/dist/chunks/chunk-6FMDO6TT.mjs +114 -0
  44. package/dist/chunks/chunk-6H7V2I3X.mjs +270 -0
  45. package/dist/chunks/chunk-7AISZYWL.js +7 -0
  46. package/dist/chunks/chunk-7G65JBTN.js +133 -0
  47. package/dist/chunks/chunk-ADO7PDLY.mjs +66 -0
  48. package/dist/chunks/chunk-AFSEYJZT.js +267 -0
  49. package/dist/chunks/chunk-AOXXE5UQ.mjs +14 -0
  50. package/dist/chunks/chunk-AZ2URLDD.js +39 -0
  51. package/dist/chunks/chunk-B6G5TJRO.js +116 -0
  52. package/dist/chunks/chunk-BLGQHR3M.js +56 -0
  53. package/dist/chunks/chunk-BPUQ2CO2.mjs +48 -0
  54. package/dist/chunks/chunk-BSZ2LN6E.js +129 -0
  55. package/dist/chunks/chunk-CA3SOLI3.mjs +78 -0
  56. package/dist/chunks/chunk-CSJDDREF.js +90 -0
  57. package/dist/chunks/chunk-CVYXRSXT.mjs +8 -0
  58. package/dist/chunks/chunk-CZC76ZD5.js +10 -0
  59. package/dist/chunks/chunk-D6FII7HW.js +202 -0
  60. package/dist/chunks/chunk-DLFV7ZZV.js +112 -0
  61. package/dist/chunks/chunk-DO6VK2QQ.mjs +108 -0
  62. package/dist/chunks/chunk-ECVAVQUY.mjs +243 -0
  63. package/dist/chunks/chunk-EHAUUUWB.mjs +120 -0
  64. package/dist/chunks/chunk-EVOOTSY5.js +59 -0
  65. package/dist/chunks/chunk-GX6GSWX3.mjs +38 -0
  66. package/dist/chunks/chunk-HHXDOKXY.js +108 -0
  67. package/dist/chunks/chunk-HNLI646G.mjs +325 -0
  68. package/dist/chunks/chunk-HUPAHDJ7.js +273 -0
  69. package/dist/chunks/chunk-I252NERB.mjs +21 -0
  70. package/dist/chunks/chunk-IE4DGLMH.js +75 -0
  71. package/dist/chunks/chunk-INP2AH3B.js +27 -0
  72. package/dist/chunks/chunk-IOSIQLZL.js +70 -0
  73. package/dist/chunks/chunk-J5ZKGPBY.js +132 -0
  74. package/dist/chunks/chunk-JNMCYWGY.js +10 -0
  75. package/dist/chunks/chunk-LI7SFBUQ.mjs +89 -0
  76. package/dist/chunks/chunk-LMMON5AU.mjs +81 -0
  77. package/dist/chunks/chunk-LOQXCHKL.js +74 -0
  78. package/dist/chunks/chunk-MA2VCCIY.js +71 -0
  79. package/dist/chunks/chunk-MCKOWMLS.mjs +8 -0
  80. package/dist/chunks/chunk-MRRKW5QN.mjs +108 -0
  81. package/dist/chunks/chunk-MTX7GD3H.js +80 -0
  82. package/dist/chunks/chunk-NFIPQZ4O.js +100 -0
  83. package/dist/chunks/chunk-NHDGKOAM.js +104 -0
  84. package/dist/chunks/chunk-OMN5YQCE.js +143 -0
  85. package/dist/chunks/chunk-OTGS6BDQ.mjs +25 -0
  86. package/dist/chunks/chunk-P2T72N62.mjs +34 -0
  87. package/dist/chunks/chunk-P3DZKXG4.js +116 -0
  88. package/dist/chunks/chunk-QK6NCII4.js +36 -0
  89. package/dist/chunks/chunk-QZ4QR3XV.mjs +142 -0
  90. package/dist/chunks/chunk-RS3SBY3I.js +163 -0
  91. package/dist/chunks/chunk-RX5UKRYK.mjs +76 -0
  92. package/dist/chunks/chunk-SGNRVYYQ.mjs +99 -0
  93. package/dist/chunks/chunk-SJMCPSVH.mjs +76 -0
  94. package/dist/chunks/chunk-T2IY2TSR.js +43 -0
  95. package/dist/chunks/chunk-U53UA76K.js +653 -0
  96. package/dist/chunks/chunk-U56AGSLE.mjs +106 -0
  97. package/dist/chunks/chunk-ULGYTBCT.mjs +47 -0
  98. package/dist/chunks/chunk-V5OTJP6H.mjs +5 -0
  99. package/dist/chunks/chunk-VGO4Z2WH.js +336 -0
  100. package/dist/chunks/chunk-VIGRCJAE.mjs +37 -0
  101. package/dist/chunks/chunk-VVXQZ4XH.mjs +93 -0
  102. package/dist/chunks/chunk-W4GG5A7K.mjs +51 -0
  103. package/dist/chunks/chunk-WKCXACMZ.js +99 -0
  104. package/dist/chunks/chunk-WR55D4ZS.js +80 -0
  105. package/dist/chunks/chunk-X2SHTVZQ.js +89 -0
  106. package/dist/chunks/chunk-XEHFB62A.js +82 -0
  107. package/dist/chunks/chunk-XG6QG65W.mjs +63 -0
  108. package/dist/chunks/chunk-YB5ZKHVB.js +64 -0
  109. package/dist/chunks/chunk-YCG4FZC3.js +167 -0
  110. package/dist/chunks/chunk-YEWKPWK3.mjs +80 -0
  111. package/dist/chunks/chunk-YLO4UKSC.mjs +48 -0
  112. package/dist/chunks/chunk-YZV6FWE7.js +160 -0
  113. package/dist/chunks/chunk-ZWSIIGA3.mjs +58 -0
  114. package/dist/client-only.d.mts +13 -0
  115. package/dist/client-only.d.ts +13 -0
  116. package/dist/client-only.js +11 -0
  117. package/dist/client-only.mjs +2 -0
  118. package/dist/countdown.d.mts +27 -0
  119. package/dist/countdown.d.ts +27 -0
  120. package/dist/countdown.js +16 -0
  121. package/dist/countdown.mjs +3 -0
  122. package/dist/counter.d.mts +15 -0
  123. package/dist/counter.d.ts +15 -0
  124. package/dist/counter.js +11 -0
  125. package/dist/counter.mjs +2 -0
  126. package/dist/data-list.d.mts +33 -0
  127. package/dist/data-list.d.ts +33 -0
  128. package/dist/data-list.js +14 -0
  129. package/dist/data-list.mjs +5 -0
  130. package/dist/divider.d.mts +14 -0
  131. package/dist/divider.d.ts +14 -0
  132. package/dist/divider.js +16 -0
  133. package/dist/divider.mjs +3 -0
  134. package/dist/drawer.d.mts +42 -0
  135. package/dist/drawer.d.ts +42 -0
  136. package/dist/drawer.js +44 -0
  137. package/dist/drawer.mjs +3 -0
  138. package/dist/ellipsis.d.mts +16 -0
  139. package/dist/ellipsis.d.ts +16 -0
  140. package/dist/ellipsis.js +12 -0
  141. package/dist/ellipsis.mjs +3 -0
  142. package/dist/error-boundary.d.mts +20 -0
  143. package/dist/error-boundary.d.ts +20 -0
  144. package/dist/error-boundary.js +11 -0
  145. package/dist/error-boundary.mjs +2 -0
  146. package/dist/hooks/useCheckDevice.d.mts +47 -0
  147. package/dist/hooks/useCheckDevice.d.ts +47 -0
  148. package/dist/hooks/useCheckDevice.js +8 -0
  149. package/dist/hooks/useCheckDevice.mjs +2 -0
  150. package/dist/hooks/useClickOutside.d.mts +12 -0
  151. package/dist/hooks/useClickOutside.d.ts +12 -0
  152. package/dist/hooks/useClickOutside.js +8 -0
  153. package/dist/hooks/useClickOutside.mjs +2 -0
  154. package/dist/hooks/useDraggableBottomSheet.d.mts +24 -0
  155. package/dist/hooks/useDraggableBottomSheet.d.ts +24 -0
  156. package/dist/hooks/useDraggableBottomSheet.js +11 -0
  157. package/dist/hooks/useDraggableBottomSheet.mjs +2 -0
  158. package/dist/hooks/useDraggableWindow.d.mts +21 -0
  159. package/dist/hooks/useDraggableWindow.d.ts +21 -0
  160. package/dist/hooks/useDraggableWindow.js +11 -0
  161. package/dist/hooks/useDraggableWindow.mjs +2 -0
  162. package/dist/hooks/useInView.d.mts +14 -0
  163. package/dist/hooks/useInView.d.ts +14 -0
  164. package/dist/hooks/useInView.js +17 -0
  165. package/dist/hooks/useInView.mjs +2 -0
  166. package/dist/hooks/useModal.d.mts +2 -0
  167. package/dist/hooks/useModal.d.ts +2 -0
  168. package/dist/hooks/useModal.js +11 -0
  169. package/dist/hooks/useModal.mjs +2 -0
  170. package/dist/index.d.mts +76 -0
  171. package/dist/index.d.ts +76 -0
  172. package/dist/index.js +746 -0
  173. package/dist/index.mjs +328 -0
  174. package/dist/infinite-scroll.d.mts +26 -0
  175. package/dist/infinite-scroll.d.ts +26 -0
  176. package/dist/infinite-scroll.js +12 -0
  177. package/dist/infinite-scroll.mjs +3 -0
  178. package/dist/marquee.d.mts +12 -0
  179. package/dist/marquee.d.ts +12 -0
  180. package/dist/marquee.js +12 -0
  181. package/dist/marquee.mjs +3 -0
  182. package/dist/modal/index.d.mts +87 -0
  183. package/dist/modal/index.d.ts +87 -0
  184. package/dist/modal/index.js +54 -0
  185. package/dist/modal/index.mjs +9 -0
  186. package/dist/number-input.d.mts +38 -0
  187. package/dist/number-input.d.ts +38 -0
  188. package/dist/number-input.js +20 -0
  189. package/dist/number-input.mjs +3 -0
  190. package/dist/pagination.d.mts +22 -0
  191. package/dist/pagination.d.ts +22 -0
  192. package/dist/pagination.js +20 -0
  193. package/dist/pagination.mjs +3 -0
  194. package/dist/popover.d.mts +25 -0
  195. package/dist/popover.d.ts +25 -0
  196. package/dist/popover.js +32 -0
  197. package/dist/popover.mjs +3 -0
  198. package/dist/radio-group.d.mts +29 -0
  199. package/dist/radio-group.d.ts +29 -0
  200. package/dist/radio-group.js +24 -0
  201. package/dist/radio-group.mjs +3 -0
  202. package/dist/schemas/_all.json +2250 -0
  203. package/dist/schemas/accordion.json +101 -0
  204. package/dist/schemas/avatar.json +55 -0
  205. package/dist/schemas/button.json +71 -0
  206. package/dist/schemas/carousel.json +32 -0
  207. package/dist/schemas/carouselButton.json +20 -0
  208. package/dist/schemas/carouselDots.json +17 -0
  209. package/dist/schemas/carouselSlide.json +20 -0
  210. package/dist/schemas/checkBox.json +57 -0
  211. package/dist/schemas/chip.json +49 -0
  212. package/dist/schemas/clientOnly.json +19 -0
  213. package/dist/schemas/countdown.json +58 -0
  214. package/dist/schemas/counter.json +57 -0
  215. package/dist/schemas/dataList.json +56 -0
  216. package/dist/schemas/divider.json +40 -0
  217. package/dist/schemas/drawer.json +27 -0
  218. package/dist/schemas/drawerContent.json +50 -0
  219. package/dist/schemas/ellipsis.json +49 -0
  220. package/dist/schemas/errorBoundary.json +22 -0
  221. package/dist/schemas/infiniteScroll.json +65 -0
  222. package/dist/schemas/marquee.json +46 -0
  223. package/dist/schemas/modalCall.json +21 -0
  224. package/dist/schemas/modalTemplate.json +123 -0
  225. package/dist/schemas/numberInput.json +77 -0
  226. package/dist/schemas/pagination.json +50 -0
  227. package/dist/schemas/popover.json +67 -0
  228. package/dist/schemas/radioGroup.json +61 -0
  229. package/dist/schemas/radioItem.json +35 -0
  230. package/dist/schemas/select.json +62 -0
  231. package/dist/schemas/selectItem.json +31 -0
  232. package/dist/schemas/skeleton.json +48 -0
  233. package/dist/schemas/spinner.json +27 -0
  234. package/dist/schemas/switch.json +41 -0
  235. package/dist/schemas/tab.json +89 -0
  236. package/dist/schemas/table.json +75 -0
  237. package/dist/schemas/tableRow.json +32 -0
  238. package/dist/schemas/tdColumn.json +107 -0
  239. package/dist/schemas/textArea.json +44 -0
  240. package/dist/schemas/textInput.json +67 -0
  241. package/dist/schemas/themeProvider.json +65 -0
  242. package/dist/schemas/toaster.json +31 -0
  243. package/dist/schemas/tooltip.json +67 -0
  244. package/dist/schemas/virtualGrid.json +59 -0
  245. package/dist/schemas/virtualList.json +54 -0
  246. package/dist/schemas.d.mts +1263 -0
  247. package/dist/schemas.d.ts +1263 -0
  248. package/dist/schemas.js +513 -0
  249. package/dist/schemas.mjs +469 -0
  250. package/dist/select.d.mts +31 -0
  251. package/dist/select.d.ts +31 -0
  252. package/dist/select.js +24 -0
  253. package/dist/select.mjs +3 -0
  254. package/dist/skeleton.d.mts +15 -0
  255. package/dist/skeleton.d.ts +15 -0
  256. package/dist/skeleton.js +12 -0
  257. package/dist/skeleton.mjs +3 -0
  258. package/dist/spinner.d.mts +9 -0
  259. package/dist/spinner.d.ts +9 -0
  260. package/dist/spinner.js +12 -0
  261. package/dist/spinner.mjs +3 -0
  262. package/dist/styles/layer.d.mts +3 -0
  263. package/dist/styles/layer.d.ts +3 -0
  264. package/dist/styles/layer.js +18 -0
  265. package/dist/styles/layer.mjs +16 -0
  266. package/dist/styles.css +2401 -0
  267. package/dist/styles.d.mts +3 -0
  268. package/dist/styles.d.ts +3 -0
  269. package/dist/styles.js +16 -0
  270. package/dist/styles.layered.css +2404 -0
  271. package/dist/styles.mjs +14 -0
  272. package/dist/switch.d.mts +15 -0
  273. package/dist/switch.d.ts +15 -0
  274. package/dist/switch.js +16 -0
  275. package/dist/switch.mjs +3 -0
  276. package/dist/tab.d.mts +36 -0
  277. package/dist/tab.d.ts +36 -0
  278. package/dist/tab.js +20 -0
  279. package/dist/tab.mjs +3 -0
  280. package/dist/table.d.mts +80 -0
  281. package/dist/table.d.ts +80 -0
  282. package/dist/table.js +33 -0
  283. package/dist/table.mjs +4 -0
  284. package/dist/text-area.d.mts +15 -0
  285. package/dist/text-area.d.ts +15 -0
  286. package/dist/text-area.js +16 -0
  287. package/dist/text-area.mjs +3 -0
  288. package/dist/text-input.d.mts +21 -0
  289. package/dist/text-input.d.ts +21 -0
  290. package/dist/text-input.js +16 -0
  291. package/dist/text-input.mjs +3 -0
  292. package/dist/theme-provider.d.mts +25 -0
  293. package/dist/theme-provider.d.ts +25 -0
  294. package/dist/theme-provider.js +15 -0
  295. package/dist/theme-provider.mjs +2 -0
  296. package/dist/toast.d.mts +42 -0
  297. package/dist/toast.d.ts +42 -0
  298. package/dist/toast.js +20 -0
  299. package/dist/toast.mjs +3 -0
  300. package/dist/tooltip.d.mts +24 -0
  301. package/dist/tooltip.d.ts +24 -0
  302. package/dist/tooltip.js +20 -0
  303. package/dist/tooltip.mjs +3 -0
  304. package/dist/useModal-BsGIcP8t.d.mts +128 -0
  305. package/dist/useModal-BsGIcP8t.d.ts +128 -0
  306. package/dist/utils/cn.d.mts +5 -0
  307. package/dist/utils/cn.d.ts +5 -0
  308. package/dist/utils/cn.js +11 -0
  309. package/dist/utils/cn.mjs +2 -0
  310. package/dist/utils/scroll.d.mts +4 -0
  311. package/dist/utils/scroll.d.ts +4 -0
  312. package/dist/utils/scroll.js +15 -0
  313. package/dist/utils/scroll.mjs +2 -0
  314. package/dist/virtual-scroll.d.mts +34 -0
  315. package/dist/virtual-scroll.d.ts +34 -0
  316. package/dist/virtual-scroll.js +16 -0
  317. package/dist/virtual-scroll.mjs +3 -0
  318. package/package.json +291 -0
  319. package/scripts/setup-cursor-rules.cjs +92 -0
@@ -0,0 +1,2404 @@
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, #fff);
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
+
94
+ /* ═══════════════════════════════════════════
95
+ 컴포넌트 스타일
96
+ ═══════════════════════════════════════════ */
97
+
98
+ /* ─── Shared: sr-only ─── */
99
+ .nexus-sr-only {
100
+ position: absolute;
101
+ width: 1px;
102
+ height: 1px;
103
+ padding: 0;
104
+ margin: -1px;
105
+ overflow: hidden;
106
+ clip: rect(0, 0, 0, 0);
107
+ white-space: nowrap;
108
+ border-width: 0;
109
+ }
110
+
111
+ /* ═══════════════════════════════════════════
112
+ Button
113
+ ═══════════════════════════════════════════ */
114
+
115
+ .nexus-btn {
116
+ display: inline-flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ gap: var(--spacing-comp-btn-gap);
120
+ white-space: nowrap;
121
+ user-select: none;
122
+ box-shadow: var(--shadow-comp-btn);
123
+ transition-property: color, background-color, border-color;
124
+ transition-duration: 200ms;
125
+ }
126
+ .nexus-btn:disabled,
127
+ .nexus-btn[aria-disabled='true'] {
128
+ pointer-events: none;
129
+ opacity: var(--opacity-comp-btn-disabled);
130
+ }
131
+ .nexus-btn:focus-visible {
132
+ outline: 2px solid
133
+ color-mix(in srgb, var(--color-comp-btn-focus-ring) 50%, transparent);
134
+ outline-offset: 2px;
135
+ }
136
+
137
+ /* Variant: contained */
138
+ .nexus-btn--contained {
139
+ background: var(--_btn-base);
140
+ color: var(--_btn-on);
141
+ }
142
+ .nexus-btn--contained:hover {
143
+ background: var(--_btn-hover);
144
+ }
145
+ .nexus-btn--contained:active {
146
+ background: var(--_btn-pressed);
147
+ }
148
+
149
+ /* Variant: outlined */
150
+ .nexus-btn--outlined {
151
+ border: 1px solid var(--_btn-border);
152
+ color: var(--_btn-text);
153
+ background: var(--_btn-outlined-bg);
154
+ }
155
+ .nexus-btn--outlined:hover {
156
+ background: var(--_btn-outlined-hover-bg);
157
+ border-color: var(--_btn-border-hover);
158
+ }
159
+ .nexus-btn--outlined:active {
160
+ background: var(--_btn-outlined-pressed-bg);
161
+ border-color: var(--_btn-border-hover);
162
+ }
163
+
164
+ /* Variant: subtle */
165
+ .nexus-btn--subtle {
166
+ background: var(--_btn-subtle-fill);
167
+ color: var(--_btn-text);
168
+ }
169
+ .nexus-btn--subtle:hover {
170
+ background: var(--_btn-light-bg);
171
+ }
172
+ .nexus-btn--subtle:active {
173
+ background: var(--_btn-light-bg);
174
+ }
175
+
176
+ /* Variant: ghost */
177
+ .nexus-btn--ghost {
178
+ background: transparent;
179
+ color: var(--_btn-text);
180
+ }
181
+ .nexus-btn--ghost:hover {
182
+ background: var(--_btn-ghost-hover-bg);
183
+ }
184
+ .nexus-btn--ghost:active {
185
+ background: var(--_btn-ghost-pressed-bg);
186
+ }
187
+
188
+ /* Sizes */
189
+ .nexus-btn--xl {
190
+ height: var(--spacing-comp-btn-xl-h);
191
+ padding-inline: var(--spacing-comp-btn-xl-px);
192
+ font-size: var(--text-comp-btn-xl);
193
+ font-weight: 600;
194
+ border-radius: var(--radius-comp-btn-xl);
195
+ }
196
+ .nexus-btn--lg {
197
+ height: var(--spacing-comp-btn-lg-h);
198
+ padding-inline: var(--spacing-comp-btn-lg-px);
199
+ font-size: var(--text-comp-btn-lg);
200
+ font-weight: 600;
201
+ border-radius: var(--radius-comp-btn-lg);
202
+ }
203
+ .nexus-btn--md {
204
+ height: var(--spacing-comp-btn-md-h);
205
+ padding-inline: var(--spacing-comp-btn-md-px);
206
+ font-size: var(--text-comp-btn-md);
207
+ font-weight: 500;
208
+ border-radius: var(--radius-comp-btn-md);
209
+ }
210
+ .nexus-btn--sm {
211
+ padding-inline: var(--spacing-comp-btn-sm-px);
212
+ padding-block: var(--spacing-comp-btn-sm-py);
213
+ font-size: var(--text-comp-btn-sm);
214
+ font-weight: 500;
215
+ border-radius: var(--radius-comp-btn-sm);
216
+ }
217
+
218
+ /* Radius override */
219
+ .nexus-btn--circle {
220
+ border-radius: 9999px !important;
221
+ }
222
+
223
+ /* Semantic palette — compound selectors (cascade 방지) */
224
+ .nexus-btn--primary {
225
+ --_btn-base: var(--color-comp-btn-primary-base);
226
+ --_btn-hover: var(--color-comp-btn-primary-hover);
227
+ --_btn-pressed: var(--color-comp-btn-primary-pressed);
228
+ --_btn-on: var(--color-comp-btn-primary-on);
229
+ --_btn-text: var(--color-comp-btn-primary-text);
230
+ --_btn-subtle-fill: var(--color-comp-btn-primary-subtle-fill);
231
+ --_btn-light-bg: var(--color-comp-btn-primary-subtle-bg);
232
+ --_btn-border: var(--color-accent-primary-focus, var(--color-accent-primary));
233
+ --_btn-border-hover: var(
234
+ --color-accent-primary-focus,
235
+ var(--color-accent-primary)
236
+ );
237
+ --_btn-outlined-bg: var(--color-surface-default);
238
+ --_btn-outlined-hover-bg: var(--color-comp-btn-primary-subtle-bg);
239
+ --_btn-outlined-pressed-bg: var(--color-surface-default);
240
+ --_btn-ghost-hover-bg: var(--color-comp-btn-primary-subtle-bg);
241
+ --_btn-ghost-pressed-bg: var(--color-comp-btn-primary-subtle-fill);
242
+ }
243
+ .nexus-btn--secondary {
244
+ --_btn-base: var(--color-comp-btn-secondary-base);
245
+ --_btn-hover: var(--color-comp-btn-secondary-hover);
246
+ --_btn-pressed: var(--color-comp-btn-secondary-pressed);
247
+ --_btn-on: var(--color-comp-btn-secondary-on);
248
+ --_btn-text: var(--color-comp-btn-secondary-text);
249
+ --_btn-subtle-fill: var(--color-comp-btn-secondary-subtle-fill);
250
+ --_btn-light-bg: var(--color-comp-btn-secondary-subtle-bg);
251
+ --_btn-border: var(
252
+ --color-accent-secondary-focus,
253
+ var(--color-accent-secondary)
254
+ );
255
+ --_btn-border-hover: var(
256
+ --color-accent-secondary-focus,
257
+ var(--color-accent-secondary)
258
+ );
259
+ --_btn-outlined-bg: var(--color-surface-default);
260
+ --_btn-outlined-hover-bg: var(--color-comp-btn-secondary-subtle-bg);
261
+ --_btn-outlined-pressed-bg: var(--color-surface-default);
262
+ --_btn-ghost-hover-bg: var(--color-comp-btn-secondary-subtle-bg);
263
+ --_btn-ghost-pressed-bg: var(--color-comp-btn-secondary-subtle-fill);
264
+ }
265
+ .nexus-btn--normal {
266
+ --_btn-base: var(--color-comp-btn-normal-base);
267
+ --_btn-hover: var(--color-comp-btn-normal-hover);
268
+ --_btn-pressed: var(--color-comp-btn-normal-pressed);
269
+ --_btn-on: var(--color-comp-btn-normal-on);
270
+ --_btn-text: var(--color-comp-btn-normal-text);
271
+ --_btn-subtle-fill: var(--color-comp-btn-normal-subtle-fill);
272
+ --_btn-light-bg: var(--color-comp-btn-normal-subtle-bg);
273
+ --_btn-border: var(--color-comp-btn-normal-border);
274
+ --_btn-border-hover: var(--color-comp-btn-normal-border-hover);
275
+ --_btn-outlined-bg: var(--color-surface-default);
276
+ --_btn-outlined-hover-bg: var(--color-comp-btn-normal-subtle-bg);
277
+ --_btn-outlined-pressed-bg: var(
278
+ --color-surface-pressed,
279
+ var(--color-surface-strong)
280
+ );
281
+ --_btn-ghost-hover-bg: var(--color-comp-btn-normal-subtle-bg);
282
+ --_btn-ghost-pressed-bg: var(
283
+ --color-surface-pressed,
284
+ var(--color-surface-strong)
285
+ );
286
+ }
287
+ .nexus-btn--danger {
288
+ --_btn-base: var(--color-comp-btn-danger-base);
289
+ --_btn-hover: var(--color-comp-btn-danger-hover);
290
+ --_btn-pressed: var(--color-comp-btn-danger-pressed);
291
+ --_btn-on: var(--color-comp-btn-danger-on);
292
+ --_btn-text: var(--color-comp-btn-danger-text);
293
+ --_btn-subtle-fill: var(--color-comp-btn-danger-subtle-fill);
294
+ --_btn-light-bg: var(--color-comp-btn-danger-subtle-bg);
295
+ --_btn-border: var(--color-status-danger-focus, var(--color-status-danger));
296
+ --_btn-border-hover: var(
297
+ --color-status-danger-focus,
298
+ var(--color-status-danger)
299
+ );
300
+ --_btn-outlined-bg: var(--color-surface-default);
301
+ --_btn-outlined-hover-bg: var(--color-comp-btn-danger-subtle-bg);
302
+ --_btn-outlined-pressed-bg: var(--color-surface-default);
303
+ --_btn-ghost-hover-bg: var(--color-comp-btn-danger-subtle-bg);
304
+ --_btn-ghost-pressed-bg: var(--color-comp-btn-danger-subtle-fill);
305
+ }
306
+
307
+ /* ═══════════════════════════════════════════
308
+ TextInput
309
+ ═══════════════════════════════════════════ */
310
+
311
+ /* ── Field wrapper ── */
312
+ .nexus-text-input-field {
313
+ display: flex;
314
+ flex-direction: column;
315
+ gap: 0.375rem;
316
+ }
317
+ .nexus-text-input-field__label {
318
+ font-size: var(--text-text-xs, 0.75rem);
319
+ color: var(--color-text-secondary);
320
+ line-height: 1;
321
+ }
322
+ .nexus-text-input-field__footer {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 0.5rem;
326
+ }
327
+ .nexus-text-input-field__description {
328
+ font-size: var(--text-text-xs, 0.75rem);
329
+ color: var(--color-text-tertiary);
330
+ line-height: 1.4;
331
+ }
332
+ .nexus-text-input-field__description--error {
333
+ color: var(--color-status-danger);
334
+ }
335
+ .nexus-text-input-field__count {
336
+ font-size: var(--text-text-xs, 0.75rem);
337
+ color: var(--color-text-tertiary);
338
+ margin-left: auto;
339
+ flex-shrink: 0;
340
+ }
341
+ .nexus-text-input-field__count--error {
342
+ color: var(--color-status-danger);
343
+ }
344
+
345
+ /* ── Input box ── */
346
+ .nexus-text-input {
347
+ display: flex;
348
+ align-items: center;
349
+ gap: 0.5rem;
350
+ border-radius: var(--radius-corner-md, 0.375rem);
351
+ border: 1px solid var(--color-border-default);
352
+ background: var(--color-surface-default);
353
+ font-size: var(--text-text-sm, 0.875rem);
354
+ color: var(--color-text-primary);
355
+ transition: border-color 200ms, box-shadow 200ms;
356
+ }
357
+ :where(.nexus-text-input) {
358
+ width: 100%;
359
+ }
360
+ .nexus-text-input:hover:not(.nexus-text-input--disabled):not(:focus-within) {
361
+ box-shadow: 0 0 0 0.5px var(--color-border-default);
362
+ }
363
+ .nexus-text-input--default:focus-within {
364
+ border-color: var(--color-accent-primary);
365
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
366
+ }
367
+ .nexus-text-input--error {
368
+ border-color: var(--color-status-danger);
369
+ }
370
+ .nexus-text-input--error:focus-within {
371
+ border-color: var(--color-status-danger);
372
+ box-shadow: 0 0 0 0.5px var(--color-status-danger);
373
+ }
374
+ .nexus-text-input--disabled {
375
+ cursor: not-allowed;
376
+ opacity: 0.5;
377
+ }
378
+
379
+ /* ── Sizes ── */
380
+ .nexus-text-input--xl {
381
+ height: 3.5rem;
382
+ padding-inline: var(--spacing-padding-lg, 1.25rem);
383
+ font-size: var(--text-text-base, 1rem);
384
+ }
385
+ .nexus-text-input--lg {
386
+ height: 3rem;
387
+ padding-inline: var(--spacing-padding-md, 1rem);
388
+ font-size: var(--text-text-base, 1rem);
389
+ }
390
+ .nexus-text-input--md {
391
+ height: 2.5rem;
392
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
393
+ font-size: var(--text-text-sm, 0.875rem);
394
+ }
395
+ .nexus-text-input--sm {
396
+ height: 2rem;
397
+ padding-inline: 0.625rem;
398
+ font-size: var(--text-text-xs, 0.75rem);
399
+ }
400
+
401
+ /* ── Inner elements ── */
402
+ .nexus-text-input__inner {
403
+ flex: 1;
404
+ min-width: 0;
405
+ height: 100%;
406
+ background: transparent;
407
+ border: none;
408
+ outline: none;
409
+ color: inherit;
410
+ font: inherit;
411
+ }
412
+ .nexus-text-input__inner:focus-visible {
413
+ outline: none;
414
+ }
415
+ .nexus-text-input__inner::placeholder {
416
+ color: var(--color-text-tertiary);
417
+ }
418
+ .nexus-text-input__icon {
419
+ display: flex;
420
+ flex-shrink: 0;
421
+ color: var(--color-text-tertiary);
422
+ }
423
+ .nexus-text-input__clear {
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: center;
427
+ flex-shrink: 0;
428
+ width: 1.25rem;
429
+ height: 1.25rem;
430
+ border: none;
431
+ background: transparent;
432
+ color: var(--color-text-tertiary);
433
+ cursor: pointer;
434
+ padding: 0;
435
+ border-radius: var(--radius-corner-full, 9999px);
436
+ transition: color 150ms, background-color 150ms;
437
+ }
438
+ .nexus-text-input__clear:hover {
439
+ color: var(--color-text-secondary);
440
+ background-color: var(--color-surface-hover, rgba(0, 0, 0, 0.06));
441
+ }
442
+
443
+ /* ═══════════════════════════════════════════
444
+ TextArea
445
+ ═══════════════════════════════════════════ */
446
+
447
+ .nexus-textarea {
448
+ border-radius: var(--radius-corner-md, 0.375rem);
449
+ border: 1px solid var(--color-border-default);
450
+ background: var(--color-surface-default);
451
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
452
+ font-size: var(--text-text-sm, 0.875rem);
453
+ color: var(--color-text-primary);
454
+ transition-property: border-color;
455
+ transition-duration: 200ms;
456
+ resize: none;
457
+ }
458
+ :where(.nexus-textarea) {
459
+ width: 100%;
460
+ }
461
+ .nexus-textarea::placeholder {
462
+ color: var(--color-text-tertiary);
463
+ }
464
+ .nexus-textarea:focus-visible {
465
+ outline: none;
466
+ }
467
+ .nexus-textarea:disabled {
468
+ cursor: not-allowed;
469
+ opacity: 0.5;
470
+ }
471
+ .nexus-textarea--default:focus {
472
+ border-color: var(--color-text-primary);
473
+ }
474
+ .nexus-textarea--error {
475
+ border-color: var(--color-status-danger);
476
+ }
477
+ .nexus-textarea--error:focus {
478
+ border-color: var(--color-status-danger);
479
+ }
480
+ .nexus-textarea-wrap {
481
+ display: flex;
482
+ flex-direction: column;
483
+ }
484
+ .nexus-textarea-count {
485
+ margin-top: 0.25rem;
486
+ text-align: right;
487
+ font-size: var(--text-text-xs, 0.75rem);
488
+ color: var(--color-text-tertiary);
489
+ }
490
+ .nexus-textarea-count__current {
491
+ color: var(--color-text-primary);
492
+ font-weight: 500;
493
+ }
494
+
495
+ /* ═══════════════════════════════════════════
496
+ NumberInput
497
+ ═══════════════════════════════════════════ */
498
+
499
+ .nexus-number-input {
500
+ display: flex;
501
+ align-items: center;
502
+ border-radius: var(--radius-corner-md, 0.375rem);
503
+ border: 1px solid var(--color-border-default);
504
+ background: var(--color-surface-default);
505
+ color: var(--color-text-primary);
506
+ transition: border-color 200ms, box-shadow 200ms;
507
+ }
508
+ :where(.nexus-number-input) {
509
+ width: 100%;
510
+ }
511
+ .nexus-number-input:hover:not(.nexus-number-input--disabled):not(:focus-within) {
512
+ box-shadow: 0 0 0 0.5px var(--color-border-default);
513
+ }
514
+ .nexus-number-input--default:focus-within {
515
+ border-color: var(--color-accent-primary);
516
+ box-shadow: 0 0 0 0.5px var(--color-accent-primary);
517
+ }
518
+ .nexus-number-input--error {
519
+ border-color: var(--color-status-danger);
520
+ }
521
+ .nexus-number-input--error:focus-within {
522
+ border-color: var(--color-status-danger);
523
+ box-shadow: 0 0 0 0.5px var(--color-status-danger);
524
+ }
525
+ .nexus-number-input--xl {
526
+ height: 3.5rem;
527
+ font-size: var(--text-text-base, 1rem);
528
+ }
529
+ .nexus-number-input--lg {
530
+ height: 3rem;
531
+ font-size: var(--text-text-base, 1rem);
532
+ }
533
+ .nexus-number-input--md {
534
+ height: 2.5rem;
535
+ font-size: var(--text-text-sm, 0.875rem);
536
+ }
537
+ .nexus-number-input--sm {
538
+ height: 2rem;
539
+ font-size: var(--text-text-xs, 0.75rem);
540
+ }
541
+ .nexus-number-input--disabled {
542
+ opacity: 0.5;
543
+ cursor: not-allowed;
544
+ }
545
+ .nexus-number-input__field {
546
+ height: 100%;
547
+ width: 100%;
548
+ min-width: 0;
549
+ flex: 1;
550
+ background: transparent;
551
+ outline: none;
552
+ }
553
+ .nexus-number-input__field::placeholder {
554
+ color: var(--color-text-tertiary);
555
+ }
556
+ .nexus-number-input__field:focus-visible {
557
+ outline: none;
558
+ }
559
+ .nexus-number-input__field--xl {
560
+ padding-inline: var(--spacing-padding-lg, 1.25rem);
561
+ }
562
+ .nexus-number-input__field--lg {
563
+ padding-inline: var(--spacing-padding-md, 1rem);
564
+ }
565
+ .nexus-number-input__field--md {
566
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
567
+ }
568
+ .nexus-number-input__field--sm {
569
+ padding-inline: 0.625rem;
570
+ }
571
+ .nexus-number-input__buttons {
572
+ display: flex;
573
+ flex-direction: column;
574
+ border-left: 1px solid var(--color-border-default);
575
+ height: 100%;
576
+ flex-shrink: 0;
577
+ }
578
+ .nexus-number-input__step {
579
+ display: flex;
580
+ flex: 1;
581
+ align-items: center;
582
+ justify-content: center;
583
+ padding-inline: 0.375rem;
584
+ color: var(--color-text-tertiary);
585
+ transition-property: color, background-color;
586
+ transition-duration: 150ms;
587
+ }
588
+ .nexus-number-input__step:hover {
589
+ color: var(--color-text-primary);
590
+ background: var(--color-surface-hover);
591
+ }
592
+ .nexus-number-input__step:disabled {
593
+ opacity: 0.4;
594
+ pointer-events: none;
595
+ }
596
+ .nexus-number-input__step--up {
597
+ border-top-right-radius: var(--radius-corner-md, 0.375rem);
598
+ border-bottom: 1px solid var(--color-border-default);
599
+ }
600
+ .nexus-number-input__step--down {
601
+ border-bottom-right-radius: var(--radius-corner-md, 0.375rem);
602
+ }
603
+ .nexus-number-input__step-icon {
604
+ width: 0.75rem;
605
+ height: 0.75rem;
606
+ }
607
+
608
+ /* ═══════════════════════════════════════════
609
+ Divider
610
+ ═══════════════════════════════════════════ */
611
+
612
+ .nexus-divider {
613
+ flex-shrink: 0;
614
+ border-color: var(--color-border-default);
615
+ }
616
+ .nexus-divider--horizontal {
617
+ width: 100%;
618
+ border-top-width: 1px;
619
+ }
620
+ .nexus-divider--vertical {
621
+ align-self: stretch;
622
+ border-left-width: 1px;
623
+ }
624
+ .nexus-divider--solid {
625
+ border-style: solid;
626
+ }
627
+ .nexus-divider--dashed {
628
+ border-style: dashed;
629
+ }
630
+ .nexus-divider--dotted {
631
+ border-style: dotted;
632
+ }
633
+
634
+ /* ═══════════════════════════════════════════
635
+ Avatar
636
+ ═══════════════════════════════════════════ */
637
+
638
+ .nexus-avatar {
639
+ position: relative;
640
+ display: inline-flex;
641
+ flex-shrink: 0;
642
+ align-items: center;
643
+ justify-content: center;
644
+ overflow: hidden;
645
+ background: var(--color-surface-hover);
646
+ color: var(--color-text-tertiary);
647
+ }
648
+ .nexus-avatar--xs {
649
+ width: 1.5rem;
650
+ height: 1.5rem;
651
+ font-size: 10px;
652
+ }
653
+ .nexus-avatar--sm {
654
+ width: 2rem;
655
+ height: 2rem;
656
+ font-size: var(--text-text-xs, 0.75rem);
657
+ }
658
+ .nexus-avatar--md {
659
+ width: 2.5rem;
660
+ height: 2.5rem;
661
+ font-size: var(--text-text-sm, 0.875rem);
662
+ }
663
+ .nexus-avatar--lg {
664
+ width: 3rem;
665
+ height: 3rem;
666
+ font-size: var(--text-text-base, 1rem);
667
+ }
668
+ .nexus-avatar--xl {
669
+ width: 4rem;
670
+ height: 4rem;
671
+ font-size: var(--text-text-lg, 1.125rem);
672
+ }
673
+ .nexus-avatar--circle {
674
+ border-radius: 9999px;
675
+ }
676
+ .nexus-avatar--square {
677
+ border-radius: var(--radius-corner-md, 0.375rem);
678
+ }
679
+ .nexus-avatar__icon--xs {
680
+ width: 1rem;
681
+ height: 1rem;
682
+ }
683
+ .nexus-avatar__icon--sm {
684
+ width: 1.25rem;
685
+ height: 1.25rem;
686
+ }
687
+ .nexus-avatar__icon--md {
688
+ width: 1.5rem;
689
+ height: 1.5rem;
690
+ }
691
+ .nexus-avatar__icon--lg {
692
+ width: 2rem;
693
+ height: 2rem;
694
+ }
695
+ .nexus-avatar__icon--xl {
696
+ width: 2.5rem;
697
+ height: 2.5rem;
698
+ }
699
+ .nexus-avatar__img {
700
+ width: 100%;
701
+ height: 100%;
702
+ object-fit: cover;
703
+ }
704
+
705
+ /* ═══════════════════════════════════════════
706
+ Switch
707
+ ═══════════════════════════════════════════ */
708
+
709
+ .nexus-switch {
710
+ position: relative;
711
+ display: inline-flex;
712
+ flex-shrink: 0;
713
+ cursor: pointer;
714
+ border-radius: 9999px;
715
+ transition-property: background-color;
716
+ transition-duration: 200ms;
717
+ border: 2px solid transparent;
718
+ }
719
+ .nexus-switch:has(input:disabled) {
720
+ cursor: not-allowed;
721
+ opacity: 0.5;
722
+ }
723
+ .nexus-switch--sm {
724
+ height: 1.25rem;
725
+ width: 2.25rem;
726
+ }
727
+ .nexus-switch--md {
728
+ height: 1.5rem;
729
+ width: 2.75rem;
730
+ }
731
+ .nexus-switch--checked {
732
+ background: var(--color-accent-primary);
733
+ }
734
+ .nexus-switch--unchecked {
735
+ background: var(--color-border-default);
736
+ }
737
+ .nexus-switch__thumb {
738
+ pointer-events: none;
739
+ display: block;
740
+ border-radius: 9999px;
741
+ background: #fff;
742
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
743
+ transition-property: transform;
744
+ transition-duration: 200ms;
745
+ }
746
+ .nexus-switch__thumb--sm {
747
+ width: 1rem;
748
+ height: 1rem;
749
+ }
750
+ .nexus-switch__thumb--md {
751
+ width: 1.25rem;
752
+ height: 1.25rem;
753
+ }
754
+ .nexus-switch__thumb--sm-on {
755
+ transform: translateX(1rem);
756
+ }
757
+ .nexus-switch__thumb--md-on {
758
+ transform: translateX(1.25rem);
759
+ }
760
+ .nexus-switch__thumb--off {
761
+ transform: translateX(0);
762
+ }
763
+
764
+ /* ═══════════════════════════════════════════
765
+ CheckBox
766
+ ═══════════════════════════════════════════ */
767
+
768
+ .nexus-checkbox {
769
+ display: inline-flex;
770
+ align-items: center;
771
+ gap: var(--spacing-gap-sm, 0.5rem);
772
+ user-select: none;
773
+ }
774
+ .nexus-checkbox--sm {
775
+ font-size: var(--text-text-xs, 0.75rem);
776
+ }
777
+ .nexus-checkbox--md {
778
+ font-size: var(--text-text-sm, 0.875rem);
779
+ }
780
+ .nexus-checkbox--pointer {
781
+ cursor: pointer;
782
+ }
783
+ .nexus-checkbox--disabled {
784
+ cursor: not-allowed;
785
+ opacity: 0.5;
786
+ }
787
+ .nexus-checkbox__box {
788
+ display: inline-flex;
789
+ flex-shrink: 0;
790
+ align-items: center;
791
+ justify-content: center;
792
+ border: 1px solid var(--color-border-default);
793
+ transition-property: border-color, background-color;
794
+ transition-duration: 150ms;
795
+ }
796
+ .nexus-checkbox__box:has(~ .nexus-sr-only:disabled) {
797
+ opacity: 0.5;
798
+ cursor: not-allowed;
799
+ }
800
+ .nexus-checkbox__box--sm {
801
+ width: 1rem;
802
+ height: 1rem;
803
+ }
804
+ .nexus-checkbox__box--md {
805
+ width: 1.25rem;
806
+ height: 1.25rem;
807
+ }
808
+ .nexus-checkbox__box--square {
809
+ border-radius: var(--radius-corner-sm, 0.25rem);
810
+ }
811
+ .nexus-checkbox__box--round {
812
+ border-radius: 9999px;
813
+ }
814
+ .nexus-checkbox__box--checked {
815
+ border-color: var(--color-accent-primary);
816
+ background: var(--color-accent-primary);
817
+ color: #fff;
818
+ }
819
+ .nexus-checkbox__box--unchecked {
820
+ border-color: var(--color-border-default);
821
+ background: var(--color-surface-default);
822
+ }
823
+ .nexus-checkbox__icon--sm {
824
+ width: 0.75rem;
825
+ height: 0.75rem;
826
+ }
827
+ .nexus-checkbox__icon--md {
828
+ width: 0.875rem;
829
+ height: 0.875rem;
830
+ }
831
+ .nexus-checkbox__label {
832
+ color: var(--color-text-primary);
833
+ }
834
+
835
+ /* ═══════════════════════════════════════════
836
+ RadioGroup
837
+ ═══════════════════════════════════════════ */
838
+
839
+ .nexus-radio-group {
840
+ display: flex;
841
+ }
842
+ .nexus-radio-group--horizontal {
843
+ flex-direction: row;
844
+ gap: var(--spacing-gap-lg, 1rem);
845
+ }
846
+ .nexus-radio-group--vertical {
847
+ flex-direction: column;
848
+ gap: var(--spacing-gap-sm, 0.5rem);
849
+ }
850
+ .nexus-radio-item {
851
+ display: inline-flex;
852
+ align-items: center;
853
+ gap: var(--spacing-gap-sm, 0.5rem);
854
+ user-select: none;
855
+ }
856
+ .nexus-radio-item--sm {
857
+ font-size: var(--text-text-xs, 0.75rem);
858
+ }
859
+ .nexus-radio-item--md {
860
+ font-size: var(--text-text-sm, 0.875rem);
861
+ }
862
+ .nexus-radio-item--pointer {
863
+ cursor: pointer;
864
+ }
865
+ .nexus-radio-item--disabled {
866
+ cursor: not-allowed;
867
+ opacity: 0.5;
868
+ }
869
+ .nexus-radio__circle {
870
+ display: inline-flex;
871
+ flex-shrink: 0;
872
+ align-items: center;
873
+ justify-content: center;
874
+ border-radius: 9999px;
875
+ border: 1px solid var(--color-border-default);
876
+ transition-property: border-color;
877
+ transition-duration: 150ms;
878
+ }
879
+ .nexus-radio__circle:has(~ .nexus-sr-only:disabled) {
880
+ opacity: 0.5;
881
+ cursor: not-allowed;
882
+ }
883
+ .nexus-radio__circle--sm {
884
+ width: 1rem;
885
+ height: 1rem;
886
+ }
887
+ .nexus-radio__circle--md {
888
+ width: 1.25rem;
889
+ height: 1.25rem;
890
+ }
891
+ .nexus-radio__circle--checked {
892
+ border-color: var(--color-accent-primary);
893
+ color: var(--color-accent-primary);
894
+ }
895
+ .nexus-radio__circle--unchecked {
896
+ border-color: var(--color-border-default);
897
+ background: var(--color-surface-default);
898
+ }
899
+ .nexus-radio__dot {
900
+ border-radius: 9999px;
901
+ background: currentColor;
902
+ }
903
+ .nexus-radio__dot--sm {
904
+ width: 0.375rem;
905
+ height: 0.375rem;
906
+ }
907
+ .nexus-radio__dot--md {
908
+ width: 0.5rem;
909
+ height: 0.5rem;
910
+ }
911
+ .nexus-radio__label {
912
+ color: var(--color-text-primary);
913
+ }
914
+
915
+ /* ═══════════════════════════════════════════
916
+ Chip
917
+ ═══════════════════════════════════════════ */
918
+
919
+ .nexus-chip {
920
+ display: inline-flex;
921
+ align-items: center;
922
+ gap: 0.375rem;
923
+ white-space: nowrap;
924
+ font-weight: 500;
925
+ transition-property: color, background-color, border-color;
926
+ transition-duration: 150ms;
927
+ user-select: none;
928
+ border-radius: 9999px;
929
+ border: 1px solid transparent;
930
+ }
931
+ .nexus-chip[aria-disabled='true'] {
932
+ opacity: 0.5;
933
+ pointer-events: none;
934
+ }
935
+ .nexus-chip--default {
936
+ border-color: var(--color-border-default);
937
+ background: var(--color-surface-default);
938
+ color: var(--color-text-primary);
939
+ }
940
+ .nexus-chip--filled {
941
+ border-color: transparent;
942
+ background: var(--color-surface-hover);
943
+ color: var(--color-text-primary);
944
+ }
945
+ .nexus-chip--outline {
946
+ border-color: var(--color-border-default);
947
+ background: transparent;
948
+ color: var(--color-text-primary);
949
+ }
950
+ .nexus-chip--accent {
951
+ border-color: transparent;
952
+ background: color-mix(in srgb, var(--color-accent-primary) 10%, transparent);
953
+ color: var(--color-accent-primary);
954
+ }
955
+ .nexus-chip--sm {
956
+ height: 1.5rem;
957
+ padding-inline: var(--spacing-padding-xs, 0.5rem);
958
+ font-size: var(--text-text-xs, 0.75rem);
959
+ }
960
+ .nexus-chip--md {
961
+ height: 1.75rem;
962
+ padding-inline: 0.625rem;
963
+ font-size: var(--text-text-xs, 0.75rem);
964
+ }
965
+ .nexus-chip--lg {
966
+ height: 2rem;
967
+ padding-inline: var(--spacing-padding-sm, 0.75rem);
968
+ font-size: var(--text-text-sm, 0.875rem);
969
+ }
970
+ .nexus-chip__close {
971
+ display: inline-flex;
972
+ flex-shrink: 0;
973
+ align-items: center;
974
+ justify-content: center;
975
+ border-radius: 9999px;
976
+ padding: 0.125rem;
977
+ opacity: 0.6;
978
+ transition-property: opacity;
979
+ transition-duration: 150ms;
980
+ }
981
+ .nexus-chip__close:hover {
982
+ opacity: 1;
983
+ }
984
+ .nexus-chip__close-icon {
985
+ width: 0.75rem;
986
+ height: 0.75rem;
987
+ }
988
+
989
+ /* ═══════════════════════════════════════════
990
+ Pagination
991
+ ═══════════════════════════════════════════ */
992
+
993
+ .nexus-pagination {
994
+ display: flex;
995
+ align-items: center;
996
+ gap: var(--spacing-gap-xs, 0.25rem);
997
+ }
998
+ .nexus-pagination--sm {
999
+ font-size: var(--text-text-xs, 0.75rem);
1000
+ }
1001
+ .nexus-pagination--md {
1002
+ font-size: var(--text-text-sm, 0.875rem);
1003
+ }
1004
+ .nexus-page-btn {
1005
+ display: inline-flex;
1006
+ align-items: center;
1007
+ justify-content: center;
1008
+ border-radius: var(--radius-corner-md, 0.375rem);
1009
+ font-weight: 500;
1010
+ transition-property: color, background-color;
1011
+ transition-duration: 150ms;
1012
+ user-select: none;
1013
+ border: 1px solid transparent;
1014
+ }
1015
+ .nexus-page-btn:disabled {
1016
+ opacity: 0.4;
1017
+ pointer-events: none;
1018
+ }
1019
+ .nexus-page-btn--sm {
1020
+ width: 1.75rem;
1021
+ height: 1.75rem;
1022
+ font-size: var(--text-text-xs, 0.75rem);
1023
+ }
1024
+ .nexus-page-btn--md {
1025
+ width: 2.25rem;
1026
+ height: 2.25rem;
1027
+ font-size: var(--text-text-sm, 0.875rem);
1028
+ }
1029
+ .nexus-page-btn--active {
1030
+ background: var(--color-accent-primary);
1031
+ color: #fff;
1032
+ border-color: var(--color-accent-primary);
1033
+ }
1034
+ .nexus-page-btn--inactive {
1035
+ color: var(--color-text-primary);
1036
+ }
1037
+ .nexus-page-btn--inactive:hover {
1038
+ background: var(--color-surface-hover);
1039
+ }
1040
+ .nexus-page-icon--sm {
1041
+ width: 0.875rem;
1042
+ height: 0.875rem;
1043
+ }
1044
+ .nexus-page-icon--md {
1045
+ width: 1rem;
1046
+ height: 1rem;
1047
+ }
1048
+
1049
+ /* ═══════════════════════════════════════════
1050
+ Tab
1051
+ ═══════════════════════════════════════════ */
1052
+
1053
+ .nexus-tab-list {
1054
+ position: relative;
1055
+ display: flex;
1056
+ border-bottom: 1px solid var(--color-border-default);
1057
+ }
1058
+ .nexus-tab-list--pill {
1059
+ gap: var(--spacing-gap-xs, 0.25rem);
1060
+ border-bottom: none;
1061
+ background: var(--color-surface-hover);
1062
+ border-radius: var(--radius-corner-lg, 0.5rem);
1063
+ padding: 0.25rem;
1064
+ }
1065
+ .nexus-tab-trigger {
1066
+ position: relative;
1067
+ display: inline-flex;
1068
+ align-items: center;
1069
+ justify-content: center;
1070
+ white-space: nowrap;
1071
+ font-weight: 500;
1072
+ user-select: none;
1073
+ outline: none;
1074
+ transition-property: color, background-color, border-color;
1075
+ transition-duration: 150ms;
1076
+ }
1077
+ .nexus-tab-trigger--line {
1078
+ padding: 0.625rem var(--spacing-padding-md, 1rem);
1079
+ color: var(--color-text-tertiary);
1080
+ border-bottom: 2px solid transparent;
1081
+ margin-bottom: -1px;
1082
+ }
1083
+ .nexus-tab-trigger--line:hover {
1084
+ color: var(--color-text-primary);
1085
+ }
1086
+ .nexus-tab-trigger--line-active {
1087
+ color: var(--color-text-primary);
1088
+ border-bottom-color: var(--color-accent-primary);
1089
+ }
1090
+ .nexus-tab-trigger--pill {
1091
+ padding: 0.375rem var(--spacing-padding-sm, 0.75rem);
1092
+ border-radius: var(--radius-corner-md, 0.375rem);
1093
+ color: var(--color-text-tertiary);
1094
+ }
1095
+ .nexus-tab-trigger--pill:hover {
1096
+ color: var(--color-text-primary);
1097
+ }
1098
+ .nexus-tab-trigger--pill-active {
1099
+ color: var(--color-text-primary);
1100
+ background: var(--color-surface-default);
1101
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
1102
+ }
1103
+ .nexus-tab-trigger--sm {
1104
+ font-size: var(--text-text-xs, 0.75rem);
1105
+ }
1106
+ .nexus-tab-trigger--md {
1107
+ font-size: var(--text-text-sm, 0.875rem);
1108
+ }
1109
+ .nexus-tab-trigger--disabled {
1110
+ opacity: 0.4;
1111
+ pointer-events: none;
1112
+ }
1113
+
1114
+ /* ═══════════════════════════════════════════
1115
+ Skeleton
1116
+ ═══════════════════════════════════════════ */
1117
+
1118
+ .nexus-skeleton {
1119
+ position: relative;
1120
+ overflow: hidden;
1121
+ background: linear-gradient(
1122
+ to right,
1123
+ var(--color-surface-hover),
1124
+ var(--color-surface-default),
1125
+ var(--color-surface-hover)
1126
+ );
1127
+ background-size: 300% 100%;
1128
+ animation: nexus-skeleton-shimmer 2.5s ease-in-out infinite;
1129
+ }
1130
+ .nexus-skeleton--rect {
1131
+ border-radius: var(--radius-corner-md, 0.375rem);
1132
+ }
1133
+ .nexus-skeleton--circle {
1134
+ border-radius: 9999px;
1135
+ }
1136
+ .nexus-skeleton__children {
1137
+ opacity: 0;
1138
+ }
1139
+
1140
+ /* ═══════════════════════════════════════════
1141
+ Spinner
1142
+ ═══════════════════════════════════════════ */
1143
+
1144
+ .nexus-spinner {
1145
+ animation: nexus-spin 1s linear infinite;
1146
+ color: currentColor;
1147
+ }
1148
+
1149
+ /* ═══════════════════════════════════════════
1150
+ ErrorBoundary
1151
+ ═══════════════════════════════════════════ */
1152
+
1153
+ .nexus-error-boundary {
1154
+ padding: 1rem;
1155
+ border-radius: var(--radius-corner-lg, 0.5rem);
1156
+ border: 1px solid var(--color-status-danger, #ef4444);
1157
+ background: var(--color-bg-negative, #fef2f2);
1158
+ color: var(--color-text-negative, #991b1b);
1159
+ font-size: var(--text-text-sm, 0.875rem);
1160
+ }
1161
+ .nexus-error-boundary__title {
1162
+ margin: 0;
1163
+ font-weight: 600;
1164
+ }
1165
+ .nexus-error-boundary__message {
1166
+ margin: 0.5rem 0 0;
1167
+ opacity: 0.8;
1168
+ }
1169
+
1170
+ /* ═══════════════════════════════════════════
1171
+ Divider & Simple components
1172
+ ═══════════════════════════════════════════ */
1173
+
1174
+ .nexus-virtual-scroll {
1175
+ overflow: auto;
1176
+ }
1177
+ .nexus-modal-portal-target {
1178
+ position: absolute;
1179
+ z-index: 9999;
1180
+ }
1181
+
1182
+ /* ═══════════════════════════════════════════
1183
+ DataList
1184
+ ═══════════════════════════════════════════ */
1185
+
1186
+ .nexus-datalist-center {
1187
+ display: flex;
1188
+ align-items: center;
1189
+ justify-content: center;
1190
+ padding-block: var(--spacing-padding-xl, 2rem);
1191
+ }
1192
+ .nexus-datalist-empty {
1193
+ display: flex;
1194
+ align-items: center;
1195
+ justify-content: center;
1196
+ padding-block: var(--spacing-padding-xl, 2rem);
1197
+ font-size: var(--text-text-sm, 0.875rem);
1198
+ color: var(--color-text-tertiary);
1199
+ }
1200
+
1201
+ /* ═══════════════════════════════════════════
1202
+ InfiniteScroll
1203
+ ═══════════════════════════════════════════ */
1204
+
1205
+ .nexus-infinite-scroll {
1206
+ position: relative;
1207
+ }
1208
+ .nexus-infinite-sentinel {
1209
+ position: relative;
1210
+ height: 1px;
1211
+ width: 100%;
1212
+ }
1213
+ .nexus-infinite-spinner {
1214
+ display: flex;
1215
+ align-items: center;
1216
+ justify-content: center;
1217
+ padding-block: var(--spacing-padding-md, 1rem);
1218
+ }
1219
+ .nexus-infinite-spinner-icon {
1220
+ width: 1.5rem;
1221
+ height: 1.5rem;
1222
+ animation: nexus-spin 1s linear infinite;
1223
+ border-radius: 9999px;
1224
+ border: 2px solid var(--color-border-default);
1225
+ border-top-color: var(--color-accent-primary);
1226
+ }
1227
+
1228
+ /* ═══════════════════════════════════════════
1229
+ Countdown
1230
+ ═══════════════════════════════════════════ */
1231
+
1232
+ .nexus-countdown {
1233
+ display: inline-flex;
1234
+ align-items: center;
1235
+ gap: var(--spacing-gap-xs, 0.25rem);
1236
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1237
+ font-variant-numeric: tabular-nums;
1238
+ }
1239
+ .nexus-countdown__separator {
1240
+ color: var(--color-text-tertiary);
1241
+ margin-inline: 0.125rem;
1242
+ }
1243
+ .nexus-countdown__label {
1244
+ color: var(--color-text-tertiary);
1245
+ font-size: var(--text-text-xs, 0.75rem);
1246
+ margin-left: 0.125rem;
1247
+ }
1248
+
1249
+ /* ═══════════════════════════════════════════
1250
+ Select
1251
+ ═══════════════════════════════════════════ */
1252
+
1253
+ .nexus-select-trigger {
1254
+ position: relative;
1255
+ display: flex;
1256
+ height: 2.5rem;
1257
+ align-items: center;
1258
+ justify-content: space-between;
1259
+ border-radius: var(--radius-corner-sm, 0.25rem);
1260
+ border: 1px solid var(--color-border-default);
1261
+ color: var(--color-text-primary);
1262
+ font-size: var(--text-text-sm, 0.875rem);
1263
+ transition-property: border-color;
1264
+ transition-duration: 200ms;
1265
+ }
1266
+ .nexus-select-trigger:hover {
1267
+ border-color: var(--color-border-strong);
1268
+ }
1269
+ .nexus-select-trigger:has(:disabled) {
1270
+ cursor: not-allowed;
1271
+ opacity: 0.5;
1272
+ }
1273
+ .nexus-select-trigger::placeholder {
1274
+ color: var(--color-text-tertiary);
1275
+ }
1276
+ .nexus-select-trigger--default {
1277
+ background: var(--color-surface-hover);
1278
+ }
1279
+ .nexus-select-trigger--outline {
1280
+ background: var(--color-surface-default);
1281
+ }
1282
+ .nexus-select-trigger--sm {
1283
+ width: 4rem;
1284
+ }
1285
+ .nexus-select-trigger--md {
1286
+ width: 8rem;
1287
+ }
1288
+ .nexus-select-trigger--lg {
1289
+ width: 12rem;
1290
+ }
1291
+ .nexus-select-trigger--full {
1292
+ width: 100%;
1293
+ }
1294
+ .nexus-select-trigger--justify-end {
1295
+ justify-content: flex-end;
1296
+ }
1297
+ .nexus-select-trigger__display {
1298
+ position: absolute;
1299
+ top: 0;
1300
+ left: 0;
1301
+ display: flex;
1302
+ height: 100%;
1303
+ width: calc(100% - 30px);
1304
+ align-items: center;
1305
+ }
1306
+ .nexus-select-trigger__inner {
1307
+ display: flex;
1308
+ height: 100%;
1309
+ width: 100%;
1310
+ flex-direction: row-reverse;
1311
+ align-items: center;
1312
+ justify-content: space-between;
1313
+ border-radius: var(--radius-corner-sm, 0.25rem);
1314
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
1315
+ }
1316
+ .nexus-select-trigger__inner:focus {
1317
+ outline: none;
1318
+ }
1319
+ .nexus-select-chevron {
1320
+ width: 0.75rem;
1321
+ height: 0.75rem;
1322
+ opacity: 0.5;
1323
+ transition: transform 200ms;
1324
+ }
1325
+ .nexus-select-chevron--open {
1326
+ transform: rotate(180deg);
1327
+ }
1328
+
1329
+ .nexus-select-content {
1330
+ position: relative;
1331
+ z-index: 50;
1332
+ max-height: 24rem;
1333
+ overflow: hidden;
1334
+ border-radius: var(--radius-corner-sm, 0.25rem);
1335
+ border: 1px solid var(--color-border-default);
1336
+ background: var(--color-surface-default);
1337
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
1338
+ transform-origin: top center;
1339
+ will-change: transform, opacity;
1340
+ }
1341
+ .nexus-select-content[data-state='open'] {
1342
+ animation: nexus-select-slide-in 150ms ease-out;
1343
+ }
1344
+ .nexus-select-content[data-state='closed'] {
1345
+ animation: nexus-select-slide-out 100ms ease-in forwards;
1346
+ }
1347
+ @keyframes nexus-select-slide-in {
1348
+ from { opacity: 0; transform: translateY(-4px) scaleY(0.96); }
1349
+ to { opacity: 1; transform: translateY(0) scaleY(1); }
1350
+ }
1351
+ @keyframes nexus-select-slide-out {
1352
+ from { opacity: 1; transform: translateY(0) scaleY(1); }
1353
+ to { opacity: 0; transform: translateY(-4px) scaleY(0.96); }
1354
+ }
1355
+ .nexus-select-content--sm {
1356
+ width: 4rem;
1357
+ }
1358
+ .nexus-select-content--md {
1359
+ width: 8rem;
1360
+ }
1361
+ .nexus-select-content--lg {
1362
+ width: 12rem;
1363
+ }
1364
+ .nexus-select-content--full {
1365
+ width: var(--radix-popper-anchor-width);
1366
+ }
1367
+ .nexus-select-viewport {
1368
+ padding: 0.25rem;
1369
+ }
1370
+
1371
+ .nexus-select-item {
1372
+ position: relative;
1373
+ display: flex;
1374
+ width: 100%;
1375
+ cursor: pointer;
1376
+ align-items: center;
1377
+ border-radius: var(--radius-corner-sm, 0.25rem);
1378
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
1379
+ color: var(--color-text-primary);
1380
+ font-size: var(--text-text-sm, 0.875rem);
1381
+ transition-property: background-color;
1382
+ transition-duration: 150ms;
1383
+ outline: none;
1384
+ user-select: none;
1385
+ }
1386
+ .nexus-select-item:hover,
1387
+ .nexus-select-item:focus,
1388
+ .nexus-select-item[data-highlighted] {
1389
+ background: var(--color-surface-hover);
1390
+ }
1391
+ .nexus-select-item[data-disabled] {
1392
+ pointer-events: none;
1393
+ opacity: 0.5;
1394
+ }
1395
+
1396
+ /* ═══════════════════════════════════════════
1397
+ Tooltip
1398
+ ═══════════════════════════════════════════ */
1399
+
1400
+ .nexus-tooltip-content {
1401
+ z-index: 50;
1402
+ display: flex;
1403
+ overflow: hidden;
1404
+ border-radius: var(--radius-corner-md, 0.375rem);
1405
+ padding: var(--spacing-padding-xs, 0.5rem) var(--spacing-padding-sm, 0.75rem);
1406
+ font-size: var(--text-text-sm, 0.875rem);
1407
+ }
1408
+ .nexus-tooltip--light {
1409
+ border: 1px solid var(--color-border-default);
1410
+ background: var(--color-static-white);
1411
+ color: var(--color-static-black);
1412
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
1413
+ }
1414
+ .nexus-tooltip--dark {
1415
+ border: none;
1416
+ background: var(--color-static-black);
1417
+ color: var(--color-static-white);
1418
+ }
1419
+ .nexus-tooltip-arrow--dark {
1420
+ fill: var(--color-static-black);
1421
+ }
1422
+ .nexus-tooltip-arrow--light {
1423
+ fill: var(--color-static-white);
1424
+ }
1425
+ .nexus-tooltip-trigger {
1426
+ cursor: default;
1427
+ }
1428
+
1429
+ /* ═══════════════════════════════════════════
1430
+ Popover
1431
+ ═══════════════════════════════════════════ */
1432
+
1433
+ .nexus-popover-content {
1434
+ z-index: 50;
1435
+ border-radius: var(--radius-corner-lg, 0.5rem);
1436
+ border: 1px solid var(--color-border-default);
1437
+ padding: var(--spacing-padding-md, 1rem);
1438
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
1439
+ outline: none;
1440
+ background: var(--color-surface-default);
1441
+ color: var(--color-text-primary);
1442
+ transform-origin: var(--radix-popover-content-transform-origin);
1443
+ will-change: transform, opacity;
1444
+ }
1445
+ .nexus-popover-content[data-state='open'] {
1446
+ animation: nexus-popover-in 150ms ease-out;
1447
+ }
1448
+ .nexus-popover-content[data-state='closed'] {
1449
+ animation: nexus-popover-out 100ms ease-in forwards;
1450
+ }
1451
+ @keyframes nexus-popover-in {
1452
+ from { opacity: 0; transform: scale(0.95); }
1453
+ to { opacity: 1; transform: scale(1); }
1454
+ }
1455
+ @keyframes nexus-popover-out {
1456
+ from { opacity: 1; transform: scale(1); }
1457
+ to { opacity: 0; transform: scale(0.95); }
1458
+ }
1459
+ .nexus-popover-arrow {
1460
+ fill: var(--color-surface-default);
1461
+ }
1462
+
1463
+ /* ═══════════════════════════════════════════
1464
+ Drawer
1465
+ ═══════════════════════════════════════════ */
1466
+
1467
+ .nexus-drawer-overlay {
1468
+ position: fixed;
1469
+ inset: 0;
1470
+ z-index: 50;
1471
+ background: rgba(0, 0, 0, 0.6);
1472
+ }
1473
+ .nexus-drawer-overlay--blur-sm {
1474
+ backdrop-filter: blur(4px);
1475
+ }
1476
+ .nexus-drawer-overlay--blur-md {
1477
+ backdrop-filter: blur(12px);
1478
+ }
1479
+ .nexus-drawer-content {
1480
+ position: fixed;
1481
+ z-index: 50;
1482
+ display: flex;
1483
+ flex-direction: column;
1484
+ background: var(--color-surface-default);
1485
+ }
1486
+ .nexus-drawer-content--bottom {
1487
+ inset-inline: 0;
1488
+ bottom: 0;
1489
+ margin-top: 6rem;
1490
+ border-top-left-radius: 1rem;
1491
+ border-top-right-radius: 1rem;
1492
+ border-top: 1px solid var(--color-border-default);
1493
+ }
1494
+ .nexus-drawer-content--top {
1495
+ inset-inline: 0;
1496
+ top: 0;
1497
+ margin-bottom: 6rem;
1498
+ border-bottom-left-radius: 1rem;
1499
+ border-bottom-right-radius: 1rem;
1500
+ border-bottom: 1px solid var(--color-border-default);
1501
+ }
1502
+ .nexus-drawer-content--left {
1503
+ inset-block: 0;
1504
+ left: 0;
1505
+ margin-right: 6rem;
1506
+ width: 85vw;
1507
+ max-width: 24rem;
1508
+ border-top-right-radius: 1rem;
1509
+ border-bottom-right-radius: 1rem;
1510
+ border-right: 1px solid var(--color-border-default);
1511
+ }
1512
+ .nexus-drawer-content--right {
1513
+ inset-block: 0;
1514
+ right: 0;
1515
+ margin-left: 6rem;
1516
+ width: 85vw;
1517
+ max-width: 24rem;
1518
+ border-top-left-radius: 1rem;
1519
+ border-bottom-left-radius: 1rem;
1520
+ border-left: 1px solid var(--color-border-default);
1521
+ }
1522
+ .nexus-drawer-handle {
1523
+ display: flex;
1524
+ justify-content: center;
1525
+ }
1526
+ .nexus-drawer-handle--bottom {
1527
+ padding-top: var(--spacing-padding-md, 1rem);
1528
+ }
1529
+ .nexus-drawer-handle--top {
1530
+ padding-bottom: var(--spacing-padding-md, 1rem);
1531
+ }
1532
+ .nexus-drawer-handle__bar {
1533
+ background: var(--color-border-strong);
1534
+ height: 0.375rem;
1535
+ width: 3rem;
1536
+ border-radius: 9999px;
1537
+ }
1538
+ .nexus-drawer-title {
1539
+ font-size: var(--text-text-lg, 1.125rem);
1540
+ font-weight: 600;
1541
+ color: var(--color-text-primary);
1542
+ }
1543
+ .nexus-drawer-description {
1544
+ font-size: var(--text-text-sm, 0.875rem);
1545
+ color: var(--color-text-secondary);
1546
+ }
1547
+
1548
+ /* ═══════════════════════════════════════════
1549
+ Accordion
1550
+ ═══════════════════════════════════════════ */
1551
+
1552
+ .nexus-accordion-item {
1553
+ border-bottom: 1px solid var(--color-border-default);
1554
+ }
1555
+ .nexus-accordion-header {
1556
+ display: flex;
1557
+ }
1558
+ .nexus-accordion-trigger {
1559
+ display: flex;
1560
+ flex: 1;
1561
+ align-items: center;
1562
+ justify-content: space-between;
1563
+ padding-block: var(--spacing-padding-md, 1rem);
1564
+ transition: all 150ms;
1565
+ }
1566
+ .nexus-accordion-trigger[data-state='open'] > .nexus-accordion-chevron {
1567
+ transform: rotate(180deg);
1568
+ }
1569
+ .nexus-accordion-chevron {
1570
+ width: 0.75rem;
1571
+ height: 0.75rem;
1572
+ flex-shrink: 0;
1573
+ transition: transform 200ms;
1574
+ }
1575
+ .nexus-accordion-content {
1576
+ overflow: hidden;
1577
+ transition: all 200ms;
1578
+ }
1579
+ .nexus-accordion-content[data-state='open'] {
1580
+ animation: nexus-accordion-down 200ms ease-out;
1581
+ }
1582
+ .nexus-accordion-content[data-state='closed'] {
1583
+ animation: nexus-accordion-up 200ms ease-in;
1584
+ }
1585
+ .nexus-accordion-content__inner {
1586
+ padding-top: 0;
1587
+ padding-bottom: var(--spacing-padding-md, 1rem);
1588
+ }
1589
+
1590
+ /* ═══════════════════════════════════════════
1591
+ Ellipsis
1592
+ ═══════════════════════════════════════════ */
1593
+
1594
+ .nexus-ellipsis {
1595
+ position: relative;
1596
+ }
1597
+ .nexus-ellipsis__content {
1598
+ overflow: hidden;
1599
+ transition: height 300ms;
1600
+ }
1601
+ .nexus-ellipsis__trigger {
1602
+ margin-top: 0.25rem;
1603
+ display: flex;
1604
+ align-items: center;
1605
+ gap: var(--spacing-gap-xs, 0.25rem);
1606
+ font-size: var(--text-text-sm, 0.875rem);
1607
+ color: var(--color-text-secondary);
1608
+ transition-property: color;
1609
+ transition-duration: 150ms;
1610
+ }
1611
+ .nexus-ellipsis__trigger:hover {
1612
+ color: var(--color-text-primary);
1613
+ }
1614
+ .nexus-ellipsis__trigger--expanded > svg {
1615
+ transform: rotate(180deg);
1616
+ }
1617
+ .nexus-ellipsis__chevron {
1618
+ width: 0.875rem;
1619
+ height: 0.875rem;
1620
+ transition: transform 200ms;
1621
+ }
1622
+
1623
+ /* ═══════════════════════════════════════════
1624
+ Marquee
1625
+ ═══════════════════════════════════════════ */
1626
+
1627
+ .nexus-marquee {
1628
+ overflow: hidden;
1629
+ }
1630
+ .nexus-marquee--pause-on-hover:hover > div {
1631
+ animation-play-state: paused !important;
1632
+ }
1633
+
1634
+ /* ═══════════════════════════════════════════
1635
+ Carousel
1636
+ ═══════════════════════════════════════════ */
1637
+
1638
+ .nexus-carousel {
1639
+ position: relative;
1640
+ }
1641
+ .nexus-carousel__viewport {
1642
+ overflow: hidden;
1643
+ }
1644
+ .nexus-carousel__container {
1645
+ display: flex;
1646
+ }
1647
+ .nexus-carousel-slide {
1648
+ min-width: 0;
1649
+ flex-shrink: 0;
1650
+ flex-grow: 0;
1651
+ flex-basis: 100%;
1652
+ }
1653
+ .nexus-carousel-btn {
1654
+ position: absolute;
1655
+ top: 50%;
1656
+ transform: translateY(-50%);
1657
+ z-index: 10;
1658
+ width: 2rem;
1659
+ height: 2rem;
1660
+ display: inline-flex;
1661
+ align-items: center;
1662
+ justify-content: center;
1663
+ border-radius: 9999px;
1664
+ background: var(--color-surface-default);
1665
+ border: 1px solid var(--color-border-default);
1666
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
1667
+ color: var(--color-text-primary);
1668
+ transition-property: background-color;
1669
+ transition-duration: 150ms;
1670
+ }
1671
+ .nexus-carousel-btn:hover {
1672
+ background: var(--color-surface-hover);
1673
+ }
1674
+ .nexus-carousel-btn:disabled {
1675
+ opacity: 0.4;
1676
+ pointer-events: none;
1677
+ }
1678
+ .nexus-carousel-btn--prev {
1679
+ left: 0.5rem;
1680
+ }
1681
+ .nexus-carousel-btn--next {
1682
+ right: 0.5rem;
1683
+ }
1684
+ .nexus-carousel-btn__icon {
1685
+ width: 1rem;
1686
+ height: 1rem;
1687
+ }
1688
+ .nexus-carousel-dots {
1689
+ display: flex;
1690
+ justify-content: center;
1691
+ gap: 0.375rem;
1692
+ margin-top: var(--spacing-padding-sm, 0.75rem);
1693
+ }
1694
+ .nexus-carousel-dot {
1695
+ width: 0.5rem;
1696
+ height: 0.5rem;
1697
+ border-radius: 9999px;
1698
+ transition-property: background-color;
1699
+ transition-duration: 150ms;
1700
+ }
1701
+ .nexus-carousel-dot--active {
1702
+ background: var(--color-accent-primary);
1703
+ }
1704
+ .nexus-carousel-dot--inactive {
1705
+ background: var(--color-border-default);
1706
+ }
1707
+ .nexus-carousel-dot--inactive:hover {
1708
+ background: var(--color-text-tertiary);
1709
+ }
1710
+
1711
+ /* ═══════════════════════════════════════════
1712
+ Toast
1713
+ ═══════════════════════════════════════════ */
1714
+
1715
+ .nexus-toast {
1716
+ display: flex;
1717
+ align-items: center;
1718
+ gap: var(--spacing-gap-sm, 0.75rem);
1719
+ border-radius: var(--radius-corner-lg, 0.5rem);
1720
+ border: 1px solid var(--color-border-default);
1721
+ padding: var(--spacing-padding-sm, 0.75rem) var(--spacing-padding-md, 1rem);
1722
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
1723
+ background: var(--color-surface-default);
1724
+ color: var(--color-text-primary);
1725
+ }
1726
+ .nexus-toast__title {
1727
+ font-size: var(--text-text-sm, 0.875rem);
1728
+ font-weight: 500;
1729
+ }
1730
+ .nexus-toast__desc {
1731
+ font-size: var(--text-text-xs, 0.75rem);
1732
+ color: var(--color-text-secondary);
1733
+ }
1734
+ .nexus-toast--success {
1735
+ border-color: color-mix(
1736
+ in srgb,
1737
+ var(--color-status-positive) 30%,
1738
+ transparent
1739
+ );
1740
+ background: color-mix(in srgb, var(--color-status-positive) 10%, transparent);
1741
+ color: var(--color-status-positive);
1742
+ }
1743
+ .nexus-toast--error {
1744
+ border-color: color-mix(
1745
+ in srgb,
1746
+ var(--color-status-danger) 30%,
1747
+ transparent
1748
+ );
1749
+ background: color-mix(in srgb, var(--color-status-danger) 10%, transparent);
1750
+ color: var(--color-status-danger);
1751
+ }
1752
+ .nexus-toast--warning {
1753
+ border-color: color-mix(
1754
+ in srgb,
1755
+ var(--color-status-caution) 30%,
1756
+ transparent
1757
+ );
1758
+ background: color-mix(in srgb, var(--color-status-caution) 10%, transparent);
1759
+ color: var(--color-status-caution);
1760
+ }
1761
+ .nexus-toast--info {
1762
+ border-color: color-mix(
1763
+ in srgb,
1764
+ var(--color-accent-primary) 30%,
1765
+ transparent
1766
+ );
1767
+ background: color-mix(in srgb, var(--color-accent-primary) 10%, transparent);
1768
+ color: var(--color-accent-primary);
1769
+ }
1770
+ .nexus-toast__action-btn {
1771
+ background: var(--color-accent-primary);
1772
+ color: var(--color-accent-on-primary);
1773
+ border-radius: var(--radius-corner-sm, 0.25rem);
1774
+ padding: 0.375rem var(--spacing-padding-sm, 0.75rem);
1775
+ font-size: var(--text-text-xs, 0.75rem);
1776
+ font-weight: 500;
1777
+ }
1778
+ .nexus-toast__cancel-btn {
1779
+ background: var(--color-surface-hover);
1780
+ color: var(--color-text-secondary);
1781
+ border-radius: var(--radius-corner-sm, 0.25rem);
1782
+ padding: 0.375rem var(--spacing-padding-sm, 0.75rem);
1783
+ font-size: var(--text-text-xs, 0.75rem);
1784
+ font-weight: 500;
1785
+ }
1786
+ .nexus-toast__close-btn {
1787
+ color: var(--color-text-tertiary);
1788
+ }
1789
+ .nexus-toast__close-btn:hover {
1790
+ color: var(--color-text-primary);
1791
+ }
1792
+
1793
+ /* ═══════════════════════════════════════════
1794
+ Table
1795
+ ═══════════════════════════════════════════ */
1796
+
1797
+ .nexus-table-wrap {
1798
+ overflow-x: auto;
1799
+ }
1800
+ .nexus-table {
1801
+ width: 100%;
1802
+ }
1803
+ .nexus-table-thead {
1804
+ display: flex;
1805
+ background: var(--color-surface-default);
1806
+ }
1807
+ .nexus-table-th {
1808
+ display: flex;
1809
+ }
1810
+ .nexus-table-th--sortable {
1811
+ cursor: pointer;
1812
+ }
1813
+ .nexus-table-th__sort-btn {
1814
+ display: inline-flex;
1815
+ align-items: center;
1816
+ gap: var(--spacing-gap-xs, 0.25rem);
1817
+ background: none;
1818
+ border: none;
1819
+ padding: 0;
1820
+ margin: 0;
1821
+ font: inherit;
1822
+ color: inherit;
1823
+ cursor: pointer;
1824
+ text-align: inherit;
1825
+ width: 100%;
1826
+ }
1827
+ .nexus-table-sort-icon {
1828
+ width: 1rem;
1829
+ height: 1rem;
1830
+ }
1831
+ .nexus-table-center {
1832
+ display: flex;
1833
+ align-items: center;
1834
+ justify-content: center;
1835
+ padding-block: 3rem;
1836
+ }
1837
+ .nexus-table-nodata {
1838
+ color: var(--color-text-tertiary);
1839
+ }
1840
+ .nexus-table-loading-icon {
1841
+ width: 2rem;
1842
+ height: 2rem;
1843
+ animation: nexus-spin 1s linear infinite;
1844
+ border-radius: 9999px;
1845
+ border: 2px solid var(--color-border-default);
1846
+ border-top-color: var(--color-accent-primary);
1847
+ }
1848
+ .nexus-table-skeleton-row {
1849
+ display: flex;
1850
+ cursor: default;
1851
+ }
1852
+ .nexus-table-skeleton-td {
1853
+ height: 100%;
1854
+ width: 100%;
1855
+ padding-block: var(--spacing-padding-md, 1rem);
1856
+ }
1857
+ .nexus-table-skeleton-bar {
1858
+ height: 1rem;
1859
+ width: 100%;
1860
+ }
1861
+
1862
+ /* TableRow */
1863
+ .nexus-table-row {
1864
+ border-bottom: 1px solid var(--color-border-default);
1865
+ display: flex;
1866
+ min-width: 0;
1867
+ }
1868
+ .nexus-table-row::-webkit-scrollbar {
1869
+ display: none;
1870
+ }
1871
+ .nexus-table-row--default:hover {
1872
+ background: var(--color-surface-hover);
1873
+ }
1874
+ .nexus-table-row--accent:hover {
1875
+ background: color-mix(in srgb, var(--color-accent-primary) 5%, transparent);
1876
+ }
1877
+
1878
+ /* TdColumn */
1879
+ .nexus-td {
1880
+ min-width: 0;
1881
+ width: 100%;
1882
+ }
1883
+ .nexus-td__inner {
1884
+ border-radius: var(--radius-corner-md, 0.375rem);
1885
+ padding: 2px 0.25rem;
1886
+ transition-property: background-color;
1887
+ transition-duration: 150ms;
1888
+ }
1889
+ .nexus-td__inner--flex {
1890
+ display: flex;
1891
+ }
1892
+ .nexus-td__inner--highlight {
1893
+ background: color-mix(in srgb, var(--color-accent-primary) 10%, transparent);
1894
+ outline: 1px dashed var(--color-accent-primary);
1895
+ outline-offset: -1px;
1896
+ }
1897
+ .nexus-td--nowrap {
1898
+ white-space: nowrap;
1899
+ }
1900
+ .nexus-td--truncate {
1901
+ overflow: hidden;
1902
+ text-overflow: ellipsis;
1903
+ white-space: nowrap;
1904
+ }
1905
+ .nexus-td--wrap {
1906
+ white-space: normal;
1907
+ overflow-wrap: break-word;
1908
+ }
1909
+ .nexus-td--break-all {
1910
+ white-space: normal;
1911
+ word-break: break-all;
1912
+ }
1913
+ .nexus-td--center {
1914
+ text-align: center;
1915
+ justify-content: center;
1916
+ }
1917
+ .nexus-td--left {
1918
+ text-align: left;
1919
+ justify-content: flex-start;
1920
+ }
1921
+ .nexus-td--right {
1922
+ text-align: right;
1923
+ justify-content: flex-end;
1924
+ }
1925
+
1926
+ /* ═══════════════════════════════════════════
1927
+ Modal
1928
+ ═══════════════════════════════════════════ */
1929
+
1930
+ .nexus-modal-wrap {
1931
+ pointer-events: none;
1932
+ position: fixed;
1933
+ inset: 0;
1934
+ z-index: 99999;
1935
+ display: flex;
1936
+ height: 100%;
1937
+ align-items: center;
1938
+ justify-content: center;
1939
+ color: var(--color-text-primary);
1940
+ }
1941
+ .nexus-modal-wrap--bottom-sheet {
1942
+ align-items: flex-end;
1943
+ }
1944
+ .nexus-modal-wrap--slide-left {
1945
+ height: 100%;
1946
+ justify-content: flex-start;
1947
+ }
1948
+ .nexus-modal-wrap--slide-right {
1949
+ height: 100%;
1950
+ justify-content: flex-end;
1951
+ }
1952
+ .nexus-modal-wrap--full-page,
1953
+ .nexus-modal-wrap--full-page-reverse {
1954
+ height: 100%;
1955
+ justify-content: flex-start;
1956
+ }
1957
+
1958
+ .nexus-modal-inner {
1959
+ position: relative;
1960
+ z-index: 2;
1961
+ overflow: hidden;
1962
+ pointer-events: auto;
1963
+ border-radius: var(--radius-corner-lg, 12px);
1964
+ border: 1px solid var(--color-border-default);
1965
+ background: var(--color-surface-default);
1966
+ color: var(--color-text-primary);
1967
+ }
1968
+ :where(.nexus-modal-inner) {
1969
+ width: 100%;
1970
+ min-height: 200px;
1971
+ }
1972
+ .nexus-modal-inner > div {
1973
+ display: contents;
1974
+ }
1975
+ @media (min-width: 640px) {
1976
+ :where(.nexus-modal-inner) {
1977
+ width: 480px;
1978
+ min-height: auto;
1979
+ }
1980
+ }
1981
+ .nexus-modal-inner--bottom-sheet {
1982
+ margin: 0;
1983
+ width: 100%;
1984
+ border-top-left-radius: 1rem;
1985
+ border-top-right-radius: 1rem;
1986
+ border-bottom-left-radius: 0;
1987
+ border-bottom-right-radius: 0;
1988
+ border-top: 1px solid var(--color-border-default);
1989
+ padding: 1.5rem 1rem 0;
1990
+ }
1991
+ .nexus-modal-inner--slide-left,
1992
+ .nexus-modal-inner--slide-right {
1993
+ height: 100%;
1994
+ border-radius: 0;
1995
+ }
1996
+ .nexus-modal-inner--full-page,
1997
+ .nexus-modal-inner--full-page-reverse {
1998
+ height: 100%;
1999
+ width: 100%;
2000
+ border-radius: 0;
2001
+ border-color: transparent;
2002
+ }
2003
+ @media (min-width: 640px) {
2004
+ .nexus-modal-inner--full-page,
2005
+ .nexus-modal-inner--full-page-reverse {
2006
+ width: 100%;
2007
+ }
2008
+ }
2009
+ .nexus-modal-inner--draggable {
2010
+ min-width: 320px;
2011
+ overflow: visible;
2012
+ }
2013
+ .nexus-modal-inner--has-footer {
2014
+ padding-bottom: 88px;
2015
+ }
2016
+ .nexus-modal-inner--bottom-sheet.nexus-modal-inner--has-footer {
2017
+ padding-bottom: 5rem;
2018
+ }
2019
+
2020
+ .nexus-modal-header {
2021
+ position: relative;
2022
+ padding: 1.5rem 1.25rem 0;
2023
+ }
2024
+ .nexus-modal-header--bottom-sheet {
2025
+ padding: 0;
2026
+ }
2027
+ .nexus-modal-header--draggable {
2028
+ cursor: grab;
2029
+ user-select: none;
2030
+ }
2031
+ .nexus-modal-header--draggable:active {
2032
+ cursor: grabbing;
2033
+ }
2034
+
2035
+ .nexus-modal-close-btn {
2036
+ position: absolute;
2037
+ top: 1.5rem;
2038
+ right: 1.25rem;
2039
+ z-index: 1;
2040
+ margin-left: auto;
2041
+ display: flex;
2042
+ cursor: pointer;
2043
+ align-items: center;
2044
+ justify-content: flex-end;
2045
+ }
2046
+ .nexus-modal-close-btn--bottom-sheet {
2047
+ position: relative;
2048
+ top: 0;
2049
+ right: 0;
2050
+ }
2051
+ .nexus-modal-close-icon {
2052
+ width: 1.25rem;
2053
+ height: 1.25rem;
2054
+ color: var(--color-text-muted);
2055
+ }
2056
+
2057
+ .nexus-modal-title {
2058
+ margin: 0;
2059
+ padding-right: 42px;
2060
+ font-size: var(--text-text-lg, 1.125rem);
2061
+ font-weight: 600;
2062
+ line-height: 26px;
2063
+ letter-spacing: -0.002em;
2064
+ color: var(--color-text-primary);
2065
+ }
2066
+ .nexus-modal-title--bottom-sheet {
2067
+ padding-top: 0.375rem;
2068
+ line-height: 1.75rem;
2069
+ letter-spacing: -0.012em;
2070
+ }
2071
+ .nexus-modal-desc {
2072
+ color: var(--color-text-muted);
2073
+ font-size: var(--text-text-xs, 0.75rem);
2074
+ margin-top: 0.25rem;
2075
+ }
2076
+
2077
+ .nexus-modal-body {
2078
+ position: relative;
2079
+ overflow-y: auto;
2080
+ padding: 1.5rem 1.25rem 0;
2081
+ }
2082
+ .nexus-modal-body::-webkit-scrollbar {
2083
+ display: none;
2084
+ }
2085
+ .nexus-modal-body--no-footer {
2086
+ padding-bottom: 1.5rem;
2087
+ }
2088
+ .nexus-modal-body--bottom-sheet {
2089
+ margin-top: 1.5rem;
2090
+ max-height: calc(100vh - 108px);
2091
+ padding: 0 0 1.5rem;
2092
+ }
2093
+ .nexus-modal-body--slide,
2094
+ .nexus-modal-body--full-page {
2095
+ height: 100%;
2096
+ max-height: 100%;
2097
+ overflow-y: auto;
2098
+ }
2099
+ .nexus-modal-body--full-page {
2100
+ padding-bottom: 0;
2101
+ }
2102
+
2103
+ .nexus-modal-footer {
2104
+ position: absolute;
2105
+ bottom: 0;
2106
+ left: 0;
2107
+ z-index: 2;
2108
+ display: flex;
2109
+ width: 100%;
2110
+ padding: 1.5rem 1.25rem 1.25rem;
2111
+ }
2112
+ .nexus-modal-footer button {
2113
+ height: 3rem;
2114
+ flex: 1;
2115
+ }
2116
+ .nexus-modal-footer--bottom-sheet {
2117
+ padding: 0.75rem 1rem 1.5rem;
2118
+ }
2119
+ .nexus-modal-footer--draggable {
2120
+ position: relative;
2121
+ }
2122
+
2123
+ .nexus-modal-dim {
2124
+ pointer-events: auto;
2125
+ position: fixed;
2126
+ inset: 0;
2127
+ z-index: 1;
2128
+ display: block;
2129
+ height: 100vh;
2130
+ width: 100vw;
2131
+ background: color-mix(
2132
+ in srgb,
2133
+ var(--color-static-black, #000) 75%,
2134
+ transparent
2135
+ );
2136
+ }
2137
+ .nexus-modal-dim--hidden {
2138
+ display: none;
2139
+ }
2140
+ .nexus-modal-dim--draggable {
2141
+ background: color-mix(
2142
+ in srgb,
2143
+ var(--color-static-black, #000) 30%,
2144
+ transparent
2145
+ );
2146
+ }
2147
+
2148
+ .nexus-modal-bottom-sheet-handle {
2149
+ display: flex;
2150
+ width: 100%;
2151
+ justify-content: center;
2152
+ padding-top: 0.75rem;
2153
+ padding-bottom: 0.5rem;
2154
+ }
2155
+ .nexus-modal-bottom-sheet-bar {
2156
+ background: var(--color-border-default);
2157
+ height: 0.375rem;
2158
+ width: 4rem;
2159
+ border-radius: 9999px;
2160
+ }
2161
+
2162
+ .nexus-modal-component {
2163
+ opacity: 0;
2164
+ }
2165
+ .nexus-modal-component--visible {
2166
+ opacity: 1;
2167
+ }
2168
+ .nexus-modal-component--portal {
2169
+ position: relative;
2170
+ }
2171
+ .nexus-modal-component--enter .nexus-modal-inner {
2172
+ animation-direction: var(--modal-animation-direction);
2173
+ animation-duration: var(--modal-animation-duration);
2174
+ animation-name: var(--modal-animation-name);
2175
+ animation-timing-function: var(--modal-animation-timing-function);
2176
+ }
2177
+ .nexus-modal-component--leave .nexus-modal-inner {
2178
+ animation-direction: reverse;
2179
+ animation-duration: var(--modal-animation-duration);
2180
+ animation-fill-mode: var(--modal-animation-fill-mode);
2181
+ animation-name: var(--modal-animation-name);
2182
+ animation-timing-function: var(--modal-animation-timing-function);
2183
+ }
2184
+
2185
+ .nexus-contents {
2186
+ display: contents;
2187
+ }
2188
+
2189
+ /* ═══════════════════════════════════════════
2190
+ Animation utilities (Radix enter/exit)
2191
+ ═══════════════════════════════════════════ */
2192
+
2193
+ .nexus-animate-in {
2194
+ animation: nexus-enter 200ms ease-out;
2195
+ --nx-enter-opacity: 1;
2196
+ --nx-enter-scale: 1;
2197
+ --nx-enter-translate-x: 0;
2198
+ --nx-enter-translate-y: 0;
2199
+ }
2200
+ .nexus-animate-out {
2201
+ animation: nexus-exit 150ms ease-in forwards;
2202
+ --nx-exit-opacity: 1;
2203
+ --nx-exit-scale: 1;
2204
+ --nx-exit-translate-x: 0;
2205
+ --nx-exit-translate-y: 0;
2206
+ }
2207
+ .nexus-fade-in-0 {
2208
+ --nx-enter-opacity: 0;
2209
+ }
2210
+ .nexus-fade-out-0 {
2211
+ --nx-exit-opacity: 0;
2212
+ }
2213
+ .nexus-zoom-in-95 {
2214
+ --nx-enter-scale: 0.95;
2215
+ }
2216
+ .nexus-zoom-out-95 {
2217
+ --nx-exit-scale: 0.95;
2218
+ }
2219
+ .nexus-slide-in-from-top-2 {
2220
+ --nx-enter-translate-y: -0.5rem;
2221
+ }
2222
+ .nexus-slide-in-from-bottom-2 {
2223
+ --nx-enter-translate-y: 0.5rem;
2224
+ }
2225
+ .nexus-slide-in-from-left-2 {
2226
+ --nx-enter-translate-x: -0.5rem;
2227
+ }
2228
+ .nexus-slide-in-from-right-2 {
2229
+ --nx-enter-translate-x: 0.5rem;
2230
+ }
2231
+
2232
+ /* ═══════════════════════════════════════════
2233
+ Keyframes
2234
+ ═══════════════════════════════════════════ */
2235
+
2236
+ @keyframes nexus-spin {
2237
+ from {
2238
+ transform: rotate(0deg);
2239
+ }
2240
+ to {
2241
+ transform: rotate(360deg);
2242
+ }
2243
+ }
2244
+
2245
+ @keyframes nexus-enter {
2246
+ from {
2247
+ opacity: var(--nx-enter-opacity, 1);
2248
+ transform: translate3d(
2249
+ var(--nx-enter-translate-x, 0),
2250
+ var(--nx-enter-translate-y, 0),
2251
+ 0
2252
+ )
2253
+ scale3d(
2254
+ var(--nx-enter-scale, 1),
2255
+ var(--nx-enter-scale, 1),
2256
+ var(--nx-enter-scale, 1)
2257
+ );
2258
+ }
2259
+ }
2260
+
2261
+ @keyframes nexus-exit {
2262
+ to {
2263
+ opacity: var(--nx-exit-opacity, 1);
2264
+ transform: translate3d(
2265
+ var(--nx-exit-translate-x, 0),
2266
+ var(--nx-exit-translate-y, 0),
2267
+ 0
2268
+ )
2269
+ scale3d(
2270
+ var(--nx-exit-scale, 1),
2271
+ var(--nx-exit-scale, 1),
2272
+ var(--nx-exit-scale, 1)
2273
+ );
2274
+ }
2275
+ }
2276
+
2277
+ @keyframes nexus-accordion-down {
2278
+ from {
2279
+ height: 0;
2280
+ }
2281
+ to {
2282
+ height: var(--radix-accordion-content-height);
2283
+ }
2284
+ }
2285
+
2286
+ @keyframes nexus-accordion-up {
2287
+ from {
2288
+ height: var(--radix-accordion-content-height);
2289
+ }
2290
+ to {
2291
+ height: 0;
2292
+ }
2293
+ }
2294
+
2295
+ @keyframes nexus-skeleton-shimmer {
2296
+ 0% {
2297
+ background-position: 300% 0;
2298
+ }
2299
+ 100% {
2300
+ background-position: -300% 0;
2301
+ }
2302
+ }
2303
+
2304
+ @keyframes modal-fade {
2305
+ from {
2306
+ opacity: 0;
2307
+ }
2308
+ to {
2309
+ opacity: 1;
2310
+ }
2311
+ }
2312
+
2313
+ @keyframes modal-fade-in {
2314
+ from {
2315
+ opacity: 0;
2316
+ }
2317
+ to {
2318
+ opacity: 1;
2319
+ }
2320
+ }
2321
+
2322
+ @keyframes modal-scale {
2323
+ from {
2324
+ transform: scale(0);
2325
+ }
2326
+ to {
2327
+ transform: scale(1);
2328
+ }
2329
+ }
2330
+
2331
+ @keyframes modal-small-scale {
2332
+ from {
2333
+ transform: scale(0.9);
2334
+ }
2335
+ to {
2336
+ transform: scale(1);
2337
+ }
2338
+ }
2339
+
2340
+ @keyframes modal-pop-fade {
2341
+ 0% {
2342
+ transform: scale(0.95);
2343
+ opacity: 0;
2344
+ }
2345
+ 60% {
2346
+ transform: scale(1.03);
2347
+ opacity: 1;
2348
+ }
2349
+ 100% {
2350
+ transform: scale(1);
2351
+ opacity: 1;
2352
+ }
2353
+ }
2354
+
2355
+ @keyframes modal-bottom-sheet {
2356
+ from {
2357
+ transform: translateY(calc(100% + 60px));
2358
+ }
2359
+ to {
2360
+ transform: translateY(0);
2361
+ }
2362
+ }
2363
+
2364
+ @keyframes modal-slide-left {
2365
+ from {
2366
+ transform: translateX(-100%);
2367
+ }
2368
+ to {
2369
+ transform: translateX(0);
2370
+ }
2371
+ }
2372
+
2373
+ @keyframes modal-slide-right {
2374
+ from {
2375
+ transform: translateX(100%);
2376
+ }
2377
+ to {
2378
+ transform: translateX(0);
2379
+ }
2380
+ }
2381
+
2382
+ @keyframes modal-full-page {
2383
+ from {
2384
+ transform: translateY(60%);
2385
+ opacity: 0.5;
2386
+ }
2387
+ to {
2388
+ transform: translateY(0);
2389
+ opacity: 1;
2390
+ }
2391
+ }
2392
+
2393
+ @keyframes modal-full-page-reverse {
2394
+ from {
2395
+ transform: translateY(-60%);
2396
+ opacity: 0.5;
2397
+ }
2398
+ to {
2399
+ transform: translateY(0);
2400
+ opacity: 1;
2401
+ }
2402
+ }
2403
+
2404
+ }