@eifi1/ui-kit 0.53.0 → 0.55.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 +96 -82
- package/dist/account/delete-account-setting.d.ts +3 -2
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +36 -0
- package/dist/auth/auth-errors.js +20 -0
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +2 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +6 -4
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.d.ts +2 -1
- package/dist/components/currency-option-list.js +10 -3
- package/dist/components/currency-option-list.js.map +1 -1
- package/dist/components/currency-select.d.ts +3 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +22 -1
- package/dist/components/danger-confirm.js +52 -30
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +2 -1
- package/dist/components/data-table-filter-popover.js +3 -2
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +33 -3
- package/dist/components/data-table-filters.js +6 -4
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +5 -1
- package/dist/components/dialog-frame.js +6 -2
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +16 -7
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +48 -0
- package/dist/components/modal.js +26 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/stat-tile.d.ts +21 -2
- package/dist/components/stat-tile.js +4 -2
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/currencies.d.ts +16 -2
- package/dist/currencies.js +2 -1
- package/dist/currencies.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-context-labels.js +2 -1
- package/dist/feedback/feedback-context-labels.js.map +1 -1
- package/dist/feedback/feedback-context.d.ts +19 -3
- package/dist/feedback/feedback-context.js +12 -1
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-diagnostics.d.ts +17 -0
- package/dist/feedback/feedback-diagnostics.js +27 -0
- package/dist/feedback/feedback-diagnostics.js.map +1 -0
- package/dist/feedback/feedback-dialog.d.ts +10 -0
- package/dist/feedback/feedback-dialog.js +6 -4
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-record.d.ts +5 -0
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +1 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +3 -0
- package/dist/feedback/feedback-row-detail.js +3 -0
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
- package/dist/feedback/feedback-submit-dialog.js +15 -3
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.d.ts +30 -2
- package/dist/feedback/feedback-submit.js +5 -2
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +2 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +78 -4
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +95 -5
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +74 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +75 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +77 -4
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +77 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +74 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +27 -8
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +36 -4
- package/dist/lib/dates.js +49 -13
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/format.d.ts +37 -2
- package/dist/lib/format.js +25 -1
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/intl-cache.d.ts +4 -2
- package/dist/lib/intl-cache.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/translation-review.d.ts +26 -0
- package/dist/lib/translation-review.js +14 -0
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -341
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -370
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -815
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -594
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -180
- package/src/components/currency-select.tsx +0 -341
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -934
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -281
- package/src/components/data-table-filters.ts +0 -287
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -276
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -789
- package/src/components/modal.tsx +0 -505
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -558
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -725
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -70
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -10
- package/src/feedback/feedback-context.tsx +0 -213
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -440
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -423
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -30
- package/src/feedback/feedback-row-detail.tsx +0 -858
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -118
- package/src/feedback/feedback-submit.tsx +0 -237
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -189
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2057
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1997
- package/src/i18n/locales/fr.ts +0 -2035
- package/src/i18n/locales/hu.ts +0 -2002
- package/src/i18n/locales/it.ts +0 -2012
- package/src/i18n/locales/zh.ts +0 -1910
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1179
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -266
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -522
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -25
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -717
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
import { createAsyncStoragePersister } from "@tanstack/query-async-storage-persister";
|
|
2
|
-
import type { QueryClient } from "@tanstack/react-query";
|
|
3
|
-
import type { PersistedClient, PersistQueryClientOptions } from "@tanstack/react-query-persist-client";
|
|
4
|
-
import { del, get, keys, set } from "idb-keyval";
|
|
5
|
-
import { listenOn, postOnce } from "../lib/broadcast";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The persisted TanStack Query cache, keksdose's policy as a kit helper
|
|
9
|
-
* (docs/local-first-harmonization.md §1.5 D4, D5, D7; §1.6). keksdose's
|
|
10
|
-
* shared/state/query-client.ts is the canon: an IndexedDB persister, a deny-list, the
|
|
11
|
-
* plain-JSON guard on write (`shouldDehydrateQuery`) and its twin on restore that keeps
|
|
12
|
-
* paused mutations. On top: a key per account (and company), a scrub list that removes
|
|
13
|
-
* secret fields from payloads that are otherwise wanted offline, and `removeStale` for
|
|
14
|
-
* another account's leftovers.
|
|
15
|
-
*
|
|
16
|
-
* The only module of the kit that imports TanStack and idb-keyval: both are optional peers
|
|
17
|
-
* of `@eifi1/ui-kit/offline` and never reached from the main barrel (packaging-contract).
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/** A field name the scrub removes: an exact name, or a pattern (`/^signature_/`). */
|
|
21
|
-
export type ScrubField = string | RegExp;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Removed from every query's data, at any depth, before it is persisted (D4, D7): bank
|
|
25
|
-
* account numbers and the handover protocol's signatures. A page restored offline shows
|
|
26
|
-
* such a field as missing ("Needs a connection").
|
|
27
|
-
*/
|
|
28
|
-
export const DEFAULT_SCRUB_FIELDS: readonly ScrubField[] = Object.freeze([
|
|
29
|
-
"iban",
|
|
30
|
-
"qr_iban",
|
|
31
|
-
"default_qr_iban",
|
|
32
|
-
/^signature_/,
|
|
33
|
-
]);
|
|
34
|
-
|
|
35
|
-
/** The storage the persister writes to. The default is IndexedDB through idb-keyval. */
|
|
36
|
-
export interface QueryPersistenceStorage {
|
|
37
|
-
getItem: (key: string) => Promise<string | null | undefined>;
|
|
38
|
-
setItem: (key: string, value: string) => Promise<unknown>;
|
|
39
|
-
removeItem: (key: string) => Promise<unknown>;
|
|
40
|
-
/** Every key in the store — what `removeStale` walks. */
|
|
41
|
-
keys: () => Promise<readonly unknown[]>;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface QueryPersistenceOptions {
|
|
45
|
-
/** The app's name, the key's first part: `kastlan` → `kastlan-query-cache-…`. */
|
|
46
|
-
app: string;
|
|
47
|
-
/** The signed-in account. One cache per account (D5). */
|
|
48
|
-
user: string | number;
|
|
49
|
-
/** The acting company, where the app has several (kastlan): the switch changes the key,
|
|
50
|
-
* so no wipe and no cross-company leak — provided the app switches as
|
|
51
|
-
* {@link QueryPersistence.leave} says (leave, then remount the provider per key). */
|
|
52
|
-
company?: string | number | null;
|
|
53
|
-
/** The app's own rule, beside `denyRoots` — keksdose denies one exact key and every key
|
|
54
|
-
* whose second segment is `"admin"`. `false` keeps the query out. */
|
|
55
|
-
shouldPersistKey?: (queryKey: readonly unknown[]) => boolean;
|
|
56
|
-
/** Query roots (`queryKey[0]`) that never reach the disk: admin, billing, reports… */
|
|
57
|
-
denyRoots?: readonly string[];
|
|
58
|
-
/** Replaces {@link DEFAULT_SCRUB_FIELDS}; spread it to add to it. `[]` scrubs nothing.
|
|
59
|
-
* A paused mutation whose variables carry one of these fields is never persisted (a
|
|
60
|
-
* scrubbed mutation would send something else), and one an older build wrote is dropped
|
|
61
|
-
* on restore. */
|
|
62
|
-
scrubFields?: readonly ScrubField[];
|
|
63
|
-
/** Told when a query's data is not plain JSON and is therefore not persisted. Default:
|
|
64
|
-
* `console.error`, as keksdose's `cacheSafeOrWarn`. */
|
|
65
|
-
onUnsafe?: (queryKey: readonly unknown[], data: unknown) => void;
|
|
66
|
-
/** Changes with each deploy (the app version), so a new build discards the old cache. */
|
|
67
|
-
buster: string;
|
|
68
|
-
/** How long a persisted cache is good for, in ms (keksdose: 24 h). The QueryClient's
|
|
69
|
-
* `gcTime` must be at least this, or restore drops every query. */
|
|
70
|
-
maxAge: number;
|
|
71
|
-
/** Default: IndexedDB (idb-keyval). Tests pass an in-memory one. */
|
|
72
|
-
storage?: QueryPersistenceStorage;
|
|
73
|
-
/** Default 1000 ms, as keksdose. */
|
|
74
|
-
throttleTime?: number;
|
|
75
|
-
/**
|
|
76
|
-
* 0.46 (kastlan K1): whether paused mutations are written with the cache. Default `true`
|
|
77
|
-
* (keksdose: an offline write waits in TanStack's queue and is sent after a reload).
|
|
78
|
-
* `false` keeps every mutation off the disk, and drops any an older build wrote on
|
|
79
|
-
* restore — for an app that queues offline writes in its own outbox (kastlan's Dexie
|
|
80
|
-
* outbox), instead of overriding `dehydrateOptions` by hand.
|
|
81
|
-
*/
|
|
82
|
-
persistMutations?: boolean;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* One persisted cache, for one key. **Mount it per key**: the provider subscribes once and
|
|
87
|
-
* ignores a changed `persistOptions`, so give it the key as its React key —
|
|
88
|
-
*
|
|
89
|
-
* ```tsx
|
|
90
|
-
* <PersistQueryClientProvider key={persistence.key} client={queryClient} persistOptions={persistence.persistOptions}>
|
|
91
|
-
* ```
|
|
92
|
-
*
|
|
93
|
-
* — and create the persistence once the account (and company) is known (`useMemo` on
|
|
94
|
-
* them); before sign-in, mount the plain `QueryClientProvider`. On a company switch, call
|
|
95
|
-
* {@link QueryPersistence.leave} on the old one BEFORE the new key mounts, instead of a bare
|
|
96
|
-
* `queryClient.clear()`: otherwise the old subscription saves the emptied (or the next
|
|
97
|
-
* company's) cache under the old key.
|
|
98
|
-
*/
|
|
99
|
-
export interface QueryPersistence {
|
|
100
|
-
/** `<app>-query-cache-<user>[-<company>]`. */
|
|
101
|
-
key: string;
|
|
102
|
-
/** Everything `<PersistQueryClientProvider persistOptions>` needs. */
|
|
103
|
-
persistOptions: Omit<PersistQueryClientOptions, "queryClient">;
|
|
104
|
-
/** Sign-out: stops writing under this key, empties the in-memory cache and deletes this
|
|
105
|
-
* key's persisted copy. In every tab (0.52): the persistences of this key in the other tabs
|
|
106
|
-
* stop writing too, and delete the key once more after any save of theirs under way.
|
|
107
|
-
* Best-effort; never throws. */
|
|
108
|
-
clear: (queryClient: QueryClient) => Promise<void>;
|
|
109
|
-
/** The company switch (or any change of key without a sign-out): stops writing under this
|
|
110
|
-
* key — a save already scheduled is dropped too — and empties the in-memory cache, so
|
|
111
|
-
* the next key's provider starts clean. The persisted copy stays for the way back. A
|
|
112
|
-
* provider that mounts this persistence again re-arms it with its restore. Never throws. */
|
|
113
|
-
leave: (queryClient: QueryClient) => Promise<void>;
|
|
114
|
-
/** At sign-in: deletes this app's OTHER persisted caches older than `maxAge` (another
|
|
115
|
-
* account's, another company's). Other apps' keys and fresh ones stay. Never throws. */
|
|
116
|
-
removeStale: () => Promise<void>;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const idbStorage: QueryPersistenceStorage = {
|
|
120
|
-
getItem: (key) => get<string>(key),
|
|
121
|
-
setItem: (key, value) => set(key, value),
|
|
122
|
-
removeItem: (key) => del(key),
|
|
123
|
-
keys: () => keys(),
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
export interface RemoveStaleQueryCopiesOptions {
|
|
127
|
-
/** Default: IndexedDB (idb-keyval), the store {@link createQueryPersistence} writes to. */
|
|
128
|
-
storage?: QueryPersistenceStorage;
|
|
129
|
-
/** One key to spare whatever its age — the signed-in account's own
|
|
130
|
-
* (`QueryPersistence.removeStale` passes its key). */
|
|
131
|
-
keep?: string;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* 0.46 (kastlan K2): deletes this app's persisted query caches (`<app>-query-cache-…`)
|
|
136
|
-
* older than `maxAge`, with no persistence at hand — for the sign-in page, where no
|
|
137
|
-
* account is known. A session that ended with no user known (a refresh token refused at
|
|
138
|
-
* boot) cannot name its key for `clear`; this sweeps its copy once it is stale, without
|
|
139
|
-
* waiting for someone's next sign-in. Other apps' keys, other stores' keys and fresh
|
|
140
|
-
* caches stay; an unreadable one is stale. Never throws.
|
|
141
|
-
* {@link QueryPersistence.removeStale} is this with `keep` = its own key.
|
|
142
|
-
*/
|
|
143
|
-
export async function removeStaleQueryCopies(
|
|
144
|
-
app: string,
|
|
145
|
-
maxAge: number,
|
|
146
|
-
{ storage = idbStorage, keep }: RemoveStaleQueryCopiesOptions = {},
|
|
147
|
-
): Promise<void> {
|
|
148
|
-
const prefix = `${app}-query-cache-`;
|
|
149
|
-
try {
|
|
150
|
-
const now = Date.now();
|
|
151
|
-
for (const k of await storage.keys()) {
|
|
152
|
-
if (typeof k !== "string" || !k.startsWith(prefix) || k === keep) continue;
|
|
153
|
-
let timestamp = 0;
|
|
154
|
-
try {
|
|
155
|
-
const raw = await storage.getItem(k);
|
|
156
|
-
const parsed: unknown = raw ? JSON.parse(raw) : null;
|
|
157
|
-
if (parsed && typeof parsed === "object" && typeof (parsed as PersistedClient).timestamp === "number") {
|
|
158
|
-
timestamp = (parsed as PersistedClient).timestamp;
|
|
159
|
-
}
|
|
160
|
-
} catch {
|
|
161
|
-
/* unreadable: stale */
|
|
162
|
-
}
|
|
163
|
-
if (now - timestamp > maxAge) await storage.removeItem(k);
|
|
164
|
-
}
|
|
165
|
-
} catch {
|
|
166
|
-
/* best-effort */
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* True when `data` still means the same thing after JSON.stringify and JSON.parse —
|
|
172
|
-
* keksdose's `isCacheSafe` (query-client.ts:165). Class instances, Map/Set/Date/Blob, a
|
|
173
|
-
* non-finite number, a function: all refused. An `undefined` property survives.
|
|
174
|
-
*/
|
|
175
|
-
export function isCacheSafe(data: unknown, depth = 0): boolean {
|
|
176
|
-
if (depth > 12) return false;
|
|
177
|
-
if (data === null) return true;
|
|
178
|
-
const t = typeof data;
|
|
179
|
-
if (t === "string" || t === "boolean") return true;
|
|
180
|
-
if (t === "number") return Number.isFinite(data as number);
|
|
181
|
-
if (t !== "object") return false;
|
|
182
|
-
if (Array.isArray(data)) return data.every((v) => isCacheSafe(v, depth + 1));
|
|
183
|
-
const proto: unknown = Object.getPrototypeOf(data);
|
|
184
|
-
if (proto !== Object.prototype && proto !== null) return false;
|
|
185
|
-
return Object.values(data as Record<string, unknown>).every((v) => v === undefined || isCacheSafe(v, depth + 1));
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/** A copy of `data` without the scrubbed fields, at any depth. The input is not touched. */
|
|
189
|
-
function scrub(data: unknown, fields: readonly ScrubField[]): unknown {
|
|
190
|
-
if (fields.length === 0 || data === null || typeof data !== "object") return data;
|
|
191
|
-
if (Array.isArray(data)) return data.map((v) => scrub(v, fields));
|
|
192
|
-
const out: Record<string, unknown> = {};
|
|
193
|
-
for (const [name, value] of Object.entries(data as Record<string, unknown>)) {
|
|
194
|
-
if (fields.some((f) => (typeof f === "string" ? f === name : f.test(name)))) continue;
|
|
195
|
-
out[name] = scrub(value, fields);
|
|
196
|
-
}
|
|
197
|
-
return out;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const defaultOnUnsafe = (queryKey: readonly unknown[]) => {
|
|
201
|
-
console.error(
|
|
202
|
-
`[query-cache] refusing to persist ${JSON.stringify(queryKey)}: the value is not plain JSON ` +
|
|
203
|
-
`(a class instance, Map, Set, Date or Blob). Return plain data from the queryFn and build ` +
|
|
204
|
-
`the rich object at the call site.`,
|
|
205
|
-
);
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
export function createQueryPersistence({
|
|
209
|
-
app,
|
|
210
|
-
user,
|
|
211
|
-
company,
|
|
212
|
-
shouldPersistKey,
|
|
213
|
-
denyRoots = [],
|
|
214
|
-
scrubFields = DEFAULT_SCRUB_FIELDS,
|
|
215
|
-
onUnsafe = defaultOnUnsafe,
|
|
216
|
-
buster,
|
|
217
|
-
maxAge,
|
|
218
|
-
storage = idbStorage,
|
|
219
|
-
throttleTime = 1000,
|
|
220
|
-
persistMutations = true,
|
|
221
|
-
}: QueryPersistenceOptions): QueryPersistence {
|
|
222
|
-
const prefix = `${app}-query-cache-`;
|
|
223
|
-
const key = `${prefix}${user}${company === undefined || company === null || company === "" ? "" : `-${company}`}`;
|
|
224
|
-
const denied = new Set(denyRoots);
|
|
225
|
-
// Set by `leave` and `clear`: a write under this key after the person left it (a
|
|
226
|
-
// throttled save of the emptied cache) is dropped. A restore re-arms it.
|
|
227
|
-
let retired = false;
|
|
228
|
-
|
|
229
|
-
// 0.52 (refactor audit 2026-10-30, FLW-1): `retired` lived in this tab alone, so a sign-out
|
|
230
|
-
// in one tab deleted the key and another tab's persister wrote its in-memory cache straight
|
|
231
|
-
// back under it. While armed, a persistence listens on a channel named after its key; a
|
|
232
|
-
// `clear` there retires it, and it deletes the key once more — IndexedDB runs a save of its
|
|
233
|
-
// own already under way first. A `leave` posts nothing: another tab may still be on that
|
|
234
|
-
// company. Without BroadcastChannel, as before 0.52.
|
|
235
|
-
const across = `eifi1-query-cache:${key}`;
|
|
236
|
-
let unlisten: (() => void) | null = null;
|
|
237
|
-
|
|
238
|
-
const retire = () => {
|
|
239
|
-
retired = true;
|
|
240
|
-
unlisten?.();
|
|
241
|
-
unlisten = null;
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const listen = () => {
|
|
245
|
-
unlisten ??= listenOn(across, (data) => {
|
|
246
|
-
if (data !== "clear") return;
|
|
247
|
-
retire();
|
|
248
|
-
Promise.resolve()
|
|
249
|
-
.then(() => storage.removeItem(key))
|
|
250
|
-
.catch(() => undefined);
|
|
251
|
-
});
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
const keyAllowed = (queryKey: readonly unknown[]) =>
|
|
255
|
-
!denied.has(String(queryKey[0])) && (shouldPersistKey ? shouldPersistKey(queryKey) : true);
|
|
256
|
-
|
|
257
|
-
/** The write side: a success, an allowed key, plain JSON (or the warning). */
|
|
258
|
-
const shouldDehydrateQuery = (query: {
|
|
259
|
-
queryKey: readonly unknown[];
|
|
260
|
-
state: { status: string; data?: unknown };
|
|
261
|
-
}): boolean => {
|
|
262
|
-
if (query.state.status !== "success" || !keyAllowed(query.queryKey)) return false;
|
|
263
|
-
if (isCacheSafe(query.state.data)) return true;
|
|
264
|
-
onUnsafe(query.queryKey, query.state.data);
|
|
265
|
-
return false;
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
/** One persisted query entry, scrubbed; `null` when it may not be restored. */
|
|
269
|
-
const restorable = (entry: unknown): unknown => {
|
|
270
|
-
if (!entry || typeof entry !== "object") return null;
|
|
271
|
-
const { queryKey, state } = entry as { queryKey?: unknown; state?: { data?: unknown } };
|
|
272
|
-
if (!Array.isArray(queryKey) || !keyAllowed(queryKey)) return null;
|
|
273
|
-
if (!isCacheSafe(state?.data)) return null;
|
|
274
|
-
return withScrubbedData(entry);
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
/** Whether `value` has a scrubbed field's name anywhere in it. */
|
|
278
|
-
const carriesScrubbed = (value: unknown, depth = 0): boolean => {
|
|
279
|
-
if (scrubFields.length === 0 || depth > 12 || value === null || typeof value !== "object") return false;
|
|
280
|
-
if (Array.isArray(value)) return value.some((v) => carriesScrubbed(v, depth + 1));
|
|
281
|
-
return Object.entries(value as Record<string, unknown>).some(
|
|
282
|
-
([name, v]) =>
|
|
283
|
-
scrubFields.some((f) => (typeof f === "string" ? f === name : f.test(name))) || carriesScrubbed(v, depth + 1),
|
|
284
|
-
);
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
/** The write side for mutations: TanStack's default (paused ones), minus any whose
|
|
288
|
-
* variables carry a scrubbed field (S6); none at all with `persistMutations: false`. */
|
|
289
|
-
const shouldDehydrateMutation = (mutation: { state: { isPaused: boolean; variables?: unknown } }): boolean =>
|
|
290
|
-
persistMutations && mutation.state.isPaused && !carriesScrubbed(mutation.state.variables);
|
|
291
|
-
|
|
292
|
-
const withScrubbedData = (entry: unknown): unknown => {
|
|
293
|
-
const query = entry as { state?: { data?: unknown } };
|
|
294
|
-
if (!query.state || !("data" in query.state)) return entry;
|
|
295
|
-
return { ...query, state: { ...query.state, data: scrub(query.state.data, scrubFields) } };
|
|
296
|
-
};
|
|
297
|
-
|
|
298
|
-
// The scrub on the way OUT: the in-memory cache keeps the field (the page that is open
|
|
299
|
-
// shows it), the disk never sees it. Mutations are a paused write queue and are kept
|
|
300
|
-
// whole — scrubbing one would change what it sends — so one carrying a scrubbed field is
|
|
301
|
-
// not written at all (`shouldDehydrateMutation`).
|
|
302
|
-
const serialize = (client: PersistedClient): string =>
|
|
303
|
-
JSON.stringify({
|
|
304
|
-
...client,
|
|
305
|
-
clientState: { ...client.clientState, queries: client.clientState.queries.map(withScrubbedData) },
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
// The twin on the way IN (keksdose's `sanitizePersistedCache`, :264-298): an older build
|
|
309
|
-
// wrote what this one may deny. Never throws; an unreadable blob comes back with
|
|
310
|
-
// `timestamp: 0`, which the restore treats as unusable and removes.
|
|
311
|
-
const deserialize = (raw: string): PersistedClient => {
|
|
312
|
-
const empty: PersistedClient = { timestamp: 0, buster: "", clientState: { mutations: [], queries: [] } };
|
|
313
|
-
try {
|
|
314
|
-
const parsed: unknown = JSON.parse(raw);
|
|
315
|
-
if (!parsed || typeof parsed !== "object") return empty;
|
|
316
|
-
const { timestamp, buster: stored, clientState } = parsed as Partial<PersistedClient>;
|
|
317
|
-
if (typeof timestamp !== "number" || typeof stored !== "string") return empty;
|
|
318
|
-
if (!clientState || typeof clientState !== "object" || !Array.isArray(clientState.queries)) return empty;
|
|
319
|
-
return {
|
|
320
|
-
timestamp,
|
|
321
|
-
buster: stored,
|
|
322
|
-
clientState: {
|
|
323
|
-
mutations:
|
|
324
|
-
persistMutations && Array.isArray(clientState.mutations)
|
|
325
|
-
? clientState.mutations.filter(
|
|
326
|
-
(m) => !carriesScrubbed((m as { state?: { variables?: unknown } } | null)?.state?.variables),
|
|
327
|
-
)
|
|
328
|
-
: [],
|
|
329
|
-
queries: clientState.queries
|
|
330
|
-
.map(restorable)
|
|
331
|
-
.filter((q) => q !== null) as PersistedClient["clientState"]["queries"],
|
|
332
|
-
},
|
|
333
|
-
};
|
|
334
|
-
} catch {
|
|
335
|
-
return empty;
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
const persister = createAsyncStoragePersister({
|
|
340
|
-
storage: {
|
|
341
|
-
// Only the provider's restore reads: mounting this persistence again re-arms it.
|
|
342
|
-
getItem: async (k) => {
|
|
343
|
-
retired = false;
|
|
344
|
-
listen();
|
|
345
|
-
return (await storage.getItem(k)) ?? null;
|
|
346
|
-
},
|
|
347
|
-
setItem: async (k, v) => {
|
|
348
|
-
if (!retired) await storage.setItem(k, v);
|
|
349
|
-
},
|
|
350
|
-
removeItem: async (k) => {
|
|
351
|
-
await storage.removeItem(k);
|
|
352
|
-
},
|
|
353
|
-
},
|
|
354
|
-
key,
|
|
355
|
-
throttleTime,
|
|
356
|
-
serialize,
|
|
357
|
-
deserialize,
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
const leave = async (queryClient: QueryClient) => {
|
|
361
|
-
retire();
|
|
362
|
-
try {
|
|
363
|
-
queryClient.clear();
|
|
364
|
-
} catch {
|
|
365
|
-
/* best-effort */
|
|
366
|
-
}
|
|
367
|
-
};
|
|
368
|
-
|
|
369
|
-
const clear = async (queryClient: QueryClient) => {
|
|
370
|
-
// Retired first, so this tab's own channel is closed and does not hear its `clear`.
|
|
371
|
-
retire();
|
|
372
|
-
// Before this tab's delete: the other tabs stop writing as early as they can.
|
|
373
|
-
postOnce(across, "clear");
|
|
374
|
-
try {
|
|
375
|
-
queryClient.clear();
|
|
376
|
-
await persister.removeClient();
|
|
377
|
-
} catch {
|
|
378
|
-
/* best-effort: private mode / IndexedDB unavailable */
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
|
|
382
|
-
const removeStale = () => removeStaleQueryCopies(app, maxAge, { storage, keep: key });
|
|
383
|
-
|
|
384
|
-
return {
|
|
385
|
-
key,
|
|
386
|
-
persistOptions: { persister, maxAge, buster, dehydrateOptions: { shouldDehydrateQuery, shouldDehydrateMutation } },
|
|
387
|
-
clear,
|
|
388
|
-
leave,
|
|
389
|
-
removeStale,
|
|
390
|
-
};
|
|
391
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { useSyncExternalStore } from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* vite-plugin-pwa's `registerSW` from `virtual:pwa-register` (`registerType: "prompt"`) —
|
|
5
|
-
* the app passes it in, since a virtual module is the app's build's, not the kit's. It
|
|
6
|
-
* answers the `updateSW(reloadPage)` function.
|
|
7
|
-
*/
|
|
8
|
-
export type RegisterServiceWorker = (options: {
|
|
9
|
-
onNeedRefresh?: () => void;
|
|
10
|
-
onOfflineReady?: () => void;
|
|
11
|
-
}) => (reloadPage?: boolean) => Promise<void>;
|
|
12
|
-
|
|
13
|
-
/** What {@link createServiceWorkerUpdates} answers: one store per app, a module constant. */
|
|
14
|
-
export interface ServiceWorkerUpdates {
|
|
15
|
-
/** Registers the service worker — once, however often it is called. Call it at start,
|
|
16
|
-
* before the router renders, so the sign-in pages get the offline shell too. */
|
|
17
|
-
start: () => void;
|
|
18
|
-
/** Whether a new version waits. */
|
|
19
|
-
needRefresh: () => boolean;
|
|
20
|
-
/** For `useSyncExternalStore`. */
|
|
21
|
-
subscribe: (listener: () => void) => () => void;
|
|
22
|
-
/** Activates the waiting version and reloads (`updateSW(true)`). Before `start`, nothing. */
|
|
23
|
-
reload: () => void;
|
|
24
|
-
/** The person closed the prompt: the version keeps waiting, the prompt stays down. */
|
|
25
|
-
dismiss: () => void;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* 0.46 (kastlan K3, docs/local-first-harmonization.md §1.5 D8): the service worker
|
|
30
|
-
* registered ONCE AT START, and its "a new version waits" state as a small store the
|
|
31
|
-
* prompt reads wherever it lives. vite-plugin-pwa's `useRegisterSW` registers when the
|
|
32
|
-
* component that calls it mounts: an app whose {@link PwaUpdatePrompt} sits in its
|
|
33
|
-
* signed-in shell (it reads the tour state, the route) would register only after sign-in,
|
|
34
|
-
* and the sign-in pages would lose the offline shell on a first visit.
|
|
35
|
-
*
|
|
36
|
-
* ```ts
|
|
37
|
-
* // shared/pwa/sw-updates.ts
|
|
38
|
-
* import { registerSW } from "virtual:pwa-register";
|
|
39
|
-
* export const swUpdates = createServiceWorkerUpdates(registerSW);
|
|
40
|
-
* // main.tsx, before render: swUpdates.start();
|
|
41
|
-
* // the shell: <PwaUpdatePrompt {...useServiceWorkerUpdate(swUpdates)} hold={tourRunning} />
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export function createServiceWorkerUpdates(register: RegisterServiceWorker): ServiceWorkerUpdates {
|
|
45
|
-
let waiting = false;
|
|
46
|
-
let update: ((reloadPage?: boolean) => Promise<void>) | null = null;
|
|
47
|
-
const listeners = new Set<() => void>();
|
|
48
|
-
const emit = () => listeners.forEach((listener) => listener());
|
|
49
|
-
const set = (value: boolean) => {
|
|
50
|
-
if (waiting === value) return;
|
|
51
|
-
waiting = value;
|
|
52
|
-
emit();
|
|
53
|
-
};
|
|
54
|
-
return {
|
|
55
|
-
start: () => {
|
|
56
|
-
if (update) return;
|
|
57
|
-
update = register({ onNeedRefresh: () => set(true) });
|
|
58
|
-
},
|
|
59
|
-
needRefresh: () => waiting,
|
|
60
|
-
subscribe: (listener) => {
|
|
61
|
-
listeners.add(listener);
|
|
62
|
-
return () => {
|
|
63
|
-
listeners.delete(listener);
|
|
64
|
-
};
|
|
65
|
-
},
|
|
66
|
-
reload: () => {
|
|
67
|
-
void update?.(true);
|
|
68
|
-
},
|
|
69
|
-
dismiss: () => set(false),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** {@link PwaUpdatePrompt}'s props from the store: `needRefresh`, `onReload`, `onDismiss`. */
|
|
74
|
-
export function useServiceWorkerUpdate(updates: ServiceWorkerUpdates): {
|
|
75
|
-
needRefresh: boolean;
|
|
76
|
-
onReload: () => void;
|
|
77
|
-
onDismiss: () => void;
|
|
78
|
-
} {
|
|
79
|
-
const needRefresh = useSyncExternalStore(updates.subscribe, updates.needRefresh, () => false);
|
|
80
|
-
return { needRefresh, onReload: updates.reload, onDismiss: updates.dismiss };
|
|
81
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// The English words of ./shared-computer, in a module with no component code (0.34, KS U8).
|
|
2
|
-
|
|
3
|
-
import type { SharedComputerLabels } from "./shared-computer";
|
|
4
|
-
|
|
5
|
-
export const DEFAULT_SHARED_COMPUTER_LABELS: SharedComputerLabels = {
|
|
6
|
-
label: "This is a shared computer",
|
|
7
|
-
hint: "No copy of your data stays on this device. Pages then open only with a connection.",
|
|
8
|
-
};
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
3
|
-
import { Checkbox } from "../components/checkbox";
|
|
4
|
-
import { readSessionStored, readStored, removeStored, writeSessionStored, writeStored } from "../lib/safe-storage";
|
|
5
|
-
import { DEFAULT_SHARED_COMPUTER_LABELS } from "./shared-computer-labels";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* "This is a shared computer" — a choice on the sign-in form that persists nothing
|
|
9
|
-
* (docs/local-first-harmonization.md §1.5 D6, D7). When it is on, the app does not mount
|
|
10
|
-
* the query persistence (`createQueryPersistence`): the cache lives in memory only.
|
|
11
|
-
*
|
|
12
|
-
* The choice must live exactly as long as the session it governs. By default it is held in
|
|
13
|
-
* `sessionStorage`, which fits a session that ends with the tab. An app whose session
|
|
14
|
-
* outlives the tab (a refresh token in `localStorage`: kastlan) passes `storage: "local"`
|
|
15
|
-
* and calls `setSharedComputer(false)` at every end of that session (logout, a failed
|
|
16
|
-
* refresh), beside removing the token. `isSharedComputer()` reads both places, so a choice
|
|
17
|
-
* made in either keeps the cache in memory. Where storage is blocked, `isSharedComputer()`
|
|
18
|
-
* is `false` and `setSharedComputer` does nothing.
|
|
19
|
-
*/
|
|
20
|
-
export interface SharedComputerLabels {
|
|
21
|
-
label: string;
|
|
22
|
-
/** The one line under it: what the choice does. */
|
|
23
|
-
hint: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Defined in ./shared-computer-labels, which holds no component code (0.34, KS U8).
|
|
27
|
-
export { DEFAULT_SHARED_COMPUTER_LABELS };
|
|
28
|
-
|
|
29
|
-
const KEY = "eifi1-shared-computer";
|
|
30
|
-
|
|
31
|
-
/** Where the choice is held: `"session"` (this tab, the default) or `"local"` (as long as
|
|
32
|
-
* a session kept in `localStorage`, until `setSharedComputer(false)`). */
|
|
33
|
-
export type SharedComputerStorage = "session" | "local";
|
|
34
|
-
|
|
35
|
-
/** Whether this session was signed in as on a shared computer, the choice held in either
|
|
36
|
-
* place. `false` when storage is unavailable. */
|
|
37
|
-
export function isSharedComputer(): boolean {
|
|
38
|
-
return readSessionStored(KEY) === "1" || readStored(KEY) === "1";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Records the choice in `options.storage` (default `"session"`), and only there; `false`
|
|
42
|
-
* forgets it in both places. */
|
|
43
|
-
export function setSharedComputer(on: boolean, options: { storage?: SharedComputerStorage } = {}): void {
|
|
44
|
-
const local = options.storage === "local";
|
|
45
|
-
writeSessionStored(KEY, on && !local ? "1" : null);
|
|
46
|
-
if (on && local) writeStored(KEY, "1");
|
|
47
|
-
else removeStored(KEY);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface SharedComputerChoiceProps {
|
|
51
|
-
/** Controlled. Left out, the box starts from {@link isSharedComputer}. */
|
|
52
|
-
checked?: boolean;
|
|
53
|
-
/** Told after the choice is stored. */
|
|
54
|
-
onCheckedChange?: (on: boolean) => void;
|
|
55
|
-
/** Where the choice is stored: see {@link setSharedComputer}. Default `"session"`. */
|
|
56
|
-
storage?: SharedComputerStorage;
|
|
57
|
-
disabled?: boolean;
|
|
58
|
-
className?: string;
|
|
59
|
-
labels?: LabelOverride<SharedComputerLabels>;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function SharedComputerChoice({
|
|
63
|
-
checked,
|
|
64
|
-
onCheckedChange,
|
|
65
|
-
storage,
|
|
66
|
-
disabled,
|
|
67
|
-
className,
|
|
68
|
-
labels: labelsProp,
|
|
69
|
-
}: SharedComputerChoiceProps) {
|
|
70
|
-
const labels = useKitLabels("sharedComputer", DEFAULT_SHARED_COMPUTER_LABELS, labelsProp);
|
|
71
|
-
const [own, setOwn] = useState(isSharedComputer);
|
|
72
|
-
const on = checked ?? own;
|
|
73
|
-
return (
|
|
74
|
-
<Checkbox
|
|
75
|
-
className={className}
|
|
76
|
-
label={labels.label}
|
|
77
|
-
description={labels.hint}
|
|
78
|
-
checked={on}
|
|
79
|
-
disabled={disabled}
|
|
80
|
-
onCheckedChange={(next) => {
|
|
81
|
-
setSharedComputer(next, { storage });
|
|
82
|
-
setOwn(next);
|
|
83
|
-
onCheckedChange?.(next);
|
|
84
|
-
}}
|
|
85
|
-
/>
|
|
86
|
-
);
|
|
87
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// The English words of ./sign-out-pending-dialog, in a module with no component code: the
|
|
2
|
-
// English catalogue (src/i18n/defaults.ts) imports them without the component (0.34, KS U8).
|
|
3
|
-
// keksdose's reviewed words (nav.logout_queued_*, account-menu.tsx:247-317) are the canon.
|
|
4
|
-
|
|
5
|
-
import type { SignOutPendingDialogLabels } from "./sign-out-pending-dialog";
|
|
6
|
-
|
|
7
|
-
export const DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS: SignOutPendingDialogLabels = {
|
|
8
|
-
title: "Some changes have not been saved to the server yet",
|
|
9
|
-
lost: (count) =>
|
|
10
|
-
count === 1
|
|
11
|
-
? "1 change is still waiting to sync. Logging out clears this device’s copy, and it is the only copy."
|
|
12
|
-
: `${count} changes are still waiting to sync. Logging out clears this device’s copy, and it is the only copy.`,
|
|
13
|
-
kept: (count) =>
|
|
14
|
-
count === 1
|
|
15
|
-
? "1 change is still waiting to sync. It stays on this device for you and syncs the next time you log in here."
|
|
16
|
-
: `${count} changes are still waiting to sync. They stay on this device for you and sync the next time you log in here.`,
|
|
17
|
-
syncNow: "Sync now",
|
|
18
|
-
signOutAnyway: "Log out anyway",
|
|
19
|
-
discardWaiting: "Discard waiting changes",
|
|
20
|
-
cancel: "Cancel",
|
|
21
|
-
};
|