@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,114 @@
|
|
|
1
|
+
# `TextareaAutosize` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from MUI `TextareaAutosize`. A `<textarea>` that grows with its content. Sibling to `Textarea` (with optional `autoResize`); shipped as separate primitive in MUI for use without other Textarea behaviors.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Comment fields that should grow as user types.
|
|
8
|
+
- Chat input that expands to multiple lines.
|
|
9
|
+
- Form fields where content length varies wildly (description, bio).
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<TextareaAutosize
|
|
15
|
+
minRows={2}
|
|
16
|
+
maxRows={8}
|
|
17
|
+
placeholder="Type a message..."
|
|
18
|
+
value={message}
|
|
19
|
+
onChange={(e) => setMessage(e.target.value)}
|
|
20
|
+
/>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
| --- | --- | --- | --- |
|
|
25
|
+
| `minRows` | `number` | `1` | Floor — height matches at least this many rows |
|
|
26
|
+
| `maxRows` | `number` | — | Cap — past this, scroll inside |
|
|
27
|
+
| `value` / `onChange` | controlled | — | Standard textarea props |
|
|
28
|
+
| `placeholder` | `string` | — | — |
|
|
29
|
+
|
|
30
|
+
## Implementation note
|
|
31
|
+
|
|
32
|
+
CSS-only autoResize via field-sizing (modern):
|
|
33
|
+
|
|
34
|
+
```css
|
|
35
|
+
textarea {
|
|
36
|
+
field-sizing: content;
|
|
37
|
+
min-height: 2lh;
|
|
38
|
+
max-height: 8lh;
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`field-sizing: content` (CSS Working Draft, in Chrome / Safari / Firefox 2024+) handles this natively.
|
|
43
|
+
|
|
44
|
+
For older browsers: JS measurement via hidden cloned textarea OR a ref + scrollHeight.
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
const ref = useRef<HTMLTextAreaElement>(null);
|
|
48
|
+
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!ref.current) return;
|
|
51
|
+
ref.current.style.height = "auto";
|
|
52
|
+
ref.current.style.height = `${ref.current.scrollHeight}px`;
|
|
53
|
+
}, [value]);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## States
|
|
57
|
+
|
|
58
|
+
Same as Textarea. Grows in addition to standard states.
|
|
59
|
+
|
|
60
|
+
## Tokens consumed
|
|
61
|
+
|
|
62
|
+
Same as `component-textarea.md`. Plus:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
--textarea-line-height (lh unit base)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Accessibility
|
|
69
|
+
|
|
70
|
+
- Same as Textarea — `<label>` linking, `aria-invalid`, IME handling.
|
|
71
|
+
- Resize handle (browser-default) usually visible. For `field-sizing: content`, no manual handle.
|
|
72
|
+
|
|
73
|
+
## Code example — chat input
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
function ChatInput() {
|
|
77
|
+
const [message, setMessage] = useState("");
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<div className="chat-input">
|
|
81
|
+
<TextareaAutosize
|
|
82
|
+
minRows={1}
|
|
83
|
+
maxRows={5}
|
|
84
|
+
placeholder="메시지를 입력하세요..."
|
|
85
|
+
value={message}
|
|
86
|
+
onChange={(e) => setMessage(e.target.value)}
|
|
87
|
+
onKeyDown={(e) => {
|
|
88
|
+
if (e.key === "Enter" && !e.shiftKey && !e.nativeEvent.isComposing) {
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
send();
|
|
91
|
+
}
|
|
92
|
+
}}
|
|
93
|
+
/>
|
|
94
|
+
<Button onClick={send}>Send</Button>
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Don't
|
|
101
|
+
|
|
102
|
+
- Don't auto-grow beyond viewport. Always set `maxRows`.
|
|
103
|
+
- Don't break Korean IME with Enter handler — check `isComposing` before submit.
|
|
104
|
+
- Don't measure on every keystroke without debouncing.
|
|
105
|
+
|
|
106
|
+
## References
|
|
107
|
+
|
|
108
|
+
- MUI: [`TextareaAutosize`](../refs/mui/packages/mui-material/src/TextareaAutosize)
|
|
109
|
+
- CSS `field-sizing` property (Working Draft)
|
|
110
|
+
|
|
111
|
+
## Cross-reference
|
|
112
|
+
|
|
113
|
+
- [`examples/component-textarea.md`](component-textarea.md)
|
|
114
|
+
- [`examples/component-chat-interface.md`](component-chat-interface.md)
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# `Textarea` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `textarea` and HTML5 `<textarea>`. Multi-line text input. Distinct from `Input` (single line) and rich text editors.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Multi-line text: comments, descriptions, messages, addresses.
|
|
8
|
+
- Code / config snippets (use a code editor for syntax highlighting).
|
|
9
|
+
- Long-form notes.
|
|
10
|
+
|
|
11
|
+
## Anatomy
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
┌──────────────────────────────────┐
|
|
15
|
+
│ Description │ ← Label (separate)
|
|
16
|
+
└──────────────────────────────────┘
|
|
17
|
+
┌──────────────────────────────────┐
|
|
18
|
+
│ │
|
|
19
|
+
│ Textarea content... │
|
|
20
|
+
│ │
|
|
21
|
+
│ │
|
|
22
|
+
└──────────────────────────────────┘
|
|
23
|
+
2-5 rows visible by default; scrolls or grows.
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## API
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
<Textarea
|
|
30
|
+
rows={4}
|
|
31
|
+
placeholder="Tell us about yourself..."
|
|
32
|
+
value={bio}
|
|
33
|
+
onChange={(e) => setBio(e.target.value)}
|
|
34
|
+
maxLength={500}
|
|
35
|
+
/>
|
|
36
|
+
|
|
37
|
+
<Textarea autoResize /> {/* MUI's textarea-autosize variant */}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Default | Description |
|
|
41
|
+
| --- | --- | --- | --- |
|
|
42
|
+
| `rows` | `number` | `3` | Visible row count |
|
|
43
|
+
| `maxRows` | `number` | — | Cap when autoResize=true |
|
|
44
|
+
| `minRows` | `number` | `1` | Floor when autoResize=true |
|
|
45
|
+
| `autoResize` | `boolean` | `false` | Grow with content (MUI textarea-autosize) |
|
|
46
|
+
| `value` / `onChange` | controlled | — | Standard input props |
|
|
47
|
+
| `placeholder` | `string` | — | — |
|
|
48
|
+
| `maxLength` | `number` | — | Char limit + counter |
|
|
49
|
+
| `disabled` / `readOnly` | `boolean` | — | — |
|
|
50
|
+
| `resize` | `"none" \| "vertical" \| "horizontal" \| "both"` | `"vertical"` | CSS resize behavior |
|
|
51
|
+
|
|
52
|
+
## Variants
|
|
53
|
+
|
|
54
|
+
### Fixed rows
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
<Textarea rows={3} />
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Standard. User can resize (per `resize` prop) or scroll if content overflows.
|
|
61
|
+
|
|
62
|
+
### Auto-resize (MUI textarea-autosize)
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<Textarea autoResize minRows={2} maxRows={8} />
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Grows with content up to `maxRows`, then scrolls.
|
|
69
|
+
|
|
70
|
+
### With character counter
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
const [text, setText] = useState("");
|
|
74
|
+
<Textarea
|
|
75
|
+
value={text}
|
|
76
|
+
onChange={(e) => setText(e.target.value)}
|
|
77
|
+
maxLength={500}
|
|
78
|
+
/>
|
|
79
|
+
<FieldDescription>{text.length} / 500</FieldDescription>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Show counter when approaching max (>80%).
|
|
83
|
+
|
|
84
|
+
## States
|
|
85
|
+
|
|
86
|
+
| State | Visual |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| Default | Border + transparent bg |
|
|
89
|
+
| Focused | Brand-color border ring |
|
|
90
|
+
| Filled | Same as default with content |
|
|
91
|
+
| Disabled | Reduced opacity, no events |
|
|
92
|
+
| Read-only | No focus ring, muted bg |
|
|
93
|
+
| Error | Red border |
|
|
94
|
+
|
|
95
|
+
## Tokens consumed
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
--textarea-bg
|
|
99
|
+
--textarea-fg
|
|
100
|
+
--textarea-placeholder
|
|
101
|
+
--textarea-border
|
|
102
|
+
--textarea-border-focus (brand)
|
|
103
|
+
--textarea-border-error
|
|
104
|
+
--textarea-resize-handle (drag corner)
|
|
105
|
+
--radius-md
|
|
106
|
+
--space-sm (padding)
|
|
107
|
+
--font-size-base
|
|
108
|
+
--font-family-text (or monospace for code)
|
|
109
|
+
--motion-fast
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Accessibility
|
|
113
|
+
|
|
114
|
+
- Always use `<label htmlFor>` linking. Or `aria-label` for inline.
|
|
115
|
+
- `aria-invalid="true"` when error.
|
|
116
|
+
- `aria-describedby` references help text + error.
|
|
117
|
+
- For maxLength: `aria-label` should NOT include "(max 500)" — visible counter is enough.
|
|
118
|
+
- Korean IME composition: don't fire onChange / submit during composition.
|
|
119
|
+
|
|
120
|
+
## Korean IME
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
const [composing, setComposing] = useState(false);
|
|
124
|
+
|
|
125
|
+
<Textarea
|
|
126
|
+
value={text}
|
|
127
|
+
onChange={(e) => !composing && setText(e.target.value)}
|
|
128
|
+
onCompositionStart={() => setComposing(true)}
|
|
129
|
+
onCompositionEnd={(e) => {
|
|
130
|
+
setComposing(false);
|
|
131
|
+
setText(e.currentTarget.value);
|
|
132
|
+
}}
|
|
133
|
+
/>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Critical for Hangul input — composition events span multiple keystrokes.
|
|
137
|
+
|
|
138
|
+
## Code example
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
<Field>
|
|
142
|
+
<Label htmlFor="bio">자기소개</Label>
|
|
143
|
+
<Textarea
|
|
144
|
+
id="bio"
|
|
145
|
+
rows={4}
|
|
146
|
+
maxLength={500}
|
|
147
|
+
placeholder="자기소개를 입력해 주세요"
|
|
148
|
+
{...register("bio")}
|
|
149
|
+
/>
|
|
150
|
+
<FieldDescription>
|
|
151
|
+
{watch("bio")?.length ?? 0} / 500
|
|
152
|
+
</FieldDescription>
|
|
153
|
+
</Field>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Don't
|
|
157
|
+
|
|
158
|
+
- Don't omit `<label>`.
|
|
159
|
+
- Don't auto-grow beyond viewport. Cap with `maxRows`.
|
|
160
|
+
- Don't use Textarea for rich-text needs (bold / italic / link). Use a real RTE.
|
|
161
|
+
- Don't ignore Korean IME composition events.
|
|
162
|
+
|
|
163
|
+
## References
|
|
164
|
+
|
|
165
|
+
- HTML5 `<textarea>`
|
|
166
|
+
- shadcn-ui: [`textarea`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/textarea.tsx)
|
|
167
|
+
- MUI: TextareaAutosize
|
|
168
|
+
|
|
169
|
+
## Cross-reference
|
|
170
|
+
|
|
171
|
+
- [`examples/component-input.md`](component-input.md) — single-line variant
|
|
172
|
+
- [`examples/component-textarea-autosize.md`](component-textarea-autosize.md) — autoResize specifics
|
|
173
|
+
- [`examples/component-field.md`](component-field.md) — common wrapper
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# `TimePicker` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from Ant Design `TimePicker` and MUI `TimePicker`. A picker for hour / minute / second selection. Distinct from `DatePicker` (date only) and `DateTimePicker` (combined).
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Schedule pickers (meeting time, alarm, reservation).
|
|
8
|
+
- Time-only inputs (no date context).
|
|
9
|
+
- Time range selection (start + end time).
|
|
10
|
+
|
|
11
|
+
When NOT to use:
|
|
12
|
+
- Date-only — use `DatePicker`.
|
|
13
|
+
- Date + time combined — use `DateTimePicker`.
|
|
14
|
+
- Duration (e.g., "30 minutes") — use a duration input (numeric stepper).
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
[ 14:30 ▾ ] ← trigger field
|
|
20
|
+
↓ open
|
|
21
|
+
┌─────────────────────┐
|
|
22
|
+
│ 10 ▲ 20 ▲ 00 ▲ │
|
|
23
|
+
│ 11 21 45 │
|
|
24
|
+
│ 12 22 50 │
|
|
25
|
+
│ 13 23 55 │
|
|
26
|
+
│ 14 ◀ 30 ◀ 00 ◀ │ ← currently selected
|
|
27
|
+
│ 15 31 05 │
|
|
28
|
+
│ ... │
|
|
29
|
+
│ │
|
|
30
|
+
│ [Now] [Confirm] │
|
|
31
|
+
└─────────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## API
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<TimePicker
|
|
38
|
+
value={time}
|
|
39
|
+
onChange={setTime}
|
|
40
|
+
format="HH:mm"
|
|
41
|
+
use12Hours={false}
|
|
42
|
+
step={5}
|
|
43
|
+
/>
|
|
44
|
+
|
|
45
|
+
<TimeRangePicker
|
|
46
|
+
value={[start, end]}
|
|
47
|
+
onChange={([s, e]) => { setStart(s); setEnd(e); }}
|
|
48
|
+
/>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Prop | Type | Default | Description |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `value` | `Date \| Dayjs \| null` | controlled | Selected time |
|
|
54
|
+
| `onChange` | `(time) => void` | — | Callback |
|
|
55
|
+
| `format` | `string` | `"HH:mm:ss"` | Display format |
|
|
56
|
+
| `use12Hours` | `boolean` | `false` | 12-hour with AM/PM |
|
|
57
|
+
| `step` | `number` | `1` | Minute granularity (5, 10, 15, 30) |
|
|
58
|
+
| `showSecond` | `boolean` | `true` | Include seconds picker |
|
|
59
|
+
| `disabled` | `boolean` | `false` | — |
|
|
60
|
+
| `disabledHours` | `() => number[]` | — | Hours unavailable |
|
|
61
|
+
| `disabledMinutes` | `(hour) => number[]` | — | Minutes unavailable per hour |
|
|
62
|
+
| `placeholder` | `string` | locale default | Placeholder |
|
|
63
|
+
|
|
64
|
+
## Variants
|
|
65
|
+
|
|
66
|
+
### Granularity
|
|
67
|
+
|
|
68
|
+
| Step | Use |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| 1 | Precise scheduling |
|
|
71
|
+
| 5 | Most consumer apps |
|
|
72
|
+
| 15 | Calendar appointments |
|
|
73
|
+
| 30 | Hourly time slots |
|
|
74
|
+
|
|
75
|
+
Avoid step=2 / 3 — feels arbitrary.
|
|
76
|
+
|
|
77
|
+
### 12 vs 24 hour
|
|
78
|
+
|
|
79
|
+
| Format | Default region |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| 24-hour (HH:mm) | Korea, EU, military |
|
|
82
|
+
| 12-hour (h:mm AM/PM) | US, casual contexts |
|
|
83
|
+
|
|
84
|
+
Korean apps default to 24-hour. Some consumer apps offer toggle.
|
|
85
|
+
|
|
86
|
+
### Range
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<TimeRangePicker value={[start, end]} onChange={...} />
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
For appointments, schedules. End must be after start (validate inline).
|
|
93
|
+
|
|
94
|
+
## States
|
|
95
|
+
|
|
96
|
+
| State | Visual |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| Default | Field shows placeholder or value |
|
|
99
|
+
| Focus | Field highlighted; picker can open on click |
|
|
100
|
+
| Open | Time grid overlay |
|
|
101
|
+
| Selected | Highlighted hour / minute / second columns |
|
|
102
|
+
| Disabled hour/min | Grayed in picker |
|
|
103
|
+
| Error | Red border (validation) |
|
|
104
|
+
|
|
105
|
+
## Tokens consumed
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
--time-picker-bg (panel)
|
|
109
|
+
--time-picker-fg
|
|
110
|
+
--time-picker-bg-hover
|
|
111
|
+
--time-picker-bg-selected
|
|
112
|
+
--time-picker-border
|
|
113
|
+
--space-sm, --space-md
|
|
114
|
+
--font-size-sm
|
|
115
|
+
--motion-fast
|
|
116
|
+
--z-overlay
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Accessibility
|
|
120
|
+
|
|
121
|
+
- Trigger: `<input>` with `role="combobox" aria-haspopup="dialog"`.
|
|
122
|
+
- Picker: `role="dialog"` (or `listbox`).
|
|
123
|
+
- Each column (hours / minutes / seconds): `role="listbox"` with `<li role="option">` items.
|
|
124
|
+
- Keyboard:
|
|
125
|
+
- Arrow Up/Down within column.
|
|
126
|
+
- Tab moves between columns.
|
|
127
|
+
- Enter confirms selection.
|
|
128
|
+
- Esc closes picker.
|
|
129
|
+
- Touch: large tap targets (≥ 44pt) for each cell.
|
|
130
|
+
- Format announcement: read selected time clearly ("오후 2시 30분" or "14시 30분").
|
|
131
|
+
|
|
132
|
+
## Korean conventions
|
|
133
|
+
|
|
134
|
+
- 24-hour default; some apps toggle 오전/오후 (AM/PM).
|
|
135
|
+
- Format: "14:30" or "오후 2:30".
|
|
136
|
+
- Speaker: "오후 두 시 삼십 분" (TTS).
|
|
137
|
+
- Korean step convention: 30분 (half-hour) for appointments; 5분 / 10분 for finer-grained.
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
<TimePicker
|
|
141
|
+
value={time}
|
|
142
|
+
onChange={setTime}
|
|
143
|
+
format="HH:mm"
|
|
144
|
+
step={5}
|
|
145
|
+
placeholder="시간 선택"
|
|
146
|
+
locale={koLocale}
|
|
147
|
+
/>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Code example — appointment booking
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
function AppointmentBooking() {
|
|
154
|
+
const [date, setDate] = useState(null);
|
|
155
|
+
const [time, setTime] = useState(null);
|
|
156
|
+
|
|
157
|
+
// Disable past times today
|
|
158
|
+
const disabledHours = () => {
|
|
159
|
+
if (!isSameDay(date, today)) return [];
|
|
160
|
+
const now = new Date().getHours();
|
|
161
|
+
return Array.from({ length: now }, (_, i) => i);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<Field>
|
|
166
|
+
<Label>예약 시간</Label>
|
|
167
|
+
<TimePicker
|
|
168
|
+
value={time}
|
|
169
|
+
onChange={setTime}
|
|
170
|
+
format="HH:mm"
|
|
171
|
+
step={30}
|
|
172
|
+
disabled={!date}
|
|
173
|
+
disabledHours={disabledHours}
|
|
174
|
+
/>
|
|
175
|
+
</Field>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Edge cases
|
|
181
|
+
|
|
182
|
+
- **DST transitions**: spring-forward / fall-back hours may have valid time pairs (1:30 AM happens twice on fall-back). Disambiguate via timezone.
|
|
183
|
+
- **Different timezones**: clearly label which zone is being selected.
|
|
184
|
+
- **Async-disabled times**: server checks "is this slot available?" — show loading + filter.
|
|
185
|
+
- **End-time before start-time** (range picker): validate inline; show error before submit.
|
|
186
|
+
- **Reduced motion**: skip column-scroll animation.
|
|
187
|
+
- **RTL**: column order may flip (hours/min/sec right-to-left).
|
|
188
|
+
|
|
189
|
+
## Don't
|
|
190
|
+
|
|
191
|
+
- Don't use 24-hour AM/PM ("14:30 PM"). One or the other.
|
|
192
|
+
- Don't use step=1 minute by default for casual schedulers — 30 picks per hour is overwhelming.
|
|
193
|
+
- Don't omit "Now" button on time-of-day pickers.
|
|
194
|
+
- Don't allow seconds for casual scheduling (most users don't care).
|
|
195
|
+
|
|
196
|
+
## References
|
|
197
|
+
|
|
198
|
+
- Ant: [`TimePicker`](../refs/ant-design/components/time-picker)
|
|
199
|
+
- MUI: `TimePicker` (in @mui/x-date-pickers)
|
|
200
|
+
- HTML5: `<input type="time">` (limited but accessible default)
|
|
201
|
+
|
|
202
|
+
## Cross-reference
|
|
203
|
+
|
|
204
|
+
- [`examples/component-date-picker.md`](component-date-picker.md)
|
|
205
|
+
- [`examples/component-calendar.md`](component-calendar.md)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# `Timeline` — spec
|
|
2
|
+
|
|
3
|
+
> Citing Ant Design `Timeline`, MUI (no built-in), shadcn-ui (composition)
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
A vertical (or horizontal) sequence of events. Used for: activity feeds, order tracking, history logs, project milestones, audit trails.
|
|
8
|
+
|
|
9
|
+
## Anatomy
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Vertical (default):
|
|
13
|
+
●─── 2026.05.07 14:30 ────
|
|
14
|
+
│ 주문이 접수되었습니다
|
|
15
|
+
│ 주문번호 #1234
|
|
16
|
+
│
|
|
17
|
+
●─── 2026.05.07 15:00 ────
|
|
18
|
+
│ 결제가 완료되었습니다
|
|
19
|
+
│ KakaoPay
|
|
20
|
+
│
|
|
21
|
+
○─── 2026.05.07 (예정) ────
|
|
22
|
+
│ 배송 준비 중
|
|
23
|
+
│
|
|
24
|
+
○─── 2026.05.10 (예정) ────
|
|
25
|
+
배송 완료 예정
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
| Slot | Required | Notes |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| Indicator (per event) | yes | Dot, icon, or filled vs outline |
|
|
31
|
+
| Connector line | yes | Vertical line connecting events |
|
|
32
|
+
| Event title | yes | The event name |
|
|
33
|
+
| Timestamp | yes | When |
|
|
34
|
+
| Description | optional | Detail |
|
|
35
|
+
| Custom content | optional | Image, link, button |
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
<Timeline>
|
|
41
|
+
<Timeline.Item status="completed" timestamp="2026.05.07 14:30">
|
|
42
|
+
<h4>주문이 접수되었습니다</h4>
|
|
43
|
+
<p>주문번호 #1234</p>
|
|
44
|
+
</Timeline.Item>
|
|
45
|
+
<Timeline.Item status="completed" timestamp="2026.05.07 15:00">
|
|
46
|
+
<h4>결제가 완료되었습니다</h4>
|
|
47
|
+
<p>KakaoPay</p>
|
|
48
|
+
</Timeline.Item>
|
|
49
|
+
<Timeline.Item status="pending" timestamp="2026.05.07 (예정)">
|
|
50
|
+
<h4>배송 준비 중</h4>
|
|
51
|
+
</Timeline.Item>
|
|
52
|
+
<Timeline.Item status="pending" timestamp="2026.05.10 (예정)">
|
|
53
|
+
<h4>배송 완료 예정</h4>
|
|
54
|
+
</Timeline.Item>
|
|
55
|
+
</Timeline>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
| Prop (root) | Type | Default | Description |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| `mode` | `"left" \| "right" \| "alternate"` | `"left"` | Indicator placement |
|
|
61
|
+
| `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | |
|
|
62
|
+
| `compact` | `boolean` | `false` | Tighter spacing |
|
|
63
|
+
|
|
64
|
+
| Prop (Item) | Type | Description |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| `status` | `"pending" \| "completed" \| "active" \| "error"` | Drives indicator color |
|
|
67
|
+
| `timestamp` | `string \| ReactNode` | When this happened |
|
|
68
|
+
| `icon` | `ReactNode` | Custom indicator (overrides dot) |
|
|
69
|
+
| `color` | `string` | Override indicator color |
|
|
70
|
+
| `position` | `"left" \| "right"` | (alternate mode only) which side |
|
|
71
|
+
|
|
72
|
+
## Variants
|
|
73
|
+
|
|
74
|
+
### Modes
|
|
75
|
+
|
|
76
|
+
| Mode | Indicator placement | Use |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| `left` (default) | Left side, content right | Most common, KR convention |
|
|
79
|
+
| `right` | Right side, content left | RTL contexts |
|
|
80
|
+
| `alternate` | Alternates left/right | Marketing pages, "story" timelines |
|
|
81
|
+
|
|
82
|
+
### Status → indicator
|
|
83
|
+
|
|
84
|
+
| Status | Indicator |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
| `completed` | Filled circle, primary color |
|
|
87
|
+
| `active` (current) | Filled circle, larger or pulsing |
|
|
88
|
+
| `pending` | Empty / outline circle |
|
|
89
|
+
| `error` | Filled circle, error red, X icon |
|
|
90
|
+
|
|
91
|
+
## States
|
|
92
|
+
|
|
93
|
+
A timeline doesn't have hover/focus states unless individual items are interactive (links, drill-ins).
|
|
94
|
+
|
|
95
|
+
## Tokens consumed
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
--color-primary-default (completed indicator)
|
|
99
|
+
--color-text-tertiary (pending indicator + connector line)
|
|
100
|
+
--color-error (error status)
|
|
101
|
+
--color-text-primary
|
|
102
|
+
--color-text-secondary (timestamp)
|
|
103
|
+
--space-md, --space-base
|
|
104
|
+
--radius-full (indicator circle)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Accessibility
|
|
108
|
+
|
|
109
|
+
- Container: `<ol>` (ordered list — order matters in a timeline).
|
|
110
|
+
- Each item: `<li>`.
|
|
111
|
+
- Timestamps: `<time datetime="ISO-format">` for machine-readable.
|
|
112
|
+
- Status: include in screen reader text — "Completed: 결제가 완료되었습니다".
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<ol>
|
|
116
|
+
<li>
|
|
117
|
+
<time datetime="2026-05-07T14:30:00+09:00">2026.05.07 14:30</time>
|
|
118
|
+
<span class="sr-only">완료됨: </span>
|
|
119
|
+
<h4>주문이 접수되었습니다</h4>
|
|
120
|
+
</li>
|
|
121
|
+
...
|
|
122
|
+
</ol>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Use cases
|
|
126
|
+
|
|
127
|
+
| Where | Pattern |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| Order tracking (e-commerce) | `left` mode, completed → pending sequence |
|
|
130
|
+
| Activity feed (social, project) | `left`, all completed, scrollable |
|
|
131
|
+
| Audit log | Compact mode, dense |
|
|
132
|
+
| Marketing "story" page | `alternate` mode with images |
|
|
133
|
+
| Project milestones | Horizontal, large indicators with dates |
|
|
134
|
+
|
|
135
|
+
## Korean convention
|
|
136
|
+
|
|
137
|
+
For order/transaction tracking (대표적인 한국 e-commerce / fintech):
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
● 주문 접수 2026.05.07 14:30
|
|
141
|
+
● 결제 완료 2026.05.07 15:00
|
|
142
|
+
● 상품 준비 2026.05.08 09:30
|
|
143
|
+
○ 배송 시작 예정
|
|
144
|
+
○ 배송 완료 예정
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Status terms:
|
|
148
|
+
- 완료 (completed)
|
|
149
|
+
- 진행 중 (in progress)
|
|
150
|
+
- 대기 (pending)
|
|
151
|
+
- 실패 (failed)
|
|
152
|
+
- 취소됨 (cancelled)
|
|
153
|
+
|
|
154
|
+
## Don't
|
|
155
|
+
|
|
156
|
+
- Don't use Timeline for non-sequential data. Use a list.
|
|
157
|
+
- Don't omit timestamps. Timeline without "when" is just a list.
|
|
158
|
+
- Don't use 50+ items. Paginate or virtualize. For activity feeds, use a scroll-load pattern.
|
|
159
|
+
- Don't use horizontal Timeline on mobile (cramped).
|
|
160
|
+
|
|
161
|
+
## References
|
|
162
|
+
|
|
163
|
+
- Ant Design: [`refs/ant-design/components/timeline/`](../refs/ant-design/components/timeline/) — `Timeline` with modes, custom icons, color overrides.
|
|
164
|
+
- MUI: `@mui/lab` `Timeline` (separate package) — alternate mode well-supported.
|
|
165
|
+
- shadcn-ui: no built-in. Compose from primitives.
|
|
166
|
+
|
|
167
|
+
## Cross-reference
|
|
168
|
+
|
|
169
|
+
- [`examples/component-steps.md`](component-steps.md) — when sequence has discrete user actions
|
|
170
|
+
- [`knowledge/patterns/list-and-feed.md`](../knowledge/patterns/list-and-feed.md) — activity feed patterns
|