@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,229 @@
|
|
|
1
|
+
# `Accordion` (Collapse) — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Collapse`, MUI `Accordion`, shadcn-ui `accordion`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A vertically stacked set of expandable sections. User clicks a header to reveal/hide the body. Optimized for content that's organized into named sections but doesn't all need to be visible at once.
|
|
8
|
+
|
|
9
|
+
## When Accordion vs Tabs vs always-visible
|
|
10
|
+
|
|
11
|
+
| Use Accordion | Use Tabs | Always visible |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Content sections that don't need parallel comparison | Sections that user switches between | Critical info that must always be visible |
|
|
14
|
+
| FAQ, settings groups, expandable details | Profile / Activity / Settings (mutually exclusive views) | Hero, primary data |
|
|
15
|
+
|
|
16
|
+
Don't use accordion for navigation between distinct screens — that's tabs or pages.
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌──────────────────────────────────────────────────┐
|
|
22
|
+
│ ▾ Section 1 title │ ← Header (button)
|
|
23
|
+
├──────────────────────────────────────────────────┤
|
|
24
|
+
│ Section 1 content... │ ← Body (revealed when expanded)
|
|
25
|
+
│ │
|
|
26
|
+
└──────────────────────────────────────────────────┘
|
|
27
|
+
┌──────────────────────────────────────────────────┐
|
|
28
|
+
│ ▸ Section 2 title │ ← Collapsed
|
|
29
|
+
└──────────────────────────────────────────────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
| Slot | Required | Notes |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| Trigger (header) | yes | Clickable; title + chevron. |
|
|
35
|
+
| Body | yes | Hidden when collapsed. |
|
|
36
|
+
| Chevron | yes (visual) | Rotates 90° on expand. |
|
|
37
|
+
| Icon (leading) | optional | Per-section icon. |
|
|
38
|
+
| Description (in header) | optional | Subtitle on header. |
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<Accordion type="single" defaultValue="section-1" collapsible>
|
|
44
|
+
<Accordion.Item value="section-1">
|
|
45
|
+
<Accordion.Trigger>Section 1 title</Accordion.Trigger>
|
|
46
|
+
<Accordion.Content>
|
|
47
|
+
Body content for section 1.
|
|
48
|
+
</Accordion.Content>
|
|
49
|
+
</Accordion.Item>
|
|
50
|
+
<Accordion.Item value="section-2">
|
|
51
|
+
<Accordion.Trigger>Section 2 title</Accordion.Trigger>
|
|
52
|
+
<Accordion.Content>
|
|
53
|
+
Body content for section 2.
|
|
54
|
+
</Accordion.Content>
|
|
55
|
+
</Accordion.Item>
|
|
56
|
+
</Accordion>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Prop (root) | Type | Default | Description |
|
|
60
|
+
| --- | --- | --- | --- |
|
|
61
|
+
| `type` | `"single" \| "multiple"` | `"single"` | Single: only one section open at a time. Multiple: any combination. |
|
|
62
|
+
| `value` / `defaultValue` | `string` (single) / `string[]` (multiple) | — | Open section(s) |
|
|
63
|
+
| `onValueChange` | `(value) => void` | — | |
|
|
64
|
+
| `collapsible` | `boolean` | `true` | When `single`: allow closing the open section (vs. always one open) |
|
|
65
|
+
| `disabled` | `boolean` | `false` | Disables all sections |
|
|
66
|
+
|
|
67
|
+
| Prop (Item) | Type | Description |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `value` | `string` | Required. Unique key. |
|
|
70
|
+
| `disabled` | `boolean` | Disables this section |
|
|
71
|
+
|
|
72
|
+
## Variants
|
|
73
|
+
|
|
74
|
+
| Variant | Use |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `bordered` (default) | 1px border around each item |
|
|
77
|
+
| `borderless` | No borders, hairline divider between items only |
|
|
78
|
+
| `card` | Each item is a card with shadow + radius |
|
|
79
|
+
| `flush` | Edge-to-edge, no border, divider between items (mobile-friendly) |
|
|
80
|
+
|
|
81
|
+
For settings-list patterns: `flush` is most common.
|
|
82
|
+
|
|
83
|
+
## States
|
|
84
|
+
|
|
85
|
+
| State | Trigger | Body | Chevron |
|
|
86
|
+
| --- | --- | --- | --- |
|
|
87
|
+
| Collapsed | resting | hidden, height 0 | →/▸ |
|
|
88
|
+
| Expanding | click on trigger | animating to natural height (200ms) | rotating |
|
|
89
|
+
| Expanded | settled | natural height | ↓/▾ |
|
|
90
|
+
| Collapsing | click on open trigger | animating to 0 (200ms) | rotating |
|
|
91
|
+
| Disabled | `disabled={true}` | hidden | muted |
|
|
92
|
+
| Hover | mouse-over header | bg slightly darker | — |
|
|
93
|
+
| Focus-visible | keyboard tab | 2px ring on header | — |
|
|
94
|
+
|
|
95
|
+
### Animating height
|
|
96
|
+
|
|
97
|
+
Use `grid-template-rows: 0fr → 1fr` (CSS-only, modern):
|
|
98
|
+
|
|
99
|
+
```css
|
|
100
|
+
.accordion-content {
|
|
101
|
+
display: grid;
|
|
102
|
+
grid-template-rows: 0fr;
|
|
103
|
+
transition: grid-template-rows 200ms ease-out;
|
|
104
|
+
}
|
|
105
|
+
.accordion-content[data-state="open"] {
|
|
106
|
+
grid-template-rows: 1fr;
|
|
107
|
+
}
|
|
108
|
+
.accordion-content > * {
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Or animate `max-height` (but it's CSS-hostile for variable content).
|
|
114
|
+
|
|
115
|
+
Radix's accordion uses CSS variables `--radix-collapsible-content-height` for the natural height — paste-ready.
|
|
116
|
+
|
|
117
|
+
## Sizes
|
|
118
|
+
|
|
119
|
+
| Size | Header height | Font | Padding |
|
|
120
|
+
| --- | --- | --- | --- |
|
|
121
|
+
| `sm` | 40px | 14px | 12px |
|
|
122
|
+
| `md` (default) | 48px | 15px | 16px |
|
|
123
|
+
| `lg` | 56px | 16px | 20px |
|
|
124
|
+
|
|
125
|
+
For mobile-touch: `md` minimum.
|
|
126
|
+
|
|
127
|
+
## Tokens consumed
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
--color-bg-default
|
|
131
|
+
--color-bg-subtle (header hover, body bg in some variants)
|
|
132
|
+
--color-bg-elevated (card variant)
|
|
133
|
+
--color-text-primary
|
|
134
|
+
--color-text-secondary
|
|
135
|
+
--color-border-default
|
|
136
|
+
--color-focus-ring
|
|
137
|
+
--space-md, --space-base
|
|
138
|
+
--radius-md
|
|
139
|
+
--motion-default (200ms expand/collapse)
|
|
140
|
+
--easing-in-out
|
|
141
|
+
--shadow-card (card variant)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Accessibility — WAI-ARIA Disclosure / Accordion pattern
|
|
145
|
+
|
|
146
|
+
- Each header is a `<button>` with `aria-expanded="true|false"`.
|
|
147
|
+
- Header has `aria-controls={bodyId}` linking to the body element.
|
|
148
|
+
- Body has `id={bodyId}`, `role="region"`, `aria-labelledby={headerId}`.
|
|
149
|
+
- For `type="single"`: this is the canonical Disclosure pattern.
|
|
150
|
+
- For `type="multiple"`: same pattern, just multiple `aria-expanded="true"` allowed.
|
|
151
|
+
|
|
152
|
+
### Keyboard
|
|
153
|
+
|
|
154
|
+
| Key | Behavior |
|
|
155
|
+
| --- | --- |
|
|
156
|
+
| `Tab` | Move focus through headers (skip hidden body) |
|
|
157
|
+
| `Enter` / `Space` | Toggle the focused section |
|
|
158
|
+
| `↑` / `↓` | Move focus between accordion headers (Radix convention; some implementations use Tab only) |
|
|
159
|
+
| `Home` / `End` | First / last header |
|
|
160
|
+
|
|
161
|
+
### Reduced motion
|
|
162
|
+
|
|
163
|
+
Disable height transition. Toggle is instant (no 200ms).
|
|
164
|
+
|
|
165
|
+
## Code example
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
// FAQ pattern
|
|
169
|
+
<Accordion type="single" collapsible>
|
|
170
|
+
<Accordion.Item value="how-to-cancel">
|
|
171
|
+
<Accordion.Trigger>구독을 어떻게 해지하나요?</Accordion.Trigger>
|
|
172
|
+
<Accordion.Content>
|
|
173
|
+
설정 → 구독 관리 → 해지하기에서 언제든 해지할 수 있습니다.
|
|
174
|
+
</Accordion.Content>
|
|
175
|
+
</Accordion.Item>
|
|
176
|
+
<Accordion.Item value="refund">
|
|
177
|
+
<Accordion.Trigger>환불은 어떻게 받나요?</Accordion.Trigger>
|
|
178
|
+
<Accordion.Content>
|
|
179
|
+
디지털 콘텐츠 7일 이내 환불 가능합니다. 고객센터로 문의해 주세요.
|
|
180
|
+
</Accordion.Content>
|
|
181
|
+
</Accordion.Item>
|
|
182
|
+
</Accordion>
|
|
183
|
+
|
|
184
|
+
// Settings sections (multiple)
|
|
185
|
+
<Accordion type="multiple" defaultValue={["account", "notifications"]}>
|
|
186
|
+
<Accordion.Item value="account">
|
|
187
|
+
<Accordion.Trigger>계정</Accordion.Trigger>
|
|
188
|
+
<Accordion.Content>...</Accordion.Content>
|
|
189
|
+
</Accordion.Item>
|
|
190
|
+
<Accordion.Item value="notifications">
|
|
191
|
+
<Accordion.Trigger>알림</Accordion.Trigger>
|
|
192
|
+
<Accordion.Content>...</Accordion.Content>
|
|
193
|
+
</Accordion.Item>
|
|
194
|
+
<Accordion.Item value="security">
|
|
195
|
+
<Accordion.Trigger>보안</Accordion.Trigger>
|
|
196
|
+
<Accordion.Content>...</Accordion.Content>
|
|
197
|
+
</Accordion.Item>
|
|
198
|
+
</Accordion>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Edge cases
|
|
202
|
+
|
|
203
|
+
- **Long body content scrolls into view as it expands**: scrolling the new content into view on expand is helpful for long sections — but only if it's currently below the fold.
|
|
204
|
+
- **Animating height with content that loads async**: as content arrives, the body re-animates if user is watching. Consider rendering all content (display:none) if heights need to be exact.
|
|
205
|
+
- **Nested accordions**: avoid. Re-design the hierarchy.
|
|
206
|
+
- **Accordion inside a modal**: works, but ensure the modal's max-height accommodates the expanded content.
|
|
207
|
+
- **One section open by default**: `defaultValue="..."` for type="single". Useful for FAQ where the most-asked question is open.
|
|
208
|
+
- **Close-all when scrolling**: anti-pattern. User-driven open/close should persist.
|
|
209
|
+
|
|
210
|
+
## Don't
|
|
211
|
+
|
|
212
|
+
- Don't use Accordion for primary navigation.
|
|
213
|
+
- Don't put critical CTAs only inside accordions — users won't expand to find them.
|
|
214
|
+
- Don't auto-collapse a section while user is reading.
|
|
215
|
+
- Don't show > 8 accordion items at once. Use sections + headings or a different layout.
|
|
216
|
+
- Don't render accordion bodies as `display: none` if they have form state — state is lost. Use `hidden` attribute or keep mounted with `aria-hidden` + visibility.
|
|
217
|
+
- Don't combine controlled + uncontrolled modes — pick one.
|
|
218
|
+
|
|
219
|
+
## References
|
|
220
|
+
|
|
221
|
+
- Ant Design: [`refs/ant-design/components/collapse/`](../refs/ant-design/components/collapse/) — `Collapse` + `Collapse.Panel`. `accordion` prop forces single. Has nice `expandIcon` customization.
|
|
222
|
+
- MUI: [`refs/mui/packages/mui-material/src/Accordion/`](../refs/mui/packages/mui-material/src/Accordion/) — `Accordion`, `AccordionSummary`, `AccordionDetails`, `AccordionActions`. Solid composition.
|
|
223
|
+
- shadcn-ui: [`refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/accordion.tsx`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/accordion.tsx) — Radix Accordion primitive. Cleanest a11y. **Default for new projects.**
|
|
224
|
+
|
|
225
|
+
## Cross-reference
|
|
226
|
+
|
|
227
|
+
- [examples/component-tabs.md](component-tabs.md) — alternative for non-stackable view-switching
|
|
228
|
+
- [WAI-ARIA Accordion Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/)
|
|
229
|
+
- [WAI-ARIA Disclosure Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/)
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# `AccountCard` (custom — Korean banking / fintech) — spec
|
|
2
|
+
|
|
3
|
+
> Custom component pattern. Korean banking apps universally render bank accounts as branded cards. KakaoBank, Toss, traditional bank apps all converge on this design.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Displays a bank account as a card: bank logo + nickname + masked account number + balance. Tappable to open transaction history.
|
|
8
|
+
|
|
9
|
+
## Anatomy
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────────────────┐
|
|
13
|
+
│ [bank logo] 국민 입출금 │ ← bank brand + nickname
|
|
14
|
+
│ 123-45-6789-012 │ ← masked account number
|
|
15
|
+
│ │
|
|
16
|
+
│ ₩2,847,500 │ ← balance (prominent)
|
|
17
|
+
│ │
|
|
18
|
+
│ [송금] [QR 결제] [입금] │ ← optional quick actions
|
|
19
|
+
└─────────────────────────────────────────────────┘
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Slot | Required | Notes |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| Bank logo | yes | Official asset; provides instant recognition |
|
|
25
|
+
| Nickname | yes | User-editable label (default: "통장 이름") |
|
|
26
|
+
| Account number | yes | Masked except last 4 digits |
|
|
27
|
+
| Balance | yes | Display tier, tabular numerals, prominent |
|
|
28
|
+
| Quick actions | optional | 송금 / 결제 / 입금 |
|
|
29
|
+
| Trailing chevron | optional | If tappable to navigate |
|
|
30
|
+
| Status badge | optional | "정지", "주거래" |
|
|
31
|
+
|
|
32
|
+
## API
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<AccountCard
|
|
36
|
+
bank="KB국민은행"
|
|
37
|
+
bankLogo="/banks/kb.png"
|
|
38
|
+
nickname="국민 입출금"
|
|
39
|
+
accountNumber="123-45-6789-012"
|
|
40
|
+
balance={2847500}
|
|
41
|
+
variant="hero"
|
|
42
|
+
onClick={() => navigate(`/accounts/${id}`)}
|
|
43
|
+
actions={[
|
|
44
|
+
{ label: "송금", onClick: openTransfer },
|
|
45
|
+
{ label: "QR 결제", onClick: openQrPay },
|
|
46
|
+
{ label: "입금", onClick: openDeposit },
|
|
47
|
+
]}
|
|
48
|
+
/>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Prop | Type | Default | Description |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `bank` | `string` | — | Bank name (Korean) |
|
|
54
|
+
| `bankLogo` | `string \| ReactNode` | — | Logo asset |
|
|
55
|
+
| `bankColor` | `string` | derived from bank | Brand color for accent |
|
|
56
|
+
| `nickname` | `string` | — | User-editable label |
|
|
57
|
+
| `accountNumber` | `string` | — | Full or masked |
|
|
58
|
+
| `mask` | `boolean` | `true` | Auto-mask account number |
|
|
59
|
+
| `balance` | `number` | — | In smallest unit (won) |
|
|
60
|
+
| `currency` | `"KRW" \| ...` | `"KRW"` | |
|
|
61
|
+
| `variant` | `"compact" \| "default" \| "hero"` | `"default"` | |
|
|
62
|
+
| `actions` | `Action[]` | — | Quick actions row |
|
|
63
|
+
| `onClick` | `() => void` | — | Tap to drill in |
|
|
64
|
+
| `status` | `"active" \| "frozen" \| "primary"` | `"active"` | Optional badge |
|
|
65
|
+
| `loading` | `boolean` | `false` | Skeleton state |
|
|
66
|
+
|
|
67
|
+
## Variants
|
|
68
|
+
|
|
69
|
+
### Compact
|
|
70
|
+
|
|
71
|
+
For a list of accounts (account selector):
|
|
72
|
+
```
|
|
73
|
+
┌──────────────────────────────────────┐
|
|
74
|
+
│ [logo] 국민 입출금 ₩2,847,500│
|
|
75
|
+
│ ****-012 │
|
|
76
|
+
└──────────────────────────────────────┘
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Single row, minimal padding.
|
|
80
|
+
|
|
81
|
+
### Default
|
|
82
|
+
|
|
83
|
+
Standard card with balance prominent and actions:
|
|
84
|
+
```
|
|
85
|
+
┌─────────────────────────────────────┐
|
|
86
|
+
│ [logo] 국민 입출금 │
|
|
87
|
+
│ ****-012 │
|
|
88
|
+
│ │
|
|
89
|
+
│ ₩2,847,500 │
|
|
90
|
+
│ │
|
|
91
|
+
│ [송금] [결제] │
|
|
92
|
+
└─────────────────────────────────────┘
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Hero
|
|
96
|
+
|
|
97
|
+
For the home screen / primary account:
|
|
98
|
+
```
|
|
99
|
+
┌─────────────────────────────────────────────┐
|
|
100
|
+
│ 국민 입출금 │
|
|
101
|
+
│ ****-012 │
|
|
102
|
+
│ │
|
|
103
|
+
│ ₩2,847,500 │ ← extra large
|
|
104
|
+
│ ↑ 12,500원 이번 달 │
|
|
105
|
+
│ │
|
|
106
|
+
│ [송금] [QR 결제] [입금] │
|
|
107
|
+
└─────────────────────────────────────────────┘
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Larger amount, optional delta indicator, and full quick actions.
|
|
111
|
+
|
|
112
|
+
## Account number masking
|
|
113
|
+
|
|
114
|
+
| Format | Display | Use |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| Full | `123-45-6789-012` | Detail screen with extra security |
|
|
117
|
+
| Last 4 only | `****-012` | List view, default |
|
|
118
|
+
| Hidden | `****-****` | When user has masking turned on |
|
|
119
|
+
|
|
120
|
+
The `mask` prop controls which. Mid-text mask uses asterisks per Korean banking convention (not bullets).
|
|
121
|
+
|
|
122
|
+
## Bank brand integration
|
|
123
|
+
|
|
124
|
+
Korean banks have official logos + brand colors. Don't restyle — use vendor assets:
|
|
125
|
+
|
|
126
|
+
| Bank | Brand color |
|
|
127
|
+
| --- | --- |
|
|
128
|
+
| KakaoBank | Yellow `#FFEB00` |
|
|
129
|
+
| KB국민은행 | Yellow + black |
|
|
130
|
+
| 신한은행 | Blue `#0046ff` |
|
|
131
|
+
| 우리은행 | Blue (different shade) |
|
|
132
|
+
| 하나은행 | Green |
|
|
133
|
+
| NH농협 | Green |
|
|
134
|
+
| Toss | Blue `#3182F6` |
|
|
135
|
+
| Naver Bank | Green |
|
|
136
|
+
|
|
137
|
+
Use brand color for:
|
|
138
|
+
- Card border accent
|
|
139
|
+
- Bank logo bg
|
|
140
|
+
- Subtle background tint (low-saturation)
|
|
141
|
+
|
|
142
|
+
Don't use for:
|
|
143
|
+
- Balance text (always neutral or money-positive/negative)
|
|
144
|
+
- Action button bg
|
|
145
|
+
|
|
146
|
+
## Sizes / variants → tokens
|
|
147
|
+
|
|
148
|
+
| Variant | Card padding | Balance font | Balance weight |
|
|
149
|
+
| --- | --- | --- | --- |
|
|
150
|
+
| `compact` | 12px | 16px | 600 |
|
|
151
|
+
| `default` | 16px | 24px | 600 |
|
|
152
|
+
| `hero` | 24px | 36px | 700 |
|
|
153
|
+
|
|
154
|
+
## States
|
|
155
|
+
|
|
156
|
+
| State | Visual |
|
|
157
|
+
| --- | --- |
|
|
158
|
+
| Default | Resting |
|
|
159
|
+
| Hover (interactive) | Subtle bg shift |
|
|
160
|
+
| Pressed | Slight scale 0.98 (mobile feedback) |
|
|
161
|
+
| Focus-visible | 2px ring |
|
|
162
|
+
| Loading | Skeleton: logo + text bars + balance bar |
|
|
163
|
+
| Frozen / 정지 | Gray bg + "정지" badge |
|
|
164
|
+
| Primary / 주거래 | "주거래" badge with star icon |
|
|
165
|
+
|
|
166
|
+
## Tokens consumed
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
--color-bg-default
|
|
170
|
+
--color-bg-elevated (card surface)
|
|
171
|
+
--color-bg-subtle (hover)
|
|
172
|
+
--color-text-primary (balance, nickname)
|
|
173
|
+
--color-text-secondary (account number, bank name)
|
|
174
|
+
--color-money-positive (delta indicator if positive)
|
|
175
|
+
--color-money-negative
|
|
176
|
+
--color-money-neutral
|
|
177
|
+
--color-primary-default (action button bg if appropriate)
|
|
178
|
+
--color-warning ("정지" status)
|
|
179
|
+
--color-success ("주거래" badge)
|
|
180
|
+
--color-border-default
|
|
181
|
+
--color-focus-ring
|
|
182
|
+
--space-sm, --space-md, --space-lg
|
|
183
|
+
--radius-lg (card corners)
|
|
184
|
+
--shadow-card (subtle elevation)
|
|
185
|
+
--font-feature-amount: 'tnum' 1
|
|
186
|
+
--font-size-sm, --font-size-base, --font-size-2xl
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Accessibility
|
|
190
|
+
|
|
191
|
+
- Render as `<button>` if interactive, `<article>` if static.
|
|
192
|
+
- Bank logo: `<img alt="KB국민은행 로고">`.
|
|
193
|
+
- Account number: render with semantic markup so screen readers don't read each digit ("일이삼"); use `aria-label`:
|
|
194
|
+
```html
|
|
195
|
+
<span aria-label="계좌번호 마지막 네 자리, 영영일이">****-012</span>
|
|
196
|
+
```
|
|
197
|
+
- Balance: also include aria-label that's friendlier than the raw digits:
|
|
198
|
+
```html
|
|
199
|
+
<span aria-label="잔액 290만 원">₩2,847,500</span>
|
|
200
|
+
```
|
|
201
|
+
- Action buttons: standard accessibility.
|
|
202
|
+
|
|
203
|
+
## Code example
|
|
204
|
+
|
|
205
|
+
```tsx
|
|
206
|
+
function AccountsScreen() {
|
|
207
|
+
const accounts = useAccounts();
|
|
208
|
+
|
|
209
|
+
return (
|
|
210
|
+
<Page>
|
|
211
|
+
<PageHeader>내 계좌</PageHeader>
|
|
212
|
+
|
|
213
|
+
{/* Hero variant for primary */}
|
|
214
|
+
{accounts.primary && (
|
|
215
|
+
<AccountCard
|
|
216
|
+
variant="hero"
|
|
217
|
+
{...accounts.primary}
|
|
218
|
+
actions={[
|
|
219
|
+
{ label: "송금", onClick: () => openTransfer(accounts.primary.id) },
|
|
220
|
+
{ label: "QR 결제", onClick: () => openQrPay(accounts.primary.id) },
|
|
221
|
+
{ label: "입금", onClick: () => openDeposit(accounts.primary.id) },
|
|
222
|
+
]}
|
|
223
|
+
/>
|
|
224
|
+
)}
|
|
225
|
+
|
|
226
|
+
{/* Compact for list */}
|
|
227
|
+
<Section title="다른 계좌">
|
|
228
|
+
{accounts.others.map(account => (
|
|
229
|
+
<AccountCard
|
|
230
|
+
key={account.id}
|
|
231
|
+
variant="compact"
|
|
232
|
+
{...account}
|
|
233
|
+
onClick={() => navigate(`/accounts/${account.id}`)}
|
|
234
|
+
/>
|
|
235
|
+
))}
|
|
236
|
+
</Section>
|
|
237
|
+
</Page>
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Edge cases
|
|
243
|
+
|
|
244
|
+
- **Negative balance** (overdraft): show with `--color-money-negative` + small "-" prefix or "(₩50,000)" parens. Clarify with subtitle "마이너스 통장".
|
|
245
|
+
- **Foreign currency account**: switch currency symbol; consider showing KRW conversion below.
|
|
246
|
+
- **Hidden balance** (user turned on privacy mode): show `***` instead of digits, with toggle.
|
|
247
|
+
- **Stale balance** (last sync > 1hr): show timestamp, prompt to refresh.
|
|
248
|
+
- **Loading**: skeleton matching the card shape — don't blank out.
|
|
249
|
+
- **Network error fetching balance**: show "잔액 불러오기 실패" with retry.
|
|
250
|
+
- **Empty bank logo**: render bank initial in a colored circle (use bankColor).
|
|
251
|
+
|
|
252
|
+
## Don't
|
|
253
|
+
|
|
254
|
+
- Don't show full account number by default. Mask except last 4.
|
|
255
|
+
- Don't omit bank logo — brand recognition is the entire point of the card.
|
|
256
|
+
- Don't restyle bank logos / brand colors.
|
|
257
|
+
- Don't use `--color-error` for negative balance — use `--color-money-negative`.
|
|
258
|
+
- Don't omit tabular numerals — balance won't align.
|
|
259
|
+
- Don't auto-refresh balance every second; respect bank API rate limits.
|
|
260
|
+
- Don't make actions invisible without tap. Show visible buttons.
|
|
261
|
+
|
|
262
|
+
## Korean considerations
|
|
263
|
+
|
|
264
|
+
- Account nickname is **user-editable** — letting users rename "통장이름" is a key Korean banking app feature.
|
|
265
|
+
- "주거래" (primary account) is a Korean banking concept; mark with badge.
|
|
266
|
+
- "송금 / 입금 / QR 결제 / 자동이체" are the canonical action labels.
|
|
267
|
+
- For business accounts (사업자 계좌): subtitle may include 사업자등록번호.
|
|
268
|
+
- For 외화 계좌 (foreign currency): clearly show currency symbol + KRW equivalent.
|
|
269
|
+
|
|
270
|
+
## API rationale
|
|
271
|
+
|
|
272
|
+
- **`balance: number`**: source of truth. Formatting via tabular numeric output.
|
|
273
|
+
- **`bankLogo` accepts both string (URL) and ReactNode**: flexibility for asset pipelines.
|
|
274
|
+
- **Three variants** capture the most common usage shapes; more is over-flexibility.
|
|
275
|
+
- **Quick actions as array**: each card might have different actions based on account type.
|
|
276
|
+
|
|
277
|
+
## Cross-reference
|
|
278
|
+
|
|
279
|
+
- [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — currency display, money color
|
|
280
|
+
- [`knowledge/i18n/korean-payments.md`](../knowledge/i18n/korean-payments.md) — Korean banking conventions
|
|
281
|
+
- [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — broader KR app conventions
|
|
282
|
+
- [`examples/component-card.md`](component-card.md) — base card pattern
|
|
283
|
+
- [`examples/component-statistic.md`](component-statistic.md) — balance display style
|
|
284
|
+
- [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) — drill-in target
|