@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,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Skeleton,
|
|
3
|
+
SkeletonDetail,
|
|
4
|
+
SkeletonRows,
|
|
5
|
+
SkeletonStat,
|
|
6
|
+
SkeletonTable,
|
|
7
|
+
} from "@godxjp/ui/feedback";
|
|
8
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
9
|
+
import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Skeleton · loading placeholders. Three levels:
|
|
13
|
+
* Skeleton · custom pulsing block (h + w via className).
|
|
14
|
+
* SkeletonTable · pre-mount DataTable placeholder (rows, columns props).
|
|
15
|
+
* SkeletonStat · StatCard/KPI tile placeholder (no props; use in ResponsiveGrid).
|
|
16
|
+
* SkeletonDetail · single-record detail placeholder (title + metadata rows, no props).
|
|
17
|
+
* Never use a spinner overlay on skeletonable content.
|
|
18
|
+
*/
|
|
19
|
+
export default function Demo() {
|
|
20
|
+
return (
|
|
21
|
+
<PageContainer
|
|
22
|
+
title="Skeleton"
|
|
23
|
+
subtitle="loading placeholders · Skeleton (custom block) · SkeletonTable (DataTable pre-mount) · SkeletonStat (KPI tile) · SkeletonDetail (record page)"
|
|
24
|
+
>
|
|
25
|
+
<Flex direction="col" gap="lg">
|
|
26
|
+
<Card>
|
|
27
|
+
<CardHeader>
|
|
28
|
+
<CardTitle level={2}>Skeleton · custom pulsing blocks</CardTitle>
|
|
29
|
+
<CardDescription>
|
|
30
|
+
Base primitive. Pass className for h + w. Use when SkeletonTable / SkeletonStat do not
|
|
31
|
+
match the target layout (e.g. a single loading line, a media placeholder, inline
|
|
32
|
+
metadata).
|
|
33
|
+
</CardDescription>
|
|
34
|
+
</CardHeader>
|
|
35
|
+
<CardContent>
|
|
36
|
+
<Flex direction="col" gap="sm">
|
|
37
|
+
<Skeleton className="h-5 w-48" />
|
|
38
|
+
<Skeleton className="h-4 w-72" />
|
|
39
|
+
<Skeleton className="h-4 w-60" />
|
|
40
|
+
<Flex direction="row" gap="sm" align="center" className="mt-2">
|
|
41
|
+
<Skeleton className="size-10 rounded-full" />
|
|
42
|
+
<Flex direction="col" gap="xs">
|
|
43
|
+
<Skeleton className="h-4 w-32" />
|
|
44
|
+
<Skeleton className="h-3 w-24" />
|
|
45
|
+
</Flex>
|
|
46
|
+
</Flex>
|
|
47
|
+
</Flex>
|
|
48
|
+
</CardContent>
|
|
49
|
+
</Card>
|
|
50
|
+
|
|
51
|
+
<Card>
|
|
52
|
+
<CardHeader>
|
|
53
|
+
<CardTitle>SkeletonRows · generic repeated rows</CardTitle>
|
|
54
|
+
<CardDescription>
|
|
55
|
+
Use for non-table list layouts with deterministic row count.
|
|
56
|
+
</CardDescription>
|
|
57
|
+
</CardHeader>
|
|
58
|
+
<CardContent>
|
|
59
|
+
<SkeletonRows rows={3} columns={2} />
|
|
60
|
+
</CardContent>
|
|
61
|
+
</Card>
|
|
62
|
+
|
|
63
|
+
<Card>
|
|
64
|
+
<CardHeader>
|
|
65
|
+
<CardTitle level={2}>SkeletonTable · DataTable pre-mount placeholder</CardTitle>
|
|
66
|
+
<CardDescription>
|
|
67
|
+
Drop-in while deferred prop / query resolves. Match rows to page size and columns to
|
|
68
|
+
column count so the layout does not jump on hydration. Do NOT wrap in Card · it owns
|
|
69
|
+
its own structure.
|
|
70
|
+
</CardDescription>
|
|
71
|
+
</CardHeader>
|
|
72
|
+
<CardContent className="p-0">
|
|
73
|
+
<SkeletonTable rows={6} columns={6} />
|
|
74
|
+
</CardContent>
|
|
75
|
+
</Card>
|
|
76
|
+
|
|
77
|
+
<Card>
|
|
78
|
+
<CardHeader>
|
|
79
|
+
<CardTitle level={2}>SkeletonStat · KPI / StatCard tile placeholder</CardTitle>
|
|
80
|
+
<CardDescription>
|
|
81
|
+
Use inside a ResponsiveGrid · one SkeletonStat per expected StatCard. No props. Do NOT
|
|
82
|
+
wrap in an extra Card (SkeletonStat owns its own bordered box).
|
|
83
|
+
</CardDescription>
|
|
84
|
+
</CardHeader>
|
|
85
|
+
<CardContent>
|
|
86
|
+
<ResponsiveGrid columns={4}>
|
|
87
|
+
<SkeletonStat />
|
|
88
|
+
<SkeletonStat />
|
|
89
|
+
<SkeletonStat />
|
|
90
|
+
<SkeletonStat />
|
|
91
|
+
</ResponsiveGrid>
|
|
92
|
+
</CardContent>
|
|
93
|
+
</Card>
|
|
94
|
+
|
|
95
|
+
<Card>
|
|
96
|
+
<CardHeader>
|
|
97
|
+
<CardTitle level={2}>SkeletonDetail · single-record detail loading state</CardTitle>
|
|
98
|
+
<CardDescription>
|
|
99
|
+
The ready-made detail placeholder (title + metadata rows). Reach for this on a record
|
|
100
|
+
/ show page while the record loads · do NOT hand-compose it from base Skeleton blocks.
|
|
101
|
+
No props.
|
|
102
|
+
</CardDescription>
|
|
103
|
+
</CardHeader>
|
|
104
|
+
<CardContent>
|
|
105
|
+
<SkeletonDetail />
|
|
106
|
+
</CardContent>
|
|
107
|
+
</Card>
|
|
108
|
+
</Flex>
|
|
109
|
+
</PageContainer>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Toaster, toast } from "@godxjp/ui/feedback";
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
3
|
+
import { Button } from "@godxjp/ui/general";
|
|
4
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Toast (Toaster + sonner) · transient ephemeral feedback. Mount ONE <Toaster>
|
|
8
|
+
* at app root. Fire through the public @godxjp/ui/feedback toast export.
|
|
9
|
+
*/
|
|
10
|
+
export default function Demo() {
|
|
11
|
+
return (
|
|
12
|
+
<PageContainer
|
|
13
|
+
title="Toast"
|
|
14
|
+
subtitle="Toaster (mount once at root) + toast() from sonner · fire-and-forget ephemeral feedback"
|
|
15
|
+
>
|
|
16
|
+
{/* Mount Toaster once · in a real app this lives in the root layout */}
|
|
17
|
+
<Toaster richColors position="top-right" duration={4000} closeButton />
|
|
18
|
+
|
|
19
|
+
<Flex direction="col" gap="lg">
|
|
20
|
+
<Card>
|
|
21
|
+
<CardHeader>
|
|
22
|
+
<CardTitle level={2}>Toast variants</CardTitle>
|
|
23
|
+
<CardDescription>
|
|
24
|
+
Import toast from sonner (not @godxjp/ui). success / error / warning / info for the
|
|
25
|
+
four semantic variants. Toasts auto-dismiss · use Alert for persistent messages.
|
|
26
|
+
</CardDescription>
|
|
27
|
+
</CardHeader>
|
|
28
|
+
<CardContent>
|
|
29
|
+
<Flex direction="row" wrap gap="md">
|
|
30
|
+
<Button
|
|
31
|
+
variant="outline"
|
|
32
|
+
size="sm"
|
|
33
|
+
onClick={() => toast.success("仕訳を保存しました")}
|
|
34
|
+
>
|
|
35
|
+
success
|
|
36
|
+
</Button>
|
|
37
|
+
<Button
|
|
38
|
+
variant="outline"
|
|
39
|
+
size="sm"
|
|
40
|
+
onClick={() => toast.error("保存に失敗しました · 再度お試しください")}
|
|
41
|
+
>
|
|
42
|
+
error
|
|
43
|
+
</Button>
|
|
44
|
+
<Button
|
|
45
|
+
variant="outline"
|
|
46
|
+
size="sm"
|
|
47
|
+
onClick={() => toast.warning("セッションの有効期限が近づいています")}
|
|
48
|
+
>
|
|
49
|
+
warning
|
|
50
|
+
</Button>
|
|
51
|
+
<Button
|
|
52
|
+
variant="outline"
|
|
53
|
+
size="sm"
|
|
54
|
+
onClick={() => toast.info("エクスポートを開始しました")}
|
|
55
|
+
>
|
|
56
|
+
info
|
|
57
|
+
</Button>
|
|
58
|
+
</Flex>
|
|
59
|
+
</CardContent>
|
|
60
|
+
</Card>
|
|
61
|
+
|
|
62
|
+
<Card>
|
|
63
|
+
<CardHeader>
|
|
64
|
+
<CardTitle>Programmatic dismiss</CardTitle>
|
|
65
|
+
<CardDescription>
|
|
66
|
+
Keep the returned id and dismiss a specific toast explicitly.
|
|
67
|
+
</CardDescription>
|
|
68
|
+
</CardHeader>
|
|
69
|
+
<CardContent>
|
|
70
|
+
<Button
|
|
71
|
+
variant="outline"
|
|
72
|
+
onClick={() => {
|
|
73
|
+
const id = toast.loading("同期しています…", { duration: Infinity });
|
|
74
|
+
window.setTimeout(() => toast.dismiss(id), 500);
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
同期トーストを表示して閉じる
|
|
78
|
+
</Button>
|
|
79
|
+
</CardContent>
|
|
80
|
+
</Card>
|
|
81
|
+
|
|
82
|
+
<Card>
|
|
83
|
+
<CardHeader>
|
|
84
|
+
<CardTitle level={2}>Soft destructive with undo action</CardTitle>
|
|
85
|
+
<CardDescription>
|
|
86
|
+
After a delete, surface an undo action via the toast action option. The user can
|
|
87
|
+
recover without a confirmation modal.
|
|
88
|
+
</CardDescription>
|
|
89
|
+
</CardHeader>
|
|
90
|
+
<CardContent>
|
|
91
|
+
<Button
|
|
92
|
+
variant="destructive"
|
|
93
|
+
size="sm"
|
|
94
|
+
onClick={() =>
|
|
95
|
+
toast("請求書 #INV-2024-0042 を削除しました", {
|
|
96
|
+
action: {
|
|
97
|
+
label: "元に戻す",
|
|
98
|
+
onClick: () => toast.info("削除を取り消しました"),
|
|
99
|
+
},
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
>
|
|
103
|
+
請求書を削除
|
|
104
|
+
</Button>
|
|
105
|
+
</CardContent>
|
|
106
|
+
</Card>
|
|
107
|
+
|
|
108
|
+
<Card>
|
|
109
|
+
<CardHeader>
|
|
110
|
+
<CardTitle level={2}>Promise toast (loading → success/error)</CardTitle>
|
|
111
|
+
<CardDescription>
|
|
112
|
+
toast.promise() tracks an async operation automatically · shows a loading state then
|
|
113
|
+
resolves to success or error. Ideal for background exports or bulk imports.
|
|
114
|
+
</CardDescription>
|
|
115
|
+
</CardHeader>
|
|
116
|
+
<CardContent>
|
|
117
|
+
<Button
|
|
118
|
+
variant="outline"
|
|
119
|
+
size="sm"
|
|
120
|
+
onClick={() =>
|
|
121
|
+
toast.promise(new Promise<void>((r) => setTimeout(r, 2000)), {
|
|
122
|
+
loading: "CSV をエクスポート中...",
|
|
123
|
+
success: "エクスポートが完了しました",
|
|
124
|
+
error: "エクスポートに失敗しました",
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
>
|
|
128
|
+
CSV エクスポート
|
|
129
|
+
</Button>
|
|
130
|
+
</CardContent>
|
|
131
|
+
</Card>
|
|
132
|
+
</Flex>
|
|
133
|
+
</PageContainer>
|
|
134
|
+
);
|
|
135
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@godxjp/ui/feedback";
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
3
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
4
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
5
|
+
import { Copy, Info, Pencil, Trash2 } from "lucide-react";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Tooltip · self-providing (no app-level TooltipProvider needed). Compose
|
|
9
|
+
* Tooltip > TooltipTrigger (asChild on interactive elements) > TooltipContent.
|
|
10
|
+
* Read-only hints only · use Popover for interactive floating content.
|
|
11
|
+
*
|
|
12
|
+
* TooltipProvider stays OPTIONAL — reach for it only to tune the open/close
|
|
13
|
+
* delay across a whole cluster (e.g. a dense toolbar) in one place instead of
|
|
14
|
+
* repeating delayDuration on every Tooltip. See the last card.
|
|
15
|
+
*/
|
|
16
|
+
export default function Demo() {
|
|
17
|
+
return (
|
|
18
|
+
<PageContainer
|
|
19
|
+
title="Tooltip"
|
|
20
|
+
subtitle="hover/focus read-only hint · icon labels, truncated values, keyboard shortcuts"
|
|
21
|
+
>
|
|
22
|
+
<Flex direction="col" gap="lg">
|
|
23
|
+
<Card>
|
|
24
|
+
<CardHeader>
|
|
25
|
+
<CardTitle level={2}>Icon-only button labels</CardTitle>
|
|
26
|
+
<CardDescription>
|
|
27
|
+
Use TooltipTrigger asChild to avoid nesting a button inside a button. The tooltip
|
|
28
|
+
provides the accessible label for icon-only actions in DataTable rows.
|
|
29
|
+
</CardDescription>
|
|
30
|
+
</CardHeader>
|
|
31
|
+
<CardContent>
|
|
32
|
+
<Flex direction="row" gap="sm" align="center">
|
|
33
|
+
<Tooltip>
|
|
34
|
+
<TooltipTrigger asChild>
|
|
35
|
+
<Button variant="ghost" size="icon" aria-label="請求書をコピー">
|
|
36
|
+
<Copy className="size-4" />
|
|
37
|
+
</Button>
|
|
38
|
+
</TooltipTrigger>
|
|
39
|
+
<TooltipContent side="top">請求書をコピー</TooltipContent>
|
|
40
|
+
</Tooltip>
|
|
41
|
+
|
|
42
|
+
<Tooltip>
|
|
43
|
+
<TooltipTrigger asChild>
|
|
44
|
+
<Button
|
|
45
|
+
variant="ghost"
|
|
46
|
+
size="icon"
|
|
47
|
+
aria-label="削除"
|
|
48
|
+
className="text-destructive hover:text-destructive"
|
|
49
|
+
>
|
|
50
|
+
<Trash2 className="size-4" />
|
|
51
|
+
</Button>
|
|
52
|
+
</TooltipTrigger>
|
|
53
|
+
<TooltipContent side="top">削除 (元に戻せません)</TooltipContent>
|
|
54
|
+
</Tooltip>
|
|
55
|
+
</Flex>
|
|
56
|
+
</CardContent>
|
|
57
|
+
</Card>
|
|
58
|
+
|
|
59
|
+
<Card>
|
|
60
|
+
<CardHeader>
|
|
61
|
+
<CardTitle level={2}>Contextual help on a form label</CardTitle>
|
|
62
|
+
<CardDescription>
|
|
63
|
+
Wrap a non-interactive icon in a span with tabIndex=0 so keyboard users can focus it.
|
|
64
|
+
Explain accounting terms or beta features without cluttering the UI.
|
|
65
|
+
</CardDescription>
|
|
66
|
+
</CardHeader>
|
|
67
|
+
<CardContent>
|
|
68
|
+
<Flex direction="row" gap="sm" align="center">
|
|
69
|
+
<Text weight="medium">AR 残高</Text>
|
|
70
|
+
<Tooltip>
|
|
71
|
+
<TooltipTrigger asChild>
|
|
72
|
+
<span tabIndex={0} className="text-muted-foreground cursor-help">
|
|
73
|
+
<Info className="size-4" />
|
|
74
|
+
</span>
|
|
75
|
+
</TooltipTrigger>
|
|
76
|
+
<TooltipContent side="right" className="max-w-56">
|
|
77
|
+
売掛金の未回収合計額。請求書ステータスが「未払い」のものを集計しています。
|
|
78
|
+
</TooltipContent>
|
|
79
|
+
</Tooltip>
|
|
80
|
+
</Flex>
|
|
81
|
+
</CardContent>
|
|
82
|
+
</Card>
|
|
83
|
+
|
|
84
|
+
<Card>
|
|
85
|
+
<CardHeader>
|
|
86
|
+
<CardTitle level={2}>Disabled button reason</CardTitle>
|
|
87
|
+
<CardDescription>
|
|
88
|
+
Wrap a disabled Button in a Tooltip to explain why the action is unavailable.
|
|
89
|
+
TooltipTrigger asChild merges onto the disabled element correctly.
|
|
90
|
+
</CardDescription>
|
|
91
|
+
</CardHeader>
|
|
92
|
+
<CardContent>
|
|
93
|
+
<Tooltip>
|
|
94
|
+
<TooltipTrigger asChild>
|
|
95
|
+
<span tabIndex={0} className="inline-block">
|
|
96
|
+
<Button disabled>承認申請</Button>
|
|
97
|
+
</span>
|
|
98
|
+
</TooltipTrigger>
|
|
99
|
+
<TooltipContent side="bottom">全項目を入力してから申請できます</TooltipContent>
|
|
100
|
+
</Tooltip>
|
|
101
|
+
</CardContent>
|
|
102
|
+
</Card>
|
|
103
|
+
|
|
104
|
+
<Card>
|
|
105
|
+
<CardHeader>
|
|
106
|
+
<CardTitle level={2}>Keyboard shortcut hint</CardTitle>
|
|
107
|
+
<CardDescription>
|
|
108
|
+
Surface keyboard shortcuts on toolbar buttons without adding visible text to the UI.
|
|
109
|
+
delayDuration={0} for instant display on quick hover.
|
|
110
|
+
</CardDescription>
|
|
111
|
+
</CardHeader>
|
|
112
|
+
<CardContent>
|
|
113
|
+
<Tooltip delayDuration={0}>
|
|
114
|
+
<TooltipTrigger asChild>
|
|
115
|
+
<Button variant="outline" size="sm">
|
|
116
|
+
検索
|
|
117
|
+
</Button>
|
|
118
|
+
</TooltipTrigger>
|
|
119
|
+
<TooltipContent side="bottom">⌘K でグローバル検索を開く</TooltipContent>
|
|
120
|
+
</Tooltip>
|
|
121
|
+
</CardContent>
|
|
122
|
+
</Card>
|
|
123
|
+
|
|
124
|
+
<Card>
|
|
125
|
+
<CardHeader>
|
|
126
|
+
<CardTitle level={2}>Shared delay across a toolbar (TooltipProvider)</CardTitle>
|
|
127
|
+
<CardDescription>
|
|
128
|
+
Wrap a cluster in TooltipProvider to set one delayDuration for every tooltip inside —
|
|
129
|
+
a dense toolbar feels snappy without repeating the prop on each Tooltip.
|
|
130
|
+
</CardDescription>
|
|
131
|
+
</CardHeader>
|
|
132
|
+
<CardContent>
|
|
133
|
+
<TooltipProvider delayDuration={0}>
|
|
134
|
+
<Flex direction="row" gap="sm" align="center">
|
|
135
|
+
<Tooltip>
|
|
136
|
+
<TooltipTrigger asChild>
|
|
137
|
+
<Button variant="ghost" size="icon" aria-label="編集">
|
|
138
|
+
<Pencil className="size-4" />
|
|
139
|
+
</Button>
|
|
140
|
+
</TooltipTrigger>
|
|
141
|
+
<TooltipContent side="bottom">編集</TooltipContent>
|
|
142
|
+
</Tooltip>
|
|
143
|
+
<Tooltip>
|
|
144
|
+
<TooltipTrigger asChild>
|
|
145
|
+
<Button variant="ghost" size="icon" aria-label="複製">
|
|
146
|
+
<Copy className="size-4" />
|
|
147
|
+
</Button>
|
|
148
|
+
</TooltipTrigger>
|
|
149
|
+
<TooltipContent side="bottom">複製</TooltipContent>
|
|
150
|
+
</Tooltip>
|
|
151
|
+
<Tooltip>
|
|
152
|
+
<TooltipTrigger asChild>
|
|
153
|
+
<Button
|
|
154
|
+
variant="ghost"
|
|
155
|
+
size="icon"
|
|
156
|
+
aria-label="削除"
|
|
157
|
+
className="text-destructive hover:text-destructive"
|
|
158
|
+
>
|
|
159
|
+
<Trash2 className="size-4" />
|
|
160
|
+
</Button>
|
|
161
|
+
</TooltipTrigger>
|
|
162
|
+
<TooltipContent side="bottom">削除 (元に戻せません)</TooltipContent>
|
|
163
|
+
</Tooltip>
|
|
164
|
+
</Flex>
|
|
165
|
+
</TooltipProvider>
|
|
166
|
+
</CardContent>
|
|
167
|
+
</Card>
|
|
168
|
+
</Flex>
|
|
169
|
+
</PageContainer>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { TwoFactorSetup, type TwoFactorSetupLabels } from "@godxjp/ui/feedback";
|
|
5
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
6
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
7
|
+
|
|
8
|
+
const labels: TwoFactorSetupLabels = {
|
|
9
|
+
title: "二要素認証を有効にする",
|
|
10
|
+
description: "認証アプリでQRコードを読み取り、表示された6桁のコードを入力します。",
|
|
11
|
+
qrLabel: "認証アプリ登録用QRコード",
|
|
12
|
+
manualKeyLabel: "手動セットアップキー",
|
|
13
|
+
codeLabel: "確認コード",
|
|
14
|
+
codePlaceholder: "123 456",
|
|
15
|
+
recoveryNotice: "復旧コードは安全な場所に保存してください。再表示できません。",
|
|
16
|
+
cancel: "キャンセル",
|
|
17
|
+
confirm: "確認して有効化",
|
|
18
|
+
acknowledge: "保存しました",
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* TwoFactorSetup — controlled enrollment and one-time recovery-code journey. Persistence and
|
|
23
|
+
* network requests remain consumer-owned; this frame demonstrates the public state boundary.
|
|
24
|
+
*/
|
|
25
|
+
export default function Demo() {
|
|
26
|
+
const [open, setOpen] = useState(false);
|
|
27
|
+
const [code, setCode] = useState("");
|
|
28
|
+
const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);
|
|
29
|
+
|
|
30
|
+
const beginEnrollment = () => {
|
|
31
|
+
setCode("");
|
|
32
|
+
setRecoveryCodes([]);
|
|
33
|
+
setOpen(true);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<PageContainer title="TwoFactorSetup" subtitle="登録 · OTP確認 · 復旧コード受領">
|
|
38
|
+
<Card>
|
|
39
|
+
<CardHeader>
|
|
40
|
+
<CardTitle level={2}>認証アプリを登録</CardTitle>
|
|
41
|
+
<CardDescription>6桁の確認コードが揃うまで有効化操作は利用できません。</CardDescription>
|
|
42
|
+
</CardHeader>
|
|
43
|
+
<CardContent>
|
|
44
|
+
<Flex direction="col" gap="md">
|
|
45
|
+
<Button onClick={beginEnrollment}>二要素認証を設定</Button>
|
|
46
|
+
<Text size="sm" tone="muted" aria-live="polite">
|
|
47
|
+
{recoveryCodes.length > 0
|
|
48
|
+
? "復旧コードを表示しています。"
|
|
49
|
+
: "二要素認証はまだ設定されていません。"}
|
|
50
|
+
</Text>
|
|
51
|
+
</Flex>
|
|
52
|
+
<TwoFactorSetup
|
|
53
|
+
open={open}
|
|
54
|
+
onOpenChange={setOpen}
|
|
55
|
+
qrValue="otpauth://totp/Godx:tanaka@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Godx"
|
|
56
|
+
manualKey="JBSW Y3DP EHPK 3PXP"
|
|
57
|
+
code={code}
|
|
58
|
+
onCodeChange={setCode}
|
|
59
|
+
onConfirm={() => setRecoveryCodes(["alpha-7k2m", "bravo-9p4x", "charlie-3d8q"])}
|
|
60
|
+
recoveryCodes={recoveryCodes}
|
|
61
|
+
onAcknowledge={() => setOpen(false)}
|
|
62
|
+
labels={labels}
|
|
63
|
+
/>
|
|
64
|
+
</CardContent>
|
|
65
|
+
</Card>
|
|
66
|
+
</PageContainer>
|
|
67
|
+
);
|
|
68
|
+
}
|