@eifi1/ui-kit 0.53.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -82
- package/dist/account/delete-account-setting.d.ts +3 -2
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +36 -0
- package/dist/auth/auth-errors.js +20 -0
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +2 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +6 -4
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.d.ts +2 -1
- package/dist/components/currency-option-list.js +10 -3
- package/dist/components/currency-option-list.js.map +1 -1
- package/dist/components/currency-select.d.ts +3 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +22 -1
- package/dist/components/danger-confirm.js +52 -30
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +2 -1
- package/dist/components/data-table-filter-popover.js +3 -2
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +33 -3
- package/dist/components/data-table-filters.js +6 -4
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +5 -1
- package/dist/components/dialog-frame.js +6 -2
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +16 -7
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +48 -0
- package/dist/components/modal.js +26 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/stat-tile.d.ts +21 -2
- package/dist/components/stat-tile.js +4 -2
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/currencies.d.ts +16 -2
- package/dist/currencies.js +2 -1
- package/dist/currencies.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-context-labels.js +2 -1
- package/dist/feedback/feedback-context-labels.js.map +1 -1
- package/dist/feedback/feedback-context.d.ts +19 -3
- package/dist/feedback/feedback-context.js +12 -1
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-diagnostics.d.ts +17 -0
- package/dist/feedback/feedback-diagnostics.js +27 -0
- package/dist/feedback/feedback-diagnostics.js.map +1 -0
- package/dist/feedback/feedback-dialog.d.ts +10 -0
- package/dist/feedback/feedback-dialog.js +6 -4
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-record.d.ts +5 -0
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +1 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +3 -0
- package/dist/feedback/feedback-row-detail.js +3 -0
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
- package/dist/feedback/feedback-submit-dialog.js +15 -3
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.d.ts +30 -2
- package/dist/feedback/feedback-submit.js +5 -2
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +2 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +78 -4
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +95 -5
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +74 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +75 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +77 -4
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +77 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +74 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +27 -8
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +36 -4
- package/dist/lib/dates.js +49 -13
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/format.d.ts +37 -2
- package/dist/lib/format.js +25 -1
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/intl-cache.d.ts +4 -2
- package/dist/lib/intl-cache.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/translation-review.d.ts +26 -0
- package/dist/lib/translation-review.js +14 -0
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -341
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -370
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -815
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -594
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -180
- package/src/components/currency-select.tsx +0 -341
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -934
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -281
- package/src/components/data-table-filters.ts +0 -287
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -276
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -789
- package/src/components/modal.tsx +0 -505
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -558
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -725
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -70
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -10
- package/src/feedback/feedback-context.tsx +0 -213
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -440
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -423
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -30
- package/src/feedback/feedback-row-detail.tsx +0 -858
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -118
- package/src/feedback/feedback-submit.tsx +0 -237
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -189
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2057
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1997
- package/src/i18n/locales/fr.ts +0 -2035
- package/src/i18n/locales/hu.ts +0 -2002
- package/src/i18n/locales/it.ts +0 -2012
- package/src/i18n/locales/zh.ts +0 -1910
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1179
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -266
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -522
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -25
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -717
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext } from "react";
|
|
2
|
-
import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { CARD_TITLE_CLASS } from "./settings-card-classes";
|
|
5
|
-
|
|
6
|
-
/** The heading a settings card's title becomes. */
|
|
7
|
-
export type SettingsHeadingTag = "h2" | "h3" | "h4";
|
|
8
|
-
|
|
9
|
-
const SettingsHeadingLevelContext = createContext<SettingsHeadingTag | null>(null);
|
|
10
|
-
|
|
11
|
-
export interface SettingsHeadingLevelProps {
|
|
12
|
-
/** The element every kit setting card below titles itself with. */
|
|
13
|
-
level: SettingsHeadingTag;
|
|
14
|
-
children?: ReactNode;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* The level the kit's setting cards title themselves at (docs/settings-harmonization.md
|
|
19
|
-
* §3.7). Inside {@link SettingsLayout} a card's title is a heading under the group's —
|
|
20
|
-
* `h3` under the desktop's `h2`, `h2` under a phone group page's `h1` — and the layout
|
|
21
|
-
* sets this for every card it renders. Outside one, nothing is set and the same cards
|
|
22
|
-
* keep the plain `div` title they always had, so a card on an app's own page does not
|
|
23
|
-
* suddenly put an `h3` into an outline that has no `h2`.
|
|
24
|
-
*
|
|
25
|
-
* Set it yourself only where an app lays out settings cards without the layout and
|
|
26
|
-
* wants them in its outline: `<SettingsHeadingLevel level="h3">…</SettingsHeadingLevel>`.
|
|
27
|
-
* `ProfileSetting`, `PasswordSetting`, `TwoFactorSetting`, `PasskeysSetting`,
|
|
28
|
-
* `EmailChangeSetting`, `SessionsSetting`, `DataExportSetting`, `DeleteAccountSetting`
|
|
29
|
-
* and `SettingsSection` read it.
|
|
30
|
-
*/
|
|
31
|
-
export function SettingsHeadingLevel({ level, children }: SettingsHeadingLevelProps) {
|
|
32
|
-
return <SettingsHeadingLevelContext.Provider value={level}>{children}</SettingsHeadingLevelContext.Provider>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** The nearest {@link SettingsHeadingLevel}, or `null` outside one. */
|
|
36
|
-
export function useSettingsHeadingLevel(): SettingsHeadingTag | null {
|
|
37
|
-
return useContext(SettingsHeadingLevelContext);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* A setting card's title at the settings type scale: a heading inside a
|
|
42
|
-
* {@link SettingsHeadingLevel}, the plain `div` outside one.
|
|
43
|
-
*
|
|
44
|
-
* As a heading it takes `tabIndex={-1}`: `?focus=` moves focus to the card's heading so a
|
|
45
|
-
* screen reader lands on the card it was sent to (§3.5), and a heading is not focusable
|
|
46
|
-
* otherwise. No outline of its own — the ring round the card marks it.
|
|
47
|
-
*
|
|
48
|
-
* @internal The kit's cards use it; not part of the barrel.
|
|
49
|
-
*/
|
|
50
|
-
export function SettingsCardTitle({ className, ...props }: ComponentPropsWithoutRef<"div">) {
|
|
51
|
-
const level = useSettingsHeadingLevel();
|
|
52
|
-
if (!level) return <div {...props} className={cn(CARD_TITLE_CLASS, className)} />;
|
|
53
|
-
return (
|
|
54
|
-
<SettingsHeading as={level} tabIndex={-1} {...props} className={cn(CARD_TITLE_CLASS, "outline-none", className)} />
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* A heading at a level chosen at run time. Its own component, taking the tag as a prop
|
|
60
|
-
* (as `CardTitle` does), so the element type is a prop and not a value computed in the
|
|
61
|
-
* caller's render.
|
|
62
|
-
*
|
|
63
|
-
* @internal
|
|
64
|
-
*/
|
|
65
|
-
export function SettingsHeading({ as: Tag, ...props }: { as: SettingsHeadingTag } & ComponentPropsWithoutRef<"h2">) {
|
|
66
|
-
return <Tag {...props} />;
|
|
67
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The `settings` namespace (docs/settings-harmonization.md §4.3): the settings page's
|
|
5
|
-
* own words, and the names and help lines of the five core groups every app shares —
|
|
6
|
-
* appearance, account, security, notifications, data (§2.6). An app's own groups bring
|
|
7
|
-
* their own words; any core label may be overridden like any kit label (prop >
|
|
8
|
-
* `<UiKitProvider labels={{ settings }}>` > English).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/** A core group's two strings, as {@link SettingsGroup} takes them. */
|
|
12
|
-
export interface SettingsGroupLabels {
|
|
13
|
-
/** The group's name. */
|
|
14
|
-
title: string;
|
|
15
|
-
/** One line: under the heading, and in the phone list. */
|
|
16
|
-
help: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** The five groups whose words the kit ships (§2.6, §4.2). */
|
|
20
|
-
export type SettingsCoreGroup = "appearance" | "account" | "security" | "notifications" | "data";
|
|
21
|
-
|
|
22
|
-
export interface SettingsLabels {
|
|
23
|
-
/** The page's heading, and the back link's visible text on a phone's group page. */
|
|
24
|
-
title: string;
|
|
25
|
-
/** The search field's accessible name. */
|
|
26
|
-
search: string;
|
|
27
|
-
/** The search field's placeholder. */
|
|
28
|
-
searchPlaceholder: string;
|
|
29
|
-
/** The hit list's accessible name. */
|
|
30
|
-
results: string;
|
|
31
|
-
/** No hits for the trimmed query (§3.4). */
|
|
32
|
-
noMatches: (query: string) => string;
|
|
33
|
-
/** The button beside it that empties the field. */
|
|
34
|
-
clearSearch: string;
|
|
35
|
-
/** The phone's back link's accessible name: "‹ Settings" says where, this says what. */
|
|
36
|
-
back: string;
|
|
37
|
-
/** The sidebar's accessible name (the vertical tablist). */
|
|
38
|
-
sections: string;
|
|
39
|
-
/** A sidebar row's hit badge, read in place of the bare number while searching. */
|
|
40
|
-
matchCount: (count: number) => string;
|
|
41
|
-
/** The core groups' names and help lines. */
|
|
42
|
-
groups: Record<SettingsCoreGroup, SettingsGroupLabels>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export const DEFAULT_SETTINGS_LABELS: SettingsLabels = {
|
|
46
|
-
title: "Settings",
|
|
47
|
-
search: "Search settings",
|
|
48
|
-
searchPlaceholder: "Search settings…",
|
|
49
|
-
results: "Matching settings",
|
|
50
|
-
noMatches: (query) => `No settings match “${query}”.`,
|
|
51
|
-
clearSearch: "Clear search",
|
|
52
|
-
back: "Back to settings",
|
|
53
|
-
sections: "Settings sections",
|
|
54
|
-
matchCount: (count) => (count === 1 ? "1 match" : `${count} matches`),
|
|
55
|
-
groups: {
|
|
56
|
-
appearance: {
|
|
57
|
-
title: "Appearance",
|
|
58
|
-
help: "Language, theme and how the app looks on this device.",
|
|
59
|
-
},
|
|
60
|
-
account: {
|
|
61
|
-
title: "Account",
|
|
62
|
-
help: "Your profile and your email address.",
|
|
63
|
-
},
|
|
64
|
-
security: {
|
|
65
|
-
title: "Security",
|
|
66
|
-
help: "How you sign in, and where you are signed in.",
|
|
67
|
-
},
|
|
68
|
-
notifications: {
|
|
69
|
-
title: "Notifications",
|
|
70
|
-
help: "What you are told about, when, and on which devices.",
|
|
71
|
-
},
|
|
72
|
-
data: {
|
|
73
|
-
title: "Data",
|
|
74
|
-
help: "Export what is yours, or delete it together with your account.",
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* 0.31.1: the `settings` namespace, resolved — English, then the provider, then `labels`.
|
|
81
|
-
* What an app reads for its catalogue's core group titles and help lines, and for the
|
|
82
|
-
* page title "<group> · Settings · <app>" (settings contract §3.1), without restating
|
|
83
|
-
* the namespace and its defaults (Kurvenschmiede's 0.31 adoption).
|
|
84
|
-
*/
|
|
85
|
-
export function useSettingsLabels(labels?: LabelOverride<SettingsLabels>): SettingsLabels {
|
|
86
|
-
return useKitLabels("settings", DEFAULT_SETTINGS_LABELS, labels);
|
|
87
|
-
}
|
|
@@ -1,471 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
2
|
-
import type { ReactElement, ReactNode } from "react";
|
|
3
|
-
import { Link, useHref, useLocation } from "react-router";
|
|
4
|
-
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
5
|
-
import { Button } from "../components/button";
|
|
6
|
-
import { Card } from "../components/card";
|
|
7
|
-
import { EmptyState } from "../components/empty-state";
|
|
8
|
-
import { Tabs } from "../components/tabs";
|
|
9
|
-
import { FOCUS_RING } from "../components/focus-ring";
|
|
10
|
-
import { Chip } from "../components/chip";
|
|
11
|
-
import { List, ListItem } from "../components/list";
|
|
12
|
-
import type { ListItemLinkProps } from "../components/list";
|
|
13
|
-
import { PageHeader } from "../components/page-header";
|
|
14
|
-
import { SearchField } from "../components/search-field";
|
|
15
|
-
import { cn } from "../lib/cn";
|
|
16
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
17
|
-
import { createSearchIndex } from "../search/search-index";
|
|
18
|
-
import type { SearchEntry } from "../search/search-index";
|
|
19
|
-
import { normalizeSettingsBase, settingsHref, settingsKeywords, visibleSettingsEntries } from "./settings-catalogue";
|
|
20
|
-
import type { SettingsEntry, SettingsGroup } from "./settings-catalogue";
|
|
21
|
-
import { SettingsLayoutContext } from "./settings-context";
|
|
22
|
-
import type { SettingsLayoutContextValue } from "./settings-context";
|
|
23
|
-
import { SettingsHeadingLevel } from "./settings-heading";
|
|
24
|
-
import { DEFAULT_SETTINGS_LABELS } from "./settings-labels";
|
|
25
|
-
import type { SettingsLabels } from "./settings-labels";
|
|
26
|
-
import { settingsFromListState, useSettingsRoute } from "./use-settings-route";
|
|
27
|
-
import type { SettingsLayoutMode } from "./use-settings-route";
|
|
28
|
-
import { useSettingsFocus } from "./use-settings-focus";
|
|
29
|
-
|
|
30
|
-
/** The page's width cap (§3.2): `6xl` for settings, `7xl` for keksdose's admin, whose
|
|
31
|
-
* user table scrolled sideways at 6xl (dev#488). */
|
|
32
|
-
export type SettingsLayoutWidth = "6xl" | "7xl";
|
|
33
|
-
|
|
34
|
-
/** More entries than this and the search field shows by itself (§3.4): Kurvenschmiede has
|
|
35
|
-
* about twelve, keksdose 26; a page of six needs none. */
|
|
36
|
-
export const SETTINGS_SEARCH_THRESHOLD = 8;
|
|
37
|
-
|
|
38
|
-
/** The desktop sidebar's column: sticky beside a long group (§3.2). */
|
|
39
|
-
const SIDEBAR_COLUMN = "mb-4 md:sticky md:top-6 md:mb-0 md:self-start";
|
|
40
|
-
|
|
41
|
-
export interface SettingsLayoutProps<G extends string> {
|
|
42
|
-
/** The page's `h1`: "Settings", "Administration". Default: `labels.title`. */
|
|
43
|
-
title?: ReactNode;
|
|
44
|
-
/** The groups, in order (§4.2). */
|
|
45
|
-
groups: readonly SettingsGroup<G>[];
|
|
46
|
-
/** One entry per setting (§4.1). Hidden entries leave search; a group left without a
|
|
47
|
-
* visible one is hidden. */
|
|
48
|
-
entries: readonly SettingsEntry<G>[];
|
|
49
|
-
/** `/settings` or `/admin`. The layout owns every path below it. */
|
|
50
|
-
basePath: string;
|
|
51
|
-
/** The group `/settings` opens on a desktop. Default: the first visible one. */
|
|
52
|
-
defaultGroup?: G;
|
|
53
|
-
/** Retired group ids and their successors, replaced in the address (§3.1). */
|
|
54
|
-
aliases?: Readonly<Partial<Record<string, G>>>;
|
|
55
|
-
/**
|
|
56
|
-
* The search field. Left out, it shows once more than {@link SETTINGS_SEARCH_THRESHOLD}
|
|
57
|
-
* entries are visible; `true` or `false` wins over the count — keksdose's admin keeps
|
|
58
|
-
* none (§3.4, §10.3). ⌘K gets the entries either way ({@link settingsSearchEntries}).
|
|
59
|
-
*/
|
|
60
|
-
search?: boolean;
|
|
61
|
-
/** See {@link SettingsLayoutWidth}. Default `"6xl"`. */
|
|
62
|
-
width?: SettingsLayoutWidth;
|
|
63
|
-
/** The group's cards, in one column. `sub` is the path segment after the group, which
|
|
64
|
-
* a card owns (`useSettingsLayout().selectSub`). */
|
|
65
|
-
renderGroup: (group: G, sub: string | null) => ReactNode;
|
|
66
|
-
/**
|
|
67
|
-
* Rows under the phone's group list that LEAVE settings — kastlan's "Administration",
|
|
68
|
-
* its import page (§3.3, §5). `ListItem`s with an `href`; the layout puts them in a list
|
|
69
|
-
* of their own, so they never read as a group. Not shown on a desktop, where the app's
|
|
70
|
-
* own navigation carries them.
|
|
71
|
-
*/
|
|
72
|
-
phoneFooter?: ReactNode;
|
|
73
|
-
/**
|
|
74
|
-
* 0.42.0 (docs/admin-harmonization.md §2.5 decision 16): content under the section
|
|
75
|
-
* list on a desktop, in the same sticky column — the admin area's Tools list
|
|
76
|
-
* (`AdminToolLinks`). Not shown on a phone, where `phoneFooter` carries the same links.
|
|
77
|
-
*/
|
|
78
|
-
sidebarFooter?: ReactNode;
|
|
79
|
-
/** Prop > `<UiKitProvider labels={{ settings }}>` > English. */
|
|
80
|
-
labels?: LabelOverride<SettingsLabels>;
|
|
81
|
-
/** See {@link SettingsLayoutMode}. Default `"auto"`: the screen decides. */
|
|
82
|
-
layout?: SettingsLayoutMode;
|
|
83
|
-
/**
|
|
84
|
-
* The app's name, the last part of the window's title: "Security · Settings ·
|
|
85
|
-
* Kastlan" (§3.1). Left out, the title ends at the page: "Security · Settings".
|
|
86
|
-
*/
|
|
87
|
-
appName?: string;
|
|
88
|
-
/**
|
|
89
|
-
* The window's title (`document.title`, §3.1) — round 0.34 C8, KS U7. By default the
|
|
90
|
-
* layout writes "<group> · <page> · <appName>" while a group is open and
|
|
91
|
-
* "<page> · <appName>" on the phone's list, and puts back the title it found when it
|
|
92
|
-
* unmounts. `<page>` is `title` when that is a string, else `labels.title`.
|
|
93
|
-
*
|
|
94
|
-
* A function writes another order or another separator from the same parts; `false`
|
|
95
|
-
* leaves `document.title` to the app. Kastlan's `SettingsChrome` and Kurvenschmiede's
|
|
96
|
-
* `GroupTitle` were this effect written by hand, and Kurvenschmiede's admin page, on
|
|
97
|
-
* the same layout, had none — every admin section was titled "Kurvenschmiede".
|
|
98
|
-
*/
|
|
99
|
-
documentTitle?: false | ((parts: SettingsDocumentTitleParts) => string);
|
|
100
|
-
className?: string;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** What {@link SettingsLayoutProps.documentTitle} is given to write the window's title. */
|
|
104
|
-
export interface SettingsDocumentTitleParts {
|
|
105
|
-
/** The open group's name, or `null` on the phone's list of groups. */
|
|
106
|
-
group: string | null;
|
|
107
|
-
/** The page: `title` when it is a string, else `labels.title` ("Settings"). */
|
|
108
|
-
page: string;
|
|
109
|
-
/** The `appName` prop, or `undefined`. */
|
|
110
|
-
appName: string | undefined;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/** "Security · Settings · Kastlan" (§3.1); a part that is missing is left out. */
|
|
114
|
-
function defaultDocumentTitle({ group, page, appName }: SettingsDocumentTitleParts): string {
|
|
115
|
-
return [group, page, appName].filter((part): part is string => Boolean(part)).join(" · ");
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
interface Searchable<G extends string> extends SearchEntry {
|
|
119
|
-
anchor: string;
|
|
120
|
-
settingsGroup: G;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* The settings page (docs/settings-harmonization.md §3), and the admin page built the
|
|
125
|
-
* same way (§5). keksdose's page is the reference for the desktop; the phone pattern and
|
|
126
|
-
* the path segments are new for all three apps.
|
|
127
|
-
*
|
|
128
|
-
* **Desktop** (§3.2): the page's `PageHeader`, the search field, then a 14rem sidebar —
|
|
129
|
-
* the kit's vertical `Tabs`, a link per group, sticky so a long group keeps the list in
|
|
130
|
-
* view — beside the open group: its heading (`h2`), its help line and its cards in ONE
|
|
131
|
-
* column, never a masonry (keksdose dev#490/#493).
|
|
132
|
-
*
|
|
133
|
-
* **Phone** (§3.3, below `md`): a drill-down. `/settings` is a list of the groups (icon,
|
|
134
|
-
* name, help line, chevron) with `phoneFooter` under it; a group is a page of its own with
|
|
135
|
-
* a back link, its name as the `h1` and the cards under it. It replaces keksdose's chip
|
|
136
|
-
* strip.
|
|
137
|
-
*
|
|
138
|
-
* **Routes, history and `?focus=`** are {@link useSettingsRoute}'s and
|
|
139
|
-
* {@link useSettingsFocus}'s. **Search** (§3.4) runs the kit's matcher over the catalogue:
|
|
140
|
-
* accents folded, ranked, over the title, the group's name and the keywords. On a desktop
|
|
141
|
-
* the sidebar dims the groups without hits and counts the others' while the hits replace
|
|
142
|
-
* the group; on a phone they replace the list. A hit is a link to its card.
|
|
143
|
-
*
|
|
144
|
-
* The cards inside read {@link useSettingsLayout} for `selectSub`, and their titles are
|
|
145
|
-
* headings under the group's ({@link SettingsHeadingLevel}).
|
|
146
|
-
*/
|
|
147
|
-
export function SettingsLayout<G extends string>({
|
|
148
|
-
title,
|
|
149
|
-
groups,
|
|
150
|
-
entries,
|
|
151
|
-
basePath,
|
|
152
|
-
defaultGroup,
|
|
153
|
-
aliases,
|
|
154
|
-
search,
|
|
155
|
-
width = "6xl",
|
|
156
|
-
renderGroup,
|
|
157
|
-
phoneFooter,
|
|
158
|
-
sidebarFooter,
|
|
159
|
-
labels: labelsProp,
|
|
160
|
-
layout = "auto",
|
|
161
|
-
appName,
|
|
162
|
-
documentTitle,
|
|
163
|
-
className,
|
|
164
|
-
}: SettingsLayoutProps<G>): ReactElement {
|
|
165
|
-
const labels = useKitLabels("settings", DEFAULT_SETTINGS_LABELS, labelsProp);
|
|
166
|
-
const base = normalizeSettingsBase(basePath);
|
|
167
|
-
const route = useSettingsRoute({ groups, entries, basePath: base, defaultGroup, aliases, layout });
|
|
168
|
-
const location = useLocation();
|
|
169
|
-
// The browser URL of an app path, for the sidebar's real links (a middle click opens a
|
|
170
|
-
// tab): `#/settings/…` under a hash router, the basename in front under a browser one.
|
|
171
|
-
const root = useHref("/").replace(/\/$/, "");
|
|
172
|
-
const panelId = useId();
|
|
173
|
-
const searchRef = useRef<HTMLInputElement>(null);
|
|
174
|
-
const [query, setQuery] = useState("");
|
|
175
|
-
|
|
176
|
-
const visibleEntries = useMemo(() => visibleSettingsEntries(groups, entries), [groups, entries]);
|
|
177
|
-
const showSearch = search ?? visibleEntries.length > SETTINGS_SEARCH_THRESHOLD;
|
|
178
|
-
const trimmed = query.trim();
|
|
179
|
-
const searching = showSearch && trimmed !== "";
|
|
180
|
-
|
|
181
|
-
const groupById = useMemo(() => new Map(route.groups.map((g) => [g.id, g])), [route.groups]);
|
|
182
|
-
const index = useMemo(
|
|
183
|
-
() =>
|
|
184
|
-
createSearchIndex<Searchable<G>>(
|
|
185
|
-
visibleEntries.map((e) => ({
|
|
186
|
-
id: e.id,
|
|
187
|
-
title: e.title,
|
|
188
|
-
keywords: [groupById.get(e.group)?.title ?? e.group, ...settingsKeywords(e.keywords)],
|
|
189
|
-
group: e.group,
|
|
190
|
-
anchor: e.anchor,
|
|
191
|
-
settingsGroup: e.group,
|
|
192
|
-
})),
|
|
193
|
-
// Every hit: the list is the page's whole answer, not a palette's top few.
|
|
194
|
-
{ groupLimit: Infinity },
|
|
195
|
-
),
|
|
196
|
-
[visibleEntries, groupById],
|
|
197
|
-
);
|
|
198
|
-
const hits = useMemo(() => (searching ? index.search(trimmed).map((h) => h.entry) : []), [searching, index, trimmed]);
|
|
199
|
-
const hitsByGroup = useMemo(() => {
|
|
200
|
-
const counts = new Map<G, number>();
|
|
201
|
-
for (const hit of hits) counts.set(hit.settingsGroup, (counts.get(hit.settingsGroup) ?? 0) + 1);
|
|
202
|
-
return counts;
|
|
203
|
-
}, [hits]);
|
|
204
|
-
|
|
205
|
-
const anchors = useMemo(() => new Set(entries.map((e) => e.anchor)), [entries]);
|
|
206
|
-
const { phone, group, sub, selectSub, select } = route;
|
|
207
|
-
const headingLevel = phone ? "h2" : "h3";
|
|
208
|
-
const context = useMemo<SettingsLayoutContextValue>(
|
|
209
|
-
() => ({
|
|
210
|
-
basePath: base,
|
|
211
|
-
group,
|
|
212
|
-
sub,
|
|
213
|
-
selectSub,
|
|
214
|
-
headingLevel,
|
|
215
|
-
hasAnchor: (anchor) => anchors.has(anchor),
|
|
216
|
-
}),
|
|
217
|
-
[base, group, sub, selectSub, headingLevel, anchors],
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
// Not while the address is about to be replaced (its removal of `focus` would undo the
|
|
221
|
-
// replace), not on the list, and not while the hits stand where the cards would be (a
|
|
222
|
-
// phone's group page has no search: a query left from its list does not count there).
|
|
223
|
-
const hitsShown = searching && (!phone || group === null);
|
|
224
|
-
useSettingsFocus(route.redirecting || group === null || hitsShown ? null : route.focus);
|
|
225
|
-
|
|
226
|
-
// A link inside the page. On a phone it opens a page of its own — a push that marks the
|
|
227
|
-
// list as the entry before it, so the group page's back is a real back. On a desktop
|
|
228
|
-
// it switches the group in place — a replace.
|
|
229
|
-
const { state } = location;
|
|
230
|
-
const renderLink = useCallback(
|
|
231
|
-
({ href, ...props }: ListItemLinkProps) => (
|
|
232
|
-
<Link to={href} replace={!phone} state={phone ? settingsFromListState() : state} {...props} />
|
|
233
|
-
),
|
|
234
|
-
[phone, state],
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
const clearSearch = () => {
|
|
238
|
-
setQuery("");
|
|
239
|
-
// The button that was pressed goes with the empty state; the field is where the
|
|
240
|
-
// next query is typed.
|
|
241
|
-
searchRef.current?.focus();
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const pageTitle = title ?? labels.title;
|
|
245
|
-
|
|
246
|
-
// The window's title (§3.1). Computed to a string during render so the effect below
|
|
247
|
-
// runs when the words change, not whenever an inline `documentTitle` function is new.
|
|
248
|
-
// Each run puts back the title it found before writing its own, so a group switch
|
|
249
|
-
// ends where it began and the unmount leaves the title the page had before settings.
|
|
250
|
-
const windowTitle =
|
|
251
|
-
documentTitle === false
|
|
252
|
-
? null
|
|
253
|
-
: (documentTitle ?? defaultDocumentTitle)({
|
|
254
|
-
group: group === null ? null : (groupById.get(group)?.title ?? null),
|
|
255
|
-
page: typeof title === "string" ? title : labels.title,
|
|
256
|
-
appName,
|
|
257
|
-
});
|
|
258
|
-
useEffect(() => {
|
|
259
|
-
if (windowTitle === null) return;
|
|
260
|
-
const before = document.title;
|
|
261
|
-
document.title = windowTitle;
|
|
262
|
-
return () => {
|
|
263
|
-
document.title = before;
|
|
264
|
-
};
|
|
265
|
-
}, [windowTitle]);
|
|
266
|
-
|
|
267
|
-
const pageClass = cn("mx-auto w-full space-y-4 p-4 md:p-6", width === "7xl" ? "max-w-7xl" : "max-w-6xl", className);
|
|
268
|
-
|
|
269
|
-
const searchField = showSearch ? (
|
|
270
|
-
<SearchField
|
|
271
|
-
ref={searchRef}
|
|
272
|
-
className="max-w-md"
|
|
273
|
-
value={query}
|
|
274
|
-
onChange={setQuery}
|
|
275
|
-
aria-label={labels.search}
|
|
276
|
-
placeholder={labels.searchPlaceholder}
|
|
277
|
-
/>
|
|
278
|
-
) : null;
|
|
279
|
-
|
|
280
|
-
const results =
|
|
281
|
-
hits.length === 0 ? (
|
|
282
|
-
<EmptyState
|
|
283
|
-
title={labels.noMatches(trimmed)}
|
|
284
|
-
action={
|
|
285
|
-
<Button variant="secondary" size="sm" onClick={clearSearch}>
|
|
286
|
-
{labels.clearSearch}
|
|
287
|
-
</Button>
|
|
288
|
-
}
|
|
289
|
-
/>
|
|
290
|
-
) : (
|
|
291
|
-
<Card className="p-1">
|
|
292
|
-
<List separator="divider" density="comfortable" aria-label={labels.results}>
|
|
293
|
-
{hits.map((hit) => (
|
|
294
|
-
<ListItem
|
|
295
|
-
key={hit.id}
|
|
296
|
-
title={hit.title}
|
|
297
|
-
trailing={groupById.get(hit.settingsGroup)?.title}
|
|
298
|
-
href={settingsHref(base, hit.settingsGroup, hit.anchor)}
|
|
299
|
-
renderLink={renderLink}
|
|
300
|
-
// Leave search on the way: the hit's card is what the user asked for.
|
|
301
|
-
onClick={() => setQuery("")}
|
|
302
|
-
/>
|
|
303
|
-
))}
|
|
304
|
-
</List>
|
|
305
|
-
</Card>
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
const cards = (open: G) => (
|
|
309
|
-
<SettingsHeadingLevel level={headingLevel}>
|
|
310
|
-
<div className="space-y-4">{renderGroup(open, sub)}</div>
|
|
311
|
-
</SettingsHeadingLevel>
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
let body: ReactNode;
|
|
315
|
-
if (phone) {
|
|
316
|
-
const open = group === null ? undefined : groupById.get(group);
|
|
317
|
-
body = open ? (
|
|
318
|
-
<div className={pageClass} data-settings-view="group">
|
|
319
|
-
<PageHeader
|
|
320
|
-
size="compact"
|
|
321
|
-
documentTitle={false}
|
|
322
|
-
title={open.title}
|
|
323
|
-
description={open.help}
|
|
324
|
-
breadcrumbs={
|
|
325
|
-
<Link
|
|
326
|
-
to={base || "/"}
|
|
327
|
-
aria-label={labels.back}
|
|
328
|
-
onClick={(e) => {
|
|
329
|
-
// A real link for a middle click; a plain click is the page's own back,
|
|
330
|
-
// which is `navigate(-1)` when the list is the entry before this one.
|
|
331
|
-
if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
332
|
-
e.preventDefault();
|
|
333
|
-
route.back();
|
|
334
|
-
}}
|
|
335
|
-
className={cn(
|
|
336
|
-
"-ms-1 inline-flex items-center gap-0.5 self-start rounded-md pe-1 text-sm font-medium text-muted hover:text-primary",
|
|
337
|
-
FOCUS_RING,
|
|
338
|
-
)}
|
|
339
|
-
>
|
|
340
|
-
<ChevronLeft aria-hidden className="size-4 rtl:-scale-x-100" />
|
|
341
|
-
{pageTitle}
|
|
342
|
-
</Link>
|
|
343
|
-
}
|
|
344
|
-
/>
|
|
345
|
-
{cards(open.id)}
|
|
346
|
-
</div>
|
|
347
|
-
) : (
|
|
348
|
-
<div className={pageClass} data-settings-view="list">
|
|
349
|
-
<PageHeader size="compact" documentTitle={false} title={pageTitle} />
|
|
350
|
-
{searchField}
|
|
351
|
-
{searching ? (
|
|
352
|
-
results
|
|
353
|
-
) : (
|
|
354
|
-
<Card className="p-1">
|
|
355
|
-
<List separator="divider" density="comfortable" aria-label={labels.sections}>
|
|
356
|
-
{route.groups.map((g) => (
|
|
357
|
-
<ListItem
|
|
358
|
-
key={g.id}
|
|
359
|
-
href={settingsHref(base, g.id)}
|
|
360
|
-
renderLink={renderLink}
|
|
361
|
-
leading={
|
|
362
|
-
<span
|
|
363
|
-
aria-hidden
|
|
364
|
-
className="flex size-8 shrink-0 items-center justify-center rounded-md bg-surface-2 text-secondary [&_svg]:size-4"
|
|
365
|
-
>
|
|
366
|
-
{g.icon}
|
|
367
|
-
</span>
|
|
368
|
-
}
|
|
369
|
-
title={g.title}
|
|
370
|
-
subtitle={g.help}
|
|
371
|
-
trailing={
|
|
372
|
-
g.badge == null ? (
|
|
373
|
-
<ChevronRight aria-hidden className="size-4 rtl:-scale-x-100" />
|
|
374
|
-
) : (
|
|
375
|
-
// The group's badge (0.48) before the chevron, the two as one end.
|
|
376
|
-
<span className="flex items-center gap-2">
|
|
377
|
-
{g.badge}
|
|
378
|
-
<ChevronRight aria-hidden className="size-4 rtl:-scale-x-100" />
|
|
379
|
-
</span>
|
|
380
|
-
)
|
|
381
|
-
}
|
|
382
|
-
/>
|
|
383
|
-
))}
|
|
384
|
-
</List>
|
|
385
|
-
</Card>
|
|
386
|
-
)}
|
|
387
|
-
{!searching && phoneFooter != null && (
|
|
388
|
-
<Card className="p-1">
|
|
389
|
-
<List separator="divider" density="comfortable">
|
|
390
|
-
{phoneFooter}
|
|
391
|
-
</List>
|
|
392
|
-
</Card>
|
|
393
|
-
)}
|
|
394
|
-
</div>
|
|
395
|
-
);
|
|
396
|
-
} else {
|
|
397
|
-
const open = group === null ? undefined : groupById.get(group);
|
|
398
|
-
// The section list alone, or (0.42) with the app's `sidebarFooter` under it in one
|
|
399
|
-
// sticky column.
|
|
400
|
-
const withSidebarFooter = (tabs: ReactNode) =>
|
|
401
|
-
sidebarFooter == null ? (
|
|
402
|
-
tabs
|
|
403
|
-
) : (
|
|
404
|
-
<div className={cn(SIDEBAR_COLUMN, "space-y-6")}>
|
|
405
|
-
{tabs}
|
|
406
|
-
<div data-slot="settings-sidebar-footer">{sidebarFooter}</div>
|
|
407
|
-
</div>
|
|
408
|
-
);
|
|
409
|
-
body = (
|
|
410
|
-
<div className={pageClass} data-settings-view="desktop">
|
|
411
|
-
<PageHeader size="compact" documentTitle={false} title={pageTitle} />
|
|
412
|
-
{searchField}
|
|
413
|
-
<div className="md:grid md:grid-cols-[14rem_minmax(0,1fr)] md:gap-6">
|
|
414
|
-
{withSidebarFooter(
|
|
415
|
-
<Tabs<G>
|
|
416
|
-
orientation="vertical"
|
|
417
|
-
aria-label={labels.sections}
|
|
418
|
-
// Sticky (new in the harmonisation, §3.2): keksdose's notifications group
|
|
419
|
-
// scrolls for screens, and the list should stay in view beside it. With a
|
|
420
|
-
// `sidebarFooter` the column round both is the sticky one.
|
|
421
|
-
className={sidebarFooter == null ? SIDEBAR_COLUMN : undefined}
|
|
422
|
-
panelId={open && !searching ? panelId : undefined}
|
|
423
|
-
tabs={route.groups.map((g) => {
|
|
424
|
-
const count = hitsByGroup.get(g.id) ?? 0;
|
|
425
|
-
// While searching, the groups with nothing to show step back (keksdose).
|
|
426
|
-
const dim = searching && count === 0;
|
|
427
|
-
return {
|
|
428
|
-
id: g.id,
|
|
429
|
-
href: `${root}${settingsHref(base, g.id)}`,
|
|
430
|
-
name: g.title,
|
|
431
|
-
label: <span className={cn(dim && "opacity-40")}>{g.title}</span>,
|
|
432
|
-
icon: <span className={cn("inline-flex [&_svg]:size-4", dim && "opacity-40")}>{g.icon}</span>,
|
|
433
|
-
// While searching, the hit count; otherwise the group's own badge (0.48).
|
|
434
|
-
badge: searching ? (
|
|
435
|
-
count > 0 ? (
|
|
436
|
-
<Chip size="sm" tone="brand">
|
|
437
|
-
<span aria-hidden>{count}</span>
|
|
438
|
-
<span className="sr-only-fixed">{labels.matchCount(count)}</span>
|
|
439
|
-
</Chip>
|
|
440
|
-
) : undefined
|
|
441
|
-
) : (
|
|
442
|
-
g.badge
|
|
443
|
-
),
|
|
444
|
-
};
|
|
445
|
-
})}
|
|
446
|
-
active={(open?.id ?? route.groups[0]?.id) as G}
|
|
447
|
-
onChange={(id) => {
|
|
448
|
-
// While searching the hits stand where the group would; a click on a group
|
|
449
|
-
// means "go there", so the search makes way (keksdose).
|
|
450
|
-
setQuery("");
|
|
451
|
-
select(id);
|
|
452
|
-
}}
|
|
453
|
-
/>,
|
|
454
|
-
)}
|
|
455
|
-
<div className="min-w-0 space-y-4">
|
|
456
|
-
{searching ? (
|
|
457
|
-
results
|
|
458
|
-
) : open ? (
|
|
459
|
-
<div id={panelId} role="tabpanel" aria-labelledby={`${panelId}-tab`} className="space-y-4">
|
|
460
|
-
<PageHeader as="h2" size="sm" title={open.title} description={open.help} />
|
|
461
|
-
{cards(open.id)}
|
|
462
|
-
</div>
|
|
463
|
-
) : null}
|
|
464
|
-
</div>
|
|
465
|
-
</div>
|
|
466
|
-
</div>
|
|
467
|
-
);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
return <SettingsLayoutContext.Provider value={context}>{body}</SettingsLayoutContext.Provider>;
|
|
471
|
-
}
|