@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,103 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
2
|
+
import { AuthAccountSummary, AuthStack, PageContainer } from "@godxjp/ui/layout";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* AuthAccountSummary — compact signed-in identity row for hosted auth and device authorization.
|
|
6
|
+
*
|
|
7
|
+
* The row owns three things: the avatar (image, caller fallback, or the default person glyph),
|
|
8
|
+
* the account address, and exactly one ghost action. Everything else is consumer data.
|
|
9
|
+
*
|
|
10
|
+
* The address CLIPS with an ellipsis, so it declares its own line box rather than inheriting one
|
|
11
|
+
* (gh#254): a tight inherited line-height makes the clip box shorter than the font's ascent plus
|
|
12
|
+
* descent and shears Vietnamese tone marks and Latin descenders off, while the DOM text stays
|
|
13
|
+
* correct. The Vietnamese row below is the regression case for that.
|
|
14
|
+
*/
|
|
15
|
+
export default function Demo() {
|
|
16
|
+
return (
|
|
17
|
+
<PageContainer
|
|
18
|
+
title="AuthAccountSummary"
|
|
19
|
+
subtitle="サインイン中のアカウント行(アバター・アドレス・単一アクション)"
|
|
20
|
+
>
|
|
21
|
+
<Card>
|
|
22
|
+
<CardHeader>
|
|
23
|
+
<CardTitle level={2}>アバターの3系統</CardTitle>
|
|
24
|
+
<CardDescription>
|
|
25
|
+
画像、呼び出し側のフォールバック文字、既定の人物グリフ。いずれも装飾扱いで、読み上げ対象は
|
|
26
|
+
アドレスとアクションのみです。
|
|
27
|
+
</CardDescription>
|
|
28
|
+
</CardHeader>
|
|
29
|
+
<CardContent>
|
|
30
|
+
<AuthStack>
|
|
31
|
+
<AuthAccountSummary
|
|
32
|
+
email="hanako.yamada@example.co.jp"
|
|
33
|
+
avatarSrc="https://i.pravatar.cc/64?img=47"
|
|
34
|
+
actionLabel="アカウントを切り替える"
|
|
35
|
+
onAction={() => {}}
|
|
36
|
+
/>
|
|
37
|
+
<AuthAccountSummary
|
|
38
|
+
email="taro.suzuki@example.co.jp"
|
|
39
|
+
avatarFallback="鈴"
|
|
40
|
+
actionLabel="アカウントを切り替える"
|
|
41
|
+
onAction={() => {}}
|
|
42
|
+
/>
|
|
43
|
+
<AuthAccountSummary
|
|
44
|
+
email="operations@example.co.jp"
|
|
45
|
+
actionLabel="アカウントを切り替える"
|
|
46
|
+
onAction={() => {}}
|
|
47
|
+
/>
|
|
48
|
+
</AuthStack>
|
|
49
|
+
</CardContent>
|
|
50
|
+
</Card>
|
|
51
|
+
|
|
52
|
+
<Card>
|
|
53
|
+
<CardHeader>
|
|
54
|
+
<CardTitle level={2}>無効状態</CardTitle>
|
|
55
|
+
<CardDescription>
|
|
56
|
+
アクションだけが無効になります。アドレスは引き続き選択・読み上げできます。
|
|
57
|
+
</CardDescription>
|
|
58
|
+
</CardHeader>
|
|
59
|
+
<CardContent>
|
|
60
|
+
<AuthStack>
|
|
61
|
+
<AuthAccountSummary
|
|
62
|
+
email="locked.account@example.co.jp"
|
|
63
|
+
actionLabel="切り替えできません"
|
|
64
|
+
onAction={() => {}}
|
|
65
|
+
disabled
|
|
66
|
+
/>
|
|
67
|
+
</AuthStack>
|
|
68
|
+
</CardContent>
|
|
69
|
+
</Card>
|
|
70
|
+
|
|
71
|
+
<Card>
|
|
72
|
+
<CardHeader>
|
|
73
|
+
<CardTitle level={2}>長いアドレスと多言語</CardTitle>
|
|
74
|
+
<CardDescription>
|
|
75
|
+
省略記号で切り詰めても、ベトナム語の声調記号とラテン文字のディセンダーが欠けないことを
|
|
76
|
+
確認します。ホバーで全文をtitle属性から参照できます。
|
|
77
|
+
</CardDescription>
|
|
78
|
+
</CardHeader>
|
|
79
|
+
<CardContent>
|
|
80
|
+
<AuthStack>
|
|
81
|
+
<AuthAccountSummary
|
|
82
|
+
email="very.long.authoritative.account.address@example.enterprise.invalid"
|
|
83
|
+
actionLabel="アカウントを切り替える"
|
|
84
|
+
onAction={() => {}}
|
|
85
|
+
/>
|
|
86
|
+
<AuthAccountSummary
|
|
87
|
+
email="phuong.nguyen.quynh@doanhnghiep.example.vn"
|
|
88
|
+
avatarFallback="Ph"
|
|
89
|
+
actionLabel="Chuyển đổi tài khoản"
|
|
90
|
+
onAction={() => {}}
|
|
91
|
+
/>
|
|
92
|
+
<AuthAccountSummary
|
|
93
|
+
email="jennifer.pettigrew@enterprise-security.example.com"
|
|
94
|
+
avatarFallback="JP"
|
|
95
|
+
actionLabel="Switch account"
|
|
96
|
+
onAction={() => {}}
|
|
97
|
+
/>
|
|
98
|
+
</AuthStack>
|
|
99
|
+
</CardContent>
|
|
100
|
+
</Card>
|
|
101
|
+
</PageContainer>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
2
|
+
import { AuthDivider, AuthStack, PageContainer } from "@godxjp/ui/layout";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* AuthDivider — localized conjunction between equal separator rules. The label remains visible and
|
|
6
|
+
* centred under long Japanese, English and RTL content.
|
|
7
|
+
*/
|
|
8
|
+
export default function Demo() {
|
|
9
|
+
return (
|
|
10
|
+
<PageContainer title="AuthDivider" subtitle="認証手段を分けるローカライズ済み区切り">
|
|
11
|
+
<Card>
|
|
12
|
+
<CardHeader>
|
|
13
|
+
<CardTitle level={2}>言語とcontent stress</CardTitle>
|
|
14
|
+
<CardDescription>区切り線はlabelの長さに応じて同じ比率で縮みます。</CardDescription>
|
|
15
|
+
</CardHeader>
|
|
16
|
+
<CardContent>
|
|
17
|
+
<AuthStack>
|
|
18
|
+
<AuthDivider label="または" />
|
|
19
|
+
<AuthDivider label="or continue with your organization account" />
|
|
20
|
+
<div dir="rtl">
|
|
21
|
+
<AuthDivider label="أو تابع باستخدام حساب المؤسسة" />
|
|
22
|
+
</div>
|
|
23
|
+
</AuthStack>
|
|
24
|
+
</CardContent>
|
|
25
|
+
</Card>
|
|
26
|
+
</PageContainer>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
2
|
+
import { Button } from "@godxjp/ui/general";
|
|
3
|
+
import { AuthFooter, AuthStack, PageContainer } from "@godxjp/ui/layout";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* AuthFooter — shared hosted-identity legal line. Every item remains consumer-owned React content,
|
|
7
|
+
* allowing real links and locale controls without the layout component inventing navigation.
|
|
8
|
+
*/
|
|
9
|
+
export default function Demo() {
|
|
10
|
+
return (
|
|
11
|
+
<PageContainer title="AuthFooter" subtitle="製品名 · 規約 · プライバシー · 言語">
|
|
12
|
+
<Card>
|
|
13
|
+
<CardHeader>
|
|
14
|
+
<CardTitle level={2}>認証画面の法務フッター</CardTitle>
|
|
15
|
+
<CardDescription>
|
|
16
|
+
localeは任意です。リンク先と遷移方法はconsumerが所有します。
|
|
17
|
+
</CardDescription>
|
|
18
|
+
</CardHeader>
|
|
19
|
+
<CardContent>
|
|
20
|
+
<AuthStack>
|
|
21
|
+
<AuthFooter
|
|
22
|
+
product="Acme Identity"
|
|
23
|
+
terms={<a href="#terms">利用規約</a>}
|
|
24
|
+
privacy={<a href="#privacy">プライバシー</a>}
|
|
25
|
+
locale={
|
|
26
|
+
<Button type="button" variant="ghost" size="sm">
|
|
27
|
+
日本語
|
|
28
|
+
</Button>
|
|
29
|
+
}
|
|
30
|
+
/>
|
|
31
|
+
<AuthFooter product="Godx ID" terms="Terms" privacy="Privacy" />
|
|
32
|
+
</AuthStack>
|
|
33
|
+
</CardContent>
|
|
34
|
+
</Card>
|
|
35
|
+
</PageContainer>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
2
|
+
import { AuthAccountSummary, AuthIdentity, AuthStack, PageContainer } from "@godxjp/ui/layout";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* AuthIdentity — canonical identity title with optional relying-party request context. The
|
|
6
|
+
* requester line is consumer data and may be omitted for first-party authentication.
|
|
7
|
+
*/
|
|
8
|
+
export default function Demo() {
|
|
9
|
+
return (
|
|
10
|
+
<PageContainer title="AuthIdentity" subtitle="ホストIDと依頼元サービスのコンテキスト">
|
|
11
|
+
<Card>
|
|
12
|
+
<CardHeader>
|
|
13
|
+
<CardTitle level={2}>依頼元あり・なし</CardTitle>
|
|
14
|
+
<CardDescription>
|
|
15
|
+
外部サービスからの認証要求だけrequesterを表示し、通常ログインでは省略します。
|
|
16
|
+
</CardDescription>
|
|
17
|
+
</CardHeader>
|
|
18
|
+
<CardContent>
|
|
19
|
+
<AuthStack>
|
|
20
|
+
<AuthIdentity title="Godx IDにログイン" requester="勤怠管理が認証を要求しています" />
|
|
21
|
+
<AuthIdentity title="アカウントを確認" />
|
|
22
|
+
<AuthIdentity
|
|
23
|
+
title="Continue to Godx ID"
|
|
24
|
+
requester="Enterprise Security and Compliance Administration is requesting sign in"
|
|
25
|
+
/>
|
|
26
|
+
<AuthAccountSummary
|
|
27
|
+
email="very.long.authoritative.account@example.enterprise.invalid"
|
|
28
|
+
actionLabel="アカウントを切り替える"
|
|
29
|
+
onAction={() => {}}
|
|
30
|
+
/>
|
|
31
|
+
</AuthStack>
|
|
32
|
+
</CardContent>
|
|
33
|
+
</Card>
|
|
34
|
+
</PageContainer>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Sign-in MFA challenge (5 states)
|
|
3
|
+
viewport: 1440x2000
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## otp · otp/error · otp/loading · recovery-code · passkey-failure
|
|
7
|
+
|
|
8
|
+
This is the **sign-in challenge**. `TwoFactorSetup` is the **enrollment** Dialog (QR, manual key,
|
|
9
|
+
recovery-code output) — a challenge has no secret to reveal and no dialog to dismiss, it _is_ the
|
|
10
|
+
page. Reusing the enrollment dialog here is the anti-pattern this example exists to prevent.
|
|
11
|
+
|
|
12
|
+
## Focus order (WAI-ARIA APG + WCAG 2.4.3)
|
|
13
|
+
|
|
14
|
+
DOM order **is** the task order, so no `tabindex` is needed anywhere:
|
|
15
|
+
|
|
16
|
+
1. the code field — one `InputOTP` (or one `Input` for a recovery code)
|
|
17
|
+
2. the primary action — `Button fullWidth`
|
|
18
|
+
3. fallback A
|
|
19
|
+
4. fallback B
|
|
20
|
+
|
|
21
|
+
The 6-slot row is **one field**, not six. `InputOTP` owns paste, arrow keys, backspace and the
|
|
22
|
+
caret, and exposes a single focus stop; six `Input`s would put six stops in the tab ring and break
|
|
23
|
+
paste of a 6-digit code — the single most common real-world MFA interaction.
|
|
24
|
+
|
|
25
|
+
The error message is rendered by `FormField error` with `role="alert"` and wired as
|
|
26
|
+
`aria-errormessage` on the field, which also carries `aria-invalid` — so a screen-reader user hears
|
|
27
|
+
"wrong code" without leaving the field, and sighted users get the destructive slot borders. State is
|
|
28
|
+
never signalled by colour alone (WCAG 1.4.1): the text is always there.
|
|
29
|
+
|
|
30
|
+
## Loading
|
|
31
|
+
|
|
32
|
+
`<Button loading loadingText="検証中…">` keeps the button's box while it is pending, so the panel
|
|
33
|
+
never jumps mid-submit, and the input is `disabled` for the duration. The fallbacks are disabled
|
|
34
|
+
too — a second verification must not race the first.
|
|
35
|
+
|
|
36
|
+
## Fallback row
|
|
37
|
+
|
|
38
|
+
`<Flex justify="between" gap="sm" wrap>` with two ghost buttons. The two fallbacks share one
|
|
39
|
+
horizontal row while the localized labels fit the panel and **wrap to a stack** when they do not —
|
|
40
|
+
a content-driven reflow, so it is correct for JA, EN and VI without a media query. See the
|
|
41
|
+
long-label example.
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Alert, AlertDescription, AlertTitle } from "@godxjp/ui/feedback";
|
|
4
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
5
|
+
import { FormField, Input, InputOTP, InputOTPGroup, InputOTPSlot } from "@godxjp/ui/data-entry";
|
|
6
|
+
import { Button, Logo, Text } from "@godxjp/ui/general";
|
|
7
|
+
import { AuthFooter, AuthShell, AuthStack, Flex } from "@godxjp/ui/layout";
|
|
8
|
+
import { AppSettingPicker } from "@godxjp/ui/navigation";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* SIGN-IN MFA CHALLENGE — the three canonical SCR-008 states plus the error / loading paths,
|
|
12
|
+
* stacked at the real 432px measure.
|
|
13
|
+
*
|
|
14
|
+
* This is the SIGN-IN challenge, not enrollment. `TwoFactorSetup` is the enrollment Dialog (QR /
|
|
15
|
+
* manual key / recovery output) and must never be reused here: a challenge has no secret to reveal
|
|
16
|
+
* and no dialog to dismiss — it IS the page.
|
|
17
|
+
*
|
|
18
|
+
* FOCUS ORDER is DOM order, and DOM order is the task order:
|
|
19
|
+
* 1. the code field (OTP row / recovery-code Input) 2. the primary action
|
|
20
|
+
* 3. fallback A 4. fallback B
|
|
21
|
+
* The OTP row is ONE field — `InputOTP` owns paste, arrow keys and the caret; six separate
|
|
22
|
+
* `Input`s would put six stops in the tab ring and break paste.
|
|
23
|
+
*
|
|
24
|
+
* State coverage: otp (idle) · otp ERROR (wrong code) · otp LOADING (verifying) · recovery-code ·
|
|
25
|
+
* passkey-failure. The first panel owns the standalone frame's single `level={1}` heading; the
|
|
26
|
+
* remaining state sections use `level={2}`. A real route renders ONE panel at `level={1}`.
|
|
27
|
+
*/
|
|
28
|
+
export default function Demo() {
|
|
29
|
+
const [code, setCode] = useState("");
|
|
30
|
+
const [wrongCode, setWrongCode] = useState("140228");
|
|
31
|
+
const [pendingCode, setPendingCode] = useState("482915");
|
|
32
|
+
const [recoveryCode, setRecoveryCode] = useState("");
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<AuthShell
|
|
36
|
+
variant="canonical"
|
|
37
|
+
preset="account-recovery"
|
|
38
|
+
brand={
|
|
39
|
+
<Flex align="center" gap="sm">
|
|
40
|
+
<Logo mark="godx" tone="success" />
|
|
41
|
+
<Text weight="medium">GoDX ID</Text>
|
|
42
|
+
</Flex>
|
|
43
|
+
}
|
|
44
|
+
footer={
|
|
45
|
+
<AuthFooter
|
|
46
|
+
product="GoDX ID"
|
|
47
|
+
terms="利用規約"
|
|
48
|
+
privacy="プライバシー"
|
|
49
|
+
locale={<AppSettingPicker kind="locale" appearance="labeled" compact />}
|
|
50
|
+
/>
|
|
51
|
+
}
|
|
52
|
+
>
|
|
53
|
+
<Flex direction="col" gap="lg">
|
|
54
|
+
<Text size="xs" tone="muted" mono>
|
|
55
|
+
1 / 5 · otp · 認証アプリの 6 桁コード(1 行 6 スロット)
|
|
56
|
+
</Text>
|
|
57
|
+
<Card>
|
|
58
|
+
<CardHeader>
|
|
59
|
+
<CardTitle level={1}>二段階認証</CardTitle>
|
|
60
|
+
<CardDescription>
|
|
61
|
+
認証アプリに表示されている 6 桁のコードを入力してください。
|
|
62
|
+
</CardDescription>
|
|
63
|
+
</CardHeader>
|
|
64
|
+
<CardContent>
|
|
65
|
+
<AuthStack>
|
|
66
|
+
<FormField id="mfa-otp-idle" label="確認コード" required>
|
|
67
|
+
<InputOTP maxLength={6} pattern="^[0-9]+$" value={code} onChange={setCode}>
|
|
68
|
+
<InputOTPGroup>
|
|
69
|
+
<InputOTPSlot index={0} />
|
|
70
|
+
<InputOTPSlot index={1} />
|
|
71
|
+
<InputOTPSlot index={2} />
|
|
72
|
+
<InputOTPSlot index={3} />
|
|
73
|
+
<InputOTPSlot index={4} />
|
|
74
|
+
<InputOTPSlot index={5} />
|
|
75
|
+
</InputOTPGroup>
|
|
76
|
+
</InputOTP>
|
|
77
|
+
</FormField>
|
|
78
|
+
<Button fullWidth>確認する</Button>
|
|
79
|
+
<Flex justify="between" gap="sm" wrap>
|
|
80
|
+
<Button variant="ghost" size="sm">
|
|
81
|
+
リカバリコードを使う
|
|
82
|
+
</Button>
|
|
83
|
+
<Button variant="ghost" size="sm">
|
|
84
|
+
パスキーで再試行
|
|
85
|
+
</Button>
|
|
86
|
+
</Flex>
|
|
87
|
+
</AuthStack>
|
|
88
|
+
</CardContent>
|
|
89
|
+
</Card>
|
|
90
|
+
|
|
91
|
+
<Text size="xs" tone="muted" mono>
|
|
92
|
+
2 / 5 · otp(error)— コード不一致 · aria-invalid + role=alert
|
|
93
|
+
</Text>
|
|
94
|
+
<Card>
|
|
95
|
+
<CardHeader>
|
|
96
|
+
<CardTitle level={2}>二段階認証</CardTitle>
|
|
97
|
+
<CardDescription>
|
|
98
|
+
認証アプリに表示されている 6 桁のコードを入力してください。
|
|
99
|
+
</CardDescription>
|
|
100
|
+
</CardHeader>
|
|
101
|
+
<CardContent>
|
|
102
|
+
<AuthStack>
|
|
103
|
+
<FormField
|
|
104
|
+
id="mfa-otp-error"
|
|
105
|
+
label="確認コード"
|
|
106
|
+
error="コードが正しくありません。残り 4 回入力できます。"
|
|
107
|
+
required
|
|
108
|
+
>
|
|
109
|
+
<InputOTP
|
|
110
|
+
maxLength={6}
|
|
111
|
+
pattern="^[0-9]+$"
|
|
112
|
+
value={wrongCode}
|
|
113
|
+
onChange={setWrongCode}
|
|
114
|
+
>
|
|
115
|
+
<InputOTPGroup>
|
|
116
|
+
<InputOTPSlot index={0} />
|
|
117
|
+
<InputOTPSlot index={1} />
|
|
118
|
+
<InputOTPSlot index={2} />
|
|
119
|
+
<InputOTPSlot index={3} />
|
|
120
|
+
<InputOTPSlot index={4} />
|
|
121
|
+
<InputOTPSlot index={5} />
|
|
122
|
+
</InputOTPGroup>
|
|
123
|
+
</InputOTP>
|
|
124
|
+
</FormField>
|
|
125
|
+
<Button fullWidth>確認する</Button>
|
|
126
|
+
<Flex justify="between" gap="sm" wrap>
|
|
127
|
+
<Button variant="ghost" size="sm">
|
|
128
|
+
リカバリコードを使う
|
|
129
|
+
</Button>
|
|
130
|
+
<Button variant="ghost" size="sm">
|
|
131
|
+
パスキーで再試行
|
|
132
|
+
</Button>
|
|
133
|
+
</Flex>
|
|
134
|
+
</AuthStack>
|
|
135
|
+
</CardContent>
|
|
136
|
+
</Card>
|
|
137
|
+
|
|
138
|
+
<Text size="xs" tone="muted" mono>
|
|
139
|
+
3 / 5 · otp(loading)— 検証中 · 入力をロックし、ボタンの箱は動かさない
|
|
140
|
+
</Text>
|
|
141
|
+
<Card>
|
|
142
|
+
<CardHeader>
|
|
143
|
+
<CardTitle level={2}>二段階認証</CardTitle>
|
|
144
|
+
<CardDescription>コードを検証しています。しばらくお待ちください。</CardDescription>
|
|
145
|
+
</CardHeader>
|
|
146
|
+
<CardContent>
|
|
147
|
+
<AuthStack>
|
|
148
|
+
<FormField id="mfa-otp-loading" label="確認コード" required>
|
|
149
|
+
<InputOTP
|
|
150
|
+
disabled
|
|
151
|
+
maxLength={6}
|
|
152
|
+
pattern="^[0-9]+$"
|
|
153
|
+
value={pendingCode}
|
|
154
|
+
onChange={setPendingCode}
|
|
155
|
+
>
|
|
156
|
+
<InputOTPGroup>
|
|
157
|
+
<InputOTPSlot index={0} />
|
|
158
|
+
<InputOTPSlot index={1} />
|
|
159
|
+
<InputOTPSlot index={2} />
|
|
160
|
+
<InputOTPSlot index={3} />
|
|
161
|
+
<InputOTPSlot index={4} />
|
|
162
|
+
<InputOTPSlot index={5} />
|
|
163
|
+
</InputOTPGroup>
|
|
164
|
+
</InputOTP>
|
|
165
|
+
</FormField>
|
|
166
|
+
<Button fullWidth loading loadingText="検証中…">
|
|
167
|
+
確認する
|
|
168
|
+
</Button>
|
|
169
|
+
<Flex justify="between" gap="sm" wrap>
|
|
170
|
+
<Button variant="ghost" size="sm" disabled>
|
|
171
|
+
リカバリコードを使う
|
|
172
|
+
</Button>
|
|
173
|
+
<Button variant="ghost" size="sm" disabled>
|
|
174
|
+
パスキーで再試行
|
|
175
|
+
</Button>
|
|
176
|
+
</Flex>
|
|
177
|
+
</AuthStack>
|
|
178
|
+
</CardContent>
|
|
179
|
+
</Card>
|
|
180
|
+
|
|
181
|
+
<Text size="xs" tone="muted" mono>
|
|
182
|
+
4 / 5 · recovery-code · 一度きりのリカバリコード(1 つのテキスト入力)
|
|
183
|
+
</Text>
|
|
184
|
+
<Card>
|
|
185
|
+
<CardHeader>
|
|
186
|
+
<CardTitle level={2}>リカバリコードを入力</CardTitle>
|
|
187
|
+
<CardDescription>
|
|
188
|
+
二段階認証の設定時に保存した、一度だけ使えるコードを入力してください。
|
|
189
|
+
</CardDescription>
|
|
190
|
+
</CardHeader>
|
|
191
|
+
<CardContent>
|
|
192
|
+
<AuthStack>
|
|
193
|
+
<FormField
|
|
194
|
+
id="mfa-recovery-code"
|
|
195
|
+
label="リカバリコード"
|
|
196
|
+
helper="ハイフンを含めて入力してください(例: 4f7c-92ab-30de)。"
|
|
197
|
+
required
|
|
198
|
+
>
|
|
199
|
+
<Input
|
|
200
|
+
autoComplete="one-time-code"
|
|
201
|
+
inputMode="text"
|
|
202
|
+
spellCheck={false}
|
|
203
|
+
placeholder="4f7c-92ab-30de"
|
|
204
|
+
value={recoveryCode}
|
|
205
|
+
onChange={(event) => setRecoveryCode(event.target.value)}
|
|
206
|
+
/>
|
|
207
|
+
</FormField>
|
|
208
|
+
<Button fullWidth>確認する</Button>
|
|
209
|
+
<Flex justify="between" gap="sm" wrap>
|
|
210
|
+
<Button variant="ghost" size="sm">
|
|
211
|
+
認証アプリに戻る
|
|
212
|
+
</Button>
|
|
213
|
+
<Button variant="ghost" size="sm">
|
|
214
|
+
パスキーで再試行
|
|
215
|
+
</Button>
|
|
216
|
+
</Flex>
|
|
217
|
+
</AuthStack>
|
|
218
|
+
</CardContent>
|
|
219
|
+
</Card>
|
|
220
|
+
|
|
221
|
+
<Text size="xs" tone="muted" mono>
|
|
222
|
+
5 / 5 · passkey-failure · パスキー認証に失敗(destructive 通知 + 代替手段)
|
|
223
|
+
</Text>
|
|
224
|
+
<Card>
|
|
225
|
+
<CardHeader>
|
|
226
|
+
<CardTitle level={2}>パスキーで確認できませんでした</CardTitle>
|
|
227
|
+
<CardDescription>
|
|
228
|
+
このデバイスのパスキーを読み取れませんでした。別の方法で本人確認を続けられます。
|
|
229
|
+
</CardDescription>
|
|
230
|
+
</CardHeader>
|
|
231
|
+
<CardContent>
|
|
232
|
+
<AuthStack>
|
|
233
|
+
<Alert tone="destructive">
|
|
234
|
+
<AlertTitle>パスキーの認証がキャンセルされました</AlertTitle>
|
|
235
|
+
<AlertDescription>
|
|
236
|
+
デバイスのロック解除が完了しなかったか、対応するパスキーが見つかりませんでした。
|
|
237
|
+
</AlertDescription>
|
|
238
|
+
</Alert>
|
|
239
|
+
<Button fullWidth>パスキーで再試行</Button>
|
|
240
|
+
<Flex justify="between" gap="sm" wrap>
|
|
241
|
+
<Button variant="ghost" size="sm">
|
|
242
|
+
認証アプリのコードを使う
|
|
243
|
+
</Button>
|
|
244
|
+
<Button variant="ghost" size="sm">
|
|
245
|
+
リカバリコードを使う
|
|
246
|
+
</Button>
|
|
247
|
+
</Flex>
|
|
248
|
+
</AuthStack>
|
|
249
|
+
</CardContent>
|
|
250
|
+
</Card>
|
|
251
|
+
</Flex>
|
|
252
|
+
</AuthShell>
|
|
253
|
+
);
|
|
254
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
--- title: Viewport 390x844 viewport: 390x844 ---
|
|
2
|
+
|
|
3
|
+
## The 390 reference image is NOT a valid source
|
|
4
|
+
|
|
5
|
+
It overflows and crops horizontally: the two 432px panels are still laid out side by side. It shows no mobile route, no mobile gutter and no reflow, and it was **not traced**. Accepting its cropped overflow as "intended mobile behaviour" would ship a broken screen with a canonical signature on it, so the issue's own words apply: _a route-level mobile reference or an explicit responsive contract is required_.
|
|
6
|
+
|
|
7
|
+
What follows is that **explicit contract**, decided in the library and enforced by tokens + tests.
|
|
8
|
+
|
|
9
|
+
## The contract at ≤ 30rem
|
|
10
|
+
|
|
11
|
+
| Aspect | Contract |
|
|
12
|
+
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| Page gutter | `--auth-shell-recovery-main-padding-mobile` = **15px inline** ⇒ panel `x=15, width=360` at a 390 viewport. |
|
|
14
|
+
| Why 15px | It is the canonical **Login** mobile gutter (`--auth-shell-canonical-main-padding-mobile`). Login → Recovery must not make the surface jump. |
|
|
15
|
+
| Panel measure | `min(100%, 27rem)`. 432px is a **max**-width, so the panel simply becomes 360px — it is never scaled, cropped or scrolled. |
|
|
16
|
+
| Card inset | Unchanged (24px, `--auth-shell-compact-card-inset`) ⇒ a **310px** content column. |
|
|
17
|
+
| OTP row | Stays **one row of 6 slots**: 6 × 36px = **216px** ≤ 310px. Slots are never shrunk and the row never scrolls. |
|
|
18
|
+
| Primary action | `Button fullWidth` — spans the panel at every width. |
|
|
19
|
+
| Fallback row | Wraps to a **stack** when the two localized labels exceed the content column; otherwise it stays one row. Content-driven, no media query. |
|
|
20
|
+
| Title/description | Stay inside the bordered surface; long JA/VI strings wrap inside the 310px column and grow the panel's height. |
|
|
21
|
+
| Vertical | The column stays centred; when the panel is taller than the viewport the shell scrolls from the top — the top of the panel is never clipped. |
|
|
22
|
+
|
|
23
|
+
## Not defined here
|
|
24
|
+
|
|
25
|
+
Anything the reference could have specified but did not — a mobile-specific type ramp, a sticky bottom action bar, a full-bleed edge-to-edge panel — is **deliberately absent**. Inventing it would be fabricating a canonical. If SCR-008 later ships a real 390 route artboard and it disagrees with the table above, the fix is a token retune (or a new preset), not consumer CSS.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
|
|
4
|
+
import { FormField, InputOTP, InputOTPGroup, InputOTPSlot } from "@godxjp/ui/data-entry";
|
|
5
|
+
import { Button, Logo, Reveal, Text } from "@godxjp/ui/general";
|
|
6
|
+
import { AuthFooter, AuthShell, AuthStack, Flex } from "@godxjp/ui/layout";
|
|
7
|
+
import { AppSettingPicker } from "@godxjp/ui/navigation";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Viewport fixture — 390x844 (mobile). THE MOBILE CONTRACT, decided here.
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ The 390 canonical reference supplied with gh#233 is a desktop 2x2 COMPOSITE that overflows and
|
|
13
|
+
* crops horizontally. It is not a route-level mobile artboard and it was NOT traced. The behaviour
|
|
14
|
+
* below is a decided, documented contract — see the Overview page.
|
|
15
|
+
*
|
|
16
|
+
* At <=30rem the `account-recovery` preset switches its page gutter to
|
|
17
|
+
* `--auth-shell-recovery-main-padding-mobile` (15px inline), so the panel is x=15, width=360 — the
|
|
18
|
+
* SAME page rhythm as the canonical Login flow, so moving from Login to Recovery on a phone never
|
|
19
|
+
* makes the surface jump. The panel keeps its full 24px card inset, giving a 310px content column;
|
|
20
|
+
* the 6-slot OTP row (6 x 36px = 216px) fits that column at every supported width with no scroll,
|
|
21
|
+
* no shrunken slots and no horizontal overflow.
|
|
22
|
+
*/
|
|
23
|
+
export default function Demo() {
|
|
24
|
+
const [code, setCode] = useState("");
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<AuthShell
|
|
28
|
+
variant="canonical"
|
|
29
|
+
preset="account-recovery"
|
|
30
|
+
brand={
|
|
31
|
+
<Flex align="center" gap="sm">
|
|
32
|
+
<Logo mark="godx" tone="success" />
|
|
33
|
+
<Text weight="medium">GoDX ID</Text>
|
|
34
|
+
</Flex>
|
|
35
|
+
}
|
|
36
|
+
footer={
|
|
37
|
+
<AuthFooter
|
|
38
|
+
product="GoDX ID"
|
|
39
|
+
terms="利用規約"
|
|
40
|
+
privacy="プライバシー"
|
|
41
|
+
locale={<AppSettingPicker kind="locale" appearance="labeled" compact />}
|
|
42
|
+
/>
|
|
43
|
+
}
|
|
44
|
+
>
|
|
45
|
+
<Reveal>
|
|
46
|
+
<Card>
|
|
47
|
+
<CardHeader>
|
|
48
|
+
<CardTitle level={1}>二段階認証</CardTitle>
|
|
49
|
+
<CardDescription>
|
|
50
|
+
認証アプリに表示されている 6 桁のコードを入力してください。
|
|
51
|
+
</CardDescription>
|
|
52
|
+
</CardHeader>
|
|
53
|
+
<CardContent>
|
|
54
|
+
<AuthStack>
|
|
55
|
+
<FormField id="mfa-code-mobile" label="確認コード" required>
|
|
56
|
+
<InputOTP maxLength={6} pattern="^[0-9]+$" value={code} onChange={setCode}>
|
|
57
|
+
<InputOTPGroup>
|
|
58
|
+
<InputOTPSlot index={0} />
|
|
59
|
+
<InputOTPSlot index={1} />
|
|
60
|
+
<InputOTPSlot index={2} />
|
|
61
|
+
<InputOTPSlot index={3} />
|
|
62
|
+
<InputOTPSlot index={4} />
|
|
63
|
+
<InputOTPSlot index={5} />
|
|
64
|
+
</InputOTPGroup>
|
|
65
|
+
</InputOTP>
|
|
66
|
+
</FormField>
|
|
67
|
+
<Button fullWidth>確認する</Button>
|
|
68
|
+
<Flex justify="between" gap="sm" wrap>
|
|
69
|
+
<Button variant="ghost" size="sm">
|
|
70
|
+
リカバリコードを使う
|
|
71
|
+
</Button>
|
|
72
|
+
<Button variant="ghost" size="sm">
|
|
73
|
+
パスキーで再試行
|
|
74
|
+
</Button>
|
|
75
|
+
</Flex>
|
|
76
|
+
</AuthStack>
|
|
77
|
+
</CardContent>
|
|
78
|
+
</Card>
|
|
79
|
+
</Reveal>
|
|
80
|
+
</AuthShell>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
--- title: Password recovery (4 states) viewport: 1440x1700 ---
|
|
2
|
+
|
|
3
|
+
## request · sent · new-password · expired
|
|
4
|
+
|
|
5
|
+
One anatomy, four states. Nothing below the `Card` changes shape — only the **notice**, the **fields** and the copy:
|
|
6
|
+
|
|
7
|
+
| State | Notice | Fields | Primary | Fallback row |
|
|
8
|
+
| -------------- | -------------------------- | -------------------------------------------------- | ------------------------------------- | ------------------------------------- |
|
|
9
|
+
| `request` | — | email (`autoComplete="username"`) | send reset link | back to sign-in · contact support |
|
|
10
|
+
| `sent` | `Alert tone="success"` | — | resend (**disabled** during cooldown) | back to sign-in · use another address |
|
|
11
|
+
| `new-password` | — | new + confirm `PasswordInput` + `PasswordStrength` | update password | back to sign-in |
|
|
12
|
+
| `expired` | `Alert tone="destructive"` | — | request a new link | back to sign-in · contact support |
|
|
13
|
+
|
|
14
|
+
## What is presentation and what is not
|
|
15
|
+
|
|
16
|
+
The panel renders **only** what the consumer passes it. It does **not** know reset semantics: no route, no token lifetime, no "is this link still valid" decision, no password policy. The `sent` panel prints the masked address the **server** sent (`h*****@example.co.jp`) — the library never reconstructs an identifier from an email.
|
|
17
|
+
|
|
18
|
+
## Error, loading and disabled
|
|
19
|
+
|
|
20
|
+
- **Error** — `FormField error` puts `aria-invalid` + `aria-errormessage` on the control and renders the message with `role="alert"`. The confirm field above shows the canonical mismatch case. - **Disabled** — a resend cooldown is `<Button disabled>`. Never a hidden button: the affordance stays visible so the user knows resending is possible, just not yet. - **Loading** — `<Button loading loadingText="…">` (demonstrated in the MFA example).
|
|
21
|
+
|
|
22
|
+
## Heading level
|
|
23
|
+
|
|
24
|
+
A real route renders **one** panel and its `CardTitle` is the page `h1`. The four panels are stacked here at `level={2}` under a caption line purely so the states can be compared at an identical measure — do not copy `level={2}` into a route that has no other heading.
|