@eifi1/ui-kit 0.53.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -82
- package/dist/account/delete-account-setting.d.ts +3 -2
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +36 -0
- package/dist/auth/auth-errors.js +20 -0
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +2 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +6 -4
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.d.ts +2 -1
- package/dist/components/currency-option-list.js +10 -3
- package/dist/components/currency-option-list.js.map +1 -1
- package/dist/components/currency-select.d.ts +3 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +22 -1
- package/dist/components/danger-confirm.js +52 -30
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +2 -1
- package/dist/components/data-table-filter-popover.js +3 -2
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +33 -3
- package/dist/components/data-table-filters.js +6 -4
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +5 -1
- package/dist/components/dialog-frame.js +6 -2
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +16 -7
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +48 -0
- package/dist/components/modal.js +26 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/stat-tile.d.ts +21 -2
- package/dist/components/stat-tile.js +4 -2
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/currencies.d.ts +16 -2
- package/dist/currencies.js +2 -1
- package/dist/currencies.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-context-labels.js +2 -1
- package/dist/feedback/feedback-context-labels.js.map +1 -1
- package/dist/feedback/feedback-context.d.ts +19 -3
- package/dist/feedback/feedback-context.js +12 -1
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-diagnostics.d.ts +17 -0
- package/dist/feedback/feedback-diagnostics.js +27 -0
- package/dist/feedback/feedback-diagnostics.js.map +1 -0
- package/dist/feedback/feedback-dialog.d.ts +10 -0
- package/dist/feedback/feedback-dialog.js +6 -4
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-record.d.ts +5 -0
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +1 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +3 -0
- package/dist/feedback/feedback-row-detail.js +3 -0
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
- package/dist/feedback/feedback-submit-dialog.js +15 -3
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.d.ts +30 -2
- package/dist/feedback/feedback-submit.js +5 -2
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +2 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +78 -4
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +95 -5
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +74 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +75 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +77 -4
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +77 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +74 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +27 -8
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +36 -4
- package/dist/lib/dates.js +49 -13
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/format.d.ts +37 -2
- package/dist/lib/format.js +25 -1
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/intl-cache.d.ts +4 -2
- package/dist/lib/intl-cache.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/translation-review.d.ts +26 -0
- package/dist/lib/translation-review.js +14 -0
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -341
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -370
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -815
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -594
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -180
- package/src/components/currency-select.tsx +0 -341
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -934
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -281
- package/src/components/data-table-filters.ts +0 -287
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -276
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -789
- package/src/components/modal.tsx +0 -505
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -558
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -725
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -70
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -10
- package/src/feedback/feedback-context.tsx +0 -213
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -440
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -423
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -30
- package/src/feedback/feedback-row-detail.tsx +0 -858
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -118
- package/src/feedback/feedback-submit.tsx +0 -237
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -189
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2057
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1997
- package/src/i18n/locales/fr.ts +0 -2035
- package/src/i18n/locales/hu.ts +0 -2002
- package/src/i18n/locales/it.ts +0 -2012
- package/src/i18n/locales/zh.ts +0 -1910
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1179
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -266
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -522
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -25
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -717
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext, useEffect, useLayoutEffect, useRef, useState, type Context } from "react";
|
|
2
|
-
import * as ReactRouter from "react-router";
|
|
3
|
-
import { useLocation, useNavigate, type Navigator } from "react-router";
|
|
4
|
-
import { useSearchParamsState } from "../hooks/use-search-param-state";
|
|
5
|
-
import { useTourOptional, type TourEngine, type TourStart } from "./tour";
|
|
6
|
-
import { liveEngine } from "./tour-engine";
|
|
7
|
-
import { devWarnings } from "./tour-gates";
|
|
8
|
-
|
|
9
|
-
/* ── useTourUrlSync ─────────────────────────────────────────────────────────── */
|
|
10
|
-
|
|
11
|
-
export interface UseTourUrlSyncOptions {
|
|
12
|
-
/**
|
|
13
|
-
* Start the tour `id` at `startIndex` (0-based) — the app's launcher, which builds the
|
|
14
|
-
* steps, awaits its own `prepare()` and passes `onFinish` (the completion, the points
|
|
15
|
-
* toast) to `useTour().start`. An unknown id should do nothing. May return a promise:
|
|
16
|
-
* the parameters are kept until it settles. Under a `TourProvider` the third argument is
|
|
17
|
-
* that provider's `start` (0.50, as `TourProvider launch` gets it), so one launcher serves
|
|
18
|
-
* both; the fourth is its whole engine, read live (0.50.1, `TourEngine`: `stop`, `next`,
|
|
19
|
-
* `active`, …). Without a provider `start` and the engine's methods do nothing (a
|
|
20
|
-
* development build warns) and the engine reads as idle.
|
|
21
|
-
*/
|
|
22
|
-
launch: (
|
|
23
|
-
id: string,
|
|
24
|
-
options: { startIndex: number },
|
|
25
|
-
start: TourStart,
|
|
26
|
-
engine: TourEngine,
|
|
27
|
-
) => void | Promise<unknown>;
|
|
28
|
-
/**
|
|
29
|
-
* Are the facts a tour's steps are built from loaded yet (keksdose's `ready`: the
|
|
30
|
-
* caches a branching tour reads)? A deep link waits for it, keeping its parameters, so
|
|
31
|
-
* an F5 mid-tour resumes the right variant at the right step. Default `true`.
|
|
32
|
-
*/
|
|
33
|
-
ready?: boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Older names of `tourStep`, read when it is absent and removed with it — kastlan's
|
|
36
|
-
* `ts` (§2.7, for one minor). Their value is a 0-based step index, as kastlan wrote it.
|
|
37
|
-
*/
|
|
38
|
-
stepAliases?: readonly string[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
type Place = { pathname: string; search: string; hash: string };
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Has the router already moved on from the location React is still rendering?
|
|
45
|
-
* keksdose's check (tour-url-sync.tsx, tours audit 2026-10-02): a mirror write built
|
|
46
|
-
* from the page being LEFT is a replace back onto it, which cancels a step's `go()`.
|
|
47
|
-
*
|
|
48
|
-
* - A data router (`createBrowserRouter`, kastlan): its navigator has no location (build
|
|
49
|
-
* review 0.43, kastlan A2), so the router's own state answers — a navigation still
|
|
50
|
-
* loading, or a location it has committed that React has not rendered yet.
|
|
51
|
-
* - A declarative router (`BrowserRouter`, keksdose): its navigator is its history and
|
|
52
|
-
* carries where it is.
|
|
53
|
-
* - Anything else answers "not in flight".
|
|
54
|
-
*/
|
|
55
|
-
function navigationInFlight(history: Navigator | undefined, dataRouter: DataRouterProbe, rendered: Place) {
|
|
56
|
-
const state = dataRouter?.router?.state;
|
|
57
|
-
if (state && (state.navigation?.state ?? "idle") !== "idle") return true;
|
|
58
|
-
const live = state?.location ?? (history as (Navigator & { location?: Partial<Place> }) | undefined)?.location;
|
|
59
|
-
if (!live) return false;
|
|
60
|
-
return (
|
|
61
|
-
live.pathname !== rendered.pathname ||
|
|
62
|
-
(live.search ?? "") !== rendered.search ||
|
|
63
|
-
(live.hash ?? "") !== rendered.hash
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
type NavigationProbe = { navigator?: Navigator } | null;
|
|
68
|
-
const NO_NAVIGATION = createContext<NavigationProbe>(null);
|
|
69
|
-
/** The data router's state, as `useSearchParamState` reads it. */
|
|
70
|
-
type DataRouterProbe = {
|
|
71
|
-
router?: { state?: { navigation?: { state?: string }; location?: Partial<Place> } };
|
|
72
|
-
} | null;
|
|
73
|
-
const NO_DATA_ROUTER = createContext<DataRouterProbe>(null);
|
|
74
|
-
const DataRouterContext: Context<DataRouterProbe> = (() => {
|
|
75
|
-
try {
|
|
76
|
-
return (
|
|
77
|
-
(ReactRouter as unknown as { UNSAFE_DataRouterContext?: Context<DataRouterProbe> }).UNSAFE_DataRouterContext ??
|
|
78
|
-
NO_DATA_ROUTER
|
|
79
|
-
);
|
|
80
|
-
} catch {
|
|
81
|
-
return NO_DATA_ROUTER;
|
|
82
|
-
}
|
|
83
|
-
})();
|
|
84
|
-
/** Read off the namespace inside a `try`, as `useSearchParamState` reads the data router:
|
|
85
|
-
* a test's partial `vi.mock("react-router")` throws on an export it does not define. */
|
|
86
|
-
const NavigationContext: Context<NavigationProbe> = (() => {
|
|
87
|
-
try {
|
|
88
|
-
return (
|
|
89
|
-
(ReactRouter as unknown as { UNSAFE_NavigationContext?: Context<NavigationProbe> }).UNSAFE_NavigationContext ??
|
|
90
|
-
NO_NAVIGATION
|
|
91
|
-
);
|
|
92
|
-
} catch {
|
|
93
|
-
return NO_NAVIGATION;
|
|
94
|
-
}
|
|
95
|
-
})();
|
|
96
|
-
|
|
97
|
-
/** The step a link asks for, 0-based: `tourStep` is 1-based (keksdose), an alias 0-based.
|
|
98
|
-
* Floored, as the aliases always were (FLW-9): `?tourStep=2.5` was index 1.5. */
|
|
99
|
-
function stepOf(params: URLSearchParams, aliases: readonly string[]): number {
|
|
100
|
-
const step = Number(params.get("tourStep"));
|
|
101
|
-
if (params.has("tourStep")) return Number.isFinite(step) && step >= 1 ? Math.floor(step) - 1 : 0;
|
|
102
|
-
for (const alias of aliases) {
|
|
103
|
-
const value = Number(params.get(alias));
|
|
104
|
-
if (params.has(alias)) return Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
|
|
105
|
-
}
|
|
106
|
-
return 0;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Tours and the URL (docs/tours-harmonization.md §2.7, §6.4) — keksdose's `TourUrlSync`,
|
|
111
|
-
* on the kit's engine (`useTourOptional`):
|
|
112
|
-
*
|
|
113
|
-
* - **`?tour=<id>` starts that tour whenever it APPEARS** — on load, and on in-app
|
|
114
|
-
* navigation too (kastlan's assistant links to `/help/tours?tour=<id>`, ka F4) —
|
|
115
|
-
* resuming at `&tourStep=<n>` (1-based). It waits for `ready`.
|
|
116
|
-
* - **While a tour runs, `?tour=&tourStep=` mirror where it is**, so a reload or a copied
|
|
117
|
-
* link pins the step (kk K-3). A step that navigates drops them; this puts them back.
|
|
118
|
-
* - **At the end it strips only its own parameters**; `?q=`, `?state=` and the hash stay.
|
|
119
|
-
*
|
|
120
|
-
* Mount it once inside the router and the `TourProvider`. Without a provider it still
|
|
121
|
-
* launches through `launch` and never mirrors.
|
|
122
|
-
*/
|
|
123
|
-
export function useTourUrlSync({ launch, ready = true, stepAliases = [] }: UseTourUrlSyncOptions): void {
|
|
124
|
-
const navigate = useNavigate();
|
|
125
|
-
const location = useLocation();
|
|
126
|
-
const { pathname, search, hash } = location;
|
|
127
|
-
const history = useContext(NavigationContext)?.navigator;
|
|
128
|
-
const dataRouter = useContext(DataRouterContext);
|
|
129
|
-
const engine = useTourOptional();
|
|
130
|
-
const active = engine?.active ?? false;
|
|
131
|
-
const activeId = engine?.activeId ?? null;
|
|
132
|
-
const index = engine?.index ?? 0;
|
|
133
|
-
const urlTour = new URLSearchParams(search).get("tour");
|
|
134
|
-
const aliases = stepAliases.join("\n");
|
|
135
|
-
|
|
136
|
-
const launchRef = useRef(launch);
|
|
137
|
-
const startRef = useRef<TourStart>(engine?.start ?? noProviderStart);
|
|
138
|
-
const [live] = useState(() => liveEngine<TourEngine>(ENGINE_KEYS, NO_PROVIDER_ENGINE));
|
|
139
|
-
const activeIdRef = useRef(activeId);
|
|
140
|
-
useLayoutEffect(() => {
|
|
141
|
-
launchRef.current = launch;
|
|
142
|
-
startRef.current = engine?.start ?? noProviderStart;
|
|
143
|
-
live.set(engine ?? NO_PROVIDER_ENGINE);
|
|
144
|
-
activeIdRef.current = active ? activeId : null;
|
|
145
|
-
});
|
|
146
|
-
/** The `tour` value last seen in the URL: a tour starts when it CHANGES to an id. */
|
|
147
|
-
const seenRef = useRef<string | null>(null);
|
|
148
|
-
/** A deep link waiting for `ready`. */
|
|
149
|
-
const pendingRef = useRef<{ id: string; startIndex: number } | null>(null);
|
|
150
|
-
/** A launch under way (an app's `prepare()`). */
|
|
151
|
-
const launchingRef = useRef(false);
|
|
152
|
-
/** Bumped when a launch settles, so the mirror looks again. */
|
|
153
|
-
const [settled, setSettled] = useState(0);
|
|
154
|
-
|
|
155
|
-
useEffect(() => {
|
|
156
|
-
if (urlTour !== seenRef.current) {
|
|
157
|
-
seenRef.current = urlTour;
|
|
158
|
-
// Its own mirror writing the running tour back is no new link.
|
|
159
|
-
pendingRef.current =
|
|
160
|
-
urlTour && urlTour !== activeIdRef.current
|
|
161
|
-
? { id: urlTour, startIndex: stepOf(new URLSearchParams(search), aliases ? aliases.split("\n") : []) }
|
|
162
|
-
: null;
|
|
163
|
-
}
|
|
164
|
-
const pending = pendingRef.current;
|
|
165
|
-
if (!pending || !ready) return;
|
|
166
|
-
pendingRef.current = null;
|
|
167
|
-
launchingRef.current = true;
|
|
168
|
-
void Promise.resolve()
|
|
169
|
-
.then(() => launchRef.current(pending.id, { startIndex: pending.startIndex }, startRef.current, live.engine))
|
|
170
|
-
// Said, as `TourProvider`'s own `launch` path says it (FLW-9): swallowed, a launch
|
|
171
|
-
// that failed was a tour that silently did not start — in kastlan after its
|
|
172
|
-
// launcher had already turned practice mode on.
|
|
173
|
-
.catch((error: unknown) => console.error(error))
|
|
174
|
-
.finally(() => {
|
|
175
|
-
launchingRef.current = false;
|
|
176
|
-
setSettled((n) => n + 1);
|
|
177
|
-
});
|
|
178
|
-
// Only a change of the parameter, or readiness, starts a tour.
|
|
179
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
180
|
-
}, [urlTour, ready]);
|
|
181
|
-
|
|
182
|
-
useEffect(() => {
|
|
183
|
-
if (navigationInFlight(history, dataRouter, { pathname, search, hash })) return;
|
|
184
|
-
// A link not yet used keeps its parameters: a reload in that window resumes.
|
|
185
|
-
if (pendingRef.current || launchingRef.current) return;
|
|
186
|
-
const tourId = active && activeId ? activeId : null;
|
|
187
|
-
const own = ["tour", "tourStep", ...(aliases ? aliases.split("\n") : [])];
|
|
188
|
-
const current = new URLSearchParams(search);
|
|
189
|
-
// Nothing to mirror and nothing to strip: never touch the URL (a no-op replace
|
|
190
|
-
// clobbers a page's own just-issued navigation, keksdose feedback #4).
|
|
191
|
-
if (!tourId && !own.some((key) => current.has(key))) return;
|
|
192
|
-
const next = new URLSearchParams(search);
|
|
193
|
-
// `set` keeps a parameter where it stands; only the aliases (and, at the end, the
|
|
194
|
-
// tour's own) go.
|
|
195
|
-
for (const key of tourId ? own.slice(2) : own) next.delete(key);
|
|
196
|
-
if (tourId) {
|
|
197
|
-
next.set("tour", tourId);
|
|
198
|
-
next.set("tourStep", String(index + 1));
|
|
199
|
-
}
|
|
200
|
-
if (next.toString() === current.toString()) return;
|
|
201
|
-
// Spelled out, not `setSearchParams` ("?…" drops the hash, keksdose dev#495).
|
|
202
|
-
void navigate({ pathname, search: next.toString(), hash }, { replace: true, state: location.state });
|
|
203
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
204
|
-
}, [active, activeId, index, pathname, search, hash, settled, aliases]);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/** `start` for a launcher run with no `TourProvider` above `useTourUrlSync`. */
|
|
208
|
-
const noProviderStart: TourStart = () => {
|
|
209
|
-
if (devWarnings()) console.warn("[ui-kit] useTourUrlSync: the launcher's start needs a TourProvider above it.");
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
const noProviderCall = () => {
|
|
213
|
-
if (devWarnings()) console.warn("[ui-kit] useTourUrlSync: the launcher's engine needs a TourProvider above it.");
|
|
214
|
-
};
|
|
215
|
-
/** The engine for a launcher run with no `TourProvider` above `useTourUrlSync`: idle. */
|
|
216
|
-
const NO_PROVIDER_ENGINE: TourEngine = {
|
|
217
|
-
active: false,
|
|
218
|
-
activeId: null,
|
|
219
|
-
start: noProviderStart,
|
|
220
|
-
stop: noProviderCall,
|
|
221
|
-
next: noProviderCall,
|
|
222
|
-
prev: noProviderCall,
|
|
223
|
-
goToStep: noProviderCall,
|
|
224
|
-
index: 0,
|
|
225
|
-
total: 0,
|
|
226
|
-
position: 0,
|
|
227
|
-
count: 0,
|
|
228
|
-
};
|
|
229
|
-
const ENGINE_KEYS = Object.keys(NO_PROVIDER_ENGINE) as (keyof TourEngine)[];
|
|
230
|
-
|
|
231
|
-
/* ── useTourCatalogueUrlState ───────────────────────────────────────────────── */
|
|
232
|
-
|
|
233
|
-
/** The catalogue's state filter. */
|
|
234
|
-
export type TourStateFilter = "all" | "todo" | "done";
|
|
235
|
-
|
|
236
|
-
/** The catalogue's filters: the search, the group (`null`: every group), the state. */
|
|
237
|
-
export interface TourCatalogueFilter {
|
|
238
|
-
query: string;
|
|
239
|
-
group: string | null;
|
|
240
|
-
state: TourStateFilter;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const STATES: readonly TourStateFilter[] = ["all", "todo", "done"];
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* The catalogue's filters in the URL (§2.8) — keksdose's `?q`, `?topic`, `?state`, each
|
|
247
|
-
* written with `replace` (typing does not bury the Back button), the defaults as the
|
|
248
|
-
* clean URL. Spread it onto the catalogue: `<TourCatalogue {...useTourCatalogueUrlState()} … />`.
|
|
249
|
-
* `params` renames them (kastlan's `?group`). Requires a react-router Router.
|
|
250
|
-
*/
|
|
251
|
-
export function useTourCatalogueUrlState(
|
|
252
|
-
params: { query?: string; group?: string; state?: string } = {},
|
|
253
|
-
): TourCatalogueFilter & { onChange: (patch: Partial<TourCatalogueFilter>) => void } {
|
|
254
|
-
const [filter, setFilter] = useSearchParamsState<TourCatalogueFilter>({
|
|
255
|
-
query: { param: params.query ?? "q", default: "", history: "replace" },
|
|
256
|
-
group: { param: params.group ?? "topic", default: null, history: "replace", parse: (raw) => raw || undefined },
|
|
257
|
-
state: {
|
|
258
|
-
param: params.state ?? "state",
|
|
259
|
-
default: "all",
|
|
260
|
-
history: "replace",
|
|
261
|
-
parse: (raw) => STATES.find((x) => x === raw),
|
|
262
|
-
},
|
|
263
|
-
});
|
|
264
|
-
// `group: null` is a value to the setter (it clears `?topic`); `undefined` leaves it.
|
|
265
|
-
return { ...filter, onChange: setFilter };
|
|
266
|
-
}
|
package/src/tour.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// `@eifi1/ui-kit/tour` — guided tours.
|
|
2
|
-
// A re-slicing of the main barrel, not a new API.
|
|
3
|
-
export * from "./tour/tour";
|
|
4
|
-
// 0.43.0: the tours page (docs/tours-harmonization.md §3, §8) — keksdose's catalogue, its
|
|
5
|
-
// card, the NEW and reset rules, device progress and the URL. `useTourUrlSync` and
|
|
6
|
-
// `useTourCatalogueUrlState` need react-router (a peer already, for /shell).
|
|
7
|
-
export { TourCatalogue, TourCatalogueCard, DEFAULT_TOUR_CATALOGUE_LABELS } from "./tour/tour-catalogue";
|
|
8
|
-
export type { TourCatalogueProps, TourCatalogueCardProps, TourCatalogueLabels } from "./tour/tour-catalogue";
|
|
9
|
-
export { isTourNew, isTourReset, isTourDone, doneCount, earnedPoints } from "./tour/tour-info";
|
|
10
|
-
export type { TourInfo, TourGroup, TourUpdate, TourCompletions } from "./tour/tour-info";
|
|
11
|
-
// 0.44.0: the writer outside a page (§9.2).
|
|
12
|
-
export { useTourProgress, resetTourProgress, completeTour } from "./tour/use-tour-progress";
|
|
13
|
-
export type { UseTourProgressOptions, TourProgress } from "./tour/use-tour-progress";
|
|
14
|
-
// 0.45.0: progress on the account (§10.2–§10.3) and the end of a session.
|
|
15
|
-
export { signOutTourProgress } from "./tour/use-tour-progress";
|
|
16
|
-
export type { TourProgressAccount, TourProgressAdopt, TourProgressBody } from "./tour/use-tour-progress";
|
|
17
|
-
export { useTourUrlSync, useTourCatalogueUrlState } from "./tour/use-tour-url-sync";
|
|
18
|
-
export type { UseTourUrlSyncOptions, TourCatalogueFilter, TourStateFilter } from "./tour/use-tour-url-sync";
|
|
19
|
-
// 0.50.0: guided form tours (docs/tours-harmonization.md §11) — "Guide me" inside a form.
|
|
20
|
-
export { TourGuideButton, DEFAULT_TOUR_GUIDE_LABELS } from "./tour/tour-guide-button";
|
|
21
|
-
export type { TourGuideButtonProps, TourGuideLabels } from "./tour/tour-guide-button";
|
package/src/vite-env.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// Minimal ambient typing for the Vite-injected `import.meta.env` so the package
|
|
2
|
-
// type-checks standalone (consumers provide the real values at build time).
|
|
3
|
-
interface ImportMetaEnv {
|
|
4
|
-
readonly DEV: boolean;
|
|
5
|
-
/** Set by vitest, and by nothing else. `DEV` cannot answer "am I under test" —
|
|
6
|
-
* a test run is neither a dev build nor a production one, and vitest reports
|
|
7
|
-
* `DEV=true` — so anything that should be quiet in a suite has to ask this. */
|
|
8
|
-
readonly VITEST?: boolean;
|
|
9
|
-
}
|
|
10
|
-
interface ImportMeta {
|
|
11
|
-
readonly env: ImportMetaEnv;
|
|
12
|
-
/**
|
|
13
|
-
* Vite's compile-time glob. Declared here rather than by pulling in
|
|
14
|
-
* `vite/client` (which drags every asset-module shim with it) or `@types/node`
|
|
15
|
-
* (which this package deliberately does not depend on — it ships browser code).
|
|
16
|
-
*
|
|
17
|
-
* It is what lets a TEST read the package's own sources: `field-invalid.test.tsx`
|
|
18
|
-
* sweeps the component directory to find a field-shaped control that forgot a
|
|
19
|
-
* prop, which is the kind of guard the consumer app writes with `readFileSync`
|
|
20
|
-
* and cannot be written that way here.
|
|
21
|
-
*/
|
|
22
|
-
glob<T = unknown>(pattern: string, options?: { query?: string; import?: string; eager?: boolean }): Record<string, T>;
|
|
23
|
-
}
|
|
@@ -1,360 +0,0 @@
|
|
|
1
|
-
import { useId, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import type { ReactElement, ReactNode } from "react";
|
|
3
|
-
import { Check } from "lucide-react";
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { Button } from "../components/button";
|
|
6
|
-
import { Spinner } from "../components/spinner";
|
|
7
|
-
import type { ButtonVariant } from "../components/button-look";
|
|
8
|
-
import { Modal } from "../components/modal";
|
|
9
|
-
import { alertFrameClass } from "../components/alert-banner";
|
|
10
|
-
import { WizardContextProvider } from "./wizard-context";
|
|
11
|
-
import { DEFAULT_WIZARD_LABELS } from "./types";
|
|
12
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
13
|
-
import type { UseWizardReturn, WizardFinishResult, WizardLabels } from "./types";
|
|
14
|
-
import type { CommitScope } from "../components/write-lock";
|
|
15
|
-
import { useTourGateRelease } from "../tour/tour-gates";
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* The chrome around a wizard: the step indicator, the step content, and the
|
|
19
|
-
* Cancel / Back / Skip / Next / Finish bar — plus the cancel-confirmation
|
|
20
|
-
* dialog, because "are you sure you want to lose this" is part of the wizard's
|
|
21
|
-
* contract rather than something each app should re-decide.
|
|
22
|
-
*
|
|
23
|
-
* It is a component and not a set of parts for one reason: which button shows,
|
|
24
|
-
* and whether it is enabled, is a function of `wizard` state that was getting
|
|
25
|
-
* re-derived (and re-derived slightly differently) at every call site. Finish is
|
|
26
|
-
* gated on `canFinish`, Next and Skip on `nextBlocked`, and Skip only appears on
|
|
27
|
-
* an `optional` step that is not the last — that policy lives here now.
|
|
28
|
-
*
|
|
29
|
-
* The `<StepperNav>` is also what publishes {@link WizardContextProvider}, which
|
|
30
|
-
* is how a mounted step registers its own validator. A step's
|
|
31
|
-
* `useRhfWizardStep` / `useWizardStepValidate` therefore only works inside one.
|
|
32
|
-
*
|
|
33
|
-
* Which buttons show is read off `wizard` (`canCancel`, `canGoBack`, `canDone`,
|
|
34
|
-
* `isCommitStep`), so the policy options — `cancellable`, `onExit`, `commits`,
|
|
35
|
-
* `onDone` — are all set on `useWizard`. What is set HERE is how the Finish button
|
|
36
|
-
* looks and what wraps it, because that is presentation and usually depends on
|
|
37
|
-
* state the app holds (a "replace everything" toggle, a write lock — `finishCommit`).
|
|
38
|
-
*
|
|
39
|
-
* `TData`'s constraint is `UseWizardOptions`' (its mapped half is for `Parameters<>`).
|
|
40
|
-
*/
|
|
41
|
-
export function StepperNav<TData extends object & { [K in keyof TData]: unknown }>({
|
|
42
|
-
wizard,
|
|
43
|
-
children,
|
|
44
|
-
title,
|
|
45
|
-
description,
|
|
46
|
-
className,
|
|
47
|
-
labels,
|
|
48
|
-
finishVariant = "accent",
|
|
49
|
-
finishDisabled = false,
|
|
50
|
-
finishCommit,
|
|
51
|
-
finishDisabledReason,
|
|
52
|
-
doneDisabled = false,
|
|
53
|
-
renderFinish,
|
|
54
|
-
}: {
|
|
55
|
-
wizard: UseWizardReturn<TData>;
|
|
56
|
-
children: ReactNode;
|
|
57
|
-
title?: ReactNode;
|
|
58
|
-
description?: ReactNode;
|
|
59
|
-
className?: string;
|
|
60
|
-
labels?: LabelOverride<WizardLabels>;
|
|
61
|
-
/** The Finish button's variant — `"danger"` for a destructive commit (an import
|
|
62
|
-
* that replaces what is there). Default `"accent"`. Next keeps `"accent"`. */
|
|
63
|
-
finishVariant?: ButtonVariant;
|
|
64
|
-
/** Disable Finish for a reason of the app's own, on top of the kit's gates
|
|
65
|
-
* (`canFinish`, submitting, validating). */
|
|
66
|
-
finishDisabled?: boolean;
|
|
67
|
-
/**
|
|
68
|
-
* Finish COMMITS — {@link Button}'s `commit`, handed to the Finish button. Under a
|
|
69
|
-
* locked {@link WriteLockProvider} it is `aria-disabled` but focusable, with the lock's
|
|
70
|
-
* reason in the kit Tooltip, and a click (or Enter) does not run `wizard.finish`.
|
|
71
|
-
* Every other button of the bar stays live: the steps before the commit write nothing,
|
|
72
|
-
* so the whole wizard can still be walked through on a read-only page.
|
|
73
|
-
*
|
|
74
|
-
* keksdose G1: its YNAB import runs the mapping wizard on the read-only demo (dev#497)
|
|
75
|
-
* and locks only the confirm step's Finish — by cloning `commit` into the element
|
|
76
|
-
* `renderFinish` hands it, because StepperNav took no `commit` of its own. That clone
|
|
77
|
-
* still works; this is the same thing without one. Named `finishCommit` beside
|
|
78
|
-
* `finishVariant` / `finishDisabled` rather than a bare `commit`, which on a component
|
|
79
|
-
* with five buttons would not say which one saves — and would read like `useWizard`'s
|
|
80
|
-
* `commits`, which is a step's policy, not a lock.
|
|
81
|
-
*/
|
|
82
|
-
finishCommit?: CommitScope;
|
|
83
|
-
/**
|
|
84
|
-
* Why Finish is not available — {@link Button}'s `disabledReason` on the Finish button:
|
|
85
|
-
* `aria-disabled` and focusable, the reason in the kit Tooltip and on the button's
|
|
86
|
-
* `aria-describedby`, `wizard.finish` not run. The explained form of `finishDisabled`
|
|
87
|
-
* (a native `disabled` takes the button out of the tab order, so its reason never
|
|
88
|
-
* reaches a keyboard). Under a lock with `finishCommit`, the lock's reason wins.
|
|
89
|
-
*/
|
|
90
|
-
finishDisabledReason?: ReactNode;
|
|
91
|
-
/**
|
|
92
|
-
* Disable Done — the button of the last step after a commit — while the step still
|
|
93
|
-
* has work of its own running. keksdose's YNAB import ends on a recurring step whose
|
|
94
|
-
* convert loop writes one rule at a time (ynab-import-panel.tsx): leaving mid-loop
|
|
95
|
-
* abandons the rest. Until now the panel dropped `onDone` for the duration, which
|
|
96
|
-
* takes the button away instead of saying "not yet": disabled, it stays where the
|
|
97
|
-
* eye left it and comes back to life when the loop ends.
|
|
98
|
-
*/
|
|
99
|
-
doneDisabled?: boolean;
|
|
100
|
-
/**
|
|
101
|
-
* Wrap the Finish button: receives the kit's button element — already labelled,
|
|
102
|
-
* gated and wired to `wizard.finish` — and returns what to render in its place.
|
|
103
|
-
*
|
|
104
|
-
* ```tsx
|
|
105
|
-
* renderFinish={(button) => <SaveGuard lock={lock}>{button}</SaveGuard>}
|
|
106
|
-
* ```
|
|
107
|
-
*
|
|
108
|
-
* A wrapper and not a replacement (`finishButton: (props) => …`) or a hook
|
|
109
|
-
* (`onBeforeFinish`): the app's need is to put something AROUND the commit — a
|
|
110
|
-
* write-lock tooltip, which has to sit on a wrapping element because a disabled
|
|
111
|
-
* button receives no pointer events — while the kit keeps owning what the button
|
|
112
|
-
* says and when it is enabled. A replacement would hand every app the gating to
|
|
113
|
-
* re-derive (the problem this component exists to end); `onBeforeFinish` can veto
|
|
114
|
-
* a click but cannot explain a disabled button. The element is a plain `<Button>`,
|
|
115
|
-
* so a wrapper that clones it with `disabled` works as expected.
|
|
116
|
-
*
|
|
117
|
-
* For the write lock itself there is no need to wrap any more: `finishCommit` (and
|
|
118
|
-
* `finishDisabledReason`) put the kit Button's own Tooltip on Finish. An element
|
|
119
|
-
* cloned with `commit` here keeps working the same way.
|
|
120
|
-
*/
|
|
121
|
-
renderFinish?: (button: ReactElement) => ReactNode;
|
|
122
|
-
}) {
|
|
123
|
-
const l = useKitLabels("wizard", DEFAULT_WIZARD_LABELS, labels);
|
|
124
|
-
const cancelTitleId = useId();
|
|
125
|
-
|
|
126
|
-
// The step area never shrinks below the tallest step shown so far, so the button
|
|
127
|
-
// bar does not jump up and down as Next and Back move between a long step and a
|
|
128
|
-
// short one. This replaces a fixed `min-h-[300px]` (carried over from Kastlan,
|
|
129
|
-
// whose steps are all long forms), which did the same for steps under 300px but
|
|
130
|
-
// left a short wizard — two fields a step — with a ~200px hole above its buttons.
|
|
131
|
-
// Measured rather than guessed: the floor is whatever the app's own steps need.
|
|
132
|
-
const contentRef = useRef<HTMLDivElement>(null);
|
|
133
|
-
const [contentFloor, setContentFloor] = useState(0);
|
|
134
|
-
useLayoutEffect(() => {
|
|
135
|
-
const el = contentRef.current;
|
|
136
|
-
if (!el || typeof ResizeObserver === "undefined") return;
|
|
137
|
-
const observer = new ResizeObserver(() => {
|
|
138
|
-
const h = el.offsetHeight;
|
|
139
|
-
setContentFloor((floor) => (h > floor ? h : floor));
|
|
140
|
-
});
|
|
141
|
-
observer.observe(el);
|
|
142
|
-
return () => observer.disconnect();
|
|
143
|
-
}, []);
|
|
144
|
-
|
|
145
|
-
const contextValue = useMemo(
|
|
146
|
-
() => ({
|
|
147
|
-
registerStepValidate: wizard.registerStepValidate,
|
|
148
|
-
setNextBlocked: wizard.setNextBlocked,
|
|
149
|
-
}),
|
|
150
|
-
[wizard.registerStepValidate, wizard.setNextBlocked],
|
|
151
|
-
);
|
|
152
|
-
|
|
153
|
-
// Finish is only valid once every step before the last has been completed or
|
|
154
|
-
// skipped (derived once in useWizard). Prevents a restored last-step index
|
|
155
|
-
// (empty data after a reload) from firing an empty submit.
|
|
156
|
-
const canFinish = wizard.canFinish;
|
|
157
|
-
|
|
158
|
-
// A running tour's `awaitGate` steps (0.50, docs/tours-harmonization.md §11.9): Next
|
|
159
|
-
// releases "wizard-next" when the wizard moved and refuses it when a validator kept it
|
|
160
|
-
// in place; Finish releases "wizard-finish" once `onComplete` resolved and refuses it,
|
|
161
|
-
// with the error's message, when it threw. No-ops without a TourProvider or a tour.
|
|
162
|
-
const tourGates = useTourGateRelease();
|
|
163
|
-
// `useWizard`'s goNext/finish resolve their outcome at run time (see their types); a
|
|
164
|
-
// wizard object built some other way resolves nothing, and nothing is signalled.
|
|
165
|
-
const goNext = async () => {
|
|
166
|
-
const moved = (await wizard.goNext()) as unknown as boolean | undefined;
|
|
167
|
-
if (moved === true) tourGates.release("wizard-next");
|
|
168
|
-
else if (moved === false) tourGates.refuse("wizard-next");
|
|
169
|
-
};
|
|
170
|
-
const finish = async () => {
|
|
171
|
-
const result = (await wizard.finish()) as unknown as WizardFinishResult | undefined;
|
|
172
|
-
if (!result) return;
|
|
173
|
-
if (result.ok) tourGates.release("wizard-finish");
|
|
174
|
-
else tourGates.refuse("wizard-finish", result.error);
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// Pending while the step's validators run (an async server check): a spinner and
|
|
178
|
-
// `aria-busy`, and disabled — the hook's own re-entry guard still refuses a second
|
|
179
|
-
// press, this just stops it looking like the first one did nothing.
|
|
180
|
-
const pending = wizard.isValidating;
|
|
181
|
-
const stepNextLabel = wizard.currentStep.nextLabel;
|
|
182
|
-
|
|
183
|
-
// Every branch below assigns it; no initial value to overwrite.
|
|
184
|
-
let forwardButton: ReactNode;
|
|
185
|
-
if (wizard.isCommitStep) {
|
|
186
|
-
const finishButton = (
|
|
187
|
-
<Button
|
|
188
|
-
variant={finishVariant}
|
|
189
|
-
data-tour="wizard-finish"
|
|
190
|
-
onClick={() => void finish()}
|
|
191
|
-
// The kit Button's lock: a reason (its own or, with `commit`, the provider's)
|
|
192
|
-
// wins over `disabled` and keeps the button reachable, saying why.
|
|
193
|
-
commit={finishCommit}
|
|
194
|
-
disabledReason={finishDisabledReason}
|
|
195
|
-
disabled={wizard.isSubmitting || pending || !canFinish || finishDisabled}
|
|
196
|
-
aria-busy={wizard.isSubmitting || pending || undefined}
|
|
197
|
-
>
|
|
198
|
-
{/* Decorative: the button's text is what a reader hears. */}
|
|
199
|
-
{pending && <Spinner label={null} className="size-4" />}
|
|
200
|
-
{wizard.isSubmitting ? l.submitting : (stepNextLabel ?? l.finish)}
|
|
201
|
-
</Button>
|
|
202
|
-
);
|
|
203
|
-
forwardButton = renderFinish ? renderFinish(finishButton) : finishButton;
|
|
204
|
-
} else if (wizard.isLastStep) {
|
|
205
|
-
// The last step after a commit. Nothing to finish; Done only when the app gave
|
|
206
|
-
// an `onDone` — otherwise the step carries its own way out.
|
|
207
|
-
forwardButton = wizard.canDone ? (
|
|
208
|
-
<Button variant="accent" data-tour="wizard-done" onClick={wizard.done} disabled={doneDisabled}>
|
|
209
|
-
{stepNextLabel ?? l.done ?? DEFAULT_WIZARD_LABELS.done}
|
|
210
|
-
</Button>
|
|
211
|
-
) : null;
|
|
212
|
-
} else {
|
|
213
|
-
forwardButton = (
|
|
214
|
-
<Button
|
|
215
|
-
variant="accent"
|
|
216
|
-
data-tour="wizard-next"
|
|
217
|
-
onClick={() => void goNext()}
|
|
218
|
-
disabled={wizard.nextBlocked || pending}
|
|
219
|
-
aria-busy={pending || undefined}
|
|
220
|
-
>
|
|
221
|
-
{pending && <Spinner label={null} className="size-4" />}
|
|
222
|
-
{stepNextLabel ?? l.next}
|
|
223
|
-
</Button>
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return (
|
|
228
|
-
<div className={cn("flex flex-col gap-6", className)}>
|
|
229
|
-
{(title || description) && (
|
|
230
|
-
<div>
|
|
231
|
-
{title && <h1 className="text-2xl font-bold tracking-tight text-primary">{title}</h1>}
|
|
232
|
-
{description && <p className="mt-1 text-sm text-muted">{description}</p>}
|
|
233
|
-
</div>
|
|
234
|
-
)}
|
|
235
|
-
|
|
236
|
-
{/* Step indicator */}
|
|
237
|
-
<nav aria-label={l.steps}>
|
|
238
|
-
<ol className="flex w-full items-center">
|
|
239
|
-
{wizard.steps.map((step, index) => {
|
|
240
|
-
const status = wizard.stepStatus(index);
|
|
241
|
-
const isLast = index === wizard.steps.length - 1;
|
|
242
|
-
|
|
243
|
-
return (
|
|
244
|
-
<li key={step.id} className={cn("flex items-center", !isLast && "flex-1")}>
|
|
245
|
-
<button
|
|
246
|
-
type="button"
|
|
247
|
-
onClick={() => wizard.goToStep(index)}
|
|
248
|
-
// `canGoToStep` adds the commit lock: once past a committing step,
|
|
249
|
-
// the steps up to it are done with and cannot be reopened.
|
|
250
|
-
disabled={status === "upcoming" || !wizard.canGoToStep(index)}
|
|
251
|
-
aria-current={status === "active" ? "step" : undefined}
|
|
252
|
-
className={cn(
|
|
253
|
-
"group flex flex-col items-center gap-1.5",
|
|
254
|
-
status === "upcoming" ? "cursor-default" : "cursor-pointer",
|
|
255
|
-
)}
|
|
256
|
-
>
|
|
257
|
-
{/* Circle */}
|
|
258
|
-
<span
|
|
259
|
-
className={cn(
|
|
260
|
-
"flex size-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold transition-colors",
|
|
261
|
-
status === "completed" && "border-brand bg-brand text-brand-contrast",
|
|
262
|
-
status === "active" && "border-brand bg-surface text-brand",
|
|
263
|
-
status === "upcoming" && "border-subtle bg-surface text-placeholder",
|
|
264
|
-
status === "skipped" && "border-subtle bg-surface-2 text-muted",
|
|
265
|
-
)}
|
|
266
|
-
>
|
|
267
|
-
{status === "completed" ? <Check className="size-4" /> : index + 1}
|
|
268
|
-
</span>
|
|
269
|
-
{/* Label — hidden on mobile, where the line below carries it */}
|
|
270
|
-
<span
|
|
271
|
-
className={cn(
|
|
272
|
-
"hidden text-xs font-medium md:block",
|
|
273
|
-
status === "active" || status === "completed" ? "text-primary" : "text-muted",
|
|
274
|
-
)}
|
|
275
|
-
>
|
|
276
|
-
{step.label}
|
|
277
|
-
</span>
|
|
278
|
-
</button>
|
|
279
|
-
|
|
280
|
-
{/* Connector line */}
|
|
281
|
-
{!isLast && (
|
|
282
|
-
<div
|
|
283
|
-
className={cn("mx-2 h-0.5 flex-1", status === "completed" ? "bg-brand" : "bg-[var(--border)]")}
|
|
284
|
-
/>
|
|
285
|
-
)}
|
|
286
|
-
</li>
|
|
287
|
-
);
|
|
288
|
-
})}
|
|
289
|
-
</ol>
|
|
290
|
-
{/* Mobile: the labels above are hidden, so name the current step here */}
|
|
291
|
-
<p className="mt-2 text-center text-sm font-medium text-primary md:hidden">
|
|
292
|
-
{l.step(wizard.currentStepIndex + 1, wizard.steps.length)}
|
|
293
|
-
{" — "}
|
|
294
|
-
{wizard.currentStep.label}
|
|
295
|
-
</p>
|
|
296
|
-
</nav>
|
|
297
|
-
|
|
298
|
-
{/* Step content */}
|
|
299
|
-
<WizardContextProvider value={contextValue}>
|
|
300
|
-
<div style={contentFloor > 0 ? { minHeight: contentFloor } : undefined}>
|
|
301
|
-
<div ref={contentRef}>{children}</div>
|
|
302
|
-
</div>
|
|
303
|
-
</WizardContextProvider>
|
|
304
|
-
|
|
305
|
-
{/* Submit error */}
|
|
306
|
-
{wizard.error && (
|
|
307
|
-
<div role="alert" className={cn("text-sm text-danger", alertFrameClass("danger"))}>
|
|
308
|
-
{wizard.error}
|
|
309
|
-
</div>
|
|
310
|
-
)}
|
|
311
|
-
|
|
312
|
-
{/* Navigation bar */}
|
|
313
|
-
<div className="flex items-center justify-between border-t border-subtle pt-4">
|
|
314
|
-
{/* The empty span keeps the right-hand group on the right when Cancel is off. */}
|
|
315
|
-
{wizard.canCancel ? (
|
|
316
|
-
<Button variant="secondary" onClick={wizard.cancel}>
|
|
317
|
-
{l.cancel}
|
|
318
|
-
</Button>
|
|
319
|
-
) : (
|
|
320
|
-
<span />
|
|
321
|
-
)}
|
|
322
|
-
<div className="flex items-center gap-2">
|
|
323
|
-
{wizard.canGoBack && (
|
|
324
|
-
// Disabled, not hidden, while the commit runs: it comes back if the commit
|
|
325
|
-
// fails, and a button that vanishes mid-click is its own kind of surprise.
|
|
326
|
-
<Button variant="secondary" onClick={wizard.goBack} disabled={wizard.isSubmitting}>
|
|
327
|
-
{l.back}
|
|
328
|
-
</Button>
|
|
329
|
-
)}
|
|
330
|
-
{wizard.currentStep.optional && !wizard.isLastStep && !wizard.isCommitStep && (
|
|
331
|
-
<Button variant="ghost" onClick={wizard.skip} disabled={wizard.nextBlocked || wizard.isValidating}>
|
|
332
|
-
{l.skip}
|
|
333
|
-
</Button>
|
|
334
|
-
)}
|
|
335
|
-
{forwardButton}
|
|
336
|
-
</div>
|
|
337
|
-
</div>
|
|
338
|
-
|
|
339
|
-
{/* Cancel confirmation */}
|
|
340
|
-
{wizard.showCancelDialog && (
|
|
341
|
-
<Modal onClose={wizard.dismissCancel} labelledBy={cancelTitleId} className="space-y-4">
|
|
342
|
-
<div className="space-y-1.5">
|
|
343
|
-
<h2 id={cancelTitleId} className="text-lg font-semibold text-primary">
|
|
344
|
-
{l.cancelTitle}
|
|
345
|
-
</h2>
|
|
346
|
-
<p className="text-sm text-muted">{l.confirmCancel}</p>
|
|
347
|
-
</div>
|
|
348
|
-
<div className="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end">
|
|
349
|
-
<Button variant="secondary" onClick={wizard.dismissCancel}>
|
|
350
|
-
{l.cancelDismissLabel}
|
|
351
|
-
</Button>
|
|
352
|
-
<Button variant="danger" onClick={wizard.confirmCancel}>
|
|
353
|
-
{l.cancelConfirmLabel}
|
|
354
|
-
</Button>
|
|
355
|
-
</div>
|
|
356
|
-
</Modal>
|
|
357
|
-
)}
|
|
358
|
-
</div>
|
|
359
|
-
);
|
|
360
|
-
}
|