@conscience-technology/ctds 0.0.0-stage → 0.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 (289) hide show
  1. package/README.md +128 -2
  2. package/assets/components/AppFrame/AppFrame.module.css +177 -0
  3. package/assets/components/AppFrame/AppFrame.tsx +93 -0
  4. package/assets/components/AppFrame/index.ts +6 -0
  5. package/assets/components/AttachmentChip/AttachmentChip.module.css +71 -0
  6. package/assets/components/AttachmentChip/AttachmentChip.tsx +74 -0
  7. package/assets/components/AttachmentChip/index.ts +2 -0
  8. package/assets/components/AttachmentThumb/AttachmentThumb.module.css +107 -0
  9. package/assets/components/AttachmentThumb/AttachmentThumb.tsx +91 -0
  10. package/assets/components/AttachmentThumb/index.ts +2 -0
  11. package/assets/components/Avatar/Avatar.module.css +167 -0
  12. package/assets/components/Avatar/Avatar.tsx +228 -0
  13. package/assets/components/Avatar/index.ts +2 -0
  14. package/assets/components/AvatarUpload/AvatarUpload.module.css +130 -0
  15. package/assets/components/AvatarUpload/AvatarUpload.tsx +139 -0
  16. package/assets/components/AvatarUpload/index.ts +2 -0
  17. package/assets/components/Badge/Badge.module.css +76 -0
  18. package/assets/components/Badge/Badge.tsx +68 -0
  19. package/assets/components/Badge/index.ts +2 -0
  20. package/assets/components/Breadcrumb/Breadcrumb.module.css +213 -0
  21. package/assets/components/Breadcrumb/Breadcrumb.tsx +279 -0
  22. package/assets/components/Breadcrumb/index.ts +8 -0
  23. package/assets/components/Button/Button.module.css +216 -0
  24. package/assets/components/Button/Button.tsx +149 -0
  25. package/assets/components/Button/index.ts +2 -0
  26. package/assets/components/Callout/Callout.module.css +146 -0
  27. package/assets/components/Callout/Callout.tsx +138 -0
  28. package/assets/components/Callout/index.ts +2 -0
  29. package/assets/components/ChatInput/ChatInput.module.css +254 -0
  30. package/assets/components/ChatInput/ChatInput.tsx +322 -0
  31. package/assets/components/ChatInput/ModelSelector.tsx +40 -0
  32. package/assets/components/ChatInput/SendButton.tsx +41 -0
  33. package/assets/components/ChatInput/index.ts +10 -0
  34. package/assets/components/Checkbox/Checkbox.module.css +66 -0
  35. package/assets/components/Checkbox/Checkbox.tsx +36 -0
  36. package/assets/components/Checkbox/index.ts +2 -0
  37. package/assets/components/Chip/Chip.module.css +128 -0
  38. package/assets/components/Chip/Chip.tsx +103 -0
  39. package/assets/components/Chip/index.ts +2 -0
  40. package/assets/components/ChoiceCard/ChoiceCard.module.css +142 -0
  41. package/assets/components/ChoiceCard/ChoiceCard.tsx +132 -0
  42. package/assets/components/ChoiceCard/index.ts +2 -0
  43. package/assets/components/ContextMenu/ContextMenu.module.css +102 -0
  44. package/assets/components/ContextMenu/ContextMenu.tsx +392 -0
  45. package/assets/components/ContextMenu/index.ts +9 -0
  46. package/assets/components/DatePicker/Calendar.tsx +234 -0
  47. package/assets/components/DatePicker/DESIGN_NOTES.md +106 -0
  48. package/assets/components/DatePicker/DESIGN_NOTES_TIME.md +125 -0
  49. package/assets/components/DatePicker/DatePicker.module.css +295 -0
  50. package/assets/components/DatePicker/DatePicker.tsx +387 -0
  51. package/assets/components/DatePicker/TimeSelector.tsx +69 -0
  52. package/assets/components/DatePicker/index.ts +8 -0
  53. package/assets/components/DatePicker/presets.ts +80 -0
  54. package/assets/components/DatePicker/utils.ts +148 -0
  55. package/assets/components/Disclosure/Disclosure.module.css +73 -0
  56. package/assets/components/Disclosure/Disclosure.tsx +129 -0
  57. package/assets/components/Disclosure/index.ts +6 -0
  58. package/assets/components/Drawer/Drawer.module.css +257 -0
  59. package/assets/components/Drawer/Drawer.tsx +126 -0
  60. package/assets/components/Drawer/index.ts +7 -0
  61. package/assets/components/EmptyState/EmptyState.module.css +102 -0
  62. package/assets/components/EmptyState/EmptyState.tsx +80 -0
  63. package/assets/components/EmptyState/index.ts +2 -0
  64. package/assets/components/FileIcon/FileIcon.module.css +66 -0
  65. package/assets/components/FileIcon/FileIcon.tsx +84 -0
  66. package/assets/components/FileIcon/fileExtMap.ts +112 -0
  67. package/assets/components/FileIcon/index.ts +9 -0
  68. package/assets/components/FilterButton/FilterButton.module.css +130 -0
  69. package/assets/components/FilterButton/FilterButton.tsx +94 -0
  70. package/assets/components/FilterButton/index.ts +2 -0
  71. package/assets/components/GalleryItem/GalleryItem.module.css +220 -0
  72. package/assets/components/GalleryItem/GalleryItem.tsx +163 -0
  73. package/assets/components/GalleryItem/index.ts +7 -0
  74. package/assets/components/Icon/Icon.tsx +616 -0
  75. package/assets/components/Icon/context.tsx +39 -0
  76. package/assets/components/Icon/index.ts +4 -0
  77. package/assets/components/IconButton/IconButton.module.css +109 -0
  78. package/assets/components/IconButton/IconButton.tsx +110 -0
  79. package/assets/components/IconButton/index.ts +2 -0
  80. package/assets/components/Input/Input.module.css +338 -0
  81. package/assets/components/Input/Input.tsx +371 -0
  82. package/assets/components/Input/index.ts +2 -0
  83. package/assets/components/ListItem/ListItem.module.css +318 -0
  84. package/assets/components/ListItem/ListItem.tsx +262 -0
  85. package/assets/components/ListItem/index.ts +9 -0
  86. package/assets/components/MenuItem/MenuItem.module.css +437 -0
  87. package/assets/components/MenuItem/MenuItem.tsx +529 -0
  88. package/assets/components/MenuItem/index.ts +8 -0
  89. package/assets/components/MetricCard/MetricCard.module.css +153 -0
  90. package/assets/components/MetricCard/MetricCard.tsx +140 -0
  91. package/assets/components/MetricCard/index.ts +2 -0
  92. package/assets/components/Modal/Modal.module.css +175 -0
  93. package/assets/components/Modal/Modal.tsx +98 -0
  94. package/assets/components/Modal/index.ts +2 -0
  95. package/assets/components/Onboarding/DocsIndex.tsx +82 -0
  96. package/assets/components/Onboarding/LayoutBuilder.tsx +160 -0
  97. package/assets/components/Onboarding/Onboarding.module.css +1394 -0
  98. package/assets/components/Onboarding/OnboardingAxisPanel.tsx +515 -0
  99. package/assets/components/Onboarding/OnboardingPage.tsx +1193 -0
  100. package/assets/components/Onboarding/PresetsGallery.tsx +65 -0
  101. package/assets/components/Onboarding/actions.ts +250 -0
  102. package/assets/components/Onboarding/index.ts +8 -0
  103. package/assets/components/Onboarding/palette.css +40 -0
  104. package/assets/components/Onboarding/wizardData.ts +265 -0
  105. package/assets/components/Pagination/Pagination.module.css +82 -0
  106. package/assets/components/Pagination/Pagination.tsx +248 -0
  107. package/assets/components/Pagination/index.ts +6 -0
  108. package/assets/components/ProgressBar/ProgressBar.module.css +64 -0
  109. package/assets/components/ProgressBar/ProgressBar.tsx +54 -0
  110. package/assets/components/ProgressBar/index.ts +2 -0
  111. package/assets/components/QuotationBar/QuotationBar.module.css +61 -0
  112. package/assets/components/QuotationBar/QuotationBar.tsx +48 -0
  113. package/assets/components/QuotationBar/index.ts +2 -0
  114. package/assets/components/Radio/Radio.module.css +63 -0
  115. package/assets/components/Radio/Radio.tsx +33 -0
  116. package/assets/components/Radio/index.ts +2 -0
  117. package/assets/components/Select/Select.module.css +151 -0
  118. package/assets/components/Select/Select.tsx +425 -0
  119. package/assets/components/Select/index.ts +10 -0
  120. package/assets/components/SelectableCard/SelectableCard.module.css +177 -0
  121. package/assets/components/SelectableCard/SelectableCard.tsx +83 -0
  122. package/assets/components/SelectableCard/index.ts +2 -0
  123. package/assets/components/Shortcut/Shortcut.module.css +56 -0
  124. package/assets/components/Shortcut/Shortcut.tsx +156 -0
  125. package/assets/components/Shortcut/index.ts +2 -0
  126. package/assets/components/Sidebar/Sidebar.module.css +242 -0
  127. package/assets/components/Sidebar/Sidebar.tsx +264 -0
  128. package/assets/components/Sidebar/index.ts +7 -0
  129. package/assets/components/SidebarSplit/SidebarSplit.module.css +126 -0
  130. package/assets/components/SidebarSplit/SidebarSplit.tsx +222 -0
  131. package/assets/components/SidebarSplit/index.ts +6 -0
  132. package/assets/components/Slider/Slider.module.css +120 -0
  133. package/assets/components/Slider/Slider.tsx +88 -0
  134. package/assets/components/Slider/index.ts +2 -0
  135. package/assets/components/SplitButton/SplitButton.module.css +190 -0
  136. package/assets/components/SplitButton/SplitButton.tsx +145 -0
  137. package/assets/components/SplitButton/index.ts +6 -0
  138. package/assets/components/Stepper/Stepper.module.css +182 -0
  139. package/assets/components/Stepper/Stepper.tsx +185 -0
  140. package/assets/components/Stepper/index.ts +2 -0
  141. package/assets/components/Switch/Switch.module.css +116 -0
  142. package/assets/components/Switch/Switch.tsx +58 -0
  143. package/assets/components/Switch/index.ts +2 -0
  144. package/assets/components/TableCell/TableCell.module.css +137 -0
  145. package/assets/components/TableCell/TableCellAvatar.tsx +42 -0
  146. package/assets/components/TableCell/TableCellBadge.tsx +23 -0
  147. package/assets/components/TableCell/TableCellIcon.tsx +39 -0
  148. package/assets/components/TableCell/TableCellImage.tsx +49 -0
  149. package/assets/components/TableCell/TableCellLink.tsx +33 -0
  150. package/assets/components/TableCell/TableCellMeter.tsx +55 -0
  151. package/assets/components/TableCell/TableCellNumber.tsx +43 -0
  152. package/assets/components/TableCell/TableCellText.tsx +30 -0
  153. package/assets/components/TableCell/index.ts +23 -0
  154. package/assets/components/TableHeader/TableHeader.module.css +287 -0
  155. package/assets/components/TableHeader/TableHeader.tsx +590 -0
  156. package/assets/components/TableHeader/index.ts +9 -0
  157. package/assets/components/TableRow/TableRow.module.css +290 -0
  158. package/assets/components/TableRow/TableRow.tsx +253 -0
  159. package/assets/components/TableRow/index.ts +8 -0
  160. package/assets/components/TableRowEdit/TableRowEdit.module.css +126 -0
  161. package/assets/components/TableRowEdit/TableRowEdit.tsx +247 -0
  162. package/assets/components/TableRowEdit/index.ts +2 -0
  163. package/assets/components/TableRowSelect/TableRowSelect.module.css +23 -0
  164. package/assets/components/TableRowSelect/TableRowSelect.tsx +175 -0
  165. package/assets/components/TableRowSelect/index.ts +2 -0
  166. package/assets/components/Tabs/Tabs.module.css +234 -0
  167. package/assets/components/Tabs/Tabs.tsx +426 -0
  168. package/assets/components/Tabs/index.ts +9 -0
  169. package/assets/components/Textarea/Textarea.module.css +318 -0
  170. package/assets/components/Textarea/Textarea.tsx +426 -0
  171. package/assets/components/Textarea/index.ts +7 -0
  172. package/assets/components/ThemeController.tsx +271 -0
  173. package/assets/components/TimePicker/TimePicker.module.css +317 -0
  174. package/assets/components/TimePicker/TimePicker.tsx +821 -0
  175. package/assets/components/TimePicker/index.ts +8 -0
  176. package/assets/components/TimePicker/utils.ts +115 -0
  177. package/assets/components/Toast/Toast.module.css +264 -0
  178. package/assets/components/Toast/Toast.tsx +243 -0
  179. package/assets/components/Toast/index.ts +15 -0
  180. package/assets/components/Toolbar/Toolbar.module.css +72 -0
  181. package/assets/components/Toolbar/Toolbar.tsx +75 -0
  182. package/assets/components/Toolbar/index.ts +2 -0
  183. package/assets/components/Tooltip/Tooltip.module.css +42 -0
  184. package/assets/components/Tooltip/Tooltip.tsx +332 -0
  185. package/assets/components/Tooltip/index.ts +2 -0
  186. package/assets/components/Topbar/Topbar.module.css +26 -0
  187. package/assets/components/Topbar/Topbar.tsx +47 -0
  188. package/assets/components/Topbar/index.ts +2 -0
  189. package/assets/components/_cn.ts +3 -0
  190. package/assets/components/_color.ts +48 -0
  191. package/assets/components/_data.ts +659 -0
  192. package/assets/components/_utils.css +19 -0
  193. package/assets/components/axisOptions.ts +24 -0
  194. package/assets/components/tokens.css +742 -0
  195. package/assets/prompts/GUIDE.md +251 -0
  196. package/assets/prompts/OVERRIDE.md +170 -0
  197. package/assets/prompts/PRINCIPLES.md +130 -0
  198. package/assets/prompts/axes/density.md +38 -0
  199. package/assets/prompts/axes/font.md +36 -0
  200. package/assets/prompts/axes/hue.md +36 -0
  201. package/assets/prompts/axes/icon.md +48 -0
  202. package/assets/prompts/axes/mode.md +50 -0
  203. package/assets/prompts/axes/motion.md +77 -0
  204. package/assets/prompts/axes/palette.md +35 -0
  205. package/assets/prompts/axes/shape.md +33 -0
  206. package/assets/prompts/axes/voice.md +54 -0
  207. package/assets/prompts/components/README.md +84 -0
  208. package/assets/prompts/components/app-frame.md +94 -0
  209. package/assets/prompts/components/attachment-chip.md +46 -0
  210. package/assets/prompts/components/attachment-thumb.md +49 -0
  211. package/assets/prompts/components/avatar.md +86 -0
  212. package/assets/prompts/components/badge.md +104 -0
  213. package/assets/prompts/components/breadcrumb.md +77 -0
  214. package/assets/prompts/components/button.md +99 -0
  215. package/assets/prompts/components/callout.md +81 -0
  216. package/assets/prompts/components/chat-input.md +84 -0
  217. package/assets/prompts/components/checkbox.md +46 -0
  218. package/assets/prompts/components/chip.md +84 -0
  219. package/assets/prompts/components/choice-card.md +127 -0
  220. package/assets/prompts/components/context-menu.md +145 -0
  221. package/assets/prompts/components/date-picker.md +104 -0
  222. package/assets/prompts/components/drawer.md +152 -0
  223. package/assets/prompts/components/empty-state.md +69 -0
  224. package/assets/prompts/components/file-icon.md +73 -0
  225. package/assets/prompts/components/filter-button.md +42 -0
  226. package/assets/prompts/components/form-field.md +74 -0
  227. package/assets/prompts/components/gallery-item.md +158 -0
  228. package/assets/prompts/components/icon-button.md +82 -0
  229. package/assets/prompts/components/icon.md +68 -0
  230. package/assets/prompts/components/input.md +95 -0
  231. package/assets/prompts/components/list-item.md +235 -0
  232. package/assets/prompts/components/menu-item.md +234 -0
  233. package/assets/prompts/components/metric-card.md +132 -0
  234. package/assets/prompts/components/modal.md +131 -0
  235. package/assets/prompts/components/pagination.md +92 -0
  236. package/assets/prompts/components/progress-bar.md +61 -0
  237. package/assets/prompts/components/quotation-bar.md +39 -0
  238. package/assets/prompts/components/radio.md +41 -0
  239. package/assets/prompts/components/select.md +104 -0
  240. package/assets/prompts/components/selectable-card.md +67 -0
  241. package/assets/prompts/components/shortcut.md +76 -0
  242. package/assets/prompts/components/sidebar.md +107 -0
  243. package/assets/prompts/components/slider.md +89 -0
  244. package/assets/prompts/components/split-button.md +71 -0
  245. package/assets/prompts/components/stepper.md +93 -0
  246. package/assets/prompts/components/switch.md +86 -0
  247. package/assets/prompts/components/table-cell.md +87 -0
  248. package/assets/prompts/components/table-header.md +157 -0
  249. package/assets/prompts/components/table-row-edit.md +129 -0
  250. package/assets/prompts/components/table-row-select.md +82 -0
  251. package/assets/prompts/components/table-row.md +156 -0
  252. package/assets/prompts/components/tabs.md +122 -0
  253. package/assets/prompts/components/textarea.md +105 -0
  254. package/assets/prompts/components/toast.md +149 -0
  255. package/assets/prompts/components/tooltip.md +71 -0
  256. package/assets/prompts/components/topbar.md +148 -0
  257. package/assets/prompts/primitives/emerge.md +43 -0
  258. package/assets/prompts/primitives/fade.md +31 -0
  259. package/assets/prompts/primitives/scale.md +32 -0
  260. package/assets/prompts/primitives/scroll.md +75 -0
  261. package/assets/prompts/primitives/slide.md +31 -0
  262. package/assets/prompts/themes/_SCHEMA.md +135 -0
  263. package/assets/prompts/themes/_TEMPLATE.md +73 -0
  264. package/assets/prompts/themes/expressive.md +118 -0
  265. package/assets/prompts/themes/pure.md +87 -0
  266. package/assets/prompts/themes/spare.md +73 -0
  267. package/assets/prompts/tokens/breakpoint.md +29 -0
  268. package/assets/prompts/tokens/color.md +78 -0
  269. package/assets/prompts/tokens/radius.md +33 -0
  270. package/assets/prompts/tokens/shadow.md +35 -0
  271. package/assets/prompts/tokens/spacing.md +86 -0
  272. package/assets/prompts/tokens/typography.md +76 -0
  273. package/assets/prompts/tokens/z-index.md +35 -0
  274. package/assets/public/expressive.png +0 -0
  275. package/assets/public/pure.png +0 -0
  276. package/assets/public/spare.png +0 -0
  277. package/assets/skill/SKILL.md +36 -0
  278. package/bin/ctds.js +76 -0
  279. package/package.json +35 -4
  280. package/src/commands/init.js +215 -0
  281. package/src/commands/update.js +275 -0
  282. package/src/utils/assets.js +78 -0
  283. package/src/utils/deps.js +51 -0
  284. package/src/utils/detect.js +47 -0
  285. package/src/utils/diff.js +52 -0
  286. package/src/utils/hash.js +16 -0
  287. package/src/utils/log.js +41 -0
  288. package/src/utils/meta.js +73 -0
  289. package/src/utils/prompt.js +28 -0
