@godxjp/ui 19.1.0 → 19.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -128
- package/dist/app/theme-axes.d.ts +4 -15
- package/dist/app/timezones.d.ts +1 -4
- package/dist/components/charts/area-chart.d.ts +2 -3
- package/dist/components/charts/bar-chart.d.ts +2 -3
- package/dist/components/charts/chart-frame.d.ts +7 -16
- package/dist/components/charts/chart-summary.d.ts +2 -2
- package/dist/components/charts/compact-bar-trend.d.ts +9 -24
- package/dist/components/charts/index.d.ts +1 -6
- package/dist/components/data-display/badge.d.ts +20 -14
- package/dist/components/data-display/badge.js +18 -4
- package/dist/components/data-display/card.d.ts +21 -41
- package/dist/components/data-display/carousel.d.ts +1 -2
- package/dist/components/data-display/code-block.d.ts +4 -0
- package/dist/components/data-display/code-block.js +24 -0
- package/dist/components/data-display/data-table.d.ts +15 -37
- package/dist/components/data-display/data-table.js +1 -3
- package/dist/components/data-display/descriptions.d.ts +2 -6
- package/dist/components/data-display/descriptions.js +0 -2
- package/dist/components/data-display/index.d.ts +4 -0
- package/dist/components/data-display/index.js +4 -0
- package/dist/components/data-display/list-row.d.ts +3 -22
- package/dist/components/data-display/permission-matrix.d.ts +7 -20
- package/dist/components/data-display/progress.d.ts +1 -1
- package/dist/components/data-display/prose.d.ts +4 -0
- package/dist/components/data-display/prose.js +20 -0
- package/dist/components/data-display/service-launcher-card.d.ts +3 -10
- package/dist/components/data-display/table.d.ts +20 -80
- package/dist/components/data-display/table.js +0 -3
- package/dist/components/data-display/timeline.d.ts +3 -5
- package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
- package/dist/components/data-entry/branch-scope-picker.js +0 -1
- package/dist/components/data-entry/calendar.d.ts +3 -2
- package/dist/components/data-entry/calendar.js +58 -3
- package/dist/components/data-entry/command-palette.d.ts +8 -22
- package/dist/components/data-entry/date-picker.d.ts +4 -5
- package/dist/components/data-entry/date-picker.js +6 -1
- package/dist/components/data-entry/date-range-picker.d.ts +1 -1
- package/dist/components/data-entry/date-range-picker.js +8 -3
- package/dist/components/data-entry/form-errors.d.ts +7 -18
- package/dist/components/data-entry/form-field.js +1 -5
- package/dist/components/data-entry/form.d.ts +1 -9
- package/dist/components/data-entry/input.d.ts +16 -14
- package/dist/components/data-entry/input.js +3 -0
- package/dist/components/data-entry/month-picker.js +2 -2
- package/dist/components/data-entry/month-range-picker.d.ts +4 -6
- package/dist/components/data-entry/month-range-picker.js +2 -2
- package/dist/components/data-entry/number-input.d.ts +1 -5
- package/dist/components/data-entry/number-input.js +1 -0
- package/dist/components/data-entry/radio.js +0 -1
- package/dist/components/data-entry/search-select.d.ts +2 -4
- package/dist/components/data-entry/select.d.ts +11 -6
- package/dist/components/data-entry/select.js +4 -2
- package/dist/components/data-entry/switch.js +0 -1
- package/dist/components/data-entry/textarea.d.ts +10 -16
- package/dist/components/data-entry/time-picker.d.ts +3 -5
- package/dist/components/data-entry/upload-types.d.ts +1 -5
- package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
- package/dist/components/feedback/dialog.d.ts +6 -15
- package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
- package/dist/components/feedback/sheet.d.ts +3 -10
- package/dist/components/feedback/sheet.js +1 -1
- package/dist/components/feedback/sonner.js +2 -3
- package/dist/components/general/activity.d.ts +4 -30
- package/dist/components/general/button.js +1 -10
- package/dist/components/general/logo.d.ts +6 -28
- package/dist/components/general/reveal.d.ts +3 -9
- package/dist/components/general/typography.d.ts +1 -3
- package/dist/components/layout/account-chip.d.ts +8 -0
- package/dist/components/layout/account-chip.js +45 -0
- package/dist/components/layout/auth-divider.d.ts +2 -9
- package/dist/components/layout/auth-shell.d.ts +1 -14
- package/dist/components/layout/breadcrumb.d.ts +1 -5
- package/dist/components/layout/centered-shell.d.ts +4 -18
- package/dist/components/layout/error-surface.d.ts +11 -28
- package/dist/components/layout/error-surface.js +4 -1
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/components/layout/legal-document-shell.d.ts +5 -28
- package/dist/components/layout/master-detail.d.ts +2 -18
- package/dist/components/layout/page-container.js +0 -1
- package/dist/components/layout/responsive-grid.d.ts +6 -1
- package/dist/components/layout/responsive-grid.js +9 -2
- package/dist/components/layout/service-role-panel.d.ts +7 -19
- package/dist/components/layout/sidebar.d.ts +5 -27
- package/dist/components/layout/sidebar.js +0 -1
- package/dist/components/layout/split-pane.d.ts +0 -7
- package/dist/components/layout/topbar.d.ts +1 -14
- package/dist/components/navigation/app-setting-picker.js +1 -3
- package/dist/components/navigation/filter-bar.d.ts +1 -6
- package/dist/components/navigation/pagination-utils.d.ts +2 -12
- package/dist/components/navigation/tabs-scroll.d.ts +2 -36
- package/dist/components/navigation/tabs.js +4 -8
- package/dist/components/query/data-state.d.ts +2 -2
- package/dist/components/ui/credential-reveal.d.ts +1 -4
- package/dist/components/ui/hover-card.d.ts +1 -2
- package/dist/components/ui/separator.d.ts +2 -15
- package/dist/components/ui/toggle-group.d.ts +1 -5
- package/dist/components/ui/toggle.d.ts +6 -31
- package/dist/email/brand-mark.d.ts +6 -34
- package/dist/email/color.d.ts +7 -17
- package/dist/email/geometry.d.ts +4 -8
- package/dist/email/index.d.ts +4 -48
- package/dist/email/inline-style.d.ts +3 -9
- package/dist/email/urgency.d.ts +2 -7
- package/dist/form/form-context.d.ts +2 -5
- package/dist/form/form-root.d.ts +1 -2
- package/dist/i18n/messages/en.json +4 -0
- package/dist/i18n/messages/ja.json +4 -0
- package/dist/i18n/messages/vi.json +4 -0
- package/dist/inertia/index.d.ts +2 -10
- package/dist/lib/control-styles.d.ts +10 -21
- package/dist/lib/control-styles.js +4 -6
- package/dist/lib/datetime/format-date.d.ts +1 -4
- package/dist/lib/field-a11y.d.ts +11 -68
- package/dist/lib/field-a11y.js +0 -1
- package/dist/lib/format.d.ts +4 -8
- package/dist/lib/hooks.d.ts +6 -12
- package/dist/lib/permission-grid.d.ts +3 -18
- package/dist/lib/query-error.d.ts +3 -3
- package/dist/props/components/app.prop.d.ts +15 -38
- package/dist/props/components/charts.prop.d.ts +2 -3
- package/dist/props/components/data-display.prop.d.ts +55 -72
- package/dist/props/components/data-entry.prop.d.ts +35 -40
- package/dist/props/components/form.prop.d.ts +2 -6
- package/dist/props/components/general.prop.d.ts +11 -27
- package/dist/props/components/layout.prop.d.ts +89 -260
- package/dist/props/components/navigation.prop.d.ts +27 -42
- package/dist/props/registry.d.ts +36 -1
- package/dist/props/registry.js +45 -1
- package/dist/props/vocabulary/data.prop.d.ts +18 -49
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
- package/dist/props/vocabulary/layout.prop.d.ts +8 -30
- package/dist/props/vocabulary/shared.prop.d.ts +3 -2
- package/dist/styles/alert-layout.css +1 -32
- package/dist/styles/badge-layout.css +19 -18
- package/dist/styles/base.css +14 -113
- package/dist/styles/card-layout.css +6 -128
- package/dist/styles/chart-layout.css +2 -17
- package/dist/styles/control.css +380 -458
- package/dist/styles/core.css +21 -0
- package/dist/styles/data-display-layout.css +175 -94
- package/dist/styles/data-entry-layout.css +0 -45
- package/dist/styles/density.css +1 -30
- package/dist/styles/dialog-layout.css +5 -69
- package/dist/styles/focus-ring.css +13 -87
- package/dist/styles/fonts.css +1 -31
- package/dist/styles/form-layout.css +7 -91
- package/dist/styles/index.css +2 -20
- package/dist/styles/layout.css +38 -456
- package/dist/styles/logo-layout.css +1 -35
- package/dist/styles/motion.css +3 -42
- package/dist/styles/navigation-layout.css +3 -50
- package/dist/styles/shell-layout.css +37 -403
- package/dist/styles/table-layout.css +16 -274
- package/dist/styles/text-layout.css +7 -21
- package/dist/styles/toggle.css +1 -23
- package/dist/theme/dxs.canonical.css +1 -55
- package/dist/theme/example.service.css +1 -26
- package/dist/theme/famgia.service.css +5 -15
- package/dist/tokens/axes.css +3 -40
- package/dist/tokens/base.css +1 -4
- package/dist/tokens/components/activity.css +6 -42
- package/dist/tokens/components/badge.css +12 -13
- package/dist/tokens/components/banner.css +4 -9
- package/dist/tokens/components/card.css +32 -88
- package/dist/tokens/components/chart.css +9 -26
- package/dist/tokens/components/control.css +37 -222
- package/dist/tokens/components/data-display.css +28 -79
- package/dist/tokens/components/data-entry.css +5 -19
- package/dist/tokens/components/descriptions.css +7 -27
- package/dist/tokens/components/email.css +38 -84
- package/dist/tokens/components/error-surface.css +2 -18
- package/dist/tokens/components/feedback.css +27 -124
- package/dist/tokens/components/form.css +13 -45
- package/dist/tokens/components/legal-document.css +16 -41
- package/dist/tokens/components/list-row.css +11 -36
- package/dist/tokens/components/logo.css +2 -57
- package/dist/tokens/components/navigation.css +16 -94
- package/dist/tokens/components/scroll-area.css +2 -18
- package/dist/tokens/components/separator.css +8 -30
- package/dist/tokens/components/sheet.css +3 -14
- package/dist/tokens/components/shell.css +53 -307
- package/dist/tokens/components/sidebar.css +5 -22
- package/dist/tokens/components/table.css +19 -140
- package/dist/tokens/components/toggle.css +3 -65
- package/dist/tokens/components/upload.css +7 -43
- package/dist/tokens/foundation.css +108 -383
- package/dist/tokens/semantic/layout.css +33 -207
- package/docs/CANONICAL-CONTRACTS.md +206 -0
- package/docs/COMPONENTS.md +157 -0
- package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
- package/docs/CONSUMER-RULES.md +14 -0
- package/docs/CUSTOMER-THEMING.md +162 -0
- package/docs/DATETIME.md +69 -0
- package/docs/DEVELOPMENT.md +173 -0
- package/docs/FORMS.md +143 -0
- package/docs/FRAME-A11Y-CI.md +267 -0
- package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
- package/docs/FRAME-COVERAGE-REPORT.md +140 -0
- package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
- package/docs/FRAME-COVERAGE.md +29 -0
- package/docs/PROPS-REGISTRY.md +61 -0
- package/docs/PROPS-VOCABULARY.md +100 -0
- package/docs/README.md +60 -0
- package/docs/REGISTRY.md +70 -0
- package/docs/SPACING.md +56 -0
- package/docs/STANDARDS-vocabulary-tokens.md +48 -0
- package/docs/TESTING.md +98 -0
- package/docs/TOKENS.md +347 -0
- package/docs/asset-modules.d.ts +46 -0
- package/docs/assets/cover-terrain.svg +6 -0
- package/docs/assets/portrait-amber.svg +5 -0
- package/docs/assets/portrait-clay.svg +5 -0
- package/docs/assets/portrait-indigo.svg +5 -0
- package/docs/assets/portrait-iris.svg +5 -0
- package/docs/assets/portrait-moss.svg +5 -0
- package/docs/assets/portrait-plum.svg +5 -0
- package/docs/assets/portrait-slate.svg +5 -0
- package/docs/charts/compact-bar-trend.tsx +328 -0
- package/docs/charts/size-tiers.tsx +192 -0
- package/docs/data-display/accordion.tsx +99 -0
- package/docs/data-display/avatar.tsx +355 -0
- package/docs/data-display/badge.tsx +283 -0
- package/docs/data-display/card/examples/detail-panel.tsx +106 -0
- package/docs/data-display/card/index.md +3 -0
- package/docs/data-display/card/index.tsx +285 -0
- package/docs/data-display/carousel.tsx +160 -0
- package/docs/data-display/charts.tsx +198 -0
- package/docs/data-display/code-block.tsx +90 -0
- package/docs/data-display/collapsible.tsx +162 -0
- package/docs/data-display/credential-reveal.tsx +145 -0
- package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
- package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
- package/docs/data-display/data-table/examples/list-page.tsx +175 -0
- package/docs/data-display/data-table/index.md +5 -0
- package/docs/data-display/data-table/index.tsx +295 -0
- package/docs/data-display/descriptions.tsx +143 -0
- package/docs/data-display/empty-state.tsx +164 -0
- package/docs/data-display/hover-card.tsx +181 -0
- package/docs/data-display/list-row.tsx +420 -0
- package/docs/data-display/permission-matrix.tsx +188 -0
- package/docs/data-display/popover-touch.tsx +27 -0
- package/docs/data-display/popover.tsx +246 -0
- package/docs/data-display/progress.tsx +84 -0
- package/docs/data-display/prose.tsx +105 -0
- package/docs/data-display/qr-code.tsx +68 -0
- package/docs/data-display/scroll-area.tsx +303 -0
- package/docs/data-display/service-launcher-card.tsx +145 -0
- package/docs/data-display/stat-card.tsx +99 -0
- package/docs/data-display/table.tsx +251 -0
- package/docs/data-display/timeline.tsx +112 -0
- package/docs/data-display/touch-actions.tsx +36 -0
- package/docs/data-display/tree-list.tsx +107 -0
- package/docs/data-entry/branch-scope-picker.tsx +123 -0
- package/docs/data-entry/calendar.tsx +180 -0
- package/docs/data-entry/cascader.tsx +378 -0
- package/docs/data-entry/checkbox.tsx +256 -0
- package/docs/data-entry/color-picker.tsx +117 -0
- package/docs/data-entry/command-palette.tsx +179 -0
- package/docs/data-entry/command.tsx +262 -0
- package/docs/data-entry/country-picker-recipe.tsx +175 -0
- package/docs/data-entry/date-picker.tsx +191 -0
- package/docs/data-entry/date-range-picker.tsx +149 -0
- package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
- package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
- package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
- package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
- package/docs/data-entry/form-field/index.md +8 -0
- package/docs/data-entry/form-field/index.tsx +330 -0
- package/docs/data-entry/form-inertia.tsx +80 -0
- package/docs/data-entry/form-root.tsx +102 -0
- package/docs/data-entry/form.tsx +724 -0
- package/docs/data-entry/input-otp.tsx +231 -0
- package/docs/data-entry/input.tsx +114 -0
- package/docs/data-entry/label.tsx +100 -0
- package/docs/data-entry/month-picker.tsx +101 -0
- package/docs/data-entry/month-range-picker.tsx +115 -0
- package/docs/data-entry/number-input.tsx +240 -0
- package/docs/data-entry/password-input.tsx +102 -0
- package/docs/data-entry/password-strength.tsx +97 -0
- package/docs/data-entry/radio-group.tsx +95 -0
- package/docs/data-entry/rating.tsx +87 -0
- package/docs/data-entry/search-input.tsx +120 -0
- package/docs/data-entry/select-async-contracts.tsx +108 -0
- package/docs/data-entry/select-matrix.tsx +204 -0
- package/docs/data-entry/select.tsx +369 -0
- package/docs/data-entry/slider.tsx +130 -0
- package/docs/data-entry/switch.tsx +67 -0
- package/docs/data-entry/tag-input.tsx +108 -0
- package/docs/data-entry/textarea.tsx +209 -0
- package/docs/data-entry/time-picker.tsx +99 -0
- package/docs/data-entry/toggle-count.tsx +293 -0
- package/docs/data-entry/toggle-group.tsx +225 -0
- package/docs/data-entry/toggle.tsx +127 -0
- package/docs/data-entry/transfer.tsx +97 -0
- package/docs/data-entry/tree-select.tsx +204 -0
- package/docs/data-entry/upload.tsx +184 -0
- package/docs/feedback/alert-dialog.tsx +270 -0
- package/docs/feedback/alert.tsx +248 -0
- package/docs/feedback/banner.tsx +183 -0
- package/docs/feedback/danger-confirm.tsx +88 -0
- package/docs/feedback/dialog-touch.tsx +24 -0
- package/docs/feedback/dialog.tsx +193 -0
- package/docs/feedback/sheet.tsx +420 -0
- package/docs/feedback/skeleton.tsx +111 -0
- package/docs/feedback/toast.tsx +135 -0
- package/docs/feedback/tooltip.tsx +171 -0
- package/docs/feedback/two-factor-setup.tsx +68 -0
- package/docs/foundation/_email-specimen.ts +274 -0
- package/docs/foundation/colors.tsx +204 -0
- package/docs/foundation/density.tsx +232 -0
- package/docs/foundation/email-tokens.tsx +323 -0
- package/docs/foundation/radius-shadow.tsx +154 -0
- package/docs/foundation/spacing.tsx +211 -0
- package/docs/foundation/typography.tsx +147 -0
- package/docs/general/activity.tsx +224 -0
- package/docs/general/button/examples/destructive-confirm.tsx +90 -0
- package/docs/general/button/examples/form-actions.tsx +85 -0
- package/docs/general/button/examples/toolbar.tsx +160 -0
- package/docs/general/button/index.md +12 -0
- package/docs/general/button/index.tsx +211 -0
- package/docs/general/logo.tsx +131 -0
- package/docs/general/reveal.tsx +41 -0
- package/docs/general/typography.tsx +152 -0
- package/docs/layout/account-chip.tsx +72 -0
- package/docs/layout/admin-collection.tsx +122 -0
- package/docs/layout/app-shell.tsx +374 -0
- package/docs/layout/aspect-ratio.tsx +135 -0
- package/docs/layout/auth-account-summary.tsx +103 -0
- package/docs/layout/auth-divider.tsx +28 -0
- package/docs/layout/auth-footer.tsx +37 -0
- package/docs/layout/auth-identity.tsx +36 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
- package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
- package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
- package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
- package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
- package/docs/layout/auth-recovery/index.md +140 -0
- package/docs/layout/auth-recovery/index.tsx +96 -0
- package/docs/layout/auth-shell-context.tsx +103 -0
- package/docs/layout/auth-shell-device.tsx +112 -0
- package/docs/layout/auth-shell-registration.tsx +335 -0
- package/docs/layout/auth-shell-variants.tsx +139 -0
- package/docs/layout/auth-shell.tsx +59 -0
- package/docs/layout/auth-stack.tsx +40 -0
- package/docs/layout/centered-shell.tsx +102 -0
- package/docs/layout/error-surface/examples/application-403.tsx +84 -0
- package/docs/layout/error-surface/examples/application-404.tsx +77 -0
- package/docs/layout/error-surface/examples/system-500.tsx +47 -0
- package/docs/layout/error-surface/examples/system-503.tsx +48 -0
- package/docs/layout/error-surface/index.md +153 -0
- package/docs/layout/error-surface/index.tsx +239 -0
- package/docs/layout/flex.tsx +266 -0
- package/docs/layout/legal-document-shell/_data.ts +110 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
- package/docs/layout/legal-document-shell/index.md +51 -0
- package/docs/layout/legal-document-shell/index.tsx +101 -0
- package/docs/layout/master-detail.tsx +387 -0
- package/docs/layout/org-switcher.tsx +131 -0
- package/docs/layout/page-container.tsx +954 -0
- package/docs/layout/resizable-panel.tsx +419 -0
- package/docs/layout/responsive-grid.tsx +243 -0
- package/docs/layout/separator.tsx +327 -0
- package/docs/layout/service-role-panel.tsx +144 -0
- package/docs/layout/sidebar.tsx +609 -0
- package/docs/layout/split-pane.tsx +468 -0
- package/docs/layout/topbar.tsx +349 -0
- package/docs/navigation/app-setting-picker.tsx +142 -0
- package/docs/navigation/breadcrumb.tsx +135 -0
- package/docs/navigation/context-menu.tsx +123 -0
- package/docs/navigation/dropdown-menu.tsx +213 -0
- package/docs/navigation/filter-bar.tsx +227 -0
- package/docs/navigation/menubar.tsx +141 -0
- package/docs/navigation/navigation-menu.tsx +158 -0
- package/docs/navigation/pagination.tsx +241 -0
- package/docs/navigation/steps.tsx +265 -0
- package/docs/navigation/tabs-rtl.tsx +28 -0
- package/docs/navigation/tabs.tsx +314 -0
- package/docs/navigation/toolbar.tsx +339 -0
- package/docs/providers/app-provider.tsx +191 -0
- package/docs/providers/format-date.tsx +230 -0
- package/docs/query/button-refetch.tsx +160 -0
- package/docs/query/data-state.tsx +192 -0
- package/docs/query/infinite-query-state.tsx +93 -0
- package/docs/query/mutation-feedback.tsx +70 -0
- package/docs/query/prefetch-link.tsx +262 -0
- package/docs/query/touch-actions.tsx +68 -0
- package/docs/showcase/acme-portal.tsx +455 -0
- package/docs/showcase/acme-website.tsx +461 -0
- package/docs/showcase/case1-warehouse-dashboard.tsx +359 -0
- package/docs/showcase/case2-employee-me.tsx +444 -0
- package/docs/showcase/case3-approval-workflow.tsx +529 -0
- package/docs/showcase/case4-login.tsx +313 -0
- package/docs/showcase/case5-shift-calendar.tsx +795 -0
- package/docs/showcase/case6-agency-handy.tsx +1113 -0
- package/docs/showcase/futurelastic-web.tsx +392 -0
- package/docs/showcase/org-switcher.tsx +313 -0
- package/docs/showcase/permission-matrix.tsx +346 -0
- package/docs/showcase/public-landing.tsx +210 -0
- package/docs/showcase/settings-account-sections.tsx +559 -0
- package/docs/showcase/settings-security-mfa.tsx +145 -0
- package/docs/showcase/table-approval-queue.tsx +199 -0
- package/docs/showcase/table-bulk-actions.tsx +460 -0
- package/docs/showcase/table-compact-kintone.tsx +438 -0
- package/docs/showcase/table-conditional-format.tsx +367 -0
- package/docs/showcase/table-crud-list.tsx +544 -0
- package/docs/showcase/table-density.tsx +347 -0
- package/docs/showcase/table-expandable-rows.tsx +480 -0
- package/docs/showcase/table-filter-chips.tsx +456 -0
- package/docs/showcase/table-footer-totals.tsx +314 -0
- package/docs/showcase/table-grouped-subtotals.tsx +391 -0
- package/docs/showcase/table-master-detail.tsx +484 -0
- package/docs/showcase/table-pagination.tsx +327 -0
- package/docs/showcase/table-states.tsx +366 -0
- package/docs/showcase/table-sticky-columns.tsx +376 -0
- package/docs/showcase/table-tree-rows.tsx +444 -0
- package/docs/showcase/table-view-tabs.tsx +488 -0
- package/package.json +9 -12
- package/scripts/_agent-setup.mjs +16 -2
- package/scripts/audit-hook.mjs +3 -13
- package/scripts/init-agent-kit.mjs +1 -14
- package/scripts/postinstall.mjs +12 -12
- package/scripts/ui-audit.mjs +93 -31
- package/scripts/visual-audit-rules.mjs +51 -7
- package/scripts/visual-audit.mjs +118 -47
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { AppShell, Flex, PageContainer, Sidebar, Topbar } from "@godxjp/ui/layout";
|
|
3
|
+
import type { SidebarSectionProp } from "@godxjp/ui/layout";
|
|
4
|
+
import {
|
|
5
|
+
Avatar,
|
|
6
|
+
AvatarFallback,
|
|
7
|
+
Badge,
|
|
8
|
+
Card,
|
|
9
|
+
CardContent,
|
|
10
|
+
CardDescription,
|
|
11
|
+
CardHeader,
|
|
12
|
+
CardTitle,
|
|
13
|
+
} from "@godxjp/ui/data-display";
|
|
14
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
15
|
+
import {
|
|
16
|
+
DropdownMenu,
|
|
17
|
+
DropdownMenuContent,
|
|
18
|
+
DropdownMenuItem,
|
|
19
|
+
DropdownMenuLabel,
|
|
20
|
+
DropdownMenuSeparator,
|
|
21
|
+
DropdownMenuTrigger,
|
|
22
|
+
} from "@godxjp/ui/navigation";
|
|
23
|
+
import {
|
|
24
|
+
Bell,
|
|
25
|
+
Building2,
|
|
26
|
+
ChevronDown,
|
|
27
|
+
FileText,
|
|
28
|
+
LayoutDashboard,
|
|
29
|
+
LogOut,
|
|
30
|
+
PanelLeftClose,
|
|
31
|
+
PanelLeftOpen,
|
|
32
|
+
Search,
|
|
33
|
+
Settings,
|
|
34
|
+
UserRound,
|
|
35
|
+
Users,
|
|
36
|
+
} from "lucide-react";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Topbar · a PURE SLOT bar. The shell only positions `start` / `center` / `end`; the CONSUMER
|
|
40
|
+
* composes every control. This demo builds the chrome the OLD baked Topbar used to force ·
|
|
41
|
+
* sidebar toggle, brand mark (Avatar), an entity switcher, a search trigger, a notifications button, a
|
|
42
|
+
* user menu · entirely from real primitives, so you can see there is no hidden template (and no
|
|
43
|
+
* dead dropdown: a control exists ONLY because it's placed here).
|
|
44
|
+
*/
|
|
45
|
+
const SECTIONS: SidebarSectionProp[] = [
|
|
46
|
+
{
|
|
47
|
+
label: "会計",
|
|
48
|
+
items: [
|
|
49
|
+
{ id: "dashboard", label: "ダッシュボード", icon: LayoutDashboard },
|
|
50
|
+
{ id: "journal", label: "仕訳", icon: FileText },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
{ label: "管理", items: [{ id: "users", label: "ユーザー", icon: Users }] },
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
const ENTITIES = [
|
|
57
|
+
{ id: "acme", name: "株式会社アクメ" },
|
|
58
|
+
{ id: "globex", name: "グローバル商事株式会社" },
|
|
59
|
+
{ id: "initech", name: "イニテック有限会社" },
|
|
60
|
+
] as const;
|
|
61
|
+
|
|
62
|
+
const TOPBAR_COPY = {
|
|
63
|
+
ja: {
|
|
64
|
+
screenTitle: "組織セキュリティと認証ポリシーの管理",
|
|
65
|
+
search: "ユーザー、組織、監査イベントを検索…",
|
|
66
|
+
},
|
|
67
|
+
en: {
|
|
68
|
+
screenTitle: "Organization security and authentication policy administration",
|
|
69
|
+
search: "Search users, organizations, and audit events…",
|
|
70
|
+
},
|
|
71
|
+
vi: {
|
|
72
|
+
screenTitle: "Quản trị chính sách bảo mật và xác thực của tổ chức",
|
|
73
|
+
search: "Tìm người dùng, tổ chức và sự kiện kiểm toán…",
|
|
74
|
+
},
|
|
75
|
+
} as const;
|
|
76
|
+
|
|
77
|
+
type DemoLocale = keyof typeof TOPBAR_COPY;
|
|
78
|
+
|
|
79
|
+
export default function Demo() {
|
|
80
|
+
const [activeId, setActiveId] = useState("dashboard");
|
|
81
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
82
|
+
const [activeEntity, setActiveEntity] = useState<(typeof ENTITIES)[number]>(ENTITIES[0]);
|
|
83
|
+
const [unread, setUnread] = useState(true);
|
|
84
|
+
const [searchOpenCount, setSearchOpenCount] = useState(0);
|
|
85
|
+
const [locale, setLocale] = useState<DemoLocale>("ja");
|
|
86
|
+
const topbarCopy = TOPBAR_COPY[locale];
|
|
87
|
+
|
|
88
|
+
// start cluster · sidebar toggle + brand mark (Avatar) + an entity switcher the consumer owns.
|
|
89
|
+
const start = (
|
|
90
|
+
<>
|
|
91
|
+
<Button
|
|
92
|
+
variant="ghost"
|
|
93
|
+
size="icon-sm"
|
|
94
|
+
aria-label={collapsed ? "サイドバーを展開" : "サイドバーを折りたたむ"}
|
|
95
|
+
aria-pressed={collapsed}
|
|
96
|
+
onClick={() => setCollapsed((c) => !c)}
|
|
97
|
+
>
|
|
98
|
+
{collapsed ? <PanelLeftOpen /> : <PanelLeftClose />}
|
|
99
|
+
</Button>
|
|
100
|
+
{/* Decorative mark — hidden below sm so the budget goes to the two real controls. */}
|
|
101
|
+
<Avatar className="rounded-md">
|
|
102
|
+
<AvatarFallback className="bg-primary text-primary-foreground font-bold">C</AvatarFallback>
|
|
103
|
+
</Avatar>
|
|
104
|
+
<DropdownMenu>
|
|
105
|
+
<DropdownMenuTrigger asChild>
|
|
106
|
+
{/* Button ships `shrink-0`, and only the LAST child of the start slot gets the built-in
|
|
107
|
+
truncation contract — so a switcher sitting mid-slot has to be told it may shrink, or
|
|
108
|
+
it keeps its full width and the slot clips it while it stays focusable. `flex-1
|
|
109
|
+
min-w-11` below sm lets it take just the leftover room without ever dropping under
|
|
110
|
+
the 44px touch floor — plain `min-w-0` let flex hand it 20px, which is under the 24px
|
|
111
|
+
SC 2.5.8 minimum, trading one failure for another. `truncate` puts the ellipsis on
|
|
112
|
+
the label rather than letting it spill. */}
|
|
113
|
+
<Button variant="ghost" size="sm" className="min-w-11 flex-1 sm:min-w-0 sm:flex-none">
|
|
114
|
+
<span className="truncate">{activeEntity.name}</span>
|
|
115
|
+
<ChevronDown />
|
|
116
|
+
</Button>
|
|
117
|
+
</DropdownMenuTrigger>
|
|
118
|
+
<DropdownMenuContent align="start" className="w-64">
|
|
119
|
+
<DropdownMenuLabel>エンティティ切替</DropdownMenuLabel>
|
|
120
|
+
<DropdownMenuSeparator />
|
|
121
|
+
{ENTITIES.map((e) => (
|
|
122
|
+
<DropdownMenuItem key={e.id} onSelect={() => setActiveEntity(e)}>
|
|
123
|
+
<Building2 className="size-4" />
|
|
124
|
+
{e.name}
|
|
125
|
+
{activeEntity.id === e.id ? (
|
|
126
|
+
<Badge variant="secondary" className="ms-auto text-xs">
|
|
127
|
+
現在
|
|
128
|
+
</Badge>
|
|
129
|
+
) : null}
|
|
130
|
+
</DropdownMenuItem>
|
|
131
|
+
))}
|
|
132
|
+
</DropdownMenuContent>
|
|
133
|
+
</DropdownMenu>
|
|
134
|
+
<Text data-demo-topbar-title="" title={topbarCopy.screenTitle} weight="medium">
|
|
135
|
+
{topbarCopy.screenTitle}
|
|
136
|
+
</Text>
|
|
137
|
+
</>
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// center · a search trigger (opens YOUR command palette). No baked search box.
|
|
141
|
+
const center = (
|
|
142
|
+
<Button
|
|
143
|
+
variant="outline"
|
|
144
|
+
size="sm"
|
|
145
|
+
className="text-muted-foreground w-full max-w-sm justify-start"
|
|
146
|
+
onClick={() => setSearchOpenCount((n) => n + 1)}
|
|
147
|
+
>
|
|
148
|
+
<Search />
|
|
149
|
+
{topbarCopy.search}
|
|
150
|
+
</Button>
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
// end · notifications + user menu, both consumer-composed.
|
|
154
|
+
const end = (
|
|
155
|
+
<>
|
|
156
|
+
{/* The end slot is `flex: 0 0 auto` — whatever sits here is taken out of the start slot's
|
|
157
|
+
budget before it gets a say. At 320 this environment chip alone claimed 93 of the bar's
|
|
158
|
+
198px, squeezing start to 25px and clipping the entity switcher inside it. An ambient
|
|
159
|
+
status label is the first thing a compact bar drops, so it appears from sm up. */}
|
|
160
|
+
<Badge tone="warning" className="text-xs">
|
|
161
|
+
ステージング
|
|
162
|
+
</Badge>
|
|
163
|
+
<Button
|
|
164
|
+
variant="ghost"
|
|
165
|
+
size="icon-sm"
|
|
166
|
+
aria-label="通知"
|
|
167
|
+
className="relative"
|
|
168
|
+
onClick={() => setUnread(false)}
|
|
169
|
+
>
|
|
170
|
+
<Bell />
|
|
171
|
+
{unread ? (
|
|
172
|
+
<span className="bg-destructive absolute end-1.5 top-1.5 size-1.5 rounded-full" />
|
|
173
|
+
) : null}
|
|
174
|
+
</Button>
|
|
175
|
+
<DropdownMenu>
|
|
176
|
+
<DropdownMenuTrigger asChild>
|
|
177
|
+
<Button variant="ghost" size="icon-sm" aria-label="アカウントメニュー">
|
|
178
|
+
<Avatar className="size-7">
|
|
179
|
+
<AvatarFallback>佐藤</AvatarFallback>
|
|
180
|
+
</Avatar>
|
|
181
|
+
</Button>
|
|
182
|
+
</DropdownMenuTrigger>
|
|
183
|
+
<DropdownMenuContent align="end" className="w-56">
|
|
184
|
+
<DropdownMenuLabel>佐藤 花子</DropdownMenuLabel>
|
|
185
|
+
<DropdownMenuSeparator />
|
|
186
|
+
<DropdownMenuItem>
|
|
187
|
+
<UserRound className="size-4" />
|
|
188
|
+
プロフィール
|
|
189
|
+
</DropdownMenuItem>
|
|
190
|
+
<DropdownMenuItem>
|
|
191
|
+
<Settings className="size-4" />
|
|
192
|
+
アカウント設定
|
|
193
|
+
</DropdownMenuItem>
|
|
194
|
+
<DropdownMenuSeparator />
|
|
195
|
+
<DropdownMenuItem>
|
|
196
|
+
<LogOut className="size-4" />
|
|
197
|
+
ログアウト
|
|
198
|
+
</DropdownMenuItem>
|
|
199
|
+
</DropdownMenuContent>
|
|
200
|
+
</DropdownMenu>
|
|
201
|
+
</>
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
const sidebar = (
|
|
205
|
+
<Sidebar
|
|
206
|
+
activeId={activeId}
|
|
207
|
+
collapsed={collapsed}
|
|
208
|
+
onSelect={setActiveId}
|
|
209
|
+
sections={SECTIONS}
|
|
210
|
+
product={{ name: "CoreBooks", role: activeEntity.name, color: "hsl(220 70% 50%)" }}
|
|
211
|
+
onProductClick={() => undefined}
|
|
212
|
+
/>
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
return (
|
|
216
|
+
<AppShell
|
|
217
|
+
sidebar={sidebar}
|
|
218
|
+
topbar={<Topbar start={start} center={center} end={end} />}
|
|
219
|
+
sidebarCollapsed={collapsed}
|
|
220
|
+
>
|
|
221
|
+
<PageContainer
|
|
222
|
+
title="Topbar デモ"
|
|
223
|
+
subtitle="slot bar · start / center / end をすべて consumer が組み立てる(焼き込みなし)"
|
|
224
|
+
breadcrumb={[{ label: "ホーム", to: "/" }, { label: "Topbar デモ" }]}
|
|
225
|
+
>
|
|
226
|
+
<Flex direction="col" gap="lg">
|
|
227
|
+
<Card>
|
|
228
|
+
<CardHeader>
|
|
229
|
+
<CardTitle level={2}>現在の状態</CardTitle>
|
|
230
|
+
<CardDescription>
|
|
231
|
+
各コントロールは props ではなく slot
|
|
232
|
+
に置いた実コンポーネント。操作すると更新されます。
|
|
233
|
+
</CardDescription>
|
|
234
|
+
</CardHeader>
|
|
235
|
+
<CardContent>
|
|
236
|
+
<Flex direction="col" gap="sm" className="text-sm">
|
|
237
|
+
<Flex aria-label="Preview locale" gap="sm" wrap>
|
|
238
|
+
{(["ja", "en", "vi"] as const).map((language) => (
|
|
239
|
+
<Button
|
|
240
|
+
key={language}
|
|
241
|
+
size="sm"
|
|
242
|
+
variant="outline"
|
|
243
|
+
aria-pressed={locale === language}
|
|
244
|
+
onClick={() => setLocale(language)}
|
|
245
|
+
>
|
|
246
|
+
{language.toUpperCase()}
|
|
247
|
+
</Button>
|
|
248
|
+
))}
|
|
249
|
+
</Flex>
|
|
250
|
+
<Flex align="center" gap="md">
|
|
251
|
+
<Building2 className="text-muted-foreground size-4" />
|
|
252
|
+
<Text tone="muted">アクティブエンティティ</Text>
|
|
253
|
+
<Badge variant="secondary">{activeEntity.name}</Badge>
|
|
254
|
+
</Flex>
|
|
255
|
+
<Flex align="center" gap="md">
|
|
256
|
+
<Bell className="text-muted-foreground size-4" />
|
|
257
|
+
<Text tone="muted">通知バッジ</Text>
|
|
258
|
+
<Badge tone={unread ? "destructive" : "neutral"} icon={null}>
|
|
259
|
+
{unread ? "未読あり" : "なし"}
|
|
260
|
+
</Badge>
|
|
261
|
+
</Flex>
|
|
262
|
+
<Flex align="center" gap="md">
|
|
263
|
+
<Search className="text-muted-foreground size-4" />
|
|
264
|
+
<Text tone="muted">検索を開いた回数</Text>
|
|
265
|
+
<Badge tone="info" icon={null}>
|
|
266
|
+
{searchOpenCount}
|
|
267
|
+
</Badge>
|
|
268
|
+
</Flex>
|
|
269
|
+
</Flex>
|
|
270
|
+
</CardContent>
|
|
271
|
+
</Card>
|
|
272
|
+
|
|
273
|
+
<Card>
|
|
274
|
+
<CardHeader>
|
|
275
|
+
<CardTitle level={2}>Topbar は3つの slot だけ</CardTitle>
|
|
276
|
+
<CardDescription>
|
|
277
|
+
start / center / end。中身(ブランド・ナビ・検索・言語切替・ユーザーメニュー)は
|
|
278
|
+
すべて consumer が決める。アイコンのみ/ラベル付き/枠線あり等は各コンポーネントの
|
|
279
|
+
props であって、シェルが強制するものではない。
|
|
280
|
+
</CardDescription>
|
|
281
|
+
</CardHeader>
|
|
282
|
+
<CardContent>
|
|
283
|
+
<Flex direction="col" gap="sm" className="text-sm">
|
|
284
|
+
{[
|
|
285
|
+
{
|
|
286
|
+
prop: "start",
|
|
287
|
+
desc: "サイドバートグル + ブランドマーク(Avatar)+ エンティティ切替(DropdownMenu)",
|
|
288
|
+
},
|
|
289
|
+
{ prop: "center", desc: "検索トリガー(Button)。コマンドパレットを開く" },
|
|
290
|
+
{ prop: "end", desc: "通知ボタン + ユーザーメニュー(DropdownMenu)" },
|
|
291
|
+
{ prop: "children", desc: "3 slot を使わず完全カスタムにする場合の逃げ道" },
|
|
292
|
+
].map(({ prop, desc }) => (
|
|
293
|
+
<Flex key={prop} align="start" gap="sm">
|
|
294
|
+
<Badge variant="secondary" className="shrink-0">
|
|
295
|
+
{prop}
|
|
296
|
+
</Badge>
|
|
297
|
+
<Text tone="muted">{desc}</Text>
|
|
298
|
+
</Flex>
|
|
299
|
+
))}
|
|
300
|
+
</Flex>
|
|
301
|
+
</CardContent>
|
|
302
|
+
</Card>
|
|
303
|
+
|
|
304
|
+
<Card>
|
|
305
|
+
<CardHeader>
|
|
306
|
+
<CardTitle level={2}>状態リセット</CardTitle>
|
|
307
|
+
</CardHeader>
|
|
308
|
+
<CardContent>
|
|
309
|
+
<Flex gap="sm" wrap>
|
|
310
|
+
<Button size="sm" variant="outline" onClick={() => setUnread(true)}>
|
|
311
|
+
<Bell />
|
|
312
|
+
通知をリセット
|
|
313
|
+
</Button>
|
|
314
|
+
<Button size="sm" variant="outline" onClick={() => setCollapsed(false)}>
|
|
315
|
+
<PanelLeftOpen />
|
|
316
|
+
サイドバーを展開
|
|
317
|
+
</Button>
|
|
318
|
+
<Button size="sm" variant="outline" onClick={() => setActiveEntity(ENTITIES[0])}>
|
|
319
|
+
初期値に戻す
|
|
320
|
+
</Button>
|
|
321
|
+
</Flex>
|
|
322
|
+
</CardContent>
|
|
323
|
+
</Card>
|
|
324
|
+
|
|
325
|
+
<Card>
|
|
326
|
+
<CardHeader>
|
|
327
|
+
<CardTitle level={2}>320px stress · 長いローカライズ内容</CardTitle>
|
|
328
|
+
<CardDescription>
|
|
329
|
+
1100px 以下では package-owned contract が center slot を隠し、start の最後の
|
|
330
|
+
ラベルを ellipsis で切り詰めて end utilities を保護する。
|
|
331
|
+
</CardDescription>
|
|
332
|
+
</CardHeader>
|
|
333
|
+
<CardContent>
|
|
334
|
+
<Card className="max-w-80 overflow-hidden">
|
|
335
|
+
<CardContent>
|
|
336
|
+
<Topbar
|
|
337
|
+
start={<Text weight="medium">株式会社とても長い組織名称</Text>}
|
|
338
|
+
center={<Button variant="outline">すべての取引を検索</Button>}
|
|
339
|
+
end={<Button variant="ghost">山田 太郎 システム管理者</Button>}
|
|
340
|
+
/>
|
|
341
|
+
</CardContent>
|
|
342
|
+
</Card>
|
|
343
|
+
</CardContent>
|
|
344
|
+
</Card>
|
|
345
|
+
</Flex>
|
|
346
|
+
</PageContainer>
|
|
347
|
+
</AppShell>
|
|
348
|
+
);
|
|
349
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { AppProvider } from "@godxjp/ui/app";
|
|
2
|
+
import {
|
|
3
|
+
Avatar,
|
|
4
|
+
AvatarFallback,
|
|
5
|
+
Card,
|
|
6
|
+
CardContent,
|
|
7
|
+
CardDescription,
|
|
8
|
+
CardHeader,
|
|
9
|
+
CardTitle,
|
|
10
|
+
} from "@godxjp/ui/data-display";
|
|
11
|
+
import { Text } from "@godxjp/ui/general";
|
|
12
|
+
import { Flex, PageContainer, Topbar } from "@godxjp/ui/layout";
|
|
13
|
+
import { AppSettingPicker } from "@godxjp/ui/navigation";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* AppSettingPicker — ONE provider-bound Select for any single AppProvider setting,
|
|
17
|
+
* chosen via `kind` (locale/timezone/date/time plus theme/brand/density/fontSize). It replaces the
|
|
18
|
+
* former Locale/Timezone/Date-format/Time-format pickers (4 components → 1). Mount under
|
|
19
|
+
* <AppProvider> and it reads/writes the matching context with NO value/onValueChange; pass
|
|
20
|
+
* those to control it instead. Composed only from real @godxjp/ui components.
|
|
21
|
+
*/
|
|
22
|
+
export default function Demo() {
|
|
23
|
+
return (
|
|
24
|
+
<AppProvider
|
|
25
|
+
defaultLocale="ja"
|
|
26
|
+
defaultTimezone="Asia/Tokyo"
|
|
27
|
+
defaultDateFormat="iso"
|
|
28
|
+
defaultTimeFormat="24h"
|
|
29
|
+
persist={false}
|
|
30
|
+
>
|
|
31
|
+
<PageContainer
|
|
32
|
+
title="AppSettingPicker"
|
|
33
|
+
subtitle="kind で 1 つの AppProvider 設定を読み書きする統合ピッカー"
|
|
34
|
+
>
|
|
35
|
+
<Flex direction="col" gap="lg">
|
|
36
|
+
<Card>
|
|
37
|
+
<CardHeader>
|
|
38
|
+
<CardTitle level={2}>kind で対象設定を選ぶ</CardTitle>
|
|
39
|
+
<CardDescription>
|
|
40
|
+
旧 Locale / Timezone / DateFormat / TimeFormat ピッカーを 1 コンポーネントに統合。
|
|
41
|
+
<AppProvider> 配下に置くと value / onValueChange
|
|
42
|
+
なしでコンテキストを読み書きする。
|
|
43
|
+
</CardDescription>
|
|
44
|
+
</CardHeader>
|
|
45
|
+
<CardContent>
|
|
46
|
+
<Flex direction="row" gap="md" wrap>
|
|
47
|
+
<Flex direction="col" gap="sm" className="min-w-40 flex-1">
|
|
48
|
+
<Text weight="medium">表示言語</Text>
|
|
49
|
+
{/* locale defaults to the icon-only switcher; a labeled settings-form row opts
|
|
50
|
+
into the full trigger with an explicit appearance="labeled". */}
|
|
51
|
+
<AppSettingPicker kind="locale" appearance="labeled" id="setting-locale" />
|
|
52
|
+
</Flex>
|
|
53
|
+
<Flex direction="col" gap="sm" className="min-w-56 flex-1">
|
|
54
|
+
<Text weight="medium">タイムゾーン</Text>
|
|
55
|
+
<AppSettingPicker kind="timezone" id="setting-timezone" />
|
|
56
|
+
</Flex>
|
|
57
|
+
<Flex direction="col" gap="sm" className="min-w-44 flex-1">
|
|
58
|
+
<Text weight="medium">日付フォーマット</Text>
|
|
59
|
+
<AppSettingPicker kind="dateFormat" id="setting-date-format" />
|
|
60
|
+
</Flex>
|
|
61
|
+
<Flex direction="col" gap="sm" className="min-w-44 flex-1">
|
|
62
|
+
<Text weight="medium">時刻フォーマット</Text>
|
|
63
|
+
<AppSettingPicker kind="timeFormat" id="setting-time-format" />
|
|
64
|
+
</Flex>
|
|
65
|
+
<Flex direction="col" gap="sm" className="min-w-36 flex-1">
|
|
66
|
+
<Text weight="medium">テーマ</Text>
|
|
67
|
+
<AppSettingPicker kind="theme" id="setting-theme" />
|
|
68
|
+
</Flex>
|
|
69
|
+
<Flex direction="col" gap="sm" className="min-w-44 flex-1">
|
|
70
|
+
<Text weight="medium">ブランド</Text>
|
|
71
|
+
<AppSettingPicker kind="brand" id="setting-brand" />
|
|
72
|
+
</Flex>
|
|
73
|
+
<Flex direction="col" gap="sm" className="min-w-40 flex-1">
|
|
74
|
+
<Text weight="medium">密度</Text>
|
|
75
|
+
<AppSettingPicker kind="density" id="setting-density" />
|
|
76
|
+
</Flex>
|
|
77
|
+
<Flex direction="col" gap="sm" className="min-w-36 flex-1">
|
|
78
|
+
<Text weight="medium">文字サイズ</Text>
|
|
79
|
+
<AppSettingPicker kind="fontSize" id="setting-font-size" />
|
|
80
|
+
</Flex>
|
|
81
|
+
</Flex>
|
|
82
|
+
</CardContent>
|
|
83
|
+
</Card>
|
|
84
|
+
|
|
85
|
+
<Card>
|
|
86
|
+
<CardHeader>
|
|
87
|
+
<CardTitle level={2}>狭いコンテナと長いラベル</CardTitle>
|
|
88
|
+
<CardDescription>
|
|
89
|
+
320px 相当で長いタイムゾーン名の折返し・クリッピングを確認する。
|
|
90
|
+
</CardDescription>
|
|
91
|
+
</CardHeader>
|
|
92
|
+
<CardContent>
|
|
93
|
+
<Card className="max-w-80" lang="ja">
|
|
94
|
+
<CardContent>
|
|
95
|
+
<AppSettingPicker kind="timezone" id="setting-timezone-narrow" />
|
|
96
|
+
</CardContent>
|
|
97
|
+
</Card>
|
|
98
|
+
</CardContent>
|
|
99
|
+
</Card>
|
|
100
|
+
|
|
101
|
+
<Card>
|
|
102
|
+
<CardHeader>
|
|
103
|
+
<CardTitle level={2}>アイコンのみ(トップバー)</CardTitle>
|
|
104
|
+
<CardDescription>
|
|
105
|
+
appearance="icon" は正方形トリガーとローカライズ済み accessible name
|
|
106
|
+
を保持し、選択肢はメニュー内で完全表示する。
|
|
107
|
+
</CardDescription>
|
|
108
|
+
</CardHeader>
|
|
109
|
+
<CardContent>
|
|
110
|
+
<Topbar
|
|
111
|
+
start={
|
|
112
|
+
<Avatar className="rounded-md">
|
|
113
|
+
<AvatarFallback>G</AvatarFallback>
|
|
114
|
+
</Avatar>
|
|
115
|
+
}
|
|
116
|
+
end={
|
|
117
|
+
<Flex direction="row" gap="sm" align="center">
|
|
118
|
+
<AppSettingPicker kind="locale" appearance="inline" id="topbar-locale-inline" />
|
|
119
|
+
<AppSettingPicker kind="locale" appearance="icon" id="topbar-locale-icon" />
|
|
120
|
+
</Flex>
|
|
121
|
+
}
|
|
122
|
+
/>
|
|
123
|
+
</CardContent>
|
|
124
|
+
</Card>
|
|
125
|
+
|
|
126
|
+
<Card>
|
|
127
|
+
<CardHeader>
|
|
128
|
+
<CardTitle level={2}>無効化</CardTitle>
|
|
129
|
+
<CardDescription>disabled で操作を止める。</CardDescription>
|
|
130
|
+
</CardHeader>
|
|
131
|
+
<CardContent>
|
|
132
|
+
<Flex direction="col" gap="sm" className="max-w-56">
|
|
133
|
+
<Text weight="medium">タイムゾーン (disabled)</Text>
|
|
134
|
+
<AppSettingPicker kind="timezone" id="setting-timezone-disabled" disabled />
|
|
135
|
+
</Flex>
|
|
136
|
+
</CardContent>
|
|
137
|
+
</Card>
|
|
138
|
+
</Flex>
|
|
139
|
+
</PageContainer>
|
|
140
|
+
</AppProvider>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { forwardRef } from "react";
|
|
2
|
+
import type { AnchorHTMLAttributes } from "react";
|
|
3
|
+
import {
|
|
4
|
+
Card,
|
|
5
|
+
CardContent,
|
|
6
|
+
CardDescription,
|
|
7
|
+
CardHeader,
|
|
8
|
+
CardTitle,
|
|
9
|
+
CodeBlock,
|
|
10
|
+
} from "@godxjp/ui/data-display";
|
|
11
|
+
import { Text } from "@godxjp/ui/general";
|
|
12
|
+
import { Breadcrumb } from "@godxjp/ui/layout";
|
|
13
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Breadcrumb — a STANDALONE "where am I" trail. Place `<Breadcrumb items={[…]} />` anywhere
|
|
17
|
+
* (no shell required); it is NOT tied to AppShell or PageContainer. Pass one `items` array of
|
|
18
|
+
* `{ label, to? }`; the segment with no `to` is the current page. Import from @godxjp/ui/layout.
|
|
19
|
+
*/
|
|
20
|
+
const RouterLink = forwardRef<
|
|
21
|
+
HTMLAnchorElement,
|
|
22
|
+
AnchorHTMLAttributes<HTMLAnchorElement> & { to?: string }
|
|
23
|
+
>(function RouterLink({ to, href, ...props }, ref) {
|
|
24
|
+
return <a ref={ref} href={to ?? href} data-router-link="" {...props} />;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export default function Demo() {
|
|
28
|
+
return (
|
|
29
|
+
<PageContainer
|
|
30
|
+
title="Breadcrumb"
|
|
31
|
+
subtitle="Standalone location trail · pass one items array, the last (no `to`) is the current page"
|
|
32
|
+
>
|
|
33
|
+
<Flex direction="col" gap="lg">
|
|
34
|
+
{/* 1 · IN FOCUS — the bare component + what every part does. */}
|
|
35
|
+
<Card>
|
|
36
|
+
<CardHeader>
|
|
37
|
+
<CardTitle level={2}>基本 · これがコンポーネントそのもの</CardTitle>
|
|
38
|
+
<CardDescription>
|
|
39
|
+
`<Breadcrumb items={"{[…]}"} />` を置くだけ。シェル不要。リンクのセグメント (to
|
|
40
|
+
あり) はクリックで戻れ、末尾 (to なし) は現在地として aria-current="page" の
|
|
41
|
+
span に、区切り記号と nav/aria は自動付与。
|
|
42
|
+
</CardDescription>
|
|
43
|
+
</CardHeader>
|
|
44
|
+
<CardContent>
|
|
45
|
+
<Breadcrumb
|
|
46
|
+
ariaLabel="基本例のパンくず"
|
|
47
|
+
items={[
|
|
48
|
+
{ label: "ホーム", to: "/" },
|
|
49
|
+
{ label: "会計", to: "/accounting" },
|
|
50
|
+
{ label: "請求書 INV-0042" },
|
|
51
|
+
]}
|
|
52
|
+
aria-label="基本例のパンくずリスト"
|
|
53
|
+
/>
|
|
54
|
+
</CardContent>
|
|
55
|
+
</Card>
|
|
56
|
+
|
|
57
|
+
{/* 2 · ONE KNOB — depth is just the array length. Stacked so the scaling is obvious. */}
|
|
58
|
+
<Card>
|
|
59
|
+
<CardHeader>
|
|
60
|
+
<CardTitle level={2}>深さ · items を増やすだけ</CardTitle>
|
|
61
|
+
<CardDescription>
|
|
62
|
+
2 から 4 階層まで、変えるのは配列の長さだけ。区切りと折り返しは自動。
|
|
63
|
+
</CardDescription>
|
|
64
|
+
</CardHeader>
|
|
65
|
+
<CardContent>
|
|
66
|
+
<Flex direction="col" gap="md">
|
|
67
|
+
<Breadcrumb
|
|
68
|
+
items={[{ label: "ホーム", to: "/" }, { label: "仕訳一覧" }]}
|
|
69
|
+
ariaLabel="2階層のパンくずリスト"
|
|
70
|
+
/>
|
|
71
|
+
<Breadcrumb
|
|
72
|
+
ariaLabel="短い例のパンくず"
|
|
73
|
+
items={[{ label: "ホーム", to: "/" }, { label: "仕訳一覧" }]}
|
|
74
|
+
/>
|
|
75
|
+
<Breadcrumb
|
|
76
|
+
ariaLabel="深い階層例のパンくず"
|
|
77
|
+
items={[
|
|
78
|
+
{ label: "ホーム", to: "/" },
|
|
79
|
+
{ label: "給与管理", to: "/payroll" },
|
|
80
|
+
{ label: "2024年5月分給与明細" },
|
|
81
|
+
]}
|
|
82
|
+
aria-label="3階層のパンくずリスト"
|
|
83
|
+
/>
|
|
84
|
+
<Breadcrumb
|
|
85
|
+
ariaLabel="長いラベル例のパンくず"
|
|
86
|
+
items={[
|
|
87
|
+
{ label: "ホーム", to: "/" },
|
|
88
|
+
{ label: "給与管理", to: "/payroll" },
|
|
89
|
+
{ label: "経理部", to: "/payroll/departments/accounting" },
|
|
90
|
+
{ label: "田中 太郎" },
|
|
91
|
+
]}
|
|
92
|
+
aria-label="4階層のパンくずリスト"
|
|
93
|
+
/>
|
|
94
|
+
<Breadcrumb
|
|
95
|
+
ariaLabel="ルーターアダプター例のパンくず"
|
|
96
|
+
linkComponent={RouterLink}
|
|
97
|
+
items={[{ label: "ホーム", to: "/" }, { label: "アダプター例" }]}
|
|
98
|
+
/>
|
|
99
|
+
</Flex>
|
|
100
|
+
</CardContent>
|
|
101
|
+
</Card>
|
|
102
|
+
|
|
103
|
+
{/* 3 · PLACEMENT — standalone, or the optional shell convenience. Reference, last. */}
|
|
104
|
+
<Card>
|
|
105
|
+
<CardHeader>
|
|
106
|
+
<CardTitle level={2}>配置 · 単体 または シェルの任意プロップ</CardTitle>
|
|
107
|
+
<CardDescription>
|
|
108
|
+
単体でどこにでも置ける。任意で `PageContainer`/`AppShell` の `breadcrumb`
|
|
109
|
+
プロップに渡すと、ヘッダーの定位置に出る (シェルが強制するものではない)。
|
|
110
|
+
</CardDescription>
|
|
111
|
+
</CardHeader>
|
|
112
|
+
<CardContent>
|
|
113
|
+
<Flex direction="col" gap="sm">
|
|
114
|
+
<Text as="p" size="xs" tone="muted">
|
|
115
|
+
単体 (どこでも):
|
|
116
|
+
</Text>
|
|
117
|
+
{/* tabIndex: the snippet scrolls sideways on a narrow viewport and holds no
|
|
118
|
+
focusable content, so without its own tab stop a keyboard user cannot reach the
|
|
119
|
+
clipped end of the line (WCAG 2.1.1). */}
|
|
120
|
+
<CodeBlock size="xs" wrap={false}>
|
|
121
|
+
{`<Breadcrumb items={[{ label: "ホーム", to: "/" }, { label: "現在ページ" }]} />`}
|
|
122
|
+
</CodeBlock>
|
|
123
|
+
<Text as="p" size="xs" tone="muted">
|
|
124
|
+
PageContainer / AppShell の breadcrumb プロップに (任意):
|
|
125
|
+
</Text>
|
|
126
|
+
<CodeBlock size="xs" wrap={false}>
|
|
127
|
+
{`<PageContainer title="仕訳詳細" breadcrumb={[{ label: "ホーム", to: "/" }, { label: "JE-0042" }]}>`}
|
|
128
|
+
</CodeBlock>
|
|
129
|
+
</Flex>
|
|
130
|
+
</CardContent>
|
|
131
|
+
</Card>
|
|
132
|
+
</Flex>
|
|
133
|
+
</PageContainer>
|
|
134
|
+
);
|
|
135
|
+
}
|