@eifi1/ui-kit 0.51.6 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -26
- package/dist/account/account-parts.d.ts +10 -8
- package/dist/account/account-parts.js +1 -18
- package/dist/account/account-parts.js.map +1 -1
- package/dist/account/data-export-setting-labels.js +1 -1
- package/dist/account/data-export-setting-labels.js.map +1 -1
- package/dist/account/delete-account-setting-labels.js +1 -1
- package/dist/account/delete-account-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting-labels.js +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/passkeys-setting.d.ts +9 -2
- package/dist/account/passkeys-setting.js +41 -29
- package/dist/account/passkeys-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +3 -2
- package/dist/account/sessions-setting.js +10 -8
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.js +3 -7
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +6 -3
- package/dist/admin/admin-parts.js +6 -21
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/mail-test-card-labels.js +1 -1
- package/dist/admin/mail-test-card-labels.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -2
- package/dist/admin/plan-change-labels.js +1 -17
- package/dist/admin/plan-change-labels.js.map +1 -1
- package/dist/admin/plan-change.d.ts +3 -42
- package/dist/admin/plan-change.js +1 -1
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +3 -3
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/auth/auth-errors-labels.d.ts +11 -0
- package/dist/auth/auth-errors-labels.js +13 -0
- package/dist/auth/auth-errors-labels.js.map +1 -0
- package/dist/auth/auth-errors.d.ts +7 -23
- package/dist/auth/auth-errors.js +2 -15
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.d.ts +3 -2
- package/dist/auth/complete-name-dialog.js +3 -5
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/forgot-password-form-labels.js +1 -1
- package/dist/auth/forgot-password-form-labels.js.map +1 -1
- package/dist/auth/forgot-password-form.js +7 -2
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form-labels.js +1 -1
- package/dist/auth/register-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form-labels.js +1 -1
- package/dist/auth/reset-password-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form.js +5 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.js +1 -1
- package/dist/auth/sign-in-form-labels.js.map +1 -1
- package/dist/auth/status-parts.d.ts +0 -3
- package/dist/auth/status-parts.js +0 -4
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.js +1 -1
- package/dist/auth/verify-email-labels.js.map +1 -1
- package/dist/auth/verify-email.js +7 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/cancel-request.d.ts +11 -2
- package/dist/billing/cancel-request.js +15 -3
- package/dist/billing/cancel-request.js.map +1 -1
- package/dist/billing/cancel-subscription.d.ts +22 -10
- package/dist/billing/cancel-subscription.js +8 -11
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/dialog-close.d.ts +29 -0
- package/dist/billing/dialog-close.js +8 -0
- package/dist/billing/dialog-close.js.map +1 -0
- package/dist/billing/plan-card.d.ts +14 -4
- package/dist/billing/plan-card.js +15 -8
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-change-labels.d.ts +42 -0
- package/dist/billing/plan-change-labels.js +22 -0
- package/dist/billing/plan-change-labels.js.map +1 -0
- package/dist/billing/plan-switch.d.ts +21 -9
- package/dist/billing/plan-switch.js +10 -8
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +12 -0
- package/dist/chart.js +16 -1
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips.d.ts +5 -5
- package/dist/components/account-chips.js +11 -13
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +16 -5
- package/dist/components/alert-banner.js +46 -1
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +22 -4
- package/dist/components/amount-input.js +3 -3
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +57 -65
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.d.ts +12 -2
- package/dist/components/bulk-action-bar.js +65 -21
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-look.d.ts +5 -5
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/calculator.d.ts +21 -2
- package/dist/components/calculator.js +53 -14
- package/dist/components/calculator.js.map +1 -1
- package/dist/components/chart-edge.d.ts +16 -0
- package/dist/components/chart-edge.js +14 -1
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-figure.d.ts +13 -0
- package/dist/components/chart-figure.js +15 -0
- package/dist/components/chart-figure.js.map +1 -0
- package/dist/components/chart-zoom-core.js +1 -4
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +8 -1
- package/dist/components/chart.js +19 -10
- package/dist/components/chart.js.map +1 -1
- package/dist/components/combobox-core.d.ts +119 -7
- package/dist/components/combobox-core.js +151 -46
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +142 -131
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/copy-button.d.ts +6 -5
- package/dist/components/copy-button.js +5 -3
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.js +2 -2
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +1 -1
- package/dist/components/data-table-column-settings.js +33 -7
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +4 -2
- package/dist/components/data-table-filters.js +2 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +6 -4
- package/dist/components/data-table-fit.js +4 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.d.ts +1 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.d.ts +1 -1
- package/dist/components/data-table-head.js +15 -12
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +36 -7
- package/dist/components/data-table-mobile.js +63 -31
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js +11 -6
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +2 -2
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.d.ts +6 -2
- package/dist/components/data-table-row.js +17 -10
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-selection.d.ts +1 -1
- package/dist/components/data-table-selection.js.map +1 -1
- package/dist/components/data-table-shared.d.ts +10 -2
- package/dist/components/data-table-shared.js +18 -0
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.d.ts +21 -2
- package/dist/components/data-table-sort.js +24 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.d.ts +1 -1
- package/dist/components/data-table-virtual.js +18 -6
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.d.ts +25 -8
- package/dist/components/data-table.js +154 -25
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +24 -2
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +15 -2
- package/dist/components/date-picker.js +55 -26
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +47 -20
- package/dist/components/date-range-picker.js +23 -7
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +2 -1
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/entity-combobox.js +4 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/error-boundary.js +37 -30
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
- package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
- package/dist/components/field-base-labels.js.map +1 -0
- package/dist/components/field-base.d.ts +4 -3
- package/dist/components/field-base.js +3 -3
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/field-sync-labels.d.ts +1 -0
- package/dist/components/field-sync-labels.js.map +1 -1
- package/dist/components/field-sync.d.ts +23 -1
- package/dist/components/field-sync.js.map +1 -1
- package/dist/components/form-actions.js +11 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.d.ts +3 -0
- package/dist/components/hover-menu.js +5 -3
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +14 -9
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.d.ts +43 -0
- package/dist/components/inline-confirm.js +67 -0
- package/dist/components/inline-confirm.js.map +1 -0
- package/dist/components/inline-entity-combobox.d.ts +4 -3
- package/dist/components/inline-entity-combobox.js +150 -141
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +28 -112
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-page.d.ts +3 -1
- package/dist/components/legal-page.js +3 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +4 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.d.ts +2 -2
- package/dist/components/lightbox.js +17 -6
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/list.d.ts +6 -2
- package/dist/components/list.js +4 -3
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.d.ts +1 -1
- package/dist/components/measured-grid.js +2 -1
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/mini-calendar.js +3 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +24 -0
- package/dist/components/modal.js +12 -4
- package/dist/components/modal.js.map +1 -1
- package/dist/components/money-draft.js +7 -5
- package/dist/components/money-draft.js.map +1 -1
- package/dist/components/money-field.d.ts +2 -2
- package/dist/components/money-field.js.map +1 -1
- package/dist/components/month-grid.d.ts +55 -0
- package/dist/components/month-grid.js +148 -0
- package/dist/components/month-grid.js.map +1 -0
- package/dist/components/month-picker.d.ts +36 -4
- package/dist/components/month-picker.js +123 -146
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -1
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.d.ts +2 -2
- package/dist/components/multi-select.js +11 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-field.d.ts +6 -4
- package/dist/components/number-field.js +3 -2
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.d.ts +4 -1
- package/dist/components/number-input.js +3 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/picker-sheet.js +2 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +7 -0
- package/dist/components/pie-chart-labels.js +1 -0
- package/dist/components/pie-chart-labels.js.map +1 -1
- package/dist/components/pie-chart.d.ts +5 -3
- package/dist/components/pie-chart.js +7 -22
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.d.ts +3 -0
- package/dist/components/popover.js +7 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/reauth-dialog.d.ts +4 -5
- package/dist/components/reauth-dialog.js +1 -4
- package/dist/components/reauth-dialog.js.map +1 -1
- package/dist/components/row-actions.js +2 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/section-nav.d.ts +7 -0
- package/dist/components/section-nav.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +10 -3
- package/dist/components/series-chart-axes.js +1 -0
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +7 -4
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +31 -7
- package/dist/components/series-chart.js +72 -29
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/share-card.js +3 -3
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/sign-chip-labels.d.ts +1 -0
- package/dist/components/sign-chip-labels.js.map +1 -1
- package/dist/components/sign-chip.d.ts +10 -1
- package/dist/components/sign-chip.js.map +1 -1
- package/dist/components/tabs-labels.d.ts +2 -0
- package/dist/components/tabs-labels.js +11 -0
- package/dist/components/tabs-labels.js.map +1 -0
- package/dist/components/tabs.d.ts +1 -1
- package/dist/components/tabs.js +13 -11
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +2 -2
- package/dist/components/toggle-legend.js +6 -6
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -2
- package/dist/components/translation-review-editor.js +2 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review.d.ts +2 -1
- package/dist/components/translation-review.js +2 -2
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +26 -0
- package/dist/components/treemap-labels.js +10 -0
- package/dist/components/treemap-labels.js.map +1 -0
- package/dist/components/treemap-layout.d.ts +62 -0
- package/dist/components/treemap-layout.js +126 -0
- package/dist/components/treemap-layout.js.map +1 -0
- package/dist/components/treemap.d.ts +140 -17
- package/dist/components/treemap.js +324 -97
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/use-table-state.d.ts +5 -5
- package/dist/components/use-table-state.js +4 -1
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +6 -2
- package/dist/data-table.js +7 -2
- package/dist/data-table.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +36 -7
- package/dist/eslint/role-utilities.js +42 -9
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +25 -16
- package/dist/feedback/feedback-dialog.js +6 -2
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-mutation.d.ts +30 -0
- package/dist/feedback/feedback-mutation.js +16 -0
- package/dist/feedback/feedback-mutation.js.map +1 -0
- package/dist/feedback/feedback-page-link.d.ts +53 -0
- package/dist/feedback/feedback-page-link.js +37 -0
- package/dist/feedback/feedback-page-link.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +12 -3
- package/dist/feedback/feedback-public-list.js +2 -1
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-replies.d.ts +3 -1
- package/dist/feedback/feedback-replies.js +5 -4
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +5 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +64 -28
- package/dist/feedback/feedback-row-detail.js +30 -28
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +30 -11
- package/dist/feedback/feedback-status-undo.js +10 -15
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
- package/dist/feedback/feedback-submit-dialog.js +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.js +9 -3
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +21 -9
- package/dist/feedback/feedback-table.js +45 -25
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +2 -2
- package/dist/feedback/feedback-thread-labels.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +24 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +34 -0
- package/dist/feedback.js +42 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-dismiss.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +35 -0
- package/dist/hooks/use-focus-trap.js +6 -4
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +5 -2
- package/dist/hooks/use-hotkey.js +5 -4
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-long-press.d.ts +7 -4
- package/dist/hooks/use-long-press.js +3 -0
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-media-query.js +12 -4
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-mounted.d.ts +22 -0
- package/dist/hooks/use-mounted.js +24 -0
- package/dist/hooks/use-mounted.js.map +1 -0
- package/dist/hooks/use-overlay-history.d.ts +7 -1
- package/dist/hooks/use-overlay-history.js +35 -5
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +4 -5
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -2
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +20 -41
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -10
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +5 -0
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +64 -17
- package/dist/index.js +77 -12
- package/dist/index.js.map +1 -1
- package/dist/landing/routing.d.ts +3 -1
- package/dist/landing/routing.js +4 -7
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/broadcast.d.ts +17 -0
- package/dist/lib/broadcast.js +30 -0
- package/dist/lib/broadcast.js.map +1 -0
- package/dist/lib/calc.d.ts +7 -1
- package/dist/lib/calc.js +3 -1
- package/dist/lib/calc.js.map +1 -1
- package/dist/lib/clipboard-minus.d.ts +2 -2
- package/dist/lib/clipboard-minus.js +1 -1
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/date-format.d.ts +37 -2
- package/dist/lib/date-format.js +34 -8
- package/dist/lib/date-format.js.map +1 -1
- package/dist/lib/day-format.d.ts +46 -0
- package/dist/lib/day-format.js +46 -0
- package/dist/lib/day-format.js.map +1 -0
- package/dist/lib/decimal-marks.d.ts +7 -1
- package/dist/lib/decimal-marks.js +5 -2
- package/dist/lib/decimal-marks.js.map +1 -1
- package/dist/lib/describe-failure.d.ts +14 -0
- package/dist/lib/describe-failure.js +9 -0
- package/dist/lib/describe-failure.js.map +1 -0
- package/dist/lib/direction.d.ts +16 -0
- package/dist/lib/direction.js +9 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/focus-left.d.ts +63 -0
- package/dist/lib/focus-left.js +67 -0
- package/dist/lib/focus-left.js.map +1 -0
- package/dist/lib/format.d.ts +5 -3
- package/dist/lib/format.js +16 -13
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/http-status.d.ts +24 -0
- package/dist/lib/http-status.js +14 -0
- package/dist/lib/http-status.js.map +1 -0
- package/dist/lib/intl-cache.d.ts +14 -0
- package/dist/lib/intl-cache.js +15 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/isin.d.ts +10 -0
- package/dist/lib/isin.js.map +1 -1
- package/dist/lib/iso-day.d.ts +11 -0
- package/dist/lib/iso-day.js +8 -0
- package/dist/lib/iso-day.js.map +1 -0
- package/dist/lib/lazy-with-fallback.d.ts +31 -0
- package/dist/lib/lazy-with-fallback.js +40 -0
- package/dist/lib/lazy-with-fallback.js.map +1 -0
- package/dist/lib/path-pattern.d.ts +34 -0
- package/dist/lib/path-pattern.js +24 -0
- package/dist/lib/path-pattern.js.map +1 -0
- package/dist/lib/reduced-motion.d.ts +2 -1
- package/dist/lib/reduced-motion.js.map +1 -1
- package/dist/lib/round.d.ts +2 -1
- package/dist/lib/round.js +2 -1
- package/dist/lib/round.js.map +1 -1
- package/dist/lib/safe-storage.d.ts +24 -5
- package/dist/lib/safe-storage.js +27 -2
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/session-refresh.js +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/share-format.d.ts +13 -0
- package/dist/lib/share-format.js +10 -0
- package/dist/lib/share-format.js.map +1 -0
- package/dist/lib/text-case.d.ts +17 -0
- package/dist/lib/text-case.js +8 -0
- package/dist/lib/text-case.js.map +1 -0
- package/dist/lib/text-match.d.ts +38 -0
- package/dist/lib/text-match.js +24 -2
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/thenable.d.ts +13 -0
- package/dist/lib/thenable.js +8 -0
- package/dist/lib/thenable.js.map +1 -0
- package/dist/lib/translation-review.d.ts +7 -2
- package/dist/lib/translation-review.js +4 -4
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/device-zone-report.js +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +2 -1
- package/dist/notifications/notification-bell.js +3 -3
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +10 -6
- package/dist/notifications/notification-inbox.js +26 -48
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.d.ts +3 -2
- package/dist/notifications/notification-parts.js +1 -3
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.d.ts +6 -0
- package/dist/notifications/notifications-labels.js +1 -0
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +1 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.d.ts +2 -1
- package/dist/notifications/push-devices-setting.js +27 -49
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +10 -3
- package/dist/notifications/quiet-hours-setting.js +65 -26
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/unsubscribe-panel.js +4 -7
- package/dist/notifications/unsubscribe-panel.js.map +1 -1
- package/dist/notifications/use-push-device.d.ts +39 -1
- package/dist/notifications/use-push-device.js +28 -7
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/query-persistence.d.ts +3 -1
- package/dist/offline/query-persistence.js +19 -2
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/rhf/fields.d.ts +11 -4
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/command-palette.js +1 -1
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +19 -9
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/use-command-key.d.ts +12 -1
- package/dist/search/use-command-key.js +3 -12
- package/dist/search/use-command-key.js.map +1 -1
- package/dist/search.d.ts +7 -0
- package/dist/search.js +10 -0
- package/dist/search.js.map +1 -1
- package/dist/settings/use-settings-focus.js +1 -0
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +21 -5
- package/dist/shell/account-menu-language.js +3 -1
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +26 -9
- package/dist/shell/account-menu-text-size.js +3 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/role-switcher.d.ts +7 -0
- package/dist/shell/role-switcher.js.map +1 -1
- package/dist/shell/top-bar-actions.d.ts +1 -1
- package/dist/shell/top-bar-actions.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +0 -2
- package/dist/shell/top-bar-parts-labels.js +0 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +27 -8
- package/dist/shell.js +28 -7
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +30 -4
- package/dist/sync/engine.js +172 -52
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +6 -2
- package/dist/sync.js +6 -1
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js +3 -8
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -1
- package/dist/theme/contrast.js +3 -8
- package/dist/theme/contrast.js.map +1 -1
- package/dist/theme/palette-store.js +6 -6
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js +3 -8
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +3 -6
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.d.ts +7 -4
- package/dist/tour/tour-catalogue.js +12 -10
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.d.ts +0 -2
- package/dist/tour/tour-dock.js +0 -2
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-gates.d.ts +4 -0
- package/dist/tour/tour-gates.js +14 -0
- package/dist/tour/tour-gates.js.map +1 -1
- package/dist/tour/tour-overlay.d.ts +27 -0
- package/dist/tour/tour-overlay.js +741 -0
- package/dist/tour/tour-overlay.js.map +1 -0
- package/dist/tour/tour.d.ts +16 -4
- package/dist/tour/tour.js +62 -778
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/tour/use-tour-url-sync.js +2 -2
- package/dist/tour/use-tour-url-sync.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +6 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +3 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.d.ts +3 -1
- package/dist/wizard/validation.js.map +1 -1
- package/package.json +12 -8
- package/src/account/account-parts.ts +5 -25
- package/src/account/data-export-setting-labels.ts +1 -1
- package/src/account/delete-account-setting-labels.ts +1 -1
- package/src/account/email-change-setting-labels.ts +1 -1
- package/src/account/passkeys-setting.tsx +60 -38
- package/src/account/sessions-setting.tsx +18 -12
- package/src/admin/admin-action-confirm.tsx +5 -10
- package/src/admin/admin-parts.ts +11 -25
- package/src/admin/mail-test-card-labels.ts +1 -1
- package/src/admin/plan-change-labels.ts +5 -23
- package/src/admin/plan-change.tsx +7 -44
- package/src/admin/reviewer-scope-editor.tsx +3 -3
- package/src/auth/auth-errors-labels.ts +23 -0
- package/src/auth/auth-errors.ts +11 -38
- package/src/auth/complete-name-dialog.tsx +9 -8
- package/src/auth/forgot-password-form-labels.ts +1 -1
- package/src/auth/forgot-password-form.tsx +11 -6
- package/src/auth/register-form-labels.ts +1 -1
- package/src/auth/reset-password-form-labels.ts +1 -1
- package/src/auth/reset-password-form.tsx +8 -4
- package/src/auth/sign-in-form-labels.ts +1 -1
- package/src/auth/status-parts.tsx +0 -6
- package/src/auth/verify-email-labels.ts +1 -1
- package/src/auth/verify-email.tsx +11 -6
- package/src/billing/cancel-request.ts +28 -6
- package/src/billing/cancel-subscription.tsx +29 -22
- package/src/billing/dialog-close.ts +34 -0
- package/src/billing/plan-card.tsx +36 -11
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +31 -20
- package/src/chart.ts +21 -3
- package/src/components/account-chips.tsx +20 -23
- package/src/components/alert-banner.tsx +82 -5
- package/src/components/amount-input.tsx +32 -14
- package/src/components/autocomplete.tsx +64 -70
- package/src/components/bulk-action-bar.tsx +70 -2
- package/src/components/button-look.ts +5 -5
- package/src/components/button.tsx +2 -2
- package/src/components/calculator.tsx +98 -17
- package/src/components/chart-edge.ts +34 -1
- package/src/components/chart-figure.tsx +35 -0
- package/src/components/chart-zoom-core.tsx +6 -5
- package/src/components/chart.tsx +26 -5
- package/src/components/combobox-core.tsx +303 -69
- package/src/components/combobox.tsx +184 -155
- package/src/components/copy-button.tsx +34 -23
- package/src/components/country-select.tsx +16 -11
- package/src/components/data-table-column-settings.tsx +52 -10
- package/src/components/data-table-filters.ts +6 -4
- package/src/components/data-table-fit.ts +19 -5
- package/src/components/data-table-groups.tsx +1 -1
- package/src/components/data-table-head.tsx +32 -22
- package/src/components/data-table-mobile.tsx +110 -27
- package/src/components/data-table-pagination.tsx +21 -6
- package/src/components/data-table-resize.ts +1 -1
- package/src/components/data-table-row-actions.tsx +3 -3
- package/src/components/data-table-row.tsx +25 -14
- package/src/components/data-table-selection.ts +1 -1
- package/src/components/data-table-shared.tsx +33 -1
- package/src/components/data-table-sort.ts +57 -2
- package/src/components/data-table-virtual.ts +32 -8
- package/src/components/data-table.tsx +267 -41
- package/src/components/date-field.tsx +65 -8
- package/src/components/date-picker.tsx +125 -48
- package/src/components/date-range-picker.tsx +82 -31
- package/src/components/dialog-frame.tsx +2 -1
- package/src/components/entity-combobox.tsx +4 -1
- package/src/components/error-boundary.tsx +53 -39
- package/src/components/field-base-labels.ts +20 -0
- package/src/components/field-base.tsx +13 -7
- package/src/components/field-sync-labels.ts +1 -0
- package/src/components/field-sync.tsx +23 -1
- package/src/components/form-actions.tsx +20 -5
- package/src/components/hover-menu.tsx +18 -8
- package/src/components/icon-button.tsx +14 -9
- package/src/components/inline-confirm.tsx +116 -0
- package/src/components/inline-entity-combobox.tsx +198 -152
- package/src/components/input.tsx +1 -1
- package/src/components/jump-calendar.tsx +30 -146
- package/src/components/legal-page.tsx +10 -7
- package/src/components/legal.tsx +4 -2
- package/src/components/lightbox.tsx +21 -8
- package/src/components/list.tsx +14 -5
- package/src/components/measured-grid.tsx +8 -4
- package/src/components/mini-calendar.tsx +6 -5
- package/src/components/modal.tsx +45 -4
- package/src/components/money-draft.ts +16 -5
- package/src/components/money-field.tsx +2 -2
- package/src/components/month-grid.tsx +229 -0
- package/src/components/month-picker.tsx +192 -200
- package/src/components/multi-entity-combobox.tsx +1 -0
- package/src/components/multi-select.tsx +21 -9
- package/src/components/number-field.tsx +14 -7
- package/src/components/number-input.tsx +9 -3
- package/src/components/numpad-sheet.tsx +4 -3
- package/src/components/picker-sheet.tsx +12 -9
- package/src/components/pie-chart-labels.ts +8 -0
- package/src/components/pie-chart.tsx +22 -28
- package/src/components/popover.tsx +18 -1
- package/src/components/reauth-dialog.tsx +6 -10
- package/src/components/row-actions.tsx +2 -1
- package/src/components/section-nav.tsx +7 -0
- package/src/components/series-chart-axes.ts +11 -3
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +178 -69
- package/src/components/share-card.tsx +6 -6
- package/src/components/sign-chip-labels.ts +1 -0
- package/src/components/sign-chip.tsx +10 -1
- package/src/components/tabs-labels.ts +13 -0
- package/src/components/tabs.tsx +35 -19
- package/src/components/toggle-legend.tsx +16 -11
- package/src/components/translation-review-editor.tsx +6 -5
- package/src/components/translation-review.tsx +4 -3
- package/src/components/treemap-labels.ts +39 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +722 -133
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +9 -2
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +41 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +17 -5
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +5 -0
- package/src/feedback/feedback-row-detail.tsx +103 -67
- package/src/feedback/feedback-status-undo.ts +41 -27
- package/src/feedback/feedback-submit-dialog.tsx +2 -2
- package/src/feedback/feedback-submit.tsx +21 -7
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table.tsx +86 -38
- package/src/feedback/feedback-thread-labels.ts +2 -2
- package/src/feedback/feedback-thread.tsx +27 -25
- package/src/feedback.ts +42 -0
- package/src/hooks/use-dismiss.ts +3 -2
- package/src/hooks/use-focus-trap.ts +8 -24
- package/src/hooks/use-hotkey.ts +24 -7
- package/src/hooks/use-long-press.ts +16 -2
- package/src/hooks/use-media-query.ts +20 -4
- package/src/hooks/use-mounted.ts +39 -0
- package/src/hooks/use-overlay-history.ts +70 -5
- package/src/i18n/defaults.ts +4 -5
- package/src/i18n/german.ts +8 -2
- package/src/i18n/kit-labels.tsx +9 -2
- package/src/i18n/locales/es.ts +8 -2
- package/src/i18n/locales/fr.ts +21 -13
- package/src/i18n/locales/hu.ts +10 -2
- package/src/i18n/locales/it.ts +8 -2
- package/src/i18n/locales/zh.ts +9 -2
- package/src/i18n/review.ts +5 -0
- package/src/index.ts +103 -13
- package/src/landing/routing.tsx +14 -10
- package/src/lib/broadcast.ts +52 -0
- package/src/lib/calc.ts +13 -2
- package/src/lib/clipboard-minus.ts +14 -4
- package/src/lib/date-format.ts +89 -13
- package/src/lib/day-format.ts +96 -0
- package/src/lib/decimal-marks.ts +12 -3
- package/src/lib/describe-failure.ts +18 -0
- package/src/lib/direction.ts +39 -0
- package/src/lib/focus-left.ts +156 -0
- package/src/lib/format.ts +34 -19
- package/src/lib/http-status.ts +38 -0
- package/src/lib/intl-cache.ts +25 -0
- package/src/lib/isin.ts +10 -0
- package/src/lib/iso-day.ts +13 -0
- package/src/lib/lazy-with-fallback.ts +82 -0
- package/src/lib/path-pattern.ts +55 -0
- package/src/lib/reduced-motion.ts +2 -1
- package/src/lib/round.ts +7 -2
- package/src/lib/safe-storage.ts +48 -6
- package/src/lib/session-refresh.ts +1 -1
- package/src/lib/share-format.ts +18 -0
- package/src/lib/text-case.ts +19 -0
- package/src/lib/text-match.ts +69 -2
- package/src/lib/thenable.ts +19 -0
- package/src/lib/translation-review.ts +13 -5
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-bell.tsx +7 -4
- package/src/notifications/notification-inbox.tsx +40 -58
- package/src/notifications/notification-parts.tsx +3 -4
- package/src/notifications/notification-types-setting.tsx +1 -1
- package/src/notifications/notifications-labels.ts +7 -0
- package/src/notifications/push-device-setting.tsx +1 -1
- package/src/notifications/push-devices-setting.tsx +30 -55
- package/src/notifications/quiet-hours-setting.tsx +93 -31
- package/src/notifications/unsubscribe-panel.tsx +4 -7
- package/src/notifications/use-push-device.ts +76 -10
- package/src/offline/query-persistence.ts +35 -3
- package/src/rhf/fields.tsx +11 -4
- package/src/search/command-palette.tsx +2 -4
- package/src/search/global-search.tsx +36 -15
- package/src/search/use-command-key.ts +13 -12
- package/src/search.ts +9 -0
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +27 -5
- package/src/shell/account-menu-text-size.tsx +32 -10
- package/src/shell/dev-menu.tsx +7 -21
- package/src/shell/role-switcher.tsx +7 -0
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +0 -3
- package/src/shell.ts +40 -9
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +8 -1
- package/src/testing/css-variables.ts +8 -9
- package/src/theme/contrast.ts +8 -9
- package/src/theme/palette-store.ts +9 -9
- package/src/theme/text-size.ts +6 -8
- package/src/theme/theme-store.ts +7 -9
- package/src/tour/tour-catalogue.tsx +26 -15
- package/src/tour/tour-dock.ts +0 -2
- package/src/tour/tour-gates.ts +23 -0
- package/src/tour/tour-overlay.tsx +1170 -0
- package/src/tour/tour.tsx +116 -1193
- package/src/tour/use-tour-progress.ts +1 -1
- package/src/tour/use-tour-url-sync.ts +7 -3
- package/src/wizard/stepper-nav.tsx +3 -1
- package/src/wizard/types.ts +11 -2
- package/src/wizard/use-wizard.ts +2 -1
- package/src/wizard/validation.ts +8 -2
- package/tokens.css +2 -1
- package/dist/components/ui-labels.js.map +0 -1
- package/dist/shell/dev-switchers.d.ts +0 -6
- package/dist/shell/dev-switchers.js +0 -12
- package/dist/shell/dev-switchers.js.map +0 -1
- package/src/components/ui-labels.ts +0 -24
- package/src/shell/dev-switchers.tsx +0 -18
|
@@ -14,6 +14,8 @@ import { Button } from "../components/button";
|
|
|
14
14
|
import { DialogFrame } from "../components/dialog-frame";
|
|
15
15
|
import { useBillingLabels } from "./billing-labels";
|
|
16
16
|
import type { BillingLabels } from "./billing-labels";
|
|
17
|
+
import { dialogClose } from "./dialog-close";
|
|
18
|
+
import type { WithDialogClose } from "./dialog-close";
|
|
17
19
|
import { BILLING_INTERVALS, billingCurrencyFor, formatPlanPrice, planPrice } from "./plan-price";
|
|
18
20
|
import type { BillingCurrency, BillingInterval, PlanPrices } from "./plan-price";
|
|
19
21
|
|
|
@@ -489,9 +491,7 @@ export function PlanPicker({
|
|
|
489
491
|
{permanentGrant && !switching && (
|
|
490
492
|
<GrantWarningConfirm
|
|
491
493
|
open={warned !== null}
|
|
492
|
-
|
|
493
|
-
if (!open) setWarned(null);
|
|
494
|
-
}}
|
|
494
|
+
onClose={() => setWarned(null)}
|
|
495
495
|
onConfirm={() => {
|
|
496
496
|
if (warned) onChoose(warned);
|
|
497
497
|
}}
|
|
@@ -502,11 +502,16 @@ export function PlanPicker({
|
|
|
502
502
|
);
|
|
503
503
|
}
|
|
504
504
|
|
|
505
|
-
|
|
505
|
+
/** {@link GrantWarningConfirmProps} before one of its two close props is required. */
|
|
506
|
+
interface GrantWarningConfirmFields {
|
|
506
507
|
/** Shown, controlled. */
|
|
507
508
|
open: boolean;
|
|
508
|
-
/**
|
|
509
|
-
|
|
509
|
+
/** "Back", Escape, the backdrop — and after "Buy anyway". 0.52: every other kit
|
|
510
|
+
* dialog's `onClose` (CONTRIBUTING §4; refactor audit 2026-10-30, API-5). */
|
|
511
|
+
onClose?: () => void;
|
|
512
|
+
/** @deprecated 0.52 — `onClose`, as every other kit dialog; removed in 0.53. Called with
|
|
513
|
+
* `false` when there is no `onClose`. */
|
|
514
|
+
onOpenChange?: (open: boolean) => void;
|
|
510
515
|
/** "Buy anyway": the app opens its checkout. The dialog closes itself after it. */
|
|
511
516
|
onConfirm: () => void;
|
|
512
517
|
/** Prop > `<UiKitProvider labels={{ billing }}>` > English: `grantWarningTitle`,
|
|
@@ -514,6 +519,11 @@ export interface GrantWarningConfirmProps {
|
|
|
514
519
|
labels?: LabelOverride<BillingLabels>;
|
|
515
520
|
}
|
|
516
521
|
|
|
522
|
+
/** What {@link GrantWarningConfirm} takes: `onClose`, or alone the deprecated
|
|
523
|
+
* `onOpenChange`, is required (0.52 code review: with neither it compiled, and nothing
|
|
524
|
+
* could dismiss it). */
|
|
525
|
+
export type GrantWarningConfirmProps = WithDialogClose<GrantWarningConfirmFields>;
|
|
526
|
+
|
|
517
527
|
/**
|
|
518
528
|
* 0.42 (§16.8 B): the permanent-grant warning before a checkout — `grantWarningTitle`,
|
|
519
529
|
* `grantWarningBody`, "Back" and "Buy anyway" (`grantWarningAction`). {@link PlanPicker}
|
|
@@ -523,26 +533,41 @@ export interface GrantWarningConfirmProps {
|
|
|
523
533
|
* to a checkout — show this before that checkout, so a permanent-grant holder is still
|
|
524
534
|
* warned. Carries `data-grant-warning`.
|
|
525
535
|
*/
|
|
526
|
-
export function GrantWarningConfirm({
|
|
536
|
+
export function GrantWarningConfirm({
|
|
537
|
+
open,
|
|
538
|
+
onClose,
|
|
539
|
+
onOpenChange,
|
|
540
|
+
onConfirm,
|
|
541
|
+
labels: labelsProp,
|
|
542
|
+
}: GrantWarningConfirmProps) {
|
|
527
543
|
const labels = useBillingLabels(labelsProp);
|
|
528
544
|
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
545
|
+
const close = dialogClose({ onClose, onOpenChange });
|
|
529
546
|
return (
|
|
530
547
|
<DialogFrame
|
|
531
548
|
open={open}
|
|
532
549
|
title={labels.grantWarningTitle}
|
|
533
550
|
description={labels.grantWarningBody}
|
|
534
|
-
onClose={
|
|
551
|
+
onClose={close}
|
|
535
552
|
data-grant-warning=""
|
|
536
|
-
actions={(
|
|
553
|
+
actions={(lower) => (
|
|
537
554
|
<>
|
|
538
|
-
<Button variant="secondary" onClick={
|
|
555
|
+
<Button variant="secondary" onClick={lower}>
|
|
539
556
|
{common.back}
|
|
540
557
|
</Button>
|
|
541
558
|
<Button
|
|
542
559
|
variant="default"
|
|
543
560
|
onClick={() => {
|
|
561
|
+
// Already closed, and lowering: a second press is no second checkout, for an
|
|
562
|
+
// app that shows this dialog itself as much as for PlanPicker.
|
|
563
|
+
if (!open) return;
|
|
544
564
|
onConfirm();
|
|
545
|
-
|
|
565
|
+
// The caller's close, at once — not `lower`, the panel's animated one, which
|
|
566
|
+
// reports the close 220 ms later. PlanPicker clears the warned choice in it,
|
|
567
|
+
// and the lowering panel is not inert: a double click on "Buy anyway" opened
|
|
568
|
+
// the checkout twice (0.52 code review, plan-card.tsx). The caller's `open`
|
|
569
|
+
// turning false still plays the exit.
|
|
570
|
+
close();
|
|
546
571
|
}}
|
|
547
572
|
>
|
|
548
573
|
{labels.grantWarningAction}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// The words of admin/plan-change and their type, in a module with no component code: the
|
|
2
|
+
// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`
|
|
3
|
+
// loads as one chunk like the other languages (0.34, KS U8). In billing/ since 0.52:
|
|
4
|
+
// PlanSwitchConfirm reads them too, and with them in admin/ the billing and admin folders
|
|
5
|
+
// imported each other (refactor audit 2026-10-30, MOD-6). admin/plan-change re-exports
|
|
6
|
+
// both, and admin/plan-change-labels still answers for the old path.
|
|
7
|
+
|
|
8
|
+
/** The `planChange` namespace: the column, the grant dialog and the result's lines. */
|
|
9
|
+
export interface PlanChangeLabels {
|
|
10
|
+
/** The column's header: "Plan". */
|
|
11
|
+
column: string;
|
|
12
|
+
/** The dialog's title: "Change plan". */
|
|
13
|
+
title: string;
|
|
14
|
+
/** Its confirm button: "Change plan". */
|
|
15
|
+
confirm: string;
|
|
16
|
+
/** The plan select's label: "Plan". */
|
|
17
|
+
plan: string;
|
|
18
|
+
/** The line over the select: "Current plan: Free". */
|
|
19
|
+
current: (plan: string) => string;
|
|
20
|
+
/** Under the select — the fact that is not on the button. */
|
|
21
|
+
keepsItems: string;
|
|
22
|
+
/** The end of a free grant's field: "Free until". */
|
|
23
|
+
until: string;
|
|
24
|
+
/** Under it. */
|
|
25
|
+
untilHint: string;
|
|
26
|
+
/** Why the confirm is held while nothing would change. */
|
|
27
|
+
needsChange: string;
|
|
28
|
+
/** The result: the plan moved from one to another. */
|
|
29
|
+
changed: (from: string, to: string) => string;
|
|
30
|
+
/** The result: an account with no plan before, or the same plan again. */
|
|
31
|
+
set: (to: string) => string;
|
|
32
|
+
/** The result: a running beta kept its own end (§12.34); only the plan moved. */
|
|
33
|
+
keptBeta: string;
|
|
34
|
+
/** The result: the grant runs until `date` (formatted). */
|
|
35
|
+
untilDone: (date: string) => string;
|
|
36
|
+
/** The result: the account owns more than the new plan allows. */
|
|
37
|
+
overLimit: string;
|
|
38
|
+
/**
|
|
39
|
+
* The column's usage, spelled out (its tooltip): "1 of 5 budgets". Figures arrive
|
|
40
|
+
* formatted; `dimension` is the app's word, as `usage.label` gives it — since 0.33.1
|
|
41
|
+
* in the form the LIMIT takes when the label gives its plural forms ("1 of 1 budget",
|
|
42
|
+
* "1 of 5 budgets"): in every shipped language the word follows the limit, or heads
|
|
43
|
+
* the line in German, whose `von` would want a dative plural no app form carries
|
|
44
|
+
* ("Budgets: 1 von 5"). An override of yours gets the same word. Since 0.34 the grant
|
|
45
|
+
* dialog's usage line too, when `usage` comes as the column's shape.
|
|
46
|
+
*/
|
|
47
|
+
usageOf: (used: string, limit: string, dimension: string) => string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const DEFAULT_PLAN_CHANGE_LABELS: PlanChangeLabels = {
|
|
51
|
+
column: "Plan",
|
|
52
|
+
title: "Change plan",
|
|
53
|
+
confirm: "Change plan",
|
|
54
|
+
plan: "Plan",
|
|
55
|
+
current: (plan) => `Current plan: ${plan}`,
|
|
56
|
+
keepsItems: "A smaller plan only blocks creating more; nothing is deleted.",
|
|
57
|
+
until: "Free until",
|
|
58
|
+
untilHint: "Leave empty for no end. A running beta keeps its own end.",
|
|
59
|
+
needsChange: "Pick another plan or an end date.",
|
|
60
|
+
changed: (from, to) => `Plan changed from ${from} to ${to}.`,
|
|
61
|
+
set: (to) => `Plan set to ${to}.`,
|
|
62
|
+
keptBeta: "The beta keeps its end; only the plan changed.",
|
|
63
|
+
untilDone: (date) => `Free until ${date}.`,
|
|
64
|
+
overLimit: "Above the new plan’s limit: nothing is removed, new items are blocked.",
|
|
65
|
+
usageOf: (used, limit, dimension) => `${used} of ${limit} ${dimension}`,
|
|
66
|
+
};
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import type { KeyboardEvent } from "react";
|
|
2
|
-
|
|
3
1
|
import { useKitLabels, useKitLocale } from "../i18n/kit-labels";
|
|
4
2
|
import type { LabelOverride } from "../i18n/kit-labels";
|
|
5
3
|
import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
|
|
6
4
|
import { pluralForm } from "../i18n/plurals";
|
|
7
5
|
import type { PluralForms } from "../i18n/plurals";
|
|
8
|
-
import {
|
|
6
|
+
import { useDayFormatter } from "../lib/day-format";
|
|
7
|
+
import { formatMoney, formatNumber } from "../lib/format";
|
|
9
8
|
import { AlertBanner } from "../components/alert-banner";
|
|
10
9
|
import { Button } from "../components/button";
|
|
11
10
|
import { DialogFrame } from "../components/dialog-frame";
|
|
12
11
|
import { Spinner } from "../components/spinner";
|
|
13
12
|
import { COMMIT_EXCEPT_BILLING } from "../components/write-lock";
|
|
14
|
-
import { DEFAULT_PLAN_CHANGE_LABELS } from "
|
|
13
|
+
import { DEFAULT_PLAN_CHANGE_LABELS } from "./plan-change-labels";
|
|
15
14
|
import { useBillingLabels } from "./billing-labels";
|
|
16
15
|
import type { BillingLabels } from "./billing-labels";
|
|
16
|
+
import { dialogClose } from "./dialog-close";
|
|
17
|
+
import type { WithDialogClose } from "./dialog-close";
|
|
17
18
|
import type { PlanSwitchPreview } from "./billing-overview";
|
|
18
19
|
import { minorToMajor } from "./plan-price";
|
|
19
20
|
import type { BillingInterval } from "./plan-price";
|
|
@@ -38,11 +39,16 @@ export interface PlanSwitchSide {
|
|
|
38
39
|
interval: BillingInterval;
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
/** {@link PlanSwitchConfirmProps} before one of its two close props is required. */
|
|
43
|
+
interface PlanSwitchConfirmFields {
|
|
42
44
|
open: boolean;
|
|
43
|
-
/**
|
|
44
|
-
* it
|
|
45
|
-
|
|
45
|
+
/** The payer dismissed it — Cancel, Escape, the backdrop. Confirm leaves it open: close
|
|
46
|
+
* it once the switch answers. 0.52: every other kit dialog's `onClose` (CONTRIBUTING
|
|
47
|
+
* §4; refactor audit 2026-10-30, API-5). */
|
|
48
|
+
onClose?: () => void;
|
|
49
|
+
/** @deprecated 0.52 — `onClose`, as every other kit dialog; removed in 0.53. Called with
|
|
50
|
+
* `false` when there is no `onClose`. */
|
|
51
|
+
onOpenChange?: (open: boolean) => void;
|
|
46
52
|
/** What the payer pays now: the overview's `paid`. */
|
|
47
53
|
from: PlanSwitchSide;
|
|
48
54
|
/** The pick. */
|
|
@@ -50,8 +56,8 @@ export interface PlanSwitchConfirmProps {
|
|
|
50
56
|
/** `POST /billing/plan/preview`'s answer. Undefined while it loads: a spinner, and
|
|
51
57
|
* Confirm is held. */
|
|
52
58
|
preview?: PlanSwitchPreview;
|
|
53
|
-
/** `POST /billing/plan` is under way: Confirm's spinner, no second press, and
|
|
54
|
-
*
|
|
59
|
+
/** `POST /billing/plan` is under way: Confirm's spinner, no second press, and neither
|
|
60
|
+
* Escape, the backdrop nor Back closes it. */
|
|
55
61
|
pending?: boolean;
|
|
56
62
|
/** The plan's display name, the app's (§3.1). Default: the code. */
|
|
57
63
|
planName?: (code: string) => string;
|
|
@@ -66,7 +72,8 @@ export interface PlanSwitchConfirmProps {
|
|
|
66
72
|
formatLimit?: (dimension: string, value: number) => string;
|
|
67
73
|
/** Confirm: the app's `POST /billing/plan` with `{plan, interval}` of `to`. */
|
|
68
74
|
onConfirm: () => void;
|
|
69
|
-
/** The figures' and the date's locale. Default: the provider's.
|
|
75
|
+
/** The figures' and the date's locale. Default: the provider's. The next charge's date
|
|
76
|
+
* is written by the `<UiKitProvider formatDate>` when the app set one (0.52). */
|
|
70
77
|
locale?: string;
|
|
71
78
|
/**
|
|
72
79
|
* 0.42 (§16.2 decision 5, §16.8 B): the payer's free grant runs without an end —
|
|
@@ -81,6 +88,11 @@ export interface PlanSwitchConfirmProps {
|
|
|
81
88
|
labels?: LabelOverride<BillingLabels>;
|
|
82
89
|
}
|
|
83
90
|
|
|
91
|
+
/** What {@link PlanSwitchConfirm} takes: `onClose`, or alone the deprecated
|
|
92
|
+
* `onOpenChange`, is required (0.52 code review: with neither it compiled, and nothing
|
|
93
|
+
* could dismiss it). */
|
|
94
|
+
export type PlanSwitchConfirmProps = WithDialogClose<PlanSwitchConfirmFields>;
|
|
95
|
+
|
|
84
96
|
/**
|
|
85
97
|
* The confirm for a plan switch (§15.2.10): from → to, each with its billing period;
|
|
86
98
|
* Paddle's preview — "Charged now" (an upgrade) or "Credited towards your next charges"
|
|
@@ -90,7 +102,7 @@ export interface PlanSwitchConfirmProps {
|
|
|
90
102
|
* const preview = useMutation({ mutationFn: api.previewPlanSwitch });
|
|
91
103
|
* <PlanSwitchConfirm
|
|
92
104
|
* open={pick !== null}
|
|
93
|
-
*
|
|
105
|
+
* onClose={() => setPick(null)}
|
|
94
106
|
* from={overview.paid}
|
|
95
107
|
* to={pick}
|
|
96
108
|
* preview={preview.data}
|
|
@@ -105,6 +117,7 @@ export interface PlanSwitchConfirmProps {
|
|
|
105
117
|
*/
|
|
106
118
|
export function PlanSwitchConfirm({
|
|
107
119
|
open,
|
|
120
|
+
onClose,
|
|
108
121
|
onOpenChange,
|
|
109
122
|
from,
|
|
110
123
|
to,
|
|
@@ -122,6 +135,7 @@ export function PlanSwitchConfirm({
|
|
|
122
135
|
const planChange = useKitLabels("planChange", DEFAULT_PLAN_CHANGE_LABELS);
|
|
123
136
|
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
124
137
|
const locale = useKitLocale(localeProp);
|
|
138
|
+
const day = useDayFormatter(undefined, localeProp);
|
|
125
139
|
|
|
126
140
|
const period = (interval: BillingInterval) => (interval === "year" ? labels.yearly : labels.monthly);
|
|
127
141
|
const side = (s: PlanSwitchSide) => `${planName(s.plan.toLowerCase())} (${period(s.interval)})`;
|
|
@@ -151,11 +165,10 @@ export function PlanSwitchConfirm({
|
|
|
151
165
|
open={open}
|
|
152
166
|
title={labels.switchTitle}
|
|
153
167
|
description={labels.switchFromTo(side(from), side(to))}
|
|
154
|
-
onClose={(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
aria-busy={preview === undefined || pending || undefined}
|
|
168
|
+
onClose={dialogClose({ onClose, onOpenChange })}
|
|
169
|
+
busy={pending}
|
|
170
|
+
// A preview that loads is busy too, but holds nothing: Cancel stays a way out.
|
|
171
|
+
aria-busy={preview === undefined || undefined}
|
|
159
172
|
actions={(close) => (
|
|
160
173
|
<>
|
|
161
174
|
<Button variant="secondary" onClick={close} disabled={pending}>
|
|
@@ -192,9 +205,7 @@ export function PlanSwitchConfirm({
|
|
|
192
205
|
</dd>
|
|
193
206
|
{preview.next_billed_at && preview.next_minor != null && (
|
|
194
207
|
<>
|
|
195
|
-
<dt className="text-secondary">
|
|
196
|
-
{labels.switchNextCharge(formatDate(preview.next_billed_at, "medium", { locale }))}
|
|
197
|
-
</dt>
|
|
208
|
+
<dt className="text-secondary">{labels.switchNextCharge(day(preview.next_billed_at))}</dt>
|
|
198
209
|
<dd className="text-right tabular-nums">{money(preview.next_minor, preview.currency)}</dd>
|
|
199
210
|
</>
|
|
200
211
|
)}
|
package/src/chart.ts
CHANGED
|
@@ -2,22 +2,36 @@
|
|
|
2
2
|
//
|
|
3
3
|
// A re-slicing of what the main barrel already exports, not a new API. It exists so a
|
|
4
4
|
// consumer can reach the chart kit WITHOUT the barrel: `import("@eifi1/ui-kit/chart")`
|
|
5
|
-
// is a
|
|
6
|
-
//
|
|
5
|
+
// is a chunk of its own (50.4 KB min, 19.9 KB gzip at 0.51.6, refactor audit 2026-10-30
|
|
6
|
+
// MOD-7; it was 31KB when this was written), where the same lazy import through the barrel
|
|
7
|
+
// pulls the barrel, because a dynamic import of it cannot be tree-shaken down to one member.
|
|
7
8
|
//
|
|
8
9
|
// It is about chunk size, not about the peer: `recharts` is a REQUIRED peer (since 0.5.0),
|
|
9
10
|
// because the main barrel re-exports everything here too, so `import { Button } from
|
|
10
11
|
// "@eifi1/ui-kit"` reaches recharts as well (packaging-contract.test.ts asserts it).
|
|
11
12
|
export * from "./components/chart";
|
|
12
13
|
export * from "./theme/chart-palette";
|
|
14
|
+
// 0.52: the slice's share of the 55 names no app reads (refactor audit 2026-10-30, API-4,
|
|
15
|
+
// decision 4), tagged on their specifiers as the barrel's are — the modules keep them.
|
|
16
|
+
export {
|
|
17
|
+
/** @deprecated 0.52 — `chartEdge`, which measures a fill against it (API-4); removed in 0.53 */
|
|
18
|
+
EDGE_MIN_CONTRAST,
|
|
19
|
+
/** @deprecated 0.52 — `--chart-ink` (`CHART_ROLES.outline`), the same ink as a token (API-4); removed in 0.53 */
|
|
20
|
+
CHART_INK_HEX,
|
|
21
|
+
} from "./theme/chart-palette";
|
|
13
22
|
|
|
14
23
|
// The tile chart (treemap) the apps share — moved here from keksdose so every consumer
|
|
15
|
-
// derives it from the package rather than from a copy.
|
|
24
|
+
// derives it from the package rather than from a copy. 0.52: its `treemap` label namespace.
|
|
16
25
|
export * from "./components/treemap";
|
|
26
|
+
export * from "./components/treemap-labels";
|
|
17
27
|
|
|
18
28
|
// lenkbank's zoomable series chart, its synced x-zoom, the toggle legend and the
|
|
19
29
|
// mirrored-pair axis geometry — moved here so the apps derive them from the package.
|
|
20
30
|
export * from "./components/series-chart";
|
|
31
|
+
export {
|
|
32
|
+
/** @deprecated 0.52 — `SeriesChart`, which places its tooltip with it (API-4); removed in 0.53 */
|
|
33
|
+
resolveTooltipPlacement,
|
|
34
|
+
} from "./components/series-chart";
|
|
21
35
|
// 0.32.1 (keksdose's 0.32 report): the height every chart takes, for an app's wrappers.
|
|
22
36
|
export type { ChartHeight } from "./components/chart-height";
|
|
23
37
|
// SharedXZoom and the zoom's types: the public face of ./chart-zoom-core, whose arithmetic
|
|
@@ -28,6 +42,10 @@ export * from "./components/chart-zoom";
|
|
|
28
42
|
// recharts, so chart-zoom-core has to be one of them (MOD-6).
|
|
29
43
|
export { SharedXZoom } from "./components/chart-zoom-core";
|
|
30
44
|
export * from "./components/toggle-legend";
|
|
45
|
+
export {
|
|
46
|
+
/** @deprecated 0.52 — `strokeDash`, which picks a series' pattern from it (API-4); removed in 0.53 */
|
|
47
|
+
STROKE_PATTERNS,
|
|
48
|
+
} from "./components/toggle-legend";
|
|
31
49
|
export * from "./components/facing-pair";
|
|
32
50
|
export * from "./components/series-chart-labels";
|
|
33
51
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { ReactElement, ReactNode } from "react";
|
|
2
2
|
import type { LucideIcon } from "lucide-react";
|
|
3
3
|
import { cn } from "../lib/cn";
|
|
4
|
-
import {
|
|
4
|
+
import { toDate, useKitFormat, EMPTY_FORMATTED_VALUE } from "../lib/format";
|
|
5
5
|
import type { DateInput, FormatDateStyle, FormatRelativeTimeOptions } from "../lib/format";
|
|
6
|
-
import {
|
|
6
|
+
import { useDayFormatter } from "../lib/day-format";
|
|
7
|
+
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
7
8
|
import { toLocalIso } from "../lib/dates";
|
|
8
9
|
import { Chip } from "./chip";
|
|
9
10
|
import type { ChipLinkProps, ChipShape, ChipSize, ChipTone, ChipVariant } from "./chip";
|
|
@@ -292,17 +293,15 @@ export function AccountStateChip({
|
|
|
292
293
|
// An `undefined` in the prop is skipped (the provider's merge does that), so an
|
|
293
294
|
// optional value cannot blank a default.
|
|
294
295
|
const labels = useKitLabels("accountState", DEFAULT_ACCOUNT_STATE_LABELS, labelsProp);
|
|
295
|
-
|
|
296
|
-
|
|
296
|
+
// The kit's one day ladder: the provider's `formatDate`, else `Intl` in the provider's
|
|
297
|
+
// locale and `timeZone` (refactor audit 2026-10-30, DUP-2).
|
|
298
|
+
const day = useDayFormatter(null, localeProp);
|
|
297
299
|
const when = state === "deletion" ? toDate(date ?? null) : null;
|
|
298
300
|
let text: ReactNode;
|
|
299
301
|
if (state !== "deletion") text = labels[state];
|
|
300
302
|
else if (when) {
|
|
301
303
|
// A date in a SENTENCE, so no weekday (keksdose's rule, KitDateFormatContext).
|
|
302
|
-
|
|
303
|
-
(fromProvider && fromProvider(toLocalIso(when), { unit: "day", source: "dateMark", locale, weekday: false })) ||
|
|
304
|
-
formatDate(when, "medium", { locale });
|
|
305
|
-
text = (labels.deletionOn ?? DEFAULT_ACCOUNT_STATE_LABELS.deletionOn)(day);
|
|
304
|
+
text = (labels.deletionOn ?? DEFAULT_ACCOUNT_STATE_LABELS.deletionOn)(day(date));
|
|
306
305
|
} else text = labels.deletion ?? DEFAULT_ACCOUNT_STATE_LABELS.deletion;
|
|
307
306
|
return (
|
|
308
307
|
<Chip
|
|
@@ -355,14 +354,14 @@ export interface DateMarkProps {
|
|
|
355
354
|
|
|
356
355
|
/**
|
|
357
356
|
* A date in a table cell: a `<time>` with a machine-readable `dateTime`, nowrap and
|
|
358
|
-
* tabular figures, in the provider's locale — or `empty` when there is none.
|
|
357
|
+
* tabular figures, in the provider's locale and `timeZone` — or `empty` when there is none.
|
|
359
358
|
*
|
|
360
359
|
* `display="date"` without a `dateStyle` is written by `<UiKitProvider formatDate>` when
|
|
361
360
|
* the app set one (keksdose K12: its `DateCell` exists to put every column's date in the
|
|
362
|
-
* app's date-format preference, weekday and all — dev#546), called with the
|
|
363
|
-
*
|
|
364
|
-
* an empty answer, it is `Intl`'s `medium` date as
|
|
365
|
-
* a calendar day and keeps `formatRelativeTime`.
|
|
361
|
+
* app's date-format preference, weekday and all — dev#546), called with the calendar day
|
|
362
|
+
* of the value as `"YYYY-MM-DD"` (in the provider's `timeZone`, else the device's) and
|
|
363
|
+
* `weekday: true`. Without one, or for an empty answer, it is `Intl`'s `medium` date as
|
|
364
|
+
* before. The relative display is not a calendar day and keeps `formatRelativeTime`.
|
|
366
365
|
*/
|
|
367
366
|
export function DateMark({
|
|
368
367
|
value,
|
|
@@ -374,27 +373,25 @@ export function DateMark({
|
|
|
374
373
|
locale: localeProp,
|
|
375
374
|
className,
|
|
376
375
|
}: DateMarkProps) {
|
|
377
|
-
|
|
378
|
-
|
|
376
|
+
// The provider's `timeZone` (0.46) as well as its locale, also for the relative words
|
|
377
|
+
// and the exact line (refactor audit 2026-10-30, DUP-2: the raw formatters ignored it).
|
|
378
|
+
const { formatDate, formatRelativeTime } = useKitFormat(localeProp);
|
|
379
|
+
const day = useDayFormatter(null, localeProp);
|
|
379
380
|
const date = toDate(value);
|
|
380
381
|
const cls = cn("whitespace-nowrap tabular-nums", className);
|
|
381
382
|
if (!date) return <span className={cn(cls, "text-muted")}>{empty}</span>;
|
|
382
383
|
if (display === "date") {
|
|
383
|
-
const own =
|
|
384
|
-
dateStyle === undefined && fromProvider
|
|
385
|
-
? fromProvider(toLocalIso(date), { unit: "day", source: "dateMark", locale, weekday: true })
|
|
386
|
-
: "";
|
|
387
384
|
return (
|
|
388
385
|
<time dateTime={date.toISOString()} className={cls}>
|
|
389
|
-
{
|
|
386
|
+
{day(value, { weekday: true, style: dateStyle ?? "medium", preference: dateStyle === undefined })}
|
|
390
387
|
</time>
|
|
391
388
|
);
|
|
392
389
|
}
|
|
393
|
-
const text = formatRelativeTime(date, { ...relative,
|
|
394
|
-
const exact = formatDate(date, dateStyle ?? "dateTime"
|
|
390
|
+
const text = formatRelativeTime(date, { ...relative, absoluteStyle: dateStyle ?? "medium" });
|
|
391
|
+
const exact = formatDate(date, dateStyle ?? "dateTime");
|
|
395
392
|
// Past `absoluteAfterDays` the relative words already ARE the date; then the exact
|
|
396
393
|
// line alone, rather than the same day twice.
|
|
397
|
-
const sameDay = text === formatDate(date, dateStyle ?? "medium"
|
|
394
|
+
const sameDay = text === formatDate(date, dateStyle ?? "medium");
|
|
398
395
|
const iso = date.toISOString();
|
|
399
396
|
if (sameDay) {
|
|
400
397
|
return (
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { useId, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithoutRef, MouseEvent, ReactNode, Ref } from "react";
|
|
1
|
+
import { useEffect, useId, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
+
import type { ComponentPropsWithoutRef, MouseEvent, ReactNode, Ref, RefObject } from "react";
|
|
3
3
|
import { AlertTriangle, CheckCircle2, ChevronRight, Info, X } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/cn";
|
|
5
5
|
import { FOCUS_RING } from "./focus-ring";
|
|
6
6
|
import { DEFAULT_COMMON_LABELS, useKitLabels } from "../i18n/kit-labels";
|
|
7
|
+
import { focusFirst, focusIsLost, tabStopsAround, whenFocusLeftForNothing } from "../lib/focus-left";
|
|
7
8
|
|
|
8
9
|
/** `info` (0.8.0) is the sky family, for news that is neither good nor bad: keksdose's
|
|
9
10
|
* preview and beta-performance banners, which borrowed `warning` for want of it and
|
|
@@ -185,10 +186,21 @@ interface AlertBannerBaseProps extends Omit<ComponentPropsWithoutRef<"div">, "on
|
|
|
185
186
|
/** Replaces the tone's glyph — a `<Spinner label={null} />` for "Solving…", say.
|
|
186
187
|
* `null` draws none. Always decorative; the text carries the message. */
|
|
187
188
|
icon?: ReactNode;
|
|
188
|
-
/**
|
|
189
|
-
*
|
|
190
|
-
*
|
|
189
|
+
/**
|
|
190
|
+
* Renders an × at the end that calls this. The banner does not hide itself — the
|
|
191
|
+
* caller removes it (and remembers that it did), as with every other kit control
|
|
192
|
+
* whose state is app state.
|
|
193
|
+
*
|
|
194
|
+
* The focus (0.52, refactor audit 2026-10-30, DSP-15): the × that held it goes with the
|
|
195
|
+
* banner, and it fell to `<body>`. When the banner unmounts after its × was pressed and
|
|
196
|
+
* the focus has nowhere else, it moves on to the next control after the banner — where
|
|
197
|
+
* Tab from the × would have gone — or, at the end of the page, the one before it; to
|
|
198
|
+
* {@link dismissFocusRef} when given. A banner the caller keeps keeps its ×'s focus.
|
|
199
|
+
*/
|
|
191
200
|
onDismiss?: () => void;
|
|
201
|
+
/** Where the focus goes once the × has removed the banner (DSP-15) — a heading, the
|
|
202
|
+
* control the banner was about. Default: the next control after the banner. */
|
|
203
|
+
dismissFocusRef?: RefObject<HTMLElement | null>;
|
|
192
204
|
/** Accessible name of the ×. Default: `common.dismiss` from the
|
|
193
205
|
* {@link UiKitProvider}, else "Dismiss". */
|
|
194
206
|
dismissLabel?: string;
|
|
@@ -278,6 +290,7 @@ export function AlertBanner({
|
|
|
278
290
|
action,
|
|
279
291
|
icon,
|
|
280
292
|
onDismiss,
|
|
293
|
+
dismissFocusRef,
|
|
281
294
|
dismissLabel,
|
|
282
295
|
clampMobile = false,
|
|
283
296
|
actionPlacement = "own-line",
|
|
@@ -318,6 +331,36 @@ export function AlertBanner({
|
|
|
318
331
|
return () => ro?.disconnect();
|
|
319
332
|
}, [clamp, expanded, children]);
|
|
320
333
|
|
|
334
|
+
// The ×'s focus, once the caller has removed the banner (DSP-15). Where it can go is read
|
|
335
|
+
// at the press, while the banner still has a place in the page to measure from; whether
|
|
336
|
+
// it must is decided at the unmount, in the cleanup of a passive effect — after React has
|
|
337
|
+
// taken the banner's DOM away, when a focus that fell with it is on <body>.
|
|
338
|
+
const dismissedFrom = useRef<HTMLElement[] | null>(null);
|
|
339
|
+
const dismissTarget = useRef(dismissFocusRef);
|
|
340
|
+
useLayoutEffect(() => {
|
|
341
|
+
dismissTarget.current = dismissFocusRef;
|
|
342
|
+
});
|
|
343
|
+
// The note lives until the focus lands outside the banner (0.52 code review,
|
|
344
|
+
// alert-banner.tsx). A caller that keeps the banner — an async dismiss that failed, a
|
|
345
|
+
// snooze — left it standing, and the banner's unmount long after, a route change with
|
|
346
|
+
// the focus on <body>, sent the focus to a stop noted at the press, over the app's own
|
|
347
|
+
// handling of a new page. A `focusin` on the document, not a `focusout` on the banner:
|
|
348
|
+
// a browser that blurs a removed node would drop the note at the very removal it is for.
|
|
349
|
+
// The one `focusout` heard is a move to nothing — a click on the page — and only once a
|
|
350
|
+
// microtask has shown the × still in place (`whenFocusLeftForNothing`). A focus that
|
|
351
|
+
// stays on the × keeps the note, however late the removal: that is DSP-15's own case,
|
|
352
|
+
// an async dismiss whose request resolves.
|
|
353
|
+
const unwatchFocus = useRef<(() => void) | null>(null);
|
|
354
|
+
useEffect(
|
|
355
|
+
() => () => {
|
|
356
|
+
unwatchFocus.current?.();
|
|
357
|
+
const around = dismissedFrom.current;
|
|
358
|
+
if (!around || !focusIsLost()) return;
|
|
359
|
+
focusFirst([dismissTarget.current?.current, ...around]);
|
|
360
|
+
},
|
|
361
|
+
[],
|
|
362
|
+
);
|
|
363
|
+
|
|
321
364
|
const Glyph = TONE_GLYPH[tone];
|
|
322
365
|
// Onto the first line of a box's text: 2px at 14px/20px, 1px at 12px/16px.
|
|
323
366
|
const nudge = inlineRow || strip ? undefined : sm ? "mt-px" : "mt-0.5";
|
|
@@ -448,6 +491,40 @@ export function AlertBanner({
|
|
|
448
491
|
// A dismiss inside a whole-row banner must not also follow the row.
|
|
449
492
|
e.preventDefault();
|
|
450
493
|
e.stopPropagation();
|
|
494
|
+
const frame = e.currentTarget.parentElement;
|
|
495
|
+
// Only a × that holds the focus has one to lose (0.52 code review, alert-banner.tsx):
|
|
496
|
+
// Safari focuses no button on a click, nor on an iOS tap, and with the focus on
|
|
497
|
+
// <body> already the removal sent it on — a ring, on a form field the on-screen
|
|
498
|
+
// keyboard, on a page the user was reading with the pointer.
|
|
499
|
+
if (frame && e.currentTarget.ownerDocument.activeElement === e.currentTarget) {
|
|
500
|
+
const { after, before } = tabStopsAround(frame);
|
|
501
|
+
dismissedFrom.current = [...after, ...before];
|
|
502
|
+
unwatchFocus.current?.();
|
|
503
|
+
const doc = frame.ownerDocument;
|
|
504
|
+
const forget = () => {
|
|
505
|
+
dismissedFrom.current = null;
|
|
506
|
+
unwatch();
|
|
507
|
+
};
|
|
508
|
+
const onFocusIn = (event: FocusEvent) => {
|
|
509
|
+
if (event.target instanceof Node && frame.contains(event.target)) return;
|
|
510
|
+
forget();
|
|
511
|
+
};
|
|
512
|
+
// Focus that left for nothing — a click on the page — took no `focusin` with it
|
|
513
|
+
// (0.52 code review): the user moved on all the same.
|
|
514
|
+
const onFocusOut = (event: FocusEvent) => {
|
|
515
|
+
whenFocusLeftForNothing(event, () => {
|
|
516
|
+
if (unwatchFocus.current === unwatch) forget();
|
|
517
|
+
});
|
|
518
|
+
};
|
|
519
|
+
const unwatch = () => {
|
|
520
|
+
doc.removeEventListener("focusin", onFocusIn, true);
|
|
521
|
+
frame.removeEventListener("focusout", onFocusOut);
|
|
522
|
+
unwatchFocus.current = null;
|
|
523
|
+
};
|
|
524
|
+
doc.addEventListener("focusin", onFocusIn, true);
|
|
525
|
+
frame.addEventListener("focusout", onFocusOut);
|
|
526
|
+
unwatchFocus.current = unwatch;
|
|
527
|
+
}
|
|
451
528
|
onDismiss();
|
|
452
529
|
}}
|
|
453
530
|
className={cn(
|
|
@@ -267,10 +267,15 @@ export interface AmountInputProps extends FieldHelpProps, DataAttributes {
|
|
|
267
267
|
max?: number;
|
|
268
268
|
/**
|
|
269
269
|
* The SETTLED figure, dot-decimal, sign included — fired on blur, on Enter, on the
|
|
270
|
-
* numpad's "=" and
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
*
|
|
270
|
+
* numpad's "=" and once per calculator session (its "=" or Enter in its display, or
|
|
271
|
+
* the pad closing on a result not committed yet), never on a keystroke ("1200+" is
|
|
272
|
+
* not a figure yet). `onChange` still reports every keystroke and every result the
|
|
273
|
+
* calculator writes back; this is for a host that stores a number and must not see
|
|
274
|
+
* drafts (kastlan 52; see {@link MoneyField}, which is built on it).
|
|
275
|
+
*
|
|
276
|
+
* Refactor audit 2026-10-30, INP-1: every calculator keystroke that resolved used to
|
|
277
|
+
* commit, so "100+50" committed 105 on its way to 150 — keksdose saved both, and its
|
|
278
|
+
* threshold field, `disabled` while it saves, lost the calculator to the first.
|
|
274
279
|
*/
|
|
275
280
|
onCommit?: (value: string) => void;
|
|
276
281
|
/**
|
|
@@ -333,17 +338,28 @@ function settleAmount(text: string, digits: number | undefined, min?: number, ma
|
|
|
333
338
|
// `lib/decimal-marks.ts`, read through the engine NumberInput and this field share
|
|
334
339
|
// (`numeric-field.ts`, DUP-10).
|
|
335
340
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
341
|
+
/**
|
|
342
|
+
* The figure's colour per {@link AmountInputProps.tone} — public as `AMOUNT_TONE_CLASS`,
|
|
343
|
+
* for a table cell or a test that must paint the same figure the same way (keksdose's
|
|
344
|
+
* receipt lines, dev#556).
|
|
345
|
+
*
|
|
346
|
+
* The consuming app's ONE money palette (`--money-expense` / `--money-income`), not a
|
|
347
|
+
* bespoke rose/emerald pairing: a figure being typed has to wear the same colour the same
|
|
348
|
+
* figure will wear once it is a row in the table behind the form (Keksdose dev#434). The
|
|
349
|
+
* utilities are unlayered and theme-aware, so no `dark:` variant is needed and they win
|
|
350
|
+
* over the field's own text colour regardless of where `cn` puts them.
|
|
351
|
+
*/
|
|
352
|
+
const TONE_CLASS: Readonly<Record<NonNullable<AmountInputProps["tone"]>, string>> = {
|
|
343
353
|
neutral: "",
|
|
344
354
|
outflow: "text-money-neg",
|
|
345
355
|
inflow: "text-money-pos",
|
|
346
356
|
};
|
|
357
|
+
// Exported in 0.52 because keksdose's tests read it out of dist/components/amount-input.js
|
|
358
|
+
// with a regex for `const TONE_CLASS` — the one reach into the kit's dist in three apps,
|
|
359
|
+
// which a rename or a moved module breaks with no public change (MOD-8, refactor audit
|
|
360
|
+
// 2026-10-30; 0.34's move failed 91 of keksdose's test files that way). The local name
|
|
361
|
+
// stays until keksdose imports the export, so the bump itself breaks nothing.
|
|
362
|
+
export { TONE_CLASS as AMOUNT_TONE_CLASS };
|
|
347
363
|
|
|
348
364
|
// The shared chrome-less treatment at money size. `tabular-nums` so digits don't
|
|
349
365
|
// reflow the figure as they are typed; FIELD_DISPLAY's own muted placeholder
|
|
@@ -681,12 +697,14 @@ export function AmountInput(props: AmountInputProps) {
|
|
|
681
697
|
// reads either mark, and "1.234,5" is two of them. The result comes back
|
|
682
698
|
// dot-decimal.
|
|
683
699
|
value={derived}
|
|
700
|
+
// Live: every result, settled, so the field never shows more decimals than
|
|
701
|
+
// it will keep. The commit is the session's one (INP-1): its "=", or the pad
|
|
702
|
+
// closing on a newer result — not each figure on the way to the result.
|
|
684
703
|
onChange={(result, expression) => {
|
|
685
704
|
setDraft(null);
|
|
686
|
-
|
|
687
|
-
handleText(settled, expression);
|
|
688
|
-
onCommit?.(settled);
|
|
705
|
+
handleText(settle(result), expression);
|
|
689
706
|
}}
|
|
707
|
+
onCommit={(result) => onCommit?.(settle(result))}
|
|
690
708
|
className="px-1.5"
|
|
691
709
|
aria-label={labels?.calculatorTrigger}
|
|
692
710
|
labels={labels?.calculator}
|