@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/landing/page-seo.ts
DELETED
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Search-engine helpers for the public landing page (docs/landing-demo-harmonization.md
|
|
5
|
-
* §4.3): the hook that declares a page's canonical URL, title, description and JSON-LD,
|
|
6
|
-
* and the two pure helpers each app's SEO test is built from.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/** What {@link usePageSeo} declares for a page. */
|
|
10
|
-
export interface PageSeo {
|
|
11
|
-
canonicalPath: string;
|
|
12
|
-
title?: string;
|
|
13
|
-
description?: string;
|
|
14
|
-
/** Structured data for this page, as the object (not a string). Injected as an
|
|
15
|
-
* `application/ld+json` DATA BLOCK — a script element the browser never executes,
|
|
16
|
-
* which is also why it can be added here rather than in `index.html`: the CSP
|
|
17
|
-
* carries a HASH of the one inline script that file is allowed to have, and
|
|
18
|
-
* `csp-inline-script.test.ts` fails the build on a second one (live #250). */
|
|
19
|
-
jsonLd?: Record<string, unknown>;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Declares the current page's canonical URL — and optionally its title and meta
|
|
24
|
-
* description — while the calling component is mounted (feedback #129).
|
|
25
|
-
*
|
|
26
|
-
* Client-side because there is nowhere else to put it: the SPA is served by
|
|
27
|
-
* Caddy's `try_files … /index.html`, so every route shares one static head.
|
|
28
|
-
* Googlebot renders JS and reads the canonical from the RENDERED DOM, which is
|
|
29
|
-
* what makes this work; non-rendering scrapers (WhatsApp, Slack) only ever see
|
|
30
|
-
* index.html's static tags, which is why those stay in place as the fallback.
|
|
31
|
-
*
|
|
32
|
-
* The href is resolved against `window.location.origin` rather than hardcoded, so
|
|
33
|
-
* a preview deployment or the VPS host stays self-referential instead of pointing
|
|
34
|
-
* every copy of the app at production.
|
|
35
|
-
*
|
|
36
|
-
* The cleanup matters for the same reason as in {@link useNoIndex}: an SPA
|
|
37
|
-
* navigation from the landing page into the app must not leave the landing's
|
|
38
|
-
* canonical (or title) behind on an app page.
|
|
39
|
-
*
|
|
40
|
-
* 0.31 (§4.3): keksdose's `usePageSeo` (shared/hooks/use-page-seo.ts), verbatim. The
|
|
41
|
-
* landing calls it with `canonicalPath: "/"` on both `/` and `/welcome`, so the two URLs
|
|
42
|
-
* of one page are one result; there are no per-language URLs and no hreflang.
|
|
43
|
-
*/
|
|
44
|
-
export function usePageSeo(seo: PageSeo): void {
|
|
45
|
-
usePageSeoIf(seo);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* @internal {@link usePageSeo}, or nothing for `null` — for a component that declares a
|
|
50
|
-
* page only sometimes (`PublicPage`'s `seo`): hooks cannot be called conditionally, so the
|
|
51
|
-
* switch is the argument, as `useNoIndex(active)` has it.
|
|
52
|
-
*/
|
|
53
|
-
export function usePageSeoIf(seo: PageSeo | null): void {
|
|
54
|
-
const canonicalPath = seo?.canonicalPath;
|
|
55
|
-
const title = seo?.title;
|
|
56
|
-
const description = seo?.description;
|
|
57
|
-
const jsonLd = seo?.jsonLd;
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
if (canonicalPath === undefined) return;
|
|
60
|
-
const link = document.createElement("link");
|
|
61
|
-
link.rel = "canonical";
|
|
62
|
-
link.href = new URL(canonicalPath, window.location.origin).toString();
|
|
63
|
-
document.head.appendChild(link);
|
|
64
|
-
|
|
65
|
-
const previousTitle = document.title;
|
|
66
|
-
if (title) document.title = title;
|
|
67
|
-
|
|
68
|
-
// The description tag ships in index.html, so upsert rather than append —
|
|
69
|
-
// two `meta[name=description]` tags would be a coin flip for the scraper.
|
|
70
|
-
const meta = description ? document.head.querySelector<HTMLMetaElement>('meta[name="description"]') : null;
|
|
71
|
-
const previousDescription = meta?.content;
|
|
72
|
-
if (meta && description) meta.content = description;
|
|
73
|
-
|
|
74
|
-
let ld: HTMLScriptElement | null = null;
|
|
75
|
-
if (jsonLd) {
|
|
76
|
-
ld = document.createElement("script");
|
|
77
|
-
ld.type = "application/ld+json";
|
|
78
|
-
ld.textContent = JSON.stringify(jsonLd);
|
|
79
|
-
document.head.appendChild(ld);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return () => {
|
|
83
|
-
link.remove();
|
|
84
|
-
ld?.remove();
|
|
85
|
-
if (title) document.title = previousTitle;
|
|
86
|
-
if (meta && previousDescription !== undefined) meta.content = previousDescription;
|
|
87
|
-
};
|
|
88
|
-
// `jsonLd` is built inline by the caller, so it is a new object every render and
|
|
89
|
-
// cannot be a dependency — it is derived from `title`/`description`, which are.
|
|
90
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
91
|
-
}, [canonicalPath, title, description]);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/* ── The SEO test's helpers ──────────────────────────────────────────────── */
|
|
95
|
-
|
|
96
|
-
/** What a search result shows of the landing, in one language. */
|
|
97
|
-
export interface SeoCopy {
|
|
98
|
-
/** The page title (`landing.seo.title`): "Keksdose — envelope budgeting". */
|
|
99
|
-
title: string;
|
|
100
|
-
/** The meta description. */
|
|
101
|
-
description: string;
|
|
102
|
-
/** The product name the title carries, before or after its tagline. */
|
|
103
|
-
brand: string;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** The width budgets, as characters. */
|
|
107
|
-
export interface SeoCopyLimits {
|
|
108
|
-
/** Default 60: a result's title is cut around 580px. */
|
|
109
|
-
maxTitle?: number;
|
|
110
|
-
/** Default 155: a snippet is cut around 920px. */
|
|
111
|
-
maxDescription?: number;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export type SeoCopyProblemCode =
|
|
115
|
-
| "title-empty"
|
|
116
|
-
| "description-empty"
|
|
117
|
-
| "title-too-long"
|
|
118
|
-
| "description-too-long"
|
|
119
|
-
| "title-without-brand"
|
|
120
|
-
| "description-repeats-title";
|
|
121
|
-
|
|
122
|
-
/** One thing wrong with a language's copy. `message` is for the test's failure output. */
|
|
123
|
-
export interface SeoCopyProblem {
|
|
124
|
-
code: SeoCopyProblemCode;
|
|
125
|
-
message: string;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** Characters as a reader counts them: code points, so an emoji or a rare CJK character
|
|
129
|
-
* is one, not two UTF-16 units. */
|
|
130
|
-
const length = (text: string) => Array.from(text).length;
|
|
131
|
-
|
|
132
|
-
const escapeRegExp = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
133
|
-
|
|
134
|
-
/** The separators a title puts between the brand and its tagline. */
|
|
135
|
-
const SEPARATOR = "\\s*[—–\\-|:·•]\\s*";
|
|
136
|
-
|
|
137
|
-
/** The title without the brand and its separator, or `null` when the brand is in
|
|
138
|
-
* neither place. */
|
|
139
|
-
function taglineOf(title: string, brand: string): string | null {
|
|
140
|
-
const name = escapeRegExp(brand.trim());
|
|
141
|
-
const leading = new RegExp(`^${name}${SEPARATOR}`, "i");
|
|
142
|
-
if (leading.test(title)) return title.replace(leading, "").trim();
|
|
143
|
-
const trailing = new RegExp(`${SEPARATOR}${name}$`, "i");
|
|
144
|
-
if (trailing.test(title)) return title.replace(trailing, "").trim();
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* What is wrong with one language's search-result copy (§4.3) — an empty list when
|
|
150
|
-
* nothing is. keksdose's landing-seo.test.ts (live #305), made reusable:
|
|
151
|
-
*
|
|
152
|
-
* - the title fits `maxTitle` characters (60) and the description `maxDescription`
|
|
153
|
-
* (155) — conservative stand-ins for Google's pixel budgets; German is the language
|
|
154
|
-
* most likely to blow through them, and what gets cut is always the end;
|
|
155
|
-
* - the title carries the brand, before or after its tagline ("Keksdose — …");
|
|
156
|
-
* - the description does not open with the title's tagline again — a snippet that
|
|
157
|
-
* repeats the line above it spends its first forty characters saying nothing new.
|
|
158
|
-
*
|
|
159
|
-
* ```ts
|
|
160
|
-
* for (const [locale, bundle] of Object.entries(LOCALES)) {
|
|
161
|
-
* it(`fits ${locale} into a search result`, () => {
|
|
162
|
-
* expect(seoCopyProblems({ ...bundle.landing.seo, brand: "Keksdose" })).toEqual([]);
|
|
163
|
-
* });
|
|
164
|
-
* }
|
|
165
|
-
* ```
|
|
166
|
-
*/
|
|
167
|
-
export function seoCopyProblems(copy: SeoCopy, limits: SeoCopyLimits = {}): SeoCopyProblem[] {
|
|
168
|
-
const { maxTitle = 60, maxDescription = 155 } = limits;
|
|
169
|
-
const title = copy.title.replace(/\s+/g, " ").trim();
|
|
170
|
-
const description = copy.description.replace(/\s+/g, " ").trim();
|
|
171
|
-
const problems: SeoCopyProblem[] = [];
|
|
172
|
-
if (!title) problems.push({ code: "title-empty", message: "the title is empty" });
|
|
173
|
-
if (!description) problems.push({ code: "description-empty", message: "the description is empty" });
|
|
174
|
-
if (length(title) > maxTitle) {
|
|
175
|
-
problems.push({
|
|
176
|
-
code: "title-too-long",
|
|
177
|
-
message: `the title is ${length(title)} characters, over ${maxTitle}: "${title}"`,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
if (length(description) > maxDescription) {
|
|
181
|
-
problems.push({
|
|
182
|
-
code: "description-too-long",
|
|
183
|
-
message: `the description is ${length(description)} characters, over ${maxDescription}: "${description}"`,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
if (!title) return problems;
|
|
187
|
-
const tagline = taglineOf(title, copy.brand);
|
|
188
|
-
if (tagline === null) {
|
|
189
|
-
problems.push({
|
|
190
|
-
code: "title-without-brand",
|
|
191
|
-
message: `the title does not start or end with "${copy.brand}" and a separator: "${title}"`,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
const repeated = (tagline ?? title).toLowerCase();
|
|
195
|
-
if (repeated && description.toLowerCase().startsWith(repeated)) {
|
|
196
|
-
problems.push({
|
|
197
|
-
code: "description-repeats-title",
|
|
198
|
-
message: `the description opens with the title's tagline "${tagline ?? title}"`,
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
return problems;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/** The five named references and the numeric ones — enough for a meta tag's text. */
|
|
205
|
-
function decodeEntities(text: string): string {
|
|
206
|
-
const named: Record<string, string> = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'", nbsp: " " };
|
|
207
|
-
return text.replace(/&(#x[\da-f]+|#\d+|[a-z]+);/gi, (whole, ref: string) => {
|
|
208
|
-
if (ref[0] === "#") {
|
|
209
|
-
const code = ref[1] === "x" || ref[1] === "X" ? parseInt(ref.slice(2), 16) : parseInt(ref.slice(1), 10);
|
|
210
|
-
return Number.isFinite(code) ? String.fromCodePoint(code) : whole;
|
|
211
|
-
}
|
|
212
|
-
return named[ref.toLowerCase()] ?? whole;
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** A tag's attributes, names lower-cased; values double-, single- or un-quoted. */
|
|
217
|
-
function attributesOf(tag: string): Map<string, string> {
|
|
218
|
-
const found = new Map<string, string>();
|
|
219
|
-
for (const m of tag.matchAll(/([^\s=/<>"']+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+))/g)) {
|
|
220
|
-
found.set(m[1]!.toLowerCase(), m[2] ?? m[3] ?? m[4] ?? "");
|
|
221
|
-
}
|
|
222
|
-
return found;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* The `content` of the first `<meta>` in `html` that `selector` picks, whitespace
|
|
227
|
-
* collapsed and entities decoded — or `undefined` when there is none. For each app's
|
|
228
|
-
* parity test (§4.3): `index.html`'s static description and `og:` tags must equal the
|
|
229
|
-
* default language's strings, because a scraper that runs no script (WhatsApp, Slack)
|
|
230
|
-
* sees only those.
|
|
231
|
-
*
|
|
232
|
-
* `selector` names attributes, as in CSS — `meta[name="description"]`,
|
|
233
|
-
* `[property="og:title"]` or just `property="og:description"` — and every one named must
|
|
234
|
-
* match. A `RegExp` is matched against the tag's source instead (keksdose's form).
|
|
235
|
-
* String parsing, not a DOM: the test runs under `@vitest-environment node`.
|
|
236
|
-
*
|
|
237
|
-
* ```ts
|
|
238
|
-
* expect(metaContent(html, 'meta[name="description"]')).toBe(de.landing.seo.description);
|
|
239
|
-
* ```
|
|
240
|
-
*/
|
|
241
|
-
export function metaContent(html: string, selector: string | RegExp): string | undefined {
|
|
242
|
-
const wanted =
|
|
243
|
-
typeof selector === "string"
|
|
244
|
-
? Array.from(selector.matchAll(/([\w:.-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g), (m) => [
|
|
245
|
-
m[1]!.toLowerCase(),
|
|
246
|
-
m[2] ?? m[3] ?? "",
|
|
247
|
-
])
|
|
248
|
-
: null;
|
|
249
|
-
if (wanted !== null && wanted.length === 0) {
|
|
250
|
-
throw new Error(`metaContent: the selector names no attribute: ${selector as string}`);
|
|
251
|
-
}
|
|
252
|
-
const pattern = selector instanceof RegExp ? new RegExp(selector.source, selector.flags.replace("g", "")) : null;
|
|
253
|
-
for (const tag of html.match(/<meta\b[^>]*>/gi) ?? []) {
|
|
254
|
-
const attrs = attributesOf(tag);
|
|
255
|
-
const matches = pattern ? pattern.test(tag) : wanted!.every(([name, value]) => attrs.get(name!) === value);
|
|
256
|
-
if (!matches) continue;
|
|
257
|
-
const content = attrs.get("content");
|
|
258
|
-
return content === undefined ? undefined : decodeEntities(content).replace(/\s+/g, " ").trim();
|
|
259
|
-
}
|
|
260
|
-
return undefined;
|
|
261
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
import { Button } from "../components/button";
|
|
4
|
-
import { usePhoneLayout } from "../hooks/use-breakpoint";
|
|
5
|
-
import { TopBar } from "../shell/top-bar";
|
|
6
|
-
import type { TopBarProps } from "../shell/top-bar";
|
|
7
|
-
import { TopBarBrand } from "../shell/top-bar-brand";
|
|
8
|
-
import { useAccessAction } from "./access";
|
|
9
|
-
import type { AccessChoice } from "./access";
|
|
10
|
-
import { useLandingLabels } from "./landing-labels";
|
|
11
|
-
import type { LandingLabels } from "./landing-labels";
|
|
12
|
-
import type { LandingSession } from "./landing-actions";
|
|
13
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
14
|
-
|
|
15
|
-
/** The header's brand: what `TopBarBrand` draws. */
|
|
16
|
-
export interface PublicHeaderBrand {
|
|
17
|
-
/** The brand mark — an SVG or an `<img alt="">`. */
|
|
18
|
-
logo: ReactNode;
|
|
19
|
-
/** The product name beside it, and the link's accessible name. */
|
|
20
|
-
name: ReactNode;
|
|
21
|
-
/** See `TopBarBrand`. Default `sm`: the logo alone on a phone. */
|
|
22
|
-
collapseBelow?: "sm" | "md" | false;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface PublicHeaderProps extends Omit<TopBarProps, "brand" | "actions" | "children"> {
|
|
26
|
-
brand: PublicHeaderBrand;
|
|
27
|
-
/** Where the brand links. Default `/` without a session and `/welcome` with one —
|
|
28
|
-
* `/` would resume into the app, `/welcome` is always the landing (§3.1). */
|
|
29
|
-
homeHref?: string;
|
|
30
|
-
session: LandingSession;
|
|
31
|
-
access: AccessChoice;
|
|
32
|
-
/** "Sign in". Default `/login`. */
|
|
33
|
-
signInHref?: string;
|
|
34
|
-
/** "Open app" for a real session — the resume target. Default `/`, which resumes
|
|
35
|
-
* through `RootEntry`. */
|
|
36
|
-
openAppHref?: string;
|
|
37
|
-
/** "Continue the demo" for a demo session. Default `/demo`, which continues a live
|
|
38
|
-
* demo (§3.1). */
|
|
39
|
-
demoHref?: string;
|
|
40
|
-
/** The app's `LanguageMenu`, before the actions. */
|
|
41
|
-
languageMenu?: ReactNode;
|
|
42
|
-
/** The app's `ThemeToggle`, before the language menu. */
|
|
43
|
-
themeToggle?: ReactNode;
|
|
44
|
-
labels?: LabelOverride<LandingLabels>;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* The header of every public page (docs/landing-demo-harmonization.md §4.1): the
|
|
49
|
-
* landing, the auth pages, the legal pages and the 404 — keksdose's `LandingHeader`, on
|
|
50
|
-
* the kit's `TopBar` and `TopBarBrand`, with its hard-coded teal turned into `--brand`.
|
|
51
|
-
*
|
|
52
|
-
* | session | actions |
|
|
53
|
-
* |---|---|
|
|
54
|
-
* | none | Sign in (secondary, hidden below `sm`), **Request access** (primary) |
|
|
55
|
-
* | demo | Continue the demo (secondary), **Request access** (primary) |
|
|
56
|
-
* | user | **Open app** (primary) |
|
|
57
|
-
*
|
|
58
|
-
* A demo session is not "signed in" here: it is still offered access, which is the point
|
|
59
|
-
* of the demo (§5.6). In the phone layout (`usePhoneLayout()`) the actions take the kit's `sm` size, so
|
|
60
|
-
* the brand mark, the two controls and two actions fit 390px; "Sign in" gives way below
|
|
61
|
-
* `sm` as in keksdose — the sign-in page is one tap away from "Request access" anyway.
|
|
62
|
-
*/
|
|
63
|
-
export function PublicHeader({
|
|
64
|
-
brand,
|
|
65
|
-
homeHref,
|
|
66
|
-
session,
|
|
67
|
-
access,
|
|
68
|
-
signInHref = "/login",
|
|
69
|
-
openAppHref = "/",
|
|
70
|
-
demoHref = "/demo",
|
|
71
|
-
languageMenu,
|
|
72
|
-
themeToggle,
|
|
73
|
-
labels: labelsProp,
|
|
74
|
-
className,
|
|
75
|
-
...rest
|
|
76
|
-
}: PublicHeaderProps) {
|
|
77
|
-
const labels = useLandingLabels(labelsProp);
|
|
78
|
-
const accessLink = useAccessAction(access, labelsProp);
|
|
79
|
-
const phone = usePhoneLayout();
|
|
80
|
-
const size = phone ? "sm" : "md";
|
|
81
|
-
const home = homeHref ?? (session === "none" ? "/" : "/welcome");
|
|
82
|
-
|
|
83
|
-
const actions =
|
|
84
|
-
session === "user" ? (
|
|
85
|
-
<Button href={openAppHref} variant="accent" size={size}>
|
|
86
|
-
{labels.openApp}
|
|
87
|
-
</Button>
|
|
88
|
-
) : (
|
|
89
|
-
<>
|
|
90
|
-
{session === "demo" ? (
|
|
91
|
-
<Button href={demoHref} variant="secondary" size={size}>
|
|
92
|
-
{labels.continueDemo}
|
|
93
|
-
</Button>
|
|
94
|
-
) : (
|
|
95
|
-
<Button href={signInHref} variant="secondary" size={size} className="max-sm:hidden">
|
|
96
|
-
{labels.signIn}
|
|
97
|
-
</Button>
|
|
98
|
-
)}
|
|
99
|
-
<Button href={accessLink.href} variant="accent" size={size}>
|
|
100
|
-
{accessLink.label}
|
|
101
|
-
</Button>
|
|
102
|
-
</>
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
return (
|
|
106
|
-
<TopBar
|
|
107
|
-
{...rest}
|
|
108
|
-
className={className}
|
|
109
|
-
brand={<TopBarBrand logo={brand.logo} name={brand.name} to={home} collapseBelow={brand.collapseBelow} />}
|
|
110
|
-
actions={
|
|
111
|
-
<>
|
|
112
|
-
{themeToggle}
|
|
113
|
-
{languageMenu}
|
|
114
|
-
<span data-slot="public-header-actions" className="ms-1 flex items-center gap-1.5 sm:gap-2">
|
|
115
|
-
{actions}
|
|
116
|
-
</span>
|
|
117
|
-
</>
|
|
118
|
-
}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { useNoIndex } from "../hooks/use-noindex";
|
|
5
|
-
import { PublicFooter } from "./landing-sections";
|
|
6
|
-
import { usePageSeoIf, type PageSeo } from "./page-seo";
|
|
7
|
-
|
|
8
|
-
export interface PublicPageProps extends Omit<ComponentPropsWithRef<"div">, "title" | "children"> {
|
|
9
|
-
/** The app's public header — the one a signed-out visitor already sees on the landing
|
|
10
|
-
* (`PublicHeader`, keksdose's `LandingHeader`, Kurvenschmiede's). */
|
|
11
|
-
header?: ReactNode;
|
|
12
|
-
/** Default: `<PublicFooter />`, the three legal links (§3.3: one click away from every
|
|
13
|
-
* page a visitor can reach). Pass your own `PublicFooter` for a tagline; `null` for none. */
|
|
14
|
-
footer?: ReactNode;
|
|
15
|
-
/** The page's heading. */
|
|
16
|
-
title: ReactNode;
|
|
17
|
-
/** One or two sentences under the title: what the page is. */
|
|
18
|
-
description?: ReactNode;
|
|
19
|
-
/** Above the title — the app's "← Back" link (`<TextLink icon={ArrowLeft}>`). */
|
|
20
|
-
back?: ReactNode;
|
|
21
|
-
/** Beside the title from `sm` up, under it on a phone: the page's own controls (a
|
|
22
|
-
* region and a month picker on keksdose's /prices). */
|
|
23
|
-
actions?: ReactNode;
|
|
24
|
-
/**
|
|
25
|
-
* What search engines are told, and it has no default on purpose: a public page is
|
|
26
|
-
* either one to find — then it names its canonical path (and title, description,
|
|
27
|
-
* structured data), through {@link usePageSeo} — or one to keep out of the index
|
|
28
|
-
* (`"noindex"`: a 404, a page a link was sent for). `null` declares nothing, for a page
|
|
29
|
-
* that is not the page: a preview inside another (the showcase).
|
|
30
|
-
*/
|
|
31
|
-
seo: PageSeo | "noindex" | null;
|
|
32
|
-
/** The column. `"wide"` (default) is the landing's sections' width, for tiles and
|
|
33
|
-
* tables; `"prose"` the legal pages' reading column. */
|
|
34
|
-
width?: "wide" | "prose";
|
|
35
|
-
/** Default `h1`; a lower level for a page shown inside another (a preview), as the
|
|
36
|
-
* landing's sections take one. */
|
|
37
|
-
headingAs?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
38
|
-
/** `false` draws the column as a `<div>` instead of `<main>`, for a host that has its
|
|
39
|
-
* own `<main>`. Default true. */
|
|
40
|
-
landmark?: boolean;
|
|
41
|
-
children: ReactNode;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const WIDTH = { wide: "max-w-6xl", prose: "max-w-3xl" } as const;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* A public page that is not the landing and not a legal page (0.51, Marcel 2026-10-26):
|
|
48
|
-
* keksdose's regional price snapshot at /prices, and Kurvenschmiede's public pages. The
|
|
49
|
-
* frame every public page has — the app's public header, a column, the public footer — is
|
|
50
|
-
* {@link LegalPage}'s, without the legal parts: no numbered sections, no beta notice, no
|
|
51
|
-
* "Back to home" of its own, and indexed unless it says otherwise.
|
|
52
|
-
*
|
|
53
|
-
* keksdose was about to compose it by hand (`PublicHeader` + a column + `PublicFooter` +
|
|
54
|
-
* `usePageSeo`) for /prices, and Kurvenschmiede will have its next public page outside the
|
|
55
|
-
* shell; each app would have drawn the frame its own way. (KS's visitor pages — /dashboard,
|
|
56
|
-
* /control, /dynamics, /steering — are working screens and stay in the app shell, with
|
|
57
|
-
* `VisitorLegalFooter`; this frame is not for them.)
|
|
58
|
-
* The width is the landing's (`max-w-6xl`), so a link from a feature row lands on a page
|
|
59
|
-
* whose edges line up with the one it came from.
|
|
60
|
-
*
|
|
61
|
-
* `seo` is required: a public page is found or it is not, and forgetting the canonical on
|
|
62
|
-
* a page meant to be found is silent. The kit's words are none — the title, the copy and
|
|
63
|
-
* the back link are the app's.
|
|
64
|
-
*/
|
|
65
|
-
export function PublicPage({
|
|
66
|
-
header,
|
|
67
|
-
footer,
|
|
68
|
-
title,
|
|
69
|
-
description,
|
|
70
|
-
back,
|
|
71
|
-
actions,
|
|
72
|
-
seo,
|
|
73
|
-
width = "wide",
|
|
74
|
-
headingAs: Heading = "h1",
|
|
75
|
-
landmark = true,
|
|
76
|
-
className,
|
|
77
|
-
children,
|
|
78
|
-
...rest
|
|
79
|
-
}: PublicPageProps) {
|
|
80
|
-
useNoIndex(seo === "noindex");
|
|
81
|
-
usePageSeoIf(seo === "noindex" ? null : seo);
|
|
82
|
-
const Main = landmark ? "main" : "div";
|
|
83
|
-
return (
|
|
84
|
-
<div {...rest} data-slot="public-page" className={cn("flex min-h-full flex-col", className)}>
|
|
85
|
-
{header}
|
|
86
|
-
<Main className="flex-1">
|
|
87
|
-
<div data-slot="public-page-column" className={cn("mx-auto w-full px-4 py-12", WIDTH[width])}>
|
|
88
|
-
{back != null && <div className="mb-4 text-sm">{back}</div>}
|
|
89
|
-
<div className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
|
|
90
|
-
<div className="min-w-0">
|
|
91
|
-
<Heading className="text-3xl font-bold tracking-tight break-words text-primary">{title}</Heading>
|
|
92
|
-
{description != null && <p className="mt-3 max-w-2xl text-lg text-secondary">{description}</p>}
|
|
93
|
-
</div>
|
|
94
|
-
{actions != null && (
|
|
95
|
-
<div data-slot="public-page-actions" className="flex shrink-0 flex-wrap items-center gap-2">
|
|
96
|
-
{actions}
|
|
97
|
-
</div>
|
|
98
|
-
)}
|
|
99
|
-
</div>
|
|
100
|
-
<div className="mt-8 space-y-8">{children}</div>
|
|
101
|
-
</div>
|
|
102
|
-
</Main>
|
|
103
|
-
{footer === undefined ? <PublicFooter /> : footer}
|
|
104
|
-
</div>
|
|
105
|
-
);
|
|
106
|
-
}
|