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