@eifi1/ui-kit 0.53.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -82
- package/dist/account/delete-account-setting.d.ts +3 -2
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +36 -0
- package/dist/auth/auth-errors.js +20 -0
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +2 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +6 -4
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.d.ts +2 -1
- package/dist/components/currency-option-list.js +10 -3
- package/dist/components/currency-option-list.js.map +1 -1
- package/dist/components/currency-select.d.ts +3 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +22 -1
- package/dist/components/danger-confirm.js +52 -30
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +2 -1
- package/dist/components/data-table-filter-popover.js +3 -2
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +33 -3
- package/dist/components/data-table-filters.js +6 -4
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +5 -1
- package/dist/components/dialog-frame.js +6 -2
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +16 -7
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +48 -0
- package/dist/components/modal.js +26 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/stat-tile.d.ts +21 -2
- package/dist/components/stat-tile.js +4 -2
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/currencies.d.ts +16 -2
- package/dist/currencies.js +2 -1
- package/dist/currencies.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-context-labels.js +2 -1
- package/dist/feedback/feedback-context-labels.js.map +1 -1
- package/dist/feedback/feedback-context.d.ts +19 -3
- package/dist/feedback/feedback-context.js +12 -1
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-diagnostics.d.ts +17 -0
- package/dist/feedback/feedback-diagnostics.js +27 -0
- package/dist/feedback/feedback-diagnostics.js.map +1 -0
- package/dist/feedback/feedback-dialog.d.ts +10 -0
- package/dist/feedback/feedback-dialog.js +6 -4
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-record.d.ts +5 -0
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +1 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +3 -0
- package/dist/feedback/feedback-row-detail.js +3 -0
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
- package/dist/feedback/feedback-submit-dialog.js +15 -3
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.d.ts +30 -2
- package/dist/feedback/feedback-submit.js +5 -2
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +2 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +78 -4
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +95 -5
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +74 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +75 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +77 -4
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +77 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +74 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +27 -8
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +36 -4
- package/dist/lib/dates.js +49 -13
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/format.d.ts +37 -2
- package/dist/lib/format.js +25 -1
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/intl-cache.d.ts +4 -2
- package/dist/lib/intl-cache.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/translation-review.d.ts +26 -0
- package/dist/lib/translation-review.js +14 -0
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -341
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -370
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -815
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -594
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -180
- package/src/components/currency-select.tsx +0 -341
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -934
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -281
- package/src/components/data-table-filters.ts +0 -287
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -276
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -789
- package/src/components/modal.tsx +0 -505
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -558
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -725
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -70
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -10
- package/src/feedback/feedback-context.tsx +0 -213
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -440
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -423
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -30
- package/src/feedback/feedback-row-detail.tsx +0 -858
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -118
- package/src/feedback/feedback-submit.tsx +0 -237
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -189
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2057
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1997
- package/src/i18n/locales/fr.ts +0 -2035
- package/src/i18n/locales/hu.ts +0 -2002
- package/src/i18n/locales/it.ts +0 -2012
- package/src/i18n/locales/zh.ts +0 -1910
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1179
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -266
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -522
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -25
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -717
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
contrast,
|
|
3
|
-
hexToOklch,
|
|
4
|
-
luminance,
|
|
5
|
-
oklchToHex,
|
|
6
|
-
oklchToRgb,
|
|
7
|
-
parseHex,
|
|
8
|
-
rgbToOklch,
|
|
9
|
-
solveLightness,
|
|
10
|
-
toHex,
|
|
11
|
-
} from "./color";
|
|
12
|
-
import type { TokenSet } from "./palette-presets";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* The "More contrast" step on a token set (docs/text-size-harmonization.md §5, §10.5).
|
|
16
|
-
* INTERNAL — `applyTokenSet` and the contrast layer share it; it is not re-exported.
|
|
17
|
-
*
|
|
18
|
-
* The step happens HERE, in JS, because the tokens it changes are written inline on
|
|
19
|
-
* `<html>` by `applyTokenSet`: an inline value beats any `[data-contrast=more]` rule and
|
|
20
|
-
* any `@media (prefers-contrast: more)` block, so a stylesheet cannot do it (§10.5, the
|
|
21
|
-
* keksdose review). `--text-placeholder` is a CSS-derived token, and it is written inline
|
|
22
|
-
* here too rather than redefined per attribute in tokens.css.
|
|
23
|
-
*
|
|
24
|
-
* What moves (§5):
|
|
25
|
-
* - `--text-muted` becomes the set's `--text-secondary`;
|
|
26
|
-
* - `--text-secondary` moves halfway to `--text-primary`;
|
|
27
|
-
* - `--text-placeholder` becomes the set's `--text-muted` (4.6–5.5:1 on every shipped
|
|
28
|
-
* preset, where the CSS formula gives 2.4–2.8:1) — the order primary > secondary >
|
|
29
|
-
* muted > placeholder survives the step;
|
|
30
|
-
* - `--border` moves toward `--text-primary` until it clears 3:1 against the worst of the
|
|
31
|
-
* three surfaces (WCAG 1.4.11, a field's boundary), and never less far than
|
|
32
|
-
* `--border-strong`'s 45 % — so every border is at least as strong as a "strong" one was.
|
|
33
|
-
* `--border-strong` stays derived in tokens.css and grows with it;
|
|
34
|
-
* - in a LIGHT set only (0.36, docs/colour-roles-harmonization.md §13): the well
|
|
35
|
-
* (`--bg-surface-2`) becomes {@link WELL_INK_MORE} of `--text-primary` mixed into the
|
|
36
|
-
* card, and each of the four money colours that falls under 4.5:1 on that well is
|
|
37
|
-
* solved darker at its own hue and chroma. The border above is solved against the
|
|
38
|
-
* stepped well. A dark set's well stands 1.11–1.13:1 from its card already, and its
|
|
39
|
-
* money has no room: nothing of it steps.
|
|
40
|
-
*
|
|
41
|
-
* What does NOT move here, because it is not inline: the light status, hue and field-sync
|
|
42
|
-
* literals and `--bg-active` step in tokens.css's `:root[data-contrast="more"]:not(.dark)`
|
|
43
|
-
* block, solved over these stepped wells.
|
|
44
|
-
*/
|
|
45
|
-
|
|
46
|
-
/** The custom properties a contrast step writes. The last five only for a light set. */
|
|
47
|
-
export const CONTRAST_STEPPED_VARS = [
|
|
48
|
-
"--text-secondary",
|
|
49
|
-
"--text-muted",
|
|
50
|
-
"--text-placeholder",
|
|
51
|
-
"--border",
|
|
52
|
-
"--bg-surface-2",
|
|
53
|
-
"--money-income",
|
|
54
|
-
"--money-expense",
|
|
55
|
-
"--money-net",
|
|
56
|
-
"--money-neutral",
|
|
57
|
-
] as const;
|
|
58
|
-
|
|
59
|
-
/** The light well under More contrast and the money that reads on it (§13.4). */
|
|
60
|
-
export interface WellStep {
|
|
61
|
-
bgSurface2: string;
|
|
62
|
-
moneyIncome: string;
|
|
63
|
-
moneyExpense: string;
|
|
64
|
-
moneyNet: string;
|
|
65
|
-
moneyNeutral: string;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface ContrastStep {
|
|
69
|
-
textSecondary: string;
|
|
70
|
-
textMuted: string;
|
|
71
|
-
textPlaceholder: string;
|
|
72
|
-
border: string;
|
|
73
|
-
/** The stepped well and money, or null for a dark set (which does not step them). */
|
|
74
|
-
well: WellStep | null;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
interface Lab {
|
|
78
|
-
l: number;
|
|
79
|
-
a: number;
|
|
80
|
-
b: number;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function toLab(hex: string): Lab | null {
|
|
84
|
-
const rgb = parseHex(hex);
|
|
85
|
-
if (!rgb) return null;
|
|
86
|
-
const { l, c, h } = rgbToOklch(rgb);
|
|
87
|
-
const rad = (h * Math.PI) / 180;
|
|
88
|
-
return { l, a: c * Math.cos(rad), b: c * Math.sin(rad) };
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/** `color-mix(in oklab, a p, b)` as a hex — the same formula tokens.css's derived roles
|
|
92
|
-
* use, so a stepped value sits where the stylesheet would have put it. A colour that is
|
|
93
|
-
* not hex (a consumer's own token set) comes back unmixed. The deriver mixes with it
|
|
94
|
-
* too (`--bg-hover`, `--brand-muted`, `--brand-bg`, `--brand-bg-hover`). */
|
|
95
|
-
export function mix(a: string, b: string, p: number): string {
|
|
96
|
-
const A = toLab(a);
|
|
97
|
-
const B = toLab(b);
|
|
98
|
-
if (!A || !B) return a;
|
|
99
|
-
const l = A.l * p + B.l * (1 - p);
|
|
100
|
-
const x = A.a * p + B.a * (1 - p);
|
|
101
|
-
const y = A.b * p + B.b * (1 - p);
|
|
102
|
-
const c = Math.hypot(x, y);
|
|
103
|
-
const h = c < 1e-6 ? 0 : ((Math.atan2(y, x) * 180) / Math.PI + 360) % 360;
|
|
104
|
-
return toHex(oklchToRgb({ l, c, h }));
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* `--bg-hover` in tokens.css: this share of `--text-primary` mixed into `--bg-surface`.
|
|
109
|
-
*
|
|
110
|
-
* 5.5 %, down from 7 % in 0.33 (docs/colour-roles-harmonization.md §12.10): a hovered row
|
|
111
|
-
* on a card is the darkest fill (in dark, the lightest) that text sits on, and at 7 % the
|
|
112
|
-
* light status colours, the money colours and Ink/Moss/Plum's muted text fell to
|
|
113
|
-
* 4.25–4.49:1 on it. The status literals are fixed, the same in every preset, so the
|
|
114
|
-
* hover moved instead: text wins over the hover's step. At 5.5 % the step from the card
|
|
115
|
-
* is still 1.09–1.13:1, above the 1.08:1 the kit's hover rule asks (§12.2). The deriver
|
|
116
|
-
* solves the money colours against this fill, and tokens-css-audit.test.ts measures
|
|
117
|
-
* every text role on it in every shipped preset, so the two cannot part.
|
|
118
|
-
*/
|
|
119
|
-
export const HOVER_INK = 0.055;
|
|
120
|
-
|
|
121
|
-
/** The card's hover fill (`--bg-hover`) for `t`, as tokens.css mixes it. */
|
|
122
|
-
export function hoverFill(t: Pick<TokenSet, "textPrimary" | "bgSurface">): string {
|
|
123
|
-
return mix(t.textPrimary, t.bgSurface, HOVER_INK);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* The light well under More contrast: this share of `--text-primary` mixed into the card,
|
|
128
|
-
* `--bg-hover`'s formula at a larger share (0.36, docs/colour-roles-harmonization.md §13).
|
|
129
|
-
*
|
|
130
|
-
* In light the well is the page (§5.3), 1.09–1.11:1 from the card. At 10 % it stands
|
|
131
|
-
* 1.19–1.24:1 from it, about twice that. The rule it is held to: **the stepped well stands
|
|
132
|
-
* at least 1.17:1 from the card**, two of the hover rule's 1.08 steps; 9 % is the least
|
|
133
|
-
* that clears it in every shipped preset, with no room. The step cannot ship alone: on a
|
|
134
|
-
* 10 % well money, status and two hues read 4.07–4.28:1, so the money is solved with it
|
|
135
|
-
* here and the status and hue literals in tokens.css.
|
|
136
|
-
*/
|
|
137
|
-
export const WELL_INK_MORE = 0.1;
|
|
138
|
-
|
|
139
|
-
/** The least the stepped light well stands from the card (§13.3, decision 2). */
|
|
140
|
-
export const WELL_STEP_MIN = 1.17;
|
|
141
|
-
|
|
142
|
-
/** True when `t` is a light set: its body ink darker than its card. */
|
|
143
|
-
function isLightSet(t: Pick<TokenSet, "textPrimary" | "bgSurface">): boolean | null {
|
|
144
|
-
const ink = parseHex(t.textPrimary);
|
|
145
|
-
const card = parseHex(t.bgSurface);
|
|
146
|
-
if (!ink || !card) return null;
|
|
147
|
-
return luminance(ink) < luminance(card);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** Money as text: WCAG 1.4.3 AA. */
|
|
151
|
-
const MONEY_TARGET = 4.5;
|
|
152
|
-
|
|
153
|
-
/** `color` as it is when it clears 4.5:1 on `well`, else solved darker at its own hue and
|
|
154
|
-
* chroma until it does — measured on the hex (`solveLightness`). */
|
|
155
|
-
function moneyOn(color: string, well: string): string {
|
|
156
|
-
if (contrast(color, well) >= MONEY_TARGET) return color;
|
|
157
|
-
const lch = hexToOklch(color);
|
|
158
|
-
const bg = parseHex(well);
|
|
159
|
-
if (!lch || !bg) return color;
|
|
160
|
-
const l = solveLightness(MONEY_TARGET, bg, lch.h, lch.c, "darker");
|
|
161
|
-
return oklchToHex({ l, c: lch.c, h: lch.h });
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/** The light well under More contrast for `t`, or null for a dark set (or one whose ink or
|
|
165
|
-
* card is not hex, which cannot be mixed). The deriver solves the brand against it. */
|
|
166
|
-
export function steppedWellFill(t: Pick<TokenSet, "textPrimary" | "bgSurface">): string | null {
|
|
167
|
-
return isLightSet(t) ? mix(t.textPrimary, t.bgSurface, WELL_INK_MORE) : null;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/** The stepped well and money of a light set, or null (see {@link steppedWellFill}). */
|
|
171
|
-
function wellStep(t: TokenSet): WellStep | null {
|
|
172
|
-
const well = steppedWellFill(t);
|
|
173
|
-
if (!well) return null;
|
|
174
|
-
return {
|
|
175
|
-
bgSurface2: well,
|
|
176
|
-
moneyIncome: moneyOn(t.moneyIncome, well),
|
|
177
|
-
moneyExpense: moneyOn(t.moneyExpense, well),
|
|
178
|
-
moneyNet: moneyOn(t.moneyNet, well),
|
|
179
|
-
moneyNeutral: moneyOn(t.moneyNeutral, well),
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* `--brand-muted` in tokens.css: this share of `--brand` mixed into `--text-primary`.
|
|
185
|
-
*
|
|
186
|
-
* 62 %, down from 70 % in 0.33 (docs/colour-roles-harmonization.md §12.11): the brand as
|
|
187
|
-
* text sits on its soft chip HOVERED too (`--brand-bg-hover` — ButtonGroupLink's current
|
|
188
|
-
* page, a selected day), and at 70 % it read 4.08–4.42:1 there in Default and Moss light
|
|
189
|
-
* and in Ink, Moss, Plum and Contrast dark. The brand could not move instead: the dark
|
|
190
|
-
* brands would have flipped their white label to the dark ink. Nor could the chip's hover
|
|
191
|
-
* lighten: by the time the text cleared 4.5:1 the hover sat 1.00:1 from the chip it
|
|
192
|
-
* hovers. So the text moves toward the ink, as `--bg-hover` moved for its text.
|
|
193
|
-
*/
|
|
194
|
-
export const BRAND_MUTED_SHARE = 0.62;
|
|
195
|
-
/** `--brand-bg` and `--brand-bg-hover` in tokens.css: these shares of `--brand` mixed
|
|
196
|
-
* into `--bg-surface`. */
|
|
197
|
-
export const BRAND_BG_SHARE = 0.14;
|
|
198
|
-
export const BRAND_BG_HOVER_SHARE = 0.24;
|
|
199
|
-
|
|
200
|
-
/** `--brand-muted`, `--brand-bg` and `--brand-bg-hover` for `t`, as tokens.css mixes them.
|
|
201
|
-
* tokens-css-audit.test.ts holds the three shares equal to the stylesheet's. */
|
|
202
|
-
export function brandSoft(t: Pick<TokenSet, "brand" | "textPrimary" | "bgSurface">): {
|
|
203
|
-
brandMuted: string;
|
|
204
|
-
brandBg: string;
|
|
205
|
-
brandBgHover: string;
|
|
206
|
-
} {
|
|
207
|
-
return {
|
|
208
|
-
brandMuted: mix(t.brand, t.textPrimary, BRAND_MUTED_SHARE),
|
|
209
|
-
brandBg: mix(t.brand, t.bgSurface, BRAND_BG_SHARE),
|
|
210
|
-
brandBgHover: mix(t.brand, t.bgSurface, BRAND_BG_HOVER_SHARE),
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/** WCAG 1.4.11 for a component's boundary. */
|
|
215
|
-
const BORDER_TARGET = 3;
|
|
216
|
-
/** `--border-strong` in tokens.css: 55 % border, 45 % text. */
|
|
217
|
-
const BORDER_STRONG_SHARE = 0.45;
|
|
218
|
-
|
|
219
|
-
/** The worst of the three surfaces; `well`, when the step has one, in place of the set's. */
|
|
220
|
-
function worstContrast(color: string, t: TokenSet, well: string): number {
|
|
221
|
-
return Math.min(contrast(color, t.bgPage), contrast(color, t.bgSurface), contrast(color, well));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function steppedBorder(t: TokenSet, well: WellStep | null): string {
|
|
225
|
-
// The share of `--text-primary` in the border: at least --border-strong's, more until
|
|
226
|
-
// 3:1. Monotonic in the share (the mix walks from the border to the text, away from
|
|
227
|
-
// every surface), so a bisection finds the least that clears it. Against the stepped
|
|
228
|
-
// light well (§13.4), which is the darkest surface under More contrast.
|
|
229
|
-
const surface2 = well?.bgSurface2 ?? t.bgSurface2;
|
|
230
|
-
let lo = BORDER_STRONG_SHARE;
|
|
231
|
-
if (worstContrast(mix(t.border, t.textPrimary, 1 - lo), t, surface2) >= BORDER_TARGET)
|
|
232
|
-
return mix(t.border, t.textPrimary, 1 - lo);
|
|
233
|
-
let hi = 1;
|
|
234
|
-
for (let i = 0; i < 16; i++) {
|
|
235
|
-
const mid = (lo + hi) / 2;
|
|
236
|
-
if (worstContrast(mix(t.border, t.textPrimary, 1 - mid), t, surface2) >= BORDER_TARGET) hi = mid;
|
|
237
|
-
else lo = mid;
|
|
238
|
-
}
|
|
239
|
-
return mix(t.border, t.textPrimary, 1 - hi);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/** The stepped values for `t`: the four text and line tokens, and for a light set the
|
|
243
|
-
* well and money (`well`, null in dark). Pure. */
|
|
244
|
-
export function contrastStep(t: TokenSet): ContrastStep {
|
|
245
|
-
const well = wellStep(t);
|
|
246
|
-
return {
|
|
247
|
-
textSecondary: mix(t.textSecondary, t.textPrimary, 0.5),
|
|
248
|
-
textMuted: t.textSecondary,
|
|
249
|
-
textPlaceholder: t.textMuted,
|
|
250
|
-
border: steppedBorder(t, well),
|
|
251
|
-
well,
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/* ── The token set last written to an element ───────────────────────────── */
|
|
256
|
-
|
|
257
|
-
const lastWritten = new WeakMap<HTMLElement, TokenSet>();
|
|
258
|
-
|
|
259
|
-
/** Remember the set `applyTokenSet` wrote, so a contrast change can re-apply it. */
|
|
260
|
-
export function rememberTokenSet(el: HTMLElement, t: TokenSet): void {
|
|
261
|
-
lastWritten.set(el, t);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/** The set `applyTokenSet` last wrote to `el`, or undefined when nothing did — an app
|
|
265
|
-
* without the palette layer, whose base tokens come from tokens.css. */
|
|
266
|
-
export function rememberedTokenSet(el: HTMLElement): TokenSet | undefined {
|
|
267
|
-
return lastWritten.get(el);
|
|
268
|
-
}
|
package/src/theme/contrast.ts
DELETED
|
@@ -1,250 +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
|
-
import { useMediaQuery } from "../hooks/use-media-query";
|
|
8
|
-
import { CONTRAST_STEPPED_VARS, contrastStep, rememberedTokenSet } from "./contrast-tokens";
|
|
9
|
-
import { applyTokenSet, DEFAULT_PRESET } from "./palette-presets";
|
|
10
|
-
import type { PersistedAppearanceOptions } from "./text-size";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* "More contrast" (docs/text-size-harmonization.md §2.4, §5, §10.5, §10.6): a switch
|
|
14
|
-
* beside the text size, on by choice or — on "System" — when the device asks for more
|
|
15
|
-
* contrast (`prefers-contrast: more`). Any text size.
|
|
16
|
-
*
|
|
17
|
-
* In force it is `<html data-contrast="more">` (else `"standard"`), which does two things:
|
|
18
|
-
* - the inline colour tokens are re-written one step stronger (`applyTokenSet`'s
|
|
19
|
-
* contrast flag — see contrast-tokens.ts for what moves and why it is JS);
|
|
20
|
-
* - tokens.css raises `--focus-ring-width` from 2 to 3 px, in light deepens the status,
|
|
21
|
-
* hue and field-sync literals and `--bg-active` to read on the stepped well (0.36,
|
|
22
|
-
* colour-roles §13), and turns on the `contrast:` variant for anything else a
|
|
23
|
-
* component wants to change.
|
|
24
|
-
*
|
|
25
|
-
* The names below are frozen like the text size's: server-kit's `CONTRAST_MODES`, the
|
|
26
|
-
* stored format, the attribute.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
/** The stored choices (§10.6): server-kit's `CONTRAST_MODES`. "system" IS a stored value
|
|
30
|
-
* — the PATCH rule refuses an explicit null, so null means only "never chosen". */
|
|
31
|
-
export const CONTRAST_MODES = ["system", "standard", "more"] as const;
|
|
32
|
-
|
|
33
|
-
export type ContrastMode = (typeof CONTRAST_MODES)[number];
|
|
34
|
-
|
|
35
|
-
/** What is in force on `<html data-contrast>`: a mode with "system" resolved. */
|
|
36
|
-
export type ContrastLevel = "standard" | "more";
|
|
37
|
-
|
|
38
|
-
const CONTRAST_ATTRIBUTE = "data-contrast";
|
|
39
|
-
const PREFERS_MORE_QUERY = "(prefers-contrast: more)";
|
|
40
|
-
|
|
41
|
-
export function isContrastMode(value: unknown): value is ContrastMode {
|
|
42
|
-
return value === "system" || value === "standard" || value === "more";
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** The mode in force: **this device's own choice → the account's → "system"** (§2.6).
|
|
46
|
-
* The one order the pre-paint call, the apply hook and `useAccountAppearance` share. */
|
|
47
|
-
export function resolveContrastMode(device: unknown, account?: unknown): ContrastMode {
|
|
48
|
-
if (isContrastMode(device)) return device;
|
|
49
|
-
if (isContrastMode(account)) return account;
|
|
50
|
-
return "system";
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Whether the device asks for more contrast now. False without `matchMedia`. */
|
|
54
|
-
export function prefersMoreContrast(): boolean {
|
|
55
|
-
try {
|
|
56
|
-
return typeof window !== "undefined" && typeof window.matchMedia === "function"
|
|
57
|
-
? window.matchMedia(PREFERS_MORE_QUERY).matches
|
|
58
|
-
: false;
|
|
59
|
-
} catch {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** A mode to the level it puts on `<html>`; "system" asks the device (or takes
|
|
65
|
-
* `prefersMore`, when the caller already knows). */
|
|
66
|
-
export function contrastLevel(mode: ContrastMode, prefersMore: boolean = prefersMoreContrast()): ContrastLevel {
|
|
67
|
-
return mode === "more" || (mode === "system" && prefersMore) ? "more" : "standard";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** The level `<html>` carries now; "standard" without one. */
|
|
71
|
-
export function readContrastLevel(): ContrastLevel {
|
|
72
|
-
if (typeof document === "undefined") return "standard";
|
|
73
|
-
return document.documentElement.getAttribute(CONTRAST_ATTRIBUTE) === "more" ? "more" : "standard";
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Re-write the contrast-dependent tokens on `el` for its current `data-contrast`.
|
|
78
|
-
*
|
|
79
|
-
* With a palette layer (`applyTokenSet` has written a set here), that set is applied
|
|
80
|
-
* again and steps itself. Without one — an app whose base tokens come from tokens.css,
|
|
81
|
-
* like Kurvenschmiede's — the stepped tokens are written over the stylesheet for the
|
|
82
|
-
* default preset in the current light/dark, or removed again: the four text and line
|
|
83
|
-
* tokens in both modes, and in light the well and the four money colours too (0.36,
|
|
84
|
-
* docs/colour-roles-harmonization.md §13.3 decision 10). In dark those five stay removed,
|
|
85
|
-
* so the stylesheet's dark well and money paint.
|
|
86
|
-
*
|
|
87
|
-
* It never calls `applyTokenSet` here: that would remember a token set on `<html>`, and
|
|
88
|
-
* this app would then take the palette branch above, which a theme switch does not re-run
|
|
89
|
-
* (the class observer in `useApplyContrast` re-writes only while nothing is remembered).
|
|
90
|
-
*/
|
|
91
|
-
function reapplyContrastTokens(el: HTMLElement): void {
|
|
92
|
-
const written = rememberedTokenSet(el);
|
|
93
|
-
if (written) {
|
|
94
|
-
applyTokenSet(el, written);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
for (const name of CONTRAST_STEPPED_VARS) el.style.removeProperty(name);
|
|
98
|
-
if (el.getAttribute(CONTRAST_ATTRIBUTE) !== "more") return;
|
|
99
|
-
const step = contrastStep(DEFAULT_PRESET[el.classList.contains("dark") ? "dark" : "light"]);
|
|
100
|
-
el.style.setProperty("--text-secondary", step.textSecondary);
|
|
101
|
-
el.style.setProperty("--text-muted", step.textMuted);
|
|
102
|
-
el.style.setProperty("--text-placeholder", step.textPlaceholder);
|
|
103
|
-
el.style.setProperty("--border", step.border);
|
|
104
|
-
// One line per variable, not a loop: the step's fields are not the variables' names.
|
|
105
|
-
if (step.well) {
|
|
106
|
-
el.style.setProperty("--bg-surface-2", step.well.bgSurface2);
|
|
107
|
-
el.style.setProperty("--money-income", step.well.moneyIncome);
|
|
108
|
-
el.style.setProperty("--money-expense", step.well.moneyExpense);
|
|
109
|
-
el.style.setProperty("--money-net", step.well.moneyNet);
|
|
110
|
-
el.style.setProperty("--money-neutral", step.well.moneyNeutral);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/** Put `level` on `<html>` and re-write the colour tokens for it. */
|
|
115
|
-
export function applyContrast(level: ContrastLevel): void {
|
|
116
|
-
if (typeof document === "undefined") return;
|
|
117
|
-
const root = document.documentElement;
|
|
118
|
-
root.setAttribute(CONTRAST_ATTRIBUTE, level);
|
|
119
|
-
reapplyContrastTokens(root);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/* ── Storage: the frozen format, the pre-paint call ─────────────────────── */
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* What a contrast store persists under its key — FROZEN, like the text size's:
|
|
126
|
-
*
|
|
127
|
-
* {"state":{"contrast":"more"},"version":1}
|
|
128
|
-
*
|
|
129
|
-
* `contrast` is one of {@link CONTRAST_MODES}, or `null` / absent when this device never
|
|
130
|
-
* chose.
|
|
131
|
-
*/
|
|
132
|
-
export interface PersistedContrast {
|
|
133
|
-
state?: { contrast?: ContrastMode | null };
|
|
134
|
-
version?: number;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/** The frozen format holding a mode this kit knows — the shape `readStoredJson` admits. */
|
|
138
|
-
const holdsContrast = (blob: unknown): blob is { state: { contrast: ContrastMode } } =>
|
|
139
|
-
isContrastMode((blob as PersistedContrast | null)?.state?.contrast);
|
|
140
|
-
|
|
141
|
-
/** This device's own choice under `storageKey`, or `null` when it never chose (or the
|
|
142
|
-
* storage is blocked, malformed, or holds a value that is not a mode). */
|
|
143
|
-
export function readPersistedContrast(storageKey: string): ContrastMode | null {
|
|
144
|
-
return readStoredJson(storageKey, holdsContrast)?.state.contrast ?? null;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Pre-paint (§10.3, §10.5): this device's choice under `storageKey` — else the account's
|
|
149
|
-
* last known value, else "system" — resolved against `prefers-contrast` and applied
|
|
150
|
-
* BEFORE `createRoot`. Call it next to `applyPersistedPalette`, in EITHER order — the
|
|
151
|
-
* palette steps itself when `data-contrast` is already set, and this re-applies the
|
|
152
|
-
* palette's set when it is not; no app has to put one first (0.32.1, keksdose's 0.32
|
|
153
|
-
* report asked which). Returns the level applied.
|
|
154
|
-
*/
|
|
155
|
-
export function applyPersistedContrast(storageKey: string, options: PersistedAppearanceOptions = {}): ContrastLevel {
|
|
156
|
-
let account: unknown;
|
|
157
|
-
try {
|
|
158
|
-
account = options.account?.();
|
|
159
|
-
} catch {
|
|
160
|
-
account = undefined;
|
|
161
|
-
}
|
|
162
|
-
const level = contrastLevel(resolveContrastMode(readPersistedContrast(storageKey), account));
|
|
163
|
-
applyContrast(level);
|
|
164
|
-
return level;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/* ── The store ──────────────────────────────────────────────────────────── */
|
|
168
|
-
|
|
169
|
-
export interface ContrastState {
|
|
170
|
-
/** This device's own choice (persisted), or `null` when it never chose — then the
|
|
171
|
-
* account's value applies, else "system". */
|
|
172
|
-
contrast: ContrastMode | null;
|
|
173
|
-
/** Store this device's choice; `null` forgets it. */
|
|
174
|
-
setContrast: (contrast: ContrastMode | null) => void;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export interface ApplyContrastOptions {
|
|
178
|
-
/** The account's value (`/auth/me`'s `contrast`): it applies while this device has no
|
|
179
|
-
* choice of its own. */
|
|
180
|
-
account?: string | null;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Build a contrast store bound to a consumer-supplied localStorage key, shaped like
|
|
185
|
-
* `createThemeStore` and {@link createTextSizeStore} (§6). It holds the DEVICE's choice;
|
|
186
|
-
* the account's value comes in through `useApplyContrast({ account })`.
|
|
187
|
-
*
|
|
188
|
-
* `useApplyContrast` — mount it once near the root, beside `useApplyPalette`:
|
|
189
|
-
* - puts the level on `<html>` and steps the tokens;
|
|
190
|
-
* - on "System", follows `prefers-contrast: more` live (§10.5);
|
|
191
|
-
* - without a palette layer, re-writes the stepped tokens when the light/dark class
|
|
192
|
-
* changes, since they differ per theme.
|
|
193
|
-
*
|
|
194
|
-
* The persisted format is {@link PersistedContrast}, and frozen.
|
|
195
|
-
*/
|
|
196
|
-
export function createContrastStore(storageKey: string) {
|
|
197
|
-
const useContrastStore = create<ContrastState>()(
|
|
198
|
-
logger(
|
|
199
|
-
persist(
|
|
200
|
-
(set) => ({
|
|
201
|
-
contrast: null,
|
|
202
|
-
setContrast: (contrast) => set({ contrast: isContrastMode(contrast) ? contrast : null }),
|
|
203
|
-
}),
|
|
204
|
-
{
|
|
205
|
-
name: storageKey,
|
|
206
|
-
version: 1,
|
|
207
|
-
partialize: (s) => ({ contrast: s.contrast }),
|
|
208
|
-
merge: (persisted, current) => {
|
|
209
|
-
const value = (persisted as { contrast?: unknown } | null)?.contrast;
|
|
210
|
-
return { ...current, contrast: isContrastMode(value) ? value : null };
|
|
211
|
-
},
|
|
212
|
-
},
|
|
213
|
-
),
|
|
214
|
-
"contrast",
|
|
215
|
-
),
|
|
216
|
-
);
|
|
217
|
-
// Reset this device's settings (docs/settings-harmonization.md §11.4): no choice on
|
|
218
|
-
// this device, so `useApplyContrast` re-resolves to the account's mode, else "system",
|
|
219
|
-
// and re-steps the tokens.
|
|
220
|
-
registerDeviceSetting({
|
|
221
|
-
key: storageKey,
|
|
222
|
-
kind: "appearance",
|
|
223
|
-
reset: () => useContrastStore.getState().setContrast(null),
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
function useApplyContrast({ account }: ApplyContrastOptions = {}): ContrastLevel {
|
|
227
|
-
const device = useContrastStore((s) => s.contrast);
|
|
228
|
-
// Subscribed whatever the mode (hooks cannot be skipped); only "system" reads it.
|
|
229
|
-
const prefersMore = useMediaQuery(PREFERS_MORE_QUERY, false);
|
|
230
|
-
const level = contrastLevel(resolveContrastMode(device, account), prefersMore);
|
|
231
|
-
useEffect(() => {
|
|
232
|
-
applyContrast(level);
|
|
233
|
-
}, [level]);
|
|
234
|
-
// Without a palette layer the stepped tokens are per theme: follow `.dark`.
|
|
235
|
-
useEffect(() => {
|
|
236
|
-
if (typeof MutationObserver === "undefined") return;
|
|
237
|
-
const root = document.documentElement;
|
|
238
|
-
const observer = new MutationObserver(() => {
|
|
239
|
-
if (!rememberedTokenSet(root)) reapplyContrastTokens(root);
|
|
240
|
-
});
|
|
241
|
-
observer.observe(root, { attributes: true, attributeFilter: ["class"] });
|
|
242
|
-
return () => observer.disconnect();
|
|
243
|
-
}, []);
|
|
244
|
-
return level;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return { useContrastStore, useApplyContrast };
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export type ContrastStore = ReturnType<typeof createContrastStore>;
|