@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,243 @@
|
|
|
1
|
+
# `Item` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `item` (a flexible list-item primitive). The "Item family" — `Item`, `ItemMedia`, `ItemContent`, `ItemTitle`, `ItemDescription`, `ItemActions`, `ItemSeparator`, `ItemHeader`, `ItemFooter`. The atomic building block for lists, tables-of-things, settings rows, account rows, search results.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- **Settings rows** (with leading icon, title, description, trailing chevron / switch).
|
|
8
|
+
- **Account / profile rows** (avatar + name + role + actions).
|
|
9
|
+
- **Search results** (icon / image + title + meta + actions).
|
|
10
|
+
- **List rows** in any list-of-entities surface (mail inbox, notifications, files).
|
|
11
|
+
|
|
12
|
+
When NOT to use:
|
|
13
|
+
- Data-grid rows — use `Table`.
|
|
14
|
+
- Card-style entities — use `Card`.
|
|
15
|
+
- Pure text list — use `<ul>` / `<ol>`.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌────────────────────────────────────┐
|
|
21
|
+
│ [icon] [title] [⋮] │ ← single-line, with action
|
|
22
|
+
│ [description] │
|
|
23
|
+
└────────────────────────────────────┘
|
|
24
|
+
|
|
25
|
+
┌────────────────────────────────────┐
|
|
26
|
+
│ [avatar 40px] Sungjin Park │ ← list / contact pattern
|
|
27
|
+
│ Senior Designer │
|
|
28
|
+
│ ▶ │
|
|
29
|
+
└────────────────────────────────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## API
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<Item>
|
|
36
|
+
<ItemMedia>
|
|
37
|
+
<Avatar src={user.avatar} />
|
|
38
|
+
</ItemMedia>
|
|
39
|
+
<ItemContent>
|
|
40
|
+
<ItemTitle>{user.name}</ItemTitle>
|
|
41
|
+
<ItemDescription>{user.role}</ItemDescription>
|
|
42
|
+
</ItemContent>
|
|
43
|
+
<ItemActions>
|
|
44
|
+
<Button variant="ghost" size="icon">
|
|
45
|
+
<ChevronRightIcon />
|
|
46
|
+
</Button>
|
|
47
|
+
</ItemActions>
|
|
48
|
+
</Item>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Composition
|
|
52
|
+
|
|
53
|
+
| Part | Purpose |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| `Item` | Outer row wrapper |
|
|
56
|
+
| `ItemMedia` | Leading visual (icon, avatar, image) |
|
|
57
|
+
| `ItemContent` | Middle text region (Title + Description) |
|
|
58
|
+
| `ItemTitle` | Primary text |
|
|
59
|
+
| `ItemDescription` | Secondary muted text |
|
|
60
|
+
| `ItemActions` | Trailing action(s) (button, switch, count, chevron) |
|
|
61
|
+
| `ItemHeader` | Above-content metadata (date, author) |
|
|
62
|
+
| `ItemFooter` | Below-content secondary content |
|
|
63
|
+
| `ItemSeparator` | Divider between consecutive Items |
|
|
64
|
+
|
|
65
|
+
## Variants
|
|
66
|
+
|
|
67
|
+
### Density
|
|
68
|
+
|
|
69
|
+
| Density | Padding | Typical Title size |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| `comfortable` (default) | `--space-md` | 14-16px |
|
|
72
|
+
| `compact` | `--space-sm` | 13-14px |
|
|
73
|
+
| `relaxed` | `--space-lg` | 16-18px |
|
|
74
|
+
|
|
75
|
+
### Interactive
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<Item asChild>
|
|
79
|
+
<a href={`/users/${user.id}`}>...</a>
|
|
80
|
+
</Item>
|
|
81
|
+
|
|
82
|
+
<Item interactive onClick={onClick}>...</Item>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
When interactive, the entire row is the click target (block link pattern).
|
|
86
|
+
|
|
87
|
+
### Selectable
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
<Item selected={isSelected} onSelect={handleSelect}>
|
|
91
|
+
...
|
|
92
|
+
</Item>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Used in selection lists (mail, files). Selected state has highlight bg + persistent indicator.
|
|
96
|
+
|
|
97
|
+
## States
|
|
98
|
+
|
|
99
|
+
| State | Visual |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| Default | Resting |
|
|
102
|
+
| Hover (interactive) | Subtle bg shift |
|
|
103
|
+
| Pressed | Deeper bg (touch) or stable (mouse) |
|
|
104
|
+
| Focus-visible | 2px focus ring on the entire row |
|
|
105
|
+
| Selected | Persistent bg highlight + brand-color indicator |
|
|
106
|
+
| Disabled | Reduced opacity, no events, `aria-disabled` |
|
|
107
|
+
|
|
108
|
+
## Tokens consumed
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
--item-bg (default; transparent)
|
|
112
|
+
--item-bg-hover (interactive hover)
|
|
113
|
+
--item-bg-selected (selected state)
|
|
114
|
+
--item-fg (Title)
|
|
115
|
+
--item-fg-muted (Description)
|
|
116
|
+
--item-padding-y (varies by density)
|
|
117
|
+
--item-padding-x (typically --space-md)
|
|
118
|
+
--item-gap (between Media / Content / Actions)
|
|
119
|
+
--item-divider (Separator color)
|
|
120
|
+
--space-sm, --space-md, --space-lg
|
|
121
|
+
--radius-md (rounded item highlight)
|
|
122
|
+
--motion-fast (hover transition)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Accessibility
|
|
126
|
+
|
|
127
|
+
- `Item`:
|
|
128
|
+
- If interactive (clickable row): use real `<a>` or `<button>`. Apply `block` styles. Focus goes to the wrapper.
|
|
129
|
+
- If non-interactive: plain `<li>` inside parent `<ul>` / `<ol>`.
|
|
130
|
+
- For multi-action items (selectable + has trailing actions): outer is `<button>` for select, but Trailing buttons inside can't be nested. Use a different pattern (separate select + actions, or label-for-checkbox pattern).
|
|
131
|
+
- `ItemTitle`: typically `<h3>` or `<h4>` if list is a section's content, or just text in a list of homogenous items.
|
|
132
|
+
- `ItemActions`: each action is an independent button with its own `aria-label`.
|
|
133
|
+
- Touch target: ≥ 44pt for the row OR the action(s).
|
|
134
|
+
- Selected state: `aria-selected="true"` (in selection list) or `aria-checked` if checkbox-style.
|
|
135
|
+
|
|
136
|
+
## Korean apps
|
|
137
|
+
|
|
138
|
+
Korean list patterns:
|
|
139
|
+
- **Account row**: avatar + name + role / phone + "더보기" arrow
|
|
140
|
+
- **Settings row**: icon + label + value (e.g., "언어 — 한국어 ▶") + chevron
|
|
141
|
+
- **Notification row**: icon + title (bold) + body (muted) + timestamp + unread dot
|
|
142
|
+
- **Transaction row** (fintech): merchant logo + name + amount (right) + date below — see [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) for KR fintech specifics.
|
|
143
|
+
|
|
144
|
+
Common labels:
|
|
145
|
+
- 더보기 (more)
|
|
146
|
+
- 설정 (settings)
|
|
147
|
+
- 알림 (notifications)
|
|
148
|
+
- 자세히 (details)
|
|
149
|
+
|
|
150
|
+
## Code example — settings list
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
function SettingsList() {
|
|
154
|
+
return (
|
|
155
|
+
<div role="list">
|
|
156
|
+
<Item asChild interactive>
|
|
157
|
+
<Link href="/settings/profile">
|
|
158
|
+
<ItemMedia><UserIcon /></ItemMedia>
|
|
159
|
+
<ItemContent>
|
|
160
|
+
<ItemTitle>프로필</ItemTitle>
|
|
161
|
+
<ItemDescription>이름, 사진, 자기소개</ItemDescription>
|
|
162
|
+
</ItemContent>
|
|
163
|
+
<ItemActions>
|
|
164
|
+
<ChevronRightIcon className="text-muted" />
|
|
165
|
+
</ItemActions>
|
|
166
|
+
</Link>
|
|
167
|
+
</Item>
|
|
168
|
+
|
|
169
|
+
<ItemSeparator />
|
|
170
|
+
|
|
171
|
+
<Item asChild interactive>
|
|
172
|
+
<Link href="/settings/notifications">
|
|
173
|
+
<ItemMedia><BellIcon /></ItemMedia>
|
|
174
|
+
<ItemContent>
|
|
175
|
+
<ItemTitle>알림</ItemTitle>
|
|
176
|
+
<ItemDescription>이메일, 푸시, SMS 설정</ItemDescription>
|
|
177
|
+
</ItemContent>
|
|
178
|
+
<ItemActions>
|
|
179
|
+
<ChevronRightIcon className="text-muted" />
|
|
180
|
+
</ItemActions>
|
|
181
|
+
</Link>
|
|
182
|
+
</Item>
|
|
183
|
+
|
|
184
|
+
<ItemSeparator />
|
|
185
|
+
|
|
186
|
+
<Item>
|
|
187
|
+
<ItemMedia><MoonIcon /></ItemMedia>
|
|
188
|
+
<ItemContent>
|
|
189
|
+
<ItemTitle>다크 모드</ItemTitle>
|
|
190
|
+
</ItemContent>
|
|
191
|
+
<ItemActions>
|
|
192
|
+
<Switch checked={isDark} onCheckedChange={setIsDark} />
|
|
193
|
+
</ItemActions>
|
|
194
|
+
</Item>
|
|
195
|
+
|
|
196
|
+
<ItemSeparator />
|
|
197
|
+
|
|
198
|
+
<Item asChild interactive>
|
|
199
|
+
<Link href="/help">
|
|
200
|
+
<ItemMedia><QuestionIcon /></ItemMedia>
|
|
201
|
+
<ItemContent>
|
|
202
|
+
<ItemTitle>도움말</ItemTitle>
|
|
203
|
+
</ItemContent>
|
|
204
|
+
<ItemActions>
|
|
205
|
+
<ChevronRightIcon className="text-muted" />
|
|
206
|
+
</ItemActions>
|
|
207
|
+
</Link>
|
|
208
|
+
</Item>
|
|
209
|
+
</div>
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Edge cases
|
|
215
|
+
|
|
216
|
+
- **Long Title**: truncate with ellipsis (`overflow: hidden; text-overflow: ellipsis; white-space: nowrap`). Don't wrap unless ItemDescription expects to wrap too.
|
|
217
|
+
- **Long Description**: typically 1-2 lines; truncate with `-webkit-line-clamp`.
|
|
218
|
+
- **Multiple actions in ItemActions**: tightest is 2-3; if more, group into "More" menu.
|
|
219
|
+
- **Toggle / Switch in row**: the whole row clickable also toggles? Decide; consistency matters.
|
|
220
|
+
- **Selectable + interactive conflict**: can't have entire row as `<a>` AND `<button>` for select. Pattern: row is `<a>`, leading checkbox handles select.
|
|
221
|
+
- **RTL**: Media and Actions positions flip.
|
|
222
|
+
- **Reduced motion**: skip hover bg transition.
|
|
223
|
+
|
|
224
|
+
## Don't
|
|
225
|
+
|
|
226
|
+
- Don't pile up 4+ actions in ItemActions. Use overflow menu.
|
|
227
|
+
- Don't make Title and Description the same weight / size — hierarchy matters.
|
|
228
|
+
- Don't auto-truncate Description without showing user the rest is hidden (line-clamp + ellipsis OK; silent crop bad).
|
|
229
|
+
- Don't put inputs (text fields) inside ItemActions. Use a different pattern (or Field row).
|
|
230
|
+
- Don't omit `aria-label` on icon-only Action buttons.
|
|
231
|
+
- Don't make rows shorter than 44pt on mobile primary surfaces.
|
|
232
|
+
|
|
233
|
+
## References
|
|
234
|
+
|
|
235
|
+
- shadcn-ui: [`item`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/item.tsx)
|
|
236
|
+
- iOS UITableViewCell; Material 3 List item
|
|
237
|
+
|
|
238
|
+
## Cross-reference
|
|
239
|
+
|
|
240
|
+
- [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) — KR fintech specialization
|
|
241
|
+
- [`examples/component-card.md`](component-card.md) — for richer / card-style entities
|
|
242
|
+
- [`examples/component-table.md`](component-table.md) — for tabular data
|
|
243
|
+
- [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md)
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# `Kbd` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `kbd` and the HTML5 `<kbd>` element. Renders a keyboard shortcut as a small key cap. Used in tooltips, command palettes, dropdown menu shortcuts, documentation.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- **Inline keyboard shortcut** in tooltips: "⌘ S to save".
|
|
8
|
+
- **Command palette / dropdown menu shortcuts**: right-aligned shortcut hint.
|
|
9
|
+
- **Documentation**: "Press ⌘ K to open the command palette".
|
|
10
|
+
- **Help overlays**: keyboard shortcut cheatsheets.
|
|
11
|
+
|
|
12
|
+
## Anatomy
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
[ ⌘ ] [ K ] or [ Ctrl ] [ K ] or [ ⇧ ] [ ⌘ ] [ P ]
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
A small bordered + shadowed key cap with the key label inside.
|
|
19
|
+
|
|
20
|
+
## API
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
<Kbd>⌘</Kbd> <Kbd>K</Kbd>
|
|
24
|
+
|
|
25
|
+
<Kbd combo>
|
|
26
|
+
<Kbd.Key>⇧</Kbd.Key>
|
|
27
|
+
<Kbd.Key>⌘</Kbd.Key>
|
|
28
|
+
<Kbd.Key>P</Kbd.Key>
|
|
29
|
+
</Kbd>
|
|
30
|
+
|
|
31
|
+
<Kbd shortcut="cmd+k" /> {/* Helper that auto-renders cmd / ctrl based on platform */}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| Prop | Type | Default | Description |
|
|
35
|
+
| --- | --- | --- | --- |
|
|
36
|
+
| `size` | `"sm" \| "md"` | `"sm"` | Size of the key cap |
|
|
37
|
+
| `variant` | `"default" \| "outline"` | `"default"` | Visual style |
|
|
38
|
+
| `shortcut` | `string` | — | Convenience: parses "cmd+k" → renders ⌘ K |
|
|
39
|
+
| `children` | `ReactNode` | — | Manual content (one key or multiple `<Kbd.Key>`) |
|
|
40
|
+
|
|
41
|
+
## Platform-aware shortcut parser
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
function Kbd({ shortcut }: { shortcut?: string }) {
|
|
45
|
+
if (!shortcut) return /* manual */;
|
|
46
|
+
|
|
47
|
+
const isMac = /Mac/.test(navigator.platform);
|
|
48
|
+
const keys = shortcut.split("+").map(k => {
|
|
49
|
+
const lower = k.toLowerCase();
|
|
50
|
+
if (lower === "cmd" || lower === "meta") return isMac ? "⌘" : "Ctrl";
|
|
51
|
+
if (lower === "ctrl") return "Ctrl";
|
|
52
|
+
if (lower === "shift") return "⇧";
|
|
53
|
+
if (lower === "alt" || lower === "option") return isMac ? "⌥" : "Alt";
|
|
54
|
+
if (lower === "enter") return "↵";
|
|
55
|
+
if (lower === "esc") return "Esc";
|
|
56
|
+
if (lower === "tab") return "⇥";
|
|
57
|
+
if (lower === "space") return "␣";
|
|
58
|
+
if (lower === "backspace") return "⌫";
|
|
59
|
+
return k.toUpperCase();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return <kbd>{keys.map((k, i) => <span key={i}>{k}</span>)}</kbd>;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Symbols (Mac convention)
|
|
67
|
+
|
|
68
|
+
| Key | Symbol |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| Cmd / Meta | ⌘ (U+2318) |
|
|
71
|
+
| Shift | ⇧ (U+21E7) |
|
|
72
|
+
| Option / Alt | ⌥ (U+2325) |
|
|
73
|
+
| Control | ⌃ (U+2303) |
|
|
74
|
+
| Enter / Return | ↵ (U+21B5) or ⏎ (U+23CE) |
|
|
75
|
+
| Escape | Esc |
|
|
76
|
+
| Tab | ⇥ (U+21E5) |
|
|
77
|
+
| Space | ␣ (U+2423) |
|
|
78
|
+
| Backspace | ⌫ (U+232B) |
|
|
79
|
+
| Delete | ⌦ (U+2326) |
|
|
80
|
+
| Up / Down / Left / Right | ↑ ↓ ← → |
|
|
81
|
+
| Caps Lock | ⇪ (U+21EA) |
|
|
82
|
+
| Function | Fn |
|
|
83
|
+
|
|
84
|
+
For Windows / Linux: use text labels — "Ctrl", "Alt", "Shift", "Win".
|
|
85
|
+
|
|
86
|
+
## States
|
|
87
|
+
|
|
88
|
+
Stateless. `<kbd>` is presentational.
|
|
89
|
+
|
|
90
|
+
## Tokens consumed
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
--kbd-bg (key cap bg, slightly different from page bg)
|
|
94
|
+
--kbd-fg (text on key)
|
|
95
|
+
--kbd-border (key border)
|
|
96
|
+
--kbd-shadow (subtle inset shadow for "cap" effect)
|
|
97
|
+
--radius-sm (key corners)
|
|
98
|
+
--font-family-mono (typically monospace for the key label)
|
|
99
|
+
--font-size-xs
|
|
100
|
+
--space-xxs (key padding)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## CSS
|
|
104
|
+
|
|
105
|
+
```css
|
|
106
|
+
kbd, .kbd {
|
|
107
|
+
display: inline-flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
padding: 1px 6px;
|
|
110
|
+
font-family: var(--font-family-mono);
|
|
111
|
+
font-size: var(--font-size-xs);
|
|
112
|
+
line-height: 1.4;
|
|
113
|
+
background: var(--kbd-bg);
|
|
114
|
+
color: var(--kbd-fg);
|
|
115
|
+
border: 1px solid var(--kbd-border);
|
|
116
|
+
border-radius: var(--radius-sm);
|
|
117
|
+
box-shadow: 0 1px 0 var(--kbd-border), 0 1px 0 inset rgba(255, 255, 255, 0.5);
|
|
118
|
+
min-width: 1.5em;
|
|
119
|
+
justify-content: center;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
kbd + kbd {
|
|
123
|
+
margin-left: 2px;
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Accessibility
|
|
128
|
+
|
|
129
|
+
- Use the semantic `<kbd>` element. Screen readers announce as "keyboard input".
|
|
130
|
+
- For complex shortcuts: wrap in a `<span>` with `aria-label` describing the shortcut, since reading individual symbols may be confusing.
|
|
131
|
+
|
|
132
|
+
```html
|
|
133
|
+
<span aria-label="Command K">
|
|
134
|
+
<kbd>⌘</kbd><kbd>K</kbd>
|
|
135
|
+
</span>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
- Don't rely on visual symbols alone for non-Mac users; provide text fallback.
|
|
139
|
+
|
|
140
|
+
## Code example
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
function ShortcutTooltip({ children, shortcut }: Props) {
|
|
144
|
+
return (
|
|
145
|
+
<Tooltip>
|
|
146
|
+
<Tooltip.Trigger asChild>{children}</Tooltip.Trigger>
|
|
147
|
+
<Tooltip.Content>
|
|
148
|
+
Save <Kbd shortcut="cmd+s" />
|
|
149
|
+
</Tooltip.Content>
|
|
150
|
+
</Tooltip>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function CommandList() {
|
|
155
|
+
return (
|
|
156
|
+
<DropdownMenu>
|
|
157
|
+
<DropdownMenu.Trigger>Actions</DropdownMenu.Trigger>
|
|
158
|
+
<DropdownMenu.Content>
|
|
159
|
+
<DropdownMenu.Item>
|
|
160
|
+
New file <DropdownMenu.Shortcut><Kbd shortcut="cmd+n" /></DropdownMenu.Shortcut>
|
|
161
|
+
</DropdownMenu.Item>
|
|
162
|
+
<DropdownMenu.Item>
|
|
163
|
+
Open <DropdownMenu.Shortcut><Kbd shortcut="cmd+o" /></DropdownMenu.Shortcut>
|
|
164
|
+
</DropdownMenu.Item>
|
|
165
|
+
</DropdownMenu.Content>
|
|
166
|
+
</DropdownMenu>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Edge cases
|
|
172
|
+
|
|
173
|
+
- **Korean keyboard mapping**: 한영 toggle uses dedicated key; can render as "한/영". Most app shortcuts use Latin characters even on Korean keyboards.
|
|
174
|
+
- **Ctrl + Cmd ambiguity**: prefer one canonical name per platform. Don't say "Cmd / Ctrl" — render the platform-correct symbol.
|
|
175
|
+
- **Mobile**: shortcut display rare on touch (no keyboard); hide or replace with alternative gesture description.
|
|
176
|
+
- **Multi-key combos**: render each key in its own `<kbd>`; combine with small gap.
|
|
177
|
+
- **Very long key labels** (e.g., "Backspace"): use the label not symbol in such cases.
|
|
178
|
+
|
|
179
|
+
## Don't
|
|
180
|
+
|
|
181
|
+
- Don't render shortcut as plain text. The boxed appearance is the affordance.
|
|
182
|
+
- Don't use Mac symbols on Windows users (or vice-versa). Detect platform.
|
|
183
|
+
- Don't make the cap so small the label is unreadable.
|
|
184
|
+
- Don't put non-keyboard things in `<kbd>` (it's specifically for keys).
|
|
185
|
+
|
|
186
|
+
## References
|
|
187
|
+
|
|
188
|
+
- HTML5 `<kbd>` element
|
|
189
|
+
- shadcn-ui: `kbd` component
|
|
190
|
+
- Apple HIG: keyboard shortcut conventions
|
|
191
|
+
|
|
192
|
+
## Cross-reference
|
|
193
|
+
|
|
194
|
+
- [`examples/component-tooltip.md`](component-tooltip.md) — common consumer
|
|
195
|
+
- [`examples/component-dropdown.md`](component-dropdown.md) — Shortcut sub-component
|
|
196
|
+
- [`examples/component-command.md`](component-command.md) — heavy shortcut display
|
|
197
|
+
- [`knowledge/a11y/keyboard-and-focus.md`](../knowledge/a11y/keyboard-and-focus.md)
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# `KRWAmount` (custom — display-only currency formatter) — spec
|
|
2
|
+
|
|
3
|
+
> Custom component pattern. Display-only counterpart to AmountInput. Renders KRW amounts consistently across the app — receipts, balances, transaction details, summaries.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Formats and displays a KRW amount with the right separator, suffix/prefix, sign, and color. Read-only. Use everywhere money is displayed but not entered.
|
|
8
|
+
|
|
9
|
+
## Why a separate component (not just `formatKRW(...)`)
|
|
10
|
+
|
|
11
|
+
A centralized component:
|
|
12
|
+
- Consistent formatting across the entire app.
|
|
13
|
+
- Single place to switch convention (suffix `원` vs prefix `₩`).
|
|
14
|
+
- Tabular numerals applied consistently.
|
|
15
|
+
- Color semantics consistent (money-positive / money-negative / neutral).
|
|
16
|
+
- Smaller payload than AmountInput (no input wiring).
|
|
17
|
+
|
|
18
|
+
## Anatomy
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Default: Negative (expense): Hero (large display):
|
|
22
|
+
₩2,847,500 -₩5,500 ₩12,847,500
|
|
23
|
+
↑ 12,500원 이번 달
|
|
24
|
+
|
|
25
|
+
Korean number format: With sign explicit: Foreign currency:
|
|
26
|
+
1,200만원 +₩2,500,000 $25.00 (약 ₩33,300)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## API
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
<KRWAmount value={2847500} />
|
|
33
|
+
<KRWAmount value={-5500} type="expense" />
|
|
34
|
+
<KRWAmount value={user.balance} variant="hero" delta={{ value: 12500, period: "이번 달" }} />
|
|
35
|
+
<KRWAmount value={1200000} format="korean" /> // "1,200만원"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Default | Description |
|
|
39
|
+
| --- | --- | --- | --- |
|
|
40
|
+
| `value` | `number` | — | Amount in won (smallest unit) |
|
|
41
|
+
| `currency` | `"KRW"` (locked) | `"KRW"` | Reserved for future i18n |
|
|
42
|
+
| `type` | `"income" \| "expense" \| "transfer" \| "neutral"` | inferred from sign | Drives color |
|
|
43
|
+
| `variant` | `"default" \| "compact" \| "hero" \| "inline"` | `"default"` | Size + emphasis |
|
|
44
|
+
| `format` | `"comma" \| "korean"` | `"comma"` | "1,200,000" vs "120만" |
|
|
45
|
+
| `affixStyle` | `"prefix" \| "suffix"` | `"suffix"` | `1,200,000원` vs `₩1,200,000` |
|
|
46
|
+
| `showSign` | `boolean` | `false` | Force `+` for positive |
|
|
47
|
+
| `precision` | `number` | `0` | Decimals (always 0 for KRW) |
|
|
48
|
+
| `delta` | `Delta` | — | Below-amount comparison |
|
|
49
|
+
| `compactThreshold` | `number` | `10000` | When format=korean: only convert above this |
|
|
50
|
+
|
|
51
|
+
## Variants
|
|
52
|
+
|
|
53
|
+
### `default`
|
|
54
|
+
|
|
55
|
+
Standard inline display. Body-size text, tabular numerals.
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
<KRWAmount value={2847500} />
|
|
59
|
+
```
|
|
60
|
+
Renders: `₩2,847,500` or `2,847,500원` depending on convention.
|
|
61
|
+
|
|
62
|
+
### `compact`
|
|
63
|
+
|
|
64
|
+
Smaller text, for table cells / sidebars.
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
<KRWAmount value={2847500} variant="compact" />
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### `hero`
|
|
71
|
+
|
|
72
|
+
Large display for hero amounts (account balance, total order):
|
|
73
|
+
- Font: 32–48px
|
|
74
|
+
- Weight: 700
|
|
75
|
+
- Tabular numerals
|
|
76
|
+
- Optional delta below
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
<KRWAmount
|
|
80
|
+
value={user.balance}
|
|
81
|
+
variant="hero"
|
|
82
|
+
delta={{ value: 12500, period: "이번 달", goalDirection: "up" }}
|
|
83
|
+
/>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Renders:
|
|
87
|
+
```
|
|
88
|
+
₩12,847,500
|
|
89
|
+
↑ 12,500원 이번 달
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### `inline`
|
|
93
|
+
|
|
94
|
+
Minimal styling — fits inside a sentence:
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
<p>총 결제 금액은 <KRWAmount value={45000} variant="inline" />입니다.</p>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Format styles
|
|
101
|
+
|
|
102
|
+
### `comma` (default)
|
|
103
|
+
|
|
104
|
+
Standard thousands separator: `2,847,500원` or `₩2,847,500`.
|
|
105
|
+
|
|
106
|
+
### `korean`
|
|
107
|
+
|
|
108
|
+
Korean number names (만, 억) for compact display:
|
|
109
|
+
- < 10,000 won: `123원`
|
|
110
|
+
- 10,000–9,999,999 won: `1,234만원` (showing 만 as the unit)
|
|
111
|
+
- ≥ 10,000,000 won: `1억 2,345만원`
|
|
112
|
+
|
|
113
|
+
Use `korean` format for:
|
|
114
|
+
- Real estate prices (massive amounts)
|
|
115
|
+
- Investment account totals
|
|
116
|
+
- Hero displays in casual consumer apps
|
|
117
|
+
|
|
118
|
+
Don't use for transactional amounts (cart totals, transfers) — full digits required for accuracy.
|
|
119
|
+
|
|
120
|
+
## Type / color mapping
|
|
121
|
+
|
|
122
|
+
Per [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md):
|
|
123
|
+
|
|
124
|
+
| `type` | Color | Sign default |
|
|
125
|
+
| --- | --- | --- |
|
|
126
|
+
| `expense` | `--color-money-negative` | `-` |
|
|
127
|
+
| `income` | `--color-money-positive` | `+` (if `showSign`) |
|
|
128
|
+
| `transfer` | `--color-money-neutral` | `-` or none |
|
|
129
|
+
| `neutral` | `--color-text-primary` | none |
|
|
130
|
+
|
|
131
|
+
Inferred from sign by default; override with `type` prop.
|
|
132
|
+
|
|
133
|
+
## Tokens consumed
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
--color-text-primary
|
|
137
|
+
--color-money-positive
|
|
138
|
+
--color-money-negative
|
|
139
|
+
--color-money-neutral
|
|
140
|
+
--font-feature-amount: 'tnum' 1 (critical)
|
|
141
|
+
--font-size-sm, --font-size-base, --font-size-2xl, --font-size-4xl
|
|
142
|
+
--font-weight-semibold, --font-weight-bold
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Accessibility
|
|
146
|
+
|
|
147
|
+
- Render as `<span>` with semantic-aware `aria-label`:
|
|
148
|
+
```html
|
|
149
|
+
<span aria-label="290만 원">₩2,847,500</span>
|
|
150
|
+
```
|
|
151
|
+
- For type="expense": `aria-label="5,500원 지출"`.
|
|
152
|
+
- For income: `aria-label="2,500,000원 수입"`.
|
|
153
|
+
- Color is supplementary; don't encode meaning by color alone — sign + label do the work for screen readers.
|
|
154
|
+
|
|
155
|
+
## Code examples
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
// Transaction list cell
|
|
159
|
+
<KRWAmount value={tx.amount} type={tx.type} variant="compact" />
|
|
160
|
+
|
|
161
|
+
// Account balance hero
|
|
162
|
+
<KRWAmount
|
|
163
|
+
value={account.balance}
|
|
164
|
+
variant="hero"
|
|
165
|
+
delta={{
|
|
166
|
+
value: account.monthlyChange,
|
|
167
|
+
period: "이번 달",
|
|
168
|
+
goalDirection: account.balanceType === "savings" ? "up" : undefined,
|
|
169
|
+
}}
|
|
170
|
+
/>
|
|
171
|
+
|
|
172
|
+
// Receipt total
|
|
173
|
+
<KRWAmount value={order.total} variant="default" affixStyle="prefix" />
|
|
174
|
+
|
|
175
|
+
// Inline in narrative
|
|
176
|
+
<p>이번 달 지출: <KRWAmount value={monthlyExpense} type="expense" variant="inline" /></p>
|
|
177
|
+
|
|
178
|
+
// Korean compact for property listing
|
|
179
|
+
<KRWAmount value={propertyPrice} format="korean" variant="hero" />
|
|
180
|
+
{/* Renders: 5억 2,000만원 */}
|
|
181
|
+
|
|
182
|
+
// Foreign equivalent
|
|
183
|
+
<div>
|
|
184
|
+
<span>$25.00</span>
|
|
185
|
+
<span className="text-text-secondary">
|
|
186
|
+
(약 <KRWAmount value={33300} variant="inline" />)
|
|
187
|
+
</span>
|
|
188
|
+
</div>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Edge cases
|
|
192
|
+
|
|
193
|
+
- **Zero**: render as `0원` or `₩0` (not `-원`).
|
|
194
|
+
- **Negative amount with `showSign`**: prefer `-₩5,500` not `₩-5,500`.
|
|
195
|
+
- **Very large** (조 level): always full digits or with 조 unit. Don't crash.
|
|
196
|
+
- **Floating-point error in input**: round to integer at the boundary (`Math.round(value)`).
|
|
197
|
+
- **Currency conversion display**: pair with `KRWAmount` for the Korean half + native span for the foreign currency.
|
|
198
|
+
|
|
199
|
+
## Don't
|
|
200
|
+
|
|
201
|
+
- Don't show decimals for KRW. Round to integer at compute.
|
|
202
|
+
- Don't omit tabular numerals. Tables with mixed widths look broken.
|
|
203
|
+
- Don't auto-convert to `korean` format for transactional values — accuracy matters.
|
|
204
|
+
- Don't forget signed-amount color logic — silently positive amounts colored as negative is a real bug.
|
|
205
|
+
- Don't use `--color-error` for expense color. `money-negative` is its own axis.
|
|
206
|
+
|
|
207
|
+
## API rationale
|
|
208
|
+
|
|
209
|
+
- **`value` is a number, not a formatted string**: source of truth. KRWAmount is the single point of formatting.
|
|
210
|
+
- **`type` separate from sign**: a positive transfer (e.g., +₩100,000 to your savings account) is "neutral", not "income".
|
|
211
|
+
- **`format` opt-in for Korean compact**: full digits is the safer default; `korean` is the display option.
|
|
212
|
+
|
|
213
|
+
## Cross-reference
|
|
214
|
+
|
|
215
|
+
- [`knowledge/patterns/money-and-amount.md`](../knowledge/patterns/money-and-amount.md) — full money-display rules
|
|
216
|
+
- [`examples/component-amount-input.md`](component-amount-input.md) — editable counterpart
|
|
217
|
+
- [`examples/component-statistic.md`](component-statistic.md) — for KPI hero amounts (alternative)
|
|
218
|
+
- [`examples/component-transaction-list-item.md`](component-transaction-list-item.md) — uses KRWAmount internally
|
|
219
|
+
- [`examples/component-account-card.md`](component-account-card.md) — uses KRWAmount internally
|