@eifi1/ui-kit 0.54.0 → 0.56.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 +6 -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 +7 -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 +83 -0
- package/dist/components/legended-series-chart.js +77 -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 +9 -12
- 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
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties, ReactNode } from "react";
|
|
2
|
-
import { isTableOwnColumn } from "./data-table-row-actions";
|
|
3
|
-
import { DEFAULT_DATA_TABLE_LABELS, type DataTableLabels } from "./data-table-labels";
|
|
4
|
-
import type { DataTableCellProps, DataTableColumn, DataTableHeadProps } from "./data-table";
|
|
5
|
-
import { useKitLink, type LabelOverride } from "../i18n/kit-labels";
|
|
6
|
-
import { pickLinkRenderer, RenderedKitLink } from "./text-link";
|
|
7
|
-
|
|
8
|
-
// What DataTable shares with its header (data-table-head.tsx), its column panel and its
|
|
9
|
-
// phone layout (data-table-mobile.tsx): the cell-attribute and alignment rules, a
|
|
10
|
-
// column's plain-text name, and the row link. Moved out of data-table.tsx unchanged
|
|
11
|
-
// (refactor audit 2026-10, MOD-3), into a module of their own so none of those has to
|
|
12
|
-
// import data-table.tsx at run time — which imports them. Since 0.35 also the table's
|
|
13
|
-
// label resolver, which DataTable and its FilterPopover share and the barrel no longer
|
|
14
|
-
// exports (round 0.35 R1).
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Split a caller's cell attributes into what may reach the element and what the kit
|
|
18
|
-
* owns. `role` and `data-col` are dropped outright (see `cellProps`); `className` and
|
|
19
|
-
* `style` come back separately so the kit can merge rather than replace them.
|
|
20
|
-
*/
|
|
21
|
-
export function splitCellProps(props: DataTableCellProps | DataTableHeadProps | undefined): {
|
|
22
|
-
attrs: Record<string, unknown>;
|
|
23
|
-
className?: string;
|
|
24
|
-
style?: CSSProperties;
|
|
25
|
-
} {
|
|
26
|
-
if (!props) return { attrs: {} };
|
|
27
|
-
const {
|
|
28
|
-
className,
|
|
29
|
-
style,
|
|
30
|
-
role: _role,
|
|
31
|
-
"data-col": _col,
|
|
32
|
-
...attrs
|
|
33
|
-
} = props as DataTableCellProps & { "data-col"?: unknown };
|
|
34
|
-
return { attrs, className, style };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// A bare `text-right` / `text-left` token, with or without variant prefixes
|
|
38
|
-
// (`md:text-right`). Deliberately NOT `text-right-…` or an arbitrary value.
|
|
39
|
-
const PHYSICAL_ALIGN = /(^|\s)((?:[\w-]+:)*)text-(left|right)(?=\s|$)/g;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* A column's `className`/`headClassName` with physical text alignment rewritten to
|
|
43
|
-
* logical: `text-right` → `text-end`, `text-left` → `text-start`.
|
|
44
|
-
*
|
|
45
|
-
* Every numeric column written before 0.7.0 says `text-right`, and that is what it
|
|
46
|
-
* MEANT: the end of the line, where digits line up. Rendered as written, a
|
|
47
|
-
* right-to-left table puts those numbers on the far side from their own header's
|
|
48
|
-
* sort button. Rewriting keeps each existing call site correct in both directions
|
|
49
|
-
* with no change on its side; a caller who genuinely wants the physical side in RTL
|
|
50
|
-
* too can say `ltr:text-right rtl:text-right`, which this leaves alone.
|
|
51
|
-
*/
|
|
52
|
-
export function logicalAlign(className: string | undefined): string | undefined {
|
|
53
|
-
return className?.replace(PHYSICAL_ALIGN, (token: string, lead: string, variants: string, side: string) =>
|
|
54
|
-
// Already scoped to one direction: that is a caller choosing the physical side.
|
|
55
|
-
/(^|:)(ltr|rtl):/.test(variants) ? token : `${lead}${variants}text-${side === "right" ? "end" : "start"}`,
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** Drop the undefined entries of a {@link DataTableProps.rowAttributes} map, so a
|
|
60
|
-
* caller can write `{ "data-x": cond ? "y" : undefined }` and get no attribute
|
|
61
|
-
* at all rather than the string "undefined" in the DOM. */
|
|
62
|
-
export function cleanAttrs(attrs: Record<string, string | undefined> | undefined): Record<string, string> | undefined {
|
|
63
|
-
if (!attrs) return undefined;
|
|
64
|
-
const out: Record<string, string> = {};
|
|
65
|
-
for (const [k, v] of Object.entries(attrs)) if (v !== undefined) out[k] = v;
|
|
66
|
-
return out;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* A column's name as a plain string.
|
|
71
|
-
*
|
|
72
|
-
* `header` is a ReactNode — an icon, a unit suffix, a tooltip-wrapped span — and
|
|
73
|
-
* neither a live region nor the column-settings checklist can speak a React element.
|
|
74
|
-
* The `key` fallback is the one the settings panel has always used; a column whose
|
|
75
|
-
* header is not a string and whose key is not human-readable is a call site that
|
|
76
|
-
* should pass a string header, and that is visible in what gets announced.
|
|
77
|
-
*/
|
|
78
|
-
export function columnLabel<T>(col: DataTableColumn<T>, labels?: DataTableLabels): string {
|
|
79
|
-
if (isTableOwnColumn(col.key) && labels) return labels.actions;
|
|
80
|
-
return col.headerText ?? (typeof col.header === "string" ? col.header : col.key);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* The table's labels: caller overrides merged onto the English defaults (presets merged
|
|
85
|
-
* too, key by key, as the provider merges them — so the parameter is a
|
|
86
|
-
* {@link LabelOverride}).
|
|
87
|
-
*
|
|
88
|
-
* DataTable's own, and FilterPopover's: public until 0.35, when it left the barrel for
|
|
89
|
-
* DataTable's `labels` and the provider's `dataTable`, which it serves (round 0.35 R1,
|
|
90
|
-
* refactor audit 2026-10 API-6a). It stays a resolver rather than `useKitLabels` for the
|
|
91
|
-
* two keys it derives (`columnsCount`, `filterColumn`), which a plain merge would not.
|
|
92
|
-
*
|
|
93
|
-
* Lenient on purpose — a table with no labels at all still renders — so a translated app
|
|
94
|
-
* finds out what fell back to English from `missingKitLabels(labels,
|
|
95
|
-
* DEFAULT_UI_KIT_LABELS)` in its own test, where the answer is actionable.
|
|
96
|
-
*/
|
|
97
|
-
export function resolveDataTableLabels(...layers: (LabelOverride<DataTableLabels> | undefined)[]): DataTableLabels {
|
|
98
|
-
if (!layers.some(Boolean)) return DEFAULT_DATA_TABLE_LABELS;
|
|
99
|
-
// The layers in order, the provider's then the prop's, later winning key by key. An
|
|
100
|
-
// `undefined` key is skipped, as `useKitLabels` skips it, rather than blanking the word
|
|
101
|
-
// under it: DataTable spread `{ ...provider, ...prop }`, so `labels={{ autoSize:
|
|
102
|
-
// undefined }}` blanked the provider's word and the English one (round 0.35). `presets`
|
|
103
|
-
// is a record and is merged the same way, so renaming one keeps the other ten.
|
|
104
|
-
const partial: Partial<Omit<DataTableLabels, "presets">> = {};
|
|
105
|
-
const presets = { ...DEFAULT_DATA_TABLE_LABELS.presets };
|
|
106
|
-
for (const layer of layers) {
|
|
107
|
-
for (const [key, value] of Object.entries(layer ?? {})) {
|
|
108
|
-
if (value === undefined) continue;
|
|
109
|
-
if (key !== "presets") Object.assign(partial, { [key]: value });
|
|
110
|
-
else for (const [preset, text] of Object.entries(value)) if (text !== undefined) presets[preset] = text;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
const merged: DataTableLabels = { ...DEFAULT_DATA_TABLE_LABELS, ...partial, presets };
|
|
114
|
-
// `columnsCount` was split out of `columns` + a template literal. Consumers have
|
|
115
|
-
// been translating `columns` since 0.1, and backfilling the English default over
|
|
116
|
-
// that would hand them "Columns (4/9)" back for having translated the key that
|
|
117
|
-
// existed at the time. So the count is derived from the RESOLVED `columns` unless the
|
|
118
|
-
// caller states the whole sentence, which is the escape hatch for a language where
|
|
119
|
-
// the parenthetical does not fit.
|
|
120
|
-
if (partial.columns !== undefined && partial.columnsCount === undefined) {
|
|
121
|
-
merged.columnsCount = (visible, total) => `${merged.columns} (${visible}/${total})`;
|
|
122
|
-
}
|
|
123
|
-
// The same for `filterColumn` (0.34), from a translated `filter`: the app's own word
|
|
124
|
-
// with the column, rather than English for having translated the key that existed.
|
|
125
|
-
if (partial.filter !== undefined && partial.filterColumn === undefined) {
|
|
126
|
-
merged.filterColumn = (column) => `${merged.filter}: ${column}`;
|
|
127
|
-
}
|
|
128
|
-
return merged;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Whether a click that reached `row`'s handler did not start in the row's own DOM.
|
|
133
|
-
*
|
|
134
|
-
* React bubbles an event through the COMPONENT tree, portals included: a popover, a
|
|
135
|
-
* menu or a dialog a cell (or the expansion under it) opens renders at `<body>` but
|
|
136
|
-
* still reports its clicks to every React ancestor — the row among them. So a click
|
|
137
|
-
* in a cell's portalled date picker opened the row it came from, and a page wrapped
|
|
138
|
-
* such content in `<div onClick={(e) => e.stopPropagation()}>` to stop it (kastlan's
|
|
139
|
-
* feedback page did, round its comments). The row owns the clicks on the row.
|
|
140
|
-
*/
|
|
141
|
-
export function fromOutside(target: EventTarget | null, row: HTMLElement): boolean {
|
|
142
|
-
return !(target instanceof Node) || !row.contains(target);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* What counts as a control of its own inside a clickable row: a click or key press
|
|
147
|
-
* that lands on one of these belongs to it, not to the row's `onRowClick`. The row's
|
|
148
|
-
* own link (`rowHref`, marked `data-row-link`) is the exception — it IS the row.
|
|
149
|
-
*/
|
|
150
|
-
const OWN_CONTROL =
|
|
151
|
-
'a[href],button,input,select,textarea,label,summary,[role="button"],[role="link"],[role="checkbox"],[role="switch"],[role="menuitem"],[role="option"],[contenteditable=""],[contenteditable="true"],[tabindex]:not([tabindex="-1"])';
|
|
152
|
-
|
|
153
|
-
/** Whether an event on `row` started on a control nested inside it. */
|
|
154
|
-
export function fromOwnControl(target: EventTarget | null, row: HTMLElement): boolean {
|
|
155
|
-
if (!(target instanceof Element)) return false;
|
|
156
|
-
const hit = target.closest(OWN_CONTROL);
|
|
157
|
-
return !!hit && hit !== row && row.contains(hit) && !hit.hasAttribute("data-row-link");
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* The controls whose own default IS the click — a native checkbox's or radio's toggle, a
|
|
162
|
-
* label's click through to its field, a summary's disclosure (0.46, the 0.45 note from
|
|
163
|
-
* UM): cancelling the click undoes it. Each is the click's own activation target, so a
|
|
164
|
-
* click on one does not follow the link around it, and {@link RowLink} leaves its
|
|
165
|
-
* default alone.
|
|
166
|
-
*/
|
|
167
|
-
const OWN_DEFAULT = 'input[type="checkbox"],input[type="radio"],label,summary';
|
|
168
|
-
|
|
169
|
-
/** Whether a click inside `link` landed on (or in) one of {@link OWN_DEFAULT}. */
|
|
170
|
-
function onOwnDefault(target: EventTarget | null, link: HTMLElement): boolean {
|
|
171
|
-
if (!(target instanceof Element)) return false;
|
|
172
|
-
const hit = target.closest(OWN_DEFAULT);
|
|
173
|
-
return !!hit && hit !== link && link.contains(hit);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/** A click the APP owns. Anything else — middle, ⌘/Ctrl, Shift, Alt — belongs to
|
|
177
|
-
* the browser, and the whole feature is not touching it. */
|
|
178
|
-
const isPlainLeftClick = (e: React.MouseEvent) =>
|
|
179
|
-
e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey;
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* The anchor a linkable row is opened through (Keksdose feedback #451).
|
|
183
|
-
*
|
|
184
|
-
* The plain left click is OURS: cancelled, then handed to the row's own handler, so
|
|
185
|
-
* clicking a row still expands it in place instead of reloading the page. Every
|
|
186
|
-
* other click — middle, ⌘/Ctrl, Shift, Alt — is left completely untouched, which is
|
|
187
|
-
* the entire point of using an anchor rather than an `onAuxClick` + `window.open`:
|
|
188
|
-
* that imitation buys back the middle click and still loses ⌘/Ctrl-click, "copy link
|
|
189
|
-
* address", the status-bar preview and the phone's long-press menu.
|
|
190
|
-
*
|
|
191
|
-
* Modified clicks DO stop propagating: on a table with `selection`, ⌘/Ctrl-click and
|
|
192
|
-
* Shift-click on a row mean "select" (feedback #289), and a row must not change its
|
|
193
|
-
* selection while the browser is opening a tab. The rest of the row still selects —
|
|
194
|
-
* the link is one cell, not the row.
|
|
195
|
-
*
|
|
196
|
-
* `draggable={false}` because an anchor otherwise hijacks a horizontal mouse drag as
|
|
197
|
-
* a link-drag: that is both drag-to-select-text on the desktop table and the mouse
|
|
198
|
-
* path through SwipeableRow's gesture on the mobile card.
|
|
199
|
-
*
|
|
200
|
-
* `navigate` (refactor audit 2026-10-30, DSP-23 b): a table with `rowHref` and no
|
|
201
|
-
* `onRowClick` has nothing to open the row in place, and the cancelled click opened
|
|
202
|
-
* nothing at all. There the plain click is the link's: followed through the provider's
|
|
203
|
-
* `linkComponent` for an in-app path, as every kit link is (`pickLinkRenderer`), else
|
|
204
|
-
* by the browser.
|
|
205
|
-
*/
|
|
206
|
-
export function RowLink({
|
|
207
|
-
href,
|
|
208
|
-
onActivate,
|
|
209
|
-
navigate = false,
|
|
210
|
-
className,
|
|
211
|
-
children,
|
|
212
|
-
...rest
|
|
213
|
-
}: {
|
|
214
|
-
href: string;
|
|
215
|
-
/** Runs on a plain left click. Omit it where an ANCESTOR already handles the
|
|
216
|
-
* click (the desktop `<tr>`), or the row would toggle twice. */
|
|
217
|
-
onActivate?: () => void;
|
|
218
|
-
/** The row has no `onRowClick`: a plain click follows the link instead. */
|
|
219
|
-
navigate?: boolean;
|
|
220
|
-
className?: string;
|
|
221
|
-
children: ReactNode;
|
|
222
|
-
} & Omit<
|
|
223
|
-
React.AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
224
|
-
"href" | "className" | "children" | "onClick" | "onClickCapture"
|
|
225
|
-
>) {
|
|
226
|
-
const kitLink = useKitLink();
|
|
227
|
-
if (navigate) {
|
|
228
|
-
const render = pickLinkRenderer(undefined, kitLink, href);
|
|
229
|
-
const linkProps = {
|
|
230
|
-
...rest,
|
|
231
|
-
href,
|
|
232
|
-
draggable: false,
|
|
233
|
-
className,
|
|
234
|
-
// A modified click opens a tab; it must not also select the row (see above).
|
|
235
|
-
onClick: (e: React.MouseEvent<HTMLAnchorElement>) => {
|
|
236
|
-
if (!fromOutside(e.target, e.currentTarget) && !isPlainLeftClick(e)) e.stopPropagation();
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
// Drawn as a component of its own, so a router link's hooks are its own: text-link's
|
|
240
|
-
// RenderedKitLink, every kit link's (0.52 code review, data-table-shared.tsx — this
|
|
241
|
-
// module had a copy).
|
|
242
|
-
return render ? (
|
|
243
|
-
<RenderedKitLink render={render} props={{ ...linkProps, children }} />
|
|
244
|
-
) : (
|
|
245
|
-
<a {...linkProps}>{children}</a>
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
return (
|
|
249
|
-
<a
|
|
250
|
-
{...rest}
|
|
251
|
-
href={href}
|
|
252
|
-
draggable={false}
|
|
253
|
-
className={className}
|
|
254
|
-
// CAPTURE phase, and it has to be: on the mobile card the whole card is the
|
|
255
|
-
// anchor, so a nested control sits INSIDE it — and the ones that matter
|
|
256
|
-
// (the feedback row's status toggles) stop the click propagating so the row
|
|
257
|
-
// won't also expand. A bubble-phase handler would never run for those, and
|
|
258
|
-
// the browser would follow the link out from under the button press. Cancelling
|
|
259
|
-
// here happens before any descendant can silence the event; `stopPropagation`
|
|
260
|
-
// does not undo a `preventDefault`.
|
|
261
|
-
onClickCapture={(e) => {
|
|
262
|
-
// A click in a portal a descendant opened is not a click on the link: leave
|
|
263
|
-
// it (and a link inside it) alone. See `fromOutside`.
|
|
264
|
-
if (fromOutside(e.target, e.currentTarget)) return;
|
|
265
|
-
// A checkbox, a radio, a label or a summary keeps its own default: cancelling
|
|
266
|
-
// it would undo the toggle, and the link is not followed from it anyway.
|
|
267
|
-
if (onOwnDefault(e.target, e.currentTarget)) return;
|
|
268
|
-
if (isPlainLeftClick(e)) e.preventDefault();
|
|
269
|
-
}}
|
|
270
|
-
onClick={(e) => {
|
|
271
|
-
if (fromOutside(e.target, e.currentTarget)) return;
|
|
272
|
-
if (!isPlainLeftClick(e)) {
|
|
273
|
-
e.stopPropagation();
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
// Already cancelled above; this phase only decides what opens. A nested
|
|
277
|
-
// control that stopped propagation deliberately never reaches it, which is
|
|
278
|
-
// exactly how the row behaved before it became a link — and one that did not
|
|
279
|
-
// (a select in a phone card's cell, keksdose live #428) is still its own.
|
|
280
|
-
if (fromOwnControl(e.target, e.currentTarget)) return;
|
|
281
|
-
onActivate?.();
|
|
282
|
-
}}
|
|
283
|
-
>
|
|
284
|
-
{children}
|
|
285
|
-
</a>
|
|
286
|
-
);
|
|
287
|
-
}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/** Multi-column sort state for DataTable: ordered by priority (index 0 is the
|
|
2
|
-
* primary sort). Encoded as `sort=date.desc,amount` in URLs and the server's
|
|
3
|
-
* transactions `sort` param — the pre-multi-sort single-value format
|
|
4
|
-
* (`sort=date.desc`) decodes as a one-element list. */
|
|
5
|
-
|
|
6
|
-
export type SortDir = "asc" | "desc";
|
|
7
|
-
export interface SortState {
|
|
8
|
-
key: string;
|
|
9
|
-
dir: SortDir;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/** Coerce any persisted/URL-derived shape into a `SortState[]`. The
|
|
13
|
-
* pre-multi-sort localStorage format stored one `{key, dir}` object (or
|
|
14
|
-
* null); arrays pass through with junk entries dropped. */
|
|
15
|
-
export function normalizeSorts(raw: unknown): SortState[] {
|
|
16
|
-
const one = (v: unknown): SortState | null => {
|
|
17
|
-
if (!v || typeof v !== "object") return null;
|
|
18
|
-
const { key, dir } = v as { key?: unknown; dir?: unknown };
|
|
19
|
-
if (typeof key !== "string" || !key) return null;
|
|
20
|
-
return { key, dir: dir === "desc" ? "desc" : "asc" };
|
|
21
|
-
};
|
|
22
|
-
if (Array.isArray(raw)) {
|
|
23
|
-
const out: SortState[] = [];
|
|
24
|
-
for (const entry of raw) {
|
|
25
|
-
const s = one(entry);
|
|
26
|
-
if (s && !out.some((e) => e.key === s.key)) out.push(s);
|
|
27
|
-
}
|
|
28
|
-
return out;
|
|
29
|
-
}
|
|
30
|
-
const single = one(raw);
|
|
31
|
-
return single ? [single] : [];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function encodeSorts(sorts: readonly SortState[]): string | null {
|
|
35
|
-
if (!sorts.length) return null;
|
|
36
|
-
return sorts.map((s) => (s.dir === "desc" ? `${s.key}.desc` : s.key)).join(",");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Decode a `sort` URL param, dropping unknown and duplicated keys. */
|
|
40
|
-
export function decodeSorts(raw: string | null, validKeys: ReadonlySet<string>): SortState[] {
|
|
41
|
-
if (!raw) return [];
|
|
42
|
-
const out: SortState[] = [];
|
|
43
|
-
for (const part of raw.split(",")) {
|
|
44
|
-
const desc = part.endsWith(".desc");
|
|
45
|
-
const asc = part.endsWith(".asc");
|
|
46
|
-
const key = desc ? part.slice(0, -".desc".length) : asc ? part.slice(0, -".asc".length) : part;
|
|
47
|
-
if (!validKeys.has(key) || out.some((s) => s.key === key)) continue;
|
|
48
|
-
out.push({ key, dir: desc ? "desc" : "asc" });
|
|
49
|
-
}
|
|
50
|
-
return out;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* How a header click steps through the directions (see {@link nextSorts}).
|
|
55
|
-
*
|
|
56
|
-
* * `"tri"` — first direction → the other → unsorted. The default, and the only cycle
|
|
57
|
-
* before 0.8.0.
|
|
58
|
-
* * `"toggle"` — first direction ⇄ the other, never unsorted: a report table that is
|
|
59
|
-
* ALWAYS ranked by something (keksdose's aggregated tables) must not have a third
|
|
60
|
-
* click that silently drops the ranking. Clicking another column still replaces
|
|
61
|
-
* the sort, so the table can always be re-ranked; a shift-click criterion flips in
|
|
62
|
-
* place and stays for the same reason.
|
|
63
|
-
*/
|
|
64
|
-
export type SortCycle = "tri" | "toggle";
|
|
65
|
-
|
|
66
|
-
/** Per-click options for {@link nextSorts}; every field is optional and the
|
|
67
|
-
* defaults reproduce the pre-0.8.0 cycle exactly. */
|
|
68
|
-
export interface SortStepOptions {
|
|
69
|
-
/** The direction a column starts in on its first click. `"desc"` for money and
|
|
70
|
-
* count columns, where the interesting rows are the large ones. Default `"asc"`. */
|
|
71
|
-
firstDir?: SortDir;
|
|
72
|
-
/** Default `"tri"`. */
|
|
73
|
-
cycle?: SortCycle;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const flip = (d: SortDir): SortDir => (d === "asc" ? "desc" : "asc");
|
|
77
|
-
|
|
78
|
-
// ---------- The client sort's order ----------
|
|
79
|
-
|
|
80
|
-
/** One collator per locale, built once: `localeCompare` with a locale sets one up on
|
|
81
|
-
* every call, n·log n times a sort. */
|
|
82
|
-
const collators = new Map<string, Intl.Collator>();
|
|
83
|
-
|
|
84
|
-
function sortCollator(locale: string | undefined): Intl.Collator {
|
|
85
|
-
const key = locale ?? "";
|
|
86
|
-
let collator = collators.get(key);
|
|
87
|
-
if (!collator) {
|
|
88
|
-
const options: Intl.CollatorOptions = { numeric: true, sensitivity: "base" };
|
|
89
|
-
try {
|
|
90
|
-
collator = new Intl.Collator(locale, options);
|
|
91
|
-
} catch {
|
|
92
|
-
// An unknown tag (a typo in a provider's `locale`) throws a RangeError, and a sort
|
|
93
|
-
// is no reason for a table to stop rendering: the runtime's own collation then, as
|
|
94
|
-
// CountrySelect falls back.
|
|
95
|
-
collator = new Intl.Collator(undefined, options);
|
|
96
|
-
}
|
|
97
|
-
collators.set(key, collator);
|
|
98
|
-
}
|
|
99
|
-
return collator;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Two `sortBy` values in the order DataTable's client sort puts them, ascending — the
|
|
104
|
-
* table's own comparator, exported (0.52) for a list an app sorts beside or into a
|
|
105
|
-
* kit-sorted table: keksdose weaves its scheduled rows into the register and had to copy
|
|
106
|
-
* the rule, a copy that drifts the day the table's changes. Negative when `a` comes first.
|
|
107
|
-
*
|
|
108
|
-
* - Strings collate in `locale` (audit 2026-10-30 DSP-3, 0.51.7; `<` compared UTF-16 code
|
|
109
|
-
* units — every lower-case initial after every capital, Ä/Ö/Ü after Z): digits as
|
|
110
|
-
* numbers ("Item 2" before "Item 10"), case and accents left out, so two values that
|
|
111
|
-
* differ only by them compare equal and the next sort key decides. One collator per
|
|
112
|
-
* locale, cached; an unknown tag falls back to the runtime's collation, not a throw.
|
|
113
|
-
* - Numbers compare as numbers, and a number comes before a string.
|
|
114
|
-
* - `null` and `undefined` come last, and equal each other. The table puts them last in
|
|
115
|
-
* either direction; turn only the two present values round for a descending order.
|
|
116
|
-
* - Any other pair (a `Date` an untyped caller returns) keeps `<` / `>`.
|
|
117
|
-
*
|
|
118
|
-
* rows.sort((a, b) => compareSortValues(a.payee, b.payee, locale));
|
|
119
|
-
*/
|
|
120
|
-
export function compareSortValues(
|
|
121
|
-
a: string | number | null | undefined,
|
|
122
|
-
b: string | number | null | undefined,
|
|
123
|
-
locale?: string,
|
|
124
|
-
): number {
|
|
125
|
-
if (a == null || b == null) return a == null ? (b == null ? 0 : 1) : -1;
|
|
126
|
-
const aText = typeof a === "string";
|
|
127
|
-
const bText = typeof b === "string";
|
|
128
|
-
if (aText && bText) return sortCollator(locale).compare(a, b);
|
|
129
|
-
if (aText !== bText) return aText ? 1 : -1;
|
|
130
|
-
return a < b ? -1 : a > b ? 1 : 0;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** Header-click semantics. Plain click: make `key` the only sort — cycling
|
|
134
|
-
* first → other → none (`"tri"`) or first ⇄ other (`"toggle"`) when it already is
|
|
135
|
-
* the sole criterion. Shift-click (`additive`): append `key` as the next-priority
|
|
136
|
-
* sort, or step an existing entry in place (first → other → removed under `"tri"`,
|
|
137
|
-
* a plain flip under `"toggle"`). `firstDir` defaults to `"asc"`, `cycle` to
|
|
138
|
-
* `"tri"` — the cycle every table had before the options existed. */
|
|
139
|
-
export function nextSorts(
|
|
140
|
-
prev: readonly SortState[],
|
|
141
|
-
key: string,
|
|
142
|
-
additive: boolean,
|
|
143
|
-
options: SortStepOptions = {},
|
|
144
|
-
): SortState[] {
|
|
145
|
-
const first = options.firstDir ?? "asc";
|
|
146
|
-
const toggle = options.cycle === "toggle";
|
|
147
|
-
const idx = prev.findIndex((s) => s.key === key);
|
|
148
|
-
// One step from `dir`: the second direction after the first, then either back to
|
|
149
|
-
// the first (toggle) or off (null). Judged against THIS column's first direction,
|
|
150
|
-
// so a desc-first column goes desc → asc → none rather than skipping a step.
|
|
151
|
-
const step = (dir: SortDir): SortDir | null => (dir === first ? flip(first) : toggle ? first : null);
|
|
152
|
-
if (!additive) {
|
|
153
|
-
if (prev.length === 1 && idx === 0) {
|
|
154
|
-
const dir = step(prev[0].dir);
|
|
155
|
-
return dir ? [{ key, dir }] : [];
|
|
156
|
-
}
|
|
157
|
-
return [{ key, dir: first }];
|
|
158
|
-
}
|
|
159
|
-
if (idx === -1) return [...prev, { key, dir: first }];
|
|
160
|
-
const dir = step(prev[idx].dir);
|
|
161
|
-
if (dir) return prev.map((s, i) => (i === idx ? { key, dir } : s));
|
|
162
|
-
return prev.filter((_, i) => i !== idx);
|
|
163
|
-
}
|