@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
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { DEFAULT_DATA_TABLE_LABELS, type DataTableLabels } from "./data-table-labels";
|
|
5
|
-
import { useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
|
|
6
|
-
import { usePhoneLayout } from "../hooks/use-breakpoint";
|
|
7
|
-
import { useLargeText } from "../hooks/use-large-text";
|
|
8
|
-
|
|
9
|
-
export const PAGE_SIZE_OPTIONS = [10, 25, 50, 100, 200] as const;
|
|
10
|
-
|
|
11
|
-
/** The page-size steps, with the current size slotted in when it is not one of them. */
|
|
12
|
-
function sizeOptions(pageSize: number): number[] {
|
|
13
|
-
const steps: number[] = [...PAGE_SIZE_OPTIONS];
|
|
14
|
-
if (!Number.isFinite(pageSize) || steps.includes(pageSize)) return steps;
|
|
15
|
-
return [...steps, pageSize].sort((a, b) => a - b);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface PaginationProps {
|
|
19
|
-
page: number;
|
|
20
|
-
totalPages: number;
|
|
21
|
-
pageSize: number;
|
|
22
|
-
total: number;
|
|
23
|
-
onPage: (p: number) => void;
|
|
24
|
-
/** Omit when the page size is not the user's to change (a server that fixes it):
|
|
25
|
-
* the select is then not rendered at all, rather than rendered and inert. */
|
|
26
|
-
onPageSize?: (n: number) => void;
|
|
27
|
-
/** Over `dataTable` from `<UiKitProvider labels>`, over the English defaults. */
|
|
28
|
-
labels?: LabelOverride<DataTableLabels>;
|
|
29
|
-
/** For the page numbers and page-size options; falls back to the provider's. */
|
|
30
|
-
locale?: string;
|
|
31
|
-
/** `"compact"` for a pager under a compact {@link DataTable} (lenkbank's in-card
|
|
32
|
-
* tables): a slimmer footer and page buttons, so the pager is not the tallest row
|
|
33
|
-
* of a table that was made compact on purpose. */
|
|
34
|
-
density?: "comfortable" | "compact";
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* How many page numbers flank the current one on the strip: ±2, and ±1 on a phone at
|
|
39
|
-
* Large and Extra large (0.32.1, the 360 px Extra-large sweep; docs/text-size-
|
|
40
|
-
* harmonization.md §4). At 150 % a number button is 42 px, and "‹ 1 2 3 … 494 ›" was
|
|
41
|
-
* 312 px on a 360 px phone's 262; one neighbour fewer on each side saves two buttons.
|
|
42
|
-
*/
|
|
43
|
-
const PAGE_WINDOW = 2;
|
|
44
|
-
const PAGE_WINDOW_LARGE_PHONE = 1;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* The strip's two parts (0.32.1, same sweep, §4 "nothing overflows"). The arrows keep
|
|
48
|
-
* the ends; the numbers between them wrap, centred, when even the narrower window does
|
|
49
|
-
* not fit — a middle page of a long list ("1 … 249 250 251 … 494") at Extra large, or at
|
|
50
|
-
* Normal on a narrow phone, where the one-row strip ran past the screen. Where the
|
|
51
|
-
* strip fits it is one row, as before.
|
|
52
|
-
*/
|
|
53
|
-
const PAGE_STRIP = "flex min-w-0 max-w-full items-center gap-1";
|
|
54
|
-
const PAGE_NUMBERS = "flex min-w-0 flex-wrap items-center justify-center gap-1";
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The arrows at the ends of the strip are `aria-disabled`, not `disabled` (refactor audit
|
|
58
|
-
* 2026-10-30, DSP-12): Next pressed onto the last page — or Previous onto the first —
|
|
59
|
-
* is still the focused button, and a button that turns `disabled` drops the focus it
|
|
60
|
-
* holds to `<body>`. JumpCalendar's arrows keep the same rule, and the table's
|
|
61
|
-
* `isLoading` pager the same reason (`ServerPagination.isLoading`). Dimmed as before; a
|
|
62
|
-
* press there does nothing.
|
|
63
|
-
*/
|
|
64
|
-
const ARROW =
|
|
65
|
-
"rounded hover:bg-hover aria-disabled:cursor-not-allowed aria-disabled:opacity-40 aria-disabled:hover:bg-transparent";
|
|
66
|
-
|
|
67
|
-
/** Footer for {@link DataTable}: range summary, page-size select, and a
|
|
68
|
-
* windowed page-number strip (first/last + ±2 around the current page, ±1 on a phone
|
|
69
|
-
* at Large — see {@link PAGE_WINDOW}). */
|
|
70
|
-
export function Pagination({
|
|
71
|
-
page,
|
|
72
|
-
totalPages,
|
|
73
|
-
pageSize,
|
|
74
|
-
total,
|
|
75
|
-
onPage,
|
|
76
|
-
onPageSize,
|
|
77
|
-
labels: labelsProp,
|
|
78
|
-
locale: localeProp,
|
|
79
|
-
density = "comfortable",
|
|
80
|
-
}: PaginationProps) {
|
|
81
|
-
const compact = density === "compact";
|
|
82
|
-
// prop > provider > English, like every other kit component. This defaulted straight
|
|
83
|
-
// to the English object, so a standalone pager under a translated provider still
|
|
84
|
-
// said "Rows per page" — only the pager INSIDE a DataTable was translated, because
|
|
85
|
-
// the table resolved the provider's labels and handed them down.
|
|
86
|
-
const labels = useKitLabels("dataTable", DEFAULT_DATA_TABLE_LABELS, labelsProp);
|
|
87
|
-
const locale = useKitLocale(localeProp);
|
|
88
|
-
// The bare numbers on the strip and in the select are text too: `String(n)` is
|
|
89
|
-
// always ASCII digits, which is wrong for a locale that writes its own. The range
|
|
90
|
-
// summary is not formatted here — `pageRange` / `rowCount` take NUMBERS so the
|
|
91
|
-
// translation can format them itself, alongside the words around them.
|
|
92
|
-
const num = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
93
|
-
const large = useLargeText();
|
|
94
|
-
const phone = usePhoneLayout();
|
|
95
|
-
const radius = large && phone ? PAGE_WINDOW_LARGE_PHONE : PAGE_WINDOW;
|
|
96
|
-
const visible = useMemo(() => {
|
|
97
|
-
// Every page when that is no longer than the window would be (first, last, the
|
|
98
|
-
// current one, its neighbours and two ellipses).
|
|
99
|
-
if (totalPages <= 2 * radius + 3) return Array.from({ length: totalPages }, (_, i) => i);
|
|
100
|
-
const set = new Set<number>([0, totalPages - 1, page]);
|
|
101
|
-
for (let d = 1; d <= radius; d++) {
|
|
102
|
-
if (page - d >= 0) set.add(page - d);
|
|
103
|
-
if (page + d <= totalPages - 1) set.add(page + d);
|
|
104
|
-
}
|
|
105
|
-
return Array.from(set).sort((a, b) => a - b);
|
|
106
|
-
}, [page, totalPages, radius]);
|
|
107
|
-
|
|
108
|
-
const items: (number | "ellipsis")[] = [];
|
|
109
|
-
visible.forEach((p, idx) => {
|
|
110
|
-
if (idx > 0 && p - visible[idx - 1] > 1) items.push("ellipsis");
|
|
111
|
-
items.push(p);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
return (
|
|
115
|
-
<div
|
|
116
|
-
data-density={density}
|
|
117
|
-
className={cn(
|
|
118
|
-
"flex flex-wrap items-center justify-between gap-2 border-t border-subtle text-xs text-secondary",
|
|
119
|
-
compact ? "px-2 py-1" : "px-3 py-2",
|
|
120
|
-
)}
|
|
121
|
-
>
|
|
122
|
-
<div className="flex items-center gap-2">
|
|
123
|
-
<span>
|
|
124
|
-
{/* No rows is a count, not a range: the range read "1–0 / 0" (round 0.34 BUG-14). */}
|
|
125
|
-
{pageSize === Infinity || total === 0
|
|
126
|
-
? labels.rowCount(total)
|
|
127
|
-
: labels.pageRange(page * pageSize + 1, Math.min(total, (page + 1) * pageSize), total)}
|
|
128
|
-
</span>
|
|
129
|
-
{onPageSize && (
|
|
130
|
-
<select
|
|
131
|
-
value={pageSize === Infinity ? "all" : pageSize}
|
|
132
|
-
onChange={(e) => onPageSize(e.target.value === "all" ? Infinity : Number(e.target.value))}
|
|
133
|
-
className="rounded border border-subtle bg-surface px-1 py-0.5 text-xs"
|
|
134
|
-
aria-label={labels.pageSize}
|
|
135
|
-
>
|
|
136
|
-
{/* A `defaultPageSize` that is not one of the steps (keksdose's 5) is offered
|
|
137
|
-
too — a select whose value has no option shows its first one ("10"). */}
|
|
138
|
-
{sizeOptions(pageSize).map((n) => (
|
|
139
|
-
<option key={n} value={n}>
|
|
140
|
-
{num.format(n)}
|
|
141
|
-
</option>
|
|
142
|
-
))}
|
|
143
|
-
<option value="all">{labels.pageSizeAll}</option>
|
|
144
|
-
</select>
|
|
145
|
-
)}
|
|
146
|
-
</div>
|
|
147
|
-
{pageSize !== Infinity && totalPages > 1 && (
|
|
148
|
-
<div data-slot="page-strip" className={PAGE_STRIP}>
|
|
149
|
-
<button
|
|
150
|
-
type="button"
|
|
151
|
-
onClick={() => {
|
|
152
|
-
if (page > 0) onPage(page - 1);
|
|
153
|
-
}}
|
|
154
|
-
aria-disabled={page === 0 || undefined}
|
|
155
|
-
className={cn(ARROW, compact ? "p-0.5" : "p-1")}
|
|
156
|
-
aria-label={labels.prevPage}
|
|
157
|
-
>
|
|
158
|
-
{/* "Previous" points back along the line — left in LTR, right in RTL. */}
|
|
159
|
-
<ChevronLeft className={cn("rtl:-scale-x-100", compact ? "size-3.5" : "size-4")} />
|
|
160
|
-
</button>
|
|
161
|
-
<div data-slot="page-numbers" className={PAGE_NUMBERS}>
|
|
162
|
-
{items.map((it, i) =>
|
|
163
|
-
it === "ellipsis" ? (
|
|
164
|
-
<span key={`e${i}`} className="px-1 text-placeholder">
|
|
165
|
-
…
|
|
166
|
-
</span>
|
|
167
|
-
) : (
|
|
168
|
-
<button
|
|
169
|
-
key={it}
|
|
170
|
-
type="button"
|
|
171
|
-
onClick={() => onPage(it)}
|
|
172
|
-
// Which page you are on is carried only by a background colour
|
|
173
|
-
// otherwise, and the strip is a row of bare numbers with nothing
|
|
174
|
-
// else to tell them apart.
|
|
175
|
-
aria-current={it === page ? "page" : undefined}
|
|
176
|
-
className={cn(
|
|
177
|
-
"rounded",
|
|
178
|
-
compact ? "min-w-6 px-1.5 py-0" : "min-w-7 px-2 py-0.5",
|
|
179
|
-
it === page ? "bg-inverse text-inverse" : "hover:bg-hover",
|
|
180
|
-
)}
|
|
181
|
-
>
|
|
182
|
-
{num.format(it + 1)}
|
|
183
|
-
</button>
|
|
184
|
-
),
|
|
185
|
-
)}
|
|
186
|
-
</div>
|
|
187
|
-
<button
|
|
188
|
-
type="button"
|
|
189
|
-
onClick={() => {
|
|
190
|
-
if (page < totalPages - 1) onPage(page + 1);
|
|
191
|
-
}}
|
|
192
|
-
aria-disabled={page >= totalPages - 1 || undefined}
|
|
193
|
-
className={cn(ARROW, compact ? "p-0.5" : "p-1")}
|
|
194
|
-
aria-label={labels.nextPage}
|
|
195
|
-
>
|
|
196
|
-
<ChevronRight className={cn("rtl:-scale-x-100", compact ? "size-3.5" : "size-4")} />
|
|
197
|
-
</button>
|
|
198
|
-
</div>
|
|
199
|
-
)}
|
|
200
|
-
</div>
|
|
201
|
-
);
|
|
202
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from "react";
|
|
2
|
-
import type { Dispatch, SetStateAction } from "react";
|
|
3
|
-
import { isRtl } from "../lib/direction";
|
|
4
|
-
import type { DataTableColumn } from "./data-table";
|
|
5
|
-
|
|
6
|
-
// DataTable's column resize and auto-size. Moved out of data-table.tsx whole (refactor
|
|
7
|
-
// audit 2026-10, MOD-3 step 2): what it needs from the table is the header cells, the
|
|
8
|
-
// widths and their setter, and which columns are shown — nothing else.
|
|
9
|
-
|
|
10
|
-
/** A column resize in flight. Held in a ref rather than in state: the live width is
|
|
11
|
-
* written straight onto the column's cells, so a drag costs zero renders and the
|
|
12
|
-
* one `setWidths` happens when the pointer comes up. */
|
|
13
|
-
interface Resize {
|
|
14
|
-
key: string;
|
|
15
|
-
pointerId: number;
|
|
16
|
-
startX: number;
|
|
17
|
-
startWidth: number;
|
|
18
|
-
/** +1 when a drag to the right widens the column, -1 in a right-to-left table,
|
|
19
|
-
* where the handle sits on the column's LEFT edge and widening is a drag left. */
|
|
20
|
-
sign: 1 | -1;
|
|
21
|
-
/** What React last rendered this column at, so a CANCELLED drag can put the header
|
|
22
|
-
* back — React cannot, it never saw the inline width the drag wrote. */
|
|
23
|
-
hadWidth: number | undefined;
|
|
24
|
-
/** The header and the body cells under it, collected ONCE when the drag starts.
|
|
25
|
-
* A `<th>` alone cannot shrink a column whose `<td>`s already carry a pinned
|
|
26
|
-
* width — and nothing re-renders during a drag, so the list cannot go stale. */
|
|
27
|
-
cells: HTMLElement[];
|
|
28
|
-
width: number;
|
|
29
|
-
/** A press with no drag in it is not a resize — the handle is also the
|
|
30
|
-
* double-click target that CLEARS a width, and committing the header's current
|
|
31
|
-
* size on the way past would pin every column the user ever brushed. */
|
|
32
|
-
moved: boolean;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* The resize handles' pointer handlers, and the column panel's "Auto-size".
|
|
37
|
-
*
|
|
38
|
-
* Pointer events with capture, rather than a `mousemove`/`mouseup` pair on `window`.
|
|
39
|
-
* Three defects in one eleven-line handler (audit 2026-09-22):
|
|
40
|
-
*
|
|
41
|
-
* * a `setWidths` per `mousemove` re-rendered every row of the table on every pixel
|
|
42
|
-
* of the drag — on a 500-row table that is the whole body, sixty times a second;
|
|
43
|
-
* * the two `window` listeners were added from inside an event handler, so nothing
|
|
44
|
-
* removed them if the table unmounted mid-drag (the row beneath opens a route),
|
|
45
|
-
* and `document.body.style` stayed at `user-select: none; cursor: col-resize` for
|
|
46
|
-
* the rest of the session — the whole page unselectable, with the wrong cursor;
|
|
47
|
-
* * `mousedown` is a mouse. Under a finger the handle did nothing at all.
|
|
48
|
-
*
|
|
49
|
-
* `setPointerCapture` answers all three: the handle itself receives every move and
|
|
50
|
-
* the terminating `pointerup`/`pointercancel` wherever the pointer travels, so there
|
|
51
|
-
* is nothing global to leak, and a touch drag works because a finger is a pointer.
|
|
52
|
-
* The live width is written straight onto the column's own cells — the same three
|
|
53
|
-
* properties the render sets, so the drag and the commit cannot disagree — and
|
|
54
|
-
* `setWidths` is called once, when the drag ends.
|
|
55
|
-
*/
|
|
56
|
-
export function useColumnResize<T>({
|
|
57
|
-
headRefs,
|
|
58
|
-
widths,
|
|
59
|
-
setWidths,
|
|
60
|
-
columns,
|
|
61
|
-
hiddenCols,
|
|
62
|
-
}: {
|
|
63
|
-
/** The header cells by column key, as the `<th>`s' ref callbacks fill it. */
|
|
64
|
-
headRefs: Map<string, HTMLTableCellElement>;
|
|
65
|
-
/** The widths React renders the columns at. */
|
|
66
|
-
widths: Record<string, number>;
|
|
67
|
-
setWidths: Dispatch<SetStateAction<Record<string, number>>>;
|
|
68
|
-
columns: readonly DataTableColumn<T>[];
|
|
69
|
-
hiddenCols: Set<string>;
|
|
70
|
-
}) {
|
|
71
|
-
const resizing = useRef<Resize | null>(null);
|
|
72
|
-
|
|
73
|
-
/** Every cell in one column, header first, totals row included. `data-col` rather than a cell index:
|
|
74
|
-
* an expanded row holds a single `colSpan` cell, so the nth `<td>` of a row is
|
|
75
|
-
* not reliably the nth column. */
|
|
76
|
-
const columnCells = (key: string): HTMLElement[] => {
|
|
77
|
-
const th = headRefs.get(key);
|
|
78
|
-
if (!th) return [];
|
|
79
|
-
const table = th.closest("table");
|
|
80
|
-
if (!table) return [th];
|
|
81
|
-
return [
|
|
82
|
-
th,
|
|
83
|
-
...Array.from(table.querySelectorAll<HTMLElement>("tbody [data-col], tfoot [data-col]")).filter(
|
|
84
|
-
(el) => el.dataset.col === key,
|
|
85
|
-
),
|
|
86
|
-
];
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const applyLiveWidth = (cells: HTMLElement[], width: number | undefined) => {
|
|
90
|
-
const px = width == null ? "" : `${width}px`;
|
|
91
|
-
for (const el of cells) {
|
|
92
|
-
el.style.width = px;
|
|
93
|
-
el.style.minWidth = px;
|
|
94
|
-
el.style.maxWidth = px;
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const releaseResizeChrome = (handle: Element, pointerId: number) => {
|
|
99
|
-
document.body.style.userSelect = "";
|
|
100
|
-
document.body.style.cursor = "";
|
|
101
|
-
// Optional calls: jsdom implements neither, and the handlers sit on the handle
|
|
102
|
-
// itself, so a run without capture behaves the same for anything that stays
|
|
103
|
-
// inside the element.
|
|
104
|
-
if (handle.hasPointerCapture?.(pointerId)) handle.releasePointerCapture?.(pointerId);
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const startResize = (e: React.PointerEvent<HTMLElement>, key: string) => {
|
|
108
|
-
// Secondary buttons open menus; only a primary press starts a drag.
|
|
109
|
-
if (e.button !== 0) return;
|
|
110
|
-
e.preventDefault();
|
|
111
|
-
e.stopPropagation();
|
|
112
|
-
const th = headRefs.get(key);
|
|
113
|
-
const startWidth = th?.getBoundingClientRect().width ?? 100;
|
|
114
|
-
resizing.current = {
|
|
115
|
-
key,
|
|
116
|
-
pointerId: e.pointerId,
|
|
117
|
-
startX: e.clientX,
|
|
118
|
-
startWidth,
|
|
119
|
-
sign: isRtl(e.currentTarget) ? -1 : 1,
|
|
120
|
-
hadWidth: widths[key],
|
|
121
|
-
cells: columnCells(key),
|
|
122
|
-
width: startWidth,
|
|
123
|
-
moved: false,
|
|
124
|
-
};
|
|
125
|
-
e.currentTarget.setPointerCapture?.(e.pointerId);
|
|
126
|
-
document.body.style.userSelect = "none";
|
|
127
|
-
document.body.style.cursor = "col-resize";
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
const moveResize = (e: React.PointerEvent<HTMLElement>) => {
|
|
131
|
-
const drag = resizing.current;
|
|
132
|
-
if (!drag || drag.pointerId !== e.pointerId) return;
|
|
133
|
-
drag.width = Math.max(40, Math.round(drag.startWidth + drag.sign * (e.clientX - drag.startX)));
|
|
134
|
-
drag.moved = true;
|
|
135
|
-
applyLiveWidth(drag.cells, drag.width);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
const finishResize = (e: React.PointerEvent<HTMLElement>, commit: boolean) => {
|
|
139
|
-
const drag = resizing.current;
|
|
140
|
-
// Before the early return: the page gets its selection and its cursor back even
|
|
141
|
-
// for a pointer we were not tracking.
|
|
142
|
-
releaseResizeChrome(e.currentTarget, e.pointerId);
|
|
143
|
-
if (!drag || drag.pointerId !== e.pointerId) return;
|
|
144
|
-
resizing.current = null;
|
|
145
|
-
if (commit && drag.moved) {
|
|
146
|
-
setWidths((w) => ({ ...w, [drag.key]: drag.width }));
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// Cancelled — the browser took the pointer for a system gesture — or the press
|
|
150
|
-
// never became a drag. Either way the column goes back to the width React last
|
|
151
|
-
// rendered it at, which nothing else can do: the inline width the drag wrote is
|
|
152
|
-
// invisible to React, so a re-render with an unchanged `widths` would keep it.
|
|
153
|
-
applyLiveWidth(drag.cells, drag.hadWidth);
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
// The last exit path. A table that unmounts mid-drag takes the handle, and with it
|
|
157
|
-
// every handler above, out of the document — this is the only place left to hand the
|
|
158
|
-
// page back its text selection and its cursor.
|
|
159
|
-
useEffect(
|
|
160
|
-
() => () => {
|
|
161
|
-
if (!resizing.current) return;
|
|
162
|
-
resizing.current = null;
|
|
163
|
-
document.body.style.userSelect = "";
|
|
164
|
-
document.body.style.cursor = "";
|
|
165
|
-
},
|
|
166
|
-
[],
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
const autoSizeAll = () => {
|
|
170
|
-
// Clear widths so the table reflows to natural sizes, then snapshot each
|
|
171
|
-
// column's width and write it back — except for the last visible column,
|
|
172
|
-
// which is left unconstrained so it absorbs any remaining horizontal space.
|
|
173
|
-
setWidths({});
|
|
174
|
-
requestAnimationFrame(() => {
|
|
175
|
-
const next: Record<string, number> = {};
|
|
176
|
-
const cols = columns.filter((c) => !hiddenCols.has(c.key));
|
|
177
|
-
cols.forEach((col, idx) => {
|
|
178
|
-
// A `grow` column takes the rest by design: pinning it would undo that (0.48).
|
|
179
|
-
if (idx === cols.length - 1 || col.grow) return;
|
|
180
|
-
const th = headRefs.get(col.key);
|
|
181
|
-
if (th) next[col.key] = Math.ceil(th.getBoundingClientRect().width);
|
|
182
|
-
});
|
|
183
|
-
setWidths(next);
|
|
184
|
-
});
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
return { startResize, moveResize, finishResize, autoSizeAll };
|
|
188
|
-
}
|
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import { isValidElement, useCallback, useMemo } from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { Pencil, Trash2 } from "lucide-react";
|
|
4
|
-
import { RowActions, type RowAction, type RowActionTone } from "./row-actions";
|
|
5
|
-
import type { SwipeAction } from "./swipeable-row";
|
|
6
|
-
import type { DataTableLabels } from "./data-table-labels";
|
|
7
|
-
import type {
|
|
8
|
-
DataTableColumn,
|
|
9
|
-
DataTableDensity,
|
|
10
|
-
DataTableDesktopSwipeActions,
|
|
11
|
-
DataTableProps,
|
|
12
|
-
DataTableRowAction,
|
|
13
|
-
MobileSwipeActions,
|
|
14
|
-
} from "./data-table";
|
|
15
|
-
|
|
16
|
-
// DataTable's per-row actions (`rowActions`): the actions column on a wide screen and
|
|
17
|
-
// the swipes on a phone card. Moved out of data-table.tsx whole (refactor audit
|
|
18
|
-
// 2026-10, MOD-3 step 1); internal — the public types stay in data-table.tsx.
|
|
19
|
-
|
|
20
|
-
/** The actions column's key. Not a column a caller declares, so it is kept out of the
|
|
21
|
-
* column-settings panel. */
|
|
22
|
-
export const ROW_ACTIONS_KEY = "__rowActions";
|
|
23
|
-
|
|
24
|
-
/** The key of the column derived from `mobileSwipeActions` (0.46, dev#598) — the
|
|
25
|
-
* table's own too. */
|
|
26
|
-
export const SWIPE_ACTIONS_KEY = "__swipeActions";
|
|
27
|
-
|
|
28
|
-
/** A column the TABLE adds, not the caller: out of the column settings and the count,
|
|
29
|
-
* never resized, never the totals row's header. */
|
|
30
|
-
export function isTableOwnColumn(key: string): boolean {
|
|
31
|
-
return key === ROW_ACTIONS_KEY || key === SWIPE_ACTIONS_KEY;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* An actions column's heading (0.46.1, keksdose dev#598 rework — Marcel: a VISIBLE
|
|
36
|
-
* "Actions" heading on every table with an actions column): the caller's node, else the
|
|
37
|
-
* word on screen; `false` is the pre-0.46.1 heading, a screen reader's name only.
|
|
38
|
-
*/
|
|
39
|
-
export function actionsHeading(header: ReactNode | false | undefined, word: string): ReactNode {
|
|
40
|
-
if (header === false) return <span className="sr-only">{word}</span>;
|
|
41
|
-
return header ?? word;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** A curtain's tone, as an icon button's (keksdose's `toneOf`): only the tones that MEAN
|
|
45
|
-
* something on a quiet icon carry over; a status colour, a hue or an app's `paint` stays
|
|
46
|
-
* on the curtain and reads muted. */
|
|
47
|
-
function swipeTone(action: SwipeAction): RowActionTone {
|
|
48
|
-
switch (action.tone) {
|
|
49
|
-
case "danger":
|
|
50
|
-
case "warning":
|
|
51
|
-
case "info":
|
|
52
|
-
return action.tone;
|
|
53
|
-
default:
|
|
54
|
-
return "muted";
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* A row's swipe plan as desktop row actions (dev#598) — what DataTable's
|
|
60
|
-
* `desktopSwipeActions` column draws, for an app that builds its own actions column (or
|
|
61
|
-
* a `RowActions` outside a table) from the same `mobileSwipeActions` plan, so the two
|
|
62
|
-
* cannot drift (public since 0.46.1, keksdose N3).
|
|
63
|
-
*
|
|
64
|
-
* `end` then `start` — the physical `right` / `left` only where the logical side is
|
|
65
|
-
* missing, as the card reads them — each action once, told apart by its `id`, else by its
|
|
66
|
-
* label (two stages with one label would be one button twice). Each button runs the
|
|
67
|
-
* swipe's own `onCommit` — with no confirmation of the kit's (`confirm: false`), as the
|
|
68
|
-
* swipe has none; a swipe's `danger` / `warning` / `info` tone carries over, any
|
|
69
|
-
* other reads `muted`. `options.omit` leaves an action out, `options.commit` gives it a
|
|
70
|
-
* `CommitScope` (see {@link DataTableDesktopSwipeActions}). A `null` plan is `[]`.
|
|
71
|
-
*
|
|
72
|
-
* <RowActions actions={swipePlanRowActions(plan(row), row, { omit })} name={row.title} />
|
|
73
|
-
*/
|
|
74
|
-
export function swipePlanRowActions<T>(
|
|
75
|
-
plan: MobileSwipeActions | null | undefined,
|
|
76
|
-
row: T,
|
|
77
|
-
options: Pick<DataTableDesktopSwipeActions<T>, "omit" | "commit"> = {},
|
|
78
|
-
): RowAction[] {
|
|
79
|
-
if (!plan) return [];
|
|
80
|
-
const out: RowAction[] = [];
|
|
81
|
-
const seen = new Set<string>();
|
|
82
|
-
for (const action of [...(plan.end ?? plan.right ?? []), ...(plan.start ?? plan.left ?? [])]) {
|
|
83
|
-
const key = action.id ?? action.label;
|
|
84
|
-
if (seen.has(key)) continue;
|
|
85
|
-
seen.add(key);
|
|
86
|
-
if (options.omit?.(action, row)) continue;
|
|
87
|
-
const commit = typeof options.commit === "function" ? options.commit(action, row) : options.commit;
|
|
88
|
-
out.push({
|
|
89
|
-
key,
|
|
90
|
-
label: action.label,
|
|
91
|
-
icon: isValidElement(action.icon) ? (
|
|
92
|
-
action.icon
|
|
93
|
-
) : action.icon != null && action.icon !== false ? (
|
|
94
|
-
<>{action.icon}</>
|
|
95
|
-
) : undefined,
|
|
96
|
-
tone: swipeTone(action),
|
|
97
|
-
commit,
|
|
98
|
-
// A swipe commits without the kit asking (the plan's `onCommit` asks, as keksdose's
|
|
99
|
-
// does), so its button does not ask twice (0.49 KIT-12); a danger one still sits in
|
|
100
|
-
// the row's menu.
|
|
101
|
-
confirm: false,
|
|
102
|
-
onSelect: action.onCommit,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return out;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
interface ResolvedRowAction<T> {
|
|
109
|
-
key: string;
|
|
110
|
-
label: string;
|
|
111
|
-
icon: ReactNode;
|
|
112
|
-
tone: "default" | "danger";
|
|
113
|
-
swipe: "start" | "end" | false;
|
|
114
|
-
action: DataTableRowAction<T>;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function resolveRowAction<T>(
|
|
118
|
-
action: DataTableRowAction<T>,
|
|
119
|
-
index: number,
|
|
120
|
-
labels: DataTableLabels,
|
|
121
|
-
): ResolvedRowAction<T> {
|
|
122
|
-
const tone = action.tone ?? (action.kind === "delete" ? "danger" : "default");
|
|
123
|
-
return {
|
|
124
|
-
key: action.kind ?? `${index}:${action.label ?? ""}`,
|
|
125
|
-
label: action.label ?? (action.kind === "edit" ? labels.edit : action.kind === "delete" ? labels.delete : ""),
|
|
126
|
-
icon: action.icon ?? (action.kind === "edit" ? <Pencil /> : action.kind === "delete" ? <Trash2 /> : null),
|
|
127
|
-
tone,
|
|
128
|
-
swipe: action.swipe ?? (tone === "danger" ? "start" : "end"),
|
|
129
|
-
action,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** Ask, then act. */
|
|
134
|
-
async function runRowAction<T>(action: DataTableRowAction<T>, row: T): Promise<void> {
|
|
135
|
-
if (action.confirm && !(await action.confirm(row))) return;
|
|
136
|
-
action.onAction(row);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/** A resolved row action as {@link RowActions} takes it. Its `icon` is any node; a
|
|
140
|
-
* non-element one (a string glyph) is wrapped, since RowAction wants an element. */
|
|
141
|
-
function toRowAction<T>(a: ResolvedRowAction<T>, row: T): RowAction {
|
|
142
|
-
return {
|
|
143
|
-
key: a.key,
|
|
144
|
-
label: a.label,
|
|
145
|
-
icon: isValidElement(a.icon) ? a.icon : a.icon != null && a.icon !== false ? <>{a.icon}</> : undefined,
|
|
146
|
-
tone: a.tone,
|
|
147
|
-
disabledReason: a.action.disabledReason?.(row),
|
|
148
|
-
// The table's own `confirm` asks in `runRowAction`; RowActions' default question
|
|
149
|
-
// (0.49 KIT-12) is for a delete that brought none.
|
|
150
|
-
confirm: a.action.confirm ? false : undefined,
|
|
151
|
-
onSelect: () => void runRowAction(a.action, row),
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* The caller's columns with the actions column appended, and the same actions as a
|
|
157
|
-
* phone card's swipes (`swipesFromActions`; DataTable uses it unless the caller passes
|
|
158
|
-
* `mobileSwipeActions`). Without `rowActions` the columns come back as given.
|
|
159
|
-
*
|
|
160
|
-
* The actions column is appended to the caller's columns rather than drawn as a
|
|
161
|
-
* second special case beside the selection column: it then gets the cell padding,
|
|
162
|
-
* the widths and the phone rules (`mobileHidden`) every other column gets.
|
|
163
|
-
*/
|
|
164
|
-
export function useRowActionColumn<T>({
|
|
165
|
-
columns: columnsProp,
|
|
166
|
-
rowActions,
|
|
167
|
-
rowActionsHeader,
|
|
168
|
-
rowName,
|
|
169
|
-
labels,
|
|
170
|
-
density,
|
|
171
|
-
mobileSwipeActions,
|
|
172
|
-
desktopSwipeActions,
|
|
173
|
-
}: {
|
|
174
|
-
columns: readonly DataTableColumn<T>[];
|
|
175
|
-
rowActions: DataTableProps<T>["rowActions"];
|
|
176
|
-
rowActionsHeader?: DataTableProps<T>["rowActionsHeader"];
|
|
177
|
-
rowName: DataTableProps<T>["rowName"];
|
|
178
|
-
labels: DataTableLabels;
|
|
179
|
-
density: DataTableDensity;
|
|
180
|
-
mobileSwipeActions?: DataTableProps<T>["mobileSwipeActions"];
|
|
181
|
-
desktopSwipeActions?: DataTableProps<T>["desktopSwipeActions"];
|
|
182
|
-
}): {
|
|
183
|
-
columns: readonly DataTableColumn<T>[];
|
|
184
|
-
swipesFromActions: (row: T) => MobileSwipeActions | null;
|
|
185
|
-
} {
|
|
186
|
-
const rowActionsFor = useCallback(
|
|
187
|
-
(row: T): ResolvedRowAction<T>[] =>
|
|
188
|
-
rowActions
|
|
189
|
-
? (typeof rowActions === "function" ? rowActions(row) : rowActions)
|
|
190
|
-
.filter((a) => !a.hidden?.(row))
|
|
191
|
-
.map((a, i) => resolveRowAction(a, i, labels))
|
|
192
|
-
: [],
|
|
193
|
-
[rowActions, labels],
|
|
194
|
-
);
|
|
195
|
-
// dev#598: the desktop half of the caller's swipes. On by default, except beside
|
|
196
|
-
// `rowActions`, whose column already is the desktop's (and whose swipes these usually
|
|
197
|
-
// are). The options object is often a fresh literal per render; its parts are the deps.
|
|
198
|
-
const swipeOptions = typeof desktopSwipeActions === "object" ? desktopSwipeActions : undefined;
|
|
199
|
-
const swipeColumnOn =
|
|
200
|
-
!!mobileSwipeActions && (desktopSwipeActions === undefined ? !rowActions : desktopSwipeActions !== false);
|
|
201
|
-
const swipeOmit = swipeOptions?.omit;
|
|
202
|
-
const swipeName = swipeOptions?.name;
|
|
203
|
-
const swipeCollapse = swipeOptions?.collapse;
|
|
204
|
-
const swipeCommit = swipeOptions?.commit;
|
|
205
|
-
const swipeHeader = swipeOptions?.header;
|
|
206
|
-
const swipeColumn = useMemo<DataTableColumn<T> | null>(
|
|
207
|
-
() =>
|
|
208
|
-
swipeColumnOn
|
|
209
|
-
? {
|
|
210
|
-
key: SWIPE_ACTIONS_KEY,
|
|
211
|
-
header: actionsHeading(swipeHeader, labels.actions),
|
|
212
|
-
cell: (row) => (
|
|
213
|
-
<RowActions
|
|
214
|
-
actions={swipePlanRowActions(mobileSwipeActions!(row), row, { omit: swipeOmit, commit: swipeCommit })}
|
|
215
|
-
name={(swipeName ?? rowName)?.(row)}
|
|
216
|
-
collapse={swipeCollapse}
|
|
217
|
-
size={density === "compact" ? "2xs" : "xs"}
|
|
218
|
-
// The last column's tooltips open toward the row's start.
|
|
219
|
-
tooltipSide="start"
|
|
220
|
-
labels={{ actions: labels.actions }}
|
|
221
|
-
className="justify-end"
|
|
222
|
-
/>
|
|
223
|
-
),
|
|
224
|
-
className: "w-px whitespace-nowrap text-end",
|
|
225
|
-
// The heading over the buttons, at the row's end (0.46.1).
|
|
226
|
-
headClassName: "w-px text-end",
|
|
227
|
-
// On a phone the same actions are the card's swipes.
|
|
228
|
-
mobileHidden: true,
|
|
229
|
-
noRowLink: true,
|
|
230
|
-
}
|
|
231
|
-
: null,
|
|
232
|
-
[
|
|
233
|
-
swipeColumnOn,
|
|
234
|
-
mobileSwipeActions,
|
|
235
|
-
swipeOmit,
|
|
236
|
-
swipeCommit,
|
|
237
|
-
swipeName,
|
|
238
|
-
rowName,
|
|
239
|
-
swipeCollapse,
|
|
240
|
-
swipeHeader,
|
|
241
|
-
density,
|
|
242
|
-
labels.actions,
|
|
243
|
-
],
|
|
244
|
-
);
|
|
245
|
-
const actionColumns = useMemo<readonly DataTableColumn<T>[]>(
|
|
246
|
-
() =>
|
|
247
|
-
rowActions
|
|
248
|
-
? [
|
|
249
|
-
...columnsProp,
|
|
250
|
-
{
|
|
251
|
-
key: ROW_ACTIONS_KEY,
|
|
252
|
-
header: actionsHeading(rowActionsHeader, labels.actions),
|
|
253
|
-
// Through RowActions (0.32, §10.8): the icons inline at Normal, one "⋯"
|
|
254
|
-
// menu at Large once there are two — every label at once does not fit a
|
|
255
|
-
// row. Each control stops its own click: the row's handler already skips
|
|
256
|
-
// its controls, and this is for the caller who wraps the table in a
|
|
257
|
-
// clickable element of their own.
|
|
258
|
-
cell: (row) => (
|
|
259
|
-
<RowActions
|
|
260
|
-
actions={rowActionsFor(row).map((a) => toRowAction(a, row))}
|
|
261
|
-
name={rowName?.(row)}
|
|
262
|
-
size={density === "compact" ? "2xs" : "xs"}
|
|
263
|
-
labels={{ actions: labels.actions }}
|
|
264
|
-
className="justify-end"
|
|
265
|
-
/>
|
|
266
|
-
),
|
|
267
|
-
className: "w-px whitespace-nowrap text-end",
|
|
268
|
-
headClassName: "w-px text-end",
|
|
269
|
-
// On a phone the same actions are the card's swipes.
|
|
270
|
-
mobileHidden: true,
|
|
271
|
-
noRowLink: true,
|
|
272
|
-
},
|
|
273
|
-
]
|
|
274
|
-
: columnsProp,
|
|
275
|
-
[columnsProp, rowActions, rowActionsHeader, rowActionsFor, rowName, labels.actions, density],
|
|
276
|
-
);
|
|
277
|
-
const columns = useMemo(
|
|
278
|
-
() => (swipeColumn ? [...actionColumns, swipeColumn] : actionColumns),
|
|
279
|
-
[actionColumns, swipeColumn],
|
|
280
|
-
);
|
|
281
|
-
// A stable function (0.48.2): the phone cards compare it by identity.
|
|
282
|
-
const swipesFromActions = useCallback(
|
|
283
|
-
(row: T): MobileSwipeActions | null => {
|
|
284
|
-
const swipes = rowActionsFor(row).filter((a) => a.swipe && !a.action.disabledReason?.(row));
|
|
285
|
-
if (!swipes.length) return null;
|
|
286
|
-
const toSwipe = (a: ResolvedRowAction<T>): SwipeAction => ({
|
|
287
|
-
label: a.label,
|
|
288
|
-
icon: a.icon,
|
|
289
|
-
onCommit: () => void runRowAction(a.action, row),
|
|
290
|
-
// The row action's tone, painted by SwipeableRow: its soft wash idle, its fill
|
|
291
|
-
// and that fill's foreground armed (0.33).
|
|
292
|
-
tone: a.tone === "danger" ? "danger" : "brand",
|
|
293
|
-
});
|
|
294
|
-
return {
|
|
295
|
-
start: swipes.filter((a) => a.swipe === "start").map(toSwipe),
|
|
296
|
-
end: swipes.filter((a) => a.swipe === "end").map(toSwipe),
|
|
297
|
-
};
|
|
298
|
-
},
|
|
299
|
-
[rowActionsFor],
|
|
300
|
-
);
|
|
301
|
-
return { columns, swipesFromActions };
|
|
302
|
-
}
|