@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,231 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import {
|
|
5
|
+
FormField,
|
|
6
|
+
InputOTP,
|
|
7
|
+
InputOTPGroup,
|
|
8
|
+
InputOTPSeparator,
|
|
9
|
+
InputOTPSlot,
|
|
10
|
+
} from "@godxjp/ui/data-entry";
|
|
11
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* InputOTP — compound one-time-code input: InputOTP > InputOTPGroup > InputOTPSlot.
|
|
15
|
+
* ONE field with paste, arrow-key, and caret handling built in.
|
|
16
|
+
* Never use N separate Input fields for OTP. Composed only from real @godxjp/ui components.
|
|
17
|
+
*/
|
|
18
|
+
export default function Demo() {
|
|
19
|
+
const [emailCode, setEmailCode] = useState("");
|
|
20
|
+
const [smsCode, setSmsCode] = useState("");
|
|
21
|
+
const [inviteCode, setInviteCode] = useState("");
|
|
22
|
+
const [centeredCode, setCenteredCode] = useState("");
|
|
23
|
+
|
|
24
|
+
// Auto-submit pattern — onComplete fires when every slot is filled.
|
|
25
|
+
const [completeCode, setCompleteCode] = useState("123456");
|
|
26
|
+
const [verified, setVerified] = useState("123456");
|
|
27
|
+
|
|
28
|
+
// Error path — a wrong code seeded at rest so the invalid styling is visible
|
|
29
|
+
// without typing. FormField wires aria-invalid + aria-errormessage onto the field.
|
|
30
|
+
const [wrongCode, setWrongCode] = useState("000000");
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<PageContainer title="InputOTP" subtitle="ワンタイムコード入力 · 2FA・SMS認証・招待コード">
|
|
34
|
+
<Flex direction="col" gap="lg">
|
|
35
|
+
<Card>
|
|
36
|
+
<CardHeader>
|
|
37
|
+
<CardTitle level={2}>メール認証コード(6桁)</CardTitle>
|
|
38
|
+
<CardDescription>6スロット 1グループ · ペースト・矢印キー操作に対応。</CardDescription>
|
|
39
|
+
</CardHeader>
|
|
40
|
+
<CardContent>
|
|
41
|
+
<FormField id="email-otp" label="認証コード" required>
|
|
42
|
+
<InputOTP maxLength={6} value={emailCode} onChange={setEmailCode}>
|
|
43
|
+
<InputOTPGroup>
|
|
44
|
+
<InputOTPSlot index={0} />
|
|
45
|
+
<InputOTPSlot index={1} />
|
|
46
|
+
<InputOTPSlot index={2} />
|
|
47
|
+
<InputOTPSlot index={3} />
|
|
48
|
+
<InputOTPSlot index={4} />
|
|
49
|
+
<InputOTPSlot index={5} />
|
|
50
|
+
</InputOTPGroup>
|
|
51
|
+
</InputOTP>
|
|
52
|
+
</FormField>
|
|
53
|
+
</CardContent>
|
|
54
|
+
</Card>
|
|
55
|
+
|
|
56
|
+
<Card>
|
|
57
|
+
<CardHeader>
|
|
58
|
+
<CardTitle level={2}>SMS認証コード(3+3)</CardTitle>
|
|
59
|
+
<CardDescription>
|
|
60
|
+
InputOTPSeparator で 2 グループに分割して視認性を高める。
|
|
61
|
+
</CardDescription>
|
|
62
|
+
</CardHeader>
|
|
63
|
+
<CardContent>
|
|
64
|
+
<FormField id="sms-otp" label="SMSコード" required>
|
|
65
|
+
<InputOTP maxLength={6} value={smsCode} onChange={setSmsCode}>
|
|
66
|
+
<InputOTPGroup>
|
|
67
|
+
<InputOTPSlot index={0} />
|
|
68
|
+
<InputOTPSlot index={1} />
|
|
69
|
+
<InputOTPSlot index={2} />
|
|
70
|
+
</InputOTPGroup>
|
|
71
|
+
<InputOTPSeparator />
|
|
72
|
+
<InputOTPGroup>
|
|
73
|
+
<InputOTPSlot index={3} />
|
|
74
|
+
<InputOTPSlot index={4} />
|
|
75
|
+
<InputOTPSlot index={5} />
|
|
76
|
+
</InputOTPGroup>
|
|
77
|
+
</InputOTP>
|
|
78
|
+
</FormField>
|
|
79
|
+
</CardContent>
|
|
80
|
+
</Card>
|
|
81
|
+
|
|
82
|
+
<Card>
|
|
83
|
+
<CardHeader>
|
|
84
|
+
<CardTitle level={2}>招待コード(4桁PIN)</CardTitle>
|
|
85
|
+
<CardDescription>4スロット · 数字のみ許可する pattern を指定。</CardDescription>
|
|
86
|
+
</CardHeader>
|
|
87
|
+
<CardContent>
|
|
88
|
+
<FormField id="invite-pin" label="招待PIN" helper="メールに記載された4桁の数字">
|
|
89
|
+
<InputOTP
|
|
90
|
+
maxLength={4}
|
|
91
|
+
pattern="^[0-9]+$"
|
|
92
|
+
value={inviteCode}
|
|
93
|
+
onChange={setInviteCode}
|
|
94
|
+
>
|
|
95
|
+
<InputOTPGroup>
|
|
96
|
+
<InputOTPSlot index={0} />
|
|
97
|
+
<InputOTPSlot index={1} />
|
|
98
|
+
<InputOTPSlot index={2} />
|
|
99
|
+
<InputOTPSlot index={3} />
|
|
100
|
+
</InputOTPGroup>
|
|
101
|
+
</InputOTP>
|
|
102
|
+
</FormField>
|
|
103
|
+
</CardContent>
|
|
104
|
+
</Card>
|
|
105
|
+
|
|
106
|
+
<Card>
|
|
107
|
+
<CardHeader>
|
|
108
|
+
<CardTitle level={2}>自動送信(onComplete)</CardTitle>
|
|
109
|
+
<CardDescription>
|
|
110
|
+
全スロットが埋まると onComplete が発火し、ボタンを押さずに検証を実行する。
|
|
111
|
+
</CardDescription>
|
|
112
|
+
</CardHeader>
|
|
113
|
+
<CardContent>
|
|
114
|
+
<FormField
|
|
115
|
+
id="autosubmit-otp"
|
|
116
|
+
label="認証コード"
|
|
117
|
+
helper={
|
|
118
|
+
verified
|
|
119
|
+
? `${verified} を検証済み · 自動送信されました。`
|
|
120
|
+
: "6桁を入力すると自動で送信されます。"
|
|
121
|
+
}
|
|
122
|
+
required
|
|
123
|
+
>
|
|
124
|
+
<InputOTP
|
|
125
|
+
maxLength={6}
|
|
126
|
+
value={completeCode}
|
|
127
|
+
onChange={setCompleteCode}
|
|
128
|
+
onComplete={(code) => setVerified(code)}
|
|
129
|
+
>
|
|
130
|
+
<InputOTPGroup>
|
|
131
|
+
<InputOTPSlot index={0} />
|
|
132
|
+
<InputOTPSlot index={1} />
|
|
133
|
+
<InputOTPSlot index={2} />
|
|
134
|
+
<InputOTPSlot index={3} />
|
|
135
|
+
<InputOTPSlot index={4} />
|
|
136
|
+
<InputOTPSlot index={5} />
|
|
137
|
+
</InputOTPGroup>
|
|
138
|
+
</InputOTP>
|
|
139
|
+
</FormField>
|
|
140
|
+
</CardContent>
|
|
141
|
+
</Card>
|
|
142
|
+
|
|
143
|
+
{/* align — the centred challenge, without a consumer wrapper div (gh#12) */}
|
|
144
|
+
<Card>
|
|
145
|
+
<CardHeader>
|
|
146
|
+
<CardTitle level={2}>中央寄せ(align="center")</CardTitle>
|
|
147
|
+
<CardDescription>
|
|
148
|
+
認証画面のコード入力は中央寄せが定型。コンテナ要素は input-otp
|
|
149
|
+
が所有していて消費側から触れないため、以前は必ず flex の div
|
|
150
|
+
でラップする必要があった。align はそのラッパーを不要にする (テーマ全体なら
|
|
151
|
+
--otp-container-align を 1 か所)。
|
|
152
|
+
</CardDescription>
|
|
153
|
+
</CardHeader>
|
|
154
|
+
<CardContent>
|
|
155
|
+
<FormField id="centered-otp" label="認証コード" required>
|
|
156
|
+
<InputOTP
|
|
157
|
+
maxLength={6}
|
|
158
|
+
align="center"
|
|
159
|
+
value={centeredCode}
|
|
160
|
+
onChange={setCenteredCode}
|
|
161
|
+
>
|
|
162
|
+
<InputOTPGroup>
|
|
163
|
+
<InputOTPSlot index={0} />
|
|
164
|
+
<InputOTPSlot index={1} />
|
|
165
|
+
<InputOTPSlot index={2} />
|
|
166
|
+
</InputOTPGroup>
|
|
167
|
+
<InputOTPSeparator />
|
|
168
|
+
<InputOTPGroup>
|
|
169
|
+
<InputOTPSlot index={3} />
|
|
170
|
+
<InputOTPSlot index={4} />
|
|
171
|
+
<InputOTPSlot index={5} />
|
|
172
|
+
</InputOTPGroup>
|
|
173
|
+
</InputOTP>
|
|
174
|
+
</FormField>
|
|
175
|
+
</CardContent>
|
|
176
|
+
</Card>
|
|
177
|
+
|
|
178
|
+
<Card>
|
|
179
|
+
<CardHeader>
|
|
180
|
+
<CardTitle level={2}>エラー(コードが一致しない)</CardTitle>
|
|
181
|
+
<CardDescription>
|
|
182
|
+
FormField の error で aria-invalid を付与 · スロットの枠が destructive 色に変わる。
|
|
183
|
+
</CardDescription>
|
|
184
|
+
</CardHeader>
|
|
185
|
+
<CardContent>
|
|
186
|
+
<FormField
|
|
187
|
+
id="error-otp"
|
|
188
|
+
label="認証コード"
|
|
189
|
+
error="コードが正しくありません。もう一度入力してください。"
|
|
190
|
+
required
|
|
191
|
+
>
|
|
192
|
+
<InputOTP maxLength={6} value={wrongCode} onChange={setWrongCode}>
|
|
193
|
+
<InputOTPGroup>
|
|
194
|
+
<InputOTPSlot index={0} />
|
|
195
|
+
<InputOTPSlot index={1} />
|
|
196
|
+
<InputOTPSlot index={2} />
|
|
197
|
+
<InputOTPSlot index={3} />
|
|
198
|
+
<InputOTPSlot index={4} />
|
|
199
|
+
<InputOTPSlot index={5} />
|
|
200
|
+
</InputOTPGroup>
|
|
201
|
+
</InputOTP>
|
|
202
|
+
</FormField>
|
|
203
|
+
</CardContent>
|
|
204
|
+
</Card>
|
|
205
|
+
|
|
206
|
+
<Card>
|
|
207
|
+
<CardHeader>
|
|
208
|
+
<CardTitle level={2}>無効(再送クールダウン中)</CardTitle>
|
|
209
|
+
<CardDescription>
|
|
210
|
+
disabled · コード再送のクールダウンや検証中は入力をロックする。
|
|
211
|
+
</CardDescription>
|
|
212
|
+
</CardHeader>
|
|
213
|
+
<CardContent>
|
|
214
|
+
<FormField id="disabled-otp" label="認証コード" helper="60秒後に再入力できます。">
|
|
215
|
+
<InputOTP disabled maxLength={6} value="42" onChange={() => {}}>
|
|
216
|
+
<InputOTPGroup>
|
|
217
|
+
<InputOTPSlot index={0} />
|
|
218
|
+
<InputOTPSlot index={1} />
|
|
219
|
+
<InputOTPSlot index={2} />
|
|
220
|
+
<InputOTPSlot index={3} />
|
|
221
|
+
<InputOTPSlot index={4} />
|
|
222
|
+
<InputOTPSlot index={5} />
|
|
223
|
+
</InputOTPGroup>
|
|
224
|
+
</InputOTP>
|
|
225
|
+
</FormField>
|
|
226
|
+
</CardContent>
|
|
227
|
+
</Card>
|
|
228
|
+
</Flex>
|
|
229
|
+
</PageContainer>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { FormField, Input } from "@godxjp/ui/data-entry";
|
|
5
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Input — styled wrapper around the native input. Always pair with FormField for
|
|
9
|
+
* a labelled, a11y-wired field. Never a raw <input>. Composed only from real
|
|
10
|
+
* @godxjp/ui components.
|
|
11
|
+
*/
|
|
12
|
+
export default function Demo() {
|
|
13
|
+
const [contractValue, setContractValue] = useState("制御値");
|
|
14
|
+
return (
|
|
15
|
+
<PageContainer
|
|
16
|
+
title="Input"
|
|
17
|
+
subtitle="Text field · pair with FormField for label / helper / error"
|
|
18
|
+
>
|
|
19
|
+
<Flex direction="col" gap="lg">
|
|
20
|
+
<Card>
|
|
21
|
+
<CardHeader>
|
|
22
|
+
<CardTitle level={2}>States</CardTitle>
|
|
23
|
+
<CardDescription>
|
|
24
|
+
Placeholder, filled, disabled, readOnly, and invalid (aria-invalid). Focus an empty
|
|
25
|
+
field to see the focus-visible ring.
|
|
26
|
+
</CardDescription>
|
|
27
|
+
</CardHeader>
|
|
28
|
+
<CardContent>
|
|
29
|
+
<Flex direction="col" gap="md">
|
|
30
|
+
<Input aria-label="プレースホルダー状態" placeholder="プレースホルダー" />
|
|
31
|
+
<Input aria-label="入力済み状態" defaultValue="入力済みの値" />
|
|
32
|
+
<Input aria-label="無効状態" disabled defaultValue="無効 (disabled)" />
|
|
33
|
+
<Input
|
|
34
|
+
aria-label="読み取り専用状態"
|
|
35
|
+
readOnly
|
|
36
|
+
defaultValue="読み取り専用 (readOnly)"
|
|
37
|
+
/>
|
|
38
|
+
<Input
|
|
39
|
+
aria-label="不正な値の状態"
|
|
40
|
+
aria-invalid
|
|
41
|
+
defaultValue="不正な値 (aria-invalid)"
|
|
42
|
+
/>
|
|
43
|
+
</Flex>
|
|
44
|
+
</CardContent>
|
|
45
|
+
</Card>
|
|
46
|
+
|
|
47
|
+
<Card>
|
|
48
|
+
<CardHeader>
|
|
49
|
+
<CardTitle level={2}>Owned affordances · controlled and uncontrolled</CardTitle>
|
|
50
|
+
<CardDescription>
|
|
51
|
+
Leading/trailing content and allowClear/onClear are rendered with both value modes.
|
|
52
|
+
</CardDescription>
|
|
53
|
+
</CardHeader>
|
|
54
|
+
<CardContent>
|
|
55
|
+
<Flex direction="col" gap="md">
|
|
56
|
+
<Input
|
|
57
|
+
aria-label="制御されたクリア可能入力"
|
|
58
|
+
value={contractValue}
|
|
59
|
+
onChange={(event) => setContractValue(event.target.value)}
|
|
60
|
+
allowClear
|
|
61
|
+
onClear={() => setContractValue("")}
|
|
62
|
+
leadingIcon={<span aria-hidden="true">¥</span>}
|
|
63
|
+
/>
|
|
64
|
+
<Input
|
|
65
|
+
aria-label="非制御の装飾付き入力"
|
|
66
|
+
defaultValue="INV-2026-001"
|
|
67
|
+
allowClear={false}
|
|
68
|
+
trailingIcon={<span aria-hidden="true">#</span>}
|
|
69
|
+
/>
|
|
70
|
+
</Flex>
|
|
71
|
+
</CardContent>
|
|
72
|
+
</Card>
|
|
73
|
+
|
|
74
|
+
<Card>
|
|
75
|
+
<CardHeader>
|
|
76
|
+
<CardTitle level={2}>Types</CardTitle>
|
|
77
|
+
<CardDescription>
|
|
78
|
+
The native type attribute drives the input mode and built-in UI; type="file" uses the
|
|
79
|
+
file: styling baked into the component.
|
|
80
|
+
</CardDescription>
|
|
81
|
+
</CardHeader>
|
|
82
|
+
<CardContent>
|
|
83
|
+
<Flex direction="col" gap="md">
|
|
84
|
+
<Input aria-label="パスワード型" type="password" defaultValue="secret-value" />
|
|
85
|
+
<Input aria-label="数値型" type="number" defaultValue={42} />
|
|
86
|
+
<Input aria-label="日付型" type="date" defaultValue="2026-06-04" />
|
|
87
|
+
<Input type="file" aria-label="ファイルを選択" />
|
|
88
|
+
</Flex>
|
|
89
|
+
</CardContent>
|
|
90
|
+
</Card>
|
|
91
|
+
|
|
92
|
+
<Card>
|
|
93
|
+
<CardHeader>
|
|
94
|
+
<CardTitle level={2}>In FormField · label / helper / required / error</CardTitle>
|
|
95
|
+
<CardDescription>
|
|
96
|
+
FormField wires the label and aria-describedby for you.
|
|
97
|
+
</CardDescription>
|
|
98
|
+
</CardHeader>
|
|
99
|
+
<CardContent>
|
|
100
|
+
<Flex direction="col" gap="md">
|
|
101
|
+
<FormField id="partner" label="取引先名" required helper="最大50文字">
|
|
102
|
+
<Input id="partner" placeholder="株式会社..." />
|
|
103
|
+
</FormField>
|
|
104
|
+
<FormField id="email" label="メール" error="メールアドレスの形式が正しくありません">
|
|
105
|
+
<Input id="email" type="email" defaultValue="invalid@" />
|
|
106
|
+
</FormField>
|
|
107
|
+
</Flex>
|
|
108
|
+
</CardContent>
|
|
109
|
+
</Card>
|
|
110
|
+
<Input id="code" size="sm" placeholder="Compact tier (sm)" aria-label="Code" />
|
|
111
|
+
</Flex>
|
|
112
|
+
</PageContainer>
|
|
113
|
+
);
|
|
114
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
2
|
+
import { Checkbox, FormField, Input, Label, Switch, Textarea } from "@godxjp/ui/data-entry";
|
|
3
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Label — styled Radix Label. Always pass htmlFor matching the control's id.
|
|
7
|
+
* PREFER FormField for fields that need helper text, error, or a required marker —
|
|
8
|
+
* it renders Label internally and wires aria-describedby / aria-invalid. Use bare
|
|
9
|
+
* Label only when FormField's block layout is too heavy (inline settings rows,
|
|
10
|
+
* table cells, third-party controls). Composed only from real @godxjp/ui components.
|
|
11
|
+
*/
|
|
12
|
+
export default function Demo() {
|
|
13
|
+
return (
|
|
14
|
+
<PageContainer
|
|
15
|
+
title="Label"
|
|
16
|
+
subtitle="Bare Radix Label · always htmlFor; prefer FormField when helper / error / required is needed"
|
|
17
|
+
>
|
|
18
|
+
<Flex direction="col" gap="lg">
|
|
19
|
+
<Card>
|
|
20
|
+
<CardHeader>
|
|
21
|
+
<CardTitle level={2}>Label + Checkbox (inline)</CardTitle>
|
|
22
|
+
<CardDescription>
|
|
23
|
+
A compact pair where Field’s two-line layout is unnecessary, e.g. a “remember me” row.
|
|
24
|
+
When the peer control is disabled, the Label dims (peer-disabled:opacity-70 +
|
|
25
|
+
cursor-not-allowed).
|
|
26
|
+
</CardDescription>
|
|
27
|
+
</CardHeader>
|
|
28
|
+
<CardContent>
|
|
29
|
+
<Flex direction="col" gap="sm">
|
|
30
|
+
<Flex direction="row" gap="sm" align="center">
|
|
31
|
+
<Checkbox id="remember-me" defaultChecked />
|
|
32
|
+
<Label htmlFor="remember-me">ログイン状態を保持する</Label>
|
|
33
|
+
</Flex>
|
|
34
|
+
<Flex direction="row" gap="sm" align="center">
|
|
35
|
+
<Checkbox id="remember-device" disabled />
|
|
36
|
+
<Label htmlFor="remember-device">この端末を信頼する(無効)</Label>
|
|
37
|
+
</Flex>
|
|
38
|
+
</Flex>
|
|
39
|
+
</CardContent>
|
|
40
|
+
</Card>
|
|
41
|
+
|
|
42
|
+
<Card>
|
|
43
|
+
<CardHeader>
|
|
44
|
+
<CardTitle level={2}>Label + Switch (settings row)</CardTitle>
|
|
45
|
+
<CardDescription>
|
|
46
|
+
Labelling a standalone Switch in an inline row that FormField’s full-width block would
|
|
47
|
+
break.
|
|
48
|
+
</CardDescription>
|
|
49
|
+
</CardHeader>
|
|
50
|
+
<CardContent>
|
|
51
|
+
<Flex direction="col" gap="md">
|
|
52
|
+
<Flex direction="row" gap="sm" align="center" justify="between">
|
|
53
|
+
<Label htmlFor="auto-save">自動保存</Label>
|
|
54
|
+
<Switch id="auto-save" defaultChecked />
|
|
55
|
+
</Flex>
|
|
56
|
+
<Flex direction="row" gap="sm" align="center" justify="between">
|
|
57
|
+
<Label htmlFor="due-reminder">支払い期日リマインダー</Label>
|
|
58
|
+
<Switch id="due-reminder" />
|
|
59
|
+
</Flex>
|
|
60
|
+
</Flex>
|
|
61
|
+
</CardContent>
|
|
62
|
+
</Card>
|
|
63
|
+
|
|
64
|
+
<Card>
|
|
65
|
+
<CardHeader>
|
|
66
|
+
<CardTitle level={2}>Label + Textarea (minimal)</CardTitle>
|
|
67
|
+
<CardDescription>
|
|
68
|
+
A free-text field where helper / error slots are not needed.
|
|
69
|
+
</CardDescription>
|
|
70
|
+
</CardHeader>
|
|
71
|
+
<CardContent>
|
|
72
|
+
<FormField id="memo" label="備考">
|
|
73
|
+
<Textarea id="memo" placeholder="仕訳に関するメモを入力..." rows={3} />
|
|
74
|
+
</FormField>
|
|
75
|
+
</CardContent>
|
|
76
|
+
</Card>
|
|
77
|
+
|
|
78
|
+
<Card>
|
|
79
|
+
<CardHeader>
|
|
80
|
+
<CardTitle level={2}>FormField vs bare Label · prefer FormField</CardTitle>
|
|
81
|
+
<CardDescription>
|
|
82
|
+
FormField renders Label internally, wires aria-describedby / aria-invalid, and adds
|
|
83
|
+
the helper / error / required slots. Use it for real form fields.
|
|
84
|
+
</CardDescription>
|
|
85
|
+
</CardHeader>
|
|
86
|
+
<CardContent>
|
|
87
|
+
<Flex direction="col" gap="md">
|
|
88
|
+
<FormField id="invoice-no" label="請求書番号" required helper="例: INV-2024-001">
|
|
89
|
+
<Input id="invoice-no" placeholder="INV-2024-001" />
|
|
90
|
+
</FormField>
|
|
91
|
+
<FormField id="note" label="摘要" error="摘要は必須です">
|
|
92
|
+
<Input id="note" defaultValue="" />
|
|
93
|
+
</FormField>
|
|
94
|
+
</Flex>
|
|
95
|
+
</CardContent>
|
|
96
|
+
</Card>
|
|
97
|
+
</Flex>
|
|
98
|
+
</PageContainer>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { FormField, MonthPicker } from "@godxjp/ui/data-entry";
|
|
5
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
6
|
+
|
|
7
|
+
/** MonthPicker — typeable yyyy/MM field with a localized month-grid affordance. */
|
|
8
|
+
export default function Demo() {
|
|
9
|
+
const [month, setMonth] = useState<Date | undefined>(new Date(2026, 6, 1));
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<PageContainer title="MonthPicker" subtitle="年月入力 · yyyy/MM + 月グリッド">
|
|
13
|
+
<Flex direction="col" gap="lg">
|
|
14
|
+
<Card>
|
|
15
|
+
<CardHeader>
|
|
16
|
+
<CardTitle level={2}>Controlled · form submission</CardTitle>
|
|
17
|
+
<CardDescription>
|
|
18
|
+
value + onValueChange で制御し、name は yyyy/MM の表示値を送信する。直接入力と
|
|
19
|
+
月グリッド選択のどちらも利用できる。
|
|
20
|
+
</CardDescription>
|
|
21
|
+
</CardHeader>
|
|
22
|
+
<CardContent>
|
|
23
|
+
<FormField id="billing-month" label="請求年月" required helper="yyyy/MM 形式">
|
|
24
|
+
<MonthPicker
|
|
25
|
+
id="billing-month"
|
|
26
|
+
name="billing_month"
|
|
27
|
+
value={month}
|
|
28
|
+
onValueChange={setMonth}
|
|
29
|
+
/>
|
|
30
|
+
</FormField>
|
|
31
|
+
</CardContent>
|
|
32
|
+
</Card>
|
|
33
|
+
|
|
34
|
+
<Card>
|
|
35
|
+
<CardHeader>
|
|
36
|
+
<CardTitle level={2}>Uncontrolled · bounded years</CardTitle>
|
|
37
|
+
<CardDescription>
|
|
38
|
+
defaultValue で内部状態を初期化し、fromYear / toYear で年移動を制限する。
|
|
39
|
+
</CardDescription>
|
|
40
|
+
</CardHeader>
|
|
41
|
+
<CardContent>
|
|
42
|
+
<FormField id="fiscal-month" label="会計年月">
|
|
43
|
+
<MonthPicker
|
|
44
|
+
id="fiscal-month"
|
|
45
|
+
name="fiscal_month"
|
|
46
|
+
defaultValue={new Date(2025, 3, 1)}
|
|
47
|
+
fromYear={2024}
|
|
48
|
+
toYear={2027}
|
|
49
|
+
/>
|
|
50
|
+
</FormField>
|
|
51
|
+
</CardContent>
|
|
52
|
+
</Card>
|
|
53
|
+
|
|
54
|
+
<Card>
|
|
55
|
+
<CardHeader>
|
|
56
|
+
<CardTitle level={2}>Clear affordance variants</CardTitle>
|
|
57
|
+
<CardDescription>
|
|
58
|
+
値がある既定状態ではクリア操作を表示する。必須フィールドでは allowClear=false
|
|
59
|
+
にして不用意な空値を防ぐ。
|
|
60
|
+
</CardDescription>
|
|
61
|
+
</CardHeader>
|
|
62
|
+
<CardContent>
|
|
63
|
+
<Flex direction="col" gap="md">
|
|
64
|
+
<FormField id="clearable-month" label="クリア可能">
|
|
65
|
+
<MonthPicker id="clearable-month" defaultValue={new Date(2026, 0, 1)} />
|
|
66
|
+
</FormField>
|
|
67
|
+
<FormField id="fixed-month" label="クリア不可" required>
|
|
68
|
+
<MonthPicker
|
|
69
|
+
id="fixed-month"
|
|
70
|
+
defaultValue={new Date(2026, 0, 1)}
|
|
71
|
+
allowClear={false}
|
|
72
|
+
/>
|
|
73
|
+
</FormField>
|
|
74
|
+
</Flex>
|
|
75
|
+
</CardContent>
|
|
76
|
+
</Card>
|
|
77
|
+
|
|
78
|
+
<Card>
|
|
79
|
+
<CardHeader>
|
|
80
|
+
<CardTitle level={2}>Disabled · empty and populated</CardTitle>
|
|
81
|
+
<CardDescription>権限不足または確定済みデータの操作不可状態。</CardDescription>
|
|
82
|
+
</CardHeader>
|
|
83
|
+
<CardContent>
|
|
84
|
+
<Flex direction="col" gap="md">
|
|
85
|
+
<FormField id="disabled-month-empty" label="無効(未選択)">
|
|
86
|
+
<MonthPicker id="disabled-month-empty" disabled />
|
|
87
|
+
</FormField>
|
|
88
|
+
<FormField id="disabled-month-value" label="無効(選択済み)">
|
|
89
|
+
<MonthPicker
|
|
90
|
+
id="disabled-month-value"
|
|
91
|
+
defaultValue={new Date(2026, 8, 1)}
|
|
92
|
+
disabled
|
|
93
|
+
/>
|
|
94
|
+
</FormField>
|
|
95
|
+
</Flex>
|
|
96
|
+
</CardContent>
|
|
97
|
+
</Card>
|
|
98
|
+
</Flex>
|
|
99
|
+
</PageContainer>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { FormField, MonthRangePicker } from "@godxjp/ui/data-entry";
|
|
5
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
6
|
+
import type { DateRange } from "react-day-picker";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* MonthRangePicker — 年月 (yyyy/MM) 範囲入力。DateRangePicker と同じ
|
|
10
|
+
* 「ひとつのコントロール [開始 → 終了 ✕ 📅]」規約で、月グリッドポップオーバーを
|
|
11
|
+
* 視覚的アフォーダンスとして持つ。逆順 (from > to) は自動で入れ替え正規化される。
|
|
12
|
+
* MonthPicker を 2 つ並べて範囲を偽装しないこと。
|
|
13
|
+
*/
|
|
14
|
+
export default function Demo() {
|
|
15
|
+
const [closing, setClosing] = useState<DateRange | undefined>({
|
|
16
|
+
from: new Date(2026, 0, 1),
|
|
17
|
+
to: new Date(2026, 5, 1),
|
|
18
|
+
});
|
|
19
|
+
const [negotiation, setNegotiation] = useState<DateRange | undefined>(undefined);
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<PageContainer
|
|
23
|
+
title="MonthRangePicker"
|
|
24
|
+
subtitle="年月範囲入力 · 開始/終了 yyyy/MM 入力 + 月グリッドポップオーバー"
|
|
25
|
+
>
|
|
26
|
+
<Flex direction="col" gap="lg">
|
|
27
|
+
<Card>
|
|
28
|
+
<CardHeader>
|
|
29
|
+
<CardTitle level={2}>基本 (controlled)</CardTitle>
|
|
30
|
+
<CardDescription>
|
|
31
|
+
value + onValueChange で制御。開始/終了を直接タイプ入力するか、カレンダーアイコンから
|
|
32
|
+
月グリッドで 2 ステップ選択 (開始 → 終了)。逆順に選んでも from ≤ to
|
|
33
|
+
に自動正規化される。name="closing_ym" を指定すると closing_ym_from /
|
|
34
|
+
closing_ym_to として yyyy/MM でフォーム送信される。
|
|
35
|
+
</CardDescription>
|
|
36
|
+
</CardHeader>
|
|
37
|
+
<CardContent>
|
|
38
|
+
<FormField id="closing-ym" label="締め年月" required>
|
|
39
|
+
<MonthRangePicker
|
|
40
|
+
id="closing-ym"
|
|
41
|
+
name="closing_ym"
|
|
42
|
+
value={closing}
|
|
43
|
+
onValueChange={setClosing}
|
|
44
|
+
/>
|
|
45
|
+
</FormField>
|
|
46
|
+
</CardContent>
|
|
47
|
+
</Card>
|
|
48
|
+
|
|
49
|
+
<Card>
|
|
50
|
+
<CardHeader>
|
|
51
|
+
<CardTitle level={2}>検索フィルター (未選択)</CardTitle>
|
|
52
|
+
<CardDescription>
|
|
53
|
+
初期値なし。確定済み範囲の上でもう一度選ぶと新しい範囲が開始される (reset-on-complete
|
|
54
|
+
— 開始月が固まって選び直せない、が起きない)。
|
|
55
|
+
</CardDescription>
|
|
56
|
+
</CardHeader>
|
|
57
|
+
<CardContent>
|
|
58
|
+
<FormField id="negotiation-ym" label="商談発生年月">
|
|
59
|
+
<MonthRangePicker
|
|
60
|
+
id="negotiation-ym"
|
|
61
|
+
name="search_negotiation_ym"
|
|
62
|
+
value={negotiation}
|
|
63
|
+
onValueChange={setNegotiation}
|
|
64
|
+
/>
|
|
65
|
+
</FormField>
|
|
66
|
+
</CardContent>
|
|
67
|
+
</Card>
|
|
68
|
+
|
|
69
|
+
<Card>
|
|
70
|
+
<CardHeader>
|
|
71
|
+
<CardTitle level={2}>非制御 (defaultValue) + 年クランプ</CardTitle>
|
|
72
|
+
<CardDescription>
|
|
73
|
+
defaultValue で初期範囲だけ与え、fromYear / toYear
|
|
74
|
+
でグリッドの年ナビゲーションを境界年で止める。
|
|
75
|
+
</CardDescription>
|
|
76
|
+
</CardHeader>
|
|
77
|
+
<CardContent>
|
|
78
|
+
<FormField id="fiscal-ym" label="会計年度範囲 (2024–2027)">
|
|
79
|
+
<MonthRangePicker
|
|
80
|
+
id="fiscal-ym"
|
|
81
|
+
name="fiscal_ym"
|
|
82
|
+
defaultValue={{
|
|
83
|
+
from: new Date(2026, 3, 1),
|
|
84
|
+
to: new Date(2027, 2, 1),
|
|
85
|
+
}}
|
|
86
|
+
fromYear={2024}
|
|
87
|
+
toYear={2027}
|
|
88
|
+
/>
|
|
89
|
+
</FormField>
|
|
90
|
+
</CardContent>
|
|
91
|
+
</Card>
|
|
92
|
+
|
|
93
|
+
<Card>
|
|
94
|
+
<CardHeader>
|
|
95
|
+
<CardTitle level={2}>disabled 状態</CardTitle>
|
|
96
|
+
<CardDescription>確定済み範囲や読み取り専用フィールドに使用。</CardDescription>
|
|
97
|
+
</CardHeader>
|
|
98
|
+
<CardContent>
|
|
99
|
+
<FormField id="locked-ym" label="確定範囲">
|
|
100
|
+
<MonthRangePicker
|
|
101
|
+
id="locked-ym"
|
|
102
|
+
name="locked_ym"
|
|
103
|
+
value={{
|
|
104
|
+
from: new Date(2025, 3, 1),
|
|
105
|
+
to: new Date(2026, 2, 1),
|
|
106
|
+
}}
|
|
107
|
+
disabled
|
|
108
|
+
/>
|
|
109
|
+
</FormField>
|
|
110
|
+
</CardContent>
|
|
111
|
+
</Card>
|
|
112
|
+
</Flex>
|
|
113
|
+
</PageContainer>
|
|
114
|
+
);
|
|
115
|
+
}
|