@eifi1/ui-kit 0.51.7 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -67
- package/dist/account/account-parts.d.ts +10 -8
- package/dist/account/account-parts.js +1 -18
- package/dist/account/account-parts.js.map +1 -1
- package/dist/account/data-export-setting-labels.js +1 -1
- package/dist/account/data-export-setting-labels.js.map +1 -1
- package/dist/account/delete-account-setting-labels.js +1 -1
- package/dist/account/delete-account-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting-labels.js +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/passkeys-setting.d.ts +9 -2
- package/dist/account/passkeys-setting.js +41 -29
- package/dist/account/passkeys-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +3 -2
- package/dist/account/sessions-setting.js +10 -8
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.js +1 -3
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +6 -3
- package/dist/admin/admin-parts.js +6 -21
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/mail-test-card-labels.js +1 -1
- package/dist/admin/mail-test-card-labels.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -2
- package/dist/admin/plan-change-labels.js +1 -17
- package/dist/admin/plan-change-labels.js.map +1 -1
- package/dist/admin/plan-change.d.ts +3 -42
- package/dist/admin/plan-change.js +1 -1
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +3 -3
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/auth/auth-errors-labels.d.ts +11 -0
- package/dist/auth/auth-errors-labels.js +13 -0
- package/dist/auth/auth-errors-labels.js.map +1 -0
- package/dist/auth/auth-errors.d.ts +7 -23
- package/dist/auth/auth-errors.js +2 -15
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.js +2 -1
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/forgot-password-form-labels.js +1 -1
- package/dist/auth/forgot-password-form-labels.js.map +1 -1
- package/dist/auth/forgot-password-form.js +7 -2
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form-labels.js +1 -1
- package/dist/auth/register-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form-labels.js +1 -1
- package/dist/auth/reset-password-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form.js +5 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.js +1 -1
- package/dist/auth/sign-in-form-labels.js.map +1 -1
- package/dist/auth/status-parts.d.ts +0 -3
- package/dist/auth/status-parts.js +0 -4
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.js +1 -1
- package/dist/auth/verify-email-labels.js.map +1 -1
- package/dist/auth/verify-email.js +7 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/cancel-subscription.d.ts +10 -7
- package/dist/billing/cancel-subscription.js +6 -6
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/plan-card.d.ts +5 -3
- package/dist/billing/plan-card.js +7 -8
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-change-labels.d.ts +42 -0
- package/dist/billing/plan-change-labels.js +22 -0
- package/dist/billing/plan-change-labels.js.map +1 -0
- package/dist/billing/plan-switch.d.ts +9 -6
- package/dist/billing/plan-switch.js +7 -5
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +4 -3
- package/dist/chart.js +72 -4
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips.d.ts +5 -5
- package/dist/components/account-chips.js +11 -13
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +16 -5
- package/dist/components/alert-banner.js +46 -1
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +13 -0
- package/dist/components/amount-input.js +1 -0
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +57 -65
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.d.ts +12 -2
- package/dist/components/bulk-action-bar.js +65 -21
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-look.d.ts +5 -5
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/chart-edge.d.ts +16 -0
- package/dist/components/chart-edge.js +14 -1
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-figure.d.ts +13 -0
- package/dist/components/chart-figure.js +15 -0
- package/dist/components/chart-figure.js.map +1 -0
- package/dist/components/chart-zoom-core.js +1 -4
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +8 -1
- package/dist/components/chart.js +19 -10
- package/dist/components/chart.js.map +1 -1
- package/dist/components/combobox-core.d.ts +111 -2
- package/dist/components/combobox-core.js +148 -42
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +141 -130
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/copy-button.d.ts +6 -5
- package/dist/components/copy-button.js +5 -3
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.js +2 -2
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +1 -1
- package/dist/components/data-table-column-settings.js +33 -7
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +4 -2
- package/dist/components/data-table-filters.js +2 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +6 -4
- package/dist/components/data-table-fit.js +4 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.d.ts +1 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.d.ts +1 -1
- package/dist/components/data-table-head.js +15 -12
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +12 -7
- package/dist/components/data-table-mobile.js +43 -30
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js +11 -6
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +2 -2
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.d.ts +6 -2
- package/dist/components/data-table-row.js +17 -10
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-selection.d.ts +1 -1
- package/dist/components/data-table-selection.js.map +1 -1
- package/dist/components/data-table-shared.d.ts +10 -2
- package/dist/components/data-table-shared.js +18 -0
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.d.ts +21 -2
- package/dist/components/data-table-sort.js +24 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.d.ts +1 -1
- package/dist/components/data-table-virtual.js +18 -6
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.d.ts +13 -4
- package/dist/components/data-table.js +139 -36
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +25 -3
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +16 -3
- package/dist/components/date-picker.js +55 -26
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +38 -24
- package/dist/components/date-range-picker.js +23 -7
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/error-boundary.js +37 -30
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
- package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
- package/dist/components/field-base-labels.js.map +1 -0
- package/dist/components/field-base.d.ts +4 -3
- package/dist/components/field-base.js +3 -3
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/form-actions.js +11 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.d.ts +3 -0
- package/dist/components/hover-menu.js +5 -3
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +14 -9
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.d.ts +43 -0
- package/dist/components/inline-confirm.js +67 -0
- package/dist/components/inline-confirm.js.map +1 -0
- package/dist/components/inline-entity-combobox.d.ts +4 -3
- package/dist/components/inline-entity-combobox.js +148 -140
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +28 -112
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-page.d.ts +3 -1
- package/dist/components/legal-page.js +3 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +4 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.d.ts +2 -2
- package/dist/components/lightbox.js +17 -6
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/list.d.ts +6 -2
- package/dist/components/list.js +3 -2
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.d.ts +1 -1
- package/dist/components/measured-grid.js +2 -1
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/mini-calendar.js +3 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.js +3 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-grid.d.ts +55 -0
- package/dist/components/month-grid.js +148 -0
- package/dist/components/month-grid.js.map +1 -0
- package/dist/components/month-picker.d.ts +36 -4
- package/dist/components/month-picker.js +123 -146
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-select.d.ts +2 -2
- package/dist/components/multi-select.js +11 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/nav-pills.d.ts +1 -1
- package/dist/components/nav-pills.js.map +1 -1
- package/dist/components/picker-sheet.js +2 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +7 -0
- package/dist/components/pie-chart-labels.js +1 -0
- package/dist/components/pie-chart-labels.js.map +1 -1
- package/dist/components/pie-chart.d.ts +5 -3
- package/dist/components/pie-chart.js +7 -22
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.d.ts +3 -0
- package/dist/components/popover.js +7 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/row-actions.js +2 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +4 -4
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +7 -4
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +92 -23
- package/dist/components/series-chart.js +74 -30
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/share-card.js +3 -3
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/tabs-labels.d.ts +2 -0
- package/dist/components/tabs-labels.js +11 -0
- package/dist/components/tabs-labels.js.map +1 -0
- package/dist/components/tabs.d.ts +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +2 -2
- package/dist/components/toggle-legend.js +6 -6
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -2
- package/dist/components/translation-review-editor.js +2 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review.d.ts +2 -1
- package/dist/components/translation-review.js +2 -2
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +31 -0
- package/dist/components/treemap-labels.js +10 -0
- package/dist/components/treemap-labels.js.map +1 -0
- package/dist/components/treemap-layout.d.ts +62 -0
- package/dist/components/treemap-layout.js +126 -0
- package/dist/components/treemap-layout.js.map +1 -0
- package/dist/components/treemap.d.ts +167 -19
- package/dist/components/treemap.js +340 -100
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/use-table-state.d.ts +5 -5
- package/dist/components/use-table-state.js +4 -1
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +1 -2
- package/dist/data-table.js +1 -4
- package/dist/data-table.js.map +1 -1
- package/dist/demo/demo-countdown.d.ts +0 -5
- package/dist/demo/demo-countdown.js +0 -4
- package/dist/demo/demo-countdown.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +36 -7
- package/dist/eslint/role-utilities.js +42 -9
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +25 -16
- package/dist/feedback/feedback-dialog.js +6 -2
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-mutation.d.ts +18 -0
- package/dist/feedback/feedback-mutation.js +8 -0
- package/dist/feedback/feedback-mutation.js.map +1 -0
- package/dist/feedback/feedback-page-link.d.ts +53 -0
- package/dist/feedback/feedback-page-link.js +37 -0
- package/dist/feedback/feedback-page-link.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +8 -4
- package/dist/feedback/feedback-public-list.js +2 -2
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-replies.d.ts +3 -1
- package/dist/feedback/feedback-replies.js +5 -4
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +0 -3
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +33 -44
- package/dist/feedback/feedback-row-detail.js +28 -34
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +17 -14
- package/dist/feedback/feedback-status-undo.js +10 -15
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
- package/dist/feedback/feedback-submit-dialog.js +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.js +9 -3
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +21 -9
- package/dist/feedback/feedback-table.js +45 -25
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +2 -2
- package/dist/feedback/feedback-thread-labels.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +15 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +6 -6
- package/dist/feedback.js +90 -6
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +35 -0
- package/dist/hooks/use-focus-trap.js +6 -4
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +5 -2
- package/dist/hooks/use-hotkey.js +5 -4
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-long-press.d.ts +7 -4
- package/dist/hooks/use-long-press.js +3 -0
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-media-query.js +12 -4
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-mounted.d.ts +22 -0
- package/dist/hooks/use-mounted.js +24 -0
- package/dist/hooks/use-mounted.js.map +1 -0
- package/dist/hooks/use-overlay-history.js +19 -3
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +4 -9
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -18
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -11
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +15 -64
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -18
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -27
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -18
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -19
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -18
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +12 -2
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js +0 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +21 -23
- package/dist/index.js +50 -65
- package/dist/index.js.map +1 -1
- package/dist/landing/routing.d.ts +3 -1
- package/dist/landing/routing.js +4 -7
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/broadcast.d.ts +17 -0
- package/dist/lib/broadcast.js +30 -0
- package/dist/lib/broadcast.js.map +1 -0
- package/dist/lib/date-format.d.ts +37 -2
- package/dist/lib/date-format.js +34 -8
- package/dist/lib/date-format.js.map +1 -1
- package/dist/lib/day-format.d.ts +46 -0
- package/dist/lib/day-format.js +46 -0
- package/dist/lib/day-format.js.map +1 -0
- package/dist/lib/describe-failure.d.ts +14 -0
- package/dist/lib/describe-failure.js +9 -0
- package/dist/lib/describe-failure.js.map +1 -0
- package/dist/lib/direction.d.ts +16 -0
- package/dist/lib/direction.js +9 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/focus-left.d.ts +63 -0
- package/dist/lib/focus-left.js +67 -0
- package/dist/lib/focus-left.js.map +1 -0
- package/dist/lib/format.js +5 -14
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/http-status.d.ts +24 -0
- package/dist/lib/http-status.js +14 -0
- package/dist/lib/http-status.js.map +1 -0
- package/dist/lib/intl-cache.d.ts +14 -0
- package/dist/lib/intl-cache.js +15 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/iso-day.d.ts +11 -0
- package/dist/lib/iso-day.js +8 -0
- package/dist/lib/iso-day.js.map +1 -0
- package/dist/lib/lazy-with-fallback.d.ts +31 -0
- package/dist/lib/lazy-with-fallback.js +40 -0
- package/dist/lib/lazy-with-fallback.js.map +1 -0
- package/dist/lib/path-pattern.d.ts +34 -0
- package/dist/lib/path-pattern.js +24 -0
- package/dist/lib/path-pattern.js.map +1 -0
- package/dist/lib/reduced-motion.d.ts +2 -1
- package/dist/lib/reduced-motion.js.map +1 -1
- package/dist/lib/round.d.ts +2 -1
- package/dist/lib/round.js +2 -1
- package/dist/lib/round.js.map +1 -1
- package/dist/lib/safe-storage.d.ts +24 -5
- package/dist/lib/safe-storage.js +27 -2
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/session-refresh.js +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/share-format.d.ts +13 -0
- package/dist/lib/share-format.js +10 -0
- package/dist/lib/share-format.js.map +1 -0
- package/dist/lib/text-case.d.ts +17 -0
- package/dist/lib/text-case.js +8 -0
- package/dist/lib/text-case.js.map +1 -0
- package/dist/lib/text-match.d.ts +29 -0
- package/dist/lib/text-match.js +20 -2
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/thenable.d.ts +13 -0
- package/dist/lib/thenable.js +8 -0
- package/dist/lib/thenable.js.map +1 -0
- package/dist/lib/translation-review.d.ts +7 -2
- package/dist/lib/translation-review.js +4 -4
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/device-zone-report.js +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +2 -1
- package/dist/notifications/notification-bell.js +3 -3
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +10 -6
- package/dist/notifications/notification-inbox.js +26 -48
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.d.ts +3 -2
- package/dist/notifications/notification-parts.js +1 -3
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.d.ts +6 -0
- package/dist/notifications/notifications-labels.js +1 -0
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +1 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.d.ts +2 -1
- package/dist/notifications/push-devices-setting.js +27 -49
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +10 -3
- package/dist/notifications/quiet-hours-setting.js +65 -26
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/unsubscribe-panel.js +4 -7
- package/dist/notifications/unsubscribe-panel.js.map +1 -1
- package/dist/notifications/use-push-device.d.ts +39 -1
- package/dist/notifications/use-push-device.js +28 -7
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/query-persistence.d.ts +3 -1
- package/dist/offline/query-persistence.js +19 -2
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/rhf/fields.d.ts +11 -4
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/command-palette.js +1 -1
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +19 -9
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/search-index.d.ts +0 -6
- package/dist/search/search-index.js +0 -4
- package/dist/search/search-index.js.map +1 -1
- package/dist/search/use-command-key.d.ts +12 -1
- package/dist/search/use-command-key.js +3 -12
- package/dist/search/use-command-key.js.map +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.js +6 -1
- package/dist/search.js.map +1 -1
- package/dist/settings/use-settings-focus.js +1 -0
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +5 -3
- package/dist/shell/account-menu-language.js +2 -2
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +9 -6
- package/dist/shell/account-menu-text-size.js +2 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/app-shell.d.ts +0 -10
- package/dist/shell/app-shell.js +1 -7
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/company-switcher.d.ts +1 -1
- package/dist/shell/company-switcher.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/top-bar-actions.d.ts +1 -1
- package/dist/shell/top-bar-actions.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +1 -3
- package/dist/shell/top-bar-parts-labels.js +0 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +7 -10
- package/dist/shell.js +14 -23
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +30 -4
- package/dist/sync/engine.js +172 -52
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +2 -2
- package/dist/sync.js +2 -10
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js +3 -8
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +0 -5
- package/dist/theme/chart-palette.js +0 -2
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -1
- package/dist/theme/contrast.js +3 -8
- package/dist/theme/contrast.js.map +1 -1
- package/dist/theme/palette-store.js +6 -6
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js +3 -8
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +3 -6
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.d.ts +7 -4
- package/dist/tour/tour-catalogue.js +12 -10
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.d.ts +0 -2
- package/dist/tour/tour-dock.js +0 -2
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-gates.d.ts +4 -0
- package/dist/tour/tour-gates.js +14 -0
- package/dist/tour/tour-gates.js.map +1 -1
- package/dist/tour/tour-overlay.d.ts +27 -0
- package/dist/tour/tour-overlay.js +741 -0
- package/dist/tour/tour-overlay.js.map +1 -0
- package/dist/tour/tour.d.ts +13 -3
- package/dist/tour/tour.js +59 -781
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +6 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +3 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.d.ts +3 -1
- package/dist/wizard/validation.js.map +1 -1
- package/package.json +10 -6
- package/src/account/account-parts.ts +5 -25
- package/src/account/data-export-setting-labels.ts +1 -1
- package/src/account/delete-account-setting-labels.ts +1 -1
- package/src/account/email-change-setting-labels.ts +1 -1
- package/src/account/passkeys-setting.tsx +60 -38
- package/src/account/sessions-setting.tsx +18 -12
- package/src/admin/admin-action-confirm.tsx +1 -5
- package/src/admin/admin-parts.ts +11 -25
- package/src/admin/mail-test-card-labels.ts +1 -1
- package/src/admin/plan-change-labels.ts +5 -23
- package/src/admin/plan-change.tsx +7 -44
- package/src/admin/reviewer-scope-editor.tsx +3 -3
- package/src/auth/auth-errors-labels.ts +23 -0
- package/src/auth/auth-errors.ts +11 -38
- package/src/auth/complete-name-dialog.tsx +4 -1
- package/src/auth/forgot-password-form-labels.ts +1 -1
- package/src/auth/forgot-password-form.tsx +11 -6
- package/src/auth/register-form-labels.ts +1 -1
- package/src/auth/reset-password-form-labels.ts +1 -1
- package/src/auth/reset-password-form.tsx +8 -4
- package/src/auth/sign-in-form-labels.ts +1 -1
- package/src/auth/status-parts.tsx +0 -6
- package/src/auth/verify-email-labels.ts +1 -1
- package/src/auth/verify-email.tsx +11 -6
- package/src/billing/cancel-subscription.tsx +15 -12
- package/src/billing/plan-card.tsx +18 -10
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +15 -12
- package/src/chart.ts +73 -6
- package/src/components/account-chips.tsx +20 -23
- package/src/components/alert-banner.tsx +82 -5
- package/src/components/amount-input.tsx +18 -7
- package/src/components/autocomplete.tsx +64 -70
- package/src/components/bulk-action-bar.tsx +70 -2
- package/src/components/button-look.ts +5 -5
- package/src/components/button.tsx +2 -2
- package/src/components/chart-edge.ts +34 -1
- package/src/components/chart-figure.tsx +35 -0
- package/src/components/chart-zoom-core.tsx +6 -5
- package/src/components/chart.tsx +26 -5
- package/src/components/combobox-core.tsx +293 -62
- package/src/components/combobox.tsx +183 -153
- package/src/components/copy-button.tsx +34 -23
- package/src/components/country-select.tsx +16 -11
- package/src/components/data-table-column-settings.tsx +52 -10
- package/src/components/data-table-filters.ts +6 -4
- package/src/components/data-table-fit.ts +19 -5
- package/src/components/data-table-groups.tsx +1 -1
- package/src/components/data-table-head.tsx +32 -22
- package/src/components/data-table-mobile.tsx +61 -26
- package/src/components/data-table-pagination.tsx +21 -6
- package/src/components/data-table-resize.ts +1 -1
- package/src/components/data-table-row-actions.tsx +3 -3
- package/src/components/data-table-row.tsx +25 -14
- package/src/components/data-table-selection.ts +1 -1
- package/src/components/data-table-shared.tsx +33 -1
- package/src/components/data-table-sort.ts +57 -2
- package/src/components/data-table-virtual.ts +32 -8
- package/src/components/data-table.tsx +239 -68
- package/src/components/date-field.tsx +66 -9
- package/src/components/date-picker.tsx +125 -49
- package/src/components/date-range-picker.tsx +71 -36
- package/src/components/error-boundary.tsx +53 -39
- package/src/components/field-base-labels.ts +20 -0
- package/src/components/field-base.tsx +13 -7
- package/src/components/form-actions.tsx +20 -5
- package/src/components/hover-menu.tsx +18 -8
- package/src/components/icon-button.tsx +14 -9
- package/src/components/inline-confirm.tsx +116 -0
- package/src/components/inline-entity-combobox.tsx +197 -153
- package/src/components/input.tsx +1 -1
- package/src/components/jump-calendar.tsx +30 -146
- package/src/components/legal-page.tsx +10 -7
- package/src/components/legal.tsx +4 -2
- package/src/components/lightbox.tsx +21 -8
- package/src/components/list.tsx +10 -4
- package/src/components/measured-grid.tsx +8 -4
- package/src/components/mini-calendar.tsx +6 -5
- package/src/components/modal.tsx +6 -1
- package/src/components/month-grid.tsx +229 -0
- package/src/components/month-picker.tsx +192 -200
- package/src/components/multi-select.tsx +21 -9
- package/src/components/nav-pills.tsx +1 -1
- package/src/components/picker-sheet.tsx +12 -9
- package/src/components/pie-chart-labels.ts +8 -0
- package/src/components/pie-chart.tsx +22 -28
- package/src/components/popover.tsx +18 -1
- package/src/components/row-actions.tsx +2 -1
- package/src/components/series-chart-axes.ts +9 -4
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +253 -87
- package/src/components/share-card.tsx +6 -6
- package/src/components/tabs-labels.ts +13 -0
- package/src/components/tabs.tsx +2 -2
- package/src/components/toggle-legend.tsx +16 -11
- package/src/components/translation-review-editor.tsx +6 -5
- package/src/components/translation-review.tsx +4 -3
- package/src/components/treemap-labels.ts +47 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +780 -138
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +1 -4
- package/src/demo/demo-countdown.ts +3 -8
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +20 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +13 -7
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +0 -3
- package/src/feedback/feedback-row-detail.tsx +70 -84
- package/src/feedback/feedback-status-undo.ts +28 -28
- package/src/feedback/feedback-submit-dialog.tsx +2 -2
- package/src/feedback/feedback-submit.tsx +21 -7
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table.tsx +86 -38
- package/src/feedback/feedback-thread-labels.ts +2 -2
- package/src/feedback/feedback-thread.tsx +18 -26
- package/src/feedback.ts +89 -6
- package/src/hooks/use-focus-trap.ts +8 -24
- package/src/hooks/use-hotkey.ts +24 -7
- package/src/hooks/use-long-press.ts +16 -2
- package/src/hooks/use-media-query.ts +20 -4
- package/src/hooks/use-mounted.ts +39 -0
- package/src/hooks/use-overlay-history.ts +32 -3
- package/src/i18n/defaults.ts +4 -9
- package/src/i18n/german.ts +8 -19
- package/src/i18n/kit-labels.tsx +9 -11
- package/src/i18n/locales/es.ts +8 -19
- package/src/i18n/locales/fr.ts +21 -30
- package/src/i18n/locales/hu.ts +10 -19
- package/src/i18n/locales/it.ts +8 -20
- package/src/i18n/locales/zh.ts +9 -19
- package/src/i18n/review.ts +12 -2
- package/src/i18n/shared-labels.ts +0 -1
- package/src/index.ts +57 -49
- package/src/landing/routing.tsx +14 -10
- package/src/lib/broadcast.ts +52 -0
- package/src/lib/date-format.ts +89 -13
- package/src/lib/day-format.ts +96 -0
- package/src/lib/describe-failure.ts +18 -0
- package/src/lib/direction.ts +39 -0
- package/src/lib/focus-left.ts +156 -0
- package/src/lib/format.ts +5 -17
- package/src/lib/http-status.ts +38 -0
- package/src/lib/intl-cache.ts +25 -0
- package/src/lib/iso-day.ts +13 -0
- package/src/lib/lazy-with-fallback.ts +82 -0
- package/src/lib/path-pattern.ts +55 -0
- package/src/lib/reduced-motion.ts +2 -1
- package/src/lib/round.ts +7 -2
- package/src/lib/safe-storage.ts +48 -6
- package/src/lib/session-refresh.ts +1 -1
- package/src/lib/share-format.ts +18 -0
- package/src/lib/text-case.ts +19 -0
- package/src/lib/text-match.ts +57 -2
- package/src/lib/thenable.ts +19 -0
- package/src/lib/translation-review.ts +13 -5
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-bell.tsx +7 -4
- package/src/notifications/notification-inbox.tsx +40 -58
- package/src/notifications/notification-parts.tsx +3 -4
- package/src/notifications/notification-types-setting.tsx +1 -1
- package/src/notifications/notifications-labels.ts +7 -0
- package/src/notifications/push-device-setting.tsx +1 -1
- package/src/notifications/push-devices-setting.tsx +30 -55
- package/src/notifications/quiet-hours-setting.tsx +93 -31
- package/src/notifications/unsubscribe-panel.tsx +4 -7
- package/src/notifications/use-push-device.ts +76 -10
- package/src/offline/query-persistence.ts +35 -3
- package/src/rhf/fields.tsx +11 -4
- package/src/search/command-palette.tsx +2 -4
- package/src/search/global-search.tsx +36 -15
- package/src/search/search-index.ts +0 -15
- package/src/search/use-command-key.ts +13 -12
- package/src/search.ts +10 -1
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +6 -4
- package/src/shell/account-menu-text-size.tsx +10 -7
- package/src/shell/app-shell.tsx +0 -13
- package/src/shell/company-switcher.tsx +1 -1
- package/src/shell/dev-menu.tsx +8 -22
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +1 -4
- package/src/shell.ts +21 -17
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +2 -8
- package/src/testing/css-variables.ts +8 -9
- package/src/theme/chart-palette.ts +0 -2
- package/src/theme/contrast.ts +8 -9
- package/src/theme/palette-store.ts +9 -9
- package/src/theme/text-size.ts +6 -8
- package/src/theme/theme-store.ts +7 -9
- package/src/tour/tour-catalogue.tsx +26 -15
- package/src/tour/tour-dock.ts +0 -2
- package/src/tour/tour-gates.ts +23 -0
- package/src/tour/tour-overlay.tsx +1170 -0
- package/src/tour/tour.tsx +108 -1202
- package/src/tour/use-tour-progress.ts +1 -1
- package/src/wizard/stepper-nav.tsx +3 -1
- package/src/wizard/types.ts +11 -2
- package/src/wizard/use-wizard.ts +2 -1
- package/src/wizard/validation.ts +8 -2
- package/tokens.css +6 -5
- package/dist/components/field-sync-labels.d.ts +0 -2
- package/dist/components/field-sync-labels.js +0 -12
- package/dist/components/field-sync-labels.js.map +0 -1
- package/dist/components/field-sync.d.ts +0 -164
- package/dist/components/field-sync.js +0 -269
- package/dist/components/field-sync.js.map +0 -1
- package/dist/components/section-nav.d.ts +0 -37
- package/dist/components/section-nav.js +0 -33
- package/dist/components/section-nav.js.map +0 -1
- package/dist/components/sign-chip-labels.d.ts +0 -2
- package/dist/components/sign-chip-labels.js +0 -11
- package/dist/components/sign-chip-labels.js.map +0 -1
- package/dist/components/sign-chip.d.ts +0 -68
- package/dist/components/sign-chip.js +0 -47
- package/dist/components/sign-chip.js.map +0 -1
- package/dist/components/ui-labels.js.map +0 -1
- package/dist/lib/isin.d.ts +0 -28
- package/dist/lib/isin.js +0 -36
- package/dist/lib/isin.js.map +0 -1
- package/dist/shell/dev-switchers.d.ts +0 -6
- package/dist/shell/dev-switchers.js +0 -12
- package/dist/shell/dev-switchers.js.map +0 -1
- package/dist/shell/role-switcher.d.ts +0 -21
- package/dist/shell/role-switcher.js +0 -31
- package/dist/shell/role-switcher.js.map +0 -1
- package/src/components/field-sync-labels.ts +0 -13
- package/src/components/field-sync.tsx +0 -482
- package/src/components/section-nav.tsx +0 -65
- package/src/components/sign-chip-labels.ts +0 -12
- package/src/components/sign-chip.tsx +0 -124
- package/src/components/ui-labels.ts +0 -24
- package/src/lib/isin.ts +0 -62
- package/src/shell/dev-switchers.tsx +0 -18
- package/src/shell/role-switcher.tsx +0 -46
|
@@ -57,6 +57,8 @@ import {
|
|
|
57
57
|
type BarShapeProps,
|
|
58
58
|
} from "recharts";
|
|
59
59
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, type ChartConfig } from "./chart";
|
|
60
|
+
import { useFigureDescription } from "./chart-figure";
|
|
61
|
+
import { rovingTarget } from "../lib/direction";
|
|
60
62
|
import {
|
|
61
63
|
DEFAULT_Y_AXIS,
|
|
62
64
|
axisExtent,
|
|
@@ -123,11 +125,18 @@ import {
|
|
|
123
125
|
import { useBreakpoint } from "../hooks/use-breakpoint";
|
|
124
126
|
import { useTextSize } from "../theme/text-size";
|
|
125
127
|
import { chartHeightProps, type ChartHeight } from "./chart-height";
|
|
126
|
-
import { useChartEdge } from "./chart-edge";
|
|
128
|
+
import { useChartEdge, useEdgesInForce } from "./chart-edge";
|
|
127
129
|
import { cn } from "../lib/cn";
|
|
128
130
|
import { formatWithMinus } from "../lib/minus";
|
|
129
131
|
|
|
130
|
-
|
|
132
|
+
/**
|
|
133
|
+
* One line, area or bar run of a {@link SeriesChart}.
|
|
134
|
+
*
|
|
135
|
+
* `TRow` is the chart's row type (0.53, keksdose after 0.52), and only `dot` reads it: its
|
|
136
|
+
* `point.row` is that type. Without a type argument a series is what it was, and a chart
|
|
137
|
+
* of typed rows still takes it — see {@link SeriesChartProps}.
|
|
138
|
+
*/
|
|
139
|
+
export interface SeriesChartSeries<TRow extends object = object> {
|
|
131
140
|
/** The row key this line reads — and the `--color-<key>` it is painted with, so it
|
|
132
141
|
* must be a CSS identifier. Build keys out of data with {@link seriesKey}. */
|
|
133
142
|
key: string;
|
|
@@ -175,8 +184,9 @@ export interface SeriesChartSeries {
|
|
|
175
184
|
* point: `true` for the default dot, `false`/`null` for none, or any SVG node drawn
|
|
176
185
|
* as-is at `point.cx`/`point.cy` — a buy/sell marker on keksdose's paper price.
|
|
177
186
|
* Never called for a point with no value. Bars have no points, and ignore it.
|
|
187
|
+
* `point.row` is the caller's own row, typed as the chart's rows are (0.53).
|
|
178
188
|
*/
|
|
179
|
-
dot?: boolean | ((point: SeriesChartPoint) => ReactNode);
|
|
189
|
+
dot?: boolean | ((point: SeriesChartPoint<TRow>) => ReactNode);
|
|
180
190
|
/** Line (or area outline) weight in px. Default 2, or 1.5 for a `step`. keksdose
|
|
181
191
|
* draws the subject of a chart at 2.5 and the reference it is read against at 1.5. */
|
|
182
192
|
strokeWidth?: number;
|
|
@@ -211,14 +221,16 @@ export interface SeriesChartSeries {
|
|
|
211
221
|
/** What a series draws. See {@link SeriesChartSeries.type}. */
|
|
212
222
|
export type SeriesChartType = "line" | "bar" | "area";
|
|
213
223
|
|
|
214
|
-
/** One point of a series, as a `dot` function is handed it.
|
|
215
|
-
|
|
224
|
+
/** One point of a series, as a `dot` function is handed it. `TRow` is the chart's row
|
|
225
|
+
* type (0.53); without one, `row` is a {@link SeriesChartRow}, as before. */
|
|
226
|
+
export interface SeriesChartPoint<TRow extends object = object> {
|
|
216
227
|
/** The series' key. */
|
|
217
228
|
key: string;
|
|
218
229
|
/** The row's position in `rows`. */
|
|
219
230
|
index: number;
|
|
220
|
-
/** The caller's own row, with everything the chart did not plot still in it
|
|
221
|
-
|
|
231
|
+
/** The caller's own row, with everything the chart did not plot still in it: the very
|
|
232
|
+
* object in `rows`, typed as `rows` is. */
|
|
233
|
+
row: SeriesChartRowOf<TRow>;
|
|
222
234
|
/** The abscissa in the caller's terms: the number, the category, or (time) a Date. */
|
|
223
235
|
x: SeriesChartXValue;
|
|
224
236
|
value: number;
|
|
@@ -231,9 +243,32 @@ export interface SeriesChartPoint {
|
|
|
231
243
|
|
|
232
244
|
/** A row of a series chart: one abscissa value and the series' values at it. Anything
|
|
233
245
|
* else in it (a raw ISO period for a drilldown) rides along untouched and is handed
|
|
234
|
-
* back in {@link SeriesChartPoint.row} and {@link SeriesChartHit.row}
|
|
246
|
+
* back in {@link SeriesChartPoint.row} and {@link SeriesChartHit.row} — typed as the
|
|
247
|
+
* caller's rows are since 0.53, and as this where their type names no keys. */
|
|
235
248
|
export type SeriesChartRow = Readonly<Record<string, unknown>>;
|
|
236
249
|
|
|
250
|
+
/**
|
|
251
|
+
* The row a hit or a point hands back, for a chart whose rows are `TRow[]` (0.53, keksdose
|
|
252
|
+
* after 0.52): `TRow` itself, so a drilldown reads `hit.row.rawPeriod` as the string it
|
|
253
|
+
* is. A {@link SeriesChartRow} where `TRow` names no keys — `object`, the default, which
|
|
254
|
+
* keeps `SeriesChartHit` and `SeriesChartPoint` without a type argument what they were, and
|
|
255
|
+
* the `object[]` rows an app passes today; `{}`; and `any` or `never` (`rows={[]}`), which
|
|
256
|
+
* are both assignable to `null` while no object type is.
|
|
257
|
+
*
|
|
258
|
+
* Both tests take `TRow` in the CHECKED position, never in the `extends` one, so TypeScript
|
|
259
|
+
* measures every type below as covariant in it (`SeriesChartSeries`, through `dot`'s
|
|
260
|
+
* parameter, contravariant) and relates two of them by their type arguments alone: a
|
|
261
|
+
* `SeriesChartHit<Month>` is a `SeriesChartHit`, and a handler or a series typed without an
|
|
262
|
+
* argument fits a chart of `Month` rows, though an interface has no index signature and is
|
|
263
|
+
* not, field by field, a `SeriesChartRow`. Written `object extends TRow ?`, the type is
|
|
264
|
+
* invariant and both of those stop type-checking.
|
|
265
|
+
*/
|
|
266
|
+
type SeriesChartRowOf<TRow> = [TRow] extends [null]
|
|
267
|
+
? SeriesChartRow
|
|
268
|
+
: [keyof TRow] extends [never]
|
|
269
|
+
? SeriesChartRow
|
|
270
|
+
: TRow;
|
|
271
|
+
|
|
237
272
|
/** An abscissa value: a number (`x.type: "number"`), a category (a string, a number or
|
|
238
273
|
* a Date standing for a period), or a time (a Date, epoch ms or an ISO string). */
|
|
239
274
|
export type SeriesChartXValue = number | string | Date;
|
|
@@ -549,24 +584,44 @@ export interface SeriesChartMarker {
|
|
|
549
584
|
r?: number;
|
|
550
585
|
}
|
|
551
586
|
|
|
552
|
-
/** What a click on the plot picked.
|
|
553
|
-
|
|
587
|
+
/** What a click on the plot picked. `TRow` is the chart's row type (0.53); without one,
|
|
588
|
+
* `row` is a {@link SeriesChartRow}, as before. */
|
|
589
|
+
export interface SeriesChartHit<TRow extends object = object> {
|
|
554
590
|
/** The row's position in `rows`. */
|
|
555
591
|
index: number;
|
|
556
|
-
/** The caller's own row — with its `rawPeriod`, id or whatever the drilldown needs
|
|
557
|
-
|
|
592
|
+
/** The caller's own row — with its `rawPeriod`, id or whatever the drilldown needs: the
|
|
593
|
+
* very object in `rows`, typed as `rows` is, so it is read without a cast. */
|
|
594
|
+
row: SeriesChartRowOf<TRow>;
|
|
558
595
|
x: SeriesChartXValue;
|
|
559
596
|
/** The series, when the click landed ON a bar. A click anywhere else picks the slot
|
|
560
597
|
* (the period), not a series. */
|
|
561
598
|
key?: string;
|
|
562
599
|
}
|
|
563
600
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
601
|
+
/**
|
|
602
|
+
* The props of {@link SeriesChart} and {@link StaticSeriesChart}, for rows of type `TRow`.
|
|
603
|
+
*
|
|
604
|
+
* `TRow` is inferred from `rows` (0.53, keksdose after 0.52), and what the chart hands back
|
|
605
|
+
* — `hit.row` in `onPointClick`, `point.row` in a series' `dot` — is that type, so a
|
|
606
|
+
* drilldown reads its own fields without narrowing an `unknown`. Without a type argument,
|
|
607
|
+
* `SeriesChartProps` is what it was: any object is a row, and a row comes back as a
|
|
608
|
+
* {@link SeriesChartRow}. So is `ComponentProps<typeof SeriesChart>`, which reads the
|
|
609
|
+
* constraint, `object`. A series, a handler or a `dot` typed without an argument fits a
|
|
610
|
+
* chart of typed rows too.
|
|
611
|
+
*/
|
|
612
|
+
export interface SeriesChartProps<TRow extends object = object> {
|
|
613
|
+
/**
|
|
614
|
+
* One row per abscissa value. A missing key is a hole (see `connectNulls`).
|
|
615
|
+
*
|
|
616
|
+
* Any object (0.52, refactor audit 2026-10-30, API-2): an `interface` has no index
|
|
617
|
+
* signature, so a typed sweep did not fit `SeriesChartRow` and Kurvenschmiede cast its
|
|
618
|
+
* Ackermann rows `as unknown as Record<string, number>[]`. The chart reads the keys
|
|
619
|
+
* `series` and `x` name, and hands the row back typed as these are (0.53).
|
|
620
|
+
*/
|
|
621
|
+
rows: readonly TRow[];
|
|
622
|
+
series: readonly SeriesChartSeries<TRow>[];
|
|
568
623
|
/** Default: one untitled axis, `"y"`. */
|
|
569
|
-
axes?: SeriesChartAxis[];
|
|
624
|
+
axes?: readonly SeriesChartAxis[];
|
|
570
625
|
x?: SeriesChartX;
|
|
571
626
|
/** A value in the tooltip, where a number stands on its own and needs its unit.
|
|
572
627
|
* Default: `Intl.NumberFormat` in the kit's locale. */
|
|
@@ -598,11 +653,11 @@ export interface SeriesChartProps {
|
|
|
598
653
|
* as the curve twitching. Turn it on where series come and go by choice.
|
|
599
654
|
*/
|
|
600
655
|
animationMs?: number;
|
|
601
|
-
spans?: SeriesChartSpan[];
|
|
656
|
+
spans?: readonly SeriesChartSpan[];
|
|
602
657
|
/** Lines across the plot at one value. */
|
|
603
|
-
references?: SeriesChartReference[];
|
|
658
|
+
references?: readonly SeriesChartReference[];
|
|
604
659
|
/** Single labelled points. */
|
|
605
|
-
markers?: SeriesChartMarker[];
|
|
660
|
+
markers?: readonly SeriesChartMarker[];
|
|
606
661
|
/**
|
|
607
662
|
* Which axes a drag may zoom: `"both"`, `"x"`, `"y"` or `"none"`. Default: read off
|
|
608
663
|
* the marks — see `defaultZoomAxes` (lines both, areas x, bars none). An axis carrying
|
|
@@ -614,8 +669,12 @@ export interface SeriesChartProps {
|
|
|
614
669
|
* A click on the plot: the slot under the pointer, and the series when it landed on a
|
|
615
670
|
* bar. keksdose's drilldowns — a payee's month, a budget line, a spending category.
|
|
616
671
|
* A drag that zoomed is not a click.
|
|
672
|
+
*
|
|
673
|
+
* The keyboard's stops are there either way (0.52, DSP-5): one per bar, or per slot of
|
|
674
|
+
* a chart without bars, named "period — series: value", behind ONE tab stop. With this
|
|
675
|
+
* they are buttons that Enter and Space activate; without, images to read.
|
|
617
676
|
*/
|
|
618
|
-
onPointClick?: (hit: SeriesChartHit) => void;
|
|
677
|
+
onPointClick?: (hit: SeriesChartHit<TRow>) => void;
|
|
619
678
|
/** Where the tooltip may go: for a chart inside a scroll wrapper. See
|
|
620
679
|
* {@link SeriesChartTooltip}. */
|
|
621
680
|
tooltip?: SeriesChartTooltip;
|
|
@@ -662,6 +721,19 @@ export interface SeriesChartProps {
|
|
|
662
721
|
labels?: LabelOverride<SeriesChartLabels>;
|
|
663
722
|
/** BCP 47 tag for the default number formats. Default: the provider's. */
|
|
664
723
|
locale?: string;
|
|
724
|
+
/**
|
|
725
|
+
* The chart's name. The chart is a `role="figure"` (0.52, refactor audit 2026-10-30,
|
|
726
|
+
* DSP-5), and a figure is found and told apart by its name — "Net worth", "Load over
|
|
727
|
+
* travel". Its values are read stop by stop (see {@link SeriesChartProps.onPointClick}).
|
|
728
|
+
*/
|
|
729
|
+
"aria-label"?: string;
|
|
730
|
+
/**
|
|
731
|
+
* What the picture SHOWS, in a sentence — "Spending rose 12 % in May, led by rent." —
|
|
732
|
+
* the figure's accessible description: a line, an area and a ruler are nothing a screen
|
|
733
|
+
* reader can say. Followed, on a zoomable chart, by the drag gesture (`zoomHint`). Not
|
|
734
|
+
* drawn; a caption the eye should read too belongs in the page.
|
|
735
|
+
*/
|
|
736
|
+
description?: string;
|
|
665
737
|
/** Onto the chart's root (`ChartContainer`) — e.g. an app's own grid ink. */
|
|
666
738
|
className?: string;
|
|
667
739
|
/** The shortest bar drawn, in px, for every bar series that does not set its own
|
|
@@ -734,8 +806,10 @@ export interface SeriesLegendAxes {
|
|
|
734
806
|
* series whose axis is not drawn says the unit that axis would have: "Velocity (mm/s)"
|
|
735
807
|
* — see {@link SeriesChartAxis.unit}. Without them, the labels are as given.
|
|
736
808
|
*/
|
|
737
|
-
export function seriesLegendEntries(
|
|
738
|
-
|
|
809
|
+
export function seriesLegendEntries<TRow extends object>(
|
|
810
|
+
// Generic only so a typed list fits (0.53): `SeriesChartSeries<Month>` is not a
|
|
811
|
+
// `SeriesChartSeries`, whose `dot` would be handed rows that are not `Month`s.
|
|
812
|
+
series: readonly SeriesChartSeries<TRow>[],
|
|
739
813
|
{ axes, budgeted }: SeriesLegendAxes = {},
|
|
740
814
|
): LegendEntry[] {
|
|
741
815
|
const undrawn = new Map<string, string | undefined>();
|
|
@@ -778,9 +852,9 @@ const STEP_WIDTH = 1.5;
|
|
|
778
852
|
const BAR_RADIUS: [number, number, number, number] = [3, 3, 0, 0];
|
|
779
853
|
|
|
780
854
|
/**
|
|
781
|
-
* One keyboard stop
|
|
782
|
-
*
|
|
783
|
-
*
|
|
855
|
+
* One keyboard stop: a bar, or (a chart with no bars) a whole slot. `from`/`to` bound its
|
|
856
|
+
* slot on the plotted number line — half way to each neighbour, or to the edge of the
|
|
857
|
+
* window on show.
|
|
784
858
|
*/
|
|
785
859
|
interface PointStop {
|
|
786
860
|
index: number;
|
|
@@ -788,10 +862,21 @@ interface PointStop {
|
|
|
788
862
|
key?: string;
|
|
789
863
|
from: number;
|
|
790
864
|
to: number;
|
|
791
|
-
/** The accessible name: where it is and what it says.
|
|
792
|
-
|
|
865
|
+
/** The accessible name: where it is and what it says. Asked only of a stop that is
|
|
866
|
+
* drawn — see {@link ALL_STOPS_UP_TO}. */
|
|
867
|
+
name: () => string;
|
|
793
868
|
}
|
|
794
869
|
|
|
870
|
+
/**
|
|
871
|
+
* Up to this many stops, every one is drawn; past it, only the roving one, its two
|
|
872
|
+
* neighbours and the two ends (0.52, DSP-5) — every stop is still reached, by the arrows,
|
|
873
|
+
* Home and End. Since every chart has stops, a measurement chart has one per row:
|
|
874
|
+
* Kurvenschmiede draws 2000-row profiles (`maxRows`), and 2000 named `<rect>`s, each
|
|
875
|
+
* named through `Intl` on every render, are a DOM and an accessibility tree nobody walks
|
|
876
|
+
* one by one. A year of months, or of weeks, stays whole for browse mode.
|
|
877
|
+
*/
|
|
878
|
+
const ALL_STOPS_UP_TO = 100;
|
|
879
|
+
|
|
795
880
|
/**
|
|
796
881
|
* The shape of a series whose bar has keyboard focus: recharts' own rectangle, with an
|
|
797
882
|
* outline on the one bar at `index` — drawn at the bar's exact geometry, which an
|
|
@@ -853,23 +938,25 @@ function MarkerLabel({ viewBox, value }: { viewBox?: { x?: number; y?: number; w
|
|
|
853
938
|
}
|
|
854
939
|
|
|
855
940
|
/**
|
|
856
|
-
* The keyboard's way onto a
|
|
857
|
-
*
|
|
858
|
-
* where the x scale answers.
|
|
941
|
+
* The keyboard's way onto a chart: one focusable `<rect>` per bar, or per slot when there
|
|
942
|
+
* are no bars, laid over the plot INSIDE the recharts chart, where the x scale answers.
|
|
859
943
|
*
|
|
860
944
|
* keksdose drew its weekday pattern as seven real `<button>`s (spending-tab.tsx) because
|
|
861
945
|
* a recharts bar is reachable by nothing but the pointer. This is that, for every chart:
|
|
862
946
|
*
|
|
863
947
|
* - ONE tab stop (roving `tabIndex`): Tab moves past the chart, not through 30 bars.
|
|
864
948
|
* - ←/→ step through the stops in order, ↑/↓ between the bars of one slot, Home/End.
|
|
865
|
-
* -
|
|
866
|
-
* -
|
|
949
|
+
* - Each is named "period — series: value".
|
|
950
|
+
* - With `onPointClick` (`onPick`) each is a `role="button"`, and ↵ and Space report the
|
|
951
|
+
* stop as a click would — with the series for a bar. Without (0.52, refactor audit
|
|
952
|
+
* 2026-10-30, DSP-5) each is a `role="img"` to read, as PieChart's slices are: before,
|
|
953
|
+
* such a chart was recharts' unnamed `role="application"` stop, whose arrows moved a
|
|
954
|
+
* tooltip nothing announced.
|
|
867
955
|
*
|
|
868
956
|
* The stops take NO pointer events, so the drag-to-zoom layer, the tooltip and the
|
|
869
957
|
* pointer's own clicks underneath behave exactly as they did. Focus is shown by the
|
|
870
958
|
* slot tinted and, for a bar, its own outline (`focusedBarShape`) — and by the tooltip,
|
|
871
|
-
*
|
|
872
|
-
* hovered the chart.
|
|
959
|
+
* which recharts' own pointer is stood on the stop for (`pointAt`).
|
|
873
960
|
*/
|
|
874
961
|
function PointKeys({
|
|
875
962
|
stops,
|
|
@@ -884,40 +971,30 @@ function PointKeys({
|
|
|
884
971
|
label: string;
|
|
885
972
|
onFocusStop: (at: number) => void;
|
|
886
973
|
onBlurStops: () => void;
|
|
887
|
-
onPick
|
|
974
|
+
onPick?: (stop: PointStop) => void;
|
|
888
975
|
}) {
|
|
889
976
|
const plot = usePlotArea();
|
|
890
977
|
const scale = useXAxisScale();
|
|
891
978
|
const refs = useRef<(SVGRectElement | null)[]>([]);
|
|
892
979
|
if (!plot || !scale || plot.width <= 0 || plot.height <= 0) return null;
|
|
893
980
|
|
|
894
|
-
const move = (at: number) => {
|
|
895
|
-
const next = Math.max(0, Math.min(stops.length - 1, at));
|
|
896
|
-
refs.current[next]?.focus();
|
|
897
|
-
};
|
|
898
981
|
const onKeyDown = (at: number) => (event: KeyboardEvent<SVGRectElement>) => {
|
|
899
982
|
const stop = stops[at];
|
|
900
983
|
// ↑/↓ stay in the slot: the next or previous bar of the same period. The stops are
|
|
901
|
-
// in slot order, so a slot's bars are neighbours.
|
|
984
|
+
// in slot order, so a slot's bars are neighbours. ←/→, Home and End as Treemap's tiles
|
|
985
|
+
// take them (0.52 code review, deep, charts, finding 14): → is the next stop in any
|
|
986
|
+
// page, since the plot runs left to right in an RTL one too (see `ChartContainer`).
|
|
902
987
|
const inSlot = (step: 1 | -1) => (stops[at + step]?.index === stop.index ? at + step : at);
|
|
903
988
|
const target =
|
|
904
|
-
event.key === "
|
|
905
|
-
?
|
|
906
|
-
: event.key === "
|
|
907
|
-
?
|
|
908
|
-
: event.key
|
|
909
|
-
? inSlot(1)
|
|
910
|
-
: event.key === "ArrowUp"
|
|
911
|
-
? inSlot(-1)
|
|
912
|
-
: event.key === "Home"
|
|
913
|
-
? 0
|
|
914
|
-
: event.key === "End"
|
|
915
|
-
? stops.length - 1
|
|
916
|
-
: undefined;
|
|
989
|
+
event.key === "ArrowDown"
|
|
990
|
+
? inSlot(1)
|
|
991
|
+
: event.key === "ArrowUp"
|
|
992
|
+
? inSlot(-1)
|
|
993
|
+
: rovingTarget(event.key, "ltr", at, stops.length, false);
|
|
917
994
|
if (target !== undefined) {
|
|
918
995
|
event.preventDefault();
|
|
919
|
-
|
|
920
|
-
} else if (event.key === "Enter" || event.key === " ") {
|
|
996
|
+
refs.current[target]?.focus();
|
|
997
|
+
} else if (onPick && (event.key === "Enter" || event.key === " ")) {
|
|
921
998
|
event.preventDefault();
|
|
922
999
|
onPick(stop);
|
|
923
1000
|
}
|
|
@@ -925,9 +1002,14 @@ function PointKeys({
|
|
|
925
1002
|
|
|
926
1003
|
const left = plot.x;
|
|
927
1004
|
const right = plot.x + plot.width;
|
|
1005
|
+
const middle = plot.y + plot.height / 2;
|
|
1006
|
+
// Every target an arrow, Home or End can name from the roving stop — see ALL_STOPS_UP_TO.
|
|
1007
|
+
const drawn =
|
|
1008
|
+
stops.length <= ALL_STOPS_UP_TO ? undefined : new Set([0, current - 1, current, current + 1, stops.length - 1]);
|
|
928
1009
|
return (
|
|
929
1010
|
<g role="group" aria-label={label}>
|
|
930
1011
|
{stops.map((stop, at) => {
|
|
1012
|
+
if (drawn && !drawn.has(at)) return null;
|
|
931
1013
|
// An edge with no neighbour runs to the plot's edge.
|
|
932
1014
|
const a = finite(scale(stop.from)) ?? left;
|
|
933
1015
|
const b = finite(scale(stop.to)) ?? right;
|
|
@@ -939,9 +1021,9 @@ function PointKeys({
|
|
|
939
1021
|
ref={(node) => {
|
|
940
1022
|
refs.current[at] = node;
|
|
941
1023
|
}}
|
|
942
|
-
role="button"
|
|
1024
|
+
role={onPick ? "button" : "img"}
|
|
943
1025
|
tabIndex={at === current ? 0 : -1}
|
|
944
|
-
aria-label={stop.name}
|
|
1026
|
+
aria-label={stop.name()}
|
|
945
1027
|
data-point-key={stop.key}
|
|
946
1028
|
x={x0}
|
|
947
1029
|
y={plot.y}
|
|
@@ -956,8 +1038,19 @@ function PointKeys({
|
|
|
956
1038
|
// A bar outlines ITSELF (see `FOCUSED_BAR`); a slot has nothing else to.
|
|
957
1039
|
stop.key === undefined && "focus-visible:stroke-[var(--brand)]",
|
|
958
1040
|
)}
|
|
959
|
-
onFocus={() =>
|
|
960
|
-
|
|
1041
|
+
onFocus={(event) => {
|
|
1042
|
+
onFocusStop(at);
|
|
1043
|
+
pointAt(event.currentTarget, (x0 + x1) / 2, middle);
|
|
1044
|
+
}}
|
|
1045
|
+
onBlur={(event) => {
|
|
1046
|
+
onBlurStops();
|
|
1047
|
+
// On to another stop: that one stands the pointer on itself. (`refs` holds a
|
|
1048
|
+
// null for every stop not drawn, so a blur to nowhere is no stop.)
|
|
1049
|
+
const next = event.relatedTarget as SVGRectElement | null;
|
|
1050
|
+
if (!next || !refs.current.includes(next)) {
|
|
1051
|
+
pointAt(event.currentTarget, left - 1, middle);
|
|
1052
|
+
}
|
|
1053
|
+
}}
|
|
961
1054
|
onKeyDown={onKeyDown(at)}
|
|
962
1055
|
/>
|
|
963
1056
|
);
|
|
@@ -966,6 +1059,32 @@ function PointKeys({
|
|
|
966
1059
|
);
|
|
967
1060
|
}
|
|
968
1061
|
|
|
1062
|
+
/**
|
|
1063
|
+
* Stands recharts' pointer at (`x`, `y`) in the chart's own px, as a mouse moved there
|
|
1064
|
+
* would — what the keyboard's stops show their tooltip by (0.52 code review, deep, charts,
|
|
1065
|
+
* finding 4). Their `defaultIndex` alone moved it only until a pointer had hovered the
|
|
1066
|
+
* chart: recharts reads it no more once a hover has an index, and a mouse that has left
|
|
1067
|
+
* keeps its index. After one hover the arrows moved the tint, and the tooltip, the one
|
|
1068
|
+
* place the value is drawn, stayed where the mouse had left it. recharts' own keyboard
|
|
1069
|
+
* layer, which these stops replaced (DSP-5), drove the tooltip through its own state.
|
|
1070
|
+
*
|
|
1071
|
+
* A point off the plot (`x` left of it) takes the pointer off the chart: recharts hides
|
|
1072
|
+
* its tooltip there, through the same frame-throttled path a pending move takes, so a
|
|
1073
|
+
* blur right after a focus is never overtaken by it. recharts reads the pointer against
|
|
1074
|
+
* its wrapper's box, scaled as the box is drawn (`getRelativeCoordinate`); the point is
|
|
1075
|
+
* put back into that box.
|
|
1076
|
+
*/
|
|
1077
|
+
function pointAt(within: Element, x: number, y: number) {
|
|
1078
|
+
const wrapper = within.closest<HTMLElement>(".recharts-wrapper");
|
|
1079
|
+
if (!wrapper) return;
|
|
1080
|
+
const box = wrapper.getBoundingClientRect();
|
|
1081
|
+
const scaleX = wrapper.offsetWidth > 0 ? box.width / wrapper.offsetWidth : 1;
|
|
1082
|
+
const scaleY = wrapper.offsetHeight > 0 ? box.height / wrapper.offsetHeight : 1;
|
|
1083
|
+
wrapper.dispatchEvent(
|
|
1084
|
+
new MouseEvent("mousemove", { bubbles: true, clientX: box.left + x * scaleX, clientY: box.top + y * scaleY }),
|
|
1085
|
+
);
|
|
1086
|
+
}
|
|
1087
|
+
|
|
969
1088
|
interface PlotProps extends Omit<SeriesChartProps, "rows" | "x"> {
|
|
970
1089
|
/** The rows AS PLOTTED — what the zoom fits on. The caller's are `model.source`. */
|
|
971
1090
|
rows: readonly SeriesChartRow[];
|
|
@@ -1000,6 +1119,8 @@ function SeriesPlot({
|
|
|
1000
1119
|
axisBudget = "auto",
|
|
1001
1120
|
onAxisBudget,
|
|
1002
1121
|
maxRows,
|
|
1122
|
+
"aria-label": ariaLabel,
|
|
1123
|
+
description,
|
|
1003
1124
|
}: PlotProps) {
|
|
1004
1125
|
const labels = useKitLabels("seriesChart", DEFAULT_SERIES_CHART_LABELS, labelsProp);
|
|
1005
1126
|
const locale = useKitLocale(localeProp);
|
|
@@ -1010,6 +1131,10 @@ function SeriesPlot({
|
|
|
1010
1131
|
// Strokes, dashes and the grid stay px.
|
|
1011
1132
|
const { scale } = useTextSize();
|
|
1012
1133
|
const edgeFor = useChartEdge();
|
|
1134
|
+
// The tiles' rule (0.52, DSP-18, Marcel's decision 3): the ink edge under More contrast
|
|
1135
|
+
// only — at Standard it fell on 5 of 8 hues in light and on 2 in dark, the unevenness
|
|
1136
|
+
// #642 took off the tiles.
|
|
1137
|
+
const edges = useEdgesInForce("auto");
|
|
1013
1138
|
const ticksAim = tickTarget(scale);
|
|
1014
1139
|
const grow = (px: number) => (scale === 1 ? px : Math.round(px * scale));
|
|
1015
1140
|
// The keyboard stops' roving tab stop, and the one that has focus (see `PointKeys`).
|
|
@@ -1085,13 +1210,31 @@ function SeriesPlot({
|
|
|
1085
1210
|
// one value sizes both the chart and its empty state.
|
|
1086
1211
|
const { className: heightClass, style: heightStyle } = chartHeightProps(height);
|
|
1087
1212
|
|
|
1213
|
+
// A named figure, described by the caller's sentence and — where a drag zooms — the
|
|
1214
|
+
// gesture (0.52, refactor audit 2026-10-30, DSP-5). The hint used to be the name of the
|
|
1215
|
+
// zoom layer's rect, a `role="application"` that could not take focus. The description
|
|
1216
|
+
// is `hidden`: read through `aria-describedby`, never twice in browse mode.
|
|
1217
|
+
const drawable = model.source.length > 0 && series.length > 0;
|
|
1218
|
+
const spoken = [description, drawable && zoom?.layer ? labels.zoomHint : undefined].filter(Boolean).join(" ");
|
|
1219
|
+
// Inside the root, not after it as a sibling: a StaticSeriesChart then stopped being its
|
|
1220
|
+
// parent's last child, and a stack's `space-y-*` / `divide-y` gave it a margin or a rule
|
|
1221
|
+
// it never had (0.52 code review, deep, charts, findings 7 and 14 — Treemap's copy of this
|
|
1222
|
+
// went the same way). The plot's root is `ChartContainer`, which takes the sentence itself.
|
|
1223
|
+
const about = useFigureDescription(spoken || undefined);
|
|
1224
|
+
const figure = { role: "figure", "aria-label": ariaLabel, "aria-describedby": about.describedBy } as const;
|
|
1225
|
+
|
|
1088
1226
|
// The empty state takes the chart's own height and is centred in it: a chart that
|
|
1089
1227
|
// shrank to its "nothing to draw" sentence moved everything under it up the page
|
|
1090
1228
|
// the moment a legend entry was switched off.
|
|
1091
|
-
if (!
|
|
1229
|
+
if (!drawable) {
|
|
1092
1230
|
return (
|
|
1093
|
-
<div
|
|
1231
|
+
<div
|
|
1232
|
+
{...figure}
|
|
1233
|
+
className={cn("flex w-full items-center justify-center px-2 text-center", heightClass)}
|
|
1234
|
+
style={heightStyle}
|
|
1235
|
+
>
|
|
1094
1236
|
{empty !== undefined ? empty : <p className="text-xs text-muted">{labels.empty}</p>}
|
|
1237
|
+
{about.node}
|
|
1095
1238
|
</div>
|
|
1096
1239
|
);
|
|
1097
1240
|
}
|
|
@@ -1268,14 +1411,15 @@ function SeriesPlot({
|
|
|
1268
1411
|
return row ? { index: origin(index), row, x: xOf(index), key } : undefined;
|
|
1269
1412
|
};
|
|
1270
1413
|
|
|
1271
|
-
// The keyboard stops
|
|
1272
|
-
//
|
|
1414
|
+
// The keyboard stops — every bar with a value, slot by slot; or, with no bars, every
|
|
1415
|
+
// slot with any value. Only what is inside the window on show. Named on demand: past
|
|
1416
|
+
// ALL_STOPS_UP_TO only five are drawn, and naming is a date and a number format each.
|
|
1273
1417
|
const stops: PointStop[] = [];
|
|
1274
|
-
|
|
1418
|
+
{
|
|
1275
1419
|
const valueText = valueFormat ?? number;
|
|
1276
1420
|
const nameOf = (entry: SeriesChartSeries) =>
|
|
1277
1421
|
typeof entry.label === "string" || typeof entry.label === "number" ? String(entry.label) : entry.key;
|
|
1278
|
-
const
|
|
1422
|
+
const cellText = (entry: SeriesChartSeries, value: number) => {
|
|
1279
1423
|
const name = nameOf(entry);
|
|
1280
1424
|
return name ? `${name}: ${valueText(value)}` : valueText(value);
|
|
1281
1425
|
};
|
|
@@ -1291,21 +1435,23 @@ function SeriesPlot({
|
|
|
1291
1435
|
const from = k > 0 ? (placed[k - 1].at + at) / 2 : low;
|
|
1292
1436
|
const to = k < placed.length - 1 ? (placed[k + 1].at + at) / 2 : high;
|
|
1293
1437
|
// The heading the tooltip would give it, when that is text; else the tick.
|
|
1294
|
-
const
|
|
1295
|
-
|
|
1438
|
+
const where = () => {
|
|
1439
|
+
const heading = xLabel(at);
|
|
1440
|
+
return typeof heading === "string" && heading ? heading : xFormat(at);
|
|
1441
|
+
};
|
|
1296
1442
|
const valued = (bars.length ? bars : series)
|
|
1297
1443
|
.map((entry) => ({ entry, value: finite(rows[index]?.[entry.key]) }))
|
|
1298
1444
|
.filter((cell): cell is { entry: SeriesChartSeries; value: number } => cell.value !== undefined);
|
|
1299
1445
|
if (bars.length) {
|
|
1300
1446
|
for (const { entry, value } of valued) {
|
|
1301
|
-
stops.push({ index, key: entry.key, from, to, name: `${where} — ${
|
|
1447
|
+
stops.push({ index, key: entry.key, from, to, name: () => `${where()} — ${cellText(entry, value)}` });
|
|
1302
1448
|
}
|
|
1303
1449
|
} else if (valued.length) {
|
|
1304
1450
|
stops.push({
|
|
1305
1451
|
index,
|
|
1306
1452
|
from,
|
|
1307
1453
|
to,
|
|
1308
|
-
name: `${where} — ${valued.map(({ entry, value }) =>
|
|
1454
|
+
name: () => `${where()} — ${valued.map(({ entry, value }) => cellText(entry, value)).join(", ")}`,
|
|
1309
1455
|
});
|
|
1310
1456
|
}
|
|
1311
1457
|
});
|
|
@@ -1359,6 +1505,7 @@ function SeriesPlot({
|
|
|
1359
1505
|
const inRow = placement !== "cursor";
|
|
1360
1506
|
const chart = (
|
|
1361
1507
|
<ChartContainer
|
|
1508
|
+
{...(inRow ? {} : { role: "figure", "aria-label": ariaLabel, description: spoken || undefined })}
|
|
1362
1509
|
ref={setBox}
|
|
1363
1510
|
data-axis-budget={budgeted.length ? budgetKey.replace(/\n/g, " ") : undefined}
|
|
1364
1511
|
// "drawn/all" while `maxRows` thins: what a reader of the DOM (a test, a bug
|
|
@@ -1381,9 +1528,10 @@ function SeriesPlot({
|
|
|
1381
1528
|
// Positive and negative layers stacked apart, as `axisExtent` fits them — a
|
|
1382
1529
|
// month's expenses hang below the axis instead of eating into its income.
|
|
1383
1530
|
stackOffset="sign"
|
|
1384
|
-
// recharts' own keyboard layer makes the whole surface
|
|
1385
|
-
//
|
|
1386
|
-
|
|
1531
|
+
// recharts' own keyboard layer makes the whole surface an unnamed
|
|
1532
|
+
// `role="application"` tab stop whose arrows move a tooltip nothing announces —
|
|
1533
|
+
// a second stop beside `PointKeys`, which every chart has since 0.52 (DSP-5).
|
|
1534
|
+
accessibilityLayer={false}
|
|
1387
1535
|
onClick={
|
|
1388
1536
|
onPointClick
|
|
1389
1537
|
? (state) => {
|
|
@@ -1515,9 +1663,10 @@ function SeriesPlot({
|
|
|
1515
1663
|
const type = entry.type ?? "line";
|
|
1516
1664
|
const yAxisId = entry.axis ?? DEFAULT_Y_AXIS;
|
|
1517
1665
|
const color = `var(--color-${entry.key})`;
|
|
1518
|
-
//
|
|
1519
|
-
// (WCAG 1.4.11, anyplot's rule) — measured on the colour the
|
|
1520
|
-
|
|
1666
|
+
// Under More contrast, a filled mark in a hue under 3:1 against the ground gets
|
|
1667
|
+
// a 1px ink edge (WCAG 1.4.11, anyplot's rule) — measured on the colour the
|
|
1668
|
+
// config paints. At Standard none does (see `edges`).
|
|
1669
|
+
const edge = edges === "contrast" ? edgeFor(config[entry.key]?.color) : undefined;
|
|
1521
1670
|
const own = entry.dash ?? (entry.dashed ? 1 : 0);
|
|
1522
1671
|
const dash = entry.step ? strokeDash(STEP_DASH) : typeof own === "string" ? own : strokeDash(own);
|
|
1523
1672
|
const curve = entry.step ? "stepAfter" : (entry.curve ?? "monotone");
|
|
@@ -1568,9 +1717,11 @@ function SeriesPlot({
|
|
|
1568
1717
|
type={curve}
|
|
1569
1718
|
dataKey={entry.key}
|
|
1570
1719
|
stackId={entry.stack}
|
|
1571
|
-
// The edge replaces the hue on the area's outline only; the fill keeps it
|
|
1720
|
+
// The edge replaces the hue on the area's outline only; the fill keeps it,
|
|
1721
|
+
// and the outline its width (0.52, DSP-18: it was 1px, whatever
|
|
1722
|
+
// `strokeWidth` said).
|
|
1572
1723
|
stroke={edge ?? color}
|
|
1573
|
-
strokeWidth={
|
|
1724
|
+
strokeWidth={width}
|
|
1574
1725
|
strokeDasharray={dash}
|
|
1575
1726
|
fill={color}
|
|
1576
1727
|
fillOpacity={entry.fillOpacity ?? (entry.stack !== undefined ? 0.55 : 0.2)}
|
|
@@ -1670,10 +1821,14 @@ function SeriesPlot({
|
|
|
1670
1821
|
setKeyFocus(at);
|
|
1671
1822
|
}}
|
|
1672
1823
|
onBlurStops={() => setKeyFocus(undefined)}
|
|
1673
|
-
onPick={
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1824
|
+
onPick={
|
|
1825
|
+
onPointClick
|
|
1826
|
+
? (stop) => {
|
|
1827
|
+
const hit = hitAt(stop.index, stop.key);
|
|
1828
|
+
if (hit) onPointClick(hit);
|
|
1829
|
+
}
|
|
1830
|
+
: undefined
|
|
1831
|
+
}
|
|
1677
1832
|
/>
|
|
1678
1833
|
)}
|
|
1679
1834
|
{zoom?.layer}
|
|
@@ -1695,10 +1850,11 @@ function SeriesPlot({
|
|
|
1695
1850
|
/>
|
|
1696
1851
|
);
|
|
1697
1852
|
return (
|
|
1698
|
-
<div className={cn("flex w-full flex-col", heightClass)} style={heightStyle}>
|
|
1853
|
+
<div {...figure} className={cn("flex w-full flex-col", heightClass)} style={heightStyle}>
|
|
1699
1854
|
{placement === "above" && row}
|
|
1700
1855
|
{chart}
|
|
1701
1856
|
{placement === "below" && row}
|
|
1857
|
+
{about.node}
|
|
1702
1858
|
</div>
|
|
1703
1859
|
);
|
|
1704
1860
|
}
|
|
@@ -1711,11 +1867,17 @@ const ZoomablePlot = withChartZoom(SeriesPlot);
|
|
|
1711
1867
|
* category or time chart otherwise re-maps every row on every render, and `maxRows`'
|
|
1712
1868
|
* envelope would be worked out again with it.
|
|
1713
1869
|
*/
|
|
1714
|
-
function usePlotProps(
|
|
1870
|
+
function usePlotProps<TRow extends object>(typed: SeriesChartProps<TRow>): PlotProps {
|
|
1871
|
+
// `TRow` types only what the caller is handed back, and that is its own row objects,
|
|
1872
|
+
// untouched (0.53): the plot reads them as the `object` rows they are. Through `unknown`
|
|
1873
|
+
// because the two are not comparable for an unresolved `TRow`: `SeriesChartSeries` is
|
|
1874
|
+
// contravariant in it (its `dot` is handed rows) and `rows` covariant.
|
|
1875
|
+
const props = typed as unknown as SeriesChartProps;
|
|
1715
1876
|
const x = props.x ?? {};
|
|
1716
1877
|
const { rows } = props;
|
|
1717
1878
|
const { type, key } = x;
|
|
1718
|
-
|
|
1879
|
+
// Read by key, so any object is a row (API-2); `SeriesChartRow` is how the plot reads it.
|
|
1880
|
+
const model = useMemo(() => xModel(rows as readonly SeriesChartRow[], { type, key }), [rows, type, key]);
|
|
1719
1881
|
return { ...props, rows: model.rows, x: { key: model.plotKey }, model, xAxis: x };
|
|
1720
1882
|
}
|
|
1721
1883
|
|
|
@@ -1724,7 +1886,7 @@ function usePlotProps(props: SeriesChartProps): PlotProps {
|
|
|
1724
1886
|
* button. For a thumbnail, a print view, or a chart the consumer wraps in its own
|
|
1725
1887
|
* interaction.
|
|
1726
1888
|
*/
|
|
1727
|
-
export function StaticSeriesChart(props: SeriesChartProps) {
|
|
1889
|
+
export function StaticSeriesChart<TRow extends object = object>(props: SeriesChartProps<TRow>) {
|
|
1728
1890
|
return <SeriesPlot {...usePlotProps(props)} />;
|
|
1729
1891
|
}
|
|
1730
1892
|
|
|
@@ -1733,8 +1895,12 @@ export function StaticSeriesChart(props: SeriesChartProps) {
|
|
|
1733
1895
|
* axes), double-click or press the reset button to go back; wrap several in
|
|
1734
1896
|
* `SharedXZoom` to move their x windows together. Which axes zoom depends on the marks
|
|
1735
1897
|
* — see {@link SeriesChartProps.zoomAxes}.
|
|
1898
|
+
*
|
|
1899
|
+
* Generic in its rows (0.53): `hit.row` and a `dot`'s `point.row` are typed as `rows` is —
|
|
1900
|
+
* see {@link SeriesChartProps}. A plain function, so the generic survives: a `memo` or a
|
|
1901
|
+
* `forwardRef` around it would read `TRow` as its constraint.
|
|
1736
1902
|
*/
|
|
1737
|
-
export function SeriesChart(props: SeriesChartProps) {
|
|
1903
|
+
export function SeriesChart<TRow extends object = object>(props: SeriesChartProps<TRow>) {
|
|
1738
1904
|
// The zoom fits the PLOTTED rows — slot indices and epoch ms, not the caller's labels.
|
|
1739
1905
|
return <ZoomablePlot {...usePlotProps(props)} />;
|
|
1740
1906
|
}
|
|
@@ -4,7 +4,7 @@ import { Trash2, UserPlus, UsersRound } from "lucide-react";
|
|
|
4
4
|
|
|
5
5
|
import { useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
|
|
6
6
|
import { cn } from "../lib/cn";
|
|
7
|
-
import {
|
|
7
|
+
import { matchesSearch, searchWords } from "../lib/text-match";
|
|
8
8
|
import { AlertBanner } from "./alert-banner";
|
|
9
9
|
import { Autocomplete } from "./autocomplete";
|
|
10
10
|
import type { ComboOption } from "./combobox-core";
|
|
@@ -368,11 +368,11 @@ export function SharePanel({
|
|
|
368
368
|
// The completion is a convenience, not a search: an address that matches nobody is
|
|
369
369
|
// the ordinary case (somebody new), so no "No results" box opens over the field —
|
|
370
370
|
// and over its error. The same narrowing Autocomplete applies, asked first — folded as
|
|
371
|
-
// every kit list folds (DUP-5).
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
371
|
+
// every kit list folds (DUP-5), and word by word as its list matches since 0.51.4
|
|
372
|
+
// (refactor audit 2026-10-30, DUP-4): "weber jonas" kept the list shut over a
|
|
373
|
+
// candidate the list itself would have shown.
|
|
374
|
+
const words = searchWords(target ? "" : email, locale);
|
|
375
|
+
const offers = words.length > 0 && options.some((o) => matchesSearch(words, [o.label, o.sublabel], locale));
|
|
376
376
|
|
|
377
377
|
const captionNode = typeof caption === "function" ? caption(target) : caption;
|
|
378
378
|
const shownError = error ?? failure;
|