@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
|
@@ -1,101 +1,51 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
|
|
3
3
|
:root {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
--
|
|
7
|
-
--foreground: 48 8% 13%; /* #23221e SmartHR TEXT_BLACK */
|
|
4
|
+
|
|
5
|
+
--background: 60 33% 99%;
|
|
6
|
+
--foreground: 48 8% 13%;
|
|
8
7
|
--card: 60 33% 99%;
|
|
9
8
|
--card-foreground: 48 8% 13%;
|
|
10
9
|
--popover: 60 33% 99%;
|
|
11
10
|
--popover-foreground: 48 8% 13%;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* The published blue measures 4.62:1 as TEXT on --background — compliant,
|
|
15
|
-
* but with 0.12 of headroom, which every tint this system applies to a row
|
|
16
|
-
* then spends: the zebra stripe (muted/0.4) takes it to 4.46 and hover
|
|
17
|
-
* (muted/0.5) to 4.43. A link inside a striped table therefore failed AA
|
|
18
|
-
* while the same link on a card passed, which is not a defensible place to
|
|
19
|
-
* draw that line. 37% clears every one of those states with margin and is
|
|
20
|
-
* indistinguishable from the original side by side. */
|
|
21
|
-
--primary: 204 100% 37%; /* SmartHR MAIN #0071bd */
|
|
11
|
+
|
|
12
|
+
--primary: 204 100% 37%;
|
|
22
13
|
--primary-foreground: 60 33% 99%;
|
|
23
|
-
--secondary: 45 15% 95%;
|
|
14
|
+
--secondary: 45 15% 95%;
|
|
24
15
|
--secondary-foreground: 48 8% 13%;
|
|
25
16
|
--muted: 45 15% 95%;
|
|
26
|
-
--muted-foreground: 44 5% 42%;
|
|
27
|
-
--accent: 40 13% 91%;
|
|
17
|
+
--muted-foreground: 44 5% 42%;
|
|
18
|
+
--accent: 40 13% 91%;
|
|
28
19
|
--accent-foreground: 48 8% 13%;
|
|
29
|
-
--destructive: 357 64% 44%;
|
|
20
|
+
--destructive: 357 64% 44%;
|
|
30
21
|
--destructive-foreground: 60 33% 99%;
|
|
31
|
-
--border: 30 7% 83%;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
* The two roles answer different questions and are held to different bars:
|
|
35
|
-
* · --border is DECORATIVE chrome — table rules, card edges, section dividers. WCAG 2.2
|
|
36
|
-
* SC 1.4.11 does not reach it (nothing about a divider is "required to identify a
|
|
37
|
-
* component or its state"), and darkening it would make the JP-dense table grid roar.
|
|
38
|
-
* It stays exactly where it is.
|
|
39
|
-
* · --input is the boundary that IS the control — the 1px edge of Input, Textarea, Select,
|
|
40
|
-
* the outline Button, TagInput, the composite date field, the topbar search. `--input`
|
|
41
|
-
* also fills the Switch's unchecked track. A text field here has NO fill of its own
|
|
42
|
-
* (`background: hsl(var(--background))`) and NO shadow to speak of, so that edge is the
|
|
43
|
-
* only thing that says "you may type here". That is squarely SC 1.4.11's 3:1 minimum.
|
|
44
|
-
*
|
|
45
|
-
* They shipped sharing `30 7% 83%`, which measured 1.46:1 on --background/--card — the one
|
|
46
|
-
* live WCAG failure a full DXS Platform sweep turned up. 53% clears 3:1 with margin on every
|
|
47
|
-
* surface a control actually sits on, not just the plain page (the gh#299 lesson: a value that
|
|
48
|
-
* passes on a card and fails inside a filter bar is not a line anyone can defend):
|
|
49
|
-
* --background/--card/--popover 3.47:1 · --muted/--secondary 3.18:1 · zebra stripe 3.35:1 ·
|
|
50
|
-
* row hover 3.32:1. It also lifts the Switch's unchecked track from 1.46:1 to 3.47:1 against
|
|
51
|
-
* both the page and its own white thumb, so "off" is finally a visible state.
|
|
52
|
-
* Guarded by src/tokens/__tests__/input-boundary-contrast.test.ts. */
|
|
53
|
-
--input: 30 7% 53%; /* #90877f — control boundary, ≥3:1 (WCAG 2.2 SC 1.4.11) */
|
|
22
|
+
--border: 30 7% 83%;
|
|
23
|
+
|
|
24
|
+
--input: 30 7% 53%;
|
|
54
25
|
--ring: 204 100% 39%;
|
|
55
|
-
--success: 146 40% 58%;
|
|
26
|
+
--success: 146 40% 58%;
|
|
56
27
|
--success-foreground: 60 33% 99%;
|
|
57
|
-
--warning: 44 100% 49%;
|
|
28
|
+
--warning: 44 100% 49%;
|
|
58
29
|
--warning-foreground: 48 8% 13%;
|
|
59
|
-
--info: 221 40% 50%;
|
|
30
|
+
--info: 221 40% 50%;
|
|
60
31
|
--info-foreground: 60 33% 99%;
|
|
61
|
-
--attention: 25 99% 46%;
|
|
32
|
+
--attention: 25 99% 46%;
|
|
62
33
|
--attention-foreground: 60 33% 99%;
|
|
63
34
|
|
|
64
|
-
|
|
65
|
-
* / `tone="success"`, its wordmark, the email brand capsule), and it is deliberately THREE-WAY
|
|
66
|
-
* distinct:
|
|
67
|
-
* · from --primary — a service re-theming its action colour must never recolour the mark;
|
|
68
|
-
* · from --success — 若竹 #68be8d is the STATUS green (badges, progress, "saved" text) and
|
|
69
|
-
* stays exactly as it is. The mark previously borrowed it, which rendered
|
|
70
|
-
* the identity at #69bf8e instead of the canonical emerald — ΔE76 ≈ 17.5,
|
|
71
|
-
* a plainly wrong brand colour (gh#250/#214);
|
|
72
|
-
* · from --text-brand / --color-brand — those are the BLUE brand-numeral TEXT slot and the
|
|
73
|
-
* Tailwind `text-brand` utility it feeds; unrelated, and not renamed here.
|
|
74
|
-
* Canonical value: oklch(0.595 0.137 162.94) = #009766, "kept distinct from SmartHR primary".
|
|
75
|
-
* The triplet is carried at one decimal so hsl() lands on that exact hex (an integer 160 100% 30%
|
|
76
|
-
* would drift to #009966). Dark lifts lightness only — same hue, same full chroma — so the mark
|
|
77
|
-
* stays the same emerald while clearing AA against the dark spine.
|
|
78
|
-
* There is no Tailwind `bg-brand` utility on purpose: `--color-brand` is already taken by
|
|
79
|
-
* --text-brand, so identity surfaces read `hsl(var(--brand))` directly in component CSS. */
|
|
80
|
-
--brand: 160.5 100% 29.6%; /* 翠 GoDX emerald #009766 */
|
|
35
|
+
--brand: 160.5 100% 29.6%;
|
|
81
36
|
--brand-foreground: 60 33% 99%;
|
|
82
37
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
--text-
|
|
86
|
-
--text-
|
|
87
|
-
|
|
88
|
-
--text-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
--text-
|
|
93
|
-
|
|
94
|
-
--text-warning: 36 100% 28%; /* dark 山吹 amber — yellow can never pass as text */
|
|
95
|
-
--text-info: 221 70% 38%; /* deep 群青 — AA blue text on white */
|
|
96
|
-
--text-error: 357 75% 38%; /* deep 茜 — AA red text on white */
|
|
97
|
-
|
|
98
|
-
/* Interaction ramp — hover / active steps (services override to their own brand ramp). */
|
|
38
|
+
--text-tertiary: 44 5% 55%;
|
|
39
|
+
--text-disabled: 40 6% 68%;
|
|
40
|
+
--text-link: 204 100% 39%;
|
|
41
|
+
--text-brand: 204 100% 39%;
|
|
42
|
+
|
|
43
|
+
--text-primary: 204 100% 30%;
|
|
44
|
+
--text-success: 152 84% 22%;
|
|
45
|
+
--text-warning: 36 100% 28%;
|
|
46
|
+
--text-info: 221 70% 38%;
|
|
47
|
+
--text-error: 357 75% 38%;
|
|
48
|
+
|
|
99
49
|
--primary-hover: 204 100% 33%;
|
|
100
50
|
--primary-active: 204 100% 28%;
|
|
101
51
|
--secondary-hover: 45 15% 91%;
|
|
@@ -103,24 +53,20 @@
|
|
|
103
53
|
--destructive-hover: 357 64% 38%;
|
|
104
54
|
--destructive-active: 357 64% 32%;
|
|
105
55
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
--wa-
|
|
110
|
-
--wa-
|
|
111
|
-
--wa-
|
|
112
|
-
--wa-
|
|
113
|
-
--wa-
|
|
114
|
-
--wa-
|
|
115
|
-
--wa-
|
|
116
|
-
--wa-
|
|
117
|
-
--wa-
|
|
118
|
-
--wa-
|
|
119
|
-
|
|
120
|
-
--wa-sumi: #595857; /* 墨 warm ink */
|
|
121
|
-
--wa-nezu: #949495; /* 鼠 mouse-grey */
|
|
122
|
-
|
|
123
|
-
/* Chart accents are neutral decorative primitives, not business semantics. */
|
|
56
|
+
--wa-ai: #165e83;
|
|
57
|
+
--wa-gunjo: #4c6cb3;
|
|
58
|
+
--wa-ruri: #1e50a2;
|
|
59
|
+
--wa-kon: #223a70;
|
|
60
|
+
--wa-wakatake: #68be8d;
|
|
61
|
+
--wa-moegi: #006e54;
|
|
62
|
+
--wa-yamabuki: #f8b500;
|
|
63
|
+
--wa-shu: #eb6101;
|
|
64
|
+
--wa-akane: #b7282e;
|
|
65
|
+
--wa-enji: #b94047;
|
|
66
|
+
--wa-sakura: #fef4f4;
|
|
67
|
+
--wa-sumi: #595857;
|
|
68
|
+
--wa-nezu: #949495;
|
|
69
|
+
|
|
124
70
|
--chart-1: #0077c7;
|
|
125
71
|
--chart-2: #006e54;
|
|
126
72
|
--chart-3: #f8b500;
|
|
@@ -128,18 +74,13 @@
|
|
|
128
74
|
--chart-5: #4c6cb3;
|
|
129
75
|
--chart-6: #eb6101;
|
|
130
76
|
|
|
131
|
-
/* Disabled affordance opacity — single knob (was referenced but undefined → silent failure). */
|
|
132
77
|
--disabled-opacity: 0.5;
|
|
133
78
|
|
|
134
|
-
/* Shape and elevation */
|
|
135
|
-
/* 6px base × scaling; override to retheme every radius step */
|
|
136
79
|
--radius: calc(0.375rem * var(--scaling));
|
|
137
|
-
--radius-ratio: 1.618;
|
|
138
|
-
--radius-pill: 9999px;
|
|
139
|
-
--radius-sharp: 0;
|
|
140
|
-
|
|
141
|
-
* a service can set e.g. `--shadow-color: 12 26 49` (navy) to tint the WHOLE ramp at once. These
|
|
142
|
-
* own `--shadow-md` too, so dropdown/popover/nav no longer borrow Tailwind's foreign gray-black. */
|
|
80
|
+
--radius-ratio: 1.618;
|
|
81
|
+
--radius-pill: 9999px;
|
|
82
|
+
--radius-sharp: 0;
|
|
83
|
+
|
|
143
84
|
--shadow-color: 0 0 0;
|
|
144
85
|
--shadow-xs: 0 1px 1px 0 rgb(var(--shadow-color) / 0.04);
|
|
145
86
|
--shadow-sm: 0 1px 2px 0 rgb(var(--shadow-color) / 0.05);
|
|
@@ -151,18 +92,8 @@
|
|
|
151
92
|
0 20px 25px -5px rgb(var(--shadow-color) / 0.1), 0 8px 10px -6px rgb(var(--shadow-color) / 0.1);
|
|
152
93
|
--shadow-2xl: 0 25px 50px -12px rgb(var(--shadow-color) / 0.25);
|
|
153
94
|
|
|
154
|
-
/* Brand GLOW — an opt-in coloured halo for the primary CTA (and any surface that opts in).
|
|
155
|
-
* Quiet by default (cardinal rule #44): a zero-size transparent shadow, which is invalid as a
|
|
156
|
-
* bare `none` inside a comma shadow list but valid as `0 0 0 0 transparent`. A service turns it
|
|
157
|
-
* on by overriding the whole value once, e.g. `--shadow-glow: 0 8px 20px hsl(var(--primary) / .32)`
|
|
158
|
-
* — the CTA then carries a brand glow with no component change. */
|
|
159
95
|
--shadow-glow: 0 0 0 0 transparent;
|
|
160
96
|
|
|
161
|
-
/* Brand SPOTLIGHT — a decorative radial brand halo for hero / auth backdrops (the `.ui-brand-glow`
|
|
162
|
-
* utility paints this as a background-image on an aria-hidden layer). Every knob is a token, so a
|
|
163
|
-
* service retints (`--brand-glow-color`), softens (`--brand-glow-alpha`), resizes
|
|
164
|
-
* (`--brand-glow-size`) or repositions (`--brand-glow-position`) the halo with no markup change;
|
|
165
|
-
* override the whole `--brand-glow` for a bespoke gradient. Default: a soft primary glow up top. */
|
|
166
97
|
--brand-glow-color: var(--primary);
|
|
167
98
|
--brand-glow-alpha: 0.18;
|
|
168
99
|
--brand-glow-size: 60% 50%;
|
|
@@ -173,160 +104,77 @@
|
|
|
173
104
|
transparent 70%
|
|
174
105
|
);
|
|
175
106
|
|
|
176
|
-
|
|
177
|
-
* `--focus-ring-color` is the themeable hue (HSL components, defaults to --ring) and
|
|
178
|
-
* `--focus-ring-width` the standard thickness; override either ONCE — even scoped under a
|
|
179
|
-
* `[data-tenant]` — to retint or resize EVERY focus ring. `--focus-ring-color` is declared
|
|
180
|
-
* `initial` (NOT `var(--ring)`): a :root binding to a role var would freeze at the :root --ring
|
|
181
|
-
* and a scoped [data-tenant] override of --ring alone would never reach it. Every :focus-visible
|
|
182
|
-
* rule reads it with the live-role fallback `hsl(var(--focus-ring-color, var(--ring)))`, so the
|
|
183
|
-
* default re-resolves at the element that paints the ring while an explicit override still wins. */
|
|
184
|
-
--focus-ring-color: initial; /* default = the live --ring role */
|
|
107
|
+
--focus-ring-color: initial;
|
|
185
108
|
--focus-ring-width: var(--stroke-md);
|
|
186
|
-
|
|
187
|
-
* (a filled toggle, tinted shell chrome) tunes one knob instead of writing
|
|
188
|
-
* its own `hsl(... / 0.35)` — which is how four incompatible ring shapes
|
|
189
|
-
* appeared before the single-source rule in styles/focus-ring.css. */
|
|
109
|
+
|
|
190
110
|
--focus-ring-opacity: 1;
|
|
191
|
-
|
|
192
|
-
* heading anchor — marks where a radius-hugging shadow would touch the
|
|
193
|
-
* glyph). The shadow form ignores it by construction. */
|
|
111
|
+
|
|
194
112
|
--focus-ring-offset: 0px;
|
|
195
|
-
|
|
196
|
-
* MUST stay a plain length consumed via a bare var(): Chromium rejects any calc() in
|
|
197
|
-
* overflow-clip-margin at parse time (even calc(2 * 2px)), silently dropping the
|
|
198
|
-
* declaration to 0. Value = max ring paint (3px open/focus) + rounding immunity:
|
|
199
|
-
* at 4px a flush-edge ring had only 1px of slack, which device-pixel rounding on
|
|
200
|
-
* non-retina (dpr 1) displays or fractional browser zoom could consume, shaving the
|
|
201
|
-
* ring's outer edge. 8px keeps ≥5px of slack under any rounding regime. */
|
|
113
|
+
|
|
202
114
|
--focus-ring-clip-margin: 8px;
|
|
203
|
-
|
|
204
|
-
* gh#271/gh#276), separate from the control ring above. A control-strength 2px brand frame
|
|
205
|
-
* around the entire content area reads as a glitch to mouse-first users (`:focus-visible`
|
|
206
|
-
* promotes on any keypress after a click-focus), so the DEFAULT IS OFF — a deliberate,
|
|
207
|
-
* product-owner tradeoff against WCAG 2.4.7 for keyboard-scroll visibility. A service that
|
|
208
|
-
* needs the visible affordance opts in with ONE token:
|
|
209
|
-
* --region-focus-ring-width: var(--focus-ring-width);
|
|
210
|
-
* `--region-focus-ring-color` is declared `initial` (NOT a :root var binding — the freeze
|
|
211
|
-
* rule) and resolves to the live focus-ring hue at the element that paints it. */
|
|
115
|
+
|
|
212
116
|
--region-focus-ring-width: 0;
|
|
213
|
-
--region-focus-ring-color: initial;
|
|
214
|
-
|
|
215
|
-
/* GRADIENTS — opt-in decorative fills exposed at the token layer so a service can paint a hero
|
|
216
|
-
* banner, a brand wash, or a radial brand glow purely by configuring tokens (cardinal rule #45).
|
|
217
|
-
* All default to a transparent no-op so nothing renders until a theme opts in; a surface that
|
|
218
|
-
* supports a gradient reads one of these as its background-image. Examples a service might set:
|
|
219
|
-
* --gradient-brand: linear-gradient(135deg, hsl(var(--primary)), hsl(var(--accent)));
|
|
220
|
-
* --gradient-hero: linear-gradient(180deg, hsl(var(--secondary)), hsl(var(--background)));
|
|
221
|
-
* --gradient-glow: radial-gradient(60% 80% at 50% 0%, hsl(var(--primary) / .25), transparent); */
|
|
117
|
+
--region-focus-ring-color: initial;
|
|
118
|
+
|
|
222
119
|
--gradient-brand: none;
|
|
223
120
|
--gradient-hero: none;
|
|
224
121
|
--gradient-glow: none;
|
|
225
122
|
|
|
226
|
-
/* Sans stack — FONT-AGNOSTIC by default. The library ships NO hardcoded brand
|
|
227
|
-
* face here: `--font-sans-base` is a pure system stack so godx renders cleanly
|
|
228
|
-
* with zero font setup. Consumers supply their own faces (next/font, @fontsource,
|
|
229
|
-
* self-host) and set the tokens — never edit the library.
|
|
230
|
-
*
|
|
231
|
-
* Two ways to theme fonts, both token-only (no [lang] selectors to write):
|
|
232
|
-
* 1. One face everywhere → override `--font-sans-base`.
|
|
233
|
-
* 2. Per-language faces → set the per-lang SLOT tokens; styles/base.css wires
|
|
234
|
-
* each `[lang]` to read its slot with `--font-sans-base` as the fallback:
|
|
235
|
-
* --font-sans-ja (lang="ja")
|
|
236
|
-
* --font-sans-ko (lang="ko")
|
|
237
|
-
* --font-sans-vi (lang="vi")
|
|
238
|
-
* --font-sans-zh-hans (lang="zh" | "zh-Hans" | "zh-CN")
|
|
239
|
-
* --font-sans-zh-hant (lang="zh-Hant" | "zh-TW")
|
|
240
|
-
* e.g. `--font-sans-ja: "Noto Sans JP", var(--font-sans-base);`
|
|
241
|
-
* The opt-in bundle `@godxjp/ui/styles/fonts` overwrites `--font-sans-base`
|
|
242
|
-
* (and `--font-sans-vi`) with the DXS bundle — "Noto Sans JP" primary, "M PLUS 2"
|
|
243
|
-
* as its fallback — so the all-in-one entry is zero-config. That fill also
|
|
244
|
-
* lands on `:root` at THIS specificity, so `styles/fonts` MUST be imported AFTER
|
|
245
|
-
* `styles/base`, or the system stack below silently wins (issue #210). */
|
|
246
123
|
--font-sans-base:
|
|
247
124
|
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, system-ui,
|
|
248
125
|
sans-serif;
|
|
249
126
|
--font-family-sans: var(--font-sans-base);
|
|
250
127
|
--font-family-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
251
|
-
|
|
252
|
-
* BODY face (e.g. Source Sans 3 display + Inter body). Both default to --font-family-sans, so a
|
|
253
|
-
* single-font system is unchanged; a service overrides one or both. Headings read
|
|
254
|
-
* --font-family-display, body reads --font-family-body (wired in styles/index.css @layer base). */
|
|
128
|
+
|
|
255
129
|
--font-family-display: var(--font-family-sans);
|
|
256
130
|
--font-family-body: var(--font-family-sans);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
* headings stay small (h1≈20, h2≈18; pure φ=1.618 would be marketing-size). Internal apps get the
|
|
261
|
-
* 14px DEFAULT with ZERO config; a customer overrides `--font-size-base` (and optionally
|
|
262
|
-
* `--font-size-ratio`) and the entire scale rescales in golden proportion. */
|
|
263
|
-
--font-size-base: 0.875rem; /* 14px — THE base (= <body>). The single knob; override to retheme. */
|
|
264
|
-
--font-size-ratio: 1.1227; /* φ^¼ — golden-ratio step (φ=1.618, φ^¼ keeps the dense scale small) */
|
|
131
|
+
|
|
132
|
+
--font-size-base: 0.875rem;
|
|
133
|
+
--font-size-ratio: 1.1227;
|
|
265
134
|
--font-size-2xs: calc(
|
|
266
135
|
var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio)
|
|
267
|
-
);
|
|
268
|
-
--font-size-xs: calc(var(--font-size-base) / var(--font-size-ratio));
|
|
269
|
-
--font-size-sm: var(--font-size-base);
|
|
136
|
+
);
|
|
137
|
+
--font-size-xs: calc(var(--font-size-base) / var(--font-size-ratio));
|
|
138
|
+
--font-size-sm: var(--font-size-base);
|
|
270
139
|
--font-size-lg: calc(
|
|
271
140
|
var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio)
|
|
272
|
-
);
|
|
273
|
-
--font-size-xl: calc(var(--font-size-lg) * var(--font-size-ratio));
|
|
274
|
-
--font-size-2xl: calc(var(--font-size-xl) * var(--font-size-ratio));
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
* SEPARATE bolder ramp a marketing surface opts into via the text-3xl/-4xl/-5xl utilities (wired
|
|
279
|
-
* in styles/index.css @theme). A service rescales the whole display ramp from --font-size-display
|
|
280
|
-
* (its own base). Nothing in the admin system uses them, so defaults are unchanged. */
|
|
281
|
-
--font-size-display: 3.375rem; /* 54px — hero display (the single display knob) */
|
|
282
|
-
--font-size-display-ratio: 1.28; /* bolder step than the body φ^¼ — marketing wants more contrast */
|
|
141
|
+
);
|
|
142
|
+
--font-size-xl: calc(var(--font-size-lg) * var(--font-size-ratio));
|
|
143
|
+
--font-size-2xl: calc(var(--font-size-xl) * var(--font-size-ratio));
|
|
144
|
+
|
|
145
|
+
--font-size-display: 3.375rem;
|
|
146
|
+
--font-size-display-ratio: 1.28;
|
|
283
147
|
--font-size-3xl: calc(
|
|
284
148
|
var(--font-size-display) / var(--font-size-display-ratio) / var(--font-size-display-ratio)
|
|
285
|
-
);
|
|
149
|
+
);
|
|
286
150
|
--font-size-4xl: calc(
|
|
287
151
|
var(--font-size-display) / var(--font-size-display-ratio)
|
|
288
|
-
);
|
|
289
|
-
--font-size-5xl: var(--font-size-display);
|
|
152
|
+
);
|
|
153
|
+
--font-size-5xl: var(--font-size-display);
|
|
290
154
|
|
|
291
|
-
/* Headings — also golden-derived. h1=ratio³, h2=ratio²; h3/h4 reuse body sizes (single source). */
|
|
292
155
|
--heading-h1: calc(
|
|
293
156
|
var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio) * var(--font-size-ratio)
|
|
294
|
-
);
|
|
157
|
+
);
|
|
295
158
|
--heading-h2: calc(
|
|
296
159
|
var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio)
|
|
297
|
-
);
|
|
298
|
-
--heading-h3: var(--font-size-base);
|
|
299
|
-
--heading-h4: var(--font-size-xs);
|
|
160
|
+
);
|
|
161
|
+
--heading-h3: var(--font-size-base);
|
|
162
|
+
--heading-h4: var(--font-size-xs);
|
|
300
163
|
|
|
301
164
|
--font-weight-normal: 400;
|
|
302
165
|
--font-weight-medium: 500;
|
|
303
|
-
|
|
304
|
-
* forbidden (ambiguous between 500 and 700) — the legacy "semibold" token collapses to medium
|
|
305
|
-
* so any remaining reference renders at 500. `bold` is the 700 emphasis weight. */
|
|
166
|
+
|
|
306
167
|
--font-weight-semibold: 500;
|
|
307
168
|
--font-weight-bold: 700;
|
|
308
|
-
|
|
309
|
-
* at 700 (簡素 restraint); this is only reached via the .font-display-weight utility / a service
|
|
310
|
-
* setting it on a display surface, so admin text is unchanged. */
|
|
169
|
+
|
|
311
170
|
--font-weight-black: 800;
|
|
312
171
|
--line-height-tight: 1.25;
|
|
313
172
|
--line-height-normal: 1.5;
|
|
314
173
|
--line-height-body: 1.7;
|
|
315
174
|
--letter-spacing-tight: 0;
|
|
316
175
|
|
|
317
|
-
/* ── SCALING — the one global density knob (Radix Themes model). A single
|
|
318
|
-
* dimensionless multiplier on every SIZE token (spacing grid, control / table /
|
|
319
|
-
* checkbox / switch heights, radius), so the whole UI rescales in proportion
|
|
320
|
-
* from one place. `1` = the design baseline. The `density` axis sets named
|
|
321
|
-
* presets (compact .92 · default 1 · comfortable 1.08); AppProvider's `scaling`
|
|
322
|
-
* prop sets any value continuously. Type has its OWN base+ratio (--font-size-base)
|
|
323
|
-
* and is NOT scaled here — fontSize stays an orthogonal axis. Touch targets
|
|
324
|
-
* (--touch-target-min) are also exempt (a11y minimum). */
|
|
325
176
|
--scaling: 1;
|
|
326
177
|
|
|
327
|
-
/* Raw spacing scale — the 4px grid, scaled. Everything that derives from
|
|
328
|
-
* --space-* (padding, gaps, --phi-unit, semantic spacing, chrome) inherits the
|
|
329
|
-
* scaling automatically; this is the single highest-leverage scaling point. */
|
|
330
178
|
--space-0: 0;
|
|
331
179
|
--space-1: calc(0.25rem * var(--scaling));
|
|
332
180
|
--space-2: calc(0.5rem * var(--scaling));
|
|
@@ -338,115 +186,31 @@
|
|
|
338
186
|
--space-10: calc(2.5rem * var(--scaling));
|
|
339
187
|
--space-12: calc(3rem * var(--scaling));
|
|
340
188
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
*
|
|
353
|
-
* NOT SCALED HERE. --scaling is applied by the tokens that opt IN
|
|
354
|
-
* (`calc(var(--icon-size-md) * var(--scaling))`, as --control-icon-size does), so the scale
|
|
355
|
-
* itself stays the crisp whole-pixel list. Density is a per-token decision, not a property of
|
|
356
|
-
* the vocabulary.
|
|
357
|
-
*
|
|
358
|
-
* TIER 1 / TIER 2 — where the boundary sits. These nine steps are tier 1: the value appears in
|
|
359
|
-
* more than one place, so it earns a name and a service retunes it once. A value that appears
|
|
360
|
-
* in exactly ONE place (the 6px status dot) is tier 2 and does NOT belong on the scale — set
|
|
361
|
-
* that component's own `--*-icon-size` / `--*-glyph-size` token at the call site instead
|
|
362
|
-
* (`style={{ "--menu-icon-size": "6px" }}` or a `[data-…]`-scoped rule in the app theme). An
|
|
363
|
-
* inline custom property wins by inheritance proximity, so tier 2 needs no `!important`, no
|
|
364
|
-
* `:root` override and no fork. Every icon rule in src/styles reads its token through `var()`
|
|
365
|
-
* with no literal fallback, which is what keeps that route open — see docs/TOKENS.md. */
|
|
366
|
-
--icon-size-2xs: 0.625rem; /* 10px */
|
|
367
|
-
--icon-size-xs: 0.75rem; /* 12px */
|
|
368
|
-
--icon-size-sm: 0.875rem; /* 14px */
|
|
369
|
-
--icon-size-md: 1rem; /* 16px — the default icon step */
|
|
370
|
-
--icon-size-lg: 1.25rem; /* 20px */
|
|
371
|
-
--icon-size-xl: 1.5rem; /* 24px */
|
|
372
|
-
--icon-size-2xl: 2.25rem; /* 36px */
|
|
373
|
-
--icon-size-3xl: 2.5rem; /* 40px */
|
|
374
|
-
--icon-size-4xl: 3rem; /* 48px */
|
|
375
|
-
|
|
376
|
-
/* ── STROKE — the thickness of a painted LINE (gh#324, the second axis to be named).
|
|
377
|
-
*
|
|
378
|
-
* gh#324 measured `width` at 91% raw and called it the worst axis in the system. It is not one
|
|
379
|
-
* axis. Three unrelated concerns wear the `-width` suffix: the thickness of a drawn line, the
|
|
380
|
-
* measure of a container (a dialog, a reading column, a sidebar), and the content width of a
|
|
381
|
-
* field (how wide a locale picker must be to hold its longest label). Only the FIRST is a
|
|
382
|
-
* vocabulary — see the verdict recorded in `scripts/token-scale-bypass-rules.mjs`.
|
|
383
|
-
*
|
|
384
|
-
* The vocabulary was already there and repeats hard: SIX values across ~20 tokens spanning
|
|
385
|
-
* borders, focus rings, accent rails, selected-state markers and presence strokes. Naming it is
|
|
386
|
-
* what lets a service retune line weight once — a hi-dpi theme that wants 1.5px hairlines, or a
|
|
387
|
-
* high-contrast theme that wants every emphasis stroke at 3px — instead of hunting 20 tokens.
|
|
388
|
-
*
|
|
389
|
-
* PIXELS, NOT REM, AND DELIBERATELY SO. A stroke is a DEVICE line: its job is to read as one
|
|
390
|
-
* crisp rule at any type size, so it must not grow when the root font-size does. Every token
|
|
391
|
-
* that moves onto this scale was already `px` for that reason; a `rem` thickness
|
|
392
|
-
* (`--slider-track-height: 0.375rem`) is a different decision and stays where it is.
|
|
393
|
-
*
|
|
394
|
-
* NOT SCALED. `--scaling` is a DENSITY knob — it tightens the spacing rhythm, and a 1px divider
|
|
395
|
-
* that became 0.92px under compact density would blur, not tighten. No token on this axis
|
|
396
|
-
* multiplies by it today and none should.
|
|
397
|
-
*
|
|
398
|
-
* `--stroke-hairline` sits BELOW `--stroke-sm` rather than being called `xs`, because 1px is
|
|
399
|
-
* not really a step: it is the device hairline, the one thickness a service retunes the
|
|
400
|
-
* EXISTENCE of rather than the value (cardinal rule #44). The scale-bypass guard exempts a bare
|
|
401
|
-
* `1px` for the same reason. Naming it anyway gives the retune-the-value route to the themes
|
|
402
|
-
* that want it.
|
|
403
|
-
*
|
|
404
|
-
* TIER 2 — a thickness that appears in exactly one place does not belong here. Set that
|
|
405
|
-
* component's own `--*-border-width` / `--*-ring-width` token at the call site or in the app
|
|
406
|
-
* theme; every stroke rule in src/styles reads its token through `var()`. */
|
|
407
|
-
--stroke-hairline: 1px; /* every resting border, divider and rule */
|
|
189
|
+
--icon-size-2xs: 0.625rem;
|
|
190
|
+
--icon-size-xs: 0.75rem;
|
|
191
|
+
--icon-size-sm: 0.875rem;
|
|
192
|
+
--icon-size-md: 1rem;
|
|
193
|
+
--icon-size-lg: 1.25rem;
|
|
194
|
+
--icon-size-xl: 1.5rem;
|
|
195
|
+
--icon-size-2xl: 2.25rem;
|
|
196
|
+
--icon-size-3xl: 2.5rem;
|
|
197
|
+
--icon-size-4xl: 3rem;
|
|
198
|
+
|
|
199
|
+
--stroke-hairline: 1px;
|
|
408
200
|
--stroke-sm: 1.5px;
|
|
409
|
-
--stroke-md: 2px;
|
|
201
|
+
--stroke-md: 2px;
|
|
410
202
|
--stroke-lg: 3px;
|
|
411
203
|
--stroke-xl: 4px;
|
|
412
204
|
--stroke-2xl: 6px;
|
|
413
205
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
* surface, with almost no repeated value between them. Those are tier 2 and stay literal.
|
|
423
|
-
*
|
|
424
|
-
* gh#324's fourth case is the whole argument: `PageContainer`'s chrome band had no height token
|
|
425
|
-
* while `AppShell`'s bar did, so nothing could be aligned to it. The two were never conceived
|
|
426
|
-
* as members of one axis, because the axis had no name.
|
|
427
|
-
*
|
|
428
|
-
* WHY THIS IS NOT `--control-height-*`. The control tier is a RUNTIME LADDER: `--control-height`
|
|
429
|
-
* multiplies by `--scaling`, `-sm`/`-lg`/`-xs` step off it, and `@media (pointer: coarse)` lifts
|
|
430
|
-
* the whole ladder to the 44px tap floor. This scale is the STATIC vocabulary that the ladder is
|
|
431
|
-
* anchored on — `--control-height-default: var(--band-height-md)` — exactly as `--font-size-base`
|
|
432
|
-
* anchors the type scale. Do NOT point a band token at `--control-height-*` to "reuse a step":
|
|
433
|
-
* that silently enrols it in density AND in the coarse-pointer growth, which is a geometry
|
|
434
|
-
* change, not a rename. `--table-row-height-default` is `var(--band-height-md)` and NOT
|
|
435
|
-
* `var(--control-height-default)` for precisely that reason.
|
|
436
|
-
*
|
|
437
|
-
* NOT SCALED HERE, for the gh#328 reason: whether a band breathes with density is a per-token
|
|
438
|
-
* decision made long ago. `--control-height` opts in (`calc(… * var(--scaling))`);
|
|
439
|
-
* `--app-shell-bar-height` deliberately does not. Baking `--scaling` into the scale would flip
|
|
440
|
-
* every one of them at once. */
|
|
441
|
-
--band-height-xs: 1.5rem; /* 24px */
|
|
442
|
-
--band-height-sm: 1.75rem; /* 28px */
|
|
443
|
-
--band-height-md: 2rem; /* 32px — the default control/row band */
|
|
444
|
-
--band-height-lg: 2.25rem; /* 36px */
|
|
445
|
-
--band-height-xl: 2.75rem; /* 44px — the WCAG 2.2 AA touch floor (rule #24) */
|
|
446
|
-
--band-height-2xl: 3rem; /* 48px */
|
|
447
|
-
--band-height-3xl: 3.5rem; /* 56px */
|
|
448
|
-
|
|
449
|
-
/* Golden ratio scale */
|
|
206
|
+
--band-height-xs: 1.5rem;
|
|
207
|
+
--band-height-sm: 1.75rem;
|
|
208
|
+
--band-height-md: 2rem;
|
|
209
|
+
--band-height-lg: 2.25rem;
|
|
210
|
+
--band-height-xl: 2.75rem;
|
|
211
|
+
--band-height-2xl: 3rem;
|
|
212
|
+
--band-height-3xl: 3.5rem;
|
|
213
|
+
|
|
450
214
|
--ratio-phi: 1.6180339887;
|
|
451
215
|
--phi-unit: var(--space-4);
|
|
452
216
|
--phi-n2: calc(var(--phi-unit) / var(--ratio-phi) / var(--ratio-phi));
|
|
@@ -456,13 +220,6 @@
|
|
|
456
220
|
--phi-p2: calc(var(--phi-p1) * var(--ratio-phi));
|
|
457
221
|
}
|
|
458
222
|
|
|
459
|
-
/* SCALE-FIXED — pin a subtree to the baseline size (--scaling 1) so persistent
|
|
460
|
-
* chrome (the AppShell topbar, the global search palette, …) does NOT resize with
|
|
461
|
-
* the density axis. Setting only --scaling:1 is insufficient: the size tokens were
|
|
462
|
-
* already substituted at :root and inherit baked, so each --scaling-derived token
|
|
463
|
-
* (and every semantic token that aliases the spacing grid) is RE-DECLARED here to
|
|
464
|
-
* re-resolve at baseline. Apply via `className="… ui-scale-fixed"`. Must list every
|
|
465
|
-
* scaled token — the scale-fixed coverage test guards against drift. */
|
|
466
223
|
.ui-scale-fixed {
|
|
467
224
|
--scaling: 1;
|
|
468
225
|
--space-1: 0.25rem;
|
|
@@ -476,10 +233,7 @@
|
|
|
476
233
|
--space-12: 3rem;
|
|
477
234
|
--radius: 0.375rem;
|
|
478
235
|
--control-height: var(--control-height-default);
|
|
479
|
-
|
|
480
|
-
* control-sizing guard happy and avoids re-deriving from the (baked) active
|
|
481
|
-
* --control-height. Scale steps rather than literals since gh#324, so a service that
|
|
482
|
-
* retunes --band-height-* retunes the scale-fixed chrome with everything else. */
|
|
236
|
+
|
|
483
237
|
--control-height-sm: var(--band-height-sm);
|
|
484
238
|
--control-height-lg: var(--band-height-lg);
|
|
485
239
|
--control-height-xs: var(--band-height-xs);
|
|
@@ -513,10 +267,6 @@
|
|
|
513
267
|
--space-chrome-gap: var(--space-2);
|
|
514
268
|
--field-label-gap: var(--space-2);
|
|
515
269
|
|
|
516
|
-
/* Motion — the primitive tier for animation, so enter/transition timing reads a token
|
|
517
|
-
* instead of a literal 0.5s / cubic-bezier(...) / translateY(10px) (cardinal rule #2).
|
|
518
|
-
* the reference design keeps motion LOW: short durations, a calm decelerate curve, a small reveal shift.
|
|
519
|
-
* Consumers honour prefers-reduced-motion at the call site. */
|
|
520
270
|
--duration-fast: 150ms;
|
|
521
271
|
--duration-base: 250ms;
|
|
522
272
|
--duration-slow: 500ms;
|
|
@@ -525,38 +275,26 @@
|
|
|
525
275
|
--ease-decelerate: cubic-bezier(0, 0, 0, 1);
|
|
526
276
|
--ease-accelerate: cubic-bezier(0.3, 0, 1, 1);
|
|
527
277
|
--reveal-distance: 10px;
|
|
528
|
-
|
|
529
|
-
* so a column of reveals cascades. Read instead of a literal `.04s`/`.09s` per-item delay. */
|
|
278
|
+
|
|
530
279
|
--reveal-stagger-step: 60ms;
|
|
531
280
|
|
|
532
|
-
/* AMBIENT/LOOPING motion (gh#313) — the cycle member of the motion tier. `--duration-fast|base|
|
|
533
|
-
* slow` time a TRANSITION (something moves from A to B and stops); a loop needs an INTERVAL, so
|
|
534
|
-
* every ambient affordance in the product breathes at one rate. `Activity` reads these; the
|
|
535
|
-
* remaining Activity knobs (geometry / colour) live in tokens/components/activity.css.
|
|
536
|
-
* NOTE these two are Activity-scoped but live HERE, beside `--reveal-*`, because the motion tier
|
|
537
|
-
* is where timing belongs and because component-token names must carry a geometry/colour
|
|
538
|
-
* property word (`check-token-tiers`) — there is none for a duration. */
|
|
539
281
|
--duration-loop: 1400ms;
|
|
540
|
-
|
|
282
|
+
|
|
541
283
|
--activity-interval: var(--duration-loop);
|
|
542
|
-
|
|
543
|
-
* named to match. In RTL the dots reverse with the row, so the cascade follows the reading
|
|
544
|
-
* direction with no extra rule. */
|
|
284
|
+
|
|
545
285
|
--activity-stagger-step: 160ms;
|
|
546
286
|
}
|
|
547
287
|
|
|
548
288
|
.dark,
|
|
549
289
|
:root[data-theme="dark"] {
|
|
550
|
-
|
|
551
|
-
* `data-theme="dark"` is the theme axis (AppProvider theme prop → <html>); the
|
|
552
|
-
* legacy `.dark` class stays an equal alias so existing toggles keep working. */
|
|
290
|
+
|
|
553
291
|
--background: 48 9% 9%;
|
|
554
292
|
--foreground: 60 20% 96%;
|
|
555
293
|
--card: 48 8% 12%;
|
|
556
294
|
--card-foreground: 60 20% 96%;
|
|
557
295
|
--popover: 48 8% 12%;
|
|
558
296
|
--popover-foreground: 60 20% 96%;
|
|
559
|
-
--primary: 204 90% 60%;
|
|
297
|
+
--primary: 204 90% 60%;
|
|
560
298
|
--primary-foreground: 48 9% 9%;
|
|
561
299
|
--secondary: 45 6% 18%;
|
|
562
300
|
--secondary-foreground: 60 20% 96%;
|
|
@@ -564,20 +302,12 @@
|
|
|
564
302
|
--muted-foreground: 44 6% 64%;
|
|
565
303
|
--accent: 45 7% 22%;
|
|
566
304
|
--accent-foreground: 60 20% 96%;
|
|
567
|
-
|
|
568
|
-
* margin, not sit on the floor (gh#199 — dark default was 4.54:1). Base darkened 52%→48% and the
|
|
569
|
-
* on-fill text lifted to pure white → ~5.5:1; states go DARKER (never lighter, which cut contrast
|
|
570
|
-
* against the light label). Error TEXT on dark surfaces uses --text-error, not this fill token. */
|
|
305
|
+
|
|
571
306
|
--destructive: 357 55% 48%;
|
|
572
307
|
--destructive-foreground: 0 0% 100%;
|
|
573
308
|
--border: 45 6% 22%;
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
* on the --card/--popover surface where dialogs put their fields. 47% gives
|
|
577
|
-
* --background 4.22:1 · --card/--popover 3.88:1 · --muted/--secondary 3.17:1 · zebra 3.81:1 ·
|
|
578
|
-
* hover 3.71:1. --border stays at 22%: dividers are decorative and a dark grid at 47% would
|
|
579
|
-
* read as a wireframe. See the light block above for the full reasoning. */
|
|
580
|
-
--input: 45 6% 47%; /* #7f7b71 — control boundary, ≥3:1 (WCAG 2.2 SC 1.4.11) */
|
|
309
|
+
|
|
310
|
+
--input: 45 6% 47%;
|
|
581
311
|
--ring: 204 90% 60%;
|
|
582
312
|
--success: 146 45% 55%;
|
|
583
313
|
--success-foreground: 48 9% 9%;
|
|
@@ -588,20 +318,15 @@
|
|
|
588
318
|
--attention: 25 95% 56%;
|
|
589
319
|
--attention-foreground: 48 9% 9%;
|
|
590
320
|
|
|
591
|
-
|
|
592
|
-
* mark reads off the warm near-black spine (#00b87c: 6.9:1 on --background, 6.3:1 on --card;
|
|
593
|
-
* the unlifted #009766 sat at 4.4:1 on the card). The on-fill glyph flips dark, exactly like
|
|
594
|
-
* --success-foreground does. */
|
|
595
|
-
--brand: 160.5 100% 36%; /* #00b87c */
|
|
321
|
+
--brand: 160.5 100% 36%;
|
|
596
322
|
--brand-foreground: 48 9% 9%;
|
|
597
323
|
|
|
598
|
-
/* Extended text hierarchy + interaction ramp (dark) */
|
|
599
324
|
--text-tertiary: 44 6% 56%;
|
|
600
325
|
--text-disabled: 45 6% 40%;
|
|
601
326
|
--text-link: 204 90% 66%;
|
|
602
327
|
--text-brand: 204 90% 66%;
|
|
603
|
-
|
|
604
|
-
--text-primary: 204 90% 64%;
|
|
328
|
+
|
|
329
|
+
--text-primary: 204 90% 64%;
|
|
605
330
|
--text-success: 146 55% 64%;
|
|
606
331
|
--text-warning: 44 95% 62%;
|
|
607
332
|
--text-info: 221 70% 72%;
|