@@ -0,0 +1,251 @@
1
+ # CTDS 프롬프트 작성 가이드
2
+
3
+ 이 문서는 **CTDS의 프롬프트 컨텍스트 문서(Layer 2)를 어떻게 쓸지**에 대한 규칙이다.
4
+ 축(Axis), 토큰(Token), 컴포넌트(Component), 모션 프리미티브(Primitive) 문서를 작성할 때
5
+ 이 가이드를 따른다.
6
+
7
+ ---
8
+
9
+ ## 0. 전제
10
+
11
+ 이 가이드는 [[PRINCIPLES]]의 전역 원칙을 이미 읽었다고 가정한다.
12
+ 특히 §1(값과 판단의 분리), §6(하드코딩 금지)는 모든 섹션 문서 작성의 대전제다.
13
+
14
+ ---
15
+
16
+ ## 1. 소비 주체
17
+
18
+ **1차 소비자는 AI다.** Claude/Cursor 등에 통째로 주입되거나 부분 인용된다.
19
+ 따라서:
20
+
21
+ - 밀도 높게 쓴다. 서론·에필로그 없음.
22
+ - 규칙은 명령형으로. "~하는 것이 좋습니다" ❌ → "~한다" ✅
23
+ - 예시는 규칙당 최대 1개. 반복 예시는 컨텍스트 낭비.
24
+ - Markdown 구조를 엄격히 따른다 (AI가 헤딩으로 섹션을 찾음).
25
+
26
+ 사람이 참고로 읽을 순 있지만, **사람이 읽기 편하려고 형식을 무너뜨리지 않는다.**
27
+
28
+ ---
29
+
30
+ ## 2. 공통 골격
31
+
32
+ 모든 섹션 문서는 아래 5개 헤딩을 **이 순서로, 빠짐없이** 갖는다.
33
+ 해당 사항이 없으면 헤딩 아래에 `N/A` 한 줄만 쓴다 (헤딩 자체를 생략하지 않는다).
34
+ 리스트 헤딩(`Do`, `Don't`, `관련`)에서도 불릿 없이 `N/A` 한 줄로 표시한다.
35
+
36
+ ```markdown
37
+ ## <섹션 이름>
38
+
39
+ ### 원칙
40
+ <1~2줄. 이 규칙이 왜 존재하는가.>
41
+
42
+ ### Do
43
+ - <명령형 규칙>
44
+ - <명령형 규칙>
45
+
46
+ ### Don't
47
+ - <하드 리젝 사유>
48
+
49
+ ### Fallback
50
+ <규칙이 애매할 때의 기본값. 없으면 "규칙대로 판단 불가한 경우 사용자에게 확인".>
51
+
52
+ ### 관련
53
+ - [[다른-섹션-이름]] — <왜 관련되는지 한 줄>
54
+ ```
55
+
56
+ **N/A 예시:**
57
+ ```markdown
58
+ ### Don't
59
+ N/A
60
+
61
+ ### 관련
62
+ N/A
63
+ ```
64
+
65
+ **왜 골격이 강제인가:**
66
+ - AI가 항상 같은 위치에서 정보를 찾을 수 있음
67
+ - 작성자가 "금지 규칙"을 빠뜨리지 않음 (빈칸이 눈에 띔)
68
+ - 크로스 참조가 왕복으로 성립함
69
+
70
+ ---
71
+
72
+ ## 3. 섹션 타입별 추가 항목
73
+
74
+ 공통 골격 뒤에 타입별 추가 섹션을 붙인다.
75
+
76
+ ### 3.1 축(Axis) — 예: Shape, Density, Motion
77
+
78
+ 공통 골격 다음에:
79
+
80
+ ```markdown
81
+ ### 값
82
+ - `<값1>` — <한 줄 설명>
83
+ - `<값2>` — <한 줄 설명>
84
+
85
+ ### 기본값
86
+ `<값>`
87
+
88
+ ### 페어링
89
+ - `<이 축의 값>` + `<다른 축의 값>` — <권장/비권장 및 이유>
90
+ ```
91
+
92
+ ### 3.2 토큰(Token) — 예: Spacing, Radius, Shadow
93
+
94
+ 공통 골격 다음에:
95
+
96
+ ```markdown
97
+ ### 토큰 표
98
+ | Token | 용도 |
99
+ |---|---|
100
+ | `<토큰명>` | <어디에 쓰는가 — 값이 아니라 용도> |
101
+ ```
102
+
103
+ 토큰 표에는 **값을 쓰지 않는다.** 값은 `PROJECT_OVERVIEW.md` 또는 실제 CSS에 있다.
104
+ 프롬프트에는 "언제 쓰는가"만 담는다.
105
+
106
+ **그룹핑 허용:** 한 문서에 여러 토큰 계열이 포함되면 굵은 텍스트 그룹 헤딩으로 표를 나눌 수 있다 (예: color.md의 `**표면**`, `**텍스트**`, `**브랜드**`). 그룹 헤딩은 `###` 헤딩을 쓰지 않는다 — 골격 순서를 흐리기 때문. 굵은 텍스트만 사용.
107
+
108
+ ### 3.3 컴포넌트(Component) — 예: Button, Modal, Table
109
+
110
+ 공통 골격 다음에:
111
+
112
+ ```markdown
113
+ ### Props 시그니처
114
+ ```tsx
115
+ <Component prop1="a | b | c" prop2={boolean} />
116
+ ```
117
+
118
+ ### Variant 매트릭스
119
+ | variant | 용도 | 금지 조합 |
120
+ |---|---|---|
121
+ | `<이름>` | <언제 쓰는가> | <어떤 축/prop과 못 씀> |
122
+
123
+ ### 조합 예시
124
+ <규칙을 종합한 최소 예시 1개. 코드 블록.>
125
+ ```
126
+
127
+ ### 3.4 모션 프리미티브(Primitive) — 예: fade, slide, scale
128
+
129
+ 공통 골격 다음에:
130
+
131
+ ```markdown
132
+ ### 축별 스왑
133
+ | data-motion | 파라미터 |
134
+ |---|---|
135
+ | `expressive` | <이 프리미티브에서 뭐가 바뀌는가> |
136
+ | `standard` | ... |
137
+ | `subtle` | ... |
138
+ | `none` | <보통 즉시 완료 또는 스킵> |
139
+
140
+ ### 겹침 규칙
141
+ <다른 프리미티브와 조합 가능 여부. 예: "fade와 scale만 조합 허용, 그 외 단독 사용.">
142
+ ```
143
+
144
+ ### 3.5 테마(Theme) — 예: spare, expressive
145
+
146
+ Theme은 **6개 축 preset 묶음 + 축 밖 산문 레이어**다. Palette / Hue / Voice는 Theme 바깥(같은 Theme × 다른 색·보이스 성립).
147
+ 공통 골격 다음에 아래 4블록을 **이 순서로** 붙인다. 자세한 스키마·셀프 체크리스트는 [[themes/_SCHEMA]].
148
+
149
+ ```markdown
150
+ ### Signature
151
+ 이 Theme IS ___. <비교 수사 1문장>
152
+
153
+ ### Preset
154
+ | Axis | Value | Why |
155
+ |---|---|---|
156
+ | [[axes/mode]] | `<값>` | <한 줄 이유> |
157
+ | ... | ... | ... | # Mode / Shape / Density / Font / Icon / Motion 6행
158
+
159
+ ### Layout / Imagery / Decoration / Negative
160
+ <수치 금지, 선호·태도만. Negative는 최소 3개. 없는 섹션은 N/A.>
161
+
162
+ ### Override / Known Gaps / Iteration Guide
163
+ <override는 전부 자유, 책임은 사용자. Known Gaps·Iteration Guide 의무.>
164
+ ```
165
+
166
+ ---
167
+
168
+ ## 4. 크로스 참조
169
+
170
+ 다른 섹션을 참조할 땐 `[[섹션-이름]]` 형식을 쓴다 (kebab-case).
171
+ `관련` 헤딩 외에도 본문에서 자유롭게 링크한다.
172
+
173
+ ```markdown
174
+ `crisp`은 데이터 밀도 높은 화면에 권장. [[axes/density]]가 `compact`일 때 특히 잘 맞음.
175
+ ```
176
+
177
+ **링크 원칙:**
178
+ - 참조는 `[[폴더/이름]]` 형식. 폴더 접두어로 타입을 명시한다 (`[[axes/density]]`, `[[tokens/spacing]]`, `[[components/button]]`, `[[primitives/fade]]`, `[[presets/gov-formal]]`).
179
+ - 최상위 문서(`GUIDE`, `PRINCIPLES`)는 폴더 없이 `[[PRINCIPLES]]`.
180
+ - URL이나 상대 경로(`../axes/density.md`)로 걸지 않는다 — 파일 구조가 바뀌면 다 깨진다.
181
+ - 아직 안 쓴 섹션도 링크 가능. 나중에 쓸 것의 표식이 된다.
182
+ - `관련` 섹션에 링크가 없어도 됨 (`N/A`). 단, 정말 다른 어떤 섹션과도 무관한지 재검토한다.
183
+
184
+ ---
185
+
186
+ ## 5. 파일 구조
187
+
188
+ ```
189
+ prompts/
190
+ ├── GUIDE.md # 이 문서
191
+ ├── PRINCIPLES.md # 전역 원칙 (모든 섹션의 상위 규칙)
192
+ ├── axes/
193
+ │ ├── mode.md
194
+ │ ├── palette.md
195
+ │ ├── hue.md
196
+ │ ├── shape.md
197
+ │ ├── icon.md
198
+ │ ├── density.md
199
+ │ ├── motion.md
200
+ │ ├── font.md
201
+ │ └── voice.md
202
+ ├── tokens/
203
+ │ ├── spacing.md
204
+ │ ├── radius.md
205
+ │ ├── typography.md
206
+ │ ├── color.md
207
+ │ ├── shadow.md
208
+ │ ├── z-index.md
209
+ │ └── breakpoint.md
210
+ ├── components/
211
+ │ ├── button.md
212
+ │ ├── input.md
213
+ │ └── ...
214
+ ├── primitives/ # 모션 프리미티브
215
+ │ ├── fade.md
216
+ │ ├── slide.md
217
+ │ └── ...
218
+ ├── themes/ # 6축 묶음 + 축 밖 산문 레이어 (Palette/Hue/Voice는 바깥)
219
+ │ ├── _SCHEMA.md
220
+ │ ├── _TEMPLATE.md
221
+ │ └── <theme-slug>.md
222
+ └── presets/
223
+ └── <preset-name>.md # 프리셋 정의 + 프리셋 특유의 판단 규칙
224
+ ```
225
+
226
+ **파일 하나 = 섹션 하나.** 여러 섹션을 한 파일에 묶지 않는다.
227
+ AI에 부분 주입할 때 파일 단위로 자르는 게 가장 안전하다.
228
+
229
+ ---
230
+
231
+ ## 6. 작성 순서 권장
232
+
233
+ 1. `PRINCIPLES.md` — 대전제(§0)와 전역 규칙
234
+ 2. `axes/` 전 9개 — 축이 컴포넌트 규칙의 전제가 됨
235
+ 3. `tokens/` 전 7개 — 토큰 이름을 컴포넌트가 참조함
236
+ 4. `primitives/` — 컴포넌트가 프리미티브를 참조함
237
+ 5. `components/` — 우선순위 컴포넌트부터
238
+ 6. `presets/` — 축 조합 확정 후
239
+
240
+ ---
241
+
242
+ ## 7. 셀프 체크리스트
243
+
244
+ 새 프롬프트 문서를 커밋하기 전에 확인:
245
+
246
+ - [ ] 공통 골격 5개 헤딩이 모두 있는가 (없으면 `N/A`)
247
+ - [ ] [[PRINCIPLES]] §6 하드코딩 금지 목록을 위반하지 않는가
248
+ - [ ] 규칙이 명령형인가
249
+ - [ ] 예시는 규칙당 1개 이하인가
250
+ - [ ] 섹션 타입별 추가 항목을 붙였는가
251
+ - [ ] `관련` 링크가 있거나, 없다면 진짜 독립적인지 재확인 (§4 참고)
@@ -0,0 +1,170 @@
1
+ # 컴포넌트 Override 체크리스트
2
+
3
+ CTDS 공통 컴포넌트(`web/components/<Name>/`)를 로컬에서 override·확장할 때 쓰는 문서.
4
+ 템플릿·페이지·앱 조립에서 "작은 수정인데 왜 안 먹지?"가 반복되는 걸 막는다.
5
+
6
+ 이 문서의 모든 규칙은 **override 전**에 통과해야 한다. 추측으로 CSS를 던지지 말고 체인을 먼저 특정한다.
7
+
8
+ ---
9
+
10
+ ## 0. 왜 이 문서가 필요한가
11
+
12
+ CTDS 공통 컴포넌트는 **여러 가정**을 깔고 설계돼 있다. 예:
13
+
14
+ - Sidebar `.profile`은 Sidebar Root의 `padding-inline: var(--space-4)`를 **음수 margin으로 상쇄**해서 hover 영역을 사이드바 끝까지 늘린다.
15
+ - MenuItem `.root`는 `position: relative`를 active일 때만 걸고, active bar를 `::before`로 그린다.
16
+ - Sidebar.Body는 `mask-image`로 상단 fade + `overflow-x: hidden`으로 음수 margin 삐져나감을 clip한다.
17
+
18
+ 이 가정들을 **모르고** 로컬에서 Root padding을 0으로 바꾸거나 `width: 100%`만 추가하면:
19
+
20
+ - Profile이 사이드바 바깥으로 삐져나가 오른쪽이 잘림
21
+ - active bar가 전혀 안 보임
22
+ - Body에 추가한 콘텐츠가 mask에 가려 사라짐
23
+
24
+ 이런 사고가 **매번 반복된다**. 아래 체크리스트가 그걸 끊는다.
25
+
26
+ ---
27
+
28
+ ## 1. Override 전 선행 체크 (하드룰)
29
+
30
+ ### 1-1. 공통 컴포넌트의 현재 CSS를 **파일로 읽어라**
31
+
32
+ 머리에 저장된 "원래 그랬던 모습"으로 override 금지. 세션 중에 사용자/린터가 수정했을 수 있다.
33
+
34
+ - 수정할 대상 컴포넌트 `<Name>.module.css`를 **Read 툴로 열어 현재 선언 전부 확인**
35
+ - 특히 **다음 속성들**이 걸려있는지 반드시 체크:
36
+ - `position` (`absolute`·`sticky`의 containing block 결정)
37
+ - `margin-inline` 음수 값 (상위 padding 상쇄 패턴)
38
+ - `padding-inline`
39
+ - `width`·`max-width`
40
+ - `overflow-x`·`overflow-y` (음수 margin / `::before` clip 여부)
41
+ - `mask-image` (콘텐츠 가림 여부)
42
+ - `border-radius` (full-bleed와 충돌)
43
+
44
+ ### 1-2. 사용자가 DOM·computed style·스크린샷을 주면 **범인 후보부터 특정하라**
45
+
46
+ ```
47
+ 사용자가 computed style 붙여줌 → 눈으로 훑고 "Footer padding 때문이겠지" 추측 금지
48
+ → computed style 안의 모든 선언을 범인 후보로 올림
49
+ → 하나씩 소거해서 진짜 범인 찾음 → 그제서야 수정
50
+ ```
51
+
52
+ 이번 세션 실제 사례:
53
+ - 사용자가 Profile computed style을 붙여줌 → `margin-inline: calc(var(--space-4) * -1)` 적혀있음
54
+ - 그걸 못 보고 Footer padding을 넣었다 뺐다 반복
55
+ - 결국 사용자가 "원복해"를 세 번 외친 뒤에야 원인 특정
56
+
57
+ ### 1-3. 요청의 **타겟 요소**를 상상으로 치환하지 마라
58
+
59
+ "좌우 여백 없애" → 어느 요소의? 어느 축의?
60
+ 사용자가 DOM을 가리키면 **그 DOM을 그대로** 수정 대상으로 삼는다.
61
+
62
+ - ❌ 사용자: `<div class="profile">` 가리키며 "여백 없애"
63
+ AI: Footer padding을 뺌 (엉뚱한 요소)
64
+ - ✅ 같은 요청
65
+ AI: `.profile`의 `margin-inline` 음수값을 확인하고 그걸 상쇄
66
+
67
+ ---
68
+
69
+ ## 2. 자주 틀리는 패턴 레시피
70
+
71
+ ### Case A. Hover 영역이 작아 보임 / 오른쪽만 잘려 보임
72
+
73
+ 증상: 아바타+텍스트까지만 hover 배경이 깔리고 사이드바 가장자리 빈 공간엔 반응 없음.
74
+
75
+ 범인 후보 (우선순위):
76
+ 1. **`.profile`의 `margin-inline` 음수값**이 상위 Root padding과 짝지어 있는데, **상위 padding을 0으로 바꿔** 음수 margin만 남아 overflow 발생 → `overflow-x: hidden`이 그걸 clip
77
+ 2. `width: auto`로 자식 크기만큼만 늘어남 → `width: 100%` 필요
78
+ 3. `border-radius`가 있어서 양쪽 끝이 둥글어 "안 꽉 찬" 느낌
79
+
80
+ 처방:
81
+ ```css
82
+ /* 상위 Root padding을 0으로 바꿨다면 음수 margin도 함께 0으로 */
83
+ .profile {
84
+ margin-inline: 0;
85
+ width: 100%;
86
+ /* 필요하면 자체 padding으로 내부 들여쓰기 */
87
+ padding-inline: var(--space-4);
88
+ border-radius: 0; /* full-bleed일 땐 각지게 */
89
+ }
90
+ ```
91
+
92
+ ### Case B. Full-bleed가 안 됨 (음수 margin으로 뚫어도)
93
+
94
+ 증상: `.item`에 `margin-inline: -16px`를 걸었는데 사이드바 가장자리까지 안 가고 중간에 잘림.
95
+
96
+ 범인 후보:
97
+ 1. 상위 **스크롤 컨테이너의 `overflow-x: hidden`** — 음수 margin이 그 경계에서 clip
98
+ 2. 상위에 걸린 **`mask-image`** — 가장자리 콘텐츠가 fade로 사라짐
99
+ 3. 상위의 **`padding-inline`이 음수 margin보다 작음** — 음수가 모자람
100
+
101
+ 처방: full-bleed가 필요한 섹션(Divider·Profile·메뉴 리스트)은 **스크롤 컨테이너 밖**(Header/Footer)으로 뺀다. 못 빼면 **상위의 padding을 로컬 override로 0으로 두고** 자식에 자체 padding을 넣는다.
102
+
103
+ ### Case C. Active 스타일이 안 먹음
104
+
105
+ 증상: `active activeStyle="accent-bar"`를 넘겼는데 좌측 bar가 안 나오고 hover 배경(fill)만 보임.
106
+
107
+ 범인 후보:
108
+ 1. **wrapper 컴포넌트(`Sidebar.Item`, `Menu.Item` 등)가 `activeStyle` prop을 통과시키지 않음** → MenuItem까지 전달 안 됨
109
+ 2. CSS 변수 `--menu-active-fg`가 **투명 색**으로 떨어져 bar는 그려졌지만 안 보임
110
+ 3. `::before` containing block의 `position: relative`가 사라져 bar가 엉뚱한 좌표에 그려짐
111
+
112
+ 처방: wrapper를 거치지 말고 **MenuItem을 직접 사용**하거나, wrapper에 `activeStyle` 전달 로직을 추가. 색은 `.nav { --menu-active-fg: var(--primary); }`로 명시.
113
+
114
+ ### Case D. Body에 넣은 콘텐츠(Header 역할)가 스크롤에 묻힘
115
+
116
+ 증상: Sidebar.Body에 Profile/divider를 넣었더니 메뉴 스크롤 따라 올라가 사라짐.
117
+
118
+ 범인 후보: Sidebar.Body는 **스크롤 영역**이다. 거기 넣은 콘텐츠는 당연히 스크롤됨.
119
+
120
+ 처방: 고정이 필요한 섹션(Brand/Profile/divider 모두)은 **Sidebar.Header 안에 몰아넣고** flex column으로 세로 스택. Body엔 스크롤될 메뉴만.
121
+
122
+ ### Case E. Mask에 콘텐츠 첫/마지막 아이템이 잘림
123
+
124
+ 증상: Body 상단 `mask-image: linear-gradient(transparent 0, black --space-3, ...)` 때문에 첫 메뉴 아이템 윗부분이 fade로 반쯤 가려짐.
125
+
126
+ 처방: Body에 **mask 투명 구간과 같은 양의 padding**(`padding-top: var(--space-3)`)을 넣어 콘텐츠를 fade 구간 아래로 밀어낸다. mask 자체는 유지 — 스크롤 시 fade 효과는 그대로.
127
+
128
+ ### Case F. 사이즈 override했는데 과하게 커짐
129
+
130
+ 증상: "메뉴 아이템 세로 좀 늘려" → `min-height: calc(--control-h-lg + --space-3)` → 너무 큼.
131
+
132
+ 처방: 공통 컴포넌트의 **원래 size별 값**을 먼저 확인. CTDS는 size 토큰(`sm`/`md`/`lg`)이 이미 있고 각각 `--menu-item-h-*`를 쓴다. 원래 값 + 작은 증분(`--space-1` 수준)으로 시작, 사용자 반응 보고 조정.
133
+
134
+ ### Case G. 왕복 수정 (넣었다 뺐다 반복)
135
+
136
+ 증상: Footer padding을 넣고 → 사용자 "오른쪽 잘림" → 뺐다 → 사용자 "안 됨" → 넣었다 …
137
+
138
+ 처방: **왕복하기 전에 체인을 끝까지 추적**. 같은 요소에서 2번 왕복이면 멈추고, 1-1·1-2를 다시 수행. 어디가 범인인지 특정될 때까지 CSS 수정 금지.
139
+
140
+ ---
141
+
142
+ ## 3. 사용자가 "원복"을 요청하면
143
+
144
+ - 어떤 변경을 원복할지 **범위를 먼저 복창**하고 확인받는다 (한 줄? 섹션? 전체?)
145
+ - 원복 범위를 또 잘못 잡으면 사용자 분노 2배
146
+
147
+ ---
148
+
149
+ ## 4. 사용자가 "건들지 마"라고 명시한 영역
150
+
151
+ - 디자인·사이즈·텍스트·아이콘 등 **명시적으로 유지하라고 한 것**은 다른 수정의 사이드이펙트로도 바꾸지 않는다
152
+ - "메뉴만 늘려"에 아이콘·텍스트를 임의로 바꾸는 식의 넘겨짚기 금지
153
+
154
+ ---
155
+
156
+ ## 5. 디버깅 플로우 (요약)
157
+
158
+ ```
159
+ 증상 접수
160
+ ↓
161
+ 공통 컴포넌트 .module.css Read ← 1-1
162
+ ↓
163
+ 사용자가 준 DOM/computed style 전부 훑기 ← 1-2
164
+ ↓
165
+ 범인 후보 리스트업 (position, margin-inline, overflow, mask, radius, width)
166
+ ↓
167
+ 한 번에 한 줄만 수정, 사용자 확인
168
+ ↓
169
+ 안 되면 1-1로 돌아가서 다른 범인 특정 ← 왕복 금지, 체인 재추적
170
+ ```
@@ -0,0 +1,130 @@
1
+ # CTDS 전역 원칙
2
+
3
+ 모든 CTDS 프롬프트 문서(축·토큰·컴포넌트·프리미티브·프리셋)의 상위 규칙.
4
+ 개별 섹션 문서는 이 원칙을 다시 쓰지 않는다. 충돌 시 이 문서가 우선한다.
5
+
6
+ > **컴포넌트를 override·수정하기 전에 반드시 [OVERRIDE.md](./OVERRIDE.md)의 선행 체크리스트를 통과할 것.**
7
+ > 공통 컴포넌트에 이미 걸린 선언을 모른 채 로컬에서 덮으면 "이상한 지점에서 잘림·안 먹힘·오버플로우"가 반복된다.
8
+
9
+ ---
10
+
11
+ ## 1. 값과 판단의 분리
12
+
13
+ **토큰은 값을, 프롬프트는 판단을 담는다.**
14
+
15
+ - CSS 변수로 스왑되는 것: 프롬프트에 쓰지 않는다.
16
+ - AI가 "어떤 컴포넌트를 골라 어떻게 배치할지" 판단할 때 필요한 규칙: 프롬프트에 쓴다.
17
+
18
+ 프롬프트에 등장 가능한 것: 토큰 이름(`space-6`), 축 이름(`density`), 축 값(`compact`), 컴포넌트 이름(`Button`), variant 이름(`primary`).
19
+ 프롬프트에 등장 금지: 픽셀 값, 밀리초, 색상 hex/oklch 값, 폰트 이름.
20
+
21
+ ---
22
+
23
+ ## 2. 축을 먼저 존중한다
24
+
25
+ CTDS는 9개 축(Mode, Palette, Hue, Shape, Icon, Density, Motion, Font, Voice)으로 테마가 정의된다.
26
+ 컴포넌트나 페이지를 만들 때, 먼저 **현재 축 값이 뭔지 확인**하고 그에 맞는 선택을 한다.
27
+
28
+ - 축 값을 무시한 하드코딩 금지 (예: density와 무관하게 항상 3열 그리드)
29
+ - 축 값에 따라 **컴포넌트 선택 자체가 바뀔 수 있음** (예: `density=comfortable`이면 테이블 대신 카드)
30
+ - 축 값을 알 수 없으면 프리셋 기본값 또는 `default` 값으로 가정
31
+
32
+ ---
33
+
34
+ ## 3. 프리셋은 시작점, 축은 오버라이드
35
+
36
+ 프리셋(`gov-formal`, `startup-vivid` 등)은 9축 중 Theme이 묶는 6축(Mode/Shape/Icon/Density/Motion/Font)의 검증된 조합이다. Palette·Hue·Voice는 프리셋 밖에서 자유 선택.
37
+ 사용자가 "gov-formal에서 shape만 soft로"처럼 지시하면, **프리셋을 기준으로 축을 부분 오버라이드**한다.
38
+
39
+ - 프리셋 이름이 있으면 그것으로 시작
40
+ - 개별 축 지시가 있으면 해당 축만 덮어씀
41
+ - 나머지 축은 프리셋 값 유지
42
+
43
+ ---
44
+
45
+ ## 4. 충돌 시 우선순위
46
+
47
+ 여러 프롬프트 문서가 동시에 로드되어 규칙이 충돌할 때, 아래 순서로 위쪽이 이긴다.
48
+
49
+ 1. **접근성 규칙** (§5 참고. `prefers-reduced-motion`, WCAG, 포커스)
50
+ 2. **PRINCIPLES** (이 문서)
51
+ 3. **컴포넌트별 `Don't`** (해당 컴포넌트 문서의 하드 리젝 규칙)
52
+ 4. **축별 규칙** (Axis 문서의 Do/Don't)
53
+ 5. **프리셋 기본값** (Preset 문서)
54
+ 6. **사용자 지시** (프롬프트로 들어온 요청)
55
+
56
+ **해석 원칙:**
57
+ - 상위 규칙이 하위 규칙을 명시적으로 허용하는 경우엔 하위가 유효 (예: PRINCIPLES가 "축이 허용하는 예외"를 인정할 때)
58
+ - 사용자 지시가 접근성이나 PRINCIPLES를 어기려 할 땐 따르지 않고 사용자에게 확인 (§8 참고)
59
+ - 같은 계층 내 충돌은 §8에 따라 사용자에게 확인
60
+
61
+ ---
62
+
63
+ ## 5. 접근성이 축보다 우선한다
64
+
65
+ - `prefers-reduced-motion: reduce` → `motion=none` 강제. Motion 축 설정을 무시한다.
66
+ - 색상 대비: `mode=high-contrast` 외에도 WCAG AA 미달 조합은 만들지 않는다.
67
+ - 키보드 포커스: 모든 인터랙티브 컴포넌트는 `ring` 토큰으로 포커스 표시.
68
+
69
+ 접근성 규칙과 축 규칙이 충돌하면 접근성이 이긴다.
70
+
71
+ ---
72
+
73
+ ## 6. 하드코딩 금지
74
+
75
+ 컴포넌트/템플릿 코드에서 다음은 하드코딩 금지 (프롬프트에서 이런 코드를 생성하지 않는다):
76
+
77
+ - 색상값 (hex, rgb, oklch 리터럴)
78
+ - 크기값 (px, rem, em) — 단, 1px border, 100% 등 구조적 값은 예외
79
+ - 시간값 (ms, s)
80
+ - 그림자 리터럴 (`box-shadow: 0 4px 12px ...`)
81
+ - 폰트 이름
82
+
83
+ 모두 토큰 또는 CSS 변수를 경유한다. 하드코딩된 코드는 리뷰에서 거절한다.
84
+
85
+ **예외:** 축·프리미티브 문서의 "값" 또는 "축별 스왑" 표는 스펙 자체가 값이므로 허용된다.
86
+ 예: Motion 축의 `expressive/standard/subtle/none`이 각각 어떤 duration/scale로 스왑되는지 명시하는 표.
87
+ 이 값들은 CSS 변수 정의의 원본이지, 컴포넌트 코드에 하드코딩되는 리터럴이 아니다.
88
+ 컴포넌트나 템플릿 코드에서 이 값을 리터럴로 쓰는 것은 여전히 금지.
89
+
90
+ **예외:** `Don't` 섹션에서 **부정 예시**로 리터럴을 인용하는 것은 허용된다.
91
+ 예: "`#fff` 직접 지정 금지", "`font-family: "Pretendard"` 하드코딩 금지", "임의 정수(`9999` 등) 금지".
92
+ "이렇게 쓰지 마"를 보여주기 위한 인용이므로 리터럴 생성이 아니다.
93
+ 단, 인용은 규칙당 1개로 최소화한다.
94
+
95
+ ## 6a. 유령 토큰 금지
96
+
97
+ 존재하지 않는 CSS 변수를 참조하는 것은 하드코딩보다 **더 위험하다** — 폴백 없이 `var(--없는-이름)`을 쓰면 브라우저가 상속된 base로 조용히 렌더해 사이즈·간격·색이 어긋나지만 **에러는 안 난다**. 그래서 리뷰에서도 쉽게 놓친다.
98
+
99
+ **규칙:** 각 토큰 문서의 "CSS 변수 whitelist"에 명시된 이름만 사용. 흔한 유령 접두어 — `--font-size-*`(실제는 `--text-*`), `--text-size-*`, `--fs-*`, `--spacing-*`(실제는 `--space-*`), `--duration-*` 외 임의 motion 이름.
100
+
101
+ **새 토큰이 필요하면:** 쓰지 말고, 먼저 토큰 문서와 globals.css에 정식 추가. 추측해서 쓰지 않는다.
102
+
103
+ ---
104
+
105
+ ## 7. 조합의 완성도 보증 범위
106
+
107
+ - **프리셋 조합**: 시각적 완성도 공식 보증
108
+ - **비프리셋 조합**: 동작은 하지만 완성도 미보증 — AI가 이런 조합으로 화면을 만들 땐 "비프리셋 조합입니다"를 사용자에게 알림
109
+ - **금지 조합**: 각 축·컴포넌트 문서의 `Don't`에 명시된 것 — 만들지 않는다
110
+
111
+ ---
112
+
113
+ ## 8. 애매할 때는 물어본다
114
+
115
+ 프롬프트 규칙만으로 판단이 안 서면 임의 결정하지 않고 사용자에게 확인한다.
116
+ 특히:
117
+
118
+ - 두 축 값 사이에서 어느 쪽 규칙을 우선할지 불명확할 때
119
+ - 컴포넌트 선택지가 여러 개이고 각각의 근거가 비슷할 때
120
+ - 프리셋이 지정되지 않았고 축 값도 부분적으로만 주어졌을 때
121
+
122
+ 임의 판단으로 만든 화면은 재작업 비용이 크다. 확인 비용이 항상 더 싸다.
123
+
124
+ ---
125
+
126
+ ## 9. 언어
127
+
128
+ - 프롬프트 문서는 한국어로 쓴다 (팀 언어).
129
+ - 코드 식별자·토큰명·축명은 영어 (`space-6`, `data-density="compact"`).
130
+ - 컴포넌트가 화면에 표시하는 문구는 프로젝트별 `data-lang`을 따른다 — CTDS 프롬프트에는 화면 문구를 하드코딩하지 않는다.
@@ -0,0 +1,38 @@
1
+ # Density
2
+
3
+ ### 원칙
4
+ 정보 밀도를 결정. `--space-scale`은 spacing·컨트롤 높이를, `--font-scale`은 폰트 사이즈 스케일을 연쇄 스왑.
5
+ 폰트 스케일은 위계를 흔들지 않도록 spacing보다 좁은 폭으로 조절한다 (0.95× / 1× / 1.05×).
6
+
7
+ ### Do
8
+ - 데이터 테이블·관리 도구는 `compact`. 정보량이 승부.
9
+ - 태블릿·터치 인터페이스는 `comfortable`. hitbox 확보.
10
+ - Density가 바뀌면 컴포넌트 선택 자체가 바뀔 수 있음. 예: `comfortable`이면 폼 필드 한 줄 2개 이하.
11
+
12
+ ### Don't
13
+ - Density를 무시하고 항상 같은 그리드/한 줄 필드 수를 강제하지 않는다.
14
+ - 컨트롤 높이(`--control-h-*`)를 하드코딩하지 않는다.
15
+ - 폰트 스케일 폭을 spacing과 같은 비율(0.85×/1.15×)로 넓히지 않는다 — 위계·가독성 붕괴.
16
+
17
+ ### Fallback
18
+ `default`
19
+
20
+ ### 값
21
+ | Density | `--space-scale` | `--font-scale` | 용도 |
22
+ |---|---|---|---|
23
+ | `compact` | 0.85× | 0.95× | 관리 도구·데이터 테이블. Excel 대체 UI. |
24
+ | `default` | 1× | 1× | 일반 웹 UI. |
25
+ | `comfortable` | 1.15× | 1.05× | 태블릿·터치·콘텐츠 중심. |
26
+
27
+ ### 기본값
28
+ `default`
29
+
30
+ ### 페어링
31
+ - `compact` + [[axes/shape]] `crisp` — 데이터 밀도 화면 표준 조합
32
+ - `compact` + [[axes/motion]] `calm` — 밀도 높을수록 모션 이동 거리도 축소돼야 어색하지 않음
33
+ - `comfortable` + [[axes/shape]] `soft` — 태블릿·터치·콘텐츠 중심에 자연스러움
34
+ - `comfortable` + [[axes/motion]] `bouncy` — 여유 있는 화면에서 표현력 있는 모션 가능
35
+
36
+ ### 관련
37
+ - [[tokens/spacing]] — Density가 스왑하는 spacing 토큰
38
+ - [[tokens/typography]] — Density가 `--font-scale`로 사이즈 스케일 연동 (line-height는 스케일에 포함되어 함께 조절, weight·letter-spacing은 불변)
@@ -0,0 +1,36 @@
1
+ # Font
2
+
3
+ ### 원칙
4
+ **의미 기반 슬롯**으로 관리. 컴포넌트는 슬롯(`--font-normal/code`)만 참조.
5
+ Language 축이 슬롯의 스택을 언어별로 스왑한다.
6
+
7
+ 특별 요구가 없으면 **한 폰트만 사용**한다 — 본문·헤딩·강조 전부 `--font-normal`.
8
+ 포인트/세리프 이중 폰트 체계는 사용하지 않는다.
9
+
10
+ ### Do
11
+ - 본문·헤딩·강조는 `--font-normal`, 코드·숫자 정렬은 `--font-code`.
12
+ - 위계는 size/weight/color로만 만든다 (font-family 스왑 아님).
13
+ - 프로젝트에서 새 폰트를 쓰고 싶으면 슬롯 매핑을 갈아끼운다 (컴포넌트 코드 안 건드림).
14
+ - `html.lang`을 `data-lang`과 동기화한다 (스크린 리더 정확도).
15
+
16
+ ### Don't
17
+ - `font-family: "Pretendard", ...`처럼 폰트 이름 하드코딩 금지.
18
+ - 헤딩·hero·인용문을 "예쁘게 하려고" 세리프/명조로 바꾸지 않는다.
19
+ - 컴포넌트가 특정 폰트 특성(예: 세리프)에 의존하는 레이아웃 만들지 않는다.
20
+
21
+ ### Fallback
22
+ `lang=ko`
23
+
24
+ ### 값
25
+
26
+ **Language** (`data-lang`) — 슬롯의 폰트 스택을 언어별로 스왑
27
+ - `ko` · `en` · `ja` · `zh`
28
+
29
+ ### 기본값
30
+ `lang=ko`
31
+
32
+ ### 페어링
33
+ - Language는 다른 축과 독립적 (한 프로젝트가 여러 언어 동시 지원해도 다른 축은 그대로)
34
+
35
+ ### 관련
36
+ - [[tokens/typography]] — 사이즈·라인하이트·웨이트 토큰
@@ -0,0 +1,36 @@
1
+ # Hue
2
+
3
+ ### 원칙
4
+ 브랜드 컬러의 **색상**을 결정. 프리셋 이름으로 시작하고 필요 시 다이얼(0~360°)로 미세조정.
5
+ `--hue` CSS 변수 하나가 primary·ring·chart 계열 hue를 동시 결정 — CTDS는 "한 프로젝트 = 한 hue, 한 브랜드 색"이 원칙.
6
+
7
+ ### Do
8
+ - 프리셋 이름(`ocean`, `forest` 등)을 우선 사용. AI 지시도 이름이 명확.
9
+ - 다이얼은 프리셋과 조금 다른 브랜드 컬러가 필요할 때만.
10
+
11
+ ### Don't
12
+ - 컴포넌트마다 개별 hue를 쓰지 않는다. 한 프로젝트 = 한 hue.
13
+ - Chart 팔레트를 hue와 별개로 재정의하지 않는다 (Chart는 hue 기준 자동 분산).
14
+
15
+ ### Fallback
16
+ `ocean` (210°)
17
+
18
+ ### 값
19
+ - `ocean` (210°) — 신뢰. 금융·공공.
20
+ - `forest` (145°) — 안정. 헬스케어.
21
+ - `sunset` (25°) — 활력. 스타트업·이커머스.
22
+ - `lavender` (280°) — 창의. 교육·문화.
23
+ - `crimson` (355°) — 강조. 프로모션.
24
+ - `slate` (260°, 낮은 chroma) — 무채색 계열. 관리 도구.
25
+
26
+ ### 기본값
27
+ `ocean`
28
+
29
+ ### 페어링
30
+ - `ocean`·`forest`·`slate` + [[axes/palette]] `calm` — 차분한 브랜드 인상
31
+ - `sunset`·`crimson` + [[axes/palette]] `vivid` — 강한 강조
32
+ - `lavender` + [[axes/palette]] `pastel` — 부드러움
33
+ - `slate`는 낮은 chroma가 특성 — [[axes/palette]] `vivid`와 조합 시 원래 강도가 안 나옴 (비권장)
34
+
35
+ ### 관련
36
+ - [[axes/palette]] — chroma·lightness와 결합해 최종 색 생성