@qijenchen/design-system 0.1.0-beta.10 → 0.1.0-beta.13
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.md +201 -0
- package/README.md +7 -15
- package/cli-init.mjs +90 -0
- package/ds-canonical/commands/README.md +26 -0
- package/ds-canonical/commands/gov-status.md +79 -0
- package/ds-canonical/hooks/README.md +145 -0
- package/ds-canonical/hooks/_log-fire.sh +44 -0
- package/ds-canonical/hooks/block_prototype_imports.py +111 -0
- package/ds-canonical/hooks/check_app_shell_primary_header_consistency.sh +68 -0
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +88 -0
- package/ds-canonical/hooks/check_audit_sample_escape.sh +73 -0
- package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
- package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
- package/ds-canonical/hooks/check_chrome_header_handcraft.sh +70 -0
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +83 -0
- package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
- package/ds-canonical/hooks/check_datatable_invariants.sh +117 -0
- package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
- package/ds-canonical/hooks/check_field_controls_contracts.sh +110 -0
- package/ds-canonical/hooks/check_field_family_invariants.sh +205 -0
- package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
- package/ds-canonical/hooks/check_header_with_tabs_border.sh +87 -0
- package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
- package/ds-canonical/hooks/check_opacity_token_usage.sh +149 -0
- package/ds-canonical/hooks/check_pattern_invariants.sh +194 -0
- package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
- package/ds-canonical/hooks/check_propose_plain_chinese.sh +74 -0
- package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
- package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
- package/ds-canonical/hooks/check_solo_workflow.sh +258 -0
- package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
- package/ds-canonical/hooks/check_story_invariants.sh +612 -0
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +105 -0
- package/ds-canonical/hooks/check_tab_lg_chrome_header_equal.sh +66 -0
- package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
- package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
- package/ds-canonical/hooks/inject_pending_self_audit.sh +204 -0
- package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
- package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
- package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
- package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
- package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
- package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
- package/ds-canonical/hooks/lib/_overlay_handcraft.sh +141 -0
- package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
- package/ds-canonical/hooks/lib/_token_hygiene.sh +95 -0
- package/ds-canonical/hooks/log_governance_fires.sh +50 -0
- package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
- package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
- package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
- package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
- package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
- package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
- package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
- package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
- package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
- package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
- package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
- package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
- package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
- package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
- package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
- package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
- package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
- package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
- package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
- package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
- package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
- package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
- package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
- package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
- package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
- package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
- package/ds-canonical/hooks/session_start_governance_check.sh +263 -0
- package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
- package/ds-canonical/hooks/stop_self_audit.sh +450 -0
- package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
- package/ds-canonical/hooks/tests/run-all.sh +76 -0
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
- package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +140 -0
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +115 -0
- package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
- package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
- package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +123 -0
- package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
- package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
- package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
- package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
- package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
- package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +194 -0
- package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
- package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
- package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
- package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
- package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
- package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
- package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
- package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
- package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
- package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
- package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
- package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +126 -0
- package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
- package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
- package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
- package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
- package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
- package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
- package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
- package/ds-canonical/hooks/tests/test_check_story_invariants.sh +209 -0
- package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
- package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
- package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
- package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +138 -0
- package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
- package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
- package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
- package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
- package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
- package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
- package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
- package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +143 -0
- package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
- package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
- package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
- package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
- package/ds-canonical/hooks/tests/test_stop_self_audit.sh +76 -0
- package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
- package/ds-canonical/references/README.md +43 -0
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
- package/ds-canonical/references/build-ui-canonicals.md +69 -0
- package/ds-canonical/references/cva-patterns.md +41 -0
- package/ds-canonical/references/drag-canonical.md +331 -0
- package/ds-canonical/references/item-anatomy-recipe.md +225 -0
- package/ds-canonical/references/naming-conventions.md +56 -0
- package/ds-canonical/references/principle-dim-map.json +515 -0
- package/ds-canonical/references/props-naming.md +45 -0
- package/ds-canonical/references/spec-rules.md +58 -0
- package/ds-canonical/references/ssot-consultation.md +63 -0
- package/ds-canonical/references/ssot-index.md +40 -0
- package/ds-canonical/references/story-baseline-registry.json +79 -0
- package/ds-canonical/references/structural-token-retention.md +42 -0
- package/ds-canonical/references/tailwind-gotchas.md +87 -0
- package/ds-canonical/references/ui-dev-rules.md +60 -0
- package/ds-canonical/rules/README.md +34 -0
- package/ds-canonical/rules/meta-patterns.md +87 -0
- package/ds-canonical/rules/self-verify.md +53 -0
- package/ds-canonical/rules/spec-rules.md +25 -0
- package/ds-canonical/rules/story-rules.md +56 -0
- package/ds-canonical/rules/ui-development.md +87 -0
- package/ds-canonical/skills/README.md +88 -0
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
- package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
- package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
- package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
- package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
- package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
- package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
- package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +247 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +165 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +91 -0
- package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
- package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/skills/design-system-audit/SKILL.md +343 -0
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1260 -0
- package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
- package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
- package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +364 -0
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
- package/ds-canonical/skills/design-system-audit/references/spec-template.md +66 -0
- package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
- package/ds-canonical/skills/governance-health/SKILL.md +146 -0
- package/ds-canonical/skills/knowledge-prune/SKILL.md +303 -0
- package/ds-canonical/skills/new-component/SKILL.md +170 -0
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
- package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
- package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
- package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
- package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
- package/ds-canonical/skills/propose-options/SKILL.md +177 -0
- package/ds-canonical/skills/prototype/SKILL.md +244 -0
- package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
- package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
- package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
- package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
- package/ds-canonical/skills/story-writing/SKILL.md +122 -0
- package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
- package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
- package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
- package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
- package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
- package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
- package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
- package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/package.json +9 -5
- package/src/components/Accordion/accordion.spec.md +114 -0
- package/src/components/Alert/alert.spec.md +197 -0
- package/src/components/AppShell/app-shell.spec.md +331 -0
- package/src/components/AspectRatio/aspect-ratio.spec.md +134 -0
- package/src/components/Avatar/avatar.spec.md +329 -0
- package/src/components/Badge/badge.spec.md +380 -0
- package/src/components/Breadcrumb/breadcrumb.spec.md +257 -0
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +210 -0
- package/src/components/Button/button.spec.md +460 -0
- package/src/components/Calendar/calendar.spec.md +242 -0
- package/src/components/Carousel/carousel.spec.md +253 -0
- package/src/components/Chart/chart.spec.md +155 -0
- package/src/components/Checkbox/checkbox.spec.md +344 -0
- package/src/components/Chip/chip.spec.md +237 -0
- package/src/components/CircularProgress/circular-progress.spec.md +268 -0
- package/src/components/Coachmark/coachmark.spec.md +230 -0
- package/src/components/Combobox/combobox.spec.md +180 -0
- package/src/components/Command/command.spec.md +171 -0
- package/src/components/DataTable/data-table.spec.md +525 -0
- package/src/components/DateGrid/date-grid.spec.md +215 -0
- package/src/components/DatePicker/date-picker.spec.md +334 -0
- package/src/components/DescriptionList/description-list.spec.md +214 -0
- package/src/components/Dialog/dialog.spec.md +202 -0
- package/src/components/DropdownMenu/dropdown-menu.spec.md +250 -0
- package/src/components/Empty/empty.spec.md +214 -0
- package/src/components/Field/field-controls.spec.md +338 -0
- package/src/components/Field/field.spec.md +438 -0
- package/src/components/Field/form-validation.spec.md +152 -0
- package/src/components/FieldControlGroup/field-control-group.spec.md +176 -0
- package/src/components/FileItem/file-item.spec.md +467 -0
- package/src/components/FileUpload/file-upload.spec.md +123 -0
- package/src/components/FileViewer/file-viewer.spec.md +373 -0
- package/src/components/HoverCard/hover-card.spec.md +157 -0
- package/src/components/Input/input.spec.md +193 -0
- package/src/components/LinkInput/link-input.spec.md +130 -0
- package/src/components/Menu/menu-item.spec.md +290 -0
- package/src/components/NameCard/name-card.spec.md +171 -0
- package/src/components/Notice/notice.spec.md +149 -0
- package/src/components/NumberInput/number-input.spec.md +126 -0
- package/src/components/OverflowIndicator/overflow-indicator.spec.md +120 -0
- package/src/components/PeoplePicker/people-picker.spec.md +263 -0
- package/src/components/Popover/popover.spec.md +198 -0
- package/src/components/ProgressBar/progress-bar.spec.md +232 -0
- package/src/components/RadioGroup/radio-group.spec.md +141 -0
- package/src/components/Rating/rating.spec.md +208 -0
- package/src/components/ScrollArea/scroll-area.spec.md +145 -0
- package/src/components/SegmentedControl/segmented-control.spec.md +295 -0
- package/src/components/Select/select.spec.md +299 -0
- package/src/components/SelectMenu/select-menu.spec.md +220 -0
- package/src/components/SelectionControl/selection-item.spec.md +128 -0
- package/src/components/Separator/separator.spec.md +109 -0
- package/src/components/Sheet/sheet.spec.md +148 -0
- package/src/components/Sidebar/sidebar.spec.md +713 -0
- package/src/components/Skeleton/skeleton.spec.md +104 -0
- package/src/components/Slider/slider.spec.md +353 -0
- package/src/components/Steps/steps.spec.md +465 -0
- package/src/components/Switch/switch.spec.md +215 -0
- package/src/components/Tabs/tabs.spec.md +314 -0
- package/src/components/Tag/tag.spec.md +282 -0
- package/src/components/Textarea/textarea.spec.md +151 -0
- package/src/components/TimePicker/time-picker.spec.md +279 -0
- package/src/components/Toast/toast.spec.md +177 -0
- package/src/components/Tooltip/tooltip.spec.md +139 -0
- package/src/components/TreeView/tree-view.spec.md +374 -0
- package/src/patterns/action-bar/action-bar.spec.md +458 -0
- package/src/patterns/element-anatomy/element-anatomy.spec.md +215 -0
- package/src/patterns/element-anatomy/inline-action.spec.md +315 -0
- package/src/patterns/element-anatomy/item-anatomy.spec.md +1042 -0
- package/src/patterns/header-canonical/header-canonical.spec.md +285 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +191 -0
- package/src/patterns/overlay-surface/overlay-surface.spec.md +428 -0
- package/src/patterns/resize-handle/resize-handle.spec.md +109 -0
- package/src/tokens/color/color.spec.md +804 -0
- package/src/tokens/density/density.spec.md +127 -0
- package/src/tokens/elevation/elevation.spec.md +81 -0
- package/src/tokens/layoutSpace/layoutSpace.spec.md +314 -0
- package/src/tokens/motion/motion.spec.md +97 -0
- package/src/tokens/opacity/opacity.spec.md +78 -0
- package/src/tokens/orphan-tokens.spec.md +117 -0
- package/src/tokens/radius/radius.spec.md +123 -0
- package/src/tokens/typography/typography.spec.md +202 -0
- package/src/tokens/uiSize/uiSize.spec.md +438 -0
- package/src/styles/preset.css +0 -31
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: new-component
|
|
3
|
+
description: Create-phase workflow for building a new design-system component from scratch. Walks through 6 phases (近親 spec → Family 判定 → 7-dim spec → tsx → 3 stories → self quality-gate) with checkpoints, ensuring world-class discipline is applied *while building*, not discovered in review. Complements /component-quality-gate (review-phase gate). Invoke when user says「我要做新元件 X」「新增 X 元件」「create new X component」or is about to `mkdir packages/design-system/src/components/Xyz`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# New Component 建立流程(create-phase workflow)
|
|
7
|
+
|
|
8
|
+
## 存在意義
|
|
9
|
+
|
|
10
|
+
`/component-quality-gate` 是 **review-phase** gate(元件做完後驗 45 項),但建 **create-phase** 沒 workflow guide → AI 每次從 CLAUDE.md 零散規則自己湊,容易漏規則、誤套 pattern。
|
|
11
|
+
|
|
12
|
+
本 skill 填 create-phase 空缺:6 phase 帶著 AI 一步一步建元件,對齊 CLAUDE.md 所有規則(Layout Family / Props 命名 / Spec 7 維度 / Stories 真實業務場景 / visual audit),最後自動 chain `/component-quality-gate` 做 exit check。
|
|
13
|
+
|
|
14
|
+
**跟 /component-quality-gate 互補**:create(本 skill)在元件沒寫前先指引;quality-gate 在元件寫完後驗收。兩者不重疊。
|
|
15
|
+
|
|
16
|
+
## When to invoke
|
|
17
|
+
|
|
18
|
+
- User 明說建新元件(「做一個 X」「新增 X 元件」)
|
|
19
|
+
- AI 即將 `mkdir packages/design-system/src/components/Xyz/`
|
|
20
|
+
- 建元件前的「先 plan 再建」需求
|
|
21
|
+
|
|
22
|
+
**不 invoke 的情境**:
|
|
23
|
+
- 改既有元件(小 variant / size prop 增加)→ 走 sync hook + `/component-quality-gate`
|
|
24
|
+
- prototype 比稿階段的 exploration UI → 走 `/prototype`(exploration 不進 DS)
|
|
25
|
+
- 重構既有元件(not from scratch)→ 走 `/component-quality-gate` review
|
|
26
|
+
|
|
27
|
+
## Preconditions
|
|
28
|
+
|
|
29
|
+
- User 已給出新元件的 **名字 + 大致用途**(否則先對話釐清,再 invoke)
|
|
30
|
+
- 元件 folder 不存在於 `packages/design-system/src/components/`(真的是新的)
|
|
31
|
+
- 已讀 CLAUDE.md(skill 會 re-ref 關鍵章節,但 session 整體已有 context 更好)
|
|
32
|
+
|
|
33
|
+
## Workflow(6 phase + 多 checkpoint)
|
|
34
|
+
|
|
35
|
+
### Phase 1 — 近親 spec 掃讀(不憑直覺發明)
|
|
36
|
+
|
|
37
|
+
對齊 CLAUDE.md mindset #2 + `# 遇不確定時的協議` Step 2 + memory `feedback_proactive_5layer_pipeline.md`「5-step pre-check」(寫 tsx 前必含 CLAUDE.md SSOT 清單 + tsx 開頭「── 消費的 SSOT ──」段)。
|
|
38
|
+
|
|
39
|
+
1. **識別 2-3 個近親元件**(同 family、同 pattern、同職責):
|
|
40
|
+
- 視覺相似?(例:新 `StatusChip` → 近親 `Tag` / `Badge` / `Chip`)
|
|
41
|
+
- 功能相似?(例:新 `MultiSelect` → 近親 `Select` / `Combobox`)
|
|
42
|
+
- 資料形態相似?(例:新 `TimeRangePicker` → 近親 `DatePicker.Range` / `TimePicker`)
|
|
43
|
+
2. **完整讀近親 spec.md**,至少 2 個,抓:
|
|
44
|
+
- 它的 Layout Family 宣告
|
|
45
|
+
- API surface(props 命名 / 型別)
|
|
46
|
+
- 禁止事項(往往透露 gotcha)
|
|
47
|
+
- SSOT anchor(往哪指)
|
|
48
|
+
3. **查世界級對照**:Polaris / Material / Atlassian / Ant / Apple HIG 有沒對應元件?**至少 2 個** DS 的做法,記 3 行筆記(naming / API / 視覺模式)。
|
|
49
|
+
4. **查 baseline 狀況**:`ls packages/design-system/src/components/` 確認名字衝突;`grep` CLAUDE.md「失敗記憶索引」看有沒同類別的歷史 bug。
|
|
50
|
+
|
|
51
|
+
### Checkpoint 1 — 定位 Proposal(STOP 點)
|
|
52
|
+
|
|
53
|
+
回報 user:
|
|
54
|
+
- 元件名稱(按 CLAUDE.md `# 命名與語言一致性` 三重 test)
|
|
55
|
+
- 近親元件清單 + 跟本元件的異同一句話
|
|
56
|
+
- 世界級對照 2 個(Ant Design 叫 X / Material 叫 Y)
|
|
57
|
+
- **問 user**:「這個 positioning 對嗎?要不要改名 / 重 scope?」
|
|
58
|
+
|
|
59
|
+
**User 點頭才進 Phase 2。** 定位錯的話在此階段轉向最便宜。
|
|
60
|
+
|
|
61
|
+
### Phase 2 — Layout Family 判定
|
|
62
|
+
|
|
63
|
+
對齊 CLAUDE.md `# 4-Family Layout Model`。
|
|
64
|
+
|
|
65
|
+
**判斷流程**(照 CLAUDE.md 既有):
|
|
66
|
+
1. 垂直列表裡? → Family 1(menu)/ Family 2(reading)
|
|
67
|
+
2. 單行可點擊 pill? → Family 3(action trigger / data indicator sub-profile)
|
|
68
|
+
3. 單行可編輯? → Family 4(Field control,視覺對齊 Family 1)
|
|
69
|
+
4. 都不是? → Non-family(self-contained primitive OR composite multi-section,**必寫 rationale**)
|
|
70
|
+
|
|
71
|
+
**輸出**:
|
|
72
|
+
- Family 宣告一句話(「Family 4 — Field control」OR「Non-family,composite multi-section (toolbar + grid + tile)」)
|
|
73
|
+
- 若 non-family → 寫 3-5 行 rationale:為什麼不是 1-4
|
|
74
|
+
- 若 Family 1/2 → **必消費** `patterns/element-anatomy/item-anatomy` 的 `<MenuItem>` + slot components,不重寫 row 結構
|
|
75
|
+
- 若 Family 3 → follow Button Pill Layout canonical
|
|
76
|
+
- 若 Family 4 → follow field-controls.spec.md
|
|
77
|
+
|
|
78
|
+
### Phase 3 — 寫 spec.md 7 維度(先 spec 後 code,spec 是 judgment home)
|
|
79
|
+
|
|
80
|
+
對齊 `.claude/rules/spec-rules.md`。7 維度缺一不可(除非元件本質無該面向,寫「本元件無 X 狀態」):
|
|
81
|
+
|
|
82
|
+
1. **定位**(positioning + 實作基礎 + Layout Family + 世界級對照)
|
|
83
|
+
2. **何時用**(3-5 個情境,真實業務,不 generic)
|
|
84
|
+
3. **何時不用**(用表:情境 / 改用 / 原因)
|
|
85
|
+
4. **禁止事項**(❌ 列表,對應常見誤用)
|
|
86
|
+
5. **相關 / SSOT pointer**(近親元件互相 link,ownership 明確)
|
|
87
|
+
6. **空值呈現 / 驗證時機**(Field 家族必寫 / 非 Field 可簡答)
|
|
88
|
+
7. **Loading / 無障礙**(async 場景的 state / a11y 預設)
|
|
89
|
+
|
|
90
|
+
**Checkpoint 2**:spec 寫完,回報 user → 請 user 看 spec 判定 positioning 是否 lock in。改 positioning 比改 code 便宜得多。
|
|
91
|
+
|
|
92
|
+
### Phase 4 — 寫 tsx(shadcn 結構 + cva + 對齊 spec)
|
|
93
|
+
|
|
94
|
+
對齊 `.claude/rules/ui-development.md`「shadcn 元件規範」 + `.claude/references/cva-patterns.md`。
|
|
95
|
+
|
|
96
|
+
1. **結構**:`forwardRef + cva + VariantProps + cn() + { Component, componentVariants } export`
|
|
97
|
+
2. **cva 適用法**:className variant 用 cva;style prop variant 用 object map;結構 variant 用 conditional rendering(見 cva-patterns.md)
|
|
98
|
+
3. **Props 命名**:按 `.claude/rules/ui-development.md`「元件 Props 命名」:
|
|
99
|
+
- 行為 → `onDismiss` / `onClose` / `onClear` / `onRemove`(語意分層,見 CLAUDE.md)
|
|
100
|
+
- Slot icon → `startIcon` / `endIcon`(type `LucideIcon`)
|
|
101
|
+
- Slot media → `avatar`(type `ReactNode`)
|
|
102
|
+
4. **Token 消費**:Padding / icon size / hover bg / shadow 全走 token(見 `.claude/rules/ui-development.md` 三層分層)
|
|
103
|
+
5. **禁止 shadcn compat alias**(`bg-popover` / `text-muted-foreground` 等)—— 用 direct token
|
|
104
|
+
6. **Field 家族元件**:default `size="md"` 對齊 field-height family(見 `tokens/uiSize/uiSize.spec.md`)
|
|
105
|
+
7. **cva defaultVariants 異動**:改之後必 grep 元件所有檔案同步三方(spec / docblock / anatomy story)
|
|
106
|
+
|
|
107
|
+
### Phase 5 — 寫 3 stories(真實業務場景,對齊 /story-writing skill 規格)
|
|
108
|
+
|
|
109
|
+
chain `/story-writing` skill(如果 user 沒自己啟,本 skill 自動走其規則):
|
|
110
|
+
|
|
111
|
+
**Phase 5.0 — Trait 宣告**(2026-04-26 M19 ensure-canonical pipeline):
|
|
112
|
+
|
|
113
|
+
寫 stories 前,在 spec.md frontmatter 宣告元件 traits(對齊 `category-templates.md` v2):
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
---
|
|
117
|
+
component: {Name}
|
|
118
|
+
family: {1|2|3|4|self-contained}
|
|
119
|
+
traits:
|
|
120
|
+
- hasVariants # 若 cva 有 ≥ 2 visual variants
|
|
121
|
+
- hasSizes # 若 cva 有 ≥ 2 sizes
|
|
122
|
+
- hasInteractiveStates # 若有 hover/focus/disabled/loading
|
|
123
|
+
- isOverlay # 若是 portal-rendered overlay
|
|
124
|
+
- isInputLike # 若是 text/number field
|
|
125
|
+
- isSelectionMulti # 若是 Checkbox/Radio 多選
|
|
126
|
+
- isSelectionSingle # 若是 Switch 單一 toggle
|
|
127
|
+
- isMatrixHeavy # 若 token × size 正交視覺軸(Avatar/Skeleton)
|
|
128
|
+
- isStructural # 若結構主導(DataTable/Steps/Tabs)
|
|
129
|
+
- isInternal # 若 L3 building block
|
|
130
|
+
---
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**判斷法**:讀本元件 cva variants / 行為 → 對照 traits 表 → 列適用的。**scope-N/A 的 trait 在 spec.md「邊界案例 scope」段明寫 rationale**(例:「Toast `hasSizes=false`,單尺寸對齊 Sonner idiom」)。
|
|
134
|
+
|
|
135
|
+
**Phase 5.1-5.3 — 三層 stories**:
|
|
136
|
+
|
|
137
|
+
1. **`{name}.stories.tsx` 展示**:per Phase 5.0 declared traits → 對照 `category-templates.md` 衍生 required core stories(`hasVariants` → AllVariants / `hasSizes` → AllSizes / `isOverlay` → OpenSnapshot 等)。再加 1-2 真實業務 scenario(Jira / Stripe / Notion 過 earn-existence)。Hook `check_story_category.sh` write-time 攔不符 trait core。
|
|
138
|
+
2. **`{name}.anatomy.stories.tsx` 設計規格**:5-story 標準(Overview + SizeMatrix + ColorMatrix + StateBehavior + Inspector)或合理 subset + rationale。
|
|
139
|
+
3. **`{name}.principles.stories.tsx` 設計原則**(對齊 Polaris/Carbon/Ant canonical,2026-04-26):universal core ≥ 2 of {`WhenToUse` / `WhenNotToUse` / `Vs{Sibling}Rule` / `ContentGuidelines`}。do / don't 情境對照,每則 Rule title + Rule note + 範例。Hook `check_principles_canonical.sh` write-time 攔不符。
|
|
140
|
+
|
|
141
|
+
**兩個 test**:
|
|
142
|
+
- 「人」test — 遮標題 5 秒讀者看懂情境?
|
|
143
|
+
- 「舉一反三」test — 讀者推得出自己產品怎麼用?
|
|
144
|
+
|
|
145
|
+
### Phase 6 — Self quality-gate(exit check)
|
|
146
|
+
|
|
147
|
+
**Mandatory**。chain `/component-quality-gate` 走 45 項 checklist + Phase 4.5 visual audit(Layer A + B)+ **Dim 27 code quality audit**(2026-04-24 新:`node scripts/code-quality-audit.mjs --scope=component:{Name} --check`,P0 violation 必 block)。對齊 CLAUDE.md 稽核 canonical Tier 1 stakeholder-gate:元件要 merge 前 code + visual + clean-code 三層過關。
|
|
148
|
+
|
|
149
|
+
**如何 chain**:
|
|
150
|
+
1. Invoke `/component-quality-gate` skill,以本元件為 scope
|
|
151
|
+
2. 45 項全綠 + visual 過關才算 create-phase 完成
|
|
152
|
+
3. 若 quality-gate 發現問題 → 回 Phase 3 / 4 / 5 對應階段修,再跑 quality-gate
|
|
153
|
+
4. 通過 → 回報 user「元件 {Name} 建立完成,已過 create + review 雙 gate」
|
|
154
|
+
|
|
155
|
+
## Non-goals
|
|
156
|
+
|
|
157
|
+
- 不自動進入 `packages/design-system/src/components/`(explorations/ 才是實驗場;prototype 階段跑 `/prototype` skill)
|
|
158
|
+
- 不替 user 決定 positioning(Checkpoint 1 必須 user 點頭)
|
|
159
|
+
- 不跳過 spec(`.claude/rules/spec-rules.md`:先 spec 後 code,spec 是 judgment home)
|
|
160
|
+
- 不省略 quality-gate(Phase 6 chain mandatory,merge 前必過)
|
|
161
|
+
|
|
162
|
+
## References
|
|
163
|
+
|
|
164
|
+
- `references/new-component-checklist.md` — 完整 6 phase checklist + 各項 CLAUDE.md pointer
|
|
165
|
+
|
|
166
|
+
## 相關 skill
|
|
167
|
+
|
|
168
|
+
- `/component-quality-gate` — review-phase gate,本 skill Phase 6 chain 進去(create/review 兩端互補)
|
|
169
|
+
- `/story-writing` — Phase 5 chain 進去寫 stories
|
|
170
|
+
- `/design-system-audit` — DS-wide audit(全 dim per design-system-audit SSOT,Phase 0 自建 baseline),不是 per-component
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# New Component 建立 checklist(每 phase 必過)
|
|
2
|
+
|
|
3
|
+
本檔對應 `SKILL.md` 6 phase,每項可直接勾選。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Phase 1 — 近親 spec 掃讀
|
|
8
|
+
|
|
9
|
+
- [ ] 識別 2-3 個近親元件(同 family / pattern / 職責)
|
|
10
|
+
- [ ] 完整讀至少 2 個近親 spec.md
|
|
11
|
+
- [ ] 抓到 Layout Family 宣告、API surface、禁止事項、SSOT anchor
|
|
12
|
+
- [ ] 查至少 2 個世界級 DS(Polaris / Material / Atlassian / Ant / Apple HIG)對應元件
|
|
13
|
+
- [ ] `ls packages/design-system/src/components/` 確認名字無衝突
|
|
14
|
+
- [ ] grep CLAUDE.md `# 失敗記憶索引` 查同類歷史 bug
|
|
15
|
+
|
|
16
|
+
## Checkpoint 1 — 定位 Proposal
|
|
17
|
+
|
|
18
|
+
- [ ] 元件名通過「命名三重 test」(既有語言 / 世界級 idiom / 跨元件無衝突,見 CLAUDE.md `# 命名與語言一致性`)
|
|
19
|
+
- [ ] 報 user:元件名 / 近親 / 世界級對照 / positioning 一句話
|
|
20
|
+
- [ ] User 點頭
|
|
21
|
+
|
|
22
|
+
## Phase 2 — Layout Family 判定
|
|
23
|
+
|
|
24
|
+
- [ ] 走 CLAUDE.md `# 4-Family Layout Model` 判斷流程
|
|
25
|
+
- [ ] 若 Family 1/2 → 確認消費 `<MenuItem>` + slot components(不重寫 row 結構)
|
|
26
|
+
- [ ] 若 Family 3 → follow `Button Pill Layout` canonical(見 button.spec.md)
|
|
27
|
+
- [ ] 若 Family 4 → follow field-controls.spec.md
|
|
28
|
+
- [ ] 若 Non-family → 寫 3-5 行 rationale 說明為什麼不是 1-4
|
|
29
|
+
|
|
30
|
+
## Phase 3 — spec.md 7 維度
|
|
31
|
+
|
|
32
|
+
- [ ] 定位(含 Layout Family + 實作基礎 + 世界級對照)
|
|
33
|
+
- [ ] 何時用(3-5 真實業務情境)
|
|
34
|
+
- [ ] 何時不用(表格:情境 / 改用 / 原因)
|
|
35
|
+
- [ ] 禁止事項(❌ 清單)
|
|
36
|
+
- [ ] 相關 / SSOT pointer(互相 link,ownership 明確)
|
|
37
|
+
- [ ] 空值呈現 / 驗證時機(若不適用寫明文「本元件無 X」)
|
|
38
|
+
- [ ] Loading / 無障礙(若不適用寫明文)
|
|
39
|
+
- [ ] **Checkpoint 2**:spec 寫完停下報 user,lock in positioning
|
|
40
|
+
|
|
41
|
+
## Phase 4 — tsx
|
|
42
|
+
|
|
43
|
+
- [ ] 結構 shadcn + forwardRef + cva + VariantProps + cn()
|
|
44
|
+
- [ ] cva 適用正確(見 `.claude/references/cva-patterns.md`;style prop / 結構性 variant 不硬塞 cva)
|
|
45
|
+
- [ ] Props 命名按「是什麼」不按「在哪裡」(startIcon / endIcon / avatar / onDismiss / onClose / onClear / onRemove)
|
|
46
|
+
- [ ] callback 命名分層正確(`.claude/rules/ui-development.md`「元件 Props 命名」 的 canonical)
|
|
47
|
+
- [ ] Token 消費三層分層(chrome/layout-space / 元件內/Tailwind p-N / 精確幾何/calc)
|
|
48
|
+
- [ ] Icon size 三層分層(row 走 RowSizeContext / Button 走 Button mapping / 一次性 inline size={n} 對齊 uiSize)
|
|
49
|
+
- [ ] 無 shadcn compat alias(bg-popover 等)
|
|
50
|
+
- [ ] 無硬色 / shadow-sm / 預設 typography class
|
|
51
|
+
- [ ] `tsc --noEmit` 過
|
|
52
|
+
- [ ] cva defaultVariants 正確(Field 家族 default md;其他按 spec 明示)
|
|
53
|
+
- [ ] cva defaultVariants 改動 → 三方同步(spec / docblock / anatomy story)
|
|
54
|
+
|
|
55
|
+
## Phase 5 — stories(3 個 .stories.tsx 檔)
|
|
56
|
+
|
|
57
|
+
- [ ] `{name}.stories.tsx` 展示 3-5 真實業務情境(禁 Option A/B/C / 抽象代號 / 極端不現實)
|
|
58
|
+
- [ ] `{name}.anatomy.stories.tsx` 含 Overview + SizeMatrix + ColorMatrix(若有) + StateBehavior + Inspector(或 subset + rationale)
|
|
59
|
+
- [ ] `{name}.principles.stories.tsx` 含 do/don't Rule stories,每則 title + note + 範例
|
|
60
|
+
- [ ] 「人」test 過:遮標題 5 秒能懂情境
|
|
61
|
+
- [ ] 「舉一反三」test 過:讀者推得出自己產品怎用
|
|
62
|
+
- [ ] hook `check_story_anatomy.sh` 未觸發 block(無手刻 list item / label Button dismiss / 自刻 overlay)
|
|
63
|
+
- [ ] Storybook title path 正確(`Design System/Components/{Name}/{中文子頁}` 或 `Internal/{Name}/...`)
|
|
64
|
+
|
|
65
|
+
## Phase 6 — Self quality-gate chain
|
|
66
|
+
|
|
67
|
+
- [ ] Invoke `/component-quality-gate` skill
|
|
68
|
+
- [ ] 45 項全綠
|
|
69
|
+
- [ ] Phase 4.5 visual audit Layer A 過(0 contrast / 0 geometry violation)
|
|
70
|
+
- [ ] Phase 4.5 Layer B AI 視覺判斷過(或有 documented rationale)
|
|
71
|
+
- [ ] 回報 user「元件 {Name} 建立完成,已過 create + review 雙 gate」
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 常見失敗 → 回哪 phase 修
|
|
76
|
+
|
|
77
|
+
| Quality-gate finding | 回 phase |
|
|
78
|
+
|---|---|
|
|
79
|
+
| Spec 七維度漏項 / positioning 不明 | Phase 3 |
|
|
80
|
+
| cva 結構錯 / 硬色 / token leak | Phase 4 |
|
|
81
|
+
| Stories 用 Option A/B/C / 虛構情境 | Phase 5 |
|
|
82
|
+
| Layout Family 判錯 / 不消費 MenuItem | Phase 2 |
|
|
83
|
+
| 名字跟既有元件撞語義 | Phase 1(改名後全回 Checkpoint 1) |
|
|
84
|
+
| Visual audit contrast 不過 | Phase 4(改 token),重跑 Phase 6 |
|
|
85
|
+
| Visual audit geometry fail(等高 / 對稱 padding / gap 錯) | Phase 4(改 tsx 或 assertion rationale),重跑 Phase 6 |
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance-audit
|
|
3
|
+
description: Performance audit for design-system components and product UI. Checks render count, unnecessary re-renders, memoization gaps, bundle size impact, useEffect chains, context thrashing. Invoke when user says「這元件效能如何」「為什麼很卡」「bundle 變大」「re-render 太多」, auto-invoked by `/component-quality-gate` Phase 4.5 (advanced mode) and `/design-system-audit` Dimension D3.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Performance Audit — 元件效能稽核
|
|
7
|
+
|
|
8
|
+
## 存在意義
|
|
9
|
+
|
|
10
|
+
現有 `/design-system-audit`(全 dim per design-system-audit SSOT,code/spec 層)+ `/visual-audit`(pixel 層)**都不看效能**。render 次數過多、context 亂鋪、useEffect 鏈條過長這類 bug:
|
|
11
|
+
- tsc 過、eslint 過、視覺正常
|
|
12
|
+
- production 卡
|
|
13
|
+
- 日常 dev 看不出來,到 stakeholder demo 才爆
|
|
14
|
+
|
|
15
|
+
本 skill 作為稽核 6 維度的 **D3 元件效能** canonical home。
|
|
16
|
+
|
|
17
|
+
## 觸發時機(對齊 CLAUDE.md 稽核 canonical)
|
|
18
|
+
|
|
19
|
+
| 情境 | 模式 | 本 skill 跑什麼 |
|
|
20
|
+
|------|------|----------------|
|
|
21
|
+
| 新元件 merge 前 | 進階強制 | 全面(render count / memo / bundle) |
|
|
22
|
+
| 元件新功能 | 進階強制 | 全面 scoped to 新 prop / variant |
|
|
23
|
+
| 產品 demo 前 | 進階強制 | scoped to URL(常用頁 route) |
|
|
24
|
+
| 日常 dev | 高效 | tsc pass + bundle diff 門檻即可 |
|
|
25
|
+
| Release cut | 進階 + 全 DS scope | 全 DS render / memo / bundle 全跑 |
|
|
26
|
+
|
|
27
|
+
## Preconditions
|
|
28
|
+
|
|
29
|
+
- 元件 folder 存在於 `packages/design-system/src/components/{Name}/`
|
|
30
|
+
- `node_modules` 已安裝
|
|
31
|
+
- Storybook 可啟動(用於 render-count 測量)
|
|
32
|
+
|
|
33
|
+
## Workflow
|
|
34
|
+
|
|
35
|
+
### Phase 0 — Scope 判定(一致性類必先全掃)
|
|
36
|
+
|
|
37
|
+
- 若 scope = 單元件 → 走 Phase 1-3 對該元件
|
|
38
|
+
- 若 scope = 全 DS / URL → **先全掃列出所有 hot path**(render 過多元件 / bundle 大元件 / context 亂鋪元件),Phase 1-3 按 impact 排序逐一 audit
|
|
39
|
+
|
|
40
|
+
### Phase 1 — Render & re-render
|
|
41
|
+
|
|
42
|
+
查 4 項:
|
|
43
|
+
1. **Unnecessary re-render**:consumer 改 prop / state 時,本元件是否 re-render?`React.memo` 是否需要?
|
|
44
|
+
2. **Inline 物件 / 函式 prop**:`style={{ ... }}` / `onClick={() => ...}` 每 render 造新 ref → child memo 失效
|
|
45
|
+
3. **Context 粒度**:`<ThemeProvider value={theme}>` 若含頻繁變動 field(e.g. `openMenuId`)→ 整個 subtree 重渲。Context 必切分粒度或用 selector
|
|
46
|
+
4. **Key 穩定性**:list items 用 `key={index}` 導致無意義 remount
|
|
47
|
+
|
|
48
|
+
**工具**:
|
|
49
|
+
- React DevTools Profiler record → 看 flame graph
|
|
50
|
+
- `why-did-you-render` dev dep 觸發警告(未來可加)
|
|
51
|
+
- 直接 grep pattern(inline style / arrow onClick)
|
|
52
|
+
|
|
53
|
+
### Phase 2 — Memoization / dependency
|
|
54
|
+
|
|
55
|
+
查 3 項:
|
|
56
|
+
1. **useMemo / useCallback dep array**:遺漏 dep(stale closure)/ 多 dep(無效 memo)
|
|
57
|
+
2. **useEffect dep array**:同上;特別注意 object / array dep(每 render 新 ref → 無限迴圈或無效 cleanup)
|
|
58
|
+
3. **Computed value in render**:重計算 heavy op(sort / filter / 轉換) → 必 `useMemo`
|
|
59
|
+
|
|
60
|
+
### Phase 3 — Bundle size
|
|
61
|
+
|
|
62
|
+
查 3 項:
|
|
63
|
+
1. **Direct heavy import**:`import * as Icons from 'lucide-react'`(全庫入 bundle) vs `import { Check } from 'lucide-react'`
|
|
64
|
+
2. **Lazy-loadable portion**:Dialog / Sheet / Coachmark 等 rare-use overlay,可 `React.lazy` 減首屏
|
|
65
|
+
3. **Duplicate dep**:`framer-motion` vs `motion/react` / 不同版本 react-day-picker 等
|
|
66
|
+
|
|
67
|
+
**工具**:
|
|
68
|
+
- `npx vite build --report`(vite bundle visualizer)
|
|
69
|
+
- bundle-size CI check(未來可加)
|
|
70
|
+
|
|
71
|
+
### Phase F — Report(必 STOP,對齊分權 canonical)
|
|
72
|
+
|
|
73
|
+
產出:
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
# Performance Audit — {Scope} — {YYYY-MM-DD}
|
|
77
|
+
|
|
78
|
+
## Summary
|
|
79
|
+
- Render issues: N
|
|
80
|
+
- Memoization gaps: M
|
|
81
|
+
- Bundle impact: K KB
|
|
82
|
+
|
|
83
|
+
## Findings(按 impact 排序)
|
|
84
|
+
### P0: {title}
|
|
85
|
+
- 位置: {file:line}
|
|
86
|
+
- 現況: {render count / bundle contribution}
|
|
87
|
+
- 建議: {具體修法}
|
|
88
|
+
- 是 canonical 修實作(auto),還是原則待討論(STOP)?
|
|
89
|
+
|
|
90
|
+
## 提議討論(待 user sign-off)
|
|
91
|
+
- {若發現 canonical 本身有問題,列於此,不自改}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**STOP 點**:report 寫完**不自動修**。分權對齊 CLAUDE.md `# 稽核 canonical`(內含「Audit-vs-execute 分權」inline rule)。
|
|
95
|
+
|
|
96
|
+
## Non-goals
|
|
97
|
+
|
|
98
|
+
- 不改 code / spec(純 read-only report)
|
|
99
|
+
- 不做 micro-benchmark(10ms 以下差異不 report,噪音太多)
|
|
100
|
+
- 不處理 network / backend(純前端 render / bundle)
|
|
101
|
+
|
|
102
|
+
## 相關
|
|
103
|
+
|
|
104
|
+
- `.claude/skills/design-system-audit/SKILL.md` — 全 dim 統籌(per design-system-audit SSOT);本 skill 是 D3 補位
|
|
105
|
+
- `.claude/skills/visual-audit/SKILL.md` — pixel 層(D5)
|
|
106
|
+
- `.claude/skills/ux-audit/SKILL.md` — UX 行為層(D4)
|
|
107
|
+
- `.claude/skills/component-quality-gate/SKILL.md` — Phase 4.5 進階模式 chain 本 skill
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-ui-audit
|
|
3
|
+
description: Audit product / consumer UI code (非 design-system 本身) against DS usage discipline + mindset adherence. Catches element misuse / design principle violations / token leakage / geometry bugs / a11y gaps across 6 dimensions. Invoke via /product-ui-audit when user says「audit 這個 UI」「檢查 X feature 用對 DS 嗎」「這段 code 符合設計原則嗎」,or auto-invoked by /prototype Phase 3.5 gate.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Product UI Audit Workflow
|
|
7
|
+
|
|
8
|
+
Purpose: design-system-audit audits the **DS itself**(spec / cva / SSOT 三方漂移);product-ui-audit audits **consumer UI code**(不是 DS 本身,是 app / exploration / feature code — 即「consumer 用 DS 的地方」)。防止:
|
|
9
|
+
|
|
10
|
+
- 元件亂用(wrong variant / missing props / incorrect composition)
|
|
11
|
+
- 設計原則亂用(placeholder 文案 / 憑直覺創造 pattern / Mindset 違反)
|
|
12
|
+
- Token 逃逸(硬寫 hex / shadcn alias 回流 / shadow-sm 繞過 elevation)
|
|
13
|
+
- 幾何 bug(flex gap token 被 overflow 吃、slot box 不一致)
|
|
14
|
+
- A11y 缺口
|
|
15
|
+
|
|
16
|
+
## When to run
|
|
17
|
+
|
|
18
|
+
**明確觸發(直接 invoke)**:
|
|
19
|
+
- User 說「audit 這個 UI」「audit X feature」「檢查 /src/app/xxx」
|
|
20
|
+
- User 說「這段 code 符合設計原則嗎」「DS 用對了嗎」「有元件亂用嗎」
|
|
21
|
+
- `/prototype` Phase 3.5 自動 invoke(audit `src/explorations/{topic-slug}/`)
|
|
22
|
+
- PR review 前自我檢查
|
|
23
|
+
|
|
24
|
+
**不觸發**:
|
|
25
|
+
- 要 audit DS 本身 → 走 `/design-system-audit`(不同 scope)
|
|
26
|
+
- 要 audit token 定義 → 走 `design-system-audit`
|
|
27
|
+
- 只要求補 stories → 直接補,不需 audit
|
|
28
|
+
|
|
29
|
+
## 生態位
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/design-system-audit audit DS 本身(設計系統內部)
|
|
33
|
+
/product-ui-audit audit consumer UI code(本 skill)
|
|
34
|
+
/prototype 呼叫本 skill 作 Phase 3.5 gate
|
|
35
|
+
/delivery-handoff 只在產品交付前執行(產 handoff 文件)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Preconditions
|
|
39
|
+
|
|
40
|
+
- User 指定 audit target(file path / folder / feature area)
|
|
41
|
+
- Target 是 consumer 層 UI code(`src/app/**` / `src/explorations/**` / `src/pages/**` / `src/features/**`等 — **不掃 `packages/design-system/src/`**)
|
|
42
|
+
- CLAUDE.md 全讀(6 維 audit 都依此為基準)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 6-Dimension Audit
|
|
47
|
+
|
|
48
|
+
每個 dimension 獨立檢查,產出 findings。詳細 grep pattern + rule 見 `references/audit-checks.md`。
|
|
49
|
+
|
|
50
|
+
### Dim 1 — Token 紀律(token hygiene)
|
|
51
|
+
|
|
52
|
+
- 硬寫 hex / rgb / rgba / hsl 色值
|
|
53
|
+
- shadcn compat alias(bg-popover / text-muted-foreground / bg-accent / bg-destructive / bg-background / bg-card / border-input / text-primary-foreground / text-accent-foreground / text-card-foreground / text-popover-foreground)
|
|
54
|
+
- Tailwind default shadow(shadow-sm / md / lg / xl / 2xl / inner)— 應走 elevation token
|
|
55
|
+
- Tailwind v4 `[--foo]` shorthand 靜默失效
|
|
56
|
+
- 硬寫 px 值當該用 token(`w-[48px]` 應改 token)
|
|
57
|
+
|
|
58
|
+
此維對齊既有 `check_token_hygiene.sh` hook 的 4 項 + 擴充硬色值 / 硬 px 檢查。
|
|
59
|
+
|
|
60
|
+
### Dim 2 — Layout primitive 消費(per CLAUDE.md 清單)
|
|
61
|
+
|
|
62
|
+
掃是否正確消費既有 layout primitives(非自 roll):
|
|
63
|
+
|
|
64
|
+
| 視覺 pattern | 應消費 | 違規 signal |
|
|
65
|
+
|------|---------|---------|
|
|
66
|
+
| icon+title+desc 垂直居中 | `<Empty>` | 自己寫 flex flex-col items-center 3-layer text |
|
|
67
|
+
| row prefix+content+suffix | `item-layout` | 自己寫 flex items-center gap-2 3-slot |
|
|
68
|
+
| overlay Header/Body/Footer | `overlay-surface` | 自己寫 border-b/border-t padding loose/tight |
|
|
69
|
+
| 橫向按鈕列 | `action-bar` pattern | 自己 flex gap-2 按鈕組 |
|
|
70
|
+
| 水平溢出 + fade mask | `horizontal-overflow` | 自己 overflow-x-auto + mask |
|
|
71
|
+
| 跨 OS 一致捲軸 | `ScrollArea` | native `overflow-(auto\|scroll)` |
|
|
72
|
+
| 圖像 / media 容器 | `AspectRatio` | 硬寫 `aspect-video` / `aspect-square` class |
|
|
73
|
+
| Field wrapper | `Field` + `fieldWrapperStyles` | 自己 border + padding + startIcon + endAction |
|
|
74
|
+
|
|
75
|
+
### Dim 3 — 元件使用正確性
|
|
76
|
+
|
|
77
|
+
- Button / Input / Select 等 variant / size / props 組合合理
|
|
78
|
+
- icon-only 有 `aria-label`
|
|
79
|
+
- Button primary 沒堆疊(一個 row 一個 primary)
|
|
80
|
+
- Input 外有 Field wrapper(非 standalone input)
|
|
81
|
+
- Composition 正確
|
|
82
|
+
- Popover 不放互動破壞(Dialog trigger in Popover content 避免)
|
|
83
|
+
- Accordion / Tabs / Carousel 不巢狀
|
|
84
|
+
- Radix API 用對
|
|
85
|
+
- Dialog 有 DialogTitle / DialogDescription for a11y
|
|
86
|
+
- DropdownMenu 不當 Select 用
|
|
87
|
+
|
|
88
|
+
### Dim 4 — Mindset adherence
|
|
89
|
+
|
|
90
|
+
對齊 CLAUDE.md 5 條 mindset:
|
|
91
|
+
|
|
92
|
+
- **M1 對標世界級**:新 pattern 有對標備註? 或找得到對應既有元件?
|
|
93
|
+
- **M2 不憑直覺發明**:新數值(gap / padding / font-size)前有 grep 既有?
|
|
94
|
+
- **M3 改一處看三處**:若改 DS 的 cva defaultVariants,spec / docblock / anatomy 三方同步?
|
|
95
|
+
- **M4 真實業務場景**:stories / examples 用真實場景 (Jira / Stripe / Notion...)?無 `Option A/B/C` / `按鈕一` / `Rule A`?
|
|
96
|
+
- **M5 猶豫就問**:code 裡有 TODO-未確認留白?
|
|
97
|
+
|
|
98
|
+
### Dim 5 — 視覺幾何(Mindset #1 視覺擴充 + CLAUDE.md「同 flex 列互動 slot 幾何鐵律」)
|
|
99
|
+
|
|
100
|
+
- 同 flex 行的互動 slot box 尺寸一致(例:FileItem status / delete 都 h-field-sm)
|
|
101
|
+
- hover-bg / ring / focus outline 不溢出 box 吃 gap token
|
|
102
|
+
- padding 對稱正確
|
|
103
|
+
- Typography tier 正確(text-body / text-caption / etc.,不自造 `text-[13px]`)
|
|
104
|
+
|
|
105
|
+
### Dim 6 — A11y
|
|
106
|
+
|
|
107
|
+
- icon-only 元件有 `aria-label`
|
|
108
|
+
- interactive element `role` 正確
|
|
109
|
+
- Dialog / Popover / Sheet 有 title + description
|
|
110
|
+
- keyboard navigation 可用(Tab / Enter / Esc)
|
|
111
|
+
- color contrast(不用純 color 傳 state — 要 icon / label 配合)
|
|
112
|
+
|
|
113
|
+
詳見 `references/audit-checks.md`。
|
|
114
|
+
|
|
115
|
+
### Dim 7 — D6 設計原則自檢(consumer 是否牴觸 DS canonical)
|
|
116
|
+
|
|
117
|
+
chain `.claude/skills/design-system-audit/references/principle-audit-protocol.md` 做 4 子維 scoped 對 consumer code:
|
|
118
|
+
|
|
119
|
+
- **D6a 合理性**:consumer 自己的設計判斷是否有 rationale(為什麼這樣用 DS 元件)
|
|
120
|
+
- **D6b 一致性**:跨 feature 同概念處理一致(同 team 兩頁面 dismiss 不應用不同方式)
|
|
121
|
+
- **D6c 無矛盾**:consumer 實作是否牴觸 DS spec 聲明(例:用 Button 作 dismiss 明顯違 item-anatomy SSOT)
|
|
122
|
+
- **D6d 完整性**:state 覆蓋(error / loading / empty)
|
|
123
|
+
|
|
124
|
+
判斷 auto vs STOP 依 protocol 公式。修 consumer code 一致化 = AUTO;建議修 DS canonical 本身 = STOP 提議。
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Workflow
|
|
129
|
+
|
|
130
|
+
### Phase 0 — Scope
|
|
131
|
+
|
|
132
|
+
確認 audit target:file / folder / feature area。提問 user 若模糊。禁止掃整個 repo(失焦)。
|
|
133
|
+
|
|
134
|
+
### Phase 1 — Parallel 6-dim audit
|
|
135
|
+
|
|
136
|
+
6 個維度各自獨立 grep + code review。可 parallelize。
|
|
137
|
+
|
|
138
|
+
### Phase 2 — Report
|
|
139
|
+
|
|
140
|
+
產出 report 表格:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
| Dim | File:Line | Finding | Severity | Fix suggestion |
|
|
144
|
+
|-----|-----------|---------|----------|----------------|
|
|
145
|
+
| 1 Token | src/app/foo.tsx:42 | 硬寫 `#3b82f6` | P0 | 改 var(--primary) |
|
|
146
|
+
| 2 Layout | src/app/bar.tsx:87 | 自己寫 icon+title+desc 垂直堆疊 | P1 | 改用 `<Empty>` |
|
|
147
|
+
| 3 Component | src/app/baz.tsx:12 | icon-only Button 無 aria-label | P0 | 加 aria-label |
|
|
148
|
+
| ... |
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### ⚠️ Checkpoint 1 — Triage & fix decision
|
|
152
|
+
|
|
153
|
+
類似 design-system-audit 的 triage checkpoint:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
🔍 Audit 結果
|
|
157
|
+
|
|
158
|
+
P0(必修,無爭議):N 項
|
|
159
|
+
P1(批次修 + review):M 項
|
|
160
|
+
P2(需討論):K 項
|
|
161
|
+
|
|
162
|
+
先修 P0?還是全給 user 看?
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
詳見 `references/report-template.md`。
|
|
166
|
+
|
|
167
|
+
### Phase 3 — Fix(optional)
|
|
168
|
+
|
|
169
|
+
若 user 同意 fix,surgical 修復。每批(Dim 1 / Dim 2 / ...)一個 commit。
|
|
170
|
+
|
|
171
|
+
### Phase 4 — Verify
|
|
172
|
+
|
|
173
|
+
- `npx tsc --noEmit` 通過
|
|
174
|
+
- re-run 本 skill(縮窄到原 findings)確認 zero regression
|
|
175
|
+
|
|
176
|
+
### Phase 5 — Visual audit(stakeholder-gate,mandatory on stakeholder-visible work)
|
|
177
|
+
|
|
178
|
+
對齊 **CLAUDE.md 稽核 canonical Tier 1 stakeholder-gate**:產品 UI 要給 stakeholder / end-user 看之前,**code + visual 雙層都要過**。Phase 1-4 是 code 層;本 Phase 補視覺層。
|
|
179
|
+
|
|
180
|
+
**Input**:Phase 4 verify 過關的產品 UI(screens / routes / embedded widgets)
|
|
181
|
+
|
|
182
|
+
**Process**:
|
|
183
|
+
1. 確認 user 有提供 **URL 清單**(產品 app routes)或 **Storybook scenario id**(若產品 stories 在 Storybook):
|
|
184
|
+
- URL mode:`npm run visual-audit -- --urls=<csv>`(例:`--urls=http://localhost:3000/inbox,http://localhost:3000/settings`)
|
|
185
|
+
- Storybook mode:`npm run visual-audit -- --scope=component:<topic>`
|
|
186
|
+
2. **Layer A mechanical**(auto):WCAG 對比度 + DOM 幾何 assertion + retina screenshot → `snapshots/`
|
|
187
|
+
3. **Layer B AI judgement**(chain `/visual-audit` skill):讀 `snapshots/*.png`,判斷設計合理性(視覺對齊 / 覆蓋限制 / 世界級對照 / typography hierarchy)
|
|
188
|
+
4. Violation 分級:
|
|
189
|
+
- Contrast AA 不過 → **P0**(a11y 強制)
|
|
190
|
+
- Geometry assertion fail → **P0**(機械規則違反)
|
|
191
|
+
- Layer B AI 視覺判斷 finding → 按嚴重度 P0 / P1 / P2
|
|
192
|
+
|
|
193
|
+
**Gate 規則**:P0 有 → 停下修,不放給 stakeholder;P1 / P2 走跟 Phase 2 Report 同樣 user-decision 流程。
|
|
194
|
+
|
|
195
|
+
**何時可跳**:內部 UI(只給 engineer / admin 看,非 stakeholder / end-user)→ user 明示 skip,但建議跑一次 Layer A 抓 a11y P0。
|
|
196
|
+
|
|
197
|
+
**為什麼 mandatory**:code audit 對 + spec 對,視覺仍可能錯(對比不夠、overlay 疊到文字、跨 OS 捲軸跑版)——這類 bug 只有視覺層抓得到。產品給 stakeholder / user 看時 = stakeholder-visible artifact,必過 Tier 1 gate。
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 呼叫時的回答格式
|
|
202
|
+
|
|
203
|
+
audit 完畢報告應含:
|
|
204
|
+
1. **Scope**:audit 了什麼(path / file 數量)
|
|
205
|
+
2. **Summary**:per dimension 的 pass/fail 數
|
|
206
|
+
3. **Findings table**:具體 file:line + severity + fix
|
|
207
|
+
4. **Recommendations**:P0 優先 / 建議修順序
|
|
208
|
+
5. **Next step**:等 user Checkpoint 1 決策
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Non-goals
|
|
213
|
+
|
|
214
|
+
- 不 audit DS 本身(走 /design-system-audit)
|
|
215
|
+
- 不改 user 未同意的 P1/P2(僅 P0 可自動修,需 user 決策 P1+)
|
|
216
|
+
- 不 audit 業務邏輯正確性(本 skill 管 UI / DS consumption / design principles,不管 data flow 對不對)
|
|
217
|
+
- 不 replace code review(本 skill 是 pre-review self-check,不是 final QA)
|
|
218
|
+
|
|
219
|
+
## Common failure modes
|
|
220
|
+
|
|
221
|
+
- **Scope 太廣**:掃整個 repo 導致 findings 爆量,triage 崩潰 → 限制 scope 到 feature / folder
|
|
222
|
+
- **Dim 間互相矛盾**:Dim 2 建議用 Empty 但 Dim 3 說 Button 該在某處 — surface 而非自己選
|
|
223
|
+
- **P0/P1 分類偏誤**:把明確 bug 當 P1 / 把 style preference 當 P0 — 嚴格按 audit-checks.md 分類
|
|
224
|
+
- **AI 自行修 P2**:違反 checkpoint 精神,每個 P2 都是設計決策
|
|
225
|
+
|
|
226
|
+
## References
|
|
227
|
+
|
|
228
|
+
- [references/audit-checks.md](references/audit-checks.md) — 6 維度具體 grep pattern + rule
|
|
229
|
+
- [references/common-misuses.md](references/common-misuses.md) — 常見元件誤用 negative example 庫
|
|
230
|
+
- [references/report-template.md](references/report-template.md) — P0/P1/P2 severity 分類 + report 格式
|