@design-ai/cli 4.55.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 (529) hide show
  1. package/.claude-plugin/plugin.json +164 -0
  2. package/AGENTS.ko.md +126 -0
  3. package/AGENTS.md +182 -0
  4. package/CHANGELOG.md +6883 -0
  5. package/CLAUDE.md +39 -0
  6. package/LICENSE +21 -0
  7. package/README.ko.md +245 -0
  8. package/README.md +277 -0
  9. package/agents/README.md +14 -0
  10. package/agents/a11y-reviewer.md +121 -0
  11. package/agents/component-architect.md +57 -0
  12. package/agents/design-critic.md +46 -0
  13. package/agents/token-extractor.md +63 -0
  14. package/cli/bin/design-ai-mcp.mjs +6 -0
  15. package/cli/bin/design-ai.mjs +40 -0
  16. package/cli/commands/audit.mjs +111 -0
  17. package/cli/commands/check.mjs +226 -0
  18. package/cli/commands/doctor.mjs +141 -0
  19. package/cli/commands/examples.mjs +58 -0
  20. package/cli/commands/help.mjs +271 -0
  21. package/cli/commands/install.mjs +161 -0
  22. package/cli/commands/learn.mjs +1871 -0
  23. package/cli/commands/list.mjs +143 -0
  24. package/cli/commands/mcp.mjs +27 -0
  25. package/cli/commands/pack.mjs +211 -0
  26. package/cli/commands/prompt.mjs +199 -0
  27. package/cli/commands/route.mjs +247 -0
  28. package/cli/commands/search.mjs +60 -0
  29. package/cli/commands/show.mjs +52 -0
  30. package/cli/commands/site.mjs +558 -0
  31. package/cli/commands/status.mjs +161 -0
  32. package/cli/commands/uninstall.mjs +119 -0
  33. package/cli/commands/update.mjs +184 -0
  34. package/cli/commands/version.mjs +94 -0
  35. package/cli/commands/workspace.mjs +176 -0
  36. package/cli/lib/brief.mjs +52 -0
  37. package/cli/lib/check.mjs +642 -0
  38. package/cli/lib/dispatch.mjs +109 -0
  39. package/cli/lib/doctor.mjs +505 -0
  40. package/cli/lib/examples.mjs +258 -0
  41. package/cli/lib/exec.mjs +63 -0
  42. package/cli/lib/help-flags.mjs +5 -0
  43. package/cli/lib/learn.mjs +3694 -0
  44. package/cli/lib/log.mjs +47 -0
  45. package/cli/lib/mcp-server.mjs +426 -0
  46. package/cli/lib/output.mjs +101 -0
  47. package/cli/lib/pack.mjs +599 -0
  48. package/cli/lib/paths.mjs +63 -0
  49. package/cli/lib/prompt.mjs +603 -0
  50. package/cli/lib/route.mjs +740 -0
  51. package/cli/lib/search.mjs +158 -0
  52. package/cli/lib/show.mjs +161 -0
  53. package/cli/lib/signals.mjs +2337 -0
  54. package/cli/lib/site.mjs +6617 -0
  55. package/cli/lib/skill-proposals.mjs +2046 -0
  56. package/cli/lib/suggest.mjs +66 -0
  57. package/cli/lib/workspace.mjs +1056 -0
  58. package/commands/README.md +25 -0
  59. package/commands/component-spec.md +34 -0
  60. package/commands/conversational.md +44 -0
  61. package/commands/design-from-brief.md +141 -0
  62. package/commands/design-review.md +62 -0
  63. package/commands/document-from-brief.md +47 -0
  64. package/commands/extract-tokens.md +38 -0
  65. package/commands/game-ui.md +40 -0
  66. package/commands/illustration.md +37 -0
  67. package/commands/iterate.md +167 -0
  68. package/commands/motion-design.md +54 -0
  69. package/commands/palette-from-brand.md +50 -0
  70. package/commands/print.md +49 -0
  71. package/commands/slide-deck.md +46 -0
  72. package/commands/spatial.md +47 -0
  73. package/commands/stability-review.md +74 -0
  74. package/commands/video.md +42 -0
  75. package/commands/website-improvement.md +77 -0
  76. package/docs/AGENT-DEVELOPMENT.md +658 -0
  77. package/docs/AI-LEARNING.md +429 -0
  78. package/docs/AIDER-INTEGRATION.md +224 -0
  79. package/docs/ARCHITECTURE.ko.md +183 -0
  80. package/docs/ARCHITECTURE.md +105 -0
  81. package/docs/CODEX-INTEGRATION.md +311 -0
  82. package/docs/COMPANY-WEBSITE-DOGFOOD.ko.md +144 -0
  83. package/docs/COMPANY-WEBSITE-DOGFOOD.md +150 -0
  84. package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.ko.md +153 -0
  85. package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.md +154 -0
  86. package/docs/CONTRIBUTING.ko.md +203 -0
  87. package/docs/CONTRIBUTING.md +242 -0
  88. package/docs/CURSOR-INTEGRATION.md +220 -0
  89. package/docs/DISTRIBUTION.ko.md +248 -0
  90. package/docs/DISTRIBUTION.md +253 -0
  91. package/docs/DOGFOOD-FINDINGS.md +180 -0
  92. package/docs/DOGFOOD-V4-FINDINGS.md +139 -0
  93. package/docs/DOGFOOD-V4-MKDOCS-FINDINGS.md +233 -0
  94. package/docs/DOGFOOD-V4-NPM-FINDINGS.md +157 -0
  95. package/docs/DOGFOOD-V4-VSCODE-FINDINGS.md +135 -0
  96. package/docs/FIGMA-INTEGRATION.md +222 -0
  97. package/docs/MCP-INTEGRATION.md +243 -0
  98. package/docs/MIGRATION-v4.md +121 -0
  99. package/docs/PLUGIN-PACKAGING.md +240 -0
  100. package/docs/PRODUCT-READINESS.md +66 -0
  101. package/docs/QUICKSTART.ko.md +178 -0
  102. package/docs/QUICKSTART.md +179 -0
  103. package/docs/RELEASE-CHECKLIST.md +292 -0
  104. package/docs/ROADMAP.md +19495 -0
  105. package/docs/SESSION-LOG.md +940 -0
  106. package/docs/TOKEN-SYNC.md +237 -0
  107. package/docs/USING.ko.md +206 -0
  108. package/docs/USING.md +218 -0
  109. package/docs/WEBSITE-IMPROVEMENT.ko.md +75 -0
  110. package/docs/WEBSITE-IMPROVEMENT.md +89 -0
  111. package/docs/announcements/README.md +56 -0
  112. package/docs/announcements/dev-to-korea.md +206 -0
  113. package/docs/announcements/hashnode-post.ko.md +232 -0
  114. package/docs/announcements/okky-post.ko.md +158 -0
  115. package/docs/announcements/press-kit.md +101 -0
  116. package/docs/announcements/reddit-r-korea.md +196 -0
  117. package/docs/announcements/show-hn.md +114 -0
  118. package/docs/announcements/twitter-thread.md +255 -0
  119. package/docs/external-status.md +34 -0
  120. package/docs/integrations/aider-walkthrough.ko.md +275 -0
  121. package/docs/integrations/aider-walkthrough.md +274 -0
  122. package/docs/integrations/codex-walkthrough.ko.md +297 -0
  123. package/docs/integrations/codex-walkthrough.md +297 -0
  124. package/docs/integrations/cursor-walkthrough.ko.md +281 -0
  125. package/docs/integrations/cursor-walkthrough.md +284 -0
  126. package/docs/integrations/design-ai-mcp-server.md +169 -0
  127. package/docs/integrations/figma-mcp.md +149 -0
  128. package/docs/integrations/github-mcp.md +178 -0
  129. package/docs/integrations/linear-mcp.md +215 -0
  130. package/docs/integrations/notion-mcp.md +174 -0
  131. package/docs/integrations/sdk-walkthrough.ko.md +375 -0
  132. package/docs/integrations/sdk-walkthrough.md +375 -0
  133. package/docs/integrations/slack-mcp.md +208 -0
  134. package/docs/integrations/vscode-walkthrough.ko.md +202 -0
  135. package/docs/integrations/vscode-walkthrough.md +205 -0
  136. package/docs/requirements.txt +16 -0
  137. package/docs/site-overrides/extra.css +83 -0
  138. package/docs/site-overrides/favicon.svg +4 -0
  139. package/docs/site-overrides/logo.svg +10 -0
  140. package/docs/site-overrides/main.html +18 -0
  141. package/docs/website-console/app.js +2540 -0
  142. package/docs/website-console/index.html +24 -0
  143. package/docs/website-console/styles.css +975 -0
  144. package/examples/README.md +252 -0
  145. package/examples/cases/dogfood-v4-korean-hr-onboarding.md +356 -0
  146. package/examples/component-accordion-actions.md +153 -0
  147. package/examples/component-accordion-details.md +147 -0
  148. package/examples/component-accordion-summary.md +180 -0
  149. package/examples/component-accordion.md +229 -0
  150. package/examples/component-account-card.md +284 -0
  151. package/examples/component-address-input.md +260 -0
  152. package/examples/component-affix.md +190 -0
  153. package/examples/component-alert-dialog.md +210 -0
  154. package/examples/component-alert-title.md +77 -0
  155. package/examples/component-alert.md +192 -0
  156. package/examples/component-amount-input.md +278 -0
  157. package/examples/component-anchor.md +198 -0
  158. package/examples/component-app-bar.md +249 -0
  159. package/examples/component-aspect-ratio.md +156 -0
  160. package/examples/component-auto-complete.md +199 -0
  161. package/examples/component-avatar-group.md +170 -0
  162. package/examples/component-avatar.md +191 -0
  163. package/examples/component-back-top.md +123 -0
  164. package/examples/component-backdrop.md +148 -0
  165. package/examples/component-badge.md +181 -0
  166. package/examples/component-banner.md +237 -0
  167. package/examples/component-biometric-gate.md +281 -0
  168. package/examples/component-blockquote.md +153 -0
  169. package/examples/component-border-beam.md +207 -0
  170. package/examples/component-bottom-navigation.md +226 -0
  171. package/examples/component-box.md +112 -0
  172. package/examples/component-breadcrumb.md +222 -0
  173. package/examples/component-button-base.md +190 -0
  174. package/examples/component-button-group.md +117 -0
  175. package/examples/component-button.md +213 -0
  176. package/examples/component-calendar.md +280 -0
  177. package/examples/component-callout.md +131 -0
  178. package/examples/component-card-actions.md +101 -0
  179. package/examples/component-card-content.md +90 -0
  180. package/examples/component-card-header.md +122 -0
  181. package/examples/component-card-media.md +79 -0
  182. package/examples/component-card.md +233 -0
  183. package/examples/component-carousel.md +266 -0
  184. package/examples/component-cascader.md +135 -0
  185. package/examples/component-category-picker.md +271 -0
  186. package/examples/component-chart.md +237 -0
  187. package/examples/component-chat-interface.md +399 -0
  188. package/examples/component-checkbox.md +149 -0
  189. package/examples/component-click-away-listener.md +87 -0
  190. package/examples/component-code.md +213 -0
  191. package/examples/component-collapsible.md +219 -0
  192. package/examples/component-color-picker.md +110 -0
  193. package/examples/component-combobox.md +267 -0
  194. package/examples/component-command.md +299 -0
  195. package/examples/component-config-provider.md +190 -0
  196. package/examples/component-context-menu.md +179 -0
  197. package/examples/component-css-baseline.md +148 -0
  198. package/examples/component-date-picker.md +249 -0
  199. package/examples/component-descriptions.md +242 -0
  200. package/examples/component-dialog-actions.md +111 -0
  201. package/examples/component-dialog-content-text.md +76 -0
  202. package/examples/component-dialog-content.md +105 -0
  203. package/examples/component-dialog-title.md +104 -0
  204. package/examples/component-dialog.md +176 -0
  205. package/examples/component-divider.md +182 -0
  206. package/examples/component-doc-page.md +217 -0
  207. package/examples/component-drawer.md +257 -0
  208. package/examples/component-dropdown.md +220 -0
  209. package/examples/component-email-layout.md +253 -0
  210. package/examples/component-empty-state.md +269 -0
  211. package/examples/component-empty.md +172 -0
  212. package/examples/component-fade.md +87 -0
  213. package/examples/component-feature-grid.md +201 -0
  214. package/examples/component-field.md +266 -0
  215. package/examples/component-filled-input.md +114 -0
  216. package/examples/component-flex.md +117 -0
  217. package/examples/component-float-button.md +214 -0
  218. package/examples/component-form-control-label.md +134 -0
  219. package/examples/component-form-control.md +113 -0
  220. package/examples/component-form-controls.md +251 -0
  221. package/examples/component-form-group.md +86 -0
  222. package/examples/component-form-helper-text.md +95 -0
  223. package/examples/component-form-label.md +98 -0
  224. package/examples/component-form.md +291 -0
  225. package/examples/component-game-hud.md +362 -0
  226. package/examples/component-game-menu.md +327 -0
  227. package/examples/component-grid.md +140 -0
  228. package/examples/component-grow.md +79 -0
  229. package/examples/component-hero-block.md +252 -0
  230. package/examples/component-hover-card.md +211 -0
  231. package/examples/component-icon-button.md +142 -0
  232. package/examples/component-icon.md +102 -0
  233. package/examples/component-illustration.md +280 -0
  234. package/examples/component-image-list.md +107 -0
  235. package/examples/component-image.md +282 -0
  236. package/examples/component-input-adornment.md +101 -0
  237. package/examples/component-input-base.md +134 -0
  238. package/examples/component-input-number.md +141 -0
  239. package/examples/component-input-otp.md +271 -0
  240. package/examples/component-input.md +213 -0
  241. package/examples/component-item.md +243 -0
  242. package/examples/component-kbd.md +197 -0
  243. package/examples/component-krw-amount.md +219 -0
  244. package/examples/component-label.md +118 -0
  245. package/examples/component-layout.md +217 -0
  246. package/examples/component-link.md +223 -0
  247. package/examples/component-list-item-avatar.md +72 -0
  248. package/examples/component-list-item-button.md +139 -0
  249. package/examples/component-list-item-icon.md +82 -0
  250. package/examples/component-list-item-text.md +98 -0
  251. package/examples/component-list-item.md +116 -0
  252. package/examples/component-list-subheader.md +70 -0
  253. package/examples/component-list.md +198 -0
  254. package/examples/component-loading-button.md +125 -0
  255. package/examples/component-loading-sequence.md +254 -0
  256. package/examples/component-lottie-player.md +279 -0
  257. package/examples/component-masonry.md +191 -0
  258. package/examples/component-mentions.md +189 -0
  259. package/examples/component-menu-item.md +102 -0
  260. package/examples/component-menu-list.md +98 -0
  261. package/examples/component-menu.md +139 -0
  262. package/examples/component-menubar.md +259 -0
  263. package/examples/component-message.md +162 -0
  264. package/examples/component-mobile-stepper.md +155 -0
  265. package/examples/component-modal.md +220 -0
  266. package/examples/component-navigation-menu.md +295 -0
  267. package/examples/component-notification.md +166 -0
  268. package/examples/component-otp-countdown.md +245 -0
  269. package/examples/component-outlined-input.md +145 -0
  270. package/examples/component-page-transition.md +281 -0
  271. package/examples/component-pagination.md +226 -0
  272. package/examples/component-paper.md +199 -0
  273. package/examples/component-pass-auth.md +265 -0
  274. package/examples/component-payment-brand-button.md +253 -0
  275. package/examples/component-payment-method-selector.md +272 -0
  276. package/examples/component-payment-receipt.md +277 -0
  277. package/examples/component-popconfirm.md +144 -0
  278. package/examples/component-popover.md +239 -0
  279. package/examples/component-popper.md +129 -0
  280. package/examples/component-pricing-cards.md +247 -0
  281. package/examples/component-progress.md +195 -0
  282. package/examples/component-qr-code.md +201 -0
  283. package/examples/component-radio.md +167 -0
  284. package/examples/component-rate.md +202 -0
  285. package/examples/component-resizable.md +163 -0
  286. package/examples/component-result.md +270 -0
  287. package/examples/component-scroll-area.md +199 -0
  288. package/examples/component-scroll-reveal.md +320 -0
  289. package/examples/component-segmented.md +178 -0
  290. package/examples/component-select.md +258 -0
  291. package/examples/component-separator.md +177 -0
  292. package/examples/component-sheet.md +277 -0
  293. package/examples/component-sidebar.md +257 -0
  294. package/examples/component-skeleton.md +178 -0
  295. package/examples/component-slide.md +89 -0
  296. package/examples/component-slider.md +208 -0
  297. package/examples/component-snackbar-content.md +92 -0
  298. package/examples/component-snackbar.md +121 -0
  299. package/examples/component-sonner.md +165 -0
  300. package/examples/component-space.md +125 -0
  301. package/examples/component-spatial-locomotion.md +373 -0
  302. package/examples/component-spatial-panel.md +330 -0
  303. package/examples/component-speed-dial-action.md +78 -0
  304. package/examples/component-speed-dial.md +177 -0
  305. package/examples/component-spin.md +173 -0
  306. package/examples/component-spinner.md +204 -0
  307. package/examples/component-splitter.md +210 -0
  308. package/examples/component-stack.md +130 -0
  309. package/examples/component-statistic.md +282 -0
  310. package/examples/component-step-button.md +157 -0
  311. package/examples/component-step-connector.md +157 -0
  312. package/examples/component-step-content.md +121 -0
  313. package/examples/component-step-icon.md +115 -0
  314. package/examples/component-step-label.md +101 -0
  315. package/examples/component-step.md +84 -0
  316. package/examples/component-steps.md +264 -0
  317. package/examples/component-stock-chart.md +251 -0
  318. package/examples/component-swipeable-drawer.md +149 -0
  319. package/examples/component-switch.md +99 -0
  320. package/examples/component-tab-scroll-button.md +180 -0
  321. package/examples/component-tab.md +120 -0
  322. package/examples/component-table-body.md +82 -0
  323. package/examples/component-table-cell.md +118 -0
  324. package/examples/component-table-container.md +75 -0
  325. package/examples/component-table-footer.md +72 -0
  326. package/examples/component-table-head.md +78 -0
  327. package/examples/component-table-pagination.md +137 -0
  328. package/examples/component-table-row.md +113 -0
  329. package/examples/component-table-sort-label.md +109 -0
  330. package/examples/component-table.md +202 -0
  331. package/examples/component-tabs.md +184 -0
  332. package/examples/component-tag-badge.md +309 -0
  333. package/examples/component-tag.md +102 -0
  334. package/examples/component-testimonial-carousel.md +218 -0
  335. package/examples/component-textarea-autosize.md +114 -0
  336. package/examples/component-textarea.md +173 -0
  337. package/examples/component-time-picker.md +205 -0
  338. package/examples/component-timeline.md +170 -0
  339. package/examples/component-toast.md +224 -0
  340. package/examples/component-toggle-button.md +129 -0
  341. package/examples/component-toggle.md +220 -0
  342. package/examples/component-toolbar.md +104 -0
  343. package/examples/component-tooltip.md +178 -0
  344. package/examples/component-tour.md +176 -0
  345. package/examples/component-transaction-list-item.md +243 -0
  346. package/examples/component-transfer.md +156 -0
  347. package/examples/component-tree-select.md +202 -0
  348. package/examples/component-tree.md +297 -0
  349. package/examples/component-typography.md +215 -0
  350. package/examples/component-upload.md +295 -0
  351. package/examples/component-video-hero.md +409 -0
  352. package/examples/component-video-player.md +340 -0
  353. package/examples/component-voice-input.md +408 -0
  354. package/examples/component-watermark.md +217 -0
  355. package/examples/component-zoom.md +92 -0
  356. package/examples/doc-explanation-example.md +196 -0
  357. package/examples/doc-how-to-example.md +205 -0
  358. package/examples/doc-tutorial-example.md +162 -0
  359. package/examples/dogfood-korean-fintech-system.md +433 -0
  360. package/examples/email-transactional-example.md +259 -0
  361. package/examples/palette-saas-violet.md +235 -0
  362. package/examples/print-business-card-spec.md +205 -0
  363. package/examples/print-packaging-spec.md +285 -0
  364. package/examples/report-example.md +228 -0
  365. package/examples/slide-deck-example.md +237 -0
  366. package/examples/website-improvement-report.md +128 -0
  367. package/examples/website-improvement-workspace.json +126 -0
  368. package/install.sh +189 -0
  369. package/knowledge/COVERAGE.md +740 -0
  370. package/knowledge/PRINCIPLES.md +108 -0
  371. package/knowledge/a11y/contrast.md +70 -0
  372. package/knowledge/a11y/keyboard-and-focus.md +108 -0
  373. package/knowledge/colors/color-theory.md +90 -0
  374. package/knowledge/colors/mui-palette-structure.md +105 -0
  375. package/knowledge/colors/palettes-by-product-type.md +876 -0
  376. package/knowledge/components/INDEX.md +231 -0
  377. package/knowledge/components/index.json +1470 -0
  378. package/knowledge/components/shadcn-registry.md +159 -0
  379. package/knowledge/conversational/ai-chat-interfaces.md +323 -0
  380. package/knowledge/conversational/chatbot-design.md +312 -0
  381. package/knowledge/conversational/conversational-ui-fundamentals.md +299 -0
  382. package/knowledge/conversational/korean-voice-conventions.md +281 -0
  383. package/knowledge/conversational/voice-ui-patterns.md +297 -0
  384. package/knowledge/design-tokens/ant-design.md +124 -0
  385. package/knowledge/design-tokens/material-3.md +235 -0
  386. package/knowledge/design-tokens/polaris-and-carbon.md +231 -0
  387. package/knowledge/design-tokens/tailwind-v4.md +284 -0
  388. package/knowledge/game-ui/game-accessibility.md +317 -0
  389. package/knowledge/game-ui/game-ui-fundamentals.md +281 -0
  390. package/knowledge/game-ui/hud-design.md +324 -0
  391. package/knowledge/game-ui/korean-gaming-conventions.md +312 -0
  392. package/knowledge/game-ui/menu-systems.md +388 -0
  393. package/knowledge/i18n/korean-app-store-visual.md +223 -0
  394. package/knowledge/i18n/korean-document-style.md +301 -0
  395. package/knowledge/i18n/korean-payments.md +211 -0
  396. package/knowledge/i18n/korean-product-conventions.md +96 -0
  397. package/knowledge/i18n/korean-publishing.md +139 -0
  398. package/knowledge/i18n/korean-typography.md +123 -0
  399. package/knowledge/icons/curated-sets.md +225 -0
  400. package/knowledge/illustration/hero-illustrations.md +234 -0
  401. package/knowledge/illustration/illustration-systems.md +221 -0
  402. package/knowledge/illustration/mascot-design.md +208 -0
  403. package/knowledge/illustration/spot-illustrations.md +246 -0
  404. package/knowledge/illustration/svg-optimization.md +308 -0
  405. package/knowledge/layout/spacing-and-grid.md +119 -0
  406. package/knowledge/motion/app-loading-sequences.md +277 -0
  407. package/knowledge/motion/choreography-depth.md +297 -0
  408. package/knowledge/motion/marketing-motion.md +223 -0
  409. package/knowledge/motion/micro-interactions.md +266 -0
  410. package/knowledge/motion/motion-tools.md +281 -0
  411. package/knowledge/motion/principles.md +126 -0
  412. package/knowledge/patterns/auth-flow-design.md +316 -0
  413. package/knowledge/patterns/b2b-onboarding-flows.md +182 -0
  414. package/knowledge/patterns/brand-identity.md +238 -0
  415. package/knowledge/patterns/brand-references.md +97 -0
  416. package/knowledge/patterns/chart-color-encoding.md +269 -0
  417. package/knowledge/patterns/chart-types.md +344 -0
  418. package/knowledge/patterns/dashboard-composition.md +299 -0
  419. package/knowledge/patterns/design-system-qa.md +356 -0
  420. package/knowledge/patterns/document-typography.md +248 -0
  421. package/knowledge/patterns/email-design.md +338 -0
  422. package/knowledge/patterns/empty-states.md +263 -0
  423. package/knowledge/patterns/error-states.md +318 -0
  424. package/knowledge/patterns/form-design.md +237 -0
  425. package/knowledge/patterns/information-architecture.md +341 -0
  426. package/knowledge/patterns/landing-hero-design.md +283 -0
  427. package/knowledge/patterns/landing-page-patterns.md +681 -0
  428. package/knowledge/patterns/list-and-feed.md +371 -0
  429. package/knowledge/patterns/mobile-navigation.md +278 -0
  430. package/knowledge/patterns/money-and-amount.md +301 -0
  431. package/knowledge/patterns/onboarding.md +300 -0
  432. package/knowledge/patterns/pricing-page-design.md +261 -0
  433. package/knowledge/patterns/realtime-data.md +280 -0
  434. package/knowledge/patterns/report-design.md +330 -0
  435. package/knowledge/patterns/search-ux.md +373 -0
  436. package/knowledge/patterns/settings-page.md +325 -0
  437. package/knowledge/patterns/slide-deck-design.md +316 -0
  438. package/knowledge/patterns/styles-catalog.md +2599 -0
  439. package/knowledge/patterns/technical-writing.md +306 -0
  440. package/knowledge/patterns/ui-reasoning.md +1853 -0
  441. package/knowledge/patterns/ux-guidelines.md +1454 -0
  442. package/knowledge/platforms/react-native.md +395 -0
  443. package/knowledge/print/brochures-and-flyers.md +276 -0
  444. package/knowledge/print/korean-print-conventions.md +284 -0
  445. package/knowledge/print/packaging.md +321 -0
  446. package/knowledge/print/print-fundamentals.md +238 -0
  447. package/knowledge/print/signage-and-posters.md +235 -0
  448. package/knowledge/print/stationery.md +262 -0
  449. package/knowledge/spatial/ar-patterns.md +253 -0
  450. package/knowledge/spatial/comfort-and-accessibility.md +245 -0
  451. package/knowledge/spatial/spatial-design-fundamentals.md +346 -0
  452. package/knowledge/spatial/spatial-ui-elements.md +343 -0
  453. package/knowledge/spatial/vr-patterns.md +302 -0
  454. package/knowledge/typography/font-pairings.md +332 -0
  455. package/knowledge/typography/mui-type-scale.md +57 -0
  456. package/knowledge/typography/type-scale-fundamentals.md +105 -0
  457. package/knowledge/video/in-product-video.md +277 -0
  458. package/knowledge/video/korean-video-conventions.md +247 -0
  459. package/knowledge/video/marketing-video.md +258 -0
  460. package/knowledge/video/social-and-short-form.md +257 -0
  461. package/knowledge/video/video-fundamentals.md +296 -0
  462. package/package.json +106 -0
  463. package/skills/README.md +39 -0
  464. package/skills/color-palette/PLAYBOOK.md +175 -0
  465. package/skills/color-palette/SKILL.md +6 -0
  466. package/skills/color-palette/TEMPLATE.md +103 -0
  467. package/skills/component-spec-writer/PLAYBOOK.md +169 -0
  468. package/skills/component-spec-writer/SKILL.md +6 -0
  469. package/skills/component-spec-writer/TEMPLATE.md +115 -0
  470. package/skills/conversational-ui-designer/PLAYBOOK.md +231 -0
  471. package/skills/conversational-ui-designer/SKILL.md +6 -0
  472. package/skills/design-broadcast/PLAYBOOK.md +146 -0
  473. package/skills/design-broadcast/SKILL.md +6 -0
  474. package/skills/design-critique/PLAYBOOK.md +137 -0
  475. package/skills/design-critique/SKILL.md +6 -0
  476. package/skills/design-pr-review/PLAYBOOK.md +171 -0
  477. package/skills/design-pr-review/SKILL.md +6 -0
  478. package/skills/design-system-builder/PLAYBOOK.md +218 -0
  479. package/skills/design-system-builder/SKILL.md +6 -0
  480. package/skills/design-system-qa/PLAYBOOK.md +163 -0
  481. package/skills/design-system-qa/SKILL.md +6 -0
  482. package/skills/document-author/PLAYBOOK.md +167 -0
  483. package/skills/document-author/SKILL.md +6 -0
  484. package/skills/figma-token-sync/PLAYBOOK.md +149 -0
  485. package/skills/figma-token-sync/SKILL.md +6 -0
  486. package/skills/game-ui-designer/PLAYBOOK.md +209 -0
  487. package/skills/game-ui-designer/SKILL.md +6 -0
  488. package/skills/handoff-spec/PLAYBOOK.md +170 -0
  489. package/skills/handoff-spec/SKILL.md +6 -0
  490. package/skills/illustration-designer/PLAYBOOK.md +166 -0
  491. package/skills/illustration-designer/SKILL.md +6 -0
  492. package/skills/motion-designer/PLAYBOOK.md +223 -0
  493. package/skills/motion-designer/SKILL.md +6 -0
  494. package/skills/print-designer/PLAYBOOK.md +209 -0
  495. package/skills/print-designer/SKILL.md +6 -0
  496. package/skills/slide-deck-author/PLAYBOOK.md +198 -0
  497. package/skills/slide-deck-author/SKILL.md +6 -0
  498. package/skills/spatial-designer/PLAYBOOK.md +238 -0
  499. package/skills/spatial-designer/SKILL.md +6 -0
  500. package/skills/ux-audit/PLAYBOOK.md +142 -0
  501. package/skills/ux-audit/SKILL.md +6 -0
  502. package/skills/video-designer/PLAYBOOK.md +240 -0
  503. package/skills/video-designer/SKILL.md +6 -0
  504. package/skills/website-improvement/PLAYBOOK.md +118 -0
  505. package/skills/website-improvement/SKILL.md +6 -0
  506. package/skills/website-improvement/TEMPLATE.md +103 -0
  507. package/tools/audit/changelog-generate.py +176 -0
  508. package/tools/audit/check-coverage.py +483 -0
  509. package/tools/audit/doctor_assertions.py +256 -0
  510. package/tools/audit/example-qa.py +108 -0
  511. package/tools/audit/frontmatter-check.py +199 -0
  512. package/tools/audit/integration-check.py +95 -0
  513. package/tools/audit/korean-copy-check.py +161 -0
  514. package/tools/audit/link-check.py +146 -0
  515. package/tools/audit/local-ci.py +558 -0
  516. package/tools/audit/package-contents.py +723 -0
  517. package/tools/audit/package-smoke.py +22443 -0
  518. package/tools/audit/raw-hex-check.py +252 -0
  519. package/tools/audit/registry-smoke.py +8188 -0
  520. package/tools/audit/release-metadata.py +9832 -0
  521. package/tools/audit/run-all.py +351 -0
  522. package/tools/audit/smoke_assertions.py +12742 -0
  523. package/tools/audit/stability-review.py +332 -0
  524. package/tools/audit/stale-check.py +156 -0
  525. package/tools/migrations/add-version-frontmatter.py +132 -0
  526. package/tools/migrations/bump-last-updated.py +131 -0
  527. package/tools/migrations/promote-stability.py +172 -0
  528. package/tools/preview/README.md +58 -0
  529. package/tools/preview/render-tokens.py +454 -0
