@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
|
@@ -18,7 +18,8 @@ import { AdminActionConfirm } from "./admin-action-confirm";
|
|
|
18
18
|
import type { AdminActionConfirmValues } from "./admin-action-confirm";
|
|
19
19
|
import { personLabel, useDayText } from "./admin-parts";
|
|
20
20
|
import type { AdminPerson, MaybePromise } from "./admin-parts";
|
|
21
|
-
import { DEFAULT_PLAN_CHANGE_LABELS } from "
|
|
21
|
+
import { DEFAULT_PLAN_CHANGE_LABELS } from "../billing/plan-change-labels";
|
|
22
|
+
import type { PlanChangeLabels } from "../billing/plan-change-labels";
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
25
|
* The operator's plan parts (docs/billing-harmonization.md §14.12, decision 27):
|
|
@@ -34,49 +35,11 @@ import { DEFAULT_PLAN_CHANGE_LABELS } from "./plan-change-labels";
|
|
|
34
35
|
* whatever the billing switch says.
|
|
35
36
|
*/
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
title: string;
|
|
43
|
-
/** Its confirm button: "Change plan". */
|
|
44
|
-
confirm: string;
|
|
45
|
-
/** The plan select's label: "Plan". */
|
|
46
|
-
plan: string;
|
|
47
|
-
/** The line over the select: "Current plan: Free". */
|
|
48
|
-
current: (plan: string) => string;
|
|
49
|
-
/** Under the select — the fact that is not on the button. */
|
|
50
|
-
keepsItems: string;
|
|
51
|
-
/** The end of a free grant's field: "Free until". */
|
|
52
|
-
until: string;
|
|
53
|
-
/** Under it. */
|
|
54
|
-
untilHint: string;
|
|
55
|
-
/** Why the confirm is held while nothing would change. */
|
|
56
|
-
needsChange: string;
|
|
57
|
-
/** The result: the plan moved from one to another. */
|
|
58
|
-
changed: (from: string, to: string) => string;
|
|
59
|
-
/** The result: an account with no plan before, or the same plan again. */
|
|
60
|
-
set: (to: string) => string;
|
|
61
|
-
/** The result: a running beta kept its own end (§12.34); only the plan moved. */
|
|
62
|
-
keptBeta: string;
|
|
63
|
-
/** The result: the grant runs until `date` (formatted). */
|
|
64
|
-
untilDone: (date: string) => string;
|
|
65
|
-
/** The result: the account owns more than the new plan allows. */
|
|
66
|
-
overLimit: string;
|
|
67
|
-
/**
|
|
68
|
-
* The column's usage, spelled out (its tooltip): "1 of 5 budgets". Figures arrive
|
|
69
|
-
* formatted; `dimension` is the app's word, as `usage.label` gives it — since 0.33.1
|
|
70
|
-
* in the form the LIMIT takes when the label gives its plural forms ("1 of 1 budget",
|
|
71
|
-
* "1 of 5 budgets"): in every shipped language the word follows the limit, or heads
|
|
72
|
-
* the line in German, whose `von` would want a dative plural no app form carries
|
|
73
|
-
* ("Budgets: 1 von 5"). An override of yours gets the same word. Since 0.34 the grant
|
|
74
|
-
* dialog's usage line too, when `usage` comes as the column's shape.
|
|
75
|
-
*/
|
|
76
|
-
usageOf: (used: string, limit: string, dimension: string) => string;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Defined in ./plan-change-labels, which holds no component code (0.34, KS U8).
|
|
38
|
+
// The words and their type live in billing/plan-change-labels, which holds no component
|
|
39
|
+
// code (0.34, KS U8): PlanSwitchConfirm reads them too, and billing importing admin while
|
|
40
|
+
// this module imports billing made the two folders import each other (refactor audit
|
|
41
|
+
// 2026-10-30, MOD-6).
|
|
42
|
+
export type { PlanChangeLabels };
|
|
80
43
|
export { DEFAULT_PLAN_CHANGE_LABELS };
|
|
81
44
|
|
|
82
45
|
/** A plan code as the parts compare it: lowercase (§12.16 — an older row's "FREE" is
|
|
@@ -8,6 +8,7 @@ import { CheckboxGroup } from "../components/checkbox-group";
|
|
|
8
8
|
import type { CheckboxGroupOption } from "../components/checkbox-group";
|
|
9
9
|
import { FormActions } from "../components/form-actions";
|
|
10
10
|
import { Caption } from "../components/text";
|
|
11
|
+
import { describeFailure } from "../lib/describe-failure";
|
|
11
12
|
import { hasContent } from "../lib/presence";
|
|
12
13
|
import type { MaybePromise } from "./admin-parts";
|
|
13
14
|
import type { CommitScope } from "../components/write-lock";
|
|
@@ -165,7 +166,7 @@ export function ReviewerScopeEditor({
|
|
|
165
166
|
try {
|
|
166
167
|
result = onSave(scope);
|
|
167
168
|
} catch (error) {
|
|
168
|
-
setFailure(describeError?.(error)
|
|
169
|
+
setFailure(describeFailure(describeError?.(error), labels.failed));
|
|
169
170
|
return;
|
|
170
171
|
}
|
|
171
172
|
if (!result || typeof result.then !== "function") return;
|
|
@@ -174,8 +175,7 @@ export function ReviewerScopeEditor({
|
|
|
174
175
|
() => setPending(false),
|
|
175
176
|
(error: unknown) => {
|
|
176
177
|
setPending(false);
|
|
177
|
-
|
|
178
|
-
setFailure(hasContent(own) ? own : labels.failed);
|
|
178
|
+
setFailure(describeFailure(describeError?.(error), labels.failed));
|
|
179
179
|
},
|
|
180
180
|
);
|
|
181
181
|
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// The English of every `rateLimited` label, in a module with no component code and no
|
|
2
|
+
// error probing: the English catalogue (src/i18n/defaults.ts) reaches it through nine
|
|
3
|
+
// `*-labels.ts` modules, and until 0.52 that pulled `auth/auth-errors` — and since MOD-6
|
|
4
|
+
// its `lib/http-status` — into the `en` chunk (refactor audit 2026-10-30, MOD-6).
|
|
5
|
+
// auth/auth-errors re-exports both.
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The English of every `rateLimited` label (0.30.0): "Too many attempts. Try again in
|
|
9
|
+
* 30 s." with a wait under a minute, in whole minutes from one minute up (keksdose's
|
|
10
|
+
* reset throttle answers in hours, and "3600 s" is a number nobody reads), and "Wait a
|
|
11
|
+
* moment and try again." without one — or with a `0`.
|
|
12
|
+
*
|
|
13
|
+
* @internal The namespaces' English; not part of the barrel.
|
|
14
|
+
*/
|
|
15
|
+
export function englishRateLimited(seconds?: number): string {
|
|
16
|
+
if (!seconds || seconds <= 0) return "Too many attempts. Wait a moment and try again.";
|
|
17
|
+
return `Too many attempts. Try again in ${englishWait(seconds)}.`;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** "30 s", "2 min" — a wait in English, rounded up. @internal */
|
|
21
|
+
export function englishWait(seconds: number): string {
|
|
22
|
+
return seconds < 60 ? `${Math.ceil(seconds)} s` : `${Math.ceil(seconds / 60)} min`;
|
|
23
|
+
}
|
package/src/auth/auth-errors.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { httpStatusOf } from "../lib/http-status";
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* The coded refusals of sign-in and sign-up (docs/auth-harmonization.md §5.2): every
|
|
3
5
|
* refusal the auth routes answer carries a machine-readable `code`, and the pages
|
|
@@ -274,29 +276,13 @@ export function errorBodyWithCode(
|
|
|
274
276
|
return undefined;
|
|
275
277
|
}
|
|
276
278
|
|
|
277
|
-
/** An HTTP status as a number, or undefined. */
|
|
278
|
-
function statusOf(value: unknown): number | undefined {
|
|
279
|
-
return typeof value === "number" && Number.isInteger(value) ? value : undefined;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
279
|
/**
|
|
283
|
-
* The HTTP status a thrown error carries
|
|
284
|
-
*
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
* 2. `err.status` — ofetch's `FetchError`, the generated OpenAPI clients' `ApiError`, and
|
|
288
|
-
* a `Response` thrown as it came;
|
|
289
|
-
* 3. `err.statusCode` — ofetch's alias, and Node-style errors.
|
|
290
|
-
*
|
|
291
|
-
* `undefined` when none is a whole number. Package-private — not re-exported from the
|
|
292
|
-
* barrel; {@link isRateLimited} and the session refresh's classifier read it (DUP-11,
|
|
293
|
-
* refactor audit 2026-10: the refresh carried its own copy of this probe).
|
|
280
|
+
* The HTTP status a thrown error carries ({@link httpStatusOf}): axios'
|
|
281
|
+
* `response.status`, then `status`, then `statusCode`. Lives in `lib/http-status.ts`
|
|
282
|
+
* since 0.52 (refactor audit 2026-10-30, MOD-6); re-exported here for the modules that
|
|
283
|
+
* import it from auth. Package-private — not re-exported from the barrel.
|
|
294
284
|
*/
|
|
295
|
-
export
|
|
296
|
-
if (!isBag(err)) return undefined;
|
|
297
|
-
const response = err.response;
|
|
298
|
-
return (isBag(response) ? statusOf(response.status) : undefined) ?? statusOf(err.status) ?? statusOf(err.statusCode);
|
|
299
|
-
}
|
|
285
|
+
export { httpStatusOf };
|
|
300
286
|
|
|
301
287
|
/**
|
|
302
288
|
* Whether `err` is a throttled request — HTTP `429 Too Many Requests` (0.30.0, from the
|
|
@@ -378,20 +364,7 @@ export function retryAfterSeconds(err: unknown, now: number | Date = Date.now())
|
|
|
378
364
|
return value === undefined ? undefined : parseRetryAfter(value, at);
|
|
379
365
|
}
|
|
380
366
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
* moment and try again." without one — or with a `0`.
|
|
386
|
-
*
|
|
387
|
-
* @internal The namespaces' English; not part of the barrel.
|
|
388
|
-
*/
|
|
389
|
-
export function englishRateLimited(seconds?: number): string {
|
|
390
|
-
if (!seconds || seconds <= 0) return "Too many attempts. Wait a moment and try again.";
|
|
391
|
-
return `Too many attempts. Try again in ${englishWait(seconds)}.`;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/** "30 s", "2 min" — a wait in English, rounded up. @internal */
|
|
395
|
-
export function englishWait(seconds: number): string {
|
|
396
|
-
return seconds < 60 ? `${Math.ceil(seconds)} s` : `${Math.ceil(seconds / 60)} min`;
|
|
397
|
-
}
|
|
367
|
+
// The English of the `rateLimited` labels, in auth-errors-labels since 0.52: the English
|
|
368
|
+
// catalogue reached this module for them, and with it `lib/http-status` (refactor audit
|
|
369
|
+
// 2026-10-30, MOD-6). Re-exported for the modules that import them from here.
|
|
370
|
+
export { englishRateLimited, englishWait } from "./auth-errors-labels";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { useContext, useEffect, useId, useRef, useState } from "react";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
3
|
|
|
4
4
|
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
5
|
+
import { describeFailure } from "../lib/describe-failure";
|
|
5
6
|
import { usePromisePending } from "../components/danger-confirm";
|
|
6
7
|
import { DialogFrame } from "../components/dialog-frame";
|
|
7
8
|
import { ModalCloseContext } from "../components/modal";
|
|
@@ -74,8 +75,9 @@ export interface CompleteNameDialogProps {
|
|
|
74
75
|
* complete name, no page is blocked, and the app asks again at the next sign-in.
|
|
75
76
|
*
|
|
76
77
|
* The promise handling is `ReauthDialog`'s: busy while `onSave` runs (the fields
|
|
77
|
-
* read-only, "Later" disabled, Escape held — a request that has
|
|
78
|
-
* back by closing the dialog), closed on resolve, kept open on
|
|
78
|
+
* read-only, "Later" disabled, Escape, the backdrop and Back held — a request that has
|
|
79
|
+
* left cannot be called back by closing the dialog), closed on resolve, kept open on
|
|
80
|
+
* reject. Save is a
|
|
79
81
|
* `commit` control, so a `WriteLockProvider` above it locks it with its reason — every
|
|
80
82
|
* lock but a lapsed plan's (`COMMIT_EXCEPT_BILLING`, 0.33): one's own name is the
|
|
81
83
|
* account's own settings, which billing never locks (docs/billing-harmonization.md §3.3,
|
|
@@ -152,7 +154,9 @@ export function CompleteNameDialog({
|
|
|
152
154
|
setFailed(false);
|
|
153
155
|
};
|
|
154
156
|
|
|
155
|
-
|
|
157
|
+
// An app's `failed && words` before it has words is `false`, which `??` kept (refactor
|
|
158
|
+
// audit 2026-10-30, DUP-14): the kit's sentence unless the app's says something.
|
|
159
|
+
const message = failed ? describeFailure(error, labels.failed) : undefined;
|
|
156
160
|
|
|
157
161
|
return (
|
|
158
162
|
<DialogFrame
|
|
@@ -160,10 +164,7 @@ export function CompleteNameDialog({
|
|
|
160
164
|
title={labels.title}
|
|
161
165
|
description={labels.description}
|
|
162
166
|
onClose={() => onClose(saved.current)}
|
|
163
|
-
|
|
164
|
-
if (pending && e.key === "Escape") e.preventDefault();
|
|
165
|
-
}}
|
|
166
|
-
aria-busy={pending || undefined}
|
|
167
|
+
busy={pending}
|
|
167
168
|
actions={
|
|
168
169
|
<CompleteNameActions
|
|
169
170
|
formId={formId}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// loads as one chunk like the other languages (0.34, KS U8). ./forgot-password-form
|
|
4
4
|
// re-exports them.
|
|
5
5
|
|
|
6
|
-
import { englishRateLimited } from "./auth-errors";
|
|
6
|
+
import { englishRateLimited } from "./auth-errors-labels";
|
|
7
7
|
import type { ForgotPasswordLabels } from "./forgot-password-form";
|
|
8
8
|
|
|
9
9
|
/** `Required`: every key, the 0.30 one included, has its English here. */
|
|
@@ -2,13 +2,15 @@ import { useId, useRef, useState } from "react";
|
|
|
2
2
|
import type { ComponentPropsWithRef, FormEvent, ReactNode } from "react";
|
|
3
3
|
import { MailCheck } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/cn";
|
|
5
|
+
import { describeFailure } from "../lib/describe-failure";
|
|
5
6
|
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
6
7
|
import { AlertBanner } from "../components/alert-banner";
|
|
7
8
|
import { TextLink } from "../components/text-link";
|
|
8
9
|
import { Button } from "../components/button";
|
|
9
10
|
import { Input } from "../components/input";
|
|
10
11
|
import { isRateLimited, retryAfterSeconds } from "./auth-errors";
|
|
11
|
-
import {
|
|
12
|
+
import { isThenable } from "../lib/thenable";
|
|
13
|
+
import { FORM_HEADING_CLASS, INTRO_CLASS, OutcomeMessage, useFocusWhen } from "./status-parts";
|
|
12
14
|
import type { AuthHeadingLevel } from "./status-parts";
|
|
13
15
|
import { DEFAULT_FORGOT_PASSWORD_LABELS } from "./forgot-password-form-labels";
|
|
14
16
|
|
|
@@ -146,12 +148,15 @@ export function ForgotPasswordForm({
|
|
|
146
148
|
);
|
|
147
149
|
}
|
|
148
150
|
|
|
149
|
-
// The app's words first, then the throttle's, then the kit's catch-all
|
|
151
|
+
// The app's words first, then the throttle's, then the kit's catch-all — an app's ""
|
|
152
|
+
// is no words (refactor audit 2026-10-30, DUP-14: `??` drew an empty alert).
|
|
150
153
|
const failureFor = (error: unknown): ReactNode =>
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
154
|
+
describeFailure(
|
|
155
|
+
describeError?.(error),
|
|
156
|
+
isRateLimited(error)
|
|
157
|
+
? (labels.rateLimited ?? DEFAULT_FORGOT_PASSWORD_LABELS.rateLimited)(retryAfterSeconds(error))
|
|
158
|
+
: labels.error,
|
|
159
|
+
);
|
|
155
160
|
|
|
156
161
|
const submit = (e: FormEvent) => {
|
|
157
162
|
e.preventDefault();
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
3
|
// chunk like the other languages (0.34, KS U8). ./register-form re-exports them.
|
|
4
4
|
|
|
5
|
-
import { englishRateLimited } from "./auth-errors";
|
|
5
|
+
import { englishRateLimited } from "./auth-errors-labels";
|
|
6
6
|
import type { RegisterLabels } from "./register-form";
|
|
7
7
|
|
|
8
8
|
/** `Required`: every key, the 0.30 one included, has its English here. */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// loads as one chunk like the other languages (0.34, KS U8). ./reset-password-form
|
|
4
4
|
// re-exports them.
|
|
5
5
|
|
|
6
|
-
import { englishRateLimited } from "./auth-errors";
|
|
6
|
+
import { englishRateLimited } from "./auth-errors-labels";
|
|
7
7
|
import type { ResetPasswordLabels } from "./reset-password-form";
|
|
8
8
|
|
|
9
9
|
/** `Required`: every key, the 0.30 one included, has its English here. */
|
|
@@ -2,6 +2,7 @@ import { useEffect, useId, useRef, useState } from "react";
|
|
|
2
2
|
import type { ComponentPropsWithRef, FormEvent, ReactNode } from "react";
|
|
3
3
|
import { CheckCircle2, XCircle } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/cn";
|
|
5
|
+
import { describeFailure } from "../lib/describe-failure";
|
|
5
6
|
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
6
7
|
import { AlertBanner } from "../components/alert-banner";
|
|
7
8
|
import { LoadingState } from "../components/loading-state";
|
|
@@ -291,12 +292,15 @@ export function ResetPasswordForm({
|
|
|
291
292
|
setPhase({ token, phase: { kind: "invalid" } });
|
|
292
293
|
return;
|
|
293
294
|
}
|
|
294
|
-
// The app's words first, then the throttle's, then the kit's catch-all
|
|
295
|
+
// The app's words first, then the throttle's, then the kit's catch-all — an app's
|
|
296
|
+
// "" is no words (refactor audit 2026-10-30, DUP-14: `??` drew an empty alert).
|
|
295
297
|
setFailure(
|
|
296
|
-
|
|
297
|
-
(
|
|
298
|
+
describeFailure(
|
|
299
|
+
describeError?.(error),
|
|
300
|
+
isRateLimited(error)
|
|
298
301
|
? (labels.rateLimited ?? DEFAULT_RESET_PASSWORD_LABELS.rateLimited)(retryAfterSeconds(error))
|
|
299
|
-
: labels.failed
|
|
302
|
+
: labels.failed,
|
|
303
|
+
),
|
|
300
304
|
);
|
|
301
305
|
},
|
|
302
306
|
);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
3
|
// chunk like the other languages (0.34, KS U8). ./sign-in-form re-exports them.
|
|
4
4
|
|
|
5
|
-
import { englishRateLimited } from "./auth-errors";
|
|
5
|
+
import { englishRateLimited } from "./auth-errors-labels";
|
|
6
6
|
import type { SignInLabels } from "./sign-in-form";
|
|
7
7
|
|
|
8
8
|
/** `Required`: every key, the 0.30 ones included, has its English here. */
|
|
@@ -91,12 +91,6 @@ export function useOncePerKey<T>(
|
|
|
91
91
|
}, [key]);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
/** Whether a callback's return is a promise to wait for. A callback that returns
|
|
95
|
-
* nothing is done when it returns. */
|
|
96
|
-
export function isThenable(value: unknown): value is PromiseLike<unknown> {
|
|
97
|
-
return typeof (value as PromiseLike<unknown> | null)?.then === "function";
|
|
98
|
-
}
|
|
99
|
-
|
|
100
94
|
/**
|
|
101
95
|
* Move focus to `ref` when `active` turns true — the outcome a person's own submit led
|
|
102
96
|
* to ("If an account exists … the link is on its way", "Your password has been
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
3
|
// chunk like the other languages (0.34, KS U8). ./verify-email re-exports them.
|
|
4
4
|
|
|
5
|
-
import { englishRateLimited } from "./auth-errors";
|
|
5
|
+
import { englishRateLimited } from "./auth-errors-labels";
|
|
6
6
|
import type { VerifyEmailLabels } from "./verify-email";
|
|
7
7
|
|
|
8
8
|
export const DEFAULT_VERIFY_EMAIL_LABELS: VerifyEmailLabels = {
|
|
@@ -2,13 +2,15 @@ import { useEffect, useState } from "react";
|
|
|
2
2
|
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
3
3
|
import { CheckCircle2, MailWarning, TimerOff, XCircle } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/cn";
|
|
5
|
+
import { describeFailure } from "../lib/describe-failure";
|
|
5
6
|
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
6
7
|
import { useAnnounce } from "../hooks/use-announce";
|
|
7
8
|
import { AlertBanner } from "../components/alert-banner";
|
|
8
9
|
import { LoadingState } from "../components/loading-state";
|
|
9
10
|
import { Button } from "../components/button";
|
|
10
11
|
import { EmptyState } from "../components/empty-state";
|
|
11
|
-
import {
|
|
12
|
+
import { isThenable } from "../lib/thenable";
|
|
13
|
+
import { OUTCOME_CLASS, STATUS_HEADING_CLASS, useOncePerKey } from "./status-parts";
|
|
12
14
|
import { authErrorCode, englishRateLimited, isRateLimited, retryAfterSeconds } from "./auth-errors";
|
|
13
15
|
import type { AuthHeadingLevel } from "./status-parts";
|
|
14
16
|
import { DEFAULT_VERIFY_EMAIL_LABELS } from "./verify-email-labels";
|
|
@@ -150,13 +152,16 @@ function ResendStatus({
|
|
|
150
152
|
labels: VerifyEmailLabels;
|
|
151
153
|
className?: string;
|
|
152
154
|
}) {
|
|
153
|
-
// The app's words first, then the throttle's, then the kit's catch-all
|
|
155
|
+
// The app's words first, then the throttle's, then the kit's catch-all — an app's ""
|
|
156
|
+
// is no words (refactor audit 2026-10-30, DUP-14: `??` printed an empty status).
|
|
154
157
|
const failed =
|
|
155
158
|
phase === "failed"
|
|
156
|
-
? (
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
? describeFailure(
|
|
160
|
+
describeError?.(error),
|
|
161
|
+
isRateLimited(error)
|
|
162
|
+
? (labels.rateLimited ?? englishRateLimited)(retryAfterSeconds(error))
|
|
163
|
+
: labels.resendError,
|
|
164
|
+
)
|
|
160
165
|
: "";
|
|
161
166
|
return (
|
|
162
167
|
<span role="status" className={cn(phase === "failed" ? "text-danger" : "text-success", className)}>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* What the payer asked for in the app (0.43, kastlan `18bf4c0`): `"cancel"` after
|
|
@@ -8,6 +8,9 @@ import { useState } from "react";
|
|
|
8
8
|
*/
|
|
9
9
|
export type CancelRequested = "cancel" | "resume" | null;
|
|
10
10
|
|
|
11
|
+
/** How long a request waits for the provider's webhook: `useCheckoutProcessing`'s bound. */
|
|
12
|
+
const WAIT_FOR = 10 * 60_000;
|
|
13
|
+
|
|
11
14
|
/** What the page shows for the row as read now — `CancelRequest.view(rowScheduled)`. */
|
|
12
15
|
export interface CancelRequestView {
|
|
13
16
|
/** For `SubscriptionActions`' `cancelRequested`. */
|
|
@@ -23,7 +26,8 @@ export interface CancelRequestView {
|
|
|
23
26
|
export interface CancelRequest {
|
|
24
27
|
/** Read the overview again every few seconds while this is true — the overview query's
|
|
25
28
|
* `waiting` (kastlan's `useBillingOverview({ waiting })`, a `refetchInterval` inside) —
|
|
26
|
-
* so the page follows the provider. Needs no overview data: pass it to the query.
|
|
29
|
+
* so the page follows the provider. Needs no overview data: pass it to the query.
|
|
30
|
+
* False again after `timeoutMs` with no move of the row. */
|
|
27
31
|
waiting: boolean;
|
|
28
32
|
/**
|
|
29
33
|
* The row as read now (the overview's `cancel_at_period_end`; `undefined` while it
|
|
@@ -54,10 +58,25 @@ export interface CancelRequest {
|
|
|
54
58
|
* onResume={() => resume.mutate(undefined, { onSuccess: view.noteAsked })}
|
|
55
59
|
* …
|
|
56
60
|
* />
|
|
61
|
+
*
|
|
62
|
+
* **Bounded,** as `useCheckoutProcessing` is (FLW-6): after `timeoutMs` (10 minutes)
|
|
63
|
+
* with no move of the row the request is dropped — the polling stops and the page shows
|
|
64
|
+
* the row as it is. Unbounded, a webhook that never landed kept kastlan re-reading the
|
|
65
|
+
* overview every 3 s for as long as the page was open, which also kept a Cloud Run
|
|
66
|
+
* instance awake, and the plan line said "Cancels on …" for a row that never moved.
|
|
57
67
|
*/
|
|
58
|
-
export function useCancelRequest(): CancelRequest {
|
|
59
|
-
// What was asked, kept with the row's state it was asked against.
|
|
60
|
-
const [asked, setAsked] = useState<{ scheduled: boolean } | null>(null);
|
|
68
|
+
export function useCancelRequest({ timeoutMs = WAIT_FOR }: { timeoutMs?: number } = {}): CancelRequest {
|
|
69
|
+
// What was asked, kept with the row's state it was asked against and when.
|
|
70
|
+
const [asked, setAsked] = useState<{ scheduled: boolean; at: number } | null>(null);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (asked === null) return;
|
|
73
|
+
// Only THIS ask: one that a later ask or the row has replaced is not dropped twice.
|
|
74
|
+
const timer = setTimeout(
|
|
75
|
+
() => setAsked((current) => (current === asked ? null : current)),
|
|
76
|
+
Math.max(0, asked.at + timeoutMs - Date.now()),
|
|
77
|
+
);
|
|
78
|
+
return () => clearTimeout(timer);
|
|
79
|
+
}, [asked, timeoutMs]);
|
|
61
80
|
const view = (row: boolean | null | undefined): CancelRequestView => {
|
|
62
81
|
// Not read yet: nothing to show against, and nothing to drop.
|
|
63
82
|
if (row === undefined || row === null) return { requested: null, cancelScheduled: false, noteAsked: () => {} };
|
|
@@ -68,7 +87,10 @@ export function useCancelRequest(): CancelRequest {
|
|
|
68
87
|
return {
|
|
69
88
|
requested: open ? (row ? "resume" : "cancel") : null,
|
|
70
89
|
cancelScheduled: open ? !row : row,
|
|
71
|
-
noteAsked: () =>
|
|
90
|
+
noteAsked: () => {
|
|
91
|
+
const at = Date.now();
|
|
92
|
+
setAsked((a) => (a !== null && a.scheduled === row ? null : { scheduled: row, at }));
|
|
93
|
+
},
|
|
72
94
|
};
|
|
73
95
|
};
|
|
74
96
|
return { waiting: asked !== null, view };
|
|
@@ -1,28 +1,34 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { useKitLabels, useKitLocale } from "../i18n/kit-labels";
|
|
1
|
+
import { useKitLabels } from "../i18n/kit-labels";
|
|
4
2
|
import type { LabelOverride } from "../i18n/kit-labels";
|
|
5
3
|
import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
|
|
6
|
-
import {
|
|
4
|
+
import { useDayFormatter } from "../lib/day-format";
|
|
7
5
|
import type { DateInput } from "../lib/format";
|
|
8
6
|
import { Button } from "../components/button";
|
|
9
7
|
import { DialogFrame } from "../components/dialog-frame";
|
|
10
8
|
import { COMMIT_EXCEPT_BILLING } from "../components/write-lock";
|
|
11
9
|
import { useBillingLabels } from "./billing-labels";
|
|
12
10
|
import type { BillingLabels } from "./billing-labels";
|
|
11
|
+
import { dialogClose } from "./dialog-close";
|
|
12
|
+
import type { WithDialogClose } from "./dialog-close";
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
/** {@link CancelSubscriptionConfirmProps} before one of its two close props is required. */
|
|
15
|
+
interface CancelSubscriptionConfirmFields {
|
|
15
16
|
open: boolean;
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/** The admin dismissed it — Back, Escape, the backdrop. Confirm leaves it open: close it
|
|
18
|
+
* once `POST /billing/cancel` answers. 0.52: every other kit dialog's `onClose`
|
|
19
|
+
* (CONTRIBUTING §4; refactor audit 2026-10-30, API-5). */
|
|
20
|
+
onClose?: () => void;
|
|
21
|
+
/** @deprecated 0.52 — `onClose`, as every other kit dialog; removed in 0.53. Called with
|
|
22
|
+
* `false` when there is no `onClose`. */
|
|
23
|
+
onOpenChange?: (open: boolean) => void;
|
|
24
|
+
/** The overview's `current_period_end`: the day the subscription ends, in a sentence —
|
|
25
|
+
* the `<UiKitProvider formatDate>` (the app's date preference) when it set one, else the
|
|
26
|
+
* kit's `formatDate`, `"medium"`, in the provider's locale and `timeZone` (0.52). */
|
|
21
27
|
periodEnd: DateInput;
|
|
22
28
|
/** Confirm: the app's `POST /billing/cancel` (server-kit 0.14, §16.3). */
|
|
23
29
|
onConfirm: () => void;
|
|
24
|
-
/** The cancel is under way: Confirm's spinner, no second press, and Escape
|
|
25
|
-
*
|
|
30
|
+
/** The cancel is under way: Confirm's spinner, no second press, and neither Escape,
|
|
31
|
+
* the backdrop nor Back closes it. */
|
|
26
32
|
pending?: boolean;
|
|
27
33
|
/** The date's locale. Default: the provider's. */
|
|
28
34
|
locale?: string;
|
|
@@ -30,6 +36,11 @@ export interface CancelSubscriptionConfirmProps {
|
|
|
30
36
|
labels?: LabelOverride<BillingLabels>;
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
/** What {@link CancelSubscriptionConfirm} takes: `onClose`, or alone the deprecated
|
|
40
|
+
* `onOpenChange`, is required (0.52 code review: with neither it compiled, and nothing
|
|
41
|
+
* could dismiss it). */
|
|
42
|
+
export type CancelSubscriptionConfirmProps = WithDialogClose<CancelSubscriptionConfirmFields>;
|
|
43
|
+
|
|
33
44
|
/**
|
|
34
45
|
* The in-app cancel's confirm (docs/billing-harmonization.md §16.2 decision 2, §16.4,
|
|
35
46
|
* ui-kit 0.42): "Cancel subscription" for an admin the provider's portal doesn't open for
|
|
@@ -40,7 +51,7 @@ export interface CancelSubscriptionConfirmProps {
|
|
|
40
51
|
*
|
|
41
52
|
* <CancelSubscriptionConfirm
|
|
42
53
|
* open={asking}
|
|
43
|
-
*
|
|
54
|
+
* onClose={() => setAsking(false)}
|
|
44
55
|
* periodEnd={overview.current_period_end}
|
|
45
56
|
* pending={cancel.isPending}
|
|
46
57
|
* onConfirm={() => cancel.mutate()}
|
|
@@ -56,6 +67,7 @@ export interface CancelSubscriptionConfirmProps {
|
|
|
56
67
|
*/
|
|
57
68
|
export function CancelSubscriptionConfirm({
|
|
58
69
|
open,
|
|
70
|
+
onClose,
|
|
59
71
|
onOpenChange,
|
|
60
72
|
periodEnd,
|
|
61
73
|
onConfirm,
|
|
@@ -65,20 +77,15 @@ export function CancelSubscriptionConfirm({
|
|
|
65
77
|
}: CancelSubscriptionConfirmProps) {
|
|
66
78
|
const labels = useBillingLabels(labelsProp);
|
|
67
79
|
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
68
|
-
const
|
|
80
|
+
const day = useDayFormatter(undefined, localeProp);
|
|
69
81
|
|
|
70
82
|
return (
|
|
71
83
|
<DialogFrame
|
|
72
84
|
open={open}
|
|
73
85
|
title={labels.cancelConfirmTitle}
|
|
74
|
-
description={labels.cancelConfirmBody(
|
|
75
|
-
onClose={(
|
|
76
|
-
|
|
77
|
-
}}
|
|
78
|
-
onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {
|
|
79
|
-
if (pending && e.key === "Escape") e.preventDefault();
|
|
80
|
-
}}
|
|
81
|
-
aria-busy={pending || undefined}
|
|
86
|
+
description={labels.cancelConfirmBody(day(periodEnd))}
|
|
87
|
+
onClose={dialogClose({ onClose, onOpenChange })}
|
|
88
|
+
busy={pending}
|
|
82
89
|
data-cancel-subscription-confirm=""
|
|
83
90
|
actions={(close) => (
|
|
84
91
|
<>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the three billing confirms — `CancelSubscriptionConfirm`, `PlanSwitchConfirm`,
|
|
3
|
+
* `GrantWarningConfirm` — are closed in 0.52: `onClose`, as every other kit dialog
|
|
4
|
+
* (CONTRIBUTING §4; refactor audit 2026-10-30, API-5), and for one minor the deprecated
|
|
5
|
+
* `onOpenChange`, called with `false` when there is no `onClose`.
|
|
6
|
+
*
|
|
7
|
+
* 0.52 made `onOpenChange` optional for its deprecation and gave `onClose` beside it as
|
|
8
|
+
* optional too, so a confirm given NEITHER compiled — `<CancelSubscriptionConfirm open
|
|
9
|
+
* periodEnd={…} onConfirm={…} />` — and Back, Escape and the backdrop then called nothing:
|
|
10
|
+
* a dialog nobody could dismiss, where 0.51's compiler had required `onOpenChange` (0.52
|
|
11
|
+
* code review, cancel-subscription.tsx). And the fallback between the two was written
|
|
12
|
+
* three times, once per dialog.
|
|
13
|
+
*
|
|
14
|
+
* @internal Not part of the barrel; each dialog's props type is.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** The two close props as a dialog's own props interface declares them. */
|
|
18
|
+
interface CloseProps {
|
|
19
|
+
onClose?: () => void;
|
|
20
|
+
onOpenChange?: (open: boolean) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `P` with ONE of its two close props required — `onClose`, or alone the deprecated
|
|
25
|
+
* `onOpenChange`; both may be given, and `onClose` is then the one called. Built from
|
|
26
|
+
* `P`'s own members (`Pick`), so their docs and the deprecation stay the ones `P` writes.
|
|
27
|
+
*/
|
|
28
|
+
export type WithDialogClose<P extends CloseProps> = P &
|
|
29
|
+
(Required<Pick<P, "onClose">> | Required<Pick<P, "onOpenChange">>);
|
|
30
|
+
|
|
31
|
+
/** The dialog's close: `onClose`, else `onOpenChange(false)`. */
|
|
32
|
+
export function dialogClose({ onClose, onOpenChange }: CloseProps): () => void {
|
|
33
|
+
return () => (onClose ? onClose() : onOpenChange?.(false));
|
|
34
|
+
}
|