@nexus-cross/design-system 1.0.14 → 1.1.1

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 (284) hide show
  1. package/claude-rules/nexus/CLAUDE.md +85 -0
  2. package/claude-rules/nexus/commands/nexus-audit.md +79 -0
  3. package/claude-rules/nexus/commands/nexus-component-map.md +85 -0
  4. package/claude-rules/nexus/commands/nexus-token-check.md +68 -0
  5. package/claude-rules/nexus/skills/nexus-design-system/SKILL.md +92 -0
  6. package/cursor-rules/nexus-ui-api.mdc +910 -41
  7. package/cursor-rules/nexus-ui-decisions.mdc +263 -0
  8. package/dist/accordion.js +0 -1
  9. package/dist/accordion.mjs +0 -1
  10. package/dist/alert.js +0 -1
  11. package/dist/alert.mjs +0 -1
  12. package/dist/avatar.js +0 -1
  13. package/dist/avatar.mjs +0 -1
  14. package/dist/badge.js +0 -1
  15. package/dist/badge.mjs +0 -1
  16. package/dist/breadcrumb.js +0 -1
  17. package/dist/breadcrumb.mjs +0 -1
  18. package/dist/button.js +0 -1
  19. package/dist/button.mjs +0 -1
  20. package/dist/carousel.js +0 -1
  21. package/dist/carousel.mjs +0 -1
  22. package/dist/checkbox.js +0 -1
  23. package/dist/checkbox.mjs +0 -1
  24. package/dist/chip.js +0 -1
  25. package/dist/chip.mjs +0 -1
  26. package/dist/chunks/chunk-2Z52NPWB.js +78 -0
  27. package/dist/chunks/chunk-3SCSND6S.js +7 -0
  28. package/dist/chunks/chunk-46P52MFM.mjs +56 -0
  29. package/dist/chunks/chunk-AG2UJPFX.mjs +621 -0
  30. package/dist/chunks/{chunk-33UFQJIO.mjs → chunk-BJMXZJWO.mjs} +16 -5
  31. package/dist/chunks/{chunk-YZV6FWE7.js → chunk-JLDQNDFT.js} +16 -5
  32. package/dist/chunks/{chunk-K574BYHQ.js → chunk-K3CK7NTP.js} +22 -4
  33. package/dist/chunks/{chunk-Z4YM7LU3.mjs → chunk-PIGHBDK5.mjs} +22 -4
  34. package/dist/chunks/chunk-QWK4CLS2.mjs +5 -0
  35. package/dist/chunks/chunk-RC2Y4UH7.js +648 -0
  36. package/dist/chunks/{chunk-PEIEVKD5.js → chunk-RCIBLLSF.js} +11 -12
  37. package/dist/chunks/{chunk-K2TBLM3F.mjs → chunk-THBE27U3.mjs} +11 -12
  38. package/dist/client-only.js +0 -1
  39. package/dist/client-only.mjs +0 -1
  40. package/dist/combobox.js +28 -0
  41. package/dist/combobox.mjs +3 -0
  42. package/dist/components/Combobox.d.ts +93 -0
  43. package/dist/components/Combobox.d.ts.map +1 -0
  44. package/dist/components/DataGrid.d.ts +44 -0
  45. package/dist/components/DataGrid.d.ts.map +1 -0
  46. package/dist/components/DataList.d.ts +3 -1
  47. package/dist/components/DataList.d.ts.map +1 -1
  48. package/dist/components/RadioGroup.d.ts +4 -0
  49. package/dist/components/RadioGroup.d.ts.map +1 -1
  50. package/dist/components/ToggleGroup.d.ts +2 -1
  51. package/dist/components/ToggleGroup.d.ts.map +1 -1
  52. package/dist/countdown.js +0 -1
  53. package/dist/countdown.mjs +0 -1
  54. package/dist/counter.js +0 -1
  55. package/dist/counter.mjs +0 -1
  56. package/dist/data-grid.js +14 -0
  57. package/dist/data-grid.mjs +5 -0
  58. package/dist/data-list.js +2 -3
  59. package/dist/data-list.mjs +1 -2
  60. package/dist/date-picker.js +0 -1
  61. package/dist/date-picker.mjs +0 -1
  62. package/dist/divider.js +0 -1
  63. package/dist/divider.mjs +0 -1
  64. package/dist/drawer.js +0 -1
  65. package/dist/drawer.mjs +0 -1
  66. package/dist/dropdown-menu.js +0 -1
  67. package/dist/dropdown-menu.mjs +0 -1
  68. package/dist/ellipsis.js +0 -1
  69. package/dist/ellipsis.mjs +0 -1
  70. package/dist/empty-state.js +0 -1
  71. package/dist/empty-state.mjs +0 -1
  72. package/dist/error-boundary.js +0 -1
  73. package/dist/error-boundary.mjs +0 -1
  74. package/dist/hooks/useCheckDevice.js +0 -1
  75. package/dist/hooks/useCheckDevice.mjs +0 -1
  76. package/dist/hooks/useClickOutside.js +0 -1
  77. package/dist/hooks/useClickOutside.mjs +0 -1
  78. package/dist/hooks/useDraggableBottomSheet.js +0 -1
  79. package/dist/hooks/useDraggableBottomSheet.mjs +0 -1
  80. package/dist/hooks/useDraggableWindow.js +0 -1
  81. package/dist/hooks/useDraggableWindow.mjs +0 -1
  82. package/dist/hooks/useInView.js +0 -1
  83. package/dist/hooks/useInView.mjs +0 -1
  84. package/dist/hooks/useModal.js +0 -1
  85. package/dist/hooks/useModal.mjs +0 -1
  86. package/dist/image-upload.js +0 -1
  87. package/dist/image-upload.mjs +0 -1
  88. package/dist/index.d.ts +4 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +101 -85
  91. package/dist/index.mjs +11 -11
  92. package/dist/infinite-scroll.js +0 -1
  93. package/dist/infinite-scroll.mjs +0 -1
  94. package/dist/marquee.js +0 -1
  95. package/dist/marquee.mjs +0 -1
  96. package/dist/modal/index.js +11 -12
  97. package/dist/modal/index.mjs +2 -3
  98. package/dist/number-input.js +0 -1
  99. package/dist/number-input.mjs +0 -1
  100. package/dist/nx-image.js +0 -1
  101. package/dist/nx-image.mjs +0 -1
  102. package/dist/pagination.js +0 -1
  103. package/dist/pagination.mjs +0 -1
  104. package/dist/popover.js +0 -1
  105. package/dist/popover.mjs +0 -1
  106. package/dist/price-input.js +0 -1
  107. package/dist/price-input.mjs +0 -1
  108. package/dist/progress.js +0 -1
  109. package/dist/progress.mjs +0 -1
  110. package/dist/radio-group.js +5 -6
  111. package/dist/radio-group.mjs +1 -2
  112. package/dist/schemas/_all.json +353 -117
  113. package/dist/schemas/accordion.d.ts.map +1 -1
  114. package/dist/schemas/accordion.json +1 -1
  115. package/dist/schemas/alert.d.ts.map +1 -1
  116. package/dist/schemas/alert.json +1 -1
  117. package/dist/schemas/avatar.d.ts.map +1 -1
  118. package/dist/schemas/avatar.json +1 -1
  119. package/dist/schemas/badge.d.ts.map +1 -1
  120. package/dist/schemas/badge.json +1 -1
  121. package/dist/schemas/breadcrumb.d.ts.map +1 -1
  122. package/dist/schemas/breadcrumb.json +1 -1
  123. package/dist/schemas/button.d.ts.map +1 -1
  124. package/dist/schemas/button.json +1 -1
  125. package/dist/schemas/carousel.d.ts.map +1 -1
  126. package/dist/schemas/carousel.json +1 -1
  127. package/dist/schemas/checkBox.json +1 -1
  128. package/dist/schemas/checkbox.d.ts.map +1 -1
  129. package/dist/schemas/chip.d.ts.map +1 -1
  130. package/dist/schemas/chip.json +1 -1
  131. package/dist/schemas/client-only.d.ts.map +1 -1
  132. package/dist/schemas/clientOnly.json +1 -1
  133. package/dist/schemas/combobox.d.ts +108 -0
  134. package/dist/schemas/combobox.d.ts.map +1 -0
  135. package/dist/schemas/combobox.json +98 -0
  136. package/dist/schemas/comboboxOption.json +35 -0
  137. package/dist/schemas/comboboxOptionDescription.json +20 -0
  138. package/dist/schemas/comboboxOptionMeta.json +20 -0
  139. package/dist/schemas/countdown.d.ts.map +1 -1
  140. package/dist/schemas/countdown.json +1 -1
  141. package/dist/schemas/counter.d.ts.map +1 -1
  142. package/dist/schemas/counter.json +1 -1
  143. package/dist/schemas/data-grid.d.ts +74 -0
  144. package/dist/schemas/data-grid.d.ts.map +1 -0
  145. package/dist/schemas/data-list.d.ts.map +1 -1
  146. package/dist/schemas/dataGrid.json +102 -0
  147. package/dist/schemas/dataList.json +1 -1
  148. package/dist/schemas/date-picker.d.ts.map +1 -1
  149. package/dist/schemas/datePicker.json +1 -1
  150. package/dist/schemas/divider.d.ts.map +1 -1
  151. package/dist/schemas/divider.json +1 -1
  152. package/dist/schemas/drawer.d.ts.map +1 -1
  153. package/dist/schemas/drawer.json +1 -1
  154. package/dist/schemas/dropdown-menu.d.ts.map +1 -1
  155. package/dist/schemas/dropdownMenu.json +1 -1
  156. package/dist/schemas/ellipsis.d.ts.map +1 -1
  157. package/dist/schemas/ellipsis.json +1 -1
  158. package/dist/schemas/empty-state.d.ts.map +1 -1
  159. package/dist/schemas/emptyState.json +1 -1
  160. package/dist/schemas/error-boundary.d.ts.map +1 -1
  161. package/dist/schemas/errorBoundary.json +1 -1
  162. package/dist/schemas/image-upload.d.ts.map +1 -1
  163. package/dist/schemas/imageUpload.json +1 -1
  164. package/dist/schemas/index.d.ts +2 -1
  165. package/dist/schemas/index.d.ts.map +1 -1
  166. package/dist/schemas/infinite-scroll.d.ts.map +1 -1
  167. package/dist/schemas/infiniteScroll.json +1 -1
  168. package/dist/schemas/marquee.d.ts.map +1 -1
  169. package/dist/schemas/marquee.json +1 -1
  170. package/dist/schemas/modal.d.ts.map +1 -1
  171. package/dist/schemas/modalTemplate.json +1 -1
  172. package/dist/schemas/number-input.d.ts.map +1 -1
  173. package/dist/schemas/numberInput.json +1 -1
  174. package/dist/schemas/nx-image.d.ts.map +1 -1
  175. package/dist/schemas/nxImage.json +1 -1
  176. package/dist/schemas/pagination.d.ts.map +1 -1
  177. package/dist/schemas/pagination.json +1 -1
  178. package/dist/schemas/popover.d.ts.map +1 -1
  179. package/dist/schemas/popover.json +1 -1
  180. package/dist/schemas/price-input.d.ts.map +1 -1
  181. package/dist/schemas/priceInput.json +1 -1
  182. package/dist/schemas/progress.d.ts.map +1 -1
  183. package/dist/schemas/progress.json +1 -1
  184. package/dist/schemas/radio-group.d.ts +9 -0
  185. package/dist/schemas/radio-group.d.ts.map +1 -1
  186. package/dist/schemas/radioGroup.json +10 -1
  187. package/dist/schemas/radioItem.json +11 -0
  188. package/dist/schemas/select.d.ts.map +1 -1
  189. package/dist/schemas/select.json +1 -1
  190. package/dist/schemas/skeleton.d.ts.map +1 -1
  191. package/dist/schemas/skeleton.json +1 -1
  192. package/dist/schemas/slider.d.ts.map +1 -1
  193. package/dist/schemas/slider.json +1 -1
  194. package/dist/schemas/spinner.d.ts.map +1 -1
  195. package/dist/schemas/spinner.json +1 -1
  196. package/dist/schemas/stepper.d.ts.map +1 -1
  197. package/dist/schemas/stepper.json +1 -1
  198. package/dist/schemas/switch.d.ts.map +1 -1
  199. package/dist/schemas/switch.json +1 -1
  200. package/dist/schemas/tab.d.ts.map +1 -1
  201. package/dist/schemas/tab.json +1 -1
  202. package/dist/schemas/table.d.ts.map +1 -1
  203. package/dist/schemas/table.json +1 -1
  204. package/dist/schemas/tableRow.json +1 -1
  205. package/dist/schemas/tag-input.d.ts.map +1 -1
  206. package/dist/schemas/tagInput.json +1 -1
  207. package/dist/schemas/tdColumn.json +1 -1
  208. package/dist/schemas/text-area.d.ts.map +1 -1
  209. package/dist/schemas/text-input.d.ts +2 -2
  210. package/dist/schemas/text-input.d.ts.map +1 -1
  211. package/dist/schemas/textArea.json +1 -1
  212. package/dist/schemas/textInput.json +1 -1
  213. package/dist/schemas/toast.d.ts.map +1 -1
  214. package/dist/schemas/toastOptions.json +1 -1
  215. package/dist/schemas/toaster.json +1 -1
  216. package/dist/schemas/toggle-group.d.ts +6 -3
  217. package/dist/schemas/toggle-group.d.ts.map +1 -1
  218. package/dist/schemas/toggleGroup.json +9 -3
  219. package/dist/schemas/tooltip.d.ts.map +1 -1
  220. package/dist/schemas/tooltip.json +1 -1
  221. package/dist/schemas/virtual-scroll.d.ts.map +1 -1
  222. package/dist/schemas/virtualGrid.json +1 -1
  223. package/dist/schemas/virtualList.json +1 -1
  224. package/dist/schemas.js +928 -66
  225. package/dist/schemas.mjs +924 -66
  226. package/dist/select.js +0 -1
  227. package/dist/select.mjs +0 -1
  228. package/dist/skeleton.js +0 -1
  229. package/dist/skeleton.mjs +0 -1
  230. package/dist/slider.js +0 -1
  231. package/dist/slider.mjs +0 -1
  232. package/dist/spinner.js +0 -1
  233. package/dist/spinner.mjs +0 -1
  234. package/dist/stepper.js +0 -1
  235. package/dist/stepper.mjs +0 -1
  236. package/dist/styles/.generated/built.d.ts +1 -1
  237. package/dist/styles/.generated/built.d.ts.map +1 -1
  238. package/dist/styles/layer.js +2 -3
  239. package/dist/styles/layer.mjs +1 -2
  240. package/dist/styles.css +484 -13
  241. package/dist/styles.js +2 -3
  242. package/dist/styles.layered.css +484 -13
  243. package/dist/styles.mjs +1 -2
  244. package/dist/switch.js +0 -1
  245. package/dist/switch.mjs +0 -1
  246. package/dist/tab.js +0 -1
  247. package/dist/tab.mjs +0 -1
  248. package/dist/table.js +0 -1
  249. package/dist/table.mjs +0 -1
  250. package/dist/tag-input.js +0 -1
  251. package/dist/tag-input.mjs +0 -1
  252. package/dist/text-area.js +0 -1
  253. package/dist/text-area.mjs +0 -1
  254. package/dist/text-input.js +0 -1
  255. package/dist/text-input.mjs +0 -1
  256. package/dist/toast.js +0 -1
  257. package/dist/toast.mjs +0 -1
  258. package/dist/toggle-group.js +3 -4
  259. package/dist/toggle-group.mjs +1 -2
  260. package/dist/tooltip.js +0 -1
  261. package/dist/tooltip.mjs +0 -1
  262. package/dist/utils/cn.js +0 -1
  263. package/dist/utils/cn.mjs +0 -1
  264. package/dist/utils/scroll.js +0 -1
  265. package/dist/utils/scroll.mjs +0 -1
  266. package/dist/virtual-scroll.js +0 -1
  267. package/dist/virtual-scroll.mjs +0 -1
  268. package/package.json +14 -8
  269. package/scripts/setup-cursor-rules.cjs +164 -27
  270. package/dist/chunks/chunk-22ULI3BF.js +0 -21
  271. package/dist/chunks/chunk-CVYXRSXT.mjs +0 -8
  272. package/dist/chunks/chunk-I252NERB.mjs +0 -21
  273. package/dist/chunks/chunk-JNMCYWGY.js +0 -10
  274. package/dist/chunks/chunk-LAOQRXCE.js +0 -7
  275. package/dist/chunks/chunk-S6ODYMFP.mjs +0 -5
  276. package/dist/components/ThemeProvider.d.ts +0 -25
  277. package/dist/components/ThemeProvider.d.ts.map +0 -1
  278. package/dist/schemas/theme-provider.d.ts +0 -36
  279. package/dist/schemas/theme-provider.d.ts.map +0 -1
  280. package/dist/schemas/themeProvider.json +0 -65
  281. package/dist/theme-provider.js +0 -15
  282. package/dist/theme-provider.mjs +0 -2
  283. package/dist/chunks/{chunk-CWMLTXOH.mjs → chunk-5ZVPTIL3.mjs} +1 -1
  284. package/dist/chunks/{chunk-HFBTS42N.js → chunk-7F4SOLAC.js} +1 -1
