@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,193 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
Dialog,
|
|
4
|
+
DialogContent,
|
|
5
|
+
DialogDescription,
|
|
6
|
+
DialogFooter,
|
|
7
|
+
DialogHeader,
|
|
8
|
+
DialogTitle,
|
|
9
|
+
DialogTrigger,
|
|
10
|
+
} from "@godxjp/ui/feedback";
|
|
11
|
+
import {
|
|
12
|
+
Badge,
|
|
13
|
+
Card,
|
|
14
|
+
CardContent,
|
|
15
|
+
CardDescription,
|
|
16
|
+
CardHeader,
|
|
17
|
+
CardTitle,
|
|
18
|
+
} from "@godxjp/ui/data-display";
|
|
19
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
20
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
21
|
+
|
|
22
|
+
/** Every branch of DialogHeader's `tone`, in the order the vocabulary declares them. */
|
|
23
|
+
const headerTones = [
|
|
24
|
+
"default",
|
|
25
|
+
"success",
|
|
26
|
+
"warning",
|
|
27
|
+
"destructive",
|
|
28
|
+
"info",
|
|
29
|
+
"muted",
|
|
30
|
+
"neutral",
|
|
31
|
+
] as const;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Dialog · compound controlled modal for form-style flows. Always control via
|
|
35
|
+
* open + onOpenChange. Include DialogHeader > DialogTitle (required for a11y).
|
|
36
|
+
* Use DialogFooter for primary/cancel actions.
|
|
37
|
+
*/
|
|
38
|
+
export default function Demo() {
|
|
39
|
+
const [createOpen, setCreateOpen] = useState(true);
|
|
40
|
+
const [detailOpen, setDetailOpen] = useState(false);
|
|
41
|
+
const [toneOpen, setToneOpen] = useState(false);
|
|
42
|
+
const [headerTone, setHeaderTone] = useState<(typeof headerTones)[number]>("default");
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<PageContainer
|
|
46
|
+
title="Dialog"
|
|
47
|
+
subtitle="compound modal · form flows, detail pop-ups, multi-step wizards"
|
|
48
|
+
>
|
|
49
|
+
<Flex direction="col" gap="lg">
|
|
50
|
+
<Card>
|
|
51
|
+
<CardHeader>
|
|
52
|
+
<CardTitle level={2}>Form-style modal (pre-opened)</CardTitle>
|
|
53
|
+
<CardDescription>
|
|
54
|
+
Controlled via open + onOpenChange. DialogTitle is required for screen-reader
|
|
55
|
+
accessibility. Hold open while pending to prevent double-submit.
|
|
56
|
+
</CardDescription>
|
|
57
|
+
</CardHeader>
|
|
58
|
+
<CardContent>
|
|
59
|
+
<Dialog open={createOpen} onOpenChange={setCreateOpen}>
|
|
60
|
+
<DialogTrigger asChild>
|
|
61
|
+
<Button size="sm">仕訳新規作成</Button>
|
|
62
|
+
</DialogTrigger>
|
|
63
|
+
<DialogContent className="max-w-lg">
|
|
64
|
+
<DialogHeader>
|
|
65
|
+
<DialogTitle>新規仕訳を作成</DialogTitle>
|
|
66
|
+
<DialogDescription>
|
|
67
|
+
借方・貸方科目と金額を入力して保存してください。
|
|
68
|
+
</DialogDescription>
|
|
69
|
+
</DialogHeader>
|
|
70
|
+
<Flex direction="col" gap="md">
|
|
71
|
+
<Flex direction="row" gap="sm" align="center">
|
|
72
|
+
<Text tone="muted" className="w-20 shrink-0">
|
|
73
|
+
借方科目
|
|
74
|
+
</Text>
|
|
75
|
+
<Text>売掛金</Text>
|
|
76
|
+
</Flex>
|
|
77
|
+
<Flex direction="row" gap="sm" align="center">
|
|
78
|
+
<Text tone="muted" className="w-20 shrink-0">
|
|
79
|
+
貸方科目
|
|
80
|
+
</Text>
|
|
81
|
+
<Text>売上高</Text>
|
|
82
|
+
</Flex>
|
|
83
|
+
<Flex direction="row" gap="sm" align="center">
|
|
84
|
+
<Text tone="muted" className="w-20 shrink-0">
|
|
85
|
+
金額
|
|
86
|
+
</Text>
|
|
87
|
+
<Text>¥ 120,000</Text>
|
|
88
|
+
</Flex>
|
|
89
|
+
</Flex>
|
|
90
|
+
<DialogFooter>
|
|
91
|
+
<Button variant="outline" onClick={() => setCreateOpen(false)}>
|
|
92
|
+
キャンセル
|
|
93
|
+
</Button>
|
|
94
|
+
<Button onClick={() => setCreateOpen(false)}>保存</Button>
|
|
95
|
+
</DialogFooter>
|
|
96
|
+
</DialogContent>
|
|
97
|
+
</Dialog>
|
|
98
|
+
</CardContent>
|
|
99
|
+
</Card>
|
|
100
|
+
|
|
101
|
+
<Card>
|
|
102
|
+
<CardHeader>
|
|
103
|
+
<CardTitle level={2}>Read-only detail pop-up</CardTitle>
|
|
104
|
+
<CardDescription>
|
|
105
|
+
No footer action buttons needed, just a close trigger. Suitable for audit trail,
|
|
106
|
+
attachment preview, or approval history.
|
|
107
|
+
</CardDescription>
|
|
108
|
+
</CardHeader>
|
|
109
|
+
<CardContent>
|
|
110
|
+
<Dialog open={detailOpen} onOpenChange={setDetailOpen}>
|
|
111
|
+
<DialogTrigger asChild>
|
|
112
|
+
<Button variant="outline" size="sm">
|
|
113
|
+
取引詳細を見る
|
|
114
|
+
</Button>
|
|
115
|
+
</DialogTrigger>
|
|
116
|
+
<DialogContent className="max-w-md">
|
|
117
|
+
<DialogHeader>
|
|
118
|
+
<DialogTitle>取引 #JE-2024-0042</DialogTitle>
|
|
119
|
+
<DialogDescription>2024年3月31日 · 月次決算仕訳</DialogDescription>
|
|
120
|
+
</DialogHeader>
|
|
121
|
+
<Flex direction="col" gap="sm">
|
|
122
|
+
<Flex direction="row" justify="between">
|
|
123
|
+
<Text tone="muted">借方</Text>
|
|
124
|
+
<Text>売掛金 ¥ 240,000</Text>
|
|
125
|
+
</Flex>
|
|
126
|
+
<Flex direction="row" justify="between">
|
|
127
|
+
<Text tone="muted">貸方</Text>
|
|
128
|
+
<Text>売上高 ¥ 240,000</Text>
|
|
129
|
+
</Flex>
|
|
130
|
+
<Flex direction="row" justify="between">
|
|
131
|
+
<Text tone="muted">摘要</Text>
|
|
132
|
+
<Text>3月売上計上</Text>
|
|
133
|
+
</Flex>
|
|
134
|
+
</Flex>
|
|
135
|
+
</DialogContent>
|
|
136
|
+
</Dialog>
|
|
137
|
+
</CardContent>
|
|
138
|
+
</Card>
|
|
139
|
+
|
|
140
|
+
<Card>
|
|
141
|
+
<CardHeader>
|
|
142
|
+
<CardTitle level={2}>DialogHeader tone band (every branch)</CardTitle>
|
|
143
|
+
<CardDescription>
|
|
144
|
+
DialogHeader also takes a prop-driven form: title, subtitle and an extra slot, plus
|
|
145
|
+
tone. tone tints only the header band and leaves the text at the foreground colour, so
|
|
146
|
+
the dialog never turns into a loud solid fill. default paints no band at all; muted
|
|
147
|
+
and neutral deliberately share the same quiet band. Close the pre-opened dialog above
|
|
148
|
+
with Escape, then pick a branch: the same dialog re-opens with that header.
|
|
149
|
+
</CardDescription>
|
|
150
|
+
</CardHeader>
|
|
151
|
+
<CardContent>
|
|
152
|
+
<Flex direction="col" gap="md">
|
|
153
|
+
<Flex direction="row" gap="sm" wrap>
|
|
154
|
+
{headerTones.map((tone) => (
|
|
155
|
+
<Button
|
|
156
|
+
key={tone}
|
|
157
|
+
variant="outline"
|
|
158
|
+
size="sm"
|
|
159
|
+
onClick={() => {
|
|
160
|
+
setHeaderTone(tone);
|
|
161
|
+
setToneOpen(true);
|
|
162
|
+
}}
|
|
163
|
+
>
|
|
164
|
+
{tone}
|
|
165
|
+
</Button>
|
|
166
|
+
))}
|
|
167
|
+
</Flex>
|
|
168
|
+
<Dialog open={toneOpen} onOpenChange={setToneOpen}>
|
|
169
|
+
<DialogContent className="max-w-md">
|
|
170
|
+
<DialogHeader
|
|
171
|
+
tone={headerTone}
|
|
172
|
+
title="仕訳の取り込み結果"
|
|
173
|
+
subtitle={`見出し帯は tone="${headerTone}" で描画しています。`}
|
|
174
|
+
extra={<Badge tone={headerTone}>{headerTone}</Badge>}
|
|
175
|
+
/>
|
|
176
|
+
<Text size="sm">
|
|
177
|
+
帯の色だけが tone に追従し、見出しと本文の文字色は変わりません。extra
|
|
178
|
+
スロットは帯の右端に固定され、閉じるボタンとは重なりません。
|
|
179
|
+
</Text>
|
|
180
|
+
<DialogFooter>
|
|
181
|
+
<Button variant="outline" onClick={() => setToneOpen(false)}>
|
|
182
|
+
閉じる
|
|
183
|
+
</Button>
|
|
184
|
+
</DialogFooter>
|
|
185
|
+
</DialogContent>
|
|
186
|
+
</Dialog>
|
|
187
|
+
</Flex>
|
|
188
|
+
</CardContent>
|
|
189
|
+
</Card>
|
|
190
|
+
</Flex>
|
|
191
|
+
</PageContainer>
|
|
192
|
+
);
|
|
193
|
+
}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
Sheet,
|
|
4
|
+
SheetBody,
|
|
5
|
+
SheetContent,
|
|
6
|
+
SheetDescription,
|
|
7
|
+
SheetFooter,
|
|
8
|
+
SheetHeader,
|
|
9
|
+
SheetTitle,
|
|
10
|
+
SheetTrigger,
|
|
11
|
+
useSheetResponsiveMode,
|
|
12
|
+
} from "@godxjp/ui/feedback";
|
|
13
|
+
import {
|
|
14
|
+
Badge,
|
|
15
|
+
Card,
|
|
16
|
+
CardContent,
|
|
17
|
+
CardDescription,
|
|
18
|
+
CardHeader,
|
|
19
|
+
CardTitle,
|
|
20
|
+
} from "@godxjp/ui/data-display";
|
|
21
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
22
|
+
import {
|
|
23
|
+
FormField,
|
|
24
|
+
Input,
|
|
25
|
+
Select,
|
|
26
|
+
SelectContent,
|
|
27
|
+
SelectItem,
|
|
28
|
+
SelectTrigger,
|
|
29
|
+
SelectValue,
|
|
30
|
+
} from "@godxjp/ui/data-entry";
|
|
31
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
32
|
+
import { SlidersHorizontal } from "lucide-react";
|
|
33
|
+
|
|
34
|
+
/** Every branch of SheetHeader's `tone`, in the order the vocabulary declares them. */
|
|
35
|
+
const headerTones = [
|
|
36
|
+
"default",
|
|
37
|
+
"success",
|
|
38
|
+
"warning",
|
|
39
|
+
"destructive",
|
|
40
|
+
"info",
|
|
41
|
+
"muted",
|
|
42
|
+
"neutral",
|
|
43
|
+
] as const;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Sheet · side-panel drawer (Radix Dialog). Slides in from an edge. Compose
|
|
47
|
+
* Sheet > SheetTrigger (asChild) > SheetContent(side) > SheetHeader >
|
|
48
|
+
* SheetTitle (a11y required) > scrollable body > SheetFooter.
|
|
49
|
+
*
|
|
50
|
+
* SheetFooter is an Ant-Design-style PINNED action bar: it sticks to the bottom
|
|
51
|
+
* via mt-auto, draws a full-bleed top border, and right-aligns its actions with
|
|
52
|
+
* the PRIMARY button rightmost. A destructive / clear / reset action goes
|
|
53
|
+
* far-LEFT · give THAT button className="me-auto". Never stack footer buttons
|
|
54
|
+
* full-width or center them. See cardinal rule #41 "Drawer & dialog footer layout".
|
|
55
|
+
*
|
|
56
|
+
* Fields are real FormField + Input + Select primitives · never faked with
|
|
57
|
+
* styled <span>/<div>. Composed only from real @godxjp/ui components.
|
|
58
|
+
*/
|
|
59
|
+
export default function Demo() {
|
|
60
|
+
// Card 1 · pre-opened so the pinned footer + clear-left/apply-right layout is visible at rest.
|
|
61
|
+
const [filterOpen, setFilterOpen] = useState(true);
|
|
62
|
+
const [account, setAccount] = useState("all");
|
|
63
|
+
const [status, setStatus] = useState("all");
|
|
64
|
+
const [source, setSource] = useState("all");
|
|
65
|
+
const [minAmount, setMinAmount] = useState("");
|
|
66
|
+
const [maxAmount, setMaxAmount] = useState("");
|
|
67
|
+
|
|
68
|
+
// Card 2 · quick-edit form: Cancel + Save, both right-aligned (primary rightmost).
|
|
69
|
+
const [editOpen, setEditOpen] = useState(false);
|
|
70
|
+
const [companyName, setCompanyName] = useState("株式会社サンプル");
|
|
71
|
+
const [registration, setRegistration] = useState("T1234567890123");
|
|
72
|
+
|
|
73
|
+
// Card 3 · edit with a destructive action: 削除 far-left (mr-auto), Cancel + Save right.
|
|
74
|
+
const [recordOpen, setRecordOpen] = useState(false);
|
|
75
|
+
const [memo, setMemo] = useState("4月度 経費精算");
|
|
76
|
+
|
|
77
|
+
// Card 4 · responsive detail panel. The SAME hook SheetContent uses, so the label below always
|
|
78
|
+
// reports the presentation the panel will actually render — resize the frame to 390 to see it flip.
|
|
79
|
+
const [detailOpen, setDetailOpen] = useState(false);
|
|
80
|
+
const presentation = useSheetResponsiveMode("auto");
|
|
81
|
+
|
|
82
|
+
// Card 5 · SheetHeader tone band. One panel, re-opened per branch, so only one overlay is ever
|
|
83
|
+
// mounted and the focus trap stays honest.
|
|
84
|
+
const [toneOpen, setToneOpen] = useState(false);
|
|
85
|
+
const [headerTone, setHeaderTone] = useState<(typeof headerTones)[number]>("default");
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<PageContainer
|
|
89
|
+
title="Sheet"
|
|
90
|
+
subtitle="side-panel drawer · filters, quick-edit, detail peek (NOT a Dialog replacement)"
|
|
91
|
+
>
|
|
92
|
+
<Flex direction="col" gap="lg">
|
|
93
|
+
<Card>
|
|
94
|
+
<CardHeader>
|
|
95
|
+
<CardTitle level={2}>Advanced filter (pre-opened, side=right)</CardTitle>
|
|
96
|
+
<CardDescription>
|
|
97
|
+
The defining footer pattern: actions are end-aligned, the primary 適用 is last, and
|
|
98
|
+
the clear/reset action クリア moves to the leading edge via
|
|
99
|
+
className="me-auto". The footer is pinned to the bottom with a full-bleed
|
|
100
|
+
top border; the body scrolls between a fixed header and footer (header inset == footer
|
|
101
|
+
inset). Fields are real FormField + Select + Input.
|
|
102
|
+
</CardDescription>
|
|
103
|
+
</CardHeader>
|
|
104
|
+
<CardContent>
|
|
105
|
+
<Sheet open={filterOpen} onOpenChange={setFilterOpen}>
|
|
106
|
+
<SheetTrigger asChild>
|
|
107
|
+
<Button variant="outline" size="sm">
|
|
108
|
+
<SlidersHorizontal />
|
|
109
|
+
詳細検索
|
|
110
|
+
</Button>
|
|
111
|
+
</SheetTrigger>
|
|
112
|
+
<SheetContent side="right" width={420}>
|
|
113
|
+
<SheetHeader
|
|
114
|
+
tone="info"
|
|
115
|
+
title="詳細検索"
|
|
116
|
+
subtitle="条件を組み合わせて仕訳を絞り込みます。"
|
|
117
|
+
extra={<Badge tone="info">3 条件</Badge>}
|
|
118
|
+
/>
|
|
119
|
+
<SheetBody className="flex flex-col gap-4">
|
|
120
|
+
<FormField id="filter-account" label="勘定科目">
|
|
121
|
+
<Select value={account} onValueChange={setAccount}>
|
|
122
|
+
<SelectTrigger id="filter-account" aria-label="勘定科目">
|
|
123
|
+
<SelectValue placeholder="すべての勘定科目" />
|
|
124
|
+
</SelectTrigger>
|
|
125
|
+
<SelectContent>
|
|
126
|
+
<SelectItem value="all">すべての勘定科目</SelectItem>
|
|
127
|
+
<SelectItem value="cash">現金</SelectItem>
|
|
128
|
+
<SelectItem value="sales">売上高</SelectItem>
|
|
129
|
+
<SelectItem value="expense">旅費交通費</SelectItem>
|
|
130
|
+
</SelectContent>
|
|
131
|
+
</Select>
|
|
132
|
+
</FormField>
|
|
133
|
+
<FormField id="filter-status" label="ステータス">
|
|
134
|
+
<Select value={status} onValueChange={setStatus}>
|
|
135
|
+
<SelectTrigger id="filter-status" aria-label="ステータス">
|
|
136
|
+
<SelectValue placeholder="すべてのステータス" />
|
|
137
|
+
</SelectTrigger>
|
|
138
|
+
<SelectContent>
|
|
139
|
+
<SelectItem value="all">すべてのステータス</SelectItem>
|
|
140
|
+
<SelectItem value="draft">下書き</SelectItem>
|
|
141
|
+
<SelectItem value="approved">承認済み</SelectItem>
|
|
142
|
+
</SelectContent>
|
|
143
|
+
</Select>
|
|
144
|
+
</FormField>
|
|
145
|
+
<FormField id="filter-source" label="ソース">
|
|
146
|
+
<Select value={source} onValueChange={setSource}>
|
|
147
|
+
<SelectTrigger id="filter-source" aria-label="ソース">
|
|
148
|
+
<SelectValue placeholder="すべてのソース" />
|
|
149
|
+
</SelectTrigger>
|
|
150
|
+
<SelectContent>
|
|
151
|
+
<SelectItem value="all">すべてのソース</SelectItem>
|
|
152
|
+
<SelectItem value="manual">手入力</SelectItem>
|
|
153
|
+
<SelectItem value="import">インポート</SelectItem>
|
|
154
|
+
</SelectContent>
|
|
155
|
+
</Select>
|
|
156
|
+
</FormField>
|
|
157
|
+
<FormField id="filter-amount-min" label="金額">
|
|
158
|
+
<Flex direction="row" gap="sm" align="center">
|
|
159
|
+
<Input
|
|
160
|
+
id="filter-amount-min"
|
|
161
|
+
className="min-w-0 flex-1"
|
|
162
|
+
inputMode="numeric"
|
|
163
|
+
placeholder="最小"
|
|
164
|
+
value={minAmount}
|
|
165
|
+
onChange={(e) => setMinAmount(e.target.value)}
|
|
166
|
+
/>
|
|
167
|
+
<Text tone="muted" aria-hidden="true">
|
|
168
|
+
–
|
|
169
|
+
</Text>
|
|
170
|
+
<Input
|
|
171
|
+
id="filter-amount-max"
|
|
172
|
+
aria-label="最大金額"
|
|
173
|
+
className="min-w-0 flex-1"
|
|
174
|
+
inputMode="numeric"
|
|
175
|
+
placeholder="最大"
|
|
176
|
+
value={maxAmount}
|
|
177
|
+
onChange={(e) => setMaxAmount(e.target.value)}
|
|
178
|
+
/>
|
|
179
|
+
</Flex>
|
|
180
|
+
</FormField>
|
|
181
|
+
</SheetBody>
|
|
182
|
+
<SheetFooter>
|
|
183
|
+
<Button
|
|
184
|
+
variant="outline"
|
|
185
|
+
className="me-auto"
|
|
186
|
+
onClick={() => {
|
|
187
|
+
setAccount("all");
|
|
188
|
+
setStatus("all");
|
|
189
|
+
setSource("all");
|
|
190
|
+
setMinAmount("");
|
|
191
|
+
setMaxAmount("");
|
|
192
|
+
}}
|
|
193
|
+
>
|
|
194
|
+
クリア
|
|
195
|
+
</Button>
|
|
196
|
+
<Button onClick={() => setFilterOpen(false)}>適用</Button>
|
|
197
|
+
</SheetFooter>
|
|
198
|
+
</SheetContent>
|
|
199
|
+
</Sheet>
|
|
200
|
+
</CardContent>
|
|
201
|
+
</Card>
|
|
202
|
+
|
|
203
|
+
<Card>
|
|
204
|
+
<CardHeader>
|
|
205
|
+
<CardTitle level={2}>Quick-edit form (Cancel + Save, right-aligned)</CardTitle>
|
|
206
|
+
<CardDescription>
|
|
207
|
+
No destructive action, so both buttons sit on the right: キャンセル (secondary) to the
|
|
208
|
+
left of 保存 (primary). Close programmatically on submit success.
|
|
209
|
+
</CardDescription>
|
|
210
|
+
</CardHeader>
|
|
211
|
+
<CardContent>
|
|
212
|
+
<Sheet open={editOpen} onOpenChange={setEditOpen}>
|
|
213
|
+
<SheetTrigger asChild>
|
|
214
|
+
<Button variant="ghost" size="sm">
|
|
215
|
+
取引先を編集
|
|
216
|
+
</Button>
|
|
217
|
+
</SheetTrigger>
|
|
218
|
+
<SheetContent side="right">
|
|
219
|
+
<SheetHeader>
|
|
220
|
+
<SheetTitle>取引先編集 · 株式会社サンプル</SheetTitle>
|
|
221
|
+
<SheetDescription>取引先の基本情報を編集します。</SheetDescription>
|
|
222
|
+
</SheetHeader>
|
|
223
|
+
<SheetBody className="flex flex-col gap-4">
|
|
224
|
+
<FormField id="edit-company" label="会社名" required>
|
|
225
|
+
<Input
|
|
226
|
+
id="edit-company"
|
|
227
|
+
value={companyName}
|
|
228
|
+
onChange={(e) => setCompanyName(e.target.value)}
|
|
229
|
+
/>
|
|
230
|
+
</FormField>
|
|
231
|
+
<FormField id="edit-registration" label="登録番号" helper="T + 13桁">
|
|
232
|
+
<Input
|
|
233
|
+
id="edit-registration"
|
|
234
|
+
value={registration}
|
|
235
|
+
onChange={(e) => setRegistration(e.target.value)}
|
|
236
|
+
/>
|
|
237
|
+
</FormField>
|
|
238
|
+
</SheetBody>
|
|
239
|
+
<SheetFooter>
|
|
240
|
+
<Button variant="outline" onClick={() => setEditOpen(false)}>
|
|
241
|
+
キャンセル
|
|
242
|
+
</Button>
|
|
243
|
+
<Button onClick={() => setEditOpen(false)}>保存</Button>
|
|
244
|
+
</SheetFooter>
|
|
245
|
+
</SheetContent>
|
|
246
|
+
</Sheet>
|
|
247
|
+
</CardContent>
|
|
248
|
+
</Card>
|
|
249
|
+
|
|
250
|
+
<Card>
|
|
251
|
+
<CardHeader>
|
|
252
|
+
<CardTitle level={2}>Edit with destructive action (削除 far-left)</CardTitle>
|
|
253
|
+
<CardDescription>
|
|
254
|
+
A destructive / clear / reset action goes to the leading edge via
|
|
255
|
+
className="me-auto" with variant="destructive", while キャンセル +
|
|
256
|
+
保存 stay grouped at the end. This is the same me-auto slot the filter's クリア
|
|
257
|
+
uses.
|
|
258
|
+
</CardDescription>
|
|
259
|
+
</CardHeader>
|
|
260
|
+
<CardContent>
|
|
261
|
+
<Sheet open={recordOpen} onOpenChange={setRecordOpen}>
|
|
262
|
+
<SheetTrigger asChild>
|
|
263
|
+
<Button variant="ghost" size="sm">
|
|
264
|
+
仕訳を編集
|
|
265
|
+
</Button>
|
|
266
|
+
</SheetTrigger>
|
|
267
|
+
<SheetContent side="right">
|
|
268
|
+
<SheetHeader>
|
|
269
|
+
<SheetTitle>仕訳編集 · #2024-0412</SheetTitle>
|
|
270
|
+
<SheetDescription>摘要を編集します。削除は元に戻せません。</SheetDescription>
|
|
271
|
+
</SheetHeader>
|
|
272
|
+
<SheetBody className="flex flex-col gap-4">
|
|
273
|
+
<FormField id="record-memo" label="摘要">
|
|
274
|
+
<Input
|
|
275
|
+
id="record-memo"
|
|
276
|
+
value={memo}
|
|
277
|
+
onChange={(e) => setMemo(e.target.value)}
|
|
278
|
+
/>
|
|
279
|
+
</FormField>
|
|
280
|
+
</SheetBody>
|
|
281
|
+
<SheetFooter>
|
|
282
|
+
<Button
|
|
283
|
+
variant="destructive"
|
|
284
|
+
className="me-auto"
|
|
285
|
+
onClick={() => setRecordOpen(false)}
|
|
286
|
+
>
|
|
287
|
+
削除
|
|
288
|
+
</Button>
|
|
289
|
+
<Button variant="outline" onClick={() => setRecordOpen(false)}>
|
|
290
|
+
キャンセル
|
|
291
|
+
</Button>
|
|
292
|
+
<Button onClick={() => setRecordOpen(false)}>保存</Button>
|
|
293
|
+
</SheetFooter>
|
|
294
|
+
</SheetContent>
|
|
295
|
+
</Sheet>
|
|
296
|
+
</CardContent>
|
|
297
|
+
</Card>
|
|
298
|
+
|
|
299
|
+
<Card>
|
|
300
|
+
<CardHeader>
|
|
301
|
+
<CardTitle level={2}>
|
|
302
|
+
Responsive detail panel (responsive="auto" · desktop side / mobile bottom)
|
|
303
|
+
</CardTitle>
|
|
304
|
+
<CardDescription>
|
|
305
|
+
ONE Sheet covers both viewports: above{" "}
|
|
306
|
+
<code>--sheet-responsive-breakpoint-width</code> (48rem / 768px) it is the desktop
|
|
307
|
+
side panel, at or below it the mobile bottom sheet capped by{" "}
|
|
308
|
+
<code>--sheet-bottom-max-height</code>. The breakpoint comes from a theme token. Never
|
|
309
|
+
re-derive it with a page-local <code>useMediaQuery</code>. Focus trap, Escape and
|
|
310
|
+
focus restoration are identical in both presentations because it is the same Radix
|
|
311
|
+
Dialog.
|
|
312
|
+
</CardDescription>
|
|
313
|
+
</CardHeader>
|
|
314
|
+
<CardContent>
|
|
315
|
+
<Flex direction="col" gap="md">
|
|
316
|
+
<Text size="sm" tone="muted" aria-live="polite">
|
|
317
|
+
現在の表示: {presentation === "bottom" ? "bottom sheet (mobile)" : "side panel"}
|
|
318
|
+
</Text>
|
|
319
|
+
<Sheet open={detailOpen} onOpenChange={setDetailOpen}>
|
|
320
|
+
<SheetTrigger asChild>
|
|
321
|
+
<Button variant="outline" size="sm">
|
|
322
|
+
請求書の詳細
|
|
323
|
+
</Button>
|
|
324
|
+
</SheetTrigger>
|
|
325
|
+
<SheetContent responsive="auto" width={420}>
|
|
326
|
+
<SheetHeader
|
|
327
|
+
title="請求書 INV-1024"
|
|
328
|
+
subtitle="2026-07-30 発行 · 株式会社サンプル"
|
|
329
|
+
extra={<Badge tone="success">支払済み</Badge>}
|
|
330
|
+
/>
|
|
331
|
+
<SheetBody className="flex flex-col gap-4">
|
|
332
|
+
<Text size="sm">
|
|
333
|
+
レコードのdetail surfaceはdesktopでは右side panel、mobileではbottom
|
|
334
|
+
sheetとして表示されます。
|
|
335
|
+
</Text>
|
|
336
|
+
<Text size="sm" tone="muted">
|
|
337
|
+
幅は side panel のときだけ適用され、bottom sheet
|
|
338
|
+
では全幅になります(widthはbottomでは無視されます)。
|
|
339
|
+
</Text>
|
|
340
|
+
</SheetBody>
|
|
341
|
+
<SheetFooter>
|
|
342
|
+
<Button variant="outline" onClick={() => setDetailOpen(false)}>
|
|
343
|
+
閉じる
|
|
344
|
+
</Button>
|
|
345
|
+
</SheetFooter>
|
|
346
|
+
</SheetContent>
|
|
347
|
+
</Sheet>
|
|
348
|
+
</Flex>
|
|
349
|
+
</CardContent>
|
|
350
|
+
</Card>
|
|
351
|
+
|
|
352
|
+
<Card>
|
|
353
|
+
<CardHeader>
|
|
354
|
+
<CardTitle level={2}>SheetHeader tone band (every branch)</CardTitle>
|
|
355
|
+
<CardDescription>
|
|
356
|
+
SheetHeader carries the same header contract as DialogHeader: title, subtitle, an
|
|
357
|
+
extra slot and tone. tone tints only the band and leaves the text at the foreground
|
|
358
|
+
colour. default paints no band; muted and neutral share the same quiet band on
|
|
359
|
+
purpose, so a caller can name intent without adding colour. Close the pre-opened
|
|
360
|
+
filter panel above with Escape, then pick a branch.
|
|
361
|
+
</CardDescription>
|
|
362
|
+
</CardHeader>
|
|
363
|
+
<CardContent>
|
|
364
|
+
<Flex direction="col" gap="md">
|
|
365
|
+
<Flex direction="row" gap="sm" wrap>
|
|
366
|
+
{headerTones.map((tone) => (
|
|
367
|
+
<Button
|
|
368
|
+
key={tone}
|
|
369
|
+
variant="outline"
|
|
370
|
+
size="sm"
|
|
371
|
+
onClick={() => {
|
|
372
|
+
setHeaderTone(tone);
|
|
373
|
+
setToneOpen(true);
|
|
374
|
+
}}
|
|
375
|
+
>
|
|
376
|
+
{tone}
|
|
377
|
+
</Button>
|
|
378
|
+
))}
|
|
379
|
+
</Flex>
|
|
380
|
+
<Sheet open={toneOpen} onOpenChange={setToneOpen}>
|
|
381
|
+
<SheetContent side="right" width={420}>
|
|
382
|
+
<SheetHeader
|
|
383
|
+
tone={headerTone}
|
|
384
|
+
title="承認ステータス"
|
|
385
|
+
subtitle={`見出し帯は tone="${headerTone}" で描画しています。`}
|
|
386
|
+
extra={<Badge tone={headerTone}>{headerTone}</Badge>}
|
|
387
|
+
/>
|
|
388
|
+
<SheetBody className="flex flex-col gap-4">
|
|
389
|
+
<Text size="sm">
|
|
390
|
+
帯の色だけが tone
|
|
391
|
+
に追従し、見出しと本文の文字色は変わりません。帯は本文と同じ左右インセットで全幅に広がります。
|
|
392
|
+
</Text>
|
|
393
|
+
<Text size="sm" tone="muted">
|
|
394
|
+
extra スロットは帯の右端に固定され、閉じるボタンとは重なりません。
|
|
395
|
+
</Text>
|
|
396
|
+
</SheetBody>
|
|
397
|
+
<SheetFooter>
|
|
398
|
+
<Button variant="outline" onClick={() => setToneOpen(false)}>
|
|
399
|
+
閉じる
|
|
400
|
+
</Button>
|
|
401
|
+
</SheetFooter>
|
|
402
|
+
</SheetContent>
|
|
403
|
+
</Sheet>
|
|
404
|
+
</Flex>
|
|
405
|
+
</CardContent>
|
|
406
|
+
</Card>
|
|
407
|
+
</Flex>
|
|
408
|
+
</PageContainer>
|
|
409
|
+
);
|
|
410
|
+
}
|