@godxjp/ui 19.1.0 → 19.2.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/README.md +25 -128
- package/dist/app/theme-axes.d.ts +4 -15
- package/dist/app/timezones.d.ts +1 -4
- package/dist/components/charts/area-chart.d.ts +2 -3
- package/dist/components/charts/bar-chart.d.ts +2 -3
- package/dist/components/charts/chart-frame.d.ts +7 -16
- package/dist/components/charts/chart-summary.d.ts +2 -2
- package/dist/components/charts/compact-bar-trend.d.ts +9 -24
- package/dist/components/charts/index.d.ts +1 -6
- package/dist/components/data-display/badge.d.ts +2 -12
- package/dist/components/data-display/card.d.ts +21 -41
- package/dist/components/data-display/carousel.d.ts +1 -2
- package/dist/components/data-display/code-block.d.ts +4 -0
- package/dist/components/data-display/code-block.js +24 -0
- package/dist/components/data-display/data-table.d.ts +15 -37
- package/dist/components/data-display/data-table.js +1 -3
- package/dist/components/data-display/descriptions.d.ts +2 -6
- package/dist/components/data-display/descriptions.js +0 -2
- package/dist/components/data-display/index.d.ts +4 -0
- package/dist/components/data-display/index.js +4 -0
- package/dist/components/data-display/list-row.d.ts +3 -22
- package/dist/components/data-display/permission-matrix.d.ts +7 -20
- package/dist/components/data-display/progress.d.ts +1 -1
- package/dist/components/data-display/prose.d.ts +4 -0
- package/dist/components/data-display/prose.js +20 -0
- package/dist/components/data-display/service-launcher-card.d.ts +3 -10
- package/dist/components/data-display/table.d.ts +20 -80
- package/dist/components/data-display/table.js +0 -3
- package/dist/components/data-display/timeline.d.ts +3 -5
- package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
- package/dist/components/data-entry/branch-scope-picker.js +0 -1
- package/dist/components/data-entry/calendar.d.ts +3 -2
- package/dist/components/data-entry/calendar.js +58 -3
- package/dist/components/data-entry/command-palette.d.ts +8 -22
- package/dist/components/data-entry/date-picker.d.ts +4 -5
- package/dist/components/data-entry/date-picker.js +6 -1
- package/dist/components/data-entry/date-range-picker.d.ts +1 -1
- package/dist/components/data-entry/date-range-picker.js +8 -3
- package/dist/components/data-entry/form-errors.d.ts +7 -18
- package/dist/components/data-entry/form-field.js +1 -5
- package/dist/components/data-entry/form.d.ts +1 -9
- package/dist/components/data-entry/input.d.ts +16 -14
- package/dist/components/data-entry/input.js +3 -0
- package/dist/components/data-entry/month-picker.js +2 -2
- package/dist/components/data-entry/month-range-picker.d.ts +4 -6
- package/dist/components/data-entry/month-range-picker.js +2 -2
- package/dist/components/data-entry/number-input.d.ts +1 -5
- package/dist/components/data-entry/number-input.js +1 -0
- package/dist/components/data-entry/radio.js +0 -1
- package/dist/components/data-entry/search-select.d.ts +2 -4
- package/dist/components/data-entry/select.d.ts +11 -6
- package/dist/components/data-entry/select.js +4 -2
- package/dist/components/data-entry/switch.js +0 -1
- package/dist/components/data-entry/textarea.d.ts +10 -16
- package/dist/components/data-entry/time-picker.d.ts +3 -5
- package/dist/components/data-entry/upload-types.d.ts +1 -5
- package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
- package/dist/components/feedback/dialog.d.ts +6 -15
- package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
- package/dist/components/feedback/sheet.d.ts +3 -10
- package/dist/components/feedback/sheet.js +1 -1
- package/dist/components/feedback/sonner.js +2 -3
- package/dist/components/general/activity.d.ts +4 -30
- package/dist/components/general/button.js +1 -10
- package/dist/components/general/logo.d.ts +6 -28
- package/dist/components/general/reveal.d.ts +3 -9
- package/dist/components/general/typography.d.ts +1 -3
- package/dist/components/layout/account-chip.d.ts +8 -0
- package/dist/components/layout/account-chip.js +45 -0
- package/dist/components/layout/auth-divider.d.ts +2 -9
- package/dist/components/layout/auth-shell.d.ts +1 -14
- package/dist/components/layout/breadcrumb.d.ts +1 -5
- package/dist/components/layout/centered-shell.d.ts +4 -18
- package/dist/components/layout/error-surface.d.ts +11 -28
- package/dist/components/layout/error-surface.js +4 -1
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/components/layout/legal-document-shell.d.ts +5 -28
- package/dist/components/layout/master-detail.d.ts +2 -18
- package/dist/components/layout/page-container.js +0 -1
- package/dist/components/layout/responsive-grid.d.ts +6 -1
- package/dist/components/layout/responsive-grid.js +9 -2
- package/dist/components/layout/service-role-panel.d.ts +7 -19
- package/dist/components/layout/sidebar.d.ts +5 -27
- package/dist/components/layout/sidebar.js +0 -1
- package/dist/components/layout/split-pane.d.ts +0 -7
- package/dist/components/layout/topbar.d.ts +1 -14
- package/dist/components/navigation/app-setting-picker.js +1 -3
- package/dist/components/navigation/filter-bar.d.ts +1 -6
- package/dist/components/navigation/pagination-utils.d.ts +2 -12
- package/dist/components/navigation/tabs-scroll.d.ts +2 -36
- package/dist/components/navigation/tabs.js +4 -8
- package/dist/components/query/data-state.d.ts +2 -2
- package/dist/components/ui/credential-reveal.d.ts +1 -4
- package/dist/components/ui/hover-card.d.ts +1 -2
- package/dist/components/ui/separator.d.ts +2 -15
- package/dist/components/ui/toggle-group.d.ts +1 -5
- package/dist/components/ui/toggle.d.ts +6 -31
- package/dist/email/brand-mark.d.ts +6 -34
- package/dist/email/color.d.ts +7 -17
- package/dist/email/geometry.d.ts +4 -8
- package/dist/email/index.d.ts +4 -48
- package/dist/email/inline-style.d.ts +3 -9
- package/dist/email/urgency.d.ts +2 -7
- package/dist/form/form-context.d.ts +2 -5
- package/dist/form/form-root.d.ts +1 -2
- package/dist/i18n/messages/en.json +4 -0
- package/dist/i18n/messages/ja.json +4 -0
- package/dist/i18n/messages/vi.json +4 -0
- package/dist/inertia/index.d.ts +2 -10
- package/dist/lib/control-styles.d.ts +10 -21
- package/dist/lib/control-styles.js +4 -6
- package/dist/lib/datetime/format-date.d.ts +1 -4
- package/dist/lib/field-a11y.d.ts +11 -68
- package/dist/lib/field-a11y.js +0 -1
- package/dist/lib/format.d.ts +4 -8
- package/dist/lib/hooks.d.ts +6 -12
- package/dist/lib/permission-grid.d.ts +3 -18
- package/dist/lib/query-error.d.ts +3 -3
- package/dist/props/components/app.prop.d.ts +15 -38
- package/dist/props/components/charts.prop.d.ts +2 -3
- package/dist/props/components/data-display.prop.d.ts +48 -72
- package/dist/props/components/data-entry.prop.d.ts +35 -40
- package/dist/props/components/form.prop.d.ts +2 -6
- package/dist/props/components/general.prop.d.ts +11 -27
- package/dist/props/components/layout.prop.d.ts +89 -260
- package/dist/props/components/navigation.prop.d.ts +27 -42
- package/dist/props/registry.d.ts +31 -0
- package/dist/props/registry.js +33 -0
- package/dist/props/vocabulary/data.prop.d.ts +18 -49
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
- package/dist/props/vocabulary/layout.prop.d.ts +8 -30
- package/dist/props/vocabulary/shared.prop.d.ts +3 -2
- package/dist/styles/alert-layout.css +1 -32
- package/dist/styles/badge-layout.css +4 -18
- package/dist/styles/base.css +14 -113
- package/dist/styles/card-layout.css +6 -128
- package/dist/styles/chart-layout.css +2 -17
- package/dist/styles/control.css +380 -458
- package/dist/styles/core.css +21 -0
- package/dist/styles/data-display-layout.css +175 -94
- package/dist/styles/data-entry-layout.css +0 -45
- package/dist/styles/density.css +1 -30
- package/dist/styles/dialog-layout.css +5 -69
- package/dist/styles/focus-ring.css +13 -87
- package/dist/styles/fonts.css +1 -31
- package/dist/styles/form-layout.css +7 -91
- package/dist/styles/index.css +2 -20
- package/dist/styles/layout.css +38 -456
- package/dist/styles/logo-layout.css +1 -35
- package/dist/styles/motion.css +3 -42
- package/dist/styles/navigation-layout.css +3 -50
- package/dist/styles/shell-layout.css +37 -403
- package/dist/styles/table-layout.css +16 -274
- package/dist/styles/text-layout.css +7 -21
- package/dist/styles/toggle.css +1 -23
- package/dist/theme/dxs.canonical.css +1 -55
- package/dist/theme/example.service.css +1 -26
- package/dist/theme/famgia.service.css +5 -15
- package/dist/tokens/axes.css +3 -40
- package/dist/tokens/base.css +1 -4
- package/dist/tokens/components/activity.css +6 -42
- package/dist/tokens/components/badge.css +4 -13
- package/dist/tokens/components/banner.css +4 -9
- package/dist/tokens/components/card.css +32 -88
- package/dist/tokens/components/chart.css +9 -26
- package/dist/tokens/components/control.css +37 -222
- package/dist/tokens/components/data-display.css +28 -79
- package/dist/tokens/components/data-entry.css +5 -19
- package/dist/tokens/components/descriptions.css +7 -27
- package/dist/tokens/components/email.css +38 -84
- package/dist/tokens/components/error-surface.css +2 -18
- package/dist/tokens/components/feedback.css +27 -124
- package/dist/tokens/components/form.css +13 -45
- package/dist/tokens/components/legal-document.css +16 -41
- package/dist/tokens/components/list-row.css +11 -36
- package/dist/tokens/components/logo.css +2 -57
- package/dist/tokens/components/navigation.css +16 -94
- package/dist/tokens/components/scroll-area.css +2 -18
- package/dist/tokens/components/separator.css +8 -30
- package/dist/tokens/components/sheet.css +3 -14
- package/dist/tokens/components/shell.css +53 -307
- package/dist/tokens/components/sidebar.css +5 -22
- package/dist/tokens/components/table.css +19 -140
- package/dist/tokens/components/toggle.css +3 -65
- package/dist/tokens/components/upload.css +7 -43
- package/dist/tokens/foundation.css +108 -383
- package/dist/tokens/semantic/layout.css +33 -207
- package/docs/CANONICAL-CONTRACTS.md +206 -0
- package/docs/COMPONENTS.md +157 -0
- package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
- package/docs/CONSUMER-RULES.md +14 -0
- package/docs/CUSTOMER-THEMING.md +162 -0
- package/docs/DATETIME.md +69 -0
- package/docs/DEVELOPMENT.md +173 -0
- package/docs/FORMS.md +143 -0
- package/docs/FRAME-A11Y-CI.md +267 -0
- package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
- package/docs/FRAME-COVERAGE-REPORT.md +140 -0
- package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
- package/docs/FRAME-COVERAGE.md +29 -0
- package/docs/PROPS-REGISTRY.md +61 -0
- package/docs/PROPS-VOCABULARY.md +100 -0
- package/docs/README.md +60 -0
- package/docs/REGISTRY.md +70 -0
- package/docs/SPACING.md +56 -0
- package/docs/STANDARDS-vocabulary-tokens.md +48 -0
- package/docs/TESTING.md +98 -0
- package/docs/TOKENS.md +347 -0
- package/docs/asset-modules.d.ts +46 -0
- package/docs/assets/cover-terrain.svg +6 -0
- package/docs/assets/portrait-amber.svg +5 -0
- package/docs/assets/portrait-clay.svg +5 -0
- package/docs/assets/portrait-indigo.svg +5 -0
- package/docs/assets/portrait-iris.svg +5 -0
- package/docs/assets/portrait-moss.svg +5 -0
- package/docs/assets/portrait-plum.svg +5 -0
- package/docs/assets/portrait-slate.svg +5 -0
- package/docs/charts/compact-bar-trend.tsx +328 -0
- package/docs/charts/size-tiers.tsx +192 -0
- package/docs/data-display/accordion.tsx +99 -0
- package/docs/data-display/avatar.tsx +355 -0
- package/docs/data-display/badge.tsx +247 -0
- package/docs/data-display/card/examples/detail-panel.tsx +106 -0
- package/docs/data-display/card/index.md +3 -0
- package/docs/data-display/card/index.tsx +285 -0
- package/docs/data-display/carousel.tsx +156 -0
- package/docs/data-display/charts.tsx +198 -0
- package/docs/data-display/code-block.tsx +90 -0
- package/docs/data-display/collapsible.tsx +162 -0
- package/docs/data-display/credential-reveal.tsx +145 -0
- package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
- package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
- package/docs/data-display/data-table/examples/list-page.tsx +175 -0
- package/docs/data-display/data-table/index.md +5 -0
- package/docs/data-display/data-table/index.tsx +295 -0
- package/docs/data-display/descriptions.tsx +143 -0
- package/docs/data-display/empty-state.tsx +164 -0
- package/docs/data-display/hover-card.tsx +181 -0
- package/docs/data-display/list-row.tsx +420 -0
- package/docs/data-display/permission-matrix.tsx +184 -0
- package/docs/data-display/popover-touch.tsx +27 -0
- package/docs/data-display/popover.tsx +245 -0
- package/docs/data-display/progress.tsx +84 -0
- package/docs/data-display/prose.tsx +105 -0
- package/docs/data-display/qr-code.tsx +68 -0
- package/docs/data-display/scroll-area.tsx +271 -0
- package/docs/data-display/service-launcher-card.tsx +145 -0
- package/docs/data-display/stat-card.tsx +99 -0
- package/docs/data-display/table.tsx +251 -0
- package/docs/data-display/timeline.tsx +112 -0
- package/docs/data-display/touch-actions.tsx +36 -0
- package/docs/data-display/tree-list.tsx +107 -0
- package/docs/data-entry/branch-scope-picker.tsx +123 -0
- package/docs/data-entry/calendar.tsx +180 -0
- package/docs/data-entry/cascader.tsx +378 -0
- package/docs/data-entry/checkbox.tsx +256 -0
- package/docs/data-entry/color-picker.tsx +117 -0
- package/docs/data-entry/command-palette.tsx +179 -0
- package/docs/data-entry/command.tsx +262 -0
- package/docs/data-entry/country-picker-recipe.tsx +170 -0
- package/docs/data-entry/date-picker.tsx +191 -0
- package/docs/data-entry/date-range-picker.tsx +149 -0
- package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
- package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
- package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
- package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
- package/docs/data-entry/form-field/index.md +8 -0
- package/docs/data-entry/form-field/index.tsx +326 -0
- package/docs/data-entry/form-inertia.tsx +80 -0
- package/docs/data-entry/form-root.tsx +102 -0
- package/docs/data-entry/form.tsx +724 -0
- package/docs/data-entry/input-otp.tsx +231 -0
- package/docs/data-entry/input.tsx +114 -0
- package/docs/data-entry/label.tsx +100 -0
- package/docs/data-entry/month-picker.tsx +101 -0
- package/docs/data-entry/month-range-picker.tsx +115 -0
- package/docs/data-entry/number-input.tsx +240 -0
- package/docs/data-entry/password-input.tsx +106 -0
- package/docs/data-entry/password-strength.tsx +97 -0
- package/docs/data-entry/radio-group.tsx +95 -0
- package/docs/data-entry/rating.tsx +87 -0
- package/docs/data-entry/search-input.tsx +120 -0
- package/docs/data-entry/select-async-contracts.tsx +108 -0
- package/docs/data-entry/select-matrix.tsx +204 -0
- package/docs/data-entry/select.tsx +369 -0
- package/docs/data-entry/slider.tsx +130 -0
- package/docs/data-entry/switch.tsx +67 -0
- package/docs/data-entry/tag-input.tsx +108 -0
- package/docs/data-entry/textarea.tsx +209 -0
- package/docs/data-entry/time-picker.tsx +99 -0
- package/docs/data-entry/toggle-count.tsx +293 -0
- package/docs/data-entry/toggle-group.tsx +225 -0
- package/docs/data-entry/toggle.tsx +127 -0
- package/docs/data-entry/transfer.tsx +97 -0
- package/docs/data-entry/tree-select.tsx +204 -0
- package/docs/data-entry/upload.tsx +184 -0
- package/docs/feedback/alert-dialog.tsx +270 -0
- package/docs/feedback/alert.tsx +248 -0
- package/docs/feedback/banner.tsx +183 -0
- package/docs/feedback/danger-confirm.tsx +88 -0
- package/docs/feedback/dialog-touch.tsx +24 -0
- package/docs/feedback/dialog.tsx +193 -0
- package/docs/feedback/sheet.tsx +410 -0
- package/docs/feedback/skeleton.tsx +111 -0
- package/docs/feedback/toast.tsx +135 -0
- package/docs/feedback/tooltip.tsx +171 -0
- package/docs/feedback/two-factor-setup.tsx +68 -0
- package/docs/foundation/_email-specimen.ts +274 -0
- package/docs/foundation/colors.tsx +202 -0
- package/docs/foundation/density.tsx +232 -0
- package/docs/foundation/email-tokens.tsx +306 -0
- package/docs/foundation/radius-shadow.tsx +152 -0
- package/docs/foundation/spacing.tsx +211 -0
- package/docs/foundation/typography.tsx +147 -0
- package/docs/general/activity.tsx +224 -0
- package/docs/general/button/examples/destructive-confirm.tsx +90 -0
- package/docs/general/button/examples/form-actions.tsx +85 -0
- package/docs/general/button/examples/toolbar.tsx +160 -0
- package/docs/general/button/index.md +12 -0
- package/docs/general/button/index.tsx +211 -0
- package/docs/general/logo.tsx +131 -0
- package/docs/general/reveal.tsx +41 -0
- package/docs/general/typography.tsx +152 -0
- package/docs/layout/account-chip.tsx +72 -0
- package/docs/layout/admin-collection.tsx +122 -0
- package/docs/layout/app-shell.tsx +374 -0
- package/docs/layout/aspect-ratio.tsx +119 -0
- package/docs/layout/auth-account-summary.tsx +103 -0
- package/docs/layout/auth-divider.tsx +28 -0
- package/docs/layout/auth-footer.tsx +37 -0
- package/docs/layout/auth-identity.tsx +36 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
- package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
- package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
- package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
- package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
- package/docs/layout/auth-recovery/index.md +140 -0
- package/docs/layout/auth-recovery/index.tsx +96 -0
- package/docs/layout/auth-shell-context.tsx +103 -0
- package/docs/layout/auth-shell-device.tsx +112 -0
- package/docs/layout/auth-shell-registration.tsx +335 -0
- package/docs/layout/auth-shell-variants.tsx +139 -0
- package/docs/layout/auth-shell.tsx +59 -0
- package/docs/layout/auth-stack.tsx +40 -0
- package/docs/layout/centered-shell.tsx +102 -0
- package/docs/layout/error-surface/examples/application-403.tsx +84 -0
- package/docs/layout/error-surface/examples/application-404.tsx +77 -0
- package/docs/layout/error-surface/examples/system-500.tsx +47 -0
- package/docs/layout/error-surface/examples/system-503.tsx +48 -0
- package/docs/layout/error-surface/index.md +153 -0
- package/docs/layout/error-surface/index.tsx +239 -0
- package/docs/layout/flex.tsx +262 -0
- package/docs/layout/legal-document-shell/_data.ts +110 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
- package/docs/layout/legal-document-shell/index.md +51 -0
- package/docs/layout/legal-document-shell/index.tsx +101 -0
- package/docs/layout/master-detail.tsx +387 -0
- package/docs/layout/org-switcher.tsx +131 -0
- package/docs/layout/page-container.tsx +946 -0
- package/docs/layout/resizable-panel.tsx +419 -0
- package/docs/layout/responsive-grid.tsx +235 -0
- package/docs/layout/separator.tsx +327 -0
- package/docs/layout/service-role-panel.tsx +144 -0
- package/docs/layout/sidebar.tsx +586 -0
- package/docs/layout/split-pane.tsx +451 -0
- package/docs/layout/topbar.tsx +347 -0
- package/docs/navigation/app-setting-picker.tsx +141 -0
- package/docs/navigation/breadcrumb.tsx +128 -0
- package/docs/navigation/context-menu.tsx +117 -0
- package/docs/navigation/dropdown-menu.tsx +213 -0
- package/docs/navigation/filter-bar.tsx +227 -0
- package/docs/navigation/menubar.tsx +141 -0
- package/docs/navigation/navigation-menu.tsx +165 -0
- package/docs/navigation/pagination.tsx +241 -0
- package/docs/navigation/steps.tsx +263 -0
- package/docs/navigation/tabs-rtl.tsx +28 -0
- package/docs/navigation/tabs.tsx +308 -0
- package/docs/navigation/toolbar.tsx +339 -0
- package/docs/providers/app-provider.tsx +191 -0
- package/docs/providers/format-date.tsx +230 -0
- package/docs/query/button-refetch.tsx +160 -0
- package/docs/query/data-state.tsx +192 -0
- package/docs/query/infinite-query-state.tsx +93 -0
- package/docs/query/mutation-feedback.tsx +70 -0
- package/docs/query/prefetch-link.tsx +262 -0
- package/docs/query/touch-actions.tsx +68 -0
- package/docs/showcase/acme-portal.tsx +441 -0
- package/docs/showcase/acme-website.tsx +455 -0
- package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
- package/docs/showcase/case2-employee-me.tsx +441 -0
- package/docs/showcase/case3-approval-workflow.tsx +527 -0
- package/docs/showcase/case4-login.tsx +307 -0
- package/docs/showcase/case5-shift-calendar.tsx +795 -0
- package/docs/showcase/case6-agency-handy.tsx +1072 -0
- package/docs/showcase/futurelastic-web.tsx +390 -0
- package/docs/showcase/org-switcher.tsx +313 -0
- package/docs/showcase/permission-matrix.tsx +343 -0
- package/docs/showcase/public-landing.tsx +210 -0
- package/docs/showcase/settings-account-sections.tsx +559 -0
- package/docs/showcase/settings-security-mfa.tsx +145 -0
- package/docs/showcase/table-approval-queue.tsx +199 -0
- package/docs/showcase/table-bulk-actions.tsx +460 -0
- package/docs/showcase/table-compact-kintone.tsx +438 -0
- package/docs/showcase/table-conditional-format.tsx +367 -0
- package/docs/showcase/table-crud-list.tsx +544 -0
- package/docs/showcase/table-density.tsx +340 -0
- package/docs/showcase/table-expandable-rows.tsx +471 -0
- package/docs/showcase/table-filter-chips.tsx +461 -0
- package/docs/showcase/table-footer-totals.tsx +311 -0
- package/docs/showcase/table-grouped-subtotals.tsx +388 -0
- package/docs/showcase/table-master-detail.tsx +479 -0
- package/docs/showcase/table-pagination.tsx +320 -0
- package/docs/showcase/table-states.tsx +363 -0
- package/docs/showcase/table-sticky-columns.tsx +373 -0
- package/docs/showcase/table-tree-rows.tsx +444 -0
- package/docs/showcase/table-view-tabs.tsx +488 -0
- package/package.json +9 -11
- package/scripts/_agent-setup.mjs +16 -2
- package/scripts/audit-hook.mjs +3 -13
- package/scripts/init-agent-kit.mjs +1 -14
- package/scripts/postinstall.mjs +12 -12
- package/scripts/ui-audit.mjs +93 -31
- package/scripts/visual-audit-rules.mjs +51 -7
- package/scripts/visual-audit.mjs +118 -47
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Frame-coverage ledger (issue #163)
|
|
2
|
+
|
|
3
|
+
`preview/frame-coverage.ledger.json` is the machine-readable preview **contract**: it links every public export and compound subcomponent to a frame, and declares — per contract dimension — whether an executed case proves it, whether nothing proves it, or whether it cannot exist here.
|
|
4
|
+
|
|
5
|
+
> **UNTESTED IS NOT A PASS.** The absence of a demonstrated state must never be read as support.
|
|
6
|
+
> A frame rendering successfully proves the hand-picked example, nothing more.
|
|
7
|
+
|
|
8
|
+
- Schema: [`frame-coverage.ledger.schema.json`](../frame-coverage.ledger.schema.json)
|
|
9
|
+
- Standard: [`FRAME-COVERAGE-STANDARD.md`](./FRAME-COVERAGE-STANDARD.md)
|
|
10
|
+
- Generator: `pnpm gen:frame-coverage-ledger` → `scripts/gen-frame-coverage-ledger.mjs`
|
|
11
|
+
- Gate: `pnpm check:frame-coverage-ledger` → `scripts/check-frame-coverage-ledger.mjs`
|
|
12
|
+
- Shared registry: `scripts/frame-coverage-contract.mjs`
|
|
13
|
+
- Consumed by the MCP: `get_frame_coverage`, and appended to every `get_component` response
|
|
14
|
+
|
|
15
|
+
## The three verdicts
|
|
16
|
+
|
|
17
|
+
| Verdict | Meaning |
|
|
18
|
+
| ---------------- | ------------------------------------------------------------------------------- |
|
|
19
|
+
| `covered` | An **executed** case proves this dimension. Never inferred, never hand-written. |
|
|
20
|
+
| `untested` | No executed case. **This is not a pass** — report it to users as UNTESTED. |
|
|
21
|
+
| `not-applicable` | The dimension cannot exist for this export, **with a written reason**. |
|
|
22
|
+
|
|
23
|
+
Cells are stored compactly and the reason is single-sourced in `policy.dimensions`:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
untested
|
|
27
|
+
not-applicable:api-manifest # the generated TypeScript surface has no such prop
|
|
28
|
+
not-applicable:reviewed # a human waiver in policy.notApplicable, with a written reason
|
|
29
|
+
covered:prop-evidence:variant # every literal branch of `variant` has resolvable evidence
|
|
30
|
+
covered:declared-case:<caseId> # a reviewed entry in `cases`
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## The 14 contract dimensions
|
|
34
|
+
|
|
35
|
+
| Dimension | Axis | Applicable when | Promoted by |
|
|
36
|
+
| ---------------- | ------------- | ------------------------------------------------- | ------------- |
|
|
37
|
+
| `variants` | visual | the API exposes `variant` | prop evidence |
|
|
38
|
+
| `tones` | visual | the API exposes `tone` | prop evidence |
|
|
39
|
+
| `sizes` | visual | the API exposes `size` | prop evidence |
|
|
40
|
+
| `shapes` | visual | the API exposes `shape` | prop evidence |
|
|
41
|
+
| `density` | visual | the API exposes `density` | prop evidence |
|
|
42
|
+
| `ownership` | ownership | a controlled/uncontrolled pair or `setApi` exists | declared case |
|
|
43
|
+
| `states` | state | a disabled/readOnly/loading/error/… prop exists | declared case |
|
|
44
|
+
| `async` | async | always | declared case |
|
|
45
|
+
| `responsive` | responsive | always | declared case |
|
|
46
|
+
| `rtl` | international | always | declared case |
|
|
47
|
+
| `contentStress` | contentStress | always | declared case |
|
|
48
|
+
| `keyboard` | accessibility | always | declared case |
|
|
49
|
+
| `accessibleName` | accessibility | always | declared case |
|
|
50
|
+
| `reducedMotion` | preferences | always | declared case |
|
|
51
|
+
|
|
52
|
+
**Applicability is derived from the real TypeScript surface** (`component-api-manifest.json`), not declared by hand — so `not-applicable:api-manifest` carries a machine-verified reason and is re-derived on every CI run. A component that GAINS a `variant` prop automatically flips that dimension from N/A to UNTESTED; it cannot rot into a false N/A.
|
|
53
|
+
|
|
54
|
+
`async` is deliberately universal and never auto-N/A: per [FRAME-COVERAGE.md](./FRAME-COVERAGE.md) a blanket primitive-default not-applicable hides async-capable controls and is forbidden.
|
|
55
|
+
|
|
56
|
+
## The two promotion routes
|
|
57
|
+
|
|
58
|
+
**Prop evidence (automatic).** Only for the five strictly prop-shaped dimensions, where "every branch has a rendered case" _is_ the contract. `component-case-evidence.json` must enumerate every literal branch of the union and reference at least one evidence file that resolves on disk — it is already fail-closed via `pnpm audit:component-cases`. This proves the visual branch matrix **only**; it never proves responsive, RTL, keyboard, async or assistive-technology behaviour.
|
|
59
|
+
|
|
60
|
+
**Declared case (reviewed).** Everything behavioural. Add an entry to the ledger's `cases` array:
|
|
61
|
+
|
|
62
|
+
```jsonc
|
|
63
|
+
{
|
|
64
|
+
"id": "button-responsive-matrix",
|
|
65
|
+
"export": "Button",
|
|
66
|
+
"dimensions": ["responsive"],
|
|
67
|
+
"frame": "docs/general/button/index.tsx",
|
|
68
|
+
"case": "Responsive — label truncation across the width matrix",
|
|
69
|
+
"evidence": ["src/components/general/__tests__/button.responsive.test.tsx"],
|
|
70
|
+
"viewports": [320, 375, 390, 768, 1024, 1280, 1440, 1920],
|
|
71
|
+
"verifiedBy": "your-name",
|
|
72
|
+
"verifiedIn": "https://github.com/godx-jp/godxjp-ui/pull/…",
|
|
73
|
+
"verifiedAt": "2026-07-30T00:00:00Z",
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Then run `pnpm gen:frame-coverage-ledger`. Every field must resolve: the frame file must exist, every evidence path must exist inside the repository, `verifiedIn` must be HTTPS and `verifiedAt` must be an ISO-8601 UTC timestamp. A `responsive` case must list **every** required width, and for an export flagged `embeddable` it must also list every container width.
|
|
78
|
+
|
|
79
|
+
You cannot hand-write a verdict. The gate recomputes every cell from the evidence and fails on any mismatch:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Button.responsive: ledger says "covered:declared-case:invented" but the evidence
|
|
83
|
+
recomputes to "untested" — a verdict cannot be hand-written
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Viewport baseline
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
320 375 390 768 1024 1280 1440 1920
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Container widths for embeddable exports: `240 320 480 640 960`.
|
|
93
|
+
|
|
94
|
+
The executed geometry sweep (`pnpm check:frame-geometry`, `scripts/frame-geometry.mjs`) is recorded in `policy.sweeps.geometry` from its shrink-only baseline: **36 frame×width failures across 12 frames**, concentrated at 320 (12), 375 (11), 390 (10) and 768 (3) — matching the ~30 the issue reported. That sweep was **not re-executed** when this ledger was authored (it needs Chromium plus a built preview), so it is recorded with its `recordedAt` date and treated as evidence of _known overflow_, never as evidence of responsive coverage. `responsive` stays UNTESTED everywhere.
|
|
95
|
+
|
|
96
|
+
## The ratchet
|
|
97
|
+
|
|
98
|
+
| Rule | Direction |
|
|
99
|
+
| ----------------------------------------------- | ------------------------------------------------- |
|
|
100
|
+
| per-export `covered` | may only **rise** |
|
|
101
|
+
| per-export reasoned `not-applicable` | may only **fall** |
|
|
102
|
+
| total `covered` | may only **rise** |
|
|
103
|
+
| `baseline.knownMissingFrames` | may only **shrink** |
|
|
104
|
+
| geometry overflow / clipped-control failures | may only **shrink** |
|
|
105
|
+
| frames carrying axe violations | may only **shrink** |
|
|
106
|
+
| `policy.viewports.required` / `containerWidths` | may not be trimmed |
|
|
107
|
+
| `policy.dimensions[].promotion` | may not be weakened |
|
|
108
|
+
| `policy.knownGaps` | may be resolved, never deleted or waived |
|
|
109
|
+
| `policy.runtimeGates` | may not be deleted or unwired from `package.json` |
|
|
110
|
+
|
|
111
|
+
`pnpm gen:frame-coverage-ledger --reset-baseline` re-mints the floor from current reality — the same deliberate escape hatch as `frame-geometry.mjs --update-baseline`. Use it when introducing the ledger, or after a reviewed public-API change legitimately turns a dimension into a reasoned N/A.
|
|
112
|
+
|
|
113
|
+
## Known gaps
|
|
114
|
+
|
|
115
|
+
The issue's "Initial known gaps to encode" are locked in code (`KNOWN_GAPS` in `scripts/frame-coverage-contract.mjs`) and mirrored into `policy.knownGaps`: Button, Card, Card subcomponents, EmptyState, Progress, Carousel, DataTable, Charts and the Timeline/TreeList/PasswordStrength locale stress. They cannot be deleted, and they cannot be waived through `policy.notApplicable` — they must be **covered** or stay **UNTESTED**.
|
|
116
|
+
|
|
117
|
+
## Current state — read this before quoting coverage
|
|
118
|
+
|
|
119
|
+
Snapshot at the time this ledger was introduced (run `pnpm check:frame-coverage-ledger` for the live figures — they move as the public surface moves):
|
|
120
|
+
|
|
121
|
+
- **273** public exports / compound subcomponents, **272** of which reach a frame (`layout/legal-document-shell` is mid-flight and recorded in `baseline.knownMissingFrames`) - **3822** dimension cells: **6 covered · 2141 UNTESTED · 1675 reasoned not-applicable** - the 6 covered cells are branch matrices promoted from `component-case-evidence.json`: `Button.variants/sizes/shapes`, `Form.density`, `QrCode.sizes`, `Tabs.variants` — nothing else in the entire library is proven by an executed case - **0** exports are fully classified across all 14 dimensions - **0** declared cases; **9/9** known gaps still open - `responsive`, `rtl`, `keyboard`, `accessibleName`, `reducedMotion`, `async` and `contentStress` are **UNTESTED for every single export** — 0/273 each
|
|
122
|
+
|
|
123
|
+
Coverage is therefore **0.2%**. The contract, the gate, the ratchet and the MCP exposure are done; authoring the ~3800 frame cases is the epic that remains.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Frame coverage report
|
|
2
|
+
|
|
3
|
+
> Generated by `scripts/frame-coverage.mjs` (issue #163). Do not edit by hand — run `pnpm check:frame-coverage`.
|
|
4
|
+
> Standard: [FRAME-COVERAGE-STANDARD.md](./FRAME-COVERAGE-STANDARD.md). A missing dimension is **UNTESTED**, never a pass.
|
|
5
|
+
|
|
6
|
+
- Public components: **124**
|
|
7
|
+
- With ≥1 frame: **124** · zero-frame: **0**
|
|
8
|
+
- Fully covered (every contract axis declared): **0**
|
|
9
|
+
|
|
10
|
+
## Per-component contract axes
|
|
11
|
+
|
|
12
|
+
Legend: ✓ covered · N/A reasoned skip · · UNTESTED (blank cell = UNTESTED).
|
|
13
|
+
|
|
14
|
+
| Component | Frame | visua | state | owner | conte | respo | inter | acces | prefe | async |
|
|
15
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
16
|
+
| PageContainer | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
17
|
+
| Flex | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
18
|
+
| ResponsiveGrid | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
19
|
+
| AppShell | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
20
|
+
| AuthShell | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
21
|
+
| CenteredShell | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
22
|
+
| Sidebar | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
23
|
+
| Topbar | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
24
|
+
| MasterDetail | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
25
|
+
| SplitPane | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
26
|
+
| ErrorSurface | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
27
|
+
| LegalDocumentShell | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
28
|
+
| Breadcrumb | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
29
|
+
| Button | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
30
|
+
| Text | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
31
|
+
| Heading | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
32
|
+
| Logo | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
33
|
+
| Reveal | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
34
|
+
| Activity | ✓ | · | N/A | N/A | · | · | · | · | · | · |
|
|
35
|
+
| DataTable | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
36
|
+
| Card | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
37
|
+
| CardContent | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
38
|
+
| StatCard | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
39
|
+
| ServiceLauncherCard | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
40
|
+
| Badge | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
41
|
+
| ListRow | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
42
|
+
| CredentialReveal | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
43
|
+
| QrCode | ✓ | ✓ | N/A | · | · | · | · | · | · | · |
|
|
44
|
+
| Descriptions | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
45
|
+
| EmptyState | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
46
|
+
| Progress | ✓ | ✓ | N/A | · | · | · | · | · | · | · |
|
|
47
|
+
| CodeBlock | ✓ | · | N/A | N/A | · | · | · | · | · | · |
|
|
48
|
+
| Prose | ✓ | · | N/A | N/A | · | · | · | · | · | · |
|
|
49
|
+
| Timeline | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
50
|
+
| Table | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
51
|
+
| DataState | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
52
|
+
| InfiniteQueryState | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
53
|
+
| Form | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
54
|
+
| FormField | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
55
|
+
| FormErrors | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
56
|
+
| Input | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
57
|
+
| NumberInput | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
58
|
+
| SearchInput | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
59
|
+
| Select | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
60
|
+
| Switch | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
61
|
+
| Textarea | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
62
|
+
| Label | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
63
|
+
| Checkbox | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
64
|
+
| RadioGroup | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
65
|
+
| MonthPicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
66
|
+
| MonthRangePicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
67
|
+
| DatePicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
68
|
+
| Dialog | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
69
|
+
| AlertDialog | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
70
|
+
| AlertDialogRoot | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
71
|
+
| Sheet | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
72
|
+
| Alert | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
73
|
+
| Banner | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
74
|
+
| SkeletonTable | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
75
|
+
| Toaster | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
76
|
+
| Tabs | ✓ | ✓ | N/A | · | · | · | · | · | · | · |
|
|
77
|
+
| Pagination | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
78
|
+
| DropdownMenu | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
79
|
+
| Steps | ✓ | ✓ | N/A | · | · | · | · | · | · | · |
|
|
80
|
+
| Toolbar | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
81
|
+
| AppProvider | ✓ | · | · | · | · | · | · | · | · | · |
|
|
82
|
+
| formatDate | ✓ | · | · | · | · | · | · | · | · | · |
|
|
83
|
+
| TimePicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
84
|
+
| DateRangePicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
85
|
+
| Cascader | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
86
|
+
| TreeSelect | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
87
|
+
| Transfer | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
88
|
+
| Upload | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
89
|
+
| UploadCropDialog | ✓ | · | · | · | · | · | · | · | · | · |
|
|
90
|
+
| ColorPicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
91
|
+
| Slider | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
92
|
+
| Calendar | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
93
|
+
| Command | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
94
|
+
| CheckboxGroup | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
95
|
+
| Radio | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
96
|
+
| Popover | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
97
|
+
| ScrollArea | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
98
|
+
| Collapsible | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
99
|
+
| TreeList | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
100
|
+
| Tooltip | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
101
|
+
| PrefetchLink | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
102
|
+
| Avatar | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
103
|
+
| Separator | ✓ | · | N/A | N/A | · | · | · | · | · | · |
|
|
104
|
+
| Skeleton | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
105
|
+
| Toggle | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
106
|
+
| ToggleGroup | ✓ | ✓ | · | · | · | · | · | · | · | · |
|
|
107
|
+
| AspectRatio | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
108
|
+
| Accordion | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
109
|
+
| HoverCard | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
110
|
+
| PasswordInput | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
111
|
+
| PasswordStrength | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
112
|
+
| InputOTP | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
113
|
+
| Rating | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
114
|
+
| TagInput | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
115
|
+
| ContextMenu | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
116
|
+
| Menubar | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
117
|
+
| NavigationMenu | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
118
|
+
| ResizablePanel | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
119
|
+
| Carousel | ✓ | N/A | N/A | · | · | · | · | · | · | · |
|
|
120
|
+
| AppSettingPicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
121
|
+
| Field | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
122
|
+
| LineChart | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
123
|
+
| BarChart | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
124
|
+
| CompactBarTrend | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
125
|
+
| AreaChart | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
126
|
+
| PieChart | ✓ | ✓ | N/A | N/A | · | · | · | · | · | · |
|
|
127
|
+
| CommandPalette | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
128
|
+
| TwoFactorSetup | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
129
|
+
| AuthDivider | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
130
|
+
| AuthFooter | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
131
|
+
| AuthIdentity | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
132
|
+
| AccountChip | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
133
|
+
| AuthAccountSummary | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
134
|
+
| AuthStack | ✓ | N/A | N/A | N/A | · | · | · | · | · | · |
|
|
135
|
+
| OrgSwitcher | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
136
|
+
| FilterBar | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
137
|
+
| PermissionMatrix | ✓ | N/A | · | N/A | · | · | · | · | · | · |
|
|
138
|
+
| BranchScopePicker | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
139
|
+
| ServiceRolePanel | ✓ | N/A | · | · | · | · | · | · | · | · |
|
|
140
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Frame coverage standard
|
|
2
|
+
|
|
3
|
+
`/frame/**` is an executable public-contract suite, not a gallery of happy-path screenshots. A component is not covered merely because one example renders. Missing cases are `UNTESTED`, never implicitly passing.
|
|
4
|
+
|
|
5
|
+
## Required layers
|
|
6
|
+
|
|
7
|
+
Every public component and compound subcomponent must be represented at all three layers:
|
|
8
|
+
|
|
9
|
+
1. **Isolated contract** — its own props, states, content and interaction.
|
|
10
|
+
2. **Composition contract** — the components it is designed to contain or be contained by.
|
|
11
|
+
3. **Journey contract** — transitions across loading, success, empty, validation, error and recovery.
|
|
12
|
+
|
|
13
|
+
Hooks and non-visual helpers do not need a standalone visual frame, but their observable states must appear in the frame of the component that consumes them.
|
|
14
|
+
|
|
15
|
+
## Isolated contract dimensions
|
|
16
|
+
|
|
17
|
+
Each applicable dimension must have a runnable case. Mark a dimension `N/A` only with a reason.
|
|
18
|
+
|
|
19
|
+
| Dimension | Required cases |
|
|
20
|
+
| -------------- | ---------------------------------------------------------------------------------------- |
|
|
21
|
+
| Visual | every `variant`, `tone`, `size`, `shape`, density and spacing mode |
|
|
22
|
+
| State | default, disabled, read-only, loading, empty, error, success and selected/current |
|
|
23
|
+
| Ownership | controlled, uncontrolled and reset behavior |
|
|
24
|
+
| Content stress | empty, long Japanese/Vietnamese, large numbers, missing and invalid data |
|
|
25
|
+
| Responsive | 320, 375, 390, 768, 1024, 1280, 1440 and 1920 px; container-width cases when embeddable |
|
|
26
|
+
| International | English, Japanese, Vietnamese and RTL stress where direction affects layout/keys |
|
|
27
|
+
| Accessibility | accessible name, helper/error association, keyboard, focus order/return and live regions |
|
|
28
|
+
| Preferences | 200% zoom, coarse touch, reduced motion and forced/high contrast where applicable |
|
|
29
|
+
| Async | loading, reject, retry, cancel, stale/background refresh and offline when applicable |
|
|
30
|
+
|
|
31
|
+
Do not invent props solely for a demo. A missing required capability is documented as `UNTESTED` and linked to an issue.
|
|
32
|
+
|
|
33
|
+
## Composition matrix
|
|
34
|
+
|
|
35
|
+
| Composition | Required journey |
|
|
36
|
+
| --------------------------------------------- | --------------------------------------------------------------------------------------------- |
|
|
37
|
+
| `FormField ×` every form control | label, helper, required, client/server error, disabled/read-only and reset |
|
|
38
|
+
| `Form × Dialog/Sheet` | open, validate, submit, pending, server error, success, close and focus return |
|
|
39
|
+
| `DataState × DataTable × Pagination` | prerequisite, initial loading, data, empty, background refresh, error/retry and page boundary |
|
|
40
|
+
| `Toolbar × filters × Tabs × DataTable` | long filters, clear, no results, narrow container and keyboard traversal |
|
|
41
|
+
| `Card × Skeleton/EmptyState/Alert` | one owning surface; no nested-card or oversized section state |
|
|
42
|
+
| `AppShell × Sidebar × Topbar × PageContainer` | desktop, tablet and mobile navigation with focus restoration |
|
|
43
|
+
| `Provider × locale/timezone/density/theme` | controlled changes, persistence callback, RTL and long localized content |
|
|
44
|
+
| `Carousel/Tabs/Menu × containing surface` | focus, escape, arrows, collision, touch and reduced motion |
|
|
45
|
+
|
|
46
|
+
Add a composition whenever components share state, accessible relationships, layout ownership, focus ownership or async lifecycle. Pairwise coverage is sufficient unless a defect only emerges in a larger canonical journey.
|
|
47
|
+
|
|
48
|
+
## Example-writing rules
|
|
49
|
+
|
|
50
|
+
1. One case answers one contract question and has a descriptive visible heading.
|
|
51
|
+
2. Use real public imports; never reproduce component internals in the example.
|
|
52
|
+
3. Keep deterministic data and time; never depend on a live API.
|
|
53
|
+
4. Show the control that changes a state when the contract is controlled.
|
|
54
|
+
5. Error and empty cases retain recovery/navigation actions when the product pattern requires them.
|
|
55
|
+
6. Avoid decorative wrapper cards. The component that owns the surface owns the single border.
|
|
56
|
+
7. Long-content and locale cases use meaningful strings, not repeated lorem ipsum.
|
|
57
|
+
8. Accessibility assertions target computed name, description, error, role, state and focus behavior.
|
|
58
|
+
9. Screenshots supplement interaction assertions; they never replace them.
|
|
59
|
+
10. A frame source declares its covered contract dimensions in the coverage ledger.
|
|
60
|
+
|
|
61
|
+
## CI rules
|
|
62
|
+
|
|
63
|
+
Coverage reports distinguish `PASS`, `FAIL`, `UNTESTED` and `N/A`. Only an executed assertion can produce `PASS`.
|
|
64
|
+
|
|
65
|
+
These rules are enforced by `pnpm check:frame-coverage-ledger` against [`preview/frame-coverage.ledger.json`](../preview/frame-coverage.ledger.json).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Frame coverage ledger
|
|
2
|
+
|
|
3
|
+
`frame-coverage.json` is the policy input. `pnpm check:frame-coverage` discovers public visual exports from component barrels, resolves each owning `/frame/<id>` source, and emits the expanded export-by-dimension ledger as JSON.
|
|
4
|
+
|
|
5
|
+
The checker fails for missing frames, duplicate exports, malformed statuses, or unreasoned `untested`/`not-applicable` states. A compiled frame earns only `isolated: pass`; it does not prove responsive, RTL, accessibility, async, composition, or journey coverage.
|
|
6
|
+
|
|
7
|
+
The ledger also tracks `props`, `touch`, and `screenReader` independently. Axe/DOM checks may earn `a11y: pass`, but they never imply that every prop is demonstrated, a coarse pointer works, or a real screen reader announces the intended name/state/change.
|
|
8
|
+
|
|
9
|
+
## Component API evidence
|
|
10
|
+
|
|
11
|
+
Route presence is not component prop coverage. `component-api-manifest.json` is generated from the actual TypeScript call signatures exported by every component barrel. It records owned props, selected inherited behavioral props, finite literal unions, and declaration sources.
|
|
12
|
+
|
|
13
|
+
`component-case-evidence.json` is the only input allowed to promote `props` to `pass`. Each prop needs explicit cases and rendered/test evidence; every finite union branch must be listed. Missing, stale, or renamed props remain `untested` even when the owner page renders and passes Axe at every viewport.
|
|
14
|
+
|
|
15
|
+
- `pnpm gen:component-api-manifest` after changing public component APIs;
|
|
16
|
+
- `pnpm audit:component-cases` to print the exact missing component/prop/union branches;
|
|
17
|
+
- `pnpm check:component-api-manifest` in CI to reject a stale API inventory.
|
|
18
|
+
|
|
19
|
+
Inherited primitive behavior may be classified as pass-through only with a linked forwarding test; a nonempty prose string or the component name appearing in JSX is not evidence.
|
|
20
|
+
|
|
21
|
+
Evidence references must resolve to repository files. Components promoted with `complete: true` are fail-closed: a newly added public prop, a missing literal-union branch, or a removed evidence file fails `audit:component-cases` in the static frame-contract CI job. Components without a complete evidence chain remain `untested`; partial owner-page maps never promote the export to `pass`.
|
|
22
|
+
|
|
23
|
+
Add narrow per-export overrides only after evidence exists. Never convert a dimension to `pass` merely because a unit test or static demo exists.
|
|
24
|
+
|
|
25
|
+
Async is intentionally `untested` by default. Every export must eventually be classified: execute its loading/error/retry/cancel/offline lifecycle, or mark it `not-applicable` with a component-specific reason. A blanket primitive-default `not-applicable` hides async-capable controls and is forbidden.
|
|
26
|
+
|
|
27
|
+
## Accessibility evidence boundaries
|
|
28
|
+
|
|
29
|
+
An `a11y: pass` in this ledger means the rendered frame passed automated axe checks plus the documented DOM/keyboard assertions. It does not claim testing with a real screen reader, braille display, voice control, switch control, or physical coarse-touch device. Those assistive-technology and hardware checks remain a separate manual evidence track and are currently `UNTESTED`, as also recorded in `display-runtime-evidence.json`.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Props Registry
|
|
2
|
+
|
|
3
|
+
Source of truth: `src/props/registry.ts`
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import {
|
|
7
|
+
VOCABULARY_REGISTRY,
|
|
8
|
+
COMPONENT_PROP_REGISTRY,
|
|
9
|
+
PROP_ALIASES_FORBIDDEN,
|
|
10
|
+
} from "@godxjp/ui/props/registry";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Vocabulary props (atomic)
|
|
14
|
+
|
|
15
|
+
<!-- Generated from registry — update registry.ts when adding types -->
|
|
16
|
+
|
|
17
|
+
| Name | Category | File | Description |
|
|
18
|
+
| ------------------- | ----------- | ------------------- | --------------------------------------- |
|
|
19
|
+
| `TitleProp` | content | content.prop.ts | Primary heading |
|
|
20
|
+
| `SubtitleProp` | content | content.prop.ts | Page secondary line |
|
|
21
|
+
| `DescriptionProp` | content | content.prop.ts | Dialog/empty body |
|
|
22
|
+
| `ExtraProp` | content | content.prop.ts | Page top-right actions |
|
|
23
|
+
| `FooterProp` | content | content.prop.ts | Page bottom bar |
|
|
24
|
+
| `PageDensityProp` | layout | layout.prop.ts | Page spacing scale |
|
|
25
|
+
| `TableDensityProp` | layout | layout.prop.ts | Table row height |
|
|
26
|
+
| `GapProp` | layout | layout.prop.ts | Shared layout gap |
|
|
27
|
+
| `ButtonVariantProp` | interaction | interaction.prop.ts | Button style |
|
|
28
|
+
| `ButtonSizeProp` | interaction | interaction.prop.ts | Button size |
|
|
29
|
+
| `BreadcrumbProp` | navigation | navigation.prop.ts | Breadcrumb trail |
|
|
30
|
+
| `ColumnDefProp` | data | data.prop.ts | Table column def |
|
|
31
|
+
| … | | | See `VOCABULARY_REGISTRY` for full list |
|
|
32
|
+
|
|
33
|
+
## Component props (composite)
|
|
34
|
+
|
|
35
|
+
| Name | Group | Vocabulary used |
|
|
36
|
+
| ------------------- | ------------ | --------------------------------------------------------------------------- |
|
|
37
|
+
| `PageContainerProp` | layout | TitleProp, SubtitleProp, ExtraProp, FooterProp, BreadcrumbProp, DensityProp |
|
|
38
|
+
| `ButtonProp` | general | ButtonVariantProp, ButtonSizeProp, AsChildProp |
|
|
39
|
+
| `DataTableProp` | data-display | ColumnDefProp, TableDensityProp, SortStateProp |
|
|
40
|
+
| `DialogConfirmProp` | feedback | OpenProp, TitleProp, DescriptionProp, HandlerProp, PendingProp |
|
|
41
|
+
| `EmptyStateProp` | data-display | IconProp, TitleProp, DescriptionProp, ActionProp |
|
|
42
|
+
| … | | See `COMPONENT_PROP_REGISTRY` |
|
|
43
|
+
|
|
44
|
+
## Before adding a new prop
|
|
45
|
+
|
|
46
|
+
1. Search this file and `PROPS-VOCABULARY.md`
|
|
47
|
+
2. Run `grep -r "YourConcept" packages/ui/src/props/`
|
|
48
|
+
3. Reuse vocabulary type if concept exists
|
|
49
|
+
4. If new: add to vocabulary → component prop → registry → docs → story
|
|
50
|
+
|
|
51
|
+
## Forbidden duplicates
|
|
52
|
+
|
|
53
|
+
| Informal name | Canonical |
|
|
54
|
+
| -------------------------------- | --------------------------------------- |
|
|
55
|
+
| `description` (pages) | `subtitle` → `SubtitleProp` |
|
|
56
|
+
| `description` (dialogs) | `DescriptionProp` |
|
|
57
|
+
| `actions` (header) | `extra` → `ExtraProp` |
|
|
58
|
+
| `density` (ambiguous) | `PageDensityProp` or `TableDensityProp` |
|
|
59
|
+
| `gap` (component subset) | `GapProp` with documented subset |
|
|
60
|
+
| `onClear` | `OnClearFiltersProp` |
|
|
61
|
+
| `loading` / `pending` on actions | `PendingProp` |
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Props Vocabulary
|
|
2
|
+
|
|
3
|
+
Atomic prop types live in `src/props/vocabulary/`. Every type name ends with **`Prop`**.
|
|
4
|
+
|
|
5
|
+
Import: `import type { TitleProp, GapProp } from "@godxjp/ui/props/vocabulary"`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Shared
|
|
10
|
+
|
|
11
|
+
| Type | Value | Used for |
|
|
12
|
+
| ------------------ | ----------------------------- | ------------------------- |
|
|
13
|
+
| `ClassNameProp` | `string` | Root class override |
|
|
14
|
+
| `ChildrenProp` | `ReactNode` | Child slot |
|
|
15
|
+
| `IdProp` | `string` | DOM / form id |
|
|
16
|
+
| `OpenProp` | `boolean` | Dialog/Sheet/Popover open |
|
|
17
|
+
| `OnOpenChangeProp` | `(open: boolean) => void` | Panel open state change |
|
|
18
|
+
| `HandlerProp` | `() => void \| Promise<void>` | Confirm / retry callbacks |
|
|
19
|
+
| `PendingProp` | `boolean` | Loading / in-flight |
|
|
20
|
+
| `RequiredProp` | `boolean` | Required field |
|
|
21
|
+
| `DisabledProp` | `boolean` | Disabled control |
|
|
22
|
+
| `LabelProp` | `ReactNode` | Generic label |
|
|
23
|
+
| `HelperProp` | `ReactNode` | Input hint text |
|
|
24
|
+
| `ErrorProp` | `ReactNode` | Validation error |
|
|
25
|
+
| `PlaceholderProp` | `string` | Input placeholder |
|
|
26
|
+
| `AsChildProp` | `boolean` | Radix polymorphism |
|
|
27
|
+
|
|
28
|
+
## Content slots
|
|
29
|
+
|
|
30
|
+
| Type | Semantics | Do NOT confuse with |
|
|
31
|
+
| ------------------ | ------------------------------------ | ------------------- |
|
|
32
|
+
| `TitleProp` | Primary heading | — |
|
|
33
|
+
| `SubtitleProp` | Line under title on **pages** | `DescriptionProp` |
|
|
34
|
+
| `DescriptionProp` | Body copy in dialogs / empty states | `SubtitleProp` |
|
|
35
|
+
| `ExtraProp` | Top-right page actions (Ant `extra`) | `ActionsProp` |
|
|
36
|
+
| `FooterProp` | Bottom page action bar | — |
|
|
37
|
+
| `ActionProp` | Empty state CTA | `ExtraProp` |
|
|
38
|
+
| `ActionsProp` | Toolbar button group | `ExtraProp` |
|
|
39
|
+
| `IconProp` | `LucideIcon` component | — |
|
|
40
|
+
| `ConfirmLabelProp` | Dialog confirm button text | — |
|
|
41
|
+
| `CancelLabelProp` | Dialog cancel button text | — |
|
|
42
|
+
|
|
43
|
+
## Layout & density
|
|
44
|
+
|
|
45
|
+
| Type | Values | Scope |
|
|
46
|
+
| ------------------ | ----------------------------------- | -------------------------------------------------------------- |
|
|
47
|
+
| `PageDensityProp` | `compact \| default \| comfortable` | **PageContainer** subtree |
|
|
48
|
+
| `GapProp` | `xs \| sm \| md \| lg \| xl` | `<Flex gap>` (row) and `<Flex direction="col" gap>` (vertical) |
|
|
49
|
+
| `TableDensityProp` | `compact \| comfortable` | **DataTable** rows only |
|
|
50
|
+
|
|
51
|
+
> **Critical:** `PageDensityProp` ≠ `TableDensityProp`. Never use bare `density` in new APIs.
|
|
52
|
+
|
|
53
|
+
## Interaction variants
|
|
54
|
+
|
|
55
|
+
| Type | Values |
|
|
56
|
+
| -------------------- | -------------------------------------------------------------------------- |
|
|
57
|
+
| `ButtonVariantProp` | `default \| destructive \| outline \| secondary \| ghost \| link` |
|
|
58
|
+
| `ButtonSizeProp` | `default \| sm \| lg \| icon` |
|
|
59
|
+
| `ConfirmVariantProp` | `default \| destructive` |
|
|
60
|
+
| `ToneProp` | `default \| success \| warning \| destructive \| info \| muted \| neutral` |
|
|
61
|
+
| `SortDirectionProp` | `asc \| desc` |
|
|
62
|
+
| `ColumnAlignProp` | `left \| center \| right` |
|
|
63
|
+
| `SortStateProp` | `{ key: string; direction: SortDirectionProp }` |
|
|
64
|
+
|
|
65
|
+
## Navigation
|
|
66
|
+
|
|
67
|
+
| Type | Shape |
|
|
68
|
+
| -------------------- | ----------------------------------- |
|
|
69
|
+
| `BreadcrumbItemProp` | `{ label: LabelProp; to?: string }` |
|
|
70
|
+
| `BreadcrumbProp` | `BreadcrumbItemProp[]` |
|
|
71
|
+
| `TitleProp` | primary heading text |
|
|
72
|
+
|
|
73
|
+
## Data collections
|
|
74
|
+
|
|
75
|
+
| Type | Purpose |
|
|
76
|
+
| -------------------------- | ----------------------- |
|
|
77
|
+
| `ColumnDefProp<T>` | DataTable column |
|
|
78
|
+
| `GetRowIdProp<T>` | Row ID extractor |
|
|
79
|
+
| `OnRowClickProp<T>` | Row navigation |
|
|
80
|
+
| `SelectedIdsProp` | `Set<string>` selection |
|
|
81
|
+
| `OnSelectChangeProp` | Selection handler |
|
|
82
|
+
| `OnTableDensityChangeProp` | Table density handler |
|
|
83
|
+
| `OnSortChangeProp` | Sort handler |
|
|
84
|
+
| `OnSearchChangeProp` | Debounced search |
|
|
85
|
+
| `OnClearFiltersProp` | Toolbar clear |
|
|
86
|
+
| `HasActiveFiltersProp` | Show clear button |
|
|
87
|
+
|
|
88
|
+
## Forbidden aliases
|
|
89
|
+
|
|
90
|
+
See `PROP_ALIASES_FORBIDDEN` in `@godxjp/ui/props/registry`:
|
|
91
|
+
|
|
92
|
+
| Don't use | Use instead |
|
|
93
|
+
| ----------------------------- | -------------------------------------------------- |
|
|
94
|
+
| bare `description` on pages | `SubtitleProp` |
|
|
95
|
+
| bare `description` in dialogs | `DescriptionProp` |
|
|
96
|
+
| `actions` on page header | `ExtraProp` |
|
|
97
|
+
| bare `density` | `PageDensityProp` or `TableDensityProp` |
|
|
98
|
+
| component-specific gap unions | `GapProp` or documented `Extract`/`Exclude` subset |
|
|
99
|
+
| `onClear` | `OnClearFiltersProp` |
|
|
100
|
+
| `loading` on buttons | `PendingProp` |
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @godxjp/ui Documentation
|
|
2
|
+
|
|
3
|
+
| Doc | Purpose |
|
|
4
|
+
| -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
5
|
+
| [CONSUMER-RULES.md](./CONSUMER-RULES.md) | **Start here if you build an app with @godxjp/ui** — the ten rules the audit enforces (styles entry, layout owners, real primitives, tokens) |
|
|
6
|
+
| [DEVELOPMENT.md](./DEVELOPMENT.md) | **Contributor guideline** — role/boundary, architecture, how to add/extend, verify |
|
|
7
|
+
| [COMPONENTS.md](./COMPONENTS.md) | Component catalog by Ant Design group |
|
|
8
|
+
| [PROPS-VOCABULARY.md](./PROPS-VOCABULARY.md) | Atomic prop types (`*Prop` suffix) |
|
|
9
|
+
| [PROPS-REGISTRY.md](./PROPS-REGISTRY.md) | Machine-readable registry + forbidden aliases |
|
|
10
|
+
| [DATETIME.md](./DATETIME.md) | **Mandatory** `formatDate` — all date/time display |
|
|
11
|
+
| [SPACING.md](./SPACING.md) | Golden ratio (φ) macro spacing — PageContainer sections, Flex gap, Card rhythm |
|
|
12
|
+
| [FORMS.md](./FORMS.md) | **Mandatory** react-hook-form + Zod 4 |
|
|
13
|
+
| [TESTING.md](./TESTING.md) | **Mandatory** Vitest per component |
|
|
14
|
+
| [FRAME-A11Y-CI.md](./FRAME-A11Y-CI.md) | Per-frame axe a11y + geometry + coverage CI gates — how to run/regenerate locally |
|
|
15
|
+
| [../README.md](../README.md) | Setup, workspace wiring, theme |
|
|
16
|
+
|
|
17
|
+
## Preview
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
cd packages/ui
|
|
21
|
+
pnpm preview # http://localhost:6008
|
|
22
|
+
pnpm preview:build # static site → preview/dist/
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Preview doc format
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
docs/
|
|
29
|
+
primitives/ ← sidebar group (folder name → title)
|
|
30
|
+
README.md ← optional group intro
|
|
31
|
+
data-display/
|
|
32
|
+
README.md
|
|
33
|
+
overview.tsx ← 1 story = 1 demo (default export)
|
|
34
|
+
overview.md ← optional story docs (YAML frontmatter: title, layout)
|
|
35
|
+
_shared.ts ← prefix _ = not a story
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- **Navigation** = folder tree; leaves = `.tsx` files (not `README.md`, not `_*.tsx`).
|
|
39
|
+
- **Live demo** = `export default function Demo()` from the `.tsx` file.
|
|
40
|
+
- **Imports** = `@godxjp/ui/{data-display,layout,general,…}` — same public paths as app code (`FORMS.md`). **Not** `@/components/…` (internal dev alias only).
|
|
41
|
+
- **Code panel** = same `.tsx` file raw — no duplicate `parameters.docs.source.code`.
|
|
42
|
+
- **Story docs** = optional same-name `.md` beside the demo (tiếng Việt): giới thiệu, khi nào dùng, import, props (hiển thị / hành động / DOM). Regenerate: `pnpm docs:sync-primitives`.
|
|
43
|
+
- Component preview examples live in `examples/**/*.preview.tsx`.
|
|
44
|
+
|
|
45
|
+
## Props folder layout
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
src/props/
|
|
49
|
+
├── vocabulary/ ← atomic reusable concepts (TitleProp, GapProp, …)
|
|
50
|
+
├── components/ ← per-component interfaces (PageContainerProp, ButtonProp, …)
|
|
51
|
+
├── registry.ts ← canonical catalog — check before adding new props
|
|
52
|
+
└── index.ts ← public export @godxjp/ui/props
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Naming rules
|
|
56
|
+
|
|
57
|
+
1. **Vocabulary** (atomic): `{Concept}Prop` — e.g. `TitleProp`, `PageDensityProp`
|
|
58
|
+
2. **Component** (composite): `{Component}Prop` — e.g. `PageContainerProp`, `ButtonProp`
|
|
59
|
+
3. **Never** define prop interfaces inline in component `.tsx` files
|
|
60
|
+
4. **Always** check `registry.ts` + `PROP_ALIASES_FORBIDDEN` before inventing a name
|