@godxjp/ui 19.1.0 → 19.3.1
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 +20 -14
- package/dist/components/data-display/badge.js +18 -4
- 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 +55 -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 +36 -1
- package/dist/props/registry.js +45 -1
- 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 +19 -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 +12 -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 +283 -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 +160 -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 +188 -0
- package/docs/data-display/popover-touch.tsx +27 -0
- package/docs/data-display/popover.tsx +246 -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 +303 -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 +175 -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 +330 -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 +102 -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 +420 -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 +204 -0
- package/docs/foundation/density.tsx +232 -0
- package/docs/foundation/email-tokens.tsx +323 -0
- package/docs/foundation/radius-shadow.tsx +154 -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 +135 -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 +266 -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 +954 -0
- package/docs/layout/resizable-panel.tsx +419 -0
- package/docs/layout/responsive-grid.tsx +243 -0
- package/docs/layout/separator.tsx +327 -0
- package/docs/layout/service-role-panel.tsx +144 -0
- package/docs/layout/sidebar.tsx +609 -0
- package/docs/layout/split-pane.tsx +468 -0
- package/docs/layout/topbar.tsx +349 -0
- package/docs/navigation/app-setting-picker.tsx +142 -0
- package/docs/navigation/breadcrumb.tsx +135 -0
- package/docs/navigation/context-menu.tsx +123 -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 +158 -0
- package/docs/navigation/pagination.tsx +241 -0
- package/docs/navigation/steps.tsx +265 -0
- package/docs/navigation/tabs-rtl.tsx +28 -0
- package/docs/navigation/tabs.tsx +314 -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 +455 -0
- package/docs/showcase/acme-website.tsx +461 -0
- package/docs/showcase/case1-warehouse-dashboard.tsx +359 -0
- package/docs/showcase/case2-employee-me.tsx +444 -0
- package/docs/showcase/case3-approval-workflow.tsx +529 -0
- package/docs/showcase/case4-login.tsx +313 -0
- package/docs/showcase/case5-shift-calendar.tsx +795 -0
- package/docs/showcase/case6-agency-handy.tsx +1113 -0
- package/docs/showcase/futurelastic-web.tsx +392 -0
- package/docs/showcase/org-switcher.tsx +313 -0
- package/docs/showcase/permission-matrix.tsx +346 -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 +347 -0
- package/docs/showcase/table-expandable-rows.tsx +480 -0
- package/docs/showcase/table-filter-chips.tsx +456 -0
- package/docs/showcase/table-footer-totals.tsx +314 -0
- package/docs/showcase/table-grouped-subtotals.tsx +391 -0
- package/docs/showcase/table-master-detail.tsx +484 -0
- package/docs/showcase/table-pagination.tsx +327 -0
- package/docs/showcase/table-states.tsx +366 -0
- package/docs/showcase/table-sticky-columns.tsx +376 -0
- package/docs/showcase/table-tree-rows.tsx +444 -0
- package/docs/showcase/table-view-tabs.tsx +488 -0
- package/package.json +9 -12
- 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,283 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Badge,
|
|
3
|
+
Card,
|
|
4
|
+
CardContent,
|
|
5
|
+
CardDescription,
|
|
6
|
+
CardHeader,
|
|
7
|
+
CardTitle,
|
|
8
|
+
StatusBadge,
|
|
9
|
+
} from "@godxjp/ui/data-display";
|
|
10
|
+
import { Text } from "@godxjp/ui/general";
|
|
11
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
12
|
+
import { Star } from "lucide-react";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Badge — status / category chip. Composed only from real @godxjp/ui components.
|
|
16
|
+
* variant is STRUCTURAL (default / secondary / outline); tone is SEMANTIC (ToneProp).
|
|
17
|
+
* the reference design: semantic mapping is FIXED (success 若竹 / warning 山吹 / info 群青 /
|
|
18
|
+
* destructive 茜). Labels never wrap (rule #35).
|
|
19
|
+
*/
|
|
20
|
+
const variants = [
|
|
21
|
+
{ variant: "default" as const, label: "既定 Default" },
|
|
22
|
+
{ variant: "secondary" as const, label: "区分 Category" },
|
|
23
|
+
{ variant: "outline" as const, label: "補助 Subtle" },
|
|
24
|
+
{ variant: "dashed" as const, label: "点線 Dashed" },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const shapes = [
|
|
28
|
+
{ shape: "default" as const, label: "既定 Default" },
|
|
29
|
+
{ shape: "pill" as const, label: "丸み Pill" },
|
|
30
|
+
{ shape: "sharp" as const, label: "角 Sharp" },
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Colours a person picked, not colours that mean something — a status and an
|
|
35
|
+
* issue type out of a project's own settings screen, plus the two ends of the
|
|
36
|
+
* range an administrator can still type. `#488a5a` is here because it is the
|
|
37
|
+
* worst case for a SOLID chip: near-black and white measure equal on it, both
|
|
38
|
+
* 4.15:1, under the 4.5 badge-sized text needs. Washed, it clears 8.52.
|
|
39
|
+
*/
|
|
40
|
+
const dataColours = [
|
|
41
|
+
{ color: "#4488c5", label: "処理中 In progress" },
|
|
42
|
+
{ color: "#ea9a10", label: "未対応 Open" },
|
|
43
|
+
{ color: "#488a5a", label: "完了 Done" },
|
|
44
|
+
{ color: "#000000", label: "黒 Black" },
|
|
45
|
+
{ color: "#ffffff", label: "白 White" },
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const tones = [
|
|
49
|
+
{ tone: "default" as const, label: "既定 Default" },
|
|
50
|
+
{ tone: "primary" as const, label: "ブランド Brand" },
|
|
51
|
+
{ tone: "success" as const, label: "承認済 Approved" },
|
|
52
|
+
{ tone: "warning" as const, label: "保留 Pending" },
|
|
53
|
+
{ tone: "destructive" as const, label: "却下 Rejected" },
|
|
54
|
+
{ tone: "info" as const, label: "情報 Info" },
|
|
55
|
+
{ tone: "muted" as const, label: "控えめ Muted" },
|
|
56
|
+
{ tone: "neutral" as const, label: "中立 Neutral" },
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
const statuses = ["active", "draft", "pending", "cancelled", "failed", "scheduled"];
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Subscription/billing lifecycle keys (gh#216). They ship the SAME canonical status→tone→icon
|
|
63
|
+
* map as every other key, so a billing screen never keeps a page-local colour table. They are
|
|
64
|
+
* demoed explicitly because their i18n labels were once missing. A missing key renders the raw
|
|
65
|
+
* `status.trialing` string, and only a rendered demo makes that regression visible.
|
|
66
|
+
*/
|
|
67
|
+
const billingStatuses = ["trialing", "past_due", "incomplete", "canceled"];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* StatusBadge is the status-first name for the same chip, so it carries the SAME structural
|
|
71
|
+
* axes. `incomplete` is the one canonical key that resolves to the tone-neutral default, which
|
|
72
|
+
* is why the four variants stay legible next to each other: a tone would repaint the fill.
|
|
73
|
+
*/
|
|
74
|
+
const statusBadgeVariants = [
|
|
75
|
+
{ variant: "default" as const, note: "既定 Default" },
|
|
76
|
+
{ variant: "secondary" as const, note: "控えめ Secondary" },
|
|
77
|
+
{ variant: "outline" as const, note: "枠線 Outline" },
|
|
78
|
+
{ variant: "dashed" as const, note: "点線 Dashed" },
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
/** A project status outside the canonical map declares its own tone; the label stays authored. */
|
|
82
|
+
const statusBadgeTones = [
|
|
83
|
+
{ tone: "default" as const, label: "受付 Received" },
|
|
84
|
+
{ tone: "primary" as const, label: "優先対応 Priority" },
|
|
85
|
+
{ tone: "success" as const, label: "検収済 Accepted" },
|
|
86
|
+
{ tone: "warning" as const, label: "修正待ち Awaiting fix" },
|
|
87
|
+
{ tone: "destructive" as const, label: "検収差戻し Rejected" },
|
|
88
|
+
{ tone: "info" as const, label: "監査中 Under audit" },
|
|
89
|
+
{ tone: "muted" as const, label: "対象外 Out of scope" },
|
|
90
|
+
{ tone: "neutral" as const, label: "下書き Draft" },
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
export default function Demo() {
|
|
94
|
+
return (
|
|
95
|
+
<PageContainer
|
|
96
|
+
title="Badge"
|
|
97
|
+
subtitle="Structural variants, semantic tones, and auto-mapped lifecycle status · labels never wrap"
|
|
98
|
+
>
|
|
99
|
+
<Flex direction="col" gap="lg">
|
|
100
|
+
<Card>
|
|
101
|
+
<CardHeader>
|
|
102
|
+
<CardTitle level={2}>Structural variants</CardTitle>
|
|
103
|
+
<CardDescription>
|
|
104
|
+
variant is structural emphasis only: default (filled), secondary (muted fill), outline
|
|
105
|
+
(bordered), dashed (dashed border). It carries no semantic meaning; use tone for that.
|
|
106
|
+
</CardDescription>
|
|
107
|
+
</CardHeader>
|
|
108
|
+
<CardContent>
|
|
109
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
110
|
+
{variants.map((v) => (
|
|
111
|
+
<Badge key={v.variant} variant={v.variant}>
|
|
112
|
+
{v.label}
|
|
113
|
+
</Badge>
|
|
114
|
+
))}
|
|
115
|
+
</Flex>
|
|
116
|
+
</CardContent>
|
|
117
|
+
</Card>
|
|
118
|
+
|
|
119
|
+
<Card>
|
|
120
|
+
<CardHeader>
|
|
121
|
+
<CardTitle level={2}>Shape</CardTitle>
|
|
122
|
+
<CardDescription>
|
|
123
|
+
shape sets corner radius from the tokens: default (badge radius) / pill (fully
|
|
124
|
+
rounded) / sharp (square). Independent of variant and tone.
|
|
125
|
+
</CardDescription>
|
|
126
|
+
</CardHeader>
|
|
127
|
+
<CardContent>
|
|
128
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
129
|
+
{shapes.map((s) => (
|
|
130
|
+
<Badge key={s.shape} shape={s.shape} tone="info">
|
|
131
|
+
{s.label}
|
|
132
|
+
</Badge>
|
|
133
|
+
))}
|
|
134
|
+
</Flex>
|
|
135
|
+
</CardContent>
|
|
136
|
+
</Card>
|
|
137
|
+
|
|
138
|
+
<Card>
|
|
139
|
+
<CardHeader>
|
|
140
|
+
<CardTitle level={2}>The record’s own colour</CardTitle>
|
|
141
|
+
<CardDescription>
|
|
142
|
+
color carries DATA: a status an administrator coloured, an issue type, a tag. The chip
|
|
143
|
+
is washed into the surface rather than filled, because a solid chip has to choose a
|
|
144
|
+
foreground and no choice is readable for every colour a picker can produce. Retune the
|
|
145
|
+
wash with --badge-tint-fill / --badge-tint-edge.
|
|
146
|
+
</CardDescription>
|
|
147
|
+
</CardHeader>
|
|
148
|
+
<CardContent>
|
|
149
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
150
|
+
{dataColours.map((c) => (
|
|
151
|
+
<Badge key={c.color} shape="pill" color={c.color}>
|
|
152
|
+
{c.label}
|
|
153
|
+
</Badge>
|
|
154
|
+
))}
|
|
155
|
+
</Flex>
|
|
156
|
+
</CardContent>
|
|
157
|
+
</Card>
|
|
158
|
+
|
|
159
|
+
<Card>
|
|
160
|
+
<CardHeader>
|
|
161
|
+
<CardTitle level={2}>Semantic tones</CardTitle>
|
|
162
|
+
<CardDescription>
|
|
163
|
+
tone conveys intent, pick by meaning, never aesthetics. success = approved/paid ·
|
|
164
|
+
warning = pending · destructive = rejected · info · muted · neutral = category.
|
|
165
|
+
</CardDescription>
|
|
166
|
+
</CardHeader>
|
|
167
|
+
<CardContent>
|
|
168
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
169
|
+
{tones.map((t) => (
|
|
170
|
+
<Badge key={t.tone} tone={t.tone}>
|
|
171
|
+
{t.label}
|
|
172
|
+
</Badge>
|
|
173
|
+
))}
|
|
174
|
+
</Flex>
|
|
175
|
+
</CardContent>
|
|
176
|
+
</Card>
|
|
177
|
+
|
|
178
|
+
<Card>
|
|
179
|
+
<CardHeader>
|
|
180
|
+
<CardTitle level={2}>Lifecycle status</CardTitle>
|
|
181
|
+
<CardDescription>
|
|
182
|
+
status="key" auto-maps known lifecycle keys to tone + icon + i18n label.
|
|
183
|
+
Unknown keys fall back to neutral + a generic icon + the raw key text.
|
|
184
|
+
</CardDescription>
|
|
185
|
+
</CardHeader>
|
|
186
|
+
<CardContent>
|
|
187
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
188
|
+
{statuses.map((s) => (
|
|
189
|
+
<Badge key={s} status={s} />
|
|
190
|
+
))}
|
|
191
|
+
<StatusBadge status="active" />
|
|
192
|
+
<Badge status="unknown-key" />
|
|
193
|
+
</Flex>
|
|
194
|
+
</CardContent>
|
|
195
|
+
</Card>
|
|
196
|
+
|
|
197
|
+
<Card>
|
|
198
|
+
<CardHeader>
|
|
199
|
+
<CardTitle level={2}>Billing lifecycle</CardTitle>
|
|
200
|
+
<CardDescription>
|
|
201
|
+
Subscription keys map through the SAME canonical table · trialing = info · past_due =
|
|
202
|
+
warning · incomplete = default · canceled = destructive. Every label is translated, so
|
|
203
|
+
a billing screen never shows a raw status.* key and never keeps its own colour map.
|
|
204
|
+
</CardDescription>
|
|
205
|
+
</CardHeader>
|
|
206
|
+
<CardContent>
|
|
207
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
208
|
+
{billingStatuses.map((s) => (
|
|
209
|
+
<StatusBadge key={s} status={s} />
|
|
210
|
+
))}
|
|
211
|
+
{billingStatuses.map((s) => (
|
|
212
|
+
<StatusBadge key={`${s}-outline`} status={s} variant="outline" />
|
|
213
|
+
))}
|
|
214
|
+
</Flex>
|
|
215
|
+
</CardContent>
|
|
216
|
+
</Card>
|
|
217
|
+
|
|
218
|
+
<Card>
|
|
219
|
+
<CardHeader>
|
|
220
|
+
<CardTitle level={2}>StatusBadge · 構造 / 形状 / トーン</CardTitle>
|
|
221
|
+
<CardDescription>
|
|
222
|
+
StatusBadge はステータス主導の別名で、Badge と同じ variant / shape / tone
|
|
223
|
+
を受け取ります。canonical マップに無い自社ステータスは tone
|
|
224
|
+
を明示し、色表をアプリ側に持たせません。
|
|
225
|
+
</CardDescription>
|
|
226
|
+
</CardHeader>
|
|
227
|
+
<CardContent>
|
|
228
|
+
<Flex direction="col" gap="md">
|
|
229
|
+
<Flex direction="col" gap="xs">
|
|
230
|
+
<Text size="xs" tone="muted">
|
|
231
|
+
variant · status="incomplete"(トーン中立のキー)
|
|
232
|
+
</Text>
|
|
233
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
234
|
+
{statusBadgeVariants.map((v) => (
|
|
235
|
+
<StatusBadge key={v.variant} status="incomplete" variant={v.variant} />
|
|
236
|
+
))}
|
|
237
|
+
</Flex>
|
|
238
|
+
</Flex>
|
|
239
|
+
<Flex direction="col" gap="xs">
|
|
240
|
+
<Text size="xs" tone="muted">
|
|
241
|
+
shape · 既定 / pill / sharp
|
|
242
|
+
</Text>
|
|
243
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
244
|
+
{shapes.map((s) => (
|
|
245
|
+
<StatusBadge key={s.shape} status="scheduled" shape={s.shape} />
|
|
246
|
+
))}
|
|
247
|
+
</Flex>
|
|
248
|
+
</Flex>
|
|
249
|
+
<Flex direction="col" gap="xs">
|
|
250
|
+
<Text size="xs" tone="muted">
|
|
251
|
+
tone · 自社ステータスに意味の色を与える
|
|
252
|
+
</Text>
|
|
253
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
254
|
+
{statusBadgeTones.map((t) => (
|
|
255
|
+
<StatusBadge key={t.tone} tone={t.tone}>
|
|
256
|
+
{t.label}
|
|
257
|
+
</StatusBadge>
|
|
258
|
+
))}
|
|
259
|
+
</Flex>
|
|
260
|
+
</Flex>
|
|
261
|
+
</Flex>
|
|
262
|
+
</CardContent>
|
|
263
|
+
</Card>
|
|
264
|
+
|
|
265
|
+
<Card>
|
|
266
|
+
<CardHeader>
|
|
267
|
+
<CardTitle level={2}>Icon overrides</CardTitle>
|
|
268
|
+
<CardDescription>
|
|
269
|
+
icon replaces the status-mapped icon; icon={null} suppresses it entirely
|
|
270
|
+
while keeping the resolved tone and label.
|
|
271
|
+
</CardDescription>
|
|
272
|
+
</CardHeader>
|
|
273
|
+
<CardContent>
|
|
274
|
+
<Flex direction="row" wrap align="center" gap="sm">
|
|
275
|
+
<Badge status="active" icon={Star} />
|
|
276
|
+
<Badge status="active" icon={null} />
|
|
277
|
+
</Flex>
|
|
278
|
+
</CardContent>
|
|
279
|
+
</Card>
|
|
280
|
+
</Flex>
|
|
281
|
+
</PageContainer>
|
|
282
|
+
);
|
|
283
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Badge,
|
|
3
|
+
Card,
|
|
4
|
+
CardContent,
|
|
5
|
+
CardDescription,
|
|
6
|
+
CardFooter,
|
|
7
|
+
CardHeader,
|
|
8
|
+
CardTitle,
|
|
9
|
+
Descriptions,
|
|
10
|
+
StatCard,
|
|
11
|
+
Avatar,
|
|
12
|
+
AvatarFallback,
|
|
13
|
+
} from "@godxjp/ui/data-display";
|
|
14
|
+
import { Button } from "@godxjp/ui/general";
|
|
15
|
+
import {
|
|
16
|
+
AppShell,
|
|
17
|
+
Flex,
|
|
18
|
+
PageContainer,
|
|
19
|
+
ResponsiveGrid,
|
|
20
|
+
Sidebar,
|
|
21
|
+
type SidebarSectionProp,
|
|
22
|
+
Topbar,
|
|
23
|
+
} from "@godxjp/ui/layout";
|
|
24
|
+
import { BookOpen, FileText, LayoutDashboard, ReceiptText, Users } from "lucide-react";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Detail screen — Card as the structural surface: accent stripe + banded header +
|
|
28
|
+
* Descriptions body + separated footer action bar, beside a StatCard summary row.
|
|
29
|
+
* No hand-rolled panels; every surface is a real @godxjp/ui component.
|
|
30
|
+
*/
|
|
31
|
+
const sections: SidebarSectionProp[] = [
|
|
32
|
+
{
|
|
33
|
+
label: "会計",
|
|
34
|
+
items: [
|
|
35
|
+
{ id: "dashboard", label: "ダッシュボード", icon: LayoutDashboard },
|
|
36
|
+
{ id: "journal", label: "仕訳", icon: FileText },
|
|
37
|
+
{ id: "invoices", label: "請求書", icon: ReceiptText },
|
|
38
|
+
{ id: "partners", label: "取引先", icon: BookOpen },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{ label: "管理", items: [{ id: "users", label: "ユーザー", icon: Users }] },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
export default function Demo() {
|
|
45
|
+
return (
|
|
46
|
+
<AppShell
|
|
47
|
+
sidebar={
|
|
48
|
+
<Sidebar
|
|
49
|
+
activeId="invoices"
|
|
50
|
+
sections={sections}
|
|
51
|
+
onSelect={() => {}}
|
|
52
|
+
product={{ name: "CoreBooks", role: "管理コンソール", color: "hsl(var(--primary))" }}
|
|
53
|
+
/>
|
|
54
|
+
}
|
|
55
|
+
topbar={
|
|
56
|
+
<Topbar
|
|
57
|
+
start={
|
|
58
|
+
<Avatar className="rounded-md">
|
|
59
|
+
<AvatarFallback className="bg-primary text-primary-foreground font-bold">
|
|
60
|
+
C
|
|
61
|
+
</AvatarFallback>
|
|
62
|
+
</Avatar>
|
|
63
|
+
}
|
|
64
|
+
/>
|
|
65
|
+
}
|
|
66
|
+
>
|
|
67
|
+
<PageContainer
|
|
68
|
+
title="請求書 INV-2024-0312"
|
|
69
|
+
subtitle="株式会社ベトヤ · 2024-04-12"
|
|
70
|
+
breadcrumb={[{ label: "請求書", to: "#" }, { label: "INV-2024-0312" }]}
|
|
71
|
+
extra={<Badge tone="warning">承認待ち</Badge>}
|
|
72
|
+
>
|
|
73
|
+
<Flex direction="col" gap="lg">
|
|
74
|
+
<ResponsiveGrid columns={{ sm: 1, md: 3 }}>
|
|
75
|
+
<StatCard label="合計金額" value="¥482,000" />
|
|
76
|
+
<StatCard label="消費税 (10%)" value="¥43,818" />
|
|
77
|
+
<StatCard label="支払期日" value="2024-05-31" hint="あと19日" />
|
|
78
|
+
</ResponsiveGrid>
|
|
79
|
+
|
|
80
|
+
<Card accent="primary">
|
|
81
|
+
<CardHeader banded>
|
|
82
|
+
<CardTitle level={2}>明細</CardTitle>
|
|
83
|
+
<CardDescription>4月分 受注</CardDescription>
|
|
84
|
+
</CardHeader>
|
|
85
|
+
<CardContent>
|
|
86
|
+
<Descriptions>
|
|
87
|
+
<Descriptions.Item label="取引先">株式会社ベトヤ</Descriptions.Item>
|
|
88
|
+
<Descriptions.Item label="勘定科目">売掛金 / 売上高</Descriptions.Item>
|
|
89
|
+
<Descriptions.Item label="小計">¥438,182</Descriptions.Item>
|
|
90
|
+
<Descriptions.Item label="消費税 (10%)">¥43,818</Descriptions.Item>
|
|
91
|
+
<Descriptions.Item label="合計">¥482,000</Descriptions.Item>
|
|
92
|
+
<Descriptions.Item label="摘要">INV-2024-0312 / 4月分</Descriptions.Item>
|
|
93
|
+
</Descriptions>
|
|
94
|
+
</CardContent>
|
|
95
|
+
<CardFooter separated>
|
|
96
|
+
<Flex direction="row" wrap gap="sm" justify="end">
|
|
97
|
+
<Button variant="outline">却下</Button>
|
|
98
|
+
<Button>承認</Button>
|
|
99
|
+
</Flex>
|
|
100
|
+
</CardFooter>
|
|
101
|
+
</Card>
|
|
102
|
+
</Flex>
|
|
103
|
+
</PageContainer>
|
|
104
|
+
</AppShell>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Card,
|
|
3
|
+
CardAction,
|
|
4
|
+
CardBar,
|
|
5
|
+
CardContent,
|
|
6
|
+
CardCover,
|
|
7
|
+
CardDescription,
|
|
8
|
+
CardFooter,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardTitle,
|
|
11
|
+
Descriptions,
|
|
12
|
+
Table,
|
|
13
|
+
TableBody,
|
|
14
|
+
TableCell,
|
|
15
|
+
TableHead,
|
|
16
|
+
TableHeader,
|
|
17
|
+
TableRow,
|
|
18
|
+
StatCard,
|
|
19
|
+
} from "@godxjp/ui/data-display";
|
|
20
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
21
|
+
import { AspectRatio, Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
|
|
22
|
+
import { MoreHorizontal } from "lucide-react";
|
|
23
|
+
|
|
24
|
+
import coverTerrain from "../../assets/cover-terrain.svg";
|
|
25
|
+
|
|
26
|
+
/* A committed SVG under docs/assets, imported so the bundler rewrites the URL against
|
|
27
|
+
* PREVIEW_BASE. It replaces a picsum.photos fetch that hung `networkidle` and timed this page out
|
|
28
|
+
* at 30s in CI (gh#333); it was briefly an inline data: URI, which fixed the hang but put 700
|
|
29
|
+
* unreadable characters in the middle of the example a consumer is meant to copy. */
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Card — surface container. Body content ALWAYS goes in CardContent (a bare Card
|
|
33
|
+
* has zero padding); titles in CardHeader/CardTitle; action bars in CardFooter.
|
|
34
|
+
* Flat by design — 1px border, no shadow at rest. Composed only from real
|
|
35
|
+
* @godxjp/ui components.
|
|
36
|
+
*/
|
|
37
|
+
const accents = ["primary", "success", "warning", "info", "attention", "destructive"] as const;
|
|
38
|
+
|
|
39
|
+
export default function Demo() {
|
|
40
|
+
return (
|
|
41
|
+
<PageContainer title="Card" subtitle="variant · accent · header / content / footer composition">
|
|
42
|
+
<Flex direction="col" gap="lg">
|
|
43
|
+
<Flex direction="col" gap="sm">
|
|
44
|
+
<Text as="div" weight="medium">
|
|
45
|
+
CardBar · scrollable controls + pinned action
|
|
46
|
+
</Text>
|
|
47
|
+
<Card>
|
|
48
|
+
<CardBar
|
|
49
|
+
extra={
|
|
50
|
+
<Button size="sm" variant="outline">
|
|
51
|
+
保存
|
|
52
|
+
</Button>
|
|
53
|
+
}
|
|
54
|
+
>
|
|
55
|
+
<Button size="sm" variant="ghost">
|
|
56
|
+
すべて
|
|
57
|
+
</Button>
|
|
58
|
+
<Button size="sm" variant="ghost">
|
|
59
|
+
未払い
|
|
60
|
+
</Button>
|
|
61
|
+
<Button size="sm" variant="ghost">
|
|
62
|
+
超過
|
|
63
|
+
</Button>
|
|
64
|
+
</CardBar>
|
|
65
|
+
<CardContent>
|
|
66
|
+
main が混み合うと main のみ横スクロールし、extra は末尾に固定されます。
|
|
67
|
+
</CardContent>
|
|
68
|
+
</Card>
|
|
69
|
+
</Flex>
|
|
70
|
+
|
|
71
|
+
<Flex direction="col" gap="sm">
|
|
72
|
+
<Text as="div" weight="medium">
|
|
73
|
+
StatCard · stacked / inline / inverse
|
|
74
|
+
</Text>
|
|
75
|
+
<ResponsiveGrid columns={{ sm: 1, md: 3 }}>
|
|
76
|
+
<StatCard label="月間売上" value="¥12,840,000" delta="+12.4%" hint="前月比" />
|
|
77
|
+
<StatCard label="未払い" value="28" delta="-3" accent="warning" />
|
|
78
|
+
<StatCard
|
|
79
|
+
label="平均処理時間"
|
|
80
|
+
value="2.8日"
|
|
81
|
+
delta="-0.4日"
|
|
82
|
+
inverse
|
|
83
|
+
layout="inline"
|
|
84
|
+
align="end"
|
|
85
|
+
/>
|
|
86
|
+
</ResponsiveGrid>
|
|
87
|
+
</Flex>
|
|
88
|
+
|
|
89
|
+
<Flex direction="col" gap="sm">
|
|
90
|
+
<Text as="div" weight="medium">
|
|
91
|
+
Variants
|
|
92
|
+
</Text>
|
|
93
|
+
<ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
|
|
94
|
+
<Card variant="default">
|
|
95
|
+
<CardHeader>
|
|
96
|
+
<CardTitle level={2}>default</CardTitle>
|
|
97
|
+
</CardHeader>
|
|
98
|
+
<CardContent>標準のサーフェス</CardContent>
|
|
99
|
+
</Card>
|
|
100
|
+
<Card variant="muted">
|
|
101
|
+
<CardHeader>
|
|
102
|
+
<CardTitle level={2}>muted</CardTitle>
|
|
103
|
+
</CardHeader>
|
|
104
|
+
<CardContent>控えめな塗り</CardContent>
|
|
105
|
+
</Card>
|
|
106
|
+
<Card variant="outline">
|
|
107
|
+
<CardHeader>
|
|
108
|
+
<CardTitle level={2}>outline</CardTitle>
|
|
109
|
+
</CardHeader>
|
|
110
|
+
<CardContent>枠線のみ</CardContent>
|
|
111
|
+
</Card>
|
|
112
|
+
<Card variant="featured">
|
|
113
|
+
<CardHeader>
|
|
114
|
+
<CardTitle level={2}>featured</CardTitle>
|
|
115
|
+
</CardHeader>
|
|
116
|
+
<CardContent>強調サーフェス</CardContent>
|
|
117
|
+
</Card>
|
|
118
|
+
</ResponsiveGrid>
|
|
119
|
+
</Flex>
|
|
120
|
+
|
|
121
|
+
<Flex direction="col" gap="sm">
|
|
122
|
+
<Text as="div" weight="medium">
|
|
123
|
+
Accent · accentPlacement="edge" (既定 · 先頭エッジのレール)
|
|
124
|
+
</Text>
|
|
125
|
+
<ResponsiveGrid columns={{ sm: 2, md: 3, lg: 6 }}>
|
|
126
|
+
{accents.map((a) => (
|
|
127
|
+
<Card key={a} accent={a}>
|
|
128
|
+
<CardContent>{a}</CardContent>
|
|
129
|
+
</Card>
|
|
130
|
+
))}
|
|
131
|
+
</ResponsiveGrid>
|
|
132
|
+
</Flex>
|
|
133
|
+
|
|
134
|
+
{/* accentPlacement="perimeter" — the semantic attention border (gh#12) */}
|
|
135
|
+
<Flex direction="col" gap="sm">
|
|
136
|
+
<Text as="div" weight="medium">
|
|
137
|
+
Accent · accentPlacement="perimeter" (全周のアテンションボーダー)
|
|
138
|
+
</Text>
|
|
139
|
+
<Text size="xs" tone="muted">
|
|
140
|
+
variant="featured"
|
|
141
|
+
は定義上ブランド色の全周ボーダー。トーンを自分で決めたいとき —
|
|
142
|
+
「対応が必要」「失敗した」— は accent と accentPlacement の 2
|
|
143
|
+
語で表す。本文の左インセットは レール版と同じ位置に戻るので、placement
|
|
144
|
+
を切り替えても文字は動かない。
|
|
145
|
+
</Text>
|
|
146
|
+
<ResponsiveGrid columns={{ sm: 2, md: 3, lg: 6 }}>
|
|
147
|
+
{accents.map((a) => (
|
|
148
|
+
<Card key={a} accent={a} accentPlacement="perimeter">
|
|
149
|
+
<CardContent>{a}</CardContent>
|
|
150
|
+
</Card>
|
|
151
|
+
))}
|
|
152
|
+
</ResponsiveGrid>
|
|
153
|
+
</Flex>
|
|
154
|
+
|
|
155
|
+
<Flex direction="col" gap="sm">
|
|
156
|
+
<Text as="div" weight="medium">
|
|
157
|
+
Composition · banded header + separated footer
|
|
158
|
+
</Text>
|
|
159
|
+
<Card accent="primary">
|
|
160
|
+
<CardHeader banded>
|
|
161
|
+
<CardTitle level={2}>請求書 INV-2024-0312</CardTitle>
|
|
162
|
+
<CardDescription>株式会社ベトヤ · 2024-04-12</CardDescription>
|
|
163
|
+
<CardAction>
|
|
164
|
+
<Button variant="ghost" size="icon-sm" aria-label="メニュー">
|
|
165
|
+
<MoreHorizontal />
|
|
166
|
+
</Button>
|
|
167
|
+
</CardAction>
|
|
168
|
+
</CardHeader>
|
|
169
|
+
<CardContent>
|
|
170
|
+
<Descriptions>
|
|
171
|
+
<Descriptions.Item label="小計">¥438,182</Descriptions.Item>
|
|
172
|
+
<Descriptions.Item label="消費税 (10%)">¥43,818</Descriptions.Item>
|
|
173
|
+
<Descriptions.Item label="合計">¥482,000</Descriptions.Item>
|
|
174
|
+
</Descriptions>
|
|
175
|
+
</CardContent>
|
|
176
|
+
<CardFooter separated>
|
|
177
|
+
<Flex direction="row" wrap gap="sm" justify="end">
|
|
178
|
+
<Button variant="outline">却下</Button>
|
|
179
|
+
<Button>承認</Button>
|
|
180
|
+
</Flex>
|
|
181
|
+
</CardFooter>
|
|
182
|
+
</Card>
|
|
183
|
+
</Flex>
|
|
184
|
+
|
|
185
|
+
<Flex direction="col" gap="sm">
|
|
186
|
+
<Text as="div" weight="medium">
|
|
187
|
+
Density · tight 12px · base 16px · cozy 20px
|
|
188
|
+
</Text>
|
|
189
|
+
<ResponsiveGrid columns={{ sm: 1, md: 3 }}>
|
|
190
|
+
<Card density="tight">
|
|
191
|
+
<CardHeader>
|
|
192
|
+
<CardTitle level={2}>tight</CardTitle>
|
|
193
|
+
</CardHeader>
|
|
194
|
+
<CardContent>余白を詰めた密度</CardContent>
|
|
195
|
+
</Card>
|
|
196
|
+
<Card>
|
|
197
|
+
<CardHeader>
|
|
198
|
+
<CardTitle level={2}>base</CardTitle>
|
|
199
|
+
</CardHeader>
|
|
200
|
+
<CardContent>既定の密度</CardContent>
|
|
201
|
+
</Card>
|
|
202
|
+
<Card density="cozy">
|
|
203
|
+
<CardHeader>
|
|
204
|
+
<CardTitle level={2}>cozy</CardTitle>
|
|
205
|
+
</CardHeader>
|
|
206
|
+
<CardContent>ゆったりした密度</CardContent>
|
|
207
|
+
</Card>
|
|
208
|
+
</ResponsiveGrid>
|
|
209
|
+
</Flex>
|
|
210
|
+
|
|
211
|
+
<Flex direction="col" gap="sm">
|
|
212
|
+
<Text as="div" weight="medium">
|
|
213
|
+
CardContent · flush (edge-to-edge table) · solo (no header)
|
|
214
|
+
</Text>
|
|
215
|
+
<ResponsiveGrid columns={{ sm: 1, lg: 2 }}>
|
|
216
|
+
<Card>
|
|
217
|
+
<CardHeader banded>
|
|
218
|
+
<CardTitle level={2}>仕訳明細</CardTitle>
|
|
219
|
+
</CardHeader>
|
|
220
|
+
<CardContent flush>
|
|
221
|
+
<Table>
|
|
222
|
+
<TableHeader>
|
|
223
|
+
<TableRow>
|
|
224
|
+
<TableHead>勘定科目</TableHead>
|
|
225
|
+
<TableHead className="text-end">借方</TableHead>
|
|
226
|
+
<TableHead className="text-end">貸方</TableHead>
|
|
227
|
+
</TableRow>
|
|
228
|
+
</TableHeader>
|
|
229
|
+
<TableBody>
|
|
230
|
+
<TableRow>
|
|
231
|
+
<TableCell>売掛金</TableCell>
|
|
232
|
+
<TableCell className="text-end tabular-nums">¥482,000</TableCell>
|
|
233
|
+
<TableCell className="text-end">—</TableCell>
|
|
234
|
+
</TableRow>
|
|
235
|
+
<TableRow>
|
|
236
|
+
<TableCell>売上高</TableCell>
|
|
237
|
+
<TableCell className="text-end">—</TableCell>
|
|
238
|
+
<TableCell className="text-end tabular-nums">¥438,182</TableCell>
|
|
239
|
+
</TableRow>
|
|
240
|
+
<TableRow>
|
|
241
|
+
<TableCell>仮受消費税</TableCell>
|
|
242
|
+
<TableCell className="text-end">—</TableCell>
|
|
243
|
+
<TableCell className="text-end tabular-nums">¥43,818</TableCell>
|
|
244
|
+
</TableRow>
|
|
245
|
+
</TableBody>
|
|
246
|
+
</Table>
|
|
247
|
+
</CardContent>
|
|
248
|
+
</Card>
|
|
249
|
+
<Card>
|
|
250
|
+
<CardContent solo>
|
|
251
|
+
ヘッダーのない本文。solo はトップパディングをカードのシェルに合わせます。
|
|
252
|
+
</CardContent>
|
|
253
|
+
</Card>
|
|
254
|
+
</ResponsiveGrid>
|
|
255
|
+
</Flex>
|
|
256
|
+
|
|
257
|
+
<Flex direction="col" gap="sm">
|
|
258
|
+
<Text as="div" weight="medium">
|
|
259
|
+
CardCover · full-bleed media, header below
|
|
260
|
+
</Text>
|
|
261
|
+
<ResponsiveGrid columns={{ sm: 1, md: 2, lg: 3 }}>
|
|
262
|
+
<Card>
|
|
263
|
+
<CardCover>
|
|
264
|
+
<AspectRatio ratio={16 / 9}>
|
|
265
|
+
<img
|
|
266
|
+
src={coverTerrain}
|
|
267
|
+
alt="オフィスビルの外観"
|
|
268
|
+
className="h-full w-full object-cover"
|
|
269
|
+
/>
|
|
270
|
+
</AspectRatio>
|
|
271
|
+
</CardCover>
|
|
272
|
+
<CardHeader>
|
|
273
|
+
<CardTitle level={2}>渋谷オフィス</CardTitle>
|
|
274
|
+
<CardDescription>東京都渋谷区 · 内見受付中</CardDescription>
|
|
275
|
+
</CardHeader>
|
|
276
|
+
<CardFooter separated>
|
|
277
|
+
<Button variant="ghost">詳細を見る</Button>
|
|
278
|
+
</CardFooter>
|
|
279
|
+
</Card>
|
|
280
|
+
</ResponsiveGrid>
|
|
281
|
+
</Flex>
|
|
282
|
+
</Flex>
|
|
283
|
+
</PageContainer>
|
|
284
|
+
);
|
|
285
|
+
}
|