@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.
- package/.claude-plugin/plugin.json +164 -0
- package/AGENTS.ko.md +126 -0
- package/AGENTS.md +182 -0
- package/CHANGELOG.md +6883 -0
- package/CLAUDE.md +39 -0
- package/LICENSE +21 -0
- package/README.ko.md +245 -0
- package/README.md +277 -0
- package/agents/README.md +14 -0
- package/agents/a11y-reviewer.md +121 -0
- package/agents/component-architect.md +57 -0
- package/agents/design-critic.md +46 -0
- package/agents/token-extractor.md +63 -0
- package/cli/bin/design-ai-mcp.mjs +6 -0
- package/cli/bin/design-ai.mjs +40 -0
- package/cli/commands/audit.mjs +111 -0
- package/cli/commands/check.mjs +226 -0
- package/cli/commands/doctor.mjs +141 -0
- package/cli/commands/examples.mjs +58 -0
- package/cli/commands/help.mjs +271 -0
- package/cli/commands/install.mjs +161 -0
- package/cli/commands/learn.mjs +1871 -0
- package/cli/commands/list.mjs +143 -0
- package/cli/commands/mcp.mjs +27 -0
- package/cli/commands/pack.mjs +211 -0
- package/cli/commands/prompt.mjs +199 -0
- package/cli/commands/route.mjs +247 -0
- package/cli/commands/search.mjs +60 -0
- package/cli/commands/show.mjs +52 -0
- package/cli/commands/site.mjs +558 -0
- package/cli/commands/status.mjs +161 -0
- package/cli/commands/uninstall.mjs +119 -0
- package/cli/commands/update.mjs +184 -0
- package/cli/commands/version.mjs +94 -0
- package/cli/commands/workspace.mjs +176 -0
- package/cli/lib/brief.mjs +52 -0
- package/cli/lib/check.mjs +642 -0
- package/cli/lib/dispatch.mjs +109 -0
- package/cli/lib/doctor.mjs +505 -0
- package/cli/lib/examples.mjs +258 -0
- package/cli/lib/exec.mjs +63 -0
- package/cli/lib/help-flags.mjs +5 -0
- package/cli/lib/learn.mjs +3694 -0
- package/cli/lib/log.mjs +47 -0
- package/cli/lib/mcp-server.mjs +426 -0
- package/cli/lib/output.mjs +101 -0
- package/cli/lib/pack.mjs +599 -0
- package/cli/lib/paths.mjs +63 -0
- package/cli/lib/prompt.mjs +603 -0
- package/cli/lib/route.mjs +740 -0
- package/cli/lib/search.mjs +158 -0
- package/cli/lib/show.mjs +161 -0
- package/cli/lib/signals.mjs +2337 -0
- package/cli/lib/site.mjs +6617 -0
- package/cli/lib/skill-proposals.mjs +2046 -0
- package/cli/lib/suggest.mjs +66 -0
- package/cli/lib/workspace.mjs +1056 -0
- package/commands/README.md +25 -0
- package/commands/component-spec.md +34 -0
- package/commands/conversational.md +44 -0
- package/commands/design-from-brief.md +141 -0
- package/commands/design-review.md +62 -0
- package/commands/document-from-brief.md +47 -0
- package/commands/extract-tokens.md +38 -0
- package/commands/game-ui.md +40 -0
- package/commands/illustration.md +37 -0
- package/commands/iterate.md +167 -0
- package/commands/motion-design.md +54 -0
- package/commands/palette-from-brand.md +50 -0
- package/commands/print.md +49 -0
- package/commands/slide-deck.md +46 -0
- package/commands/spatial.md +47 -0
- package/commands/stability-review.md +74 -0
- package/commands/video.md +42 -0
- package/commands/website-improvement.md +77 -0
- package/docs/AGENT-DEVELOPMENT.md +658 -0
- package/docs/AI-LEARNING.md +429 -0
- package/docs/AIDER-INTEGRATION.md +224 -0
- package/docs/ARCHITECTURE.ko.md +183 -0
- package/docs/ARCHITECTURE.md +105 -0
- package/docs/CODEX-INTEGRATION.md +311 -0
- package/docs/COMPANY-WEBSITE-DOGFOOD.ko.md +144 -0
- package/docs/COMPANY-WEBSITE-DOGFOOD.md +150 -0
- package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.ko.md +153 -0
- package/docs/COMPANY-WEBSITE-INTAKE-TEMPLATE.md +154 -0
- package/docs/CONTRIBUTING.ko.md +203 -0
- package/docs/CONTRIBUTING.md +242 -0
- package/docs/CURSOR-INTEGRATION.md +220 -0
- package/docs/DISTRIBUTION.ko.md +248 -0
- package/docs/DISTRIBUTION.md +253 -0
- package/docs/DOGFOOD-FINDINGS.md +180 -0
- package/docs/DOGFOOD-V4-FINDINGS.md +139 -0
- package/docs/DOGFOOD-V4-MKDOCS-FINDINGS.md +233 -0
- package/docs/DOGFOOD-V4-NPM-FINDINGS.md +157 -0
- package/docs/DOGFOOD-V4-VSCODE-FINDINGS.md +135 -0
- package/docs/FIGMA-INTEGRATION.md +222 -0
- package/docs/MCP-INTEGRATION.md +243 -0
- package/docs/MIGRATION-v4.md +121 -0
- package/docs/PLUGIN-PACKAGING.md +240 -0
- package/docs/PRODUCT-READINESS.md +66 -0
- package/docs/QUICKSTART.ko.md +178 -0
- package/docs/QUICKSTART.md +179 -0
- package/docs/RELEASE-CHECKLIST.md +292 -0
- package/docs/ROADMAP.md +19495 -0
- package/docs/SESSION-LOG.md +940 -0
- package/docs/TOKEN-SYNC.md +237 -0
- package/docs/USING.ko.md +206 -0
- package/docs/USING.md +218 -0
- package/docs/WEBSITE-IMPROVEMENT.ko.md +75 -0
- package/docs/WEBSITE-IMPROVEMENT.md +89 -0
- package/docs/announcements/README.md +56 -0
- package/docs/announcements/dev-to-korea.md +206 -0
- package/docs/announcements/hashnode-post.ko.md +232 -0
- package/docs/announcements/okky-post.ko.md +158 -0
- package/docs/announcements/press-kit.md +101 -0
- package/docs/announcements/reddit-r-korea.md +196 -0
- package/docs/announcements/show-hn.md +114 -0
- package/docs/announcements/twitter-thread.md +255 -0
- package/docs/external-status.md +34 -0
- package/docs/integrations/aider-walkthrough.ko.md +275 -0
- package/docs/integrations/aider-walkthrough.md +274 -0
- package/docs/integrations/codex-walkthrough.ko.md +297 -0
- package/docs/integrations/codex-walkthrough.md +297 -0
- package/docs/integrations/cursor-walkthrough.ko.md +281 -0
- package/docs/integrations/cursor-walkthrough.md +284 -0
- package/docs/integrations/design-ai-mcp-server.md +169 -0
- package/docs/integrations/figma-mcp.md +149 -0
- package/docs/integrations/github-mcp.md +178 -0
- package/docs/integrations/linear-mcp.md +215 -0
- package/docs/integrations/notion-mcp.md +174 -0
- package/docs/integrations/sdk-walkthrough.ko.md +375 -0
- package/docs/integrations/sdk-walkthrough.md +375 -0
- package/docs/integrations/slack-mcp.md +208 -0
- package/docs/integrations/vscode-walkthrough.ko.md +202 -0
- package/docs/integrations/vscode-walkthrough.md +205 -0
- package/docs/requirements.txt +16 -0
- package/docs/site-overrides/extra.css +83 -0
- package/docs/site-overrides/favicon.svg +4 -0
- package/docs/site-overrides/logo.svg +10 -0
- package/docs/site-overrides/main.html +18 -0
- package/docs/website-console/app.js +2540 -0
- package/docs/website-console/index.html +24 -0
- package/docs/website-console/styles.css +975 -0
- package/examples/README.md +252 -0
- package/examples/cases/dogfood-v4-korean-hr-onboarding.md +356 -0
- package/examples/component-accordion-actions.md +153 -0
- package/examples/component-accordion-details.md +147 -0
- package/examples/component-accordion-summary.md +180 -0
- package/examples/component-accordion.md +229 -0
- package/examples/component-account-card.md +284 -0
- package/examples/component-address-input.md +260 -0
- package/examples/component-affix.md +190 -0
- package/examples/component-alert-dialog.md +210 -0
- package/examples/component-alert-title.md +77 -0
- package/examples/component-alert.md +192 -0
- package/examples/component-amount-input.md +278 -0
- package/examples/component-anchor.md +198 -0
- package/examples/component-app-bar.md +249 -0
- package/examples/component-aspect-ratio.md +156 -0
- package/examples/component-auto-complete.md +199 -0
- package/examples/component-avatar-group.md +170 -0
- package/examples/component-avatar.md +191 -0
- package/examples/component-back-top.md +123 -0
- package/examples/component-backdrop.md +148 -0
- package/examples/component-badge.md +181 -0
- package/examples/component-banner.md +237 -0
- package/examples/component-biometric-gate.md +281 -0
- package/examples/component-blockquote.md +153 -0
- package/examples/component-border-beam.md +207 -0
- package/examples/component-bottom-navigation.md +226 -0
- package/examples/component-box.md +112 -0
- package/examples/component-breadcrumb.md +222 -0
- package/examples/component-button-base.md +190 -0
- package/examples/component-button-group.md +117 -0
- package/examples/component-button.md +213 -0
- package/examples/component-calendar.md +280 -0
- package/examples/component-callout.md +131 -0
- package/examples/component-card-actions.md +101 -0
- package/examples/component-card-content.md +90 -0
- package/examples/component-card-header.md +122 -0
- package/examples/component-card-media.md +79 -0
- package/examples/component-card.md +233 -0
- package/examples/component-carousel.md +266 -0
- package/examples/component-cascader.md +135 -0
- package/examples/component-category-picker.md +271 -0
- package/examples/component-chart.md +237 -0
- package/examples/component-chat-interface.md +399 -0
- package/examples/component-checkbox.md +149 -0
- package/examples/component-click-away-listener.md +87 -0
- package/examples/component-code.md +213 -0
- package/examples/component-collapsible.md +219 -0
- package/examples/component-color-picker.md +110 -0
- package/examples/component-combobox.md +267 -0
- package/examples/component-command.md +299 -0
- package/examples/component-config-provider.md +190 -0
- package/examples/component-context-menu.md +179 -0
- package/examples/component-css-baseline.md +148 -0
- package/examples/component-date-picker.md +249 -0
- package/examples/component-descriptions.md +242 -0
- package/examples/component-dialog-actions.md +111 -0
- package/examples/component-dialog-content-text.md +76 -0
- package/examples/component-dialog-content.md +105 -0
- package/examples/component-dialog-title.md +104 -0
- package/examples/component-dialog.md +176 -0
- package/examples/component-divider.md +182 -0
- package/examples/component-doc-page.md +217 -0
- package/examples/component-drawer.md +257 -0
- package/examples/component-dropdown.md +220 -0
- package/examples/component-email-layout.md +253 -0
- package/examples/component-empty-state.md +269 -0
- package/examples/component-empty.md +172 -0
- package/examples/component-fade.md +87 -0
- package/examples/component-feature-grid.md +201 -0
- package/examples/component-field.md +266 -0
- package/examples/component-filled-input.md +114 -0
- package/examples/component-flex.md +117 -0
- package/examples/component-float-button.md +214 -0
- package/examples/component-form-control-label.md +134 -0
- package/examples/component-form-control.md +113 -0
- package/examples/component-form-controls.md +251 -0
- package/examples/component-form-group.md +86 -0
- package/examples/component-form-helper-text.md +95 -0
- package/examples/component-form-label.md +98 -0
- package/examples/component-form.md +291 -0
- package/examples/component-game-hud.md +362 -0
- package/examples/component-game-menu.md +327 -0
- package/examples/component-grid.md +140 -0
- package/examples/component-grow.md +79 -0
- package/examples/component-hero-block.md +252 -0
- package/examples/component-hover-card.md +211 -0
- package/examples/component-icon-button.md +142 -0
- package/examples/component-icon.md +102 -0
- package/examples/component-illustration.md +280 -0
- package/examples/component-image-list.md +107 -0
- package/examples/component-image.md +282 -0
- package/examples/component-input-adornment.md +101 -0
- package/examples/component-input-base.md +134 -0
- package/examples/component-input-number.md +141 -0
- package/examples/component-input-otp.md +271 -0
- package/examples/component-input.md +213 -0
- package/examples/component-item.md +243 -0
- package/examples/component-kbd.md +197 -0
- package/examples/component-krw-amount.md +219 -0
- package/examples/component-label.md +118 -0
- package/examples/component-layout.md +217 -0
- package/examples/component-link.md +223 -0
- package/examples/component-list-item-avatar.md +72 -0
- package/examples/component-list-item-button.md +139 -0
- package/examples/component-list-item-icon.md +82 -0
- package/examples/component-list-item-text.md +98 -0
- package/examples/component-list-item.md +116 -0
- package/examples/component-list-subheader.md +70 -0
- package/examples/component-list.md +198 -0
- package/examples/component-loading-button.md +125 -0
- package/examples/component-loading-sequence.md +254 -0
- package/examples/component-lottie-player.md +279 -0
- package/examples/component-masonry.md +191 -0
- package/examples/component-mentions.md +189 -0
- package/examples/component-menu-item.md +102 -0
- package/examples/component-menu-list.md +98 -0
- package/examples/component-menu.md +139 -0
- package/examples/component-menubar.md +259 -0
- package/examples/component-message.md +162 -0
- package/examples/component-mobile-stepper.md +155 -0
- package/examples/component-modal.md +220 -0
- package/examples/component-navigation-menu.md +295 -0
- package/examples/component-notification.md +166 -0
- package/examples/component-otp-countdown.md +245 -0
- package/examples/component-outlined-input.md +145 -0
- package/examples/component-page-transition.md +281 -0
- package/examples/component-pagination.md +226 -0
- package/examples/component-paper.md +199 -0
- package/examples/component-pass-auth.md +265 -0
- package/examples/component-payment-brand-button.md +253 -0
- package/examples/component-payment-method-selector.md +272 -0
- package/examples/component-payment-receipt.md +277 -0
- package/examples/component-popconfirm.md +144 -0
- package/examples/component-popover.md +239 -0
- package/examples/component-popper.md +129 -0
- package/examples/component-pricing-cards.md +247 -0
- package/examples/component-progress.md +195 -0
- package/examples/component-qr-code.md +201 -0
- package/examples/component-radio.md +167 -0
- package/examples/component-rate.md +202 -0
- package/examples/component-resizable.md +163 -0
- package/examples/component-result.md +270 -0
- package/examples/component-scroll-area.md +199 -0
- package/examples/component-scroll-reveal.md +320 -0
- package/examples/component-segmented.md +178 -0
- package/examples/component-select.md +258 -0
- package/examples/component-separator.md +177 -0
- package/examples/component-sheet.md +277 -0
- package/examples/component-sidebar.md +257 -0
- package/examples/component-skeleton.md +178 -0
- package/examples/component-slide.md +89 -0
- package/examples/component-slider.md +208 -0
- package/examples/component-snackbar-content.md +92 -0
- package/examples/component-snackbar.md +121 -0
- package/examples/component-sonner.md +165 -0
- package/examples/component-space.md +125 -0
- package/examples/component-spatial-locomotion.md +373 -0
- package/examples/component-spatial-panel.md +330 -0
- package/examples/component-speed-dial-action.md +78 -0
- package/examples/component-speed-dial.md +177 -0
- package/examples/component-spin.md +173 -0
- package/examples/component-spinner.md +204 -0
- package/examples/component-splitter.md +210 -0
- package/examples/component-stack.md +130 -0
- package/examples/component-statistic.md +282 -0
- package/examples/component-step-button.md +157 -0
- package/examples/component-step-connector.md +157 -0
- package/examples/component-step-content.md +121 -0
- package/examples/component-step-icon.md +115 -0
- package/examples/component-step-label.md +101 -0
- package/examples/component-step.md +84 -0
- package/examples/component-steps.md +264 -0
- package/examples/component-stock-chart.md +251 -0
- package/examples/component-swipeable-drawer.md +149 -0
- package/examples/component-switch.md +99 -0
- package/examples/component-tab-scroll-button.md +180 -0
- package/examples/component-tab.md +120 -0
- package/examples/component-table-body.md +82 -0
- package/examples/component-table-cell.md +118 -0
- package/examples/component-table-container.md +75 -0
- package/examples/component-table-footer.md +72 -0
- package/examples/component-table-head.md +78 -0
- package/examples/component-table-pagination.md +137 -0
- package/examples/component-table-row.md +113 -0
- package/examples/component-table-sort-label.md +109 -0
- package/examples/component-table.md +202 -0
- package/examples/component-tabs.md +184 -0
- package/examples/component-tag-badge.md +309 -0
- package/examples/component-tag.md +102 -0
- package/examples/component-testimonial-carousel.md +218 -0
- package/examples/component-textarea-autosize.md +114 -0
- package/examples/component-textarea.md +173 -0
- package/examples/component-time-picker.md +205 -0
- package/examples/component-timeline.md +170 -0
- package/examples/component-toast.md +224 -0
- package/examples/component-toggle-button.md +129 -0
- package/examples/component-toggle.md +220 -0
- package/examples/component-toolbar.md +104 -0
- package/examples/component-tooltip.md +178 -0
- package/examples/component-tour.md +176 -0
- package/examples/component-transaction-list-item.md +243 -0
- package/examples/component-transfer.md +156 -0
- package/examples/component-tree-select.md +202 -0
- package/examples/component-tree.md +297 -0
- package/examples/component-typography.md +215 -0
- package/examples/component-upload.md +295 -0
- package/examples/component-video-hero.md +409 -0
- package/examples/component-video-player.md +340 -0
- package/examples/component-voice-input.md +408 -0
- package/examples/component-watermark.md +217 -0
- package/examples/component-zoom.md +92 -0
- package/examples/doc-explanation-example.md +196 -0
- package/examples/doc-how-to-example.md +205 -0
- package/examples/doc-tutorial-example.md +162 -0
- package/examples/dogfood-korean-fintech-system.md +433 -0
- package/examples/email-transactional-example.md +259 -0
- package/examples/palette-saas-violet.md +235 -0
- package/examples/print-business-card-spec.md +205 -0
- package/examples/print-packaging-spec.md +285 -0
- package/examples/report-example.md +228 -0
- package/examples/slide-deck-example.md +237 -0
- package/examples/website-improvement-report.md +128 -0
- package/examples/website-improvement-workspace.json +126 -0
- package/install.sh +189 -0
- package/knowledge/COVERAGE.md +740 -0
- package/knowledge/PRINCIPLES.md +108 -0
- package/knowledge/a11y/contrast.md +70 -0
- package/knowledge/a11y/keyboard-and-focus.md +108 -0
- package/knowledge/colors/color-theory.md +90 -0
- package/knowledge/colors/mui-palette-structure.md +105 -0
- package/knowledge/colors/palettes-by-product-type.md +876 -0
- package/knowledge/components/INDEX.md +231 -0
- package/knowledge/components/index.json +1470 -0
- package/knowledge/components/shadcn-registry.md +159 -0
- package/knowledge/conversational/ai-chat-interfaces.md +323 -0
- package/knowledge/conversational/chatbot-design.md +312 -0
- package/knowledge/conversational/conversational-ui-fundamentals.md +299 -0
- package/knowledge/conversational/korean-voice-conventions.md +281 -0
- package/knowledge/conversational/voice-ui-patterns.md +297 -0
- package/knowledge/design-tokens/ant-design.md +124 -0
- package/knowledge/design-tokens/material-3.md +235 -0
- package/knowledge/design-tokens/polaris-and-carbon.md +231 -0
- package/knowledge/design-tokens/tailwind-v4.md +284 -0
- package/knowledge/game-ui/game-accessibility.md +317 -0
- package/knowledge/game-ui/game-ui-fundamentals.md +281 -0
- package/knowledge/game-ui/hud-design.md +324 -0
- package/knowledge/game-ui/korean-gaming-conventions.md +312 -0
- package/knowledge/game-ui/menu-systems.md +388 -0
- package/knowledge/i18n/korean-app-store-visual.md +223 -0
- package/knowledge/i18n/korean-document-style.md +301 -0
- package/knowledge/i18n/korean-payments.md +211 -0
- package/knowledge/i18n/korean-product-conventions.md +96 -0
- package/knowledge/i18n/korean-publishing.md +139 -0
- package/knowledge/i18n/korean-typography.md +123 -0
- package/knowledge/icons/curated-sets.md +225 -0
- package/knowledge/illustration/hero-illustrations.md +234 -0
- package/knowledge/illustration/illustration-systems.md +221 -0
- package/knowledge/illustration/mascot-design.md +208 -0
- package/knowledge/illustration/spot-illustrations.md +246 -0
- package/knowledge/illustration/svg-optimization.md +308 -0
- package/knowledge/layout/spacing-and-grid.md +119 -0
- package/knowledge/motion/app-loading-sequences.md +277 -0
- package/knowledge/motion/choreography-depth.md +297 -0
- package/knowledge/motion/marketing-motion.md +223 -0
- package/knowledge/motion/micro-interactions.md +266 -0
- package/knowledge/motion/motion-tools.md +281 -0
- package/knowledge/motion/principles.md +126 -0
- package/knowledge/patterns/auth-flow-design.md +316 -0
- package/knowledge/patterns/b2b-onboarding-flows.md +182 -0
- package/knowledge/patterns/brand-identity.md +238 -0
- package/knowledge/patterns/brand-references.md +97 -0
- package/knowledge/patterns/chart-color-encoding.md +269 -0
- package/knowledge/patterns/chart-types.md +344 -0
- package/knowledge/patterns/dashboard-composition.md +299 -0
- package/knowledge/patterns/design-system-qa.md +356 -0
- package/knowledge/patterns/document-typography.md +248 -0
- package/knowledge/patterns/email-design.md +338 -0
- package/knowledge/patterns/empty-states.md +263 -0
- package/knowledge/patterns/error-states.md +318 -0
- package/knowledge/patterns/form-design.md +237 -0
- package/knowledge/patterns/information-architecture.md +341 -0
- package/knowledge/patterns/landing-hero-design.md +283 -0
- package/knowledge/patterns/landing-page-patterns.md +681 -0
- package/knowledge/patterns/list-and-feed.md +371 -0
- package/knowledge/patterns/mobile-navigation.md +278 -0
- package/knowledge/patterns/money-and-amount.md +301 -0
- package/knowledge/patterns/onboarding.md +300 -0
- package/knowledge/patterns/pricing-page-design.md +261 -0
- package/knowledge/patterns/realtime-data.md +280 -0
- package/knowledge/patterns/report-design.md +330 -0
- package/knowledge/patterns/search-ux.md +373 -0
- package/knowledge/patterns/settings-page.md +325 -0
- package/knowledge/patterns/slide-deck-design.md +316 -0
- package/knowledge/patterns/styles-catalog.md +2599 -0
- package/knowledge/patterns/technical-writing.md +306 -0
- package/knowledge/patterns/ui-reasoning.md +1853 -0
- package/knowledge/patterns/ux-guidelines.md +1454 -0
- package/knowledge/platforms/react-native.md +395 -0
- package/knowledge/print/brochures-and-flyers.md +276 -0
- package/knowledge/print/korean-print-conventions.md +284 -0
- package/knowledge/print/packaging.md +321 -0
- package/knowledge/print/print-fundamentals.md +238 -0
- package/knowledge/print/signage-and-posters.md +235 -0
- package/knowledge/print/stationery.md +262 -0
- package/knowledge/spatial/ar-patterns.md +253 -0
- package/knowledge/spatial/comfort-and-accessibility.md +245 -0
- package/knowledge/spatial/spatial-design-fundamentals.md +346 -0
- package/knowledge/spatial/spatial-ui-elements.md +343 -0
- package/knowledge/spatial/vr-patterns.md +302 -0
- package/knowledge/typography/font-pairings.md +332 -0
- package/knowledge/typography/mui-type-scale.md +57 -0
- package/knowledge/typography/type-scale-fundamentals.md +105 -0
- package/knowledge/video/in-product-video.md +277 -0
- package/knowledge/video/korean-video-conventions.md +247 -0
- package/knowledge/video/marketing-video.md +258 -0
- package/knowledge/video/social-and-short-form.md +257 -0
- package/knowledge/video/video-fundamentals.md +296 -0
- package/package.json +106 -0
- package/skills/README.md +39 -0
- package/skills/color-palette/PLAYBOOK.md +175 -0
- package/skills/color-palette/SKILL.md +6 -0
- package/skills/color-palette/TEMPLATE.md +103 -0
- package/skills/component-spec-writer/PLAYBOOK.md +169 -0
- package/skills/component-spec-writer/SKILL.md +6 -0
- package/skills/component-spec-writer/TEMPLATE.md +115 -0
- package/skills/conversational-ui-designer/PLAYBOOK.md +231 -0
- package/skills/conversational-ui-designer/SKILL.md +6 -0
- package/skills/design-broadcast/PLAYBOOK.md +146 -0
- package/skills/design-broadcast/SKILL.md +6 -0
- package/skills/design-critique/PLAYBOOK.md +137 -0
- package/skills/design-critique/SKILL.md +6 -0
- package/skills/design-pr-review/PLAYBOOK.md +171 -0
- package/skills/design-pr-review/SKILL.md +6 -0
- package/skills/design-system-builder/PLAYBOOK.md +218 -0
- package/skills/design-system-builder/SKILL.md +6 -0
- package/skills/design-system-qa/PLAYBOOK.md +163 -0
- package/skills/design-system-qa/SKILL.md +6 -0
- package/skills/document-author/PLAYBOOK.md +167 -0
- package/skills/document-author/SKILL.md +6 -0
- package/skills/figma-token-sync/PLAYBOOK.md +149 -0
- package/skills/figma-token-sync/SKILL.md +6 -0
- package/skills/game-ui-designer/PLAYBOOK.md +209 -0
- package/skills/game-ui-designer/SKILL.md +6 -0
- package/skills/handoff-spec/PLAYBOOK.md +170 -0
- package/skills/handoff-spec/SKILL.md +6 -0
- package/skills/illustration-designer/PLAYBOOK.md +166 -0
- package/skills/illustration-designer/SKILL.md +6 -0
- package/skills/motion-designer/PLAYBOOK.md +223 -0
- package/skills/motion-designer/SKILL.md +6 -0
- package/skills/print-designer/PLAYBOOK.md +209 -0
- package/skills/print-designer/SKILL.md +6 -0
- package/skills/slide-deck-author/PLAYBOOK.md +198 -0
- package/skills/slide-deck-author/SKILL.md +6 -0
- package/skills/spatial-designer/PLAYBOOK.md +238 -0
- package/skills/spatial-designer/SKILL.md +6 -0
- package/skills/ux-audit/PLAYBOOK.md +142 -0
- package/skills/ux-audit/SKILL.md +6 -0
- package/skills/video-designer/PLAYBOOK.md +240 -0
- package/skills/video-designer/SKILL.md +6 -0
- package/skills/website-improvement/PLAYBOOK.md +118 -0
- package/skills/website-improvement/SKILL.md +6 -0
- package/skills/website-improvement/TEMPLATE.md +103 -0
- package/tools/audit/changelog-generate.py +176 -0
- package/tools/audit/check-coverage.py +483 -0
- package/tools/audit/doctor_assertions.py +256 -0
- package/tools/audit/example-qa.py +108 -0
- package/tools/audit/frontmatter-check.py +199 -0
- package/tools/audit/integration-check.py +95 -0
- package/tools/audit/korean-copy-check.py +161 -0
- package/tools/audit/link-check.py +146 -0
- package/tools/audit/local-ci.py +558 -0
- package/tools/audit/package-contents.py +723 -0
- package/tools/audit/package-smoke.py +22443 -0
- package/tools/audit/raw-hex-check.py +252 -0
- package/tools/audit/registry-smoke.py +8188 -0
- package/tools/audit/release-metadata.py +9832 -0
- package/tools/audit/run-all.py +351 -0
- package/tools/audit/smoke_assertions.py +12742 -0
- package/tools/audit/stability-review.py +332 -0
- package/tools/audit/stale-check.py +156 -0
- package/tools/migrations/add-version-frontmatter.py +132 -0
- package/tools/migrations/bump-last-updated.py +131 -0
- package/tools/migrations/promote-stability.py +172 -0
- package/tools/preview/README.md +58 -0
- 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)
|