@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
package/src/tour/tour.tsx
DELETED
|
@@ -1,750 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createContext,
|
|
3
|
-
Suspense,
|
|
4
|
-
useCallback,
|
|
5
|
-
useContext,
|
|
6
|
-
useEffect,
|
|
7
|
-
useLayoutEffect,
|
|
8
|
-
useMemo,
|
|
9
|
-
useRef,
|
|
10
|
-
useState,
|
|
11
|
-
} from "react";
|
|
12
|
-
import type { ReactNode } from "react";
|
|
13
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
14
|
-
import { DEFAULT_TOUR_LABELS } from "./tour-labels";
|
|
15
|
-
import type { TourInfo } from "./tour-info";
|
|
16
|
-
import { completeStored, rememberAccount, rememberMigrate, type UseTourProgressOptions } from "./use-tour-progress";
|
|
17
|
-
import { createGateRegistry, devWarnings, isShown, stepContext, TourInternalContext } from "./tour-gates";
|
|
18
|
-
import { liveEngine } from "./tour-engine";
|
|
19
|
-
import { lazyWithFallback } from "../lib/lazy-with-fallback";
|
|
20
|
-
// Types only, gone from the built module: the overlay's modules load with the overlay.
|
|
21
|
-
import type { Refusal } from "./tour-overlay";
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The overlay — the card, the spotlight and its shields, the placement, the dock — loaded
|
|
25
|
-
* when a tour first starts, not with the provider every app mounts above its routes
|
|
26
|
-
* (refactor audit 2026-10-30, MOD-1: about 28.5 kB minified, 10.3 kB gzip of each app's
|
|
27
|
-
* first load at 0.51.6). A LITERAL relative `import()`, as feedback-submit.tsx's dialog
|
|
28
|
-
* is (0.34, MOD-1): the library build keeps the module its own (`bundle: false`), and a
|
|
29
|
-
* path an app's bundler can read is a chunk it can split off.
|
|
30
|
-
*
|
|
31
|
-
* A fetch that fails — a tab left open across a deploy, a local-first app offline — ends
|
|
32
|
-
* the run and leaves the page (0.52 code review, tour.tsx): the provider sits above the
|
|
33
|
-
* routes, in keksdose and Kurvenschmiede above the app's own boundary, and the rejected
|
|
34
|
-
* import unmounted the whole app — for a tour, whose start fetched nothing before 0.52.
|
|
35
|
-
* `lazyWithFallback` logs it, and the next start fetches again.
|
|
36
|
-
*/
|
|
37
|
-
const LazyTourOverlay = lazyWithFallback(
|
|
38
|
-
() => import("./tour-overlay").then((module) => module.TourOverlay),
|
|
39
|
-
TourOverlayUnavailable,
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
/** The provider's end of a run whose overlay did not load; see {@link TourOverlayUnavailable}. */
|
|
43
|
-
const TourUnavailableContext = createContext<() => void>(() => {});
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Stands in for an overlay whose chunk did not arrive: ends the run with the start's
|
|
47
|
-
* `onSkip("unavailable")` and draws nothing. It ended with `stop()` at first, which calls
|
|
48
|
-
* nothing — after the start's `onStart` had run, so what the app turned on for the run
|
|
49
|
-
* stayed on: kastlan's practice mode, which its launcher turns on and its `onSkip` and
|
|
50
|
-
* `onFinish` turn off (0.52 code review, tour.tsx).
|
|
51
|
-
*/
|
|
52
|
-
function TourOverlayUnavailable() {
|
|
53
|
-
const unavailable = useContext(TourUnavailableContext);
|
|
54
|
-
useLayoutEffect(unavailable, [unavailable]);
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Hears Escape while the overlay's chunk is on its way, as the overlay does before it has
|
|
60
|
-
* located its step: the run is skipped. With nothing mounted the tour was `active` and
|
|
61
|
-
* deaf, and on a slow first start the overlay came up seconds after the person had
|
|
62
|
-
* pressed Escape and gone back to the page (0.52 code review, tour.tsx).
|
|
63
|
-
*/
|
|
64
|
-
function TourOverlayLoading({ onSkip }: { onSkip: () => void }) {
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
const onKey = (e: KeyboardEvent) => {
|
|
67
|
-
if (e.key === "Escape") onSkip();
|
|
68
|
-
};
|
|
69
|
-
document.addEventListener("keydown", onKey);
|
|
70
|
-
return () => document.removeEventListener("keydown", onKey);
|
|
71
|
-
}, [onSkip]);
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export { useTourGate, useTourGateRelease } from "./tour-gates";
|
|
76
|
-
export type { TourGateRelease } from "./tour-gates";
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* `start`/`end` follow the reading direction (`end` is the right side in LTR and the
|
|
80
|
-
* left side in RTL) and are what a translated app wants. `left`/`right` stay physical
|
|
81
|
-
* for the steps that genuinely mean a screen side.
|
|
82
|
-
*/
|
|
83
|
-
export type TourPlacement = "top" | "right" | "bottom" | "left" | "start" | "end" | "center" | "dock";
|
|
84
|
-
|
|
85
|
-
export interface TourStep {
|
|
86
|
-
/** CSS selector for the element to spotlight. Omit for a centered step
|
|
87
|
-
* (welcome/finish). If the target isn't found/visible, the step centers. */
|
|
88
|
-
target?: string;
|
|
89
|
-
title: string;
|
|
90
|
-
body: ReactNode;
|
|
91
|
-
/** Extra footer content, e.g. a "load sample data" shortcut. */
|
|
92
|
-
action?: ReactNode;
|
|
93
|
-
/** Spotlight padding around the target, px (default 8). On a field step the spot also
|
|
94
|
-
* takes in the lines the field's `aria-describedby` names when they sit within the
|
|
95
|
-
* ring's reach of it (a hint or warning line under the field, keksdose S1, §11.6). */
|
|
96
|
-
padding?: number;
|
|
97
|
-
/** Where the card sits relative to the target. Omit for auto placement
|
|
98
|
-
* (below → above → centered). "center" ignores the target and centers on
|
|
99
|
-
* screen. "start"/"end" are the logical sides and flip in RTL; "left"/"right"
|
|
100
|
-
* are physical. An explicit side flips to the opposite side if it would
|
|
101
|
-
* overflow, then clamps into the viewport.
|
|
102
|
-
*
|
|
103
|
-
* `"dock"` (0.50, §11.7): below `sm` (640 px at Normal text, 800 at Large, as
|
|
104
|
-
* `max-sm:` since 0.52) the card is pinned full-width to the top or bottom edge of the
|
|
105
|
-
* usable band — the visual viewport less the keyboard and any
|
|
106
|
-
* `[data-tour-obstruction]` (the number pad) — on the edge away from the field, and the
|
|
107
|
-
* field's scroll container brings it into the other half. From `sm` up it is auto
|
|
108
|
-
* placement. On a phone a field step (`interactive`, `awaitInput`, `gate`, `awaitGate`)
|
|
109
|
-
* with a target and no `placement` docks by default (`TourProvider dockOnPhones`). */
|
|
110
|
-
placement?: TourPlacement;
|
|
111
|
-
/** Advance only when the user clicks the spotlighted target itself (not the
|
|
112
|
-
* card's Next button). Requires `target`: the real control's own handler runs
|
|
113
|
-
* first, then the tour steps forward on a microtask. The spotlight hole stays
|
|
114
|
-
* click-through to the target; the rest of the page does not. */
|
|
115
|
-
awaitClick?: boolean;
|
|
116
|
-
/**
|
|
117
|
-
* The spotlighted control is for USING, not only for looking at (0.46, keksdose live
|
|
118
|
-
* #436): the layers it opens sit above the scrim and work. A plain step's overlay is
|
|
119
|
-
* `z-[60]`, over every kit layer, so a field whose number pad (`NumberPadSheet`), a
|
|
120
|
-
* select's menu or a popover opens at `z-50` opened UNDER the shields, where nothing
|
|
121
|
-
* could be tapped. Here the overlay drops to `z-[45]`: still over the top bar and the
|
|
122
|
-
* page (`z-40` and below, still dimmed and shielded), under every `z-50` layer the
|
|
123
|
-
* target opens — so an app's own layer wants `z-50` or more to clear it. Keys pressed
|
|
124
|
-
* in the target or in such a layer are theirs (Escape closes the pad, arrows walk a
|
|
125
|
-
* list); from the card the tour's keys work as on any step. The overlay is not
|
|
126
|
-
* `aria-modal` then, and carries `data-tour-interactive`.
|
|
127
|
-
*
|
|
128
|
-
* The card is in the same layer as the scrim, so an open pad or sheet may cover it
|
|
129
|
-
* until it closes. Requires `target`. A `HoverMenu` (`z-40`, the top bar's menus) stays
|
|
130
|
-
* under the scrim: point an `awaitClick` step at its trigger instead.
|
|
131
|
-
*/
|
|
132
|
-
interactive?: boolean;
|
|
133
|
-
/**
|
|
134
|
-
* Advance once a value was ENTERED in the spotlighted control (0.46, keksdose live
|
|
135
|
-
* #436) — `awaitClick` for a field. Implies `interactive`. Counted when focus leaves
|
|
136
|
-
* the target (the number pad's Done, a Tab, a tap elsewhere), or Enter is pressed in
|
|
137
|
-
* it, and one of its fields (`input`, `textarea`, `select`: the target itself or
|
|
138
|
-
* inside it) then holds another value than when the step began; a native `change`
|
|
139
|
-
* (a select, a checkbox) counts at once. The card swaps Next for `awaitInputHint`,
|
|
140
|
-
* as for `awaitClick`. A picker whose value is not a field's (the kit's `Select`
|
|
141
|
-
* button) has nothing to compare: call `useTour().next()` from its `onChange`.
|
|
142
|
-
*/
|
|
143
|
-
awaitInput?: boolean;
|
|
144
|
-
/**
|
|
145
|
-
* 0.50 (docs/tours-harmonization.md §11.1): Next stays locked until the gate `key` is
|
|
146
|
-
* satisfied — the form publishes it with `useTourGate(key, satisfied)` beside the field.
|
|
147
|
-
* Implies `interactive`. The locked Next is `aria-disabled` with {@link gateHint} under
|
|
148
|
-
* it; pressing it focuses the field. Once satisfied the tour does NOT advance by itself:
|
|
149
|
-
* Next, Enter in the field, or focus leaving the field to nowhere or to the card (the
|
|
150
|
-
* number pad's Done) moves on. A key nobody publishes is not enforced (the form closed
|
|
151
|
-
* under the tour): Next opens. A step may have a `gate` and no `target`.
|
|
152
|
-
*/
|
|
153
|
-
gate?: string;
|
|
154
|
-
/** Overrides `labels.gateHint` for this step. */
|
|
155
|
-
gateHint?: string;
|
|
156
|
-
/**
|
|
157
|
-
* 0.50 (§11.4): wait for the app to RELEASE this key — `useTourGateRelease().release(key)`
|
|
158
|
-
* from the save's `onSuccess`. Implies `interactive`; usually it targets the Save button,
|
|
159
|
-
* whose hole stays click-through. Next is replaced by {@link awaitGateHint}, and a click
|
|
160
|
-
* does not advance: only `release` does. A release that arrives on an earlier step (Enter
|
|
161
|
-
* in the last field submitted the form) jumps past the first later step awaiting the key.
|
|
162
|
-
* `refuse(key, reason)` keeps the step and shows the reason, with a "Back to …" link to the
|
|
163
|
-
* first earlier field whose gate is now unsatisfied; the kit never jumps there itself.
|
|
164
|
-
* A viewer who cannot save gets `awaitGate: undefined`, so a plain Next.
|
|
165
|
-
*/
|
|
166
|
-
awaitGate?: string;
|
|
167
|
-
/** Overrides `labels.awaitGateHint` for this step. */
|
|
168
|
-
awaitGateHint?: string;
|
|
169
|
-
/**
|
|
170
|
-
* 0.50 (§11.2): the field may stay empty. While the `gate` is unsatisfied the card
|
|
171
|
-
* offers "Leave empty" beside the locked Next, which moves on without touching the field
|
|
172
|
-
* (the kit never writes app values); the title carries an "Optional" chip. Not a skip:
|
|
173
|
-
* the run continues and can complete. Without a `gate`, only the chip.
|
|
174
|
-
*/
|
|
175
|
-
optional?: boolean;
|
|
176
|
-
/**
|
|
177
|
-
* 0.50 (§11.3): shown only if this returns true on ARRIVAL (evaluated before
|
|
178
|
-
* `beforeStep`, so a skipped step never navigates). Next walks forward to the first step
|
|
179
|
-
* shown, Back to the nearest earlier one shown now. Branch facts are gates:
|
|
180
|
-
* `when: (c) => c.gate("txn.transfer") === true`. Keep it pure and cheap: the counter
|
|
181
|
-
* evaluates every step's `when` on each arrival. A throw counts as skipped.
|
|
182
|
-
*/
|
|
183
|
-
when?: (ctx: TourStepContext) => boolean;
|
|
184
|
-
/** Runs before the step is shown — e.g. navigate to a route, open a panel.
|
|
185
|
-
* May be async; the step waits for it, then locates the target. Receives the
|
|
186
|
-
* {@link TourStepContext} (0.50); a step entered by "Guide me" sees `via: "at"` and
|
|
187
|
-
* should leave an open form alone. One that throws or rejects is logged to the
|
|
188
|
-
* console, and the step is located and shown anyway. Enter and the arrows wait for
|
|
189
|
-
* it; Escape does not. */
|
|
190
|
-
beforeStep?: (ctx: TourStepContext) => void | Promise<void>;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/** What a step's `when` and `beforeStep` may ask on arrival (0.50, §11.3). */
|
|
194
|
-
export interface TourStepContext {
|
|
195
|
-
/** The gate's current value: true/false, or undefined while nobody publishes it. */
|
|
196
|
-
gate(key: string): boolean | undefined;
|
|
197
|
-
/** How this step is being entered. */
|
|
198
|
-
via: "start" | "at" | "next" | "back" | "goto";
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export interface TourLabels {
|
|
202
|
-
next: string;
|
|
203
|
-
back: string;
|
|
204
|
-
skip: string;
|
|
205
|
-
done: string;
|
|
206
|
-
/** Shown in place of the Next button on an `awaitClick` step. */
|
|
207
|
-
awaitClickHint: string;
|
|
208
|
-
/** Shown in place of the Next button on an `awaitInput` step (0.46). */
|
|
209
|
-
awaitInputHint: string;
|
|
210
|
-
/** Step counter, e.g. (2, 7) => "2 / 7". Counts the steps the run shows (0.50). */
|
|
211
|
-
step: (current: number, total: number) => string;
|
|
212
|
-
/** 0.50: an `optional` gate step's button while the field is empty. */
|
|
213
|
-
leaveEmpty: string;
|
|
214
|
-
/** 0.50: the chip beside an `optional` step's title. */
|
|
215
|
-
optional: string;
|
|
216
|
-
/** 0.50: under a `gate` step's locked Next (`TourStep.gateHint` overrides it). */
|
|
217
|
-
gateHint: string;
|
|
218
|
-
/** 0.50: announced (screen readers only) when a gate step's field is filled. */
|
|
219
|
-
gateReady: string;
|
|
220
|
-
/** 0.50: in place of Next on an `awaitGate` step (`TourStep.awaitGateHint` overrides it). */
|
|
221
|
-
awaitGateHint: string;
|
|
222
|
-
/** 0.50: the warning when the app `refuse`s an `awaitGate` step without a reason. */
|
|
223
|
-
awaitGateRefused: string;
|
|
224
|
-
/** 0.50: the link to an earlier step whose field was emptied, after a refused save. */
|
|
225
|
-
backToStep: (title: string) => string;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Defined in ./tour-labels, which holds no component code (0.34, KS U8).
|
|
229
|
-
export { DEFAULT_TOUR_LABELS };
|
|
230
|
-
|
|
231
|
-
/** 0.50 (§11.5): a step index, or the `data-tour` value of the step's anchor. */
|
|
232
|
-
export type TourAt = number | string;
|
|
233
|
-
|
|
234
|
-
/** `useTour().start`, both forms: what `TourProvider` hands its `launch` as the third argument. */
|
|
235
|
-
export type TourStart = TourContextValue["start"];
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* 0.50 (§11.5): the app's launcher — the shape `useTourUrlSync` already takes, plus `at`.
|
|
239
|
-
* It builds the steps (`prepare()`, `build()`, `tour: tourInfo(def)`) and passes `at` on to
|
|
240
|
-
* `start(steps, { …, at })`. Give the same function to `TourProvider launch` and to
|
|
241
|
-
* `useTourUrlSync`.
|
|
242
|
-
*
|
|
243
|
-
* `start` is the provider's own `start` (keksdose N4), so the launcher needs no ref to a
|
|
244
|
-
* component below the provider and may be defined above it. `engine` (0.50.1, keksdose N1)
|
|
245
|
-
* is the rest of the engine — `stop`, `next`, `active`, … — read live, see {@link TourEngine}.
|
|
246
|
-
* `useTourUrlSync` passes both (under a provider). A launcher taking fewer arguments still
|
|
247
|
-
* works.
|
|
248
|
-
*/
|
|
249
|
-
export type TourLauncher = (
|
|
250
|
-
id: string,
|
|
251
|
-
opts: { startIndex?: number; at?: TourAt },
|
|
252
|
-
start: TourStart,
|
|
253
|
-
engine: TourEngine,
|
|
254
|
-
) => void | Promise<unknown>;
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* 0.50.1 (keksdose N1): the whole engine `useTour()` returns, handed to a launcher as its
|
|
258
|
-
* FOURTH argument by `TourProvider` and `useTourUrlSync`, so a tour built above the provider
|
|
259
|
-
* can also `stop`, `next` or read `active` with no `useTour()` registered from below. One
|
|
260
|
-
* object per provider whose fields read the latest render (`engine.active` after an
|
|
261
|
-
* `await` is current); its methods are the provider's own. `start` (the third argument) is
|
|
262
|
-
* `engine.start`.
|
|
263
|
-
*/
|
|
264
|
-
export type TourEngine = TourContextValue;
|
|
265
|
-
|
|
266
|
-
const ENGINE_KEYS = [
|
|
267
|
-
"active",
|
|
268
|
-
"activeId",
|
|
269
|
-
"start",
|
|
270
|
-
"stop",
|
|
271
|
-
"next",
|
|
272
|
-
"prev",
|
|
273
|
-
"goToStep",
|
|
274
|
-
"index",
|
|
275
|
-
"total",
|
|
276
|
-
"position",
|
|
277
|
-
"count",
|
|
278
|
-
] as const satisfies readonly (keyof TourContextValue)[];
|
|
279
|
-
|
|
280
|
-
interface StartOptions {
|
|
281
|
-
/** Stable id of the tour, surfaced as `activeId` so the app can mirror it to
|
|
282
|
-
* the URL (deep-link / evaluation tracking) and record completion. Defaults to
|
|
283
|
-
* `tour.id`. */
|
|
284
|
-
id?: string;
|
|
285
|
-
/** The tour being started, as the app lists it (docs/tours-harmonization.md §9.6.1).
|
|
286
|
-
* When its last step is finished, the provider records the completion in its
|
|
287
|
-
* `progress` and hands this to `onComplete`. */
|
|
288
|
-
tour?: TourInfo;
|
|
289
|
-
/** Start at this step index instead of 0 (clamped) — for URL/deep-link resume. */
|
|
290
|
-
startIndex?: number;
|
|
291
|
-
/**
|
|
292
|
-
* 0.50 (§11.5): start here AND make it the floor — earlier steps never run (nor their
|
|
293
|
-
* `beforeStep`), Back stops here, `position`/`count` count from here, and the finish
|
|
294
|
-
* records the completion as a full run does (Marcel, Q2). A number is a step index
|
|
295
|
-
* (clamped); a string is the first step whose `target` contains `data-tour="<at>"`
|
|
296
|
-
* verbatim (unknown: 0, with a development warning). The `at` step is entered with
|
|
297
|
-
* `via: "at"`. With `startIndex` too, `startIndex` picks the step and `at` the floor.
|
|
298
|
-
*/
|
|
299
|
-
at?: TourAt;
|
|
300
|
-
/** Fires synchronously when the tour starts (e.g. enable a mock interceptor). */
|
|
301
|
-
onStart?: () => void;
|
|
302
|
-
/** After the last step: runs after the provider's progress write and `onComplete`. */
|
|
303
|
-
onFinish?: () => void;
|
|
304
|
-
/**
|
|
305
|
-
* The run ended before its last step — undo here what `onStart` or the launcher turned
|
|
306
|
-
* on. `reason` says why: `"skipped"`, the person left (Skip, Escape); `"unavailable"`
|
|
307
|
-
* (0.52), the overlay's chunk did not load (a tab left open across a deploy, offline),
|
|
308
|
-
* so no step was shown — the moment to say so, if the app wants to. `stop()` calls
|
|
309
|
-
* nothing.
|
|
310
|
-
*/
|
|
311
|
-
onSkip?: (reason?: TourSkipReason) => void;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/** Why a run ended before its last step, as `onSkip` hears it. */
|
|
315
|
-
type TourSkipReason = "skipped" | "unavailable";
|
|
316
|
-
|
|
317
|
-
/** What `TourProvider`'s `onComplete` learns besides the tour (§9.1, §9.6). */
|
|
318
|
-
export interface TourCompletion {
|
|
319
|
-
/**
|
|
320
|
-
* `true` when the completion counts anew (the first time, or the first time after the
|
|
321
|
-
* tour's update, §8): the moment for the app's points toast. `false` for a replay, and
|
|
322
|
-
* when the stored text is in an old shape no `migrate` reads: nothing is overwritten
|
|
323
|
-
* then, and the error goes to `console.error` (keksdose B-1). `undefined` when the provider has no `progress` or the start carried no `tour`, so
|
|
324
|
-
* nothing was recorded.
|
|
325
|
-
*/
|
|
326
|
-
awarded: boolean | undefined;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
interface TourContextValue {
|
|
330
|
-
active: boolean;
|
|
331
|
-
/** Id of the running tour (from {@link StartOptions.id}), else null. */
|
|
332
|
-
activeId: string | null;
|
|
333
|
-
/**
|
|
334
|
-
* Start a tour with the given steps — or, by id (0.50), through the provider's `launch`:
|
|
335
|
-
* `start("create-transaction", { at: "txn-entry-mode" })`. Without a `launch` the id form
|
|
336
|
-
* does nothing (a development build warns).
|
|
337
|
-
*/
|
|
338
|
-
start: {
|
|
339
|
-
// The id form first: `Parameters<typeof start>` reads the LAST overload, which stays
|
|
340
|
-
// the 0.49 one.
|
|
341
|
-
(id: string, opts?: { at?: TourAt }): void;
|
|
342
|
-
(steps: TourStep[], opts?: StartOptions): void;
|
|
343
|
-
};
|
|
344
|
-
/** End the current tour (no callbacks fire). */
|
|
345
|
-
stop: () => void;
|
|
346
|
-
/** Advance one step; past the last step it finishes the tour (fires onFinish). */
|
|
347
|
-
next: () => void;
|
|
348
|
-
/** Go back one step (no-op on the first). */
|
|
349
|
-
prev: () => void;
|
|
350
|
-
/** Jump to a step by index, clamped to range — e.g. for URL/deep-link resume. */
|
|
351
|
-
goToStep: (index: number) => void;
|
|
352
|
-
/** Current step (0-based; 0 while inactive). */
|
|
353
|
-
index: number;
|
|
354
|
-
/** Total steps (0 while inactive). */
|
|
355
|
-
total: number;
|
|
356
|
-
/** 0.50: 1-based position among the steps this run shows, for "3 of 9"; 0 while inactive. */
|
|
357
|
-
position: number;
|
|
358
|
-
/** 0.50: how many steps this run shows, from its first (the `at` floor) to the end; 0 while inactive. */
|
|
359
|
-
count: number;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const TourContext = createContext<TourContextValue | null>(null);
|
|
363
|
-
|
|
364
|
-
export function useTour(): TourContextValue {
|
|
365
|
-
const ctx = useContext(TourContext);
|
|
366
|
-
if (!ctx) throw new Error("useTour must be used within <TourProvider>");
|
|
367
|
-
return ctx;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* The tour engine if it is there, `null` if it is not — for a control that is a
|
|
372
|
-
* DECORATION rather than a participant.
|
|
373
|
-
*
|
|
374
|
-
* {@link useTour}'s throw is correct and stays: a component that runs a tour cannot do
|
|
375
|
-
* its job without the provider, and failing loudly is how that gets fixed. But the
|
|
376
|
-
* throw's blast radius is whatever error boundary is above it, and for a launcher in
|
|
377
|
-
* the app shell that is the whole app.
|
|
378
|
-
*
|
|
379
|
-
* Keksdose feedback dev#524 is what that costs: an `@hb/ui` module was edited while a
|
|
380
|
-
* dev server was running, vite re-evaluated it, and the module's freshly created
|
|
381
|
-
* context object was no longer the one the mounted provider was providing. React's
|
|
382
|
-
* `useContext` then answers `null` for a provider that is, structurally, right there —
|
|
383
|
-
* and the top bar's tour menu took the entire shell down with it. **Build-time module
|
|
384
|
-
* graphs cannot produce that**, so it is a development-only failure; a menu that
|
|
385
|
-
* disappears for a second is the proportionate response to it either way.
|
|
386
|
-
*
|
|
387
|
-
* Only for controls that can honestly render nothing. If a component would show a
|
|
388
|
-
* broken half of itself without the tour, it wants {@link useTour}.
|
|
389
|
-
*/
|
|
390
|
-
export function useTourOptional(): TourContextValue | null {
|
|
391
|
-
return useContext(TourContext);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
395
|
-
* Provides the guided-tour engine: a dimmed spotlight overlay + step card driven
|
|
396
|
-
* by a list of {@link TourStep}s. Domain-free — the app supplies the steps (copy,
|
|
397
|
-
* selectors, per-step navigation, placement) and the translated {@link TourLabels}.
|
|
398
|
-
* Mount once inside the router; start a tour from anywhere via {@link useTour},
|
|
399
|
-
* which also exposes step control (`next`/`prev`/`goToStep`) and the current
|
|
400
|
-
* `index`/`total` for URL mirroring, `awaitClick` and deep-link resume.
|
|
401
|
-
*
|
|
402
|
-
* **Completion in one place** (docs/tours-harmonization.md §9.6): give the provider the
|
|
403
|
-
* app's `progress` (the same `{storageKey, migrate}` as `useTourProgress`) and start each
|
|
404
|
-
* tour with `start(steps, {tour})`. When the last step is finished the provider writes the
|
|
405
|
-
* completion ONCE, through the store every `useTourProgress` reader of the key shares
|
|
406
|
-
* (never a second copy), then calls `onComplete(tour, {awarded})`, then the start's own
|
|
407
|
-
* `onFinish`. A skip or `stop()` records nothing and calls neither. The app removes its
|
|
408
|
-
* own `complete()` from `onFinish`, or that second write answers `false`.
|
|
409
|
-
*
|
|
410
|
-
* Both props are optional: without `progress` or a `tour` on the start, `onComplete`
|
|
411
|
-
* still fires, with `awarded: undefined` (and `tour` as given, possibly `undefined`). A
|
|
412
|
-
* new `storageKey` (an account switch on a shared PC) is followed on the next
|
|
413
|
-
* completion, without a remount.
|
|
414
|
-
*/
|
|
415
|
-
export function TourProvider({
|
|
416
|
-
children,
|
|
417
|
-
labels,
|
|
418
|
-
progress,
|
|
419
|
-
onComplete,
|
|
420
|
-
launch,
|
|
421
|
-
dockOnPhones = true,
|
|
422
|
-
}: {
|
|
423
|
-
children: ReactNode;
|
|
424
|
-
labels?: LabelOverride<TourLabels>;
|
|
425
|
-
/**
|
|
426
|
-
* 0.50 (§11.5): lets `start(id)` and `<TourGuideButton>` start a tour by id. Usually the
|
|
427
|
-
* same function the app gives `useTourUrlSync`.
|
|
428
|
-
*/
|
|
429
|
-
launch?: TourLauncher;
|
|
430
|
-
/** The app's tour progress: the same options its `useTourProgress` readers use. */
|
|
431
|
-
progress?: UseTourProgressOptions;
|
|
432
|
-
/** A tour's last step was finished; see {@link TourCompletion}. */
|
|
433
|
-
onComplete?: (tour: TourInfo | undefined, completion: TourCompletion) => void;
|
|
434
|
-
/**
|
|
435
|
-
* 0.50 (§11.7, Marcel's Q1): below `sm`, a field step with a target and no `placement`
|
|
436
|
-
* docks. Default `true`; `false` makes docking strictly opt-in (`placement: "dock"`).
|
|
437
|
-
*/
|
|
438
|
-
dockOnPhones?: boolean;
|
|
439
|
-
}) {
|
|
440
|
-
// `labels` over the provider's `tour` over English. Resolved once here and handed
|
|
441
|
-
// down: the step card is portalled, but context crosses portals anyway — this is
|
|
442
|
-
// simply the one place that already owned the merge.
|
|
443
|
-
const merged = useKitLabels("tour", DEFAULT_TOUR_LABELS, labels);
|
|
444
|
-
const [steps, setSteps] = useState<TourStep[] | null>(null);
|
|
445
|
-
// Where the run is: the raw index (what `?tourStep=` mirrors), how it got there, and
|
|
446
|
-
// its place among the steps shown (§11.3), computed once on arrival.
|
|
447
|
-
const [nav, setNav] = useState<Nav>(NO_NAV);
|
|
448
|
-
const index = nav.index;
|
|
449
|
-
// The app's last `refuse` on the step awaiting its key; any arrival clears it.
|
|
450
|
-
const [refusal, setRefusal] = useState<Refusal | null>(null);
|
|
451
|
-
const [activeId, setActiveId] = useState<string | null>(null);
|
|
452
|
-
const optsRef = useRef<StartOptions>({});
|
|
453
|
-
// The latest props, read at the finish: a new `storageKey` or callback needs no remount.
|
|
454
|
-
const progressRef = useRef(progress);
|
|
455
|
-
const onCompleteRef = useRef(onComplete);
|
|
456
|
-
const launchRef = useRef(launch);
|
|
457
|
-
useLayoutEffect(() => {
|
|
458
|
-
progressRef.current = progress;
|
|
459
|
-
onCompleteRef.current = onComplete;
|
|
460
|
-
launchRef.current = launch;
|
|
461
|
-
});
|
|
462
|
-
// The provider's migrate becomes the key's, for readers that pass none (keksdose B-2).
|
|
463
|
-
const storageKey = progress?.storageKey;
|
|
464
|
-
const migrate = progress?.migrate;
|
|
465
|
-
// 0.45: and its `account` (§10.3), so a finish on an account key is sent as readers' are.
|
|
466
|
-
const account = progress?.account;
|
|
467
|
-
useLayoutEffect(() => {
|
|
468
|
-
if (storageKey !== undefined) rememberMigrate(storageKey, migrate);
|
|
469
|
-
if (storageKey !== undefined) rememberAccount(storageKey, account);
|
|
470
|
-
}, [storageKey, migrate, account]);
|
|
471
|
-
const warnedNoTourRef = useRef(false);
|
|
472
|
-
// Live mirrors so the step-control callbacks can stay stable (identity-safe for
|
|
473
|
-
// consumers) while still reading the current steps/index. Synced in a layout
|
|
474
|
-
// effect — after the commit, before paint and before any passive effect or event
|
|
475
|
-
// can call them — rather than written during render.
|
|
476
|
-
const stepsRef = useRef<TourStep[] | null>(null);
|
|
477
|
-
const indexRef = useRef(0);
|
|
478
|
-
useLayoutEffect(() => {
|
|
479
|
-
stepsRef.current = steps;
|
|
480
|
-
indexRef.current = index;
|
|
481
|
-
}, [steps, index]);
|
|
482
|
-
/** The run's first step: earlier steps never run, Back stops here (the `at` floor). */
|
|
483
|
-
const floorRef = useRef(0);
|
|
484
|
-
const active = !!steps && steps.length > 0;
|
|
485
|
-
const total = steps?.length ?? 0;
|
|
486
|
-
// The gate registry (§11.1): one per provider, read by the overlay while a tour runs.
|
|
487
|
-
const [gates] = useState(createGateRegistry);
|
|
488
|
-
useLayoutEffect(() => {
|
|
489
|
-
gates.setActive(active);
|
|
490
|
-
}, [gates, active]);
|
|
491
|
-
const canLaunch = !!launch;
|
|
492
|
-
const internals = useMemo(() => ({ gates, canLaunch }), [gates, canLaunch]);
|
|
493
|
-
|
|
494
|
-
/** Is step `i` shown, asked now (§11.3)? */
|
|
495
|
-
const shown = useCallback(
|
|
496
|
-
(s: TourStep[], i: number, via: TourStepContext["via"]) => isShown(s[i], stepContext(gates, via)),
|
|
497
|
-
[gates],
|
|
498
|
-
);
|
|
499
|
-
/** Arrive at `i`: the counter is recomputed from every step's `when`, against the gates now. */
|
|
500
|
-
const arrive = useCallback(
|
|
501
|
-
(s: TourStep[], i: number, via: TourStepContext["via"]) => {
|
|
502
|
-
const ctx = stepContext(gates, via);
|
|
503
|
-
let position = 0;
|
|
504
|
-
let count = 0;
|
|
505
|
-
for (let j = floorRef.current; j < s.length; j++) {
|
|
506
|
-
if (j !== i && !isShown(s[j], ctx)) continue;
|
|
507
|
-
count++;
|
|
508
|
-
if (j <= i) position++;
|
|
509
|
-
}
|
|
510
|
-
indexRef.current = i;
|
|
511
|
-
setRefusal(null);
|
|
512
|
-
setNav({ index: i, floor: floorRef.current, via, position, count });
|
|
513
|
-
},
|
|
514
|
-
[gates],
|
|
515
|
-
);
|
|
516
|
-
/** The first step shown at or after `from`, or -1. */
|
|
517
|
-
const forward = useCallback(
|
|
518
|
-
(s: TourStep[], from: number, via: TourStepContext["via"]) => {
|
|
519
|
-
for (let j = Math.max(from, floorRef.current); j < s.length; j++) if (shown(s, j, via)) return j;
|
|
520
|
-
return -1;
|
|
521
|
-
},
|
|
522
|
-
[shown],
|
|
523
|
-
);
|
|
524
|
-
/** The nearest step shown at or before `from`, not below the floor, or -1. */
|
|
525
|
-
const backward = useCallback(
|
|
526
|
-
(s: TourStep[], from: number, via: TourStepContext["via"]) => {
|
|
527
|
-
for (let j = Math.min(from, s.length - 1); j >= floorRef.current; j--) if (shown(s, j, via)) return j;
|
|
528
|
-
return -1;
|
|
529
|
-
},
|
|
530
|
-
[shown],
|
|
531
|
-
);
|
|
532
|
-
|
|
533
|
-
const startSteps = useCallback(
|
|
534
|
-
(s: TourStep[], opts?: StartOptions) => {
|
|
535
|
-
optsRef.current = opts ?? {};
|
|
536
|
-
optsRef.current.onStart?.();
|
|
537
|
-
const last = Math.max(0, s.length - 1);
|
|
538
|
-
floorRef.current = opts?.at === undefined ? 0 : resolveAt(s, opts.at);
|
|
539
|
-
const via: TourStepContext["via"] = opts?.at === undefined ? "start" : "at";
|
|
540
|
-
// Floored, as `at` is (FLW-9): `steps[1.5]` is undefined, and `forward` threw on
|
|
541
|
-
// its `when` — an edited `?tourStep=2.5` was enough.
|
|
542
|
-
const asked = opts?.startIndex === undefined ? floorRef.current : Math.floor(opts.startIndex);
|
|
543
|
-
const wanted = Math.min(Math.max(floorRef.current, asked), last);
|
|
544
|
-
let to = forward(s, wanted, via);
|
|
545
|
-
if (to < 0) to = backward(s, wanted, via);
|
|
546
|
-
// Not one step of the run is shown: there is nothing to tour.
|
|
547
|
-
if (to < 0) return;
|
|
548
|
-
arrive(s, to, via);
|
|
549
|
-
setActiveId(opts?.id ?? opts?.tour?.id ?? null);
|
|
550
|
-
setSteps(s);
|
|
551
|
-
},
|
|
552
|
-
[arrive, forward, backward],
|
|
553
|
-
);
|
|
554
|
-
// The provider's own `start` and the live engine, handed to `launch` as its third and
|
|
555
|
-
// fourth arguments (keksdose N4, N1).
|
|
556
|
-
const ownStartRef = useRef<TourContextValue["start"] | null>(null);
|
|
557
|
-
const [live] = useState(() => liveEngine<TourEngine>(ENGINE_KEYS));
|
|
558
|
-
const engine = live.engine;
|
|
559
|
-
const start = useCallback(
|
|
560
|
-
(what: TourStep[] | string, opts?: StartOptions | { at?: TourAt }) => {
|
|
561
|
-
if (typeof what !== "string") {
|
|
562
|
-
startSteps(what, opts as StartOptions | undefined);
|
|
563
|
-
return;
|
|
564
|
-
}
|
|
565
|
-
const run = launchRef.current;
|
|
566
|
-
if (!run) {
|
|
567
|
-
if (devWarnings()) console.warn(`[ui-kit] start("${what}") needs TourProvider's \`launch\` prop.`);
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
void Promise.resolve(run(what, { at: opts?.at }, ownStartRef.current!, engine)).catch((error: unknown) =>
|
|
571
|
-
console.error(error),
|
|
572
|
-
);
|
|
573
|
-
},
|
|
574
|
-
[startSteps, engine],
|
|
575
|
-
) as TourContextValue["start"];
|
|
576
|
-
useLayoutEffect(() => {
|
|
577
|
-
ownStartRef.current = start;
|
|
578
|
-
}, [start]);
|
|
579
|
-
const stop = useCallback(() => {
|
|
580
|
-
setSteps(null);
|
|
581
|
-
setActiveId(null);
|
|
582
|
-
}, []);
|
|
583
|
-
const finish = useCallback(() => {
|
|
584
|
-
// Once per tour: a second "Done" before the overlay unmounts records nothing more.
|
|
585
|
-
if (!stepsRef.current) return;
|
|
586
|
-
stepsRef.current = null;
|
|
587
|
-
const { tour, onFinish } = optsRef.current;
|
|
588
|
-
const store = progressRef.current;
|
|
589
|
-
// Exactly one write per completion (§9.6.2), so `awarded` is what `complete(tour)` answered.
|
|
590
|
-
let awarded: boolean | undefined;
|
|
591
|
-
if (store && tour) {
|
|
592
|
-
try {
|
|
593
|
-
awarded = completeStored(store.storageKey, store.migrate, tour);
|
|
594
|
-
} catch (error) {
|
|
595
|
-
// A stored text no migrate reads is left as it is (keksdose B-1); the tour still ends.
|
|
596
|
-
console.error(error);
|
|
597
|
-
awarded = false;
|
|
598
|
-
}
|
|
599
|
-
} else if (store && !tour && devWarnings() && !warnedNoTourRef.current) {
|
|
600
|
-
warnedNoTourRef.current = true;
|
|
601
|
-
console.warn(
|
|
602
|
-
"[ui-kit] TourProvider has `progress`, but a finished tour's start carried no `tour`: " +
|
|
603
|
-
"nothing was recorded and `awarded` is undefined. Start it with `start(steps, { tour })`.",
|
|
604
|
-
);
|
|
605
|
-
}
|
|
606
|
-
onCompleteRef.current?.(tour, { awarded });
|
|
607
|
-
onFinish?.();
|
|
608
|
-
setSteps(null);
|
|
609
|
-
setActiveId(null);
|
|
610
|
-
}, []);
|
|
611
|
-
// Takes no argument: the card's Skip passes its click event.
|
|
612
|
-
const skip = useCallback(() => {
|
|
613
|
-
optsRef.current.onSkip?.("skipped");
|
|
614
|
-
setSteps(null);
|
|
615
|
-
setActiveId(null);
|
|
616
|
-
}, []);
|
|
617
|
-
const unavailable = useCallback(() => {
|
|
618
|
-
// Once per run: the fallback's layout effect runs twice under StrictMode.
|
|
619
|
-
if (!stepsRef.current) return;
|
|
620
|
-
stepsRef.current = null;
|
|
621
|
-
optsRef.current.onSkip?.("unavailable");
|
|
622
|
-
setSteps(null);
|
|
623
|
-
setActiveId(null);
|
|
624
|
-
}, []);
|
|
625
|
-
|
|
626
|
-
// A step whose `when` is false is passed over: `goToStep` lands on the next step shown
|
|
627
|
-
// after it, failing that the previous one; Next past the last shown step finishes.
|
|
628
|
-
const goToStep = useCallback(
|
|
629
|
-
(i: number) => {
|
|
630
|
-
const s = stepsRef.current;
|
|
631
|
-
if (!s || s.length === 0) return;
|
|
632
|
-
const wanted = Math.min(Math.max(floorRef.current, Math.floor(i)), s.length - 1);
|
|
633
|
-
let to = forward(s, wanted, "goto");
|
|
634
|
-
if (to < 0) to = backward(s, wanted, "goto");
|
|
635
|
-
if (to >= 0) arrive(s, to, "goto");
|
|
636
|
-
},
|
|
637
|
-
[arrive, forward, backward],
|
|
638
|
-
);
|
|
639
|
-
const next = useCallback(() => {
|
|
640
|
-
const s = stepsRef.current;
|
|
641
|
-
if (!s || s.length === 0) return;
|
|
642
|
-
const to = forward(s, indexRef.current + 1, "next");
|
|
643
|
-
if (to < 0) finish();
|
|
644
|
-
else arrive(s, to, "next");
|
|
645
|
-
}, [arrive, forward, finish]);
|
|
646
|
-
const prev = useCallback(() => {
|
|
647
|
-
const s = stepsRef.current;
|
|
648
|
-
if (!s) return;
|
|
649
|
-
const to = backward(s, indexRef.current - 1, "back");
|
|
650
|
-
if (to >= 0) arrive(s, to, "back");
|
|
651
|
-
}, [arrive, backward]);
|
|
652
|
-
|
|
653
|
-
// awaitGate (§11.4): `release` and `refuse` are events, heard only while a tour runs.
|
|
654
|
-
useEffect(() => {
|
|
655
|
-
if (!active) return;
|
|
656
|
-
let seq = 0;
|
|
657
|
-
return gates.listen((signal) => {
|
|
658
|
-
const s = stepsRef.current;
|
|
659
|
-
if (!s) return;
|
|
660
|
-
const i = indexRef.current;
|
|
661
|
-
if (signal.kind === "refuse") {
|
|
662
|
-
// On any other step the form's own errors speak.
|
|
663
|
-
if (s[i]?.awaitGate === signal.key) setRefusal({ step: s[i], reason: signal.reason, seq: ++seq });
|
|
664
|
-
return;
|
|
665
|
-
}
|
|
666
|
-
// The step awaiting it, or the first later one: the record is saved, so the fields
|
|
667
|
-
// between are passed over.
|
|
668
|
-
const awaiting =
|
|
669
|
-
s[i]?.awaitGate === signal.key ? i : s.findIndex((st, k) => k > i && st.awaitGate === signal.key);
|
|
670
|
-
if (awaiting < 0) return;
|
|
671
|
-
const to = forward(s, awaiting + 1, "next");
|
|
672
|
-
if (to < 0) finish();
|
|
673
|
-
else arrive(s, to, "next");
|
|
674
|
-
});
|
|
675
|
-
}, [active, gates, arrive, forward, finish]);
|
|
676
|
-
|
|
677
|
-
const value: TourContextValue = {
|
|
678
|
-
active,
|
|
679
|
-
activeId,
|
|
680
|
-
start,
|
|
681
|
-
stop,
|
|
682
|
-
next,
|
|
683
|
-
prev,
|
|
684
|
-
goToStep,
|
|
685
|
-
index,
|
|
686
|
-
total,
|
|
687
|
-
position: active ? nav.position : 0,
|
|
688
|
-
count: active ? nav.count : 0,
|
|
689
|
-
};
|
|
690
|
-
// Read by the live engine (`launch`'s fourth argument) after this render commits.
|
|
691
|
-
useLayoutEffect(() => {
|
|
692
|
-
live.set(value);
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
return (
|
|
696
|
-
<TourInternalContext.Provider value={internals}>
|
|
697
|
-
<TourContext.Provider value={value}>
|
|
698
|
-
{children}
|
|
699
|
-
{active ? (
|
|
700
|
-
// Its own boundary, so the first start's chunk fetch suspends nothing of the
|
|
701
|
-
// app's; it shows nothing meanwhile, as the overlay itself does until it has
|
|
702
|
-
// located the step, and hears Escape as it does. A failed fetch ends the run
|
|
703
|
-
// (`TourOverlayUnavailable`).
|
|
704
|
-
<Suspense fallback={<TourOverlayLoading onSkip={skip} />}>
|
|
705
|
-
<TourUnavailableContext.Provider value={unavailable}>
|
|
706
|
-
<LazyTourOverlay
|
|
707
|
-
steps={steps!}
|
|
708
|
-
index={index}
|
|
709
|
-
via={nav.via}
|
|
710
|
-
floor={nav.floor}
|
|
711
|
-
position={nav.position}
|
|
712
|
-
count={nav.count}
|
|
713
|
-
refusal={refusal?.step === steps![index] ? refusal : null}
|
|
714
|
-
onGoTo={goToStep}
|
|
715
|
-
labels={merged}
|
|
716
|
-
gates={gates}
|
|
717
|
-
dockOnPhones={dockOnPhones}
|
|
718
|
-
onNext={next}
|
|
719
|
-
onPrev={prev}
|
|
720
|
-
onSkip={skip}
|
|
721
|
-
/>
|
|
722
|
-
</TourUnavailableContext.Provider>
|
|
723
|
-
</Suspense>
|
|
724
|
-
) : null}
|
|
725
|
-
</TourContext.Provider>
|
|
726
|
-
</TourInternalContext.Provider>
|
|
727
|
-
);
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
interface Nav {
|
|
731
|
-
index: number;
|
|
732
|
-
/** The run's first step (the `at` floor). */
|
|
733
|
-
floor: number;
|
|
734
|
-
via: TourStepContext["via"];
|
|
735
|
-
position: number;
|
|
736
|
-
count: number;
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
const NO_NAV: Nav = { index: 0, floor: 0, via: "start", position: 0, count: 0 };
|
|
740
|
-
|
|
741
|
-
/** `StartOptions.at` as a step index: a number clamped, an anchor's first step, else 0. */
|
|
742
|
-
function resolveAt(steps: TourStep[], at: TourAt): number {
|
|
743
|
-
if (typeof at === "number") return Math.min(Math.max(0, Math.floor(at)), Math.max(0, steps.length - 1));
|
|
744
|
-
const anchor = `data-tour="${at}"`;
|
|
745
|
-
const found = steps.findIndex((step) => step.target?.includes(anchor));
|
|
746
|
-
if (found >= 0) return found;
|
|
747
|
-
if (devWarnings())
|
|
748
|
-
console.warn(`[ui-kit] A tour was started at "${at}", but no step targets [${anchor}]: it starts at 0.`);
|
|
749
|
-
return 0;
|
|
750
|
-
}
|