@eifi1/ui-kit 0.54.0 → 0.55.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 +90 -76
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +2 -2
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js +2 -2
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +3 -1
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +13 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +23 -2
- package/dist/components/modal.js +24 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +1 -10
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +75 -3
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +92 -4
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +71 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +72 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +74 -3
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +74 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +71 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +29 -3
- package/dist/lib/dates.js +41 -12
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -342
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -439
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -816
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -600
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -188
- package/src/components/currency-select.tsx +0 -343
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -987
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -289
- package/src/components/data-table-filters.ts +0 -315
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -284
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -792
- package/src/components/modal.tsx +0 -534
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -559
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -754
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -90
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -11
- package/src/feedback/feedback-context.tsx +0 -245
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-diagnostics.tsx +0 -41
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -452
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -428
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -31
- package/src/feedback/feedback-row-detail.tsx +0 -871
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -131
- package/src/feedback/feedback-submit.tsx +0 -270
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -212
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2059
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1999
- package/src/i18n/locales/fr.ts +0 -2037
- package/src/i18n/locales/hu.ts +0 -2004
- package/src/i18n/locales/it.ts +0 -2014
- package/src/i18n/locales/zh.ts +0 -1912
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1191
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -288
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -585
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -27
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -769
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
package/src/components/table.tsx
DELETED
|
@@ -1,647 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Children,
|
|
3
|
-
createContext,
|
|
4
|
-
useCallback,
|
|
5
|
-
useContext,
|
|
6
|
-
useId,
|
|
7
|
-
useLayoutEffect,
|
|
8
|
-
useMemo,
|
|
9
|
-
useRef,
|
|
10
|
-
useState,
|
|
11
|
-
} from "react";
|
|
12
|
-
import type { ComponentPropsWithRef, ReactNode, Ref } from "react";
|
|
13
|
-
import { cn } from "../lib/cn";
|
|
14
|
-
import { useEdgeFade } from "../lib/strip-fade";
|
|
15
|
-
import { assignRef } from "./field-parts";
|
|
16
|
-
import { THIN_SCROLLBAR_CLASS, useScrollOverflow } from "./scroll-area";
|
|
17
|
-
|
|
18
|
-
/** `none` (0.10.0): no cell padding at all — keksdose's VAT summary, a table set
|
|
19
|
-
* inside a card's own padding whose columns are spaced by hand (`pl-2` on exactly the
|
|
20
|
-
* columns that need it). Type stays at the body size, as `comfortable`. */
|
|
21
|
-
export type TableDensity = "comfortable" | "compact" | "none";
|
|
22
|
-
/** CSS `table-layout`. `auto` (the browser default) sizes columns to their content;
|
|
23
|
-
* `fixed` takes widths from the first row and ignores the rest — keksdose's VAT
|
|
24
|
-
* summary switches to it while editing so two inputs stop bidding against the
|
|
25
|
-
* figures for room. */
|
|
26
|
-
export type TableLayout = "auto" | "fixed";
|
|
27
|
-
export type TableAlign = "start" | "center" | "end";
|
|
28
|
-
/**
|
|
29
|
-
* Vertical alignment of a cell's content (0.11.0). The defaults stay as they were — a
|
|
30
|
-
* head cell sits on the `bottom` (a wrapped heading ends on the line above the
|
|
31
|
-
* figures), a body cell at the `top` (a wrapped note starts level with its row). A
|
|
32
|
-
* table whose cells are INPUTS wants `middle`: keksdose's VAT summary
|
|
33
|
-
* (invoices/vat-summary.tsx) sets fields beside derived read-out figures in one row,
|
|
34
|
-
* and a figure at the top of its cell sat above the middle of the field next to it —
|
|
35
|
-
* so it writes `<tr className="align-middle">` over raw `<th>`/`<td>`, because the
|
|
36
|
-
* kit's cells each stated `align-top` and a class on the row could not reach them.
|
|
37
|
-
*/
|
|
38
|
-
export type TableVAlign = "top" | "middle" | "bottom";
|
|
39
|
-
/** The head cell's type size: `xs` (the head's default) or `sm` (the body's). */
|
|
40
|
-
export type TableHeaderCellSize = "xs" | "sm";
|
|
41
|
-
/** The header cell's weight. Default `medium`. */
|
|
42
|
-
export type TableHeaderCellWeight = "normal" | "medium" | "semibold";
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* What a {@link TableRow} is in a statement-style table (0.12.0): an ordinary `row`, a
|
|
46
|
-
* `group` heading ("Current assets", a tinted full-width label row), a `subtotal` under
|
|
47
|
-
* a group, or the `total` of the whole table. kastlan's balance sheet, income statement
|
|
48
|
-
* and journal entry each spelled these as `className="font-medium"`, `"font-bold
|
|
49
|
-
* border-t-2"` and `bg-muted/50` on the cell — three pages, three sets of classes for
|
|
50
|
-
* the same four kinds of line.
|
|
51
|
-
*/
|
|
52
|
-
export type TableRowVariant = "row" | "group" | "subtotal" | "total";
|
|
53
|
-
|
|
54
|
-
interface TableContextValue {
|
|
55
|
-
density: TableDensity;
|
|
56
|
-
zebra: boolean;
|
|
57
|
-
hover: boolean;
|
|
58
|
-
rowDividers: boolean;
|
|
59
|
-
captionId: string;
|
|
60
|
-
registerCaption: () => () => void;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const TableContext = createContext<TableContextValue>({
|
|
64
|
-
density: "comfortable",
|
|
65
|
-
zebra: false,
|
|
66
|
-
hover: false,
|
|
67
|
-
rowDividers: true,
|
|
68
|
-
captionId: "",
|
|
69
|
-
registerCaption: () => () => {},
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
type TableSection = "head" | "body" | "foot";
|
|
73
|
-
|
|
74
|
-
/** Which section a row sits in — zebra and hover apply to body rows only. `undefined`
|
|
75
|
-
* outside the kit's section parts: a raw `<thead>` / `<tbody>`, which
|
|
76
|
-
* {@link useSection} then reads off the DOM. */
|
|
77
|
-
const SectionContext = createContext<TableSection | undefined>(undefined);
|
|
78
|
-
|
|
79
|
-
const SECTION_OF_TAG: Record<string, TableSection> = { THEAD: "head", TBODY: "body", TFOOT: "foot" };
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* The section a row or cell sits in: the kit part's context where there is one, else the
|
|
83
|
-
* nearest `<thead>` / `<tbody>` / `<tfoot>` in the DOM.
|
|
84
|
-
*
|
|
85
|
-
* keksdose's VAT summary writes a raw `<thead>` round kit cells in places, and a
|
|
86
|
-
* `TableHeaderCell` there took itself for a BODY cell — `scope="row"`, body type — with
|
|
87
|
-
* nothing on the page to say why. React cannot see an ancestor's tag, so the fallback
|
|
88
|
-
* reads it after mount; a layout effect, so the corrected cell is what gets painted.
|
|
89
|
-
*/
|
|
90
|
-
function useSection<E extends HTMLElement>(): [TableSection, ((el: E | null) => void) | undefined] {
|
|
91
|
-
const fromContext = useContext(SectionContext);
|
|
92
|
-
const [node, setNode] = useState<E | null>(null);
|
|
93
|
-
const [detected, setDetected] = useState<TableSection | undefined>(undefined);
|
|
94
|
-
useLayoutEffect(() => {
|
|
95
|
-
if (fromContext !== undefined || !node) return;
|
|
96
|
-
const section = node.closest("thead, tbody, tfoot");
|
|
97
|
-
const found = section ? SECTION_OF_TAG[section.tagName] : undefined;
|
|
98
|
-
// eslint-disable-next-line react-hooks/set-state-in-effect -- read off the DOM, which only exists after mount
|
|
99
|
-
if (found !== detected) setDetected(found);
|
|
100
|
-
}, [fromContext, node, detected]);
|
|
101
|
-
// No ref at all under a kit section: holding the node would cost every row and cell
|
|
102
|
-
// a second render on mount for an answer the context already gave.
|
|
103
|
-
return [fromContext ?? detected ?? "body", fromContext === undefined ? setNode : undefined];
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* One callback ref for the caller's `ref` and the part's own (0.16.0). Every part takes
|
|
108
|
-
* a `ref` to its DOM element — React 19 hands it to a function component as a prop —
|
|
109
|
-
* and the parts that hold the node themselves (the table, a row or a head cell reading
|
|
110
|
-
* its section off the DOM) must still get it when the caller passes one too.
|
|
111
|
-
*/
|
|
112
|
-
function useMergedRef<E>(own: ((el: E | null) => void) | { current: E | null } | undefined, ref: Ref<E> | undefined) {
|
|
113
|
-
return useCallback(
|
|
114
|
-
(node: E | null) => {
|
|
115
|
-
assignRef(own as Ref<E> | undefined, node);
|
|
116
|
-
assignRef(ref, node);
|
|
117
|
-
},
|
|
118
|
-
[own, ref],
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** A {@link TableRow}'s `valign`, which its cells take unless they set their own. It
|
|
123
|
-
* cannot be left to CSS inheritance: every cell states its own default alignment,
|
|
124
|
-
* and a class on the cell beats one on the row. */
|
|
125
|
-
const RowVAlignContext = createContext<TableVAlign | undefined>(undefined);
|
|
126
|
-
|
|
127
|
-
const VALIGN: Record<TableVAlign, string> = {
|
|
128
|
-
top: "align-top",
|
|
129
|
-
middle: "align-middle",
|
|
130
|
-
bottom: "align-bottom",
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const HEADER_SIZE: Record<TableHeaderCellSize, string> = {
|
|
134
|
-
xs: "text-xs",
|
|
135
|
-
sm: "text-sm",
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
const HEADER_WEIGHT: Record<TableHeaderCellWeight, string> = {
|
|
139
|
-
normal: "font-normal",
|
|
140
|
-
medium: "font-medium",
|
|
141
|
-
semibold: "font-semibold",
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
const CELL_PAD: Record<TableDensity, string> = {
|
|
145
|
-
comfortable: "px-3 py-2",
|
|
146
|
-
compact: "px-2 py-1",
|
|
147
|
-
none: "p-0",
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
const ALIGN: Record<TableAlign, string> = {
|
|
151
|
-
start: "text-start",
|
|
152
|
-
center: "text-center",
|
|
153
|
-
end: "text-end",
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* The alignment a figure column wants: end-aligned (so the units line up under each
|
|
158
|
-
* other in either reading direction) with tabular digits (so they line up at all).
|
|
159
|
-
* Exported for a cell the kit did not render — a DataTable column, a `<td>` of the
|
|
160
|
-
* app's own.
|
|
161
|
-
*/
|
|
162
|
-
export const NUMERIC_CELL_CLASS = "text-end tabular-nums";
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Every part's props are `ComponentPropsWithRef` (0.16.0), so `ref` reaches the DOM
|
|
166
|
-
* element: keksdose scrolled a budget row into view through `useId` + `getElementById`
|
|
167
|
-
* because `<TableRow ref>` did not type-check.
|
|
168
|
-
*/
|
|
169
|
-
export interface TableProps extends ComponentPropsWithRef<"table"> {
|
|
170
|
-
/** `compact` for a dense detail view (a ledger, a spec sheet). */
|
|
171
|
-
density?: TableDensity;
|
|
172
|
-
/** Tint every other body row. */
|
|
173
|
-
zebra?: boolean;
|
|
174
|
-
/** Tint the body row under the pointer. Off by default: a static table whose rows
|
|
175
|
-
* light up promises a click that does nothing. With `zebra`, a tinted row hovers to
|
|
176
|
-
* the card colour (0.33): the hover tint is too close to the well. */
|
|
177
|
-
hover?: boolean;
|
|
178
|
-
/** Classes for the overflow wrapper around the `<table>` (a max-height, a border). */
|
|
179
|
-
wrapperClassName?: string;
|
|
180
|
-
/** See {@link TableLayout}. Unset leaves the browser's `auto` and adds no class. */
|
|
181
|
-
layout?: TableLayout;
|
|
182
|
-
/**
|
|
183
|
-
* A rounded border round the whole table (0.12.0) — for a table standing on the page
|
|
184
|
-
* or in a dialog rather than inside a card. kastlan wraps six of them in
|
|
185
|
-
* `<div className="rounded-md border">` by hand (payment allocation, the new-budget
|
|
186
|
-
* lines, the meter readings, the deposit transactions, the unit values editor, the
|
|
187
|
-
* maintenance detail), and a hand-made frame outside the scroll wrapper does not clip
|
|
188
|
-
* the rows' tint to its corners.
|
|
189
|
-
*/
|
|
190
|
-
framed?: boolean;
|
|
191
|
-
/**
|
|
192
|
-
* The rule between body rows. Default true. `false` for a small table whose rows are
|
|
193
|
-
* spaced by their own content — keksdose's VAT summary, a block of three quiet
|
|
194
|
-
* columns inside a card — which otherwise had to drop to raw `<tr>`s to lose it. One
|
|
195
|
-
* row can still say otherwise with {@link TableRowProps.bordered}.
|
|
196
|
-
*/
|
|
197
|
-
rowDividers?: boolean;
|
|
198
|
-
/**
|
|
199
|
-
* `"phone"`: below `sm` each body row becomes a block — its first cell the row's
|
|
200
|
-
* title, every further cell under its column's header as a small label — and the
|
|
201
|
-
* head row is visually hidden (still read by screen readers). For tables of PROSE,
|
|
202
|
-
* not figures (lenkbank L5: a PID-terms table of three sentence columns wrapped into
|
|
203
|
-
* two-word slivers at 390px and ran its third column off the screen). A table of
|
|
204
|
-
* numbers should keep scrolling sideways, which is why this is opt-in. The labels
|
|
205
|
-
* are the head row's cell texts, read from the DOM; a body cell spanning several
|
|
206
|
-
* columns gets none.
|
|
207
|
-
*/
|
|
208
|
-
stack?: "phone";
|
|
209
|
-
/**
|
|
210
|
-
* Fade out an edge of the scroll wrapper while columns are hidden behind it (0.25).
|
|
211
|
-
*
|
|
212
|
-
* A table wider than its box scrolls sideways inside the wrapper, and on a phone —
|
|
213
|
-
* whose scrollbars are overlays that show only while you drag — nothing said there
|
|
214
|
-
* was more: the last visible column simply ended at the edge, often mid-word. 0.24
|
|
215
|
-
* drew a fade for ColumnRoleTable's preview (Kurvenschmiede: the fourth column's
|
|
216
|
-
* role select sat off-screen with no hint) by wrapping this Table and reaching its
|
|
217
|
-
* wrapper as the `<table>`'s `parentElement`; this is that fade as the Table's own,
|
|
218
|
-
* so a table needs neither the reach-around nor a box of its own round it.
|
|
219
|
-
*
|
|
220
|
-
* It is the kit Tabs strip's fade, MEASURED rather than assumed: nothing is drawn
|
|
221
|
-
* while the table fits, so a table that fits paints exactly as without the prop;
|
|
222
|
-
* the end with columns behind it fades, and both ends once scrolled into the
|
|
223
|
-
* middle; the ends are the reading direction's, so in RTL the hidden columns fade
|
|
224
|
-
* on the left. It is a `mask-image` — no layout change, no background colour to
|
|
225
|
-
* fade to, so it works on any surface in either theme — and never animated, so
|
|
226
|
-
* there is nothing for reduced motion to turn off. The wrapper's own scrollbars
|
|
227
|
-
* stay out of it (a fade on a classic scrollbar hid the very thing that says the
|
|
228
|
-
* box scrolls).
|
|
229
|
-
*
|
|
230
|
-
* Focus that lands in a cell behind the fade — a link, a select, a checkbox — is
|
|
231
|
-
* scrolled clear of it, cell and all where the cell fits; the browser's own scroll
|
|
232
|
-
* stops at the edge, under the fade. And while the overflowing wrapper ITSELF holds
|
|
233
|
-
* keyboard focus (it is a tab stop then, for arrow-key scrolling) the fade lifts, so
|
|
234
|
-
* the focus outline round the box is drawn whole rather than faded out at its sides.
|
|
235
|
-
*
|
|
236
|
-
* The wrapper carries `data-overflow` — `"start"`, `"end"` or `"both"`, in
|
|
237
|
-
* reading-direction terms, absent while it fits — for a caller's own affordance
|
|
238
|
-
* (a scroll button) and for tests, which cannot read a mask.
|
|
239
|
-
*
|
|
240
|
-
* Off by default: it changes how every overflowing table looks.
|
|
241
|
-
*/
|
|
242
|
-
edgeFade?: boolean;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Below `sm` on a `stack="phone"` table: rows as blocks, the head visually hidden,
|
|
247
|
-
* the first cell as a title, the others labelled by `data-label` (set by the table).
|
|
248
|
-
*/
|
|
249
|
-
const STACK_PHONE_CLASSES = cn(
|
|
250
|
-
"max-sm:block max-sm:[&_tbody]:block max-sm:[&_tfoot]:block",
|
|
251
|
-
"max-sm:[&_thead]:sr-only",
|
|
252
|
-
"max-sm:[&_tbody_tr]:block max-sm:[&_tbody_tr]:py-2 max-sm:[&_tfoot_tr]:block max-sm:[&_tfoot_tr]:py-2",
|
|
253
|
-
"max-sm:[&_tbody_td]:block max-sm:[&_tbody_td]:px-0 max-sm:[&_tbody_td]:py-0.5 max-sm:[&_tbody_td]:text-start",
|
|
254
|
-
"max-sm:[&_tfoot_td]:block max-sm:[&_tfoot_td]:px-0 max-sm:[&_tfoot_td]:py-0.5",
|
|
255
|
-
"max-sm:[&_tbody_td:first-child]:font-medium",
|
|
256
|
-
"max-sm:[&_td[data-label]]:before:block max-sm:[&_td[data-label]]:before:text-caption max-sm:[&_td[data-label]]:before:font-medium max-sm:[&_td[data-label]]:before:text-muted max-sm:[&_td[data-label]]:before:content-[attr(data-label)]",
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* A plain, static HTML table in the kit's tokens — for the detail views that need
|
|
261
|
-
* rows and columns and none of {@link DataTable}'s sorting, filtering or paging.
|
|
262
|
-
*
|
|
263
|
-
* kastlan renders about twenty of these on shadcn's Table parts; the part names here
|
|
264
|
-
* are the same idea (`TableHead` is the `<thead>`, `TableHeaderCell` the `<th>`), so
|
|
265
|
-
* the move is a rename rather than a rewrite.
|
|
266
|
-
*
|
|
267
|
-
* The table sits in an overflow-x wrapper, because a table cannot shrink below its
|
|
268
|
-
* content and on a phone it would otherwise widen the page. While it overflows that
|
|
269
|
-
* wrapper becomes a tab stop and a `role="region"` named by the `TableCaption` (or the
|
|
270
|
-
* table's own `aria-label`), so a keyboard user can scroll it and a reader can say
|
|
271
|
-
* what it is — the same contract as {@link ScrollArea}.
|
|
272
|
-
*
|
|
273
|
-
* Alignment is logical throughout (`text-start` / `text-end`), so a right-to-left
|
|
274
|
-
* page gets its first column on the right without a class changing.
|
|
275
|
-
*/
|
|
276
|
-
export function Table({
|
|
277
|
-
density = "comfortable",
|
|
278
|
-
zebra = false,
|
|
279
|
-
hover = false,
|
|
280
|
-
wrapperClassName,
|
|
281
|
-
layout,
|
|
282
|
-
framed = false,
|
|
283
|
-
rowDividers = true,
|
|
284
|
-
stack,
|
|
285
|
-
edgeFade = false,
|
|
286
|
-
className,
|
|
287
|
-
"aria-label": ariaLabel,
|
|
288
|
-
ref,
|
|
289
|
-
...rest
|
|
290
|
-
}: TableProps) {
|
|
291
|
-
const captionId = useId();
|
|
292
|
-
const [captions, setCaptions] = useState(0);
|
|
293
|
-
const wrapper = useRef<HTMLDivElement | null>(null);
|
|
294
|
-
const overflowing = useScrollOverflow(wrapper);
|
|
295
|
-
const fade = useEdgeFade(wrapper, edgeFade);
|
|
296
|
-
const tableRef = useRef<HTMLTableElement | null>(null);
|
|
297
|
-
const setTableRef = useMergedRef(tableRef, ref);
|
|
298
|
-
|
|
299
|
-
// `stack="phone"`: label every body cell with its column's header text, and keep the
|
|
300
|
-
// table's roles explicit — `display: block` on table parts drops their table
|
|
301
|
-
// semantics in some engines. Re-run on any change to the rows, which the caller
|
|
302
|
-
// renders and this component never sees.
|
|
303
|
-
useLayoutEffect(() => {
|
|
304
|
-
const table = tableRef.current;
|
|
305
|
-
if (!stack || !table) return;
|
|
306
|
-
const label = () => {
|
|
307
|
-
const heads = Array.from(table.tHead?.rows[0]?.cells ?? []).map((cell) => cell.textContent?.trim() ?? "");
|
|
308
|
-
table.setAttribute("role", "table");
|
|
309
|
-
for (const row of Array.from(table.rows)) {
|
|
310
|
-
row.setAttribute("role", "row");
|
|
311
|
-
let column = 0;
|
|
312
|
-
for (const cell of Array.from(row.cells)) {
|
|
313
|
-
const span = cell.colSpan || 1;
|
|
314
|
-
if (cell.tagName === "TH") cell.setAttribute("role", cell.closest("thead") ? "columnheader" : "rowheader");
|
|
315
|
-
else cell.setAttribute("role", "cell");
|
|
316
|
-
const text = span === 1 && column > 0 ? heads[column] : undefined;
|
|
317
|
-
if (cell.tagName === "TD" && text) cell.setAttribute("data-label", text);
|
|
318
|
-
else cell.removeAttribute("data-label");
|
|
319
|
-
column += span;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
label();
|
|
324
|
-
const observer = typeof MutationObserver === "undefined" ? null : new MutationObserver(label);
|
|
325
|
-
observer?.observe(table, { childList: true, subtree: true, characterData: true });
|
|
326
|
-
return () => observer?.disconnect();
|
|
327
|
-
}, [stack]);
|
|
328
|
-
|
|
329
|
-
const ctx = useMemo<TableContextValue>(
|
|
330
|
-
() => ({
|
|
331
|
-
density,
|
|
332
|
-
zebra,
|
|
333
|
-
hover,
|
|
334
|
-
rowDividers,
|
|
335
|
-
captionId,
|
|
336
|
-
registerCaption: () => {
|
|
337
|
-
setCaptions((n) => n + 1);
|
|
338
|
-
return () => setCaptions((n) => n - 1);
|
|
339
|
-
},
|
|
340
|
-
}),
|
|
341
|
-
[density, zebra, hover, rowDividers, captionId],
|
|
342
|
-
);
|
|
343
|
-
|
|
344
|
-
const regionName = captions > 0 ? { "aria-labelledby": captionId } : ariaLabel ? { "aria-label": ariaLabel } : null;
|
|
345
|
-
|
|
346
|
-
return (
|
|
347
|
-
<TableContext.Provider value={ctx}>
|
|
348
|
-
<div
|
|
349
|
-
ref={wrapper}
|
|
350
|
-
// Only a region when it scrolls AND has a name: a landmark for every short
|
|
351
|
-
// table on a page would bury the real ones.
|
|
352
|
-
role={overflowing && regionName ? "region" : undefined}
|
|
353
|
-
{...(overflowing ? regionName : null)}
|
|
354
|
-
tabIndex={overflowing ? 0 : undefined}
|
|
355
|
-
data-overflowing={overflowing || undefined}
|
|
356
|
-
data-clips=""
|
|
357
|
-
data-framed={framed || undefined}
|
|
358
|
-
// `edgeFade`: the mask, `data-overflow` and the focus handling; nothing while off.
|
|
359
|
-
{...fade}
|
|
360
|
-
className={cn(
|
|
361
|
-
// `relative`: the containing block for an `sr-only` caption.
|
|
362
|
-
"relative w-full overflow-x-auto",
|
|
363
|
-
// On the scroll wrapper itself, so its clipping keeps the rows inside the
|
|
364
|
-
// rounded corners.
|
|
365
|
-
framed && "rounded-md border border-subtle",
|
|
366
|
-
THIN_SCROLLBAR_CLASS,
|
|
367
|
-
"focus-visible:outline-focus focus-visible:-outline-offset-2 focus-visible:outline-brand",
|
|
368
|
-
wrapperClassName,
|
|
369
|
-
)}
|
|
370
|
-
>
|
|
371
|
-
<table
|
|
372
|
-
{...rest}
|
|
373
|
-
ref={setTableRef}
|
|
374
|
-
aria-label={ariaLabel}
|
|
375
|
-
className={cn(
|
|
376
|
-
"w-full caption-bottom border-collapse text-sm text-primary",
|
|
377
|
-
density === "compact" && "text-xs",
|
|
378
|
-
layout === "fixed" && "table-fixed",
|
|
379
|
-
layout === "auto" && "table-auto",
|
|
380
|
-
stack === "phone" && STACK_PHONE_CLASSES,
|
|
381
|
-
className,
|
|
382
|
-
)}
|
|
383
|
-
/>
|
|
384
|
-
</div>
|
|
385
|
-
</TableContext.Provider>
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
export interface TableHeadProps extends ComponentPropsWithRef<"thead"> {
|
|
390
|
-
/** The rule under the head. Default true; `false` for a quiet header over a small
|
|
391
|
-
* table (keksdose's VAT summary wrote `className="border-b-0"` to lose it). */
|
|
392
|
-
bordered?: boolean;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
export function TableHead({ bordered = true, className, ...rest }: TableHeadProps) {
|
|
396
|
-
return (
|
|
397
|
-
<SectionContext.Provider value="head">
|
|
398
|
-
<thead {...rest} className={cn(bordered && "border-b border-subtle", className)} />
|
|
399
|
-
</SectionContext.Provider>
|
|
400
|
-
);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export interface TableBodyProps extends ComponentPropsWithRef<"tbody"> {
|
|
404
|
-
/**
|
|
405
|
-
* Shown as ONE full-width row (a {@link TableEmpty}) when the body has no rows —
|
|
406
|
-
* `children` that render nothing: an empty `.map`, a `false`, `null`. kastlan hand-
|
|
407
|
-
* writes that row with a counted `colSpan` in unit-values-editor, the meeting agenda
|
|
408
|
-
* and invitations tabs, the journal-entry and invoice detail pages, and a column
|
|
409
|
-
* added later leaves every one of those counts one short.
|
|
410
|
-
*/
|
|
411
|
-
empty?: ReactNode;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
export function TableBody({ className, empty, children, ...rest }: TableBodyProps) {
|
|
415
|
-
// `toArray` drops null/undefined/booleans and flattens arrays, so `[[], false]` —
|
|
416
|
-
// an empty map beside a conditional row that is off — is no rows.
|
|
417
|
-
const hasRows = Children.toArray(children).length > 0;
|
|
418
|
-
return (
|
|
419
|
-
<SectionContext.Provider value="body">
|
|
420
|
-
<tbody {...rest} className={cn("[&>tr:last-child]:border-b-0", className)}>
|
|
421
|
-
{hasRows || empty === undefined || empty === null || empty === false ? (
|
|
422
|
-
children
|
|
423
|
-
) : (
|
|
424
|
-
<TableEmpty>{empty}</TableEmpty>
|
|
425
|
-
)}
|
|
426
|
-
</tbody>
|
|
427
|
-
</SectionContext.Provider>
|
|
428
|
-
);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
export interface TableEmptyProps extends Omit<ComponentPropsWithRef<"tr">, "children"> {
|
|
432
|
-
children: ReactNode;
|
|
433
|
-
/** Columns to span. Default: MEASURED — the widest row of the table it renders in,
|
|
434
|
-
* counted after mount, so the row stays full width when a column is added. */
|
|
435
|
-
colSpan?: number;
|
|
436
|
-
/** Classes for the `<td>`. */
|
|
437
|
-
cellClassName?: string;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* The "nothing here" row: one cell across every column, centred, muted. What
|
|
442
|
-
* {@link TableBodyProps.empty} renders, and usable on its own for a body whose rows
|
|
443
|
-
* are not its direct children.
|
|
444
|
-
*/
|
|
445
|
-
export function TableEmpty({ children, colSpan, cellClassName, className, ...rest }: TableEmptyProps) {
|
|
446
|
-
const { density } = useContext(TableContext);
|
|
447
|
-
const cell = useRef<HTMLTableCellElement | null>(null);
|
|
448
|
-
const [measured, setMeasured] = useState(1);
|
|
449
|
-
// Every render, deliberately: a column can appear in the head without anything this
|
|
450
|
-
// row depends on changing. It cannot loop — setting the same count is a bail-out.
|
|
451
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
452
|
-
useLayoutEffect(() => {
|
|
453
|
-
if (colSpan !== undefined) return;
|
|
454
|
-
const row = cell.current?.parentElement;
|
|
455
|
-
const table = cell.current?.closest("table");
|
|
456
|
-
if (!row || !table) return;
|
|
457
|
-
let widest = 1;
|
|
458
|
-
for (const r of Array.from(table.rows)) {
|
|
459
|
-
if (r === row) continue;
|
|
460
|
-
let n = 0;
|
|
461
|
-
for (const c of Array.from(r.cells)) n += c.colSpan || 1;
|
|
462
|
-
widest = Math.max(widest, n);
|
|
463
|
-
}
|
|
464
|
-
setMeasured(widest);
|
|
465
|
-
});
|
|
466
|
-
return (
|
|
467
|
-
<tr {...rest} data-table-empty="" className={className}>
|
|
468
|
-
<td
|
|
469
|
-
ref={cell}
|
|
470
|
-
colSpan={colSpan ?? measured}
|
|
471
|
-
className={cn(
|
|
472
|
-
// `none` keeps the message off the edges regardless: it is text, not a figure.
|
|
473
|
-
density === "none" ? "py-2" : CELL_PAD[density],
|
|
474
|
-
"text-center text-muted",
|
|
475
|
-
cellClassName,
|
|
476
|
-
)}
|
|
477
|
-
>
|
|
478
|
-
{children}
|
|
479
|
-
</td>
|
|
480
|
-
</tr>
|
|
481
|
-
);
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
export type TableFootProps = ComponentPropsWithRef<"tfoot">;
|
|
485
|
-
|
|
486
|
-
/** The totals row. Not in the brief, but every ledger view has one and a `<tfoot>`
|
|
487
|
-
* is what tells a reader it is a total rather than one more row. */
|
|
488
|
-
export function TableFoot({ className, ...rest }: TableFootProps) {
|
|
489
|
-
return (
|
|
490
|
-
<SectionContext.Provider value="foot">
|
|
491
|
-
<tfoot {...rest} className={cn("border-t border-strong font-medium", className)} />
|
|
492
|
-
</SectionContext.Provider>
|
|
493
|
-
);
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
const ROW_VARIANT: Record<TableRowVariant, string | false> = {
|
|
497
|
-
row: false,
|
|
498
|
-
group: "bg-surface-2 font-semibold",
|
|
499
|
-
subtotal: "font-medium",
|
|
500
|
-
// A 2px rule over the 1px divider the row above draws on its bottom: collapsed
|
|
501
|
-
// borders meet on one line, the wider wins, and the heavier rule is what says "sum".
|
|
502
|
-
total: "border-t-2 border-t-strong font-semibold",
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
/** The deprecated HTML `valign` attribute is replaced by a class-backed one. */
|
|
506
|
-
export interface TableRowProps extends ComponentPropsWithRef<"tr"> {
|
|
507
|
-
/** Vertical alignment for every cell of the row that does not set its own. See
|
|
508
|
-
* {@link TableVAlign}. Left out, each cell keeps its default. */
|
|
509
|
-
valign?: TableVAlign;
|
|
510
|
-
/** See {@link TableRowVariant}. Default `row`. Zebra and hover tint ordinary rows
|
|
511
|
-
* only: a group heading or a total is not one more record. */
|
|
512
|
-
variant?: TableRowVariant;
|
|
513
|
-
/** The rule under this body row. Default: the table's `rowDividers`. */
|
|
514
|
-
bordered?: boolean;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
export function TableRow({ valign, variant = "row", bordered, className, ref: refProp, ...rest }: TableRowProps) {
|
|
518
|
-
const { zebra, hover, rowDividers } = useContext(TableContext);
|
|
519
|
-
const [section, sectionRef] = useSection<HTMLTableRowElement>();
|
|
520
|
-
const ref = useMergedRef(sectionRef, refProp);
|
|
521
|
-
const body = section === "body";
|
|
522
|
-
const record = body && variant === "row";
|
|
523
|
-
const row = (
|
|
524
|
-
<tr
|
|
525
|
-
ref={ref}
|
|
526
|
-
{...rest}
|
|
527
|
-
data-variant={variant === "row" ? undefined : variant}
|
|
528
|
-
className={cn(
|
|
529
|
-
body && (bordered ?? rowDividers) && "border-b border-subtle",
|
|
530
|
-
record && zebra && "even:bg-surface-2",
|
|
531
|
-
record && hover && "transition-colors hover:bg-hover",
|
|
532
|
-
// A zebra row rests on the well, and `--bg-hover` sits only 1.00–1.02:1 from it
|
|
533
|
-
// (0.33: the light well is the page colour): it hovers to the card instead, the
|
|
534
|
-
// one fill that both steps 1.09–1.13:1 from the well and keeps every text role at
|
|
535
|
-
// 4.5:1 (docs/colour-roles-harmonization.md §12.2). `even:hover:` outranks the
|
|
536
|
-
// row's own `hover:`.
|
|
537
|
-
record && zebra && hover && "even:hover:bg-surface",
|
|
538
|
-
ROW_VARIANT[variant],
|
|
539
|
-
// On the row as well, for a raw `<td>` of the caller's, which inherits it.
|
|
540
|
-
valign && VALIGN[valign],
|
|
541
|
-
className,
|
|
542
|
-
)}
|
|
543
|
-
/>
|
|
544
|
-
);
|
|
545
|
-
return valign ? <RowVAlignContext.Provider value={valign}>{row}</RowVAlignContext.Provider> : row;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
interface CellAlignProps {
|
|
549
|
-
/** Shorthand for a figure column: end-aligned, tabular digits. */
|
|
550
|
-
numeric?: boolean;
|
|
551
|
-
/** Logical alignment. Default `start` (`end` when `numeric`). */
|
|
552
|
-
align?: TableAlign;
|
|
553
|
-
/** Vertical alignment. Default: the row's `valign`, else `bottom` for a head cell and
|
|
554
|
-
* `top` for a body cell. See {@link TableVAlign}. */
|
|
555
|
-
valign?: TableVAlign;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
/** The deprecated HTML `align` and `valign` attributes are replaced by class-backed ones. */
|
|
559
|
-
export interface TableHeaderCellProps extends Omit<ComponentPropsWithRef<"th">, "align" | "valign">, CellAlignProps {
|
|
560
|
-
/**
|
|
561
|
-
* Type size. Left out: `xs` in the head, the table's own size in the body — as
|
|
562
|
-
* before. keksdose's VAT summary heads its columns at the body size and normal weight
|
|
563
|
-
* (vat-summary.tsx:158–168, `font-normal` on each `<th>`), a quiet header over a
|
|
564
|
-
* small table of figures, and could not say so without overriding classes.
|
|
565
|
-
*/
|
|
566
|
-
size?: TableHeaderCellSize;
|
|
567
|
-
/** Default `medium`. `normal` for the quiet header above; see {@link size}. */
|
|
568
|
-
weight?: TableHeaderCellWeight;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
/**
|
|
572
|
-
* A `<th>`. `scope` defaults to `col` in the head and `row` in the body — a header
|
|
573
|
-
* cell in a body row is the row's label ("Net rent" in a key-value table), and a
|
|
574
|
-
* reader needs the scope to read it with each cell beside it.
|
|
575
|
-
*/
|
|
576
|
-
export function TableHeaderCell({
|
|
577
|
-
numeric = false,
|
|
578
|
-
align,
|
|
579
|
-
valign,
|
|
580
|
-
size,
|
|
581
|
-
weight = "medium",
|
|
582
|
-
scope,
|
|
583
|
-
className,
|
|
584
|
-
ref: refProp,
|
|
585
|
-
...rest
|
|
586
|
-
}: TableHeaderCellProps) {
|
|
587
|
-
const { density } = useContext(TableContext);
|
|
588
|
-
const [section, sectionRef] = useSection<HTMLTableCellElement>();
|
|
589
|
-
const ref = useMergedRef(sectionRef, refProp);
|
|
590
|
-
const rowVAlign = useContext(RowVAlignContext);
|
|
591
|
-
const head = section === "head";
|
|
592
|
-
const textSize = size ?? (head ? "xs" : undefined);
|
|
593
|
-
return (
|
|
594
|
-
<th
|
|
595
|
-
ref={ref}
|
|
596
|
-
{...rest}
|
|
597
|
-
scope={scope ?? (section === "head" ? "col" : "row")}
|
|
598
|
-
className={cn(
|
|
599
|
-
CELL_PAD[density],
|
|
600
|
-
ALIGN[align ?? (numeric ? "end" : "start")],
|
|
601
|
-
numeric && "tabular-nums",
|
|
602
|
-
VALIGN[valign ?? rowVAlign ?? (head ? "bottom" : "top")],
|
|
603
|
-
HEADER_WEIGHT[weight],
|
|
604
|
-
head ? "text-muted" : "text-secondary",
|
|
605
|
-
textSize && HEADER_SIZE[textSize],
|
|
606
|
-
className,
|
|
607
|
-
)}
|
|
608
|
-
/>
|
|
609
|
-
);
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
export interface TableCellProps extends Omit<ComponentPropsWithRef<"td">, "align" | "valign">, CellAlignProps {}
|
|
613
|
-
|
|
614
|
-
export function TableCell({ numeric = false, align, valign, className, ...rest }: TableCellProps) {
|
|
615
|
-
const { density } = useContext(TableContext);
|
|
616
|
-
const rowVAlign = useContext(RowVAlignContext);
|
|
617
|
-
return (
|
|
618
|
-
<td
|
|
619
|
-
{...rest}
|
|
620
|
-
className={cn(
|
|
621
|
-
CELL_PAD[density],
|
|
622
|
-
VALIGN[valign ?? rowVAlign ?? "top"],
|
|
623
|
-
ALIGN[align ?? (numeric ? "end" : "start")],
|
|
624
|
-
numeric && "tabular-nums whitespace-nowrap",
|
|
625
|
-
className,
|
|
626
|
-
)}
|
|
627
|
-
/>
|
|
628
|
-
);
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
export type TableCaptionProps = ComponentPropsWithRef<"caption">;
|
|
632
|
-
|
|
633
|
-
/**
|
|
634
|
-
* The table's title. Beneath the table by default (`caption-bottom`, the shadcn
|
|
635
|
-
* convention kastlan's views already follow); `className="caption-top"` moves it.
|
|
636
|
-
* `className="sr-only"` keeps it for readers only — the wrapper is `relative`, so
|
|
637
|
-
* the hidden caption stays inside it.
|
|
638
|
-
*
|
|
639
|
-
* It also names the scroll region when the table overflows: it registers itself
|
|
640
|
-
* with the {@link Table} so the wrapper points at an id that exists, and never at
|
|
641
|
-
* one that does not.
|
|
642
|
-
*/
|
|
643
|
-
export function TableCaption({ className, id, ...rest }: TableCaptionProps) {
|
|
644
|
-
const { captionId, registerCaption } = useContext(TableContext);
|
|
645
|
-
useLayoutEffect(() => (id ? undefined : registerCaption()), [id, registerCaption]);
|
|
646
|
-
return <caption {...rest} id={id ?? captionId} className={cn("mt-2 text-start text-sm text-muted", className)} />;
|
|
647
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// The English words of ./tabs, in a module with no component code: the English catalogue
|
|
2
|
-
// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk
|
|
3
|
-
// like the other languages (0.34, KS U8). ./tabs re-exports them. (In ui-labels.ts with the
|
|
4
|
-
// field base's until 0.52, MOD-7.)
|
|
5
|
-
|
|
6
|
-
import type { TabsLabels } from "./tabs";
|
|
7
|
-
|
|
8
|
-
export const DEFAULT_TABS_LABELS: TabsLabels = {
|
|
9
|
-
add: "Add tab",
|
|
10
|
-
remove: (tab) => `Remove ${tab}`,
|
|
11
|
-
more: "More tabs",
|
|
12
|
-
previous: "Previous tabs",
|
|
13
|
-
};
|