@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
package/src/theme/text-size.ts
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
import { useEffect, useMemo, useSyncExternalStore } from "react";
|
|
2
|
-
import { create } from "zustand";
|
|
3
|
-
import { persist } from "zustand/middleware";
|
|
4
|
-
import { logger } from "../lib/logger";
|
|
5
|
-
import { readStoredJson } from "../lib/safe-storage";
|
|
6
|
-
import { registerDeviceSetting } from "../lib/device-settings";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* The text size (docs/text-size-harmonization.md §2.1, §3.1, §10.3, §10.6).
|
|
10
|
-
*
|
|
11
|
-
* ONE scale on `<html>`: `data-text-size="normal|large|xlarge"`, and `tokens.css` turns
|
|
12
|
-
* it into `font-size: 100% / 125% / 150%` — percent, never px, so "Normal" keeps
|
|
13
|
-
* whatever size the person set in the browser. Tailwind's spacing and type are rem, so
|
|
14
|
-
* about 90 % of every screen grows with that one declaration; the breakpoints follow too
|
|
15
|
-
* (tokens.css redefines `sm:` … `3xl:` per size, {@link useBreakpoint} answers the same
|
|
16
|
-
* in JS).
|
|
17
|
-
*
|
|
18
|
-
* The names below are the mechanism's public vocabulary and are FROZEN: an app's
|
|
19
|
-
* storage, its `/auth/me` column (server-kit's `TEXT_SIZES`) and the inline boot snippet
|
|
20
|
-
* all spell them this way.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/** The three steps, in order (§2.1, §10.6): server-kit's `TEXT_SIZES`, value for value. */
|
|
24
|
-
export const TEXT_SIZES = ["normal", "large", "xlarge"] as const;
|
|
25
|
-
|
|
26
|
-
export type TextSize = (typeof TEXT_SIZES)[number];
|
|
27
|
-
|
|
28
|
-
/** The root font size each step sets, as a factor of the browser's own (tokens.css). For
|
|
29
|
-
* what CSS cannot reach: a canvas or SVG chart's px constants, a windowed list's row
|
|
30
|
-
* estimate, a popover width in px (§3.2). */
|
|
31
|
-
export const TEXT_SCALE: Readonly<Record<TextSize, number>> = { normal: 1, large: 1.25, xlarge: 1.5 };
|
|
32
|
-
|
|
33
|
-
/** The attribute on `<html>` that carries the size. */
|
|
34
|
-
const TEXT_SIZE_ATTRIBUTE = "data-text-size";
|
|
35
|
-
|
|
36
|
-
export function isTextSize(value: unknown): value is TextSize {
|
|
37
|
-
return value === "normal" || value === "large" || value === "xlarge";
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* The size in force: **this device's own choice → the account's → Normal** (§2.2, §2.6).
|
|
42
|
-
* Each is taken only when it is one of {@link TEXT_SIZES}; anything else (a stale value,
|
|
43
|
-
* `null` = never chosen) falls through to the next. The one order the pre-paint call, the
|
|
44
|
-
* apply hook and `useAccountAppearance` all use, so the three can never disagree.
|
|
45
|
-
*/
|
|
46
|
-
export function resolveTextSize(device: unknown, account?: unknown): TextSize {
|
|
47
|
-
if (isTextSize(device)) return device;
|
|
48
|
-
if (isTextSize(account)) return account;
|
|
49
|
-
return "normal";
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/* ── <html data-text-size> and the subscribers that read it ─────────────── */
|
|
53
|
-
|
|
54
|
-
const listeners = new Set<() => void>();
|
|
55
|
-
let observer: MutationObserver | null = null;
|
|
56
|
-
|
|
57
|
-
function notify(): void {
|
|
58
|
-
for (const listener of listeners) listener();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function subscribe(listener: () => void): () => void {
|
|
62
|
-
listeners.add(listener);
|
|
63
|
-
// Also catches writers that are not this module — the inline boot snippet, an app
|
|
64
|
-
// setting the attribute by hand, a test.
|
|
65
|
-
if (!observer && typeof MutationObserver !== "undefined" && typeof document !== "undefined") {
|
|
66
|
-
observer = new MutationObserver(notify);
|
|
67
|
-
observer.observe(document.documentElement, { attributes: true, attributeFilter: [TEXT_SIZE_ATTRIBUTE] });
|
|
68
|
-
}
|
|
69
|
-
return () => {
|
|
70
|
-
listeners.delete(listener);
|
|
71
|
-
if (listeners.size === 0) {
|
|
72
|
-
observer?.disconnect();
|
|
73
|
-
observer = null;
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** The size `<html>` carries now; Normal without one (or outside a browser). */
|
|
79
|
-
export function readTextSize(): TextSize {
|
|
80
|
-
if (typeof document === "undefined") return "normal";
|
|
81
|
-
const value = document.documentElement.getAttribute(TEXT_SIZE_ATTRIBUTE);
|
|
82
|
-
return isTextSize(value) ? value : "normal";
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/** Put `size` on `<html>`. Every {@link useTextSize} re-renders with it. */
|
|
86
|
-
export function applyTextSize(size: TextSize): void {
|
|
87
|
-
if (typeof document === "undefined") return;
|
|
88
|
-
const root = document.documentElement;
|
|
89
|
-
if (root.getAttribute(TEXT_SIZE_ATTRIBUTE) === size) return;
|
|
90
|
-
root.setAttribute(TEXT_SIZE_ATTRIBUTE, size);
|
|
91
|
-
notify();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export interface TextSizeInfo {
|
|
95
|
-
size: TextSize;
|
|
96
|
-
/** {@link TEXT_SCALE} for `size`: 1, 1.25 or 1.5. */
|
|
97
|
-
scale: number;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* The size in force on this page, and its scale (§3.1) — read from `<html>`, so it needs
|
|
102
|
-
* no store and works in every kit component: whoever applied the size (the app's store,
|
|
103
|
-
* the pre-paint call, the inline snippet), this follows it.
|
|
104
|
-
*
|
|
105
|
-
* Only for what CSS cannot do. A class that should differ at Large is a `large:`
|
|
106
|
-
* variant; a layout switch is a breakpoint, which already scales.
|
|
107
|
-
*/
|
|
108
|
-
export function useTextSize(): TextSizeInfo {
|
|
109
|
-
const size = useSyncExternalStore(subscribe, readTextSize, () => "normal" as const);
|
|
110
|
-
return useMemo(() => ({ size, scale: TEXT_SCALE[size] }), [size]);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/* ── Storage: the frozen format, the pre-paint call ─────────────────────── */
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* What a text-size store persists under its key — zustand's persist envelope, and FROZEN
|
|
117
|
-
* (§10.3) because an app's inline `<head>` snippet reads it before any module loads:
|
|
118
|
-
*
|
|
119
|
-
* {"state":{"size":"large"},"version":1}
|
|
120
|
-
*
|
|
121
|
-
* `size` is one of {@link TEXT_SIZES}, or `null` / absent when this device never chose.
|
|
122
|
-
* A future change adds a key; it never renames `state.size` or changes its values.
|
|
123
|
-
*
|
|
124
|
-
* A hand-written seed (a test, a screenshot script) must carry `"version":1`: the store
|
|
125
|
-
* drops a stored state of another version as a migration it doesn't know, silently
|
|
126
|
-
* (keksdose's 0.32 report). The inline snippet reads `state.size` whatever the version,
|
|
127
|
-
* so the two would disagree. In the kit's showcase, `?text-size=` needs no seed.
|
|
128
|
-
*/
|
|
129
|
-
export interface PersistedTextSize {
|
|
130
|
-
state?: { size?: TextSize | null };
|
|
131
|
-
version?: number;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** The frozen format holding a size this kit knows — the shape `readStoredJson` admits. */
|
|
135
|
-
const holdsTextSize = (blob: unknown): blob is { state: { size: TextSize } } =>
|
|
136
|
-
isTextSize((blob as PersistedTextSize | null)?.state?.size);
|
|
137
|
-
|
|
138
|
-
/** This device's own choice under `storageKey`, or `null` when it never chose (or the
|
|
139
|
-
* storage is blocked, malformed, or holds a value that is not a size). */
|
|
140
|
-
export function readPersistedTextSize(storageKey: string): TextSize | null {
|
|
141
|
-
return readStoredJson(storageKey, holdsTextSize)?.state.size ?? null;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export interface PersistedAppearanceOptions {
|
|
145
|
-
/**
|
|
146
|
-
* The account's last known value, for a device without a choice of its own (§10.3):
|
|
147
|
-
* what the app persisted with its user (keksdose keeps `/auth/me` in localStorage), so
|
|
148
|
-
* a cold boot paints the account's size instead of Normal and then jumping — offline
|
|
149
|
-
* too. Called once, guarded: a throw counts as "no account value".
|
|
150
|
-
*/
|
|
151
|
-
account?: () => string | null | undefined;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function readAccount(account: PersistedAppearanceOptions["account"]): unknown {
|
|
155
|
-
if (!account) return undefined;
|
|
156
|
-
try {
|
|
157
|
-
return account();
|
|
158
|
-
} catch {
|
|
159
|
-
return undefined;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Pre-paint (§3.1, §10.3): read this device's choice under `storageKey` — else the
|
|
165
|
-
* account's last known value — and put it on `<html>` BEFORE `createRoot`, next to
|
|
166
|
-
* `applyPersistedTheme`, so the first paint already has the right size. Returns the size
|
|
167
|
-
* applied.
|
|
168
|
-
*
|
|
169
|
-
* ```ts
|
|
170
|
-
* applyPersistedTextSize("keksdose-text-size", {
|
|
171
|
-
* account: () => readPersistedUser()?.text_size,
|
|
172
|
-
* });
|
|
173
|
-
* ```
|
|
174
|
-
*/
|
|
175
|
-
export function applyPersistedTextSize(storageKey: string, options: PersistedAppearanceOptions = {}): TextSize {
|
|
176
|
-
const size = resolveTextSize(readPersistedTextSize(storageKey), readAccount(options.account));
|
|
177
|
-
applyTextSize(size);
|
|
178
|
-
return size;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* The same pre-paint as {@link applyPersistedTextSize}, as an inline `<head>` script for
|
|
183
|
-
* a boot splash painted from `index.html` before any module runs (§10.3). A function
|
|
184
|
-
* EXPRESSION: call it with the storage key and, optionally, a function returning the
|
|
185
|
-
* account's last known value.
|
|
186
|
-
*
|
|
187
|
-
* ```html
|
|
188
|
-
* <script>
|
|
189
|
-
* (function(k,a){…})("keksdose-text-size", function () {
|
|
190
|
-
* return JSON.parse(localStorage.getItem("keksdose-auth")).state.user.text_size;
|
|
191
|
-
* });
|
|
192
|
-
* </script>
|
|
193
|
-
* ```
|
|
194
|
-
*
|
|
195
|
-
* Paste the constant's value in place of `(function(k,a){…})`. It reads the frozen
|
|
196
|
-
* {@link PersistedTextSize} format, never throws, and sets only `data-text-size`.
|
|
197
|
-
*
|
|
198
|
-
* The splash sizes in rem, and needs the root rules inline beside it, since the app's
|
|
199
|
-
* stylesheet is a separate request and arrives after the splash paints (0.32.1,
|
|
200
|
-
* keksdose's 0.32 report: that is every app, not an edge case):
|
|
201
|
-
*
|
|
202
|
-
* ```html
|
|
203
|
-
* <style>html[data-text-size=large]{font-size:125%}html[data-text-size=xlarge]{font-size:150%}</style>
|
|
204
|
-
* ```
|
|
205
|
-
*
|
|
206
|
-
* Under a hash-based Content Security Policy (`script-src 'sha256-…'`) this is a second
|
|
207
|
-
* inline script with its own hash: add it to the policy, and recompute it whenever the
|
|
208
|
-
* storage key or the account function in the call changes (keksdose added it to both
|
|
209
|
-
* its Caddyfiles, and its guard test hashes every inline script).
|
|
210
|
-
*/
|
|
211
|
-
export const TEXT_SIZE_INLINE_SCRIPT =
|
|
212
|
-
"(function(k,a){function ok(v){return v==='normal'||v==='large'||v==='xlarge'}" +
|
|
213
|
-
"var v=null;try{var s=JSON.parse(localStorage.getItem(k)||'null');v=s&&s.state&&s.state.size}catch(e){}" +
|
|
214
|
-
"if(!ok(v)){v=null;try{v=a?a():null}catch(e){}}" +
|
|
215
|
-
"try{document.documentElement.setAttribute('data-text-size',ok(v)?v:'normal')}catch(e){}})";
|
|
216
|
-
|
|
217
|
-
/* ── The store ──────────────────────────────────────────────────────────── */
|
|
218
|
-
|
|
219
|
-
export interface TextSizeState {
|
|
220
|
-
/** This device's own choice (persisted), or `null` when it never chose — then the
|
|
221
|
-
* account's value applies (§2.2). */
|
|
222
|
-
size: TextSize | null;
|
|
223
|
-
/** Store this device's choice; `null` forgets it, so the account's applies again. */
|
|
224
|
-
setSize: (size: TextSize | null) => void;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export interface ApplyTextSizeOptions {
|
|
228
|
-
/** The account's value (`/auth/me`'s `text_size`): it applies while this device has no
|
|
229
|
-
* choice of its own. Leave it out where there is no account. */
|
|
230
|
-
account?: string | null;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Build a text-size store bound to a consumer-supplied localStorage key, shaped like
|
|
235
|
-
* `createThemeStore` (§6). It holds the DEVICE's choice only; the account's value comes
|
|
236
|
-
* in through `useApplyTextSize({ account })` and `useAccountAppearance`, and the size in
|
|
237
|
-
* force is always {@link resolveTextSize} of the two.
|
|
238
|
-
*
|
|
239
|
-
* - `useTextSizeStore` — the zustand hook: `size` (device choice or null) and `setSize`.
|
|
240
|
-
* - `useApplyTextSize({ account })` — the effect that puts the size in force on `<html>`.
|
|
241
|
-
* Mount it once near the root, beside `useApplyTheme`.
|
|
242
|
-
*
|
|
243
|
-
* The persisted format is {@link PersistedTextSize}, and frozen.
|
|
244
|
-
*/
|
|
245
|
-
export function createTextSizeStore(storageKey: string) {
|
|
246
|
-
const useTextSizeStore = create<TextSizeState>()(
|
|
247
|
-
logger(
|
|
248
|
-
persist(
|
|
249
|
-
(set) => ({
|
|
250
|
-
size: null,
|
|
251
|
-
setSize: (size) => set({ size: isTextSize(size) ? size : null }),
|
|
252
|
-
}),
|
|
253
|
-
{
|
|
254
|
-
name: storageKey,
|
|
255
|
-
version: 1,
|
|
256
|
-
partialize: (s) => ({ size: s.size }),
|
|
257
|
-
// A hand-edited or future value must not reach <html> as an unknown size.
|
|
258
|
-
merge: (persisted, current) => ({
|
|
259
|
-
...current,
|
|
260
|
-
size: isTextSize((persisted as { size?: unknown } | null)?.size)
|
|
261
|
-
? (persisted as { size: TextSize }).size
|
|
262
|
-
: null,
|
|
263
|
-
}),
|
|
264
|
-
},
|
|
265
|
-
),
|
|
266
|
-
"text-size",
|
|
267
|
-
),
|
|
268
|
-
);
|
|
269
|
-
// Reset this device's settings (docs/settings-harmonization.md §11.4): no choice on
|
|
270
|
-
// this device, so `useApplyTextSize` re-resolves to the account's size, else Normal.
|
|
271
|
-
registerDeviceSetting({
|
|
272
|
-
key: storageKey,
|
|
273
|
-
kind: "appearance",
|
|
274
|
-
reset: () => useTextSizeStore.getState().setSize(null),
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
function useApplyTextSize({ account }: ApplyTextSizeOptions = {}): TextSize {
|
|
278
|
-
const device = useTextSizeStore((s) => s.size);
|
|
279
|
-
const size = resolveTextSize(device, account);
|
|
280
|
-
useEffect(() => {
|
|
281
|
-
applyTextSize(size);
|
|
282
|
-
}, [size]);
|
|
283
|
-
return size;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
return { useTextSizeStore, useApplyTextSize };
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
export type TextSizeStore = ReturnType<typeof createTextSizeStore>;
|
package/src/theme/theme-store.ts
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
import { create } from "zustand";
|
|
3
|
-
import { persist } from "zustand/middleware";
|
|
4
|
-
import { logger } from "../lib/logger";
|
|
5
|
-
import { readStoredJson } from "../lib/safe-storage";
|
|
6
|
-
import { registerDeviceSetting } from "../lib/device-settings";
|
|
7
|
-
|
|
8
|
-
export type ThemeMode = "light" | "dark";
|
|
9
|
-
/** What the user chose; "system" tracks the OS `prefers-color-scheme`. */
|
|
10
|
-
export type ThemePreference = "light" | "dark" | "system";
|
|
11
|
-
|
|
12
|
-
export interface ThemeState {
|
|
13
|
-
/** The user's choice (persisted). */
|
|
14
|
-
preference: ThemePreference;
|
|
15
|
-
/** The RESOLVED light/dark actually in effect (system → OS). Read this for
|
|
16
|
-
* anything that needs the concrete theme (e.g. token selection, toasts). */
|
|
17
|
-
mode: ThemeMode;
|
|
18
|
-
setPreference: (preference: ThemePreference) => void;
|
|
19
|
-
/** Set an explicit light/dark choice (preference follows). */
|
|
20
|
-
setMode: (mode: ThemeMode) => void;
|
|
21
|
-
/** Flip the effective theme to the opposite explicit choice. */
|
|
22
|
-
toggle: () => void;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function systemPreference(): ThemeMode {
|
|
26
|
-
try {
|
|
27
|
-
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
28
|
-
} catch {
|
|
29
|
-
return "light";
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function resolve(preference: ThemePreference): ThemeMode {
|
|
34
|
-
return preference === "system" ? systemPreference() : preference;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Normalize a persisted theme-state blob to a valid preference. Older blobs
|
|
38
|
-
* persisted the concrete `mode` (light/dark); carry that over as an explicit
|
|
39
|
-
* preference so the choice survives. Shared by the store's `migrate` and the
|
|
40
|
-
* pre-hydration {@link applyPersistedTheme}. */
|
|
41
|
-
function preferenceFromState(s: { mode?: string; preference?: string } | null | undefined): ThemePreference {
|
|
42
|
-
if (s?.preference === "light" || s?.preference === "dark" || s?.preference === "system") {
|
|
43
|
-
return s.preference;
|
|
44
|
-
}
|
|
45
|
-
if (s?.mode === "light" || s?.mode === "dark") return s.mode;
|
|
46
|
-
return "system";
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Toggle the `.dark` class on <html> for a resolved light/dark mode, and say the same
|
|
51
|
-
* to the BROWSER through `color-scheme` (0.47, keksdose dev #600): the class switches
|
|
52
|
-
* the kit's tokens, but everything the browser paints itself — a native `<select>`'s
|
|
53
|
-
* open list, a date input's popup, scrollbars, autofill — follows `color-scheme` only,
|
|
54
|
-
* and stayed light on the dark theme. Inline on <html>, so it holds whatever an app's
|
|
55
|
-
* stylesheet says, and it is set by the pre-paint {@link applyPersistedTheme} too.
|
|
56
|
-
*/
|
|
57
|
-
function applyThemeClass(mode: ThemeMode): void {
|
|
58
|
-
const root = document.documentElement;
|
|
59
|
-
if (mode === "dark") root.classList.add("dark");
|
|
60
|
-
else root.classList.remove("dark");
|
|
61
|
-
root.style.colorScheme = mode;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** zustand's envelope, any object; `preferenceFromState` reads only the two names it knows. */
|
|
65
|
-
const isEnvelope = (blob: unknown): blob is { state?: { mode?: string; preference?: string } } =>
|
|
66
|
-
typeof blob === "object" && blob !== null;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Pre-hydration: read the theme PREFERENCE persisted under `storageKey` straight
|
|
70
|
-
* from localStorage, resolve it to a concrete light/dark mode, and toggle the
|
|
71
|
-
* `.dark` class (and `color-scheme`) on <html> — BEFORE React and the store mount,
|
|
72
|
-
* so the first paint already has the right theme (no flash). Returns the resolved
|
|
73
|
-
* mode so the caller can chain {@link applyPersistedPalette}. Encapsulates the
|
|
74
|
-
* zustand-persist envelope + the legacy `mode`→`preference` fallback so apps never re-type the
|
|
75
|
-
* storage shape in their entrypoint.
|
|
76
|
-
*/
|
|
77
|
-
export function applyPersistedTheme(storageKey: string): ThemeMode {
|
|
78
|
-
// Absent, blocked or malformed storage → "system", through `preferenceFromState`.
|
|
79
|
-
const preference = preferenceFromState(readStoredJson(storageKey, isEnvelope)?.state);
|
|
80
|
-
const mode = resolve(preference);
|
|
81
|
-
applyThemeClass(mode);
|
|
82
|
-
return mode;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Build a theme store bound to a consumer-supplied localStorage key. Tracks a
|
|
87
|
-
* light/dark/system PREFERENCE (feedback #330) and exposes the resolved `mode`.
|
|
88
|
-
* Returns the `useTheme` hook plus a `useApplyTheme` effect that toggles the
|
|
89
|
-
* `.dark` class on <html> and, while on "system", follows OS theme changes live.
|
|
90
|
-
*/
|
|
91
|
-
export function createThemeStore(storageKey: string) {
|
|
92
|
-
const useTheme = create<ThemeState>()(
|
|
93
|
-
logger(
|
|
94
|
-
persist(
|
|
95
|
-
(set, get) => ({
|
|
96
|
-
preference: "system" as ThemePreference,
|
|
97
|
-
mode: systemPreference(),
|
|
98
|
-
setPreference: (preference) => set({ preference, mode: resolve(preference) }),
|
|
99
|
-
setMode: (mode) => set({ preference: mode, mode }),
|
|
100
|
-
toggle: () => {
|
|
101
|
-
const next: ThemeMode = get().mode === "dark" ? "light" : "dark";
|
|
102
|
-
set({ preference: next, mode: next });
|
|
103
|
-
},
|
|
104
|
-
}),
|
|
105
|
-
{
|
|
106
|
-
name: storageKey,
|
|
107
|
-
version: 2,
|
|
108
|
-
// Only the preference is persisted; `mode` is derived on load.
|
|
109
|
-
partialize: (s) => ({ preference: s.preference }),
|
|
110
|
-
migrate: (persistedState): { preference: ThemePreference } => ({
|
|
111
|
-
preference: preferenceFromState(persistedState as { mode?: string; preference?: string } | null),
|
|
112
|
-
}),
|
|
113
|
-
onRehydrateStorage: () => (state) => {
|
|
114
|
-
// The persisted preference decides the concrete mode at load.
|
|
115
|
-
if (state) state.mode = resolve(state.preference);
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
),
|
|
119
|
-
"theme",
|
|
120
|
-
),
|
|
121
|
-
);
|
|
122
|
-
// Reset this device's settings (docs/settings-harmonization.md §11.4): back to
|
|
123
|
-
// "System" through the setter, which re-resolves `mode`; `useApplyTheme` puts the
|
|
124
|
-
// class back and follows the OS again, and the persisted blob is what the pre-paint
|
|
125
|
-
// `applyPersistedTheme` reads next load.
|
|
126
|
-
registerDeviceSetting({
|
|
127
|
-
key: storageKey,
|
|
128
|
-
kind: "appearance",
|
|
129
|
-
reset: () => useTheme.getState().setPreference("system"),
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
function useApplyTheme(): void {
|
|
133
|
-
const mode = useTheme((s) => s.mode);
|
|
134
|
-
const preference = useTheme((s) => s.preference);
|
|
135
|
-
useEffect(() => {
|
|
136
|
-
applyThemeClass(mode);
|
|
137
|
-
}, [mode]);
|
|
138
|
-
// While tracking the system, follow OS theme changes live.
|
|
139
|
-
useEffect(() => {
|
|
140
|
-
if (preference !== "system") return;
|
|
141
|
-
let mq: MediaQueryList;
|
|
142
|
-
try {
|
|
143
|
-
mq = window.matchMedia("(prefers-color-scheme: dark)");
|
|
144
|
-
} catch {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
const onChange = () => useTheme.setState({ mode: mq.matches ? "dark" : "light" });
|
|
148
|
-
onChange();
|
|
149
|
-
mq.addEventListener?.("change", onChange);
|
|
150
|
-
return () => mq.removeEventListener?.("change", onChange);
|
|
151
|
-
}, [preference]);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return { useTheme, useApplyTheme };
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export type ThemeStore = ReturnType<typeof createThemeStore>;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// The English words of `TourCatalogue` and `TourCatalogueCard` (docs/tours-harmonization.md
|
|
2
|
-
// §3), in a module with no component code, like every `*-labels.ts` (0.34, KS U8).
|
|
3
|
-
// keksdose's reviewed words (tour.* in its en.json) where it had them.
|
|
4
|
-
|
|
5
|
-
/** The `tourCatalogue` namespace. Counts arrive as numbers, dates already formatted. */
|
|
6
|
-
export interface TourCatalogueLabels {
|
|
7
|
-
/** The search box's name. */
|
|
8
|
-
searchLabel: string;
|
|
9
|
-
searchPlaceholder: string;
|
|
10
|
-
/** The group select's name (keksdose: "Topic"). */
|
|
11
|
-
groupLabel: string;
|
|
12
|
-
/** The select's first option, with the count the other filters leave. */
|
|
13
|
-
groupAll: (count: number) => string;
|
|
14
|
-
/** A group's option: its title and its count. */
|
|
15
|
-
groupOption: (group: string, count: number) => string;
|
|
16
|
-
/** The all / to do / done toggle's name. */
|
|
17
|
-
stateLabel: string;
|
|
18
|
-
stateAll: (count: number) => string;
|
|
19
|
-
stateTodo: (count: number) => string;
|
|
20
|
-
stateDone: (count: number) => string;
|
|
21
|
-
/** Under the filter bar while a filter is on. */
|
|
22
|
-
showing: (shown: number, total: number) => string;
|
|
23
|
-
noMatches: string;
|
|
24
|
-
noMatchesHint: string;
|
|
25
|
-
clearFilters: string;
|
|
26
|
-
/** The NEW pill. */
|
|
27
|
-
badgeNew: string;
|
|
28
|
-
/** The pill on a tour reset by an update (§8). */
|
|
29
|
-
badgeUpdated: string;
|
|
30
|
-
/** A reset tour's line: the update's day (formatted) and its reason (§8); `reason` is
|
|
31
|
-
* left out when the tour's update carries none. */
|
|
32
|
-
resetOn: (date: string, reason?: string) => string;
|
|
33
|
-
/** The points chip. */
|
|
34
|
-
points: (count: number) => string;
|
|
35
|
-
steps: (count: number) => string;
|
|
36
|
-
/** The duration, in minutes. */
|
|
37
|
-
duration: (minutes: number) => string;
|
|
38
|
-
/** Completed, with the day (formatted). */
|
|
39
|
-
completedOn: (date: string) => string;
|
|
40
|
-
/** Completed without a date (kastlan's old id list, §6.2). */
|
|
41
|
-
completed: string;
|
|
42
|
-
/** Not taken yet — the state icon, for a reader. */
|
|
43
|
-
notCompleted: string;
|
|
44
|
-
markUndone: string;
|
|
45
|
-
start: string;
|
|
46
|
-
replay: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export const DEFAULT_TOUR_CATALOGUE_LABELS: TourCatalogueLabels = {
|
|
50
|
-
searchLabel: "Search tours",
|
|
51
|
-
searchPlaceholder: "Search tours…",
|
|
52
|
-
groupLabel: "Topic",
|
|
53
|
-
groupAll: (count) => `All topics (${count})`,
|
|
54
|
-
groupOption: (group, count) => `${group} (${count})`,
|
|
55
|
-
stateLabel: "Filter tours",
|
|
56
|
-
stateAll: (count) => `All (${count})`,
|
|
57
|
-
stateTodo: (count) => `Not taken (${count})`,
|
|
58
|
-
stateDone: (count) => `Completed (${count})`,
|
|
59
|
-
showing: (shown, total) => `Showing ${shown} of ${total} tours`,
|
|
60
|
-
noMatches: "No tour matches",
|
|
61
|
-
noMatchesHint: "Try another word, or clear the filter.",
|
|
62
|
-
clearFilters: "Clear filters",
|
|
63
|
-
badgeNew: "New",
|
|
64
|
-
badgeUpdated: "Updated",
|
|
65
|
-
resetOn: (date, reason) => (reason ? `Reset on ${date}: ${reason}` : `Reset on ${date}`),
|
|
66
|
-
points: (count) => `+${count} pts`,
|
|
67
|
-
steps: (count) => (count === 1 ? "1 step" : `${count} steps`),
|
|
68
|
-
duration: (minutes) => `About ${minutes} min`,
|
|
69
|
-
completedOn: (date) => `Completed on ${date}`,
|
|
70
|
-
completed: "Completed",
|
|
71
|
-
notCompleted: "Not completed",
|
|
72
|
-
markUndone: "Mark as not done",
|
|
73
|
-
start: "Start",
|
|
74
|
-
replay: "Replay",
|
|
75
|
-
};
|