@eifi1/ui-kit 0.51.7 → 0.53.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 +178 -67
- package/dist/account/account-parts.d.ts +10 -8
- package/dist/account/account-parts.js +1 -18
- package/dist/account/account-parts.js.map +1 -1
- package/dist/account/data-export-setting-labels.js +1 -1
- package/dist/account/data-export-setting-labels.js.map +1 -1
- package/dist/account/delete-account-setting-labels.js +1 -1
- package/dist/account/delete-account-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting-labels.js +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/passkeys-setting.d.ts +9 -2
- package/dist/account/passkeys-setting.js +41 -29
- package/dist/account/passkeys-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +3 -2
- package/dist/account/sessions-setting.js +10 -8
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.js +1 -3
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +6 -3
- package/dist/admin/admin-parts.js +6 -21
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/mail-test-card-labels.js +1 -1
- package/dist/admin/mail-test-card-labels.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -2
- package/dist/admin/plan-change-labels.js +1 -17
- package/dist/admin/plan-change-labels.js.map +1 -1
- package/dist/admin/plan-change.d.ts +3 -42
- package/dist/admin/plan-change.js +1 -1
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +3 -3
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/auth/auth-errors-labels.d.ts +11 -0
- package/dist/auth/auth-errors-labels.js +13 -0
- package/dist/auth/auth-errors-labels.js.map +1 -0
- package/dist/auth/auth-errors.d.ts +7 -23
- package/dist/auth/auth-errors.js +2 -15
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.js +2 -1
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/forgot-password-form-labels.js +1 -1
- package/dist/auth/forgot-password-form-labels.js.map +1 -1
- package/dist/auth/forgot-password-form.js +7 -2
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form-labels.js +1 -1
- package/dist/auth/register-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form-labels.js +1 -1
- package/dist/auth/reset-password-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form.js +5 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.js +1 -1
- package/dist/auth/sign-in-form-labels.js.map +1 -1
- package/dist/auth/status-parts.d.ts +0 -3
- package/dist/auth/status-parts.js +0 -4
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.js +1 -1
- package/dist/auth/verify-email-labels.js.map +1 -1
- package/dist/auth/verify-email.js +7 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/cancel-subscription.d.ts +10 -7
- package/dist/billing/cancel-subscription.js +6 -6
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/plan-card.d.ts +5 -3
- package/dist/billing/plan-card.js +7 -8
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-change-labels.d.ts +42 -0
- package/dist/billing/plan-change-labels.js +22 -0
- package/dist/billing/plan-change-labels.js.map +1 -0
- package/dist/billing/plan-switch.d.ts +9 -6
- package/dist/billing/plan-switch.js +7 -5
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +4 -3
- package/dist/chart.js +72 -4
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips.d.ts +5 -5
- package/dist/components/account-chips.js +11 -13
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +16 -5
- package/dist/components/alert-banner.js +46 -1
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +13 -0
- package/dist/components/amount-input.js +1 -0
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +57 -65
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.d.ts +12 -2
- package/dist/components/bulk-action-bar.js +65 -21
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-look.d.ts +5 -5
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/chart-edge.d.ts +16 -0
- package/dist/components/chart-edge.js +14 -1
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-figure.d.ts +13 -0
- package/dist/components/chart-figure.js +15 -0
- package/dist/components/chart-figure.js.map +1 -0
- package/dist/components/chart-zoom-core.js +1 -4
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +8 -1
- package/dist/components/chart.js +19 -10
- package/dist/components/chart.js.map +1 -1
- package/dist/components/combobox-core.d.ts +111 -2
- package/dist/components/combobox-core.js +148 -42
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +141 -130
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/copy-button.d.ts +6 -5
- package/dist/components/copy-button.js +5 -3
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.js +2 -2
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +1 -1
- package/dist/components/data-table-column-settings.js +33 -7
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +4 -2
- package/dist/components/data-table-filters.js +2 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +6 -4
- package/dist/components/data-table-fit.js +4 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.d.ts +1 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.d.ts +1 -1
- package/dist/components/data-table-head.js +15 -12
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +12 -7
- package/dist/components/data-table-mobile.js +43 -30
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js +11 -6
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +2 -2
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.d.ts +6 -2
- package/dist/components/data-table-row.js +17 -10
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-selection.d.ts +1 -1
- package/dist/components/data-table-selection.js.map +1 -1
- package/dist/components/data-table-shared.d.ts +10 -2
- package/dist/components/data-table-shared.js +18 -0
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.d.ts +21 -2
- package/dist/components/data-table-sort.js +24 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.d.ts +1 -1
- package/dist/components/data-table-virtual.js +18 -6
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.d.ts +13 -4
- package/dist/components/data-table.js +139 -36
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +25 -3
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +16 -3
- package/dist/components/date-picker.js +55 -26
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +38 -24
- package/dist/components/date-range-picker.js +23 -7
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/error-boundary.js +37 -30
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
- package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
- package/dist/components/field-base-labels.js.map +1 -0
- package/dist/components/field-base.d.ts +4 -3
- package/dist/components/field-base.js +3 -3
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/form-actions.js +11 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.d.ts +3 -0
- package/dist/components/hover-menu.js +5 -3
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +14 -9
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.d.ts +43 -0
- package/dist/components/inline-confirm.js +67 -0
- package/dist/components/inline-confirm.js.map +1 -0
- package/dist/components/inline-entity-combobox.d.ts +4 -3
- package/dist/components/inline-entity-combobox.js +148 -140
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +28 -112
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-page.d.ts +3 -1
- package/dist/components/legal-page.js +3 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +4 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.d.ts +2 -2
- package/dist/components/lightbox.js +17 -6
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/list.d.ts +6 -2
- package/dist/components/list.js +3 -2
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.d.ts +1 -1
- package/dist/components/measured-grid.js +2 -1
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/mini-calendar.js +3 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.js +3 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-grid.d.ts +55 -0
- package/dist/components/month-grid.js +148 -0
- package/dist/components/month-grid.js.map +1 -0
- package/dist/components/month-picker.d.ts +36 -4
- package/dist/components/month-picker.js +123 -146
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-select.d.ts +2 -2
- package/dist/components/multi-select.js +11 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/nav-pills.d.ts +1 -1
- package/dist/components/nav-pills.js.map +1 -1
- package/dist/components/picker-sheet.js +2 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +7 -0
- package/dist/components/pie-chart-labels.js +1 -0
- package/dist/components/pie-chart-labels.js.map +1 -1
- package/dist/components/pie-chart.d.ts +5 -3
- package/dist/components/pie-chart.js +7 -22
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.d.ts +3 -0
- package/dist/components/popover.js +7 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/row-actions.js +2 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +4 -4
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +7 -4
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +92 -23
- package/dist/components/series-chart.js +74 -30
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/share-card.js +3 -3
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/tabs-labels.d.ts +2 -0
- package/dist/components/tabs-labels.js +11 -0
- package/dist/components/tabs-labels.js.map +1 -0
- package/dist/components/tabs.d.ts +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +2 -2
- package/dist/components/toggle-legend.js +6 -6
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -2
- package/dist/components/translation-review-editor.js +2 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review.d.ts +2 -1
- package/dist/components/translation-review.js +2 -2
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +31 -0
- package/dist/components/treemap-labels.js +10 -0
- package/dist/components/treemap-labels.js.map +1 -0
- package/dist/components/treemap-layout.d.ts +62 -0
- package/dist/components/treemap-layout.js +126 -0
- package/dist/components/treemap-layout.js.map +1 -0
- package/dist/components/treemap.d.ts +167 -19
- package/dist/components/treemap.js +340 -100
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/use-table-state.d.ts +5 -5
- package/dist/components/use-table-state.js +4 -1
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +1 -2
- package/dist/data-table.js +1 -4
- package/dist/data-table.js.map +1 -1
- package/dist/demo/demo-countdown.d.ts +0 -5
- package/dist/demo/demo-countdown.js +0 -4
- package/dist/demo/demo-countdown.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +36 -7
- package/dist/eslint/role-utilities.js +42 -9
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +25 -16
- package/dist/feedback/feedback-dialog.js +6 -2
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-mutation.d.ts +18 -0
- package/dist/feedback/feedback-mutation.js +8 -0
- package/dist/feedback/feedback-mutation.js.map +1 -0
- package/dist/feedback/feedback-page-link.d.ts +53 -0
- package/dist/feedback/feedback-page-link.js +37 -0
- package/dist/feedback/feedback-page-link.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +8 -4
- package/dist/feedback/feedback-public-list.js +2 -2
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-replies.d.ts +3 -1
- package/dist/feedback/feedback-replies.js +5 -4
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +0 -3
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +33 -44
- package/dist/feedback/feedback-row-detail.js +28 -34
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +17 -14
- package/dist/feedback/feedback-status-undo.js +10 -15
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
- package/dist/feedback/feedback-submit-dialog.js +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.js +9 -3
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +21 -9
- package/dist/feedback/feedback-table.js +45 -25
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +2 -2
- package/dist/feedback/feedback-thread-labels.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +15 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +6 -6
- package/dist/feedback.js +90 -6
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +35 -0
- package/dist/hooks/use-focus-trap.js +6 -4
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +5 -2
- package/dist/hooks/use-hotkey.js +5 -4
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-long-press.d.ts +7 -4
- package/dist/hooks/use-long-press.js +3 -0
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-media-query.js +12 -4
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-mounted.d.ts +22 -0
- package/dist/hooks/use-mounted.js +24 -0
- package/dist/hooks/use-mounted.js.map +1 -0
- package/dist/hooks/use-overlay-history.js +19 -3
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +4 -9
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -18
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -11
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +15 -64
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -18
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -27
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -18
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -19
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -18
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +12 -2
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js +0 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +21 -23
- package/dist/index.js +50 -65
- package/dist/index.js.map +1 -1
- package/dist/landing/routing.d.ts +3 -1
- package/dist/landing/routing.js +4 -7
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/broadcast.d.ts +17 -0
- package/dist/lib/broadcast.js +30 -0
- package/dist/lib/broadcast.js.map +1 -0
- package/dist/lib/date-format.d.ts +37 -2
- package/dist/lib/date-format.js +34 -8
- package/dist/lib/date-format.js.map +1 -1
- package/dist/lib/day-format.d.ts +46 -0
- package/dist/lib/day-format.js +46 -0
- package/dist/lib/day-format.js.map +1 -0
- package/dist/lib/describe-failure.d.ts +14 -0
- package/dist/lib/describe-failure.js +9 -0
- package/dist/lib/describe-failure.js.map +1 -0
- package/dist/lib/direction.d.ts +16 -0
- package/dist/lib/direction.js +9 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/focus-left.d.ts +63 -0
- package/dist/lib/focus-left.js +67 -0
- package/dist/lib/focus-left.js.map +1 -0
- package/dist/lib/format.js +5 -14
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/http-status.d.ts +24 -0
- package/dist/lib/http-status.js +14 -0
- package/dist/lib/http-status.js.map +1 -0
- package/dist/lib/intl-cache.d.ts +14 -0
- package/dist/lib/intl-cache.js +15 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/iso-day.d.ts +11 -0
- package/dist/lib/iso-day.js +8 -0
- package/dist/lib/iso-day.js.map +1 -0
- package/dist/lib/lazy-with-fallback.d.ts +31 -0
- package/dist/lib/lazy-with-fallback.js +40 -0
- package/dist/lib/lazy-with-fallback.js.map +1 -0
- package/dist/lib/path-pattern.d.ts +34 -0
- package/dist/lib/path-pattern.js +24 -0
- package/dist/lib/path-pattern.js.map +1 -0
- package/dist/lib/reduced-motion.d.ts +2 -1
- package/dist/lib/reduced-motion.js.map +1 -1
- package/dist/lib/round.d.ts +2 -1
- package/dist/lib/round.js +2 -1
- package/dist/lib/round.js.map +1 -1
- package/dist/lib/safe-storage.d.ts +24 -5
- package/dist/lib/safe-storage.js +27 -2
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/session-refresh.js +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/share-format.d.ts +13 -0
- package/dist/lib/share-format.js +10 -0
- package/dist/lib/share-format.js.map +1 -0
- package/dist/lib/text-case.d.ts +17 -0
- package/dist/lib/text-case.js +8 -0
- package/dist/lib/text-case.js.map +1 -0
- package/dist/lib/text-match.d.ts +29 -0
- package/dist/lib/text-match.js +20 -2
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/thenable.d.ts +13 -0
- package/dist/lib/thenable.js +8 -0
- package/dist/lib/thenable.js.map +1 -0
- package/dist/lib/translation-review.d.ts +7 -2
- package/dist/lib/translation-review.js +4 -4
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/device-zone-report.js +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +2 -1
- package/dist/notifications/notification-bell.js +3 -3
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +10 -6
- package/dist/notifications/notification-inbox.js +26 -48
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.d.ts +3 -2
- package/dist/notifications/notification-parts.js +1 -3
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.d.ts +6 -0
- package/dist/notifications/notifications-labels.js +1 -0
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +1 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.d.ts +2 -1
- package/dist/notifications/push-devices-setting.js +27 -49
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +10 -3
- package/dist/notifications/quiet-hours-setting.js +65 -26
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/unsubscribe-panel.js +4 -7
- package/dist/notifications/unsubscribe-panel.js.map +1 -1
- package/dist/notifications/use-push-device.d.ts +39 -1
- package/dist/notifications/use-push-device.js +28 -7
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/query-persistence.d.ts +3 -1
- package/dist/offline/query-persistence.js +19 -2
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/rhf/fields.d.ts +11 -4
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/command-palette.js +1 -1
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +19 -9
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/search-index.d.ts +0 -6
- package/dist/search/search-index.js +0 -4
- package/dist/search/search-index.js.map +1 -1
- package/dist/search/use-command-key.d.ts +12 -1
- package/dist/search/use-command-key.js +3 -12
- package/dist/search/use-command-key.js.map +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.js +6 -1
- package/dist/search.js.map +1 -1
- package/dist/settings/use-settings-focus.js +1 -0
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +5 -3
- package/dist/shell/account-menu-language.js +2 -2
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +9 -6
- package/dist/shell/account-menu-text-size.js +2 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/app-shell.d.ts +0 -10
- package/dist/shell/app-shell.js +1 -7
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/company-switcher.d.ts +1 -1
- package/dist/shell/company-switcher.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/top-bar-actions.d.ts +1 -1
- package/dist/shell/top-bar-actions.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +1 -3
- package/dist/shell/top-bar-parts-labels.js +0 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +7 -10
- package/dist/shell.js +14 -23
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +30 -4
- package/dist/sync/engine.js +172 -52
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +2 -2
- package/dist/sync.js +2 -10
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js +3 -8
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +0 -5
- package/dist/theme/chart-palette.js +0 -2
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -1
- package/dist/theme/contrast.js +3 -8
- package/dist/theme/contrast.js.map +1 -1
- package/dist/theme/palette-store.js +6 -6
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js +3 -8
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +3 -6
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.d.ts +7 -4
- package/dist/tour/tour-catalogue.js +12 -10
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.d.ts +0 -2
- package/dist/tour/tour-dock.js +0 -2
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-gates.d.ts +4 -0
- package/dist/tour/tour-gates.js +14 -0
- package/dist/tour/tour-gates.js.map +1 -1
- package/dist/tour/tour-overlay.d.ts +27 -0
- package/dist/tour/tour-overlay.js +741 -0
- package/dist/tour/tour-overlay.js.map +1 -0
- package/dist/tour/tour.d.ts +13 -3
- package/dist/tour/tour.js +59 -781
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +6 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +3 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.d.ts +3 -1
- package/dist/wizard/validation.js.map +1 -1
- package/package.json +10 -6
- package/src/account/account-parts.ts +5 -25
- package/src/account/data-export-setting-labels.ts +1 -1
- package/src/account/delete-account-setting-labels.ts +1 -1
- package/src/account/email-change-setting-labels.ts +1 -1
- package/src/account/passkeys-setting.tsx +60 -38
- package/src/account/sessions-setting.tsx +18 -12
- package/src/admin/admin-action-confirm.tsx +1 -5
- package/src/admin/admin-parts.ts +11 -25
- package/src/admin/mail-test-card-labels.ts +1 -1
- package/src/admin/plan-change-labels.ts +5 -23
- package/src/admin/plan-change.tsx +7 -44
- package/src/admin/reviewer-scope-editor.tsx +3 -3
- package/src/auth/auth-errors-labels.ts +23 -0
- package/src/auth/auth-errors.ts +11 -38
- package/src/auth/complete-name-dialog.tsx +4 -1
- package/src/auth/forgot-password-form-labels.ts +1 -1
- package/src/auth/forgot-password-form.tsx +11 -6
- package/src/auth/register-form-labels.ts +1 -1
- package/src/auth/reset-password-form-labels.ts +1 -1
- package/src/auth/reset-password-form.tsx +8 -4
- package/src/auth/sign-in-form-labels.ts +1 -1
- package/src/auth/status-parts.tsx +0 -6
- package/src/auth/verify-email-labels.ts +1 -1
- package/src/auth/verify-email.tsx +11 -6
- package/src/billing/cancel-subscription.tsx +15 -12
- package/src/billing/plan-card.tsx +18 -10
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +15 -12
- package/src/chart.ts +73 -6
- package/src/components/account-chips.tsx +20 -23
- package/src/components/alert-banner.tsx +82 -5
- package/src/components/amount-input.tsx +18 -7
- package/src/components/autocomplete.tsx +64 -70
- package/src/components/bulk-action-bar.tsx +70 -2
- package/src/components/button-look.ts +5 -5
- package/src/components/button.tsx +2 -2
- package/src/components/chart-edge.ts +34 -1
- package/src/components/chart-figure.tsx +35 -0
- package/src/components/chart-zoom-core.tsx +6 -5
- package/src/components/chart.tsx +26 -5
- package/src/components/combobox-core.tsx +293 -62
- package/src/components/combobox.tsx +183 -153
- package/src/components/copy-button.tsx +34 -23
- package/src/components/country-select.tsx +16 -11
- package/src/components/data-table-column-settings.tsx +52 -10
- package/src/components/data-table-filters.ts +6 -4
- package/src/components/data-table-fit.ts +19 -5
- package/src/components/data-table-groups.tsx +1 -1
- package/src/components/data-table-head.tsx +32 -22
- package/src/components/data-table-mobile.tsx +61 -26
- package/src/components/data-table-pagination.tsx +21 -6
- package/src/components/data-table-resize.ts +1 -1
- package/src/components/data-table-row-actions.tsx +3 -3
- package/src/components/data-table-row.tsx +25 -14
- package/src/components/data-table-selection.ts +1 -1
- package/src/components/data-table-shared.tsx +33 -1
- package/src/components/data-table-sort.ts +57 -2
- package/src/components/data-table-virtual.ts +32 -8
- package/src/components/data-table.tsx +239 -68
- package/src/components/date-field.tsx +66 -9
- package/src/components/date-picker.tsx +125 -49
- package/src/components/date-range-picker.tsx +71 -36
- package/src/components/error-boundary.tsx +53 -39
- package/src/components/field-base-labels.ts +20 -0
- package/src/components/field-base.tsx +13 -7
- package/src/components/form-actions.tsx +20 -5
- package/src/components/hover-menu.tsx +18 -8
- package/src/components/icon-button.tsx +14 -9
- package/src/components/inline-confirm.tsx +116 -0
- package/src/components/inline-entity-combobox.tsx +197 -153
- package/src/components/input.tsx +1 -1
- package/src/components/jump-calendar.tsx +30 -146
- package/src/components/legal-page.tsx +10 -7
- package/src/components/legal.tsx +4 -2
- package/src/components/lightbox.tsx +21 -8
- package/src/components/list.tsx +10 -4
- package/src/components/measured-grid.tsx +8 -4
- package/src/components/mini-calendar.tsx +6 -5
- package/src/components/modal.tsx +6 -1
- package/src/components/month-grid.tsx +229 -0
- package/src/components/month-picker.tsx +192 -200
- package/src/components/multi-select.tsx +21 -9
- package/src/components/nav-pills.tsx +1 -1
- package/src/components/picker-sheet.tsx +12 -9
- package/src/components/pie-chart-labels.ts +8 -0
- package/src/components/pie-chart.tsx +22 -28
- package/src/components/popover.tsx +18 -1
- package/src/components/row-actions.tsx +2 -1
- package/src/components/series-chart-axes.ts +9 -4
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +253 -87
- package/src/components/share-card.tsx +6 -6
- package/src/components/tabs-labels.ts +13 -0
- package/src/components/tabs.tsx +2 -2
- package/src/components/toggle-legend.tsx +16 -11
- package/src/components/translation-review-editor.tsx +6 -5
- package/src/components/translation-review.tsx +4 -3
- package/src/components/treemap-labels.ts +47 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +780 -138
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +1 -4
- package/src/demo/demo-countdown.ts +3 -8
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +20 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +13 -7
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +0 -3
- package/src/feedback/feedback-row-detail.tsx +70 -84
- package/src/feedback/feedback-status-undo.ts +28 -28
- package/src/feedback/feedback-submit-dialog.tsx +2 -2
- package/src/feedback/feedback-submit.tsx +21 -7
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table.tsx +86 -38
- package/src/feedback/feedback-thread-labels.ts +2 -2
- package/src/feedback/feedback-thread.tsx +18 -26
- package/src/feedback.ts +89 -6
- package/src/hooks/use-focus-trap.ts +8 -24
- package/src/hooks/use-hotkey.ts +24 -7
- package/src/hooks/use-long-press.ts +16 -2
- package/src/hooks/use-media-query.ts +20 -4
- package/src/hooks/use-mounted.ts +39 -0
- package/src/hooks/use-overlay-history.ts +32 -3
- package/src/i18n/defaults.ts +4 -9
- package/src/i18n/german.ts +8 -19
- package/src/i18n/kit-labels.tsx +9 -11
- package/src/i18n/locales/es.ts +8 -19
- package/src/i18n/locales/fr.ts +21 -30
- package/src/i18n/locales/hu.ts +10 -19
- package/src/i18n/locales/it.ts +8 -20
- package/src/i18n/locales/zh.ts +9 -19
- package/src/i18n/review.ts +12 -2
- package/src/i18n/shared-labels.ts +0 -1
- package/src/index.ts +57 -49
- package/src/landing/routing.tsx +14 -10
- package/src/lib/broadcast.ts +52 -0
- package/src/lib/date-format.ts +89 -13
- package/src/lib/day-format.ts +96 -0
- package/src/lib/describe-failure.ts +18 -0
- package/src/lib/direction.ts +39 -0
- package/src/lib/focus-left.ts +156 -0
- package/src/lib/format.ts +5 -17
- package/src/lib/http-status.ts +38 -0
- package/src/lib/intl-cache.ts +25 -0
- package/src/lib/iso-day.ts +13 -0
- package/src/lib/lazy-with-fallback.ts +82 -0
- package/src/lib/path-pattern.ts +55 -0
- package/src/lib/reduced-motion.ts +2 -1
- package/src/lib/round.ts +7 -2
- package/src/lib/safe-storage.ts +48 -6
- package/src/lib/session-refresh.ts +1 -1
- package/src/lib/share-format.ts +18 -0
- package/src/lib/text-case.ts +19 -0
- package/src/lib/text-match.ts +57 -2
- package/src/lib/thenable.ts +19 -0
- package/src/lib/translation-review.ts +13 -5
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-bell.tsx +7 -4
- package/src/notifications/notification-inbox.tsx +40 -58
- package/src/notifications/notification-parts.tsx +3 -4
- package/src/notifications/notification-types-setting.tsx +1 -1
- package/src/notifications/notifications-labels.ts +7 -0
- package/src/notifications/push-device-setting.tsx +1 -1
- package/src/notifications/push-devices-setting.tsx +30 -55
- package/src/notifications/quiet-hours-setting.tsx +93 -31
- package/src/notifications/unsubscribe-panel.tsx +4 -7
- package/src/notifications/use-push-device.ts +76 -10
- package/src/offline/query-persistence.ts +35 -3
- package/src/rhf/fields.tsx +11 -4
- package/src/search/command-palette.tsx +2 -4
- package/src/search/global-search.tsx +36 -15
- package/src/search/search-index.ts +0 -15
- package/src/search/use-command-key.ts +13 -12
- package/src/search.ts +10 -1
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +6 -4
- package/src/shell/account-menu-text-size.tsx +10 -7
- package/src/shell/app-shell.tsx +0 -13
- package/src/shell/company-switcher.tsx +1 -1
- package/src/shell/dev-menu.tsx +8 -22
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +1 -4
- package/src/shell.ts +21 -17
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +2 -8
- package/src/testing/css-variables.ts +8 -9
- package/src/theme/chart-palette.ts +0 -2
- package/src/theme/contrast.ts +8 -9
- package/src/theme/palette-store.ts +9 -9
- package/src/theme/text-size.ts +6 -8
- package/src/theme/theme-store.ts +7 -9
- package/src/tour/tour-catalogue.tsx +26 -15
- package/src/tour/tour-dock.ts +0 -2
- package/src/tour/tour-gates.ts +23 -0
- package/src/tour/tour-overlay.tsx +1170 -0
- package/src/tour/tour.tsx +108 -1202
- package/src/tour/use-tour-progress.ts +1 -1
- package/src/wizard/stepper-nav.tsx +3 -1
- package/src/wizard/types.ts +11 -2
- package/src/wizard/use-wizard.ts +2 -1
- package/src/wizard/validation.ts +8 -2
- package/tokens.css +6 -5
- package/dist/components/field-sync-labels.d.ts +0 -2
- package/dist/components/field-sync-labels.js +0 -12
- package/dist/components/field-sync-labels.js.map +0 -1
- package/dist/components/field-sync.d.ts +0 -164
- package/dist/components/field-sync.js +0 -269
- package/dist/components/field-sync.js.map +0 -1
- package/dist/components/section-nav.d.ts +0 -37
- package/dist/components/section-nav.js +0 -33
- package/dist/components/section-nav.js.map +0 -1
- package/dist/components/sign-chip-labels.d.ts +0 -2
- package/dist/components/sign-chip-labels.js +0 -11
- package/dist/components/sign-chip-labels.js.map +0 -1
- package/dist/components/sign-chip.d.ts +0 -68
- package/dist/components/sign-chip.js +0 -47
- package/dist/components/sign-chip.js.map +0 -1
- package/dist/components/ui-labels.js.map +0 -1
- package/dist/lib/isin.d.ts +0 -28
- package/dist/lib/isin.js +0 -36
- package/dist/lib/isin.js.map +0 -1
- package/dist/shell/dev-switchers.d.ts +0 -6
- package/dist/shell/dev-switchers.js +0 -12
- package/dist/shell/dev-switchers.js.map +0 -1
- package/dist/shell/role-switcher.d.ts +0 -21
- package/dist/shell/role-switcher.js +0 -31
- package/dist/shell/role-switcher.js.map +0 -1
- package/src/components/field-sync-labels.ts +0 -13
- package/src/components/field-sync.tsx +0 -482
- package/src/components/section-nav.tsx +0 -65
- package/src/components/sign-chip-labels.ts +0 -12
- package/src/components/sign-chip.tsx +0 -124
- package/src/components/ui-labels.ts +0 -24
- package/src/lib/isin.ts +0 -62
- package/src/shell/dev-switchers.tsx +0 -18
- package/src/shell/role-switcher.tsx +0 -46
|
@@ -105,6 +105,7 @@ function useRowWindow({
|
|
|
105
105
|
const [lock, setLock] = useState(null);
|
|
106
106
|
const naturalOverflow = useRef(false);
|
|
107
107
|
const expandedSig = expanded.join(",");
|
|
108
|
+
const groupsSig = groups.map((g) => `${g.start}:${g.end}:${g.bands.join(".")}:${g.first}`).join(",");
|
|
108
109
|
const model = useMemo(() => {
|
|
109
110
|
if (!enabled) return null;
|
|
110
111
|
const keys = rows.map(rowKey);
|
|
@@ -136,7 +137,7 @@ function useRowWindow({
|
|
|
136
137
|
gTop[groups.length] = y;
|
|
137
138
|
tops[n] = y;
|
|
138
139
|
return { n, keys, tops, h, gTop, total: y, ariaRows, ariaBands, rowCount: aria - 1 + rowsAfter };
|
|
139
|
-
}, [enabled, rows, rowKey,
|
|
140
|
+
}, [enabled, rows, rowKey, groupsSig, expandedSig, measured, estimate, n, rowsBefore, rowsAfter]);
|
|
140
141
|
const pinned = useMemo(() => {
|
|
141
142
|
if (!model) return [];
|
|
142
143
|
const out = [...expanded];
|
|
@@ -154,7 +155,7 @@ function useRowWindow({
|
|
|
154
155
|
const bodies = useMemo(
|
|
155
156
|
() => model ? planBodies(model, groups, start, end, pinned) : [],
|
|
156
157
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
157
|
-
[model,
|
|
158
|
+
[model, groupsSig, start, end, pinnedSig]
|
|
158
159
|
);
|
|
159
160
|
const lockSig = `${resetKey}|${scrollerWidth}|${colKeys.join(",")}`;
|
|
160
161
|
const colWidths = lock && lock.sig === lockSig ? lock.widths : null;
|
|
@@ -167,7 +168,7 @@ function useRowWindow({
|
|
|
167
168
|
const sc = scrollerRef.current;
|
|
168
169
|
const table = tableRef.current;
|
|
169
170
|
if (!m || !sc || !table) return;
|
|
170
|
-
const origin = table.querySelector("tbody[data-vt-body]");
|
|
171
|
+
const origin = table.querySelector(":scope > tbody[data-vt-body]");
|
|
171
172
|
if (!origin) return;
|
|
172
173
|
const sr = sc.getBoundingClientRect();
|
|
173
174
|
const top = Math.max(sr.top, 0);
|
|
@@ -304,7 +305,7 @@ function useRowWindow({
|
|
|
304
305
|
const table = tableRef.current;
|
|
305
306
|
if (!enabled || !table) return;
|
|
306
307
|
const onIn = (e) => {
|
|
307
|
-
const tr = e.target
|
|
308
|
+
const tr = ownRowOf(table, e.target);
|
|
308
309
|
const index = tr ? Number(tr.dataset.rowIndex ?? tr.dataset.rowDetail) : NaN;
|
|
309
310
|
const key = Number.isNaN(index) ? void 0 : latest.current.model?.keys[index];
|
|
310
311
|
setFocusKey(key ?? null);
|
|
@@ -335,11 +336,13 @@ function useRowWindow({
|
|
|
335
336
|
}, [enabled, schedule, total, n]);
|
|
336
337
|
useLayoutEffect(() => {
|
|
337
338
|
if (focusTarget === null) return;
|
|
338
|
-
tableRef.current
|
|
339
|
+
const table = tableRef.current;
|
|
340
|
+
if (table) ownRowAt(table, focusTarget)?.focus();
|
|
339
341
|
}, [focusTarget, bodies, tableRef]);
|
|
340
342
|
const focusRow = useCallback(
|
|
341
343
|
(i) => {
|
|
342
|
-
const
|
|
344
|
+
const table = tableRef.current;
|
|
345
|
+
const el = table && ownRowAt(table, i);
|
|
343
346
|
if (el) el.focus();
|
|
344
347
|
else setFocusTarget(i);
|
|
345
348
|
},
|
|
@@ -355,6 +358,15 @@ function useRowWindow({
|
|
|
355
358
|
focusRow
|
|
356
359
|
};
|
|
357
360
|
}
|
|
361
|
+
function ownRowAt(table, index) {
|
|
362
|
+
return table.querySelector(`:scope > tbody > tr[data-row-index="${index}"]`);
|
|
363
|
+
}
|
|
364
|
+
function ownRowOf(table, node) {
|
|
365
|
+
const ROW = "tr[data-row-index], tr[data-row-detail]";
|
|
366
|
+
for (let tr = node?.closest?.(ROW) ?? null; tr; tr = tr.parentElement?.closest(ROW) ?? null)
|
|
367
|
+
if (tr.parentElement?.parentElement === table) return tr;
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
358
370
|
function rowNavTarget(from, key, n) {
|
|
359
371
|
if (n === 0) return null;
|
|
360
372
|
if (key === "ArrowDown") return Math.min(n - 1, from + 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/data-table-virtual.ts"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\n// DataTable's row windowing (0.48.2, keksdose dev #632 — Marcel: \"The table is extremely\n// slow. Is it virtualised or is everytime the whole table rendered?\"). Opt-in through\n// `virtualize`: the desktop table renders the rows near the visible part of its scroller\n// (plus `overscan`) and stands spacer rows in for the rest, inside each group's own\n// `<tbody>`, so the sticky group bands keep working as they do on a full table — a band\n// cell's sticky containing block is the TABLE, and the latest band of each level that has\n// scrolled past is the one drawn (Chromium, checked with a probe at the group's middle,\n// its end and the next group's start).\n//\n// What it keeps rendered whatever the scroll: the header, the leading row, the band rows\n// of every group that has a rendered row (and the first day of the period the window\n// starts in, whose band is the period's), every OPEN row (`isExpanded`, so an inline\n// editor keeps its state), the roving tab stop, a row holding the focus, and the row the\n// keyboard is moving to.\n//\n// Heights: each rendered row is measured after render (the distance to the next row's\n// top, which is exact under collapsed borders where a row's own box is half a border\n// short) and remembered by its key; a row never rendered counts as the average of the\n// measured ones, or `estimateRowHeight` before any. The spacers are the sums, so the\n// scroll height settles as rows are seen. Scroll anchoring (the browser's) keeps the rows\n// in view still while a spacer above them is corrected.\n//\n// Column widths: in an auto table layout a column is as wide as its widest RENDERED\n// cell, so rows coming and going would move the columns. The header cells' widths are\n// read after the first render and locked into a `<colgroup>`, only ever growing while the\n// rows scroll (a wider cell arriving widens its column once; one leaving narrows\n// nothing). Re-measured from scratch when the data, the columns, a user width, the text\n// size or the scroller's width change — and when a grown column would push the table\n// past its scroller, which it fit before. A `grow` column and a user-resized one are not\n// locked (the first takes the rest, the second is pinned already).\n\n/** {@link DataTableProps.virtualize}'s options. */\nexport interface DataTableVirtualize {\n /** Rows rendered beyond each edge of the visible part. Default 12. */\n overscan?: number;\n /** A row's height in px before it has been measured. Default: 37 (`comfortable`) /\n * 29 (`compact`) — the kit's one-line rows. */\n estimateRowHeight?: number;\n}\n\n/** One innermost group's run of rows, `[start, end)` in the rows on screen, with the\n * band levels its `<tbody>` opens with. `first` is the index of the innermost group that\n * opens its level-1 group (itself with one level). Ungrouped: one run with no bands. */\nexport interface VirtualGroup {\n start: number;\n end: number;\n bands: readonly (1 | 2)[];\n first: number;\n}\n\n/** A row, or a spacer standing in for the rows between two rendered ones. */\nexport type VirtualItem = { kind: \"row\"; index: number } | { kind: \"gap\"; key: string; height: number };\n\n/** A group's `<tbody>` with its rendered rows, or one spacer `<tbody>` for a run of\n * groups of which nothing is rendered. */\nexport type VirtualBody =\n { kind: \"spacer\"; key: string; height: number } | { kind: \"group\"; group: number; items: VirtualItem[] };\n\nexport interface RowWindow {\n bodies: VirtualBody[];\n /** `aria-rowcount`: every row of the table, header, bands, details and footer included. */\n rowCount: number;\n /** `aria-rowindex` of data row `i`; its detail row (open) is the next one. */\n ariaRow: (i: number) => number;\n /** `aria-rowindex` of group `g`'s band of `level`. */\n ariaBand: (g: number, level: 1 | 2) => number;\n /** The locked widths for the `<colgroup>`, by column key; null while measuring. */\n colWidths: Record<string, number> | null;\n /** Move the focus to row `i`, rendering it first when it is not. */\n focusRow: (i: number) => void;\n}\n\n/** The heights measured so far, by row key; the bands' by level. */\ninterface Measured {\n heights: Map<string | number, number>;\n details: Map<string | number, number>;\n sum: number;\n count: number;\n band: [number, number];\n}\n\nconst SELECT_KEY = \"\\u0000select\";\n/** The `<colgroup>` key of the selection column. */\nexport const VIRTUAL_SELECT_COL = SELECT_KEY;\n\ninterface Model {\n n: number;\n keys: (string | number)[];\n /** Top of row i, from the top of the first group's `<tbody>`. */\n tops: Float64Array;\n /** Full height of row i (its detail row included while open). */\n h: Float64Array;\n /** Top of group g's `<tbody>`; [groups.length] is the total. */\n gTop: Float64Array;\n total: number;\n ariaRows: Int32Array;\n ariaBands: Int32Array;\n rowCount: number;\n}\n\n/** First index whose bottom is below `y` (n when none). */\nfunction firstBelow(m: Model, y: number): number {\n let lo = 0;\n let hi = m.n;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (m.tops[mid] + m.h[mid] > y) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n}\n\n/** One past the last index whose top is above `y`. */\nfunction lastAbove(m: Model, y: number): number {\n let lo = 0;\n let hi = m.n;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (m.tops[mid] < y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** The `<tbody>`s to render: the groups holding a rendered row (or the period's first\n * day, for its band), and one spacer for each run of groups in between. Pure. */\nexport function planBodies(\n m: Pick<Model, \"n\" | \"tops\" | \"h\" | \"gTop\">,\n groups: readonly VirtualGroup[],\n start: number,\n end: number,\n pinned: readonly number[],\n): VirtualBody[] {\n const rendered = new Set<number>();\n for (let i = Math.max(0, start); i < Math.min(m.n, end); i++) rendered.add(i);\n for (const p of pinned) if (p >= 0 && p < m.n) rendered.add(p);\n const sorted = [...rendered].sort((a, b) => a - b);\n // The group the window starts in, and the first day of its period.\n let anchor = -1;\n if (sorted.length > 0 && start < m.n) {\n const s = Math.max(0, start);\n const g = groups.findIndex((gr) => s >= gr.start && s < gr.end);\n if (g >= 0) anchor = groups[g].first;\n }\n const bottom = (i: number) => m.tops[i] + m.h[i];\n const out: VirtualBody[] = [];\n let k = 0;\n let skippedFrom = -1;\n const flushSkipped = (upTo: number) => {\n if (skippedFrom < 0) return;\n out.push({ kind: \"spacer\", key: `vs:${skippedFrom}`, height: m.gTop[upTo] - m.gTop[skippedFrom] });\n skippedFrom = -1;\n };\n groups.forEach((g, gi) => {\n while (k < sorted.length && sorted[k] < g.start) k++;\n const items: VirtualItem[] = [];\n let prevBottom = m.tops[g.start] ?? m.gTop[gi + 1];\n let any = false;\n while (k < sorted.length && sorted[k] < g.end) {\n const i = sorted[k++];\n const gap = m.tops[i] - prevBottom;\n if (gap > 0.01) items.push({ kind: \"gap\", key: `gap:${i}`, height: gap });\n items.push({ kind: \"row\", index: i });\n prevBottom = bottom(i);\n any = true;\n }\n if (!any && gi !== anchor) {\n if (skippedFrom < 0) skippedFrom = gi;\n return;\n }\n flushSkipped(gi);\n const rest = m.gTop[gi + 1] - prevBottom;\n if (rest > 0.01) items.push({ kind: \"gap\", key: `gap:end:${gi}`, height: rest });\n out.push({ kind: \"group\", group: gi, items });\n });\n flushSkipped(groups.length);\n return out;\n}\n\nexport function useRowWindow<T>({\n enabled,\n rows,\n rowKey,\n groups,\n expanded,\n pinnedKeys,\n scrollerRef,\n tableRef,\n options,\n compact,\n rowsBefore,\n rowsAfter,\n colKeys,\n lockable,\n resetKey,\n}: {\n enabled: boolean;\n /** The rows on screen, in order. */\n rows: T[];\n rowKey: (row: T) => string | number;\n groups: readonly VirtualGroup[];\n /** Indices of the open rows: always rendered, their detail rows counted. */\n expanded: readonly number[];\n /** Keys always rendered (the roving tab stop). */\n pinnedKeys: readonly (string | number | null)[];\n scrollerRef: RefObject<HTMLElement | null>;\n tableRef: RefObject<HTMLTableElement | null>;\n options: DataTableVirtualize;\n compact: boolean;\n /** Rows above the first group: the header, the leading row. */\n rowsBefore: number;\n /** Rows after the last: the totals row. */\n rowsAfter: number;\n /** The header cells' keys, in order (the selection column as {@link VIRTUAL_SELECT_COL}). */\n colKeys: readonly string[];\n /** The keys whose width is locked (not a `grow` column, not a user-resized one). */\n lockable: ReadonlySet<string>;\n /** Anything that re-measures the column widths from scratch when it changes. */\n resetKey: string;\n}): RowWindow | null {\n const overscan = Math.max(1, options.overscan ?? 12);\n const estimate = options.estimateRowHeight ?? (compact ? 29 : 37);\n const n = rows.length;\n\n const [measured, setMeasured] = useState<Measured>(() => ({\n heights: new Map(),\n details: new Map(),\n sum: 0,\n count: 0,\n band: [estimate, estimate * 0.8],\n }));\n const initialEnd = () =>\n Math.min(\n n,\n Math.ceil((typeof window === \"undefined\" ? 800 : Math.min(window.innerHeight || 800, 1600)) / estimate) +\n overscan,\n );\n const [range, setRange] = useState(() => ({ start: 0, end: initialEnd() }));\n const [focusTarget, setFocusTarget] = useState<number | null>(null);\n const [focusKey, setFocusKey] = useState<string | number | null>(null);\n const [scrollerWidth, setScrollerWidth] = useState(0);\n const [lock, setLock] = useState<{ sig: string; widths: Record<string, number> } | null>(null);\n const naturalOverflow = useRef(false);\n\n const expandedSig = expanded.join(\",\");\n const model = useMemo<Model | null>(() => {\n if (!enabled) return null;\n const keys = rows.map(rowKey);\n const avg = measured.count > 0 ? measured.sum / measured.count : estimate;\n const open = new Set(expanded);\n const h = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n h[i] = (measured.heights.get(keys[i]) ?? avg) + (open.has(i) ? (measured.details.get(keys[i]) ?? 0) : 0);\n }\n const tops = new Float64Array(n + 1);\n const gTop = new Float64Array(groups.length + 1);\n const ariaRows = new Int32Array(n);\n const ariaBands = new Int32Array(groups.length * 2);\n let y = 0;\n let aria = rowsBefore + 1;\n groups.forEach((g, gi) => {\n gTop[gi] = y;\n for (const level of g.bands) {\n y += measured.band[level - 1];\n ariaBands[gi * 2 + level - 1] = aria++;\n }\n for (let i = g.start; i < g.end; i++) {\n tops[i] = y;\n y += h[i];\n ariaRows[i] = aria++;\n if (open.has(i)) aria++;\n }\n });\n gTop[groups.length] = y;\n tops[n] = y;\n return { n, keys, tops, h, gTop, total: y, ariaRows, ariaBands, rowCount: aria - 1 + rowsAfter };\n // `expanded` by its signature.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, rows, rowKey, groups, expandedSig, measured, estimate, n, rowsBefore, rowsAfter]);\n\n // The rows outside the range that stay: open rows, the tab stop, the focused row and\n // the keyboard's target.\n const pinned = useMemo(() => {\n if (!model) return [];\n const out = [...expanded];\n for (const key of [...pinnedKeys, focusKey]) {\n if (key === null) continue;\n const i = model.keys.indexOf(key);\n if (i >= 0) out.push(i);\n }\n if (focusTarget !== null) out.push(focusTarget);\n return out;\n }, [model, expanded, pinnedKeys, focusKey, focusTarget]);\n const pinnedSig = pinned.join(\",\");\n\n const start = Math.min(range.start, n);\n const end = Math.min(range.end, n);\n const bodies = useMemo(\n () => (model ? planBodies(model, groups, start, end, pinned) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [model, groups, start, end, pinnedSig],\n );\n\n const lockSig = `${resetKey}|${scrollerWidth}|${colKeys.join(\",\")}`;\n const colWidths = lock && lock.sig === lockSig ? lock.widths : null;\n\n // What the scroll handler and the frame's measure read: this render's model and lock.\n const latest = useRef({ model, colWidths, lockSig, colKeys, lockable, overscan });\n useLayoutEffect(() => {\n latest.current = { model, colWidths, lockSig, colKeys, lockable, overscan };\n });\n\n // Which rows the visible part of the scroller (and of the window, for a table in a page\n // that scrolls) shows, and a new range around them when the rendered one no longer\n // covers them. Read from the client rects, which a scroll leaves laid out.\n const update = useCallback(() => {\n const { model: m, overscan: over } = latest.current;\n const sc = scrollerRef.current;\n const table = tableRef.current;\n if (!m || !sc || !table) return;\n const origin = table.querySelector<HTMLElement>(\"tbody[data-vt-body]\");\n if (!origin) return;\n const sr = sc.getBoundingClientRect();\n const top = Math.max(sr.top, 0);\n const bottom = Math.min(sr.bottom, window.innerHeight || sr.bottom);\n if (!(bottom > top)) return;\n const o = origin.getBoundingClientRect().top;\n const a = Math.min(firstBelow(m, top - o), m.n);\n const b = Math.max(a, Math.min(lastAbove(m, bottom - o), m.n));\n setRange((prev) =>\n prev.start <= a && prev.end >= b && prev.end <= m.n && prev.end - prev.start <= b - a + 4 * over\n ? prev\n : { start: Math.max(0, a - over), end: Math.min(m.n, b + over) },\n );\n }, [scrollerRef, tableRef]);\n\n // After a render that changed what is drawn: measure the rendered rows and bands, and\n // the header cells for the lock. Not after a render that only ticked a box. In the next\n // animation frame rather than in the commit: there the browser lays the table out once\n // for the frame anyway, where a read in the commit forced a layout of its own, and the\n // re-render the heights cause forced another (Chromium, 3000 rows: 35–130 ms of forced\n // layout per scrolled step, against one layout per frame now).\n const measure = useCallback(() => {\n const { model: m, colWidths: locked, lockSig: sig, colKeys: cols, lockable: lockKeys } = latest.current;\n const table = tableRef.current;\n const sc = scrollerRef.current;\n if (!m || !table || !sc) return;\n const trs = table.rows;\n const rects = Array.from(trs, (tr) => tr.getBoundingClientRect());\n const rowSamples: [string | number, number][] = [];\n const detailSamples: [string | number, number][] = [];\n const bandSamples: [0 | 1, number][] = [];\n for (let k = 0; k < trs.length; k++) {\n const own = rects[k];\n const next = rects[k + 1];\n // The distance to the next row's top: exact under collapsed borders.\n const h = next && next.top > own.top ? next.top - own.top : own.height;\n if (!(h > 0)) continue;\n const ds = trs[k].dataset;\n if (ds.rowIndex !== undefined) {\n const key = m.keys[Number(ds.rowIndex)];\n if (key !== undefined) rowSamples.push([key, h]);\n } else if (ds.rowDetail !== undefined) {\n const key = m.keys[Number(ds.rowDetail)];\n if (key !== undefined) detailSamples.push([key, h]);\n } else if (ds.groupRow === \"1\" || ds.groupRow === \"2\") {\n bandSamples.push([ds.groupRow === \"1\" ? 0 : 1, h]);\n }\n }\n if (rowSamples.length + detailSamples.length + bandSamples.length > 0) {\n setMeasured((prev) => {\n let { heights, details, sum, count } = prev;\n let band = prev.band;\n for (const [key, h] of rowSamples) {\n const old = heights.get(key);\n if (old !== undefined && Math.abs(old - h) <= 0.5) continue;\n if (heights === prev.heights) heights = new Map(heights);\n heights.set(key, h);\n sum += h - (old ?? 0);\n if (old === undefined) count++;\n }\n for (const [key, h] of detailSamples) {\n const old = details.get(key);\n if (old !== undefined && Math.abs(old - h) <= 0.5) continue;\n if (details === prev.details) details = new Map(details);\n details.set(key, h);\n }\n for (const [level, h] of bandSamples) {\n if (Math.abs(band[level] - h) <= 0.5) continue;\n band = level === 0 ? [h, band[1]] : [band[0], h];\n }\n return heights === prev.heights && details === prev.details && band === prev.band\n ? prev\n : { heights, details, sum, count, band };\n });\n }\n // The column lock.\n const cells = table.tHead?.rows[0]?.cells;\n if (!cells || cells.length !== cols.length) return;\n const widths: Record<string, number> = {};\n let anyWidth = false;\n for (let c = 0; c < cells.length; c++) {\n if (!lockKeys.has(cols[c])) continue;\n const w = cells[c].getBoundingClientRect().width;\n if (w > 0) {\n widths[cols[c]] = w;\n anyWidth = true;\n }\n }\n if (!anyWidth) return;\n const over = table.getBoundingClientRect().width > sc.clientWidth + 1;\n if (!locked) {\n naturalOverflow.current = over;\n setLock({ sig, widths });\n } else if (over && !naturalOverflow.current) {\n // A grown column pushed the table past a scroller it fit: measure afresh.\n setLock(null);\n } else {\n let grew = false;\n const merged = { ...locked };\n for (const [key, w] of Object.entries(widths)) {\n if (w > (merged[key] ?? 0) + 0.5) {\n merged[key] = w;\n grew = true;\n }\n }\n if (grew) setLock({ sig, widths: merged });\n }\n }, [scrollerRef, tableRef]);\n\n const frame = useRef(0);\n const schedule = useCallback(() => {\n if (frame.current) return;\n const run = () => {\n frame.current = 0;\n measure();\n update();\n };\n frame.current =\n typeof requestAnimationFrame === \"undefined\"\n ? -(setTimeout(run, 16) as unknown as number)\n : requestAnimationFrame(run);\n }, [measure, update]);\n useEffect(\n () => () => {\n if (frame.current > 0) cancelAnimationFrame(frame.current);\n else if (frame.current < 0) clearTimeout(-frame.current);\n frame.current = 0;\n },\n [],\n );\n\n useEffect(() => {\n if (!enabled) return;\n const onScroll = () => update();\n window.addEventListener(\"scroll\", onScroll, { capture: true, passive: true });\n window.addEventListener(\"resize\", onScroll, { passive: true });\n const sc = scrollerRef.current;\n let ro: ResizeObserver | undefined;\n if (sc && typeof ResizeObserver !== \"undefined\") {\n ro = new ResizeObserver(() => {\n setScrollerWidth(Math.round(sc.clientWidth));\n update();\n });\n ro.observe(sc);\n }\n return () => {\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n window.removeEventListener(\"resize\", onScroll);\n ro?.disconnect();\n };\n }, [enabled, update, scrollerRef]);\n\n // The row holding the focus (a row, or a control in it or in its open detail) stays.\n useEffect(() => {\n const table = tableRef.current;\n if (!enabled || !table) return;\n const onIn = (e: FocusEvent) => {\n const tr = (e.target as Element | null)?.closest?.<HTMLElement>(\"tr[data-row-index], tr[data-row-detail]\");\n const index = tr ? Number(tr.dataset.rowIndex ?? tr.dataset.rowDetail) : NaN;\n const key = Number.isNaN(index) ? undefined : latest.current.model?.keys[index];\n setFocusKey(key ?? null);\n setFocusTarget(null);\n };\n const onOut = (e: FocusEvent) => {\n const to = e.relatedTarget as Node | null;\n if (!to || !table.contains(to)) setFocusKey(null);\n };\n table.addEventListener(\"focusin\", onIn);\n table.addEventListener(\"focusout\", onOut);\n return () => {\n table.removeEventListener(\"focusin\", onIn);\n table.removeEventListener(\"focusout\", onOut);\n };\n }, [enabled, tableRef]);\n\n const dataSig = n > 0 && model ? `${n}:${String(model.keys[0])}:${String(model.keys[n - 1])}` : \"0\";\n const renderSig = `${start}:${end}:${dataSig}:${expandedSig}:${pinnedSig}:${lockSig}:${colWidths ? 1 : 0}`;\n const lastRender = useRef(\"\");\n useLayoutEffect(() => {\n if (!enabled || lastRender.current === renderSig) return;\n lastRender.current = renderSig;\n schedule();\n });\n\n // A new layout (heights measured, rows added): the range may no longer cover the view.\n const total = model?.total ?? 0;\n useLayoutEffect(() => {\n if (enabled) schedule();\n }, [enabled, schedule, total, n]);\n\n // The keyboard's target: rendered (pinned), then focused — its focus scrolls it into\n // view, and the scroll renders the rows around it.\n useLayoutEffect(() => {\n if (focusTarget === null) return;\n // Released by the focus it receives (the `focusin` above), which pins it as the\n // focused row from then on.\n tableRef.current?.querySelector<HTMLElement>(`tr[data-row-index=\"${focusTarget}\"]`)?.focus();\n }, [focusTarget, bodies, tableRef]);\n\n const focusRow = useCallback(\n (i: number) => {\n const el = tableRef.current?.querySelector<HTMLElement>(`tr[data-row-index=\"${i}\"]`);\n if (el) el.focus();\n else setFocusTarget(i);\n },\n [tableRef],\n );\n\n if (!enabled || !model) return null;\n return {\n bodies,\n rowCount: model.rowCount,\n ariaRow: (i) => model.ariaRows[i],\n ariaBand: (g, level) => model.ariaBands[g * 2 + level - 1],\n colWidths,\n focusRow,\n };\n}\n\n/** The roving rows' Arrow/Home/End target over ALL the rows, rendered or not. */\nexport function rowNavTarget(from: number, key: string, n: number): number | null {\n if (n === 0) return null;\n if (key === \"ArrowDown\") return Math.min(n - 1, from + 1);\n if (key === \"ArrowUp\") return Math.max(0, from - 1);\n if (key === \"Home\") return 0;\n if (key === \"End\") return n - 1;\n return null;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/data-table-virtual.ts"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\n// DataTable's row windowing (0.48.2, keksdose dev #632 — Marcel: \"The table is extremely\n// slow. Is it virtualised or is everytime the whole table rendered?\"). Opt-in through\n// `virtualize`: the desktop table renders the rows near the visible part of its scroller\n// (plus `overscan`) and stands spacer rows in for the rest, inside each group's own\n// `<tbody>`, so the sticky group bands keep working as they do on a full table — a band\n// cell's sticky containing block is the TABLE, and the latest band of each level that has\n// scrolled past is the one drawn (Chromium, checked with a probe at the group's middle,\n// its end and the next group's start).\n//\n// What it keeps rendered whatever the scroll: the header, the leading row, the band rows\n// of every group that has a rendered row (and the first day of the period the window\n// starts in, whose band is the period's), every OPEN row (`isExpanded`, so an inline\n// editor keeps its state), the roving tab stop, a row holding the focus, and the row the\n// keyboard is moving to.\n//\n// Heights: each rendered row is measured after render (the distance to the next row's\n// top, which is exact under collapsed borders where a row's own box is half a border\n// short) and remembered by its key; a row never rendered counts as the average of the\n// measured ones, or `estimateRowHeight` before any. The spacers are the sums, so the\n// scroll height settles as rows are seen. Scroll anchoring (the browser's) keeps the rows\n// in view still while a spacer above them is corrected.\n//\n// Column widths: in an auto table layout a column is as wide as its widest RENDERED\n// cell, so rows coming and going would move the columns. The header cells' widths are\n// read after the first render and locked into a `<colgroup>`, only ever growing while the\n// rows scroll (a wider cell arriving widens its column once; one leaving narrows\n// nothing). Re-measured from scratch when the data, the columns, a user width, the text\n// size or the scroller's width change — and when a grown column would push the table\n// past its scroller, which it fit before. A `grow` column and a user-resized one are not\n// locked (the first takes the rest, the second is pinned already).\n\n/** {@link DataTableProps.virtualize}'s options. */\nexport interface DataTableVirtualize {\n /** Rows rendered beyond each edge of the visible part. Default 12. */\n overscan?: number;\n /** A row's height in px before it has been measured. Default: 37 (`comfortable`) /\n * 29 (`compact`) — the kit's one-line rows. */\n estimateRowHeight?: number;\n}\n\n/** One innermost group's run of rows, `[start, end)` in the rows on screen, with the\n * band levels its `<tbody>` opens with. `first` is the index of the innermost group that\n * opens its level-1 group (itself with one level). Ungrouped: one run with no bands. */\nexport interface VirtualGroup {\n start: number;\n end: number;\n bands: readonly (1 | 2)[];\n first: number;\n}\n\n/** A row, or a spacer standing in for the rows between two rendered ones. */\nexport type VirtualItem = { kind: \"row\"; index: number } | { kind: \"gap\"; key: string; height: number };\n\n/** A group's `<tbody>` with its rendered rows, or one spacer `<tbody>` for a run of\n * groups of which nothing is rendered. */\nexport type VirtualBody =\n { kind: \"spacer\"; key: string; height: number } | { kind: \"group\"; group: number; items: VirtualItem[] };\n\nexport interface RowWindow {\n bodies: VirtualBody[];\n /** `aria-rowcount`: every row of the table, header, bands, details and footer included. */\n rowCount: number;\n /** `aria-rowindex` of data row `i`; its detail row (open) is the next one. */\n ariaRow: (i: number) => number;\n /** `aria-rowindex` of group `g`'s band of `level`. */\n ariaBand: (g: number, level: 1 | 2) => number;\n /** The locked widths for the `<colgroup>`, by column key; null while measuring. */\n colWidths: Record<string, number> | null;\n /** Move the focus to row `i`, rendering it first when it is not. */\n focusRow: (i: number) => void;\n}\n\n/** The heights measured so far, by row key; the bands' by level. */\ninterface Measured {\n heights: Map<string | number, number>;\n details: Map<string | number, number>;\n sum: number;\n count: number;\n band: [number, number];\n}\n\nconst SELECT_KEY = \"\\u0000select\";\n/** The `<colgroup>` key of the selection column. */\nexport const VIRTUAL_SELECT_COL = SELECT_KEY;\n\ninterface Model {\n n: number;\n keys: (string | number)[];\n /** Top of row i, from the top of the first group's `<tbody>`. */\n tops: Float64Array;\n /** Full height of row i (its detail row included while open). */\n h: Float64Array;\n /** Top of group g's `<tbody>`; [groups.length] is the total. */\n gTop: Float64Array;\n total: number;\n ariaRows: Int32Array;\n ariaBands: Int32Array;\n rowCount: number;\n}\n\n/** First index whose bottom is below `y` (n when none). */\nfunction firstBelow(m: Model, y: number): number {\n let lo = 0;\n let hi = m.n;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (m.tops[mid] + m.h[mid] > y) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n}\n\n/** One past the last index whose top is above `y`. */\nfunction lastAbove(m: Model, y: number): number {\n let lo = 0;\n let hi = m.n;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (m.tops[mid] < y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** The `<tbody>`s to render: the groups holding a rendered row (or the period's first\n * day, for its band), and one spacer for each run of groups in between. Pure. */\nexport function planBodies(\n m: Pick<Model, \"n\" | \"tops\" | \"h\" | \"gTop\">,\n groups: readonly VirtualGroup[],\n start: number,\n end: number,\n pinned: readonly number[],\n): VirtualBody[] {\n const rendered = new Set<number>();\n for (let i = Math.max(0, start); i < Math.min(m.n, end); i++) rendered.add(i);\n for (const p of pinned) if (p >= 0 && p < m.n) rendered.add(p);\n const sorted = [...rendered].sort((a, b) => a - b);\n // The group the window starts in, and the first day of its period.\n let anchor = -1;\n if (sorted.length > 0 && start < m.n) {\n const s = Math.max(0, start);\n const g = groups.findIndex((gr) => s >= gr.start && s < gr.end);\n if (g >= 0) anchor = groups[g].first;\n }\n const bottom = (i: number) => m.tops[i] + m.h[i];\n const out: VirtualBody[] = [];\n let k = 0;\n let skippedFrom = -1;\n const flushSkipped = (upTo: number) => {\n if (skippedFrom < 0) return;\n out.push({ kind: \"spacer\", key: `vs:${skippedFrom}`, height: m.gTop[upTo] - m.gTop[skippedFrom] });\n skippedFrom = -1;\n };\n groups.forEach((g, gi) => {\n while (k < sorted.length && sorted[k] < g.start) k++;\n const items: VirtualItem[] = [];\n let prevBottom = m.tops[g.start] ?? m.gTop[gi + 1];\n let any = false;\n while (k < sorted.length && sorted[k] < g.end) {\n const i = sorted[k++];\n const gap = m.tops[i] - prevBottom;\n if (gap > 0.01) items.push({ kind: \"gap\", key: `gap:${i}`, height: gap });\n items.push({ kind: \"row\", index: i });\n prevBottom = bottom(i);\n any = true;\n }\n if (!any && gi !== anchor) {\n if (skippedFrom < 0) skippedFrom = gi;\n return;\n }\n flushSkipped(gi);\n const rest = m.gTop[gi + 1] - prevBottom;\n if (rest > 0.01) items.push({ kind: \"gap\", key: `gap:end:${gi}`, height: rest });\n out.push({ kind: \"group\", group: gi, items });\n });\n flushSkipped(groups.length);\n return out;\n}\n\nexport function useRowWindow<T>({\n enabled,\n rows,\n rowKey,\n groups,\n expanded,\n pinnedKeys,\n scrollerRef,\n tableRef,\n options,\n compact,\n rowsBefore,\n rowsAfter,\n colKeys,\n lockable,\n resetKey,\n}: {\n enabled: boolean;\n /** The rows on screen, in order. */\n rows: readonly T[];\n rowKey: (row: T) => string | number;\n groups: readonly VirtualGroup[];\n /** Indices of the open rows: always rendered, their detail rows counted. */\n expanded: readonly number[];\n /** Keys always rendered (the roving tab stop). */\n pinnedKeys: readonly (string | number | null)[];\n scrollerRef: RefObject<HTMLElement | null>;\n tableRef: RefObject<HTMLTableElement | null>;\n options: DataTableVirtualize;\n compact: boolean;\n /** Rows above the first group: the header, the leading row. */\n rowsBefore: number;\n /** Rows after the last: the totals row. */\n rowsAfter: number;\n /** The header cells' keys, in order (the selection column as {@link VIRTUAL_SELECT_COL}). */\n colKeys: readonly string[];\n /** The keys whose width is locked (not a `grow` column, not a user-resized one). */\n lockable: ReadonlySet<string>;\n /** Anything that re-measures the column widths from scratch when it changes. */\n resetKey: string;\n}): RowWindow | null {\n const overscan = Math.max(1, options.overscan ?? 12);\n const estimate = options.estimateRowHeight ?? (compact ? 29 : 37);\n const n = rows.length;\n\n const [measured, setMeasured] = useState<Measured>(() => ({\n heights: new Map(),\n details: new Map(),\n sum: 0,\n count: 0,\n band: [estimate, estimate * 0.8],\n }));\n const initialEnd = () =>\n Math.min(\n n,\n Math.ceil((typeof window === \"undefined\" ? 800 : Math.min(window.innerHeight || 800, 1600)) / estimate) +\n overscan,\n );\n const [range, setRange] = useState(() => ({ start: 0, end: initialEnd() }));\n const [focusTarget, setFocusTarget] = useState<number | null>(null);\n const [focusKey, setFocusKey] = useState<string | number | null>(null);\n const [scrollerWidth, setScrollerWidth] = useState(0);\n const [lock, setLock] = useState<{ sig: string; widths: Record<string, number> } | null>(null);\n const naturalOverflow = useRef(false);\n\n const expandedSig = expanded.join(\",\");\n // The groups by what they say, not by identity (0.52 code review, data-table.tsx): the\n // table builds them afresh on every render, and the model — `rowKey` on every row, and\n // its arrays — was rebuilt with them: 3000 rows, ~6000 `rowKey` calls per arrow step.\n const groupsSig = groups.map((g) => `${g.start}:${g.end}:${g.bands.join(\".\")}:${g.first}`).join(\",\");\n const model = useMemo<Model | null>(() => {\n if (!enabled) return null;\n const keys = rows.map(rowKey);\n const avg = measured.count > 0 ? measured.sum / measured.count : estimate;\n const open = new Set(expanded);\n const h = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n h[i] = (measured.heights.get(keys[i]) ?? avg) + (open.has(i) ? (measured.details.get(keys[i]) ?? 0) : 0);\n }\n const tops = new Float64Array(n + 1);\n const gTop = new Float64Array(groups.length + 1);\n const ariaRows = new Int32Array(n);\n const ariaBands = new Int32Array(groups.length * 2);\n let y = 0;\n let aria = rowsBefore + 1;\n groups.forEach((g, gi) => {\n gTop[gi] = y;\n for (const level of g.bands) {\n y += measured.band[level - 1];\n ariaBands[gi * 2 + level - 1] = aria++;\n }\n for (let i = g.start; i < g.end; i++) {\n tops[i] = y;\n y += h[i];\n ariaRows[i] = aria++;\n if (open.has(i)) aria++;\n }\n });\n gTop[groups.length] = y;\n tops[n] = y;\n return { n, keys, tops, h, gTop, total: y, ariaRows, ariaBands, rowCount: aria - 1 + rowsAfter };\n // `expanded` and `groups` by their signatures.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, rows, rowKey, groupsSig, expandedSig, measured, estimate, n, rowsBefore, rowsAfter]);\n\n // The rows outside the range that stay: open rows, the tab stop, the focused row and\n // the keyboard's target.\n const pinned = useMemo(() => {\n if (!model) return [];\n const out = [...expanded];\n for (const key of [...pinnedKeys, focusKey]) {\n if (key === null) continue;\n const i = model.keys.indexOf(key);\n if (i >= 0) out.push(i);\n }\n if (focusTarget !== null) out.push(focusTarget);\n return out;\n }, [model, expanded, pinnedKeys, focusKey, focusTarget]);\n const pinnedSig = pinned.join(\",\");\n\n const start = Math.min(range.start, n);\n const end = Math.min(range.end, n);\n const bodies = useMemo(\n () => (model ? planBodies(model, groups, start, end, pinned) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [model, groupsSig, start, end, pinnedSig],\n );\n\n const lockSig = `${resetKey}|${scrollerWidth}|${colKeys.join(\",\")}`;\n const colWidths = lock && lock.sig === lockSig ? lock.widths : null;\n\n // What the scroll handler and the frame's measure read: this render's model and lock.\n const latest = useRef({ model, colWidths, lockSig, colKeys, lockable, overscan });\n useLayoutEffect(() => {\n latest.current = { model, colWidths, lockSig, colKeys, lockable, overscan };\n });\n\n // Which rows the visible part of the scroller (and of the window, for a table in a page\n // that scrolls) shows, and a new range around them when the rendered one no longer\n // covers them. Read from the client rects, which a scroll leaves laid out.\n const update = useCallback(() => {\n const { model: m, overscan: over } = latest.current;\n const sc = scrollerRef.current;\n const table = tableRef.current;\n if (!m || !sc || !table) return;\n const origin = table.querySelector<HTMLElement>(\":scope > tbody[data-vt-body]\");\n if (!origin) return;\n const sr = sc.getBoundingClientRect();\n const top = Math.max(sr.top, 0);\n const bottom = Math.min(sr.bottom, window.innerHeight || sr.bottom);\n if (!(bottom > top)) return;\n const o = origin.getBoundingClientRect().top;\n const a = Math.min(firstBelow(m, top - o), m.n);\n const b = Math.max(a, Math.min(lastAbove(m, bottom - o), m.n));\n setRange((prev) =>\n prev.start <= a && prev.end >= b && prev.end <= m.n && prev.end - prev.start <= b - a + 4 * over\n ? prev\n : { start: Math.max(0, a - over), end: Math.min(m.n, b + over) },\n );\n }, [scrollerRef, tableRef]);\n\n // After a render that changed what is drawn: measure the rendered rows and bands, and\n // the header cells for the lock. Not after a render that only ticked a box. In the next\n // animation frame rather than in the commit: there the browser lays the table out once\n // for the frame anyway, where a read in the commit forced a layout of its own, and the\n // re-render the heights cause forced another (Chromium, 3000 rows: 35–130 ms of forced\n // layout per scrolled step, against one layout per frame now).\n const measure = useCallback(() => {\n const { model: m, colWidths: locked, lockSig: sig, colKeys: cols, lockable: lockKeys } = latest.current;\n const table = tableRef.current;\n const sc = scrollerRef.current;\n if (!m || !table || !sc) return;\n const trs = table.rows;\n const rects = Array.from(trs, (tr) => tr.getBoundingClientRect());\n const rowSamples: [string | number, number][] = [];\n const detailSamples: [string | number, number][] = [];\n const bandSamples: [0 | 1, number][] = [];\n for (let k = 0; k < trs.length; k++) {\n const own = rects[k];\n const next = rects[k + 1];\n // The distance to the next row's top: exact under collapsed borders.\n const h = next && next.top > own.top ? next.top - own.top : own.height;\n if (!(h > 0)) continue;\n const ds = trs[k].dataset;\n if (ds.rowIndex !== undefined) {\n const key = m.keys[Number(ds.rowIndex)];\n if (key !== undefined) rowSamples.push([key, h]);\n } else if (ds.rowDetail !== undefined) {\n const key = m.keys[Number(ds.rowDetail)];\n if (key !== undefined) detailSamples.push([key, h]);\n } else if (ds.groupRow === \"1\" || ds.groupRow === \"2\") {\n bandSamples.push([ds.groupRow === \"1\" ? 0 : 1, h]);\n }\n }\n if (rowSamples.length + detailSamples.length + bandSamples.length > 0) {\n setMeasured((prev) => {\n let { heights, details, sum, count } = prev;\n let band = prev.band;\n for (const [key, h] of rowSamples) {\n const old = heights.get(key);\n if (old !== undefined && Math.abs(old - h) <= 0.5) continue;\n if (heights === prev.heights) heights = new Map(heights);\n heights.set(key, h);\n sum += h - (old ?? 0);\n if (old === undefined) count++;\n }\n for (const [key, h] of detailSamples) {\n const old = details.get(key);\n if (old !== undefined && Math.abs(old - h) <= 0.5) continue;\n if (details === prev.details) details = new Map(details);\n details.set(key, h);\n }\n for (const [level, h] of bandSamples) {\n if (Math.abs(band[level] - h) <= 0.5) continue;\n band = level === 0 ? [h, band[1]] : [band[0], h];\n }\n return heights === prev.heights && details === prev.details && band === prev.band\n ? prev\n : { heights, details, sum, count, band };\n });\n }\n // The column lock.\n const cells = table.tHead?.rows[0]?.cells;\n if (!cells || cells.length !== cols.length) return;\n const widths: Record<string, number> = {};\n let anyWidth = false;\n for (let c = 0; c < cells.length; c++) {\n if (!lockKeys.has(cols[c])) continue;\n const w = cells[c].getBoundingClientRect().width;\n if (w > 0) {\n widths[cols[c]] = w;\n anyWidth = true;\n }\n }\n if (!anyWidth) return;\n const over = table.getBoundingClientRect().width > sc.clientWidth + 1;\n if (!locked) {\n naturalOverflow.current = over;\n setLock({ sig, widths });\n } else if (over && !naturalOverflow.current) {\n // A grown column pushed the table past a scroller it fit: measure afresh.\n setLock(null);\n } else {\n let grew = false;\n const merged = { ...locked };\n for (const [key, w] of Object.entries(widths)) {\n if (w > (merged[key] ?? 0) + 0.5) {\n merged[key] = w;\n grew = true;\n }\n }\n if (grew) setLock({ sig, widths: merged });\n }\n }, [scrollerRef, tableRef]);\n\n const frame = useRef(0);\n const schedule = useCallback(() => {\n if (frame.current) return;\n const run = () => {\n frame.current = 0;\n measure();\n update();\n };\n frame.current =\n typeof requestAnimationFrame === \"undefined\"\n ? -(setTimeout(run, 16) as unknown as number)\n : requestAnimationFrame(run);\n }, [measure, update]);\n useEffect(\n () => () => {\n if (frame.current > 0) cancelAnimationFrame(frame.current);\n else if (frame.current < 0) clearTimeout(-frame.current);\n frame.current = 0;\n },\n [],\n );\n\n useEffect(() => {\n if (!enabled) return;\n const onScroll = () => update();\n window.addEventListener(\"scroll\", onScroll, { capture: true, passive: true });\n window.addEventListener(\"resize\", onScroll, { passive: true });\n const sc = scrollerRef.current;\n let ro: ResizeObserver | undefined;\n if (sc && typeof ResizeObserver !== \"undefined\") {\n ro = new ResizeObserver(() => {\n setScrollerWidth(Math.round(sc.clientWidth));\n update();\n });\n ro.observe(sc);\n }\n return () => {\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n window.removeEventListener(\"resize\", onScroll);\n ro?.disconnect();\n };\n }, [enabled, update, scrollerRef]);\n\n // The row holding the focus (a row, or a control in it or in its open detail) stays.\n useEffect(() => {\n const table = tableRef.current;\n if (!enabled || !table) return;\n const onIn = (e: FocusEvent) => {\n const tr = ownRowOf(table, e.target as Element | null);\n const index = tr ? Number(tr.dataset.rowIndex ?? tr.dataset.rowDetail) : NaN;\n const key = Number.isNaN(index) ? undefined : latest.current.model?.keys[index];\n setFocusKey(key ?? null);\n setFocusTarget(null);\n };\n const onOut = (e: FocusEvent) => {\n const to = e.relatedTarget as Node | null;\n if (!to || !table.contains(to)) setFocusKey(null);\n };\n table.addEventListener(\"focusin\", onIn);\n table.addEventListener(\"focusout\", onOut);\n return () => {\n table.removeEventListener(\"focusin\", onIn);\n table.removeEventListener(\"focusout\", onOut);\n };\n }, [enabled, tableRef]);\n\n const dataSig = n > 0 && model ? `${n}:${String(model.keys[0])}:${String(model.keys[n - 1])}` : \"0\";\n const renderSig = `${start}:${end}:${dataSig}:${expandedSig}:${pinnedSig}:${lockSig}:${colWidths ? 1 : 0}`;\n const lastRender = useRef(\"\");\n useLayoutEffect(() => {\n if (!enabled || lastRender.current === renderSig) return;\n lastRender.current = renderSig;\n schedule();\n });\n\n // A new layout (heights measured, rows added): the range may no longer cover the view.\n const total = model?.total ?? 0;\n useLayoutEffect(() => {\n if (enabled) schedule();\n }, [enabled, schedule, total, n]);\n\n // The keyboard's target: rendered (pinned), then focused — its focus scrolls it into\n // view, and the scroll renders the rows around it.\n useLayoutEffect(() => {\n if (focusTarget === null) return;\n // Released by the focus it receives (the `focusin` above), which pins it as the\n // focused row from then on.\n const table = tableRef.current;\n if (table) ownRowAt(table, focusTarget)?.focus();\n }, [focusTarget, bodies, tableRef]);\n\n const focusRow = useCallback(\n (i: number) => {\n const table = tableRef.current;\n const el = table && ownRowAt(table, i);\n if (el) el.focus();\n else setFocusTarget(i);\n },\n [tableRef],\n );\n\n if (!enabled || !model) return null;\n return {\n bodies,\n rowCount: model.rowCount,\n ariaRow: (i) => model.ariaRows[i],\n ariaBand: (g, level) => model.ariaBands[g * 2 + level - 1],\n colWidths,\n focusRow,\n };\n}\n\n// The window's rows are the table's OWN (0.52 code review, data-table-row.tsx): every\n// desktop row carries `data-row-index` since DSP-4, a nested DataTable's in an open row\n// too, and a lookup over the whole subtree answered for the outer table with the nested\n// one's rows — ArrowDown from row 0 went to the nested row 1, the first in document order.\n\n/** This table's row at `index`, if it is drawn. */\nfunction ownRowAt(table: HTMLTableElement, index: number): HTMLElement | null {\n return table.querySelector<HTMLElement>(`:scope > tbody > tr[data-row-index=\"${index}\"]`);\n}\n\n/** This table's row (or open detail row) that holds `node` — past a nested table's own. */\nfunction ownRowOf(table: HTMLTableElement, node: Element | null): HTMLElement | null {\n const ROW = \"tr[data-row-index], tr[data-row-detail]\";\n for (let tr = node?.closest?.<HTMLElement>(ROW) ?? null; tr; tr = tr.parentElement?.closest<HTMLElement>(ROW) ?? null)\n if (tr.parentElement?.parentElement === table) return tr;\n return null;\n}\n\n/** The roving rows' Arrow/Home/End target over ALL the rows, rendered or not. */\nexport function rowNavTarget(from: number, key: string, n: number): number | null {\n if (n === 0) return null;\n if (key === \"ArrowDown\") return Math.min(n - 1, from + 1);\n if (key === \"ArrowUp\") return Math.max(0, from - 1);\n if (key === \"Home\") return 0;\n if (key === \"End\") return n - 1;\n return null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -17,7 +17,8 @@ export interface DataTableColumn<T> {
|
|
|
17
17
|
/** What a client sort orders the column by. Strings collate in the table's `locale`
|
|
18
18
|
* (digits as numbers, case and accents left out; 0.51.7, audit 2026-10-30 DSP-3),
|
|
19
19
|
* numbers compare as numbers and sort before strings, `null` and `undefined` sort
|
|
20
|
-
* last in either direction.
|
|
20
|
+
* last in either direction. The order is `compareSortValues`, exported for an app's
|
|
21
|
+
* own list beside the table (0.52). */
|
|
21
22
|
sortBy?: (row: T) => string | number | null | undefined;
|
|
22
23
|
filter?: ColumnFilter<T>;
|
|
23
24
|
filterBy?: (row: T) => string;
|
|
@@ -203,8 +204,11 @@ export interface ServerPagination {
|
|
|
203
204
|
isLoading?: boolean;
|
|
204
205
|
}
|
|
205
206
|
export interface DataTableProps<T> {
|
|
206
|
-
|
|
207
|
-
|
|
207
|
+
/** `readonly` since 0.52 (refactor audit 2026-10-30, API-7): the table never changes the
|
|
208
|
+
* arrays it is handed, so a caller's `as const` list or a query's frozen result needs no
|
|
209
|
+
* copy. Only widens: a mutable array is still one. The same for `columns` and `sorts`. */
|
|
210
|
+
rows: readonly T[];
|
|
211
|
+
columns: readonly DataTableColumn<T>[];
|
|
208
212
|
rowKey: (row: T) => string | number;
|
|
209
213
|
defaultPageSize?: number;
|
|
210
214
|
onRowClick?: (row: T) => void;
|
|
@@ -226,6 +230,11 @@ export interface DataTableProps<T> {
|
|
|
226
230
|
* not wrap table cells, and the absolutely-positioned row overlay that is the
|
|
227
231
|
* usual workaround would sit on top of the per-cell controls these rows carry
|
|
228
232
|
* (status toggles, the selection checkbox, nested links) and swallow them.
|
|
233
|
+
*
|
|
234
|
+
* With `onRowClick` a plain click opens the row through it, in place. Without one
|
|
235
|
+
* (0.52, refactor audit 2026-10-30, DSP-23 b) the click follows the link — through the
|
|
236
|
+
* provider's `linkComponent` for an in-app path, as every kit link — and the phone
|
|
237
|
+
* card is that link too; before, the click was cancelled and opened nothing.
|
|
229
238
|
*/
|
|
230
239
|
rowHref?: (row: T) => string | undefined;
|
|
231
240
|
expandedRow?: (row: T) => ReactNode | null;
|
|
@@ -379,7 +388,7 @@ export interface DataTableProps<T> {
|
|
|
379
388
|
*/
|
|
380
389
|
filters?: FilterState;
|
|
381
390
|
onFiltersChange?: (next: FilterState) => void;
|
|
382
|
-
sorts?: SortState[];
|
|
391
|
+
sorts?: readonly SortState[];
|
|
383
392
|
onSortsChange?: (next: SortState[]) => void;
|
|
384
393
|
/**
|
|
385
394
|
* Controlled page size, as `sorts` above: the table pages by it and hands its pager's
|
|
@@ -36,7 +36,8 @@ import { ColumnSettingsPanel } from "./data-table-column-settings.js";
|
|
|
36
36
|
import { useLargeText } from "../hooks/use-large-text.js";
|
|
37
37
|
import { cn } from "../lib/cn.js";
|
|
38
38
|
import { isFilterActive, resolveFilter, rowMatches } from "./data-table-filters.js";
|
|
39
|
-
import {
|
|
39
|
+
import { matchesSearch, searchWords } from "../lib/text-match.js";
|
|
40
|
+
import { compareSortValues, nextSorts } from "./data-table-sort.js";
|
|
40
41
|
import { Pagination } from "./data-table-pagination.js";
|
|
41
42
|
import { FullBleedDialog } from "./full-bleed-dialog.js";
|
|
42
43
|
import { usePhoneLayout } from "../hooks/use-breakpoint.js";
|
|
@@ -49,7 +50,20 @@ import {
|
|
|
49
50
|
} from "../i18n/kit-labels.js";
|
|
50
51
|
import { useEdgeFade } from "../lib/strip-fade.js";
|
|
51
52
|
import { dirOf } from "../lib/direction.js";
|
|
53
|
+
import { focusContainer, focusFirst, focusIsLost, tabStops, whenFocusLeftForNothing } from "../lib/focus-left.js";
|
|
52
54
|
const FOOTER_CELL = "sticky bottom-0 z-10 bg-surface-2 shadow-[inset_0_2px_0_var(--border-strong)]";
|
|
55
|
+
const OVERLAY_SELECTOR = '[data-kit-layer],[role="dialog"],[role="alertdialog"],[aria-modal="true"],[role="menu"]';
|
|
56
|
+
function keyIndex(rows, rowKey) {
|
|
57
|
+
let at = null;
|
|
58
|
+
return (key) => {
|
|
59
|
+
if (!at) {
|
|
60
|
+
at = /* @__PURE__ */ new Map();
|
|
61
|
+
for (let i = rows.length - 1; i >= 0; i--) at.set(rowKey(rows[i]), i);
|
|
62
|
+
}
|
|
63
|
+
return at.get(key) ?? -1;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const FILTER_ANNOUNCE_DELAY_MS = 500;
|
|
53
67
|
const DEFAULT_DATA_TABLE_SORT_LABELS = {
|
|
54
68
|
sortBy: DEFAULT_DATA_TABLE_LABELS.sortBy,
|
|
55
69
|
sortDefault: DEFAULT_DATA_TABLE_LABELS.sortDefault,
|
|
@@ -57,21 +71,6 @@ const DEFAULT_DATA_TABLE_SORT_LABELS = {
|
|
|
57
71
|
sortDescending: DEFAULT_DATA_TABLE_LABELS.sortDescending
|
|
58
72
|
};
|
|
59
73
|
const flipDir = (d) => d === "asc" ? "desc" : "asc";
|
|
60
|
-
function sortCollator(locale) {
|
|
61
|
-
const options = { numeric: true, sensitivity: "base" };
|
|
62
|
-
try {
|
|
63
|
-
return new Intl.Collator(locale, options);
|
|
64
|
-
} catch {
|
|
65
|
-
return new Intl.Collator(void 0, options);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
function compareSortValues(a, b, collator) {
|
|
69
|
-
const aText = typeof a === "string";
|
|
70
|
-
const bText = typeof b === "string";
|
|
71
|
-
if (aText && bText) return collator.compare(a, b);
|
|
72
|
-
if (aText !== bText) return aText ? 1 : -1;
|
|
73
|
-
return a < b ? -1 : a > b ? 1 : 0;
|
|
74
|
-
}
|
|
75
74
|
const NO_BANDS = [];
|
|
76
75
|
const BAND_1 = [1];
|
|
77
76
|
const BAND_2 = [2];
|
|
@@ -80,6 +79,14 @@ const NO_VIRTUAL_OPTIONS = {};
|
|
|
80
79
|
import { DEFAULT_PERSIST_PREFIX, useTableState } from "./use-table-state.js";
|
|
81
80
|
import { useMobileReveal } from "./use-mobile-reveal.js";
|
|
82
81
|
import { GROW_CELL_CLASS, GROW_PEER_CELL_CLASS, useColumnFit } from "./data-table-fit.js";
|
|
82
|
+
function rowMatcher(col, state, locale) {
|
|
83
|
+
const filter = resolveFilter(col);
|
|
84
|
+
if (filter?.type === "text" && state.type === "text" && state.q.trim()) {
|
|
85
|
+
const words = searchWords(state.q, locale);
|
|
86
|
+
return (row) => matchesSearch(words, [filter.getValue(row)], locale);
|
|
87
|
+
}
|
|
88
|
+
return (row) => rowMatches(col, row, state, locale);
|
|
89
|
+
}
|
|
83
90
|
function DataTable({
|
|
84
91
|
rows,
|
|
85
92
|
columns: columnsProp,
|
|
@@ -152,7 +159,6 @@ function DataTable({
|
|
|
152
159
|
const storageKeyPrefix = storageKeyPrefixProp ?? providerStorageKeyPrefix ?? DEFAULT_PERSIST_PREFIX;
|
|
153
160
|
const labels = useMemo(() => resolveDataTableLabels(labelOverrides, labelsProp), [labelOverrides, labelsProp]);
|
|
154
161
|
const locale = useKitLocale(localeProp);
|
|
155
|
-
const collator = useMemo(() => sortCollator(locale), [locale]);
|
|
156
162
|
const { columns, swipesFromActions } = useRowActionColumn({
|
|
157
163
|
columns: columnsProp,
|
|
158
164
|
rowActions,
|
|
@@ -192,13 +198,13 @@ function DataTable({
|
|
|
192
198
|
// Ignored in `serverPagination` mode, where the owner's is the page size.
|
|
193
199
|
pageSizeProp: isServer ? void 0 : pageSizeProp
|
|
194
200
|
});
|
|
201
|
+
const growKey = columns.find((c) => c.grow)?.key;
|
|
195
202
|
const widths = useMemo(() => {
|
|
196
203
|
if (!resizable) return {};
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const { [grow]: _ignored, ...rest } = storedWidths;
|
|
204
|
+
if (!growKey || !(growKey in storedWidths)) return storedWidths;
|
|
205
|
+
const { [growKey]: _ignored, ...rest } = storedWidths;
|
|
200
206
|
return rest;
|
|
201
|
-
}, [resizable, storedWidths,
|
|
207
|
+
}, [resizable, storedWidths, growKey]);
|
|
202
208
|
const hiddenCols = useMemo(
|
|
203
209
|
() => columnSettings ? storedHiddenCols : /* @__PURE__ */ new Set(),
|
|
204
210
|
[columnSettings, storedHiddenCols]
|
|
@@ -223,17 +229,17 @@ function DataTable({
|
|
|
223
229
|
const v = f.getValue(row);
|
|
224
230
|
if (v && !seen.has(v)) seen.add(v);
|
|
225
231
|
}
|
|
226
|
-
map[col.key] = Array.from(seen).sort(
|
|
232
|
+
map[col.key] = Array.from(seen).sort((a, b) => compareSortValues(a, b, locale)).map((v) => ({ value: v, label: v }));
|
|
227
233
|
}
|
|
228
234
|
return map;
|
|
229
|
-
}, [columnSig, selectOptionsSig, rows,
|
|
235
|
+
}, [columnSig, selectOptionsSig, rows, locale]);
|
|
230
236
|
const filtered = useMemo(() => {
|
|
231
237
|
if (serverRows) return rows;
|
|
232
238
|
let result = rows;
|
|
233
239
|
for (const col of columns) {
|
|
234
240
|
const state = filters[col.key];
|
|
235
241
|
if (!state || !isFilterActive(state)) continue;
|
|
236
|
-
result = result.filter((
|
|
242
|
+
result = result.filter(rowMatcher(col, state, locale));
|
|
237
243
|
}
|
|
238
244
|
return result;
|
|
239
245
|
}, [rows, columnSig, filters, serverRows, locale]);
|
|
@@ -252,20 +258,24 @@ function DataTable({
|
|
|
252
258
|
if (av == null && bv == null) continue;
|
|
253
259
|
if (av == null) return 1;
|
|
254
260
|
if (bv == null) return -1;
|
|
255
|
-
const order = compareSortValues(av, bv,
|
|
261
|
+
const order = compareSortValues(av, bv, locale);
|
|
256
262
|
if (order !== 0) return dir === "asc" ? order : -order;
|
|
257
263
|
}
|
|
258
264
|
return 0;
|
|
259
265
|
});
|
|
260
266
|
return copy;
|
|
261
|
-
}, [filtered, sorts, columnSig, serverRows,
|
|
267
|
+
}, [filtered, sorts, columnSig, serverRows, locale]);
|
|
262
268
|
const unpaged = !isServer && (!paginated || !!loadMore || serverRows);
|
|
263
269
|
const effectivePageSize = isServer ? serverPagination.pageSize : unpaged || pageSize === Infinity ? sorted.length || 1 : pageSize;
|
|
264
270
|
const paginationTotal = isServer ? serverPagination.total : sorted.length;
|
|
265
271
|
const paginationPageSize = isServer ? serverPagination.pageSize : pageSize;
|
|
266
272
|
const totalPages = isServer ? Math.max(1, Math.ceil(serverPagination.total / Math.max(1, serverPagination.pageSize))) : Math.max(1, Math.ceil(sorted.length / effectivePageSize));
|
|
267
273
|
const safePage = isServer ? Math.min(Math.max(0, serverPagination.page), totalPages - 1) : Math.min(page, totalPages - 1);
|
|
268
|
-
const
|
|
274
|
+
const wholeList = isServer || unpaged || pageSize === Infinity;
|
|
275
|
+
const slice = useMemo(
|
|
276
|
+
() => wholeList ? sorted : sorted.slice(safePage * effectivePageSize, safePage * effectivePageSize + effectivePageSize),
|
|
277
|
+
[wholeList, sorted, safePage, effectivePageSize]
|
|
278
|
+
);
|
|
269
279
|
const toggleSort = (key, shiftKey) => {
|
|
270
280
|
const col = columns.find((c) => c.key === key);
|
|
271
281
|
const next = nextSorts(sorts, key, multiSort && shiftKey, {
|
|
@@ -324,12 +334,22 @@ function DataTable({
|
|
|
324
334
|
};
|
|
325
335
|
const filterKey = useMemo(() => JSON.stringify(filters), [filters]);
|
|
326
336
|
const announcedFilterKey = useRef(filterKey);
|
|
337
|
+
const filterSpeech = useRef({ shown: filtered.length, total: rows.length, labels });
|
|
338
|
+
useLayoutEffect(() => {
|
|
339
|
+
filterSpeech.current = { shown: filtered.length, total: rows.length, labels };
|
|
340
|
+
});
|
|
341
|
+
const filterTimer = useRef(void 0);
|
|
342
|
+
useEffect(() => () => clearTimeout(filterTimer.current), []);
|
|
327
343
|
useEffect(() => {
|
|
328
344
|
if (announcedFilterKey.current === filterKey) return;
|
|
329
345
|
announcedFilterKey.current = filterKey;
|
|
330
346
|
if (serverRows) return;
|
|
331
|
-
|
|
332
|
-
|
|
347
|
+
clearTimeout(filterTimer.current);
|
|
348
|
+
filterTimer.current = setTimeout(() => {
|
|
349
|
+
const { shown, total, labels: words } = filterSpeech.current;
|
|
350
|
+
announce(words.filterResults(shown, total));
|
|
351
|
+
}, FILTER_ANNOUNCE_DELAY_MS);
|
|
352
|
+
}, [filterKey, serverRows, announce]);
|
|
333
353
|
const goToPage = (p) => {
|
|
334
354
|
if (isServer) serverPagination.onPageChange(p);
|
|
335
355
|
else setPage(p);
|
|
@@ -342,8 +362,11 @@ function DataTable({
|
|
|
342
362
|
headRefs,
|
|
343
363
|
scroller: () => desktopScroller.current,
|
|
344
364
|
enabled: !usePhoneLayout(),
|
|
345
|
-
// Measured only when one of these changed (0.48.2): not on a ticked box.
|
|
346
|
-
|
|
365
|
+
// Measured only when one of these changed (0.48.2): not on a ticked box. The columns
|
|
366
|
+
// by their keys (DSP-19): an inline `columns={…}` is a new array every render. The
|
|
367
|
+
// locale (0.52 code review, data-table.tsx): the cells' dates, numbers and the kit's
|
|
368
|
+
// words follow it under the same rows and keys; the fit adds the headers' drawn text.
|
|
369
|
+
content: [slice, columnSig, hiddenCols, widths, density, large, locale]
|
|
347
370
|
});
|
|
348
371
|
const visibleColumns = useMemo(
|
|
349
372
|
() => columns.filter((c) => !hiddenCols.has(c.key) && !autoHidden.has(c.key)),
|
|
@@ -440,6 +463,7 @@ function DataTable({
|
|
|
440
463
|
}, [phoneFill]);
|
|
441
464
|
const [phoneLeadHeight, setPhoneLeadHeight] = useState(0);
|
|
442
465
|
const { mobileSlice, canRevealMoreMobile, loadMoreRef } = useMobileReveal({
|
|
466
|
+
// Read only there; its `T[]` widens to `readonly T[]` with its owner (API-7).
|
|
443
467
|
rows: sorted,
|
|
444
468
|
slice,
|
|
445
469
|
isServer,
|
|
@@ -462,10 +486,36 @@ function DataTable({
|
|
|
462
486
|
});
|
|
463
487
|
const rowsFocusable = !!onRowClick;
|
|
464
488
|
const [focusRowKey, setFocusRowKey] = useState(null);
|
|
465
|
-
const
|
|
489
|
+
const sliceIndex = useMemo(() => keyIndex(slice, rowKey), [slice]);
|
|
490
|
+
const mobileIndex = useMemo(() => keyIndex(mobileSlice, rowKey), [mobileSlice]);
|
|
491
|
+
const tabRowKey = focusRowKey !== null && sliceIndex(focusRowKey) !== -1 ? focusRowKey : slice.length ? rowKey(slice[0]) : null;
|
|
466
492
|
const virtualOn = !!virtualize && isMdUp && slice.length > 0;
|
|
467
493
|
const focusRowRef = useRef(void 0);
|
|
494
|
+
const heldRow = useRef(null);
|
|
495
|
+
const noteRowFocus = (key) => {
|
|
496
|
+
heldRow.current = { key, index: (isMdUp ? sliceIndex : mobileIndex)(key) };
|
|
497
|
+
};
|
|
498
|
+
const overlayWatch = useRef(null);
|
|
499
|
+
const settleRef = useRef(() => {
|
|
500
|
+
});
|
|
501
|
+
const watchOverlay = (layer) => {
|
|
502
|
+
if (overlayWatch.current?.layer === layer) return;
|
|
503
|
+
overlayWatch.current?.stop();
|
|
504
|
+
const observer = new MutationObserver(() => {
|
|
505
|
+
if (layer.isConnected) return;
|
|
506
|
+
stop();
|
|
507
|
+
settleRef.current();
|
|
508
|
+
});
|
|
509
|
+
const stop = () => {
|
|
510
|
+
observer.disconnect();
|
|
511
|
+
if (overlayWatch.current?.layer === layer) overlayWatch.current = null;
|
|
512
|
+
};
|
|
513
|
+
observer.observe(layer.ownerDocument.body, { childList: true, subtree: true });
|
|
514
|
+
overlayWatch.current = { layer, stop };
|
|
515
|
+
};
|
|
516
|
+
useEffect(() => () => overlayWatch.current?.stop(), []);
|
|
468
517
|
const latestRowCtx = {
|
|
518
|
+
noteFocus: noteRowFocus,
|
|
469
519
|
moveFocus: virtualOn ? (from, key) => {
|
|
470
520
|
const target = rowNavTarget(from, key, slice.length);
|
|
471
521
|
if (target === null) return false;
|
|
@@ -497,7 +547,7 @@ function DataTable({
|
|
|
497
547
|
const closeDialog = () => {
|
|
498
548
|
if (mobileDialogRow) onRowClick?.(mobileDialogRow);
|
|
499
549
|
};
|
|
500
|
-
const renderMobileRow = (row) => {
|
|
550
|
+
const renderMobileRow = (row, index) => {
|
|
501
551
|
const key = rowKey(row);
|
|
502
552
|
const expanded = isExpanded?.(row) ?? false;
|
|
503
553
|
return /* @__PURE__ */ jsx(
|
|
@@ -505,6 +555,7 @@ function DataTable({
|
|
|
505
555
|
{
|
|
506
556
|
ctx: rowCtx,
|
|
507
557
|
rowKey: key,
|
|
558
|
+
rowIndex: index,
|
|
508
559
|
row,
|
|
509
560
|
expanded,
|
|
510
561
|
expansion: expanded ? openedRowContent(row) : null,
|
|
@@ -590,13 +641,47 @@ function DataTable({
|
|
|
590
641
|
useLayoutEffect(() => {
|
|
591
642
|
focusRowRef.current = focusRowAt;
|
|
592
643
|
}, [focusRowAt]);
|
|
644
|
+
const settleFocus = () => {
|
|
645
|
+
const held = heldRow.current;
|
|
646
|
+
if (!held) return;
|
|
647
|
+
const now = (isMdUp ? sliceIndex : mobileIndex)(held.key);
|
|
648
|
+
if (now !== -1) {
|
|
649
|
+
held.index = now;
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
const list = isMdUp ? tableRef.current : phoneListRef.current;
|
|
653
|
+
const layer = focusIsLost() ? null : document.activeElement?.closest(OVERLAY_SELECTOR);
|
|
654
|
+
if (layer && !(list && layer.contains(list))) {
|
|
655
|
+
watchOverlay(layer);
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
heldRow.current = null;
|
|
659
|
+
overlayWatch.current?.stop();
|
|
660
|
+
if (!list || !focusIsLost()) return;
|
|
661
|
+
const shown = isMdUp ? slice : mobileSlice;
|
|
662
|
+
const at = shown.length === 0 ? -1 : Math.min(Math.max(held.index, 0), shown.length - 1);
|
|
663
|
+
if (at === -1) list.focus();
|
|
664
|
+
else if (isMdUp && virtualOn && rowsFocusable) focusRowRef.current?.(at);
|
|
665
|
+
else {
|
|
666
|
+
const row = list.querySelector(
|
|
667
|
+
isMdUp ? `:scope > tbody > tr[data-row-index="${at}"]` : `:scope > li[data-row-index="${at}"]`
|
|
668
|
+
);
|
|
669
|
+
const stops = !row ? [] : isMdUp && rowsFocusable ? [row] : tabStops(row, { includeSelf: false });
|
|
670
|
+
if (!focusFirst(stops)) focusContainer(list);
|
|
671
|
+
}
|
|
672
|
+
announce(labels.filterResults(paginationTotal, isServer ? paginationTotal : rows.length));
|
|
673
|
+
};
|
|
674
|
+
useLayoutEffect(() => {
|
|
675
|
+
settleRef.current = settleFocus;
|
|
676
|
+
settleFocus();
|
|
677
|
+
});
|
|
593
678
|
const mobileLevel = typeof mobileGroupBy === "function" ? null : mobileGroupBy ?? null;
|
|
594
679
|
const mobileKey = typeof mobileGroupBy === "function" ? mobileGroupBy : mobileGroupBy?.key;
|
|
595
|
-
const mobileGroups = mobileKey ? mobileSlice.reduce((acc, row) => {
|
|
680
|
+
const mobileGroups = mobileKey ? mobileSlice.reduce((acc, row, i) => {
|
|
596
681
|
const key = mobileKey(row);
|
|
597
682
|
const last = acc[acc.length - 1];
|
|
598
683
|
if (last && last.key === key) last.rows.push(row);
|
|
599
|
-
else acc.push({ key, rows: [row] });
|
|
684
|
+
else acc.push({ key, rows: [row], start: i });
|
|
600
685
|
return acc;
|
|
601
686
|
}, []) : null;
|
|
602
687
|
const Root = frame ? FramedRoot : PlainRoot;
|
|
@@ -607,6 +692,18 @@ function DataTable({
|
|
|
607
692
|
"data-frame": frame ? void 0 : "none",
|
|
608
693
|
"data-clips": frame ? "" : void 0,
|
|
609
694
|
"data-fill-height": fillHeight ? "" : void 0,
|
|
695
|
+
onFocusCapture: () => {
|
|
696
|
+
heldRow.current = null;
|
|
697
|
+
overlayWatch.current?.stop();
|
|
698
|
+
},
|
|
699
|
+
onBlur: (e) => {
|
|
700
|
+
const to = e.relatedTarget;
|
|
701
|
+
if (to instanceof Element && !to.closest(OVERLAY_SELECTOR)) heldRow.current = null;
|
|
702
|
+
const held = heldRow.current;
|
|
703
|
+
whenFocusLeftForNothing(e, () => {
|
|
704
|
+
if (heldRow.current === held) heldRow.current = null;
|
|
705
|
+
});
|
|
706
|
+
},
|
|
610
707
|
className: cn(
|
|
611
708
|
"group/table",
|
|
612
709
|
frame ? "overflow-clip" : "min-w-0",
|
|
@@ -693,6 +790,8 @@ function DataTable({
|
|
|
693
790
|
"ul",
|
|
694
791
|
{
|
|
695
792
|
ref: phoneListRef,
|
|
793
|
+
"aria-label": labels.table,
|
|
794
|
+
tabIndex: mobileSlice.length === 0 ? -1 : void 0,
|
|
696
795
|
className: cn(
|
|
697
796
|
"divide-y divide-subtle",
|
|
698
797
|
// Under `fillHeight` the list takes the room its parent gives it, and in a
|
|
@@ -721,7 +820,7 @@ function DataTable({
|
|
|
721
820
|
]
|
|
722
821
|
}
|
|
723
822
|
),
|
|
724
|
-
g.rows.map(renderMobileRow)
|
|
823
|
+
g.rows.map((r, i) => renderMobileRow(r, g.start + i))
|
|
725
824
|
] }, `hb-group:${g.key}`)) : mobileSlice.map(renderMobileRow),
|
|
726
825
|
mobileSlice.length === 0 && /* @__PURE__ */ jsx("li", { className: cn("text-center text-muted", compact ? "px-3 py-3 text-xs" : "px-4 py-6 text-sm"), children: isLoading ? /* @__PURE__ */ jsx(LoadingText, { label: labels.loading }) : empty ?? labels.empty }),
|
|
727
826
|
canRevealMoreMobile && /* @__PURE__ */ jsx("li", { ref: loadMoreRef, className: "px-4 py-4 text-center text-xs text-placeholder", children: /* @__PURE__ */ jsx("bdi", { children: labels.loading }) }),
|
|
@@ -781,6 +880,9 @@ function DataTable({
|
|
|
781
880
|
FullBleedDialog,
|
|
782
881
|
{
|
|
783
882
|
open: dialogOpen,
|
|
883
|
+
onFocus: () => {
|
|
884
|
+
if (mobileDialogRow) noteRowFocus(rowKey(mobileDialogRow));
|
|
885
|
+
},
|
|
784
886
|
onClose: closeDialog,
|
|
785
887
|
closeLabel: labels.close,
|
|
786
888
|
header: mobileDialogRow ? mobilePrimaryCol?.cell(mobileDialogRow) : null,
|
|
@@ -807,6 +909,7 @@ function DataTable({
|
|
|
807
909
|
className: cn("w-full", compact ? "text-xs" : "text-sm"),
|
|
808
910
|
"data-fit-grow": growDrawn ? "" : void 0,
|
|
809
911
|
"aria-label": labels.table,
|
|
912
|
+
tabIndex: slice.length === 0 ? -1 : void 0,
|
|
810
913
|
"aria-busy": isLoading || void 0,
|
|
811
914
|
"aria-rowcount": rowWindow?.rowCount,
|
|
812
915
|
"data-virtualized": rowWindow ? "" : void 0,
|