@eifi1/ui-kit 0.51.7 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +141 -23
- package/dist/account/account-parts.d.ts +10 -8
- package/dist/account/account-parts.js +1 -18
- package/dist/account/account-parts.js.map +1 -1
- package/dist/account/data-export-setting-labels.js +1 -1
- package/dist/account/data-export-setting-labels.js.map +1 -1
- package/dist/account/delete-account-setting-labels.js +1 -1
- package/dist/account/delete-account-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting-labels.js +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/passkeys-setting.d.ts +9 -2
- package/dist/account/passkeys-setting.js +41 -29
- package/dist/account/passkeys-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +3 -2
- package/dist/account/sessions-setting.js +10 -8
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.js +1 -3
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +6 -3
- package/dist/admin/admin-parts.js +6 -21
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/mail-test-card-labels.js +1 -1
- package/dist/admin/mail-test-card-labels.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -2
- package/dist/admin/plan-change-labels.js +1 -17
- package/dist/admin/plan-change-labels.js.map +1 -1
- package/dist/admin/plan-change.d.ts +3 -42
- package/dist/admin/plan-change.js +1 -1
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +3 -3
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/auth/auth-errors-labels.d.ts +11 -0
- package/dist/auth/auth-errors-labels.js +13 -0
- package/dist/auth/auth-errors-labels.js.map +1 -0
- package/dist/auth/auth-errors.d.ts +7 -23
- package/dist/auth/auth-errors.js +2 -15
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.js +2 -1
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/forgot-password-form-labels.js +1 -1
- package/dist/auth/forgot-password-form-labels.js.map +1 -1
- package/dist/auth/forgot-password-form.js +7 -2
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form-labels.js +1 -1
- package/dist/auth/register-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form-labels.js +1 -1
- package/dist/auth/reset-password-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form.js +5 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.js +1 -1
- package/dist/auth/sign-in-form-labels.js.map +1 -1
- package/dist/auth/status-parts.d.ts +0 -3
- package/dist/auth/status-parts.js +0 -4
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.js +1 -1
- package/dist/auth/verify-email-labels.js.map +1 -1
- package/dist/auth/verify-email.js +7 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/cancel-subscription.d.ts +20 -8
- package/dist/billing/cancel-subscription.js +7 -5
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/dialog-close.d.ts +29 -0
- package/dist/billing/dialog-close.js +8 -0
- package/dist/billing/dialog-close.js.map +1 -0
- package/dist/billing/plan-card.d.ts +14 -4
- package/dist/billing/plan-card.js +15 -8
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-change-labels.d.ts +42 -0
- package/dist/billing/plan-change-labels.js +22 -0
- package/dist/billing/plan-change-labels.js.map +1 -0
- package/dist/billing/plan-switch.d.ts +19 -7
- package/dist/billing/plan-switch.js +8 -4
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +12 -0
- package/dist/chart.js +16 -1
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips.d.ts +5 -5
- package/dist/components/account-chips.js +11 -13
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +16 -5
- package/dist/components/alert-banner.js +46 -1
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +13 -0
- package/dist/components/amount-input.js +1 -0
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +57 -65
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.d.ts +12 -2
- package/dist/components/bulk-action-bar.js +65 -21
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-look.d.ts +5 -5
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/chart-edge.d.ts +16 -0
- package/dist/components/chart-edge.js +14 -1
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-figure.d.ts +13 -0
- package/dist/components/chart-figure.js +15 -0
- package/dist/components/chart-figure.js.map +1 -0
- package/dist/components/chart-zoom-core.js +1 -4
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +8 -1
- package/dist/components/chart.js +19 -10
- package/dist/components/chart.js.map +1 -1
- package/dist/components/combobox-core.d.ts +111 -2
- package/dist/components/combobox-core.js +148 -42
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +141 -130
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/copy-button.d.ts +6 -5
- package/dist/components/copy-button.js +5 -3
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.js +2 -2
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +1 -1
- package/dist/components/data-table-column-settings.js +33 -7
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +4 -2
- package/dist/components/data-table-filters.js +2 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +6 -4
- package/dist/components/data-table-fit.js +4 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.d.ts +1 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.d.ts +1 -1
- package/dist/components/data-table-head.js +15 -12
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +12 -7
- package/dist/components/data-table-mobile.js +43 -30
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js +11 -6
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +2 -2
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.d.ts +6 -2
- package/dist/components/data-table-row.js +17 -10
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-selection.d.ts +1 -1
- package/dist/components/data-table-selection.js.map +1 -1
- package/dist/components/data-table-shared.d.ts +10 -2
- package/dist/components/data-table-shared.js +18 -0
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.d.ts +21 -2
- package/dist/components/data-table-sort.js +24 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.d.ts +1 -1
- package/dist/components/data-table-virtual.js +18 -6
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.d.ts +13 -4
- package/dist/components/data-table.js +139 -36
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +24 -2
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +15 -2
- package/dist/components/date-picker.js +55 -26
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +47 -20
- package/dist/components/date-range-picker.js +23 -7
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/error-boundary.js +37 -30
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
- package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
- package/dist/components/field-base-labels.js.map +1 -0
- package/dist/components/field-base.d.ts +4 -3
- package/dist/components/field-base.js +3 -3
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/field-sync-labels.d.ts +1 -0
- package/dist/components/field-sync-labels.js.map +1 -1
- package/dist/components/field-sync.d.ts +23 -1
- package/dist/components/field-sync.js.map +1 -1
- package/dist/components/form-actions.js +11 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.d.ts +3 -0
- package/dist/components/hover-menu.js +5 -3
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +14 -9
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.d.ts +43 -0
- package/dist/components/inline-confirm.js +67 -0
- package/dist/components/inline-confirm.js.map +1 -0
- package/dist/components/inline-entity-combobox.d.ts +4 -3
- package/dist/components/inline-entity-combobox.js +148 -140
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +28 -112
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-page.d.ts +3 -1
- package/dist/components/legal-page.js +3 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +4 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.d.ts +2 -2
- package/dist/components/lightbox.js +17 -6
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/list.d.ts +6 -2
- package/dist/components/list.js +3 -2
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.d.ts +1 -1
- package/dist/components/measured-grid.js +2 -1
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/mini-calendar.js +3 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.js +3 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-grid.d.ts +55 -0
- package/dist/components/month-grid.js +148 -0
- package/dist/components/month-grid.js.map +1 -0
- package/dist/components/month-picker.d.ts +36 -4
- package/dist/components/month-picker.js +123 -146
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-select.d.ts +2 -2
- package/dist/components/multi-select.js +11 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/picker-sheet.js +2 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +7 -0
- package/dist/components/pie-chart-labels.js +1 -0
- package/dist/components/pie-chart-labels.js.map +1 -1
- package/dist/components/pie-chart.d.ts +5 -3
- package/dist/components/pie-chart.js +7 -22
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.d.ts +3 -0
- package/dist/components/popover.js +7 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/row-actions.js +2 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/section-nav.d.ts +7 -0
- package/dist/components/section-nav.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +3 -3
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +7 -4
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +31 -7
- package/dist/components/series-chart.js +72 -29
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/share-card.js +3 -3
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/sign-chip-labels.d.ts +1 -0
- package/dist/components/sign-chip-labels.js.map +1 -1
- package/dist/components/sign-chip.d.ts +10 -1
- package/dist/components/sign-chip.js.map +1 -1
- package/dist/components/tabs-labels.d.ts +2 -0
- package/dist/components/tabs-labels.js +11 -0
- package/dist/components/tabs-labels.js.map +1 -0
- package/dist/components/tabs.d.ts +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +2 -2
- package/dist/components/toggle-legend.js +6 -6
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -2
- package/dist/components/translation-review-editor.js +2 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review.d.ts +2 -1
- package/dist/components/translation-review.js +2 -2
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +26 -0
- package/dist/components/treemap-labels.js +10 -0
- package/dist/components/treemap-labels.js.map +1 -0
- package/dist/components/treemap-layout.d.ts +62 -0
- package/dist/components/treemap-layout.js +126 -0
- package/dist/components/treemap-layout.js.map +1 -0
- package/dist/components/treemap.d.ts +140 -17
- package/dist/components/treemap.js +324 -97
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/use-table-state.d.ts +5 -5
- package/dist/components/use-table-state.js +4 -1
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +6 -2
- package/dist/data-table.js +7 -2
- package/dist/data-table.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +36 -7
- package/dist/eslint/role-utilities.js +42 -9
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +25 -16
- package/dist/feedback/feedback-dialog.js +6 -2
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-mutation.d.ts +30 -0
- package/dist/feedback/feedback-mutation.js +16 -0
- package/dist/feedback/feedback-mutation.js.map +1 -0
- package/dist/feedback/feedback-page-link.d.ts +53 -0
- package/dist/feedback/feedback-page-link.js +37 -0
- package/dist/feedback/feedback-page-link.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +12 -3
- package/dist/feedback/feedback-public-list.js +2 -1
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-replies.d.ts +3 -1
- package/dist/feedback/feedback-replies.js +5 -4
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +5 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +64 -28
- package/dist/feedback/feedback-row-detail.js +30 -28
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +30 -11
- package/dist/feedback/feedback-status-undo.js +10 -15
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
- package/dist/feedback/feedback-submit-dialog.js +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.js +9 -3
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +21 -9
- package/dist/feedback/feedback-table.js +45 -25
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +2 -2
- package/dist/feedback/feedback-thread-labels.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +24 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +34 -0
- package/dist/feedback.js +42 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +35 -0
- package/dist/hooks/use-focus-trap.js +6 -4
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +5 -2
- package/dist/hooks/use-hotkey.js +5 -4
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-long-press.d.ts +7 -4
- package/dist/hooks/use-long-press.js +3 -0
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-media-query.js +12 -4
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-mounted.d.ts +22 -0
- package/dist/hooks/use-mounted.js +24 -0
- package/dist/hooks/use-mounted.js.map +1 -0
- package/dist/hooks/use-overlay-history.js +19 -3
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +4 -5
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -2
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +20 -41
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -10
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +5 -0
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +64 -17
- package/dist/index.js +77 -12
- package/dist/index.js.map +1 -1
- package/dist/landing/routing.d.ts +3 -1
- package/dist/landing/routing.js +4 -7
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/broadcast.d.ts +17 -0
- package/dist/lib/broadcast.js +30 -0
- package/dist/lib/broadcast.js.map +1 -0
- package/dist/lib/date-format.d.ts +37 -2
- package/dist/lib/date-format.js +34 -8
- package/dist/lib/date-format.js.map +1 -1
- package/dist/lib/day-format.d.ts +46 -0
- package/dist/lib/day-format.js +46 -0
- package/dist/lib/day-format.js.map +1 -0
- package/dist/lib/describe-failure.d.ts +14 -0
- package/dist/lib/describe-failure.js +9 -0
- package/dist/lib/describe-failure.js.map +1 -0
- package/dist/lib/direction.d.ts +16 -0
- package/dist/lib/direction.js +9 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/focus-left.d.ts +63 -0
- package/dist/lib/focus-left.js +67 -0
- package/dist/lib/focus-left.js.map +1 -0
- package/dist/lib/format.js +5 -14
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/http-status.d.ts +24 -0
- package/dist/lib/http-status.js +14 -0
- package/dist/lib/http-status.js.map +1 -0
- package/dist/lib/intl-cache.d.ts +14 -0
- package/dist/lib/intl-cache.js +15 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/isin.d.ts +10 -0
- package/dist/lib/isin.js.map +1 -1
- package/dist/lib/iso-day.d.ts +11 -0
- package/dist/lib/iso-day.js +8 -0
- package/dist/lib/iso-day.js.map +1 -0
- package/dist/lib/lazy-with-fallback.d.ts +31 -0
- package/dist/lib/lazy-with-fallback.js +40 -0
- package/dist/lib/lazy-with-fallback.js.map +1 -0
- package/dist/lib/path-pattern.d.ts +34 -0
- package/dist/lib/path-pattern.js +24 -0
- package/dist/lib/path-pattern.js.map +1 -0
- package/dist/lib/reduced-motion.d.ts +2 -1
- package/dist/lib/reduced-motion.js.map +1 -1
- package/dist/lib/round.d.ts +2 -1
- package/dist/lib/round.js +2 -1
- package/dist/lib/round.js.map +1 -1
- package/dist/lib/safe-storage.d.ts +24 -5
- package/dist/lib/safe-storage.js +27 -2
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/session-refresh.js +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/share-format.d.ts +13 -0
- package/dist/lib/share-format.js +10 -0
- package/dist/lib/share-format.js.map +1 -0
- package/dist/lib/text-case.d.ts +17 -0
- package/dist/lib/text-case.js +8 -0
- package/dist/lib/text-case.js.map +1 -0
- package/dist/lib/text-match.d.ts +29 -0
- package/dist/lib/text-match.js +20 -2
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/thenable.d.ts +13 -0
- package/dist/lib/thenable.js +8 -0
- package/dist/lib/thenable.js.map +1 -0
- package/dist/lib/translation-review.d.ts +7 -2
- package/dist/lib/translation-review.js +4 -4
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/device-zone-report.js +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +2 -1
- package/dist/notifications/notification-bell.js +3 -3
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +10 -6
- package/dist/notifications/notification-inbox.js +26 -48
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.d.ts +3 -2
- package/dist/notifications/notification-parts.js +1 -3
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.d.ts +6 -0
- package/dist/notifications/notifications-labels.js +1 -0
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +1 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.d.ts +2 -1
- package/dist/notifications/push-devices-setting.js +27 -49
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +10 -3
- package/dist/notifications/quiet-hours-setting.js +65 -26
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/unsubscribe-panel.js +4 -7
- package/dist/notifications/unsubscribe-panel.js.map +1 -1
- package/dist/notifications/use-push-device.d.ts +39 -1
- package/dist/notifications/use-push-device.js +28 -7
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/query-persistence.d.ts +3 -1
- package/dist/offline/query-persistence.js +19 -2
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/rhf/fields.d.ts +11 -4
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/command-palette.js +1 -1
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +19 -9
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/use-command-key.d.ts +12 -1
- package/dist/search/use-command-key.js +3 -12
- package/dist/search/use-command-key.js.map +1 -1
- package/dist/search.d.ts +7 -0
- package/dist/search.js +10 -0
- package/dist/search.js.map +1 -1
- package/dist/settings/use-settings-focus.js +1 -0
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +21 -5
- package/dist/shell/account-menu-language.js +3 -1
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +26 -9
- package/dist/shell/account-menu-text-size.js +3 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/role-switcher.d.ts +7 -0
- package/dist/shell/role-switcher.js.map +1 -1
- package/dist/shell/top-bar-actions.d.ts +1 -1
- package/dist/shell/top-bar-actions.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +0 -2
- package/dist/shell/top-bar-parts-labels.js +0 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +27 -8
- package/dist/shell.js +28 -7
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +30 -4
- package/dist/sync/engine.js +172 -52
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +6 -2
- package/dist/sync.js +6 -1
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js +3 -8
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -1
- package/dist/theme/contrast.js +3 -8
- package/dist/theme/contrast.js.map +1 -1
- package/dist/theme/palette-store.js +6 -6
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js +3 -8
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +3 -6
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.d.ts +7 -4
- package/dist/tour/tour-catalogue.js +12 -10
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.d.ts +0 -2
- package/dist/tour/tour-dock.js +0 -2
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-gates.d.ts +4 -0
- package/dist/tour/tour-gates.js +14 -0
- package/dist/tour/tour-gates.js.map +1 -1
- package/dist/tour/tour-overlay.d.ts +27 -0
- package/dist/tour/tour-overlay.js +741 -0
- package/dist/tour/tour-overlay.js.map +1 -0
- package/dist/tour/tour.d.ts +13 -3
- package/dist/tour/tour.js +59 -781
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +6 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +3 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.d.ts +3 -1
- package/dist/wizard/validation.js.map +1 -1
- package/package.json +10 -6
- package/src/account/account-parts.ts +5 -25
- package/src/account/data-export-setting-labels.ts +1 -1
- package/src/account/delete-account-setting-labels.ts +1 -1
- package/src/account/email-change-setting-labels.ts +1 -1
- package/src/account/passkeys-setting.tsx +60 -38
- package/src/account/sessions-setting.tsx +18 -12
- package/src/admin/admin-action-confirm.tsx +1 -5
- package/src/admin/admin-parts.ts +11 -25
- package/src/admin/mail-test-card-labels.ts +1 -1
- package/src/admin/plan-change-labels.ts +5 -23
- package/src/admin/plan-change.tsx +7 -44
- package/src/admin/reviewer-scope-editor.tsx +3 -3
- package/src/auth/auth-errors-labels.ts +23 -0
- package/src/auth/auth-errors.ts +11 -38
- package/src/auth/complete-name-dialog.tsx +4 -1
- package/src/auth/forgot-password-form-labels.ts +1 -1
- package/src/auth/forgot-password-form.tsx +11 -6
- package/src/auth/register-form-labels.ts +1 -1
- package/src/auth/reset-password-form-labels.ts +1 -1
- package/src/auth/reset-password-form.tsx +8 -4
- package/src/auth/sign-in-form-labels.ts +1 -1
- package/src/auth/status-parts.tsx +0 -6
- package/src/auth/verify-email-labels.ts +1 -1
- package/src/auth/verify-email.tsx +11 -6
- package/src/billing/cancel-subscription.tsx +26 -12
- package/src/billing/dialog-close.ts +34 -0
- package/src/billing/plan-card.tsx +36 -11
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +26 -12
- package/src/chart.ts +21 -3
- package/src/components/account-chips.tsx +20 -23
- package/src/components/alert-banner.tsx +82 -5
- package/src/components/amount-input.tsx +18 -7
- package/src/components/autocomplete.tsx +64 -70
- package/src/components/bulk-action-bar.tsx +70 -2
- package/src/components/button-look.ts +5 -5
- package/src/components/button.tsx +2 -2
- package/src/components/chart-edge.ts +34 -1
- package/src/components/chart-figure.tsx +35 -0
- package/src/components/chart-zoom-core.tsx +6 -5
- package/src/components/chart.tsx +26 -5
- package/src/components/combobox-core.tsx +293 -62
- package/src/components/combobox.tsx +183 -153
- package/src/components/copy-button.tsx +34 -23
- package/src/components/country-select.tsx +16 -11
- package/src/components/data-table-column-settings.tsx +52 -10
- package/src/components/data-table-filters.ts +6 -4
- package/src/components/data-table-fit.ts +19 -5
- package/src/components/data-table-groups.tsx +1 -1
- package/src/components/data-table-head.tsx +32 -22
- package/src/components/data-table-mobile.tsx +61 -26
- package/src/components/data-table-pagination.tsx +21 -6
- package/src/components/data-table-resize.ts +1 -1
- package/src/components/data-table-row-actions.tsx +3 -3
- package/src/components/data-table-row.tsx +25 -14
- package/src/components/data-table-selection.ts +1 -1
- package/src/components/data-table-shared.tsx +33 -1
- package/src/components/data-table-sort.ts +57 -2
- package/src/components/data-table-virtual.ts +32 -8
- package/src/components/data-table.tsx +239 -68
- package/src/components/date-field.tsx +65 -8
- package/src/components/date-picker.tsx +125 -48
- package/src/components/date-range-picker.tsx +82 -31
- package/src/components/error-boundary.tsx +53 -39
- package/src/components/field-base-labels.ts +20 -0
- package/src/components/field-base.tsx +13 -7
- package/src/components/field-sync-labels.ts +1 -0
- package/src/components/field-sync.tsx +23 -1
- package/src/components/form-actions.tsx +20 -5
- package/src/components/hover-menu.tsx +18 -8
- package/src/components/icon-button.tsx +14 -9
- package/src/components/inline-confirm.tsx +116 -0
- package/src/components/inline-entity-combobox.tsx +197 -153
- package/src/components/input.tsx +1 -1
- package/src/components/jump-calendar.tsx +30 -146
- package/src/components/legal-page.tsx +10 -7
- package/src/components/legal.tsx +4 -2
- package/src/components/lightbox.tsx +21 -8
- package/src/components/list.tsx +10 -4
- package/src/components/measured-grid.tsx +8 -4
- package/src/components/mini-calendar.tsx +6 -5
- package/src/components/modal.tsx +6 -1
- package/src/components/month-grid.tsx +229 -0
- package/src/components/month-picker.tsx +192 -200
- package/src/components/multi-select.tsx +21 -9
- package/src/components/picker-sheet.tsx +12 -9
- package/src/components/pie-chart-labels.ts +8 -0
- package/src/components/pie-chart.tsx +22 -28
- package/src/components/popover.tsx +18 -1
- package/src/components/row-actions.tsx +2 -1
- package/src/components/section-nav.tsx +7 -0
- package/src/components/series-chart-axes.ts +3 -3
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +178 -69
- package/src/components/share-card.tsx +6 -6
- package/src/components/sign-chip-labels.ts +1 -0
- package/src/components/sign-chip.tsx +10 -1
- package/src/components/tabs-labels.ts +13 -0
- package/src/components/tabs.tsx +2 -2
- package/src/components/toggle-legend.tsx +16 -11
- package/src/components/translation-review-editor.tsx +6 -5
- package/src/components/translation-review.tsx +4 -3
- package/src/components/treemap-labels.ts +39 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +722 -133
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +9 -2
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +41 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +17 -5
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +5 -0
- package/src/feedback/feedback-row-detail.tsx +103 -67
- package/src/feedback/feedback-status-undo.ts +41 -27
- package/src/feedback/feedback-submit-dialog.tsx +2 -2
- package/src/feedback/feedback-submit.tsx +21 -7
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table.tsx +86 -38
- package/src/feedback/feedback-thread-labels.ts +2 -2
- package/src/feedback/feedback-thread.tsx +27 -25
- package/src/feedback.ts +42 -0
- package/src/hooks/use-focus-trap.ts +8 -24
- package/src/hooks/use-hotkey.ts +24 -7
- package/src/hooks/use-long-press.ts +16 -2
- package/src/hooks/use-media-query.ts +20 -4
- package/src/hooks/use-mounted.ts +39 -0
- package/src/hooks/use-overlay-history.ts +32 -3
- package/src/i18n/defaults.ts +4 -5
- package/src/i18n/german.ts +8 -2
- package/src/i18n/kit-labels.tsx +9 -2
- package/src/i18n/locales/es.ts +8 -2
- package/src/i18n/locales/fr.ts +21 -13
- package/src/i18n/locales/hu.ts +10 -2
- package/src/i18n/locales/it.ts +8 -2
- package/src/i18n/locales/zh.ts +9 -2
- package/src/i18n/review.ts +5 -0
- package/src/index.ts +103 -13
- package/src/landing/routing.tsx +14 -10
- package/src/lib/broadcast.ts +52 -0
- package/src/lib/date-format.ts +89 -13
- package/src/lib/day-format.ts +96 -0
- package/src/lib/describe-failure.ts +18 -0
- package/src/lib/direction.ts +39 -0
- package/src/lib/focus-left.ts +156 -0
- package/src/lib/format.ts +5 -17
- package/src/lib/http-status.ts +38 -0
- package/src/lib/intl-cache.ts +25 -0
- package/src/lib/isin.ts +10 -0
- package/src/lib/iso-day.ts +13 -0
- package/src/lib/lazy-with-fallback.ts +82 -0
- package/src/lib/path-pattern.ts +55 -0
- package/src/lib/reduced-motion.ts +2 -1
- package/src/lib/round.ts +7 -2
- package/src/lib/safe-storage.ts +48 -6
- package/src/lib/session-refresh.ts +1 -1
- package/src/lib/share-format.ts +18 -0
- package/src/lib/text-case.ts +19 -0
- package/src/lib/text-match.ts +57 -2
- package/src/lib/thenable.ts +19 -0
- package/src/lib/translation-review.ts +13 -5
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-bell.tsx +7 -4
- package/src/notifications/notification-inbox.tsx +40 -58
- package/src/notifications/notification-parts.tsx +3 -4
- package/src/notifications/notification-types-setting.tsx +1 -1
- package/src/notifications/notifications-labels.ts +7 -0
- package/src/notifications/push-device-setting.tsx +1 -1
- package/src/notifications/push-devices-setting.tsx +30 -55
- package/src/notifications/quiet-hours-setting.tsx +93 -31
- package/src/notifications/unsubscribe-panel.tsx +4 -7
- package/src/notifications/use-push-device.ts +76 -10
- package/src/offline/query-persistence.ts +35 -3
- package/src/rhf/fields.tsx +11 -4
- package/src/search/command-palette.tsx +2 -4
- package/src/search/global-search.tsx +36 -15
- package/src/search/use-command-key.ts +13 -12
- package/src/search.ts +9 -0
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +27 -5
- package/src/shell/account-menu-text-size.tsx +32 -10
- package/src/shell/dev-menu.tsx +7 -21
- package/src/shell/role-switcher.tsx +7 -0
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +0 -3
- package/src/shell.ts +40 -9
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +8 -1
- package/src/testing/css-variables.ts +8 -9
- package/src/theme/contrast.ts +8 -9
- package/src/theme/palette-store.ts +9 -9
- package/src/theme/text-size.ts +6 -8
- package/src/theme/theme-store.ts +7 -9
- package/src/tour/tour-catalogue.tsx +26 -15
- package/src/tour/tour-dock.ts +0 -2
- package/src/tour/tour-gates.ts +23 -0
- package/src/tour/tour-overlay.tsx +1170 -0
- package/src/tour/tour.tsx +108 -1202
- package/src/tour/use-tour-progress.ts +1 -1
- package/src/wizard/stepper-nav.tsx +3 -1
- package/src/wizard/types.ts +11 -2
- package/src/wizard/use-wizard.ts +2 -1
- package/src/wizard/validation.ts +8 -2
- package/tokens.css +2 -1
- package/dist/components/ui-labels.js.map +0 -1
- package/dist/shell/dev-switchers.d.ts +0 -6
- package/dist/shell/dev-switchers.js +0 -12
- package/dist/shell/dev-switchers.js.map +0 -1
- package/src/components/ui-labels.ts +0 -24
- package/src/shell/dev-switchers.tsx +0 -18
package/dist/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shell.ts"],"sourcesContent":["// `@eifi1/ui-kit/shell` — the composable app chrome.\n//\n// A re-slicing of the main barrel, not a new API. This entry point requires\n// `react-router`: AppShell renders NavLink and TopBarActionMenu renders Link.\nexport * from \"./shell/topbar-controls\";\nexport * from \"./shell/top-bar\";\nexport * from \"./shell/app-shell\";\nexport * from \"./shell/option-switcher-menu\";\nexport * from \"./shell/role-switcher\";\nexport * from \"./shell/topbar-action-menu\";\nexport * from \"./shell/top-bar-brand\";\nexport * from \"./shell/auth-layout\";\n// 0.40.0: the list page's fill (docs/page-layout-harmonization.md §1.3).\nexport { FillHeight, FILL_HEIGHT_CLASS } from \"./shell/fill-height\";\nexport type { FillHeightProps } from \"./shell/fill-height\";\n// 0.42.0: the account menu's \"Administration\" row, as an entry and as a HoverMenu row\n// (docs/admin-harmonization.md §2.1, §6.6).\nexport { adminMenuEntry, AdminMenuRow } from \"./shell/admin-menu\";\nexport type { AdminMenuEntryOptions, AdminMenuRowProps } from \"./shell/admin-menu\";\n// 0.43.0 (kastlan): the entry with the provider's words.\nexport { useAdminMenuEntry } from \"./shell/admin-menu\";\nexport type { UseAdminMenuEntryOptions } from \"./shell/admin-menu\";\n// 0.45.0 (docs/admin-harmonization.md §9.3.4): the row's waiting pill on its own, for\n// IconButton's `badge` (kastlan's platform button); its name is `adminArea.waitingLabel`.\nexport { AdminWaitingBadge } from \"./shell/admin-menu\";\nexport type { AdminWaitingBadgeProps } from \"./shell/admin-menu\";\n// 0.31.0: the settings and admin pages' shell (docs/settings-harmonization.md §3, §5).\nexport { SettingsLayout
|
|
1
|
+
{"version":3,"sources":["../src/shell.ts"],"sourcesContent":["// `@eifi1/ui-kit/shell` — the composable app chrome.\n//\n// A re-slicing of the main barrel, not a new API. This entry point requires\n// `react-router`: AppShell renders NavLink and TopBarActionMenu renders Link.\nexport * from \"./shell/topbar-controls\";\nexport * from \"./shell/top-bar\";\nexport * from \"./shell/app-shell\";\n// 0.52: the slice's share of the 55 names no app reads (refactor audit 2026-10-30, API-4,\n// decision 4), tagged on their specifiers as the barrel's are — the modules keep them.\nexport {\n /** @deprecated 0.52 — `AppShell`, which picks its phone bar with it (API-4); removed in 0.53 */\n pickMobileBar,\n /** @deprecated 0.52 — `AppShell`, which splits its phone bar with it (API-4); removed in 0.53 */\n splitMobileBar,\n} from \"./shell/app-shell\";\nexport * from \"./shell/option-switcher-menu\";\nexport * from \"./shell/role-switcher\";\nexport * from \"./shell/topbar-action-menu\";\nexport * from \"./shell/top-bar-brand\";\nexport * from \"./shell/auth-layout\";\n// 0.40.0: the list page's fill (docs/page-layout-harmonization.md §1.3).\nexport { FillHeight, FILL_HEIGHT_CLASS } from \"./shell/fill-height\";\nexport type { FillHeightProps } from \"./shell/fill-height\";\n// 0.42.0: the account menu's \"Administration\" row, as an entry and as a HoverMenu row\n// (docs/admin-harmonization.md §2.1, §6.6).\nexport { adminMenuEntry, AdminMenuRow } from \"./shell/admin-menu\";\nexport type { AdminMenuEntryOptions, AdminMenuRowProps } from \"./shell/admin-menu\";\n// 0.43.0 (kastlan): the entry with the provider's words.\nexport { useAdminMenuEntry } from \"./shell/admin-menu\";\nexport type { UseAdminMenuEntryOptions } from \"./shell/admin-menu\";\n// 0.45.0 (docs/admin-harmonization.md §9.3.4): the row's waiting pill on its own, for\n// IconButton's `badge` (kastlan's platform button); its name is `adminArea.waitingLabel`.\nexport { AdminWaitingBadge } from \"./shell/admin-menu\";\nexport type { AdminWaitingBadgeProps } from \"./shell/admin-menu\";\n// 0.31.0: the settings and admin pages' shell (docs/settings-harmonization.md §3, §5).\nexport {\n SettingsLayout,\n /** @deprecated 0.52 — `SettingsLayout`, which shows its search past that many entries (API-4); removed in 0.53 */\n SETTINGS_SEARCH_THRESHOLD,\n} from \"./settings/settings-layout\";\nexport type { SettingsLayoutProps, SettingsLayoutWidth, SettingsDocumentTitleParts } from \"./settings/settings-layout\";\nexport {\n useSettingsRoute,\n /** @deprecated 0.52 — `useSettingsRoute`, which resolves the location with it (API-4); removed in 0.53 */\n resolveSettingsLocation,\n settingsFromListState,\n /** @deprecated 0.52 — `settingsFromListState` and `useSettingsRoute`, which write and read it (API-4); removed in 0.53 */\n SETTINGS_FROM_LIST_STATE,\n} from \"./settings/use-settings-route\";\nexport type {\n UseSettingsRouteOptions,\n SettingsRoute,\n SettingsLayoutMode,\n SettingsLocation,\n SettingsLocationRules,\n SettingsLocationResult,\n} from \"./settings/use-settings-route\";\nexport {\n useSettingsFocus,\n useFocusParam,\n /** @deprecated 0.52 — `useSettingsFocus` / `useFocusParam`, which ring the card with it (API-4); removed in 0.53 */\n SETTINGS_FOCUS_RING,\n /** @deprecated 0.52 — `useSettingsFocus` / `useFocusParam`, which hold the ring that long (API-4); removed in 0.53 */\n SETTINGS_FOCUS_MS,\n} from \"./settings/use-settings-focus\";\nexport { SettingsSection } from \"./settings/settings-section\";\nexport type { SettingsSectionProps } from \"./settings/settings-section\";\nexport { useSettingsLayout } from \"./settings/settings-context\";\nexport type { SettingsLayoutContextValue } from \"./settings/settings-context\";\nexport { SettingsHeadingLevel, useSettingsHeadingLevel } from \"./settings/settings-heading\";\nexport type { SettingsHeadingLevelProps, SettingsHeadingTag } from \"./settings/settings-heading\";\nexport {\n settingsSearchEntries,\n visibleSettingsGroups,\n visibleSettingsEntries,\n settingsHref,\n} from \"./settings/settings-catalogue\";\nexport type { SettingsGroup, SettingsEntry, SettingsSearchEntriesOptions } from \"./settings/settings-catalogue\";\n// 0.31.0: the public pages' header and the resume (docs/landing-demo-harmonization.md §3, §4.1).\nexport {\n RootEntry,\n RedirectIfAuthed,\n useLastVisitedPage,\n readLastVisitedPage,\n clearLastVisitedPage,\n safeNextPath,\n NEXT_PARAM,\n DEFAULT_LAST_VISITED_EXCLUDES,\n} from \"./landing/routing\";\nexport type {\n RootEntryProps,\n RedirectIfAuthedProps,\n RoutingSession,\n LastVisitedPageOptions,\n PathPattern,\n} from \"./landing/routing\";\nexport { PublicHeader } from \"./landing/public-header\";\nexport type { PublicHeaderProps, PublicHeaderBrand } from \"./landing/public-header\";\n// 0.42.0: the top bar's shared parts (docs/top-bar-harmonization.md §3.1) — the slots in\n// §2.1's order, the account menu's language sub-list, the tours menu, the sync status, the\n// local-dev menu, and their words.\nexport {\n TopBarActions,\n /** @deprecated 0.52 — `TopBarActions`, which puts its slots in that order (API-4); removed in 0.53 */\n TOP_BAR_ACTION_ORDER,\n} from \"./shell/top-bar-actions\";\nexport type { TopBarActionsProps } from \"./shell/top-bar-actions\";\nexport { AccountMenuLanguage } from \"./shell/account-menu-language\";\nexport type { AccountMenuLanguageProps, AccountMenuLanguageOption } from \"./shell/account-menu-language\";\n// 0.46.0 (keksdose live #426): A− / A+ for the text size, beside the language.\nexport { AccountMenuTextSize } from \"./shell/account-menu-text-size\";\nexport type { AccountMenuTextSizeProps } from \"./shell/account-menu-text-size\";\nexport { TourMenu } from \"./shell/tour-menu\";\nexport type { TourMenuProps, TourMenuTour } from \"./shell/tour-menu\";\nexport {\n SyncStatusIndicator,\n /** @deprecated 0.52 — `SyncStatusIndicator`, which derives its state with it (API-4); removed in 0.53 */\n syncState,\n} from \"./shell/sync-status-indicator\";\nexport type { SyncStatus, SyncState, SyncStatusScope, SyncStatusIndicatorProps } from \"./shell/sync-status-indicator\";\n// 0.51 (§2.7.1, keksdose): one flask, the kit's Account section and the app's own dev\n// sections. 0.42's `DevSwitchers`, a DevMenu with no sections since 0.51, went in 0.52.\nexport {\n DevMenu,\n /** @deprecated 0.52 — `DevMenu`, which keeps the role there unless `storageKey` names another key (API-4); removed in 0.53 */\n DEV_ORIGINAL_ROLE_KEY,\n} from \"./shell/dev-menu\";\nexport type { DevMenuProps, DevMenuSection } from \"./shell/dev-menu\";\nexport { DEFAULT_TOP_BAR_PARTS_LABELS, useTopBarPartsLabels } from \"./shell/top-bar-parts-labels\";\nexport type {\n TopBarPartsLabels,\n TourMenuLabels,\n SyncStatusLabels,\n DevSwitchersLabels,\n} from \"./shell/top-bar-parts-labels\";\n"],"mappings":";AAIA,cAAc;AACd,cAAc;AACd,cAAc;AAGd;AAAA,EAEE;AAAA,EAEA;AAAA,OACK;AACP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,YAAY,yBAAyB;AAI9C,SAAS,gBAAgB,oBAAoB;AAG7C,SAAS,yBAAyB;AAIlC,SAAS,yBAAyB;AAGlC;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AASP;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAElC,SAAS,sBAAsB,+BAA+B;AAE9D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,oBAAoB;AAK7B;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,2BAA2B;AAGpC,SAAS,2BAA2B;AAEpC,SAAS,gBAAgB;AAEzB;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAIP;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,8BAA8B,4BAA4B;","names":[]}
|
package/dist/sync/engine.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export interface SyncCounts {
|
|
|
8
8
|
}
|
|
9
9
|
export interface SyncStepContext {
|
|
10
10
|
signal: AbortSignal;
|
|
11
|
-
/** False once `forget()` bumped the generation
|
|
11
|
+
/** False once `forget()` bumped the generation — in this tab, or (0.52) in another tab on
|
|
12
|
+
* the same database, heard over a BroadcastChannel: the step writes nothing more (D15). */
|
|
12
13
|
isCurrent(): boolean;
|
|
13
14
|
}
|
|
14
15
|
export interface SyncStepResult {
|
|
@@ -37,7 +38,9 @@ export interface SyncEngineState {
|
|
|
37
38
|
nextRetryAt: number | null;
|
|
38
39
|
}
|
|
39
40
|
export interface SyncRoundResult {
|
|
40
|
-
/** `paused`: `paused()` held the round.
|
|
41
|
+
/** `paused`: `paused()` held the round. (A round asked for while another tab's round holds
|
|
42
|
+
* the database waits its turn, 0.52.) `dropped`: `forget()` ran during it, here or in
|
|
43
|
+
* another tab, its answer unused. */
|
|
41
44
|
outcome: "synced" | "offline" | "error" | "paused" | "dropped";
|
|
42
45
|
/** Changes this round set `waiting`, `blocked` or `rejected`. */
|
|
43
46
|
waiting: number;
|
|
@@ -73,19 +76,38 @@ export interface SyncEngineOptions<D extends SyncDb = SyncDb> {
|
|
|
73
76
|
backoffMs?: readonly number[];
|
|
74
77
|
/** Default `isSharedComputer`: on a computer marked shared the engine does not start (D15). */
|
|
75
78
|
sharedComputer?: () => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* 0.52: the backstop on one round, counted from the moment it holds the database's lock
|
|
81
|
+
* (a tab waiting behind a stuck round is not cut with it). Past it the round is cut: its
|
|
82
|
+
* requests and steps are aborted, anything they answer or write later is dropped, and the
|
|
83
|
+
* round ends `error` with a `TimeoutError` (`DOMException`), not `offline`, so the backoff
|
|
84
|
+
* starts and the lock goes to the next tab even when a request or a step ignores its
|
|
85
|
+
* signal. The app's own request timeouts come first; this only bounds what they miss.
|
|
86
|
+
* Default 10 minutes, long on purpose: kastlan's photo backlog can take minutes, and a cut
|
|
87
|
+
* round has still made progress (each photo uploaded before the cut is off the queue).
|
|
88
|
+
* `0` or `Infinity`: none.
|
|
89
|
+
*/
|
|
90
|
+
roundTimeoutMs?: number;
|
|
76
91
|
}
|
|
77
92
|
export interface SyncEngine {
|
|
78
93
|
/** Into the copy at once and into the queue, in the scope the caller names (D11). An edit
|
|
79
94
|
* merges into the row's last `pending` upsert; deleting a row that never reached the
|
|
80
95
|
* server forgets its queue; stamped with `stampAfter`. */
|
|
81
96
|
write(scope: string, entity: string, id: string, op: "upsert" | "delete", data?: Record<string, unknown>): Promise<void>;
|
|
97
|
+
/** Starts the poll and the round on `online` (nothing on a computer marked shared).
|
|
98
|
+
* An engine another tab's `forget()` stopped stays stopped through `start()`: only its
|
|
99
|
+
* own `forget()` (the app's session end) or a new engine (`releaseSyncEngine`) re-arms
|
|
100
|
+
* it. A start cannot tell a new sign-in from a remount in a tab whose session never
|
|
101
|
+
* ended, and the latter would pull the signed-out account back into the wiped copy
|
|
102
|
+
* (D15; the 0.52 code review asked, and the contract stands). */
|
|
82
103
|
start(): void;
|
|
83
104
|
/** Stops the poll and the timers, aborts the round in flight and drops its answer (the
|
|
84
105
|
* queue is laid back). A new engine's round on the same database waits for it. */
|
|
85
106
|
stop(): void;
|
|
86
107
|
/** Sync soon (debounced): after a write. */
|
|
87
108
|
requestSync(): void;
|
|
88
|
-
/** "Sync now": resets the backoff, runs a round
|
|
109
|
+
/** "Sync now": resets the backoff, runs a round of its own after the one under way — another
|
|
110
|
+
* tab's too (0.52) — and answers its result. */
|
|
89
111
|
syncNow(): Promise<SyncRoundResult>;
|
|
90
112
|
/** A round that sends the `blocked` changes too. */
|
|
91
113
|
retryBlocked(): Promise<void>;
|
|
@@ -94,7 +116,11 @@ export interface SyncEngine {
|
|
|
94
116
|
/** The rejected changes with their reasons, for the app's banner. */
|
|
95
117
|
rejected(): Promise<OutboxChange[]>;
|
|
96
118
|
/** Sign-out: bump the generation (a round in flight writes nothing more), then clear the
|
|
97
|
-
* rows and `meta` — and the outbox and the app's tables unless `keepQueue` (D15).
|
|
119
|
+
* rows and `meta` — and the outbox and the app's tables unless `keepQueue` (D15). In every
|
|
120
|
+
* tab (0.52): the clear writes a new epoch into `meta`, so a round of another tab's engine on
|
|
121
|
+
* this database drops its answer, and that engine stops — the session it ran for has ended.
|
|
122
|
+
* Another tab's `forget()` heard while this clear runs is decided by the epoch the copy is
|
|
123
|
+
* left with: one that committed first was undone by this clear and stops nothing. */
|
|
98
124
|
forget(opts: {
|
|
99
125
|
keepQueue: boolean;
|
|
100
126
|
}): Promise<void>;
|
package/dist/sync/engine.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import { listenOn, postOnce } from "../lib/broadcast.js";
|
|
3
|
+
import { httpStatusOf } from "../lib/http-status.js";
|
|
3
4
|
import { isOfflineError, stampAfter } from "../offline/local-first.js";
|
|
4
5
|
import { isSharedComputer } from "../offline/shared-computer.js";
|
|
5
6
|
const DEFAULT_SYNC_BACKOFF_MS = [5e3, 15e3, 6e4, 3e5];
|
|
6
7
|
const DEFAULT_HOLD_CODES = ["billing_read_only"];
|
|
8
|
+
const ROUND_TIMEOUT_MS = 10 * 6e4;
|
|
9
|
+
const MAX_TIMEOUT_MS = 2147483647;
|
|
7
10
|
const LAST_SYNCED_AT = "lastSyncedAt";
|
|
11
|
+
const EPOCH = "epoch";
|
|
8
12
|
const lastKnowledgeKey = (scope) => `lastKnowledge:${scope}`;
|
|
9
13
|
const UNSENT = ["pending", "sending", "waiting", "blocked"];
|
|
10
14
|
const ZERO = { pending: 0, waiting: 0, blocked: 0, rejected: 0 };
|
|
@@ -13,6 +17,15 @@ const flights = /* @__PURE__ */ new Map();
|
|
|
13
17
|
const kept = /* @__PURE__ */ new Map();
|
|
14
18
|
class Dropped extends Error {
|
|
15
19
|
}
|
|
20
|
+
class ForgottenElsewhere extends Dropped {
|
|
21
|
+
}
|
|
22
|
+
function webLocks() {
|
|
23
|
+
return typeof navigator === "undefined" ? void 0 : navigator.locks;
|
|
24
|
+
}
|
|
25
|
+
function freshEpoch() {
|
|
26
|
+
const uuid = globalThis.crypto?.randomUUID;
|
|
27
|
+
return uuid ? uuid.call(globalThis.crypto) : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
28
|
+
}
|
|
16
29
|
function browserOnline() {
|
|
17
30
|
return typeof navigator === "undefined" || navigator.onLine !== false;
|
|
18
31
|
}
|
|
@@ -47,6 +60,8 @@ function createSyncEngine(options) {
|
|
|
47
60
|
const soonMs = options.soonMs ?? 800;
|
|
48
61
|
const backoffMs = options.backoffMs?.length ? options.backoffMs : DEFAULT_SYNC_BACKOFF_MS;
|
|
49
62
|
const sharedComputer = options.sharedComputer ?? isSharedComputer;
|
|
63
|
+
const roundTimeoutMs = options.roundTimeoutMs ?? ROUND_TIMEOUT_MS;
|
|
64
|
+
const cut = /* @__PURE__ */ new WeakSet();
|
|
50
65
|
let generation = 0;
|
|
51
66
|
let state = {
|
|
52
67
|
phase: "idle",
|
|
@@ -65,6 +80,12 @@ function createSyncEngine(options) {
|
|
|
65
80
|
let again = false;
|
|
66
81
|
let controller = null;
|
|
67
82
|
let stepCounts = {};
|
|
83
|
+
const across = `eifi1-sync:${db.name}`;
|
|
84
|
+
const epochs = /* @__PURE__ */ new Set();
|
|
85
|
+
let epochRead = null;
|
|
86
|
+
let forgotten = false;
|
|
87
|
+
let forgetting = 0;
|
|
88
|
+
let unlisten = null;
|
|
68
89
|
function set(next) {
|
|
69
90
|
state = { ...state, ...next };
|
|
70
91
|
listeners.forEach((listener) => listener());
|
|
@@ -89,8 +110,50 @@ function createSyncEngine(options) {
|
|
|
89
110
|
}
|
|
90
111
|
set({ counts, lastSyncedAt: typeof last === "string" ? last : null });
|
|
91
112
|
}
|
|
92
|
-
function
|
|
93
|
-
return db.
|
|
113
|
+
function readEpoch() {
|
|
114
|
+
return db.meta.get(EPOCH).then((entry) => typeof entry?.value === "string" ? entry.value : null);
|
|
115
|
+
}
|
|
116
|
+
function captureEpoch() {
|
|
117
|
+
if (epochRead) return epochRead;
|
|
118
|
+
const read = readEpoch().then((epoch) => void epochs.add(epoch));
|
|
119
|
+
epochRead = read;
|
|
120
|
+
read.catch(() => {
|
|
121
|
+
if (epochRead === read) epochRead = null;
|
|
122
|
+
});
|
|
123
|
+
return read;
|
|
124
|
+
}
|
|
125
|
+
function listen() {
|
|
126
|
+
unlisten ??= listenOn(across, (data) => {
|
|
127
|
+
const epoch = data?.epoch;
|
|
128
|
+
if (typeof epoch === "string" && !epochs.has(epoch)) void forgetHere();
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function forgetHere() {
|
|
132
|
+
if (forgotten || forgetting > 0) return Promise.resolve();
|
|
133
|
+
forgotten = true;
|
|
134
|
+
if (started) halt();
|
|
135
|
+
else drop();
|
|
136
|
+
return endSession();
|
|
137
|
+
}
|
|
138
|
+
function drop() {
|
|
139
|
+
generation += 1;
|
|
140
|
+
controller?.abort();
|
|
141
|
+
}
|
|
142
|
+
function endSession() {
|
|
143
|
+
stepCounts = {};
|
|
144
|
+
failures = 0;
|
|
145
|
+
clearRetry();
|
|
146
|
+
set({ phase: "idle", lastSyncedAt: null, nextRetryAt: null });
|
|
147
|
+
return refreshCounts();
|
|
148
|
+
}
|
|
149
|
+
async function standing(gen, epoch) {
|
|
150
|
+
const now = await readEpoch();
|
|
151
|
+
if (gen !== generation) throw new Dropped();
|
|
152
|
+
if (now !== epoch) throw epochs.has(now) ? new Dropped() : new ForgottenElsewhere();
|
|
153
|
+
}
|
|
154
|
+
function takeQueue(scope, withBlocked, gen, epoch) {
|
|
155
|
+
return db.transaction("rw", db.outbox, db.meta, async () => {
|
|
156
|
+
await standing(gen, epoch);
|
|
94
157
|
await db.outbox.where("scope").equals(scope).and((c) => c.status === "sending").modify({ status: "pending" });
|
|
95
158
|
const take = withBlocked ? ["pending", "waiting", "blocked"] : ["pending", "waiting"];
|
|
96
159
|
const queue = (await db.outbox.where("scope").equals(scope).toArray()).filter((c) => take.includes(c.status)).sort((a, b) => a.seq - b.seq);
|
|
@@ -98,15 +161,16 @@ function createSyncEngine(options) {
|
|
|
98
161
|
return queue;
|
|
99
162
|
});
|
|
100
163
|
}
|
|
101
|
-
function
|
|
164
|
+
function layBack(sent, signal) {
|
|
165
|
+
if (cut.has(signal)) return;
|
|
102
166
|
return db.outbox.bulkUpdate(sent.map((c) => ({ key: c.seq, changes: { status: c.status } })));
|
|
103
167
|
}
|
|
104
168
|
function mark(changes, fields) {
|
|
105
169
|
return db.outbox.bulkUpdate(changes.map((c) => ({ key: c.seq, changes: fields })));
|
|
106
170
|
}
|
|
107
|
-
async function apply(scope, answer, sent, gen, lastPage) {
|
|
171
|
+
async function apply(scope, answer, sent, gen, epoch, lastPage) {
|
|
108
172
|
return db.transaction("rw", db.rows, db.outbox, db.meta, async () => {
|
|
109
|
-
|
|
173
|
+
await standing(gen, epoch);
|
|
110
174
|
const refused = answer.refused ?? null;
|
|
111
175
|
const refusedIds = new Set(refused?.change_ids ?? []);
|
|
112
176
|
const rejections = new Map((answer.rejections ?? []).map((r) => [r.change_id, r]));
|
|
@@ -175,8 +239,8 @@ function createSyncEngine(options) {
|
|
|
175
239
|
return queue.length;
|
|
176
240
|
});
|
|
177
241
|
}
|
|
178
|
-
async function syncScope(scope, gen, signal, withBlocked) {
|
|
179
|
-
const sent = await takeQueue(scope, withBlocked);
|
|
242
|
+
async function syncScope(scope, gen, epoch, signal, withBlocked) {
|
|
243
|
+
const sent = await takeQueue(scope, withBlocked, gen, epoch);
|
|
180
244
|
const last = Number((await db.meta.get(lastKnowledgeKey(scope)))?.value ?? 0) || 0;
|
|
181
245
|
const body = (changes, page_cursor) => ({
|
|
182
246
|
scope,
|
|
@@ -190,24 +254,26 @@ function createSyncEngine(options) {
|
|
|
190
254
|
try {
|
|
191
255
|
answer = await options.send(body(sent.map(toWire), null), signal);
|
|
192
256
|
} catch (err) {
|
|
193
|
-
await
|
|
257
|
+
await layBack(sent, signal);
|
|
194
258
|
if (gen !== generation) throw new Dropped();
|
|
195
259
|
if (isOffline(err)) return { offline: true };
|
|
196
260
|
const plan = planCode(err);
|
|
197
|
-
if (plan)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
261
|
+
if (!plan && httpStatusOf(err) !== 403) throw err;
|
|
262
|
+
return db.transaction("rw", db.outbox, db.meta, async () => {
|
|
263
|
+
await standing(gen, epoch);
|
|
264
|
+
if (plan) {
|
|
265
|
+
await mark(sent, { status: "waiting", code: plan, reason: plan });
|
|
266
|
+
return { offline: false, waiting: sent.length, blocked: 0, rejected: 0 };
|
|
267
|
+
}
|
|
202
268
|
return { offline: false, waiting: 0, blocked: 0, rejected: await loseScope(scope, err) };
|
|
203
|
-
|
|
269
|
+
});
|
|
204
270
|
}
|
|
205
271
|
let cursor = options.paged ? answer.page_cursor ?? null : null;
|
|
206
272
|
let tally;
|
|
207
273
|
try {
|
|
208
|
-
tally = { offline: false, ...await apply(scope, answer, sent, gen, cursor == null) };
|
|
274
|
+
tally = { offline: false, ...await apply(scope, answer, sent, gen, epoch, cursor == null) };
|
|
209
275
|
} catch (err) {
|
|
210
|
-
if (err instanceof Dropped) await
|
|
276
|
+
if (err instanceof Dropped) await layBack(sent, signal);
|
|
211
277
|
throw err;
|
|
212
278
|
}
|
|
213
279
|
while (cursor) {
|
|
@@ -220,23 +286,66 @@ function createSyncEngine(options) {
|
|
|
220
286
|
throw err;
|
|
221
287
|
}
|
|
222
288
|
cursor = page.page_cursor ?? null;
|
|
223
|
-
await apply(scope, page, [], gen, cursor == null);
|
|
289
|
+
await apply(scope, page, [], gen, epoch, cursor == null);
|
|
224
290
|
}
|
|
225
291
|
return tally;
|
|
226
292
|
}
|
|
227
293
|
async function round(withBlocked, gen) {
|
|
228
294
|
const result = { outcome: "synced", waiting: 0, blocked: 0, rejected: 0 };
|
|
229
|
-
if (gen !== generation) return { ...result, outcome: "dropped" };
|
|
230
|
-
if (options.paused?.()) return { ...result, outcome: "paused" };
|
|
231
|
-
if (!browserOnline()) return { ...result, outcome: "offline" };
|
|
295
|
+
if (gen !== generation || forgotten) return { ...result, outcome: "dropped" };
|
|
232
296
|
const own = new AbortController();
|
|
233
297
|
controller = own;
|
|
234
|
-
set({ phase: "syncing" });
|
|
235
298
|
try {
|
|
299
|
+
const locks = webLocks();
|
|
300
|
+
if (!locks) return await begin(result, withBlocked, gen, own);
|
|
301
|
+
let granted = false;
|
|
302
|
+
try {
|
|
303
|
+
return await locks.request(across, { signal: own.signal }, () => {
|
|
304
|
+
granted = true;
|
|
305
|
+
return begin(result, withBlocked, gen, own);
|
|
306
|
+
});
|
|
307
|
+
} catch (err) {
|
|
308
|
+
if (granted) return { ...result, outcome: "error", error: err };
|
|
309
|
+
return await begin(result, withBlocked, gen, own);
|
|
310
|
+
}
|
|
311
|
+
} finally {
|
|
312
|
+
if (controller === own) controller = null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async function begin(result, withBlocked, gen, own) {
|
|
316
|
+
if (gen !== generation || forgotten) return { ...result, outcome: "dropped" };
|
|
317
|
+
if (options.paused?.()) return { ...result, outcome: "paused" };
|
|
318
|
+
if (!browserOnline()) return { ...result, outcome: "offline" };
|
|
319
|
+
return withDeadline(locked(result, withBlocked, gen, own.signal), result, gen, own);
|
|
320
|
+
}
|
|
321
|
+
function withDeadline(round2, result, gen, own) {
|
|
322
|
+
if (!(roundTimeoutMs > 0 && Number.isFinite(roundTimeoutMs))) return round2;
|
|
323
|
+
let timer;
|
|
324
|
+
const deadline = new Promise((resolve) => {
|
|
325
|
+
timer = setTimeout(
|
|
326
|
+
() => {
|
|
327
|
+
const error = new DOMException(`The sync round ran past ${roundTimeoutMs} ms`, "TimeoutError");
|
|
328
|
+
resolve({ ...result, outcome: "error", error });
|
|
329
|
+
cut.add(own.signal);
|
|
330
|
+
if (gen === generation) generation += 1;
|
|
331
|
+
own.abort(error);
|
|
332
|
+
},
|
|
333
|
+
Math.min(roundTimeoutMs, MAX_TIMEOUT_MS)
|
|
334
|
+
);
|
|
335
|
+
});
|
|
336
|
+
return Promise.race([round2, deadline]).finally(() => clearTimeout(timer));
|
|
337
|
+
}
|
|
338
|
+
async function locked(result, withBlocked, gen, signal) {
|
|
339
|
+
try {
|
|
340
|
+
await captureEpoch();
|
|
341
|
+
const epoch = await readEpoch();
|
|
342
|
+
if (gen !== generation) throw new Dropped();
|
|
343
|
+
if (!epochs.has(epoch)) throw new ForgottenElsewhere();
|
|
344
|
+
set({ phase: "syncing" });
|
|
236
345
|
for (let pass = 0; ; pass++) {
|
|
237
346
|
for (const scope of options.scopes()) {
|
|
238
347
|
if (gen !== generation) throw new Dropped();
|
|
239
|
-
const r = await syncScope(scope, gen,
|
|
348
|
+
const r = await syncScope(scope, gen, epoch, signal, withBlocked);
|
|
240
349
|
if (r.offline) return { ...result, outcome: "offline" };
|
|
241
350
|
result.waiting += r.waiting;
|
|
242
351
|
result.blocked += r.blocked;
|
|
@@ -246,7 +355,7 @@ function createSyncEngine(options) {
|
|
|
246
355
|
let changed = false;
|
|
247
356
|
for (const step of steps) {
|
|
248
357
|
if (gen !== generation) throw new Dropped();
|
|
249
|
-
const ran = await step.run(db, { signal
|
|
358
|
+
const ran = await step.run(db, { signal, isCurrent: () => gen === generation });
|
|
250
359
|
if (gen !== generation) throw new Dropped();
|
|
251
360
|
if (ran.counts) stepCounts = { ...stepCounts, [step.name]: ran.counts };
|
|
252
361
|
if (ran.offline) return { ...result, outcome: "offline" };
|
|
@@ -256,10 +365,9 @@ function createSyncEngine(options) {
|
|
|
256
365
|
}
|
|
257
366
|
return result;
|
|
258
367
|
} catch (err) {
|
|
368
|
+
if (err instanceof ForgottenElsewhere) void forgetHere();
|
|
259
369
|
if (err instanceof Dropped || gen !== generation) return { ...result, outcome: "dropped" };
|
|
260
370
|
return { ...result, outcome: "error", error: err };
|
|
261
|
-
} finally {
|
|
262
|
-
if (controller === own) controller = null;
|
|
263
371
|
}
|
|
264
372
|
}
|
|
265
373
|
function clearRetry() {
|
|
@@ -338,7 +446,7 @@ function createSyncEngine(options) {
|
|
|
338
446
|
}
|
|
339
447
|
async function runFresh(withBlocked) {
|
|
340
448
|
resetBackoff();
|
|
341
|
-
|
|
449
|
+
while (current) {
|
|
342
450
|
again = false;
|
|
343
451
|
await current.catch(() => void 0);
|
|
344
452
|
}
|
|
@@ -350,6 +458,23 @@ function createSyncEngine(options) {
|
|
|
350
458
|
void run(false);
|
|
351
459
|
};
|
|
352
460
|
const onOffline = () => set({ online: false });
|
|
461
|
+
function halt() {
|
|
462
|
+
if (!started) return;
|
|
463
|
+
started = false;
|
|
464
|
+
drop();
|
|
465
|
+
if (running.get(db.name) === engine) running.delete(db.name);
|
|
466
|
+
if (poll) clearInterval(poll);
|
|
467
|
+
poll = null;
|
|
468
|
+
if (soon) clearTimeout(soon);
|
|
469
|
+
soon = null;
|
|
470
|
+
clearRetry();
|
|
471
|
+
if (typeof window !== "undefined") {
|
|
472
|
+
window.removeEventListener("online", onOnline);
|
|
473
|
+
window.removeEventListener("offline", onOffline);
|
|
474
|
+
}
|
|
475
|
+
unlisten?.();
|
|
476
|
+
unlisten = null;
|
|
477
|
+
}
|
|
353
478
|
const engine = {
|
|
354
479
|
async write(scope, entity, id, op, data = {}) {
|
|
355
480
|
await db.transaction("rw", db.rows, db.outbox, async () => {
|
|
@@ -386,11 +511,13 @@ function createSyncEngine(options) {
|
|
|
386
511
|
engine.requestSync();
|
|
387
512
|
},
|
|
388
513
|
start() {
|
|
389
|
-
if (started || sharedComputer()) return;
|
|
514
|
+
if (started || forgotten || sharedComputer()) return;
|
|
390
515
|
const other = running.get(db.name);
|
|
391
516
|
if (other && other !== engine) other.stop();
|
|
392
517
|
running.set(db.name, engine);
|
|
393
518
|
started = true;
|
|
519
|
+
captureEpoch().catch(() => void 0);
|
|
520
|
+
listen();
|
|
394
521
|
if (typeof window !== "undefined") {
|
|
395
522
|
window.addEventListener("online", onOnline);
|
|
396
523
|
window.addEventListener("offline", onOffline);
|
|
@@ -399,22 +526,7 @@ function createSyncEngine(options) {
|
|
|
399
526
|
void refreshCounts();
|
|
400
527
|
void run(false);
|
|
401
528
|
},
|
|
402
|
-
stop
|
|
403
|
-
if (!started) return;
|
|
404
|
-
started = false;
|
|
405
|
-
generation += 1;
|
|
406
|
-
controller?.abort();
|
|
407
|
-
if (running.get(db.name) === engine) running.delete(db.name);
|
|
408
|
-
if (poll) clearInterval(poll);
|
|
409
|
-
poll = null;
|
|
410
|
-
if (soon) clearTimeout(soon);
|
|
411
|
-
soon = null;
|
|
412
|
-
clearRetry();
|
|
413
|
-
if (typeof window !== "undefined") {
|
|
414
|
-
window.removeEventListener("online", onOnline);
|
|
415
|
-
window.removeEventListener("offline", onOffline);
|
|
416
|
-
}
|
|
417
|
-
},
|
|
529
|
+
stop: halt,
|
|
418
530
|
requestSync() {
|
|
419
531
|
void refreshCounts();
|
|
420
532
|
if (!started) return;
|
|
@@ -448,15 +560,23 @@ function createSyncEngine(options) {
|
|
|
448
560
|
return db.outbox.where("status").equals("rejected").sortBy("seq");
|
|
449
561
|
},
|
|
450
562
|
async forget({ keepQueue }) {
|
|
451
|
-
|
|
452
|
-
|
|
563
|
+
drop();
|
|
564
|
+
forgotten = false;
|
|
565
|
+
const epoch = freshEpoch();
|
|
566
|
+
epochs.add(epoch);
|
|
453
567
|
const tables = keepQueue ? [db.rows, db.meta] : db.tables;
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
568
|
+
forgetting += 1;
|
|
569
|
+
try {
|
|
570
|
+
await db.transaction("rw", tables, async () => {
|
|
571
|
+
for (const table of tables) await table.clear();
|
|
572
|
+
await db.meta.put({ key: EPOCH, value: epoch });
|
|
573
|
+
});
|
|
574
|
+
} finally {
|
|
575
|
+
forgetting -= 1;
|
|
576
|
+
}
|
|
577
|
+
postOnce(across, { epoch });
|
|
578
|
+
const now = await readEpoch().catch(() => epoch);
|
|
579
|
+
await (epochs.has(now) ? endSession() : forgetHere());
|
|
460
580
|
},
|
|
461
581
|
getState: () => state,
|
|
462
582
|
subscribe(listener) {
|