@@ -0,0 +1,264 @@
1
+ # `Steps` (Stepper) — spec
2
+
3
+ > Citing Ant Design `Steps`, MUI `Stepper`, shadcn-ui (no built-in — composed)
4
+
5
+ ## Purpose
6
+
7
+ Visualizes progress through a sequence of steps. Used in: multi-step forms, checkout flows, onboarding wizards, KYC / 본인인증 flows.
8
+
9
+ Different from:
10
+
11
+ | Pattern | Use |
12
+ | --- | --- |
13
+ | **Steps / Stepper** | Sequential, predetermined N steps |
14
+ | **Breadcrumb** | Hierarchical position (not sequential) |
15
+ | **Tabs** | Mutually exclusive views, no inherent order |
16
+ | **Progress bar** | Continuous % completion |
17
+
18
+ ## Anatomy
19
+
20
+ ```
21
+ Horizontal:
22
+ ┌────┐ ┌────┐ ┌────┐ ┌────┐
23
+ │ ✓ │ ── │ 2 │ ── │ 3 │ ── │ 4 │
24
+ └────┘ └────┘ └────┘ └────┘
25
+ 완료 현재 대기 대기
26
+
27
+ Vertical:
28
+ ┌────┐
29
+ │ ✓ │ Step 1: 본인인증
30
+ │ │ 완료
31
+ └────┘
32
+
33
+ ┌────┐
34
+ │ 2 │ Step 2: 정보 입력
35
+ │ │ 진행 중
36
+ └────┘
37
+
38
+ ┌────┐
39
+ │ 3 │ Step 3: 확인
40
+ │ │ 대기
41
+ └────┘
42
+ ```
43
+
44
+ | Slot | Required | Notes |
45
+ | --- | --- | --- |
46
+ | Step indicator | yes | Number / icon — shows status |
47
+ | Step label | usually | Title of the step |
48
+ | Step description | optional | Subtitle or instruction |
49
+ | Connector | yes | Line between steps (filled if completed) |
50
+
51
+ ## API
52
+
53
+ ```tsx
54
+ <Steps current={2} status="process">
55
+ <Steps.Item title="본인인증" description="휴대폰 번호로 인증" />
56
+ <Steps.Item title="정보 입력" description="기본 정보를 입력합니다" />
57
+ <Steps.Item title="확인" description="입력한 정보를 확인합니다" />
58
+ <Steps.Item title="완료" />
59
+ </Steps>
60
+ ```
61
+
62
+ | Prop (root) | Type | Default | Description |
63
+ | --- | --- | --- | --- |
64
+ | `current` | `number` | `0` | Index of the currently-active step (0-indexed) |
65
+ | `status` | `"process" \| "wait" \| "finish" \| "error"` | `"process"` | Status of the current step |
66
+ | `direction` | `"horizontal" \| "vertical"` | `"horizontal"` | |
67
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
68
+ | `clickable` | `boolean` | `false` | Allow user to click steps to navigate |
69
+ | `onChange` | `(step: number) => void` | — | Called when user clicks a step (clickable mode) |
70
+
71
+ | Prop (Item) | Type | Description |
72
+ | --- | --- | --- |
73
+ | `title` | `string \| ReactNode` | Step title |
74
+ | `description` | `string \| ReactNode` | Subtitle |
75
+ | `icon` | `ReactNode` | Custom icon (override number / checkmark) |
76
+ | `disabled` | `boolean` | Skip this step (rare) |
77
+ | `status` | overrides root | Per-step status override |
78
+
79
+ ## Step status states
80
+
81
+ | Status | When | Visual |
82
+ | --- | --- | --- |
83
+ | `wait` | Steps after current | Gray indicator + gray line |
84
+ | `process` | Currently-active step | Primary indicator + filled label |
85
+ | `finish` | Completed steps | Primary indicator with checkmark + filled line |
86
+ | `error` | Step failed (validation, upload error) | Error red indicator |
87
+
88
+ ## Variants
89
+
90
+ ### Numbered
91
+
92
+ Steps show numbers `1, 2, 3...`. Switches to checkmark when complete.
93
+
94
+ ### Dot (compact)
95
+
96
+ Just a dot indicator, no number. Use for many steps where number is noise:
97
+
98
+ ```
99
+ ●──●──●──○──○──○
100
+ ```
101
+
102
+ ### With icon
103
+
104
+ Custom icon per step (e.g., 📞 phone for verification, 📋 form for input):
105
+
106
+ ```
107
+ [📞] ── [📋] ── [✓]
108
+ ```
109
+
110
+ ### Status-only (just label)
111
+
112
+ For text-heavy multi-step forms:
113
+
114
+ ```
115
+ ✓ 본인인증 완료
116
+ ● 정보 입력 (현재)
117
+ ○ 확인
118
+ ○ 완료
119
+ ```
120
+
121
+ ## Sizes
122
+
123
+ | Size | Indicator | Font |
124
+ | --- | --- | --- |
125
+ | `sm` | 24px | 12px |
126
+ | `md` (default) | 32px | 14px |
127
+ | `lg` | 40px | 16px |
128
+
129
+ ## Tokens consumed
130
+
131
+ ```
132
+ --color-bg-default
133
+ --color-bg-subtle
134
+ --color-primary-default (process, finish indicator + line)
135
+ --color-text-primary
136
+ --color-text-secondary (wait labels)
137
+ --color-text-tertiary (descriptions)
138
+ --color-on-primary (text inside indicator when filled)
139
+ --color-error (error status)
140
+ --color-border-default (connector line — wait state)
141
+ --space-md, --space-base
142
+ --radius-full (indicator circle)
143
+ --motion-default (transition between states)
144
+ ```
145
+
146
+ ## Accessibility
147
+
148
+ - Wrap in `<ol role="list" aria-label="Form progress">` (or "checkout steps" / "verification steps").
149
+ - Each step is `<li>`.
150
+ - Current step: `aria-current="step"`.
151
+ - Completed steps: include `<span class="sr-only">Completed: </span>` before label so screen reader announces status.
152
+ - Connector lines: `aria-hidden="true"`.
153
+
154
+ ```html
155
+ <ol aria-label="가입 진행 단계">
156
+ <li aria-current="false">
157
+ <span class="sr-only">완료: </span>
158
+ 본인인증
159
+ </li>
160
+ <li aria-current="step">
161
+ 정보 입력 (단계 2 / 4)
162
+ </li>
163
+ <li aria-current="false">
164
+ <span class="sr-only">대기: </span>
165
+ 확인
166
+ </li>
167
+ ...
168
+ </ol>
169
+ ```
170
+
171
+ ### When clickable
172
+
173
+ Render steps as `<button>` (not just clickable divs):
174
+ - Completed steps: clickable to revisit.
175
+ - Future steps: disabled.
176
+ - Use `aria-disabled="true"` for non-clickable future steps.
177
+
178
+ ### Keyboard
179
+
180
+ | Key | Behavior |
181
+ | --- | --- |
182
+ | `Tab` | Move through clickable steps |
183
+ | `Enter` / `Space` | Activate (navigate to step) |
184
+
185
+ ## Mobile patterns
186
+
187
+ For narrow screens, horizontal steppers crunch. Three options:
188
+
189
+ | Approach | Use |
190
+ | --- | --- |
191
+ | **Vertical stepper** | Best when label + description matter, screens are tall enough |
192
+ | **Compact dot stepper** | Just dots showing "step N of M" |
193
+ | **Just text** | "단계 2 / 4: 정보 입력" — simplest |
194
+
195
+ For `n > 5` steps on mobile, **always switch to compact or text-only**.
196
+
197
+ ## Code example
198
+
199
+ ```tsx
200
+ // Multi-step form
201
+ <Form>
202
+ <Steps current={currentStep} status={hasError ? "error" : "process"}>
203
+ <Steps.Item title="본인인증" description="휴대폰으로 본인 확인" />
204
+ <Steps.Item title="정보 입력" description="기본 정보를 입력해 주세요" />
205
+ <Steps.Item title="확인" description="입력 정보를 확인합니다" />
206
+ <Steps.Item title="완료" />
207
+ </Steps>
208
+
209
+ <Form.Steps current={currentStep}>
210
+ <Form.Step><PhoneVerificationStep /></Form.Step>
211
+ <Form.Step><BasicInfoStep /></Form.Step>
212
+ <Form.Step><ConfirmStep /></Form.Step>
213
+ <Form.Step><DoneStep /></Form.Step>
214
+ </Form.Steps>
215
+
216
+ <div className="flex justify-between">
217
+ {currentStep > 0 && <Button variant="outline" onClick={prev}>이전</Button>}
218
+ <Button onClick={next}>{currentStep === 3 ? "완료" : "다음"}</Button>
219
+ </div>
220
+ </Form>
221
+
222
+ // Compact for mobile
223
+ <div aria-label="가입 단계">
224
+ <p className="text-sm text-text-secondary">단계 {current + 1} / {total}</p>
225
+ <Progress value={(current + 1) / total * 100} />
226
+ </div>
227
+ ```
228
+
229
+ ## Edge cases
230
+
231
+ - **User navigates back**: previous steps must remain marked as `finish` (until they re-edit). Don't reset to `wait`.
232
+ - **Step has an error after user advanced**: mark with `status="error"` AND keep the step accessible (don't trap user forward).
233
+ - **Skipping optional steps**: if a step is skippable, show it as `finish` with a "Skipped" sub-label after skipping.
234
+ - **Async server validation between steps**: lock advance with a spinner; don't let user click ahead while pending.
235
+ - **Many steps (8+)**: switch to compact / text-only on mobile; consider splitting into sub-flows.
236
+ - **One-step (just current shown)**: don't render Steps. Show "Step 1 of 1" or omit.
237
+ - **Conditional steps** (steps that appear/disappear based on prior choices): manage in state; render the actual current set, not the maximum.
238
+
239
+ ## Don't
240
+
241
+ - Don't make every step clickable. Only completed (and current); future steps locked.
242
+ - Don't show error on a step the user hasn't yet touched.
243
+ - Don't auto-advance steps — user explicitly clicks "Next".
244
+ - Don't lose user input when navigating back.
245
+ - Don't show 5+ step labels on mobile portrait — they overlap. Use compact.
246
+ - Don't use Steps for non-sequential navigation. Use Tabs.
247
+
248
+ ## References
249
+
250
+ - Ant Design: [`refs/ant-design/components/steps/`](../refs/ant-design/components/steps/) — `Steps`, `Steps.Item`. Status, direction, size, progress dot variant. Most exhaustive.
251
+ - MUI: [`refs/mui/packages/mui-material/src/Stepper/`](../refs/mui/packages/mui-material/src/Stepper/) — `Stepper`, `Step`, `StepLabel`, `StepContent`. Vertical with collapsible content per step is unique.
252
+ - shadcn-ui: no built-in — compose from primitives. The `progress` and custom layout get you 80% there.
253
+
254
+ API choices made:
255
+ - **Adopted Ant's `current` prop** (numeric, 0-indexed) rather than per-step `active` flags — cleaner for forms.
256
+ - **`status` at root applies to current step**; per-step override available.
257
+ - **`clickable` opt-in**: most use cases are linear; making clickable the default invites users to skip ahead.
258
+
259
+ ## Cross-reference
260
+
261
+ - [`examples/component-form.md`](component-form.md) — Form.Steps pattern
262
+ - [`examples/component-progress.md`](component-progress.md) — alternative for non-discrete progress
263
+ - [`knowledge/patterns/onboarding.md`](../knowledge/patterns/onboarding.md) — multi-step onboarding patterns
264
+ - [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — 본인인증 flow expectations
@@ -0,0 +1,251 @@
1
+ # `StockChart` (custom — Korean stock convention) — spec
2
+
3
+ > Custom component pattern. Korean stock apps use **inverted color convention** — red for gains, blue for losses. Critical to get right.
4
+
5
+ ## Purpose
6
+
7
+ Renders stock price data: candlestick chart, line chart, or volume bars. Used in: Korean stock trading apps (Kiwoom, NH투자, Toss Securities, Samsung Securities).
8
+
9
+ ## Korean color convention (CRITICAL)
10
+
11
+ | Direction | Korean stock convention | Western convention |
12
+ | --- | --- | --- |
13
+ | Up / Gain | 🔴 **Red** | 🟢 Green |
14
+ | Down / Loss | 🔵 **Blue** | 🔴 Red |
15
+ | Unchanged | Gray | Gray |
16
+
17
+ This is **inverted from Western** apps. Cite [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md).
18
+
19
+ For multi-locale apps: provide a settings toggle ("색상 표시: 한국 / 서양") but **default to Korean for KR users**.
20
+
21
+ ## Anatomy
22
+
23
+ ```
24
+ 1. Candlestick: 2. Line + area: 3. Volume:
25
+ ┃ ┃▲ ┃ ┃ ┃
26
+ ┃▲ ┃▲ ┃ ─╮ ╭─╮ ┃ ┃ ┃ ┃ ┃
27
+ ┃ ┃ ┃ ╱ ╲╱ ╲ ┃ ┃ ┃ ┃ ┃
28
+ ┃▼ ┃▼ ──╯ ╲ ┃ ┃ ┃ ┃ ┃
29
+ ┃ ╲─ ┃ ┃ ┃ ┃ ┃
30
+
31
+ Date axis →
32
+ ```
33
+
34
+ | Slot | Required | Notes |
35
+ | --- | --- | --- |
36
+ | Chart area | yes | Candle / line / bar rendering |
37
+ | Time-range tabs | usually | 1일 / 1주 / 1개월 / 6개월 / 1년 / 5년 / 전체 |
38
+ | Y-axis labels | yes | Price points, formatted as KRW |
39
+ | X-axis labels | yes | Dates |
40
+ | Crosshair (hover) | optional | Vertical + horizontal line + price + date callout |
41
+ | Volume sub-chart | optional | Below price chart |
42
+
43
+ ## API
44
+
45
+ ```tsx
46
+ <StockChart
47
+ data={priceData}
48
+ type="candle"
49
+ range="1month"
50
+ onRangeChange={setRange}
51
+ showVolume
52
+ korConvention // explicit toggle
53
+ />
54
+ ```
55
+
56
+ | Prop | Type | Default | Description |
57
+ | --- | --- | --- | --- |
58
+ | `data` | `PricePoint[]` | — | Series of price points |
59
+ | `type` | `"candle" \| "line" \| "area"` | `"candle"` | Chart type |
60
+ | `range` | `"1day" \| "1week" \| "1month" \| "3month" \| "6month" \| "1year" \| "5year" \| "all"` | `"1month"` | Time window |
61
+ | `onRangeChange` | `(range) => void` | — | |
62
+ | `showVolume` | `boolean` | `true` | Render volume bars below |
63
+ | `korConvention` | `boolean` | `true` (KR locale) | Red=up, blue=down |
64
+ | `crosshair` | `boolean` | `true` | Hover indicator |
65
+ | `tooltip` | `boolean \| (point) => ReactNode` | `true` | |
66
+ | `loading` | `boolean` | `false` | |
67
+ | `onCrosshairChange` | `(point) => void` | — | When user hovers |
68
+ | `compareSeries` | `PriceSeries[]` | — | Overlay another stock for comparison |
69
+
70
+ ```ts
71
+ type PricePoint = {
72
+ date: Date;
73
+ open: number;
74
+ high: number;
75
+ low: number;
76
+ close: number;
77
+ volume: number;
78
+ };
79
+ ```
80
+
81
+ ## Color tokens
82
+
83
+ ```
84
+ --color-stock-up = #DC2626 (red — Korean) / #16A34A (green — Western)
85
+ --color-stock-down = #2563EB (blue — Korean) / #DC2626 (red — Western)
86
+ --color-stock-unchanged = --color-text-tertiary
87
+ --color-stock-volume = --color-text-tertiary (subdued)
88
+ --color-chart-grid = --color-border-default
89
+ --color-chart-axis = --color-text-tertiary
90
+ --color-chart-bg = --color-bg-default
91
+ --color-crosshair = --color-text-secondary
92
+ ```
93
+
94
+ Toggle via theme based on user's locale or preference.
95
+
96
+ ## Behavior
97
+
98
+ ### Range selector
99
+
100
+ Above or below the chart:
101
+ ```
102
+ [1일] [1주] [1개월] [3개월] [6개월] [1년] [5년] [전체]
103
+ ↑ active
104
+ ```
105
+
106
+ Click → re-fetches and re-renders.
107
+
108
+ ### Crosshair on hover
109
+
110
+ Hover over the chart shows:
111
+ - Vertical line at the date hovered
112
+ - Horizontal line at the price
113
+ - Tooltip: date + open/high/low/close + volume
114
+
115
+ ```
116
+ 2026.05.07
117
+ 시가: ₩78,500
118
+ 고가: ₩79,200
119
+ 저가: ₩78,200
120
+ 종가: ₩78,800
121
+ 거래량: 1.2M
122
+ ```
123
+
124
+ For touch devices: tap to show, tap elsewhere to dismiss.
125
+
126
+ ### Crosshair sync
127
+
128
+ If volume sub-chart is shown: crosshair vertical line spans both charts.
129
+
130
+ ## States
131
+
132
+ | State | Visual |
133
+ | --- | --- |
134
+ | Default | Chart rendered |
135
+ | Loading | Skeleton showing chart shape |
136
+ | Error | "차트를 불러올 수 없어요" with retry |
137
+ | Empty (no data) | "데이터가 없습니다" |
138
+ | Hover (desktop) | Crosshair + tooltip |
139
+ | Touch (mobile) | Tap to show crosshair, swipe to scrub |
140
+
141
+ ## Performance
142
+
143
+ Stock charts can have 1000s of points. Optimize:
144
+
145
+ - Use **Canvas / WebGL** rendering, not SVG (SVG breaks down past ~500 nodes).
146
+ - Libraries: `lightweight-charts` (TradingView's), `recharts` (SVG-based, smaller datasets), `apexcharts`.
147
+ - Aggregate data on long ranges (e.g., 5년 view shows monthly candles, not daily).
148
+ - Throttle hover updates to 60fps max.
149
+
150
+ For Korean apps: TradingView's `lightweight-charts` is widely used (small bundle, performant).
151
+
152
+ ## Tokens consumed
153
+
154
+ ```
155
+ --color-stock-up
156
+ --color-stock-down
157
+ --color-stock-unchanged
158
+ --color-stock-volume
159
+ --color-chart-grid
160
+ --color-chart-axis
161
+ --color-chart-bg
162
+ --color-crosshair
163
+ --color-text-primary, --color-text-secondary
164
+ --font-mono (price labels — tabular numerals)
165
+ --font-feature-amount: 'tnum' 1
166
+ --space-md
167
+ --motion-fast
168
+ ```
169
+
170
+ ## Accessibility
171
+
172
+ Charts are visual — ensure text alternatives:
173
+
174
+ - `<figure aria-label="삼성전자 1개월 주가 차트">`
175
+ - Provide a "데이터 표 보기" link that opens a tabular view of the same data.
176
+ - Crosshair tooltip should be visible (not just hover-only) — tap pattern on mobile.
177
+ - Text alternative: range, current price, change %, time period.
178
+
179
+ ```html
180
+ <figure aria-label="삼성전자 1개월 차트, 종가 ₩78,800, 1.5% 상승">
181
+ <Chart />
182
+ <button onClick={openTableView}>데이터 표 보기</button>
183
+ </figure>
184
+ ```
185
+
186
+ ## Code example
187
+
188
+ ```tsx
189
+ function StockDetailScreen({ symbol }: Props) {
190
+ const [range, setRange] = useState("1month");
191
+ const { data, loading } = useStockHistory(symbol, range);
192
+ const userPrefersKorean = useUserPreference("stockColors") === "korean";
193
+
194
+ return (
195
+ <div>
196
+ <StockChart
197
+ data={data}
198
+ type="candle"
199
+ range={range}
200
+ onRangeChange={setRange}
201
+ showVolume
202
+ korConvention={userPrefersKorean}
203
+ loading={loading}
204
+ />
205
+
206
+ <RangeSelector value={range} onChange={setRange} />
207
+
208
+ <Stat label="종가" value={data?.[data.length - 1]?.close} type="amount" />
209
+ <Stat
210
+ label="등락"
211
+ value={data?.[data.length - 1]?.changePercent}
212
+ valueColor={getStockColor(change, userPrefersKorean)}
213
+ />
214
+ </div>
215
+ );
216
+ }
217
+ ```
218
+
219
+ ## Edge cases
220
+
221
+ - **Pre-market / after-hours data**: dim or annotate. Korean exchanges (KOSPI/KOSDAQ) trade 9:00–15:30 KST.
222
+ - **Holiday gaps**: skip (don't show empty space). Korean holidays affect the calendar.
223
+ - **Stock splits / dividends**: annotate with markers on the date.
224
+ - **Currency**: KRW (no decimals). Some stocks are USD (US-listed); show currency in label.
225
+ - **Pinch-zoom on mobile**: support if range is "all" or longer.
226
+ - **Crosshair on tiny screens**: tooltip should adjust to not overflow.
227
+
228
+ ## Don't
229
+
230
+ - Don't use Western (green=up) colors in Korean apps without an explicit toggle.
231
+ - Don't use red and green as the only signals (color-blind users) — pair with arrows or text.
232
+ - Don't render 5,000+ candles as SVG — use canvas.
233
+ - Don't show the chart without OHLC values somewhere accessible.
234
+ - Don't auto-update the chart while user is hovering (jarring).
235
+
236
+ ## References
237
+
238
+ No upstream component is exactly this — Korean stock convention is non-standard. Closest:
239
+ - TradingView's `lightweight-charts` library (most popular)
240
+ - Apache ECharts `candlestick` series
241
+ - Recharts `Line` + custom candle rendering
242
+
243
+ This is a **custom pattern + library wrapper** specific to Korean fintech.
244
+
245
+ ## Cross-reference
246
+
247
+ - [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — Korean stock color convention
248
+ - [`knowledge/patterns/chart-color-encoding.md`](../knowledge/patterns/chart-color-encoding.md) — chart color rules
249
+ - [`knowledge/patterns/chart-types.md`](../knowledge/patterns/chart-types.md) — when candle vs line vs area
250
+ - [`knowledge/patterns/realtime-data.md`](../knowledge/patterns/realtime-data.md) — live price updates pattern
251
+ - [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — Korean fintech context
@@ -0,0 +1,149 @@
1
+ # `SwipeableDrawer` — spec
2
+
3
+ > Synthesized from MUI `SwipeableDrawer`. A `Drawer` variant supporting swipe gestures (open from edge / close by swiping away). Mobile-first; iOS / Android conventions.
4
+
5
+ ## When to use
6
+
7
+ - Mobile primary navigation accessible via edge swipe.
8
+ - Mobile bottom sheet draggable open / close.
9
+ - Native-feel mobile menus.
10
+
11
+ When NOT to use:
12
+ - Desktop-only contexts (mouse drag is unintuitive).
13
+ - Critical confirmation flows (use Modal / AlertDialog).
14
+ - See [`component-drawer.md`](component-drawer.md) for non-swipeable variants.
15
+
16
+ ## Anatomy
17
+
18
+ Same as `Drawer`, but with gesture support:
19
+
20
+ ```
21
+ ↓ swipe from left edge
22
+ ┌──────────┐
23
+ │ │
24
+ │ │
25
+ │ Drawer │
26
+ │ content │
27
+ │ │
28
+ │ │
29
+ └──────────┘
30
+ ↓ swipe right to close
31
+ ```
32
+
33
+ ## API
34
+
35
+ ```tsx
36
+ <SwipeableDrawer
37
+ open={open}
38
+ onOpen={() => setOpen(true)}
39
+ onClose={() => setOpen(false)}
40
+ anchor="left"
41
+ swipeAreaWidth={20}
42
+ disableSwipeToOpen={false}
43
+ >
44
+ <NavMenu />
45
+ </SwipeableDrawer>
46
+ ```
47
+
48
+ | Prop | Type | Default | Description |
49
+ | --- | --- | --- | --- |
50
+ | `open` | `boolean` | controlled | Visibility |
51
+ | `onOpen` / `onClose` | function | — | Gesture / click outside / Esc callbacks |
52
+ | `anchor` | `"left" \| "right" \| "top" \| "bottom"` | `"left"` | Edge anchor |
53
+ | `swipeAreaWidth` | `number` | `20` | Pixels from edge where swipe-open triggers |
54
+ | `disableSwipeToOpen` | `boolean` | iOS auto-disabled | Disable open-by-swipe |
55
+ | `disableDiscovery` | `boolean` | `false` | Hide the "discovery" peek that hints at swipe-to-open |
56
+ | `minFlingVelocity` | `number` | `450` | Velocity threshold for flick-to-open/close |
57
+ | `transitionDuration` | `number` | `300` | Ms for non-gesture transition |
58
+
59
+ ## Gesture mechanics
60
+
61
+ | Gesture | Behavior |
62
+ | --- | --- |
63
+ | Edge swipe in | Drawer follows finger; releases → snap open or closed (based on past midpoint) |
64
+ | Drag drawer back | Same — past midpoint snaps closed |
65
+ | Flick (high velocity) | Always completes the action regardless of position |
66
+ | Tap backdrop | Closes |
67
+ | Esc (when keyboard available) | Closes |
68
+
69
+ ## States
70
+
71
+ Same as Drawer. Plus:
72
+ - **Following finger**: drawer position interpolated to touch X (or Y); backdrop opacity proportional.
73
+ - **Snapping**: animate to nearest detent (open or closed) on release.
74
+
75
+ ## Tokens consumed
76
+
77
+ Inherits from Drawer:
78
+ ```
79
+ --drawer-bg
80
+ --drawer-shadow
81
+ --drawer-backdrop
82
+ --drawer-width (left/right)
83
+ --drawer-height (top/bottom)
84
+ --motion-medium (snap animation)
85
+ --ease-out
86
+ --z-overlay
87
+ ```
88
+
89
+ ## Accessibility
90
+
91
+ - Same as Drawer (role="dialog" aria-modal="true", focus trap, Esc to close).
92
+ - Add visible "Open menu" button — swipe is non-discoverable.
93
+ - Touch gesture is supplemental; never the only way to open.
94
+
95
+ ## iOS quirk
96
+
97
+ iOS Safari has its own edge-swipe gesture (back navigation). MUI auto-disables `swipeToOpen` on iOS to avoid conflict.
98
+
99
+ For iOS: provide a visible hamburger button; swipe-to-close still works.
100
+
101
+ ## Code example — mobile nav
102
+
103
+ ```tsx
104
+ function MobileApp() {
105
+ const [navOpen, setNavOpen] = useState(false);
106
+ const isMobile = useMediaQuery("(max-width: 767px)");
107
+
108
+ if (!isMobile) return <DesktopAppShell />;
109
+
110
+ return (
111
+ <>
112
+ <header>
113
+ <IconButton onClick={() => setNavOpen(true)} aria-label="메뉴">
114
+ <MenuIcon />
115
+ </IconButton>
116
+ </header>
117
+
118
+ <SwipeableDrawer
119
+ open={navOpen}
120
+ onOpen={() => setNavOpen(true)}
121
+ onClose={() => setNavOpen(false)}
122
+ anchor="left"
123
+ >
124
+ <NavList onItemClick={() => setNavOpen(false)} />
125
+ </SwipeableDrawer>
126
+
127
+ <main>{/* main content */}</main>
128
+ </>
129
+ );
130
+ }
131
+ ```
132
+
133
+ ## Don't
134
+
135
+ - Don't rely on swipe-to-open as the only access — provide a button.
136
+ - Don't use SwipeableDrawer on desktop (mouse drag feels wrong).
137
+ - Don't put critical actions inside without a backup access path.
138
+ - Don't override iOS's edge swipe — let it be.
139
+
140
+ ## References
141
+
142
+ - MUI: [`SwipeableDrawer`](../refs/mui/packages/mui-material/src/SwipeableDrawer)
143
+ - iOS native drawer pattern; Material 3 standard drawer
144
+
145
+ ## Cross-reference
146
+
147
+ - [`examples/component-drawer.md`](component-drawer.md) — non-swipeable variant
148
+ - [`examples/component-sheet.md`](component-sheet.md) — bottom-sheet alternative
149
+ - [`knowledge/patterns/mobile-navigation.md`](../knowledge/patterns/mobile-navigation.md)