@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,308 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: SVG optimization (file size, performance, accessibility)
4
+ applies_to: [svg, illustration, performance, optimization]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # SVG optimization
11
+
12
+ SVGs are usually the right format for illustration. They scale, theme, and animate. But raw exports from Figma / Illustrator are bloated — 5-10× larger than they need to be, and they break theming.
13
+
14
+ This file is the production checklist for shipping a clean SVG.
15
+
16
+ ## Why optimize
17
+
18
+ A typical Figma SVG export of a medium-detail spot illustration:
19
+ - **Raw**: 80kB
20
+ - **After optimization**: 8-15kB
21
+
22
+ 10× reduction is normal. For 100 illustrations across a site, that's 7MB → 1MB.
23
+
24
+ Beyond size: optimized SVGs theme correctly, render faster, and are easier to inline in React.
25
+
26
+ ## The bloat sources
27
+
28
+ Raw SVG exports include:
29
+ 1. **Editor metadata** — Figma / Sketch / Illustrator editor tags (10-30% of file).
30
+ 2. **Default styles** — `fill="#000"`, `stroke-width="1"` on every element even when it's the default.
31
+ 3. **Decimal precision** — `M123.4567890123` instead of `M123.46`.
32
+ 4. **Empty groups** — `<g></g>` wrappers with no purpose.
33
+ 5. **Unused attributes** — `id` on every element, even when unused.
34
+ 6. **Embedded fonts** — text rendered as font (not paths) carrying entire font subsets.
35
+ 7. **Embedded raster** — images embedded as base64 inside the SVG.
36
+
37
+ Cleaning these is mechanical (run a tool) plus judgmental (preserve structure for theming / animation).
38
+
39
+ ## SVGO — the standard tool
40
+
41
+ **SVGO** (svgo on npm) is the de-facto SVG optimizer. Run on every SVG before shipping.
42
+
43
+ ```bash
44
+ npm install -g svgo
45
+ svgo input.svg -o output.svg
46
+ ```
47
+
48
+ Or batch:
49
+
50
+ ```bash
51
+ svgo --folder=src/illustrations --output=dist/illustrations
52
+ ```
53
+
54
+ ### Recommended SVGO config
55
+
56
+ ```js
57
+ // svgo.config.js
58
+ module.exports = {
59
+ plugins: [
60
+ {
61
+ name: "preset-default",
62
+ params: {
63
+ overrides: {
64
+ removeViewBox: false, // KEEP viewBox — required for responsive scaling
65
+ cleanupIds: false, // KEEP ids if you reference them in CSS / JS
66
+ removeUselessDefs: false, // KEEP defs if used by clipPath / filter / linearGradient
67
+ },
68
+ },
69
+ },
70
+ "removeXMLNS", // Remove if you inline; keep if standalone <img src>
71
+ "convertStyleToAttrs",
72
+ "removeDimensions", // Use viewBox + CSS sizing
73
+ {
74
+ name: "convertPathData",
75
+ params: { floatPrecision: 2 },
76
+ },
77
+ "removeMetadata",
78
+ "removeEditorsNSData",
79
+ "removeEmptyContainers",
80
+ "convertColors", // Hex → shorter forms / named
81
+ ],
82
+ };
83
+ ```
84
+
85
+ `removeViewBox: false` is critical. Without viewBox, SVG can't scale responsively.
86
+
87
+ `cleanupIds: false` if you have any `<use>`, `clipPath`, or CSS targeting by id.
88
+
89
+ ## Theming with currentColor
90
+
91
+ To make SVGs theme-aware, use `currentColor`:
92
+
93
+ ```svg
94
+ <!-- Bad: hardcoded brand color -->
95
+ <svg viewBox="0 0 24 24"><path d="..." fill="#0064FF"/></svg>
96
+
97
+ <!-- Good: themeable -->
98
+ <svg viewBox="0 0 24 24"><path d="..." fill="currentColor"/></svg>
99
+ ```
100
+
101
+ ```css
102
+ .icon { color: var(--color-brand-default); }
103
+ ```
104
+
105
+ Now the SVG inherits color from CSS. Dark mode? Just change the variable.
106
+
107
+ For multi-color illustrations, use CSS variables in the SVG (requires inline SVG or CSS-aware loader):
108
+
109
+ ```svg
110
+ <svg viewBox="0 0 240 240">
111
+ <circle cx="120" cy="120" r="100" fill="var(--color-bg-illo, #E0F2FF)" />
112
+ <path d="..." fill="var(--color-brand-default, #0064FF)" />
113
+ </svg>
114
+ ```
115
+
116
+ The fallback after the comma is the static value — used if CSS variables aren't applied.
117
+
118
+ ## Inline vs `<img src>` vs `<object>`
119
+
120
+ | Method | When | Pros | Cons |
121
+ | --- | --- | --- | --- |
122
+ | **Inline `<svg>`** in HTML / JSX | Theming, animation, SVG you control | Full theming, full animation | Bigger HTML, no caching of SVG itself |
123
+ | **`<img src="...svg">`** | Decorative, no theming needed | Cacheable, simple | No CSS targeting from outside |
124
+ | **`<object>` / `<iframe>`** | Rare | SVG can have its own CSS | Layout edge cases |
125
+ | **CSS `background-image: url(...svg)`** | Decorative backgrounds | Cacheable | No theming, no animation |
126
+
127
+ Default: **inline** for icons / themed illustrations; **`<img>`** for static illustrations.
128
+
129
+ For React, popular pattern is inline-as-component:
130
+
131
+ ```tsx
132
+ // SearchEmpty.tsx
133
+ export function SearchEmptyIllustration({ className, ...props }: SVGProps) {
134
+ return (
135
+ <svg viewBox="0 0 240 240" className={className} {...props}>
136
+ <path d="..." fill="currentColor" />
137
+ </svg>
138
+ );
139
+ }
140
+ ```
141
+
142
+ Build tool (vite-svg-loader, SVGR, esbuild-plugin-svgr) auto-converts SVG files to React components.
143
+
144
+ ## Avoiding common pitfalls
145
+
146
+ ### 1. Don't lose theming during optimization
147
+
148
+ SVGO can replace `currentColor` with the value if it's not careful. Whitelist `currentColor`:
149
+
150
+ ```js
151
+ // In svgo config
152
+ {
153
+ name: "convertColors",
154
+ params: { currentColor: false }, // Don't replace currentColor
155
+ }
156
+ ```
157
+
158
+ ### 2. Don't strip ids you reference
159
+
160
+ If your CSS or JS targets `#illo-bg` inside SVG, `cleanupIds: false` and explicit preservation needed.
161
+
162
+ ### 3. Don't strip viewBox
163
+
164
+ Without viewBox, SVG renders at intrinsic size and won't respond to `width` / `height` CSS.
165
+
166
+ ### 4. Don't inline raster
167
+
168
+ Some Figma exports embed PNGs as base64 inside SVG. This defeats the point — you have an SVG wrapper around a PNG. Identify with:
169
+
170
+ ```bash
171
+ grep "data:image" myfile.svg
172
+ ```
173
+
174
+ If found: re-export with the raster as a separate file, OR redraw the part as vector.
175
+
176
+ ### 5. Don't keep editor metadata
177
+
178
+ ```bash
179
+ # Check size before / after
180
+ ls -la myfile.svg # 80kB
181
+ svgo myfile.svg
182
+ ls -la myfile.svg # 8kB
183
+ ```
184
+
185
+ If your "after" is still 30kB+, something didn't strip — open and check.
186
+
187
+ ## Accessibility
188
+
189
+ ### Decorative SVG
190
+
191
+ ```html
192
+ <svg aria-hidden="true" focusable="false">...</svg>
193
+ ```
194
+
195
+ `aria-hidden` removes from a11y tree. `focusable="false"` prevents keyboard focus on the SVG element (important for IE/legacy; defensive in modern browsers).
196
+
197
+ ### Meaningful SVG (conveys information)
198
+
199
+ ```html
200
+ <svg role="img" aria-label="결제 완료">
201
+ <title>결제 완료</title>
202
+ ...
203
+ </svg>
204
+ ```
205
+
206
+ `role="img"` + `aria-label` is the cleanest. `<title>` element inside SVG is also read by some screen readers — defense in depth.
207
+
208
+ ### Interactive SVG (button, link)
209
+
210
+ ```html
211
+ <svg role="button" aria-label="닫기" tabindex="0" onclick="..." onkeydown="...">
212
+ ...
213
+ </svg>
214
+ ```
215
+
216
+ Better: wrap the SVG in a real `<button>` and let the SVG be decorative. Avoids handling keyboard manually.
217
+
218
+ ## Performance
219
+
220
+ | Metric | Target |
221
+ | --- | --- |
222
+ | Inline SVG (icon-sized, < 32px) | < 1kB |
223
+ | Inline SVG (spot illustration, 100-200px) | < 10kB |
224
+ | Hero SVG | < 100kB; ideal < 50kB |
225
+ | Path count per SVG | < 200 (above this, consider raster) |
226
+ | Distinct gradients | < 5 (browsers de-dupe; > 10 hurts paint) |
227
+ | Filters (blur, drop-shadow) | Use sparingly; expensive |
228
+
229
+ For SVG with > 500 paths (very detailed): seriously consider a WebP / AVIF instead. Browsers paint thousands of paths slowly on mobile.
230
+
231
+ ## Animation in SVG
232
+
233
+ SVG can animate via:
234
+
235
+ | Method | Use |
236
+ | --- | --- |
237
+ | **CSS animation on SVG elements** | Hover effects, simple loops |
238
+ | **SMIL** (`<animate>`, `<animateTransform>`) | Legacy; deprecated in some browsers; avoid for new |
239
+ | **JavaScript (GSAP, Framer Motion)** | Complex animation, scroll-triggered |
240
+ | **Lottie** | Designer-led; bypasses SVG animation entirely |
241
+
242
+ For most cases: CSS animation on inline SVG is the best balance. SMIL is dead. Lottie when designer makes it in After Effects.
243
+
244
+ ```css
245
+ @keyframes spin {
246
+ to { transform: rotate(360deg); }
247
+ }
248
+ .spinner svg {
249
+ animation: spin 1s linear infinite;
250
+ }
251
+ ```
252
+
253
+ `prefers-reduced-motion` rules apply — pause / freeze on reduce.
254
+
255
+ ## Sprite vs separate files
256
+
257
+ | Approach | Use |
258
+ | --- | --- |
259
+ | **One SVG sprite** (one file, many `<symbol>` IDs, referenced via `<use>`) | Many icons, want HTTP single-fetch |
260
+ | **Separate SVG files** | Treeshaking with build tools, modern HTTP/2/3 |
261
+ | **React component per SVG** (most common modern) | React apps, full type-safety, easy theming |
262
+
263
+ With HTTP/2/3 multiplexing, separate files are usually fine. Sprites add build complexity. For most projects: separate files / per-component is simpler.
264
+
265
+ ## Workflow checklist
266
+
267
+ For each new illustration:
268
+
269
+ - [ ] Created at canvas size matching display (don't scale up small canvas)
270
+ - [ ] Strokes converted to fills (or kept as strokes — pick one and stay consistent)
271
+ - [ ] Text either converted to paths OR uses Pretendard / system fonts (safe for cross-platform)
272
+ - [ ] Brand colors replaced with `currentColor` or CSS variables
273
+ - [ ] Run through SVGO with config above
274
+ - [ ] viewBox preserved
275
+ - [ ] No embedded raster (`grep "data:image"`)
276
+ - [ ] No editor metadata (`grep -E "sodipodi|inkscape|sketch:"`)
277
+ - [ ] File size < target for category (1kB icon, 10kB spot, 50kB hero)
278
+ - [ ] Accessibility: `aria-hidden` for decorative, `role="img"` + `aria-label` for meaningful
279
+ - [ ] Tested in light + dark modes
280
+ - [ ] Tested at 1×, 2×, 3× device pixel ratio (cribs / blur check)
281
+
282
+ ## Tools
283
+
284
+ | Tool | Use |
285
+ | --- | --- |
286
+ | **SVGO** | CLI optimizer; mandatory |
287
+ | **SVGOMG** (svgomg.net) | Web UI for SVGO; preview before/after |
288
+ | **vite-plugin-svgr / SVGR** | SVG → React component build |
289
+ | **Figma → "Copy as SVG"** | Fast extraction; still needs SVGO |
290
+ | **Adobe Illustrator → "Save for Web"** | Slightly cleaner output than Figma |
291
+ | **PurgeCSS / unused style sweep** | After build, ensure unused SVG IDs / classes purged |
292
+
293
+ ## Don't
294
+
295
+ - Don't ship raw Figma exports — always SVGO.
296
+ - Don't keep `width` / `height` attributes on the `<svg>` if you want it responsive — use viewBox + CSS sizing.
297
+ - Don't embed raster inside SVG. Defeats the format.
298
+ - Don't bake brand color as raw hex — use `currentColor` or CSS variables.
299
+ - Don't make 100 separate SVG components when an inline icon font / sprite would do (icons specifically).
300
+ - Don't ignore reduced-motion when SVG animates.
301
+
302
+ ## Cross-reference
303
+
304
+ - [`knowledge/illustration/illustration-systems.md`](illustration-systems.md) — system foundation
305
+ - [`knowledge/illustration/spot-illustrations.md`](spot-illustrations.md) — production rules
306
+ - [`knowledge/illustration/hero-illustrations.md`](hero-illustrations.md) — performance targets
307
+ - [`knowledge/icons/curated-sets.md`](../icons/curated-sets.md) — icon system
308
+ - [`knowledge/motion/motion-tools.md`](../motion/motion-tools.md) — Lottie alternative
@@ -0,0 +1,119 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: Spacing, grid, and responsive layout
4
+ applies_to: [web, mobile, all-ui]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # Spacing, grid, and responsive layout
11
+
12
+ ## The 4-or-8 rule
13
+
14
+ Pick one base unit and use **only multiples**. Most systems pick **4 px** (with 8 px subset). Tailwind defaults to 4. Material defaults to 4. Ant Design's `sizeUnit` is 4.
15
+
16
+ **Why 4 not 8?** 4 lets you express tight component padding (e.g., 12 px, 20 px) without breaking grid. 8-only is simpler but produces blocky UIs.
17
+
18
+ The canonical scale derived from base 4:
19
+
20
+ ```
21
+ 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128
22
+ ```
23
+
24
+ **Skip 28, 36, 44, 52, 56**: they are intermediate steps that should be expressed as `+8` from neighbors when truly needed, not added to the scale.
25
+
26
+ ## Spacing tokens
27
+
28
+ Name spacing tokens by **role**, not value:
29
+
30
+ ```
31
+ ✗ space-12
32
+ ✓ space-md OR component-padding-y
33
+ ```
34
+
35
+ Two-axis naming is the cleanest:
36
+ - **`space-2xs / xs / sm / md / lg / xl / 2xl / 3xl`** for layout (4, 8, 12, 16, 24, 32, 48, 64).
37
+ - **`gap-x` / `gap-y`** for component-internal spacing.
38
+ - **`inset`** vs **`stack`** vs **`inline`** (Braid/Mirage style) — fancier but disambiguates "padding inside" vs "vertical rhythm" vs "horizontal flow".
39
+
40
+ ## Grid systems
41
+
42
+ | System | Columns | Gutter | Margin |
43
+ | --- | --- | --- | --- |
44
+ | 12-column (Bootstrap, Ant) | 12 | 16–24 px | 24 px (mobile) → 80+ px (desktop) |
45
+ | 8-point grid | flexible | 8 multiples | aligns to 8 |
46
+ | Material | 4-column (mobile), 8 (tablet), 12 (desktop) | 16/24/24 | 16/24/24 |
47
+ | Editorial | 6-column or asymmetric | wide | wide |
48
+
49
+ For most product UIs: **12 columns, 24 px gutter, 24 px outer margin on mobile, scaling**.
50
+
51
+ ## Breakpoints
52
+
53
+ The pragmatic set, ordered by frequency of use:
54
+
55
+ | Name | Min width | Usage |
56
+ | --- | --- | --- |
57
+ | `xs` | 0 | Mobile portrait. Single column, full-width buttons. |
58
+ | `sm` | 640 px | Large mobile / phablet. |
59
+ | `md` | 768 px | Tablet portrait, foldables. |
60
+ | `lg` | 1024 px | Tablet landscape, small laptops. |
61
+ | `xl` | 1280 px | Desktop. |
62
+ | `2xl` | 1536 px | Large desktop. |
63
+
64
+ Tailwind v4 defaults match exactly (mobile-first). Ant Design uses 576/768/992/1200/1600 — slightly different, less aligned with modern devices.
65
+
66
+ **Mobile-first**: write base styles for mobile, use `min-width` queries to add desktop adjustments. Don't author for desktop and shrink down.
67
+
68
+ ## Container queries vs media queries
69
+
70
+ Use container queries when:
71
+ - A component reused at multiple sizes (a card in a grid AND in a sidebar).
72
+ - Layout depends on its own width, not the viewport.
73
+
74
+ Use media queries when:
75
+ - Page-level layout shifts (sidebar collapses, navigation opens).
76
+ - Typography scale changes globally.
77
+
78
+ ```css
79
+ @container card (min-width: 320px) {
80
+ .card { display: grid; grid-template-columns: 1fr 2fr; }
81
+ }
82
+ ```
83
+
84
+ Browser support: 2023+ all major browsers.
85
+
86
+ ## Density modes
87
+
88
+ Many products need at least two density modes:
89
+
90
+ | Mode | Use | Adjustments |
91
+ | --- | --- | --- |
92
+ | **Comfortable** (default) | Consumer apps, marketing | Standard padding, 16 px body |
93
+ | **Compact** | Power users, data tables, IDE-like UIs | -25% vertical padding, 14 px body, smaller controls (28 px height vs 32) |
94
+ | **Spacious** | First-time-user, accessibility mode | +25% padding, 16+ px body |
95
+
96
+ Implement as a CSS variable scale that all components consume:
97
+
98
+ ```css
99
+ :root[data-density="compact"] {
100
+ --space-md: 12px; /* normally 16 */
101
+ --control-height: 28px; /* normally 32 */
102
+ }
103
+ ```
104
+
105
+ ## Responsive type
106
+
107
+ Three approaches, pick one:
108
+
109
+ 1. **Stepped**: Different `font-size` at each breakpoint. Predictable, easy to QA. _Default for most projects._
110
+ 2. **Fluid (clamp)**: `font-size: clamp(1rem, 0.5rem + 2vw, 1.5rem)`. Smooth, harder to QA. Good for editorial.
111
+ 3. **Combined**: Stepped at small/medium, fluid above to fill wide screens. Most expressive, most work.
112
+
113
+ ## Common layout failures
114
+
115
+ - **No max-width on text content**: lines exceeding 75 chars hurt readability. Cap with `max-w-prose` (Tailwind) or `max-width: 65ch`.
116
+ - **Form fields full-width on desktop**: a 1200 px-wide email input looks broken. Cap at 480 px.
117
+ - **Card grids without min/max width**: pure `repeat(auto-fit, 1fr)` produces 50 px cards on tiny screens. Use `repeat(auto-fit, minmax(280px, 1fr))`.
118
+ - **Mobile drawer that scrolls behind backdrop**: scroll-locking the body is required.
119
+ - **No safe-area handling on iOS**: notch/home-bar overlap. `padding-top: env(safe-area-inset-top)`.
@@ -0,0 +1,277 @@
1
+ <!-- hand-written -->
2
+ ---
3
+ title: App loading sequences
4
+ applies_to: [splash, app-launch, route-transitions, progressive-load]
5
+ version: 1.0.0
6
+ last_updated: 2026-05
7
+ stability: stable
8
+ ---
9
+
10
+ # App loading sequences
11
+
12
+ The first 3 seconds of an app launch decide whether users feel the app is fast or slow. **Perceived performance** > actual performance. Design the loading sequence intentionally.
13
+
14
+ ## Three loading moments
15
+
16
+ | Moment | Duration | UX goal |
17
+ | --- | --- | --- |
18
+ | **Cold launch** (app first opens) | 0–3s | Make waiting feel intentional |
19
+ | **Warm launch** (app already in memory) | 0–500ms | Hide the load entirely |
20
+ | **Route change** (user navigates within app) | 0–500ms | Smooth transition |
21
+
22
+ Each needs different patterns.
23
+
24
+ ## Cold launch — splash + first paint
25
+
26
+ Native apps (iOS / Android) show a splash screen during launch. Web / PWA does similar via service worker + first paint.
27
+
28
+ ### Splash screen rules
29
+
30
+ - **Brand-led** — logo + brand color. No spinner.
31
+ - **Static or minimal motion**. Looping spinner reads as loading-stuck.
32
+ - **Match the first screen** — splash's bg color = first screen's bg color, so transition is seamless.
33
+ - **iOS / Android handle splash automatically** in many cases (LaunchScreen.storyboard / SplashScreen API).
34
+
35
+ ### iOS splash strategy
36
+
37
+ Use LaunchScreen.storyboard:
38
+ - Centered logo on brand background.
39
+ - No spinner (Apple HIG explicitly says no).
40
+ - Disappears as soon as React Native / web view is ready.
41
+
42
+ ### Android splash (API 31+)
43
+
44
+ Native SplashScreen API:
45
+ - Animated icon support
46
+ - Brand background color
47
+ - Auto-handles transition to app
48
+
49
+ For older Android: simple solid-color screen with logo.
50
+
51
+ ## Warm launch — invisible
52
+
53
+ When app is already in memory, launch should feel instant. < 500ms.
54
+
55
+ If you can't hit < 500ms:
56
+ - Show **same splash** (consistency).
57
+ - Or: snapshot of last app state (iOS does this automatically).
58
+
59
+ ## Route changes within app
60
+
61
+ Web / SPA / native apps: navigating between screens.
62
+
63
+ ### Three transition patterns
64
+
65
+ | Pattern | Use |
66
+ | --- | --- |
67
+ | **Cross-fade** | Default for content-led transitions. 200ms opacity. Calm. |
68
+ | **Slide-in** | Native iOS pattern. New screen slides from right; old slides left. |
69
+ | **Hero / shared element** | Element from old screen "transforms" into element on new screen (Material's shared transitions). |
70
+
71
+ ### Cross-fade (web default)
72
+
73
+ ```css
74
+ .page-transition-enter {
75
+ opacity: 0;
76
+ }
77
+ .page-transition-enter-active {
78
+ opacity: 1;
79
+ transition: opacity 200ms;
80
+ }
81
+ .page-transition-exit {
82
+ opacity: 1;
83
+ }
84
+ .page-transition-exit-active {
85
+ opacity: 0;
86
+ transition: opacity 200ms;
87
+ }
88
+ ```
89
+
90
+ For React Router with Framer Motion or React Transition Group: 5 lines.
91
+
92
+ For modern web: **View Transitions API** (browser-native, 2024+):
93
+
94
+ ```js
95
+ document.startViewTransition(() => {
96
+ // Update DOM
97
+ });
98
+ ```
99
+
100
+ Browser handles the cross-fade. Cleanest path for modern Chrome / Edge / Safari.
101
+
102
+ ### Slide-in (native pattern)
103
+
104
+ iOS native: `pushViewController` slides new screen from right. Back swipe slides it back.
105
+
106
+ For web: use Framer Motion `<AnimatePresence>` with `x` translation.
107
+
108
+ For React Native: `@react-navigation/native` handles it automatically.
109
+
110
+ ### Shared element / hero transitions
111
+
112
+ Most sophisticated. Element from screen A morphs into element on screen B.
113
+
114
+ ```
115
+ Screen A: [Card with image]
116
+ ↓ tap
117
+ Screen B: [Image full-bleed, card details below]
118
+
119
+ The image element animates (FLIP technique) from card position → full-bleed
120
+ ```
121
+
122
+ Tools:
123
+ - **Material You shared transitions** (Android native)
124
+ - **Framer Motion `layoutId`** (React)
125
+ - **View Transitions API** (web, with named transitions)
126
+ - **react-native-shared-element** (RN)
127
+
128
+ When to use:
129
+ - Photo gallery → detail view
130
+ - Card-grid → card-detail
131
+ - Logo persistence across pages
132
+
133
+ When to skip:
134
+ - Simple route changes (overkill)
135
+ - Rapid-tap navigation (animation can't keep up)
136
+
137
+ ## Progressive content loading
138
+
139
+ Once app is rendered, content arrives async. Three patterns:
140
+
141
+ ### 1. Skeleton coordination
142
+
143
+ Multiple skeletons load simultaneously. **Stagger the resolve** to avoid simultaneous flash:
144
+
145
+ ```
146
+ Fetch 3 sections in parallel:
147
+ - Header data: arrives at 200ms
148
+ - Body data: arrives at 350ms
149
+ - Footer data: arrives at 500ms
150
+
151
+ Don't replace each skeleton instantly. Coordinate:
152
+ - At 500ms (when slowest is ready), reveal all three with 50ms stagger.
153
+ - Total settle: 650ms with smooth orchestrated reveal.
154
+ ```
155
+
156
+ Or simpler: replace each skeleton as data arrives. Less coordinated but faster to ship.
157
+
158
+ ### 2. Pull-to-refresh
159
+
160
+ Mobile-native pattern. User pulls down → refresh indicator → data fetched → indicator hides.
161
+
162
+ | Phase | Behavior |
163
+ | --- | --- |
164
+ | Pull (1–80px) | List moves with finger |
165
+ | Past threshold (80px+) | Indicator appears |
166
+ | Release | List bounces back; indicator stays during fetch (typical 1–3s) |
167
+ | Done | Indicator fades; new content (if any) at top |
168
+
169
+ Cite [`knowledge/patterns/list-and-feed.md`](../patterns/list-and-feed.md).
170
+
171
+ ### 3. Infinite scroll triggers
172
+
173
+ User scrolls near bottom → next page loads.
174
+
175
+ ```
176
+ Scroll position 80% of total → trigger fetch
177
+ Spinner at bottom while loading
178
+ New items append (with 50ms entrance stagger)
179
+ ```
180
+
181
+ Don't:
182
+ - Reset scroll on append.
183
+ - Auto-scroll to new items (user is reading something).
184
+
185
+ ## Page state transitions
186
+
187
+ Beyond just loading: empty → loading → content → error states all need motion-aware transitions.
188
+
189
+ ```
190
+ Empty state visible
191
+ ↓ user adds item
192
+ ↓ list animates with new item entering
193
+ Content visible
194
+ ↓ user filters to nothing
195
+ ↓ items fade out
196
+ Empty state slides in (filtered variant)
197
+ ```
198
+
199
+ Each state-to-state transition is ~200ms. Cross-fade is the safe default.
200
+
201
+ ## Korean fintech app launch convention
202
+
203
+ Korean fintech apps (Toss, KakaoBank) often have:
204
+ - **Solid brand color splash** — yellow (Kakao) / blue (Toss).
205
+ - **No logo animation** — stays clean.
206
+ - **Biometric gate** appears immediately on launch (Face ID / Fingerprint).
207
+ - **After auth**: cross-fade to dashboard.
208
+
209
+ Total cold launch experience: 1.5–3s. The biometric gate is the bulk; actual app load hides under it.
210
+
211
+ Cite [`examples/component-biometric-gate.md`](../../examples/component-biometric-gate.md).
212
+
213
+ ## Reduced motion
214
+
215
+ For loading sequences:
216
+ - Splash: still show (brand recognition matters more than "no motion").
217
+ - Route transitions: instant cross-fade, no slide.
218
+ - Skeleton entrance: still show skeleton, but no shimmer animation.
219
+ - Hero / shared element: skip the morph, just instant layout change.
220
+
221
+ ## Performance — perceived vs actual
222
+
223
+ | Strategy | Perceived speed |
224
+ | --- | --- |
225
+ | Show app chrome (header, nav) immediately, content later | Faster |
226
+ | Show skeleton matching final layout | Faster |
227
+ | Animate progress (even fake) | Feels active |
228
+ | Optimistic UI (act on click before server confirms) | Instant |
229
+ | Keep stale data visible during refresh | Faster |
230
+
231
+ vs:
232
+
233
+ | Strategy | Slower perceived speed |
234
+ | --- | --- |
235
+ | Blank screen during load | Slowest |
236
+ | Spinner with no context | Slow |
237
+ | Block all interaction until loaded | Slow |
238
+
239
+ ## Code example — page transition wrapper (Framer Motion)
240
+
241
+ ```tsx
242
+ import { motion, AnimatePresence } from "framer-motion";
243
+
244
+ function PageTransition({ children, route }: Props) {
245
+ return (
246
+ <AnimatePresence mode="wait">
247
+ <motion.div
248
+ key={route}
249
+ initial={{ opacity: 0, y: 8 }}
250
+ animate={{ opacity: 1, y: 0 }}
251
+ exit={{ opacity: 0, y: -8 }}
252
+ transition={{ duration: 0.2, ease: "easeOut" }}
253
+ >
254
+ {children}
255
+ </motion.div>
256
+ </AnimatePresence>
257
+ );
258
+ }
259
+ ```
260
+
261
+ ## Don't
262
+
263
+ - Don't show looping spinner on splash. Brand-led is calmer.
264
+ - Don't animate route changes longer than 300ms.
265
+ - Don't transition every state change with motion. Only meaningful ones.
266
+ - Don't auto-replay splash on every cold launch — user has seen it.
267
+ - Don't ignore `prefers-reduced-motion` in transitions.
268
+ - Don't block interactivity during transitions (button clicks during fade should still work).
269
+
270
+ ## Cross-reference
271
+
272
+ - [`knowledge/motion/principles.md`](principles.md) — duration / easing fundamentals
273
+ - [`knowledge/motion/marketing-motion.md`](marketing-motion.md) — hero entrances
274
+ - [`knowledge/motion/choreography-depth.md`](choreography-depth.md) — multi-element coordination
275
+ - [`knowledge/motion/motion-tools.md`](motion-tools.md) — tool comparison
276
+ - [`knowledge/patterns/list-and-feed.md`](../patterns/list-and-feed.md) — pull-to-refresh + infinite scroll
277
+ - [`examples/component-biometric-gate.md`](../../examples/component-biometric-gate.md) — Korean launch gate