@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/demo/demo-banner.tsx
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef } from "react";
|
|
3
|
-
import { ChevronDown, ChevronUp, Timer } from "lucide-react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../lib/cn";
|
|
6
|
-
import { readSessionStored, writeSessionStored } from "../lib/safe-storage";
|
|
7
|
-
import { AlertBanner } from "../components/alert-banner";
|
|
8
|
-
import { Button } from "../components/button";
|
|
9
|
-
import { IconButton } from "../components/icon-button";
|
|
10
|
-
import { useAccessAction } from "../landing/access";
|
|
11
|
-
import type { AccessChoice } from "../landing/access";
|
|
12
|
-
import { useLandingLabels } from "../landing/landing-labels";
|
|
13
|
-
import type { LandingLabels } from "../landing/landing-labels";
|
|
14
|
-
import { useDemoCountdown } from "./demo-countdown";
|
|
15
|
-
import type { DemoCountdown, DemoExpiry } from "./demo-countdown";
|
|
16
|
-
import { useDemoLabels } from "./demo-labels";
|
|
17
|
-
import type { DemoLabels } from "./demo-labels";
|
|
18
|
-
import type { DemoModel } from "./demo-session";
|
|
19
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
20
|
-
|
|
21
|
-
/** The default `sessionStorage` key of the collapsed state. */
|
|
22
|
-
const COLLAPSE_KEY = "kit.demoBanner.collapsed";
|
|
23
|
-
|
|
24
|
-
/** "Demo · 23 h 12 min left", "Demo · 50 min left", the end, or plain "Demo". */
|
|
25
|
-
function timeText(countdown: DemoCountdown, labels: DemoLabels): string {
|
|
26
|
-
if (countdown.minutesLeft === null) return labels.badge;
|
|
27
|
-
if (countdown.ended) return labels.endedTitle;
|
|
28
|
-
return countdown.lastHour
|
|
29
|
-
? labels.minutesLeft(countdown.minutes)
|
|
30
|
-
: labels.hoursLeft(countdown.hours, countdown.minutes);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* A `div`'s props, `ref` included since 0.35 (round 0.35 R4, the follow-up to API-2). They
|
|
35
|
-
* go on to the {@link AlertBanner} strip, so the ref is the strip's own `<div>` — never a
|
|
36
|
-
* link or a button: the banner takes no `href` or `onClick` of its own.
|
|
37
|
-
*/
|
|
38
|
-
export interface DemoBannerProps extends Omit<ComponentPropsWithRef<"div">, "children" | "onClick"> {
|
|
39
|
-
/** The demo's end: `expires_at` from the `TokenResponse`, or `demo_expires_at` from
|
|
40
|
-
* `/auth/me` (§5.3). */
|
|
41
|
-
expiresAt: DemoExpiry | null | undefined;
|
|
42
|
-
/** Which line the banner says about the data (§2.3). */
|
|
43
|
-
model: DemoModel;
|
|
44
|
-
/** "Request access". */
|
|
45
|
-
access: AccessChoice;
|
|
46
|
-
/** "Sign in" — let through for a demo session by `RedirectIfAuthed allowDemo`. Default
|
|
47
|
-
* `/login`. */
|
|
48
|
-
signInHref?: string;
|
|
49
|
-
/** The countdown reached zero: clear the session and replace to `/demo/ended` (§5.5). */
|
|
50
|
-
onEnded?: () => void;
|
|
51
|
-
/** Where the collapsed state is kept for the tab's session. Default
|
|
52
|
-
* `kit.demoBanner.collapsed`. */
|
|
53
|
-
collapseKey?: string;
|
|
54
|
-
/** The clock, for tests and previews. Default `Date.now`. Keep it stable. */
|
|
55
|
-
now?: () => number;
|
|
56
|
-
labels?: LabelOverride<DemoLabels>;
|
|
57
|
-
/** The access words (`landing` namespace) for this instance. */
|
|
58
|
-
landingLabels?: Partial<LandingLabels>;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* The demo's strip under the top bar, on every page of a demo session
|
|
63
|
-
* (docs/landing-demo-harmonization.md §5.4) — a kit `AlertBanner` strip:
|
|
64
|
-
*
|
|
65
|
-
* - the time left, "Demo · 23 h 12 min left" — minutes only in the last hour, and the
|
|
66
|
-
* warning tone in the last ten minutes (`useDemoCountdown`);
|
|
67
|
-
* - one line on the model: R "You're looking at sample data. Changes aren't possible.",
|
|
68
|
-
* S "Your own work is deleted when the demo ends.";
|
|
69
|
-
* - "Request access" (the mail) and "Sign in".
|
|
70
|
-
*
|
|
71
|
-
* It collapses to the countdown alone, for the tab's session (`sessionStorage`) — never
|
|
72
|
-
* hidden for good: it is a live state, like keksdose's preview banner, which a demo user
|
|
73
|
-
* gets instead of. At zero it calls `onEnded`.
|
|
74
|
-
*
|
|
75
|
-
* The countdown is no live region: a sentence read out every minute would drown the
|
|
76
|
-
* page. A screen-reader user meets it at the top of the page, and the end page says
|
|
77
|
-
* the rest.
|
|
78
|
-
*/
|
|
79
|
-
export function DemoBanner({
|
|
80
|
-
expiresAt,
|
|
81
|
-
model,
|
|
82
|
-
access,
|
|
83
|
-
signInHref = "/login",
|
|
84
|
-
onEnded,
|
|
85
|
-
collapseKey = COLLAPSE_KEY,
|
|
86
|
-
now,
|
|
87
|
-
labels: labelsProp,
|
|
88
|
-
landingLabels,
|
|
89
|
-
className,
|
|
90
|
-
...rest
|
|
91
|
-
}: DemoBannerProps) {
|
|
92
|
-
const labels = useDemoLabels(labelsProp);
|
|
93
|
-
const landing = useLandingLabels(landingLabels);
|
|
94
|
-
const accessLink = useAccessAction(access, landingLabels);
|
|
95
|
-
const countdown = useDemoCountdown(expiresAt, { now, onEnded });
|
|
96
|
-
// `sessionStorage`, guarded (lib/safe-storage): blocked storage reads as "not set",
|
|
97
|
-
// and the banner just opens again next time.
|
|
98
|
-
const [collapsed, setCollapsed] = useState(() => readSessionStored(collapseKey) === "1");
|
|
99
|
-
|
|
100
|
-
const toggle = () => {
|
|
101
|
-
const next = !collapsed;
|
|
102
|
-
setCollapsed(next);
|
|
103
|
-
writeSessionStored(collapseKey, next ? "1" : null);
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
return (
|
|
107
|
-
<AlertBanner
|
|
108
|
-
{...rest}
|
|
109
|
-
variant="strip"
|
|
110
|
-
size="sm"
|
|
111
|
-
tone={countdown.warning || countdown.ended ? "warning" : "info"}
|
|
112
|
-
icon={<Timer />}
|
|
113
|
-
data-demo-model={model}
|
|
114
|
-
className={cn("sm:text-sm", className)}
|
|
115
|
-
action={
|
|
116
|
-
<>
|
|
117
|
-
{!collapsed && (
|
|
118
|
-
<>
|
|
119
|
-
<Button href={accessLink.href} variant="accent" size="sm">
|
|
120
|
-
{accessLink.label}
|
|
121
|
-
</Button>
|
|
122
|
-
<Button href={signInHref} variant="secondary" size="sm">
|
|
123
|
-
{landing.signIn}
|
|
124
|
-
</Button>
|
|
125
|
-
</>
|
|
126
|
-
)}
|
|
127
|
-
<IconButton
|
|
128
|
-
size="2xs"
|
|
129
|
-
variant="ghost"
|
|
130
|
-
label={labels.details}
|
|
131
|
-
// The icon alone at every text size (docs/text-size-harmonization.md §10.8):
|
|
132
|
-
// a strip's one disclosure chevron beside its two links, whose state the
|
|
133
|
-
// chevron and `aria-expanded` say; "Details" as text at Large would push the
|
|
134
|
-
// links onto another line of a strip that is meant to stay one.
|
|
135
|
-
labelVisible={false}
|
|
136
|
-
aria-expanded={!collapsed}
|
|
137
|
-
onClick={toggle}
|
|
138
|
-
>
|
|
139
|
-
{collapsed ? <ChevronDown /> : <ChevronUp />}
|
|
140
|
-
</IconButton>
|
|
141
|
-
</>
|
|
142
|
-
}
|
|
143
|
-
>
|
|
144
|
-
<span className="font-semibold">{timeText(countdown, labels)}</span>
|
|
145
|
-
{!collapsed && (
|
|
146
|
-
<>
|
|
147
|
-
{" "}
|
|
148
|
-
<span>{model === "read-only" ? labels.readOnly : labels.sandbox}</span>
|
|
149
|
-
</>
|
|
150
|
-
)}
|
|
151
|
-
</AlertBanner>
|
|
152
|
-
);
|
|
153
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useEffectEvent, useSyncExternalStore } from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The demo's countdown (docs/landing-demo-harmonization.md §5.3, §5.4): the time left to
|
|
5
|
-
* the demo account's end, from `expires_at` (the `TokenResponse`) or `demo_expires_at`
|
|
6
|
-
* (`/auth/me`). The client never decodes the JWT.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/** When the demo ends: an ISO timestamp from the server, epoch milliseconds, or a
|
|
10
|
-
* `Date`. */
|
|
11
|
-
export type DemoExpiry = string | number | Date;
|
|
12
|
-
|
|
13
|
-
/** The last stretch, in minutes, in which the banner turns to the warning tone (§5.4). */
|
|
14
|
-
export const DEMO_WARNING_MINUTES = 10;
|
|
15
|
-
/** Below this many minutes the countdown shows minutes only (§5.4). */
|
|
16
|
-
export const DEMO_MINUTES_ONLY = 60;
|
|
17
|
-
|
|
18
|
-
const MINUTE = 60_000;
|
|
19
|
-
|
|
20
|
-
export interface DemoCountdown {
|
|
21
|
-
/**
|
|
22
|
-
* Whole minutes left, ROUNDED UP — 30 s left is "1 min", and 0 only once the demo has
|
|
23
|
-
* ended. `null` when `expiresAt` cannot be read: the countdown then shows no time and
|
|
24
|
-
* never ends by itself (a parse slip must not throw a visitor out).
|
|
25
|
-
*/
|
|
26
|
-
minutesLeft: number | null;
|
|
27
|
-
/** The display split: whole hours, and the minutes past them. In the last hour
|
|
28
|
-
* (`lastHour`) `hours` is 0 and `minutes` is `minutesLeft`. */
|
|
29
|
-
hours: number;
|
|
30
|
-
minutes: number;
|
|
31
|
-
/** `minutesLeft <= 60`: show minutes only. */
|
|
32
|
-
lastHour: boolean;
|
|
33
|
-
/** `minutesLeft <= 10`: the warning tone. */
|
|
34
|
-
warning: boolean;
|
|
35
|
-
/** The demo's time is up. */
|
|
36
|
-
ended: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** `expiresAt` as epoch milliseconds, or NaN. */
|
|
40
|
-
function expiryMs(expiresAt: DemoExpiry | null | undefined): number {
|
|
41
|
-
if (expiresAt === null || expiresAt === undefined) return Number.NaN;
|
|
42
|
-
if (typeof expiresAt === "number") return expiresAt;
|
|
43
|
-
if (expiresAt instanceof Date) return expiresAt.getTime();
|
|
44
|
-
return Date.parse(expiresAt);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Whole minutes left at `now`, rounded up, never below 0; null for an unreadable end. */
|
|
48
|
-
function minutesAt(expiry: number, now: number): number | null {
|
|
49
|
-
if (!Number.isFinite(expiry)) return null;
|
|
50
|
-
return Math.max(0, Math.ceil((expiry - now) / MINUTE));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** The countdown for `minutesLeft` — see {@link DemoCountdown} for the rounding and the
|
|
54
|
-
* thresholds. (Public as `demoCountdown(expiresAt, now)` until 0.53, deprecated in 0.52,
|
|
55
|
-
* API-4: `useDemoCountdown` with its `now` option is the same countdown.) */
|
|
56
|
-
function countdownOf(minutesLeft: number | null): DemoCountdown {
|
|
57
|
-
if (minutesLeft === null) {
|
|
58
|
-
return { minutesLeft, hours: 0, minutes: 0, lastHour: false, warning: false, ended: false };
|
|
59
|
-
}
|
|
60
|
-
const lastHour = minutesLeft <= DEMO_MINUTES_ONLY;
|
|
61
|
-
return {
|
|
62
|
-
minutesLeft,
|
|
63
|
-
hours: lastHour ? 0 : Math.floor(minutesLeft / 60),
|
|
64
|
-
minutes: lastHour ? minutesLeft : minutesLeft % 60,
|
|
65
|
-
lastHour,
|
|
66
|
-
warning: minutesLeft <= DEMO_WARNING_MINUTES,
|
|
67
|
-
ended: minutesLeft === 0,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface DemoCountdownOptions {
|
|
72
|
-
/**
|
|
73
|
-
* The clock, in epoch milliseconds. Default `Date.now`. A test passes its own (or uses
|
|
74
|
-
* fake timers, which move `Date.now` too). Keep it a stable function — a new one each
|
|
75
|
-
* render re-arms the timer each render.
|
|
76
|
-
*/
|
|
77
|
-
now?: () => number;
|
|
78
|
-
/** Called once when the countdown reaches zero — also on mount, if it already has.
|
|
79
|
-
* The app clears the session and replaces to `/demo/ended` (§5.5). */
|
|
80
|
-
onEnded?: () => void;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* The time left to `expiresAt`, re-rendering when the shown minute changes — one timer
|
|
85
|
-
* to the next minute boundary, not a tick a second — and once more when the tab comes
|
|
86
|
-
* back from the background (a hidden tab's timers are throttled).
|
|
87
|
-
*
|
|
88
|
-
* `onEnded` fires at zero (§5.5). The countdown is the client's, from `expires_at`; the
|
|
89
|
-
* server's answer to a request after the end (a 401) ends the demo as well — the app's
|
|
90
|
-
* 401 handler, not this hook.
|
|
91
|
-
*/
|
|
92
|
-
export function useDemoCountdown(
|
|
93
|
-
expiresAt: DemoExpiry | null | undefined,
|
|
94
|
-
{ now = Date.now, onEnded }: DemoCountdownOptions = {},
|
|
95
|
-
): DemoCountdown {
|
|
96
|
-
const expiry = expiryMs(expiresAt);
|
|
97
|
-
const subscribe = useCallback(
|
|
98
|
-
(notify: () => void) => {
|
|
99
|
-
if (!Number.isFinite(expiry)) return () => {};
|
|
100
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
101
|
-
const arm = () => {
|
|
102
|
-
const left = expiry - now();
|
|
103
|
-
if (left <= 0) return;
|
|
104
|
-
// The rounded-up minute changes when `left` crosses the next whole minute below.
|
|
105
|
-
const delay = left - (Math.ceil(left / MINUTE) - 1) * MINUTE;
|
|
106
|
-
timer = setTimeout(() => {
|
|
107
|
-
notify();
|
|
108
|
-
arm();
|
|
109
|
-
}, delay);
|
|
110
|
-
};
|
|
111
|
-
const onVisible = () => {
|
|
112
|
-
if (document.visibilityState !== "visible") return;
|
|
113
|
-
clearTimeout(timer);
|
|
114
|
-
notify();
|
|
115
|
-
arm();
|
|
116
|
-
};
|
|
117
|
-
arm();
|
|
118
|
-
document.addEventListener("visibilitychange", onVisible);
|
|
119
|
-
return () => {
|
|
120
|
-
clearTimeout(timer);
|
|
121
|
-
document.removeEventListener("visibilitychange", onVisible);
|
|
122
|
-
};
|
|
123
|
-
},
|
|
124
|
-
[expiry, now],
|
|
125
|
-
);
|
|
126
|
-
const snapshot = () => minutesAt(expiry, now());
|
|
127
|
-
const minutesLeft = useSyncExternalStore(subscribe, snapshot, snapshot);
|
|
128
|
-
const countdown = countdownOf(minutesLeft);
|
|
129
|
-
|
|
130
|
-
const fireEnded = useEffectEvent(() => onEnded?.());
|
|
131
|
-
useEffect(() => {
|
|
132
|
-
if (countdown.ended) fireEnded();
|
|
133
|
-
}, [countdown.ended]);
|
|
134
|
-
|
|
135
|
-
return countdown;
|
|
136
|
-
}
|
package/src/demo/demo-ended.tsx
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
2
|
-
import { Hourglass } from "lucide-react";
|
|
3
|
-
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { Button } from "../components/button";
|
|
6
|
-
import { useNoIndex } from "../hooks/use-noindex";
|
|
7
|
-
import type { AuthHeadingLevel } from "../auth/status-parts";
|
|
8
|
-
import { useAccessAction } from "../landing/access";
|
|
9
|
-
import type { AccessChoice } from "../landing/access";
|
|
10
|
-
import { useLandingLabels } from "../landing/landing-labels";
|
|
11
|
-
import type { LandingLabels } from "../landing/landing-labels";
|
|
12
|
-
import { useDemoLabels } from "./demo-labels";
|
|
13
|
-
import type { DemoLabels } from "./demo-labels";
|
|
14
|
-
import type { DemoModel } from "./demo-session";
|
|
15
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
16
|
-
|
|
17
|
-
export interface DemoEndedProps extends Omit<ComponentPropsWithRef<"div">, "children" | "title"> {
|
|
18
|
-
/** Which line the page says about the data (§2.3). */
|
|
19
|
-
model: DemoModel;
|
|
20
|
-
/** "Request access". */
|
|
21
|
-
access: AccessChoice;
|
|
22
|
-
/** "Start a new demo". Default `/demo` — a new demo may start after one ends, within
|
|
23
|
-
* the per-IP window (§2.7). */
|
|
24
|
-
restartHref?: string;
|
|
25
|
-
/** "Sign in". Default `/login`. */
|
|
26
|
-
signInHref?: string;
|
|
27
|
-
/** App content under the line. */
|
|
28
|
-
children?: ReactNode;
|
|
29
|
-
/** `false` adds no `noindex` — for a preview. Default `true` (§4.3). */
|
|
30
|
-
noIndex?: boolean;
|
|
31
|
-
/** Default `h2`, under `AuthLayout`'s `h1`. */
|
|
32
|
-
headingAs?: AuthHeadingLevel;
|
|
33
|
-
labels?: LabelOverride<DemoLabels>;
|
|
34
|
-
/** The access words (`landing` namespace) for this instance. */
|
|
35
|
-
landingLabels?: Partial<LandingLabels>;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The `/demo/ended` page's content (docs/landing-demo-harmonization.md §5.5): "The demo
|
|
40
|
-
* has ended", one line on what became of the data, and three ways on — "Start a new
|
|
41
|
-
* demo", "Request access", "Sign in".
|
|
42
|
-
*
|
|
43
|
-
* Where a demo lands at `expires_at`, or on ANY 401 while the session is a demo: the
|
|
44
|
-
* client clears the session and replaces to `/demo/ended`, never to `/login`. keksdose's
|
|
45
|
-
* expired demo met an unexplained sign-in form. The server deletes the user at the next
|
|
46
|
-
* reap; nothing is kept.
|
|
47
|
-
*
|
|
48
|
-
* Content, like `NotFoundPage`: put it in the app's `AuthLayout` (its logo, language
|
|
49
|
-
* menu and legal footer). It marks the page `noindex`; robots.txt must NOT disallow it,
|
|
50
|
-
* or a crawler could never read that (§10.8).
|
|
51
|
-
*/
|
|
52
|
-
export function DemoEnded({
|
|
53
|
-
model,
|
|
54
|
-
access,
|
|
55
|
-
restartHref = "/demo",
|
|
56
|
-
signInHref = "/login",
|
|
57
|
-
children,
|
|
58
|
-
noIndex = true,
|
|
59
|
-
headingAs: Heading = "h2",
|
|
60
|
-
labels: labelsProp,
|
|
61
|
-
landingLabels,
|
|
62
|
-
className,
|
|
63
|
-
...rest
|
|
64
|
-
}: DemoEndedProps) {
|
|
65
|
-
const labels = useDemoLabels(labelsProp);
|
|
66
|
-
const landing = useLandingLabels(landingLabels);
|
|
67
|
-
const accessLink = useAccessAction(access, landingLabels);
|
|
68
|
-
useNoIndex(noIndex);
|
|
69
|
-
return (
|
|
70
|
-
<div {...rest} className={cn("flex flex-col items-center gap-2 py-4 text-center", className)}>
|
|
71
|
-
<Hourglass aria-hidden className="size-10 text-placeholder" />
|
|
72
|
-
<Heading className="mt-2 text-xl font-semibold text-primary">{labels.endedTitle}</Heading>
|
|
73
|
-
<p className="max-w-prose text-sm text-secondary">
|
|
74
|
-
{model === "sandbox" ? labels.endedSandbox : labels.endedReadOnly}
|
|
75
|
-
</p>
|
|
76
|
-
{children}
|
|
77
|
-
<div className="mt-4 flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap sm:justify-center">
|
|
78
|
-
<Button href={restartHref} variant="accent">
|
|
79
|
-
{labels.restart}
|
|
80
|
-
</Button>
|
|
81
|
-
<Button href={accessLink.href} variant="secondary">
|
|
82
|
-
{accessLink.label}
|
|
83
|
-
</Button>
|
|
84
|
-
<Button href={signInHref} variant="secondary">
|
|
85
|
-
{landing.signIn}
|
|
86
|
-
</Button>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
);
|
|
90
|
-
}
|
package/src/demo/demo-labels.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The demo's words (docs/landing-demo-harmonization.md §5) — the `demo` namespace of
|
|
5
|
-
* `<UiKitProvider labels>`: `DemoStart`'s progress and refusals, `DemoBanner`'s
|
|
6
|
-
* countdown and model line, `DemoEnded`, and the reason of the read-only lock.
|
|
7
|
-
*
|
|
8
|
-
* "Demo" means the demo session and the shared demo data it shows (§2.10) — never
|
|
9
|
-
* keksdose's blur toggle, which is "Presentation mode" now. "Request access" and "Sign
|
|
10
|
-
* in" are the `landing` namespace's, so they read the same on every public page.
|
|
11
|
-
*/
|
|
12
|
-
export interface DemoLabels {
|
|
13
|
-
/** `DemoStart` while the demo is being created. */
|
|
14
|
-
starting: string;
|
|
15
|
-
/** `demo_rate_limited`: too many demos from one network, given the wait in whole
|
|
16
|
-
* minutes from `Retry-After` — or `undefined` without one. */
|
|
17
|
-
rateLimited: (minutes?: number) => string;
|
|
18
|
-
/** `demo_capacity`: the live cap is reached. */
|
|
19
|
-
capacity: string;
|
|
20
|
-
/** `demo_disabled` and `demo_not_ready`: the demo is off, or its data isn't there. */
|
|
21
|
-
unavailable: string;
|
|
22
|
-
/** Any other failure — the network, a 500. */
|
|
23
|
-
failed: string;
|
|
24
|
-
/** `DemoStart`'s way out after a refusal, to the landing. */
|
|
25
|
-
backToStart: string;
|
|
26
|
-
/** The banner's countdown with an hour or more left: "Demo · 23 h 12 min left". */
|
|
27
|
-
hoursLeft: (hours: number, minutes: number) => string;
|
|
28
|
-
/** …and in the last hour, minutes only: "Demo · 50 min left". */
|
|
29
|
-
minutesLeft: (minutes: number) => string;
|
|
30
|
-
/** The banner's word when the end is unknown (no readable `expiresAt`). */
|
|
31
|
-
badge: string;
|
|
32
|
-
/** The banner's line for model R, shared read-only data. */
|
|
33
|
-
readOnly: string;
|
|
34
|
-
/** The banner's line for model S, a sandbox of one's own. */
|
|
35
|
-
sandbox: string;
|
|
36
|
-
/** The name of the banner's show/hide toggle (`aria-expanded` says which). */
|
|
37
|
-
details: string;
|
|
38
|
-
/** The reason a locked commit shows in a read-only demo (model R) — for the app's
|
|
39
|
-
* `<WriteLockProvider locked reason={…}>` (§5.4). */
|
|
40
|
-
writeLocked: string;
|
|
41
|
-
/** `DemoEnded`'s heading; also the banner's text at zero. */
|
|
42
|
-
endedTitle: string;
|
|
43
|
-
/** `DemoEnded`'s line for model R. */
|
|
44
|
-
endedReadOnly: string;
|
|
45
|
-
/** `DemoEnded`'s line for model S. */
|
|
46
|
-
endedSandbox: string;
|
|
47
|
-
/** `DemoEnded`'s first action, to `/demo`. */
|
|
48
|
-
restart: string;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export const DEFAULT_DEMO_LABELS: DemoLabels = {
|
|
52
|
-
starting: "Starting the demo…",
|
|
53
|
-
rateLimited: (minutes) =>
|
|
54
|
-
minutes
|
|
55
|
-
? `Too many demos from this network. Try again in ${minutes} min.`
|
|
56
|
-
: "Too many demos from this network. Try again later.",
|
|
57
|
-
capacity: "The demo is full right now. Try again later.",
|
|
58
|
-
unavailable: "The demo isn’t available right now.",
|
|
59
|
-
failed: "The demo could not be started. Please try again.",
|
|
60
|
-
backToStart: "Back to the start page",
|
|
61
|
-
hoursLeft: (hours, minutes) => `Demo · ${hours} h ${minutes} min left`,
|
|
62
|
-
minutesLeft: (minutes) => `Demo · ${minutes} min left`,
|
|
63
|
-
badge: "Demo",
|
|
64
|
-
readOnly: "You’re looking at sample data. Changes aren’t possible.",
|
|
65
|
-
sandbox: "Your own work is deleted when the demo ends.",
|
|
66
|
-
details: "Demo details",
|
|
67
|
-
writeLocked: "Not possible in the demo.",
|
|
68
|
-
endedTitle: "The demo has ended",
|
|
69
|
-
endedReadOnly: "Sample data is reset regularly.",
|
|
70
|
-
endedSandbox: "Sample data is reset regularly; your own work from the demo is deleted.",
|
|
71
|
-
restart: "Start a new demo",
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
/** The `demo` namespace, resolved: English, then the provider, then `labels`. The app
|
|
75
|
-
* reads `writeLocked` from here for its `WriteLockProvider`. */
|
|
76
|
-
export function useDemoLabels(labels?: LabelOverride<DemoLabels>): DemoLabels {
|
|
77
|
-
return useKitLabels("demo", DEFAULT_DEMO_LABELS, labels);
|
|
78
|
-
}
|
package/src/demo/demo-session.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The two demo models (docs/landing-demo-harmonization.md §2.3):
|
|
3
|
-
*
|
|
4
|
-
* - `read-only` (R) — keksdose and kastlan: one pre-filled shared dataset a throwaway
|
|
5
|
-
* demo user may look at but not change;
|
|
6
|
-
* - `sandbox` (S) — Kurvenschmiede: the demo user reads system-owned worked examples and
|
|
7
|
-
* may create or copy work of its own, deleted with the demo account.
|
|
8
|
-
*/
|
|
9
|
-
export type DemoModel = "read-only" | "sandbox";
|
|
10
|
-
|
|
11
|
-
/** The fields of an `/auth/me` answer {@link isDemoSession} reads — server-kit's
|
|
12
|
-
* `UserResponse.is_demo` (0.5: and `demo_expires_at`), or a client's camel-cased copy. */
|
|
13
|
-
export interface DemoSessionUser {
|
|
14
|
-
is_demo?: boolean | null;
|
|
15
|
-
isDemo?: boolean | null;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Whether the signed-in user is a demo (§5, §6.5): server-kit's `is_demo` on
|
|
20
|
-
* `/auth/me`, or a client's `isDemo`. `false` for no user at all.
|
|
21
|
-
*
|
|
22
|
-
* What the client branches on: the demo banner instead of keksdose's preview banner, the
|
|
23
|
-
* header's "Continue the demo", a 401 that ends at `/demo/ended` instead of `/login`, and
|
|
24
|
-
* the crash reporter, which files nothing for a demo:
|
|
25
|
-
*
|
|
26
|
-
* ```ts
|
|
27
|
-
* createCrashReporter({ …, suppress: () => isDemoSession(useAuth.getState().user) });
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export function isDemoSession(me: DemoSessionUser | null | undefined): boolean {
|
|
31
|
-
return me?.is_demo === true || me?.isDemo === true;
|
|
32
|
-
}
|
package/src/demo/demo-start.tsx
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef } from "react";
|
|
3
|
-
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { AlertBanner } from "../components/alert-banner";
|
|
6
|
-
import { Button } from "../components/button";
|
|
7
|
-
import { Spinner } from "../components/spinner";
|
|
8
|
-
import { useNoIndex } from "../hooks/use-noindex";
|
|
9
|
-
import { authErrorCode, isRateLimited, retryAfterSeconds } from "../auth/auth-errors";
|
|
10
|
-
import { useOncePerKey } from "../auth/status-parts";
|
|
11
|
-
import { useAccessAction } from "../landing/access";
|
|
12
|
-
import type { AccessChoice } from "../landing/access";
|
|
13
|
-
import type { LandingLabels } from "../landing/landing-labels";
|
|
14
|
-
import { useDemoLabels } from "./demo-labels";
|
|
15
|
-
import type { DemoLabels } from "./demo-labels";
|
|
16
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
17
|
-
|
|
18
|
-
/** Why a start was refused, in the page's terms (§5.2). */
|
|
19
|
-
type Refusal =
|
|
20
|
-
| { reason: "rateLimited"; minutes?: number }
|
|
21
|
-
| { reason: "capacity" }
|
|
22
|
-
| { reason: "unavailable" }
|
|
23
|
-
| { reason: "failed" };
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The server's answer to `POST /auth/demo-session`, read as a refusal (§5.1, §6.2):
|
|
27
|
-
* `demo_rate_limited` (429, with `Retry-After`), `demo_capacity` (429, without),
|
|
28
|
-
* `demo_disabled` (404) and `demo_not_ready` (503) by their codes; a bare 429 as the
|
|
29
|
-
* per-IP window too; anything else is a plain failure.
|
|
30
|
-
*/
|
|
31
|
-
function refusalOf(error: unknown): Refusal {
|
|
32
|
-
const code = authErrorCode(error);
|
|
33
|
-
if (code === "demo_capacity") return { reason: "capacity" };
|
|
34
|
-
if (code === "demo_disabled" || code === "demo_not_ready") return { reason: "unavailable" };
|
|
35
|
-
if (code === "demo_rate_limited" || (code === undefined && isRateLimited(error))) {
|
|
36
|
-
const seconds = retryAfterSeconds(error);
|
|
37
|
-
return { reason: "rateLimited", minutes: seconds ? Math.ceil(seconds / 60) : undefined };
|
|
38
|
-
}
|
|
39
|
-
return { reason: "failed" };
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function messageOf(refusal: Refusal, labels: DemoLabels): string {
|
|
43
|
-
switch (refusal.reason) {
|
|
44
|
-
case "rateLimited":
|
|
45
|
-
return labels.rateLimited(refusal.minutes);
|
|
46
|
-
case "capacity":
|
|
47
|
-
return labels.capacity;
|
|
48
|
-
case "unavailable":
|
|
49
|
-
return labels.unavailable;
|
|
50
|
-
case "failed":
|
|
51
|
-
return labels.failed;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** The one start a mount makes. */
|
|
56
|
-
const ONCE = "demo";
|
|
57
|
-
|
|
58
|
-
export interface DemoStartProps<T> extends Omit<ComponentPropsWithRef<"div">, "children"> {
|
|
59
|
-
/**
|
|
60
|
-
* Create the demo: the app's `POST /auth/demo-session {locale}`. Resolve with what it
|
|
61
|
-
* answered (the `TokenResponse`, `refresh_token: null`, `expires_at`); reject with the
|
|
62
|
-
* client's error — the codes are read out of it. Called once per mount.
|
|
63
|
-
*/
|
|
64
|
-
start: () => Promise<T>;
|
|
65
|
-
/** The demo exists: store the session (and, for kastlan, `kastlan.demoSession`) and
|
|
66
|
-
* replace to the app's home. The page keeps saying "Starting the demo…" meanwhile. */
|
|
67
|
-
onStarted: (session: T) => void;
|
|
68
|
-
/** "Request access" beside a refusal. */
|
|
69
|
-
access: AccessChoice;
|
|
70
|
-
/** "Back to the start page". Default `/`. */
|
|
71
|
-
backHref?: string;
|
|
72
|
-
/** `false` adds no `noindex` — for a preview. Default `true`: `/demo` is never indexed
|
|
73
|
-
* (§4.3). */
|
|
74
|
-
noIndex?: boolean;
|
|
75
|
-
labels?: LabelOverride<DemoLabels>;
|
|
76
|
-
/** The access words (`landing` namespace) for this instance. */
|
|
77
|
-
landingLabels?: Partial<LandingLabels>;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* The `/demo` page's content (docs/landing-demo-harmonization.md §5.2): it starts the
|
|
82
|
-
* demo ONCE — StrictMode's double mount included, keksdose's ref guard — and says
|
|
83
|
-
* "Starting the demo…" until the app has the session and has moved on.
|
|
84
|
-
*
|
|
85
|
-
* A refusal says why, in the visitor's words, and offers "Request access" and "Back to
|
|
86
|
-
* the start page":
|
|
87
|
-
*
|
|
88
|
-
* | code | says |
|
|
89
|
-
* |---|---|
|
|
90
|
-
* | `demo_rate_limited` (429) | "Too many demos from this network. Try again in N min." — N from `Retry-After` |
|
|
91
|
-
* | `demo_capacity` (429) | "The demo is full right now. Try again later." |
|
|
92
|
-
* | `demo_disabled` (404), `demo_not_ready` (503) | "The demo isn't available right now." |
|
|
93
|
-
* | anything else | "The demo could not be started. Please try again." |
|
|
94
|
-
*
|
|
95
|
-
* keksdose fell back to `/register` with a toast; registration is invitation-only now,
|
|
96
|
-
* so the way on is the access mail.
|
|
97
|
-
*
|
|
98
|
-
* Put it in the app's `AuthLayout`. A live demo session never reaches it: the `/demo`
|
|
99
|
-
* route sits in `RedirectIfAuthed` WITHOUT `allowDemo`, which continues the live demo at
|
|
100
|
-
* its resume target instead of starting a second one. A cold start is the kit's
|
|
101
|
-
* `ServerWakeNotice`'s, once the app's watcher counts this POST
|
|
102
|
-
* (`watchReadsAnd(/\/auth\/demo-session\b/)`).
|
|
103
|
-
*/
|
|
104
|
-
export function DemoStart<T>({
|
|
105
|
-
start,
|
|
106
|
-
onStarted,
|
|
107
|
-
access,
|
|
108
|
-
backHref = "/",
|
|
109
|
-
noIndex = true,
|
|
110
|
-
labels: labelsProp,
|
|
111
|
-
landingLabels,
|
|
112
|
-
className,
|
|
113
|
-
...rest
|
|
114
|
-
}: DemoStartProps<T>) {
|
|
115
|
-
const labels = useDemoLabels(labelsProp);
|
|
116
|
-
const accessLink = useAccessAction(access, landingLabels);
|
|
117
|
-
const [refusal, setRefusal] = useState<Refusal | null>(null);
|
|
118
|
-
useNoIndex(noIndex);
|
|
119
|
-
useOncePerKey<T>(
|
|
120
|
-
ONCE,
|
|
121
|
-
() => start(),
|
|
122
|
-
(_key, result) => {
|
|
123
|
-
if (result.ok) onStarted(result.value);
|
|
124
|
-
else setRefusal(refusalOf(result.error));
|
|
125
|
-
},
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
return (
|
|
129
|
-
<div {...rest} className={cn("flex flex-col items-center gap-4 py-4 text-center", className)}>
|
|
130
|
-
{/* One live region, there from the start, so the refusal that replaces the
|
|
131
|
-
progress line is announced (a region inserted with its text often is not). */}
|
|
132
|
-
<div role="status" aria-live="polite" className="w-full">
|
|
133
|
-
{refusal === null ? (
|
|
134
|
-
<p className="flex items-center justify-center gap-2 text-sm text-secondary">
|
|
135
|
-
<Spinner label={null} className="size-5" />
|
|
136
|
-
{labels.starting}
|
|
137
|
-
</p>
|
|
138
|
-
) : (
|
|
139
|
-
<AlertBanner tone={refusal.reason === "failed" ? "danger" : "warning"} className="text-start">
|
|
140
|
-
{messageOf(refusal, labels)}
|
|
141
|
-
</AlertBanner>
|
|
142
|
-
)}
|
|
143
|
-
</div>
|
|
144
|
-
{refusal !== null && (
|
|
145
|
-
<div className="flex flex-wrap justify-center gap-3">
|
|
146
|
-
<Button href={accessLink.href} variant="accent">
|
|
147
|
-
{accessLink.label}
|
|
148
|
-
</Button>
|
|
149
|
-
<Button href={backHref} variant="secondary">
|
|
150
|
-
{labels.backToStart}
|
|
151
|
-
</Button>
|
|
152
|
-
</div>
|
|
153
|
-
)}
|
|
154
|
-
</div>
|
|
155
|
-
);
|
|
156
|
-
}
|