@godxjp/ui 19.1.0 → 19.3.1
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 +20 -14
- package/dist/components/data-display/badge.js +18 -4
- 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 +55 -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 +36 -1
- package/dist/props/registry.js +45 -1
- 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 +19 -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 +12 -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 +283 -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 +160 -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 +188 -0
- package/docs/data-display/popover-touch.tsx +27 -0
- package/docs/data-display/popover.tsx +246 -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 +303 -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 +175 -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 +330 -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 +102 -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 +420 -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 +204 -0
- package/docs/foundation/density.tsx +232 -0
- package/docs/foundation/email-tokens.tsx +323 -0
- package/docs/foundation/radius-shadow.tsx +154 -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 +135 -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 +266 -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 +954 -0
- package/docs/layout/resizable-panel.tsx +419 -0
- package/docs/layout/responsive-grid.tsx +243 -0
- package/docs/layout/separator.tsx +327 -0
- package/docs/layout/service-role-panel.tsx +144 -0
- package/docs/layout/sidebar.tsx +609 -0
- package/docs/layout/split-pane.tsx +468 -0
- package/docs/layout/topbar.tsx +349 -0
- package/docs/navigation/app-setting-picker.tsx +142 -0
- package/docs/navigation/breadcrumb.tsx +135 -0
- package/docs/navigation/context-menu.tsx +123 -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 +158 -0
- package/docs/navigation/pagination.tsx +241 -0
- package/docs/navigation/steps.tsx +265 -0
- package/docs/navigation/tabs-rtl.tsx +28 -0
- package/docs/navigation/tabs.tsx +314 -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 +455 -0
- package/docs/showcase/acme-website.tsx +461 -0
- package/docs/showcase/case1-warehouse-dashboard.tsx +359 -0
- package/docs/showcase/case2-employee-me.tsx +444 -0
- package/docs/showcase/case3-approval-workflow.tsx +529 -0
- package/docs/showcase/case4-login.tsx +313 -0
- package/docs/showcase/case5-shift-calendar.tsx +795 -0
- package/docs/showcase/case6-agency-handy.tsx +1113 -0
- package/docs/showcase/futurelastic-web.tsx +392 -0
- package/docs/showcase/org-switcher.tsx +313 -0
- package/docs/showcase/permission-matrix.tsx +346 -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 +347 -0
- package/docs/showcase/table-expandable-rows.tsx +480 -0
- package/docs/showcase/table-filter-chips.tsx +456 -0
- package/docs/showcase/table-footer-totals.tsx +314 -0
- package/docs/showcase/table-grouped-subtotals.tsx +391 -0
- package/docs/showcase/table-master-detail.tsx +484 -0
- package/docs/showcase/table-pagination.tsx +327 -0
- package/docs/showcase/table-states.tsx +366 -0
- package/docs/showcase/table-sticky-columns.tsx +376 -0
- package/docs/showcase/table-tree-rows.tsx +444 -0
- package/docs/showcase/table-view-tabs.tsx +488 -0
- package/package.json +9 -12
- 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,21 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
* TABLE — cell padding + typography owned here (density-aware via --table-cell-* tokens).
|
|
3
|
-
*/
|
|
1
|
+
|
|
4
2
|
|
|
5
3
|
@layer components {
|
|
6
|
-
|
|
7
|
-
* font-size AND its line-height companion now live here (gh#319 — see
|
|
8
|
-
* tokens/components/table.css for why both are required). */
|
|
4
|
+
|
|
9
5
|
[data-slot="table"] {
|
|
10
6
|
font-size: var(--table-font-size);
|
|
11
7
|
line-height: var(--table-line-height);
|
|
12
8
|
}
|
|
13
9
|
|
|
14
|
-
/* Horizontal rules between rows, and the "last row draws no rule" idiom. Both must be in the
|
|
15
|
-
* SAME layer: while the row's rule was a `border-b` utility, no `components` selector could
|
|
16
|
-
* zero it on the last row however specific (the gh#412 layer contract), so the tbody had to
|
|
17
|
-
* carry an arbitrary-variant utility of its own. `[data-slot="table-body"] .ui-table-row`
|
|
18
|
-
* (0,2,0) beats `.ui-table-row` (0,1,0), so the last-row reset lands cleanly. */
|
|
19
10
|
.ui-table-row {
|
|
20
11
|
border-block-end-width: var(--table-row-border-width);
|
|
21
12
|
}
|
|
@@ -40,9 +31,6 @@
|
|
|
40
31
|
padding-inline-end: 0;
|
|
41
32
|
}
|
|
42
33
|
|
|
43
|
-
/* A column with an empty header (icon / action column) shouldn't paint the
|
|
44
|
-
* header band — keep its cell transparent so the empty header visually
|
|
45
|
-
* disappears instead of showing a blank grey block. */
|
|
46
34
|
[data-slot="table-head"][data-empty] {
|
|
47
35
|
background: transparent;
|
|
48
36
|
}
|
|
@@ -50,10 +38,7 @@
|
|
|
50
38
|
[data-slot="table-cell"] {
|
|
51
39
|
padding: var(--table-cell-padding-y) var(--table-cell-space-x);
|
|
52
40
|
vertical-align: middle;
|
|
53
|
-
|
|
54
|
-
* character per line. Keep each cell on one line; the scroll container
|
|
55
|
-
* (.ui-data-table-scroll, overflow-x:auto) scrolls instead. A column that
|
|
56
|
-
* genuinely needs wrapping opts in with `whitespace-normal` via col.width. */
|
|
41
|
+
|
|
57
42
|
white-space: nowrap;
|
|
58
43
|
}
|
|
59
44
|
|
|
@@ -69,7 +54,6 @@
|
|
|
69
54
|
gap: var(--space-inline-md);
|
|
70
55
|
}
|
|
71
56
|
|
|
72
|
-
/* Sortable header label is a real button (keyboard + aria-sort); inherits the cell's type. */
|
|
73
57
|
.ui-data-table-sort-button {
|
|
74
58
|
display: inline-flex;
|
|
75
59
|
align-items: center;
|
|
@@ -95,10 +79,6 @@
|
|
|
95
79
|
gap: var(--space-inline-sm);
|
|
96
80
|
}
|
|
97
81
|
|
|
98
|
-
/* The footer owns its own inset on BOTH axes (gh#236) — it is a self-contained slot that is
|
|
99
|
-
* usually dropped straight into a flush container, so relying on an ancestor for inline/block-end
|
|
100
|
-
* padding left the label and the page-size Select flush against the container edge and its
|
|
101
|
-
* closing border. Logical properties only (RTL-safe); both axes are tunable tokens (#45). */
|
|
102
82
|
.ui-data-table-pagination {
|
|
103
83
|
display: flex;
|
|
104
84
|
align-items: center;
|
|
@@ -108,8 +88,6 @@
|
|
|
108
88
|
padding-inline: var(--table-pagination-padding-x, var(--table-cell-space-x));
|
|
109
89
|
}
|
|
110
90
|
|
|
111
|
-
/* Numbered footer may wrap only between its two semantic groups. The supported JA/EN/VI locale
|
|
112
|
-
* label and select stay fully visible together (gh#184). */
|
|
113
91
|
.ui-data-table-pagination--numbered {
|
|
114
92
|
flex-wrap: wrap;
|
|
115
93
|
min-width: 0;
|
|
@@ -140,37 +118,22 @@
|
|
|
140
118
|
}
|
|
141
119
|
|
|
142
120
|
.ui-data-table-surface {
|
|
143
|
-
|
|
144
|
-
* border, but `hidden` makes this box a SCROLL CONTAINER, which silently
|
|
145
|
-
* captured the sticky context of `stickyHeader` (default true) and of the
|
|
146
|
-
* pinned columns — they anchored to a box that never scrolls, so the header
|
|
147
|
-
* scrolled away with the body inside `.ui-data-table-scroll`. `clip` is not
|
|
148
|
-
* a scroll container, so sticky binds to the real scroll region and works.
|
|
149
|
-
* Measured: hidden → thead moved 300px per 300px scrolled; clip → 1px. */
|
|
121
|
+
|
|
150
122
|
overflow: clip;
|
|
151
|
-
|
|
152
|
-
* rule #45). Cleared at the `sm` step below, and opted out of entirely by the collection
|
|
153
|
-
* preset, which owns its width through the column-priority measures. */
|
|
123
|
+
|
|
154
124
|
min-inline-size: var(--table-surface-min-inline-size);
|
|
155
125
|
border: 1px solid hsl(var(--border));
|
|
156
126
|
border-radius: var(--radius-md);
|
|
157
127
|
}
|
|
158
128
|
|
|
159
|
-
/* `preset="action-collection"` (gh#253) — the priority measures fit the table to its container at
|
|
160
|
-
* every width, so the desktop floor would re-introduce exactly the horizontal scroll the preset
|
|
161
|
-
* removes. Attribute-scoped: `preset="default"` emits NO attribute, so an untouched DataTable
|
|
162
|
-
* never matches this rule (the inert-default contract, gh#231). */
|
|
163
129
|
.ui-data-table-surface[data-preset="action-collection"] {
|
|
164
130
|
min-inline-size: 0;
|
|
165
131
|
}
|
|
166
132
|
|
|
167
|
-
/* Zebra striping (opt-in via the `striped` prop). Selected rows keep their
|
|
168
|
-
* own emphasis, so they are excluded from the stripe. */
|
|
169
133
|
.ui-data-table-surface[data-striped] tbody tr:nth-child(even):not([data-state="selected"]) {
|
|
170
134
|
background-color: var(--table-row-striped-background, hsl(var(--muted) / 0.4));
|
|
171
135
|
}
|
|
172
136
|
|
|
173
|
-
/* Empty-state cell hosts the built-in EmptyState (which brings its own padding). */
|
|
174
137
|
.ui-data-table-empty {
|
|
175
138
|
padding: 0;
|
|
176
139
|
}
|
|
@@ -190,44 +153,12 @@
|
|
|
190
153
|
gap: var(--space-inline-xs);
|
|
191
154
|
}
|
|
192
155
|
|
|
193
|
-
/* A centred header centres its LABEL, not its button.
|
|
194
|
-
*
|
|
195
|
-
* The sort chevron lives inside the label, so centring the button alone
|
|
196
|
-
* leaves the words half an icon to the left of the column they name —
|
|
197
|
-
* measured at 8px on a 12px icon, which is enough to read as a mistake in a
|
|
198
|
-
* row of headings.
|
|
199
|
-
*
|
|
200
|
-
* The fix is symmetry, not a counterweight. Reserving the chevron's width on
|
|
201
|
-
* BOTH sides and taking the chevron itself out of flow means the words are
|
|
202
|
-
* centred by construction — the label's own box is centred in the cell, and
|
|
203
|
-
* nothing inside it can shift them. A counterweight sitting in flow as a
|
|
204
|
-
* flex sibling was the first attempt and it holds only while there is room
|
|
205
|
-
* to spare: flex items shrink, so on a column narrow enough to squeeze them
|
|
206
|
-
* the balance collapses and the label slides back off centre. Measured at
|
|
207
|
-
* 8px on a 56px column, 0px on the wide ones — a bug that only appears in
|
|
208
|
-
* the narrow case is worse than one that appears everywhere.
|
|
209
|
-
*
|
|
210
|
-
* Only when the column asked to be centred: a start-aligned header wants the
|
|
211
|
-
* icon to follow the text with nothing before it. */
|
|
212
156
|
:is(th, td).text-center > .ui-data-table-sort-button > .ui-data-table-sort-label {
|
|
213
157
|
position: relative;
|
|
214
|
-
|
|
215
|
-
* chevron occupied when it was in flow, now reserved on each side. */
|
|
158
|
+
|
|
216
159
|
padding-inline: calc(0.75rem + var(--space-inline-xs));
|
|
217
160
|
}
|
|
218
161
|
|
|
219
|
-
/* Out of flow, in the inline-end reservation its own padding just made.
|
|
220
|
-
* Logical inset, so RTL puts it on the other side with the padding.
|
|
221
|
-
*
|
|
222
|
-
* `:last-child` and NOT `:not(:first-child)`. A string header renders as a
|
|
223
|
-
* text node, and `:first-child` counts only ELEMENTS — so with
|
|
224
|
-
* `[text, svg]` the chevron IS the first element child and the negation
|
|
225
|
-
* matched nothing at all. The label kept its symmetric padding, which
|
|
226
|
-
* centres the BOX, while the words inside it stayed 8px off exactly as
|
|
227
|
-
* before. Measured against the built stylesheet, not read: the rule was
|
|
228
|
-
* present in the CSS and inert in the DOM, which is why reading it proved
|
|
229
|
-
* nothing. `:last-child` holds for both shapes the label takes,
|
|
230
|
-
* `[text, svg]` and `[element, svg]`. */
|
|
231
162
|
:is(th, td).text-center > .ui-data-table-sort-button > .ui-data-table-sort-label > :last-child {
|
|
232
163
|
position: absolute;
|
|
233
164
|
inset-inline-end: 0;
|
|
@@ -242,11 +173,6 @@
|
|
|
242
173
|
padding-inline: var(--space-page-active-x);
|
|
243
174
|
}
|
|
244
175
|
|
|
245
|
-
/* Scroll-hint fade — a SCROLL affordance, so it only shows while the region
|
|
246
|
-
* actually overflows and is not scrolled to the inline-end. The component
|
|
247
|
-
* measures the scroll box and stamps `.ui-data-table-has-overflow-end`
|
|
248
|
-
* (gh#267 — the fade used to render unconditionally, washing out the last
|
|
249
|
-
* column of tables that never scroll). */
|
|
250
176
|
.ui-data-table-scroll::after {
|
|
251
177
|
content: "";
|
|
252
178
|
position: absolute;
|
|
@@ -270,12 +196,6 @@
|
|
|
270
196
|
padding-inline: 0;
|
|
271
197
|
}
|
|
272
198
|
|
|
273
|
-
/* Same reset, same reason, for a table sitting straight on a FLUSH page. The bleed above exists
|
|
274
|
-
* to cancel the page gutter so the scroll region reaches the page edges — but
|
|
275
|
-
* `.ui-page-container--flush .ui-page-body` zeroes that gutter, leaving nothing to bleed into.
|
|
276
|
-
* The -16px then escapes the page: nothing clips it, so the whole page gained 16px of
|
|
277
|
-
* horizontal scroll at 320/375/390 (WCAG 2.2 SC 1.4.10 Reflow). Scoped by child combinator so a
|
|
278
|
-
* table inside a Card keeps its own bleed — the card supplies the padding that one compensates. */
|
|
279
199
|
.ui-page-container--flush > .ui-page-body > .ui-data-table-root > .ui-data-table-scroll {
|
|
280
200
|
margin-inline: 0;
|
|
281
201
|
padding-inline: 0;
|
|
@@ -289,10 +209,6 @@
|
|
|
289
209
|
inset-inline-end: 0;
|
|
290
210
|
}
|
|
291
211
|
|
|
292
|
-
/* The flush frame contract lives in ONE place, next to `.ui-table-bordered` below — it has to
|
|
293
|
-
* cover BOTH full-bleed surfaces (`.ui-data-table-surface` and `<Table bordered>`) or the fix
|
|
294
|
-
* for one silently regresses the other (gh#305 → gh#306). */
|
|
295
|
-
|
|
296
212
|
@media (min-width: 640px) {
|
|
297
213
|
.ui-data-table-scroll {
|
|
298
214
|
margin-inline: 0;
|
|
@@ -303,19 +219,11 @@
|
|
|
303
219
|
inset-inline-end: 0;
|
|
304
220
|
}
|
|
305
221
|
|
|
306
|
-
/* From `sm` up the viewport is already wider than the floor, so it is released and the surface
|
|
307
|
-
* simply fills its container (this is the `sm:min-w-0` half of the old utility pair). */
|
|
308
222
|
.ui-data-table-surface {
|
|
309
223
|
min-inline-size: 0;
|
|
310
224
|
}
|
|
311
225
|
}
|
|
312
226
|
|
|
313
|
-
/* ── Pinned (sticky) inline-end column ────────────────────────────────
|
|
314
|
-
* The standard home for a row-actions column: it stays put while the rest
|
|
315
|
-
* of the table scrolls horizontally. The cell carries an opaque, state-aware
|
|
316
|
-
* background so scrolling cells don't bleed through, plus a token shadow that
|
|
317
|
-
* separates it from the body. When present, the scroll fade is hidden (the
|
|
318
|
-
* pin's own shadow is the affordance). RTL-correct via logical properties. */
|
|
319
227
|
.ui-data-table-has-pin-end::after {
|
|
320
228
|
display: none;
|
|
321
229
|
}
|
|
@@ -332,14 +240,10 @@
|
|
|
332
240
|
background-color: hsl(var(--secondary));
|
|
333
241
|
}
|
|
334
242
|
|
|
335
|
-
/* box-shadow has no logical offset — flip its inline direction by hand in RTL,
|
|
336
|
-
* where the pinned column sits on the visual left and the shadow points right. */
|
|
337
243
|
[dir="rtl"] .ui-data-table-pin-end {
|
|
338
244
|
box-shadow: 6px 0 6px -5px hsl(var(--foreground) / 0.12);
|
|
339
245
|
}
|
|
340
246
|
|
|
341
|
-
/* Mirror the row's hover / selected tint — a translucent muted wash layered
|
|
342
|
-
* over the opaque base, so the pinned cell matches the rest of its row. */
|
|
343
247
|
.ui-data-table-surface tbody tr:hover > .ui-data-table-pin-end {
|
|
344
248
|
background-image: linear-gradient(
|
|
345
249
|
var(--table-row-hover-background, hsl(var(--muted) / 0.5)),
|
|
@@ -354,11 +258,6 @@
|
|
|
354
258
|
);
|
|
355
259
|
}
|
|
356
260
|
|
|
357
|
-
/* `<Table bordered>` — the full cell grid (gh#274). Horizontal row rules already come from
|
|
358
|
-
* TableRow's own border; here we add the outer frame and the vertical rules between columns,
|
|
359
|
-
* so rowSpan/colSpan merged cells read as merged (a merged group cell floating in whitespace
|
|
360
|
-
* is unreadable). Colour resolves the --table-border-color token at the CALL SITE so a scoped
|
|
361
|
-
* theme override of --border reaches it. */
|
|
362
261
|
.ui-table-bordered {
|
|
363
262
|
border: 1px solid var(--table-border-color, hsl(var(--border)));
|
|
364
263
|
}
|
|
@@ -367,79 +266,25 @@
|
|
|
367
266
|
border-inline-end: 1px solid var(--table-border-color, hsl(var(--border)));
|
|
368
267
|
}
|
|
369
268
|
|
|
370
|
-
/* ── The flush full-bleed frame contract (gh#305 · gh#306) ────────────────────────────────
|
|
371
|
-
* A full-bleed surface inside `<CardContent flush>` already has the CARD's 1px frame around
|
|
372
|
-
* it, so its own outer frame doubles up as two nested rounded borders (measured on
|
|
373
|
-
* customer-inquiries detail: TABLE 1px inside the card's 1px, gh#305). Both full-bleed
|
|
374
|
-
* surfaces are covered by ONE rule: `.ui-data-table-surface` (the DataTable's own frame) and
|
|
375
|
-
* `.ui-table-bordered` (`<Table bordered>`). They used to be two rules a hundred lines apart
|
|
376
|
-
* and the gh#306 repair reached only the second — the canonical
|
|
377
|
-
* `<Card><CardContent flush><DataTable/></CardContent></Card>` kept a frameless surface, so
|
|
378
|
-
* the header still floated with no line under it (measured at HEAD: surface
|
|
379
|
-
* border-top-width 0px).
|
|
380
|
-
*
|
|
381
|
-
* ERASE, never repaint (rule #44). The earlier repair spelled this `border: 0` followed by a
|
|
382
|
-
* hard-coded `border-block-start: 1px solid …` — chrome painted unconditionally, which is the
|
|
383
|
-
* bug pattern the rule exists to forbid: it re-drew the line even where the card already had
|
|
384
|
-
* one (a banded header's own bottom border → a doubled 2px rule) and even where the card frame
|
|
385
|
-
* itself sits (a headerless card → a doubled top edge). Here only the WIDTH is zeroed, so the
|
|
386
|
-
* style and colour stay whatever the surface's own border declared, and the block-start edge is
|
|
387
|
-
* restored only where something actually needs separating.
|
|
388
|
-
*
|
|
389
|
-
* `.ui-skeleton-table` rides along in BOTH lists on purpose. It is the placeholder the real
|
|
390
|
-
* DataTable swaps for, and alert-layout.css says so in as many words ("mirrors
|
|
391
|
-
* `.ui-data-table-surface` … so the skeleton placeholder and the real DataTable it swaps for
|
|
392
|
-
* sit identically"). Give the surface a divider without giving the skeleton one and that
|
|
393
|
-
* promise breaks: a 1px line appears the instant the data lands. (alert-layout.css keeps its
|
|
394
|
-
* own copy of the erase half so Skeleton is still framed correctly for a consumer who imports
|
|
395
|
-
* it WITHOUT this layer.) */
|
|
396
269
|
[data-slot="card-content"][data-flush]
|
|
397
270
|
:is(.ui-data-table-surface, .ui-table-bordered, .ui-skeleton-table) {
|
|
398
271
|
border-width: 0;
|
|
399
272
|
border-radius: 0;
|
|
400
273
|
}
|
|
401
274
|
|
|
402
|
-
/* …restored ONLY when a plain CardHeader sits DIRECTLY above the flush body. That edge is the
|
|
403
|
-
* one place a flush surface's border does NOT coincide with something the card already draws:
|
|
404
|
-
* above it is the header's whitespace, not the card frame (gh#306, measured on a rental
|
|
405
|
-
* detail's 出荷伝票一覧 section). Adjacent-sibling, not `:has()` on the card, so the three
|
|
406
|
-
* counter-cases fall out by construction and need no extra rule: no header above → the card
|
|
407
|
-
* frame is the top edge; a BANDED header → its own `border-bottom` is the divider; a CardBar
|
|
408
|
-
* above → its own `border-block` is. Width comes from a token (rules #44/#45) whose default is
|
|
409
|
-
* the same hairline the surface itself draws, so a service quiets the divider once instead of
|
|
410
|
-
* forking this file. */
|
|
411
275
|
[data-slot="card-header"]:not([data-banded])
|
|
412
276
|
+ [data-slot="card-content"][data-flush]
|
|
413
277
|
:is(.ui-data-table-surface, .ui-table-bordered, .ui-skeleton-table) {
|
|
414
278
|
border-block-start-width: var(--table-flush-divider-width);
|
|
415
279
|
}
|
|
416
280
|
|
|
417
|
-
/* …and quieted again when a DataTable TOOLBAR sits between the header and the surface: the
|
|
418
|
-
* flush toolbar already draws that dividing line (see `.ui-data-table-toolbar` above), so the
|
|
419
|
-
* surface below it would stack a second hairline on top of it. Done by setting the token on the
|
|
420
|
-
* root rather than by another `border-*` rule, so it INHERITS down to whichever surface ends up
|
|
421
|
-
* under the toolbar and cannot get into a specificity race with the restore rule. */
|
|
422
281
|
[data-slot="card-content"][data-flush] .ui-data-table-root:has(.ui-data-table-toolbar) {
|
|
423
282
|
--table-flush-divider-width: 0px;
|
|
424
283
|
}
|
|
425
284
|
}
|
|
426
285
|
|
|
427
286
|
@layer components {
|
|
428
|
-
|
|
429
|
-
* The canonical dense approval / action queue: requester · target · reason · requested date ·
|
|
430
|
-
* row actions, all five discoverable in the initial 390px frame, WITHOUT a consumer width, a
|
|
431
|
-
* hidden column or a page-local breakpoint.
|
|
432
|
-
*
|
|
433
|
-
* It keeps the REAL table: no `display` change, no role rewriting, no card transformation — so
|
|
434
|
-
* `<table>/<thead>/<tr>/<th>/<td>` semantics, header association, `aria-sort` and screen-reader
|
|
435
|
-
* table navigation survive exactly as they are at 1440. What the preset replaces is the SIZING
|
|
436
|
-
* model: the desktop INTRINSIC column widths (a `white-space: nowrap` reason column is what
|
|
437
|
-
* makes a five-column queue 1511px wide and forces the horizontal scroll gh#253 reports) give
|
|
438
|
-
* way to `table-layout: fixed` plus token-owned column-PRIORITY measures, and cells wrap.
|
|
439
|
-
*
|
|
440
|
-
* The collapse step is measured against the TABLE'S OWN container, not the viewport (a table in
|
|
441
|
-
* a master rail must collapse before the page does), so it is a container query. Below the step
|
|
442
|
-
* only the MEASURES and the type/padding tier change — the structure is identical. */
|
|
287
|
+
|
|
443
288
|
.ui-table-collection {
|
|
444
289
|
container: ui-table-collection / inline-size;
|
|
445
290
|
}
|
|
@@ -450,24 +295,12 @@
|
|
|
450
295
|
}
|
|
451
296
|
|
|
452
297
|
.ui-table-collection :is([data-slot="table-head"], [data-slot="table-cell"]) {
|
|
453
|
-
|
|
454
|
-
* which is the free-text column — EXCEPT past the seven-column budget below the collapse
|
|
455
|
-
* step, where the `:has()` tier re-points the middle fallback at the flex floor (gh#262):
|
|
456
|
-
* the fixed algorithm hands an auto column 0px once the marked columns over-constrain the
|
|
457
|
-
* table, which is the one-character-per-line shredding this preset must never produce.
|
|
458
|
-
* There every column carries a rem floor-measure; once the floors outgrow the container the
|
|
459
|
-
* table's used width grows past its specified 100% (CSS 2.1 §17.5.2.1) and the DIRECT
|
|
460
|
-
* wrapper's keyboard-reachable overflow-x region scrolls — the SC 1.4.10-permitted
|
|
461
|
-
* one-dimensional scroll, instead of unreadable shredding (see tokens/components/table.css). */
|
|
298
|
+
|
|
462
299
|
inline-size: var(
|
|
463
300
|
--table-action-collection-column-width,
|
|
464
301
|
var(--table-action-collection-flex-width, auto)
|
|
465
302
|
);
|
|
466
|
-
|
|
467
|
-
* `word-break: keep-all`. Under `table-layout: fixed` a column cannot grow to fit an
|
|
468
|
-
* unbreakable CJK run, so keep-all would overflow/clip a long JA header instead of widening
|
|
469
|
-
* its column. With the floors guaranteeing a ~5-glyph measure, a wrapped JA header is two
|
|
470
|
-
* readable lines — never a vertical character column — and losing no text beats clipping. */
|
|
303
|
+
|
|
471
304
|
overflow-wrap: anywhere;
|
|
472
305
|
white-space: normal;
|
|
473
306
|
vertical-align: top;
|
|
@@ -492,62 +325,22 @@
|
|
|
492
325
|
}
|
|
493
326
|
|
|
494
327
|
@layer components {
|
|
495
|
-
|
|
496
|
-
* The canonical WIDE, heterogeneous record collection: a table whose column count/content
|
|
497
|
-
* cannot be squeezed into any fixed narrow-frame measure at all — an admin detail row with many
|
|
498
|
-
* disparate, free-text fields of unpredictable length, not a dense queue (contrast
|
|
499
|
-
* `action-collection` above, which keeps the real table and only re-sizes columns). Below
|
|
500
|
-
* `collapseBelow` the `<thead>` hides and every `<tr>` becomes a bordered key-value CARD: each
|
|
501
|
-
* `TableCell`'s own `label` (its column header text, carried per-cell since the `<th>`
|
|
502
|
-
* association is now hidden) renders inline above the value, taking over the accessible-name
|
|
503
|
-
* role. Above the step it is a byte-for-byte ordinary table. Measured against the TABLE'S OWN
|
|
504
|
-
* container, not the viewport, same as `action-collection`. */
|
|
328
|
+
|
|
505
329
|
.ui-table-stacked-collection {
|
|
506
330
|
container: ui-table-stacked-collection / inline-size;
|
|
507
331
|
}
|
|
508
332
|
|
|
509
|
-
/* Rendered into the DOM unconditionally so it exists for the container query below to reveal
|
|
510
|
-
* (see TableCell in table.tsx) but hidden above the collapse step, where the real `<th>` already
|
|
511
|
-
* carries the label — an ordinary table gains no visible extra markup. */
|
|
512
333
|
.ui-table-stacked-collection-label {
|
|
513
334
|
display: none;
|
|
514
335
|
}
|
|
515
336
|
}
|
|
516
337
|
|
|
517
|
-
/* The compact tier lives in `godxjp-ui-responsive` — the LAST layer, declared after Tailwind in
|
|
518
|
-
* styles/base.css — not in `@layer components`. The <table> USED to carry `text-sm`, a Tailwind
|
|
519
|
-
* utility, and `utilities` outranks `components` by LAYER ORDER, so a `font-size:` re-point
|
|
520
|
-
* written as a component rule could never apply however specific it was: that is exactly why
|
|
521
|
-
* `--table-action-collection-font-size-compact` was dead at every width (gh#412), leaving the
|
|
522
|
-
* narrow frame at 14px where a 5–6 character Japanese label overflows its column measure.
|
|
523
|
-
* gh#319 moved the base type off that utility and onto `[data-slot="table"]` above, but the
|
|
524
|
-
* compact tier STAYS here: a CONSUMER's own `text-*` utility on the table would otherwise
|
|
525
|
-
* half-collapse it, and this keeps the whole tier — type AND column measures — decided in ONE
|
|
526
|
-
* place. See styles/base.css · THE LAYER CONTRACT. */
|
|
527
338
|
@layer components {
|
|
528
|
-
|
|
529
|
-
*
|
|
530
|
-
* These belong in `components`, not in the responsive layer above: an append placed them there
|
|
531
|
-
* by mistake (it targeted the file's last `}`, which closes the layer, not the layer's own end)
|
|
532
|
-
* and `table-action-collection.test.tsx` catches exactly that — the responsive layer is
|
|
533
|
-
* reserved for media-queried rules.
|
|
534
|
-
*
|
|
535
|
-
* Four of them are scoped through `.ui-data-table-root` rather than left bare, because the last
|
|
536
|
-
* layer was doing work for them: the icon rules sit on svgs inside real <Button>s where
|
|
537
|
-
* `.ui-button svg` (0,1,1) outranks a bare class, and the skeleton chip's radius competes with
|
|
538
|
-
* `.ui-skeleton-block` from the later-imported alert-layout.css. Demoting them without raising
|
|
539
|
-
* specificity would have shrunk the toolbar/pagination glyphs and re-rounded the chips. */
|
|
540
|
-
|
|
541
|
-
/* DATA TABLE — the pieces around the already-tokenized cell rhythm (#319). */
|
|
542
|
-
|
|
543
|
-
/* The select column holds only a checkbox, so it takes a fixed narrow width rather than a
|
|
544
|
-
* share of the flexible content columns. */
|
|
339
|
+
|
|
545
340
|
.ui-data-table-select-column {
|
|
546
341
|
inline-size: var(--table-select-column-width);
|
|
547
342
|
}
|
|
548
343
|
|
|
549
|
-
/* A sticky header floats over the scrolled rows, so it joins the one system overlay layer
|
|
550
|
-
* rather than carrying a private z-index that a portaled surface could out-rank. */
|
|
551
344
|
.ui-data-table-sticky-header {
|
|
552
345
|
position: sticky;
|
|
553
346
|
inset-block-start: 0;
|
|
@@ -575,7 +368,6 @@
|
|
|
575
368
|
color: hsl(var(--muted-foreground));
|
|
576
369
|
}
|
|
577
370
|
|
|
578
|
-
/* Skeletons mimic the real content: a checkbox square and a text line at cap height. */
|
|
579
371
|
.ui-data-table-root .ui-data-table-skeleton-check {
|
|
580
372
|
inline-size: var(--table-skeleton-check-size);
|
|
581
373
|
block-size: var(--table-skeleton-check-size);
|
|
@@ -592,10 +384,7 @@
|
|
|
592
384
|
}
|
|
593
385
|
|
|
594
386
|
@layer godxjp-ui-responsive {
|
|
595
|
-
|
|
596
|
-
* density with them); nothing else moves. One block per canonical step — a media/container
|
|
597
|
-
* query cannot read a `var()`, so the tokenized scale is written out (sm 40rem · md 48rem ·
|
|
598
|
-
* lg 64rem · xl 80rem, the same steps as `--master-detail-collapse-below`). */
|
|
387
|
+
|
|
599
388
|
@container ui-table-collection (width < 40rem) {
|
|
600
389
|
[data-collapse-below="sm"] [data-slot="table"] {
|
|
601
390
|
--table-action-collection-primary-width: var(--table-action-collection-primary-width-compact);
|
|
@@ -608,24 +397,14 @@
|
|
|
608
397
|
--table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
|
|
609
398
|
--table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
|
|
610
399
|
font-size: var(--table-action-collection-font-size-compact);
|
|
611
|
-
|
|
612
|
-
* before; a consumer whose column count exceeds the priority budget raises it and the
|
|
613
|
-
* surrounding scroll region takes the overflow instead of the cells. */
|
|
400
|
+
|
|
614
401
|
min-inline-size: var(--table-action-collection-min-inline-size-compact);
|
|
615
402
|
}
|
|
616
403
|
|
|
617
|
-
/* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
|
|
618
|
-
* compact measure — inside a collapsed action cell everything wraps. */
|
|
619
404
|
[data-collapse-below="sm"] [data-slot="table-cell"] * {
|
|
620
405
|
white-space: normal;
|
|
621
406
|
}
|
|
622
407
|
|
|
623
|
-
/* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
|
|
624
|
-
* guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
|
|
625
|
-
* columns, so every column (the unmarked free-text one included) takes its rem floor
|
|
626
|
-
* instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
|
|
627
|
-
* columns this rule never matches and the percent tier above keeps the canonical queues
|
|
628
|
-
* scroll-free — the preset's documented column-count ceiling. */
|
|
629
408
|
[data-collapse-below="sm"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
|
|
630
409
|
--table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
|
|
631
410
|
--table-action-collection-secondary-width: var(
|
|
@@ -648,24 +427,14 @@
|
|
|
648
427
|
--table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
|
|
649
428
|
--table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
|
|
650
429
|
font-size: var(--table-action-collection-font-size-compact);
|
|
651
|
-
|
|
652
|
-
* before; a consumer whose column count exceeds the priority budget raises it and the
|
|
653
|
-
* surrounding scroll region takes the overflow instead of the cells. */
|
|
430
|
+
|
|
654
431
|
min-inline-size: var(--table-action-collection-min-inline-size-compact);
|
|
655
432
|
}
|
|
656
433
|
|
|
657
|
-
/* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
|
|
658
|
-
* compact measure — inside a collapsed action cell everything wraps. */
|
|
659
434
|
[data-collapse-below="md"] [data-slot="table-cell"] * {
|
|
660
435
|
white-space: normal;
|
|
661
436
|
}
|
|
662
437
|
|
|
663
|
-
/* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
|
|
664
|
-
* guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
|
|
665
|
-
* columns, so every column (the unmarked free-text one included) takes its rem floor
|
|
666
|
-
* instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
|
|
667
|
-
* columns this rule never matches and the percent tier above keeps the canonical queues
|
|
668
|
-
* scroll-free — the preset's documented column-count ceiling. */
|
|
669
438
|
[data-collapse-below="md"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
|
|
670
439
|
--table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
|
|
671
440
|
--table-action-collection-secondary-width: var(
|
|
@@ -688,24 +457,14 @@
|
|
|
688
457
|
--table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
|
|
689
458
|
--table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
|
|
690
459
|
font-size: var(--table-action-collection-font-size-compact);
|
|
691
|
-
|
|
692
|
-
* before; a consumer whose column count exceeds the priority budget raises it and the
|
|
693
|
-
* surrounding scroll region takes the overflow instead of the cells. */
|
|
460
|
+
|
|
694
461
|
min-inline-size: var(--table-action-collection-min-inline-size-compact);
|
|
695
462
|
}
|
|
696
463
|
|
|
697
|
-
/* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
|
|
698
|
-
* compact measure — inside a collapsed action cell everything wraps. */
|
|
699
464
|
[data-collapse-below="lg"] [data-slot="table-cell"] * {
|
|
700
465
|
white-space: normal;
|
|
701
466
|
}
|
|
702
467
|
|
|
703
|
-
/* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
|
|
704
|
-
* guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
|
|
705
|
-
* columns, so every column (the unmarked free-text one included) takes its rem floor
|
|
706
|
-
* instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
|
|
707
|
-
* columns this rule never matches and the percent tier above keeps the canonical queues
|
|
708
|
-
* scroll-free — the preset's documented column-count ceiling. */
|
|
709
468
|
[data-collapse-below="lg"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
|
|
710
469
|
--table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
|
|
711
470
|
--table-action-collection-secondary-width: var(
|
|
@@ -728,24 +487,14 @@
|
|
|
728
487
|
--table-cell-space-x: var(--table-action-collection-cell-space-x-compact);
|
|
729
488
|
--table-cell-padding-y: var(--table-action-collection-cell-padding-y-compact);
|
|
730
489
|
font-size: var(--table-action-collection-font-size-compact);
|
|
731
|
-
|
|
732
|
-
* before; a consumer whose column count exceeds the priority budget raises it and the
|
|
733
|
-
* surrounding scroll region takes the overflow instead of the cells. */
|
|
490
|
+
|
|
734
491
|
min-inline-size: var(--table-action-collection-min-inline-size-compact);
|
|
735
492
|
}
|
|
736
493
|
|
|
737
|
-
/* A nowrap child (a Badge pill, a chip) would otherwise bleed into the next column at the
|
|
738
|
-
* compact measure — inside a collapsed action cell everything wraps. */
|
|
739
494
|
[data-collapse-below="xl"] [data-slot="table-cell"] * {
|
|
740
495
|
white-space: normal;
|
|
741
496
|
}
|
|
742
497
|
|
|
743
|
-
/* SEVEN columns and up — the wide-collection floor tier (gh#262). Percent shares are
|
|
744
|
-
* guaranteed to sum past 100% here and fixed layout would normalize them into sub-glyph
|
|
745
|
-
* columns, so every column (the unmarked free-text one included) takes its rem floor
|
|
746
|
-
* instead; the over-constrained table grows past 100% and its wrapper scrolls. Up to six
|
|
747
|
-
* columns this rule never matches and the percent tier above keeps the canonical queues
|
|
748
|
-
* scroll-free — the preset's documented column-count ceiling. */
|
|
749
498
|
[data-collapse-below="xl"] [data-slot="table"]:has([data-slot="table-head"]:nth-child(7)) {
|
|
750
499
|
--table-action-collection-primary-width: var(--table-action-collection-primary-width-floor);
|
|
751
500
|
--table-action-collection-secondary-width: var(
|
|
@@ -756,13 +505,6 @@
|
|
|
756
505
|
}
|
|
757
506
|
}
|
|
758
507
|
|
|
759
|
-
/* ── `preset="stacked-record-collection"` (gh#293 restore — SCR-215) ────────────────────────
|
|
760
|
-
* Below the step the `<thead>` hides and each `<tr>` becomes a bordered key-value card. This is
|
|
761
|
-
* a genuine layout-mode swap (`display: block`) rather than a measure re-point, because the
|
|
762
|
-
* whole point of this preset is fields too heterogeneous for ANY fixed column measure to hold —
|
|
763
|
-
* unlike `action-collection`'s fixed-layout column budget above. Above the step, none of this
|
|
764
|
-
* matches and the table renders exactly as an ordinary `<table>`. One block per canonical step,
|
|
765
|
-
* same sm/md/lg/xl scale as `action-collection`. */
|
|
766
508
|
@container ui-table-stacked-collection (width < 40rem) {
|
|
767
509
|
[data-collapse-below="sm"] [data-slot="table"] {
|
|
768
510
|
display: block;
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
* TEXT / HEADING — typographic primitives (@godxjp/ui).
|
|
3
|
-
* Token-driven ONLY: size = golden-ratio type scale, weight = the 2-weight system (400/500),
|
|
4
|
-
* tone = semantic foreground tokens. No arbitrary px, no font-semibold=600. Components emit
|
|
5
|
-
* data-slot + data-* flags; all styling lives here.
|
|
6
|
-
*/
|
|
1
|
+
|
|
7
2
|
|
|
8
3
|
@layer components {
|
|
9
4
|
.ui-text {
|
|
10
5
|
margin: 0;
|
|
11
6
|
}
|
|
12
7
|
|
|
13
|
-
/* Size — steps of the golden-ratio scale (sm = base). */
|
|
14
8
|
[data-slot="text"][data-size="2xs"] {
|
|
15
9
|
font-size: var(--font-size-2xs);
|
|
16
10
|
}
|
|
@@ -33,9 +27,6 @@
|
|
|
33
27
|
font-size: var(--font-size-2xl);
|
|
34
28
|
}
|
|
35
29
|
|
|
36
|
-
/* Weight — the reference-design canon (400 body · 500 heading/label · 700 emphasis). No 600.
|
|
37
|
-
* Shared by text + heading; the two-attribute heading selectors outrank the base heading
|
|
38
|
-
* rule below, so `<Heading weight="bold">` renders a semantic, emphasised title. */
|
|
39
30
|
[data-slot="text"][data-weight="regular"],
|
|
40
31
|
[data-slot="heading"][data-weight="regular"] {
|
|
41
32
|
font-weight: var(--font-weight-normal);
|
|
@@ -44,18 +35,21 @@
|
|
|
44
35
|
[data-slot="heading"][data-weight="medium"] {
|
|
45
36
|
font-weight: var(--font-weight-medium);
|
|
46
37
|
}
|
|
38
|
+
[data-slot="text"][data-weight="semibold"],
|
|
39
|
+
[data-slot="heading"][data-weight="semibold"] {
|
|
40
|
+
font-weight: var(--font-weight-semibold);
|
|
41
|
+
}
|
|
42
|
+
|
|
47
43
|
[data-slot="text"][data-weight="bold"],
|
|
48
44
|
[data-slot="heading"][data-weight="bold"] {
|
|
49
45
|
font-weight: var(--font-weight-bold);
|
|
50
46
|
}
|
|
51
47
|
|
|
52
|
-
/* code / kbd render monospace by default (the natural expectation for `as="code"`). */
|
|
53
48
|
code[data-slot="text"],
|
|
54
49
|
kbd[data-slot="text"] {
|
|
55
50
|
font-family: var(--font-family-mono, ui-monospace, "SFMono-Regular", monospace);
|
|
56
51
|
}
|
|
57
52
|
|
|
58
|
-
/* Tone + Heading tone — semantic foreground tokens. */
|
|
59
53
|
[data-slot="text"][data-tone="default"],
|
|
60
54
|
[data-slot="heading"][data-tone="default"] {
|
|
61
55
|
color: hsl(var(--foreground));
|
|
@@ -85,7 +79,6 @@
|
|
|
85
79
|
color: hsl(var(--info));
|
|
86
80
|
}
|
|
87
81
|
|
|
88
|
-
/* Alignment (logical), truncate, tabular, mono — shared by text + heading. */
|
|
89
82
|
[data-slot="text"][data-align="start"],
|
|
90
83
|
[data-slot="heading"][data-align="start"] {
|
|
91
84
|
text-align: start;
|
|
@@ -103,21 +96,15 @@
|
|
|
103
96
|
overflow: hidden;
|
|
104
97
|
text-overflow: ellipsis;
|
|
105
98
|
white-space: nowrap;
|
|
106
|
-
/* min-width:0 lets a truncating Text shrink inside a flex row WITHOUT the consumer
|
|
107
|
-
* having to add `min-w-0` — the documented flex-truncate idiom (issue #114). */
|
|
108
99
|
min-width: 0;
|
|
109
100
|
}
|
|
110
|
-
|
|
111
|
-
* write a page-local `line-clamp-N` utility. Visual-only: the full text stays in the DOM and
|
|
112
|
-
* the accessible name. `--text-clamp` is set inline by the component from the prop value. */
|
|
101
|
+
|
|
113
102
|
[data-slot="text"][data-clamp] {
|
|
114
103
|
display: -webkit-box;
|
|
115
104
|
-webkit-box-orient: vertical;
|
|
116
105
|
-webkit-line-clamp: var(--text-clamp, 2);
|
|
117
106
|
line-clamp: var(--text-clamp, 2);
|
|
118
107
|
overflow: hidden;
|
|
119
|
-
/* Same flex-shrink contract as truncate (issue #114): clamps inside a flex row without
|
|
120
|
-
* the consumer adding `min-w-0`. */
|
|
121
108
|
min-width: 0;
|
|
122
109
|
}
|
|
123
110
|
[data-slot="text"][data-tabular] {
|
|
@@ -127,7 +114,6 @@
|
|
|
127
114
|
font-family: var(--font-family-mono, ui-monospace, "SFMono-Regular", monospace);
|
|
128
115
|
}
|
|
129
116
|
|
|
130
|
-
/* Heading — sized from the --heading-h* tokens, medium weight, tight rhythm. */
|
|
131
117
|
[data-slot="heading"] {
|
|
132
118
|
margin: 0;
|
|
133
119
|
font-weight: var(--font-weight-medium);
|