@godxjp/ui 19.0.0 → 19.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -128
- package/dist/app/app-provider.d.ts +1 -1
- package/dist/app/app-provider.js +3 -0
- package/dist/app/theme-axes.d.ts +4 -15
- package/dist/app/timezones.d.ts +1 -4
- package/dist/components/charts/area-chart.d.ts +2 -3
- package/dist/components/charts/bar-chart.d.ts +2 -3
- package/dist/components/charts/chart-frame.d.ts +7 -16
- package/dist/components/charts/chart-summary.d.ts +2 -2
- package/dist/components/charts/compact-bar-trend.d.ts +9 -24
- package/dist/components/charts/index.d.ts +1 -6
- package/dist/components/data-display/badge.d.ts +2 -12
- package/dist/components/data-display/card.d.ts +21 -41
- package/dist/components/data-display/carousel.d.ts +1 -2
- package/dist/components/data-display/code-block.d.ts +4 -0
- package/dist/components/data-display/code-block.js +24 -0
- package/dist/components/data-display/data-table.d.ts +15 -37
- package/dist/components/data-display/data-table.js +1 -3
- package/dist/components/data-display/descriptions.d.ts +2 -6
- package/dist/components/data-display/descriptions.js +0 -2
- package/dist/components/data-display/index.d.ts +4 -0
- package/dist/components/data-display/index.js +4 -0
- package/dist/components/data-display/list-row.d.ts +3 -22
- package/dist/components/data-display/permission-matrix.d.ts +7 -20
- package/dist/components/data-display/progress.d.ts +1 -1
- package/dist/components/data-display/prose.d.ts +4 -0
- package/dist/components/data-display/prose.js +20 -0
- package/dist/components/data-display/service-launcher-card.d.ts +3 -10
- package/dist/components/data-display/table.d.ts +20 -80
- package/dist/components/data-display/table.js +0 -3
- package/dist/components/data-display/timeline.d.ts +3 -5
- package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
- package/dist/components/data-entry/branch-scope-picker.js +0 -1
- package/dist/components/data-entry/calendar.d.ts +3 -2
- package/dist/components/data-entry/calendar.js +58 -3
- package/dist/components/data-entry/cascader.js +3 -1
- package/dist/components/data-entry/checkbox-group.js +12 -5
- package/dist/components/data-entry/checkbox.js +30 -21
- 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 +12 -3
- package/dist/components/data-entry/date-range-picker.d.ts +1 -1
- package/dist/components/data-entry/date-range-picker.js +17 -6
- package/dist/components/data-entry/form-errors.d.ts +7 -18
- package/dist/components/data-entry/form-field.d.ts +1 -1
- package/dist/components/data-entry/form-field.js +15 -6
- 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 +13 -3
- package/dist/components/data-entry/month-picker.js +6 -4
- package/dist/components/data-entry/month-range-picker.d.ts +4 -6
- package/dist/components/data-entry/month-range-picker.js +11 -5
- 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 +19 -6
- package/dist/components/data-entry/search-select.d.ts +3 -5
- package/dist/components/data-entry/search-select.js +8 -2
- package/dist/components/data-entry/select.d.ts +15 -2
- package/dist/components/data-entry/select.js +57 -10
- package/dist/components/data-entry/switch.js +9 -2
- package/dist/components/data-entry/textarea.d.ts +10 -16
- package/dist/components/data-entry/textarea.js +8 -1
- package/dist/components/data-entry/time-picker.d.ts +3 -5
- package/dist/components/data-entry/tree-select.js +3 -1
- 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 +31 -36
- package/dist/lib/field-a11y.js +16 -2
- 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 +19 -27
- package/dist/props/components/charts.prop.d.ts +2 -3
- package/dist/props/components/data-display.prop.d.ts +48 -72
- package/dist/props/components/data-entry.prop.d.ts +41 -30
- package/dist/props/components/form.prop.d.ts +2 -6
- package/dist/props/components/general.prop.d.ts +11 -27
- package/dist/props/components/layout.prop.d.ts +89 -260
- package/dist/props/components/navigation.prop.d.ts +27 -42
- package/dist/props/registry.d.ts +31 -0
- package/dist/props/registry.js +33 -0
- package/dist/props/vocabulary/data.prop.d.ts +18 -49
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
- package/dist/props/vocabulary/layout.prop.d.ts +8 -30
- package/dist/props/vocabulary/shared.prop.d.ts +3 -2
- package/dist/styles/alert-layout.css +1 -32
- package/dist/styles/badge-layout.css +4 -18
- package/dist/styles/base.css +14 -113
- package/dist/styles/card-layout.css +6 -128
- package/dist/styles/chart-layout.css +2 -17
- package/dist/styles/control.css +380 -458
- package/dist/styles/core.css +21 -0
- package/dist/styles/data-display-layout.css +175 -94
- package/dist/styles/data-entry-layout.css +0 -45
- package/dist/styles/density.css +1 -30
- package/dist/styles/dialog-layout.css +5 -69
- package/dist/styles/focus-ring.css +13 -87
- package/dist/styles/fonts.css +1 -31
- package/dist/styles/form-layout.css +7 -91
- package/dist/styles/index.css +2 -20
- package/dist/styles/layout.css +38 -456
- package/dist/styles/logo-layout.css +1 -35
- package/dist/styles/motion.css +3 -42
- package/dist/styles/navigation-layout.css +3 -50
- package/dist/styles/shell-layout.css +37 -403
- package/dist/styles/table-layout.css +16 -274
- package/dist/styles/text-layout.css +7 -21
- package/dist/styles/toggle.css +1 -23
- package/dist/theme/dxs.canonical.css +1 -55
- package/dist/theme/example.service.css +1 -26
- package/dist/theme/famgia.service.css +5 -15
- package/dist/tokens/axes.css +3 -40
- package/dist/tokens/base.css +1 -4
- package/dist/tokens/components/activity.css +6 -42
- package/dist/tokens/components/badge.css +4 -13
- package/dist/tokens/components/banner.css +4 -9
- package/dist/tokens/components/card.css +32 -88
- package/dist/tokens/components/chart.css +9 -26
- package/dist/tokens/components/control.css +37 -222
- package/dist/tokens/components/data-display.css +28 -79
- package/dist/tokens/components/data-entry.css +5 -19
- package/dist/tokens/components/descriptions.css +7 -27
- package/dist/tokens/components/email.css +38 -84
- package/dist/tokens/components/error-surface.css +2 -18
- package/dist/tokens/components/feedback.css +27 -124
- package/dist/tokens/components/form.css +13 -45
- package/dist/tokens/components/legal-document.css +16 -41
- package/dist/tokens/components/list-row.css +11 -36
- package/dist/tokens/components/logo.css +2 -57
- package/dist/tokens/components/navigation.css +16 -94
- package/dist/tokens/components/scroll-area.css +2 -18
- package/dist/tokens/components/separator.css +8 -30
- package/dist/tokens/components/sheet.css +3 -14
- package/dist/tokens/components/shell.css +53 -307
- package/dist/tokens/components/sidebar.css +5 -22
- package/dist/tokens/components/table.css +19 -140
- package/dist/tokens/components/toggle.css +3 -65
- package/dist/tokens/components/upload.css +7 -43
- package/dist/tokens/foundation.css +108 -383
- package/dist/tokens/semantic/layout.css +33 -207
- package/docs/CANONICAL-CONTRACTS.md +206 -0
- package/docs/COMPONENTS.md +157 -0
- package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
- package/docs/CONSUMER-RULES.md +14 -0
- package/docs/CUSTOMER-THEMING.md +162 -0
- package/docs/DATETIME.md +69 -0
- package/docs/DEVELOPMENT.md +173 -0
- package/docs/FORMS.md +143 -0
- package/docs/FRAME-A11Y-CI.md +267 -0
- package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
- package/docs/FRAME-COVERAGE-REPORT.md +140 -0
- package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
- package/docs/FRAME-COVERAGE.md +29 -0
- package/docs/PROPS-REGISTRY.md +61 -0
- package/docs/PROPS-VOCABULARY.md +100 -0
- package/docs/README.md +60 -0
- package/docs/REGISTRY.md +70 -0
- package/docs/SPACING.md +56 -0
- package/docs/STANDARDS-vocabulary-tokens.md +48 -0
- package/docs/TESTING.md +98 -0
- package/docs/TOKENS.md +347 -0
- package/docs/asset-modules.d.ts +46 -0
- package/docs/assets/cover-terrain.svg +6 -0
- package/docs/assets/portrait-amber.svg +5 -0
- package/docs/assets/portrait-clay.svg +5 -0
- package/docs/assets/portrait-indigo.svg +5 -0
- package/docs/assets/portrait-iris.svg +5 -0
- package/docs/assets/portrait-moss.svg +5 -0
- package/docs/assets/portrait-plum.svg +5 -0
- package/docs/assets/portrait-slate.svg +5 -0
- package/docs/charts/compact-bar-trend.tsx +328 -0
- package/docs/charts/size-tiers.tsx +192 -0
- package/docs/data-display/accordion.tsx +99 -0
- package/docs/data-display/avatar.tsx +355 -0
- package/docs/data-display/badge.tsx +247 -0
- package/docs/data-display/card/examples/detail-panel.tsx +106 -0
- package/docs/data-display/card/index.md +3 -0
- package/docs/data-display/card/index.tsx +285 -0
- package/docs/data-display/carousel.tsx +156 -0
- package/docs/data-display/charts.tsx +198 -0
- package/docs/data-display/code-block.tsx +90 -0
- package/docs/data-display/collapsible.tsx +162 -0
- package/docs/data-display/credential-reveal.tsx +145 -0
- package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
- package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
- package/docs/data-display/data-table/examples/list-page.tsx +175 -0
- package/docs/data-display/data-table/index.md +5 -0
- package/docs/data-display/data-table/index.tsx +295 -0
- package/docs/data-display/descriptions.tsx +143 -0
- package/docs/data-display/empty-state.tsx +164 -0
- package/docs/data-display/hover-card.tsx +181 -0
- package/docs/data-display/list-row.tsx +420 -0
- package/docs/data-display/permission-matrix.tsx +184 -0
- package/docs/data-display/popover-touch.tsx +27 -0
- package/docs/data-display/popover.tsx +245 -0
- package/docs/data-display/progress.tsx +84 -0
- package/docs/data-display/prose.tsx +105 -0
- package/docs/data-display/qr-code.tsx +68 -0
- package/docs/data-display/scroll-area.tsx +271 -0
- package/docs/data-display/service-launcher-card.tsx +145 -0
- package/docs/data-display/stat-card.tsx +99 -0
- package/docs/data-display/table.tsx +251 -0
- package/docs/data-display/timeline.tsx +112 -0
- package/docs/data-display/touch-actions.tsx +36 -0
- package/docs/data-display/tree-list.tsx +107 -0
- package/docs/data-entry/branch-scope-picker.tsx +123 -0
- package/docs/data-entry/calendar.tsx +180 -0
- package/docs/data-entry/cascader.tsx +378 -0
- package/docs/data-entry/checkbox.tsx +256 -0
- package/docs/data-entry/color-picker.tsx +117 -0
- package/docs/data-entry/command-palette.tsx +179 -0
- package/docs/data-entry/command.tsx +262 -0
- package/docs/data-entry/country-picker-recipe.tsx +170 -0
- package/docs/data-entry/date-picker.tsx +191 -0
- package/docs/data-entry/date-range-picker.tsx +149 -0
- package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
- package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
- package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
- package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
- package/docs/data-entry/form-field/index.md +8 -0
- package/docs/data-entry/form-field/index.tsx +326 -0
- package/docs/data-entry/form-inertia.tsx +80 -0
- package/docs/data-entry/form-root.tsx +102 -0
- package/docs/data-entry/form.tsx +724 -0
- package/docs/data-entry/input-otp.tsx +231 -0
- package/docs/data-entry/input.tsx +114 -0
- package/docs/data-entry/label.tsx +100 -0
- package/docs/data-entry/month-picker.tsx +101 -0
- package/docs/data-entry/month-range-picker.tsx +115 -0
- package/docs/data-entry/number-input.tsx +240 -0
- package/docs/data-entry/password-input.tsx +106 -0
- package/docs/data-entry/password-strength.tsx +97 -0
- package/docs/data-entry/radio-group.tsx +95 -0
- package/docs/data-entry/rating.tsx +87 -0
- package/docs/data-entry/search-input.tsx +120 -0
- package/docs/data-entry/select-async-contracts.tsx +108 -0
- package/docs/data-entry/select-matrix.tsx +204 -0
- package/docs/data-entry/select.tsx +369 -0
- package/docs/data-entry/slider.tsx +130 -0
- package/docs/data-entry/switch.tsx +67 -0
- package/docs/data-entry/tag-input.tsx +108 -0
- package/docs/data-entry/textarea.tsx +209 -0
- package/docs/data-entry/time-picker.tsx +99 -0
- package/docs/data-entry/toggle-count.tsx +293 -0
- package/docs/data-entry/toggle-group.tsx +225 -0
- package/docs/data-entry/toggle.tsx +127 -0
- package/docs/data-entry/transfer.tsx +97 -0
- package/docs/data-entry/tree-select.tsx +204 -0
- package/docs/data-entry/upload.tsx +184 -0
- package/docs/feedback/alert-dialog.tsx +270 -0
- package/docs/feedback/alert.tsx +248 -0
- package/docs/feedback/banner.tsx +183 -0
- package/docs/feedback/danger-confirm.tsx +88 -0
- package/docs/feedback/dialog-touch.tsx +24 -0
- package/docs/feedback/dialog.tsx +193 -0
- package/docs/feedback/sheet.tsx +410 -0
- package/docs/feedback/skeleton.tsx +111 -0
- package/docs/feedback/toast.tsx +135 -0
- package/docs/feedback/tooltip.tsx +171 -0
- package/docs/feedback/two-factor-setup.tsx +68 -0
- package/docs/foundation/_email-specimen.ts +274 -0
- package/docs/foundation/colors.tsx +202 -0
- package/docs/foundation/density.tsx +232 -0
- package/docs/foundation/email-tokens.tsx +306 -0
- package/docs/foundation/radius-shadow.tsx +152 -0
- package/docs/foundation/spacing.tsx +211 -0
- package/docs/foundation/typography.tsx +147 -0
- package/docs/general/activity.tsx +224 -0
- package/docs/general/button/examples/destructive-confirm.tsx +90 -0
- package/docs/general/button/examples/form-actions.tsx +85 -0
- package/docs/general/button/examples/toolbar.tsx +160 -0
- package/docs/general/button/index.md +12 -0
- package/docs/general/button/index.tsx +211 -0
- package/docs/general/logo.tsx +131 -0
- package/docs/general/reveal.tsx +41 -0
- package/docs/general/typography.tsx +152 -0
- package/docs/layout/account-chip.tsx +72 -0
- package/docs/layout/admin-collection.tsx +122 -0
- package/docs/layout/app-shell.tsx +374 -0
- package/docs/layout/aspect-ratio.tsx +119 -0
- package/docs/layout/auth-account-summary.tsx +103 -0
- package/docs/layout/auth-divider.tsx +28 -0
- package/docs/layout/auth-footer.tsx +37 -0
- package/docs/layout/auth-identity.tsx +36 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
- package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
- package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
- package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
- package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
- package/docs/layout/auth-recovery/index.md +140 -0
- package/docs/layout/auth-recovery/index.tsx +96 -0
- package/docs/layout/auth-shell-context.tsx +103 -0
- package/docs/layout/auth-shell-device.tsx +112 -0
- package/docs/layout/auth-shell-registration.tsx +335 -0
- package/docs/layout/auth-shell-variants.tsx +139 -0
- package/docs/layout/auth-shell.tsx +59 -0
- package/docs/layout/auth-stack.tsx +40 -0
- package/docs/layout/centered-shell.tsx +102 -0
- package/docs/layout/error-surface/examples/application-403.tsx +84 -0
- package/docs/layout/error-surface/examples/application-404.tsx +77 -0
- package/docs/layout/error-surface/examples/system-500.tsx +47 -0
- package/docs/layout/error-surface/examples/system-503.tsx +48 -0
- package/docs/layout/error-surface/index.md +153 -0
- package/docs/layout/error-surface/index.tsx +239 -0
- package/docs/layout/flex.tsx +262 -0
- package/docs/layout/legal-document-shell/_data.ts +110 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
- package/docs/layout/legal-document-shell/index.md +51 -0
- package/docs/layout/legal-document-shell/index.tsx +101 -0
- package/docs/layout/master-detail.tsx +387 -0
- package/docs/layout/org-switcher.tsx +131 -0
- package/docs/layout/page-container.tsx +946 -0
- package/docs/layout/resizable-panel.tsx +419 -0
- package/docs/layout/responsive-grid.tsx +235 -0
- package/docs/layout/separator.tsx +327 -0
- package/docs/layout/service-role-panel.tsx +144 -0
- package/docs/layout/sidebar.tsx +586 -0
- package/docs/layout/split-pane.tsx +451 -0
- package/docs/layout/topbar.tsx +347 -0
- package/docs/navigation/app-setting-picker.tsx +141 -0
- package/docs/navigation/breadcrumb.tsx +128 -0
- package/docs/navigation/context-menu.tsx +117 -0
- package/docs/navigation/dropdown-menu.tsx +213 -0
- package/docs/navigation/filter-bar.tsx +227 -0
- package/docs/navigation/menubar.tsx +141 -0
- package/docs/navigation/navigation-menu.tsx +165 -0
- package/docs/navigation/pagination.tsx +241 -0
- package/docs/navigation/steps.tsx +263 -0
- package/docs/navigation/tabs-rtl.tsx +28 -0
- package/docs/navigation/tabs.tsx +308 -0
- package/docs/navigation/toolbar.tsx +339 -0
- package/docs/providers/app-provider.tsx +191 -0
- package/docs/providers/format-date.tsx +230 -0
- package/docs/query/button-refetch.tsx +160 -0
- package/docs/query/data-state.tsx +192 -0
- package/docs/query/infinite-query-state.tsx +93 -0
- package/docs/query/mutation-feedback.tsx +70 -0
- package/docs/query/prefetch-link.tsx +262 -0
- package/docs/query/touch-actions.tsx +68 -0
- package/docs/showcase/acme-portal.tsx +441 -0
- package/docs/showcase/acme-website.tsx +455 -0
- package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
- package/docs/showcase/case2-employee-me.tsx +441 -0
- package/docs/showcase/case3-approval-workflow.tsx +527 -0
- package/docs/showcase/case4-login.tsx +307 -0
- package/docs/showcase/case5-shift-calendar.tsx +795 -0
- package/docs/showcase/case6-agency-handy.tsx +1072 -0
- package/docs/showcase/futurelastic-web.tsx +390 -0
- package/docs/showcase/org-switcher.tsx +313 -0
- package/docs/showcase/permission-matrix.tsx +343 -0
- package/docs/showcase/public-landing.tsx +210 -0
- package/docs/showcase/settings-account-sections.tsx +559 -0
- package/docs/showcase/settings-security-mfa.tsx +145 -0
- package/docs/showcase/table-approval-queue.tsx +199 -0
- package/docs/showcase/table-bulk-actions.tsx +460 -0
- package/docs/showcase/table-compact-kintone.tsx +438 -0
- package/docs/showcase/table-conditional-format.tsx +367 -0
- package/docs/showcase/table-crud-list.tsx +544 -0
- package/docs/showcase/table-density.tsx +340 -0
- package/docs/showcase/table-expandable-rows.tsx +471 -0
- package/docs/showcase/table-filter-chips.tsx +461 -0
- package/docs/showcase/table-footer-totals.tsx +311 -0
- package/docs/showcase/table-grouped-subtotals.tsx +388 -0
- package/docs/showcase/table-master-detail.tsx +479 -0
- package/docs/showcase/table-pagination.tsx +320 -0
- package/docs/showcase/table-states.tsx +363 -0
- package/docs/showcase/table-sticky-columns.tsx +373 -0
- package/docs/showcase/table-tree-rows.tsx +444 -0
- package/docs/showcase/table-view-tabs.tsx +488 -0
- package/package.json +10 -11
- package/scripts/_agent-setup.mjs +16 -2
- package/scripts/audit-hook.mjs +3 -13
- package/scripts/init-agent-kit.mjs +1 -14
- package/scripts/postinstall.mjs +12 -12
- package/scripts/ui-audit.mjs +93 -31
- package/scripts/visual-audit-rules.mjs +51 -7
- package/scripts/visual-audit.mjs +118 -47
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Avatar,
|
|
5
|
+
AvatarFallback,
|
|
6
|
+
Badge,
|
|
7
|
+
Card,
|
|
8
|
+
CardContent,
|
|
9
|
+
CardDescription,
|
|
10
|
+
CardHeader,
|
|
11
|
+
CardTitle,
|
|
12
|
+
} from "@godxjp/ui/data-display";
|
|
13
|
+
import {
|
|
14
|
+
FormField,
|
|
15
|
+
Select,
|
|
16
|
+
SelectContent,
|
|
17
|
+
SelectGroup,
|
|
18
|
+
SelectItem,
|
|
19
|
+
SelectLabel,
|
|
20
|
+
SelectSeparator,
|
|
21
|
+
SelectTrigger,
|
|
22
|
+
SelectValue,
|
|
23
|
+
} from "@godxjp/ui/data-entry";
|
|
24
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Select — the single-select control. Prefer the data-driven `options` API
|
|
28
|
+
* (handles search, grouping, async); compose sub-parts only for a custom
|
|
29
|
+
* trigger. Never a raw <select>. Composed only from real @godxjp/ui components.
|
|
30
|
+
*/
|
|
31
|
+
export default function Demo() {
|
|
32
|
+
const [status, setStatus] = useState("paid");
|
|
33
|
+
const [currency, setCurrency] = useState("JPY");
|
|
34
|
+
const [priority, setPriority] = useState("medium");
|
|
35
|
+
const [priorityMd, setPriorityMd] = useState("medium");
|
|
36
|
+
const [assignee, setAssignee] = useState("tanaka");
|
|
37
|
+
const [reviewer, setReviewer] = useState("tanaka");
|
|
38
|
+
const [reviewerAsync, setReviewerAsync] = useState("tanaka");
|
|
39
|
+
const [reviewerCustom, setReviewerCustom] = useState("tanaka");
|
|
40
|
+
const [reviewerLabel, setReviewerLabel] = useState("tanaka");
|
|
41
|
+
|
|
42
|
+
const people = [
|
|
43
|
+
{ value: "tanaka", label: "田中 太郎", sublabel: "tanaka@example.com" },
|
|
44
|
+
{ value: "suzuki", label: "鈴木 花子", sublabel: "suzuki@example.com" },
|
|
45
|
+
{ value: "sato", label: "佐藤 次郎", sublabel: "sato@example.com" },
|
|
46
|
+
];
|
|
47
|
+
const avatarFor = (label: string) => (
|
|
48
|
+
<Avatar className="size-5">
|
|
49
|
+
<AvatarFallback>{label.slice(0, 1)}</AvatarFallback>
|
|
50
|
+
</Avatar>
|
|
51
|
+
);
|
|
52
|
+
const peopleWithIcon = people.map((person) => ({ ...person, icon: avatarFor(person.label) }));
|
|
53
|
+
|
|
54
|
+
// A real picker fetches + paginates server-side; we simulate latency so the loading state and the
|
|
55
|
+
// selectedLabel / selectedIcon at-rest behaviour (option not loaded yet) are real.
|
|
56
|
+
const loadPeople = async ({ query }: { query: string; page: number }) => {
|
|
57
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
58
|
+
const needle = query.trim().toLowerCase();
|
|
59
|
+
const list = needle
|
|
60
|
+
? peopleWithIcon.filter((person) => person.label.toLowerCase().includes(needle))
|
|
61
|
+
: peopleWithIcon;
|
|
62
|
+
return { options: list, hasMore: false };
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// Async loaders can reject (network / 500). A rejected loader is a DISTINCT state from
|
|
66
|
+
// "no results": the panel shows an error affordance, never a blank surface.
|
|
67
|
+
const loadFailing = async () => {
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
69
|
+
throw new Error("network error");
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<PageContainer
|
|
74
|
+
title="Select"
|
|
75
|
+
subtitle="Single-select · data-driven options, searchable, or compound"
|
|
76
|
+
>
|
|
77
|
+
<Flex direction="col" gap="lg">
|
|
78
|
+
<Card>
|
|
79
|
+
<CardHeader>
|
|
80
|
+
<CardTitle level={2}>Data-driven (options)</CardTitle>
|
|
81
|
+
<CardDescription>
|
|
82
|
+
Pass an options array; name= submits the value with the form.
|
|
83
|
+
</CardDescription>
|
|
84
|
+
</CardHeader>
|
|
85
|
+
<CardContent>
|
|
86
|
+
<FormField id="status" label="状態">
|
|
87
|
+
<Select
|
|
88
|
+
id="status"
|
|
89
|
+
name="status"
|
|
90
|
+
value={status}
|
|
91
|
+
onValueChange={setStatus}
|
|
92
|
+
placeholder="状態を選択"
|
|
93
|
+
options={[
|
|
94
|
+
{ value: "draft", label: "下書き" },
|
|
95
|
+
{ value: "sent", label: "送付済" },
|
|
96
|
+
{ value: "paid", label: "入金済" },
|
|
97
|
+
{ value: "overdue", label: "期限超過" },
|
|
98
|
+
]}
|
|
99
|
+
/>
|
|
100
|
+
</FormField>
|
|
101
|
+
</CardContent>
|
|
102
|
+
</Card>
|
|
103
|
+
|
|
104
|
+
<Card>
|
|
105
|
+
<CardHeader>
|
|
106
|
+
<CardTitle level={2}>Searchable + grouped</CardTitle>
|
|
107
|
+
<CardDescription>
|
|
108
|
+
showSearch enables client-side filtering; group buckets options.
|
|
109
|
+
</CardDescription>
|
|
110
|
+
</CardHeader>
|
|
111
|
+
<CardContent>
|
|
112
|
+
<FormField id="currency" label="通貨">
|
|
113
|
+
<Select
|
|
114
|
+
id="currency"
|
|
115
|
+
name="currency"
|
|
116
|
+
value={currency}
|
|
117
|
+
onValueChange={setCurrency}
|
|
118
|
+
showSearch
|
|
119
|
+
clearable={false}
|
|
120
|
+
searchPlaceholder="通貨を検索..."
|
|
121
|
+
options={[
|
|
122
|
+
{ value: "JPY", label: "日本円", group: "アジア" },
|
|
123
|
+
{ value: "VND", label: "ベトナムドン", group: "アジア" },
|
|
124
|
+
{ value: "EUR", label: "ユーロ", group: "ヨーロッパ" },
|
|
125
|
+
{ value: "GBP", label: "英ポンド", group: "ヨーロッパ" },
|
|
126
|
+
]}
|
|
127
|
+
/>
|
|
128
|
+
</FormField>
|
|
129
|
+
</CardContent>
|
|
130
|
+
</Card>
|
|
131
|
+
|
|
132
|
+
<Card>
|
|
133
|
+
<CardHeader>
|
|
134
|
+
<CardTitle level={2}>Searchable + clearable</CardTitle>
|
|
135
|
+
<CardDescription>
|
|
136
|
+
With a value set and clearable (default), an inline ✕ on the trigger resets the
|
|
137
|
+
selection without opening the list.
|
|
138
|
+
</CardDescription>
|
|
139
|
+
</CardHeader>
|
|
140
|
+
<CardContent>
|
|
141
|
+
<FormField id="assignee" label="担当者">
|
|
142
|
+
<Select
|
|
143
|
+
id="assignee"
|
|
144
|
+
name="assignee"
|
|
145
|
+
value={assignee}
|
|
146
|
+
onValueChange={setAssignee}
|
|
147
|
+
showSearch
|
|
148
|
+
searchPlaceholder="担当者を検索..."
|
|
149
|
+
placeholder="担当者を選択"
|
|
150
|
+
options={people}
|
|
151
|
+
/>
|
|
152
|
+
</FormField>
|
|
153
|
+
</CardContent>
|
|
154
|
+
</Card>
|
|
155
|
+
|
|
156
|
+
<Card>
|
|
157
|
+
<CardHeader>
|
|
158
|
+
<CardTitle level={2}>Option icon · shown on the trigger too</CardTitle>
|
|
159
|
+
<CardDescription>
|
|
160
|
+
Give each option an `icon` (avatar / flag / lucide icon). It renders before the label
|
|
161
|
+
in the list AND on the trigger once selected, with no `renderOption` needed.
|
|
162
|
+
</CardDescription>
|
|
163
|
+
</CardHeader>
|
|
164
|
+
<CardContent>
|
|
165
|
+
<FormField id="reviewer" label="レビュー担当">
|
|
166
|
+
<Select
|
|
167
|
+
id="reviewer"
|
|
168
|
+
name="reviewer"
|
|
169
|
+
value={reviewer}
|
|
170
|
+
onValueChange={setReviewer}
|
|
171
|
+
showSearch
|
|
172
|
+
searchPlaceholder="担当者を検索..."
|
|
173
|
+
placeholder="担当者を選択"
|
|
174
|
+
options={peopleWithIcon}
|
|
175
|
+
/>
|
|
176
|
+
</FormField>
|
|
177
|
+
</CardContent>
|
|
178
|
+
</Card>
|
|
179
|
+
|
|
180
|
+
<Card>
|
|
181
|
+
<CardHeader>
|
|
182
|
+
<CardTitle level={2}>Async (loadOptions) + selectedIcon</CardTitle>
|
|
183
|
+
<CardDescription>
|
|
184
|
+
With `loadOptions` and a preset value, `selectedLabel` + `selectedIcon` show the
|
|
185
|
+
picked person's name AND avatar on the trigger at rest, before the async list has
|
|
186
|
+
loaded.
|
|
187
|
+
</CardDescription>
|
|
188
|
+
</CardHeader>
|
|
189
|
+
<CardContent>
|
|
190
|
+
<FormField id="reviewer-async" label="レビュー担当 (async)">
|
|
191
|
+
<Select
|
|
192
|
+
id="reviewer-async"
|
|
193
|
+
name="reviewer_async"
|
|
194
|
+
value={reviewerAsync}
|
|
195
|
+
onValueChange={setReviewerAsync}
|
|
196
|
+
loadOptions={loadPeople}
|
|
197
|
+
selectedLabel="田中 太郎"
|
|
198
|
+
selectedIcon={avatarFor("田中 太郎")}
|
|
199
|
+
searchPlaceholder="担当者を検索..."
|
|
200
|
+
placeholder="担当者を選択"
|
|
201
|
+
/>
|
|
202
|
+
</FormField>
|
|
203
|
+
</CardContent>
|
|
204
|
+
</Card>
|
|
205
|
+
|
|
206
|
+
<Card>
|
|
207
|
+
<CardHeader>
|
|
208
|
+
<CardTitle level={2}>Empty options · trigger disabled</CardTitle>
|
|
209
|
+
<CardDescription>
|
|
210
|
+
A static `options={[]}` list has nothing to pick, so the trigger disables itself and
|
|
211
|
+
never opens a blank popover. Provide options (or an async loadOptions) to enable it.
|
|
212
|
+
</CardDescription>
|
|
213
|
+
</CardHeader>
|
|
214
|
+
<CardContent>
|
|
215
|
+
<FormField id="empty-static" label="部門">
|
|
216
|
+
<Select id="empty-static" name="empty_static" options={[]} placeholder="部門を選択" />
|
|
217
|
+
</FormField>
|
|
218
|
+
</CardContent>
|
|
219
|
+
</Card>
|
|
220
|
+
|
|
221
|
+
<Card>
|
|
222
|
+
<CardHeader>
|
|
223
|
+
<CardTitle level={2}>Async error state (errorMessage)</CardTitle>
|
|
224
|
+
<CardDescription>
|
|
225
|
+
When `loadOptions` rejects, the panel shows a distinct error affordance instead of a
|
|
226
|
+
blank surface or a misleading “no results”. Override the localized default with
|
|
227
|
+
`errorMessage`. Open it to see the loading row resolve into the error row.
|
|
228
|
+
</CardDescription>
|
|
229
|
+
</CardHeader>
|
|
230
|
+
<CardContent>
|
|
231
|
+
<FormField id="reviewer-error" label="レビュー担当 (error)">
|
|
232
|
+
<Select
|
|
233
|
+
id="reviewer-error"
|
|
234
|
+
name="reviewer_error"
|
|
235
|
+
loadOptions={loadFailing}
|
|
236
|
+
errorMessage="担当者を読み込めませんでした"
|
|
237
|
+
searchPlaceholder="担当者を検索..."
|
|
238
|
+
placeholder="担当者を選択"
|
|
239
|
+
/>
|
|
240
|
+
</FormField>
|
|
241
|
+
</CardContent>
|
|
242
|
+
</Card>
|
|
243
|
+
|
|
244
|
+
<Card>
|
|
245
|
+
<CardHeader>
|
|
246
|
+
<CardTitle level={2}>Custom rows (renderOption)</CardTitle>
|
|
247
|
+
<CardDescription>
|
|
248
|
+
`renderOption` (like Ant's optionRender) draws a fully custom row: avatar + name
|
|
249
|
+
+ email + a status badge. Use a flex ROW (`div className="flex
|
|
250
|
+
items-center"`), not a bare `Flex` which defaults to a column.
|
|
251
|
+
</CardDescription>
|
|
252
|
+
</CardHeader>
|
|
253
|
+
<CardContent>
|
|
254
|
+
<FormField id="reviewer-custom" label="レビュー担当 (custom)">
|
|
255
|
+
<Select
|
|
256
|
+
id="reviewer-custom"
|
|
257
|
+
name="reviewer_custom"
|
|
258
|
+
value={reviewerCustom}
|
|
259
|
+
onValueChange={setReviewerCustom}
|
|
260
|
+
showSearch
|
|
261
|
+
searchPlaceholder="担当者を検索..."
|
|
262
|
+
placeholder="担当者を選択"
|
|
263
|
+
options={people}
|
|
264
|
+
renderOption={(option) => (
|
|
265
|
+
<div className="flex w-full items-center gap-2">
|
|
266
|
+
{avatarFor(option.label)}
|
|
267
|
+
<div className="flex min-w-0 flex-col">
|
|
268
|
+
<span className="truncate text-sm font-medium">{option.label}</span>
|
|
269
|
+
<span className="text-muted-foreground truncate text-xs">
|
|
270
|
+
{option.sublabel}
|
|
271
|
+
</span>
|
|
272
|
+
</div>
|
|
273
|
+
<Badge tone="success" className="ms-auto">
|
|
274
|
+
VIP
|
|
275
|
+
</Badge>
|
|
276
|
+
</div>
|
|
277
|
+
)}
|
|
278
|
+
/>
|
|
279
|
+
</FormField>
|
|
280
|
+
</CardContent>
|
|
281
|
+
</Card>
|
|
282
|
+
|
|
283
|
+
<Card>
|
|
284
|
+
<CardHeader>
|
|
285
|
+
<CardTitle level={2}>labelRender · custom selected display</CardTitle>
|
|
286
|
+
<CardDescription>
|
|
287
|
+
`labelRender` (Ant Design) customizes the SELECTED value shown on the trigger: here an
|
|
288
|
+
avatar + name + a role badge. The placeholder still shows when nothing is selected.
|
|
289
|
+
</CardDescription>
|
|
290
|
+
</CardHeader>
|
|
291
|
+
<CardContent>
|
|
292
|
+
<FormField id="reviewer-label" label="レビュー担当 (labelRender)">
|
|
293
|
+
<Select
|
|
294
|
+
id="reviewer-label"
|
|
295
|
+
name="reviewer_label"
|
|
296
|
+
value={reviewerLabel}
|
|
297
|
+
onValueChange={setReviewerLabel}
|
|
298
|
+
showSearch
|
|
299
|
+
searchPlaceholder="担当者を検索..."
|
|
300
|
+
placeholder="担当者を選択"
|
|
301
|
+
options={people}
|
|
302
|
+
labelRender={({ label }) => (
|
|
303
|
+
<span className="flex items-center gap-2">
|
|
304
|
+
{avatarFor(String(label))}
|
|
305
|
+
<span className="truncate">{label}</span>
|
|
306
|
+
<Badge tone="info" icon={null} className="ms-1">
|
|
307
|
+
担当
|
|
308
|
+
</Badge>
|
|
309
|
+
</span>
|
|
310
|
+
)}
|
|
311
|
+
/>
|
|
312
|
+
</FormField>
|
|
313
|
+
</CardContent>
|
|
314
|
+
</Card>
|
|
315
|
+
|
|
316
|
+
<Card>
|
|
317
|
+
<CardHeader>
|
|
318
|
+
<CardTitle level={2}>Compound API (custom trigger)</CardTitle>
|
|
319
|
+
<CardDescription>
|
|
320
|
+
Compose sub-parts when the trigger needs custom content. SelectTrigger accepts size
|
|
321
|
+
"sm" and "md"; "md" is the default and matches Input
|
|
322
|
+
height in a form, "sm" fits a dense toolbar or table header.
|
|
323
|
+
</CardDescription>
|
|
324
|
+
</CardHeader>
|
|
325
|
+
<CardContent>
|
|
326
|
+
<Flex direction="col" gap="md">
|
|
327
|
+
<FormField id="priority-md" label="優先度 (size=md)">
|
|
328
|
+
<Select value={priorityMd} onValueChange={setPriorityMd}>
|
|
329
|
+
<SelectTrigger size="md" id="priority-md" aria-labelledby="priority-md-label">
|
|
330
|
+
<SelectValue placeholder="優先度" />
|
|
331
|
+
</SelectTrigger>
|
|
332
|
+
<SelectContent>
|
|
333
|
+
<SelectItem value="high">高</SelectItem>
|
|
334
|
+
<SelectItem value="medium">中</SelectItem>
|
|
335
|
+
<SelectItem value="low">低</SelectItem>
|
|
336
|
+
</SelectContent>
|
|
337
|
+
</Select>
|
|
338
|
+
</FormField>
|
|
339
|
+
<FormField id="priority" label="優先度 (size=sm)">
|
|
340
|
+
<Select value={priority} onValueChange={setPriority}>
|
|
341
|
+
<SelectTrigger size="sm" id="priority" aria-labelledby="priority-label">
|
|
342
|
+
<SelectValue placeholder="優先度" />
|
|
343
|
+
</SelectTrigger>
|
|
344
|
+
<SelectContent>
|
|
345
|
+
<SelectGroup>
|
|
346
|
+
<SelectLabel>標準</SelectLabel>
|
|
347
|
+
<SelectItem value="high">高</SelectItem>
|
|
348
|
+
<SelectItem value="medium">中</SelectItem>
|
|
349
|
+
<SelectItem value="low">低</SelectItem>
|
|
350
|
+
</SelectGroup>
|
|
351
|
+
<SelectSeparator />
|
|
352
|
+
<SelectGroup>
|
|
353
|
+
<SelectLabel>追加レベル</SelectLabel>
|
|
354
|
+
{Array.from({ length: 24 }, (_, index) => (
|
|
355
|
+
<SelectItem key={index} value={`level-${index + 1}`}>
|
|
356
|
+
レベル {index + 1}
|
|
357
|
+
</SelectItem>
|
|
358
|
+
))}
|
|
359
|
+
</SelectGroup>
|
|
360
|
+
</SelectContent>
|
|
361
|
+
</Select>
|
|
362
|
+
</FormField>
|
|
363
|
+
</Flex>
|
|
364
|
+
</CardContent>
|
|
365
|
+
</Card>
|
|
366
|
+
</Flex>
|
|
367
|
+
</PageContainer>
|
|
368
|
+
);
|
|
369
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { FormField, Slider } from "@godxjp/ui/data-entry";
|
|
5
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Slider — Radix Slider wrapper. value/defaultValue MUST be number[] not a plain
|
|
9
|
+
* number. Single-thumb: [50], dual-thumb range: [20, 80].
|
|
10
|
+
* Use onValueCommit (not onValueChange) for expensive side-effects.
|
|
11
|
+
* Composed only from real @godxjp/ui components.
|
|
12
|
+
*/
|
|
13
|
+
const yen = (n: number) =>
|
|
14
|
+
new Intl.NumberFormat("ja-JP", { style: "currency", currency: "JPY" }).format(n);
|
|
15
|
+
|
|
16
|
+
export default function Demo() {
|
|
17
|
+
const [taxRate, setTaxRate] = useState<number[]>([10]);
|
|
18
|
+
const [amountRange, setAmountRange] = useState<number[]>([50000, 300000]);
|
|
19
|
+
const [allocation, setAllocation] = useState<number[]>([40]);
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<PageContainer
|
|
23
|
+
title="Slider"
|
|
24
|
+
subtitle="Numeric range slider · value/defaultValue must be number[] (single-thumb: [n], range: [min, max])"
|
|
25
|
+
>
|
|
26
|
+
<Flex direction="col" gap="lg">
|
|
27
|
+
<Card>
|
|
28
|
+
<CardHeader>
|
|
29
|
+
<CardTitle level={2}>単一スライダー · 税率設定</CardTitle>
|
|
30
|
+
<CardDescription>
|
|
31
|
+
Single-thumb controlled slider. value={`[n]`} — plain number breaks rendering.
|
|
32
|
+
onValueChange fires on every drag; onValueCommit fires on release.
|
|
33
|
+
</CardDescription>
|
|
34
|
+
</CardHeader>
|
|
35
|
+
<CardContent>
|
|
36
|
+
<Flex direction="col" gap="md">
|
|
37
|
+
<FormField
|
|
38
|
+
id="tax-rate"
|
|
39
|
+
label={`消費税率: ${taxRate[0]}%`}
|
|
40
|
+
helper="0% / 8% (軽減税率) / 10% から選択"
|
|
41
|
+
>
|
|
42
|
+
<Slider
|
|
43
|
+
value={taxRate}
|
|
44
|
+
onValueChange={setTaxRate}
|
|
45
|
+
min={0}
|
|
46
|
+
max={10}
|
|
47
|
+
step={2}
|
|
48
|
+
name="tax_rate"
|
|
49
|
+
aria-label="消費税率"
|
|
50
|
+
/>
|
|
51
|
+
</FormField>
|
|
52
|
+
</Flex>
|
|
53
|
+
</CardContent>
|
|
54
|
+
</Card>
|
|
55
|
+
|
|
56
|
+
<Card>
|
|
57
|
+
<CardHeader>
|
|
58
|
+
<CardTitle level={2}>レンジスライダー · 請求金額フィルタ</CardTitle>
|
|
59
|
+
<CardDescription>
|
|
60
|
+
Dual-thumb range slider: value={`[min, max]`}. Use minStepsBetweenThumbs to prevent
|
|
61
|
+
thumbs overlapping.
|
|
62
|
+
</CardDescription>
|
|
63
|
+
</CardHeader>
|
|
64
|
+
<CardContent>
|
|
65
|
+
<FormField
|
|
66
|
+
id="amount-range"
|
|
67
|
+
label={`請求金額: ${yen(amountRange[0])} 〜 ${yen(amountRange[1])}`}
|
|
68
|
+
>
|
|
69
|
+
<Slider
|
|
70
|
+
value={amountRange}
|
|
71
|
+
onValueChange={setAmountRange}
|
|
72
|
+
onValueCommit={(v) => {
|
|
73
|
+
// expensive filter refetch only on commit (pointer/key release)
|
|
74
|
+
void v;
|
|
75
|
+
}}
|
|
76
|
+
min={0}
|
|
77
|
+
max={1000000}
|
|
78
|
+
step={10000}
|
|
79
|
+
minStepsBetweenThumbs={1}
|
|
80
|
+
aria-label="請求金額範囲"
|
|
81
|
+
/>
|
|
82
|
+
</FormField>
|
|
83
|
+
</CardContent>
|
|
84
|
+
</Card>
|
|
85
|
+
|
|
86
|
+
<Card>
|
|
87
|
+
<CardHeader>
|
|
88
|
+
<CardTitle level={2}>予算配分スライダー</CardTitle>
|
|
89
|
+
<CardDescription>
|
|
90
|
+
step=5 for coarse granularity. Use name= to submit with a native form without JS
|
|
91
|
+
wiring.
|
|
92
|
+
</CardDescription>
|
|
93
|
+
</CardHeader>
|
|
94
|
+
<CardContent>
|
|
95
|
+
<FormField
|
|
96
|
+
id="allocation"
|
|
97
|
+
label={`広告費配分: ${allocation[0]}%`}
|
|
98
|
+
helper="残り ${100 - allocation[0]}% が運転資金へ充当されます"
|
|
99
|
+
>
|
|
100
|
+
<Slider
|
|
101
|
+
value={allocation}
|
|
102
|
+
onValueChange={setAllocation}
|
|
103
|
+
min={0}
|
|
104
|
+
max={100}
|
|
105
|
+
step={5}
|
|
106
|
+
name="ad_allocation"
|
|
107
|
+
aria-label="広告費配分"
|
|
108
|
+
/>
|
|
109
|
+
</FormField>
|
|
110
|
+
</CardContent>
|
|
111
|
+
</Card>
|
|
112
|
+
|
|
113
|
+
<Card>
|
|
114
|
+
<CardHeader>
|
|
115
|
+
<CardTitle level={2}>Disabled (read-only indicator)</CardTitle>
|
|
116
|
+
<CardDescription>
|
|
117
|
+
Pass disabled with a controlled value to show a non-interactive bar. Use Progress for
|
|
118
|
+
pure status display.
|
|
119
|
+
</CardDescription>
|
|
120
|
+
</CardHeader>
|
|
121
|
+
<CardContent>
|
|
122
|
+
<FormField id="locked-rate" label="確定済み税率 (変更不可)">
|
|
123
|
+
<Slider value={[10]} disabled min={0} max={20} step={1} aria-label="確定済み税率" />
|
|
124
|
+
</FormField>
|
|
125
|
+
</CardContent>
|
|
126
|
+
</Card>
|
|
127
|
+
</Flex>
|
|
128
|
+
</PageContainer>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
2
|
+
import { Field, Switch } from "@godxjp/ui/data-entry";
|
|
3
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Switch — a boolean toggle. Wrap in Field (NOT FormField) for a labelled row
|
|
7
|
+
* with the hidden form input + description. Composed only from real @godxjp/ui
|
|
8
|
+
* components.
|
|
9
|
+
*/
|
|
10
|
+
export default function Demo() {
|
|
11
|
+
return (
|
|
12
|
+
<PageContainer title="Switch" subtitle="Boolean toggle · wrap in Field for a labelled row">
|
|
13
|
+
<Flex direction="col" gap="lg">
|
|
14
|
+
<Card>
|
|
15
|
+
<CardHeader>
|
|
16
|
+
<CardTitle level={2}>Labelled rows (Field)</CardTitle>
|
|
17
|
+
<CardDescription>Field owns the label, description, and form input.</CardDescription>
|
|
18
|
+
</CardHeader>
|
|
19
|
+
<CardContent>
|
|
20
|
+
<Flex direction="col" gap="md">
|
|
21
|
+
<Field
|
|
22
|
+
id="invoice-mail"
|
|
23
|
+
label="請求書をメール送信"
|
|
24
|
+
description="発行時に取引先へ自動送信します"
|
|
25
|
+
>
|
|
26
|
+
<Switch id="invoice-mail" defaultChecked />
|
|
27
|
+
</Field>
|
|
28
|
+
<Field id="reminder" label="支払期日リマインダー" description="期日3日前に通知します">
|
|
29
|
+
<Switch id="reminder" />
|
|
30
|
+
</Field>
|
|
31
|
+
<Field id="locked" label="期間ロック" description="確定済みのため変更できません">
|
|
32
|
+
<Switch id="locked" disabled defaultChecked />
|
|
33
|
+
</Field>
|
|
34
|
+
</Flex>
|
|
35
|
+
</CardContent>
|
|
36
|
+
</Card>
|
|
37
|
+
|
|
38
|
+
<Card>
|
|
39
|
+
<CardHeader>
|
|
40
|
+
<CardTitle level={2}>size · sm / md</CardTitle>
|
|
41
|
+
<CardDescription>
|
|
42
|
+
sm は一覧行やツールバーなど密度の高い場所、md (既定) は設定画面の行に使う。
|
|
43
|
+
</CardDescription>
|
|
44
|
+
</CardHeader>
|
|
45
|
+
<CardContent>
|
|
46
|
+
<Flex direction="col" gap="md">
|
|
47
|
+
<Field
|
|
48
|
+
id="sw-size-sm"
|
|
49
|
+
label="自動保存 (sm)"
|
|
50
|
+
description="行の高さを抑えた一覧向けのサイズ"
|
|
51
|
+
>
|
|
52
|
+
<Switch id="sw-size-sm" size="sm" defaultChecked />
|
|
53
|
+
</Field>
|
|
54
|
+
<Field
|
|
55
|
+
id="sw-size-md"
|
|
56
|
+
label="自動保存 (md · 既定)"
|
|
57
|
+
description="設定画面の標準サイズ"
|
|
58
|
+
>
|
|
59
|
+
<Switch id="sw-size-md" size="md" defaultChecked />
|
|
60
|
+
</Field>
|
|
61
|
+
</Flex>
|
|
62
|
+
</CardContent>
|
|
63
|
+
</Card>
|
|
64
|
+
</Flex>
|
|
65
|
+
</PageContainer>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { FormField, TagInput } from "@godxjp/ui/data-entry";
|
|
5
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* TagInput — free-form multi-value chips input. value is string[] (NOT string).
|
|
9
|
+
* Enter or comma commits a tag; Backspace on empty removes the last chip.
|
|
10
|
+
* Use Select (multiple, with showSearch) instead when the set of values is fixed.
|
|
11
|
+
* Composed only from real @godxjp/ui components.
|
|
12
|
+
*/
|
|
13
|
+
export default function Demo() {
|
|
14
|
+
const [invoiceTags, setInvoiceTags] = useState<string[]>(["営業部", "Q1"]);
|
|
15
|
+
const [skillTags, setSkillTags] = useState<string[]>(["経理", "仕訳入力"]);
|
|
16
|
+
const [recipientEmails, setRecipientEmails] = useState<string[]>([]);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<PageContainer
|
|
20
|
+
title="TagInput"
|
|
21
|
+
subtitle="Free-form chips input · value is string[]; Enter/comma to add, Backspace to remove"
|
|
22
|
+
>
|
|
23
|
+
<Flex direction="col" gap="lg">
|
|
24
|
+
<Card>
|
|
25
|
+
<CardHeader>
|
|
26
|
+
<CardTitle level={2}>請求書ラベル</CardTitle>
|
|
27
|
+
<CardDescription>
|
|
28
|
+
Controlled via value/onValueChange (string[]). Deduplicate is built in. Use for ad-hoc
|
|
29
|
+
record labels.
|
|
30
|
+
</CardDescription>
|
|
31
|
+
</CardHeader>
|
|
32
|
+
<CardContent>
|
|
33
|
+
<FormField id="invoice-tags" label="ラベル" helper="Enterまたはカンマで追加">
|
|
34
|
+
<TagInput
|
|
35
|
+
value={invoiceTags}
|
|
36
|
+
onValueChange={setInvoiceTags}
|
|
37
|
+
placeholder="ラベルを追加..."
|
|
38
|
+
name="labels"
|
|
39
|
+
/>
|
|
40
|
+
</FormField>
|
|
41
|
+
</CardContent>
|
|
42
|
+
</Card>
|
|
43
|
+
|
|
44
|
+
<Card>
|
|
45
|
+
<CardHeader>
|
|
46
|
+
<CardTitle level={2}>担当者スキルタグ</CardTitle>
|
|
47
|
+
<CardDescription>
|
|
48
|
+
name= emits a hidden comma-joined input for native form submission without JS wiring.
|
|
49
|
+
</CardDescription>
|
|
50
|
+
</CardHeader>
|
|
51
|
+
<CardContent>
|
|
52
|
+
<FormField id="skill-tags" label="スキル・資格">
|
|
53
|
+
<TagInput
|
|
54
|
+
value={skillTags}
|
|
55
|
+
onValueChange={setSkillTags}
|
|
56
|
+
placeholder="スキルを入力..."
|
|
57
|
+
name="skills"
|
|
58
|
+
/>
|
|
59
|
+
</FormField>
|
|
60
|
+
</CardContent>
|
|
61
|
+
</Card>
|
|
62
|
+
|
|
63
|
+
<Card>
|
|
64
|
+
<CardHeader>
|
|
65
|
+
<CardTitle level={2}>承認通知メール送信先</CardTitle>
|
|
66
|
+
<CardDescription>
|
|
67
|
+
Uncontrolled start (empty defaultValue); caller receives full updated array on each
|
|
68
|
+
change.
|
|
69
|
+
</CardDescription>
|
|
70
|
+
</CardHeader>
|
|
71
|
+
<CardContent>
|
|
72
|
+
<FormField
|
|
73
|
+
id="recipient-emails"
|
|
74
|
+
label="CC送信先"
|
|
75
|
+
helper="複数のメールアドレスをEnterで追加できます"
|
|
76
|
+
>
|
|
77
|
+
<TagInput
|
|
78
|
+
id="recipient-emails"
|
|
79
|
+
aria-label="CC送信先メール"
|
|
80
|
+
className="contract-tag-input"
|
|
81
|
+
value={recipientEmails}
|
|
82
|
+
onValueChange={setRecipientEmails}
|
|
83
|
+
placeholder="メールアドレスを追加..."
|
|
84
|
+
name="cc_emails"
|
|
85
|
+
/>
|
|
86
|
+
</FormField>
|
|
87
|
+
</CardContent>
|
|
88
|
+
</Card>
|
|
89
|
+
|
|
90
|
+
<Card>
|
|
91
|
+
<CardHeader>
|
|
92
|
+
<CardTitle level={2}>無効状態</CardTitle>
|
|
93
|
+
<CardDescription>
|
|
94
|
+
disabled dims the whole control and drops the remove buttons; the container is marked
|
|
95
|
+
aria-disabled so the dimmed chips are treated as an inactive control (no contrast
|
|
96
|
+
failure).
|
|
97
|
+
</CardDescription>
|
|
98
|
+
</CardHeader>
|
|
99
|
+
<CardContent>
|
|
100
|
+
<FormField id="disabled-tags" label="ラベル">
|
|
101
|
+
<TagInput value={["確定済み", "ロック"]} disabled />
|
|
102
|
+
</FormField>
|
|
103
|
+
</CardContent>
|
|
104
|
+
</Card>
|
|
105
|
+
</Flex>
|
|
106
|
+
</PageContainer>
|
|
107
|
+
);
|
|
108
|
+
}
|