@eifi1/ui-kit 0.54.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 +90 -76
- 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/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.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 +2 -2
- 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-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js +2 -2
- 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-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 +3 -1
- 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 +13 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +23 -2
- package/dist/components/modal.js +24 -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/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/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-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-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 +1 -10
- 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 +75 -3
- 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 +92 -4
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +71 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +72 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +74 -3
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +74 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +71 -3
- 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 +24 -5
- package/dist/index.js +35 -1
- 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 +29 -3
- package/dist/lib/dates.js +41 -12
- 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/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/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 -342
- 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 -439
- 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 -816
- 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 -600
- 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 -188
- package/src/components/currency-select.tsx +0 -343
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -987
- 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 -289
- package/src/components/data-table-filters.ts +0 -315
- 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 -284
- 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 -792
- package/src/components/modal.tsx +0 -534
- 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 -559
- 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 -754
- 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 -90
- 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 -11
- package/src/feedback/feedback-context.tsx +0 -245
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-diagnostics.tsx +0 -41
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -452
- 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 -428
- 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 -31
- package/src/feedback/feedback-row-detail.tsx +0 -871
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -131
- package/src/feedback/feedback-submit.tsx +0 -270
- 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 -212
- 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 -2059
- 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 -1999
- package/src/i18n/locales/fr.ts +0 -2037
- package/src/i18n/locales/hu.ts +0 -2004
- package/src/i18n/locales/it.ts +0 -2014
- package/src/i18n/locales/zh.ts +0 -1912
- 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 -1191
- 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 -288
- 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 -585
- 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 -27
- 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 -769
- 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,258 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useMemo } from "react";
|
|
2
|
-
import { useLocation, useNavigate } from "react-router";
|
|
3
|
-
import { usePhoneLayout } from "../hooks/use-breakpoint";
|
|
4
|
-
import { normalizeSettingsBase, visibleSettingsGroups } from "./settings-catalogue";
|
|
5
|
-
import type { SettingsEntry, SettingsGroup } from "./settings-catalogue";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Which layout the settings page is in. `"auto"` follows the screen (`usePhoneLayout()`,
|
|
9
|
-
* as `Tabs` does); `"desktop"` / `"phone"` pin one — for a preview of both side by side,
|
|
10
|
-
* where the window is one width.
|
|
11
|
-
*/
|
|
12
|
-
export type SettingsLayoutMode = "auto" | "desktop" | "phone";
|
|
13
|
-
|
|
14
|
-
export interface UseSettingsRouteOptions<G extends string> {
|
|
15
|
-
groups: readonly SettingsGroup<G>[];
|
|
16
|
-
/** The catalogue's entries. Given, a group with no visible entry is hidden (§4.1), and
|
|
17
|
-
* `/settings?focus=<anchor>` finds the anchor's group. */
|
|
18
|
-
entries?: readonly SettingsEntry<G>[];
|
|
19
|
-
/** `/settings` or `/admin`. */
|
|
20
|
-
basePath: string;
|
|
21
|
-
/** The group `/settings` opens on a desktop. Default: the first visible group (§4.1). */
|
|
22
|
-
defaultGroup?: G;
|
|
23
|
-
/** Retired group ids and their successors — `{ overview: "metrics" }` — applied with a
|
|
24
|
-
* replace (§3.1, keksdose's admin). */
|
|
25
|
-
aliases?: Readonly<Partial<Record<string, G>>>;
|
|
26
|
-
/** See {@link SettingsLayoutMode}. Default `"auto"`. */
|
|
27
|
-
layout?: SettingsLayoutMode;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface SettingsRoute<G extends string> {
|
|
31
|
-
/** The group on screen. `null` on a phone's list (and while there is no visible group). */
|
|
32
|
-
group: G | null;
|
|
33
|
-
/** The segment after the group, owned by a card; `null` without one. */
|
|
34
|
-
sub: string | null;
|
|
35
|
-
/** `?focus=<anchor>`, or `null`. */
|
|
36
|
-
focus: string | null;
|
|
37
|
-
/** Open a group: a PUSH on a phone, so the system back gesture returns to the list; a
|
|
38
|
-
* REPLACE on a desktop, so back leaves settings instead of walking every group looked
|
|
39
|
-
* at (§3.1, keksdose's rule). */
|
|
40
|
-
select: (group: G) => void;
|
|
41
|
-
/** See {@link SettingsLayoutContextValue.selectSub}. */
|
|
42
|
-
selectSub: (sub: string | null) => void;
|
|
43
|
-
/** To the list: `navigate(-1)` when the list is the previous entry, else a replace to
|
|
44
|
-
* the base path — so a deep link from a mail never sends "back" out of the app. */
|
|
45
|
-
back: () => void;
|
|
46
|
-
/** The visible groups, in order. */
|
|
47
|
-
groups: SettingsGroup<G>[];
|
|
48
|
-
/** Whether the phone layout is in force. */
|
|
49
|
-
phone: boolean;
|
|
50
|
-
/** Whether this location is about to be replaced (a legacy hash, an alias, an unknown
|
|
51
|
-
* group): what renders meanwhile is already the destination's, but nothing should
|
|
52
|
-
* act on the URL until it is. */
|
|
53
|
-
redirecting: boolean;
|
|
54
|
-
/** Whether the list is the entry before this one (the marker {@link select} and the
|
|
55
|
-
* list's links leave in `location.state`). */
|
|
56
|
-
fromList: boolean;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The `location.state` key that says "the list is the entry before this one". Written by
|
|
61
|
-
* the phone list's links and {@link SettingsRoute.select}; carried over by every replace
|
|
62
|
-
* the page makes, since a replace does not change what came before.
|
|
63
|
-
*/
|
|
64
|
-
export const SETTINGS_FROM_LIST_STATE = "eifi1.settings.fromList";
|
|
65
|
-
|
|
66
|
-
/** `location.state` with the marker set — for an app's own link to a group page that is
|
|
67
|
-
* opened FROM the list it renders. */
|
|
68
|
-
export function settingsFromListState(): Record<string, true> {
|
|
69
|
-
return { [SETTINGS_FROM_LIST_STATE]: true };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function isFromList(state: unknown): boolean {
|
|
73
|
-
return (
|
|
74
|
-
typeof state === "object" && state !== null && (state as Record<string, unknown>)[SETTINGS_FROM_LIST_STATE] === true
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export interface SettingsLocation {
|
|
79
|
-
pathname: string;
|
|
80
|
-
search: string;
|
|
81
|
-
hash: string;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export interface SettingsLocationRules<G extends string> {
|
|
85
|
-
basePath: string;
|
|
86
|
-
/** The visible group ids. */
|
|
87
|
-
groups: readonly G[];
|
|
88
|
-
/** The resolved default group, `null` with no visible group. */
|
|
89
|
-
defaultGroup: G | null;
|
|
90
|
-
aliases?: Readonly<Partial<Record<string, G>>>;
|
|
91
|
-
/** Anchor → group, for `/settings?focus=<anchor>` with no group named. */
|
|
92
|
-
anchorGroup?: ReadonlyMap<string, G>;
|
|
93
|
-
phone: boolean;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export interface SettingsLocationResult<G extends string> {
|
|
97
|
-
group: G | null;
|
|
98
|
-
sub: string | null;
|
|
99
|
-
/** The path (with query) to replace the location with, or `null` when it is already
|
|
100
|
-
* canonical. */
|
|
101
|
-
redirect: string | null;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Where a location lands on the settings page — pure, so the rules of §3.1 are testable
|
|
106
|
-
* without a router:
|
|
107
|
-
*
|
|
108
|
-
* - `/settings` → the default group on a desktop (a replace), the list on a phone;
|
|
109
|
-
* - `/settings/<group>[/<sub>]` → that group, the rest of the path as `sub`;
|
|
110
|
-
* - an alias → its successor, with a replace, `sub`, query and hash kept;
|
|
111
|
-
* - an unknown or hidden group → the default group (desktop) or the list (phone), with
|
|
112
|
-
* a replace and the query kept — never a 404, so an old bookmark still lands;
|
|
113
|
-
* - keksdose's legacy `/settings?<query>#<group>[/<sub>]` →
|
|
114
|
-
* `/settings/<group>[/<sub>]?<query>`, the WHOLE query carried (a tour's
|
|
115
|
-
* `tour`/`tourStep` as well as `focus`), then resolved by the rules above;
|
|
116
|
-
* - `/settings?focus=<anchor>` with no group → the anchor's group, where it can ring.
|
|
117
|
-
*/
|
|
118
|
-
export function resolveSettingsLocation<G extends string>(
|
|
119
|
-
location: SettingsLocation,
|
|
120
|
-
rules: SettingsLocationRules<G>,
|
|
121
|
-
): SettingsLocationResult<G> {
|
|
122
|
-
const base = normalizeSettingsBase(rules.basePath);
|
|
123
|
-
const { pathname, search, hash } = location;
|
|
124
|
-
const known = new Set<string>(rules.groups);
|
|
125
|
-
const atBase = pathname === base || pathname === `${base}/` || (base === "" && pathname === "/");
|
|
126
|
-
|
|
127
|
-
if (atBase) {
|
|
128
|
-
const legacy = hash.replace(/^#/, "").replace(/^\/+/, "");
|
|
129
|
-
if (legacy) {
|
|
130
|
-
// The hash becomes the path; whatever the path then says (an alias, an unknown
|
|
131
|
-
// group) is resolved in the same step, so the history sees one replace.
|
|
132
|
-
const converted = `${base}/${legacy}`;
|
|
133
|
-
const next = resolveSettingsLocation({ pathname: converted, search, hash: "" }, rules);
|
|
134
|
-
return { ...next, redirect: next.redirect ?? `${converted}${search}` };
|
|
135
|
-
}
|
|
136
|
-
const anchor = new URLSearchParams(search).get("focus");
|
|
137
|
-
const anchorGroup = anchor ? rules.anchorGroup?.get(anchor) : undefined;
|
|
138
|
-
if (anchorGroup && known.has(anchorGroup)) {
|
|
139
|
-
return { group: anchorGroup, sub: null, redirect: `${base}/${anchorGroup}${search}` };
|
|
140
|
-
}
|
|
141
|
-
if (rules.phone || rules.defaultGroup === null) return { group: null, sub: null, redirect: null };
|
|
142
|
-
return { group: rules.defaultGroup, sub: null, redirect: `${base}/${rules.defaultGroup}${search}` };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (!pathname.startsWith(`${base}/`)) {
|
|
146
|
-
// Mounted somewhere `basePath` does not name: a misconfiguration, not a link to
|
|
147
|
-
// correct. Show what the base path would, and leave the address alone.
|
|
148
|
-
return { group: rules.phone ? null : rules.defaultGroup, sub: null, redirect: null };
|
|
149
|
-
}
|
|
150
|
-
const rest = pathname.slice(base.length + 1);
|
|
151
|
-
const [segment = "", ...subParts] = rest.split("/");
|
|
152
|
-
const sub = subParts.filter(Boolean).join("/") || null;
|
|
153
|
-
if (known.has(segment)) return { group: segment as G, sub, redirect: null };
|
|
154
|
-
|
|
155
|
-
const successor = rules.aliases?.[segment];
|
|
156
|
-
if (successor !== undefined && known.has(successor)) {
|
|
157
|
-
return {
|
|
158
|
-
group: successor,
|
|
159
|
-
sub,
|
|
160
|
-
redirect: `${base}/${successor}${sub ? `/${sub}` : ""}${search}${hash}`,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Unknown or hidden. The hash is dropped: on the list it would read as a legacy group
|
|
165
|
-
// and send the page round again.
|
|
166
|
-
if (rules.phone || rules.defaultGroup === null) {
|
|
167
|
-
return { group: null, sub: null, redirect: `${base || "/"}${search}` };
|
|
168
|
-
}
|
|
169
|
-
return { group: rules.defaultGroup, sub: null, redirect: `${base}/${rules.defaultGroup}${search}` };
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* The settings page's route (docs/settings-harmonization.md §3.1): which group the URL
|
|
174
|
-
* names, and the history rules for moving between groups.
|
|
175
|
-
*
|
|
176
|
-
* The URL IS the selection, as it was in keksdose (where it was the hash): there is no
|
|
177
|
-
* state to keep in step with it, so a deep link, a reload, back and forward all land
|
|
178
|
-
* where the address says. Everything that is not canonical — `/settings` on a desktop, a
|
|
179
|
-
* legacy hash, an alias, an unknown or hidden group — is replaced by its canonical path.
|
|
180
|
-
*
|
|
181
|
-
* **The replace runs on every navigation**, keyed on `location.key`, not once on mount:
|
|
182
|
-
* the router keeps the page mounted across links followed inside the app — keksdose's
|
|
183
|
-
* inbox renders admin-typed URLs, and a push click routes an open window without a
|
|
184
|
-
* reload — so a legacy `/settings#security` arriving while the page is open converts too
|
|
185
|
-
* (§10.1).
|
|
186
|
-
*/
|
|
187
|
-
export function useSettingsRoute<G extends string>(options: UseSettingsRouteOptions<G>): SettingsRoute<G> {
|
|
188
|
-
const { groups, entries, basePath, defaultGroup, aliases, layout = "auto" } = options;
|
|
189
|
-
const location = useLocation();
|
|
190
|
-
const navigate = useNavigate();
|
|
191
|
-
const narrow = usePhoneLayout();
|
|
192
|
-
const phone = layout === "phone" || (layout === "auto" && narrow);
|
|
193
|
-
const base = normalizeSettingsBase(basePath);
|
|
194
|
-
|
|
195
|
-
const visible = useMemo(() => visibleSettingsGroups(groups, entries), [groups, entries]);
|
|
196
|
-
const anchorGroup = useMemo(() => {
|
|
197
|
-
const map = new Map<string, G>();
|
|
198
|
-
for (const e of entries ?? []) if (e.visible !== false && !map.has(e.anchor)) map.set(e.anchor, e.group);
|
|
199
|
-
return map;
|
|
200
|
-
}, [entries]);
|
|
201
|
-
const ids = visible.map((g) => g.id);
|
|
202
|
-
const fallback = defaultGroup !== undefined && ids.includes(defaultGroup) ? defaultGroup : (ids[0] ?? null);
|
|
203
|
-
|
|
204
|
-
const { group, sub, redirect } = resolveSettingsLocation(location, {
|
|
205
|
-
basePath: base,
|
|
206
|
-
groups: ids,
|
|
207
|
-
defaultGroup: fallback,
|
|
208
|
-
aliases,
|
|
209
|
-
anchorGroup,
|
|
210
|
-
phone,
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
const { key, state, search } = location;
|
|
214
|
-
useEffect(() => {
|
|
215
|
-
// `state` rides along: the marker describes the entry BEFORE this one, which a
|
|
216
|
-
// replace does not change.
|
|
217
|
-
if (redirect) navigate(redirect, { replace: true, state });
|
|
218
|
-
}, [key, redirect, state, navigate]);
|
|
219
|
-
|
|
220
|
-
const select = useCallback(
|
|
221
|
-
(next: G) => {
|
|
222
|
-
const to = `${base}/${next}`;
|
|
223
|
-
// From the list, the push marks it, so the group page's back is a real back.
|
|
224
|
-
if (phone) navigate(to, group === null ? { state: settingsFromListState() } : undefined);
|
|
225
|
-
// A new group is a new page: the old one's query (a focus, a roster filter) stays
|
|
226
|
-
// behind, as keksdose's `selectGroup` left it.
|
|
227
|
-
else navigate(to, { replace: true, state });
|
|
228
|
-
},
|
|
229
|
-
[base, phone, group, state, navigate],
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
const selectSub = useCallback(
|
|
233
|
-
(next: string | null) => {
|
|
234
|
-
if (group === null) return;
|
|
235
|
-
navigate(`${base}/${group}${next ? `/${next}` : ""}${search}`, { replace: true, state });
|
|
236
|
-
},
|
|
237
|
-
[base, group, search, state, navigate],
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
const fromList = isFromList(state);
|
|
241
|
-
const back = useCallback(() => {
|
|
242
|
-
if (fromList) navigate(-1);
|
|
243
|
-
else navigate(base || "/", { replace: true });
|
|
244
|
-
}, [fromList, base, navigate]);
|
|
245
|
-
|
|
246
|
-
return {
|
|
247
|
-
group,
|
|
248
|
-
sub,
|
|
249
|
-
focus: new URLSearchParams(search).get("focus"),
|
|
250
|
-
select,
|
|
251
|
-
selectSub,
|
|
252
|
-
back,
|
|
253
|
-
groups: visible,
|
|
254
|
-
phone,
|
|
255
|
-
redirecting: redirect !== null,
|
|
256
|
-
fromList,
|
|
257
|
-
};
|
|
258
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { Globe } from "lucide-react";
|
|
4
|
-
import { Disclosure } from "../components/disclosure";
|
|
5
|
-
import { MenuItem } from "../components/menu-item";
|
|
6
|
-
import { DEFAULT_TOP_BAR_LABELS, useKitLabels } from "../i18n/kit-labels";
|
|
7
|
-
import { languageCodeLabel } from "./language-code";
|
|
8
|
-
|
|
9
|
-
/** One offered language in the account menu's sub-list. */
|
|
10
|
-
export interface AccountMenuLanguageOption {
|
|
11
|
-
code: string;
|
|
12
|
-
/** Its name, in its own language ("Deutsch", "Français"). */
|
|
13
|
-
label: ReactNode;
|
|
14
|
-
/**
|
|
15
|
-
* A flag before the name, as the app draws it — keksdose's flag-icons span
|
|
16
|
-
* (`<span aria-hidden className="fi fi-ch …" />`). A node rather than a country code, so
|
|
17
|
-
* the kit ships no flag set; decorative, so give it `aria-hidden`.
|
|
18
|
-
*/
|
|
19
|
-
flag?: ReactNode;
|
|
20
|
-
/**
|
|
21
|
-
* Or the ISO 3166-1 alpha-2 country (lowercase) whose flag-icons flag to draw, as
|
|
22
|
-
* `LanguageMenu`'s `LanguageOption` takes it — so one language list feeds both
|
|
23
|
-
* (Kurvenschmiede's `LANGUAGES`). Needs the app's flag-icons CSS, as `LanguageMenu`
|
|
24
|
-
* does. `flag` wins when both are given.
|
|
25
|
-
*/
|
|
26
|
-
country?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** The option's flag: its own node, else the flag-icons flag of its country. */
|
|
30
|
-
function flagOf(lang: AccountMenuLanguageOption): ReactNode {
|
|
31
|
-
if (lang.flag !== undefined) return lang.flag;
|
|
32
|
-
if (!lang.country) return undefined;
|
|
33
|
-
return (
|
|
34
|
-
<span
|
|
35
|
-
aria-hidden
|
|
36
|
-
data-country={lang.country}
|
|
37
|
-
className={`fi fi-${lang.country} inline-block h-[0.9375rem] w-5 shrink-0 rounded-sm shadow-[0_0_0_1px_rgba(0,0,0,0.08)]`}
|
|
38
|
-
/>
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface AccountMenuLanguageProps {
|
|
43
|
-
languages: readonly AccountMenuLanguageOption[];
|
|
44
|
-
/** The active language's code. */
|
|
45
|
-
value: string | undefined;
|
|
46
|
-
/** A pick: the app sets the device's language and, signed in, the account's
|
|
47
|
-
* (settings §6.2). `value` + `onChange`, as every kit control pairs them
|
|
48
|
-
* (CONTRIBUTING §4; refactor audit 2026-10-30, API-5). Required: 0.53 removed the
|
|
49
|
-
* deprecated `onPick`. */
|
|
50
|
-
onChange: (code: string) => void;
|
|
51
|
-
/** The account menu's `close` (from `TopBarActionMenu`'s `children`): a pick shuts it. */
|
|
52
|
-
close?: () => void;
|
|
53
|
-
/** The row's name. Default: `topBar.language` ("Language"). */
|
|
54
|
-
label?: string;
|
|
55
|
-
/** Open the sub-list at first. Default `false`. */
|
|
56
|
-
defaultOpen?: boolean;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The language choice INSIDE the account menu (docs/top-bar-harmonization.md §2.3),
|
|
61
|
-
* keksdose's sub-list: a `Disclosure variant="menu"` row — the globe, "Language", the
|
|
62
|
-
* active language's flag and code ("DE") and the chevron — that opens in place onto one checked
|
|
63
|
-
* `MenuItem` per language. Inline rather than a nested popover: a popover inside a
|
|
64
|
-
* popover fights the outside click and has nowhere to go on a phone (keksdose #140).
|
|
65
|
-
*
|
|
66
|
-
* It renders its own `<li>`: drop it into `TopBarActionMenu`'s `children` first after the
|
|
67
|
-
* app's context rows (§6.5). Signed out there is no account menu; `LanguageMenu` stays
|
|
68
|
-
* the bar's button (§2.3).
|
|
69
|
-
*/
|
|
70
|
-
export function AccountMenuLanguage({
|
|
71
|
-
languages,
|
|
72
|
-
value,
|
|
73
|
-
onChange,
|
|
74
|
-
close,
|
|
75
|
-
label,
|
|
76
|
-
defaultOpen = false,
|
|
77
|
-
}: AccountMenuLanguageProps) {
|
|
78
|
-
const words = useKitLabels("topBar", DEFAULT_TOP_BAR_LABELS);
|
|
79
|
-
const [open, setOpen] = useState(defaultOpen);
|
|
80
|
-
const active = languages.find((l) => l.code === value);
|
|
81
|
-
return (
|
|
82
|
-
<li>
|
|
83
|
-
<Disclosure
|
|
84
|
-
variant="menu"
|
|
85
|
-
open={open}
|
|
86
|
-
onOpenChange={setOpen}
|
|
87
|
-
title={
|
|
88
|
-
<span className="flex items-center justify-between gap-3">
|
|
89
|
-
<span className="flex items-center gap-2">
|
|
90
|
-
<Globe aria-hidden className="size-4" />
|
|
91
|
-
{label ?? words.language}
|
|
92
|
-
</span>
|
|
93
|
-
{active && (
|
|
94
|
-
// The flag alone could not tell de-CH, fr-CH and it-CH apart (one Swiss
|
|
95
|
-
// flag each), so the code sits beside it (0.49 KIT-10); the row's name
|
|
96
|
-
// carries the language's own name.
|
|
97
|
-
<span className="flex items-center gap-1.5">
|
|
98
|
-
{flagOf(active)}
|
|
99
|
-
<span aria-hidden className="text-xs font-semibold tabular-nums tracking-wide text-secondary">
|
|
100
|
-
{languageCodeLabel(active.code)}
|
|
101
|
-
</span>
|
|
102
|
-
<span className="sr-only">{active.label}</span>
|
|
103
|
-
</span>
|
|
104
|
-
)}
|
|
105
|
-
</span>
|
|
106
|
-
}
|
|
107
|
-
>
|
|
108
|
-
<ul>
|
|
109
|
-
{languages.map((lang) => (
|
|
110
|
-
<li key={lang.code}>
|
|
111
|
-
<MenuItem
|
|
112
|
-
checked={lang.code === value}
|
|
113
|
-
onClick={() => {
|
|
114
|
-
onChange(lang.code);
|
|
115
|
-
setOpen(false);
|
|
116
|
-
close?.();
|
|
117
|
-
}}
|
|
118
|
-
leading={flagOf(lang)}
|
|
119
|
-
// Under the row's own text, past the globe.
|
|
120
|
-
className="ps-9"
|
|
121
|
-
>
|
|
122
|
-
{lang.label}
|
|
123
|
-
</MenuItem>
|
|
124
|
-
</li>
|
|
125
|
-
))}
|
|
126
|
-
</ul>
|
|
127
|
-
</Disclosure>
|
|
128
|
-
</li>
|
|
129
|
-
);
|
|
130
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { AArrowDown, AArrowUp, ALargeSmall } from "lucide-react";
|
|
2
|
-
import { IconButton } from "../components/icon-button";
|
|
3
|
-
import { useAppearanceLabels, type AppearanceLabels } from "../components/appearance-labels";
|
|
4
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
5
|
-
import { TEXT_SIZES, useTextSize, type TextSize } from "../theme/text-size";
|
|
6
|
-
|
|
7
|
-
export interface AccountMenuTextSizeProps {
|
|
8
|
-
/** The size in force. Default: the one on `<html>` ({@link useTextSize}), which is the
|
|
9
|
-
* size whoever applied it put there. */
|
|
10
|
-
value?: TextSize;
|
|
11
|
-
/**
|
|
12
|
-
* A step: the next size down or up. The app applies it and keeps it as its
|
|
13
|
-
* Settings ▸ Appearance does — `useAccountAppearance`'s `pickTextSize` (this
|
|
14
|
-
* device, and the account when signed in), with `appearance.saveFailed` as the
|
|
15
|
-
* toast when the account refused. The kit does not apply it itself, so the two
|
|
16
|
-
* places can never disagree. `value` + `onChange`, as every kit control pairs them
|
|
17
|
-
* (CONTRIBUTING §4; refactor audit 2026-10-30, API-5). Required: 0.53 removed the
|
|
18
|
-
* deprecated `onPick`.
|
|
19
|
-
*/
|
|
20
|
-
onChange: (size: TextSize) => void;
|
|
21
|
-
/** The row's name. Default: `appearance.textSize` ("Text size"). */
|
|
22
|
-
label?: string;
|
|
23
|
-
/** The `appearance` words (`textSize`, `textSizes`, `textSmaller`, `textLarger`). */
|
|
24
|
-
labels?: LabelOverride<AppearanceLabels>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The text size one tap away, INSIDE the account menu (0.46, keksdose live #426, its
|
|
29
|
-
* `TextSizeRow`): the row's icon and name, the size in force, and A− / A+, which step
|
|
30
|
-
* through {@link TEXT_SIZES} (Normal → Large → Extra large). A− is disabled at the
|
|
31
|
-
* smallest, A+ at the largest. The browser's pinch zoom stays as it is — this is the
|
|
32
|
-
* quick path to the setting, not a replacement for zoom.
|
|
33
|
-
*
|
|
34
|
-
* It renders its own `<li>`: drop it into `TopBarActionMenu`'s `children` beside
|
|
35
|
-
* `AccountMenuLanguage`. The menu promotes the two buttons to `menuitem`s, so ↑/↓ reach
|
|
36
|
-
* them like every other row, and it stays open on a step: the person sees the page grow
|
|
37
|
-
* behind it and can step again. The size's name is a polite live region, so a step is
|
|
38
|
-
* announced.
|
|
39
|
-
*/
|
|
40
|
-
export function AccountMenuTextSize({ value, onChange, label, labels: labelsProp }: AccountMenuTextSizeProps) {
|
|
41
|
-
const labels = useAppearanceLabels(labelsProp);
|
|
42
|
-
const onHtml = useTextSize().size;
|
|
43
|
-
const size = value ?? onHtml;
|
|
44
|
-
const index = TEXT_SIZES.indexOf(size);
|
|
45
|
-
const step = (by: -1 | 1) => {
|
|
46
|
-
const next = TEXT_SIZES[index + by];
|
|
47
|
-
if (next) onChange(next);
|
|
48
|
-
};
|
|
49
|
-
return (
|
|
50
|
-
<li data-account-menu-text-size="" className="flex items-center gap-2 px-3 py-1.5 text-sm">
|
|
51
|
-
<ALargeSmall aria-hidden className="size-4 shrink-0 text-muted" />
|
|
52
|
-
<span className="min-w-0 flex-1 truncate">
|
|
53
|
-
{label ?? labels.textSize}
|
|
54
|
-
<span className="ms-2 text-xs text-muted" aria-live="polite">
|
|
55
|
-
{labels.textSizes[size]}
|
|
56
|
-
</span>
|
|
57
|
-
</span>
|
|
58
|
-
<IconButton
|
|
59
|
-
size="sm"
|
|
60
|
-
label={labels.textSmaller}
|
|
61
|
-
labelVisible={false}
|
|
62
|
-
tooltip={false}
|
|
63
|
-
disabled={index <= 0}
|
|
64
|
-
onClick={() => step(-1)}
|
|
65
|
-
>
|
|
66
|
-
<AArrowDown />
|
|
67
|
-
</IconButton>
|
|
68
|
-
<IconButton
|
|
69
|
-
size="sm"
|
|
70
|
-
label={labels.textLarger}
|
|
71
|
-
labelVisible={false}
|
|
72
|
-
tooltip={false}
|
|
73
|
-
disabled={index >= TEXT_SIZES.length - 1}
|
|
74
|
-
onClick={() => step(1)}
|
|
75
|
-
>
|
|
76
|
-
<AArrowUp />
|
|
77
|
-
</IconButton>
|
|
78
|
-
</li>
|
|
79
|
-
);
|
|
80
|
-
}
|
package/src/shell/admin-menu.tsx
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { Link } from "react-router";
|
|
2
|
-
import { ShieldCheck } from "lucide-react";
|
|
3
|
-
import { Chip } from "../components/chip";
|
|
4
|
-
import { MenuItem } from "../components/menu-item";
|
|
5
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
6
|
-
import { DEFAULT_ADMIN_AREA_LABELS, useAdminAreaLabels } from "../admin/admin-area-labels";
|
|
7
|
-
import type { AdminAreaLabels } from "../admin/admin-area-labels";
|
|
8
|
-
import type { TopBarMenuEntry } from "./topbar-action-menu";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* The account menu's "Administration" row (0.42.0, docs/admin-harmonization.md §2.1, §6.6,
|
|
12
|
-
* §7): the way into the admin area everyone finds, in every app, for an admin only. Two
|
|
13
|
-
* forms of one row — {@link adminMenuEntry} for `TopBarActionMenu`'s `entries`, and
|
|
14
|
-
* {@link AdminMenuRow} for a menu built from `HoverMenu` children (Kurvenschmiede's).
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/** The badge's text: nothing for none or 0, "99+" past 99. */
|
|
18
|
-
function badgeText(badge: number | null | undefined): string | null {
|
|
19
|
-
if (typeof badge !== "number" || !(badge > 0)) return null;
|
|
20
|
-
return badge > 99 ? "99+" : String(Math.floor(badge));
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The waiting count at the row's end: the `solid` count pill of {@link Chip}, in the
|
|
25
|
-
* pending count's tone, with the number for the eye and `adminArea.waiting` for a reader
|
|
26
|
-
* ("Administration, 3 waiting"). `null` for no count.
|
|
27
|
-
*/
|
|
28
|
-
function WaitingBadge({
|
|
29
|
-
badge,
|
|
30
|
-
labels,
|
|
31
|
-
className,
|
|
32
|
-
}: {
|
|
33
|
-
badge: number | null | undefined;
|
|
34
|
-
labels: AdminAreaLabels;
|
|
35
|
-
className?: string;
|
|
36
|
-
}) {
|
|
37
|
-
const text = badgeText(badge);
|
|
38
|
-
if (text === null) return null;
|
|
39
|
-
return (
|
|
40
|
-
<Chip size="sm" variant="solid" tone="warning" data-slot="admin-badge" className={className}>
|
|
41
|
-
<span aria-hidden>{text}</span>
|
|
42
|
-
{/* The comma parts it from the row's label in the name: "Administration, 3 waiting". */}
|
|
43
|
-
<span className="sr-only-fixed">, {labels.waiting(badge as number)}</span>
|
|
44
|
-
</Chip>
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface AdminWaitingBadgeProps {
|
|
49
|
-
/** The waiting count: only work that waits on this admin. `0`, `null` or none draws
|
|
50
|
-
* nothing; past 99 it reads "99+". */
|
|
51
|
-
count: number | null | undefined;
|
|
52
|
-
/** Prop > `<UiKitProvider labels={{ adminArea }}>` > English. */
|
|
53
|
-
labels?: LabelOverride<AdminAreaLabels>;
|
|
54
|
-
className?: string;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* The waiting pill of {@link AdminMenuRow} on its own (0.45, docs/admin-harmonization.md
|
|
59
|
-
* §9.3.4): the `solid` warning count, "99+" past 99, nothing for 0. Fit for `IconButton`'s
|
|
60
|
-
* `badge` — kastlan's top-bar platform button. There the badge is DECORATIVE (`aria-hidden`
|
|
61
|
-
* by IconButton), so the button's name carries the count: `adminArea.waitingLabel`.
|
|
62
|
-
*
|
|
63
|
-
* const area = useAdminAreaLabels();
|
|
64
|
-
* <IconButton
|
|
65
|
-
* label={waiting > 0 ? area.waitingLabel("Platform", waiting) : "Platform"}
|
|
66
|
-
* badge={<AdminWaitingBadge count={waiting} />}
|
|
67
|
-
* …
|
|
68
|
-
* />
|
|
69
|
-
*
|
|
70
|
-
* Read on its own (outside an IconButton), the pill still says ", 3 waiting" to a reader.
|
|
71
|
-
*/
|
|
72
|
-
export function AdminWaitingBadge({ count, labels: labelsProp, className }: AdminWaitingBadgeProps) {
|
|
73
|
-
const labels = useAdminAreaLabels(labelsProp);
|
|
74
|
-
return <WaitingBadge badge={count} labels={labels} className={className} />;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface AdminMenuEntryOptions {
|
|
78
|
-
/** The admin area. Default `/admin`. */
|
|
79
|
-
href?: string;
|
|
80
|
-
/**
|
|
81
|
-
* The waiting count (§2.4 decision 15, §6.3): only work that waits on this admin —
|
|
82
|
-
* `adminWaitingCount(attention, […])`. `0`, `null` or none shows no badge.
|
|
83
|
-
*/
|
|
84
|
-
badge?: number | null;
|
|
85
|
-
/**
|
|
86
|
-
* The resolved `adminArea` words — pass `useAdminAreaLabels()`, or the row is ENGLISH
|
|
87
|
-
* in every language: a plain function reads no provider (kastlan, 0.42 adoption). Builds
|
|
88
|
-
* no hook, so the entry can be made in the list of entries. {@link useAdminMenuEntry}
|
|
89
|
-
* (0.43) is the same entry with the provider's words read for you.
|
|
90
|
-
*/
|
|
91
|
-
labels?: AdminAreaLabels;
|
|
92
|
-
/** The entry's `key`. Default `"administration"`. */
|
|
93
|
-
key?: string;
|
|
94
|
-
/** The page already open: `aria-current` and a check mark. */
|
|
95
|
-
current?: boolean;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* The "Administration" {@link TopBarMenuEntry}: a link row with the `ShieldCheck` icon,
|
|
100
|
-
* the kit's word and the waiting count as its badge. Put it in the entries for an admin
|
|
101
|
-
* only — the menu closes on the way, as any link row:
|
|
102
|
-
*
|
|
103
|
-
* const labels = useAdminAreaLabels();
|
|
104
|
-
* entries={[…, ...(isAdmin ? [adminMenuEntry({ badge: waiting, labels })] : []), …]}
|
|
105
|
-
*
|
|
106
|
-
* A function, not a hook: it reads NO provider, so pass `labels` (`useAdminAreaLabels()`)
|
|
107
|
-
* or the row says "Administration" in every language — or call {@link useAdminMenuEntry}
|
|
108
|
-
* at the component's top.
|
|
109
|
-
*/
|
|
110
|
-
export function adminMenuEntry({
|
|
111
|
-
href = "/admin",
|
|
112
|
-
badge,
|
|
113
|
-
labels = DEFAULT_ADMIN_AREA_LABELS,
|
|
114
|
-
key = "administration",
|
|
115
|
-
current,
|
|
116
|
-
}: AdminMenuEntryOptions = {}): TopBarMenuEntry {
|
|
117
|
-
return {
|
|
118
|
-
kind: "link",
|
|
119
|
-
key,
|
|
120
|
-
to: href,
|
|
121
|
-
icon: <ShieldCheck className="size-4" aria-hidden />,
|
|
122
|
-
label: labels.title,
|
|
123
|
-
trailing: badgeText(badge) === null ? undefined : <WaitingBadge badge={badge} labels={labels} />,
|
|
124
|
-
current,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export interface UseAdminMenuEntryOptions extends Omit<AdminMenuEntryOptions, "labels"> {
|
|
129
|
-
/** Over the provider's `adminArea` words: prop > `<UiKitProvider labels={{ adminArea }}>`
|
|
130
|
-
* > English. */
|
|
131
|
-
labels?: LabelOverride<AdminAreaLabels>;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* {@link adminMenuEntry} with the provider's words (0.43, kastlan): the hook reads
|
|
136
|
-
* `useAdminAreaLabels()` itself, so the row is in the app's language without a `labels`
|
|
137
|
-
* to remember. Call it at the component's top, then put it in the entries:
|
|
138
|
-
*
|
|
139
|
-
* const admin = useAdminMenuEntry({ badge: waiting });
|
|
140
|
-
* entries={[…, ...(isAdmin ? [admin] : []), …]}
|
|
141
|
-
*/
|
|
142
|
-
export function useAdminMenuEntry({ labels: labelsProp, ...options }: UseAdminMenuEntryOptions = {}): TopBarMenuEntry {
|
|
143
|
-
const labels = useAdminAreaLabels(labelsProp);
|
|
144
|
-
return adminMenuEntry({ ...options, labels });
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export interface AdminMenuRowProps {
|
|
148
|
-
/** The admin area. Default `/admin`. */
|
|
149
|
-
href?: string;
|
|
150
|
-
/** As {@link AdminMenuEntryOptions.badge}. */
|
|
151
|
-
badge?: number | null;
|
|
152
|
-
/** Runs on the way — `HoverMenu`'s `close`. */
|
|
153
|
-
onNavigate?: () => void;
|
|
154
|
-
current?: boolean;
|
|
155
|
-
/** Prop > `<UiKitProvider labels={{ adminArea }}>` > English. */
|
|
156
|
-
labels?: LabelOverride<AdminAreaLabels>;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* The same row as {@link adminMenuEntry} for a menu drawn from `HoverMenu` children: the
|
|
161
|
-
* `<li>` holding the router-link {@link MenuItem} `TopBarActionMenu` draws for a link
|
|
162
|
-
* entry, so the two menus look alike.
|
|
163
|
-
*
|
|
164
|
-
* {(close) => <ul>… {isAdmin && <AdminMenuRow badge={waiting} onNavigate={close} />} …</ul>}
|
|
165
|
-
*/
|
|
166
|
-
export function AdminMenuRow({ href = "/admin", badge, onNavigate, current, labels: labelsProp }: AdminMenuRowProps) {
|
|
167
|
-
// The provider's words, as every kit part (0.43: through the namespace's own hook).
|
|
168
|
-
const labels = useAdminAreaLabels(labelsProp);
|
|
169
|
-
return (
|
|
170
|
-
<li>
|
|
171
|
-
<MenuItem
|
|
172
|
-
href={href}
|
|
173
|
-
renderLink={({ href: to, ...p }) => <Link to={to} {...p} />}
|
|
174
|
-
onClick={onNavigate ? () => onNavigate() : undefined}
|
|
175
|
-
leading={<ShieldCheck className="size-4" aria-hidden />}
|
|
176
|
-
trailing={badgeText(badge) === null ? undefined : <AdminWaitingBadge count={badge} labels={labels} />}
|
|
177
|
-
current={current}
|
|
178
|
-
>
|
|
179
|
-
{labels.title}
|
|
180
|
-
</MenuItem>
|
|
181
|
-
</li>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// The English words of ./app-shell, in a module with no component code: the English
|
|
2
|
-
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
|
-
// chunk like the other languages (0.34, KS U8). ./app-shell re-exports them.
|
|
4
|
-
|
|
5
|
-
import type { AppShellMoreLabels } from "./app-shell";
|
|
6
|
-
|
|
7
|
-
export const DEFAULT_APP_SHELL_MORE_LABELS: AppShellMoreLabels = {
|
|
8
|
-
more: "More",
|
|
9
|
-
moreTitle: "More pages",
|
|
10
|
-
overview: "Overview",
|
|
11
|
-
};
|