@eifi1/ui-kit 0.33.1 → 0.34.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 +444 -282
- package/dist/account/account-parts.d.ts +6 -8
- package/dist/account/account-parts.js +1 -2
- package/dist/account/account-parts.js.map +1 -1
- package/dist/{components → account}/account-settings-labels.d.ts +16 -10
- package/dist/{components → account}/account-settings-labels.js +3 -1
- package/dist/account/account-settings-labels.js.map +1 -0
- package/dist/{components → account}/account-settings.d.ts +53 -23
- package/dist/{components → account}/account-settings.js +97 -26
- package/dist/account/account-settings.js.map +1 -0
- package/dist/account/data-export-setting-labels.d.ts +2 -0
- package/dist/account/data-export-setting-labels.js +15 -0
- package/dist/account/data-export-setting-labels.js.map +1 -0
- package/dist/account/data-export-setting.d.ts +9 -11
- package/dist/account/data-export-setting.js +11 -27
- package/dist/account/data-export-setting.js.map +1 -1
- package/dist/account/delete-account-setting-labels.d.ts +2 -0
- package/dist/account/delete-account-setting-labels.js +23 -0
- package/dist/account/delete-account-setting-labels.js.map +1 -0
- package/dist/account/delete-account-setting.d.ts +132 -101
- package/dist/account/delete-account-setting.js +7 -23
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/account/email-change-setting-labels.d.ts +2 -0
- package/dist/account/email-change-setting-labels.js +28 -0
- package/dist/account/email-change-setting-labels.js.map +1 -0
- package/dist/account/email-change-setting.d.ts +10 -12
- package/dist/account/email-change-setting.js +11 -30
- package/dist/account/email-change-setting.js.map +1 -1
- package/dist/{components → account}/passkeys-setting.d.ts +9 -12
- package/dist/{components → account}/passkeys-setting.js +10 -7
- package/dist/account/passkeys-setting.js.map +1 -0
- package/dist/account/sessions-setting-labels.d.ts +2 -0
- package/dist/account/sessions-setting-labels.js +22 -0
- package/dist/account/sessions-setting-labels.js.map +1 -0
- package/dist/account/sessions-setting.d.ts +12 -14
- package/dist/account/sessions-setting.js +8 -23
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm-labels.d.ts +2 -0
- package/dist/admin/admin-action-confirm-labels.js +16 -0
- package/dist/admin/admin-action-confirm-labels.js.map +1 -0
- package/dist/admin/admin-action-confirm.d.ts +156 -101
- package/dist/admin/admin-action-confirm.js +17 -22
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-action-log-labels.d.ts +2 -0
- package/dist/admin/admin-action-log-labels.js +73 -0
- package/dist/admin/admin-action-log-labels.js.map +1 -0
- package/dist/admin/admin-action-log.d.ts +98 -22
- package/dist/admin/admin-action-log.js +48 -45
- package/dist/admin/admin-action-log.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +7 -14
- package/dist/admin/admin-parts.js +0 -4
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/invitations-panel-labels.d.ts +2 -0
- package/dist/admin/invitations-panel-labels.js +29 -0
- package/dist/admin/invitations-panel-labels.js.map +1 -0
- package/dist/admin/invitations-panel.d.ts +167 -101
- package/dist/admin/invitations-panel.js +12 -31
- package/dist/admin/invitations-panel.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -0
- package/dist/admin/plan-change-labels.js +22 -0
- package/dist/admin/plan-change-labels.js.map +1 -0
- package/dist/admin/plan-change.d.ts +244 -101
- package/dist/admin/plan-change.js +16 -24
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor-labels.d.ts +2 -0
- package/dist/admin/reviewer-scope-editor-labels.js +14 -0
- package/dist/admin/reviewer-scope-editor-labels.js.map +1 -0
- package/dist/admin/reviewer-scope-editor.d.ts +95 -101
- package/dist/admin/reviewer-scope-editor.js +5 -13
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/admin/role-select-labels.d.ts +2 -0
- package/dist/admin/role-select-labels.js +15 -0
- package/dist/admin/role-select-labels.js.map +1 -0
- package/dist/admin/role-select.d.ts +136 -101
- package/dist/admin/role-select.js +7 -18
- package/dist/admin/role-select.js.map +1 -1
- package/dist/admin/transfer-ownership-dialog-labels.d.ts +2 -0
- package/dist/admin/transfer-ownership-dialog-labels.js +18 -0
- package/dist/admin/transfer-ownership-dialog-labels.js.map +1 -0
- package/dist/admin/transfer-ownership-dialog.d.ts +81 -101
- package/dist/admin/transfer-ownership-dialog.js +3 -15
- package/dist/admin/transfer-ownership-dialog.js.map +1 -1
- package/dist/admin/user-roster-labels.d.ts +2 -0
- package/dist/admin/user-roster-labels.js +16 -0
- package/dist/admin/user-roster-labels.js.map +1 -0
- package/dist/admin/user-roster.d.ts +225 -101
- package/dist/admin/user-roster.js +4 -14
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/accept-invitation-labels.d.ts +2 -0
- package/dist/auth/accept-invitation-labels.js +20 -0
- package/dist/auth/accept-invitation-labels.js.map +1 -0
- package/dist/auth/accept-invitation.d.ts +11 -13
- package/dist/auth/accept-invitation.js +3 -16
- package/dist/auth/accept-invitation.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +34 -23
- package/dist/auth/auth-errors.js +8 -4
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog-labels.d.ts +2 -0
- package/dist/auth/complete-name-dialog-labels.js +14 -0
- package/dist/auth/complete-name-dialog-labels.js.map +1 -0
- package/dist/auth/complete-name-dialog.d.ts +9 -11
- package/dist/auth/complete-name-dialog.js +4 -11
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/email-tag.d.ts +2 -4
- package/dist/auth/forgot-password-form-labels.d.ts +3 -0
- package/dist/auth/forgot-password-form-labels.js +17 -0
- package/dist/auth/forgot-password-form-labels.js.map +1 -0
- package/dist/auth/forgot-password-form.d.ts +9 -12
- package/dist/auth/forgot-password-form.js +6 -15
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/form-rules.d.ts +5 -7
- package/dist/auth/new-password-fields.d.ts +4 -8
- package/dist/auth/new-password-fields.js +1 -1
- package/dist/auth/new-password-fields.js.map +1 -1
- package/dist/auth/not-found-page-labels.d.ts +2 -0
- package/dist/auth/not-found-page-labels.js +11 -0
- package/dist/auth/not-found-page-labels.js.map +1 -0
- package/dist/auth/not-found-page.d.ts +9 -11
- package/dist/auth/not-found-page.js +5 -10
- package/dist/auth/not-found-page.js.map +1 -1
- package/dist/auth/register-form-labels.d.ts +3 -0
- package/dist/auth/register-form-labels.js +28 -0
- package/dist/auth/register-form-labels.js.map +1 -0
- package/dist/auth/register-form.d.ts +174 -101
- package/dist/auth/register-form.js +11 -31
- package/dist/auth/register-form.js.map +1 -1
- package/dist/auth/reset-password-form-labels.d.ts +3 -0
- package/dist/auth/reset-password-form-labels.js +24 -0
- package/dist/auth/reset-password-form-labels.js.map +1 -0
- package/dist/auth/reset-password-form.d.ts +12 -15
- package/dist/auth/reset-password-form.js +6 -22
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.d.ts +3 -0
- package/dist/auth/sign-in-form-labels.js +42 -0
- package/dist/auth/sign-in-form-labels.js.map +1 -0
- package/dist/auth/sign-in-form.d.ts +15 -19
- package/dist/auth/sign-in-form.js +12 -46
- package/dist/auth/sign-in-form.js.map +1 -1
- package/dist/auth/status-parts.d.ts +13 -17
- package/dist/auth/status-parts.js +3 -3
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.d.ts +2 -0
- package/dist/auth/verify-email-labels.js +25 -0
- package/dist/auth/verify-email-labels.js.map +1 -0
- package/dist/auth/verify-email.d.ts +15 -17
- package/dist/auth/verify-email.js +4 -21
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/billing-banner.d.ts +8 -109
- package/dist/billing/billing-banner.js +2 -1
- package/dist/billing/billing-banner.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +168 -101
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/billing-lock.d.ts +10 -110
- package/dist/billing/billing-overview.d.ts +7 -109
- package/dist/billing/billing-standing.d.ts +6 -108
- package/dist/billing/checkout-processing.d.ts +8 -111
- package/dist/billing/checkout-processing.js +2 -9
- package/dist/billing/checkout-processing.js.map +1 -1
- package/dist/billing/checkout-return.d.ts +5 -7
- package/dist/billing/pay-page.d.ts +15 -117
- package/dist/billing/plan-card.d.ts +14 -115
- package/dist/billing/plan-card.js +15 -13
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-limit-notice.d.ts +8 -109
- package/dist/billing/plan-limit-notice.js +1 -1
- package/dist/billing/plan-limit-notice.js.map +1 -1
- package/dist/billing/plan-limit-toast.d.ts +6 -107
- package/dist/billing/plan-limit.d.ts +2 -4
- package/dist/billing/plan-price.d.ts +10 -12
- package/dist/billing/subscription-actions.d.ts +6 -109
- package/dist/billing/subscription-actions.js +2 -2
- package/dist/billing/subscription-actions.js.map +1 -1
- package/dist/billing/subscription-status-chip.d.ts +7 -108
- package/dist/chart.d.ts +12 -113
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips-labels.d.ts +10 -0
- package/dist/components/account-chips-labels.js +15 -0
- package/dist/components/account-chips-labels.js.map +1 -0
- package/dist/components/account-chips.d.ts +22 -44
- package/dist/components/account-chips.js +9 -14
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +15 -11
- package/dist/components/alert-banner.js +28 -18
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +66 -110
- package/dist/components/amount-input.js +259 -283
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/appearance-labels.d.ts +6 -10
- package/dist/components/appearance-labels.js.map +1 -1
- package/dist/components/authed-image-labels.d.ts +2 -0
- package/dist/components/authed-image-labels.js +10 -0
- package/dist/components/authed-image-labels.js.map +1 -0
- package/dist/components/authed-image.d.ts +11 -13
- package/dist/components/authed-image.js +2 -6
- package/dist/components/authed-image.js.map +1 -1
- package/dist/components/autocomplete.d.ts +13 -11
- package/dist/components/autocomplete.js +33 -28
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/breadcrumbs-labels.d.ts +2 -0
- package/dist/components/breadcrumbs-labels.js +9 -0
- package/dist/components/breadcrumbs-labels.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +10 -12
- package/dist/components/breadcrumbs.js +7 -10
- package/dist/components/breadcrumbs.js.map +1 -1
- package/dist/components/bulk-action-bar-labels.d.ts +2 -0
- package/dist/components/bulk-action-bar-labels.js +10 -0
- package/dist/components/bulk-action-bar-labels.js.map +1 -0
- package/dist/components/bulk-action-bar.d.ts +10 -12
- package/dist/components/bulk-action-bar.js +9 -12
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-group.d.ts +7 -110
- package/dist/components/button-group.js +5 -5
- package/dist/components/button-group.js.map +1 -1
- package/dist/components/button-look.d.ts +88 -0
- package/dist/components/button-look.js +91 -0
- package/dist/components/button-look.js.map +1 -0
- package/dist/components/button.d.ts +153 -0
- package/dist/components/button.js +165 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calculator.d.ts +8 -107
- package/dist/components/calculator.js +10 -7
- package/dist/components/calculator.js.map +1 -1
- package/dist/components/calendar-heatmap-labels.d.ts +3 -0
- package/dist/components/calendar-heatmap-labels.js +12 -0
- package/dist/components/calendar-heatmap-labels.js.map +1 -0
- package/dist/components/calendar-heatmap.d.ts +13 -16
- package/dist/components/calendar-heatmap.js +7 -13
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/card.d.ts +145 -0
- package/dist/components/card.js +186 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/chart-height.d.ts +4 -7
- package/dist/components/chart-zoom-core.d.ts +202 -0
- package/dist/components/chart-zoom-core.js +334 -0
- package/dist/components/chart-zoom-core.js.map +1 -0
- package/dist/components/chart-zoom.d.ts +39 -205
- package/dist/components/chart-zoom.js +15 -316
- package/dist/components/chart-zoom.js.map +1 -1
- package/dist/components/chart.d.ts +11 -15
- package/dist/components/chart.js +11 -11
- package/dist/components/chart.js.map +1 -1
- package/dist/components/checkbox-group.d.ts +6 -10
- package/dist/components/checkbox-group.js +10 -9
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/checkbox.d.ts +8 -12
- package/dist/components/checkbox.js +20 -18
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/chip-input.d.ts +73 -0
- package/dist/components/chip-input.js +224 -0
- package/dist/components/chip-input.js.map +1 -0
- package/dist/components/chip-labels.d.ts +2 -0
- package/dist/components/chip-labels.js +12 -0
- package/dist/components/chip-labels.js.map +1 -0
- package/dist/components/chip.d.ts +18 -93
- package/dist/components/chip.js +74 -426
- package/dist/components/chip.js.map +1 -1
- package/dist/components/choice-card.d.ts +21 -18
- package/dist/components/choice-card.js +45 -45
- package/dist/components/choice-card.js.map +1 -1
- package/dist/components/column-mapper-labels.d.ts +5 -0
- package/dist/components/column-mapper-labels.js +34 -0
- package/dist/components/column-mapper-labels.js.map +1 -0
- package/dist/components/column-mapper.d.ts +15 -17
- package/dist/components/column-mapper.js +11 -37
- package/dist/components/column-mapper.js.map +1 -1
- package/dist/components/combobox-core.d.ts +79 -40
- package/dist/components/combobox-core.js +187 -121
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox-suggestions.d.ts +76 -0
- package/dist/components/combobox-suggestions.js +56 -0
- package/dist/components/combobox-suggestions.js.map +1 -0
- package/dist/components/combobox.d.ts +14 -159
- package/dist/components/combobox.js +40 -507
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/confirm-dialog-labels.d.ts +7 -0
- package/dist/components/confirm-dialog-labels.js +10 -0
- package/dist/components/confirm-dialog-labels.js.map +1 -0
- package/dist/components/confirm-dialog.d.ts +165 -101
- package/dist/components/confirm-dialog.js +2 -6
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/copy-button-labels.d.ts +2 -0
- package/dist/components/copy-button-labels.js +12 -0
- package/dist/components/copy-button-labels.js.map +1 -0
- package/dist/components/copy-button.d.ts +70 -101
- package/dist/components/copy-button.js +4 -9
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select-labels.d.ts +2 -0
- package/dist/components/country-select-labels.js +10 -0
- package/dist/components/country-select-labels.js.map +1 -0
- package/dist/components/country-select.d.ts +18 -15
- package/dist/components/country-select.js +49 -64
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.d.ts +63 -0
- package/dist/components/currency-option-list.js +135 -0
- package/dist/components/currency-option-list.js.map +1 -0
- package/dist/components/currency-select.d.ts +10 -30
- package/dist/components/currency-select.js +50 -133
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm-labels.d.ts +14 -0
- package/dist/components/danger-confirm-labels.js +17 -0
- package/dist/components/danger-confirm-labels.js.map +1 -0
- package/dist/components/danger-confirm.d.ts +448 -101
- package/dist/components/danger-confirm.js +40 -46
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-cells.d.ts +9 -24
- package/dist/components/data-table-cells.js +1 -1
- package/dist/components/data-table-cells.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +16 -0
- package/dist/components/data-table-column-settings.js +119 -0
- package/dist/components/data-table-column-settings.js.map +1 -0
- package/dist/components/data-table-filter-popover.d.ts +5 -19
- package/dist/components/data-table-filter-popover.js +39 -22
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +93 -15
- package/dist/components/data-table-filters.js +22 -7
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-head.d.ts +36 -0
- package/dist/components/data-table-head.js +190 -0
- package/dist/components/data-table-head.js.map +1 -0
- package/dist/components/data-table-labels.d.ts +124 -15
- package/dist/components/data-table-labels.js +9 -5
- package/dist/components/data-table-labels.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +106 -0
- package/dist/components/data-table-mobile.js +412 -0
- package/dist/components/data-table-mobile.js.map +1 -0
- package/dist/components/data-table-pagination.d.ts +6 -21
- package/dist/components/data-table-pagination.js +7 -7
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +37 -0
- package/dist/components/data-table-resize.js +103 -0
- package/dist/components/data-table-resize.js.map +1 -0
- package/dist/components/data-table-row-actions.d.ts +24 -0
- package/dist/components/data-table-row-actions.js +95 -0
- package/dist/components/data-table-row-actions.js.map +1 -0
- package/dist/components/data-table-selection.d.ts +21 -0
- package/dist/components/data-table-selection.js +30 -0
- package/dist/components/data-table-selection.js.map +1 -0
- package/dist/components/data-table-shared.d.ts +77 -0
- package/dist/components/data-table-shared.js +77 -0
- package/dist/components/data-table-shared.js.map +1 -0
- package/dist/components/data-table-sort.d.ts +8 -10
- package/dist/components/data-table.d.ts +603 -15
- package/dist/components/data-table.js +134 -927
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +203 -0
- package/dist/components/date-field.js +270 -0
- package/dist/components/date-field.js.map +1 -0
- package/dist/components/date-picker.d.ts +6 -261
- package/dist/components/date-picker.js +24 -760
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +125 -0
- package/dist/components/date-range-picker.js +261 -0
- package/dist/components/date-range-picker.js.map +1 -0
- package/dist/components/description-list-labels.d.ts +2 -0
- package/dist/components/description-list-labels.js +8 -0
- package/dist/components/description-list-labels.js.map +1 -0
- package/dist/components/description-list.d.ts +13 -15
- package/dist/components/description-list.js +17 -11
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog-frame-labels.d.ts +2 -0
- package/dist/components/dialog-frame-labels.js +6 -0
- package/dist/components/dialog-frame-labels.js.map +1 -0
- package/dist/components/dialog-frame.d.ts +7 -11
- package/dist/components/dialog-frame.js +6 -6
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/disclosure.d.ts +6 -10
- package/dist/components/disclosure.js +11 -11
- package/dist/components/disclosure.js.map +1 -1
- package/dist/components/dropdown.d.ts +55 -27
- package/dist/components/dropdown.js +53 -30
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/empty-state.d.ts +64 -0
- package/dist/components/empty-state.js +70 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/entity-combobox.d.ts +10 -11
- package/dist/components/entity-combobox.js +14 -13
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/error-boundary-labels.d.ts +2 -0
- package/dist/components/error-boundary-labels.js +19 -0
- package/dist/components/error-boundary-labels.js.map +1 -0
- package/dist/components/error-boundary.d.ts +17 -17
- package/dist/components/error-boundary.js +5 -17
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/facing-pair.d.ts +7 -116
- package/dist/components/facing-pair.js +1 -1
- package/dist/components/facing-pair.js.map +1 -1
- package/dist/components/field-base.d.ts +260 -0
- package/dist/components/field-base.js +228 -0
- package/dist/components/field-base.js.map +1 -0
- package/dist/components/field-parts.d.ts +188 -87
- package/dist/components/field-parts.js +60 -33
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-strip.d.ts +19 -28
- package/dist/components/field-strip.js +2 -2
- package/dist/components/field-strip.js.map +1 -1
- package/dist/components/field-sync-labels.d.ts +2 -0
- package/dist/components/field-sync-labels.js +12 -0
- package/dist/components/field-sync-labels.js.map +1 -0
- package/dist/components/field-sync.d.ts +20 -19
- package/dist/components/field-sync.js +4 -10
- package/dist/components/field-sync.js.map +1 -1
- package/dist/components/field.d.ts +45 -10
- package/dist/components/field.js +10 -8
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +85 -101
- package/dist/components/file-button.js +23 -169
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/file-dropzone.d.ts +9 -110
- package/dist/components/file-dropzone.js +22 -22
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/floating-panel-labels.d.ts +2 -0
- package/dist/components/floating-panel-labels.js +9 -0
- package/dist/components/floating-panel-labels.js.map +1 -0
- package/dist/components/floating-panel.d.ts +17 -21
- package/dist/components/floating-panel.js +19 -18
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/focus-ring.d.ts +9 -6
- package/dist/components/focus-ring.js +2 -2
- package/dist/components/focus-ring.js.map +1 -1
- package/dist/components/form-actions-labels.d.ts +2 -0
- package/dist/components/form-actions-labels.js +10 -0
- package/dist/components/form-actions-labels.js.map +1 -0
- package/dist/components/form-actions.d.ts +280 -101
- package/dist/components/form-actions.js +10 -20
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/full-bleed-dialog.d.ts +7 -8
- package/dist/components/full-bleed-dialog.js +14 -13
- package/dist/components/full-bleed-dialog.js.map +1 -1
- package/dist/components/grouped-picker.d.ts +21 -16
- package/dist/components/grouped-picker.js +76 -62
- package/dist/components/grouped-picker.js.map +1 -1
- package/dist/components/help-popover.d.ts +60 -0
- package/dist/components/help-popover.js +48 -0
- package/dist/components/help-popover.js.map +1 -0
- package/dist/components/hover-menu.d.ts +17 -16
- package/dist/components/hover-menu.js +18 -17
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/iban-input-labels.d.ts +2 -0
- package/dist/components/iban-input-labels.js +13 -0
- package/dist/components/iban-input-labels.js.map +1 -0
- package/dist/components/iban-input.d.ts +73 -101
- package/dist/components/iban-input.js +22 -15
- package/dist/components/iban-input.js.map +1 -1
- package/dist/components/icon-button.d.ts +300 -0
- package/dist/components/icon-button.js +465 -0
- package/dist/components/icon-button.js.map +1 -0
- package/dist/components/icon-picker-labels.d.ts +2 -0
- package/dist/components/icon-picker-labels.js +12 -0
- package/dist/components/icon-picker-labels.js.map +1 -0
- package/dist/components/icon-picker.d.ts +13 -13
- package/dist/components/icon-picker.js +18 -17
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/image-grid-labels.d.ts +2 -0
- package/dist/components/image-grid-labels.js +10 -0
- package/dist/components/image-grid-labels.js.map +1 -0
- package/dist/components/image-grid.d.ts +12 -14
- package/dist/components/image-grid.js +6 -10
- package/dist/components/image-grid.js.map +1 -1
- package/dist/components/inline-edit-field-labels.d.ts +2 -0
- package/dist/components/inline-edit-field-labels.js +10 -0
- package/dist/components/inline-edit-field-labels.js.map +1 -0
- package/dist/components/inline-edit-field.d.ts +11 -13
- package/dist/components/inline-edit-field.js +11 -13
- package/dist/components/inline-edit-field.js.map +1 -1
- package/dist/components/inline-entity-combobox.d.ts +155 -0
- package/dist/components/inline-entity-combobox.js +467 -0
- package/dist/components/inline-entity-combobox.js.map +1 -0
- package/dist/components/input.d.ts +98 -0
- package/dist/components/input.js +219 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/jump-calendar.d.ts +8 -0
- package/dist/components/jump-calendar.js +274 -0
- package/dist/components/jump-calendar.js.map +1 -0
- package/dist/components/language-select.d.ts +20 -111
- package/dist/components/language-select.js +12 -7
- package/dist/components/language-select.js.map +1 -1
- package/dist/components/legal-labels.d.ts +2 -0
- package/dist/components/legal-labels.js +100 -0
- package/dist/components/legal-labels.js.map +1 -0
- package/dist/components/legal-page.d.ts +17 -118
- package/dist/components/legal-page.js +2 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +353 -101
- package/dist/components/legal.js +7 -101
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox-labels.d.ts +2 -0
- package/dist/components/lightbox-labels.js +17 -0
- package/dist/components/lightbox-labels.js.map +1 -0
- package/dist/components/lightbox.d.ts +12 -14
- package/dist/components/lightbox.js +9 -19
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/line-items-labels.d.ts +2 -0
- package/dist/components/line-items-labels.js +13 -0
- package/dist/components/line-items-labels.js.map +1 -0
- package/dist/components/line-items.d.ts +16 -18
- package/dist/components/line-items.js +18 -26
- package/dist/components/line-items.js.map +1 -1
- package/dist/components/list-labels.d.ts +2 -0
- package/dist/components/list-labels.js +9 -0
- package/dist/components/list-labels.js.map +1 -0
- package/dist/components/list.d.ts +32 -21
- package/dist/components/list.js +41 -25
- package/dist/components/list.js.map +1 -1
- package/dist/components/loading-state.d.ts +5 -9
- package/dist/components/loading-state.js +2 -2
- package/dist/components/loading-state.js.map +1 -1
- package/dist/components/measured-grid-labels.d.ts +4 -0
- package/dist/components/measured-grid-labels.js +21 -0
- package/dist/components/measured-grid-labels.js.map +1 -0
- package/dist/components/measured-grid.d.ts +13 -17
- package/dist/components/measured-grid.js +31 -50
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/menu-item.d.ts +10 -10
- package/dist/components/menu-item.js +9 -9
- package/dist/components/menu-item.js.map +1 -1
- package/dist/components/mini-calendar-labels.d.ts +4 -0
- package/dist/components/mini-calendar-labels.js +14 -0
- package/dist/components/mini-calendar-labels.js.map +1 -0
- package/dist/components/mini-calendar.d.ts +10 -14
- package/dist/components/mini-calendar.js +22 -29
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +26 -18
- package/dist/components/modal.js +8 -11
- package/dist/components/modal.js.map +1 -1
- package/dist/components/money-draft.d.ts +34 -0
- package/dist/components/money-draft.js +39 -0
- package/dist/components/money-draft.js.map +1 -0
- package/dist/components/money-field.d.ts +13 -111
- package/dist/components/money-field.js +6 -22
- package/dist/components/money-field.js.map +1 -1
- package/dist/components/month-picker-labels.d.ts +5 -0
- package/dist/components/month-picker-labels.js +18 -0
- package/dist/components/month-picker-labels.js.map +1 -0
- package/dist/components/month-picker.d.ts +15 -13
- package/dist/components/month-picker.js +34 -32
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.d.ts +9 -11
- package/dist/components/multi-entity-combobox.js +14 -13
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.d.ts +81 -21
- package/dist/components/multi-select.js +171 -197
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/nav-pills.d.ts +9 -10
- package/dist/components/nav-pills.js +53 -42
- package/dist/components/nav-pills.js.map +1 -1
- package/dist/components/number-field.d.ts +6 -111
- package/dist/components/number-field.js +2 -3
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.d.ts +30 -111
- package/dist/components/number-input.js +34 -66
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numeric-field.d.ts +85 -0
- package/dist/components/numeric-field.js +71 -0
- package/dist/components/numeric-field.js.map +1 -0
- package/dist/components/numpad-sheet.d.ts +5 -108
- package/dist/components/numpad-sheet.js +7 -7
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/one-time-code-input.d.ts +6 -7
- package/dist/components/one-time-code-input.js +119 -124
- package/dist/components/one-time-code-input.js.map +1 -1
- package/dist/components/page-contents-labels.d.ts +2 -0
- package/dist/components/page-contents-labels.js +8 -0
- package/dist/components/page-contents-labels.js.map +1 -0
- package/dist/components/page-contents.d.ts +13 -15
- package/dist/components/page-contents.js +7 -9
- package/dist/components/page-contents.js.map +1 -1
- package/dist/components/page-header.d.ts +10 -10
- package/dist/components/page-header.js +3 -3
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/password-strength-labels.d.ts +2 -0
- package/dist/components/password-strength-labels.js +21 -0
- package/dist/components/password-strength-labels.js.map +1 -0
- package/dist/components/password-strength.d.ts +15 -17
- package/dist/components/password-strength.js +7 -22
- package/dist/components/password-strength.js.map +1 -1
- package/dist/components/phone-input-labels.d.ts +2 -0
- package/dist/components/phone-input-labels.js +9 -0
- package/dist/components/phone-input-labels.js.map +1 -0
- package/dist/components/phone-input.d.ts +75 -101
- package/dist/components/phone-input.js +20 -23
- package/dist/components/phone-input.js.map +1 -1
- package/dist/components/picker-sheet.d.ts +20 -8
- package/dist/components/picker-sheet.js +22 -11
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +2 -4
- package/dist/components/pie-chart.d.ts +8 -11
- package/dist/components/pie-chart.js +5 -5
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover-labels.d.ts +2 -0
- package/dist/components/popover-labels.js +11 -0
- package/dist/components/popover-labels.js.map +1 -0
- package/dist/components/popover.d.ts +13 -11
- package/dist/components/popover.js +15 -21
- package/dist/components/popover.js.map +1 -1
- package/dist/components/progress-bar-labels.d.ts +2 -0
- package/dist/components/progress-bar-labels.js +9 -0
- package/dist/components/progress-bar-labels.js.map +1 -0
- package/dist/components/progress-bar.d.ts +16 -15
- package/dist/components/progress-bar.js +22 -20
- package/dist/components/progress-bar.js.map +1 -1
- package/dist/components/qr-code.d.ts +4 -8
- package/dist/components/qr-code.js.map +1 -1
- package/dist/components/reauth-dialog-labels.d.ts +2 -0
- package/dist/components/reauth-dialog-labels.js +12 -0
- package/dist/components/reauth-dialog-labels.js.map +1 -0
- package/dist/components/reauth-dialog.d.ts +8 -10
- package/dist/components/reauth-dialog.js +3 -8
- package/dist/components/reauth-dialog.js.map +1 -1
- package/dist/components/row-actions-labels.d.ts +2 -0
- package/dist/components/row-actions-labels.js +9 -0
- package/dist/components/row-actions-labels.js.map +1 -0
- package/dist/components/row-actions.d.ts +224 -101
- package/dist/components/row-actions.js +4 -5
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/scroll-area.d.ts +6 -9
- package/dist/components/scroll-area.js +4 -10
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/search-field.d.ts +12 -27
- package/dist/components/search-field.js +13 -16
- package/dist/components/search-field.js.map +1 -1
- package/dist/components/select.d.ts +69 -0
- package/dist/components/select.js +164 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +3 -7
- package/dist/components/separator.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +120 -0
- package/dist/components/series-chart-axes.js +164 -0
- package/dist/components/series-chart-axes.js.map +1 -0
- package/dist/components/series-chart-budget.d.ts +8 -9
- package/dist/components/series-chart-labels.d.ts +2 -4
- package/dist/components/series-chart-thin.d.ts +34 -0
- package/dist/components/series-chart-thin.js +103 -0
- package/dist/components/series-chart-thin.js.map +1 -0
- package/dist/components/series-chart-ticks.d.ts +9 -11
- package/dist/components/series-chart.d.ts +64 -214
- package/dist/components/series-chart.js +69 -160
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/server-wake-labels.d.ts +2 -0
- package/dist/components/server-wake-labels.js +9 -0
- package/dist/components/server-wake-labels.js.map +1 -0
- package/dist/components/server-wake.d.ts +32 -23
- package/dist/components/server-wake.js +15 -35
- package/dist/components/server-wake.js.map +1 -1
- package/dist/components/settings-fields.d.ts +46 -118
- package/dist/components/settings-fields.js +13 -3
- package/dist/components/settings-fields.js.map +1 -1
- package/dist/components/share-card-labels.d.ts +2 -0
- package/dist/components/share-card-labels.js +29 -0
- package/dist/components/share-card-labels.js.map +1 -0
- package/dist/components/share-card.d.ts +188 -101
- package/dist/components/share-card.js +16 -34
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/sign-chip-labels.d.ts +2 -0
- package/dist/components/sign-chip-labels.js +11 -0
- package/dist/components/sign-chip-labels.js.map +1 -0
- package/dist/components/sign-chip.d.ts +7 -9
- package/dist/components/sign-chip.js +2 -7
- package/dist/components/sign-chip.js.map +1 -1
- package/dist/components/signature-pad-labels.d.ts +2 -0
- package/dist/components/signature-pad-labels.js +23 -0
- package/dist/components/signature-pad-labels.js.map +1 -0
- package/dist/components/signature-pad.d.ts +16 -15
- package/dist/components/signature-pad.js +22 -35
- package/dist/components/signature-pad.js.map +1 -1
- package/dist/components/signed-amount-labels.d.ts +2 -0
- package/dist/components/signed-amount-labels.js +9 -0
- package/dist/components/signed-amount-labels.js.map +1 -0
- package/dist/components/signed-amount.d.ts +19 -21
- package/dist/components/signed-amount.js +12 -15
- package/dist/components/signed-amount.js.map +1 -1
- package/dist/components/skeleton.d.ts +5 -9
- package/dist/components/skeleton.js +1 -1
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/slider.d.ts +16 -11
- package/dist/components/slider.js +23 -18
- package/dist/components/slider.js.map +1 -1
- package/dist/components/sparkline-labels.d.ts +2 -0
- package/dist/components/sparkline-labels.js +13 -0
- package/dist/components/sparkline-labels.js.map +1 -0
- package/dist/components/sparkline.d.ts +10 -12
- package/dist/components/sparkline.js +10 -17
- package/dist/components/sparkline.js.map +1 -1
- package/dist/components/spinner.d.ts +45 -0
- package/dist/components/spinner.js +39 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stat-tile-labels.d.ts +2 -0
- package/dist/components/stat-tile-labels.js +14 -0
- package/dist/components/stat-tile-labels.js.map +1 -0
- package/dist/components/stat-tile.d.ts +15 -17
- package/dist/components/stat-tile.js +25 -32
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/status-dot.d.ts +8 -20
- package/dist/components/status-dot.js +13 -12
- package/dist/components/status-dot.js.map +1 -1
- package/dist/components/swatch-picker-labels.d.ts +2 -0
- package/dist/components/swatch-picker-labels.js +9 -0
- package/dist/components/swatch-picker-labels.js.map +1 -0
- package/dist/components/swatch-picker.d.ts +14 -14
- package/dist/components/swatch-picker.js +14 -8
- package/dist/components/swatch-picker.js.map +1 -1
- package/dist/components/swipeable-row.d.ts +14 -27
- package/dist/components/swipeable-row.js +2 -2
- package/dist/components/swipeable-row.js.map +1 -1
- package/dist/components/switch.d.ts +10 -13
- package/dist/components/switch.js +13 -12
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table.d.ts +28 -31
- package/dist/components/table.js +15 -15
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.d.ts +182 -0
- package/dist/components/tabs.js +312 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text-link.d.ts +17 -119
- package/dist/components/text-link.js +7 -7
- package/dist/components/text-link.js.map +1 -1
- package/dist/components/text.d.ts +14 -13
- package/dist/components/text.js +5 -5
- package/dist/components/text.js.map +1 -1
- package/dist/components/textarea.d.ts +20 -0
- package/dist/components/textarea.js +161 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/tile-radio.d.ts +6 -10
- package/dist/components/tile-radio.js +6 -6
- package/dist/components/tile-radio.js.map +1 -1
- package/dist/components/time-input.d.ts +5 -108
- package/dist/components/time-input.js +14 -5
- package/dist/components/time-input.js.map +1 -1
- package/dist/components/toast-labels.d.ts +2 -0
- package/dist/components/toast-labels.js +11 -0
- package/dist/components/toast-labels.js.map +1 -0
- package/dist/components/toast.d.ts +21 -23
- package/dist/components/toast.js +1 -6
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.d.ts +26 -26
- package/dist/components/toggle-group.js +43 -19
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +18 -21
- package/dist/components/toggle-legend.js +3 -3
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/tooltip.d.ts +16 -15
- package/dist/components/tooltip.js +4 -9
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +8 -10
- package/dist/components/translation-review-editor.js +6 -5
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review-labels.d.ts +4 -7
- package/dist/components/translation-review-parts.d.ts +19 -28
- package/dist/components/translation-review-parts.js +4 -7
- package/dist/components/translation-review-parts.js.map +1 -1
- package/dist/components/translation-review.d.ts +26 -24
- package/dist/components/translation-review.js +13 -10
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/tree-view.d.ts +7 -11
- package/dist/components/tree-view.js +8 -8
- package/dist/components/tree-view.js.map +1 -1
- package/dist/components/treemap.d.ts +9 -13
- package/dist/components/trigger-aria.d.ts +2 -4
- package/dist/components/ui-labels.d.ts +5 -0
- package/dist/components/ui-labels.js +20 -0
- package/dist/components/ui-labels.js.map +1 -0
- package/dist/components/use-anchor-dir.d.ts +3 -6
- package/dist/components/use-mobile-reveal.d.ts +2 -6
- package/dist/components/use-table-state.d.ts +154 -15
- package/dist/components/user-avatar.d.ts +8 -21
- package/dist/components/user-avatar.js +1 -1
- package/dist/components/user-avatar.js.map +1 -1
- package/dist/components/wizard-stepper.d.ts +6 -6
- package/dist/components/wizard-stepper.js +4 -3
- package/dist/components/wizard-stepper.js.map +1 -1
- package/dist/components/write-lock-labels.d.ts +2 -0
- package/dist/components/write-lock-labels.js +8 -0
- package/dist/components/write-lock-labels.js.map +1 -0
- package/dist/components/write-lock.d.ts +16 -18
- package/dist/components/write-lock.js +4 -8
- package/dist/components/write-lock.js.map +1 -1
- package/dist/data-table.d.ts +10 -18
- package/dist/data-table.js.map +1 -1
- package/dist/demo/demo-banner.d.ts +10 -13
- package/dist/demo/demo-banner.js +5 -19
- package/dist/demo/demo-banner.js.map +1 -1
- package/dist/demo/demo-countdown.d.ts +7 -9
- package/dist/demo/demo-ended.d.ts +10 -13
- package/dist/demo/demo-ended.js +4 -4
- package/dist/demo/demo-ended.js.map +1 -1
- package/dist/demo/demo-labels.d.ts +4 -5
- package/dist/demo/demo-labels.js.map +1 -1
- package/dist/demo/demo-session.d.ts +3 -5
- package/dist/demo/demo-start.d.ts +8 -11
- package/dist/demo/demo-start.js +3 -2
- package/dist/demo/demo-start.js.map +1 -1
- package/dist/feedback/feedback-attachment-labels.d.ts +16 -0
- package/dist/feedback/feedback-attachment-labels.js +17 -0
- package/dist/feedback/feedback-attachment-labels.js.map +1 -0
- package/dist/feedback/feedback-attachment.d.ts +312 -101
- package/dist/feedback/feedback-attachment.js +31 -42
- package/dist/feedback/feedback-attachment.js.map +1 -1
- package/dist/feedback/feedback-capture.d.ts +2 -4
- package/dist/feedback/feedback-context-labels.d.ts +2 -0
- package/dist/feedback/feedback-context-labels.js +9 -0
- package/dist/feedback/feedback-context-labels.js.map +1 -0
- package/dist/feedback/feedback-context.d.ts +110 -101
- package/dist/feedback/feedback-context.js +4 -7
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-crash.d.ts +8 -110
- package/dist/feedback/feedback-dialog-labels.d.ts +12 -0
- package/dist/feedback/feedback-dialog-labels.js +17 -0
- package/dist/feedback/feedback-dialog-labels.js.map +1 -0
- package/dist/feedback/feedback-dialog.d.ts +186 -101
- package/dist/feedback/feedback-dialog.js +8 -18
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox.d.ts +236 -101
- package/dist/feedback/feedback-inbox.js +31 -141
- package/dist/feedback/feedback-inbox.js.map +1 -1
- package/dist/feedback/feedback-labels.d.ts +83 -101
- package/dist/feedback/feedback-labels.js.map +1 -1
- package/dist/feedback/feedback-menu-labels.d.ts +2 -0
- package/dist/feedback/feedback-menu-labels.js +10 -0
- package/dist/feedback/feedback-menu-labels.js.map +1 -0
- package/dist/feedback/feedback-menu.d.ts +83 -101
- package/dist/feedback/feedback-menu.js +3 -7
- package/dist/feedback/feedback-menu.js.map +1 -1
- package/dist/feedback/feedback-record.d.ts +239 -101
- package/dist/feedback/feedback-record.js +7 -2
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.d.ts +2 -0
- package/dist/feedback/feedback-row-detail-labels.js +31 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -0
- package/dist/feedback/feedback-row-detail.d.ts +315 -101
- package/dist/feedback/feedback-row-detail.js +11 -37
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +66 -101
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +39 -0
- package/dist/feedback/feedback-submit-dialog.js +66 -0
- package/dist/feedback/feedback-submit-dialog.js.map +1 -0
- package/dist/feedback/feedback-submit.d.ts +13 -109
- package/dist/feedback/feedback-submit.js +19 -40
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +9 -110
- package/dist/feedback/feedback-swipe.js +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table-labels.d.ts +2 -0
- package/dist/feedback/feedback-table-labels.js +26 -0
- package/dist/feedback/feedback-table-labels.js.map +1 -0
- package/dist/feedback/feedback-table.d.ts +314 -101
- package/dist/feedback/feedback-table.js +11 -31
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +3 -0
- package/dist/feedback/feedback-thread-labels.js +21 -0
- package/dist/feedback/feedback-thread-labels.js.map +1 -0
- package/dist/feedback/feedback-thread.d.ts +378 -101
- package/dist/feedback/feedback-thread.js +27 -34
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.d.ts +98 -0
- package/dist/feedback/feedback-vocabulary.js +143 -0
- package/dist/feedback/feedback-vocabulary.js.map +1 -0
- package/dist/feedback.d.ts +15 -105
- package/dist/hooks/use-anchored-panel.d.ts +77 -15
- package/dist/hooks/use-anchored-panel.js +34 -1
- package/dist/hooks/use-anchored-panel.js.map +1 -1
- package/dist/hooks/use-anchored-rect.d.ts +15 -6
- package/dist/hooks/use-anchored-rect.js +2 -1
- package/dist/hooks/use-anchored-rect.js.map +1 -1
- package/dist/hooks/use-announce.d.ts +4 -6
- package/dist/hooks/use-authed-src.d.ts +5 -7
- package/dist/hooks/use-authed-src.js +3 -7
- package/dist/hooks/use-authed-src.js.map +1 -1
- package/dist/hooks/use-body-scroll-lock.d.ts +1 -3
- package/dist/hooks/use-breakpoint.d.ts +16 -17
- package/dist/hooks/use-breakpoint.js.map +1 -1
- package/dist/hooks/use-close-transition.d.ts +8 -8
- package/dist/hooks/use-close-transition.js +5 -4
- package/dist/hooks/use-close-transition.js.map +1 -1
- package/dist/hooks/use-copy-to-clipboard.d.ts +5 -7
- package/dist/hooks/use-debounce.d.ts +13 -6
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-dismiss.d.ts +37 -11
- package/dist/hooks/use-dismiss.js +69 -10
- package/dist/hooks/use-dismiss.js.map +1 -1
- package/dist/hooks/use-file-drop.d.ts +8 -110
- package/dist/hooks/use-file-drop.js +1 -1
- package/dist/hooks/use-file-drop.js.map +1 -1
- package/dist/hooks/use-file-picker-labels.d.ts +2 -0
- package/dist/hooks/use-file-picker-labels.js +25 -0
- package/dist/hooks/use-file-picker-labels.js.map +1 -0
- package/dist/hooks/use-file-picker.d.ts +164 -0
- package/dist/hooks/use-file-picker.js +149 -0
- package/dist/hooks/use-file-picker.js.map +1 -0
- package/dist/hooks/use-focus-trap.d.ts +2 -4
- package/dist/hooks/use-focus-trap.js +2 -1
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +7 -9
- package/dist/hooks/use-large-text.d.ts +3 -5
- package/dist/hooks/use-media-query.d.ts +1 -3
- package/dist/hooks/use-noindex.d.ts +1 -3
- package/dist/hooks/use-overlay-history.d.ts +1 -3
- package/dist/hooks/use-row-swipe.d.ts +5 -8
- package/dist/hooks/use-search-param-state.d.ts +10 -11
- package/dist/hooks/use-windowed-rows.d.ts +4 -7
- package/dist/i18n/defaults.d.ts +11 -105
- package/dist/i18n/defaults.js +82 -82
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.d.ts +2 -105
- package/dist/i18n/german.js +52 -8
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +609 -101
- package/dist/i18n/kit-labels.js +22 -97
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/languages.d.ts +197 -101
- package/dist/i18n/locales/de-CH.d.ts +3 -106
- package/dist/i18n/locales/en.d.ts +4 -105
- package/dist/i18n/locales/en.js +1834 -4
- package/dist/i18n/locales/en.js.map +7 -1
- package/dist/i18n/locales/es.d.ts +3 -106
- package/dist/i18n/locales/es.js +52 -8
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +3 -106
- package/dist/i18n/locales/fr.js +53 -8
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +3 -106
- package/dist/i18n/locales/hu.js +52 -8
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +3 -106
- package/dist/i18n/locales/it.js +53 -8
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +3 -106
- package/dist/i18n/locales/zh.js +51 -8
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/plurals.d.ts +3 -5
- package/dist/i18n/review.d.ts +5 -107
- package/dist/i18n/review.js +4 -0
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.d.ts +17 -0
- package/dist/i18n/shared-labels.js +111 -0
- package/dist/i18n/shared-labels.js.map +1 -0
- package/dist/i18n/swiss.d.ts +1 -3
- package/dist/index.d.ts +329 -249
- package/dist/index.js +188 -215
- package/dist/index.js.map +1 -1
- package/dist/landing/access.d.ts +7 -9
- package/dist/landing/access.js.map +1 -1
- package/dist/landing/landing-actions.d.ts +9 -109
- package/dist/landing/landing-actions.js +1 -1
- package/dist/landing/landing-actions.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +4 -5
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/landing/landing-sections.d.ts +21 -121
- package/dist/landing/landing-sections.js +15 -15
- package/dist/landing/landing-sections.js.map +1 -1
- package/dist/landing/page-seo.d.ts +7 -9
- package/dist/landing/public-header.d.ts +10 -111
- package/dist/landing/public-header.js +1 -1
- package/dist/landing/public-header.js.map +1 -1
- package/dist/landing/routing.d.ts +16 -120
- package/dist/landing/routing.js +2 -6
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/calc.d.ts +7 -9
- package/dist/lib/chip-edge-snap.d.ts +10 -0
- package/dist/lib/chip-edge-snap.js +131 -0
- package/dist/lib/chip-edge-snap.js.map +1 -0
- package/dist/lib/clipping.d.ts +2 -4
- package/dist/lib/cn.d.ts +2 -5
- package/dist/lib/cn.js +6 -1
- package/dist/lib/cn.js.map +1 -1
- package/dist/lib/column-mapping.d.ts +10 -13
- package/dist/lib/countries.d.ts +3 -5
- package/dist/lib/dates.d.ts +25 -25
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/decimal-marks.d.ts +8 -8
- package/dist/lib/decimal-marks.js +1 -1
- package/dist/lib/decimal-marks.js.map +1 -1
- package/dist/lib/direction.d.ts +4 -6
- package/dist/lib/document-navigation.d.ts +1 -3
- package/dist/lib/download.d.ts +67 -0
- package/dist/lib/download.js +89 -0
- package/dist/lib/download.js.map +1 -0
- package/dist/lib/floating-stack.d.ts +8 -6
- package/dist/lib/floating-stack.js.map +1 -1
- package/dist/lib/format.d.ts +24 -23
- package/dist/lib/format.js +3 -3
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/iban.d.ts +9 -11
- package/dist/lib/ime.d.ts +17 -0
- package/dist/lib/ime.js +13 -0
- package/dist/lib/ime.js.map +1 -0
- package/dist/lib/isin.d.ts +3 -5
- package/dist/lib/logger.d.ts +4 -6
- package/dist/lib/person-name.d.ts +3 -5
- package/dist/lib/phone.d.ts +9 -11
- package/dist/lib/presence.d.ts +15 -0
- package/dist/lib/presence.js +8 -0
- package/dist/lib/presence.js.map +1 -0
- package/dist/lib/qr-encode.d.ts +4 -6
- package/dist/lib/reduced-motion.d.ts +18 -0
- package/dist/lib/reduced-motion.js +9 -0
- package/dist/lib/reduced-motion.js.map +1 -0
- package/dist/lib/round.d.ts +22 -0
- package/dist/lib/round.js +15 -0
- package/dist/lib/round.js.map +1 -0
- package/dist/lib/safe-storage.d.ts +14 -4
- package/dist/lib/safe-storage.js +24 -9
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/server-wake.d.ts +13 -14
- package/dist/lib/session-refresh.d.ts +200 -0
- package/dist/lib/session-refresh.js +187 -0
- package/dist/lib/session-refresh.js.map +1 -0
- package/dist/lib/strip-fade.d.ts +10 -13
- package/dist/lib/table-text.d.ts +14 -16
- package/dist/lib/text-match.d.ts +41 -0
- package/dist/lib/text-match.js +23 -0
- package/dist/lib/text-match.js.map +1 -0
- package/dist/lib/translation-review.d.ts +44 -45
- package/dist/lib/translation-review.js +3 -2
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/rhf/fields.d.ts +123 -189
- package/dist/rhf/fields.js +46 -54
- package/dist/rhf/fields.js.map +1 -1
- package/dist/rhf/form-core.d.ts +153 -0
- package/dist/rhf/form-core.js +143 -0
- package/dist/rhf/form-core.js.map +1 -0
- package/dist/rhf/form.d.ts +38 -175
- package/dist/rhf/form.js +9 -131
- package/dist/rhf/form.js.map +1 -1
- package/dist/rhf/line-items.d.ts +40 -11
- package/dist/rhf/line-items.js.map +1 -1
- package/dist/rhf/use-rhf-wizard-step.d.ts +3 -6
- package/dist/rhf.d.ts +4 -118
- package/dist/rhf.js.map +1 -1
- package/dist/search/command-palette-labels.d.ts +2 -0
- package/dist/search/command-palette-labels.js +15 -0
- package/dist/search/command-palette-labels.js.map +1 -0
- package/dist/search/command-palette.d.ts +10 -13
- package/dist/search/command-palette.js +25 -44
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search-labels.d.ts +2 -0
- package/dist/search/global-search-labels.js +12 -0
- package/dist/search/global-search-labels.js.map +1 -0
- package/dist/search/global-search.d.ts +17 -16
- package/dist/search/global-search.js +12 -12
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/search-index.d.ts +13 -14
- package/dist/search/search-index.js +2 -1
- package/dist/search/search-index.js.map +1 -1
- package/dist/search/use-command-key.d.ts +9 -0
- package/dist/search/use-command-key.js +18 -0
- package/dist/search/use-command-key.js.map +1 -0
- package/dist/search.d.ts +3 -4
- package/dist/settings/settings-card-classes.d.ts +11 -0
- package/dist/settings/settings-card-classes.js +8 -0
- package/dist/settings/settings-card-classes.js.map +1 -0
- package/dist/settings/settings-catalogue.d.ts +11 -14
- package/dist/settings/settings-context.d.ts +4 -8
- package/dist/settings/settings-heading.d.ts +8 -12
- package/dist/settings/settings-heading.js +1 -1
- package/dist/settings/settings-heading.js.map +1 -1
- package/dist/settings/settings-labels.d.ts +6 -7
- package/dist/settings/settings-labels.js.map +1 -1
- package/dist/settings/settings-layout.d.ts +36 -13
- package/dist/settings/settings-layout.js +25 -4
- package/dist/settings/settings-layout.js.map +1 -1
- package/dist/settings/settings-section.d.ts +4 -107
- package/dist/settings/settings-section.js +2 -2
- package/dist/settings/settings-section.js.map +1 -1
- package/dist/settings/use-account-appearance.d.ts +11 -16
- package/dist/settings/use-account-language.d.ts +8 -10
- package/dist/settings/use-settings-focus.d.ts +3 -5
- package/dist/settings/use-settings-focus.js +2 -4
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/settings/use-settings-route.d.ts +11 -16
- package/dist/shell/app-shell-labels.d.ts +2 -0
- package/dist/shell/app-shell-labels.js +9 -0
- package/dist/shell/app-shell-labels.js.map +1 -0
- package/dist/shell/app-shell.d.ts +216 -101
- package/dist/shell/app-shell.js +51 -35
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/auth-layout.d.ts +6 -9
- package/dist/shell/auth-layout.js +6 -6
- package/dist/shell/auth-layout.js.map +1 -1
- package/dist/shell/company-switcher-labels.d.ts +2 -0
- package/dist/shell/company-switcher-labels.js +12 -0
- package/dist/shell/company-switcher-labels.js.map +1 -0
- package/dist/shell/company-switcher.d.ts +9 -11
- package/dist/shell/company-switcher.js +3 -9
- package/dist/shell/company-switcher.js.map +1 -1
- package/dist/shell/option-switcher-menu.d.ts +19 -9
- package/dist/shell/option-switcher-menu.js +6 -4
- package/dist/shell/option-switcher-menu.js.map +1 -1
- package/dist/shell/role-switcher.d.ts +5 -6
- package/dist/shell/role-switcher.js +4 -3
- package/dist/shell/role-switcher.js.map +1 -1
- package/dist/shell/top-bar-brand.d.ts +4 -107
- package/dist/shell/top-bar-brand.js +1 -1
- package/dist/shell/top-bar-brand.js.map +1 -1
- package/dist/shell/top-bar.d.ts +6 -9
- package/dist/shell/top-bar.js +1 -1
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/shell/topbar-action-menu.d.ts +30 -31
- package/dist/shell/topbar-action-menu.js +12 -10
- package/dist/shell/topbar-action-menu.js.map +1 -1
- package/dist/shell/topbar-controls.d.ts +20 -18
- package/dist/shell/topbar-controls.js +14 -11
- package/dist/shell/topbar-controls.js.map +1 -1
- package/dist/shell.d.ts +25 -116
- package/dist/shell.js.map +1 -1
- package/dist/table-text.d.ts +1 -1
- package/dist/testing/css-variables.d.ts +4 -6
- package/dist/testing/css-variables.generated.d.ts +2 -4
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.js +9 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/viewport.d.ts +93 -0
- package/dist/testing/viewport.js +152 -0
- package/dist/testing/viewport.js.map +1 -0
- package/dist/theme/chart-palette.d.ts +7 -9
- package/dist/theme/color.d.ts +14 -16
- package/dist/theme/color.js +2 -1
- package/dist/theme/color.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +13 -17
- package/dist/theme/contrast.d.ts +22 -27
- package/dist/theme/palette-derive.d.ts +16 -22
- package/dist/theme/palette-derive.js +15 -7
- package/dist/theme/palette-derive.js.map +1 -1
- package/dist/theme/palette-presets.d.ts +25 -15
- package/dist/theme/palette-presets.js +66 -66
- package/dist/theme/palette-presets.js.map +1 -1
- package/dist/theme/palette-store.d.ts +10 -13
- package/dist/theme/text-size.d.ts +21 -26
- package/dist/theme/theme-store.d.ts +9 -14
- package/dist/tour/tour-labels.d.ts +2 -0
- package/dist/tour/tour-labels.js +13 -0
- package/dist/tour/tour-labels.js.map +1 -0
- package/dist/tour/tour.d.ts +12 -14
- package/dist/tour/tour.js +9 -20
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour.d.ts +1 -2
- package/dist/wizard/stepper-nav.d.ts +8 -108
- package/dist/wizard/stepper-nav.js +15 -14
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +18 -18
- package/dist/wizard/types.js +1 -19
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +2 -6
- package/dist/wizard/validation.d.ts +3 -7
- package/dist/wizard/wizard-context.d.ts +7 -11
- package/dist/wizard/wizard-labels.d.ts +4 -0
- package/dist/wizard/wizard-labels.js +24 -0
- package/dist/wizard/wizard-labels.js.map +1 -0
- package/dist/wizard/wizard-step.d.ts +3 -7
- package/dist/wizard/wizard-step.js +2 -2
- package/dist/wizard/wizard-step.js.map +1 -1
- package/dist/wizard/wizard-summary.d.ts +5 -8
- package/dist/wizard/wizard-summary.js +6 -5
- package/dist/wizard/wizard-summary.js.map +1 -1
- package/dist/wizard.d.ts +7 -107
- package/package.json +9 -6
- package/src/account/account-parts.ts +3 -3
- package/src/{components → account}/account-settings-labels.ts +11 -1
- package/src/{components → account}/account-settings.tsx +145 -34
- package/src/account/data-export-setting-labels.ts +20 -0
- package/src/account/data-export-setting.tsx +19 -38
- package/src/account/delete-account-setting-labels.ts +33 -0
- package/src/account/delete-account-setting.tsx +13 -35
- package/src/account/email-change-setting-labels.ts +32 -0
- package/src/account/email-change-setting.tsx +17 -36
- package/src/{components → account}/passkeys-setting.tsx +14 -9
- package/src/account/sessions-setting-labels.ts +24 -0
- package/src/account/sessions-setting.tsx +14 -28
- package/src/admin/admin-action-confirm-labels.ts +19 -0
- package/src/admin/admin-action-confirm.tsx +59 -38
- package/src/admin/admin-action-log-labels.ts +74 -0
- package/src/admin/admin-action-log.tsx +180 -54
- package/src/admin/admin-parts.ts +0 -7
- package/src/admin/invitations-panel-labels.ts +31 -0
- package/src/admin/invitations-panel.tsx +16 -34
- package/src/admin/plan-change-labels.ts +23 -0
- package/src/admin/plan-change.tsx +58 -34
- package/src/admin/reviewer-scope-editor-labels.ts +16 -0
- package/src/admin/reviewer-scope-editor.tsx +9 -15
- package/src/admin/role-select-labels.ts +16 -0
- package/src/admin/role-select.tsx +13 -23
- package/src/admin/transfer-ownership-dialog-labels.ts +20 -0
- package/src/admin/transfer-ownership-dialog.tsx +7 -17
- package/src/admin/user-roster-labels.ts +17 -0
- package/src/admin/user-roster.tsx +9 -17
- package/src/auth/accept-invitation-labels.ts +21 -0
- package/src/auth/accept-invitation.tsx +9 -20
- package/src/auth/auth-errors.ts +29 -13
- package/src/auth/complete-name-dialog-labels.ts +16 -0
- package/src/auth/complete-name-dialog.tsx +8 -13
- package/src/auth/forgot-password-form-labels.ts +20 -0
- package/src/auth/forgot-password-form.tsx +12 -20
- package/src/auth/new-password-fields.tsx +1 -1
- package/src/auth/not-found-page-labels.ts +12 -0
- package/src/auth/not-found-page.tsx +11 -14
- package/src/auth/register-form-labels.ts +31 -0
- package/src/auth/register-form.tsx +18 -38
- package/src/auth/reset-password-form-labels.ts +27 -0
- package/src/auth/reset-password-form.tsx +12 -27
- package/src/auth/sign-in-form-labels.ts +44 -0
- package/src/auth/sign-in-form.tsx +18 -51
- package/src/auth/status-parts.tsx +3 -3
- package/src/auth/verify-email-labels.ts +26 -0
- package/src/auth/verify-email.tsx +15 -30
- package/src/billing/billing-banner.tsx +2 -1
- package/src/billing/billing-labels.ts +1 -1
- package/src/billing/checkout-processing.ts +2 -12
- package/src/billing/plan-card.tsx +26 -27
- package/src/billing/plan-limit-notice.tsx +1 -1
- package/src/billing/subscription-actions.tsx +4 -4
- package/src/chart.ts +7 -1
- package/src/components/account-chips-labels.ts +16 -0
- package/src/components/account-chips.tsx +13 -16
- package/src/components/alert-banner.tsx +39 -19
- package/src/components/amount-input.tsx +461 -405
- package/src/components/appearance-labels.ts +2 -2
- package/src/components/authed-image-labels.ts +11 -0
- package/src/components/authed-image.tsx +6 -8
- package/src/components/autocomplete.tsx +79 -78
- package/src/components/breadcrumbs-labels.ts +10 -0
- package/src/components/breadcrumbs.tsx +17 -14
- package/src/components/bulk-action-bar-labels.ts +11 -0
- package/src/components/bulk-action-bar.tsx +15 -16
- package/src/components/button-group.tsx +7 -7
- package/src/components/button-look.ts +230 -0
- package/src/components/button.tsx +339 -0
- package/src/components/calculator.tsx +18 -11
- package/src/components/calendar-heatmap-labels.ts +15 -0
- package/src/components/calendar-heatmap.tsx +13 -19
- package/src/components/card.tsx +381 -0
- package/src/components/chart-zoom-core.tsx +653 -0
- package/src/components/chart-zoom.tsx +64 -648
- package/src/components/chart.tsx +11 -11
- package/src/components/checkbox-group.tsx +13 -10
- package/src/components/checkbox.tsx +43 -42
- package/src/components/chip-input.tsx +377 -0
- package/src/components/chip-labels.ts +13 -0
- package/src/components/chip.tsx +115 -711
- package/src/components/choice-card.tsx +83 -85
- package/src/components/column-mapper-labels.ts +45 -0
- package/src/components/column-mapper.tsx +16 -51
- package/src/components/combobox-core.tsx +346 -194
- package/src/components/combobox-suggestions.tsx +129 -0
- package/src/components/combobox.tsx +69 -895
- package/src/components/confirm-dialog-labels.ts +13 -0
- package/src/components/confirm-dialog.tsx +4 -8
- package/src/components/copy-button-labels.ts +13 -0
- package/src/components/copy-button.tsx +10 -12
- package/src/components/country-select-labels.ts +11 -0
- package/src/components/country-select.tsx +74 -89
- package/src/components/currency-option-list.tsx +216 -0
- package/src/components/currency-select.tsx +85 -196
- package/src/components/danger-confirm-labels.ts +20 -0
- package/src/components/danger-confirm.tsx +69 -77
- package/src/components/data-table-cells.tsx +5 -5
- package/src/components/data-table-column-settings.tsx +137 -0
- package/src/components/data-table-filter-popover.tsx +49 -24
- package/src/components/data-table-filters.ts +48 -11
- package/src/components/data-table-head.tsx +258 -0
- package/src/components/data-table-labels.ts +43 -11
- package/src/components/data-table-mobile.tsx +594 -0
- package/src/components/data-table-pagination.tsx +11 -10
- package/src/components/data-table-resize.ts +187 -0
- package/src/components/data-table-row-actions.tsx +152 -0
- package/src/components/data-table-selection.ts +55 -0
- package/src/components/data-table-shared.tsx +172 -0
- package/src/components/data-table.tsx +178 -1300
- package/src/components/date-field.tsx +627 -0
- package/src/components/date-picker.tsx +58 -1446
- package/src/components/date-range-picker.tsx +490 -0
- package/src/components/description-list-labels.ts +9 -0
- package/src/components/description-list.tsx +31 -15
- package/src/components/dialog-frame-labels.ts +7 -0
- package/src/components/dialog-frame.tsx +8 -6
- package/src/components/disclosure.tsx +14 -14
- package/src/components/dropdown.tsx +102 -40
- package/src/components/empty-state.tsx +137 -0
- package/src/components/entity-combobox.tsx +17 -12
- package/src/components/error-boundary-labels.ts +20 -0
- package/src/components/error-boundary.tsx +10 -20
- package/src/components/facing-pair.ts +1 -1
- package/src/components/field-base.tsx +615 -0
- package/src/components/field-parts.tsx +206 -77
- package/src/components/field-strip.tsx +16 -21
- package/src/components/field-sync-labels.ts +13 -0
- package/src/components/field-sync.tsx +11 -12
- package/src/components/field.tsx +13 -11
- package/src/components/file-button.tsx +64 -412
- package/src/components/file-dropzone.tsx +36 -33
- package/src/components/floating-panel-labels.ts +10 -0
- package/src/components/floating-panel.tsx +32 -21
- package/src/components/focus-ring.ts +9 -4
- package/src/components/form-actions-labels.ts +11 -0
- package/src/components/form-actions.tsx +17 -21
- package/src/components/full-bleed-dialog.tsx +27 -25
- package/src/components/grouped-picker.tsx +118 -96
- package/src/components/help-popover.tsx +115 -0
- package/src/components/hover-menu.tsx +46 -35
- package/src/components/iban-input-labels.ts +15 -0
- package/src/components/iban-input.tsx +25 -20
- package/src/components/icon-button.tsx +945 -0
- package/src/components/icon-picker-labels.ts +13 -0
- package/src/components/icon-picker.tsx +27 -24
- package/src/components/image-grid-labels.ts +11 -0
- package/src/components/image-grid.tsx +13 -15
- package/src/components/inline-edit-field-labels.ts +11 -0
- package/src/components/inline-edit-field.tsx +20 -19
- package/src/components/inline-entity-combobox.tsx +789 -0
- package/src/components/input.tsx +380 -0
- package/src/components/jump-calendar.tsx +385 -0
- package/src/components/language-select.tsx +31 -16
- package/src/components/legal-labels.ts +99 -0
- package/src/components/legal-page.tsx +2 -2
- package/src/components/legal.tsx +11 -101
- package/src/components/lightbox-labels.ts +18 -0
- package/src/components/lightbox.tsx +13 -21
- package/src/components/line-items-labels.ts +14 -0
- package/src/components/line-items.tsx +24 -31
- package/src/components/list-labels.ts +10 -0
- package/src/components/list.tsx +98 -75
- package/src/components/loading-state.tsx +4 -4
- package/src/components/measured-grid-labels.ts +25 -0
- package/src/components/measured-grid.tsx +39 -62
- package/src/components/menu-item.tsx +29 -26
- package/src/components/mini-calendar-labels.ts +17 -0
- package/src/components/mini-calendar.tsx +38 -45
- package/src/components/modal.tsx +31 -18
- package/src/components/money-draft.ts +72 -0
- package/src/components/money-field.tsx +16 -30
- package/src/components/month-picker-labels.ts +22 -0
- package/src/components/month-picker.tsx +59 -45
- package/src/components/multi-entity-combobox.tsx +17 -12
- package/src/components/multi-select.tsx +313 -288
- package/src/components/nav-pills.tsx +19 -8
- package/src/components/number-field.tsx +7 -5
- package/src/components/number-input.tsx +72 -97
- package/src/components/numeric-field.ts +161 -0
- package/src/components/numpad-sheet.tsx +16 -16
- package/src/components/one-time-code-input.tsx +154 -169
- package/src/components/page-contents-labels.ts +9 -0
- package/src/components/page-contents.tsx +15 -15
- package/src/components/page-header.tsx +9 -5
- package/src/components/password-strength-labels.ts +23 -0
- package/src/components/password-strength.tsx +13 -27
- package/src/components/phone-input-labels.ts +10 -0
- package/src/components/phone-input.tsx +42 -57
- package/src/components/picker-sheet.tsx +47 -18
- package/src/components/pie-chart.tsx +11 -9
- package/src/components/popover-labels.ts +14 -0
- package/src/components/popover.tsx +34 -37
- package/src/components/progress-bar-labels.ts +10 -0
- package/src/components/progress-bar.tsx +32 -23
- package/src/components/qr-code.tsx +2 -2
- package/src/components/reauth-dialog-labels.ts +13 -0
- package/src/components/reauth-dialog.tsx +7 -10
- package/src/components/row-actions-labels.ts +10 -0
- package/src/components/row-actions.tsx +11 -10
- package/src/components/scroll-area.tsx +4 -10
- package/src/components/search-field.tsx +35 -49
- package/src/components/select.tsx +302 -0
- package/src/components/separator.tsx +2 -2
- package/src/components/series-chart-axes.ts +329 -0
- package/src/components/series-chart-thin.ts +180 -0
- package/src/components/series-chart.tsx +124 -325
- package/src/components/server-wake-labels.ts +11 -0
- package/src/components/server-wake.tsx +42 -63
- package/src/components/settings-fields.tsx +46 -17
- package/src/components/share-card-labels.ts +30 -0
- package/src/components/share-card.tsx +22 -37
- package/src/components/sign-chip-labels.ts +12 -0
- package/src/components/sign-chip.tsx +6 -9
- package/src/components/signature-pad-labels.ts +24 -0
- package/src/components/signature-pad.tsx +48 -57
- package/src/components/signed-amount-labels.ts +10 -0
- package/src/components/signed-amount.tsx +21 -22
- package/src/components/skeleton.tsx +1 -1
- package/src/components/slider.tsx +51 -39
- package/src/components/sparkline-labels.ts +14 -0
- package/src/components/sparkline.tsx +16 -21
- package/src/components/spinner.tsx +81 -0
- package/src/components/stat-tile-labels.ts +15 -0
- package/src/components/stat-tile.tsx +32 -37
- package/src/components/status-dot.tsx +17 -14
- package/src/components/swatch-picker-labels.ts +10 -0
- package/src/components/swatch-picker.tsx +23 -16
- package/src/components/swipeable-row.tsx +7 -7
- package/src/components/switch.tsx +33 -32
- package/src/components/table.tsx +15 -15
- package/src/components/tabs.tsx +660 -0
- package/src/components/text-link.tsx +7 -7
- package/src/components/text.tsx +10 -6
- package/src/components/textarea.tsx +323 -0
- package/src/components/tile-radio.tsx +6 -6
- package/src/components/time-input.tsx +15 -7
- package/src/components/toast-labels.ts +12 -0
- package/src/components/toast.tsx +5 -8
- package/src/components/toggle-group.tsx +105 -42
- package/src/components/toggle-legend.tsx +6 -6
- package/src/components/tooltip.tsx +10 -21
- package/src/components/translation-review-editor.tsx +8 -7
- package/src/components/translation-review-parts.tsx +9 -13
- package/src/components/translation-review.tsx +26 -14
- package/src/components/tree-view.tsx +14 -12
- package/src/components/ui-labels.ts +22 -0
- package/src/components/user-avatar.tsx +3 -3
- package/src/components/wizard-stepper.tsx +10 -5
- package/src/components/write-lock-labels.ts +9 -0
- package/src/components/write-lock.tsx +10 -12
- package/src/data-table.ts +4 -0
- package/src/demo/demo-banner.tsx +9 -25
- package/src/demo/demo-ended.tsx +8 -7
- package/src/demo/demo-labels.ts +2 -2
- package/src/demo/demo-start.tsx +7 -5
- package/src/feedback/feedback-attachment-labels.ts +36 -0
- package/src/feedback/feedback-attachment.tsx +42 -66
- package/src/feedback/feedback-context-labels.ts +10 -0
- package/src/feedback/feedback-context.tsx +8 -9
- package/src/feedback/feedback-dialog-labels.ts +28 -0
- package/src/feedback/feedback-dialog.tsx +14 -44
- package/src/feedback/feedback-inbox.tsx +49 -252
- package/src/feedback/feedback-labels.ts +5 -5
- package/src/feedback/feedback-menu-labels.ts +11 -0
- package/src/feedback/feedback-menu.tsx +13 -11
- package/src/feedback/feedback-record.ts +21 -7
- package/src/feedback/feedback-row-detail-labels.ts +33 -0
- package/src/feedback/feedback-row-detail.tsx +30 -43
- package/src/feedback/feedback-status-undo.ts +3 -2
- package/src/feedback/feedback-submit-dialog.tsx +109 -0
- package/src/feedback/feedback-submit.tsx +45 -55
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table-labels.ts +27 -0
- package/src/feedback/feedback-table.tsx +24 -40
- package/src/feedback/feedback-thread-labels.ts +22 -0
- package/src/feedback/feedback-thread.tsx +48 -47
- package/src/feedback/feedback-vocabulary.ts +252 -0
- package/src/hooks/use-anchored-panel.ts +102 -2
- package/src/hooks/use-anchored-rect.ts +11 -9
- package/src/hooks/use-authed-src.ts +13 -7
- package/src/hooks/use-breakpoint.ts +5 -4
- package/src/hooks/use-close-transition.ts +9 -10
- package/src/hooks/use-debounce.ts +9 -0
- package/src/hooks/use-dismiss.ts +176 -19
- package/src/hooks/use-file-drop.ts +2 -2
- package/src/hooks/use-file-picker-labels.ts +29 -0
- package/src/hooks/use-file-picker.tsx +363 -0
- package/src/hooks/use-focus-trap.ts +19 -6
- package/src/i18n/defaults.ts +91 -82
- package/src/i18n/german.ts +50 -6
- package/src/i18n/kit-labels.tsx +70 -119
- package/src/i18n/locales/en.ts +46 -0
- package/src/i18n/locales/es.ts +50 -6
- package/src/i18n/locales/fr.ts +52 -7
- package/src/i18n/locales/hu.ts +50 -6
- package/src/i18n/locales/it.ts +51 -6
- package/src/i18n/locales/zh.ts +49 -6
- package/src/i18n/review.ts +4 -0
- package/src/i18n/shared-labels.ts +135 -0
- package/src/index.ts +412 -404
- package/src/landing/access.ts +2 -1
- package/src/landing/landing-actions.tsx +6 -5
- package/src/landing/landing-labels.ts +2 -2
- package/src/landing/landing-sections.tsx +24 -23
- package/src/landing/public-header.tsx +3 -2
- package/src/landing/routing.tsx +2 -7
- package/src/lib/chip-edge-snap.ts +212 -0
- package/src/lib/cn.ts +13 -1
- package/src/lib/dates.ts +4 -2
- package/src/lib/decimal-marks.ts +4 -2
- package/src/lib/download.ts +172 -0
- package/src/lib/floating-stack.ts +5 -1
- package/src/lib/format.ts +5 -3
- package/src/lib/ime.ts +24 -0
- package/src/lib/presence.ts +18 -0
- package/src/lib/reduced-motion.ts +21 -0
- package/src/lib/round.ts +38 -0
- package/src/lib/safe-storage.ts +35 -11
- package/src/lib/session-refresh.ts +473 -0
- package/src/lib/text-match.ts +60 -0
- package/src/lib/translation-review.ts +7 -6
- package/src/rhf/fields.tsx +131 -179
- package/src/rhf/form-core.tsx +327 -0
- package/src/rhf/form.tsx +46 -321
- package/src/rhf/line-items.tsx +1 -1
- package/src/rhf.ts +3 -2
- package/src/search/command-palette-labels.ts +16 -0
- package/src/search/command-palette.tsx +37 -50
- package/src/search/global-search-labels.ts +13 -0
- package/src/search/global-search.tsx +50 -24
- package/src/search/search-index.ts +5 -6
- package/src/search/use-command-key.ts +22 -0
- package/src/settings/settings-card-classes.ts +11 -0
- package/src/settings/settings-heading.tsx +1 -1
- package/src/settings/settings-labels.ts +2 -2
- package/src/settings/settings-layout.tsx +65 -6
- package/src/settings/settings-section.tsx +5 -5
- package/src/settings/use-settings-focus.ts +2 -5
- package/src/shell/app-shell-labels.ts +10 -0
- package/src/shell/app-shell.tsx +79 -53
- package/src/shell/auth-layout.tsx +11 -10
- package/src/shell/company-switcher-labels.ts +13 -0
- package/src/shell/company-switcher.tsx +7 -11
- package/src/shell/option-switcher-menu.tsx +25 -6
- package/src/shell/role-switcher.tsx +7 -3
- package/src/shell/top-bar-brand.tsx +1 -1
- package/src/shell/top-bar.tsx +6 -5
- package/src/shell/topbar-action-menu.tsx +39 -20
- package/src/shell/topbar-controls.tsx +24 -12
- package/src/shell.ts +1 -1
- package/src/testing/index.ts +11 -0
- package/src/testing/viewport.ts +251 -0
- package/src/theme/color.ts +7 -1
- package/src/theme/palette-derive.ts +29 -7
- package/src/theme/palette-presets.ts +81 -68
- package/src/tour/tour-labels.ts +14 -0
- package/src/tour/tour.tsx +13 -23
- package/src/wizard/stepper-nav.tsx +19 -18
- package/src/wizard/types.ts +7 -22
- package/src/wizard/wizard-labels.ts +29 -0
- package/src/wizard/wizard-step.tsx +2 -2
- package/src/wizard/wizard-summary.tsx +8 -7
- package/tokens.css +45 -14
- package/dist/components/account-settings-labels.js.map +0 -1
- package/dist/components/account-settings.js.map +0 -1
- package/dist/components/choice-parts.d.ts +0 -24
- package/dist/components/choice-parts.js +0 -18
- package/dist/components/choice-parts.js.map +0 -1
- package/dist/components/passkeys-setting.js.map +0 -1
- package/dist/components/ui.d.ts +0 -101
- package/dist/components/ui.js +0 -1955
- package/dist/components/ui.js.map +0 -1
- package/dist/data-table-labels-BJ5JE_X2.d.ts +0 -923
- package/dist/delete-account-setting-DAgGBrbn.d.ts +0 -8167
- package/src/components/choice-parts.ts +0 -33
- package/src/components/ui.tsx +0 -4233
|
@@ -1,47 +1,29 @@
|
|
|
1
|
-
import { Fragment,
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Filter,
|
|
13
|
-
Pencil,
|
|
14
|
-
Trash2,
|
|
15
|
-
X,
|
|
16
|
-
} from "lucide-react";
|
|
17
|
-
import { Card, FOCUS_RING, IconButton, Select, Spinner } from "./ui";
|
|
18
|
-
import { RowActions, type RowAction } from "./row-actions";
|
|
1
|
+
import { Fragment, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
2
|
+
import type { ReactNode, TdHTMLAttributes, ThHTMLAttributes } from "react";
|
|
3
|
+
import { Card } from "./card";
|
|
4
|
+
import { Spinner } from "./spinner";
|
|
5
|
+
import { ROW_ACTIONS_KEY, useRowActionColumn } from "./data-table-row-actions";
|
|
6
|
+
import { useColumnResize } from "./data-table-resize";
|
|
7
|
+
import { useRangeSelection } from "./data-table-selection";
|
|
8
|
+
import { RowLink, cleanAttrs, columnLabel, fromOutside, logicalAlign, splitCellProps } from "./data-table-shared";
|
|
9
|
+
import { MobileFilters, MobileRow, MobileSort, StackedFields } from "./data-table-mobile";
|
|
10
|
+
import { DataTableHead } from "./data-table-head";
|
|
11
|
+
import { ColumnSettingsPanel } from "./data-table-column-settings";
|
|
19
12
|
import { useLargeText } from "../hooks/use-large-text";
|
|
20
13
|
import { cn } from "../lib/cn";
|
|
21
|
-
import {
|
|
22
|
-
defaultFilterState,
|
|
23
|
-
isFilterActive,
|
|
24
|
-
resolveFilter,
|
|
25
|
-
rowMatches,
|
|
26
|
-
} from "./data-table-filters";
|
|
14
|
+
import { isFilterActive, resolveFilter, rowMatches } from "./data-table-filters";
|
|
27
15
|
import type { ColumnFilter, FilterValue } from "./data-table-filters";
|
|
28
16
|
import { nextSorts } from "./data-table-sort";
|
|
29
17
|
import type { SortCycle, SortDir, SortState } from "./data-table-sort";
|
|
30
|
-
import { FilterPopover } from "./data-table-filter-popover";
|
|
31
18
|
import { Pagination } from "./data-table-pagination";
|
|
32
|
-
import {
|
|
33
|
-
import { useBackdropClose } from "./modal";
|
|
34
|
-
import { useBodyScrollLock } from "../hooks/use-body-scroll-lock";
|
|
35
|
-
import { useOverlayHistory } from "../hooks/use-overlay-history";
|
|
19
|
+
import type { SwipeAction } from "./swipeable-row";
|
|
36
20
|
import { FullBleedDialog } from "./full-bleed-dialog";
|
|
37
|
-
import { Popover } from "./popover";
|
|
38
21
|
import { usePhoneLayout } from "../hooks/use-breakpoint";
|
|
39
22
|
import { useAnnounce } from "../hooks/use-announce";
|
|
40
23
|
import { DEFAULT_DATA_TABLE_LABELS, resolveDataTableLabels, type DataTableLabels } from "./data-table-labels";
|
|
41
|
-
import { useKitLabelOverrides, useKitLocale } from "../i18n/kit-labels";
|
|
42
|
-
import { Tooltip } from "./tooltip";
|
|
24
|
+
import { useKitLabelOverrides, useKitLocale, useKitTableStorageKeyPrefix, type LabelOverride } from "../i18n/kit-labels";
|
|
43
25
|
import { useEdgeFade } from "../lib/strip-fade";
|
|
44
|
-
import { dirOf,
|
|
26
|
+
import { dirOf, type Direction } from "../lib/direction";
|
|
45
27
|
|
|
46
28
|
// ---------- Types ----------
|
|
47
29
|
|
|
@@ -145,58 +127,6 @@ export type DataTableCellProps = TdHTMLAttributes<HTMLTableCellElement> & DataAt
|
|
|
145
127
|
/** What {@link DataTableColumn.headProps} takes. */
|
|
146
128
|
export type DataTableHeadProps = ThHTMLAttributes<HTMLTableCellElement> & DataAttributes;
|
|
147
129
|
|
|
148
|
-
/**
|
|
149
|
-
* Split a caller's cell attributes into what may reach the element and what the kit
|
|
150
|
-
* owns. `role` and `data-col` are dropped outright (see `cellProps`); `className` and
|
|
151
|
-
* `style` come back separately so the kit can merge rather than replace them.
|
|
152
|
-
*/
|
|
153
|
-
function splitCellProps(
|
|
154
|
-
props: DataTableCellProps | DataTableHeadProps | undefined,
|
|
155
|
-
): { attrs: Record<string, unknown>; className?: string; style?: CSSProperties } {
|
|
156
|
-
if (!props) return { attrs: {} };
|
|
157
|
-
const {
|
|
158
|
-
className,
|
|
159
|
-
style,
|
|
160
|
-
role: _role,
|
|
161
|
-
"data-col": _col,
|
|
162
|
-
...attrs
|
|
163
|
-
} = props as DataTableCellProps & { "data-col"?: unknown };
|
|
164
|
-
return { attrs, className, style };
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** Only the `data-*` attributes of a cell's props — what a phone card field takes. */
|
|
168
|
-
function dataAttrsOf(props: DataTableCellProps | undefined): Record<string, unknown> | undefined {
|
|
169
|
-
if (!props) return undefined;
|
|
170
|
-
const out: Record<string, unknown> = {};
|
|
171
|
-
for (const [k, v] of Object.entries(props)) if (k.startsWith("data-") && k !== "data-col") out[k] = v;
|
|
172
|
-
return out;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/** A column resize in flight. Held in a ref rather than in state: the live width is
|
|
176
|
-
* written straight onto the column's cells, so a drag costs zero renders and the
|
|
177
|
-
* one `setWidths` happens when the pointer comes up. */
|
|
178
|
-
interface Resize {
|
|
179
|
-
key: string;
|
|
180
|
-
pointerId: number;
|
|
181
|
-
startX: number;
|
|
182
|
-
startWidth: number;
|
|
183
|
-
/** +1 when a drag to the right widens the column, -1 in a right-to-left table,
|
|
184
|
-
* where the handle sits on the column's LEFT edge and widening is a drag left. */
|
|
185
|
-
sign: 1 | -1;
|
|
186
|
-
/** What React last rendered this column at, so a CANCELLED drag can put the header
|
|
187
|
-
* back — React cannot, it never saw the inline width the drag wrote. */
|
|
188
|
-
hadWidth: number | undefined;
|
|
189
|
-
/** The header and the body cells under it, collected ONCE when the drag starts.
|
|
190
|
-
* A `<th>` alone cannot shrink a column whose `<td>`s already carry a pinned
|
|
191
|
-
* width — and nothing re-renders during a drag, so the list cannot go stale. */
|
|
192
|
-
cells: HTMLElement[];
|
|
193
|
-
width: number;
|
|
194
|
-
/** A press with no drag in it is not a resize — the handle is also the
|
|
195
|
-
* double-click target that CLEARS a width, and committing the header's current
|
|
196
|
-
* size on the way past would pin every column the user ever brushed. */
|
|
197
|
-
moved: boolean;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
130
|
export interface ServerPagination {
|
|
201
131
|
page: number; // 0-based
|
|
202
132
|
pageSize: number;
|
|
@@ -248,7 +178,7 @@ export interface DataTableProps<T> {
|
|
|
248
178
|
isExpanded?: (row: T) => boolean;
|
|
249
179
|
/**
|
|
250
180
|
* Extra classes for a row — the `<tr>` on desktop, the card on mobile. Merged last,
|
|
251
|
-
* so a `hover:` fill here replaces the row's own `hover:bg-
|
|
181
|
+
* so a `hover:` fill here replaces the row's own `hover:bg-hover`.
|
|
252
182
|
*
|
|
253
183
|
* **A row you paint has to pick its own hover** (0.33, docs/colour-roles-harmonization.md
|
|
254
184
|
* §12.2): the kit cannot see your rest colour, and `--bg-hover` is mixed against the
|
|
@@ -302,6 +232,10 @@ export interface DataTableProps<T> {
|
|
|
302
232
|
* phone the card list is the scroller instead, with the filter button pinned above
|
|
303
233
|
* it; an unbounded parent simply lets either layout grow to its content. The parent must give it a bounded height (e.g. a flex
|
|
304
234
|
* column inside the viewport-locked app shell). See feedback #207.
|
|
235
|
+
*
|
|
236
|
+
* The cure for TWO SCROLLBARS (round 0.34 C14, kastlan feedback 55): the default
|
|
237
|
+
* `maxBodyHeight` scrolls the body inside a page that scrolls too. How a page fills
|
|
238
|
+
* the height is in {@link DataTableProps.maxBodyHeight}'s note.
|
|
305
239
|
*/
|
|
306
240
|
fillHeight?: boolean;
|
|
307
241
|
/** How tall the scrolling body may get before it scrolls, as a CSS length.
|
|
@@ -314,7 +248,25 @@ export interface DataTableProps<T> {
|
|
|
314
248
|
* elements there should in best case be no scrolling necessary".
|
|
315
249
|
*
|
|
316
250
|
* Ignored under `fillHeight`, which bounds the body by its flex parent
|
|
317
|
-
* instead and is the stronger statement of the same intent.
|
|
251
|
+
* instead and is the stronger statement of the same intent.
|
|
252
|
+
*
|
|
253
|
+
* **Two scrollbars** (round 0.34 C14, kastlan feedback 55). The cap scrolls the
|
|
254
|
+
* body INSIDE a page that, in most shells, scrolls itself: a table taller than
|
|
255
|
+
* the cap on a page with anything else on it shows two scrollbars side by side,
|
|
256
|
+
* and the wheel moves whichever is under the pointer. For a list page whose table
|
|
257
|
+
* is the point, fill the height instead, from `md` up (a phone scrolls the page
|
|
258
|
+
* and its card list as one):
|
|
259
|
+
*
|
|
260
|
+
* 1. the shell's content column becomes a flex column of the main area's height
|
|
261
|
+
* when the page asks — kastlan's
|
|
262
|
+
* `md:has-[>[data-fill-height]]:flex md:has-[>[data-fill-height]]:h-full md:has-[>[data-fill-height]]:flex-col`;
|
|
263
|
+
* 2. the page's root asks, and is a flex column that may shrink:
|
|
264
|
+
* `data-fill-height` and `md:flex md:min-h-0 md:flex-1 md:flex-col`;
|
|
265
|
+
* 3. the table takes the rest: `<DataTable fillHeight>`.
|
|
266
|
+
*
|
|
267
|
+
* Only the body then scrolls, under its pinned header, and every other page grows
|
|
268
|
+
* with its content as before (kastlan e3985c9, its leases list). A short table that
|
|
269
|
+
* is the last thing on its page can instead drop the cap: `maxBodyHeight="none"`. */
|
|
318
270
|
maxBodyHeight?: string;
|
|
319
271
|
/**
|
|
320
272
|
* When provided, the table renders the supplied rows as-is (no client-side
|
|
@@ -373,12 +325,13 @@ export interface DataTableProps<T> {
|
|
|
373
325
|
/** User-facing strings (English defaults); pass translated overrides. Merged over
|
|
374
326
|
* `dataTable` from `<UiKitProvider labels>`, so a call site only states what
|
|
375
327
|
* differs for THIS table — typically `table`, its accessible name. */
|
|
376
|
-
labels?:
|
|
328
|
+
labels?: LabelOverride<DataTableLabels>;
|
|
377
329
|
/** BCP-47 locale for the date filter's calendar and the pager's numbers. Falls
|
|
378
330
|
* back to `<UiKitProvider locale>`, then to the runtime's default. */
|
|
379
331
|
locale?: string;
|
|
380
|
-
/** localStorage namespace prefix for `storageKey` persistence
|
|
381
|
-
*
|
|
332
|
+
/** localStorage namespace prefix for `storageKey` persistence: the stored key is this
|
|
333
|
+
* plus `storageKey`. Falls back to `<UiKitProvider tableStorageKeyPrefix>` (0.34, set
|
|
334
|
+
* your app's prefix there once), then to "hbui-table:". This prop wins over both. */
|
|
382
335
|
storageKeyPrefix?: string;
|
|
383
336
|
/**
|
|
384
337
|
* On phones, surface the expanded row's detail in a full-screen dialog instead
|
|
@@ -643,56 +596,6 @@ export interface DataTableRowAction<T> {
|
|
|
643
596
|
swipe?: "start" | "end" | false;
|
|
644
597
|
}
|
|
645
598
|
|
|
646
|
-
/** The actions column's key. Not a column a caller declares, so it is kept out of the
|
|
647
|
-
* column-settings panel. */
|
|
648
|
-
const ROW_ACTIONS_KEY = "__rowActions";
|
|
649
|
-
|
|
650
|
-
interface ResolvedRowAction<T> {
|
|
651
|
-
key: string;
|
|
652
|
-
label: string;
|
|
653
|
-
icon: ReactNode;
|
|
654
|
-
tone: "default" | "danger";
|
|
655
|
-
swipe: "start" | "end" | false;
|
|
656
|
-
action: DataTableRowAction<T>;
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
function resolveRowAction<T>(
|
|
660
|
-
action: DataTableRowAction<T>,
|
|
661
|
-
index: number,
|
|
662
|
-
labels: DataTableLabels,
|
|
663
|
-
): ResolvedRowAction<T> {
|
|
664
|
-
const tone = action.tone ?? (action.kind === "delete" ? "danger" : "default");
|
|
665
|
-
return {
|
|
666
|
-
key: action.kind ?? `${index}:${action.label ?? ""}`,
|
|
667
|
-
label: action.label ?? (action.kind === "edit" ? labels.edit : action.kind === "delete" ? labels.delete : ""),
|
|
668
|
-
icon:
|
|
669
|
-
action.icon ??
|
|
670
|
-
(action.kind === "edit" ? <Pencil /> : action.kind === "delete" ? <Trash2 /> : null),
|
|
671
|
-
tone,
|
|
672
|
-
swipe: action.swipe ?? (tone === "danger" ? "start" : "end"),
|
|
673
|
-
action,
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
/** Ask, then act. */
|
|
678
|
-
async function runRowAction<T>(action: DataTableRowAction<T>, row: T): Promise<void> {
|
|
679
|
-
if (action.confirm && !(await action.confirm(row))) return;
|
|
680
|
-
action.onAction(row);
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
/** A resolved row action as {@link RowActions} takes it. Its `icon` is any node; a
|
|
684
|
-
* non-element one (a string glyph) is wrapped, since RowAction wants an element. */
|
|
685
|
-
function toRowAction<T>(a: ResolvedRowAction<T>, row: T): RowAction {
|
|
686
|
-
return {
|
|
687
|
-
key: a.key,
|
|
688
|
-
label: a.label,
|
|
689
|
-
icon: isValidElement(a.icon) ? a.icon : a.icon != null && a.icon !== false ? <>{a.icon}</> : undefined,
|
|
690
|
-
tone: a.tone,
|
|
691
|
-
disabledReason: a.action.disabledReason?.(row),
|
|
692
|
-
onSelect: () => void runRowAction(a.action, row),
|
|
693
|
-
};
|
|
694
|
-
}
|
|
695
|
-
|
|
696
599
|
/** See {@link DataTableProps.chrome}. */
|
|
697
600
|
export type DataTableChrome = "full" | "minimal";
|
|
698
601
|
|
|
@@ -714,44 +617,6 @@ export interface MobileSwipeActions {
|
|
|
714
617
|
right?: SwipeAction[];
|
|
715
618
|
}
|
|
716
619
|
|
|
717
|
-
/** The logical sides onto the physical drag directions {@link SwipeableRow} takes. */
|
|
718
|
-
function physicalSwipe(
|
|
719
|
-
actions: MobileSwipeActions,
|
|
720
|
-
dir: Direction,
|
|
721
|
-
): { left?: SwipeAction[]; right?: SwipeAction[] } {
|
|
722
|
-
const rtl = dir === "rtl";
|
|
723
|
-
return {
|
|
724
|
-
left: (rtl ? actions.end : actions.start) ?? actions.left,
|
|
725
|
-
right: (rtl ? actions.start : actions.end) ?? actions.right,
|
|
726
|
-
};
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
// A bare `text-right` / `text-left` token, with or without variant prefixes
|
|
730
|
-
// (`md:text-right`). Deliberately NOT `text-right-…` or an arbitrary value.
|
|
731
|
-
const PHYSICAL_ALIGN = /(^|\s)((?:[\w-]+:)*)text-(left|right)(?=\s|$)/g;
|
|
732
|
-
|
|
733
|
-
/**
|
|
734
|
-
* A column's `className`/`headClassName` with physical text alignment rewritten to
|
|
735
|
-
* logical: `text-right` → `text-end`, `text-left` → `text-start`.
|
|
736
|
-
*
|
|
737
|
-
* Every numeric column written before 0.7.0 says `text-right`, and that is what it
|
|
738
|
-
* MEANT: the end of the line, where digits line up. Rendered as written, a
|
|
739
|
-
* right-to-left table puts those numbers on the far side from their own header's
|
|
740
|
-
* sort button. Rewriting keeps each existing call site correct in both directions
|
|
741
|
-
* with no change on its side; a caller who genuinely wants the physical side in RTL
|
|
742
|
-
* too can say `ltr:text-right rtl:text-right`, which this leaves alone.
|
|
743
|
-
*/
|
|
744
|
-
function logicalAlign(className: string | undefined): string | undefined {
|
|
745
|
-
return className?.replace(
|
|
746
|
-
PHYSICAL_ALIGN,
|
|
747
|
-
(token: string, lead: string, variants: string, side: string) =>
|
|
748
|
-
// Already scoped to one direction: that is a caller choosing the physical side.
|
|
749
|
-
/(^|:)(ltr|rtl):/.test(variants)
|
|
750
|
-
? token
|
|
751
|
-
: `${lead}${variants}text-${side === "right" ? "end" : "start"}`,
|
|
752
|
-
);
|
|
753
|
-
}
|
|
754
|
-
|
|
755
620
|
/**
|
|
756
621
|
* A totals-row cell: pinned to the scroller's bottom edge, on the header's surface.
|
|
757
622
|
* The rule above it is an inset shadow rather than a `border-t`: the table collapses
|
|
@@ -759,83 +624,15 @@ function logicalAlign(className: string | undefined): string | undefined {
|
|
|
759
624
|
* behind at the bottom of the rows while the sticky cell rides over them.
|
|
760
625
|
*/
|
|
761
626
|
const FOOTER_CELL =
|
|
762
|
-
"sticky bottom-0 z-10 bg-
|
|
763
|
-
|
|
764
|
-
/** Whether a column is end-aligned — the header then puts its filter button first. */
|
|
765
|
-
const END_ALIGN = /(^|\s)text-end(?=\s|$)/;
|
|
766
|
-
|
|
767
|
-
/** Drop the undefined entries of a {@link DataTableProps.rowAttributes} map, so a
|
|
768
|
-
* caller can write `{ "data-x": cond ? "y" : undefined }` and get no attribute
|
|
769
|
-
* at all rather than the string "undefined" in the DOM. */
|
|
770
|
-
function cleanAttrs(
|
|
771
|
-
attrs: Record<string, string | undefined> | undefined,
|
|
772
|
-
): Record<string, string> | undefined {
|
|
773
|
-
if (!attrs) return undefined;
|
|
774
|
-
const out: Record<string, string> = {};
|
|
775
|
-
for (const [k, v] of Object.entries(attrs)) if (v !== undefined) out[k] = v;
|
|
776
|
-
return out;
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
/**
|
|
780
|
-
* A column's name as a plain string.
|
|
781
|
-
*
|
|
782
|
-
* `header` is a ReactNode — an icon, a unit suffix, a tooltip-wrapped span — and
|
|
783
|
-
* neither a live region nor the column-settings checklist can speak a React element.
|
|
784
|
-
* The `key` fallback is the one the settings panel has always used; a column whose
|
|
785
|
-
* header is not a string and whose key is not human-readable is a call site that
|
|
786
|
-
* should pass a string header, and that is visible in what gets announced.
|
|
787
|
-
*/
|
|
788
|
-
function columnLabel<T>(col: DataTableColumn<T>, labels?: DataTableLabels): string {
|
|
789
|
-
if (col.key === ROW_ACTIONS_KEY && labels) return labels.actions;
|
|
790
|
-
return col.headerText ?? (typeof col.header === "string" ? col.header : col.key);
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
// ---------- Phone card at Large (0.32) ----------
|
|
794
|
-
|
|
795
|
-
/**
|
|
796
|
-
* §4 "nothing truncates" in a phone card at Large and Extra large: a cell's own
|
|
797
|
-
* `truncate` (a kit cell, a chip, the app's span) wraps instead — and breaks inside a
|
|
798
|
-
* word too long for the card rather than running out of it. A descendant rule, so it
|
|
799
|
-
* reaches the cells without the table knowing what they render; `large:`, so Normal
|
|
800
|
-
* keeps every ellipsis it had.
|
|
801
|
-
*/
|
|
802
|
-
const CARD_NO_TRUNCATE =
|
|
803
|
-
"large:[&_.truncate]:whitespace-normal large:[&_.truncate]:[overflow-wrap:anywhere]";
|
|
804
|
-
|
|
805
|
-
/**
|
|
806
|
-
* Columns as label-above-value pairs: the phone card's fields at Large (§4), and the
|
|
807
|
-
* opened row's `mobileDetailsInRow` at every size. Each pair is a `<div>` in the
|
|
808
|
-
* `<dl>` — the grouping HTML allows — so a pair keeps together and the gap falls
|
|
809
|
-
* BETWEEN facts rather than between a label and its own value. `relative` holds a
|
|
810
|
-
* header's `sr-only` text (an actions column's), as every kit container must.
|
|
811
|
-
*/
|
|
812
|
-
function StackedFields<T>({ columns, row, compact }: { columns: DataTableColumn<T>[]; row: T; compact: boolean }) {
|
|
813
|
-
return (
|
|
814
|
-
<dl
|
|
815
|
-
data-card-fields="stacked"
|
|
816
|
-
className={cn("relative flex min-w-0 flex-col", compact ? "gap-1.5 text-xs" : "gap-2.5 text-sm", CARD_NO_TRUNCATE)}
|
|
817
|
-
>
|
|
818
|
-
{columns.map((col) => (
|
|
819
|
-
<div key={col.key} className="min-w-0">
|
|
820
|
-
<dt className="text-xs uppercase tracking-wide text-[var(--text-muted)]">{col.header}</dt>
|
|
821
|
-
<dd
|
|
822
|
-
{...dataAttrsOf(col.cellProps?.(row))}
|
|
823
|
-
className="mt-0.5 min-w-0 break-words text-[var(--text-secondary)]"
|
|
824
|
-
>
|
|
825
|
-
{col.cell(row)}
|
|
826
|
-
</dd>
|
|
827
|
-
</div>
|
|
828
|
-
))}
|
|
829
|
-
</dl>
|
|
830
|
-
);
|
|
831
|
-
}
|
|
627
|
+
"sticky bottom-0 z-10 bg-surface-2 shadow-[inset_0_2px_0_var(--border-strong)]";
|
|
832
628
|
|
|
833
629
|
// ---------- Phone sort control (keksdose K10) ----------
|
|
834
630
|
|
|
835
631
|
/**
|
|
836
632
|
* The phone sort control's strings (keksdose K10). They are `dataTable` strings —
|
|
837
633
|
* read from the table's resolved labels, so the `labels` prop and the provider's
|
|
838
|
-
* `dataTable` namespace reach them — and are declared here,
|
|
634
|
+
* `dataTable` namespace reach them — and are declared here, with the table's other
|
|
635
|
+
* public types (the control itself, `MobileSort`, is in data-table-mobile.tsx), with
|
|
839
636
|
* English defaults until `DataTableLabels` declares them itself.
|
|
840
637
|
*/
|
|
841
638
|
export interface DataTableSortLabels {
|
|
@@ -860,91 +657,6 @@ export const DEFAULT_DATA_TABLE_SORT_LABELS: DataTableSortLabels = {
|
|
|
860
657
|
|
|
861
658
|
const flipDir = (d: SortDir): SortDir => (d === "asc" ? "desc" : "asc");
|
|
862
659
|
|
|
863
|
-
/**
|
|
864
|
-
* The card list's sort control: a "Sort by" select and a direction button.
|
|
865
|
-
*
|
|
866
|
-
* keksdose K10 (inputs audit 2026-10-02 §5; its aggregated report tables, #258): a
|
|
867
|
-
* table is sorted by its header row and the phone card list has none, so the two
|
|
868
|
-
* decisions the header carries — which column, which direction — were unreachable
|
|
869
|
-
* below the breakpoint. keksdose hand-built this row over its DataTable to answer
|
|
870
|
-
* "who did I pay the most" on the device it was asked on; this is that row, driven by
|
|
871
|
-
* the SAME sort state as the headers (controlled `sorts` included), so turning the
|
|
872
|
-
* phone sideways keeps the order and a sort chosen here is the one the URL and the
|
|
873
|
-
* storage key hold.
|
|
874
|
-
*
|
|
875
|
-
* The rules are the header's: a newly picked column starts in its `firstSort`, the
|
|
876
|
-
* direction button flips the primary sort (secondary ones stay), and "Default order"
|
|
877
|
-
* — the third click of a `"tri"` cycle — is offered only under `"tri"`, since a
|
|
878
|
-
* `"toggle"` table promises it is always ranked by something. The select's label is
|
|
879
|
-
* a real `<label>` beside it, and the button sits outside that label: a click inside
|
|
880
|
-
* a label is forwarded to the control it names, so a nested button would flip AND
|
|
881
|
-
* open the select.
|
|
882
|
-
*/
|
|
883
|
-
function MobileSort<T>({
|
|
884
|
-
columns,
|
|
885
|
-
sorts,
|
|
886
|
-
sortCycle,
|
|
887
|
-
compact,
|
|
888
|
-
labels,
|
|
889
|
-
onPick,
|
|
890
|
-
onFlip,
|
|
891
|
-
}: {
|
|
892
|
-
columns: DataTableColumn<T>[];
|
|
893
|
-
sorts: SortState[];
|
|
894
|
-
sortCycle: SortCycle;
|
|
895
|
-
compact: boolean;
|
|
896
|
-
labels: DataTableLabels;
|
|
897
|
-
onPick: (key: string | null) => void;
|
|
898
|
-
onFlip: () => void;
|
|
899
|
-
}) {
|
|
900
|
-
const selectId = useId();
|
|
901
|
-
const sortLabels: DataTableSortLabels = labels;
|
|
902
|
-
if (columns.length === 0) return null;
|
|
903
|
-
// A persisted or URL sort can name a column with no `sortBy` (or a hidden one): the
|
|
904
|
-
// sort chain drops it, and so does the control rather than claiming it.
|
|
905
|
-
const primary = sorts[0] && columns.some((c) => c.key === sorts[0].key) ? sorts[0] : null;
|
|
906
|
-
const offerDefault = sortCycle === "tri" || primary === null;
|
|
907
|
-
const desc = primary?.dir === "desc";
|
|
908
|
-
return (
|
|
909
|
-
<div
|
|
910
|
-
data-table-mobile-sort=""
|
|
911
|
-
className={cn(
|
|
912
|
-
// At Large the direction button shows its words (IconButton's label, §4); the
|
|
913
|
-
// row wraps so the select keeps a usable width on a 240 px card.
|
|
914
|
-
"flex flex-wrap items-center gap-2 border-b border-[var(--border)]",
|
|
915
|
-
compact ? "px-3 py-1.5" : "px-4 py-2",
|
|
916
|
-
)}
|
|
917
|
-
>
|
|
918
|
-
<label htmlFor={selectId} className="shrink-0 text-xs text-[var(--text-muted)]">
|
|
919
|
-
{sortLabels.sortBy}
|
|
920
|
-
</label>
|
|
921
|
-
<Select
|
|
922
|
-
id={selectId}
|
|
923
|
-
size={compact ? "sm" : "md"}
|
|
924
|
-
className="min-w-0 flex-1 large:basis-40"
|
|
925
|
-
value={primary?.key ?? ""}
|
|
926
|
-
onChange={(e) => onPick(e.target.value || null)}
|
|
927
|
-
>
|
|
928
|
-
{offerDefault && <option value="">{sortLabels.sortDefault}</option>}
|
|
929
|
-
{columns.map((col) => (
|
|
930
|
-
<option key={col.key} value={col.key}>
|
|
931
|
-
{columnLabel(col, labels)}
|
|
932
|
-
</option>
|
|
933
|
-
))}
|
|
934
|
-
</Select>
|
|
935
|
-
<IconButton
|
|
936
|
-
size={compact ? "xs" : "md"}
|
|
937
|
-
variant="secondary"
|
|
938
|
-
label={desc ? sortLabels.sortDescending : sortLabels.sortAscending}
|
|
939
|
-
disabled={primary === null}
|
|
940
|
-
onClick={onFlip}
|
|
941
|
-
>
|
|
942
|
-
{desc ? <ArrowDownWideNarrow /> : <ArrowUpNarrowWide />}
|
|
943
|
-
</IconButton>
|
|
944
|
-
</div>
|
|
945
|
-
);
|
|
946
|
-
}
|
|
947
|
-
|
|
948
660
|
/**
|
|
949
661
|
* What counts as a control of its own inside a clickable row: a click or key press
|
|
950
662
|
* that lands on one of these belongs to it, not to the row's `onRowClick`. The row's
|
|
@@ -953,20 +665,6 @@ function MobileSort<T>({
|
|
|
953
665
|
const OWN_CONTROL =
|
|
954
666
|
'a[href],button,input,select,textarea,label,summary,[role="button"],[role="link"],[role="checkbox"],[role="switch"],[role="menuitem"],[role="option"],[contenteditable=""],[contenteditable="true"],[tabindex]:not([tabindex="-1"])';
|
|
955
667
|
|
|
956
|
-
/**
|
|
957
|
-
* Whether a click that reached `row`'s handler did not start in the row's own DOM.
|
|
958
|
-
*
|
|
959
|
-
* React bubbles an event through the COMPONENT tree, portals included: a popover, a
|
|
960
|
-
* menu or a dialog a cell (or the expansion under it) opens renders at `<body>` but
|
|
961
|
-
* still reports its clicks to every React ancestor — the row among them. So a click
|
|
962
|
-
* in a cell's portalled date picker opened the row it came from, and a page wrapped
|
|
963
|
-
* such content in `<div onClick={(e) => e.stopPropagation()}>` to stop it (kastlan's
|
|
964
|
-
* feedback page did, round its comments). The row owns the clicks on the row.
|
|
965
|
-
*/
|
|
966
|
-
function fromOutside(target: EventTarget | null, row: HTMLElement): boolean {
|
|
967
|
-
return !(target instanceof Node) || !row.contains(target);
|
|
968
|
-
}
|
|
969
|
-
|
|
970
668
|
/** Whether an event on `row` started on a control nested inside it. */
|
|
971
669
|
function fromOwnControl(target: EventTarget | null, row: HTMLElement): boolean {
|
|
972
670
|
if (!(target instanceof Element)) return false;
|
|
@@ -1001,83 +699,6 @@ function moveRowFocus(from: HTMLElement, key: string): boolean {
|
|
|
1001
699
|
}
|
|
1002
700
|
const ROW_NAV_KEYS = { ArrowDown: 1, ArrowUp: 1, Home: 1, End: 1 } as const;
|
|
1003
701
|
|
|
1004
|
-
/** A click the APP owns. Anything else — middle, ⌘/Ctrl, Shift, Alt — belongs to
|
|
1005
|
-
* the browser, and the whole feature is not touching it. */
|
|
1006
|
-
const isPlainLeftClick = (e: React.MouseEvent) =>
|
|
1007
|
-
e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey;
|
|
1008
|
-
|
|
1009
|
-
/**
|
|
1010
|
-
* The anchor a linkable row is opened through (Keksdose feedback #451).
|
|
1011
|
-
*
|
|
1012
|
-
* The plain left click is OURS: cancelled, then handed to the row's own handler, so
|
|
1013
|
-
* clicking a row still expands it in place instead of reloading the page. Every
|
|
1014
|
-
* other click — middle, ⌘/Ctrl, Shift, Alt — is left completely untouched, which is
|
|
1015
|
-
* the entire point of using an anchor rather than an `onAuxClick` + `window.open`:
|
|
1016
|
-
* that imitation buys back the middle click and still loses ⌘/Ctrl-click, "copy link
|
|
1017
|
-
* address", the status-bar preview and the phone's long-press menu.
|
|
1018
|
-
*
|
|
1019
|
-
* Modified clicks DO stop propagating: on a table with `selection`, ⌘/Ctrl-click and
|
|
1020
|
-
* Shift-click on a row mean "select" (feedback #289), and a row must not change its
|
|
1021
|
-
* selection while the browser is opening a tab. The rest of the row still selects —
|
|
1022
|
-
* the link is one cell, not the row.
|
|
1023
|
-
*
|
|
1024
|
-
* `draggable={false}` because an anchor otherwise hijacks a horizontal mouse drag as
|
|
1025
|
-
* a link-drag: that is both drag-to-select-text on the desktop table and the mouse
|
|
1026
|
-
* path through SwipeableRow's gesture on the mobile card.
|
|
1027
|
-
*/
|
|
1028
|
-
function RowLink({
|
|
1029
|
-
href,
|
|
1030
|
-
onActivate,
|
|
1031
|
-
className,
|
|
1032
|
-
children,
|
|
1033
|
-
...rest
|
|
1034
|
-
}: {
|
|
1035
|
-
href: string;
|
|
1036
|
-
/** Runs on a plain left click. Omit it where an ANCESTOR already handles the
|
|
1037
|
-
* click (the desktop `<tr>`), or the row would toggle twice. */
|
|
1038
|
-
onActivate?: () => void;
|
|
1039
|
-
className?: string;
|
|
1040
|
-
children: ReactNode;
|
|
1041
|
-
} & Omit<
|
|
1042
|
-
React.AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
1043
|
-
"href" | "className" | "children" | "onClick" | "onClickCapture"
|
|
1044
|
-
>) {
|
|
1045
|
-
return (
|
|
1046
|
-
<a
|
|
1047
|
-
{...rest}
|
|
1048
|
-
href={href}
|
|
1049
|
-
draggable={false}
|
|
1050
|
-
className={className}
|
|
1051
|
-
// CAPTURE phase, and it has to be: on the mobile card the whole card is the
|
|
1052
|
-
// anchor, so a nested control sits INSIDE it — and the ones that matter
|
|
1053
|
-
// (the feedback row's status toggles) stop the click propagating so the row
|
|
1054
|
-
// won't also expand. A bubble-phase handler would never run for those, and
|
|
1055
|
-
// the browser would follow the link out from under the button press. Cancelling
|
|
1056
|
-
// here happens before any descendant can silence the event; `stopPropagation`
|
|
1057
|
-
// does not undo a `preventDefault`.
|
|
1058
|
-
onClickCapture={(e) => {
|
|
1059
|
-
// A click in a portal a descendant opened is not a click on the link: leave
|
|
1060
|
-
// it (and a link inside it) alone. See `fromOutside`.
|
|
1061
|
-
if (fromOutside(e.target, e.currentTarget)) return;
|
|
1062
|
-
if (isPlainLeftClick(e)) e.preventDefault();
|
|
1063
|
-
}}
|
|
1064
|
-
onClick={(e) => {
|
|
1065
|
-
if (fromOutside(e.target, e.currentTarget)) return;
|
|
1066
|
-
if (!isPlainLeftClick(e)) {
|
|
1067
|
-
e.stopPropagation();
|
|
1068
|
-
return;
|
|
1069
|
-
}
|
|
1070
|
-
// Already cancelled above; this phase only decides what opens. A nested
|
|
1071
|
-
// control that stopped propagation deliberately never reaches it, which is
|
|
1072
|
-
// exactly how the row behaved before it became a link.
|
|
1073
|
-
onActivate?.();
|
|
1074
|
-
}}
|
|
1075
|
-
>
|
|
1076
|
-
{children}
|
|
1077
|
-
</a>
|
|
1078
|
-
);
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
702
|
// ---------- Main DataTable ----------
|
|
1082
703
|
|
|
1083
704
|
|
|
@@ -1110,7 +731,7 @@ export function DataTable<T>({
|
|
|
1110
731
|
selection,
|
|
1111
732
|
labels: labelsProp,
|
|
1112
733
|
locale: localeProp,
|
|
1113
|
-
storageKeyPrefix
|
|
734
|
+
storageKeyPrefix: storageKeyPrefixProp,
|
|
1114
735
|
mobileExpandAsDialog = false,
|
|
1115
736
|
mobileDetailsInRow = false,
|
|
1116
737
|
rowName,
|
|
@@ -1149,6 +770,11 @@ export function DataTable<T>({
|
|
|
1149
770
|
// other ten. Memoised because the announcement effects below list `labels` as a
|
|
1150
771
|
// dependency, and a fresh object every render would re-run them for nothing.
|
|
1151
772
|
const labelOverrides = useKitLabelOverrides("dataTable");
|
|
773
|
+
// prop > provider > the kit's default, the order every kit setting resolves in (round
|
|
774
|
+
// 0.34 C5, KS U4): one prefix on the provider reaches the tables an app cannot pass a
|
|
775
|
+
// prop to, `TranslationReviewPanel`'s among them.
|
|
776
|
+
const providerStorageKeyPrefix = useKitTableStorageKeyPrefix();
|
|
777
|
+
const storageKeyPrefix = storageKeyPrefixProp ?? providerStorageKeyPrefix ?? DEFAULT_PERSIST_PREFIX;
|
|
1152
778
|
const labels = useMemo(
|
|
1153
779
|
() =>
|
|
1154
780
|
resolveDataTableLabels(
|
|
@@ -1164,67 +790,16 @@ export function DataTable<T>({
|
|
|
1164
790
|
);
|
|
1165
791
|
const locale = useKitLocale(localeProp);
|
|
1166
792
|
|
|
1167
|
-
// ---- Row actions ----
|
|
1168
|
-
// The actions column
|
|
1169
|
-
//
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
: [],
|
|
1178
|
-
[rowActions, labels],
|
|
1179
|
-
);
|
|
1180
|
-
const columns = useMemo<DataTableColumn<T>[]>(
|
|
1181
|
-
() =>
|
|
1182
|
-
rowActions
|
|
1183
|
-
? [
|
|
1184
|
-
...columnsProp,
|
|
1185
|
-
{
|
|
1186
|
-
key: ROW_ACTIONS_KEY,
|
|
1187
|
-
header: <span className="sr-only">{labels.actions}</span>,
|
|
1188
|
-
// Through RowActions (0.32, §10.8): the icons inline at Normal, one "⋯"
|
|
1189
|
-
// menu at Large once there are two — every label at once does not fit a
|
|
1190
|
-
// row. Each control stops its own click: the row's handler already skips
|
|
1191
|
-
// its controls, and this is for the caller who wraps the table in a
|
|
1192
|
-
// clickable element of their own.
|
|
1193
|
-
cell: (row) => (
|
|
1194
|
-
<RowActions
|
|
1195
|
-
actions={rowActionsFor(row).map((a) => toRowAction(a, row))}
|
|
1196
|
-
name={rowName?.(row)}
|
|
1197
|
-
size={density === "compact" ? "2xs" : "xs"}
|
|
1198
|
-
labels={{ actions: labels.actions }}
|
|
1199
|
-
className="justify-end"
|
|
1200
|
-
/>
|
|
1201
|
-
),
|
|
1202
|
-
className: "w-px whitespace-nowrap text-end",
|
|
1203
|
-
headClassName: "w-px",
|
|
1204
|
-
// On a phone the same actions are the card's swipes.
|
|
1205
|
-
mobileHidden: true,
|
|
1206
|
-
noRowLink: true,
|
|
1207
|
-
},
|
|
1208
|
-
]
|
|
1209
|
-
: columnsProp,
|
|
1210
|
-
[columnsProp, rowActions, rowActionsFor, rowName, labels.actions, density],
|
|
1211
|
-
);
|
|
1212
|
-
const swipesFromActions = (row: T): MobileSwipeActions | null => {
|
|
1213
|
-
const swipes = rowActionsFor(row).filter((a) => a.swipe && !a.action.disabledReason?.(row));
|
|
1214
|
-
if (!swipes.length) return null;
|
|
1215
|
-
const toSwipe = (a: ResolvedRowAction<T>): SwipeAction => ({
|
|
1216
|
-
label: a.label,
|
|
1217
|
-
icon: a.icon,
|
|
1218
|
-
onCommit: () => void runRowAction(a.action, row),
|
|
1219
|
-
// The row action's tone, painted by SwipeableRow: its soft wash idle, its fill
|
|
1220
|
-
// and that fill's foreground armed (0.33).
|
|
1221
|
-
tone: a.tone === "danger" ? "danger" : "brand",
|
|
1222
|
-
});
|
|
1223
|
-
return {
|
|
1224
|
-
start: swipes.filter((a) => a.swipe === "start").map(toSwipe),
|
|
1225
|
-
end: swipes.filter((a) => a.swipe === "end").map(toSwipe),
|
|
1226
|
-
};
|
|
1227
|
-
};
|
|
793
|
+
// ---- Row actions ---- (data-table-row-actions.tsx)
|
|
794
|
+
// The actions column joins the caller's columns; on a phone the same actions are the
|
|
795
|
+
// card's swipes, unless the caller's own `mobileSwipeActions` says otherwise.
|
|
796
|
+
const { columns, swipesFromActions } = useRowActionColumn({
|
|
797
|
+
columns: columnsProp,
|
|
798
|
+
rowActions,
|
|
799
|
+
rowName,
|
|
800
|
+
labels,
|
|
801
|
+
density,
|
|
802
|
+
});
|
|
1228
803
|
const swipeActionsFor = mobileSwipeActions ?? (rowActions ? swipesFromActions : undefined);
|
|
1229
804
|
|
|
1230
805
|
// Sorting, filtering and paging all change WHICH rows are on screen without
|
|
@@ -1507,139 +1082,15 @@ export function DataTable<T>({
|
|
|
1507
1082
|
visibleColumns.find((c) => !c.noRowLink))
|
|
1508
1083
|
: undefined;
|
|
1509
1084
|
|
|
1510
|
-
// ---- Column resize ----
|
|
1511
|
-
//
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
// and `document.body.style` stayed at `user-select: none; cursor: col-resize` for
|
|
1520
|
-
// the rest of the session — the whole page unselectable, with the wrong cursor;
|
|
1521
|
-
// * `mousedown` is a mouse. Under a finger the handle did nothing at all.
|
|
1522
|
-
//
|
|
1523
|
-
// `setPointerCapture` answers all three: the handle itself receives every move and
|
|
1524
|
-
// the terminating `pointerup`/`pointercancel` wherever the pointer travels, so there
|
|
1525
|
-
// is nothing global to leak, and a touch drag works because a finger is a pointer.
|
|
1526
|
-
// The live width is written straight onto the column's own cells — the same three
|
|
1527
|
-
// properties the render sets, so the drag and the commit cannot disagree — and
|
|
1528
|
-
// `setWidths` is called once, when the drag ends.
|
|
1529
|
-
const resizing = useRef<Resize | null>(null);
|
|
1530
|
-
|
|
1531
|
-
/** Every cell in one column, header first, totals row included. `data-col` rather than a cell index:
|
|
1532
|
-
* an expanded row holds a single `colSpan` cell, so the nth `<td>` of a row is
|
|
1533
|
-
* not reliably the nth column. */
|
|
1534
|
-
const columnCells = (key: string): HTMLElement[] => {
|
|
1535
|
-
const th = headRefs.get(key);
|
|
1536
|
-
if (!th) return [];
|
|
1537
|
-
const table = th.closest("table");
|
|
1538
|
-
if (!table) return [th];
|
|
1539
|
-
return [
|
|
1540
|
-
th,
|
|
1541
|
-
...Array.from(table.querySelectorAll<HTMLElement>("tbody [data-col], tfoot [data-col]")).filter(
|
|
1542
|
-
(el) => el.dataset.col === key,
|
|
1543
|
-
),
|
|
1544
|
-
];
|
|
1545
|
-
};
|
|
1546
|
-
|
|
1547
|
-
const applyLiveWidth = (cells: HTMLElement[], width: number | undefined) => {
|
|
1548
|
-
const px = width == null ? "" : `${width}px`;
|
|
1549
|
-
for (const el of cells) {
|
|
1550
|
-
el.style.width = px;
|
|
1551
|
-
el.style.minWidth = px;
|
|
1552
|
-
el.style.maxWidth = px;
|
|
1553
|
-
}
|
|
1554
|
-
};
|
|
1555
|
-
|
|
1556
|
-
const releaseResizeChrome = (handle: Element, pointerId: number) => {
|
|
1557
|
-
document.body.style.userSelect = "";
|
|
1558
|
-
document.body.style.cursor = "";
|
|
1559
|
-
// Optional calls: jsdom implements neither, and the handlers sit on the handle
|
|
1560
|
-
// itself, so a run without capture behaves the same for anything that stays
|
|
1561
|
-
// inside the element.
|
|
1562
|
-
if (handle.hasPointerCapture?.(pointerId)) handle.releasePointerCapture?.(pointerId);
|
|
1563
|
-
};
|
|
1564
|
-
|
|
1565
|
-
const startResize = (e: React.PointerEvent<HTMLElement>, key: string) => {
|
|
1566
|
-
// Secondary buttons open menus; only a primary press starts a drag.
|
|
1567
|
-
if (e.button !== 0) return;
|
|
1568
|
-
e.preventDefault();
|
|
1569
|
-
e.stopPropagation();
|
|
1570
|
-
const th = headRefs.get(key);
|
|
1571
|
-
const startWidth = th?.getBoundingClientRect().width ?? 100;
|
|
1572
|
-
resizing.current = {
|
|
1573
|
-
key,
|
|
1574
|
-
pointerId: e.pointerId,
|
|
1575
|
-
startX: e.clientX,
|
|
1576
|
-
startWidth,
|
|
1577
|
-
sign: isRtl(e.currentTarget) ? -1 : 1,
|
|
1578
|
-
hadWidth: widths[key],
|
|
1579
|
-
cells: columnCells(key),
|
|
1580
|
-
width: startWidth,
|
|
1581
|
-
moved: false,
|
|
1582
|
-
};
|
|
1583
|
-
e.currentTarget.setPointerCapture?.(e.pointerId);
|
|
1584
|
-
document.body.style.userSelect = "none";
|
|
1585
|
-
document.body.style.cursor = "col-resize";
|
|
1586
|
-
};
|
|
1587
|
-
|
|
1588
|
-
const moveResize = (e: React.PointerEvent<HTMLElement>) => {
|
|
1589
|
-
const drag = resizing.current;
|
|
1590
|
-
if (!drag || drag.pointerId !== e.pointerId) return;
|
|
1591
|
-
drag.width = Math.max(40, Math.round(drag.startWidth + drag.sign * (e.clientX - drag.startX)));
|
|
1592
|
-
drag.moved = true;
|
|
1593
|
-
applyLiveWidth(drag.cells, drag.width);
|
|
1594
|
-
};
|
|
1595
|
-
|
|
1596
|
-
const finishResize = (e: React.PointerEvent<HTMLElement>, commit: boolean) => {
|
|
1597
|
-
const drag = resizing.current;
|
|
1598
|
-
// Before the early return: the page gets its selection and its cursor back even
|
|
1599
|
-
// for a pointer we were not tracking.
|
|
1600
|
-
releaseResizeChrome(e.currentTarget, e.pointerId);
|
|
1601
|
-
if (!drag || drag.pointerId !== e.pointerId) return;
|
|
1602
|
-
resizing.current = null;
|
|
1603
|
-
if (commit && drag.moved) {
|
|
1604
|
-
setWidths((w) => ({ ...w, [drag.key]: drag.width }));
|
|
1605
|
-
return;
|
|
1606
|
-
}
|
|
1607
|
-
// Cancelled — the browser took the pointer for a system gesture — or the press
|
|
1608
|
-
// never became a drag. Either way the column goes back to the width React last
|
|
1609
|
-
// rendered it at, which nothing else can do: the inline width the drag wrote is
|
|
1610
|
-
// invisible to React, so a re-render with an unchanged `widths` would keep it.
|
|
1611
|
-
applyLiveWidth(drag.cells, drag.hadWidth);
|
|
1612
|
-
};
|
|
1613
|
-
|
|
1614
|
-
// The last exit path. A table that unmounts mid-drag takes the handle, and with it
|
|
1615
|
-
// every handler above, out of the document — this is the only place left to hand the
|
|
1616
|
-
// page back its text selection and its cursor.
|
|
1617
|
-
useEffect(
|
|
1618
|
-
() => () => {
|
|
1619
|
-
if (!resizing.current) return;
|
|
1620
|
-
resizing.current = null;
|
|
1621
|
-
document.body.style.userSelect = "";
|
|
1622
|
-
document.body.style.cursor = "";
|
|
1623
|
-
},
|
|
1624
|
-
[],
|
|
1625
|
-
);
|
|
1626
|
-
|
|
1627
|
-
const autoSizeAll = () => {
|
|
1628
|
-
// Clear widths so the table reflows to natural sizes, then snapshot each
|
|
1629
|
-
// column's width and write it back — except for the last visible column,
|
|
1630
|
-
// which is left unconstrained so it absorbs any remaining horizontal space.
|
|
1631
|
-
setWidths({});
|
|
1632
|
-
requestAnimationFrame(() => {
|
|
1633
|
-
const next: Record<string, number> = {};
|
|
1634
|
-
const cols = columns.filter((c) => !hiddenCols.has(c.key));
|
|
1635
|
-
cols.forEach((col, idx) => {
|
|
1636
|
-
if (idx === cols.length - 1) return;
|
|
1637
|
-
const th = headRefs.get(col.key);
|
|
1638
|
-
if (th) next[col.key] = Math.ceil(th.getBoundingClientRect().width);
|
|
1639
|
-
});
|
|
1640
|
-
setWidths(next);
|
|
1641
|
-
});
|
|
1642
|
-
};
|
|
1085
|
+
// ---- Column resize ---- (data-table-resize.ts: pointer capture, one `setWidths` per
|
|
1086
|
+
// drag, and the page's cursor and selection handed back on an unmount mid-drag)
|
|
1087
|
+
const { startResize, moveResize, finishResize, autoSizeAll } = useColumnResize({
|
|
1088
|
+
headRefs,
|
|
1089
|
+
widths,
|
|
1090
|
+
setWidths,
|
|
1091
|
+
columns,
|
|
1092
|
+
hiddenCols,
|
|
1093
|
+
});
|
|
1643
1094
|
|
|
1644
1095
|
const visibleCount = visibleColumns.length;
|
|
1645
1096
|
const totalCount = columns.length;
|
|
@@ -1660,6 +1111,8 @@ export function DataTable<T>({
|
|
|
1660
1111
|
: undefined;
|
|
1661
1112
|
const footerValue = (col: DataTableColumn<T>) => col.footer?.(sorted, slice);
|
|
1662
1113
|
const footerHeadingId = useId();
|
|
1114
|
+
// Each open row's detail row, for its disclosure button's `aria-controls`.
|
|
1115
|
+
const detailIdBase = useId();
|
|
1663
1116
|
// The actions column is the table's own, not one the user can hide: out of the count.
|
|
1664
1117
|
const columnsCountLabel = rowActions
|
|
1665
1118
|
? labels.columnsCount(visibleCount - 1, totalCount - 1)
|
|
@@ -1734,12 +1187,13 @@ export function DataTable<T>({
|
|
|
1734
1187
|
unpaged,
|
|
1735
1188
|
defaultPageSize,
|
|
1736
1189
|
});
|
|
1737
|
-
//
|
|
1738
|
-
//
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1190
|
+
// ---- Shift+click range selection ---- (data-table-selection.ts; feedback #289,
|
|
1191
|
+
// anchored on the row's KEY so a sort, filter or page change cannot move it)
|
|
1192
|
+
const { selectionAnchor, rangeClick, canSelect, selectRange } = useRangeSelection({
|
|
1193
|
+
selection,
|
|
1194
|
+
slice,
|
|
1195
|
+
rowKey,
|
|
1196
|
+
});
|
|
1743
1197
|
// ---- Keyboard-activatable rows ----
|
|
1744
1198
|
//
|
|
1745
1199
|
// A desktop row with `onRowClick` opened on a mouse click and on nothing else: no
|
|
@@ -1767,28 +1221,6 @@ export function DataTable<T>({
|
|
|
1767
1221
|
: slice.length
|
|
1768
1222
|
? rowKey(slice[0])
|
|
1769
1223
|
: null;
|
|
1770
|
-
/** The checkbox click that drew a range, so its `onChange` can be told apart. */
|
|
1771
|
-
const rangeClick = useRef<Event | null>(null);
|
|
1772
|
-
const canSelect = (row: T) => !!selection && (selection.isSelectable?.(row) ?? true);
|
|
1773
|
-
const selectRange = (toIndex: number) => {
|
|
1774
|
-
if (!selection || selectionAnchor.current === null) return false;
|
|
1775
|
-
const fromIndex = slice.findIndex((r) => rowKey(r) === selectionAnchor.current);
|
|
1776
|
-
// The anchor has been filtered, sorted or paged off the screen: there is no range
|
|
1777
|
-
// on display to draw, so the click falls through to the plain single-row toggle.
|
|
1778
|
-
if (fromIndex < 0) return false;
|
|
1779
|
-
const [lo, hi] = [fromIndex, toIndex].sort((a, b) => a - b);
|
|
1780
|
-
const range: T[] = [];
|
|
1781
|
-
for (let i = lo; i <= hi; i++) {
|
|
1782
|
-
const r = slice[i];
|
|
1783
|
-
if (r && canSelect(r)) range.push(r);
|
|
1784
|
-
}
|
|
1785
|
-
// One call where the owner can take one. See `selection.onToggleMany`: the row-by-
|
|
1786
|
-
// row loop below is the fallback for an owner that has not adopted it, not the
|
|
1787
|
-
// shape this should be in.
|
|
1788
|
-
if (selection.onToggleMany) selection.onToggleMany(range, true);
|
|
1789
|
-
else for (const r of range) selection.onToggle(r, true);
|
|
1790
|
-
return true;
|
|
1791
|
-
};
|
|
1792
1224
|
|
|
1793
1225
|
// When dialog-mode is on, the expanded row's detail goes into a bottom-sheet
|
|
1794
1226
|
// modal instead of unfolding inline. Only one row is ever expanded at a time.
|
|
@@ -1804,205 +1236,30 @@ export function DataTable<T>({
|
|
|
1804
1236
|
if (mobileDialogRow) onRowClick?.(mobileDialogRow);
|
|
1805
1237
|
};
|
|
1806
1238
|
|
|
1807
|
-
// One mobile card.
|
|
1808
|
-
// share identical row markup.
|
|
1809
|
-
const renderMobileRow = (row: T) =>
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
"w-full text-start flex items-center",
|
|
1832
|
-
// §4: more room per row at Large — a taller row is a bigger tap target too.
|
|
1833
|
-
compact ? "px-3 py-2 gap-2 text-sm large:py-3" : "px-4 py-3 gap-3 large:py-4",
|
|
1834
|
-
// Live #320's other half: the card acknowledges the touch before the sheet
|
|
1835
|
-
// arrives. On a cold route the data can take a beat, and an unacknowledged tap
|
|
1836
|
-
// reads as "did that register?" — which is most of what "abrupt" means here.
|
|
1837
|
-
// `origin-center` + a 0.5% squeeze is deliberately almost subliminal: this fires
|
|
1838
|
-
// on every row of a long list, so anything larger becomes the list's personality
|
|
1839
|
-
// rather than feedback. `transition-transform` alone, so the existing background
|
|
1840
|
-
// flip stays instant.
|
|
1841
|
-
interactive &&
|
|
1842
|
-
"cursor-pointer transition-transform duration-100 active:scale-[0.995] active:bg-[var(--bg-active)] motion-reduce:transition-none motion-reduce:active:scale-100",
|
|
1843
|
-
// The keyboard's frame drawn INSIDE the card, as the desktop row's is (keksdose live
|
|
1844
|
-
// #394): the browser's own ring and tap highlight sit on the card's outer edge, and
|
|
1845
|
-
// three ancestors clip it — SwipeableRow's `overflow-hidden`, the card list, and
|
|
1846
|
-
// AppShell main's `overflow-x-clip` — so the frame went missing on one side. A press
|
|
1847
|
-
// keeps the fill and the squeeze above; an outline on every tap of a long list would
|
|
1848
|
-
// be louder than the acknowledgement it replaces.
|
|
1849
|
-
interactive && cn("[-webkit-tap-highlight-color:transparent] focus-visible:ring-inset", FOCUS_RING),
|
|
1850
|
-
);
|
|
1851
|
-
// The card's content is written once and worn by either tag below. Note that
|
|
1852
|
-
// the primary cell is rendered RAW here, never through `linkColumn` — the card
|
|
1853
|
-
// itself is the anchor, and routing it through `linkColumn` too would nest an
|
|
1854
|
-
// <a> inside an <a>. Desktop and mobile are mutually exclusive (`isMdUp`), so
|
|
1855
|
-
// exactly one anchor exists per row.
|
|
1856
|
-
const cardInner = (
|
|
1857
|
-
<>
|
|
1858
|
-
{/* The card's own content keeps the column it always had; the chevron sits
|
|
1859
|
-
beside it rather than inside, so a caller's `mobileCard` is untouched. */}
|
|
1860
|
-
<div
|
|
1861
|
-
className={cn(
|
|
1862
|
-
"flex min-w-0 flex-1 flex-col",
|
|
1863
|
-
compact ? "gap-1 large:gap-2" : "gap-2 large:gap-3",
|
|
1864
|
-
// §4 "nothing truncates": at Large a cell's own `truncate` wraps instead —
|
|
1865
|
-
// the reader who chose bigger type is the one an ellipsis fails. A caller's
|
|
1866
|
-
// `mobileCard` is its own layout and keeps what it chose.
|
|
1867
|
-
!mobileCard && CARD_NO_TRUNCATE,
|
|
1868
|
-
)}
|
|
1869
|
-
>
|
|
1870
|
-
{mobileCard ? (
|
|
1871
|
-
mobileCard(row)
|
|
1872
|
-
) : (
|
|
1873
|
-
<>
|
|
1874
|
-
{/* Only the `data-*` half of `cellProps` — see its note. */}
|
|
1875
|
-
{mobilePrimaryCol && (
|
|
1876
|
-
<div {...dataAttrsOf(mobilePrimaryCol.cellProps?.(row))} className="min-w-0 break-words font-medium">
|
|
1877
|
-
{mobilePrimaryCol.cell(row)}
|
|
1878
|
-
</div>
|
|
1879
|
-
)}
|
|
1880
|
-
{mobileSecondaryColumns.length > 0 && large ? (
|
|
1881
|
-
// §4: each label ABOVE its value at Large. Side by side, a label column
|
|
1882
|
-
// sized to the widest label leaves a value a sliver of a 240 px card.
|
|
1883
|
-
<StackedFields columns={mobileSecondaryColumns} row={row} compact={compact} />
|
|
1884
|
-
) : mobileSecondaryColumns.length > 0 && (
|
|
1885
|
-
<dl
|
|
1886
|
-
className={cn(
|
|
1887
|
-
"grid grid-cols-[auto_1fr] gap-x-3",
|
|
1888
|
-
compact ? "gap-y-0.5 text-xs" : "gap-y-1 text-sm",
|
|
1889
|
-
)}
|
|
1890
|
-
>
|
|
1891
|
-
{mobileSecondaryColumns.map((col) => (
|
|
1892
|
-
<Fragment key={col.key}>
|
|
1893
|
-
<dt className="text-xs uppercase tracking-wide text-[var(--text-muted)] self-center">
|
|
1894
|
-
{col.header}
|
|
1895
|
-
</dt>
|
|
1896
|
-
<dd
|
|
1897
|
-
{...dataAttrsOf(col.cellProps?.(row))}
|
|
1898
|
-
className="min-w-0 text-[var(--text-secondary)] self-center"
|
|
1899
|
-
>
|
|
1900
|
-
{col.cell(row)}
|
|
1901
|
-
</dd>
|
|
1902
|
-
</Fragment>
|
|
1903
|
-
))}
|
|
1904
|
-
</dl>
|
|
1905
|
-
)}
|
|
1906
|
-
</>
|
|
1907
|
-
)}
|
|
1908
|
-
</div>
|
|
1909
|
-
{opensDetail &&
|
|
1910
|
-
// `aria-hidden`: the row already announces itself as a button with
|
|
1911
|
-
// `aria-expanded`, so the icon would only add a second, wordless stop.
|
|
1912
|
-
(mobileExpandAsDialog ? (
|
|
1913
|
-
// Points INTO the sheet, which is the reading-forward direction.
|
|
1914
|
-
<ChevronRight
|
|
1915
|
-
aria-hidden
|
|
1916
|
-
className="size-4 shrink-0 text-[var(--text-placeholder)] rtl:-scale-x-100"
|
|
1917
|
-
/>
|
|
1918
|
-
) : (
|
|
1919
|
-
<ChevronDown
|
|
1920
|
-
aria-hidden
|
|
1921
|
-
className={cn(
|
|
1922
|
-
"size-4 shrink-0 text-[var(--text-placeholder)] transition-transform",
|
|
1923
|
-
expanded && "rotate-180",
|
|
1924
|
-
)}
|
|
1925
|
-
/>
|
|
1926
|
-
))}
|
|
1927
|
-
</>
|
|
1928
|
-
);
|
|
1929
|
-
const body =
|
|
1930
|
-
interactive && href ? (
|
|
1931
|
-
// A card with a URL of its own is a LINK, not a div wearing role="button"
|
|
1932
|
-
// (feedback #451): the phone's long-press "open in new tab" and a screen
|
|
1933
|
-
// reader's link semantics both come free, and the fake role goes away.
|
|
1934
|
-
<RowLink
|
|
1935
|
-
href={href}
|
|
1936
|
-
onActivate={() => onRowClick!(row)}
|
|
1937
|
-
aria-expanded={opensRow ? expanded : undefined}
|
|
1938
|
-
className={cardClass}
|
|
1939
|
-
// Enter already activates a link natively, and that routes through
|
|
1940
|
-
// RowLink's own onClick — handling it here too would open the row twice.
|
|
1941
|
-
// Space is the only key left, and only so it opens the row instead of
|
|
1942
|
-
// scrolling the list.
|
|
1943
|
-
onKeyDown={(e) => {
|
|
1944
|
-
if (e.key !== " ") return;
|
|
1945
|
-
e.preventDefault();
|
|
1946
|
-
onRowClick!(row);
|
|
1947
|
-
}}
|
|
1948
|
-
>
|
|
1949
|
-
{cardInner}
|
|
1950
|
-
</RowLink>
|
|
1951
|
-
) : (
|
|
1952
|
-
/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- the handlers are
|
|
1953
|
-
only attached when `interactive`, and then so are role="button", tabIndex 0 and the
|
|
1954
|
-
Enter/Space handler below; the rule cannot follow the conditional role. */
|
|
1955
|
-
<div
|
|
1956
|
-
role={interactive ? "button" : undefined}
|
|
1957
|
-
tabIndex={interactive ? 0 : undefined}
|
|
1958
|
-
onClick={
|
|
1959
|
-
interactive
|
|
1960
|
-
? (e) => {
|
|
1961
|
-
if (fromOutside(e.target, e.currentTarget)) return;
|
|
1962
|
-
onRowClick!(row);
|
|
1963
|
-
}
|
|
1964
|
-
: undefined
|
|
1965
|
-
}
|
|
1966
|
-
onKeyDown={
|
|
1967
|
-
interactive
|
|
1968
|
-
? (e) => {
|
|
1969
|
-
// A key press inside a nested control is that control's.
|
|
1970
|
-
if (e.target !== e.currentTarget) return;
|
|
1971
|
-
if (e.key === "Enter" || e.key === " ") {
|
|
1972
|
-
e.preventDefault();
|
|
1973
|
-
onRowClick!(row);
|
|
1974
|
-
}
|
|
1975
|
-
}
|
|
1976
|
-
: undefined
|
|
1977
|
-
}
|
|
1978
|
-
aria-expanded={opensRow ? expanded : undefined}
|
|
1979
|
-
className={cardClass}
|
|
1980
|
-
>
|
|
1981
|
-
{cardInner}
|
|
1982
|
-
</div>
|
|
1983
|
-
);
|
|
1984
|
-
return (
|
|
1985
|
-
<li key={rowKey(row)} className={cn(tint)} {...cleanAttrs(rowAttributes?.(row))}>
|
|
1986
|
-
{swipeEnabled ? (
|
|
1987
|
-
<SwipeableRow enabled left={swipe!.left} right={swipe!.right}>
|
|
1988
|
-
{body}
|
|
1989
|
-
</SwipeableRow>
|
|
1990
|
-
) : (
|
|
1991
|
-
body
|
|
1992
|
-
)}
|
|
1993
|
-
{expansion && !mobileExpandAsDialog && (
|
|
1994
|
-
<div
|
|
1995
|
-
className={cn(
|
|
1996
|
-
"bg-[var(--bg-surface-2)] border-t border-[var(--border)]",
|
|
1997
|
-
compact ? "px-3 py-2" : "px-4 py-3",
|
|
1998
|
-
)}
|
|
1999
|
-
>
|
|
2000
|
-
{expansion}
|
|
2001
|
-
</div>
|
|
2002
|
-
)}
|
|
2003
|
-
</li>
|
|
2004
|
-
);
|
|
2005
|
-
};
|
|
1239
|
+
// One mobile card (`MobileRow`, data-table-mobile.tsx). A function so the flat list
|
|
1240
|
+
// and the grouped list (below) share identical row markup.
|
|
1241
|
+
const renderMobileRow = (row: T) => (
|
|
1242
|
+
<MobileRow
|
|
1243
|
+
key={rowKey(row)}
|
|
1244
|
+
row={row}
|
|
1245
|
+
isExpanded={isExpanded}
|
|
1246
|
+
openedRowContent={openedRowContent}
|
|
1247
|
+
opensRow={opensRow}
|
|
1248
|
+
rowClassName={rowClassName}
|
|
1249
|
+
rowAttributes={rowAttributes}
|
|
1250
|
+
onRowClick={onRowClick}
|
|
1251
|
+
rowHref={rowHref}
|
|
1252
|
+
swipeActionsFor={swipeActionsFor}
|
|
1253
|
+
mobileDir={mobileDir}
|
|
1254
|
+
mobileCardLinkable={mobileCardLinkable}
|
|
1255
|
+
mobileCard={mobileCard}
|
|
1256
|
+
mobilePrimaryCol={mobilePrimaryCol}
|
|
1257
|
+
mobileSecondaryColumns={mobileSecondaryColumns}
|
|
1258
|
+
mobileExpandAsDialog={mobileExpandAsDialog}
|
|
1259
|
+
compact={compact}
|
|
1260
|
+
large={large}
|
|
1261
|
+
/>
|
|
1262
|
+
);
|
|
2006
1263
|
|
|
2007
1264
|
// Consecutive grouping of the (already-sorted) mobile slice into labelled
|
|
2008
1265
|
// sections for the "assistance"-style list (feedback #317). Null unless the
|
|
@@ -2054,7 +1311,7 @@ export function DataTable<T>({
|
|
|
2054
1311
|
className={cn(
|
|
2055
1312
|
"flex flex-wrap items-center gap-2",
|
|
2056
1313
|
frame
|
|
2057
|
-
? cn("border-b border-
|
|
1314
|
+
? cn("border-b border-subtle", compact ? "px-2 py-1.5" : "px-3 py-2")
|
|
2058
1315
|
: "pb-3",
|
|
2059
1316
|
)}
|
|
2060
1317
|
>
|
|
@@ -2108,7 +1365,7 @@ export function DataTable<T>({
|
|
|
2108
1365
|
)}
|
|
2109
1366
|
<ul
|
|
2110
1367
|
className={cn(
|
|
2111
|
-
"divide-y divide-
|
|
1368
|
+
"divide-y divide-subtle",
|
|
2112
1369
|
// Under `fillHeight` the list is the scroller, as the table body is on a
|
|
2113
1370
|
// wide screen: the filter button stays above it and a server pager below.
|
|
2114
1371
|
// The endless-scroll sentinel still fires in here — an
|
|
@@ -2122,7 +1379,7 @@ export function DataTable<T>({
|
|
|
2122
1379
|
{mobileGroups
|
|
2123
1380
|
? mobileGroups.map((g) => (
|
|
2124
1381
|
<Fragment key={`hb-group:${g.key}`}>
|
|
2125
|
-
<li className="sticky top-0 z-10 bg-
|
|
1382
|
+
<li className="sticky top-0 z-10 bg-surface-2 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-muted backdrop-blur">
|
|
2126
1383
|
{mobileGroupLabel ? mobileGroupLabel(g.key) : g.key}
|
|
2127
1384
|
</li>
|
|
2128
1385
|
{g.rows.map(renderMobileRow)}
|
|
@@ -2132,7 +1389,7 @@ export function DataTable<T>({
|
|
|
2132
1389
|
{mobileSlice.length === 0 && (
|
|
2133
1390
|
<li
|
|
2134
1391
|
className={cn(
|
|
2135
|
-
"text-center text-
|
|
1392
|
+
"text-center text-muted",
|
|
2136
1393
|
compact ? "px-3 py-3 text-xs" : "px-4 py-6 text-sm",
|
|
2137
1394
|
)}
|
|
2138
1395
|
>
|
|
@@ -2144,7 +1401,7 @@ export function DataTable<T>({
|
|
|
2144
1401
|
{canRevealMoreMobile && (
|
|
2145
1402
|
<li
|
|
2146
1403
|
ref={loadMoreRef}
|
|
2147
|
-
className="px-4 py-4 text-center text-xs text-
|
|
1404
|
+
className="px-4 py-4 text-center text-xs text-placeholder"
|
|
2148
1405
|
>
|
|
2149
1406
|
{/* Isolated for the reason spelled out on LoadingText. */}
|
|
2150
1407
|
<bdi>{labels.loading}</bdi>
|
|
@@ -2163,7 +1420,7 @@ export function DataTable<T>({
|
|
|
2163
1420
|
data-table-footer=""
|
|
2164
1421
|
aria-labelledby={footerLabel != null ? footerHeadingId : undefined}
|
|
2165
1422
|
className={cn(
|
|
2166
|
-
"border-t-2 border-
|
|
1423
|
+
"border-t-2 border-strong bg-surface-2",
|
|
2167
1424
|
compact ? "px-3 py-2" : "px-4 py-3",
|
|
2168
1425
|
isLoading && "opacity-60 transition-opacity",
|
|
2169
1426
|
)}
|
|
@@ -2183,10 +1440,10 @@ export function DataTable<T>({
|
|
|
2183
1440
|
.filter((c) => c.footer)
|
|
2184
1441
|
.map((col) => (
|
|
2185
1442
|
<Fragment key={col.key}>
|
|
2186
|
-
<dt className="self-center text-xs uppercase tracking-wide text-
|
|
1443
|
+
<dt className="self-center text-xs uppercase tracking-wide text-muted">
|
|
2187
1444
|
{col.header}
|
|
2188
1445
|
</dt>
|
|
2189
|
-
<dd className="min-w-0 self-center font-semibold text-
|
|
1446
|
+
<dd className="min-w-0 self-center font-semibold text-primary">
|
|
2190
1447
|
{footerValue(col)}
|
|
2191
1448
|
</dd>
|
|
2192
1449
|
</Fragment>
|
|
@@ -2263,189 +1520,36 @@ export function DataTable<T>({
|
|
|
2263
1520
|
only sideways and lets the header ride away on page scroll). The
|
|
2264
1521
|
header then stays put as you scroll the rows. position:sticky on
|
|
2265
1522
|
<thead> isn't reliable across browsers, so we put it on each <th>
|
|
2266
|
-
(see
|
|
2267
|
-
<
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
// takes them over and feeds them back into the server query.
|
|
2292
|
-
const sortable = (!isServer || !!onSortsChange) && !!col.sortBy;
|
|
2293
|
-
const filter = !isServer || onFiltersChange ? resolveFilter(col) : null;
|
|
2294
|
-
const filterState = filters[col.key] ?? (filter ? defaultFilterState(filter) : undefined);
|
|
2295
|
-
const sortIdx = sorts.findIndex((s) => s.key === col.key);
|
|
2296
|
-
const active = sortIdx !== -1;
|
|
2297
|
-
const Icon = active ? (sorts[sortIdx].dir === "asc" ? ArrowUp : ArrowDown) : ArrowUpDown;
|
|
2298
|
-
const filterActive = filterState && isFilterActive(filterState);
|
|
2299
|
-
// Logical, and a legacy `text-right` still counts — see `logicalAlign`.
|
|
2300
|
-
const headClass = logicalAlign(col.headClassName);
|
|
2301
|
-
const isEndAligned = !!headClass && END_ALIGN.test(headClass);
|
|
2302
|
-
const width = widths[col.key];
|
|
2303
|
-
const ownHead = splitCellProps(col.headProps);
|
|
2304
|
-
const pinnedHead = width ? { width, minWidth: width, maxWidth: width } : undefined;
|
|
2305
|
-
return (
|
|
2306
|
-
<th
|
|
2307
|
-
{...ownHead.attrs}
|
|
2308
|
-
key={col.key}
|
|
2309
|
-
ref={(el) => {
|
|
2310
|
-
if (el) headRefs.set(col.key, el);
|
|
2311
|
-
else headRefs.delete(col.key);
|
|
2312
|
-
}}
|
|
2313
|
-
scope="col"
|
|
2314
|
-
// Only a header the user can actually sort says anything: an
|
|
2315
|
-
// `aria-sort` on a plain column is a control that is not there,
|
|
2316
|
-
// and a persisted or URL sort can name a column with no `sortBy`
|
|
2317
|
-
// (the sort chain drops it silently) — which would otherwise
|
|
2318
|
-
// claim a sort the table is not applying.
|
|
2319
|
-
//
|
|
2320
|
-
// "none" on the rest is the half that was missing. Without it a
|
|
2321
|
-
// sortable header is indistinguishable from a plain one until the
|
|
2322
|
-
// user presses it. Secondary criteria read "none" too: ARIA allows
|
|
2323
|
-
// exactly one sorted column, and the priority is carried by the
|
|
2324
|
-
// badge and by what the header button announces on press.
|
|
2325
|
-
aria-sort={
|
|
2326
|
-
sortable
|
|
2327
|
-
? sortIdx === 0
|
|
2328
|
-
? sorts[0].dir === "asc"
|
|
2329
|
-
? "ascending"
|
|
2330
|
-
: "descending"
|
|
2331
|
-
: "none"
|
|
2332
|
-
: undefined
|
|
2333
|
-
}
|
|
2334
|
-
style={ownHead.style || pinnedHead ? { ...ownHead.style, ...pinnedHead } : undefined}
|
|
2335
|
-
className={cn(
|
|
2336
|
-
"relative font-medium align-middle whitespace-nowrap",
|
|
2337
|
-
compact ? "px-2 py-1" : "px-3 py-2",
|
|
2338
|
-
// Keep the header visible while the user scrolls the page.
|
|
2339
|
-
// Each <th> carries its own bg so the row doesn't render
|
|
2340
|
-
// transparent over the data rows underneath.
|
|
2341
|
-
"sticky top-0 z-10 bg-[var(--bg-surface-2)] backdrop-blur-sm",
|
|
2342
|
-
logicalAlign(ownHead.className),
|
|
2343
|
-
headClass,
|
|
2344
|
-
)}
|
|
2345
|
-
>
|
|
2346
|
-
<div
|
|
2347
|
-
className={cn(
|
|
2348
|
-
"flex items-center gap-1",
|
|
2349
|
-
isEndAligned && "flex-row-reverse",
|
|
2350
|
-
)}
|
|
2351
|
-
>
|
|
2352
|
-
<Tooltip label={sortable && multiSort ? labels.sortHint : undefined} portal>
|
|
2353
|
-
<button
|
|
2354
|
-
type="button"
|
|
2355
|
-
onClick={(e) => sortable && toggleSort(col.key, e.shiftKey)}
|
|
2356
|
-
disabled={!sortable}
|
|
2357
|
-
className={cn(
|
|
2358
|
-
"flex items-center gap-1 text-start",
|
|
2359
|
-
sortable && "hover:text-[var(--text-primary)]",
|
|
2360
|
-
)}
|
|
2361
|
-
>
|
|
2362
|
-
<span>{col.header}</span>
|
|
2363
|
-
{sortable && (
|
|
2364
|
-
<Icon className={cn("size-3", active ? "opacity-100" : "opacity-40")} />
|
|
2365
|
-
)}
|
|
2366
|
-
{/* Priority badge, only meaningful with 2+ sort keys */}
|
|
2367
|
-
{active && sorts.length > 1 && (
|
|
2368
|
-
<span className="text-micro font-semibold leading-none text-brand">
|
|
2369
|
-
{sortIdx + 1}
|
|
2370
|
-
</span>
|
|
2371
|
-
)}
|
|
2372
|
-
</button>
|
|
2373
|
-
</Tooltip>
|
|
2374
|
-
{filter && (
|
|
2375
|
-
<Popover
|
|
2376
|
-
// 420 px at Normal, in rem so the calendar grows with its
|
|
2377
|
-
// text (§3.2); Popover caps it at the viewport.
|
|
2378
|
-
width={filter.type === "date" ? "26.25rem" : undefined}
|
|
2379
|
-
// The panel is the column's filter, and says so. Unnamed it
|
|
2380
|
-
// was announced as the kit-wide fallback, "Popover".
|
|
2381
|
-
labels={{ panel: labels.filter }}
|
|
2382
|
-
trigger={({ toggle, ref }) => (
|
|
2383
|
-
<button
|
|
2384
|
-
type="button"
|
|
2385
|
-
ref={ref}
|
|
2386
|
-
onClick={toggle}
|
|
2387
|
-
aria-label={labels.filter}
|
|
2388
|
-
className={cn(
|
|
2389
|
-
"rounded p-1 transition-colors",
|
|
2390
|
-
filterActive
|
|
2391
|
-
? "bg-[var(--brand-bg)] text-[var(--brand-muted)]"
|
|
2392
|
-
: "text-[var(--text-placeholder)] hover:text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]",
|
|
2393
|
-
)}
|
|
2394
|
-
>
|
|
2395
|
-
<Filter className="size-3" />
|
|
2396
|
-
</button>
|
|
2397
|
-
)}
|
|
2398
|
-
>
|
|
2399
|
-
{() => (
|
|
2400
|
-
<FilterPopover
|
|
2401
|
-
column={col}
|
|
2402
|
-
state={filterState ?? defaultFilterState(filter)}
|
|
2403
|
-
onChange={(next) => setFilterValue(col.key, next)}
|
|
2404
|
-
onClear={() => clearFilter(col.key)}
|
|
2405
|
-
selectOptions={selectOptionsByKey[col.key] ?? []}
|
|
2406
|
-
labels={labels}
|
|
2407
|
-
locale={locale}
|
|
2408
|
-
/>
|
|
2409
|
-
)}
|
|
2410
|
-
</Popover>
|
|
2411
|
-
)}
|
|
2412
|
-
</div>
|
|
2413
|
-
{resizable && col.key !== ROW_ACTIONS_KEY && (
|
|
2414
|
-
/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- a
|
|
2415
|
-
pointer-only drag handle for a visual preference (column width); it is
|
|
2416
|
-
deliberately not a tab stop, and no content or action depends on it. */
|
|
2417
|
-
<span
|
|
2418
|
-
role="separator"
|
|
2419
|
-
aria-orientation="vertical"
|
|
2420
|
-
onPointerDown={(e) => startResize(e, col.key)}
|
|
2421
|
-
onPointerMove={moveResize}
|
|
2422
|
-
onPointerUp={(e) => finishResize(e, true)}
|
|
2423
|
-
onPointerCancel={(e) => finishResize(e, false)}
|
|
2424
|
-
onDoubleClick={(e) => {
|
|
2425
|
-
e.preventDefault();
|
|
2426
|
-
setWidths((w) => {
|
|
2427
|
-
const next = { ...w };
|
|
2428
|
-
delete next[col.key];
|
|
2429
|
-
return next;
|
|
2430
|
-
});
|
|
2431
|
-
}}
|
|
2432
|
-
// `touch-none`: without it the browser claims a finger drag for
|
|
2433
|
-
// scrolling before the first `pointermove` ever arrives.
|
|
2434
|
-
// `end-0` and a translate that flips with it: the handle sits on the column's
|
|
2435
|
-
// trailing edge, which is its left one in a right-to-left table.
|
|
2436
|
-
className="absolute end-0 top-0 z-10 h-full w-1.5 -translate-x-1/2 rtl:translate-x-1/2 cursor-col-resize select-none touch-none hover:bg-[var(--brand-bg-hover)]"
|
|
2437
|
-
/>
|
|
2438
|
-
)}
|
|
2439
|
-
</th>
|
|
2440
|
-
);
|
|
2441
|
-
})}
|
|
2442
|
-
</tr>
|
|
2443
|
-
</thead>
|
|
1523
|
+
(see DataTableHead, data-table-head.tsx). */}
|
|
1524
|
+
<DataTableHead
|
|
1525
|
+
visibleColumns={visibleColumns}
|
|
1526
|
+
selection={selection}
|
|
1527
|
+
compact={compact}
|
|
1528
|
+
labels={labels}
|
|
1529
|
+
locale={locale}
|
|
1530
|
+
isServer={isServer}
|
|
1531
|
+
hasSortCallback={!!onSortsChange}
|
|
1532
|
+
hasFilterCallback={!!onFiltersChange}
|
|
1533
|
+
sorts={sorts}
|
|
1534
|
+
filters={filters}
|
|
1535
|
+
selectOptionsByKey={selectOptionsByKey}
|
|
1536
|
+
multiSort={multiSort}
|
|
1537
|
+
resizable={resizable}
|
|
1538
|
+
widths={widths}
|
|
1539
|
+
setWidths={setWidths}
|
|
1540
|
+
headRefs={headRefs}
|
|
1541
|
+
toggleSort={toggleSort}
|
|
1542
|
+
setFilterValue={setFilterValue}
|
|
1543
|
+
clearFilter={clearFilter}
|
|
1544
|
+
startResize={startResize}
|
|
1545
|
+
moveResize={moveResize}
|
|
1546
|
+
finishResize={finishResize}
|
|
1547
|
+
/>
|
|
2444
1548
|
<tbody
|
|
2445
1549
|
className={cn(isLoading && slice.length > 0 && "opacity-60 transition-opacity")}
|
|
2446
1550
|
>
|
|
2447
1551
|
{leadingRow && (
|
|
2448
|
-
<tr className="border-t border-
|
|
1552
|
+
<tr className="border-t border-subtle">
|
|
2449
1553
|
<td colSpan={totalColSpan} className="p-0">
|
|
2450
1554
|
{leadingRow}
|
|
2451
1555
|
</td>
|
|
@@ -2457,13 +1561,34 @@ export function DataTable<T>({
|
|
|
2457
1561
|
const rowInteractive = !!onRowClick || !!selection;
|
|
2458
1562
|
const href = rowHref?.(row);
|
|
2459
1563
|
const key = rowKey(row);
|
|
1564
|
+
const detailId = `${detailIdBase}-${rowIndex}`;
|
|
1565
|
+
// Whether the row is open, said where ARIA allows it (round 0.34, the
|
|
1566
|
+
// showcase's axe check): `aria-expanded` belongs to a treegrid's row, not a
|
|
1567
|
+
// table's, and the <tr> wore it. A disclosure button in the first cell carries
|
|
1568
|
+
// it now, with `aria-controls` on the detail row while that is there.
|
|
1569
|
+
// Visually hidden and not a tab stop: the row stays the one roving stop, with
|
|
1570
|
+
// Enter/Space and the whole-row click — this is the screen reader cursor's
|
|
1571
|
+
// way in, and where it hears the state. Named by `aria-label`, so the cell's
|
|
1572
|
+
// text stays the cell's own.
|
|
1573
|
+
const disclosure =
|
|
1574
|
+
rowsFocusable && expandedRow ? (
|
|
1575
|
+
<button
|
|
1576
|
+
type="button"
|
|
1577
|
+
tabIndex={-1}
|
|
1578
|
+
className="sr-only-fixed"
|
|
1579
|
+
aria-label={labels.rowDetails}
|
|
1580
|
+
aria-expanded={expanded}
|
|
1581
|
+
aria-controls={expansion ? detailId : undefined}
|
|
1582
|
+
// The row's own handler leaves a click on a control inside it alone.
|
|
1583
|
+
onClick={() => onRowClick!(row)}
|
|
1584
|
+
/>
|
|
1585
|
+
) : null;
|
|
2460
1586
|
return (
|
|
2461
1587
|
<Fragment key={key}>
|
|
2462
1588
|
<tr
|
|
2463
1589
|
{...cleanAttrs(rowAttributes?.(row))}
|
|
2464
1590
|
data-row-nav={rowsFocusable ? "" : undefined}
|
|
2465
1591
|
tabIndex={rowsFocusable ? (key === tabRowKey ? 0 : -1) : undefined}
|
|
2466
|
-
aria-expanded={rowsFocusable && expandedRow ? expanded : undefined}
|
|
2467
1592
|
onFocus={
|
|
2468
1593
|
rowsFocusable
|
|
2469
1594
|
? (e) => {
|
|
@@ -2491,13 +1616,13 @@ export function DataTable<T>({
|
|
|
2491
1616
|
: undefined
|
|
2492
1617
|
}
|
|
2493
1618
|
className={cn(
|
|
2494
|
-
"border-t border-
|
|
2495
|
-
rowInteractive && "cursor-pointer hover:bg-
|
|
1619
|
+
"border-t border-subtle",
|
|
1620
|
+
rowInteractive && "cursor-pointer hover:bg-hover",
|
|
2496
1621
|
// The kit's focus frame width (§5, `--focus-ring-width`), drawn as an
|
|
2497
1622
|
// OUTLINE rather than FOCUS_RING's box-shadow: a shadow on a `<tr>`
|
|
2498
1623
|
// is not painted by every engine, an outline is.
|
|
2499
1624
|
rowsFocusable &&
|
|
2500
|
-
"focus-visible:bg-
|
|
1625
|
+
"focus-visible:bg-hover focus-visible:outline-focus focus-visible:-outline-offset-2 focus-visible:outline-brand",
|
|
2501
1626
|
rowClassName?.(row),
|
|
2502
1627
|
)}
|
|
2503
1628
|
onClick={
|
|
@@ -2580,7 +1705,7 @@ export function DataTable<T>({
|
|
|
2580
1705
|
)}
|
|
2581
1706
|
</td>
|
|
2582
1707
|
)}
|
|
2583
|
-
{visibleColumns.map((col) => {
|
|
1708
|
+
{visibleColumns.map((col, colIndex) => {
|
|
2584
1709
|
const width = widths[col.key];
|
|
2585
1710
|
// The caller's first, the table's over it — see `cellProps`.
|
|
2586
1711
|
const own = splitCellProps(col.cellProps?.(row));
|
|
@@ -2599,6 +1724,7 @@ export function DataTable<T>({
|
|
|
2599
1724
|
logicalAlign(col.className),
|
|
2600
1725
|
)}
|
|
2601
1726
|
>
|
|
1727
|
+
{colIndex === 0 && disclosure}
|
|
2602
1728
|
{col === linkColumn && href ? (
|
|
2603
1729
|
// No `onActivate`: the click is left to bubble to the
|
|
2604
1730
|
// <tr> handler above, which already owns expand-vs-select.
|
|
@@ -2614,7 +1740,7 @@ export function DataTable<T>({
|
|
|
2614
1740
|
})}
|
|
2615
1741
|
</tr>
|
|
2616
1742
|
{expansion && (
|
|
2617
|
-
<tr className="bg-
|
|
1743
|
+
<tr id={disclosure ? detailId : undefined} className="bg-surface-2 border-t border-subtle">
|
|
2618
1744
|
{/* The detail panel spans every column. In an `auto` table
|
|
2619
1745
|
layout (the default here — columns only get fixed style
|
|
2620
1746
|
widths once the user resizes/auto-sizes them) the cell's
|
|
@@ -2640,7 +1766,7 @@ export function DataTable<T>({
|
|
|
2640
1766
|
<tr>
|
|
2641
1767
|
<td
|
|
2642
1768
|
colSpan={totalColSpan}
|
|
2643
|
-
className={cn("text-center text-
|
|
1769
|
+
className={cn("text-center text-muted", compact ? "px-2 py-2" : "px-3 py-4")}
|
|
2644
1770
|
>
|
|
2645
1771
|
{/* Nothing is not the same as not-yet: "no results" while the first
|
|
2646
1772
|
page is still in flight is a claim the table cannot make. */}
|
|
@@ -2658,7 +1784,7 @@ export function DataTable<T>({
|
|
|
2658
1784
|
<tfoot
|
|
2659
1785
|
data-table-footer=""
|
|
2660
1786
|
className={cn(
|
|
2661
|
-
"font-semibold text-
|
|
1787
|
+
"font-semibold text-primary",
|
|
2662
1788
|
isLoading && "opacity-60 transition-opacity",
|
|
2663
1789
|
)}
|
|
2664
1790
|
>
|
|
@@ -2726,89 +1852,16 @@ export function DataTable<T>({
|
|
|
2726
1852
|
)}
|
|
2727
1853
|
</div>
|
|
2728
1854
|
{columnSettings && (
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
"border-s border-[var(--border)]",
|
|
2740
|
-
"hover:bg-[var(--bg-hover)]",
|
|
2741
|
-
showSettings ? "w-0 border-s-0" : "w-8 cursor-pointer",
|
|
2742
|
-
)}
|
|
2743
|
-
>
|
|
2744
|
-
<span
|
|
2745
|
-
className="whitespace-nowrap text-xs font-medium tracking-wide text-[var(--text-muted)] group-hover:text-[var(--text-secondary)]"
|
|
2746
|
-
style={{ writingMode: "vertical-rl", transform: "rotate(180deg)" }}
|
|
2747
|
-
>
|
|
2748
|
-
{columnsCountLabel}
|
|
2749
|
-
</span>
|
|
2750
|
-
</button>
|
|
2751
|
-
</Tooltip>
|
|
2752
|
-
<div
|
|
2753
|
-
className={cn(
|
|
2754
|
-
"shrink-0 overflow-hidden transition-[width] duration-200 ease-out",
|
|
2755
|
-
showSettings ? "w-56" : "w-0",
|
|
2756
|
-
)}
|
|
2757
|
-
>
|
|
2758
|
-
<div className="flex w-56 flex-col border-s border-[var(--border)] p-2">
|
|
2759
|
-
<div className="mb-2 flex items-center justify-between gap-1">
|
|
2760
|
-
<div className="text-xs font-medium uppercase tracking-wide text-[var(--text-muted)]">
|
|
2761
|
-
{columnsCountLabel}
|
|
2762
|
-
</div>
|
|
2763
|
-
<Tooltip label={labels.close} portal>
|
|
2764
|
-
<button
|
|
2765
|
-
type="button"
|
|
2766
|
-
onClick={() => setShowSettings(false)}
|
|
2767
|
-
aria-label={labels.close}
|
|
2768
|
-
className="rounded p-0.5 text-[var(--text-placeholder)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]"
|
|
2769
|
-
>
|
|
2770
|
-
<X className="size-4" />
|
|
2771
|
-
</button>
|
|
2772
|
-
</Tooltip>
|
|
2773
|
-
</div>
|
|
2774
|
-
<button
|
|
2775
|
-
type="button"
|
|
2776
|
-
onClick={autoSizeAll}
|
|
2777
|
-
className="mb-2 rounded border border-[var(--border)] px-2 py-1 text-xs font-medium text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"
|
|
2778
|
-
>
|
|
2779
|
-
{labels.autoSize}
|
|
2780
|
-
</button>
|
|
2781
|
-
<div className="flex flex-col gap-0.5">
|
|
2782
|
-
{columns.map((col) => {
|
|
2783
|
-
if (col.key === ROW_ACTIONS_KEY) return null;
|
|
2784
|
-
const checked = !hiddenCols.has(col.key);
|
|
2785
|
-
const headerLabel = columnLabel(col);
|
|
2786
|
-
return (
|
|
2787
|
-
<label
|
|
2788
|
-
key={col.key}
|
|
2789
|
-
className="inline-flex cursor-pointer items-center gap-1.5 rounded px-1 py-0.5 text-xs hover:bg-[var(--bg-hover)]"
|
|
2790
|
-
>
|
|
2791
|
-
<input
|
|
2792
|
-
type="checkbox"
|
|
2793
|
-
className="size-3.5"
|
|
2794
|
-
checked={checked}
|
|
2795
|
-
onChange={(e) => {
|
|
2796
|
-
setHiddenCols((s) => {
|
|
2797
|
-
const next = new Set(s);
|
|
2798
|
-
if (e.target.checked) next.delete(col.key);
|
|
2799
|
-
else next.add(col.key);
|
|
2800
|
-
return next;
|
|
2801
|
-
});
|
|
2802
|
-
}}
|
|
2803
|
-
/>
|
|
2804
|
-
<span className="truncate">{headerLabel}</span>
|
|
2805
|
-
</label>
|
|
2806
|
-
);
|
|
2807
|
-
})}
|
|
2808
|
-
</div>
|
|
2809
|
-
</div>
|
|
2810
|
-
</div>
|
|
2811
|
-
</>
|
|
1855
|
+
<ColumnSettingsPanel
|
|
1856
|
+
columns={columns}
|
|
1857
|
+
hiddenCols={hiddenCols}
|
|
1858
|
+
setHiddenCols={setHiddenCols}
|
|
1859
|
+
showSettings={showSettings}
|
|
1860
|
+
setShowSettings={setShowSettings}
|
|
1861
|
+
columnsCountLabel={columnsCountLabel}
|
|
1862
|
+
labels={labels}
|
|
1863
|
+
autoSizeAll={autoSizeAll}
|
|
1864
|
+
/>
|
|
2812
1865
|
)}
|
|
2813
1866
|
</div>
|
|
2814
1867
|
)}
|
|
@@ -2844,178 +1897,3 @@ function LoadingText({ label }: { label: string }) {
|
|
|
2844
1897
|
</span>
|
|
2845
1898
|
);
|
|
2846
1899
|
}
|
|
2847
|
-
|
|
2848
|
-
// ---------- Mobile filter sheet ----------
|
|
2849
|
-
|
|
2850
|
-
/**
|
|
2851
|
-
* Filter access for the mobile card list (feedback #299). The desktop table
|
|
2852
|
-
* houses per-column filters in its header; the card list has no header, so the
|
|
2853
|
-
* same filters were unreachable on phones. This renders a compact "Filters" bar
|
|
2854
|
-
* that opens a bottom sheet listing each filterable column as a collapsible
|
|
2855
|
-
* section, reusing the very same {@link FilterPopover} and filter state the
|
|
2856
|
-
* desktop table drives — so it filters identically and stays URL-synced.
|
|
2857
|
-
*/
|
|
2858
|
-
function MobileFilters<T>({
|
|
2859
|
-
columns,
|
|
2860
|
-
filters,
|
|
2861
|
-
selectOptionsByKey,
|
|
2862
|
-
isServer,
|
|
2863
|
-
hasFilterCallback,
|
|
2864
|
-
onSetFilter,
|
|
2865
|
-
onClearFilter,
|
|
2866
|
-
onClearAll,
|
|
2867
|
-
labels,
|
|
2868
|
-
locale,
|
|
2869
|
-
}: {
|
|
2870
|
-
columns: DataTableColumn<T>[];
|
|
2871
|
-
filters: FilterState;
|
|
2872
|
-
selectOptionsByKey: Record<string, { value: string; label: string }[]>;
|
|
2873
|
-
isServer: boolean;
|
|
2874
|
-
hasFilterCallback: boolean;
|
|
2875
|
-
onSetFilter: (key: string, value: FilterValue) => void;
|
|
2876
|
-
onClearFilter: (key: string) => void;
|
|
2877
|
-
onClearAll: () => void;
|
|
2878
|
-
labels: DataTableLabels;
|
|
2879
|
-
locale?: string;
|
|
2880
|
-
}) {
|
|
2881
|
-
const [open, setOpen] = useState(false);
|
|
2882
|
-
// The sheet is portalled to <body>, out from under whatever `dir` the table sits
|
|
2883
|
-
// in, so it carries the trigger's direction with it — read at the moment of opening,
|
|
2884
|
-
// from the element the user actually pressed.
|
|
2885
|
-
const [dir, setDir] = useState<Direction>("ltr");
|
|
2886
|
-
const [expanded, setExpanded] = useState<string | null>(null);
|
|
2887
|
-
const backdropClose = useBackdropClose(() => setOpen(false));
|
|
2888
|
-
useBodyScrollLock(open);
|
|
2889
|
-
// Back dismisses the filter sheet too (Keksdose feedback #172) — it is the same
|
|
2890
|
-
// full-screen surface, and the filters it sets are already in the URL, so closing
|
|
2891
|
-
// it never loses anything.
|
|
2892
|
-
useOverlayHistory(open, () => setOpen(false));
|
|
2893
|
-
|
|
2894
|
-
const filterable = useMemo(
|
|
2895
|
-
() =>
|
|
2896
|
-
columns
|
|
2897
|
-
.map((col) => ({ col, filter: !isServer || hasFilterCallback ? resolveFilter(col) : null }))
|
|
2898
|
-
.filter((x): x is { col: DataTableColumn<T>; filter: ColumnFilter<T> } => !!x.filter),
|
|
2899
|
-
[columns, isServer, hasFilterCallback],
|
|
2900
|
-
);
|
|
2901
|
-
|
|
2902
|
-
if (filterable.length === 0) return null;
|
|
2903
|
-
|
|
2904
|
-
const activeCount = filterable.filter(({ col }) => {
|
|
2905
|
-
const s = filters[col.key];
|
|
2906
|
-
return s && isFilterActive(s);
|
|
2907
|
-
}).length;
|
|
2908
|
-
|
|
2909
|
-
return (
|
|
2910
|
-
<div className="flex items-center justify-between gap-2 border-b border-[var(--border)] px-4 py-2">
|
|
2911
|
-
<button
|
|
2912
|
-
type="button"
|
|
2913
|
-
onClick={(e) => {
|
|
2914
|
-
setDir(dirOf(e.currentTarget));
|
|
2915
|
-
setOpen(true);
|
|
2916
|
-
}}
|
|
2917
|
-
className="inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"
|
|
2918
|
-
>
|
|
2919
|
-
<Filter className="size-4" />
|
|
2920
|
-
<span>{labels.filters}</span>
|
|
2921
|
-
{activeCount > 0 && (
|
|
2922
|
-
<span className="inline-flex min-w-4 items-center justify-center rounded-full bg-[var(--info-bg)] px-1 text-caption font-semibold text-[var(--info)]">
|
|
2923
|
-
{activeCount}
|
|
2924
|
-
</span>
|
|
2925
|
-
)}
|
|
2926
|
-
</button>
|
|
2927
|
-
{activeCount > 0 && (
|
|
2928
|
-
<button
|
|
2929
|
-
type="button"
|
|
2930
|
-
onClick={onClearAll}
|
|
2931
|
-
className="text-xs text-[var(--text-muted)] hover:text-[var(--text-secondary)]"
|
|
2932
|
-
>
|
|
2933
|
-
{labels.clearAll}
|
|
2934
|
-
</button>
|
|
2935
|
-
)}
|
|
2936
|
-
{open &&
|
|
2937
|
-
createPortal(
|
|
2938
|
-
<div
|
|
2939
|
-
className="fixed inset-0 z-50 flex items-end justify-center bg-black/40"
|
|
2940
|
-
role="dialog"
|
|
2941
|
-
aria-modal="true"
|
|
2942
|
-
dir={dir}
|
|
2943
|
-
{...backdropClose}
|
|
2944
|
-
>
|
|
2945
|
-
<div className="flex max-h-[85vh] w-full flex-col overflow-hidden rounded-t-2xl bg-[var(--bg-surface)] shadow-xl">
|
|
2946
|
-
<div className="flex items-center justify-between gap-2 border-b border-[var(--border)] px-4 py-3">
|
|
2947
|
-
<div className="font-medium">{labels.filters}</div>
|
|
2948
|
-
<button
|
|
2949
|
-
type="button"
|
|
2950
|
-
onClick={() => setOpen(false)}
|
|
2951
|
-
aria-label={labels.close}
|
|
2952
|
-
className="-me-1 rounded p-1.5 text-[var(--text-muted)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]"
|
|
2953
|
-
>
|
|
2954
|
-
<X className="size-5" />
|
|
2955
|
-
</button>
|
|
2956
|
-
</div>
|
|
2957
|
-
<div className="flex-1 divide-y divide-[var(--border)] overflow-y-auto overscroll-contain">
|
|
2958
|
-
{filterable.map(({ col, filter }) => {
|
|
2959
|
-
const state = filters[col.key];
|
|
2960
|
-
const active = !!state && isFilterActive(state);
|
|
2961
|
-
const isItemOpen = expanded === col.key;
|
|
2962
|
-
return (
|
|
2963
|
-
<div key={col.key}>
|
|
2964
|
-
<button
|
|
2965
|
-
type="button"
|
|
2966
|
-
onClick={() => setExpanded(isItemOpen ? null : col.key)}
|
|
2967
|
-
aria-expanded={isItemOpen}
|
|
2968
|
-
className="flex w-full items-center justify-between gap-2 px-4 py-3 text-start"
|
|
2969
|
-
>
|
|
2970
|
-
<span className="flex items-center gap-2 text-sm font-medium text-[var(--text-secondary)]">
|
|
2971
|
-
{col.header}
|
|
2972
|
-
{active && <span className="size-1.5 rounded-full bg-brand" />}
|
|
2973
|
-
</span>
|
|
2974
|
-
<ChevronDown
|
|
2975
|
-
className={cn(
|
|
2976
|
-
"size-4 shrink-0 text-[var(--text-placeholder)] transition-transform",
|
|
2977
|
-
isItemOpen && "rotate-180",
|
|
2978
|
-
)}
|
|
2979
|
-
/>
|
|
2980
|
-
</button>
|
|
2981
|
-
{isItemOpen && (
|
|
2982
|
-
<div className="px-4 pb-3">
|
|
2983
|
-
<FilterPopover
|
|
2984
|
-
column={col}
|
|
2985
|
-
state={state ?? defaultFilterState(filter)}
|
|
2986
|
-
onChange={(next) => onSetFilter(col.key, next)}
|
|
2987
|
-
onClear={() => onClearFilter(col.key)}
|
|
2988
|
-
selectOptions={selectOptionsByKey[col.key] ?? []}
|
|
2989
|
-
labels={labels}
|
|
2990
|
-
locale={locale}
|
|
2991
|
-
/>
|
|
2992
|
-
</div>
|
|
2993
|
-
)}
|
|
2994
|
-
</div>
|
|
2995
|
-
);
|
|
2996
|
-
})}
|
|
2997
|
-
</div>
|
|
2998
|
-
<div className="flex items-center justify-between gap-2 border-t border-[var(--border)] px-4 py-3">
|
|
2999
|
-
<button
|
|
3000
|
-
type="button"
|
|
3001
|
-
onClick={onClearAll}
|
|
3002
|
-
disabled={activeCount === 0}
|
|
3003
|
-
className="text-sm text-[var(--text-muted)] hover:text-[var(--text-secondary)] disabled:opacity-40"
|
|
3004
|
-
>
|
|
3005
|
-
{labels.clearAll}
|
|
3006
|
-
</button>
|
|
3007
|
-
<button
|
|
3008
|
-
type="button"
|
|
3009
|
-
onClick={() => setOpen(false)}
|
|
3010
|
-
className="rounded-md bg-[var(--bg-inverse)] px-4 py-2 text-sm font-medium text-[var(--text-inverse)]"
|
|
3011
|
-
>
|
|
3012
|
-
{labels.done}
|
|
3013
|
-
</button>
|
|
3014
|
-
</div>
|
|
3015
|
-
</div>
|
|
3016
|
-
</div>,
|
|
3017
|
-
document.body,
|
|
3018
|
-
)}
|
|
3019
|
-
</div>
|
|
3020
|
-
);
|
|
3021
|
-
}
|