@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,163 @@
|
|
|
1
|
+
# `Resizable` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `resizable`. Resizable panel groups for IDE-style layouts. Distinct from `Splitter` (covered separately) — Resizable here is the shadcn primitive.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- IDE-style two-pane layouts (sidebar | editor).
|
|
8
|
+
- Three-pane layouts (sidebar | editor | preview).
|
|
9
|
+
- Vertical splits (top pane / bottom pane — terminal below editor).
|
|
10
|
+
- Any UI where users want to manually adjust pane sizes.
|
|
11
|
+
|
|
12
|
+
When NOT to use:
|
|
13
|
+
- Simple two-column layouts that don't need user-resize (use Grid).
|
|
14
|
+
- Mobile (drag handles awkward on touch).
|
|
15
|
+
|
|
16
|
+
## Anatomy
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌────────┬─────────────────────────┐
|
|
20
|
+
│ Side │ │
|
|
21
|
+
│ panel ║ Main editor pane │
|
|
22
|
+
│ ║ │
|
|
23
|
+
│ ║ │
|
|
24
|
+
└────────┴─────────────────────────┘
|
|
25
|
+
↑ draggable handle (vertical bar)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<Resizable.Group direction="horizontal">
|
|
32
|
+
<Resizable.Panel defaultSize={25} minSize={15}>
|
|
33
|
+
<Sidebar />
|
|
34
|
+
</Resizable.Panel>
|
|
35
|
+
|
|
36
|
+
<Resizable.Handle />
|
|
37
|
+
|
|
38
|
+
<Resizable.Panel defaultSize={75}>
|
|
39
|
+
<Resizable.Group direction="vertical">
|
|
40
|
+
<Resizable.Panel defaultSize={70}>
|
|
41
|
+
<Editor />
|
|
42
|
+
</Resizable.Panel>
|
|
43
|
+
|
|
44
|
+
<Resizable.Handle />
|
|
45
|
+
|
|
46
|
+
<Resizable.Panel defaultSize={30} minSize={20} collapsible>
|
|
47
|
+
<Terminal />
|
|
48
|
+
</Resizable.Panel>
|
|
49
|
+
</Resizable.Group>
|
|
50
|
+
</Resizable.Panel>
|
|
51
|
+
</Resizable.Group>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Composition
|
|
55
|
+
|
|
56
|
+
| Part | Purpose |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| `Resizable.Group` | Wrapper; direction = "horizontal" or "vertical" |
|
|
59
|
+
| `Resizable.Panel` | Single resizable pane |
|
|
60
|
+
| `Resizable.Handle` | Draggable divider |
|
|
61
|
+
|
|
62
|
+
| Panel prop | Type | Description |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| `defaultSize` | `number` | Initial size as percentage |
|
|
65
|
+
| `minSize` | `number` | Minimum size % |
|
|
66
|
+
| `maxSize` | `number` | Maximum size % |
|
|
67
|
+
| `collapsible` | `boolean` | Allow collapsing to 0 |
|
|
68
|
+
| `collapsedSize` | `number` | Size when collapsed (default 0) |
|
|
69
|
+
| `onResize` | `(size) => void` | Callback during drag |
|
|
70
|
+
| `onCollapse` / `onExpand` | function | State callbacks |
|
|
71
|
+
|
|
72
|
+
## States
|
|
73
|
+
|
|
74
|
+
| State | Visual |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| Default | Handles visible (subtle) |
|
|
77
|
+
| Handle hover | Highlights (cursor: col-resize / row-resize) |
|
|
78
|
+
| Handle dragging | Active visual; user dragging |
|
|
79
|
+
| Panel collapsed | Width 0; chevron to expand |
|
|
80
|
+
| Panel min reached | Handle stops at min boundary |
|
|
81
|
+
|
|
82
|
+
## Tokens consumed
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
--resizable-handle-bg
|
|
86
|
+
--resizable-handle-bg-hover
|
|
87
|
+
--resizable-handle-bg-active
|
|
88
|
+
--resizable-handle-thickness (typically 4-8px)
|
|
89
|
+
--motion-fast
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Accessibility
|
|
93
|
+
|
|
94
|
+
- Handle: `role="separator" aria-orientation="vertical|horizontal" aria-valuenow={size} aria-valuemin={minSize} aria-valuemax={maxSize}`.
|
|
95
|
+
- Keyboard:
|
|
96
|
+
- Tab to focus handle.
|
|
97
|
+
- Arrow keys (Left/Right or Up/Down) move handle by 5%.
|
|
98
|
+
- Home / End: snap to min / max.
|
|
99
|
+
- Enter (when collapsible): toggle collapse.
|
|
100
|
+
- Don't make handle thinner than 4px — hard to grab.
|
|
101
|
+
|
|
102
|
+
## Layout persistence
|
|
103
|
+
|
|
104
|
+
Save panel sizes to localStorage so they persist across sessions:
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
const [sizes, setSizes] = useLocalStorage("layout-sizes", [25, 75]);
|
|
108
|
+
|
|
109
|
+
<Resizable.Group
|
|
110
|
+
direction="horizontal"
|
|
111
|
+
onLayout={(newSizes) => setSizes(newSizes)}
|
|
112
|
+
>
|
|
113
|
+
...
|
|
114
|
+
</Resizable.Group>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Code example — IDE shell
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
function IDEShell() {
|
|
121
|
+
return (
|
|
122
|
+
<Resizable.Group direction="horizontal" className="h-screen">
|
|
123
|
+
<Resizable.Panel defaultSize={20} minSize={15} collapsible>
|
|
124
|
+
<FileExplorer />
|
|
125
|
+
</Resizable.Panel>
|
|
126
|
+
<Resizable.Handle />
|
|
127
|
+
<Resizable.Panel defaultSize={60}>
|
|
128
|
+
<Resizable.Group direction="vertical">
|
|
129
|
+
<Resizable.Panel defaultSize={70}>
|
|
130
|
+
<Editor />
|
|
131
|
+
</Resizable.Panel>
|
|
132
|
+
<Resizable.Handle />
|
|
133
|
+
<Resizable.Panel defaultSize={30} minSize={10}>
|
|
134
|
+
<Terminal />
|
|
135
|
+
</Resizable.Panel>
|
|
136
|
+
</Resizable.Group>
|
|
137
|
+
</Resizable.Panel>
|
|
138
|
+
<Resizable.Handle />
|
|
139
|
+
<Resizable.Panel defaultSize={20} minSize={15} collapsible>
|
|
140
|
+
<Outline />
|
|
141
|
+
</Resizable.Panel>
|
|
142
|
+
</Resizable.Group>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Don't
|
|
148
|
+
|
|
149
|
+
- Don't ship without min/max sizes — users drag to 0 and lose content.
|
|
150
|
+
- Don't make handles invisible — affordance must be visible.
|
|
151
|
+
- Don't auto-resize on window resize without preserving user adjustments.
|
|
152
|
+
- Don't use Resizable on mobile — touch drag conflicts with scroll.
|
|
153
|
+
|
|
154
|
+
## References
|
|
155
|
+
|
|
156
|
+
- shadcn-ui: [`resizable`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/resizable.tsx) — wraps `react-resizable-panels`
|
|
157
|
+
- VS Code, Linear, Cursor — IDE layout pattern
|
|
158
|
+
|
|
159
|
+
## Cross-reference
|
|
160
|
+
|
|
161
|
+
- [`examples/component-splitter.md`](component-splitter.md) — Ant equivalent
|
|
162
|
+
- [`examples/component-sidebar.md`](component-sidebar.md)
|
|
163
|
+
- [`examples/component-layout.md`](component-layout.md)
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# `Result` + `Empty` — combined spec
|
|
2
|
+
|
|
3
|
+
> Two sibling full-page components. Result for outcome of an action; Empty for no-data state. Same shape, different intent.
|
|
4
|
+
>
|
|
5
|
+
> Citing Ant Design `Result` + `Empty`, MUI (composition), shadcn-ui (composition)
|
|
6
|
+
|
|
7
|
+
## Semantic difference
|
|
8
|
+
|
|
9
|
+
| Component | Use | Trigger |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| **Result** | Confirms an outcome (success / error / 404 / etc.) | After user action OR after navigation to a status page |
|
|
12
|
+
| **Empty** | "No data here" placeholder | When data is absent (first-time, filtered, cleared) |
|
|
13
|
+
|
|
14
|
+
Both render full-page-style content (icon + title + description + action). They differ in **what they communicate** and **when they appear**.
|
|
15
|
+
|
|
16
|
+
The patterns for both are detailed in:
|
|
17
|
+
- [`knowledge/patterns/empty-states.md`](../knowledge/patterns/empty-states.md) — full empty-state pattern reference
|
|
18
|
+
- [`knowledge/patterns/error-states.md`](../knowledge/patterns/error-states.md) — full error-state pattern reference
|
|
19
|
+
|
|
20
|
+
This spec provides the **component primitive** for both.
|
|
21
|
+
|
|
22
|
+
## Anatomy
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌──────────────────────────────────────────────────┐
|
|
26
|
+
│ │
|
|
27
|
+
│ [icon / illustration] │
|
|
28
|
+
│ │
|
|
29
|
+
│ Title │
|
|
30
|
+
│ │
|
|
31
|
+
│ Description (1–2 sentences) │
|
|
32
|
+
│ │
|
|
33
|
+
│ [Primary CTA] [Secondary] │
|
|
34
|
+
│ │
|
|
35
|
+
└──────────────────────────────────────────────────┘
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Slot | Required | Notes |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| Icon / illustration | recommended | Conveys outcome; ~80–120px |
|
|
41
|
+
| Title | yes | Plain language outcome |
|
|
42
|
+
| Description | usually | Detail or recovery hint |
|
|
43
|
+
| Primary action | usually | Most likely next step |
|
|
44
|
+
| Secondary action | optional | Alternative path |
|
|
45
|
+
| Extra content | optional | Order ID, error code, transaction details |
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
### Result
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<Result
|
|
53
|
+
status="success"
|
|
54
|
+
title="결제가 완료되었습니다"
|
|
55
|
+
description="주문번호 #1234567 - 영수증이 이메일로 전송되었습니다."
|
|
56
|
+
primaryAction={{ label: "주문 내역 보기", onClick: () => nav("/orders") }}
|
|
57
|
+
secondaryAction={{ label: "쇼핑 계속", onClick: () => nav("/") }}
|
|
58
|
+
extra={<OrderSummary order={order} />}
|
|
59
|
+
/>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| Prop | Type | Default | Description |
|
|
63
|
+
| --- | --- | --- | --- |
|
|
64
|
+
| `status` | `"success" \| "info" \| "warning" \| "error" \| "404" \| "403" \| "500"` | `"info"` | Drives icon + color |
|
|
65
|
+
| `title` | `string \| ReactNode` | — | Required |
|
|
66
|
+
| `description` | `string \| ReactNode` | — | |
|
|
67
|
+
| `icon` | `ReactNode` | derived from status | Custom icon override |
|
|
68
|
+
| `primaryAction` | `Action` | — | |
|
|
69
|
+
| `secondaryAction` | `Action` | — | |
|
|
70
|
+
| `extra` | `ReactNode` | — | Below actions: order details, error code, etc. |
|
|
71
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
72
|
+
|
|
73
|
+
### Empty
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<Empty
|
|
77
|
+
title="아직 거래 내역이 없어요"
|
|
78
|
+
description="첫 거래를 추가해 보세요."
|
|
79
|
+
illustration="default"
|
|
80
|
+
primaryAction={{ label: "거래 추가", onClick: openAddModal }}
|
|
81
|
+
/>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| Prop | Type | Default | Description |
|
|
85
|
+
| --- | --- | --- | --- |
|
|
86
|
+
| `title` | `string \| ReactNode` | — | Required |
|
|
87
|
+
| `description` | `string \| ReactNode` | — | |
|
|
88
|
+
| `illustration` | `"default" \| "search" \| "error" \| ReactNode` | `"default"` | Pre-set illustrations or custom |
|
|
89
|
+
| `primaryAction` | `Action` | — | |
|
|
90
|
+
| `secondaryAction` | `Action` | — | |
|
|
91
|
+
| `size` | `"sm" \| "md" \| "lg"` | `"md"` | |
|
|
92
|
+
| `inline` | `boolean` | `false` | Compact horizontal layout for inside cards/sidebars |
|
|
93
|
+
|
|
94
|
+
## Status → icon + color
|
|
95
|
+
|
|
96
|
+
| Status | Default icon | Color |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `success` | ✓ check circle | `--color-success` |
|
|
99
|
+
| `info` | ℹ info circle | `--color-info` |
|
|
100
|
+
| `warning` | ⚠ warning triangle | `--color-warning` |
|
|
101
|
+
| `error` | ✕ error circle | `--color-error` |
|
|
102
|
+
| `404` | 🗺 map / lost | `--color-text-secondary` |
|
|
103
|
+
| `403` | 🔒 lock | `--color-text-secondary` |
|
|
104
|
+
| `500` | ⚠ alert | `--color-error` |
|
|
105
|
+
|
|
106
|
+
For brand-led products: replace with custom illustrations. Keep size + position consistent.
|
|
107
|
+
|
|
108
|
+
## Sizes
|
|
109
|
+
|
|
110
|
+
| Size | Icon | Title font | Padding |
|
|
111
|
+
| --- | --- | --- | --- |
|
|
112
|
+
| `sm` | 48px | 16px | 24px |
|
|
113
|
+
| `md` (default) | 80px | 20px | 48px |
|
|
114
|
+
| `lg` | 120px | 24px | 64px |
|
|
115
|
+
|
|
116
|
+
For full-page result (404 page, post-checkout): `lg`. For inline empty in a card: `sm` or `inline`.
|
|
117
|
+
|
|
118
|
+
## Layout — full-page vs inline
|
|
119
|
+
|
|
120
|
+
### Full-page (default)
|
|
121
|
+
|
|
122
|
+
Vertical centered. Padding pushes content to ~1/3 from top.
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
[empty space ~30vh]
|
|
126
|
+
[icon centered]
|
|
127
|
+
[title centered]
|
|
128
|
+
[description centered, max-w 480px]
|
|
129
|
+
[actions centered]
|
|
130
|
+
[empty space below]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Inline (Empty only, with `inline={true}`)
|
|
134
|
+
|
|
135
|
+
Horizontal compact. Icon left, text right. For inside small cards/sidebars where vertical centered would waste space.
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
[icon] [title]
|
|
139
|
+
[description]
|
|
140
|
+
[link CTA]
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Tokens consumed
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
--color-text-primary (title)
|
|
147
|
+
--color-text-secondary (description)
|
|
148
|
+
--color-text-tertiary
|
|
149
|
+
--color-success, --color-warning, --color-error, --color-info
|
|
150
|
+
--color-bg-default
|
|
151
|
+
--color-primary-default (primary action)
|
|
152
|
+
--space-xl, --space-2xl, --space-3xl
|
|
153
|
+
--font-size-base, --font-size-xl, --font-size-2xl
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Accessibility
|
|
157
|
+
|
|
158
|
+
- Wrap in a heading hierarchy: title is `<h1>` for full-page (404), `<h2>` for in-page.
|
|
159
|
+
- Status icons: `aria-hidden="true"` (decorative — title carries meaning).
|
|
160
|
+
- Container: `role="status"` for empty / info / success; `role="alert"` for error / warning.
|
|
161
|
+
- Primary action gets focus when component mounts (full-page Result), so keyboard users land on the recovery path.
|
|
162
|
+
|
|
163
|
+
```html
|
|
164
|
+
<section role="alert">
|
|
165
|
+
<Icon aria-hidden="true" />
|
|
166
|
+
<h1>찾을 수 없는 페이지입니다</h1>
|
|
167
|
+
<p>주소를 확인하거나 홈으로 돌아가 주세요.</p>
|
|
168
|
+
<Button autoFocus>홈으로</Button>
|
|
169
|
+
</section>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Code examples
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
// 404 page
|
|
176
|
+
<Result
|
|
177
|
+
status="404"
|
|
178
|
+
title="찾을 수 없는 페이지입니다"
|
|
179
|
+
description="주소를 확인하거나 홈으로 돌아가 주세요."
|
|
180
|
+
primaryAction={{ label: "홈으로", onClick: () => nav("/") }}
|
|
181
|
+
secondaryAction={{ label: "검색", onClick: () => nav("/search") }}
|
|
182
|
+
/>
|
|
183
|
+
|
|
184
|
+
// Post-checkout success
|
|
185
|
+
<Result
|
|
186
|
+
status="success"
|
|
187
|
+
title="결제가 완료되었습니다"
|
|
188
|
+
description={`주문번호 #${order.id}`}
|
|
189
|
+
primaryAction={{ label: "주문 내역 보기", onClick: () => nav(`/orders/${order.id}`) }}
|
|
190
|
+
secondaryAction={{ label: "쇼핑 계속", onClick: () => nav("/") }}
|
|
191
|
+
extra={
|
|
192
|
+
<Card>
|
|
193
|
+
<p>{order.items.length}개 상품 · ₩{order.total.toLocaleString()}</p>
|
|
194
|
+
<p>예상 도착일: {order.deliveryDate}</p>
|
|
195
|
+
</Card>
|
|
196
|
+
}
|
|
197
|
+
/>
|
|
198
|
+
|
|
199
|
+
// Permission error
|
|
200
|
+
<Result
|
|
201
|
+
status="403"
|
|
202
|
+
title="접근 권한이 없습니다"
|
|
203
|
+
description="이 페이지를 보려면 관리자 권한이 필요합니다."
|
|
204
|
+
primaryAction={{ label: "관리자에게 요청", onClick: requestAccess }}
|
|
205
|
+
secondaryAction={{ label: "돌아가기", onClick: () => history.back() }}
|
|
206
|
+
/>
|
|
207
|
+
|
|
208
|
+
// First-time empty in a list
|
|
209
|
+
<Empty
|
|
210
|
+
title="아직 거래 내역이 없어요"
|
|
211
|
+
description="첫 거래를 추가해 보세요."
|
|
212
|
+
primaryAction={{ label: "거래 추가", onClick: openAddModal }}
|
|
213
|
+
/>
|
|
214
|
+
|
|
215
|
+
// Filtered empty
|
|
216
|
+
<Empty
|
|
217
|
+
title="검색 결과가 없습니다"
|
|
218
|
+
description="다른 검색어를 시도해 보세요."
|
|
219
|
+
illustration="search"
|
|
220
|
+
primaryAction={{ label: "검색어 지우기", onClick: clearQuery }}
|
|
221
|
+
/>
|
|
222
|
+
|
|
223
|
+
// Inline empty (small card)
|
|
224
|
+
<Card>
|
|
225
|
+
<Empty
|
|
226
|
+
inline
|
|
227
|
+
size="sm"
|
|
228
|
+
title="할 일이 없어요"
|
|
229
|
+
description="새 작업을 추가하면 여기에 표시됩니다."
|
|
230
|
+
/>
|
|
231
|
+
</Card>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Edge cases
|
|
235
|
+
|
|
236
|
+
- **Result during async waiting**: don't render Result for "loading" state. Use Skeleton or Spinner.
|
|
237
|
+
- **Result with no actions**: legitimate for "Account closed" or "Operation logged" — but most should have at least one path.
|
|
238
|
+
- **Empty inside a paginated list**: empty applies to page 1 only, not page 5 of 10. Page 5 with no items means "load more" exhausted, which is different.
|
|
239
|
+
- **404 with deep link guess**: detect common patterns and offer ("Did you mean /projects/123?").
|
|
240
|
+
- **Mobile sizing**: full `lg` may overflow on small phones. Cap icon at 100px on mobile.
|
|
241
|
+
- **Long titles** (Korean often verbose): allow 2-line wrap; don't truncate.
|
|
242
|
+
|
|
243
|
+
## Don't
|
|
244
|
+
|
|
245
|
+
- Don't use Result for inline status indicators (use Tag or Badge).
|
|
246
|
+
- Don't use Empty when there's an error — distinct pattern. See [`error-states.md`](../knowledge/patterns/error-states.md).
|
|
247
|
+
- Don't show a Result with no primary action for failure states — user is stuck.
|
|
248
|
+
- Don't auto-redirect after Result without giving the user time to read.
|
|
249
|
+
- Don't use technical jargon ("Error 404"). Plain language.
|
|
250
|
+
- Don't show stock illustrations from a vendor library — they date.
|
|
251
|
+
- Don't render multiple Results stacked. One per screen.
|
|
252
|
+
|
|
253
|
+
## References
|
|
254
|
+
|
|
255
|
+
- Ant Design: [`refs/ant-design/components/result/`](../refs/ant-design/components/result/) (Result) + [`refs/ant-design/components/empty/`](../refs/ant-design/components/empty/) (Empty). Both well-developed.
|
|
256
|
+
- MUI: no dedicated components. Compose with Card + Typography.
|
|
257
|
+
- shadcn-ui: no built-in. Compose from primitives.
|
|
258
|
+
|
|
259
|
+
API choices made:
|
|
260
|
+
- **Combined spec for Result + Empty**: 90% of the visual + a11y is shared. Speccing separately would force triplicate maintenance.
|
|
261
|
+
- **`status` prop on Result, not Empty**: Empty doesn't have status semantics ("empty" is the state).
|
|
262
|
+
- **`extra` slot on Result**: outcome confirmations frequently need order/transaction detail.
|
|
263
|
+
- **`inline` mode on Empty**: full-page is overkill for cards/sidebars; provides escape hatch.
|
|
264
|
+
|
|
265
|
+
## Cross-reference
|
|
266
|
+
|
|
267
|
+
- [`knowledge/patterns/empty-states.md`](../knowledge/patterns/empty-states.md) — comprehensive empty pattern guide
|
|
268
|
+
- [`knowledge/patterns/error-states.md`](../knowledge/patterns/error-states.md) — error pattern guide
|
|
269
|
+
- [`knowledge/i18n/korean-product-conventions.md`](../knowledge/i18n/korean-product-conventions.md) — Korean tone for results
|
|
270
|
+
- [`examples/component-button.md`](component-button.md) — primary/secondary actions
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# `ScrollArea` — spec
|
|
2
|
+
|
|
3
|
+
> Synthesized from shadcn-ui `scroll-area` (Radix). Custom-styled scrollbar that replaces the platform default. Used when native scrollbars don't match the design system or when consistent cross-platform appearance is needed.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- **Design-system-consistent scrollbars** across macOS / Windows / Linux (native scrollbars vary widely).
|
|
8
|
+
- **Always-visible scrollbars** (macOS hides them by default; some UIs need them visible).
|
|
9
|
+
- **Inside narrow surfaces** (sidebars, dropdowns) where native scrollbars look out of place.
|
|
10
|
+
- **Brand-aligned visual** — color-customized scrollbars.
|
|
11
|
+
|
|
12
|
+
When NOT to use:
|
|
13
|
+
- The whole document body — let the browser handle main scroll.
|
|
14
|
+
- Long-form reading content — native scroll is faster + more familiar.
|
|
15
|
+
- Mobile-primary surfaces — system scroll is deeply integrated with momentum + bounce.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌───────────────────────────┐
|
|
21
|
+
│ Content ▒│ ← thumb (scrollbar)
|
|
22
|
+
│ Item 1 ▒│
|
|
23
|
+
│ Item 2 ▒│
|
|
24
|
+
│ Item 3 ▒│
|
|
25
|
+
│ ... ▒│
|
|
26
|
+
│ │
|
|
27
|
+
└───────────────────────────┘
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## API
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
<ScrollArea className="h-72 w-48 rounded-md border">
|
|
34
|
+
<div className="p-4">
|
|
35
|
+
{items.map(item => (
|
|
36
|
+
<div key={item.id}>{item.name}</div>
|
|
37
|
+
))}
|
|
38
|
+
</div>
|
|
39
|
+
</ScrollArea>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| Prop | Type | Default | Description |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| `type` | `"auto" \| "always" \| "scroll" \| "hover"` | `"hover"` | Scrollbar visibility |
|
|
45
|
+
| `scrollHideDelay` | `number` | `600` | Ms before scrollbar hides (when type is `scroll`) |
|
|
46
|
+
| `dir` | `"ltr" \| "rtl"` | `"ltr"` | Direction (affects scroll position) |
|
|
47
|
+
| `children` | `ReactNode` | — | Scrolling content |
|
|
48
|
+
|
|
49
|
+
## Visibility modes
|
|
50
|
+
|
|
51
|
+
| `type` | Behavior |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `auto` | Show only when content overflows |
|
|
54
|
+
| `always` | Always visible regardless of content |
|
|
55
|
+
| `scroll` | Visible while scrolling, fades after `scrollHideDelay` |
|
|
56
|
+
| `hover` (default) | Visible on hover or while scrolling |
|
|
57
|
+
|
|
58
|
+
## Composition
|
|
59
|
+
|
|
60
|
+
| Part | Purpose |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| `ScrollArea` | Wrapper with overflow control |
|
|
63
|
+
| `ScrollAreaViewport` | The clipping container (auto-rendered) |
|
|
64
|
+
| `ScrollAreaScrollbar` | The scrollbar track + thumb (auto-rendered) |
|
|
65
|
+
| `ScrollAreaThumb` | The draggable thumb (auto-rendered) |
|
|
66
|
+
| `ScrollAreaCorner` | Bottom-right corner when both axes scroll (auto-rendered) |
|
|
67
|
+
|
|
68
|
+
In practice, just use `<ScrollArea>` and let it manage subparts.
|
|
69
|
+
|
|
70
|
+
## Custom scrollbar styles
|
|
71
|
+
|
|
72
|
+
```css
|
|
73
|
+
[data-radix-scroll-area-scrollbar] {
|
|
74
|
+
display: flex;
|
|
75
|
+
user-select: none;
|
|
76
|
+
touch-action: none;
|
|
77
|
+
padding: 2px;
|
|
78
|
+
background: transparent;
|
|
79
|
+
transition: background 200ms ease;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
[data-radix-scroll-area-scrollbar][data-orientation="vertical"] {
|
|
83
|
+
width: 10px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[data-radix-scroll-area-scrollbar][data-orientation="horizontal"] {
|
|
87
|
+
height: 10px;
|
|
88
|
+
flex-direction: column;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
[data-radix-scroll-area-thumb] {
|
|
92
|
+
flex: 1;
|
|
93
|
+
background: var(--color-fg-muted);
|
|
94
|
+
border-radius: 5px;
|
|
95
|
+
position: relative;
|
|
96
|
+
cursor: pointer;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
[data-radix-scroll-area-thumb]:hover {
|
|
100
|
+
background: var(--color-fg-default);
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Tokens consumed
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
--color-fg-muted (scrollbar thumb default)
|
|
108
|
+
--color-fg-default (thumb hover)
|
|
109
|
+
--color-bg-secondary (scrollbar track, optional)
|
|
110
|
+
--space-xxs (scrollbar padding)
|
|
111
|
+
--motion-fast (visibility transition)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## States
|
|
115
|
+
|
|
116
|
+
| State | Visual |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| Resting (with `hover` type) | Scrollbar hidden |
|
|
119
|
+
| Hovered or scrolling | Scrollbar visible (fade in 100ms) |
|
|
120
|
+
| Thumb hover | Slightly darker / brighter thumb |
|
|
121
|
+
| Thumb dragged | Active state visual |
|
|
122
|
+
| Idle (after scroll) | Fades out (with `scroll` type) |
|
|
123
|
+
|
|
124
|
+
## Accessibility
|
|
125
|
+
|
|
126
|
+
- ScrollArea preserves native scroll keyboard handling (PageUp / PageDown / arrows / Space).
|
|
127
|
+
- Don't replace native scroll mechanics — only the visual appearance.
|
|
128
|
+
- Don't trap scroll inside without an obvious "exit" path (lock scroll OR document scroll, not both ambiguously).
|
|
129
|
+
- For overflow-only-on-hover patterns: ensure keyboard users can also access (Tab to focus content, arrow / PageDown to scroll).
|
|
130
|
+
- Mobile: respects native momentum scroll; thumb may be hidden on mobile (system handles it).
|
|
131
|
+
|
|
132
|
+
## Code example — Sidebar nav with custom scrollbar
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
function Sidebar() {
|
|
136
|
+
return (
|
|
137
|
+
<aside className="sidebar">
|
|
138
|
+
<header>
|
|
139
|
+
<Logo />
|
|
140
|
+
</header>
|
|
141
|
+
|
|
142
|
+
<ScrollArea className="flex-1 px-2">
|
|
143
|
+
<nav>
|
|
144
|
+
<NavSection title="Workspace">
|
|
145
|
+
{workspaceItems.map(item => <NavItem key={item.id} {...item} />)}
|
|
146
|
+
</NavSection>
|
|
147
|
+
<NavSection title="Projects">
|
|
148
|
+
{projects.map(p => <NavItem key={p.id} {...p} />)}
|
|
149
|
+
</NavSection>
|
|
150
|
+
</nav>
|
|
151
|
+
</ScrollArea>
|
|
152
|
+
|
|
153
|
+
<footer>
|
|
154
|
+
<UserMenu />
|
|
155
|
+
</footer>
|
|
156
|
+
</aside>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Code example — Chat history
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
<ScrollArea type="always" className="chat-history">
|
|
165
|
+
{messages.map(m => (
|
|
166
|
+
<Message key={m.id} message={m} />
|
|
167
|
+
))}
|
|
168
|
+
</ScrollArea>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Edge cases
|
|
172
|
+
|
|
173
|
+
- **Content exact height as ScrollArea**: scrollbar may briefly appear during render; use `type="auto"`.
|
|
174
|
+
- **Mac users with hidden scrollbars**: respect their preference; `type="hover"` works well.
|
|
175
|
+
- **Touch device**: native touch scroll preserved; styled thumb usually invisible.
|
|
176
|
+
- **Very long content (10,000+ items)**: virtualize content, not just the scrollbar (use react-virtual).
|
|
177
|
+
- **RTL**: scrollbar appears on left; content scrolls right-to-left.
|
|
178
|
+
- **Print**: native scroll; ScrollArea custom styling doesn't apply.
|
|
179
|
+
- **Mobile keyboard opens**: viewport shrinks; ScrollArea height adjusts via parent layout.
|
|
180
|
+
|
|
181
|
+
## Don't
|
|
182
|
+
|
|
183
|
+
- Don't replace document-level scroll with ScrollArea. Browsers + native scroll handle that better.
|
|
184
|
+
- Don't make custom scrollbars wildly different from system convention (users miss them).
|
|
185
|
+
- Don't make the thumb so small it's hard to grab (< 8px width).
|
|
186
|
+
- Don't disable native keyboard scroll keys.
|
|
187
|
+
- Don't trap scroll without an exit (avoid scroll-jacking).
|
|
188
|
+
- Don't add scroll-snap inside ScrollArea unless intentional — can interact unexpectedly with momentum.
|
|
189
|
+
|
|
190
|
+
## References
|
|
191
|
+
|
|
192
|
+
- shadcn-ui: [`scroll-area`](../refs/shadcn-ui/apps/v4/registry/new-york-v4/ui/scroll-area.tsx) (Radix)
|
|
193
|
+
- CSS `scrollbar-color`, `scrollbar-width` properties (browser-specific styling alternative)
|
|
194
|
+
|
|
195
|
+
## Cross-reference
|
|
196
|
+
|
|
197
|
+
- [`examples/component-sidebar.md`](component-sidebar.md) — common consumer
|
|
198
|
+
- [`examples/component-chat-interface.md`](component-chat-interface.md) — chat history scroll
|
|
199
|
+
- [`examples/component-table.md`](component-table.md) — table with scrollable body
|