@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,419 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Badge,
|
|
3
|
+
Card,
|
|
4
|
+
CardContent,
|
|
5
|
+
CardDescription,
|
|
6
|
+
CardHeader,
|
|
7
|
+
CardTitle,
|
|
8
|
+
} from "@godxjp/ui/data-display";
|
|
9
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
10
|
+
import {
|
|
11
|
+
Flex,
|
|
12
|
+
PageContainer,
|
|
13
|
+
ResizableHandle,
|
|
14
|
+
ResizablePanel,
|
|
15
|
+
ResizablePanelGroup,
|
|
16
|
+
} from "@godxjp/ui/layout";
|
|
17
|
+
import { GripHorizontal, GripVertical, PanelLeftClose, PanelLeftOpen } from "lucide-react";
|
|
18
|
+
import * as React from "react";
|
|
19
|
+
import type { Layout, PanelImperativeHandle } from "react-resizable-panels";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* ResizablePanel · react-resizable-panels v4 compound primitive exported as
|
|
23
|
+
* ResizablePanelGroup / ResizablePanel / ResizableHandle. Always compose:
|
|
24
|
+
* ResizablePanelGroup wraps panels+handles; ResizableHandle sits between panels;
|
|
25
|
+
* ResizablePanel holds content. Group orientation is set with orientation
|
|
26
|
+
* ("horizontal" | "vertical"). minSize/maxSize prevent zero-collapse; collapsible
|
|
27
|
+
* + collapsedSize enable collapse-to-zero; defaultLayout + onLayoutChanged persist
|
|
28
|
+
* sizes. Composed only from real @godxjp/ui components.
|
|
29
|
+
*/
|
|
30
|
+
export default function Demo() {
|
|
31
|
+
return (
|
|
32
|
+
<PageContainer
|
|
33
|
+
title="ResizablePanel"
|
|
34
|
+
subtitle="ResizablePanelGroup + ResizablePanel + ResizableHandle · サイズ変更可能な分割レイアウト"
|
|
35
|
+
>
|
|
36
|
+
<Flex direction="col" gap="lg">
|
|
37
|
+
<HorizontalCard />
|
|
38
|
+
<VerticalCard />
|
|
39
|
+
<CollapsibleCard />
|
|
40
|
+
<PersistenceCard />
|
|
41
|
+
<DisabledCard />
|
|
42
|
+
<ThreePaneCard />
|
|
43
|
+
</Flex>
|
|
44
|
+
</PageContainer>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const frameStyle: React.CSSProperties = {
|
|
49
|
+
border: "1px solid var(--color-border)",
|
|
50
|
+
borderRadius: "var(--radius-md)",
|
|
51
|
+
overflow: "hidden",
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** orientation="horizontal" (default) · list + detail master/detail layout. */
|
|
55
|
+
function HorizontalCard() {
|
|
56
|
+
return (
|
|
57
|
+
<Card>
|
|
58
|
+
<CardHeader>
|
|
59
|
+
<CardTitle level={2}>水平分割 · リスト + 詳細</CardTitle>
|
|
60
|
+
<CardDescription>
|
|
61
|
+
orientation="horizontal"(既定)。ResizableHandle をパネル間に配置。minSize
|
|
62
|
+
でゼロ崩壊を防ぐ。ハンドルをダブルクリックすると defaultSize に戻る。
|
|
63
|
+
</CardDescription>
|
|
64
|
+
</CardHeader>
|
|
65
|
+
<CardContent>
|
|
66
|
+
<div style={{ height: "16rem", ...frameStyle }}>
|
|
67
|
+
<ResizablePanelGroup orientation="horizontal">
|
|
68
|
+
<ResizablePanel id="list-panel" defaultSize="35%" minSize="20%" maxSize="60%">
|
|
69
|
+
{/* No inner overflow: the panel is already the scroll container, and letting it own
|
|
70
|
+
the scrolling is what earns the keyboard tab stop ResizablePanel now manages. */}
|
|
71
|
+
<Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
|
|
72
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
73
|
+
請求書リスト
|
|
74
|
+
</Text>
|
|
75
|
+
{[
|
|
76
|
+
{ id: "INV-2024-001", label: "株式会社アルファ", status: "succeeded" },
|
|
77
|
+
{ id: "INV-2024-002", label: "合同会社ベータ", status: "pending" },
|
|
78
|
+
{ id: "INV-2024-003", label: "有限会社ガンマ", status: "scheduled" },
|
|
79
|
+
].map((item) => (
|
|
80
|
+
<Flex key={item.id} direction="row" gap="xs" align="center" justify="between">
|
|
81
|
+
<Flex direction="col" gap="xs">
|
|
82
|
+
<Text weight="medium">{item.id}</Text>
|
|
83
|
+
<Text size="xs" tone="muted">
|
|
84
|
+
{item.label}
|
|
85
|
+
</Text>
|
|
86
|
+
</Flex>
|
|
87
|
+
<Badge status={item.status} />
|
|
88
|
+
</Flex>
|
|
89
|
+
))}
|
|
90
|
+
</Flex>
|
|
91
|
+
</ResizablePanel>
|
|
92
|
+
<ResizableHandle />
|
|
93
|
+
<ResizablePanel id="detail-panel" defaultSize="65%" minSize="40%">
|
|
94
|
+
<Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
|
|
95
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
96
|
+
詳細
|
|
97
|
+
</Text>
|
|
98
|
+
<Text weight="bold">INV-2024-001</Text>
|
|
99
|
+
<Flex direction="col" gap="xs">
|
|
100
|
+
<Text>株式会社アルファ</Text>
|
|
101
|
+
<Text tone="muted">金額: ¥1,320,000(税込)</Text>
|
|
102
|
+
<Text tone="muted">支払期日: 2024-02-28</Text>
|
|
103
|
+
</Flex>
|
|
104
|
+
<Flex direction="row" gap="xs" wrap>
|
|
105
|
+
<Button size="sm">承認</Button>
|
|
106
|
+
<Button size="sm" variant="outline">
|
|
107
|
+
却下
|
|
108
|
+
</Button>
|
|
109
|
+
</Flex>
|
|
110
|
+
</Flex>
|
|
111
|
+
</ResizablePanel>
|
|
112
|
+
</ResizablePanelGroup>
|
|
113
|
+
</div>
|
|
114
|
+
</CardContent>
|
|
115
|
+
</Card>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** orientation="vertical" · top/bottom split with a grip handle. */
|
|
120
|
+
function VerticalCard() {
|
|
121
|
+
return (
|
|
122
|
+
<Card>
|
|
123
|
+
<CardHeader>
|
|
124
|
+
<CardTitle level={2}>垂直分割 · エディタ + プレビュー</CardTitle>
|
|
125
|
+
<CardDescription>
|
|
126
|
+
orientation="vertical" で上下分割。コードエディタ + 出力プレビューやフォーム +
|
|
127
|
+
確認画面などの用途。ResizableHandle に children を渡すとグリップアイコンで掴みやすくなる。
|
|
128
|
+
</CardDescription>
|
|
129
|
+
</CardHeader>
|
|
130
|
+
<CardContent>
|
|
131
|
+
<div style={{ height: "18rem", ...frameStyle }}>
|
|
132
|
+
<ResizablePanelGroup orientation="vertical">
|
|
133
|
+
<ResizablePanel id="editor-panel" defaultSize="50%" minSize="25%">
|
|
134
|
+
<Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
|
|
135
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
136
|
+
仕訳エディタ
|
|
137
|
+
</Text>
|
|
138
|
+
<Flex direction="col" gap="xs">
|
|
139
|
+
<Flex direction="row" gap="sm" align="center" justify="between">
|
|
140
|
+
<Text>売掛金 / 売上高</Text>
|
|
141
|
+
<Badge tone="info">借方 ¥880,000</Badge>
|
|
142
|
+
</Flex>
|
|
143
|
+
<Flex direction="row" gap="sm" align="center" justify="between">
|
|
144
|
+
<Text>仮受消費税 / 売上高</Text>
|
|
145
|
+
<Badge variant="outline">貸方 ¥880,000</Badge>
|
|
146
|
+
</Flex>
|
|
147
|
+
</Flex>
|
|
148
|
+
</Flex>
|
|
149
|
+
</ResizablePanel>
|
|
150
|
+
<ResizableHandle>
|
|
151
|
+
<GripHorizontal aria-hidden="true" size={16} />
|
|
152
|
+
</ResizableHandle>
|
|
153
|
+
<ResizablePanel id="preview-panel" defaultSize="50%" minSize="25%">
|
|
154
|
+
<Flex direction="col" gap="sm" style={{ padding: "1rem", height: "100%" }}>
|
|
155
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
156
|
+
プレビュー
|
|
157
|
+
</Text>
|
|
158
|
+
<Text tone="muted">
|
|
159
|
+
仕訳内容のプレビューがここに表示されます。貸借が一致していることを確認してください。
|
|
160
|
+
</Text>
|
|
161
|
+
<Flex direction="row" gap="xs">
|
|
162
|
+
<Button size="sm">保存</Button>
|
|
163
|
+
<Button size="sm" variant="outline">
|
|
164
|
+
クリア
|
|
165
|
+
</Button>
|
|
166
|
+
</Flex>
|
|
167
|
+
</Flex>
|
|
168
|
+
</ResizablePanel>
|
|
169
|
+
</ResizablePanelGroup>
|
|
170
|
+
</div>
|
|
171
|
+
</CardContent>
|
|
172
|
+
</Card>
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* collapsible + collapsedSize · the sidebar collapses to zero and an imperative
|
|
178
|
+
* panelRef toggle expands/collapses it. Seeded collapsed at rest so the
|
|
179
|
+
* collapsed state is visible in a static screenshot.
|
|
180
|
+
*/
|
|
181
|
+
function CollapsibleCard() {
|
|
182
|
+
const panelRef = React.useRef<PanelImperativeHandle | null>(null);
|
|
183
|
+
const [collapsed, setCollapsed] = React.useState(true);
|
|
184
|
+
|
|
185
|
+
const toggle = () => {
|
|
186
|
+
const panel = panelRef.current;
|
|
187
|
+
if (!panel) return;
|
|
188
|
+
if (panel.isCollapsed()) {
|
|
189
|
+
panel.expand();
|
|
190
|
+
setCollapsed(false);
|
|
191
|
+
} else {
|
|
192
|
+
panel.collapse();
|
|
193
|
+
setCollapsed(true);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<Card>
|
|
199
|
+
<CardHeader>
|
|
200
|
+
<CardTitle level={2}>折りたたみ · collapsible サイドバー</CardTitle>
|
|
201
|
+
<CardDescription>
|
|
202
|
+
collapsible + collapsedSize={0} でサイドバーをゼロまで折りたためる。panelRef の
|
|
203
|
+
collapse()/expand() でトグル。minSize 未満までドラッグしても自動で折りたたまれる。
|
|
204
|
+
</CardDescription>
|
|
205
|
+
</CardHeader>
|
|
206
|
+
<CardContent>
|
|
207
|
+
<Flex direction="col" gap="sm">
|
|
208
|
+
<Flex direction="row" gap="xs" align="center">
|
|
209
|
+
<Button
|
|
210
|
+
size="sm"
|
|
211
|
+
variant="outline"
|
|
212
|
+
onClick={toggle}
|
|
213
|
+
aria-pressed={!collapsed}
|
|
214
|
+
aria-label={collapsed ? "サイドバーを開く" : "サイドバーを閉じる"}
|
|
215
|
+
>
|
|
216
|
+
{collapsed ? (
|
|
217
|
+
<PanelLeftOpen aria-hidden="true" size={16} />
|
|
218
|
+
) : (
|
|
219
|
+
<PanelLeftClose aria-hidden="true" size={16} />
|
|
220
|
+
)}
|
|
221
|
+
{collapsed ? "サイドバーを開く" : "サイドバーを閉じる"}
|
|
222
|
+
</Button>
|
|
223
|
+
<Text size="xs" tone="muted">
|
|
224
|
+
{collapsed ? "折りたたみ中" : "展開中"}
|
|
225
|
+
</Text>
|
|
226
|
+
</Flex>
|
|
227
|
+
<div style={{ height: "14rem", ...frameStyle }}>
|
|
228
|
+
<ResizablePanelGroup orientation="horizontal">
|
|
229
|
+
<ResizablePanel
|
|
230
|
+
panelRef={panelRef}
|
|
231
|
+
id="collapsible-sidebar"
|
|
232
|
+
collapsible
|
|
233
|
+
collapsedSize="0%"
|
|
234
|
+
defaultSize="0%"
|
|
235
|
+
minSize="15%"
|
|
236
|
+
maxSize="30%"
|
|
237
|
+
onResize={(size) => setCollapsed(size.asPercentage === 0)}
|
|
238
|
+
>
|
|
239
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
240
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
241
|
+
ナビゲーション
|
|
242
|
+
</Text>
|
|
243
|
+
{["売上", "仕入", "経費", "固定資産"].map((item) => (
|
|
244
|
+
<Text key={item} size="sm" tone="muted">
|
|
245
|
+
{item}
|
|
246
|
+
</Text>
|
|
247
|
+
))}
|
|
248
|
+
</Flex>
|
|
249
|
+
</ResizablePanel>
|
|
250
|
+
<ResizableHandle>
|
|
251
|
+
<GripVertical aria-hidden="true" size={16} />
|
|
252
|
+
</ResizableHandle>
|
|
253
|
+
<ResizablePanel id="collapsible-main" defaultSize="100%" minSize="40%">
|
|
254
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
255
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
256
|
+
メインコンテンツ
|
|
257
|
+
</Text>
|
|
258
|
+
<Text tone="muted">サイドバーが折りたたまれると本文が全幅に広がる。</Text>
|
|
259
|
+
</Flex>
|
|
260
|
+
</ResizablePanel>
|
|
261
|
+
</ResizablePanelGroup>
|
|
262
|
+
</div>
|
|
263
|
+
</Flex>
|
|
264
|
+
</CardContent>
|
|
265
|
+
</Card>
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* defaultLayout + onLayoutChanged + a stable id · sizes persist across reloads.
|
|
271
|
+
* In v4 a bare id does NOT persist; you must seed defaultLayout and capture
|
|
272
|
+
* onLayoutChanged. Here the saved layout is held in state and echoed on screen.
|
|
273
|
+
*/
|
|
274
|
+
function PersistenceCard() {
|
|
275
|
+
// Layout is a map of panel id -> flexGrow value (relative, not %).
|
|
276
|
+
const [layout, setLayout] = React.useState<Layout>({
|
|
277
|
+
"persisted-nav": 30,
|
|
278
|
+
"persisted-content": 70,
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
const total = Object.values(layout).reduce((sum, n) => sum + n, 0) || 1;
|
|
282
|
+
const ratio = [layout["persisted-nav"], layout["persisted-content"]]
|
|
283
|
+
.map((n) => `${Math.round(((n ?? 0) / total) * 100)}%`)
|
|
284
|
+
.join(" / ");
|
|
285
|
+
|
|
286
|
+
return (
|
|
287
|
+
<Card>
|
|
288
|
+
<CardHeader>
|
|
289
|
+
<CardTitle level={2}>永続化 · defaultLayout + onLayoutChanged</CardTitle>
|
|
290
|
+
<CardDescription>
|
|
291
|
+
v4 では id 単体ではサイズは保存されない。defaultLayout で初期サイズを与え、onLayoutChanged
|
|
292
|
+
を localStorage 等に保存して復元する。現在の比率: {ratio}。
|
|
293
|
+
</CardDescription>
|
|
294
|
+
</CardHeader>
|
|
295
|
+
<CardContent>
|
|
296
|
+
<div style={{ height: "14rem", ...frameStyle }}>
|
|
297
|
+
<ResizablePanelGroup
|
|
298
|
+
id="persisted-group"
|
|
299
|
+
orientation="horizontal"
|
|
300
|
+
defaultLayout={layout}
|
|
301
|
+
onLayoutChanged={setLayout}
|
|
302
|
+
>
|
|
303
|
+
<ResizablePanel id="persisted-nav" defaultSize="30%" minSize="20%" maxSize="50%">
|
|
304
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
305
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
306
|
+
勘定科目
|
|
307
|
+
</Text>
|
|
308
|
+
<Text tone="muted">この比率は保存されます。</Text>
|
|
309
|
+
</Flex>
|
|
310
|
+
</ResizablePanel>
|
|
311
|
+
<ResizableHandle />
|
|
312
|
+
<ResizablePanel id="persisted-content" defaultSize="70%" minSize="30%">
|
|
313
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
314
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
315
|
+
仕訳一覧
|
|
316
|
+
</Text>
|
|
317
|
+
<Text tone="muted">ハンドルを動かすと上の比率表示が即時に更新される。</Text>
|
|
318
|
+
</Flex>
|
|
319
|
+
</ResizablePanel>
|
|
320
|
+
</ResizablePanelGroup>
|
|
321
|
+
</div>
|
|
322
|
+
</CardContent>
|
|
323
|
+
</Card>
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* disabled · read-only layout. Group disabled freezes all panels; an individual
|
|
329
|
+
* Separator can be disabled, and disableDoubleClick suppresses double-click reset.
|
|
330
|
+
*/
|
|
331
|
+
function DisabledCard() {
|
|
332
|
+
return (
|
|
333
|
+
<Card>
|
|
334
|
+
<CardHeader>
|
|
335
|
+
<CardTitle level={2}>無効化 · disabled / disableDoubleClick</CardTitle>
|
|
336
|
+
<CardDescription>
|
|
337
|
+
ResizablePanelGroup に disabled
|
|
338
|
+
を渡すとレイアウトを固定(読み取り専用)にできる。Separator 単位の
|
|
339
|
+
disabled、ダブルクリックでのリセットを抑止する disableDoubleClick
|
|
340
|
+
もある。下の例はハンドルがグレーアウトし操作できない。
|
|
341
|
+
</CardDescription>
|
|
342
|
+
</CardHeader>
|
|
343
|
+
<CardContent>
|
|
344
|
+
<div style={{ height: "12rem", ...frameStyle }}>
|
|
345
|
+
<ResizablePanelGroup orientation="horizontal" disabled>
|
|
346
|
+
<ResizablePanel id="disabled-left" defaultSize="40%" minSize="20%">
|
|
347
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
348
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
349
|
+
確定済みレイアウト
|
|
350
|
+
</Text>
|
|
351
|
+
<Text tone="muted">承認後は配置を変更できません。</Text>
|
|
352
|
+
</Flex>
|
|
353
|
+
</ResizablePanel>
|
|
354
|
+
<ResizableHandle disabled disableDoubleClick />
|
|
355
|
+
<ResizablePanel id="disabled-right" defaultSize="60%" minSize="20%">
|
|
356
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
357
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
358
|
+
プレビュー
|
|
359
|
+
</Text>
|
|
360
|
+
<Text tone="muted">読み取り専用ビュー。</Text>
|
|
361
|
+
</Flex>
|
|
362
|
+
</ResizablePanel>
|
|
363
|
+
</ResizablePanelGroup>
|
|
364
|
+
</div>
|
|
365
|
+
</CardContent>
|
|
366
|
+
</Card>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** Three panes · multiple handles compose 3+ panes (IDE-style layout). */
|
|
371
|
+
function ThreePaneCard() {
|
|
372
|
+
return (
|
|
373
|
+
<Card>
|
|
374
|
+
<CardHeader>
|
|
375
|
+
<CardTitle level={2}>3ペイン · サイドバー + メイン + インスペクタ</CardTitle>
|
|
376
|
+
<CardDescription>
|
|
377
|
+
ResizableHandle を複数配置することで3ペイン以上に分割できる。IDE
|
|
378
|
+
スタイルのコードエディタやダッシュボードビルダーに適している。
|
|
379
|
+
</CardDescription>
|
|
380
|
+
</CardHeader>
|
|
381
|
+
<CardContent>
|
|
382
|
+
<div style={{ height: "14rem", ...frameStyle }}>
|
|
383
|
+
<ResizablePanelGroup orientation="horizontal">
|
|
384
|
+
<ResizablePanel id="sidebar-3pane" defaultSize="20%" minSize="15%" maxSize="30%">
|
|
385
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
386
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
387
|
+
ナビゲーション
|
|
388
|
+
</Text>
|
|
389
|
+
{["売上", "仕入", "経費", "固定資産"].map((item) => (
|
|
390
|
+
<Text key={item} size="sm" tone="muted">
|
|
391
|
+
{item}
|
|
392
|
+
</Text>
|
|
393
|
+
))}
|
|
394
|
+
</Flex>
|
|
395
|
+
</ResizablePanel>
|
|
396
|
+
<ResizableHandle />
|
|
397
|
+
<ResizablePanel id="main-3pane" defaultSize="55%" minSize="30%">
|
|
398
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
399
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
400
|
+
メインコンテンツ
|
|
401
|
+
</Text>
|
|
402
|
+
<Text tone="muted">勘定科目ツリーや仕訳一覧</Text>
|
|
403
|
+
</Flex>
|
|
404
|
+
</ResizablePanel>
|
|
405
|
+
<ResizableHandle />
|
|
406
|
+
<ResizablePanel id="inspector-3pane" defaultSize="25%" minSize="15%" maxSize="40%">
|
|
407
|
+
<Flex direction="col" gap="xs" style={{ padding: "0.75rem", height: "100%" }}>
|
|
408
|
+
<Text size="xs" weight="medium" tone="muted">
|
|
409
|
+
インスペクタ
|
|
410
|
+
</Text>
|
|
411
|
+
<Text tone="muted">選択項目の詳細・メタデータ</Text>
|
|
412
|
+
</Flex>
|
|
413
|
+
</ResizablePanel>
|
|
414
|
+
</ResizablePanelGroup>
|
|
415
|
+
</div>
|
|
416
|
+
</CardContent>
|
|
417
|
+
</Card>
|
|
418
|
+
);
|
|
419
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Card,
|
|
3
|
+
CardContent,
|
|
4
|
+
CardDescription,
|
|
5
|
+
CardHeader,
|
|
6
|
+
CardTitle,
|
|
7
|
+
StatCard,
|
|
8
|
+
} from "@godxjp/ui/data-display";
|
|
9
|
+
import { Text } from "@godxjp/ui/general";
|
|
10
|
+
import { Flex, PageContainer, ResponsiveGrid, SplitPane } from "@godxjp/ui/layout";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* ResponsiveGrid · equal-width multi-column tile grid with automatic responsive
|
|
14
|
+
* collapse (CSS container queries, not viewport). It OWNS its query container
|
|
15
|
+
* (container-type: inline-size), so it responds to the width available to the grid
|
|
16
|
+
* with no external container-type declaration (gh#165). Direct children are typically
|
|
17
|
+
* StatCard (self-contained bordered card · never wrap in Card/CardContent) or
|
|
18
|
+
* Card+CardContent for richer tile bodies. columns accepts a number OR breakpoint
|
|
19
|
+
* object { sm?, md?, lg? } — or use the named `preset` prop (e.g. "pricing-plans") for a
|
|
20
|
+
* recognised collection shape instead of hand-rolling the breakpoint map. Composed only from
|
|
21
|
+
* real @godxjp/ui components.
|
|
22
|
+
*/
|
|
23
|
+
export default function Demo() {
|
|
24
|
+
return (
|
|
25
|
+
<PageContainer
|
|
26
|
+
title="ResponsiveGrid"
|
|
27
|
+
subtitle="等幅タイルグリッド · KPI・カード比較・ダッシュボード行"
|
|
28
|
+
>
|
|
29
|
+
<Flex direction="col" gap="lg">
|
|
30
|
+
<Card>
|
|
31
|
+
<CardHeader>
|
|
32
|
+
<CardTitle level={2}>コンテナクエリで折り返し(自己所有のクエリコンテナ)</CardTitle>
|
|
33
|
+
<CardDescription>
|
|
34
|
+
同じ columns={4} でも、コンテナ幅で列数が変わる。左の広い領域は 4
|
|
35
|
+
列、右の狭いサイドバー(約 20rem)は 1 列に折り返す。ビューポート幅は同一なので、
|
|
36
|
+
折り返しの基準がコンテナ幅であることが分かる。ResponsiveGrid は自身のクエリコンテナ
|
|
37
|
+
(container-type: inline-size)を持つため、外側に @container を用意しなくても正しく
|
|
38
|
+
折り返す(gh#165)。閾値はコンテナ幅 40 / 48 / 64rem。 列間の gap は
|
|
39
|
+
var(--space-stack-md) に固定で、prop では変更できない。
|
|
40
|
+
</CardDescription>
|
|
41
|
+
</CardHeader>
|
|
42
|
+
<CardContent>
|
|
43
|
+
<SplitPane
|
|
44
|
+
asideWidth="sm"
|
|
45
|
+
aside={
|
|
46
|
+
<Flex direction="col" gap="sm">
|
|
47
|
+
<Text tone="muted">狭いコンテナ(約 20rem)→ sm=1 列</Text>
|
|
48
|
+
{/* No wrapping `@container` needed — ResponsiveGrid OWNS its query container (gh#165). */}
|
|
49
|
+
<ResponsiveGrid columns={4}>
|
|
50
|
+
<StatCard label="今日の入金" value="¥420,000" />
|
|
51
|
+
<StatCard label="未処理" value="6 件" />
|
|
52
|
+
</ResponsiveGrid>
|
|
53
|
+
</Flex>
|
|
54
|
+
}
|
|
55
|
+
>
|
|
56
|
+
<Flex direction="col" gap="sm">
|
|
57
|
+
<Text tone="muted">広いコンテナ → lg=4 列</Text>
|
|
58
|
+
<ResponsiveGrid columns={4}>
|
|
59
|
+
<StatCard label="月次売上" value="¥12,400,000" delta="+8%" hint="先月比" />
|
|
60
|
+
<StatCard label="請求件数" value="486" delta="+12%" />
|
|
61
|
+
<StatCard label="売掛金残高" value="¥3,180,000" hint="未回収 23件" />
|
|
62
|
+
<StatCard label="回収率" value="97.2%" delta="+0.4%" />
|
|
63
|
+
</ResponsiveGrid>
|
|
64
|
+
</Flex>
|
|
65
|
+
</SplitPane>
|
|
66
|
+
</CardContent>
|
|
67
|
+
</Card>
|
|
68
|
+
|
|
69
|
+
<Card>
|
|
70
|
+
<CardHeader>
|
|
71
|
+
<CardTitle level={2}>Container stress · 320 / 768px 相当(外側コンテナ不要)</CardTitle>
|
|
72
|
+
<CardDescription>
|
|
73
|
+
固定幅の親の中でも、同じ columns={4} が親幅で列数を変える。親には
|
|
74
|
+
container-type を付けていない。ResponsiveGrid が自身のスコープでクエリするため、
|
|
75
|
+
外側にコンテナ宣言がなくても 1 列に潰れない(gh#165)。
|
|
76
|
+
</CardDescription>
|
|
77
|
+
</CardHeader>
|
|
78
|
+
<CardContent>
|
|
79
|
+
<Flex direction="col" gap="md">
|
|
80
|
+
{["max-w-80", "max-w-3xl"].map((width) => (
|
|
81
|
+
<div key={width} className={`${width} border p-2`}>
|
|
82
|
+
<ResponsiveGrid columns={4}>
|
|
83
|
+
{Array.from({ length: 4 }, (_, index) => (
|
|
84
|
+
<div key={index} className="bg-muted rounded p-3 text-center">
|
|
85
|
+
{index + 1}
|
|
86
|
+
</div>
|
|
87
|
+
))}
|
|
88
|
+
</ResponsiveGrid>
|
|
89
|
+
</div>
|
|
90
|
+
))}
|
|
91
|
+
</Flex>
|
|
92
|
+
</CardContent>
|
|
93
|
+
</Card>
|
|
94
|
+
|
|
95
|
+
<Card>
|
|
96
|
+
<CardHeader>
|
|
97
|
+
<CardTitle level={2}>columns={4} · KPI 行(StatCard 直置き)</CardTitle>
|
|
98
|
+
<CardDescription>
|
|
99
|
+
StatCard は自身がボーダー付き Card なので Card/CardContent でラップしない。 columns
|
|
100
|
+
数値指定時は sm=min(n,2) / md=min(n,3) / lg=n に自動変換。
|
|
101
|
+
</CardDescription>
|
|
102
|
+
</CardHeader>
|
|
103
|
+
<CardContent>
|
|
104
|
+
<ResponsiveGrid columns={4}>
|
|
105
|
+
<StatCard label="月次売上" value="¥12,400,000" delta="+8%" hint="先月比" />
|
|
106
|
+
<StatCard label="請求件数" value="486" delta="+12%" />
|
|
107
|
+
<StatCard label="売掛金残高" value="¥3,180,000" hint="未回収 23件" />
|
|
108
|
+
<StatCard label="回収率" value="97.2%" delta="+0.4%" />
|
|
109
|
+
</ResponsiveGrid>
|
|
110
|
+
</CardContent>
|
|
111
|
+
</Card>
|
|
112
|
+
|
|
113
|
+
<Card>
|
|
114
|
+
<CardHeader>
|
|
115
|
+
<CardTitle level={2}>columns={3} · 法人比較(Card+CardContent)</CardTitle>
|
|
116
|
+
<CardDescription>
|
|
117
|
+
StatCard 以外のリッチなタイルは Card+CardContent で構成。 columns={3} → sm=2
|
|
118
|
+
/ md=3 / lg=3 に自動変換。
|
|
119
|
+
</CardDescription>
|
|
120
|
+
</CardHeader>
|
|
121
|
+
<CardContent>
|
|
122
|
+
<ResponsiveGrid columns={3}>
|
|
123
|
+
<Card>
|
|
124
|
+
<CardHeader>
|
|
125
|
+
<CardTitle>東京本社</CardTitle>
|
|
126
|
+
<CardDescription>JP-001</CardDescription>
|
|
127
|
+
</CardHeader>
|
|
128
|
+
<CardContent>
|
|
129
|
+
<Flex direction="col" gap="xs">
|
|
130
|
+
<Text>売上: ¥8,200,000</Text>
|
|
131
|
+
<Text tone="muted">取引先: 124社</Text>
|
|
132
|
+
</Flex>
|
|
133
|
+
</CardContent>
|
|
134
|
+
</Card>
|
|
135
|
+
<Card>
|
|
136
|
+
<CardHeader>
|
|
137
|
+
<CardTitle>大阪支社</CardTitle>
|
|
138
|
+
<CardDescription>JP-002</CardDescription>
|
|
139
|
+
</CardHeader>
|
|
140
|
+
<CardContent>
|
|
141
|
+
<Flex direction="col" gap="xs">
|
|
142
|
+
<Text>売上: ¥3,100,000</Text>
|
|
143
|
+
<Text tone="muted">取引先: 57社</Text>
|
|
144
|
+
</Flex>
|
|
145
|
+
</CardContent>
|
|
146
|
+
</Card>
|
|
147
|
+
<Card>
|
|
148
|
+
<CardHeader>
|
|
149
|
+
<CardTitle>福岡拠点</CardTitle>
|
|
150
|
+
<CardDescription>JP-003</CardDescription>
|
|
151
|
+
</CardHeader>
|
|
152
|
+
<CardContent>
|
|
153
|
+
<Flex direction="col" gap="xs">
|
|
154
|
+
<Text>売上: ¥1,060,000</Text>
|
|
155
|
+
<Text tone="muted">取引先: 31社</Text>
|
|
156
|
+
</Flex>
|
|
157
|
+
</CardContent>
|
|
158
|
+
</Card>
|
|
159
|
+
</ResponsiveGrid>
|
|
160
|
+
</CardContent>
|
|
161
|
+
</Card>
|
|
162
|
+
|
|
163
|
+
<Card>
|
|
164
|
+
<CardHeader>
|
|
165
|
+
<CardTitle level={2}>
|
|
166
|
+
columns={{ sm: 1, md: 2, lg: 4 }} ·
|
|
167
|
+
ブレークポイントオブジェクト(3 段制御)
|
|
168
|
+
</CardTitle>
|
|
169
|
+
<CardDescription>
|
|
170
|
+
ブレークポイント指定オブジェクト: sm / md / lg
|
|
171
|
+
キーでコンテナ幅ごとの列数を個別に制御。
|
|
172
|
+
未指定キーは下位にフォールバック(lg→md→sm、md→sm、sm 既定 1)。 数値指定(sm=min(n,2)
|
|
173
|
+
/ md=min(n,3) / lg=n の自動変換)では作れない 「sm=1 / md=2 /
|
|
174
|
+
lg=4」のような任意の組み合わせを表現できる。
|
|
175
|
+
</CardDescription>
|
|
176
|
+
</CardHeader>
|
|
177
|
+
<CardContent>
|
|
178
|
+
<ResponsiveGrid columns={{ sm: 1, md: 2, lg: 4 }}>
|
|
179
|
+
<StatCard layout="inline" label="契約金額" value="¥4,800,000" />
|
|
180
|
+
<StatCard layout="inline" label="消費税額" value="¥480,000" hint="税率 10%" />
|
|
181
|
+
<StatCard layout="inline" label="支払済" value="¥2,400,000" delta="-50%" inverse />
|
|
182
|
+
<StatCard layout="inline" label="残額" value="¥2,400,000" />
|
|
183
|
+
</ResponsiveGrid>
|
|
184
|
+
</CardContent>
|
|
185
|
+
</Card>
|
|
186
|
+
|
|
187
|
+
<Card>
|
|
188
|
+
<CardHeader>
|
|
189
|
+
<CardTitle level={2}>
|
|
190
|
+
preset="pricing-plans" · 課金プラン一覧(3/3/1)
|
|
191
|
+
</CardTitle>
|
|
192
|
+
<CardDescription>
|
|
193
|
+
名前付きコレクション geometry: コンテナ幅が lg ステップ(64rem)に達するまでは 1
|
|
194
|
+
列、そこから 3 列に切り替わる。ResponsiveGrid には lg
|
|
195
|
+
より上のステップが無いため、1024px 相当でも 1440px 相当でも同じ 3 列になる —
|
|
196
|
+
課金プランカタログの「3/3/1」契約 (dxs-platform/platform#333)。`columns` の代わりに
|
|
197
|
+
`preset` を渡すだけで、呼び出し側がブレークポイント値を自作する必要がない。
|
|
198
|
+
</CardDescription>
|
|
199
|
+
</CardHeader>
|
|
200
|
+
<CardContent>
|
|
201
|
+
<ResponsiveGrid preset="pricing-plans">
|
|
202
|
+
<Card>
|
|
203
|
+
<CardHeader>
|
|
204
|
+
<CardTitle>スタンダード</CardTitle>
|
|
205
|
+
<CardDescription>¥9,800 / 月</CardDescription>
|
|
206
|
+
</CardHeader>
|
|
207
|
+
<CardContent>
|
|
208
|
+
<Text tone="muted">小規模チーム向けの基本プラン。</Text>
|
|
209
|
+
</CardContent>
|
|
210
|
+
</Card>
|
|
211
|
+
<Card>
|
|
212
|
+
<CardHeader>
|
|
213
|
+
<CardTitle>プロフェッショナル</CardTitle>
|
|
214
|
+
<CardDescription>¥29,800 / 月</CardDescription>
|
|
215
|
+
</CardHeader>
|
|
216
|
+
<CardContent>
|
|
217
|
+
<Text tone="muted">成長企業向けの推奨プラン。</Text>
|
|
218
|
+
</CardContent>
|
|
219
|
+
</Card>
|
|
220
|
+
<Card>
|
|
221
|
+
<CardHeader>
|
|
222
|
+
<CardTitle>エンタープライズ</CardTitle>
|
|
223
|
+
<CardDescription>お問い合わせ</CardDescription>
|
|
224
|
+
</CardHeader>
|
|
225
|
+
<CardContent>
|
|
226
|
+
<Text tone="muted">大規模組織向けのカスタムプラン。</Text>
|
|
227
|
+
</CardContent>
|
|
228
|
+
</Card>
|
|
229
|
+
</ResponsiveGrid>
|
|
230
|
+
</CardContent>
|
|
231
|
+
</Card>
|
|
232
|
+
</Flex>
|
|
233
|
+
</PageContainer>
|
|
234
|
+
);
|
|
235
|
+
}
|