@eifi1/ui-kit 0.51.6 → 0.52.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 +146 -26
- package/dist/account/account-parts.d.ts +10 -8
- package/dist/account/account-parts.js +1 -18
- package/dist/account/account-parts.js.map +1 -1
- package/dist/account/data-export-setting-labels.js +1 -1
- package/dist/account/data-export-setting-labels.js.map +1 -1
- package/dist/account/delete-account-setting-labels.js +1 -1
- package/dist/account/delete-account-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting-labels.js +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/passkeys-setting.d.ts +9 -2
- package/dist/account/passkeys-setting.js +41 -29
- package/dist/account/passkeys-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +3 -2
- package/dist/account/sessions-setting.js +10 -8
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.js +3 -7
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +6 -3
- package/dist/admin/admin-parts.js +6 -21
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/mail-test-card-labels.js +1 -1
- package/dist/admin/mail-test-card-labels.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -2
- package/dist/admin/plan-change-labels.js +1 -17
- package/dist/admin/plan-change-labels.js.map +1 -1
- package/dist/admin/plan-change.d.ts +3 -42
- package/dist/admin/plan-change.js +1 -1
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +3 -3
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/auth/auth-errors-labels.d.ts +11 -0
- package/dist/auth/auth-errors-labels.js +13 -0
- package/dist/auth/auth-errors-labels.js.map +1 -0
- package/dist/auth/auth-errors.d.ts +7 -23
- package/dist/auth/auth-errors.js +2 -15
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.d.ts +3 -2
- package/dist/auth/complete-name-dialog.js +3 -5
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/forgot-password-form-labels.js +1 -1
- package/dist/auth/forgot-password-form-labels.js.map +1 -1
- package/dist/auth/forgot-password-form.js +7 -2
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form-labels.js +1 -1
- package/dist/auth/register-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form-labels.js +1 -1
- package/dist/auth/reset-password-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form.js +5 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.js +1 -1
- package/dist/auth/sign-in-form-labels.js.map +1 -1
- package/dist/auth/status-parts.d.ts +0 -3
- package/dist/auth/status-parts.js +0 -4
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.js +1 -1
- package/dist/auth/verify-email-labels.js.map +1 -1
- package/dist/auth/verify-email.js +7 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/cancel-request.d.ts +11 -2
- package/dist/billing/cancel-request.js +15 -3
- package/dist/billing/cancel-request.js.map +1 -1
- package/dist/billing/cancel-subscription.d.ts +22 -10
- package/dist/billing/cancel-subscription.js +8 -11
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/dialog-close.d.ts +29 -0
- package/dist/billing/dialog-close.js +8 -0
- package/dist/billing/dialog-close.js.map +1 -0
- package/dist/billing/plan-card.d.ts +14 -4
- package/dist/billing/plan-card.js +15 -8
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-change-labels.d.ts +42 -0
- package/dist/billing/plan-change-labels.js +22 -0
- package/dist/billing/plan-change-labels.js.map +1 -0
- package/dist/billing/plan-switch.d.ts +21 -9
- package/dist/billing/plan-switch.js +10 -8
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +12 -0
- package/dist/chart.js +16 -1
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips.d.ts +5 -5
- package/dist/components/account-chips.js +11 -13
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +16 -5
- package/dist/components/alert-banner.js +46 -1
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +22 -4
- package/dist/components/amount-input.js +3 -3
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +57 -65
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.d.ts +12 -2
- package/dist/components/bulk-action-bar.js +65 -21
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-look.d.ts +5 -5
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/calculator.d.ts +21 -2
- package/dist/components/calculator.js +53 -14
- package/dist/components/calculator.js.map +1 -1
- package/dist/components/chart-edge.d.ts +16 -0
- package/dist/components/chart-edge.js +14 -1
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-figure.d.ts +13 -0
- package/dist/components/chart-figure.js +15 -0
- package/dist/components/chart-figure.js.map +1 -0
- package/dist/components/chart-zoom-core.js +1 -4
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +8 -1
- package/dist/components/chart.js +19 -10
- package/dist/components/chart.js.map +1 -1
- package/dist/components/combobox-core.d.ts +119 -7
- package/dist/components/combobox-core.js +151 -46
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +142 -131
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/copy-button.d.ts +6 -5
- package/dist/components/copy-button.js +5 -3
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.js +2 -2
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +1 -1
- package/dist/components/data-table-column-settings.js +33 -7
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +4 -2
- package/dist/components/data-table-filters.js +2 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +6 -4
- package/dist/components/data-table-fit.js +4 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.d.ts +1 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.d.ts +1 -1
- package/dist/components/data-table-head.js +15 -12
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +36 -7
- package/dist/components/data-table-mobile.js +63 -31
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js +11 -6
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +2 -2
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.d.ts +6 -2
- package/dist/components/data-table-row.js +17 -10
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-selection.d.ts +1 -1
- package/dist/components/data-table-selection.js.map +1 -1
- package/dist/components/data-table-shared.d.ts +10 -2
- package/dist/components/data-table-shared.js +18 -0
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.d.ts +21 -2
- package/dist/components/data-table-sort.js +24 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.d.ts +1 -1
- package/dist/components/data-table-virtual.js +18 -6
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.d.ts +25 -8
- package/dist/components/data-table.js +154 -25
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +24 -2
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +15 -2
- package/dist/components/date-picker.js +55 -26
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +47 -20
- package/dist/components/date-range-picker.js +23 -7
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +2 -1
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/entity-combobox.js +4 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/error-boundary.js +37 -30
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
- package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
- package/dist/components/field-base-labels.js.map +1 -0
- package/dist/components/field-base.d.ts +4 -3
- package/dist/components/field-base.js +3 -3
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/field-sync-labels.d.ts +1 -0
- package/dist/components/field-sync-labels.js.map +1 -1
- package/dist/components/field-sync.d.ts +23 -1
- package/dist/components/field-sync.js.map +1 -1
- package/dist/components/form-actions.js +11 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.d.ts +3 -0
- package/dist/components/hover-menu.js +5 -3
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +14 -9
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.d.ts +43 -0
- package/dist/components/inline-confirm.js +67 -0
- package/dist/components/inline-confirm.js.map +1 -0
- package/dist/components/inline-entity-combobox.d.ts +4 -3
- package/dist/components/inline-entity-combobox.js +150 -141
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +28 -112
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-page.d.ts +3 -1
- package/dist/components/legal-page.js +3 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +4 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.d.ts +2 -2
- package/dist/components/lightbox.js +17 -6
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/list.d.ts +6 -2
- package/dist/components/list.js +4 -3
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.d.ts +1 -1
- package/dist/components/measured-grid.js +2 -1
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/mini-calendar.js +3 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +24 -0
- package/dist/components/modal.js +12 -4
- package/dist/components/modal.js.map +1 -1
- package/dist/components/money-draft.js +7 -5
- package/dist/components/money-draft.js.map +1 -1
- package/dist/components/money-field.d.ts +2 -2
- package/dist/components/money-field.js.map +1 -1
- package/dist/components/month-grid.d.ts +55 -0
- package/dist/components/month-grid.js +148 -0
- package/dist/components/month-grid.js.map +1 -0
- package/dist/components/month-picker.d.ts +36 -4
- package/dist/components/month-picker.js +123 -146
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -1
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.d.ts +2 -2
- package/dist/components/multi-select.js +11 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-field.d.ts +6 -4
- package/dist/components/number-field.js +3 -2
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.d.ts +4 -1
- package/dist/components/number-input.js +3 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/picker-sheet.js +2 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +7 -0
- package/dist/components/pie-chart-labels.js +1 -0
- package/dist/components/pie-chart-labels.js.map +1 -1
- package/dist/components/pie-chart.d.ts +5 -3
- package/dist/components/pie-chart.js +7 -22
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.d.ts +3 -0
- package/dist/components/popover.js +7 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/reauth-dialog.d.ts +4 -5
- package/dist/components/reauth-dialog.js +1 -4
- package/dist/components/reauth-dialog.js.map +1 -1
- package/dist/components/row-actions.js +2 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/section-nav.d.ts +7 -0
- package/dist/components/section-nav.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +10 -3
- package/dist/components/series-chart-axes.js +1 -0
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +7 -4
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +31 -7
- package/dist/components/series-chart.js +72 -29
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/share-card.js +3 -3
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/sign-chip-labels.d.ts +1 -0
- package/dist/components/sign-chip-labels.js.map +1 -1
- package/dist/components/sign-chip.d.ts +10 -1
- package/dist/components/sign-chip.js.map +1 -1
- package/dist/components/tabs-labels.d.ts +2 -0
- package/dist/components/tabs-labels.js +11 -0
- package/dist/components/tabs-labels.js.map +1 -0
- package/dist/components/tabs.d.ts +1 -1
- package/dist/components/tabs.js +13 -11
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +2 -2
- package/dist/components/toggle-legend.js +6 -6
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -2
- package/dist/components/translation-review-editor.js +2 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review.d.ts +2 -1
- package/dist/components/translation-review.js +2 -2
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +26 -0
- package/dist/components/treemap-labels.js +10 -0
- package/dist/components/treemap-labels.js.map +1 -0
- package/dist/components/treemap-layout.d.ts +62 -0
- package/dist/components/treemap-layout.js +126 -0
- package/dist/components/treemap-layout.js.map +1 -0
- package/dist/components/treemap.d.ts +140 -17
- package/dist/components/treemap.js +324 -97
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/use-table-state.d.ts +5 -5
- package/dist/components/use-table-state.js +4 -1
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +6 -2
- package/dist/data-table.js +7 -2
- package/dist/data-table.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +36 -7
- package/dist/eslint/role-utilities.js +42 -9
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +25 -16
- package/dist/feedback/feedback-dialog.js +6 -2
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-mutation.d.ts +30 -0
- package/dist/feedback/feedback-mutation.js +16 -0
- package/dist/feedback/feedback-mutation.js.map +1 -0
- package/dist/feedback/feedback-page-link.d.ts +53 -0
- package/dist/feedback/feedback-page-link.js +37 -0
- package/dist/feedback/feedback-page-link.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +12 -3
- package/dist/feedback/feedback-public-list.js +2 -1
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-replies.d.ts +3 -1
- package/dist/feedback/feedback-replies.js +5 -4
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +5 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +64 -28
- package/dist/feedback/feedback-row-detail.js +30 -28
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +30 -11
- package/dist/feedback/feedback-status-undo.js +10 -15
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
- package/dist/feedback/feedback-submit-dialog.js +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.js +9 -3
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +21 -9
- package/dist/feedback/feedback-table.js +45 -25
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +2 -2
- package/dist/feedback/feedback-thread-labels.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +24 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +34 -0
- package/dist/feedback.js +42 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-dismiss.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +35 -0
- package/dist/hooks/use-focus-trap.js +6 -4
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +5 -2
- package/dist/hooks/use-hotkey.js +5 -4
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-long-press.d.ts +7 -4
- package/dist/hooks/use-long-press.js +3 -0
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-media-query.js +12 -4
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-mounted.d.ts +22 -0
- package/dist/hooks/use-mounted.js +24 -0
- package/dist/hooks/use-mounted.js.map +1 -0
- package/dist/hooks/use-overlay-history.d.ts +7 -1
- package/dist/hooks/use-overlay-history.js +35 -5
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +4 -5
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -2
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +20 -41
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -10
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +5 -0
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +64 -17
- package/dist/index.js +77 -12
- package/dist/index.js.map +1 -1
- package/dist/landing/routing.d.ts +3 -1
- package/dist/landing/routing.js +4 -7
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/broadcast.d.ts +17 -0
- package/dist/lib/broadcast.js +30 -0
- package/dist/lib/broadcast.js.map +1 -0
- package/dist/lib/calc.d.ts +7 -1
- package/dist/lib/calc.js +3 -1
- package/dist/lib/calc.js.map +1 -1
- package/dist/lib/clipboard-minus.d.ts +2 -2
- package/dist/lib/clipboard-minus.js +1 -1
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/date-format.d.ts +37 -2
- package/dist/lib/date-format.js +34 -8
- package/dist/lib/date-format.js.map +1 -1
- package/dist/lib/day-format.d.ts +46 -0
- package/dist/lib/day-format.js +46 -0
- package/dist/lib/day-format.js.map +1 -0
- package/dist/lib/decimal-marks.d.ts +7 -1
- package/dist/lib/decimal-marks.js +5 -2
- package/dist/lib/decimal-marks.js.map +1 -1
- package/dist/lib/describe-failure.d.ts +14 -0
- package/dist/lib/describe-failure.js +9 -0
- package/dist/lib/describe-failure.js.map +1 -0
- package/dist/lib/direction.d.ts +16 -0
- package/dist/lib/direction.js +9 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/focus-left.d.ts +63 -0
- package/dist/lib/focus-left.js +67 -0
- package/dist/lib/focus-left.js.map +1 -0
- package/dist/lib/format.d.ts +5 -3
- package/dist/lib/format.js +16 -13
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/http-status.d.ts +24 -0
- package/dist/lib/http-status.js +14 -0
- package/dist/lib/http-status.js.map +1 -0
- package/dist/lib/intl-cache.d.ts +14 -0
- package/dist/lib/intl-cache.js +15 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/isin.d.ts +10 -0
- package/dist/lib/isin.js.map +1 -1
- package/dist/lib/iso-day.d.ts +11 -0
- package/dist/lib/iso-day.js +8 -0
- package/dist/lib/iso-day.js.map +1 -0
- package/dist/lib/lazy-with-fallback.d.ts +31 -0
- package/dist/lib/lazy-with-fallback.js +40 -0
- package/dist/lib/lazy-with-fallback.js.map +1 -0
- package/dist/lib/path-pattern.d.ts +34 -0
- package/dist/lib/path-pattern.js +24 -0
- package/dist/lib/path-pattern.js.map +1 -0
- package/dist/lib/reduced-motion.d.ts +2 -1
- package/dist/lib/reduced-motion.js.map +1 -1
- package/dist/lib/round.d.ts +2 -1
- package/dist/lib/round.js +2 -1
- package/dist/lib/round.js.map +1 -1
- package/dist/lib/safe-storage.d.ts +24 -5
- package/dist/lib/safe-storage.js +27 -2
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/session-refresh.js +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/share-format.d.ts +13 -0
- package/dist/lib/share-format.js +10 -0
- package/dist/lib/share-format.js.map +1 -0
- package/dist/lib/text-case.d.ts +17 -0
- package/dist/lib/text-case.js +8 -0
- package/dist/lib/text-case.js.map +1 -0
- package/dist/lib/text-match.d.ts +38 -0
- package/dist/lib/text-match.js +24 -2
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/thenable.d.ts +13 -0
- package/dist/lib/thenable.js +8 -0
- package/dist/lib/thenable.js.map +1 -0
- package/dist/lib/translation-review.d.ts +7 -2
- package/dist/lib/translation-review.js +4 -4
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/device-zone-report.js +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +2 -1
- package/dist/notifications/notification-bell.js +3 -3
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +10 -6
- package/dist/notifications/notification-inbox.js +26 -48
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.d.ts +3 -2
- package/dist/notifications/notification-parts.js +1 -3
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.d.ts +6 -0
- package/dist/notifications/notifications-labels.js +1 -0
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +1 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.d.ts +2 -1
- package/dist/notifications/push-devices-setting.js +27 -49
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +10 -3
- package/dist/notifications/quiet-hours-setting.js +65 -26
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/unsubscribe-panel.js +4 -7
- package/dist/notifications/unsubscribe-panel.js.map +1 -1
- package/dist/notifications/use-push-device.d.ts +39 -1
- package/dist/notifications/use-push-device.js +28 -7
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/query-persistence.d.ts +3 -1
- package/dist/offline/query-persistence.js +19 -2
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/rhf/fields.d.ts +11 -4
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/command-palette.js +1 -1
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +19 -9
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/use-command-key.d.ts +12 -1
- package/dist/search/use-command-key.js +3 -12
- package/dist/search/use-command-key.js.map +1 -1
- package/dist/search.d.ts +7 -0
- package/dist/search.js +10 -0
- package/dist/search.js.map +1 -1
- package/dist/settings/use-settings-focus.js +1 -0
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +21 -5
- package/dist/shell/account-menu-language.js +3 -1
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +26 -9
- package/dist/shell/account-menu-text-size.js +3 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/role-switcher.d.ts +7 -0
- package/dist/shell/role-switcher.js.map +1 -1
- package/dist/shell/top-bar-actions.d.ts +1 -1
- package/dist/shell/top-bar-actions.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +0 -2
- package/dist/shell/top-bar-parts-labels.js +0 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +27 -8
- package/dist/shell.js +28 -7
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +30 -4
- package/dist/sync/engine.js +172 -52
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +6 -2
- package/dist/sync.js +6 -1
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js +3 -8
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -1
- package/dist/theme/contrast.js +3 -8
- package/dist/theme/contrast.js.map +1 -1
- package/dist/theme/palette-store.js +6 -6
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js +3 -8
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +3 -6
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.d.ts +7 -4
- package/dist/tour/tour-catalogue.js +12 -10
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.d.ts +0 -2
- package/dist/tour/tour-dock.js +0 -2
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-gates.d.ts +4 -0
- package/dist/tour/tour-gates.js +14 -0
- package/dist/tour/tour-gates.js.map +1 -1
- package/dist/tour/tour-overlay.d.ts +27 -0
- package/dist/tour/tour-overlay.js +741 -0
- package/dist/tour/tour-overlay.js.map +1 -0
- package/dist/tour/tour.d.ts +16 -4
- package/dist/tour/tour.js +62 -778
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/tour/use-tour-url-sync.js +2 -2
- package/dist/tour/use-tour-url-sync.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +6 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +3 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.d.ts +3 -1
- package/dist/wizard/validation.js.map +1 -1
- package/package.json +12 -8
- package/src/account/account-parts.ts +5 -25
- package/src/account/data-export-setting-labels.ts +1 -1
- package/src/account/delete-account-setting-labels.ts +1 -1
- package/src/account/email-change-setting-labels.ts +1 -1
- package/src/account/passkeys-setting.tsx +60 -38
- package/src/account/sessions-setting.tsx +18 -12
- package/src/admin/admin-action-confirm.tsx +5 -10
- package/src/admin/admin-parts.ts +11 -25
- package/src/admin/mail-test-card-labels.ts +1 -1
- package/src/admin/plan-change-labels.ts +5 -23
- package/src/admin/plan-change.tsx +7 -44
- package/src/admin/reviewer-scope-editor.tsx +3 -3
- package/src/auth/auth-errors-labels.ts +23 -0
- package/src/auth/auth-errors.ts +11 -38
- package/src/auth/complete-name-dialog.tsx +9 -8
- package/src/auth/forgot-password-form-labels.ts +1 -1
- package/src/auth/forgot-password-form.tsx +11 -6
- package/src/auth/register-form-labels.ts +1 -1
- package/src/auth/reset-password-form-labels.ts +1 -1
- package/src/auth/reset-password-form.tsx +8 -4
- package/src/auth/sign-in-form-labels.ts +1 -1
- package/src/auth/status-parts.tsx +0 -6
- package/src/auth/verify-email-labels.ts +1 -1
- package/src/auth/verify-email.tsx +11 -6
- package/src/billing/cancel-request.ts +28 -6
- package/src/billing/cancel-subscription.tsx +29 -22
- package/src/billing/dialog-close.ts +34 -0
- package/src/billing/plan-card.tsx +36 -11
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +31 -20
- package/src/chart.ts +21 -3
- package/src/components/account-chips.tsx +20 -23
- package/src/components/alert-banner.tsx +82 -5
- package/src/components/amount-input.tsx +32 -14
- package/src/components/autocomplete.tsx +64 -70
- package/src/components/bulk-action-bar.tsx +70 -2
- package/src/components/button-look.ts +5 -5
- package/src/components/button.tsx +2 -2
- package/src/components/calculator.tsx +98 -17
- package/src/components/chart-edge.ts +34 -1
- package/src/components/chart-figure.tsx +35 -0
- package/src/components/chart-zoom-core.tsx +6 -5
- package/src/components/chart.tsx +26 -5
- package/src/components/combobox-core.tsx +303 -69
- package/src/components/combobox.tsx +184 -155
- package/src/components/copy-button.tsx +34 -23
- package/src/components/country-select.tsx +16 -11
- package/src/components/data-table-column-settings.tsx +52 -10
- package/src/components/data-table-filters.ts +6 -4
- package/src/components/data-table-fit.ts +19 -5
- package/src/components/data-table-groups.tsx +1 -1
- package/src/components/data-table-head.tsx +32 -22
- package/src/components/data-table-mobile.tsx +110 -27
- package/src/components/data-table-pagination.tsx +21 -6
- package/src/components/data-table-resize.ts +1 -1
- package/src/components/data-table-row-actions.tsx +3 -3
- package/src/components/data-table-row.tsx +25 -14
- package/src/components/data-table-selection.ts +1 -1
- package/src/components/data-table-shared.tsx +33 -1
- package/src/components/data-table-sort.ts +57 -2
- package/src/components/data-table-virtual.ts +32 -8
- package/src/components/data-table.tsx +267 -41
- package/src/components/date-field.tsx +65 -8
- package/src/components/date-picker.tsx +125 -48
- package/src/components/date-range-picker.tsx +82 -31
- package/src/components/dialog-frame.tsx +2 -1
- package/src/components/entity-combobox.tsx +4 -1
- package/src/components/error-boundary.tsx +53 -39
- package/src/components/field-base-labels.ts +20 -0
- package/src/components/field-base.tsx +13 -7
- package/src/components/field-sync-labels.ts +1 -0
- package/src/components/field-sync.tsx +23 -1
- package/src/components/form-actions.tsx +20 -5
- package/src/components/hover-menu.tsx +18 -8
- package/src/components/icon-button.tsx +14 -9
- package/src/components/inline-confirm.tsx +116 -0
- package/src/components/inline-entity-combobox.tsx +198 -152
- package/src/components/input.tsx +1 -1
- package/src/components/jump-calendar.tsx +30 -146
- package/src/components/legal-page.tsx +10 -7
- package/src/components/legal.tsx +4 -2
- package/src/components/lightbox.tsx +21 -8
- package/src/components/list.tsx +14 -5
- package/src/components/measured-grid.tsx +8 -4
- package/src/components/mini-calendar.tsx +6 -5
- package/src/components/modal.tsx +45 -4
- package/src/components/money-draft.ts +16 -5
- package/src/components/money-field.tsx +2 -2
- package/src/components/month-grid.tsx +229 -0
- package/src/components/month-picker.tsx +192 -200
- package/src/components/multi-entity-combobox.tsx +1 -0
- package/src/components/multi-select.tsx +21 -9
- package/src/components/number-field.tsx +14 -7
- package/src/components/number-input.tsx +9 -3
- package/src/components/numpad-sheet.tsx +4 -3
- package/src/components/picker-sheet.tsx +12 -9
- package/src/components/pie-chart-labels.ts +8 -0
- package/src/components/pie-chart.tsx +22 -28
- package/src/components/popover.tsx +18 -1
- package/src/components/reauth-dialog.tsx +6 -10
- package/src/components/row-actions.tsx +2 -1
- package/src/components/section-nav.tsx +7 -0
- package/src/components/series-chart-axes.ts +11 -3
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +178 -69
- package/src/components/share-card.tsx +6 -6
- package/src/components/sign-chip-labels.ts +1 -0
- package/src/components/sign-chip.tsx +10 -1
- package/src/components/tabs-labels.ts +13 -0
- package/src/components/tabs.tsx +35 -19
- package/src/components/toggle-legend.tsx +16 -11
- package/src/components/translation-review-editor.tsx +6 -5
- package/src/components/translation-review.tsx +4 -3
- package/src/components/treemap-labels.ts +39 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +722 -133
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +9 -2
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +41 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +17 -5
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +5 -0
- package/src/feedback/feedback-row-detail.tsx +103 -67
- package/src/feedback/feedback-status-undo.ts +41 -27
- package/src/feedback/feedback-submit-dialog.tsx +2 -2
- package/src/feedback/feedback-submit.tsx +21 -7
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table.tsx +86 -38
- package/src/feedback/feedback-thread-labels.ts +2 -2
- package/src/feedback/feedback-thread.tsx +27 -25
- package/src/feedback.ts +42 -0
- package/src/hooks/use-dismiss.ts +3 -2
- package/src/hooks/use-focus-trap.ts +8 -24
- package/src/hooks/use-hotkey.ts +24 -7
- package/src/hooks/use-long-press.ts +16 -2
- package/src/hooks/use-media-query.ts +20 -4
- package/src/hooks/use-mounted.ts +39 -0
- package/src/hooks/use-overlay-history.ts +70 -5
- package/src/i18n/defaults.ts +4 -5
- package/src/i18n/german.ts +8 -2
- package/src/i18n/kit-labels.tsx +9 -2
- package/src/i18n/locales/es.ts +8 -2
- package/src/i18n/locales/fr.ts +21 -13
- package/src/i18n/locales/hu.ts +10 -2
- package/src/i18n/locales/it.ts +8 -2
- package/src/i18n/locales/zh.ts +9 -2
- package/src/i18n/review.ts +5 -0
- package/src/index.ts +103 -13
- package/src/landing/routing.tsx +14 -10
- package/src/lib/broadcast.ts +52 -0
- package/src/lib/calc.ts +13 -2
- package/src/lib/clipboard-minus.ts +14 -4
- package/src/lib/date-format.ts +89 -13
- package/src/lib/day-format.ts +96 -0
- package/src/lib/decimal-marks.ts +12 -3
- package/src/lib/describe-failure.ts +18 -0
- package/src/lib/direction.ts +39 -0
- package/src/lib/focus-left.ts +156 -0
- package/src/lib/format.ts +34 -19
- package/src/lib/http-status.ts +38 -0
- package/src/lib/intl-cache.ts +25 -0
- package/src/lib/isin.ts +10 -0
- package/src/lib/iso-day.ts +13 -0
- package/src/lib/lazy-with-fallback.ts +82 -0
- package/src/lib/path-pattern.ts +55 -0
- package/src/lib/reduced-motion.ts +2 -1
- package/src/lib/round.ts +7 -2
- package/src/lib/safe-storage.ts +48 -6
- package/src/lib/session-refresh.ts +1 -1
- package/src/lib/share-format.ts +18 -0
- package/src/lib/text-case.ts +19 -0
- package/src/lib/text-match.ts +69 -2
- package/src/lib/thenable.ts +19 -0
- package/src/lib/translation-review.ts +13 -5
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-bell.tsx +7 -4
- package/src/notifications/notification-inbox.tsx +40 -58
- package/src/notifications/notification-parts.tsx +3 -4
- package/src/notifications/notification-types-setting.tsx +1 -1
- package/src/notifications/notifications-labels.ts +7 -0
- package/src/notifications/push-device-setting.tsx +1 -1
- package/src/notifications/push-devices-setting.tsx +30 -55
- package/src/notifications/quiet-hours-setting.tsx +93 -31
- package/src/notifications/unsubscribe-panel.tsx +4 -7
- package/src/notifications/use-push-device.ts +76 -10
- package/src/offline/query-persistence.ts +35 -3
- package/src/rhf/fields.tsx +11 -4
- package/src/search/command-palette.tsx +2 -4
- package/src/search/global-search.tsx +36 -15
- package/src/search/use-command-key.ts +13 -12
- package/src/search.ts +9 -0
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +27 -5
- package/src/shell/account-menu-text-size.tsx +32 -10
- package/src/shell/dev-menu.tsx +7 -21
- package/src/shell/role-switcher.tsx +7 -0
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +0 -3
- package/src/shell.ts +40 -9
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +8 -1
- package/src/testing/css-variables.ts +8 -9
- package/src/theme/contrast.ts +8 -9
- package/src/theme/palette-store.ts +9 -9
- package/src/theme/text-size.ts +6 -8
- package/src/theme/theme-store.ts +7 -9
- package/src/tour/tour-catalogue.tsx +26 -15
- package/src/tour/tour-dock.ts +0 -2
- package/src/tour/tour-gates.ts +23 -0
- package/src/tour/tour-overlay.tsx +1170 -0
- package/src/tour/tour.tsx +116 -1193
- package/src/tour/use-tour-progress.ts +1 -1
- package/src/tour/use-tour-url-sync.ts +7 -3
- package/src/wizard/stepper-nav.tsx +3 -1
- package/src/wizard/types.ts +11 -2
- package/src/wizard/use-wizard.ts +2 -1
- package/src/wizard/validation.ts +8 -2
- package/tokens.css +2 -1
- package/dist/components/ui-labels.js.map +0 -1
- package/dist/shell/dev-switchers.d.ts +0 -6
- package/dist/shell/dev-switchers.js +0 -12
- package/dist/shell/dev-switchers.js.map +0 -1
- package/src/components/ui-labels.ts +0 -24
- package/src/shell/dev-switchers.tsx +0 -18
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useId, useRef, useState } from "react";
|
|
2
2
|
import type { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
4
|
import { cn } from "../lib/cn";
|
|
5
|
+
import { hasContent } from "../lib/presence";
|
|
5
6
|
import { FIELD_BASE, FIELD_FLOATING_PAD, FIELD_INVALID } from "./field-base";
|
|
6
7
|
import { Spinner } from "./spinner";
|
|
7
8
|
import { useAnchoredPanel } from "../hooks/use-anchored-panel";
|
|
@@ -10,10 +11,12 @@ import { isImeEnter } from "../lib/ime";
|
|
|
10
11
|
import { isQuietFocus } from "../lib/quiet-focus";
|
|
11
12
|
import { useAnchorDir } from "./use-anchor-dir";
|
|
12
13
|
import {
|
|
14
|
+
anchoredHeadingClass,
|
|
13
15
|
ComboboxFieldLabel,
|
|
14
16
|
DISABLED_ROW_CLASS,
|
|
15
17
|
endHintRowProps,
|
|
16
|
-
|
|
18
|
+
GroupedOptions,
|
|
19
|
+
groupRuns,
|
|
17
20
|
isOptionEnabled,
|
|
18
21
|
stepEnabled,
|
|
19
22
|
SUGGESTION_LIST_CLASS,
|
|
@@ -293,7 +296,7 @@ export function Autocomplete<V extends string | number = string>(props: Autocomp
|
|
|
293
296
|
active: live,
|
|
294
297
|
});
|
|
295
298
|
|
|
296
|
-
const hasStatus = status
|
|
299
|
+
const hasStatus = hasContent(status);
|
|
297
300
|
// The visible line under the rows. Nothing below `minChars` unless the caller has
|
|
298
301
|
// something to say — an empty field opening a box that says "type more" is noise.
|
|
299
302
|
const statusLine: ReactNode = hasStatus
|
|
@@ -559,75 +562,66 @@ export function Autocomplete<V extends string | number = string>(props: Autocomp
|
|
|
559
562
|
aria-labelledby={labelledBy}
|
|
560
563
|
className="min-h-0 flex-1 overflow-y-auto py-1"
|
|
561
564
|
>
|
|
562
|
-
{
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
//
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
565
|
+
{/* One heading per group, a `role="group"` it names, as in the core panel
|
|
566
|
+
(refactor audit 2026-10-30, INP-8), drawn by the same renderer: an
|
|
567
|
+
option may appear once per group. */}
|
|
568
|
+
<GroupedOptions
|
|
569
|
+
runs={groupRuns(results, (o) => o.group)}
|
|
570
|
+
listboxId={listboxId}
|
|
571
|
+
rowKey={(o) => String(o.value)}
|
|
572
|
+
headingClassName={(run) => anchoredHeadingClass(run)}
|
|
573
|
+
row={(o, i) => (
|
|
574
|
+
<li role="presentation">
|
|
575
|
+
<button
|
|
576
|
+
type="button"
|
|
577
|
+
id={optionId(i)}
|
|
578
|
+
role="option"
|
|
579
|
+
// CHOSEN, never "highlighted" — the family's rule. This
|
|
580
|
+
// field holds no value, so the only row that can be chosen
|
|
581
|
+
// is the one whose label the text already is.
|
|
582
|
+
aria-selected={fillOnSelect && o.label === value}
|
|
583
|
+
// Listed, announced as unavailable, never taken: `take`
|
|
584
|
+
// refuses it and the arrows pass it over.
|
|
585
|
+
aria-disabled={o.disabled || undefined}
|
|
586
|
+
tabIndex={-1}
|
|
587
|
+
onClick={() => take(o)}
|
|
588
|
+
onMouseEnter={() => {
|
|
589
|
+
if (!o.disabled) setActive(i);
|
|
590
|
+
}}
|
|
591
|
+
className={cn(
|
|
592
|
+
// The family's suggestion row (DUP-4): it hand-rolled its
|
|
593
|
+
// own with a plain `truncate`, so a long address was cut at
|
|
594
|
+
// Large, where Combobox's rows wrap (text size §10.17, T1).
|
|
595
|
+
// A flex row here, for the icon and the two lines.
|
|
596
|
+
suggestionRowClass(i === active && !o.disabled),
|
|
597
|
+
"flex items-center gap-2",
|
|
598
|
+
small && "py-1 text-xs",
|
|
599
|
+
o.disabled && DISABLED_ROW_CLASS,
|
|
600
|
+
o.group && "ps-6",
|
|
601
|
+
)}
|
|
602
|
+
>
|
|
603
|
+
{o.icon && (
|
|
604
|
+
<span aria-hidden className="shrink-0 text-muted">
|
|
605
|
+
{o.icon}
|
|
606
|
+
</span>
|
|
607
|
+
)}
|
|
608
|
+
<span className="min-w-0 flex-1">
|
|
609
|
+
<span className="block truncate-until-large text-primary">{o.label}</span>
|
|
610
|
+
{o.sublabel && (
|
|
611
|
+
<span
|
|
612
|
+
className={cn(
|
|
613
|
+
"block truncate-until-large text-placeholder",
|
|
614
|
+
small ? "text-caption" : "text-xs",
|
|
615
|
+
)}
|
|
616
|
+
>
|
|
617
|
+
{o.sublabel}
|
|
611
618
|
</span>
|
|
612
619
|
)}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
"block truncate-until-large text-placeholder",
|
|
619
|
-
small ? "text-caption" : "text-xs",
|
|
620
|
-
)}
|
|
621
|
-
>
|
|
622
|
-
{o.sublabel}
|
|
623
|
-
</span>
|
|
624
|
-
)}
|
|
625
|
-
</span>
|
|
626
|
-
</button>
|
|
627
|
-
</li>
|
|
628
|
-
</Fragment>
|
|
629
|
-
);
|
|
630
|
-
})}
|
|
620
|
+
</span>
|
|
621
|
+
</button>
|
|
622
|
+
</li>
|
|
623
|
+
)}
|
|
624
|
+
/>
|
|
631
625
|
</ul>
|
|
632
626
|
)}
|
|
633
627
|
{statusLine !== null && (
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef, CSSProperties, KeyboardEvent, ReactNode } from "react";
|
|
2
|
+
import type { ComponentPropsWithRef, CSSProperties, FocusEvent, KeyboardEvent, ReactNode, RefObject } from "react";
|
|
3
3
|
import { X } from "lucide-react";
|
|
4
4
|
|
|
5
5
|
import { cn } from "../lib/cn";
|
|
@@ -8,6 +8,8 @@ import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
|
8
8
|
import { useAnnounce } from "../hooks/use-announce";
|
|
9
9
|
import { useBreakpoint } from "../hooks/use-breakpoint";
|
|
10
10
|
import { OVERLAY_EXIT_MS, skipsExitAnimation } from "../hooks/use-close-transition";
|
|
11
|
+
import { focusFirst, focusIsLost, whenFocusLeftForNothing } from "../lib/focus-left";
|
|
12
|
+
import { hasContent } from "../lib/presence";
|
|
11
13
|
import { Button } from "./button";
|
|
12
14
|
import { IconButton } from "./icon-button";
|
|
13
15
|
import { DEFAULT_BULK_ACTION_BAR_LABELS } from "./bulk-action-bar-labels";
|
|
@@ -124,6 +126,16 @@ export interface BulkActionBarProps extends Omit<ComponentPropsWithRef<"div">, "
|
|
|
124
126
|
panel?: ReactNode;
|
|
125
127
|
/** Default: `bulkActionBar` from the {@link UiKitProvider}, else English. */
|
|
126
128
|
labels?: LabelOverride<BulkActionBarLabels>;
|
|
129
|
+
/**
|
|
130
|
+
* Where the focus goes when the bar leaves while it holds it — after Clear, or an action
|
|
131
|
+
* that empties the selection (0.52, refactor audit 2026-10-30, DSP-15). Without it, the
|
|
132
|
+
* control the focus came into the bar from (the row's box, say), if that is still on the
|
|
133
|
+
* page; with it, this first. Pass one where the selection takes that control with it — a
|
|
134
|
+
* bulk delete removes the rows whose boxes were ticked: the table, the list's heading,
|
|
135
|
+
* the "Select" button that entered selection mode. A bar that leaves without the focus
|
|
136
|
+
* in it moves nothing.
|
|
137
|
+
*/
|
|
138
|
+
returnFocusRef?: RefObject<HTMLElement | null>;
|
|
127
139
|
}
|
|
128
140
|
|
|
129
141
|
/** Where the floating bar sits: clear of the phone nav and of the home indicator,
|
|
@@ -192,10 +204,12 @@ export function BulkActionBar({
|
|
|
192
204
|
open,
|
|
193
205
|
panel,
|
|
194
206
|
labels: labelsProp,
|
|
207
|
+
returnFocusRef,
|
|
195
208
|
className,
|
|
196
209
|
style,
|
|
197
210
|
onKeyDown,
|
|
198
211
|
onFocus,
|
|
212
|
+
onBlur,
|
|
199
213
|
...rest
|
|
200
214
|
}: BulkActionBarProps) {
|
|
201
215
|
const labels = useKitLabels("bulkActionBar", DEFAULT_BULK_ACTION_BAR_LABELS, labelsProp);
|
|
@@ -245,6 +259,51 @@ export function BulkActionBar({
|
|
|
245
259
|
rove(barRef.current, active);
|
|
246
260
|
});
|
|
247
261
|
|
|
262
|
+
// Leaving with the focus in it (refactor audit 2026-10-30, DSP-15): the bar goes `inert`,
|
|
263
|
+
// which blurs the control it holds, then unmounts — and the focus fell to <body>; on a
|
|
264
|
+
// phone VoiceOver's cursor jumped to the top of the page (keksdose's register). Noted on
|
|
265
|
+
// the bar's outermost element, so the `panel`'s fields count: where the focus came in
|
|
266
|
+
// from (the first entry since the bar showed, replaced once that control is gone), and
|
|
267
|
+
// whether it is in the bar. Focus that leaves for nothing because the page took it —
|
|
268
|
+
// inert, a removal — still counts as in it; a real element elsewhere takes it out, and
|
|
269
|
+
// so does a click on the page that left it nowhere (0.52 code review,
|
|
270
|
+
// bulk-action-bar.tsx: the note outlived it, and the bar's hide long after — the last row
|
|
271
|
+
// unticked with the pointer — pulled the focus and the scroll back to the row's box).
|
|
272
|
+
const cameFrom = useRef<HTMLElement | null>(null);
|
|
273
|
+
const holdsFocus = useRef(false);
|
|
274
|
+
const trackFocus = {
|
|
275
|
+
onFocus: (e: FocusEvent<HTMLDivElement>) => {
|
|
276
|
+
holdsFocus.current = true;
|
|
277
|
+
const from = e.relatedTarget;
|
|
278
|
+
if (from instanceof HTMLElement && !e.currentTarget.contains(from) && !cameFrom.current?.isConnected)
|
|
279
|
+
cameFrom.current = from;
|
|
280
|
+
},
|
|
281
|
+
onBlur: (e: FocusEvent<HTMLDivElement>) => {
|
|
282
|
+
onBlur?.(e);
|
|
283
|
+
const to = e.relatedTarget;
|
|
284
|
+
if (to instanceof Element && !e.currentTarget.contains(to)) holdsFocus.current = false;
|
|
285
|
+
whenFocusLeftForNothing(e, () => {
|
|
286
|
+
holdsFocus.current = false;
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
// The commit that hides the bar: the focus goes back while the control holding it is
|
|
291
|
+
// still in place — before `inert` takes it, or, with no exit to play, before <body> does.
|
|
292
|
+
const wasShown = useRef(shown);
|
|
293
|
+
useLayoutEffect(() => {
|
|
294
|
+
if (wasShown.current === shown) return;
|
|
295
|
+
wasShown.current = shown;
|
|
296
|
+
const from = cameFrom.current;
|
|
297
|
+
const held = holdsFocus.current;
|
|
298
|
+
cameFrom.current = null;
|
|
299
|
+
holdsFocus.current = false;
|
|
300
|
+
if (shown) return;
|
|
301
|
+
// The outermost element: the toolbar, or with a `panel` the surface round both.
|
|
302
|
+
const surface = barRef.current?.closest("[data-bulk-action-bar]");
|
|
303
|
+
const inBar = !!surface && surface.contains(document.activeElement);
|
|
304
|
+
if (inBar || (held && focusIsLost())) focusFirst([returnFocusRef?.current, from]);
|
|
305
|
+
}, [shown, returnFocusRef]);
|
|
306
|
+
|
|
248
307
|
const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
|
|
249
308
|
onKeyDown?.(e);
|
|
250
309
|
if (e.defaultPrevented || ownsArrows(e.target as Element)) return;
|
|
@@ -279,7 +338,9 @@ export function BulkActionBar({
|
|
|
279
338
|
</Button>
|
|
280
339
|
);
|
|
281
340
|
|
|
282
|
-
|
|
341
|
+
// `hasContent` (refactor audit 2026-10-30, DUP-14): an empty-string panel drew an empty
|
|
342
|
+
// bordered strip under the bar.
|
|
343
|
+
const hasPanel = hasContent(panel);
|
|
283
344
|
// The surface — where the bar sits and what it looks like — and the toolbar row's
|
|
284
345
|
// own layout. Without a panel they are one element, exactly as before 0.11.0; with
|
|
285
346
|
// one the surface wraps the row and the panel, so both share its tint and position.
|
|
@@ -314,6 +375,7 @@ export function BulkActionBar({
|
|
|
314
375
|
onKeyDown={handleKeyDown}
|
|
315
376
|
onFocus={(e) => {
|
|
316
377
|
onFocus?.(e);
|
|
378
|
+
if (!hasPanel) trackFocus.onFocus(e);
|
|
317
379
|
// Clicking a control is using it: the stop follows the pointer too.
|
|
318
380
|
const hit = itemsOf(barRef.current).find((el) => el === e.target);
|
|
319
381
|
if (hit) {
|
|
@@ -321,6 +383,7 @@ export function BulkActionBar({
|
|
|
321
383
|
rove(barRef.current, active);
|
|
322
384
|
}
|
|
323
385
|
}}
|
|
386
|
+
onBlur={hasPanel ? undefined : trackFocus.onBlur}
|
|
324
387
|
style={hasPanel ? undefined : surfaceStyle}
|
|
325
388
|
className={hasPanel ? rowClass : cn(rowClass, surfaceClass, className)}
|
|
326
389
|
>
|
|
@@ -340,8 +403,13 @@ export function BulkActionBar({
|
|
|
340
403
|
<>
|
|
341
404
|
<span {...regionProps} />
|
|
342
405
|
{hasPanel ? (
|
|
406
|
+
/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- the focus is
|
|
407
|
+
only noted here (DSP-15): where it came from, whether it is in the bar; the
|
|
408
|
+
controls are the toolbar's and the panel's own. */
|
|
343
409
|
<div
|
|
344
410
|
{...rest}
|
|
411
|
+
onFocus={trackFocus.onFocus}
|
|
412
|
+
onBlur={trackFocus.onBlur}
|
|
345
413
|
data-bulk-action-bar={variant}
|
|
346
414
|
inert={!shown || undefined}
|
|
347
415
|
style={surfaceStyle}
|
|
@@ -9,8 +9,8 @@ import type { KitLinkComponent, KitLinkProps } from "../i18n/kit-labels";
|
|
|
9
9
|
* and its router link. Both now draw from this module, which renders nothing, so neither
|
|
10
10
|
* imports the other.
|
|
11
11
|
*
|
|
12
|
-
* Public through
|
|
13
|
-
* The other exports are the two buttons' shared parts (`@internal`).
|
|
12
|
+
* Public through the barrel (src/index.ts) by name: `buttonClasses`, `TOUCH_TARGET_LARGE`
|
|
13
|
+
* and the four types. The other exports are the two buttons' shared parts (`@internal`).
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -24,9 +24,9 @@ import type { KitLinkComponent, KitLinkProps } from "../i18n/kit-labels";
|
|
|
24
24
|
* (theme/palette-derive.ts), which no button paints.
|
|
25
25
|
* - `secondary`: an outline. `ghost`: text or glyph only. `danger`: solid `--danger`,
|
|
26
26
|
* for an action that destroys something. `link`: a text link that acts (a `<button>`).
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
*
|
|
28
|
+
* 0.49's `primary` and `brand` (aliases of `default` and `accent`) were removed in 0.51;
|
|
29
|
+
* `primary` will not come back with another meaning.
|
|
30
30
|
*/
|
|
31
31
|
export type ButtonVariant = "default" | "accent" | "secondary" | "ghost" | "danger" | "link";
|
|
32
32
|
|
|
@@ -25,8 +25,8 @@ import type { ButtonSize, ButtonTone, ButtonVariant } from "./button-look";
|
|
|
25
25
|
*/
|
|
26
26
|
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
27
27
|
/** `default` (the quiet action, what a Button without `variant` draws), `accent` (the
|
|
28
|
-
* strong call to action, solid brand), `secondary`, `ghost`, `danger` or `link`.
|
|
29
|
-
*
|
|
28
|
+
* strong call to action, solid brand), `secondary`, `ghost`, `danger` or `link`. See
|
|
29
|
+
* {@link ButtonVariant}. */
|
|
30
30
|
variant?: ButtonVariant;
|
|
31
31
|
/** `md` (default) is the page's action button. `sm` is the compact one — 12px text
|
|
32
32
|
* and `px-2 py-1` — for the secondary actions in a toolbar, a card header or a
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { useEffect, useMemo, useRef, useState } from "react";
|
|
1
|
+
import { useEffect, useEffectEvent, useMemo, useRef, useState } from "react";
|
|
2
|
+
import type { RefObject } from "react";
|
|
2
3
|
import { Calculator as CalculatorIcon, Delete } from "lucide-react";
|
|
3
4
|
import { Popover } from "./popover";
|
|
4
5
|
import { cn } from "../lib/cn";
|
|
@@ -30,6 +31,24 @@ interface CalculatorButtonProps {
|
|
|
30
31
|
* the one argument and ignore this.
|
|
31
32
|
*/
|
|
32
33
|
onChange: (value: string, expression?: string) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Called ONCE per calculator session, with the result the host should keep: on "="
|
|
36
|
+
* (the key, or Enter in the display), and when the panel closes — Escape, a press
|
|
37
|
+
* outside, the trigger — on a result `onChange` reported after the last commit. Never
|
|
38
|
+
* per keystroke: `onChange` is the live channel, this is the one to save on.
|
|
39
|
+
*
|
|
40
|
+
* Not called when the button goes away with its panel open (a lock or `disabled`
|
|
41
|
+
* arriving, the field unmounting): those say the value must not move, and the result
|
|
42
|
+
* stays where `onChange` put it.
|
|
43
|
+
*
|
|
44
|
+
* Refactor audit 2026-10-30, INP-1: the pad had no commit point of its own, and the
|
|
45
|
+
* two field engines guessed in opposite directions. NumberInput never committed a
|
|
46
|
+
* result, so Kurvenschmiede's dialogs saved the number from before the calculation;
|
|
47
|
+
* AmountInput committed every keystroke that resolved, so "100+50" saved 105 on its way
|
|
48
|
+
* to 150, and keksdose's threshold field, `disabled` while it saves, lost its pad to the
|
|
49
|
+
* first of them.
|
|
50
|
+
*/
|
|
51
|
+
onCommit?: (value: string) => void;
|
|
33
52
|
className?: string;
|
|
34
53
|
/** The trigger's accessible name; wins over `calculator.open` from the provider. */
|
|
35
54
|
"aria-label"?: string;
|
|
@@ -89,10 +108,13 @@ function seed(initial: string): string {
|
|
|
89
108
|
function CalculatorPanel({
|
|
90
109
|
initial,
|
|
91
110
|
onChange,
|
|
111
|
+
onEquals,
|
|
92
112
|
labels,
|
|
93
113
|
}: {
|
|
94
114
|
initial: string;
|
|
95
115
|
onChange: (value: string, expression?: string) => void;
|
|
116
|
+
/** "=" was pressed on a result: the session's commit point. */
|
|
117
|
+
onEquals: () => void;
|
|
96
118
|
labels: CalculatorLabels;
|
|
97
119
|
}) {
|
|
98
120
|
const [expr, setExpr] = useState(() => seed(initial));
|
|
@@ -132,6 +154,7 @@ function CalculatorPanel({
|
|
|
132
154
|
const out = formatResult(result);
|
|
133
155
|
setExpr(out);
|
|
134
156
|
onChange(out, text);
|
|
157
|
+
onEquals();
|
|
135
158
|
};
|
|
136
159
|
|
|
137
160
|
return (
|
|
@@ -213,15 +236,66 @@ function CalculatorPanel({
|
|
|
213
236
|
);
|
|
214
237
|
}
|
|
215
238
|
|
|
239
|
+
/**
|
|
240
|
+
* The trigger, and the place a session ends. The render in which `open` turns false is
|
|
241
|
+
* the panel closing, however it closed — Escape, a press outside, this button — and
|
|
242
|
+
* that is when a result the pad left unsettled is committed. A component of its own
|
|
243
|
+
* because `open` lives in Popover and reaches only the trigger.
|
|
244
|
+
*
|
|
245
|
+
* Not the panel's unmount: the panel also goes when a lock or `disabled` takes the
|
|
246
|
+
* calculator away, and nothing may commit then. Those unmount this button with it, so no
|
|
247
|
+
* render ever sees `open` turn false.
|
|
248
|
+
*/
|
|
249
|
+
function CalculatorTrigger({
|
|
250
|
+
open,
|
|
251
|
+
onToggle,
|
|
252
|
+
onClosed,
|
|
253
|
+
buttonRef,
|
|
254
|
+
label,
|
|
255
|
+
className,
|
|
256
|
+
}: {
|
|
257
|
+
open: boolean;
|
|
258
|
+
onToggle: () => void;
|
|
259
|
+
onClosed: () => void;
|
|
260
|
+
buttonRef: RefObject<HTMLButtonElement | null>;
|
|
261
|
+
label: string;
|
|
262
|
+
className?: string;
|
|
263
|
+
}) {
|
|
264
|
+
const closed = useEffectEvent(onClosed);
|
|
265
|
+
const wasOpen = useRef(open);
|
|
266
|
+
useEffect(() => {
|
|
267
|
+
if (wasOpen.current && !open) closed();
|
|
268
|
+
wasOpen.current = open;
|
|
269
|
+
}, [open]);
|
|
270
|
+
return (
|
|
271
|
+
<button
|
|
272
|
+
ref={buttonRef}
|
|
273
|
+
type="button"
|
|
274
|
+
tabIndex={-1}
|
|
275
|
+
onClick={onToggle}
|
|
276
|
+
aria-label={label}
|
|
277
|
+
aria-expanded={open}
|
|
278
|
+
className={cn(
|
|
279
|
+
"flex items-center justify-center text-placeholder transition-colors hover:text-secondary",
|
|
280
|
+
className,
|
|
281
|
+
)}
|
|
282
|
+
>
|
|
283
|
+
<CalculatorIcon className="size-4" />
|
|
284
|
+
</button>
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
|
|
216
288
|
/**
|
|
217
289
|
* A calculator icon that opens a small keypad popover anchored to its host
|
|
218
290
|
* field. Designed as a trailing-edge adornment: render it inside the field's
|
|
219
291
|
* `relative` wrapper, positioned absolutely. The keypad seeds from the current
|
|
220
|
-
* field value and writes evaluated results straight back through `onChange
|
|
292
|
+
* field value and writes evaluated results straight back through `onChange`, and
|
|
293
|
+
* commits the session once through `onCommit`.
|
|
221
294
|
*/
|
|
222
295
|
export function CalculatorButton({
|
|
223
296
|
value,
|
|
224
297
|
onChange,
|
|
298
|
+
onCommit,
|
|
225
299
|
className,
|
|
226
300
|
"aria-label": ariaLabel,
|
|
227
301
|
labels: labelsProp,
|
|
@@ -233,28 +307,35 @@ export function CalculatorButton({
|
|
|
233
307
|
[ariaLabel, labelsProp],
|
|
234
308
|
);
|
|
235
309
|
const labels = useKitLabels("calculator", DEFAULT_CALCULATOR_LABELS, fromProps);
|
|
310
|
+
// The last result `onChange` reported that no commit has covered yet — what closing
|
|
311
|
+
// the panel commits. Written by the pad's handlers and read when it closes; never
|
|
312
|
+
// rendered, so a ref.
|
|
313
|
+
const unsettled = useRef<string | null>(null);
|
|
314
|
+
const change = (next: string, expression?: string) => {
|
|
315
|
+
unsettled.current = next;
|
|
316
|
+
onChange(next, expression);
|
|
317
|
+
};
|
|
318
|
+
const settle = () => {
|
|
319
|
+
const next = unsettled.current;
|
|
320
|
+
unsettled.current = null;
|
|
321
|
+
if (next !== null) onCommit?.(next);
|
|
322
|
+
};
|
|
236
323
|
return (
|
|
237
324
|
<Popover
|
|
238
325
|
width="14rem"
|
|
239
326
|
labels={{ panel: labels.panel }}
|
|
240
327
|
trigger={({ open, toggle, ref }) => (
|
|
241
|
-
<
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
"flex items-center justify-center text-placeholder transition-colors hover:text-secondary",
|
|
250
|
-
className,
|
|
251
|
-
)}
|
|
252
|
-
>
|
|
253
|
-
<CalculatorIcon className="size-4" />
|
|
254
|
-
</button>
|
|
328
|
+
<CalculatorTrigger
|
|
329
|
+
open={open}
|
|
330
|
+
onToggle={toggle}
|
|
331
|
+
onClosed={settle}
|
|
332
|
+
buttonRef={ref}
|
|
333
|
+
label={labels.open}
|
|
334
|
+
className={className}
|
|
335
|
+
/>
|
|
255
336
|
)}
|
|
256
337
|
>
|
|
257
|
-
{() => <CalculatorPanel initial={value} onChange={
|
|
338
|
+
{() => <CalculatorPanel initial={value} onChange={change} onEquals={settle} labels={labels} />}
|
|
258
339
|
</Popover>
|
|
259
340
|
);
|
|
260
341
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// The live side of `chartEdge` (theme/chart-palette.ts): which colours a FILLED mark is
|
|
2
2
|
// painted with and which grounds it sits on, read off <html> as the page resolves them —
|
|
3
3
|
// so the 1px ink edge follows a theme toggle and a palette switch without the chart
|
|
4
|
-
// knowing either store.
|
|
4
|
+
// knowing either store. And WHETHER a mark gets one: `useEdgesInForce`, the contrast
|
|
5
|
+
// setting's switch. Shared by SeriesChart (bars, areas) and Treemap (tiles).
|
|
5
6
|
import { useCallback, useSyncExternalStore } from "react";
|
|
6
7
|
import { chartEdge } from "../theme/chart-palette";
|
|
7
8
|
import { parseHex } from "../theme/color";
|
|
@@ -71,3 +72,35 @@ export function useChartEdge(): (fill: string | undefined) => string | undefined
|
|
|
71
72
|
[snapshot],
|
|
72
73
|
);
|
|
73
74
|
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* How filled marks are parted — see `TreemapProps.edges` (0.51.6, keksdose dev #642).
|
|
78
|
+
* `"auto"`: `"uniform"` at Standard contrast, `"contrast"` while More contrast is in force.
|
|
79
|
+
*/
|
|
80
|
+
export type ChartEdges = "auto" | "uniform" | "contrast";
|
|
81
|
+
|
|
82
|
+
// `<html data-contrast>`, followed live: what `"auto"` keys on. Read here rather than
|
|
83
|
+
// through theme/contrast, whose store would come into the chart entry with it.
|
|
84
|
+
function subscribeContrast(onChange: () => void): () => void {
|
|
85
|
+
if (typeof MutationObserver === "undefined" || typeof document === "undefined") return () => {};
|
|
86
|
+
const observer = new MutationObserver(onChange);
|
|
87
|
+
observer.observe(document.documentElement, { attributes: true, attributeFilter: ["data-contrast"] });
|
|
88
|
+
return () => observer.disconnect();
|
|
89
|
+
}
|
|
90
|
+
const readMoreContrast = () =>
|
|
91
|
+
typeof document !== "undefined" && document.documentElement.getAttribute("data-contrast") === "more";
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The edges a filled mark draws: `"auto"` resolved against the contrast in force, live.
|
|
95
|
+
*
|
|
96
|
+
* Under `"contrast"` a mark whose hue is under 3:1 against the ground gets the 1px ink
|
|
97
|
+
* edge ({@link useChartEdge}); under `"uniform"` none does. The tiles took this rule in
|
|
98
|
+
* 0.51.6 (#642: "The borders do not look nice when changing from tile to tile"), and
|
|
99
|
+
* SeriesChart's bars and areas in 0.52 (refactor audit 2026-10-30, DSP-18, Marcel's
|
|
100
|
+
* decision 3): at Standard contrast the edge fell on 5 of 8 hues in light, and in dark on
|
|
101
|
+
* chart-5 and chart-7 alone — the same unevenness, in a bar chart.
|
|
102
|
+
*/
|
|
103
|
+
export function useEdgesInForce(edges: ChartEdges = "auto"): "uniform" | "contrast" {
|
|
104
|
+
const more = useSyncExternalStore(subscribeContrast, readMoreContrast, () => false);
|
|
105
|
+
return edges === "auto" ? (more ? "contrast" : "uniform") : edges;
|
|
106
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// A chart's accessible description — internal, not exported from the barrel.
|
|
2
|
+
//
|
|
3
|
+
// A chart is a `role="figure"` named by its `aria-label` and described by a sentence of
|
|
4
|
+
// what it shows (0.52, refactor audit 2026-10-30, DSP-5). SeriesChart and Treemap each
|
|
5
|
+
// built the `hidden` sentence and the `aria-describedby` that points at it, and already
|
|
6
|
+
// differed: Treemap kept a caller's own ids, SeriesChart had none to keep. Both put the
|
|
7
|
+
// sentence AFTER the figure, as its sibling, so the chart stopped being its parent's last
|
|
8
|
+
// child and a stack's `space-y-*` or `divide-y` gave it a margin or a rule underneath (0.52
|
|
9
|
+
// code review, deep, charts, findings 7 and 14). One copy now, rendered inside the root.
|
|
10
|
+
import { useId, type ReactNode } from "react";
|
|
11
|
+
|
|
12
|
+
export interface FigureDescription {
|
|
13
|
+
/** The root's `aria-describedby`: the caller's own ids, then the description's. */
|
|
14
|
+
describedBy: string | undefined;
|
|
15
|
+
/** The description, to render INSIDE the root; `null` when there is none. */
|
|
16
|
+
node: ReactNode;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The description of a figure, and the `aria-describedby` that reads it — after the
|
|
21
|
+
* caller's own ids (`describedBy`), which it keeps. The sentence is `hidden`: it is read
|
|
22
|
+
* through the reference, never a second time in browse mode, and takes no room.
|
|
23
|
+
*/
|
|
24
|
+
export function useFigureDescription(description: string | undefined, describedBy?: string): FigureDescription {
|
|
25
|
+
const id = useId();
|
|
26
|
+
if (!description) return { describedBy, node: null };
|
|
27
|
+
return {
|
|
28
|
+
describedBy: describedBy ? `${describedBy} ${id}` : id,
|
|
29
|
+
node: (
|
|
30
|
+
<span id={id} hidden>
|
|
31
|
+
{description}
|
|
32
|
+
</span>
|
|
33
|
+
),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -466,7 +466,6 @@ export function withChartZoom<P extends ZoomTarget>(Chart: ComponentType<P>) {
|
|
|
466
466
|
<ZoomLayer
|
|
467
467
|
axisIds={axes.map((axis) => axis.id)}
|
|
468
468
|
only={only}
|
|
469
|
-
label={labels.zoomHint}
|
|
470
469
|
onZoom={(selection) => {
|
|
471
470
|
const next = zoomAfter(state, selection, source);
|
|
472
471
|
if (next.x !== xWindow) setXWindow(next.x);
|
|
@@ -506,17 +505,20 @@ export function withChartZoom<P extends ZoomTarget>(Chart: ComponentType<P>) {
|
|
|
506
505
|
* A transparent rectangle over the plot area that reads the drag. It does NOT stop the
|
|
507
506
|
* event: recharts drives its tooltip from the same pointer move bubbling up to its own
|
|
508
507
|
* wrapper, so swallowing it here would trade the tooltip for the zoom.
|
|
508
|
+
*
|
|
509
|
+
* Nothing to assistive technology (0.52, refactor audit 2026-10-30, DSP-5): it was a
|
|
510
|
+
* `role="application"` named by the drag hint, which could not take focus — the one name
|
|
511
|
+
* on an otherwise unnamed chart. The hint is in the chart's description now
|
|
512
|
+
* (`SeriesChart`'s figure), and `data-zoom-surface` is how a test finds the rect.
|
|
509
513
|
*/
|
|
510
514
|
function ZoomLayer({
|
|
511
515
|
axisIds,
|
|
512
516
|
only,
|
|
513
|
-
label,
|
|
514
517
|
onZoom,
|
|
515
518
|
onReset,
|
|
516
519
|
}: {
|
|
517
520
|
axisIds: string[];
|
|
518
521
|
only?: "x" | "y";
|
|
519
|
-
label: string;
|
|
520
522
|
onZoom: (selection: ZoomSelection) => void;
|
|
521
523
|
onReset: () => void;
|
|
522
524
|
}) {
|
|
@@ -578,8 +580,7 @@ function ZoomLayer({
|
|
|
578
580
|
height={plot.height}
|
|
579
581
|
// `transparent`, not `none`: an unpainted shape takes no pointer events.
|
|
580
582
|
fill="transparent"
|
|
581
|
-
|
|
582
|
-
aria-label={label}
|
|
583
|
+
data-zoom-surface=""
|
|
583
584
|
style={{ cursor: "crosshair" }}
|
|
584
585
|
onPointerDown={(event) => {
|
|
585
586
|
if (event.button !== 0) return;
|