@godxjp/ui 19.1.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/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/command-palette.d.ts +8 -22
- package/dist/components/data-entry/date-picker.d.ts +4 -5
- package/dist/components/data-entry/date-picker.js +6 -1
- package/dist/components/data-entry/date-range-picker.d.ts +1 -1
- package/dist/components/data-entry/date-range-picker.js +8 -3
- package/dist/components/data-entry/form-errors.d.ts +7 -18
- package/dist/components/data-entry/form-field.js +1 -5
- package/dist/components/data-entry/form.d.ts +1 -9
- package/dist/components/data-entry/input.d.ts +16 -14
- package/dist/components/data-entry/input.js +3 -0
- package/dist/components/data-entry/month-picker.js +2 -2
- package/dist/components/data-entry/month-range-picker.d.ts +4 -6
- package/dist/components/data-entry/month-range-picker.js +2 -2
- package/dist/components/data-entry/number-input.d.ts +1 -5
- package/dist/components/data-entry/number-input.js +1 -0
- package/dist/components/data-entry/radio.js +0 -1
- package/dist/components/data-entry/search-select.d.ts +2 -4
- package/dist/components/data-entry/select.d.ts +11 -6
- package/dist/components/data-entry/select.js +4 -2
- package/dist/components/data-entry/switch.js +0 -1
- package/dist/components/data-entry/textarea.d.ts +10 -16
- package/dist/components/data-entry/time-picker.d.ts +3 -5
- package/dist/components/data-entry/upload-types.d.ts +1 -5
- package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
- package/dist/components/feedback/dialog.d.ts +6 -15
- package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
- package/dist/components/feedback/sheet.d.ts +3 -10
- package/dist/components/feedback/sheet.js +1 -1
- package/dist/components/feedback/sonner.js +2 -3
- package/dist/components/general/activity.d.ts +4 -30
- package/dist/components/general/button.js +1 -10
- package/dist/components/general/logo.d.ts +6 -28
- package/dist/components/general/reveal.d.ts +3 -9
- package/dist/components/general/typography.d.ts +1 -3
- package/dist/components/layout/account-chip.d.ts +8 -0
- package/dist/components/layout/account-chip.js +45 -0
- package/dist/components/layout/auth-divider.d.ts +2 -9
- package/dist/components/layout/auth-shell.d.ts +1 -14
- package/dist/components/layout/breadcrumb.d.ts +1 -5
- package/dist/components/layout/centered-shell.d.ts +4 -18
- package/dist/components/layout/error-surface.d.ts +11 -28
- package/dist/components/layout/error-surface.js +4 -1
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/components/layout/legal-document-shell.d.ts +5 -28
- package/dist/components/layout/master-detail.d.ts +2 -18
- package/dist/components/layout/page-container.js +0 -1
- package/dist/components/layout/responsive-grid.d.ts +6 -1
- package/dist/components/layout/responsive-grid.js +9 -2
- package/dist/components/layout/service-role-panel.d.ts +7 -19
- package/dist/components/layout/sidebar.d.ts +5 -27
- package/dist/components/layout/sidebar.js +0 -1
- package/dist/components/layout/split-pane.d.ts +0 -7
- package/dist/components/layout/topbar.d.ts +1 -14
- package/dist/components/navigation/app-setting-picker.js +1 -3
- package/dist/components/navigation/filter-bar.d.ts +1 -6
- package/dist/components/navigation/pagination-utils.d.ts +2 -12
- package/dist/components/navigation/tabs-scroll.d.ts +2 -36
- package/dist/components/navigation/tabs.js +4 -8
- package/dist/components/query/data-state.d.ts +2 -2
- package/dist/components/ui/credential-reveal.d.ts +1 -4
- package/dist/components/ui/hover-card.d.ts +1 -2
- package/dist/components/ui/separator.d.ts +2 -15
- package/dist/components/ui/toggle-group.d.ts +1 -5
- package/dist/components/ui/toggle.d.ts +6 -31
- package/dist/email/brand-mark.d.ts +6 -34
- package/dist/email/color.d.ts +7 -17
- package/dist/email/geometry.d.ts +4 -8
- package/dist/email/index.d.ts +4 -48
- package/dist/email/inline-style.d.ts +3 -9
- package/dist/email/urgency.d.ts +2 -7
- package/dist/form/form-context.d.ts +2 -5
- package/dist/form/form-root.d.ts +1 -2
- package/dist/i18n/messages/en.json +4 -0
- package/dist/i18n/messages/ja.json +4 -0
- package/dist/i18n/messages/vi.json +4 -0
- package/dist/inertia/index.d.ts +2 -10
- package/dist/lib/control-styles.d.ts +10 -21
- package/dist/lib/control-styles.js +4 -6
- package/dist/lib/datetime/format-date.d.ts +1 -4
- package/dist/lib/field-a11y.d.ts +11 -68
- package/dist/lib/field-a11y.js +0 -1
- package/dist/lib/format.d.ts +4 -8
- package/dist/lib/hooks.d.ts +6 -12
- package/dist/lib/permission-grid.d.ts +3 -18
- package/dist/lib/query-error.d.ts +3 -3
- package/dist/props/components/app.prop.d.ts +15 -38
- package/dist/props/components/charts.prop.d.ts +2 -3
- package/dist/props/components/data-display.prop.d.ts +48 -72
- package/dist/props/components/data-entry.prop.d.ts +35 -40
- package/dist/props/components/form.prop.d.ts +2 -6
- package/dist/props/components/general.prop.d.ts +11 -27
- package/dist/props/components/layout.prop.d.ts +89 -260
- package/dist/props/components/navigation.prop.d.ts +27 -42
- package/dist/props/registry.d.ts +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 +9 -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
|
@@ -2,10 +2,8 @@ import * as React from "react";
|
|
|
2
2
|
import type { TimePickerProp } from "../../props/components/data-entry.prop.js";
|
|
3
3
|
export type { TimePickerProp, TimePickerProp as TimePickerProps, } from "../../props/components/data-entry.prop.js";
|
|
4
4
|
/**
|
|
5
|
-
* TimePicker — WAI-ARIA time combobox. The value lives on a real, typeable `HH:mm` `<input>`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* The column display honours the active `timeFormat` (12h shows 1-12 + AM/PM) while the canonical
|
|
9
|
-
* value remains 24h `HH:mm`.
|
|
5
|
+
* TimePicker — WAI-ARIA time combobox. The value lives on a real, typeable `HH:mm` `<input>` (24h
|
|
6
|
+
* canonical): form-submittable (give it a `name`), screen-reader friendly, and e2e-testable by
|
|
7
|
+
* filling the input.
|
|
10
8
|
*/
|
|
11
9
|
export declare function TimePicker({ value: controlledValue, defaultValue, onValueChange, placeholder, disabled, className, id, name, minuteStep, allowClear, ...ariaProps }: TimePickerProp): React.JSX.Element;
|
|
@@ -14,16 +14,12 @@ export type UploadFileItem = {
|
|
|
14
14
|
error?: string;
|
|
15
15
|
/** Local file before / during upload */
|
|
16
16
|
file?: File;
|
|
17
|
-
/**
|
|
18
|
-
* Draft-only: marked for soft-delete on form commit.
|
|
19
|
-
* Undo clears this before save — media-service has no restore API.
|
|
20
|
-
*/
|
|
17
|
+
/** Undo clears this before save — media-service has no restore API. */
|
|
21
18
|
pendingDelete?: boolean;
|
|
22
19
|
/**
|
|
23
20
|
* Draft-only: replacement staged locally; baseline kept for undo.
|
|
24
21
|
*/
|
|
25
22
|
pendingReplace?: boolean;
|
|
26
|
-
/** mediaId to soft-delete on commit when `pendingReplace` */
|
|
27
23
|
replacesMediaId?: string;
|
|
28
24
|
};
|
|
29
25
|
export type UploadVariant = "dropzone" | "button" | "picture-card" | "picture" | "avatar" | "avatar-crop";
|
|
@@ -11,10 +11,6 @@ export type UseUploadDraftOptions = {
|
|
|
11
11
|
value?: UploadFileItem | null;
|
|
12
12
|
onChange?: (item: UploadFileItem | null) => void;
|
|
13
13
|
};
|
|
14
|
-
/**
|
|
15
|
-
* Single-value draft for avatar / picture — coordinates with media-service:
|
|
16
|
-
* soft-delete only on form commit; undo before save (no restore API).
|
|
17
|
-
*/
|
|
18
14
|
export declare function useUploadDraft({ value, onChange }: UseUploadDraftOptions): {
|
|
19
15
|
state: UploadDraftState;
|
|
20
16
|
markRemove: () => void;
|
|
@@ -37,15 +37,10 @@ declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.
|
|
|
37
37
|
declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
38
38
|
type AlertDialogRootProps = React.ComponentProps<typeof AlertDialogPrimitive.Root> & {};
|
|
39
39
|
/**
|
|
40
|
-
* Compound alert-dialog Root — the `role="alertdialog"` mirror of {@link DialogRoot}.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* content. It supplies the Radix AlertDialog context that `AlertDialogTitle`,
|
|
45
|
-
* `AlertDialogDescription`, `AlertDialogAction` and `AlertDialogCancel` read, so the compound
|
|
46
|
-
* parts are assemblable from the public API alone (no direct `@radix-ui/react-alert-dialog`
|
|
47
|
-
* import). Focus trap, focus restoration and the modal `role="alertdialog"` semantics stay
|
|
48
|
-
* Radix-owned.
|
|
40
|
+
* Compound alert-dialog Root — the `role="alertdialog"` mirror of {@link DialogRoot}. It supplies
|
|
41
|
+
* the Radix AlertDialog context that `AlertDialogTitle`, `AlertDialogDescription`,
|
|
42
|
+
* `AlertDialogAction` and `AlertDialogCancel` read, so the compound parts are assemblable from the
|
|
43
|
+
* public API alone (no direct `@radix-ui/react-alert-dialog` import).
|
|
49
44
|
*/
|
|
50
45
|
declare function AlertDialogRoot(props: AlertDialogRootProps): React.JSX.Element;
|
|
51
46
|
declare const AlertDialogTrigger: React.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -72,12 +67,8 @@ declare const DialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrim
|
|
|
72
67
|
declare const AlertDialogAction: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
73
68
|
declare const AlertDialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
74
69
|
/**
|
|
75
|
-
* Preset: confirm / destructive / typed-challenge / step-up without compound markup.
|
|
76
|
-
*
|
|
77
|
-
* High-stakes deletion recipe ("DangerConfirm", godxui#193): pass `challenge` (or `confirmPhrase`)
|
|
78
|
-
* to gate the confirm button behind an exact typed match (org slug / resource name), and `stepUp`
|
|
79
|
-
* for an async re-auth gate (passkey / 2FA) that must resolve truthy before `onConfirm` fires.
|
|
80
|
-
* Both flows force the destructive tone (button + soft header band).
|
|
70
|
+
* Preset: confirm / destructive / typed-challenge / step-up without compound markup. Both flows
|
|
71
|
+
* force the destructive tone (button + soft header band).
|
|
81
72
|
*/
|
|
82
73
|
declare function AlertDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, variant, confirmPhrase, challenge, onConfirm, stepUp, keepOpenOnConfirm, pending, }: AlertDialogProp): React.JSX.Element;
|
|
83
74
|
export declare const Dialog: typeof DialogRoot & {
|
|
@@ -2,6 +2,6 @@ import type { ToneProp } from "../../props/vocabulary/index.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Soft semantic background band for an overlay header (Sheet / Dialog / Drawer), Ant-Design style.
|
|
4
4
|
* Tints ONLY the background — text stays `--foreground` (渋み: never invert the band into a loud
|
|
5
|
-
* solid fill).
|
|
5
|
+
* solid fill).
|
|
6
6
|
*/
|
|
7
7
|
export declare const overlayHeaderToneClass: Record<ToneProp, string>;
|
|
@@ -10,9 +10,6 @@ export type SheetPresentation = "side" | "bottom";
|
|
|
10
10
|
* The canonical responsive-overlay decision, shared by `SheetContent` and by any composite that
|
|
11
11
|
* swaps a desktop surface for a mobile sheet (see `OrgSwitcher`). Returns `"bottom"` when the
|
|
12
12
|
* viewport is at or below `--sheet-responsive-breakpoint-width`.
|
|
13
|
-
*
|
|
14
|
-
* Public so a consumer NEVER hand-rolls `useMediaQuery("(max-width: 390px)")` in app code — the
|
|
15
|
-
* breakpoint stays one themeable knob for the whole system.
|
|
16
13
|
*/
|
|
17
14
|
export declare function useSheetResponsiveMode(responsive?: SheetResponsiveProp): SheetPresentation;
|
|
18
15
|
export declare function Sheet(props: React.ComponentProps<typeof DialogPrimitive.Root>): React.JSX.Element;
|
|
@@ -28,17 +25,13 @@ export interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof
|
|
|
28
25
|
/** Optional semantic class for the owned backdrop (for a shell-specific overlay token). */
|
|
29
26
|
overlayClassName?: string;
|
|
30
27
|
/**
|
|
31
|
-
* Desired panel size for side left/right (Ant Drawer `width`).
|
|
32
|
-
*
|
|
33
|
-
* to keep the canonical drawer default from `--sheet-width-default`.
|
|
28
|
+
* Desired panel size for side left/right (Ant Drawer `width`). Omit to keep the canonical drawer
|
|
29
|
+
* default from `--sheet-width-default`.
|
|
34
30
|
*/
|
|
35
31
|
width?: WidthProp;
|
|
36
32
|
/**
|
|
37
33
|
* Responsive drawer / detail-panel contract. `"side"` (default) keeps today's behaviour: the
|
|
38
|
-
* physical `side` the consumer named, at every viewport.
|
|
39
|
-
* above `--sheet-responsive-breakpoint-width` and the mobile bottom sheet at/below it (capped by
|
|
40
|
-
* `--sheet-bottom-max-height`), so ONE `<Sheet>` covers both without a page-local media query.
|
|
41
|
-
* `"bottom"` pins the bottom-sheet presentation.
|
|
34
|
+
* physical `side` the consumer named, at every viewport.
|
|
42
35
|
*/
|
|
43
36
|
responsive?: SheetResponsiveProp;
|
|
44
37
|
}
|
|
@@ -173,7 +173,7 @@ const SheetHeader = ({
|
|
|
173
173
|
);
|
|
174
174
|
};
|
|
175
175
|
const SheetBody = ({ className, ...props }) => (
|
|
176
|
-
//
|
|
176
|
+
// Full-bleed horizontally
|
|
177
177
|
// (`-mx-6 px-6`) so content aligns to the sheet edge while the 3px focus ring of a full-width
|
|
178
178
|
// control keeps 24px of room and never clips against the scroll container's computed
|
|
179
179
|
// `overflow-x`. `py-1`/`scroll-py-1` keep a focused control's ring visible at the scroll edges.
|
|
@@ -43,10 +43,9 @@ function Toaster({ style, ...props }) {
|
|
|
43
43
|
"--normal-text": "hsl(var(--popover-foreground))",
|
|
44
44
|
"--normal-border": "hsl(var(--border))",
|
|
45
45
|
"--border-radius": "var(--radius)",
|
|
46
|
-
// MERGED, never spread over.
|
|
47
|
-
// this object, so a consumer passing ANY style (a z-index, a width) replaced the whole
|
|
46
|
+
// MERGED, never spread over.
|
|
48
47
|
// object and wiped all four vars — and an unset `--normal-bg` renders the toast
|
|
49
|
-
// transparent.
|
|
48
|
+
// transparent.
|
|
50
49
|
// var by name.
|
|
51
50
|
...style
|
|
52
51
|
},
|
|
@@ -2,36 +2,10 @@ import * as React from "react";
|
|
|
2
2
|
import type { SizeProp } from "../../props/vocabulary/index.js";
|
|
3
3
|
export type { ActivityProp, ActivityProp as ActivityProps, } from "../../props/components/general.prop.js";
|
|
4
4
|
/**
|
|
5
|
-
* Activity — the official AMBIENT-motion primitive: a continuous, unbounded "something is
|
|
6
|
-
* right now, elsewhere".
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `--activity-stagger-step`, `--activity-mark-offset`, `--activity-color`, …), so a service retunes
|
|
10
|
-
* the whole ambient feel from its theme.
|
|
11
|
-
*
|
|
12
|
-
* NOT `Skeleton` (content is LOADING — it hard-codes `aria-busy` + an unconditional live region, so
|
|
13
|
-
* reusing it for a typing indicator tells every screen reader the region is busy for as long as
|
|
14
|
-
* anyone is typing). NOT `Button loading` (THIS ACTION is in flight, on a control).
|
|
15
|
-
* `Activity` means: someone is typing, a sync is running, a response is streaming, a recording is
|
|
16
|
-
* live — indefinitely, and not here.
|
|
17
|
-
*
|
|
18
|
-
* ACCESSIBILITY — the half consumers get wrong, owned here:
|
|
19
|
-
* - The mark is decorative and always `aria-hidden`; the `label` (or `children`) carries the
|
|
20
|
-
* meaning, so the indicator is never animation-only.
|
|
21
|
-
* - `announce` defaults to `false` and then emits NO live region at all. An ambient indicator
|
|
22
|
-
* flickers on and off with every socket event; a live region there re-announces continuously.
|
|
23
|
-
* `announce="polite"` wraps ONLY the label in one `aria-live="polite" aria-atomic="true"` region.
|
|
24
|
-
* - No `aria-busy`: activity elsewhere does not make THIS region busy, and `aria-busy` would
|
|
25
|
-
* suppress the surrounding content's own updates.
|
|
26
|
-
* - Not focusable, not a tab stop, no pointer affordance — it is a status mark, not a control.
|
|
27
|
-
* - Under `prefers-reduced-motion: reduce` the loop is dropped and every mark falls back to a
|
|
28
|
-
* DESIGNED resting state (three solid dots / a solid pulse mark / a bar segment parked at the
|
|
29
|
-
* reading-start), never to nothing, with no layout shift (WCAG 2.2 SC 2.3.3 and SC 2.2.2).
|
|
30
|
-
*
|
|
31
|
-
* Copy is consumer-owned and localized — pass a `t()`-translated `label`, and derive
|
|
32
|
-
* "N people are typing" from `Intl.PluralRules`. The library never invents the string.
|
|
33
|
-
*
|
|
34
|
-
* Pure/server-safe: no hooks, no effects, no timers — the loop is CSS.
|
|
5
|
+
* Activity — the official AMBIENT-motion primitive: a continuous, unbounded "something is
|
|
6
|
+
* happening right now, elsewhere". Every interval, stagger, offset, size and colour reads a DS
|
|
7
|
+
* token (`--activity-interval`, `--activity-stagger-step`, `--activity-mark-offset`,
|
|
8
|
+
* `--activity-color`, …), so a service retunes the whole ambient feel from its theme.
|
|
35
9
|
*/
|
|
36
10
|
export declare const Activity: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLSpanElement>, "color"> & {
|
|
37
11
|
variant?: import("../../props/index.js").ActivityVariantProp;
|
|
@@ -20,7 +20,6 @@ const buttonVariants = cva("ui-button", {
|
|
|
20
20
|
size: {
|
|
21
21
|
default: "ui-button--default-size",
|
|
22
22
|
md: "ui-button--default-size",
|
|
23
|
-
// The glyph rules stay UTILITIES, not a components-layer rule: Tailwind v4 orders
|
|
24
23
|
// utilities after components, so only a utility can out-rank a child's own `size-*`.
|
|
25
24
|
// They read the token, so the value is still themeable.
|
|
26
25
|
xs: "ui-button--xs [&_svg:not([class*='size-'])]:size-[var(--button-xs-icon-size)]",
|
|
@@ -32,7 +31,6 @@ const buttonVariants = cva("ui-button", {
|
|
|
32
31
|
"icon-lg": "ui-button--icon-lg"
|
|
33
32
|
},
|
|
34
33
|
// Single source of corner radius (deterministic — no competing rounded-* utility): default uses
|
|
35
|
-
// the dedicated --button-radius token (themeable independently of --control-radius, issue #124),
|
|
36
34
|
// pill is fully rounded, sharp is square.
|
|
37
35
|
shape: {
|
|
38
36
|
default: "rounded-[var(--button-radius)]",
|
|
@@ -69,14 +67,7 @@ const Button = React.forwardRef(
|
|
|
69
67
|
] }) : children;
|
|
70
68
|
const showCount = !asChild && count != null && (count !== 0 || showZero);
|
|
71
69
|
const countLabel = showCount && count != null && count > overflowCount ? `${new Intl.NumberFormat(locale).format(overflowCount)}+` : count != null ? new Intl.NumberFormat(locale).format(count) : "";
|
|
72
|
-
const countNode = showCount ? /* @__PURE__ */ jsx(
|
|
73
|
-
"span",
|
|
74
|
-
{
|
|
75
|
-
"data-slot": "button-count",
|
|
76
|
-
className: "ui-button-count",
|
|
77
|
-
children: countLabel
|
|
78
|
-
}
|
|
79
|
-
) : null;
|
|
70
|
+
const countNode = showCount ? /* @__PURE__ */ jsx("span", { "data-slot": "button-count", className: "ui-button-count", children: countLabel }) : null;
|
|
80
71
|
return /* @__PURE__ */ jsx(
|
|
81
72
|
Comp,
|
|
82
73
|
{
|
|
@@ -17,51 +17,29 @@ export interface LogoProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "
|
|
|
17
17
|
* Box size tier (tokenised), applied to EVERY mark. The boxed glyph reads `--logo-size-*`
|
|
18
18
|
* (default `md` = 1.75rem); `mark="godx"` reads its own `--logo-godx-size-*` scale (default `md`
|
|
19
19
|
* = 2rem — the identity artwork is a capsule in a square viewBox and needs slightly more box to
|
|
20
|
-
* read at the same optical weight).
|
|
21
|
-
* wordmark together. A theme pins the identity box at every tier with `--logo-godx-size`.
|
|
20
|
+
* read at the same optical weight).
|
|
22
21
|
*/
|
|
23
22
|
size?: LogoSize;
|
|
24
23
|
/**
|
|
25
24
|
* Semantic fill role. `"success"` provides the canonical green identity mark without changing
|
|
26
|
-
* the application's primary action colour.
|
|
25
|
+
* the application's primary action colour.
|
|
27
26
|
*/
|
|
28
27
|
tone?: LogoTone;
|
|
29
28
|
/**
|
|
30
29
|
* Readable product name rendered BESIDE the mark as one lockup. Pass the localized product name
|
|
31
|
-
* (a string, or a node when the name needs its own markup).
|
|
32
|
-
* `mark + wordmark` in a single inline-flex lockup: the mark becomes decorative and the wordmark
|
|
33
|
-
* carries the accessible name, so the pair is announced once. The wordmark reads
|
|
34
|
-
* `--logo-wordmark-*` tokens — its colour defaults to the identity role for the GoDX/`success`
|
|
35
|
-
* lockup and NEVER to `--primary`, so a re-themed action colour cannot recolour the brand.
|
|
36
|
-
* Omit for the bare mark (today's behaviour, unchanged).
|
|
37
|
-
*
|
|
38
|
-
* NOTE: the library ships no wordmark ARTWORK — the wordmark is set in the design-system
|
|
39
|
-
* typeface (`--logo-wordmark-font-family`, default `--font-family-display`). Pass an inline
|
|
40
|
-
* `<svg>` here when a real logotype asset exists.
|
|
30
|
+
* (a string, or a node when the name needs its own markup).
|
|
41
31
|
*/
|
|
42
32
|
wordmark?: React.ReactNode;
|
|
43
33
|
/**
|
|
44
34
|
* Accessible name for the mark. When set, the logo is exposed to assistive tech as an image with
|
|
45
35
|
* this name; when omitted the mark is decorative (`aria-hidden`) — the correct default when a
|
|
46
|
-
* readable wordmark sits beside it.
|
|
47
|
-
* accessible name (the wordmark text is otherwise the name).
|
|
36
|
+
* readable wordmark sits beside it.
|
|
48
37
|
*/
|
|
49
38
|
label?: string;
|
|
50
39
|
}
|
|
51
40
|
/**
|
|
52
41
|
* Logo — the product brand-mark box: a glyph on the primary fill, or (with `wordmark`) the full
|
|
53
|
-
* mark + wordmark LOCKUP.
|
|
54
|
-
*
|
|
55
|
-
* that repeats literal size/radius and puts type utilities on a bare span (rules #45/#46). Size,
|
|
56
|
-
* radius, per-tier font-size, the wordmark's face/weight/tracking/colour and the mark↔wordmark gap
|
|
57
|
-
* are all tokens.
|
|
58
|
-
*
|
|
59
|
-
* COLOUR: the boxed glyph fill reads the primary role, so a re-themed `--primary` re-tints it.
|
|
60
|
-
* `mark="godx"` / `tone="success"` instead read the IDENTITY tokens (`--logo-godx-color`,
|
|
61
|
-
* `--logo-success-*`, `--logo-wordmark-color`), which never reference `--primary` — the canonical
|
|
62
|
-
* brand-green GoDX lockup therefore survives any action-colour re-theme with zero consumer CSS.
|
|
63
|
-
*
|
|
64
|
-
* A11Y: with a `wordmark`, the mark is decorative and the wordmark text carries the accessible
|
|
65
|
-
* name (announced once). Without one, set `label` when the mark stands alone.
|
|
42
|
+
* mark + wordmark LOCKUP. Size, radius, per-tier font-size, the wordmark's
|
|
43
|
+
* face/weight/tracking/colour and the mark↔wordmark gap are all tokens.
|
|
66
44
|
*/
|
|
67
45
|
export declare const Logo: React.ForwardRefExoticComponent<LogoProps & React.RefAttributes<HTMLSpanElement>>;
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import type { RevealProp } from "../../props/components/general.prop.js";
|
|
2
2
|
export type { RevealProp, RevealProp as RevealProps } from "../../props/components/general.prop.js";
|
|
3
3
|
/**
|
|
4
|
-
* Reveal — the official entrance-motion primitive (staggered fade-up).
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* (`0..6`) — an index into the `--reveal-stagger-step` ladder, never a raw ms — so a column of rows
|
|
8
|
-
* cascades in. Under `prefers-reduced-motion` the animation is dropped entirely: content renders in
|
|
9
|
-
* its final position, fully visible, with no layout shift (CSS `@media` guard in motion.css).
|
|
10
|
-
*
|
|
11
|
-
* Pure/server-safe: no hooks, no effects. Pass `asChild` to merge the reveal onto the single child
|
|
12
|
-
* element (no wrapper `<div>`) when an extra box would break a grid/flex layout.
|
|
4
|
+
* Reveal — the official entrance-motion primitive (staggered fade-up). `delay` is a stagger
|
|
5
|
+
* ordinal (`0..6`) — an index into the `--reveal-stagger-step` ladder, never a raw ms — so a
|
|
6
|
+
* column of rows cascades in.
|
|
13
7
|
*/
|
|
14
8
|
export declare function Reveal({ children, delay, asChild, className, ...props }: RevealProp): import("react").JSX.Element;
|
|
@@ -2,9 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
export type { TextProp, TextProp as TextProps, HeadingProp, HeadingProp as HeadingProps, } from "../../props/components/general.prop.js";
|
|
3
3
|
/**
|
|
4
4
|
* Text — the typographic primitive. Use it INSTEAD of a hand-rolled `<span className="text-[13px]
|
|
5
|
-
* font-medium text-muted-foreground">`.
|
|
6
|
-
* (never an arbitrary px), `tone` maps to semantic foreground tokens, `weight` respects the system's
|
|
7
|
-
* 2-weight scale. Fully token-driven via `[data-slot="text"]` rules in text-layout.css.
|
|
5
|
+
* font-medium text-muted-foreground">`.
|
|
8
6
|
*/
|
|
9
7
|
export declare const Text: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "color"> & {
|
|
10
8
|
as?: "span" | "p" | "div" | "label" | "strong" | "em" | "small" | "code" | "kbd" | "dt" | "dd" | "caption" | "abbr";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { AccountChipProp } from "../../props/components/layout.prop.js";
|
|
3
|
+
export type { AccountChipProp, AccountChipProp as AccountChipProps, } from "../../props/components/layout.prop.js";
|
|
4
|
+
/**
|
|
5
|
+
* Signed-in user for a PageContainer `extra` slot, a Topbar or a footer row: avatar, name and one
|
|
6
|
+
* ghost action, all at the control tier height, so it sits level with the buttons beside it.
|
|
7
|
+
*/
|
|
8
|
+
export declare const AccountChip: React.ForwardRefExoticComponent<AccountChipProp & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { LogOut } from "lucide-react";
|
|
5
|
+
import { cn } from "../../lib/utils.js";
|
|
6
|
+
import { Avatar, AvatarFallback, AvatarImage } from "../data-display/avatar.js";
|
|
7
|
+
import { Button } from "../general/button.js";
|
|
8
|
+
import { Text } from "../general/typography.js";
|
|
9
|
+
import { flexGapClass } from "../../lib/variants.js";
|
|
10
|
+
const AccountChip = React.forwardRef(
|
|
11
|
+
({ name, email, avatarSrc, avatarFallback, actionLabel, onAction, disabled, className }, ref) => /* @__PURE__ */ jsxs(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
ref,
|
|
15
|
+
"data-slot": "account-chip",
|
|
16
|
+
"data-direction": "row",
|
|
17
|
+
"data-align": "center",
|
|
18
|
+
className: cn("ui-flex", flexGapClass.xs, "ui-account-chip", className),
|
|
19
|
+
title: email,
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsxs(Avatar, { "aria-hidden": "true", children: [
|
|
22
|
+
avatarSrc ? /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: "" }) : null,
|
|
23
|
+
/* @__PURE__ */ jsx(AvatarFallback, { children: avatarFallback ?? name.slice(0, 1) })
|
|
24
|
+
] }),
|
|
25
|
+
/* @__PURE__ */ jsx(Text, { truncate: true, children: name }),
|
|
26
|
+
onAction ? /* @__PURE__ */ jsx(
|
|
27
|
+
Button,
|
|
28
|
+
{
|
|
29
|
+
variant: "ghost",
|
|
30
|
+
size: "icon",
|
|
31
|
+
disabled,
|
|
32
|
+
onClick: onAction,
|
|
33
|
+
"aria-label": typeof actionLabel === "string" ? actionLabel : void 0,
|
|
34
|
+
title: typeof actionLabel === "string" ? actionLabel : void 0,
|
|
35
|
+
children: /* @__PURE__ */ jsx(LogOut, { "aria-hidden": "true" })
|
|
36
|
+
}
|
|
37
|
+
) : null
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
);
|
|
42
|
+
AccountChip.displayName = "AccountChip";
|
|
43
|
+
export {
|
|
44
|
+
AccountChip
|
|
45
|
+
};
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import type { AuthDividerProp } from "../../props/components/layout.prop.js";
|
|
2
2
|
export type { AuthDividerProp, AuthDividerProp as AuthDividerProps, } from "../../props/components/layout.prop.js";
|
|
3
3
|
/**
|
|
4
|
-
* AuthDivider — a centred, localized conjunction between two equal separator rules.
|
|
5
|
-
*
|
|
6
|
-
* Since gh#308 this is a thin PRESET over `Separator label`, not a parallel implementation: the
|
|
7
|
-
* grid, the accessible-name contract and the rule geometry all live on the primitive, and
|
|
8
|
-
* `.ui-auth-divider` only re-points Separator's `--separator-*` knobs at the `--auth-shell-divider-*`
|
|
9
|
-
* layer. That keeps #263's canonical login geometry byte-for-byte identical while breaking the
|
|
10
|
-
* coupling the issue reported — a service retuning its login divider no longer retunes every day
|
|
11
|
-
* divider in its message streams, and vice versa. New code that wants a labelled rule outside an
|
|
12
|
-
* auth form should use `<Separator label>` directly.
|
|
4
|
+
* AuthDivider — a centred, localized conjunction between two equal separator rules. New code that
|
|
5
|
+
* wants a labelled rule outside an auth form should use `<Separator label>` directly.
|
|
13
6
|
*/
|
|
14
7
|
export declare function AuthDivider({ label, className }: AuthDividerProp): import("react").JSX.Element;
|
|
@@ -3,19 +3,6 @@ export type { AuthShellProp, AuthShellProp as AuthShellProps, } from "../../prop
|
|
|
3
3
|
/**
|
|
4
4
|
* AuthShell — centred auth/login page shell (login · mfa · passkey · device · reset). A top brand
|
|
5
5
|
* bar (banner), a centred `main` that holds the auth `Card`, and an optional footer (contentinfo),
|
|
6
|
-
* over a `min-h-dvh` surface.
|
|
7
|
-
* touch floor) and the auth heading is bumped up, so forms read at the right size — replacing a
|
|
8
|
-
* consumer's `.auth-shell-*` / `.ui-auth-scope` classes. Motion is delegated to `Reveal` (wrap the
|
|
9
|
-
* card) so `prefers-reduced-motion` is honoured in one place.
|
|
10
|
-
*
|
|
11
|
-
* `preset` names the flow MEASURE (card max-width + desktop/mobile page gutters) so a consumer
|
|
12
|
-
* never overrides page geometry by hand: `"login"` = SCR-001's stable identity/card/footer anchor
|
|
13
|
-
* for standalone and real requester states; `"registration"` = the 360px sign-up measure,
|
|
14
|
-
* start-aligned like login (a tall sign-up card must scroll, not clip its own top above the scroll
|
|
15
|
-
* origin) and the only one with its own footer clearance; `"device-authorization"` = 380px card
|
|
16
|
-
* with a 5px inline gutter at 390px; `"context-selection"` = 25rem card, edge-to-edge on mobile;
|
|
17
|
-
* `"account-recovery"` = the 432px SCR-008 panel measure shared by password recovery and the
|
|
18
|
-
* sign-in MFA challenge, with a 15px inline gutter at 390px. It is orthogonal to `variant` —
|
|
19
|
-
* combine `variant="canonical"` with any preset.
|
|
6
|
+
* over a `min-h-dvh` surface.
|
|
20
7
|
*/
|
|
21
8
|
export declare function AuthShell({ brand, footer, children, variant, preset, density, className, }: AuthShellProp): import("react").JSX.Element;
|
|
@@ -3,11 +3,7 @@ import type { BreadcrumbProp } from "../../props/vocabulary/navigation.prop.js";
|
|
|
3
3
|
export type BreadcrumbProps = {
|
|
4
4
|
items: BreadcrumbProp;
|
|
5
5
|
linkComponent?: ElementType;
|
|
6
|
-
/**
|
|
7
|
-
* Override the `<nav>` landmark's accessible name. Defaults to a localized "Breadcrumb".
|
|
8
|
-
* Multiple Breadcrumb instances on one page/view need a DISTINCT name each — two `<nav>`
|
|
9
|
-
* landmarks sharing one name/role fail axe's `landmark-unique` (WCAG 2.4.1 / 1.3.1).
|
|
10
|
-
*/
|
|
6
|
+
/** Override the `<nav>` landmark's accessible name. Defaults to a localized "Breadcrumb". */
|
|
11
7
|
ariaLabel?: string;
|
|
12
8
|
};
|
|
13
9
|
export declare function Breadcrumb({ items, linkComponent: LinkComponent, ariaLabel, }: BreadcrumbProps): import("react").JSX.Element;
|
|
@@ -3,23 +3,9 @@ export type { CenteredShellProp, CenteredShellProp as CenteredShellProps, } from
|
|
|
3
3
|
/**
|
|
4
4
|
* CenteredShell — authenticated, no-sidebar, centred-column page shell: the hosted-ID "My Page",
|
|
5
5
|
* account / self-service, and standalone-settings shape. It fills the gap between the two existing
|
|
6
|
-
* shells:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - `AuthShell` is the UNAUTHENTICATED root (login/mfa/reset); it centres a narrow ~24rem card
|
|
11
|
-
* VERTICALLY and has no top-right actions slot.
|
|
12
|
-
*
|
|
13
|
-
* CenteredShell gives a **padded top bar with real actions** (banner) reusing the SAME chrome as
|
|
14
|
-
* `.app-topbar` (padding-inline · border · backdrop) WITHOUT a sidebar, a scrollable `main` whose
|
|
15
|
-
* content is a **centred column** of a configurable medium width (`width` = sm|md|lg, all wider than
|
|
16
|
-
* the 24rem auth card) **top-aligned** so sections flow and scroll (not vertically centred), and an
|
|
17
|
-
* optional footer (contentinfo) — or, with `align="center"`, the column centred in the viewport for
|
|
18
|
-
* a SYSTEM-level standalone surface (a 500/503 error page, a maintenance notice), so that full-page
|
|
19
|
-
* geometry stays package-owned instead of a consumer re-implementing `min-h-dvh` + flex centring.
|
|
20
|
-
* A hosted account page thus needs ZERO custom CSS and never
|
|
21
|
-
* hand-rolls a bar (the bare `Topbar` primitive ships no padding — the `.ui-topbar` zero-inset
|
|
22
|
-
* footgun). Layout-only: delegate motion to `Reveal` (wrap a section) so `prefers-reduced-motion`
|
|
23
|
-
* is honoured in one place.
|
|
6
|
+
* shells: - `AppShell` REQUIRES a sidebar — its padded topbar chrome (`.app-topbar`) is a grid
|
|
7
|
+
* area beside the nav rail, so you cannot get a padded top bar without a rail. - `AuthShell` is
|
|
8
|
+
* the UNAUTHENTICATED root (login/mfa/reset); it centres a narrow ~24rem card VERTICALLY and has
|
|
9
|
+
* no top-right actions slot.
|
|
24
10
|
*/
|
|
25
11
|
export declare function CenteredShell({ topbar, footer, children, width, align, preset, className, }: CenteredShellProp): import("react").JSX.Element;
|
|
@@ -3,33 +3,16 @@ import type { ErrorSurfaceProp } from "../../props/components/layout.prop.js";
|
|
|
3
3
|
export type { ErrorSurfaceMaintenanceProp, ErrorSurfaceProp, ErrorSurfaceProp as ErrorSurfaceProps, } from "../../props/components/layout.prop.js";
|
|
4
4
|
export type { ErrorSurfaceModeProp, ErrorSurfaceStatusProp } from "../../props/vocabulary/index.js";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
* (
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* are PRESERVED — it never reconstructs navigation chrome, because nav data and the user menu are
|
|
18
|
-
* consumer-owned and a component cannot manufacture them. `system` (500/503) owns the page and
|
|
19
|
-
* renders `CenteredShell align="center"`, so the viewport-centred geometry at 1440 / 1024 / 390
|
|
20
|
-
* is package-owned and the consumer writes no `min-h-dvh`, no flex-centring class, no media query.
|
|
21
|
-
* - **Exactly one recovery action**, structurally (see `singleAction`).
|
|
22
|
-
* - **Semantic metadata slots** instead of free-form paragraphs: `requestId` (mono/tabular so a
|
|
23
|
-
* support id is read out accurately), `permission` and `organization` (which of the two a 403 is
|
|
24
|
-
* actually about), and `maintenance` (ISO-8601 + IANA formatted through `Intl.DateTimeFormat`,
|
|
25
|
-
* with an optional labelled `Progress` meter). Each is a `<dt>`/`<dd>` pair, so the label↔value
|
|
26
|
-
* relationship survives for a screen reader instead of being a colon in a sentence.
|
|
27
|
-
* - **Valid heading order by default** — `h2` under a `PageContainer` `h1` in `application` mode,
|
|
28
|
-
* `h1` on a `system` page — and the status code announced as "HTTP status 403", not "403".
|
|
29
|
-
*
|
|
30
|
-
* PRODUCT COPY stays consumer-owned: `title` / `description` / `action` come from the app's own
|
|
31
|
-
* `t()`. The surface localizes only its OWN metadata labels. It holds no state, runs no effect and
|
|
32
|
-
* opens no portal, so it renders fully server-side — an exception page must be readable before
|
|
33
|
-
* hydration.
|
|
6
|
+
* What the surface owns is the CONTRACT the composition kept losing: - **`mode` is the shell
|
|
7
|
+
* contract.** `application` (400/403/404) renders the surface as the BODY you place inside the
|
|
8
|
+
* `AppShell` the route already provides, so the sidebar, topbar and breadcrumb are PRESERVED — it
|
|
9
|
+
* never reconstructs navigation chrome, because nav data and the user menu are consumer-owned and
|
|
10
|
+
* a component cannot manufacture them. `system` (500/503) owns the page and renders `CenteredShell
|
|
11
|
+
* align="center"`, so the viewport-centred geometry at 1440 / 1024 / 390 is package-owned and the
|
|
12
|
+
* consumer writes no `min-h-dvh`, no flex-centring class, no media query. - **Exactly one recovery
|
|
13
|
+
* action**, structurally (see `singleAction`). - **Semantic metadata slots** instead of free-form
|
|
14
|
+
* paragraphs: `requestId` (mono/tabular so a support id is read out accurately), `permission` and
|
|
15
|
+
* `organization` (which of the two a 403 is actually about), and `maintenance` (ISO-8601 + IANA
|
|
16
|
+
* formatted through `Intl.DateTimeFormat`, with an optional labelled `Progress` meter).
|
|
34
17
|
*/
|
|
35
18
|
export declare const ErrorSurface: React.ForwardRefExoticComponent<ErrorSurfaceProp & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -15,6 +15,9 @@ const STATUS_META = {
|
|
|
15
15
|
500: { icon: ServerCrash, tone: "destructive" },
|
|
16
16
|
503: { icon: Wrench, tone: "warning" }
|
|
17
17
|
};
|
|
18
|
+
function statusMeta(status) {
|
|
19
|
+
return STATUS_META[status] ?? (status >= 500 && status < 600 ? { icon: ServerCrash, tone: "destructive" } : { icon: TriangleAlert, tone: "warning" });
|
|
20
|
+
}
|
|
18
21
|
function singleAction(action) {
|
|
19
22
|
const flattened = React.Children.toArray(action).flatMap(
|
|
20
23
|
(child) => React.isValidElement(child) && child.type === React.Fragment ? React.Children.toArray(child.props.children) : [child]
|
|
@@ -61,7 +64,7 @@ const ErrorSurface = React.forwardRef(
|
|
|
61
64
|
className
|
|
62
65
|
}, ref) {
|
|
63
66
|
const { t, locale } = useTranslation();
|
|
64
|
-
const meta =
|
|
67
|
+
const meta = statusMeta(status);
|
|
65
68
|
const resolvedIcon = icon ?? meta.icon;
|
|
66
69
|
const resolvedTone = tone ?? meta.tone;
|
|
67
70
|
const resolvedTitleLevel = titleLevel ?? (mode === "system" ? 1 : 2);
|
|
@@ -14,6 +14,8 @@ export { AuthDivider } from "./auth-divider.js";
|
|
|
14
14
|
export type { AuthDividerProp, AuthDividerProps } from "./auth-divider.js";
|
|
15
15
|
export { AuthIdentity } from "./auth-identity.js";
|
|
16
16
|
export type { AuthIdentityProp, AuthIdentityProps } from "./auth-identity.js";
|
|
17
|
+
export { AccountChip } from "./account-chip.js";
|
|
18
|
+
export type { AccountChipProp, AccountChipProps } from "./account-chip.js";
|
|
17
19
|
export { AuthAccountSummary } from "./auth-account-summary.js";
|
|
18
20
|
export type { AuthAccountSummaryProp, AuthAccountSummaryProps } from "./auth-account-summary.js";
|
|
19
21
|
export { AuthFooter } from "./auth-footer.js";
|
|
@@ -6,6 +6,7 @@ import { OrgSwitcher } from "./org-switcher.js";
|
|
|
6
6
|
import { AuthShell } from "./auth-shell.js";
|
|
7
7
|
import { AuthDivider } from "./auth-divider.js";
|
|
8
8
|
import { AuthIdentity } from "./auth-identity.js";
|
|
9
|
+
import { AccountChip } from "./account-chip.js";
|
|
9
10
|
import { AuthAccountSummary } from "./auth-account-summary.js";
|
|
10
11
|
import { AuthFooter } from "./auth-footer.js";
|
|
11
12
|
import { AuthStack } from "./auth-stack.js";
|
|
@@ -22,6 +23,7 @@ import { AspectRatio } from "./aspect-ratio.js";
|
|
|
22
23
|
import { LegalDocumentShell } from "./legal-document-shell.js";
|
|
23
24
|
import { ServiceRolePanel } from "./service-role-panel.js";
|
|
24
25
|
export {
|
|
26
|
+
AccountChip,
|
|
25
27
|
AppShell,
|
|
26
28
|
AspectRatio,
|
|
27
29
|
AuthAccountSummary,
|
|
@@ -2,33 +2,10 @@ import * as React from "react";
|
|
|
2
2
|
import type { LegalDocumentShellProp } from "../../props/components/layout.prop.js";
|
|
3
3
|
export type { LegalDocumentSectionProp, LegalDocumentShellProp, LegalDocumentShellProp as LegalDocumentShellProps, } from "../../props/components/layout.prop.js";
|
|
4
4
|
/**
|
|
5
|
-
* LegalDocumentShell — the long-form **legal / policy document** surface: terms of service,
|
|
6
|
-
* policy, DPA, cookie policy, SLA, EULA, security policy.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* - **scroll spy**: an `IntersectionObserver` marks the section at the reading line active, so the
|
|
12
|
-
* contents list tracks the reader (`aria-current="location"`, never colour-only);
|
|
13
|
-
* - **hash deep links**: `?#section-id` on load selects that section; activating a contents anchor
|
|
14
|
-
* rewrites the hash (`history.replaceState`, so the Back button is never hijacked);
|
|
15
|
-
* - **scroll offset**: `scroll-margin-block-start` from `--legal-document-scroll-offset`, so a jump
|
|
16
|
-
* lands below sticky chrome with no offset arithmetic;
|
|
17
|
-
* - **focus handoff**: the target `<section tabIndex={-1}>` takes focus (`preventScroll`), so a
|
|
18
|
-
* keyboard/screen-reader user actually arrives IN the section, with a visible ring;
|
|
19
|
-
* - **reduced motion**: the smooth scroll degrades to an instant jump under
|
|
20
|
-
* `prefers-reduced-motion: reduce`.
|
|
21
|
-
*
|
|
22
|
-
* Semantics: `<article>` labelled by the `<h1>` · a NAMED `<nav>` for the contents · REAL
|
|
23
|
-
* `<a href="#…">` anchors (middle-clickable, deep-linkable, work before JS boots) · one `<section>`
|
|
24
|
-
* per entry labelled by its `<h2>`.
|
|
25
|
-
*
|
|
26
|
-
* Layout: the shell owns its query container, so the one-column ⇄ two-column decision comes from
|
|
27
|
-
* its OWN width (the SplitPane precedent, gh#165). At ≥56rem the contents become a sticky rail
|
|
28
|
-
* beside a measure-capped column; below that (the 390×844 case) the shell is a single column and
|
|
29
|
-
* the contents are a static compact block between the header and the first section — never pinned,
|
|
30
|
-
* so a phone loses no vertical space.
|
|
31
|
-
*
|
|
32
|
-
* ALL legal text stays consumer-owned: the shell only receives `sections` and slots.
|
|
5
|
+
* LegalDocumentShell — the long-form **legal / policy document** surface: terms of service,
|
|
6
|
+
* privacy policy, DPA, cookie policy, SLA, EULA, security policy. Semantics: `<article>` labelled
|
|
7
|
+
* by the `<h1>` · a NAMED `<nav>` for the contents · REAL `<a href="#…">` anchors
|
|
8
|
+
* (middle-clickable, deep-linkable, work before JS boots) · one `<section>` per entry labelled by
|
|
9
|
+
* its `<h2>`.
|
|
33
10
|
*/
|
|
34
11
|
export declare const LegalDocumentShell: React.ForwardRefExoticComponent<LegalDocumentShellProp & React.RefAttributes<HTMLDivElement>>;
|