@@ -0,0 +1,85 @@
1
+ # NEXUS Design System — AI Agent Rules
2
+
3
+ > 이 파일은 `@nexus-cross/design-system` 패키지가 자동 관리합니다.
4
+ > 사용자 커스텀 규칙은 프로젝트 루트의 `CLAUDE.md`에 직접 작성하세요.
5
+
6
+ @./ui-components.md
7
+ @./ui-decisions.md
8
+ @./ui-api.md
9
+ @./tokens.md
10
+ @./domains.md
11
+
12
+ ---
13
+
14
+ ## Absolute Rules (최우선)
15
+
16
+ 1. **색상은 반드시 NEXUS 토큰 사용.** hex, rgb, 기본 Tailwind 색상 (`bg-blue-500` 등) 금지.
17
+ - 배경: `bg-bg-*`, `bg-surface-*`
18
+ - 텍스트: `text-text-*`
19
+ - 아이콘: `text-icon-*`
20
+ - 테두리: `border-border-*`
21
+ - 액센트: `bg-accent-*`
22
+ - 상태: `bg-status-*`
23
+
24
+ 2. **UI 컴포넌트는 `@nexus-cross/design-system`에서 import.** 직접 구현 금지.
25
+ - `<button>` → `<Button>`, `<input>` → `<TextInput>`, `<select>` → `<Select>` 등
26
+ - Radix UI, Headless UI 등 직접 import 금지 (design-system이 내부적으로 사용)
27
+
28
+ 3. **Figma MCP 코드 그대로 사용 금지.** MCP 출력은 "디자인 의도 파악용"으로만 참고.
29
+ - Step 1: MCP로 구조 파악 → Step 2: NEXUS 컴포넌트 매핑 → Step 3: NEXUS 코드 작성
30
+
31
+ 4. **`className` 오버라이드 시 `!important` 금지.** `cn()` 유틸이 프리픽스 충돌 자동 해소.
32
+
33
+ 5. **새 UI 작업 전, 항상 컴포넌트 매핑부터.** native HTML이나 Tailwind 프리미티브로 구현하기 전, `ui-components.md`에 동일 기능이 있는지 먼저 확인.
34
+
35
+ ---
36
+
37
+ ## Quick Component Import
38
+
39
+ ```tsx
40
+ import {
41
+ Button, TextInput, TextArea, Select, Combobox,
42
+ Switch, CheckBox, RadioGroup, Chip, Spinner,
43
+ Divider, Tooltip, Popover, Drawer, Accordion,
44
+ toast, Toaster,
45
+ NumberInput, PriceInput, Avatar, Tab, ToggleGroup,
46
+ cn,
47
+ } from '@nexus-cross/design-system';
48
+
49
+ import { modal, useModal, ModalTemplate, ModalContainer } from '@nexus-cross/design-system/modal';
50
+ ```
51
+
52
+ ---
53
+
54
+ ## CSS Setup (한 번만)
55
+
56
+ ### Tailwind v4
57
+ ```css
58
+ @import 'tailwindcss';
59
+ @import '@nexus-cross/tokens/company.css';
60
+ /* Next.js Turbopack only: */
61
+ @import '@nexus-cross/design-system/styles.css';
62
+ ```
63
+
64
+ ### Next.js Turbopack
65
+ ```js
66
+ // next.config.mjs
67
+ const nextConfig = {
68
+ transpilePackages: ['@nexus-cross/design-system', '@nexus-cross/tokens'],
69
+ }
70
+ ```
71
+
72
+ ---
73
+
74
+ ## Token Path Convention
75
+
76
+ 모든 디자인 토큰은 5-segment 형식: `color.semantic.{namespace}.{slot}.{state}`
77
+
78
+ ```
79
+ # CORRECT
80
+ color.semantic.domain-market.bullish.base
81
+ color.semantic.domain-market.bullish-bg.hover
82
+
83
+ # WRONG (6+ segments)
84
+ color.semantic.domain-market.trend.bullish.base
85
+ ```
@@ -0,0 +1,79 @@
1
+ ---
2
+ description: NEXUS Design System 컴플라이언스 감사. 코드베이스에서 NEXUS 룰 위반을 검출하고 수정안을 제시합니다.
3
+ ---
4
+
5
+ # /nexus-audit
6
+
7
+ 이 프로젝트의 NEXUS Design System 컴플라이언스를 감사합니다.
8
+
9
+ ## 검사 항목
10
+
11
+ 다음 위반 사항을 검출하고 각각 수정안을 제시하세요.
12
+
13
+ ### 1. Raw HTML 사용 (NEXUS 컴포넌트로 교체 필요)
14
+
15
+ `src/`, `app/`, `pages/`, `components/` 하위에서 다음 패턴 검색:
16
+
17
+ - `<button` (단, `<Button` 제외) → `<Button>` 권고
18
+ - `<input` (단, `type="hidden"` 제외) → `<TextInput>` / `<NumberInput>` / `<CheckBox>` / `<RadioGroup>` 등
19
+ - `<textarea` → `<TextArea>`
20
+ - `<select` → `<Select>` 또는 `<Combobox>`
21
+ - 직접 만든 dropdown div (`onClick + isOpen state`) → `<DropdownMenu>` / `<Popover>`
22
+ - 직접 만든 modal (`fixed inset-0` 등) → `<Modal>` / `modal()` API
23
+
24
+ ### 2. 토큰 위반 (NEXUS 토큰으로 교체 필요)
25
+
26
+ - hex/rgb/hsl 직접 사용: `#[0-9a-fA-F]{3,8}`, `rgb\(`, `hsl\(`
27
+ - 기본 Tailwind 색상: `bg-(red|blue|green|yellow|gray|slate|zinc|neutral|stone)-\d+` 등
28
+ - 인라인 style 색상: `style={{ color: ..., background: ..., border: ... }}`
29
+
30
+ 수정안: NEXUS 토큰 매핑 (`@.claude/nexus/tokens.md` 참조).
31
+
32
+ ### 3. `!important` 사용
33
+
34
+ `className`에서 `!`로 시작하는 Tailwind 유틸 (예: `!bg-red-500`, `!text-white`)
35
+ - semantic prop으로 해결 가능한지 확인 (`semantic="danger"` 등)
36
+ - 정말 필요하면 `cn()` 우선순위로 해결
37
+
38
+ ### 4. 직접 import 위반
39
+
40
+ - `from '@radix-ui/...'` 직접 import (NEXUS가 wrap하고 있음)
41
+ - `from '@headlessui/...'` 직접 import
42
+ - `import { Button } from 'somewhere-else'` (다른 디자인 시스템)
43
+
44
+ ### 5. 자주 발견되는 anti-pattern
45
+
46
+ - `TextInput type="number"` → `<NumberInput>`
47
+ - `<Tooltip>` 안에 클릭 가능한 콘텐츠 → `<Popover>` 또는 `<DropdownMenu>`
48
+ - 옵션 7개 이상의 `<Select>` → `<Combobox>` 권고
49
+ - 즉시 적용되는 binary 설정에 `<CheckBox>` → `<Switch>` 권고
50
+ - form field 안에 비슷한 모양 컴포넌트 혼용 (RadioGroup + ToggleGroup 등)
51
+
52
+ ## 출력 형식
53
+
54
+ ```md
55
+ ## NEXUS Audit Report
56
+
57
+ ### 🔴 Critical (즉시 수정)
58
+ - src/pages/Login.tsx:23 — `<button className="bg-blue-500">` → `<Button semantic="primary">`
59
+ - Reason: raw HTML + 임의 색상
60
+
61
+ ### 🟡 Warning (검토 후 수정)
62
+ - src/components/Settings.tsx:47 — Select with 12 options → Combobox 권고
63
+
64
+ ### 🟢 Info (개선 제안)
65
+ - src/styles/theme.css:8 — `--my-blue: #0066ff` → `--color-accent-primary` 활용
66
+
67
+ ### Summary
68
+ - Critical: 3
69
+ - Warning: 5
70
+ - Info: 2
71
+ ```
72
+
73
+ ## 작업 흐름
74
+
75
+ 1. Glob/Grep으로 위 패턴 일괄 검색
76
+ 2. 각 위반 건마다 위치·코드 스니펫·수정안 정리
77
+ 3. 우선순위 (Critical → Warning → Info) 분류
78
+ 4. Summary 출력 후 사용자에게 일괄 수정 여부 확인
79
+ 5. 수정 시 `@.claude/nexus/ui-components.md`, `@.claude/nexus/ui-decisions.md`, `@.claude/nexus/tokens.md` 참조
@@ -0,0 +1,85 @@
1
+ ---
2
+ description: Figma 디자인이나 기존 화면을 NEXUS 컴포넌트로 매핑하는 표를 생성합니다. 코드 작성 전 필수 단계.
3
+ ---
4
+
5
+ # /nexus-component-map
6
+
7
+ UI 작업 시작 전, 디자인의 모든 요소를 NEXUS 컴포넌트로 매핑하는 단계.
8
+
9
+ ## 사용 시점
10
+
11
+ - Figma 링크/스크린샷을 받았을 때
12
+ - 기존 화면을 NEXUS로 마이그레이션할 때
13
+ - 새 페이지/모달 설계 시작 시
14
+
15
+ ## 워크플로우
16
+
17
+ ### Step 1. 디자인 입력 받기
18
+ 사용자에게 다음 중 하나를 요청:
19
+ - Figma URL (Figma MCP로 `get_design_context` 호출)
20
+ - 스크린샷 첨부
21
+ - 기존 코드 파일 경로
22
+
23
+ ### Step 2. 모든 인터랙티브·시각 요소 식별
24
+
25
+ 다음 카테고리로 분류:
26
+ - **Form fields**: input, select, checkbox, radio, switch, textarea
27
+ - **Actions**: button, dropdown menu, link
28
+ - **Display**: badge, chip, avatar, divider, image
29
+ - **Feedback**: alert, toast, spinner, skeleton, progress, empty state
30
+ - **Overlay**: modal, drawer, popover, tooltip
31
+ - **Navigation**: tab, breadcrumb, pagination, stepper
32
+ - **Layout**: card, list, grid, accordion, carousel
33
+
34
+ ### Step 3. 매핑 표 작성
35
+
36
+ 각 요소마다 다음 표 출력:
37
+
38
+ ```md
39
+ ## NEXUS Component Mapping
40
+
41
+ | # | Detected Element | NEXUS Component | Variants/Props | Note |
42
+ |---|---|---|---|---|
43
+ | 1 | 큰 파란 버튼 "회원가입" | `<Button>` | `semantic="primary" size="lg"` | - |
44
+ | 2 | 회색 작은 버튼 "취소" | `<Button>` | `semantic="normal" variant="ghost"` | - |
45
+ | 3 | 이메일 입력 (라벨 위) | `<TextInput>` | `label="이메일" type="email" clearable` | - |
46
+ | 4 | "정렬" 드롭다운 (4개 옵션) | `<Select>` | `placeholder="정렬"` | 옵션 ≤7 → Select 적합 |
47
+ | 5 | "카테고리" 드롭다운 (24개) | `<Combobox>` | `placeholder="검색하여 선택"` | 옵션 >7 → Combobox |
48
+ | 6 | 알림 받기 토글 | `<Switch>` | `label="알림 받기"` | 즉시 적용 → Switch |
49
+ | 7 | 도움말 ? 아이콘 | `<Tooltip>` | `content="..."` | hover 시 짧은 설명 |
50
+ | 8 | "삭제" 확인 팝업 | `modal.confirm()` | `danger: true` | 파괴적 액션 |
51
+ | 9 | 카드 6개 그리드 | `<DataList>` | - | 단순 그리드 |
52
+ | 10 | 알림 배지 (n) | `<Badge>` | `size="sm"` | - |
53
+ ```
54
+
55
+ ### Step 4. 토큰 매핑 (색상·간격)
56
+
57
+ ```md
58
+ ## Token Mapping
59
+
60
+ | Figma 색상 | NEXUS 토큰 |
61
+ |---|---|
62
+ | Background #FAFBFC | `bg-bg-default` |
63
+ | Card #FFFFFF | `bg-surface-elevated` |
64
+ | Primary CTA #0066FF | `bg-accent-primary` |
65
+ | Body text #1E232E | `text-text-primary` |
66
+ | Border #E5E7EB | `border-border-default` |
67
+ ```
68
+
69
+ ### Step 5. 사용자 확인 후 코드 생성
70
+
71
+ 매핑 표를 보여주고 사용자 OK 받은 후 코드 작성 시작.
72
+
73
+ ## 모호한 케이스 처리
74
+
75
+ 매핑 시 결정이 어려우면 `@.claude/nexus/ui-decisions.md` 참조:
76
+ - "Select vs Combobox" — 옵션 개수와 검색 필요성으로 판단
77
+ - "Modal vs Drawer" — 결정 강제 vs 보조 작업
78
+ - "Tab vs ToggleGroup" — 영역 전환 vs 즉시 옵션
79
+
80
+ ## 참조 문서
81
+
82
+ - 컴포넌트 매핑 규칙: `@.claude/nexus/ui-components.md`
83
+ - 컴포넌트 props: `@.claude/nexus/ui-api.md`
84
+ - 결정 가이드: `@.claude/nexus/ui-decisions.md`
85
+ - 토큰 전체: `@.claude/nexus/tokens.md`
@@ -0,0 +1,68 @@
1
+ ---
2
+ description: NEXUS 디자인 토큰 위반(hex, rgb, 기본 Tailwind 색상)을 빠르게 검출하고 토큰으로 교체할 매핑을 제시합니다.
3
+ ---
4
+
5
+ # /nexus-token-check
6
+
7
+ 토큰 사용 위반만 빠르게 검사하는 가벼운 명령어. 색상에 집중.
8
+
9
+ ## 검사 패턴
10
+
11
+ `src/`, `app/`, `pages/`, `components/`, `styles/` 하위에서 검색:
12
+
13
+ | 위반 패턴 | 정규식 |
14
+ |---|---|
15
+ | hex 색상 | `#([0-9a-fA-F]{3,4}\|[0-9a-fA-F]{6}\|[0-9a-fA-F]{8})\b` |
16
+ | rgb/rgba | `rgba?\(\s*\d+` |
17
+ | hsl/hsla | `hsla?\(` |
18
+ | 기본 Tailwind 컬러 | `\b(bg\|text\|border\|ring\|from\|to\|via)-(red\|blue\|green\|yellow\|orange\|amber\|lime\|emerald\|teal\|cyan\|sky\|indigo\|violet\|purple\|fuchsia\|pink\|rose\|gray\|slate\|zinc\|neutral\|stone)-\d+` |
19
+ | 임의값 색상 | `\b(bg\|text\|border)-\[#` |
20
+
21
+ ## 토큰 매핑 가이드 (자주 쓰이는 변환)
22
+
23
+ | 원본 | NEXUS 토큰 | 용도 |
24
+ |---|---|---|
25
+ | `bg-white` `bg-gray-50` | `bg-bg-default` | 페이지 배경 |
26
+ | `bg-gray-100` | `bg-surface-elevated` | 카드 배경 |
27
+ | `bg-gray-200` | `bg-surface-sunken` | 비활성 영역 |
28
+ | `text-gray-900` `text-black` | `text-text-primary` | 본문 |
29
+ | `text-gray-600` | `text-text-secondary` | 보조 텍스트 |
30
+ | `text-gray-400` | `text-text-muted` | 비활성 텍스트 |
31
+ | `border-gray-200` | `border-border-default` | 일반 테두리 |
32
+ | `border-gray-300` | `border-border-strong` | 강조 테두리 |
33
+ | `bg-blue-500` `bg-blue-600` | `bg-accent-primary` | 주요 액션 |
34
+ | `bg-red-500` | `bg-status-danger` | 위험 |
35
+ | `bg-yellow-500` | `bg-status-warning` | 경고 |
36
+ | `bg-green-500` | `bg-status-success` | 성공 |
37
+ | `text-blue-500` | `text-accent-primary` | 강조 텍스트 |
38
+ | `text-red-500` | `text-status-danger` | 에러 텍스트 |
39
+
40
+ 전체 매핑은 `@.claude/nexus/tokens.md` 참조.
41
+
42
+ ## 출력 형식
43
+
44
+ ```md
45
+ ## Token Check Report
46
+
47
+ ### 위반 8건 발견
48
+
49
+ src/pages/Login.tsx
50
+ L23 `<button className="bg-blue-500 text-white">` → `bg-accent-primary text-text-on-accent`
51
+ L45 `style={{ borderColor: '#e5e7eb' }}` → `border-border-default`
52
+
53
+ src/components/Card.tsx
54
+ L12 `bg-gray-50` → `bg-surface-elevated`
55
+
56
+ ### Summary
57
+ - hex: 1
58
+ - rgb/hsl: 0
59
+ - Tailwind 기본 컬러: 6
60
+ - 임의값: 1
61
+ ```
62
+
63
+ ## 작업 흐름
64
+
65
+ 1. Grep으로 위 패턴 검색
66
+ 2. 각 위반에 권고 토큰 명시
67
+ 3. 사용자에게 일괄 자동 수정 여부 확인
68
+ 4. 수정 시 `@.claude/nexus/tokens.md`로 정확한 토큰 검증
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: nexus-design-system
3
+ description: Use whenever the user asks to build UI, implement a Figma design, create/edit components, pages, forms, layouts, or change colors/spacing/styling in this codebase. Maps native HTML and Tailwind primitives to @nexus-cross/design-system components and NEXUS design tokens. Triggers on natural-language requests like "버튼 만들어줘", "이 페이지 구현해줘", "색상 바꿔줘", "Figma 보고 만들어줘", "input 추가", "modal 띄워줘". Required reading before generating any UI code in this project.
4
+ ---
5
+
6
+ # NEXUS Design System Skill
7
+
8
+ 이 프로젝트는 `@nexus-cross/design-system`을 사용합니다. UI 코드를 작성하기 전에 반드시 이 룰을 따르세요.
9
+
10
+ ## 핵심 워크플로우 (모든 UI 작업)
11
+
12
+ ### Step 1. 컴포넌트 매핑
13
+ 디자인의 모든 UI 요소를 NEXUS 컴포넌트로 매핑하세요. **native `<button>`, `<input>`, `<select>` 등을 직접 쓰기 전에 반드시 매핑 표를 확인.**
14
+
15
+ | 발견된 요소 | NEXUS 컴포넌트 |
16
+ |---|---|
17
+ | `<button>` | `<Button>` |
18
+ | `<input type="text">` | `<TextInput>` |
19
+ | `<input type="number">` | `<NumberInput>` |
20
+ | `<textarea>` | `<TextArea>` |
21
+ | `<select>` (옵션 ≤7) | `<Select>` |
22
+ | 검색·필터링 select (옵션 >7) | `<Combobox>` |
23
+ | `<input type="checkbox">` | `<CheckBox>` |
24
+ | `<input type="radio">` | `<RadioGroup>` + `<RadioItem>` |
25
+ | 토글 스위치 | `<Switch>` |
26
+ | 칩/태그 | `<Chip>` |
27
+ | 탭 | `<Tab>` |
28
+ | 모달 | `modal()` (imperative) 또는 `<ModalTemplate>` |
29
+ | 측면 패널 | `<Drawer>` |
30
+ | 툴팁 | `<Tooltip>` |
31
+ | 팝오버 | `<Popover>` |
32
+ | 아바타 | `<Avatar>` |
33
+ | 알림 (토스트) | `toast()` |
34
+ | 배지 | `<Badge>` |
35
+ | 알림 박스 | `<Alert>` |
36
+ | 진행률 | `<Progress>` |
37
+ | 빈 상태 | `<EmptyState>` |
38
+ | 로더 | `<Spinner>` 또는 `<Skeleton>` |
39
+
40
+ 상세 가이드: `@.claude/nexus/ui-components.md`
41
+
42
+ ### Step 2. 토큰 사용
43
+
44
+ 색상·간격·라디우스·타이포그래피는 NEXUS 토큰만 사용:
45
+
46
+ | 카테고리 | Tailwind 프리픽스 | 예시 |
47
+ |---|---|---|
48
+ | 배경 | `bg-bg-*`, `bg-surface-*` | `bg-bg-default`, `bg-surface-elevated` |
49
+ | 텍스트 | `text-text-*` | `text-text-primary`, `text-text-muted` |
50
+ | 아이콘 | `text-icon-*` | `text-icon-default` |
51
+ | 테두리 | `border-border-*` | `border-border-default` |
52
+ | 액센트 | `bg-accent-*` `text-accent-*` | `bg-accent-primary` |
53
+ | 상태 | `bg-status-*` `text-status-*` | `text-status-danger` |
54
+
55
+ ❌ 금지: `bg-blue-500`, `style={{ color: '#1e232e' }}`, `border: 1px solid #ddd`
56
+
57
+ 상세 토큰 목록: `@.claude/nexus/tokens.md`
58
+
59
+ ### Step 3. props 정확히 사용
60
+
61
+ 각 컴포넌트의 props는 `@.claude/nexus/ui-api.md`에서 확인. 특히 자주 틀리는 항목:
62
+ - `Button`: `semantic` × `variant` 2축 (`primary/secondary/normal/danger` × `contained/outlined/subtle/ghost`)
63
+ - `TextInput`: `error` (boolean), `label`, `description`, `clearable`, `showCount` + `maxLength`
64
+ - `Combobox`: 옵션 7개 이상 또는 검색 필요할 때. async 옵션은 `loading` prop 활용
65
+ - `RadioGroup`: 새 `variant="ring"` 옵션 (체크 시 두꺼운 테두리)
66
+ - `ToggleGroup`: 새 `outline` variant + `fullWidth` prop (버튼 형식)
67
+ - `modal()`: imperative API. `<Dialog>` 직접 구현 금지
68
+
69
+ ## Figma → 코드 변환 규칙
70
+
71
+ 1. Figma MCP 출력 (특히 `get_design_context`)은 **디자인 의도 파악용**.
72
+ 2. 절대 그대로 붙여넣지 말고, 다음 단계 거치기:
73
+ - 모든 색상값 → NEXUS 토큰
74
+ - 모든 native 요소 → NEXUS 컴포넌트
75
+ - inline style → Tailwind 클래스
76
+ - 직접 정의된 폰트 스택 → 토큰 클래스
77
+ 3. 매핑 결과를 사용자에게 표로 보여주고 진행.
78
+
79
+ ## 절대 금지
80
+
81
+ - ❌ `!important`로 NEXUS 컴포넌트 스타일 강제 오버라이드 (`cn()` 사용)
82
+ - ❌ Radix UI / Headless UI 직접 import (NEXUS가 내부적으로 사용 중)
83
+ - ❌ NEXUS에 동일 기능이 있는데 raw HTML로 재구현
84
+ - ❌ hex/rgb/HSL/기본 Tailwind 색상
85
+
86
+ ## 더 알아야 할 것
87
+
88
+ - 컴포넌트 매핑 상세: `@.claude/nexus/ui-components.md`
89
+ - 컴포넌트 props API: `@.claude/nexus/ui-api.md`
90
+ - 디자인 토큰 전체: `@.claude/nexus/tokens.md`
91
+ - 도메인 토큰: `@.claude/nexus/domains.md`
92
+ - 핵심 룰 모음: `@.claude/nexus/CLAUDE.md`