@eifi1/ui-kit 0.51.7 → 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 +141 -23
- 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 +20 -8
- package/dist/billing/cancel-subscription.js +7 -5
- 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 +19 -7
- package/dist/billing/plan-switch.js +8 -4
- 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 +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 +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/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 +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/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/section-nav.d.ts +7 -0
- package/dist/components/section-nav.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +3 -3
- 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 +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 +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-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 -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/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/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 +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/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 +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 +26 -12
- 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 +26 -12
- 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 +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 +65 -8
- package/src/components/date-picker.tsx +125 -48
- package/src/components/date-range-picker.tsx +82 -31
- 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 +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/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/section-nav.tsx +7 -0
- package/src/components/series-chart-axes.ts +3 -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 +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 +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-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 -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/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/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 +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/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 +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 +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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const PHI = (1 + Math.sqrt(5)) / 2;
|
|
3
|
+
const BAND = 20;
|
|
4
|
+
const FRAME_MARGIN = 3;
|
|
5
|
+
const BODY_SHARE = 1 / PHI;
|
|
6
|
+
function groupBody(box, scale) {
|
|
7
|
+
const band = BAND * scale;
|
|
8
|
+
const margin = Math.min(FRAME_MARGIN, Math.floor(box.width / 4), Math.floor(box.height / 4));
|
|
9
|
+
const banded = box.width >= 44 * scale && box.height - band - margin >= box.height * BODY_SHARE;
|
|
10
|
+
const top = banded ? band : margin;
|
|
11
|
+
return {
|
|
12
|
+
banded,
|
|
13
|
+
body: {
|
|
14
|
+
x: box.x + margin,
|
|
15
|
+
y: box.y + top,
|
|
16
|
+
width: Math.max(0, box.width - 2 * margin),
|
|
17
|
+
height: Math.max(0, box.height - top - margin)
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function worst(area, min, max, side, ratio) {
|
|
22
|
+
const along = side * side;
|
|
23
|
+
const across = area * area;
|
|
24
|
+
if (across === 0 || min === 0) return Infinity;
|
|
25
|
+
return Math.max(along * max * ratio / across, across / (along * min * ratio));
|
|
26
|
+
}
|
|
27
|
+
function squarify(weights, rect, ratio = PHI) {
|
|
28
|
+
const out = weights.map(() => ({ x: rect.x, y: rect.y, width: 0, height: 0 }));
|
|
29
|
+
const sum = weights.reduce((acc, w) => acc + Math.max(0, w), 0);
|
|
30
|
+
if (!(sum > 0) || rect.width <= 0 || rect.height <= 0) return out;
|
|
31
|
+
const areas = weights.map((w) => Math.max(0, w) * rect.width * rect.height / sum);
|
|
32
|
+
let { x, y, width, height } = rect;
|
|
33
|
+
let i = 0;
|
|
34
|
+
while (i < areas.length) {
|
|
35
|
+
const side = Math.min(width, height);
|
|
36
|
+
let rowArea = 0;
|
|
37
|
+
let min = Infinity;
|
|
38
|
+
let max = 0;
|
|
39
|
+
let best = Infinity;
|
|
40
|
+
let j = i;
|
|
41
|
+
while (j < areas.length) {
|
|
42
|
+
const a = areas[j];
|
|
43
|
+
const score = worst(rowArea + a, Math.min(min, a), Math.max(max, a), side, ratio);
|
|
44
|
+
if (j > i && score > best) break;
|
|
45
|
+
rowArea += a;
|
|
46
|
+
min = Math.min(min, a);
|
|
47
|
+
max = Math.max(max, a);
|
|
48
|
+
best = score;
|
|
49
|
+
j += 1;
|
|
50
|
+
}
|
|
51
|
+
const last = j === areas.length;
|
|
52
|
+
if (side === width) {
|
|
53
|
+
const thick = last ? height : rowArea / width;
|
|
54
|
+
let at = x;
|
|
55
|
+
for (let k = i; k < j; k++) {
|
|
56
|
+
const len = k === j - 1 ? x + width - at : areas[k] / rowArea * width;
|
|
57
|
+
out[k] = { x: at, y, width: len, height: thick };
|
|
58
|
+
at += len;
|
|
59
|
+
}
|
|
60
|
+
y += thick;
|
|
61
|
+
height -= thick;
|
|
62
|
+
} else {
|
|
63
|
+
const thick = last ? width : rowArea / height;
|
|
64
|
+
let at = y;
|
|
65
|
+
for (let k = i; k < j; k++) {
|
|
66
|
+
const len = k === j - 1 ? y + height - at : areas[k] / rowArea * height;
|
|
67
|
+
out[k] = { x, y: at, width: thick, height: len };
|
|
68
|
+
at += len;
|
|
69
|
+
}
|
|
70
|
+
x += thick;
|
|
71
|
+
width -= thick;
|
|
72
|
+
}
|
|
73
|
+
i = j;
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
function snap(b) {
|
|
78
|
+
const x = Math.round(b.x);
|
|
79
|
+
const y = Math.round(b.y);
|
|
80
|
+
return { x, y, width: Math.round(b.x + b.width) - x, height: Math.round(b.y + b.height) - y };
|
|
81
|
+
}
|
|
82
|
+
const ROUNDS = 8;
|
|
83
|
+
function layoutTreemap(nodes, width, height, scale) {
|
|
84
|
+
const total = nodes.reduce((acc, n) => acc + n.size, 0);
|
|
85
|
+
const frames = /* @__PURE__ */ new Map();
|
|
86
|
+
let placed = /* @__PURE__ */ new Map();
|
|
87
|
+
for (let round = 0; round < ROUNDS; round++) {
|
|
88
|
+
const framed = [...frames.values()].reduce((acc, a) => acc + a, 0);
|
|
89
|
+
const spare = width * height - framed;
|
|
90
|
+
const density = total > 0 ? (spare > 0 ? spare : width * height) / total : 0;
|
|
91
|
+
const need = (n) => n.children ? (frames.get(n.path) ?? 0) + n.children.reduce((acc, c) => acc + need(c), 0) : n.size * density;
|
|
92
|
+
let moved = 0;
|
|
93
|
+
placed = /* @__PURE__ */ new Map();
|
|
94
|
+
const place = (list, rect) => {
|
|
95
|
+
const boxes = squarify(
|
|
96
|
+
list.map((n) => need(n)),
|
|
97
|
+
rect
|
|
98
|
+
);
|
|
99
|
+
list.forEach((n, i) => {
|
|
100
|
+
const box = snap(boxes[i]);
|
|
101
|
+
if (!n.children) {
|
|
102
|
+
placed.set(n.path, { box });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const { banded, body } = groupBody(box, scale);
|
|
106
|
+
placed.set(n.path, { box, body, banded });
|
|
107
|
+
const frame = box.width * box.height - body.width * body.height;
|
|
108
|
+
moved = Math.max(moved, Math.abs(frame - (frames.get(n.path) ?? 0)));
|
|
109
|
+
frames.set(n.path, frame);
|
|
110
|
+
place(n.children, body);
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
place(nodes, { x: 0, y: 0, width, height });
|
|
114
|
+
if (moved < 1) break;
|
|
115
|
+
}
|
|
116
|
+
return placed;
|
|
117
|
+
}
|
|
118
|
+
export {
|
|
119
|
+
BAND,
|
|
120
|
+
BODY_SHARE,
|
|
121
|
+
FRAME_MARGIN,
|
|
122
|
+
groupBody,
|
|
123
|
+
layoutTreemap,
|
|
124
|
+
squarify
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=treemap-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/treemap-layout.ts"],"sourcesContent":["// Where `Treemap` draws each node — a pure function of the nodes, the chart's size and the\n// text size, with no recharts in it (0.52 code review of treemap.tsx, findings 1 and 8).\n//\n// recharts lays nested data out itself, edge to edge, and 0.52 first made the groups' room\n// afterwards: a group's cell took its band and margin out of its rectangle and each child's\n// cell SQUEEZED the rectangle recharts gave it into what was left. Two faults followed.\n// A fixed 23px is a different share of every group, so a €100 tile in a 61px group was\n// drawn at two thirds of a €100 tile in a 300px one — in a chart whose one promise is that\n// area is share. And the squeeze ran through a cache the group's cell wrote during render\n// for its children's cells to read, which held only because recharts renders a group\n// before its children.\n//\n// So the layout is made here, up front: squarified as recharts does it, with each group\n// asking for its tiles' area PLUS its frame's, and its tiles laid out in its body. A\n// frame's area depends on the rectangle it gets, so the layout is run again with each\n// group's frame as measured until no frame moves by a pixel — two or three rounds.\n\nexport interface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** What the layout needs of a node: its key, its value, and a group's nodes. */\nexport interface LayoutNode {\n path: string;\n size: number;\n children?: readonly LayoutNode[];\n}\n\n/** A node as drawn: its rectangle, and for a group the body its nodes fill and whether\n * its band is drawn. Whole pixels, on shared edges, so neighbours meet without a seam. */\nexport interface Placed {\n box: Box;\n body?: Box;\n banded?: boolean;\n}\n\nconst PHI = (1 + Math.sqrt(5)) / 2;\n\n/**\n * A group's band, in px at Normal, × the text size's scale: the 20px floor a tile keeps\n * for its own name, so the group's name sits in it as a tile's does in a tile.\n */\nexport const BAND = 20;\n/**\n * The frame's margin round its body, in px. Each tile keeps its 2px gutter, half of it\n * inside the tile, so 3 leaves one pixel of the frame's own colour between the group's\n * gutter and its tiles' — the frame reads as one outline round the group, not as a gutter\n * that happens to be wider.\n */\nexport const FRAME_MARGIN = 3;\n/**\n * The least of a group's height its body keeps under the band: 1/φ. At Normal that is a\n * group of 61px (20 band + 3 margin = 0.382 of it), whose body of 38px still holds a\n * tile's name and its second line (the note's 36px floor) — so a single row of tiles under\n * the band keeps both. A smaller group draws no band, and its name is in its tiles'\n * accessible names and its tooltip rather than over their area. Since the frame's area is\n * given to the group (above), this bounds the frame's share of the picture, not the tiles'.\n */\nexport const BODY_SHARE = 1 / PHI;\n\n/** A group drawn at `box`: whether it has the room for its band (see {@link BODY_SHARE};\n * and 44px across, the floor of a word), and the body its nodes are drawn into. */\nexport function groupBody(box: Box, scale: number): { banded: boolean; body: Box } {\n const band = BAND * scale;\n const margin = Math.min(FRAME_MARGIN, Math.floor(box.width / 4), Math.floor(box.height / 4));\n const banded = box.width >= 44 * scale && box.height - band - margin >= box.height * BODY_SHARE;\n const top = banded ? band : margin;\n return {\n banded,\n body: {\n x: box.x + margin,\n y: box.y + top,\n width: Math.max(0, box.width - 2 * margin),\n height: Math.max(0, box.height - top - margin),\n },\n };\n}\n\n/** The worst aspect ratio in a row of `area` along `side`, against the target `ratio`. */\nfunction worst(area: number, min: number, max: number, side: number, ratio: number): number {\n const along = side * side;\n const across = area * area;\n if (across === 0 || min === 0) return Infinity;\n return Math.max((along * max * ratio) / across, across / (along * min * ratio));\n}\n\n/**\n * Bruls, Huizing and van Wijk's squarified layout, as recharts runs it: `weights` share\n * out `rect` in order, a row at a time along its shorter side, and a row closes when the\n * next node would make its worst tile further from φ:1 (recharts' default ratio). Returns\n * one rectangle per weight, in order, in fractional pixels.\n */\nexport function squarify(weights: readonly number[], rect: Box, ratio = PHI): Box[] {\n const out: Box[] = weights.map(() => ({ x: rect.x, y: rect.y, width: 0, height: 0 }));\n const sum = weights.reduce((acc, w) => acc + Math.max(0, w), 0);\n if (!(sum > 0) || rect.width <= 0 || rect.height <= 0) return out;\n const areas = weights.map((w) => (Math.max(0, w) * rect.width * rect.height) / sum);\n let { x, y, width, height } = rect;\n let i = 0;\n while (i < areas.length) {\n const side = Math.min(width, height);\n let rowArea = 0;\n let min = Infinity;\n let max = 0;\n let best = Infinity;\n let j = i;\n while (j < areas.length) {\n const a = areas[j]!;\n const score = worst(rowArea + a, Math.min(min, a), Math.max(max, a), side, ratio);\n if (j > i && score > best) break;\n rowArea += a;\n min = Math.min(min, a);\n max = Math.max(max, a);\n best = score;\n j += 1;\n }\n // The last row takes what is left, so rounding never leaves a sliver unpainted.\n const last = j === areas.length;\n if (side === width) {\n // A row along the top, as wide as the space.\n const thick = last ? height : rowArea / width;\n let at = x;\n for (let k = i; k < j; k++) {\n const len = k === j - 1 ? x + width - at : (areas[k]! / rowArea) * width;\n out[k] = { x: at, y, width: len, height: thick };\n at += len;\n }\n y += thick;\n height -= thick;\n } else {\n // A column at the left, as tall as the space.\n const thick = last ? width : rowArea / height;\n let at = y;\n for (let k = i; k < j; k++) {\n const len = k === j - 1 ? y + height - at : (areas[k]! / rowArea) * height;\n out[k] = { x, y: at, width: thick, height: len };\n at += len;\n }\n x += thick;\n width -= thick;\n }\n i = j;\n }\n return out;\n}\n\n/** Whole pixels on the EDGES: neighbours share an edge, so they round it alike. */\nfunction snap(b: Box): Box {\n const x = Math.round(b.x);\n const y = Math.round(b.y);\n return { x, y, width: Math.round(b.x + b.width) - x, height: Math.round(b.y + b.height) - y };\n}\n\n/** The rounds the frames get to settle; three is usual, more only when a band switches. */\nconst ROUNDS = 8;\n\n/**\n * Every node of `nodes` placed in a `width` × `height` chart, by path.\n *\n * Each tile's area is its value's share of what is left for tiles once the frames have\n * theirs — the same density in every group and at the top. A group asks for its tiles'\n * area and its own frame's (band and margin, as {@link groupBody} measures them on the\n * rectangle it got last round), so its body holds exactly its tiles.\n */\nexport function layoutTreemap(\n nodes: readonly LayoutNode[],\n width: number,\n height: number,\n scale: number,\n): Map<string, Placed> {\n const total = nodes.reduce((acc, n) => acc + n.size, 0);\n const frames = new Map<string, number>();\n let placed = new Map<string, Placed>();\n for (let round = 0; round < ROUNDS; round++) {\n const framed = [...frames.values()].reduce((acc, a) => acc + a, 0);\n const spare = width * height - framed;\n // Frames that would take the whole chart (a tiny chart of many groups) leave nothing\n // to share; the tiles then take the density they would have without frames.\n const density = total > 0 ? (spare > 0 ? spare : width * height) / total : 0;\n const need = (n: LayoutNode): number =>\n n.children ? (frames.get(n.path) ?? 0) + n.children.reduce((acc, c) => acc + need(c), 0) : n.size * density;\n let moved = 0;\n placed = new Map();\n const place = (list: readonly LayoutNode[], rect: Box) => {\n const boxes = squarify(\n list.map((n) => need(n)),\n rect,\n );\n list.forEach((n, i) => {\n const box = snap(boxes[i]!);\n if (!n.children) {\n placed.set(n.path, { box });\n return;\n }\n const { banded, body } = groupBody(box, scale);\n placed.set(n.path, { box, body, banded });\n const frame = box.width * box.height - body.width * body.height;\n moved = Math.max(moved, Math.abs(frame - (frames.get(n.path) ?? 0)));\n frames.set(n.path, frame);\n place(n.children, body);\n });\n };\n place(nodes, { x: 0, y: 0, width, height });\n if (moved < 1) break;\n }\n return placed;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
2
|
+
import { type ChartEdges } from "./chart-edge.js";
|
|
2
3
|
import { type Direction } from "../lib/direction.js";
|
|
3
4
|
import { type ChartHeight } from "./chart-height.js";
|
|
5
|
+
import { type LabelOverride } from "../i18n/kit-labels.js";
|
|
6
|
+
import { type TreemapLabels } from "./treemap-labels.js";
|
|
4
7
|
/**
|
|
5
8
|
* One tile.
|
|
6
9
|
*
|
|
@@ -11,13 +14,19 @@ import { type ChartHeight } from "./chart-height.js";
|
|
|
11
14
|
*/
|
|
12
15
|
export interface TreemapNode {
|
|
13
16
|
/** Stable key, handed back by {@link TreemapProps.onNodeClick} and
|
|
14
|
-
* {@link TreemapProps.nodeNote}. Names can collide; ids must not
|
|
17
|
+
* {@link TreemapProps.nodeNote}. Names can collide; ids must not among a group's own
|
|
18
|
+
* nodes (or the top's). A group and a tile inside it may share one — chain 12 and shop
|
|
19
|
+
* 12 from two tables — and `onNodeClick`'s `groups` tells them apart (0.52). */
|
|
15
20
|
id: string;
|
|
16
21
|
name: string;
|
|
17
22
|
/** The tile's area. A node whose value is not a positive finite number is NOT
|
|
18
23
|
* drawn — an area cannot be negative, and recharts lays a negative size out as
|
|
19
24
|
* nonsense rather than refusing it. Saying so is the caller's job: a group that
|
|
20
|
-
* vanishes silently between two views of the same data is a bug report.
|
|
25
|
+
* vanishes silently between two views of the same data is a bug report.
|
|
26
|
+
*
|
|
27
|
+
* A GROUP's own `value` is not read: its area is its drawn children's together. Pass
|
|
28
|
+
* that sum — the field stays required so that every reader of a `TreemapNode[]` keeps
|
|
29
|
+
* a `number`. */
|
|
21
30
|
value: number;
|
|
22
31
|
/** Overrides the by-index palette colour for this tile — e.g. to paint every child
|
|
23
32
|
* in its parent group's colour, so the groups stay legible in one picture. A
|
|
@@ -25,42 +34,122 @@ export interface TreemapNode {
|
|
|
25
34
|
* does `CHART_ROLES.other` (`var(--chart-muted)`), the colour for a "rest" bucket,
|
|
26
35
|
* which should not wrap round to a hue the reader matches to a real node;
|
|
27
36
|
* anything else (another var, a `color-mix()`) gets `currentColor` ink, because
|
|
28
|
-
* there is nothing to measure — set `labelColor` then.
|
|
37
|
+
* there is nothing to measure — set `labelColor` then.
|
|
38
|
+
*
|
|
39
|
+
* On a group, the colour of every tile inside it that sets none (0.52): keksdose's
|
|
40
|
+
* "hue = chain" is a `fill` per chain. A group left without one takes the ramp by its
|
|
41
|
+
* index, as a tile does, and hands that down; its frame is drawn in the page's own
|
|
42
|
+
* colours whatever it is. */
|
|
29
43
|
fill?: string;
|
|
30
44
|
/** The label's ink, for a `fill` the kit cannot measure (a `var()` or `color-mix()`):
|
|
31
45
|
* keksdose's recency plot fills with `color-mix(in srgb, var(--chart-1) N%,
|
|
32
46
|
* transparent)`, where `currentColor` put dark page text on full-strength indigo
|
|
33
|
-
* (~1.5:1). Wins over the measured ink when given.
|
|
47
|
+
* (~1.5:1). Wins over the measured ink when given. A tile that takes its group's
|
|
48
|
+
* `fill` takes the group's `labelColor` with it; one with a `fill` of its own, or one
|
|
49
|
+
* that `shade` turns into another colour, is measured again. */
|
|
34
50
|
labelColor?: string;
|
|
51
|
+
/**
|
|
52
|
+
* The tile's colour strength, 0–1 (0.52): its `fill` mixed into the card's colour
|
|
53
|
+
* (`--bg-surface`) as a concrete hex, `1` the full hue. For a second, ordered quantity
|
|
54
|
+
* on top of the hue — keksdose's recency steps (1, 0.78, 0.55) over the chain's hue —
|
|
55
|
+
* without a `color-mix()`: the result is measured like any hex, so the label ink stays
|
|
56
|
+
* automatic and no `labelColor` is needed. keksdose found a tile under ~0.55 stops
|
|
57
|
+
* reading as its hue and passes for the muted "other" (#642).
|
|
58
|
+
*
|
|
59
|
+
* Only a fill the kit can measure is shaded (a hex, a bare `var(--chart-N)` or another
|
|
60
|
+
* bare token), and only on a page that declares `--bg-surface` as a hex; anything else
|
|
61
|
+
* keeps its full hue. On a group, the default for its tiles, as `fill` is.
|
|
62
|
+
*/
|
|
63
|
+
shade?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Makes this node a GROUP (0.52, keksdose dev #642: "Is there already a distinction
|
|
66
|
+
* between shop and chain?"): a labelled frame, its name in a band along the top, its
|
|
67
|
+
* tiles laid out inside it by the map's own layout, each at its share of the whole
|
|
68
|
+
* picture (see "Groups: a frame round their tiles"). Groups nest. A group with nothing
|
|
69
|
+
* drawable inside is not drawn; an empty array is a tile.
|
|
70
|
+
*
|
|
71
|
+
* The frame is in the page's colours (the well, `--bg-surface-2`, under
|
|
72
|
+
* `--text-primary`, at least 7.4:1 in every preset and contrast), and under More
|
|
73
|
+
* contrast it is outlined in `--chart-ink` as a pale tile is. Its band is drawn only
|
|
74
|
+
* where the group has the room for it — see `TreemapCell`.
|
|
75
|
+
*/
|
|
76
|
+
children?: readonly TreemapNode[];
|
|
35
77
|
}
|
|
36
78
|
/**
|
|
37
79
|
* Everything a `<div>` takes reaches the chart's root (`ChartContainer`), so a test id
|
|
38
80
|
* or a `data-tour` anchor can find it. `children` is the chart's own.
|
|
81
|
+
*
|
|
82
|
+
* The root is a `role="figure"` (0.52, refactor audit 2026-10-30, DSP-5): name it with
|
|
83
|
+
* `aria-label` ("Spending by category"), and say what it shows with {@link
|
|
84
|
+
* TreemapProps.description}.
|
|
39
85
|
*/
|
|
40
86
|
export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
|
|
41
|
-
data: TreemapNode[];
|
|
87
|
+
data: readonly TreemapNode[];
|
|
42
88
|
/**
|
|
43
89
|
* Formats a node's value in the tooltip. Handed the node's SHARE of what is drawn
|
|
44
90
|
* (0–1) as a second argument, because a tile is read for how big it is relative to
|
|
45
91
|
* the rest, and "€412.30" alone makes the reader estimate that ratio off the areas.
|
|
46
92
|
* The share is `undefined` when the drawn total is not positive.
|
|
47
93
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
94
|
+
* A tile's and a group's accessible name (`labels.tile`, `labels.group`, 0.52) says the
|
|
95
|
+
* value too, asked of the formatter as the tooltip asks it, share and all, and its text
|
|
96
|
+
* is used; markup is said as the bare number. The name says the share itself, so a
|
|
97
|
+
* formatter that writes it into its text has it said twice.
|
|
98
|
+
*
|
|
99
|
+
* Default: the bare number through `Intl.NumberFormat` in the provider's locale (0.52,
|
|
100
|
+
* DOC-10: before, the runtime's). A host with a currency passes this — the kit knows
|
|
101
|
+
* none.
|
|
50
102
|
*/
|
|
51
103
|
valueFormatter?: (value: number, share: number | undefined) => ReactNode;
|
|
104
|
+
/**
|
|
105
|
+
* What the map SHOWS, in a sentence — "Rent is three fifths of the month." — the
|
|
106
|
+
* figure's accessible description (0.52, DSP-5). Not drawn; a caption the eye should
|
|
107
|
+
* read too belongs in the page.
|
|
108
|
+
*/
|
|
109
|
+
description?: string;
|
|
110
|
+
/** Per-map strings over `<UiKitProvider labels={{ treemap }}>`. */
|
|
111
|
+
labels?: LabelOverride<TreemapLabels>;
|
|
52
112
|
/** Chart height: a CSS length (`"20rem"`, `"min(20rem, 50dvh)"`), a Tailwind class,
|
|
53
113
|
* or px. Default `"20rem"` — 320 px at Normal, growing with the text size like the
|
|
54
114
|
* labels in the tiles (0.32, docs/text-size-harmonization.md §10.10). */
|
|
55
115
|
height?: ChartHeight;
|
|
56
|
-
/**
|
|
57
|
-
*
|
|
58
|
-
|
|
116
|
+
/**
|
|
117
|
+
* A tile was activated — by click, or by Enter/Space on a focused tile. Setting this
|
|
118
|
+
* makes every tile a `role="button"`.
|
|
119
|
+
*
|
|
120
|
+
* Either way every tile is reachable (0.52, DSP-5): ONE tab stop for the map, the
|
|
121
|
+
* arrows (←/→ along the reading direction, ↓/↑), Home and End between tiles in the
|
|
122
|
+
* order given, each named "name: value (share)" (`labels.tile`) — a `role="img"` to read
|
|
123
|
+
* when nothing listens, as PieChart's slices. Before, a map nobody clicked was nothing
|
|
124
|
+
* to a screen reader, and a clickable tile said its name alone, one tab stop each.
|
|
125
|
+
*
|
|
126
|
+
* In a map with groups (`TreemapNode.children`, 0.52) the walk is the data's own order,
|
|
127
|
+
* depth first: a group's frame, then its tiles, then the next group. A frame is named
|
|
128
|
+
* by `labels.group` ("Interspar, group: €1,240 (40%)"), a tile inside one by
|
|
129
|
+
* `labels.inGroup` round its own name ("Rankweil: €412 (12%), in Interspar"). Only
|
|
130
|
+
* tiles reach this callback (a frame reaches `onGroupClick`); a tile inside a group is
|
|
131
|
+
* handed a third argument, the ids of its groups, outermost first. Optional in the type,
|
|
132
|
+
* so a forwarder calling this with two arguments still type-checks — and absent for a
|
|
133
|
+
* tile at the top, so a flat map calls it exactly as before.
|
|
134
|
+
*/
|
|
135
|
+
onNodeClick?: (id: string, name: string, groups?: readonly string[]) => void;
|
|
136
|
+
/**
|
|
137
|
+
* A group's frame was activated — by click on its band or margin, or by Enter/Space on
|
|
138
|
+
* the focused frame (0.52). Setting this makes every frame a `role="button"`; without it
|
|
139
|
+
* a frame is a `role="img"`, still a stop of the map's keyboard so its total is heard.
|
|
140
|
+
* `groups` as for {@link TreemapProps.onNodeClick}: the groups round this one, passed
|
|
141
|
+
* only for a group inside another.
|
|
142
|
+
*/
|
|
143
|
+
onGroupClick?: (id: string, name: string, groups?: readonly string[]) => void;
|
|
59
144
|
/**
|
|
60
145
|
* The node names are the user's own data (payees, not categories): the tile labels
|
|
61
146
|
* and the whole tooltip bubble get `data-private`, the same attribute the kit's
|
|
62
147
|
* `Tooltip redact` and `ChartTooltipContent`'s value cell carry, so the host's one
|
|
63
148
|
* privacy rule reaches them. Off by default — a category name is a label of the app.
|
|
149
|
+
*
|
|
150
|
+
* Every tile is tagged as a whole too, clickable or not (0.52): its accessible name
|
|
151
|
+
* (`labels.tile`) says the name and the value, in an attribute a host's redaction
|
|
152
|
+
* reaches only through the tag.
|
|
64
153
|
*/
|
|
65
154
|
redactNames?: boolean;
|
|
66
155
|
/**
|
|
@@ -72,6 +161,8 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
|
|
|
72
161
|
* node by name or by raw value, so a per-node note would be keyed on an amount (two
|
|
73
162
|
* nodes of equal size would swap notes). And a tooltip is a pointer affordance: a
|
|
74
163
|
* phone never hovers, so a figure that only exists on hover does not exist there.
|
|
164
|
+
*
|
|
165
|
+
* Asked for tiles only: a group's band holds its name and nothing else.
|
|
75
166
|
*/
|
|
76
167
|
nodeNote?: (id: string) => string | undefined;
|
|
77
168
|
/**
|
|
@@ -80,6 +171,9 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
|
|
|
80
171
|
* and a map made of unlabelled rectangles answers nothing; around 24 is where the
|
|
81
172
|
* smallest tile of a skewed series reaches that floor on a phone-width card. The
|
|
82
173
|
* caller owns the "N more not shown" line, since it knows how many it passed.
|
|
174
|
+
*
|
|
175
|
+
* With groups, the tiles are counted across them in the order given, depth first; a
|
|
176
|
+
* group left with none is not drawn, and a group's frame is not a tile.
|
|
83
177
|
*/
|
|
84
178
|
maxTiles?: number;
|
|
85
179
|
/**
|
|
@@ -109,8 +203,9 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
|
|
|
109
203
|
*/
|
|
110
204
|
edges?: TreemapEdges;
|
|
111
205
|
}
|
|
112
|
-
/** {@link TreemapProps.edges}.
|
|
113
|
-
|
|
206
|
+
/** {@link TreemapProps.edges}. The switch itself is chart-edge's `useEdgesInForce`,
|
|
207
|
+
* which SeriesChart's bars and areas follow too since 0.52 (DSP-18). */
|
|
208
|
+
export type TreemapEdges = ChartEdges;
|
|
114
209
|
/**
|
|
115
210
|
* Fit a label to its tile: the text itself when it fits, an ellipsised head when it
|
|
116
211
|
* does not, `null` when not even three characters would. Without this a long name ran
|
|
@@ -133,14 +228,28 @@ export interface TreemapCellProps {
|
|
|
133
228
|
/** See {@link TreemapNode.labelColor}; recharts hands each node's fields to its cell. */
|
|
134
229
|
labelColor?: string;
|
|
135
230
|
id?: string;
|
|
136
|
-
|
|
231
|
+
/** Called with `groups` as its third argument when the cell has any; see
|
|
232
|
+
* {@link TreemapProps.onNodeClick}. */
|
|
233
|
+
onNodeClick?: (id: string, name: string, groups?: readonly string[]) => void;
|
|
234
|
+
/** A group's cell's click; see {@link TreemapProps.onGroupClick}. */
|
|
235
|
+
onGroupClick?: (id: string, name: string, groups?: readonly string[]) => void;
|
|
236
|
+
/** The ids of the groups round the node, outermost first. `Treemap` puts it on every
|
|
237
|
+
* node it hands recharts; a cell drawn in a caller's own map has it if the data does. */
|
|
238
|
+
groups?: readonly string[];
|
|
239
|
+
/** The node's place in the tree, which `Treemap` puts on every node it hands recharts:
|
|
240
|
+
* its key in the map's keyboard, where an id may repeat between a group and a tile. */
|
|
241
|
+
path?: string;
|
|
242
|
+
/** Filled in by recharts for a GROUP: the nodes laid out inside it. A cell with
|
|
243
|
+
* children draws a frame, not a tile (0.52). */
|
|
244
|
+
children?: readonly object[] | null;
|
|
137
245
|
redactNames?: boolean;
|
|
138
246
|
nodeNote?: (id: string) => string | undefined;
|
|
139
247
|
/** The page's reading direction, which `Treemap` reads off its own root. In `rtl`
|
|
140
248
|
* the label stands in the tile's top RIGHT corner and is shaped right-to-left, so a
|
|
141
249
|
* clipped name ends in its ellipsis on the reading end. Default `ltr`. */
|
|
142
250
|
dir?: Direction;
|
|
143
|
-
/** See {@link TreemapProps.edges}. Default `auto`.
|
|
251
|
+
/** See {@link TreemapProps.edges}. Default `auto`. Read by a cell drawn on its own; a
|
|
252
|
+
* `Treemap` hands its tiles its own `edges`. */
|
|
144
253
|
edges?: TreemapEdges;
|
|
145
254
|
}
|
|
146
255
|
/**
|
|
@@ -153,17 +262,31 @@ export interface TreemapCellProps {
|
|
|
153
262
|
* draws its own label with a halo in the TILE colour painted BEHIND the fill
|
|
154
263
|
* (`paint-order: stroke`), which defeats any inherited stroke and keeps the text solid
|
|
155
264
|
* where it overlaps a lighter or darker part of its own tile.
|
|
265
|
+
*
|
|
266
|
+
* Inside a `Treemap` it is one stop of the map's keyboard, named with its value and
|
|
267
|
+
* share (0.52); drawn on its own it is a stop only as a button (`onNodeClick`), named by
|
|
268
|
+
* `name`.
|
|
269
|
+
*
|
|
270
|
+
* A node with `children` is a GROUP (0.52): the cell draws a frame in the well's colour
|
|
271
|
+
* (`--bg-surface-2`), with the group's name in a band along its top where the group has
|
|
272
|
+
* the room (61px at Normal, treemap-layout's `BODY_SHARE`). Inside a `Treemap` its tiles are laid out
|
|
273
|
+
* in the frame's body; in a caller's own nested recharts `<Treemap>` they are drawn where
|
|
274
|
+
* recharts lays them, over the frame — only `Treemap` makes the room.
|
|
156
275
|
*/
|
|
157
|
-
export declare function TreemapCell(
|
|
276
|
+
export declare function TreemapCell(props: TreemapCellProps): import("react").JSX.Element;
|
|
158
277
|
/**
|
|
159
278
|
* Tile chart: one rectangle per {@link TreemapNode}, sized by `value`, coloured by
|
|
160
279
|
* index from the chart ramp (or by the node's own `fill`), labelled in whichever of the
|
|
161
280
|
* kit's two inks measures better against it. Hover shows the name and the formatted
|
|
162
|
-
* value;
|
|
281
|
+
* value; every tile is a keyboard stop named with its value and share (see
|
|
282
|
+
* `onNodeClick`), and `onNodeClick` turns the tiles into buttons.
|
|
283
|
+
*
|
|
284
|
+
* A node with `children` is a group (0.52): a labelled frame with its tiles inside, in
|
|
285
|
+
* its colour unless they set their own — see {@link TreemapNode.children}.
|
|
163
286
|
*
|
|
164
287
|
* Renders nothing when no node has a positive value — an empty box is a hole in the
|
|
165
288
|
* card, and the caller's own sentence is the better answer there.
|
|
166
289
|
*
|
|
167
290
|
* Needs `recharts`, like everything behind `@eifi1/ui-kit/chart`.
|
|
168
291
|
*/
|
|
169
|
-
export declare function Treemap({ data, valueFormatter, height, onNodeClick, redactNames, nodeNote, maxTiles, colors, edges, style, ...rest }: TreemapProps): import("react").JSX.Element | null;
|
|
292
|
+
export declare function Treemap({ data, valueFormatter, height, onNodeClick, onGroupClick, redactNames, nodeNote, maxTiles, colors, edges, description, labels: labelsProp, style, ...rest }: TreemapProps): import("react").JSX.Element | null;
|