@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,232 +0,0 @@
|
|
|
1
|
-
// Chart colour system. Single source of truth lives in the design tokens
|
|
2
|
-
// (:root / .dark in tokens.css): brand = indigo, money = teal/amber/purple,
|
|
3
|
-
// chart-1..8 = anyplot's "Imprint" hues (https://anyplot.ai/palette, 0.49 — Paul Tol
|
|
4
|
-
// "Muted" before, still selectable as the `paul-tol` preset).
|
|
5
|
-
// Returning CSS vars here makes every Recharts series theme-aware for free — the
|
|
6
|
-
// SVG fill/stroke resolves --chart-N against the current light/dark token set.
|
|
7
|
-
|
|
8
|
-
import { contrast, parseHex as parseRgbHex } from "./color";
|
|
9
|
-
|
|
10
|
-
/** How many categorical slots `paletteFor` cycles through: anyplot's eight hues. Amber,
|
|
11
|
-
* anyplot's ninth colour, is a semantic warning anchor and not a series slot. A preset
|
|
12
|
-
* that carries more hues (Paul Tol's nine) still writes them as `--chart-N`, but the
|
|
13
|
-
* by-index ramp wraps after eight, so the same series keeps the same colour whichever
|
|
14
|
-
* preset is active. */
|
|
15
|
-
export const PALETTE_SIZE = 8;
|
|
16
|
-
|
|
17
|
-
/** anyplot's colour-vision-deficiency-optimal order over the eight slots — the order
|
|
18
|
-
* that keeps the FIRST n series furthest apart under protan/deutan/tritan simulation.
|
|
19
|
-
* An option (`paletteFor(i, { order: "cvd" })`), not the default: the default order is
|
|
20
|
-
* anyplot's own slot order, so series 1 is always the green. */
|
|
21
|
-
export const CVD_ORDER = [0, 1, 7, 6, 4, 5, 2, 3] as const;
|
|
22
|
-
|
|
23
|
-
export interface PaletteForOptions {
|
|
24
|
-
/** `"slot"` (default): anyplot's slot order. `"cvd"`: {@link CVD_ORDER}. */
|
|
25
|
-
order?: "slot" | "cvd";
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** CVD-safe categorical colour for series `index`, as a theme-aware CSS var.
|
|
29
|
-
*
|
|
30
|
-
* The first series is always slot 0 (`--chart-1`, anyplot's green), and the ramp
|
|
31
|
-
* wraps after {@link PALETTE_SIZE}.
|
|
32
|
-
*
|
|
33
|
-
* Wraps in both directions, the way `strokeDash` does: JS `%` keeps the sign,
|
|
34
|
-
* so `-1 % 8` is `-1` and the plain formula named `--chart-0`, a token that does not
|
|
35
|
-
* exist — a series with no stroke at all. A fractional index is truncated, and one
|
|
36
|
-
* that is not a number (NaN, ±Infinity — an `indexOf` miss divided by something)
|
|
37
|
-
* takes the first colour rather than `var(--chart-NaN)`. */
|
|
38
|
-
export function paletteFor(index: number, options?: PaletteForOptions): string {
|
|
39
|
-
const i = Number.isFinite(index) ? Math.trunc(index) : 0;
|
|
40
|
-
const position = ((i % PALETTE_SIZE) + PALETTE_SIZE) % PALETTE_SIZE;
|
|
41
|
-
const slot = options?.order === "cvd" ? CVD_ORDER[position] : position;
|
|
42
|
-
return `var(--chart-${slot + 1})`;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Semantic money colours, theme-aware via tokens. Pair with +/- and arrow
|
|
46
|
-
cues at the call site so colour is never the only signal (CVD). */
|
|
47
|
-
export const CHART_COLORS = {
|
|
48
|
-
income: "var(--money-income)",
|
|
49
|
-
expense: "var(--money-expense)",
|
|
50
|
-
net: "var(--money-net)",
|
|
51
|
-
neutral: "var(--money-neutral)",
|
|
52
|
-
assigned: "var(--brand)",
|
|
53
|
-
activity: "var(--money-expense)",
|
|
54
|
-
/** A generic total line — not money-coloured, the chart's neutral ink. */
|
|
55
|
-
total: "var(--chart-ink)",
|
|
56
|
-
} as const;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* What a chart draws that is NOT a series (anyplot's roles, 0.49). Two inks, which are
|
|
60
|
-
* the only chart colours that change between light and dark — the eight hues do not:
|
|
61
|
-
*
|
|
62
|
-
* - `other` / `rest` / `disabled` and confidence-`band` fills → the MUTED ink. A
|
|
63
|
-
* treemap's "rest" bucket or a pie's "Other" slice takes this instead of wrapping
|
|
64
|
-
* round to a hue the reader will match to a real series.
|
|
65
|
-
* - `total` / `baseline` / `outline` → the neutral INK.
|
|
66
|
-
*/
|
|
67
|
-
export const CHART_ROLES = {
|
|
68
|
-
other: "var(--chart-muted)",
|
|
69
|
-
rest: "var(--chart-muted)",
|
|
70
|
-
disabled: "var(--chart-muted)",
|
|
71
|
-
band: "var(--chart-muted)",
|
|
72
|
-
total: "var(--chart-ink)",
|
|
73
|
-
baseline: "var(--chart-ink)",
|
|
74
|
-
outline: "var(--chart-ink)",
|
|
75
|
-
} as const;
|
|
76
|
-
|
|
77
|
-
/** `--chart-muted` per theme, as hex (tokens.css holds the same two). */
|
|
78
|
-
export const CHART_MUTED_HEX = { light: "#6b6a63", dark: "#a8a79f" } as const;
|
|
79
|
-
|
|
80
|
-
/** The 3:1 WCAG 1.4.11 asks of a filled graphical object against its surface. */
|
|
81
|
-
export const EDGE_MIN_CONTRAST = 3;
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* The 1px edge a FILLED mark (a bar, an area, a treemap tile) needs, or `undefined`.
|
|
85
|
-
*
|
|
86
|
-
* anyplot's answer to hues that sit under 3:1 on the ground (cyan, lime, lavender, ochre
|
|
87
|
-
* and green on cream; matte red and rose on the dark ground): outline the shape in ink,
|
|
88
|
-
* so its boundary is legible while the fill keeps the hue that identifies the series.
|
|
89
|
-
* Only those — a hue that clears 3:1 on every surface given stays unstroked, because an
|
|
90
|
-
* outline on every bar is noise.
|
|
91
|
-
*
|
|
92
|
-
* `fill` must be a measurable `#rgb`/`#rrggbb`; `surfaces` are the grounds the mark can
|
|
93
|
-
* sit on (the card and the page), and the WORST of them decides. Anything it cannot
|
|
94
|
-
* measure gets no edge rather than a guessed one.
|
|
95
|
-
*/
|
|
96
|
-
export function chartEdge(
|
|
97
|
-
fill: string,
|
|
98
|
-
surfaces: readonly string[],
|
|
99
|
-
ink: string = CHART_ROLES.outline,
|
|
100
|
-
): string | undefined {
|
|
101
|
-
if (!parseRgbHex(fill)) return undefined;
|
|
102
|
-
const measurable = surfaces.filter((s) => parseRgbHex(s));
|
|
103
|
-
if (measurable.length === 0) return undefined;
|
|
104
|
-
const worst = Math.min(...measurable.map((s) => contrast(fill, s)));
|
|
105
|
-
return worst < EDGE_MIN_CONTRAST ? ink : undefined;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// ── Raw hex stops, by theme ────────────────────────────────────────────────
|
|
109
|
-
// The heatmaps interpolate colours in JS (CSS vars can't be lerped), so they
|
|
110
|
-
// need concrete hex per theme — i.e. the same colours DEFAULT_PRESET already
|
|
111
|
-
// holds, written down a second time.
|
|
112
|
-
//
|
|
113
|
-
// They are duplicated rather than imported because these two objects are the whole
|
|
114
|
-
// of the `@eifi1/ui-kit/chart` subpath's colour layer, and importing the preset bank
|
|
115
|
-
// would pull every preset's full token set into that chunk to read two of them. What
|
|
116
|
-
// keeps the copies together is `chart-palette.test.ts` — "has not drifted from
|
|
117
|
-
// DEFAULT_PRESET" — which is not optional: they HAD drifted, five of the six light
|
|
118
|
-
// heat stops, and the light `neutral` was still Tailwind's slate-100, a cool grey on
|
|
119
|
-
// the warm cream page this theme has used since #328.
|
|
120
|
-
//
|
|
121
|
-
// 0.49: the same eight hues in both themes — anyplot does not re-tune a hue for the dark
|
|
122
|
-
// ground, and neither does the kit any more; `chartEdge` outlines the two that fall
|
|
123
|
-
// under 3:1 there (matte red, rose) instead of lifting them into different colours.
|
|
124
|
-
const IMPRINT_HEX = ["#009e73", "#c475fd", "#4467a3", "#bd8233", "#ae3030", "#2abccd", "#954477", "#99b314"] as const;
|
|
125
|
-
export const PALETTE_HEX = {
|
|
126
|
-
light: IMPRINT_HEX,
|
|
127
|
-
dark: IMPRINT_HEX,
|
|
128
|
-
} as const;
|
|
129
|
-
|
|
130
|
-
/** A heatmap's interpolation stops for one theme. Open string fields so any
|
|
131
|
-
palette preset (not just the built-in default) can supply its own stops. */
|
|
132
|
-
export interface HeatStops {
|
|
133
|
-
neutral: string;
|
|
134
|
-
under: string;
|
|
135
|
-
over: string;
|
|
136
|
-
seqLow: string;
|
|
137
|
-
seqHigh: string;
|
|
138
|
-
empty: string;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** Diverging (variance: under←0→over) and sequential (spending intensity)
|
|
142
|
-
heatmap stops, per theme — anyplot's scales (0.49). Sequential runs anyplot green →
|
|
143
|
-
blue; diverging runs blue (under) ↔ paper/ink (0, the midpoint) ↔ matte red (over).
|
|
144
|
-
The hues are the same in both themes; only the midpoint flips with the ground. */
|
|
145
|
-
export const HEATMAP_HEX = {
|
|
146
|
-
light: {
|
|
147
|
-
neutral: "#faf8f1", // anyplot's light paper — the diverging scale's 0
|
|
148
|
-
under: "#4467a3",
|
|
149
|
-
over: "#ae3030",
|
|
150
|
-
seqLow: "#009e73",
|
|
151
|
-
seqHigh: "#4467a3",
|
|
152
|
-
empty: "rgba(148,163,184,0.14)",
|
|
153
|
-
},
|
|
154
|
-
dark: {
|
|
155
|
-
neutral: "#1a1a17", // anyplot's ink — the diverging scale's 0 on the dark ground
|
|
156
|
-
under: "#4467a3",
|
|
157
|
-
over: "#ae3030",
|
|
158
|
-
seqLow: "#009e73",
|
|
159
|
-
seqHigh: "#4467a3",
|
|
160
|
-
empty: "rgba(148,163,184,0.10)",
|
|
161
|
-
},
|
|
162
|
-
} as const;
|
|
163
|
-
|
|
164
|
-
/** Linear interpolate two #rrggbb hexes; `t` in [0,1]. Returns #rrggbb. */
|
|
165
|
-
export function lerpHex(a: string, b: string, t: number): string {
|
|
166
|
-
const pa = parseHex(a) ?? UNREADABLE;
|
|
167
|
-
const pb = parseHex(b) ?? UNREADABLE;
|
|
168
|
-
const c = (i: number) => Math.round(pa[i] + (pb[i] - pa[i]) * clamp01(t));
|
|
169
|
-
return `#${[c(0), c(1), c(2)].map((v) => v.toString(16).padStart(2, "0")).join("")}`;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** The two inks a cell/treemap label can be set in. Near-black and near-white rather
|
|
173
|
-
than #000/#fff: at full black-on-full-white the label stops looking like part of the
|
|
174
|
-
same type system as the rest of the page. */
|
|
175
|
-
const INK_DARK = "#1a1a1a";
|
|
176
|
-
const INK_LIGHT = "#f8fafc";
|
|
177
|
-
|
|
178
|
-
/** Pick a legible text colour (near-black / near-white) for a solid hex fill, by
|
|
179
|
-
MEASURING both against it and keeping the one that wins.
|
|
180
|
-
|
|
181
|
-
This used to flip on Rec.601 luma > 0.6, which is a brightness heuristic and not a
|
|
182
|
-
contrast measure — the two disagree on six of the eighteen default chart hues, a
|
|
183
|
-
third of the ramp, and on each of those the label got the worse of the two inks.
|
|
184
|
-
`#44aa99` is the plainest case: luma calls it dark, so it took white, which measures
|
|
185
|
-
2.69:1 on it; near-black measures 6.18:1. keksdose measured this too and forked the
|
|
186
|
-
function locally for its treemap, leaving its other two call sites on this one.
|
|
187
|
-
|
|
188
|
-
A fill this cannot read gets `currentColor` — inherit, i.e. whatever the
|
|
189
|
-
surrounding text already uses. That is the only answer that is right on both
|
|
190
|
-
themes, because an unreadable fill is usually a translucent one (`HEATMAP_HEX.*
|
|
191
|
-
.empty` is an `rgba()` string, and the variance heatmap does pass it here for any
|
|
192
|
-
category with zero assigned and positive activity — a refund). Picking a constant
|
|
193
|
-
instead is what produced the earlier bug: the unparsed fill fell through to the
|
|
194
|
-
light ink, near-white on a near-white cell, and the figure was invisible. */
|
|
195
|
-
export function textOn(hex: string): string {
|
|
196
|
-
const rgb = parseRgbHex(hex);
|
|
197
|
-
if (!rgb) return "currentColor";
|
|
198
|
-
// Ties go to the dark ink: at equal measured contrast it is the one that keeps a
|
|
199
|
-
// small label looking like type rather than like a glow.
|
|
200
|
-
return contrast(rgb, INK_DARK) >= contrast(rgb, INK_LIGHT) ? INK_DARK : INK_LIGHT;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/** Mid-grey, for a stop {@link lerpHex} has to interpolate but cannot read. It has
|
|
204
|
-
* to return SOME valid colour, and a grey is the one that misleads least. */
|
|
205
|
-
const UNREADABLE: [number, number, number] = [0x80, 0x80, 0x80];
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* `#rgb` or `#rrggbb` to components, or **null** when it is neither.
|
|
209
|
-
*
|
|
210
|
-
* A tuple-shaped shim over `color.ts`'s parser, which is the same function and is
|
|
211
|
-
* already the one `contrast` validates with — so {@link lerpHex} and {@link textOn}
|
|
212
|
-
* cannot disagree about what counts as a colour.
|
|
213
|
-
*
|
|
214
|
-
* The **null** is the whole point of it. This used to `parseInt` whatever it was given
|
|
215
|
-
* and hand the NaNs on, and both callers propagated them silently: {@link lerpHex}
|
|
216
|
-
* produced the literal string `"#nannannan"`, and {@link textOn} fell through to the
|
|
217
|
-
* LIGHT label colour.
|
|
218
|
-
*
|
|
219
|
-
* That is not hypothetical — a non-hex value ships in this very module.
|
|
220
|
-
* `HEATMAP_HEX.*.empty` is an `rgba(…)` string, and the variance heatmap paints a
|
|
221
|
-
* figure on an `empty` cell whenever a category has zero assigned and positive
|
|
222
|
-
* activity (a refund). On the light theme the cell is near-white and the label came
|
|
223
|
-
* back near-white: the number was there, and unreadable.
|
|
224
|
-
*/
|
|
225
|
-
function parseHex(hex: string): [number, number, number] | null {
|
|
226
|
-
const rgb = parseRgbHex(hex);
|
|
227
|
-
return rgb ? [rgb.r, rgb.g, rgb.b] : null;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function clamp01(t: number): number {
|
|
231
|
-
return t < 0 ? 0 : t > 1 ? 1 : t;
|
|
232
|
-
}
|
package/src/theme/color.ts
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Colour maths for the palette system: sRGB ↔ OKLab ↔ OKLCH, WCAG contrast, gamut
|
|
3
|
-
* clipping, and colour-vision-deficiency simulation.
|
|
4
|
-
*
|
|
5
|
-
* Dependency-free on purpose. This package already ships 48MB of runtime dependencies
|
|
6
|
-
* for a 1.4MB library, and a colour-space conversion is forty lines of arithmetic that
|
|
7
|
-
* will not change — importing culori or chroma-js to get it would be the largest
|
|
8
|
-
* dependency in the kit, paid for by every consumer, to avoid writing down formulas
|
|
9
|
-
* that were published once and are now fixed.
|
|
10
|
-
*
|
|
11
|
-
* **Why OKLCH rather than HSL.** HSL's "lightness" is not lightness: `hsl(60 100% 50%)`
|
|
12
|
-
* (yellow) and `hsl(240 100% 50%)` (blue) claim the same 50% and differ by a factor of
|
|
13
|
-
* about twelve in perceived brightness. Any scheme that derives a palette by holding HSL
|
|
14
|
-
* lightness constant therefore produces a set that looks wildly uneven, and any scheme
|
|
15
|
-
* that solves for contrast in HSL has to solve separately per hue. OKLab is built so a
|
|
16
|
-
* given L means the same apparent lightness at every hue, which is what makes "same
|
|
17
|
-
* lightness, different hue" a usable rule and what makes a contrast solve converge.
|
|
18
|
-
*
|
|
19
|
-
* Reference: Björn Ottosson, "A perceptual color space for image processing" (2020).
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
export interface Rgb {
|
|
23
|
-
/** 0–255. */
|
|
24
|
-
r: number;
|
|
25
|
-
g: number;
|
|
26
|
-
b: number;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface Oklch {
|
|
30
|
-
/** Perceptual lightness, 0–1. */
|
|
31
|
-
l: number;
|
|
32
|
-
/** Chroma, 0–~0.4 in sRGB. */
|
|
33
|
-
c: number;
|
|
34
|
-
/** Hue angle in degrees, 0–360. */
|
|
35
|
-
h: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* ── sRGB ─────────────────────────────────────────────────────────────────── */
|
|
39
|
-
|
|
40
|
-
/** `#rgb` or `#rrggbb` → components, or null when it is neither. */
|
|
41
|
-
export function parseHex(hex: string): Rgb | null {
|
|
42
|
-
const h = hex.trim().replace(/^#/, "");
|
|
43
|
-
const full =
|
|
44
|
-
h.length === 3
|
|
45
|
-
? h
|
|
46
|
-
.split("")
|
|
47
|
-
.map((c) => c + c)
|
|
48
|
-
.join("")
|
|
49
|
-
: h;
|
|
50
|
-
if (!/^[0-9a-fA-F]{6}$/.test(full)) return null;
|
|
51
|
-
return {
|
|
52
|
-
r: parseInt(full.slice(0, 2), 16),
|
|
53
|
-
g: parseInt(full.slice(2, 4), 16),
|
|
54
|
-
b: parseInt(full.slice(4, 6), 16),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function toHex({ r, g, b }: Rgb): string {
|
|
59
|
-
const part = (v: number) =>
|
|
60
|
-
Math.max(0, Math.min(255, Math.round(v)))
|
|
61
|
-
.toString(16)
|
|
62
|
-
.padStart(2, "0");
|
|
63
|
-
return `#${part(r)}${part(g)}${part(b)}`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** sRGB 0–255 → linear-light 0–1. The transfer function, not a gamma of 2.2. */
|
|
67
|
-
function toLinear(channel: number): number {
|
|
68
|
-
const c = channel / 255;
|
|
69
|
-
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function fromLinear(channel: number): number {
|
|
73
|
-
const c = channel <= 0.0031308 ? 12.92 * channel : 1.055 * channel ** (1 / 2.4) - 0.055;
|
|
74
|
-
return c * 255;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/* ── OKLab / OKLCH ────────────────────────────────────────────────────────── */
|
|
78
|
-
|
|
79
|
-
export function rgbToOklch(rgb: Rgb): Oklch {
|
|
80
|
-
const r = toLinear(rgb.r);
|
|
81
|
-
const g = toLinear(rgb.g);
|
|
82
|
-
const b = toLinear(rgb.b);
|
|
83
|
-
|
|
84
|
-
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
85
|
-
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
86
|
-
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
87
|
-
|
|
88
|
-
const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
|
|
89
|
-
const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
|
|
90
|
-
const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
|
|
91
|
-
|
|
92
|
-
const c = Math.sqrt(A * A + B * B);
|
|
93
|
-
// Hue is meaningless at zero chroma; 0 keeps it stable rather than NaN-adjacent.
|
|
94
|
-
const h = c < 1e-6 ? 0 : ((Math.atan2(B, A) * 180) / Math.PI + 360) % 360;
|
|
95
|
-
return { l: L, c, h };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** OKLCH → sRGB, WITHOUT gamut clipping. May return components outside 0–255. */
|
|
99
|
-
function oklchToRgbRaw({ l, c, h }: Oklch): Rgb {
|
|
100
|
-
const rad = (h * Math.PI) / 180;
|
|
101
|
-
const A = c * Math.cos(rad);
|
|
102
|
-
const B = c * Math.sin(rad);
|
|
103
|
-
|
|
104
|
-
const l_ = (l + 0.3963377774 * A + 0.2158037573 * B) ** 3;
|
|
105
|
-
const m_ = (l - 0.1055613458 * A - 0.0638541728 * B) ** 3;
|
|
106
|
-
const s_ = (l - 0.0894841775 * A - 1.291485548 * B) ** 3;
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
r: fromLinear(4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_),
|
|
110
|
-
g: fromLinear(-1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_),
|
|
111
|
-
b: fromLinear(-0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_),
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function inGamut({ r, g, b }: Rgb): boolean {
|
|
116
|
-
const ok = (v: number) => v >= -0.5 && v <= 255.5;
|
|
117
|
-
return ok(r) && ok(g) && ok(b);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* OKLCH → sRGB, reducing CHROMA until the colour fits.
|
|
122
|
-
*
|
|
123
|
-
* Clamping the channels instead — the obvious approach — shifts hue and lightness
|
|
124
|
-
* together and unpredictably: a saturated blue that overflows clips to a different blue
|
|
125
|
-
* that is also lighter. Holding L and h and giving up chroma keeps the colour
|
|
126
|
-
* recognisably the one that was asked for, which matters when the whole point is to
|
|
127
|
-
* derive a family at a fixed lightness.
|
|
128
|
-
*/
|
|
129
|
-
export function oklchToRgb(target: Oklch): Rgb {
|
|
130
|
-
const direct = oklchToRgbRaw(target);
|
|
131
|
-
if (inGamut(direct)) return direct;
|
|
132
|
-
|
|
133
|
-
let lo = 0;
|
|
134
|
-
let hi = target.c;
|
|
135
|
-
// 20 halvings resolves chroma to ~4e-7, far below a perceptible step.
|
|
136
|
-
for (let i = 0; i < 20; i++) {
|
|
137
|
-
const mid = (lo + hi) / 2;
|
|
138
|
-
if (inGamut(oklchToRgbRaw({ ...target, c: mid }))) lo = mid;
|
|
139
|
-
else hi = mid;
|
|
140
|
-
}
|
|
141
|
-
return oklchToRgbRaw({ ...target, c: lo });
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export function hexToOklch(hex: string): Oklch | null {
|
|
145
|
-
const rgb = parseHex(hex);
|
|
146
|
-
return rgb ? rgbToOklch(rgb) : null;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export function oklchToHex(lch: Oklch): string {
|
|
150
|
-
return toHex(oklchToRgb(lch));
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/* ── WCAG contrast ────────────────────────────────────────────────────────── */
|
|
154
|
-
|
|
155
|
-
/** WCAG 2.x relative luminance. */
|
|
156
|
-
export function luminance(rgb: Rgb): number {
|
|
157
|
-
return 0.2126 * toLinear(rgb.r) + 0.7152 * toLinear(rgb.g) + 0.0722 * toLinear(rgb.b);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** WCAG 2.x contrast ratio, 1–21. Order-independent. */
|
|
161
|
-
export function contrast(a: Rgb | string, b: Rgb | string): number {
|
|
162
|
-
const ra = typeof a === "string" ? parseHex(a) : a;
|
|
163
|
-
const rb = typeof b === "string" ? parseHex(b) : b;
|
|
164
|
-
if (!ra || !rb) return 1;
|
|
165
|
-
const la = luminance(ra);
|
|
166
|
-
const lb = luminance(rb);
|
|
167
|
-
return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* The lightness at hue `h`, chroma `c` that hits `target` contrast against `against`.
|
|
172
|
-
*
|
|
173
|
-
* Binary search rather than algebra: OKLab lightness does not map to WCAG luminance in
|
|
174
|
-
* closed form, and it is not even monotonic in the general case once gamut clipping
|
|
175
|
-
* starts reducing chroma. It IS monotonic over the half-range we search — away from the
|
|
176
|
-
* background — which is why the direction is chosen first.
|
|
177
|
-
*
|
|
178
|
-
* Returns the best lightness found. If the target is unreachable at this hue and chroma
|
|
179
|
-
* (a saturated yellow cannot make 7:1 against white at any lightness without going grey)
|
|
180
|
-
* it returns the extreme end, and the caller should check the contrast it actually got
|
|
181
|
-
* rather than assuming success — `deriveTokenSet` does exactly that.
|
|
182
|
-
*/
|
|
183
|
-
export function solveLightness(
|
|
184
|
-
target: number,
|
|
185
|
-
against: Rgb,
|
|
186
|
-
h: number,
|
|
187
|
-
c: number,
|
|
188
|
-
direction: "lighter" | "darker",
|
|
189
|
-
): number {
|
|
190
|
-
// The half-range on the far side of the background from where we are heading.
|
|
191
|
-
// Going darker, that is [0, backgroundL]; going lighter, [backgroundL, 1]. Contrast is
|
|
192
|
-
// monotonic across each of those halves, which is what makes a binary search valid —
|
|
193
|
-
// it is NOT monotonic across the whole 0..1 range, because it turns around at the
|
|
194
|
-
// background's own lightness.
|
|
195
|
-
const bgL = rgbToOklch(against).l;
|
|
196
|
-
let lo = direction === "darker" ? 0 : bgL;
|
|
197
|
-
let hi = direction === "darker" ? bgL : 1;
|
|
198
|
-
// Measured on the HEX both colours are painted as, never on the float (round 0.34
|
|
199
|
-
// BUG-8): a solve that stopped on the float colour rounded to a hex just under the
|
|
200
|
-
// target — brand #000000's light income figure solved to 4.5000 and shipped at 4.49:1.
|
|
201
|
-
// Rounding keeps contrast monotonic in each half, so the bisection still holds, and
|
|
202
|
-
// the side it returns is the side whose hex clears the target.
|
|
203
|
-
const bg = toHex(against);
|
|
204
|
-
|
|
205
|
-
for (let i = 0; i < 24; i++) {
|
|
206
|
-
const mid = (lo + hi) / 2;
|
|
207
|
-
const got = contrast(toHex(oklchToRgb({ l: mid, c, h })), bg);
|
|
208
|
-
// Moving AWAY from the background raises contrast; which way that is depends on
|
|
209
|
-
// whether we are going lighter or darker.
|
|
210
|
-
if (got < target) {
|
|
211
|
-
if (direction === "darker") hi = mid;
|
|
212
|
-
else lo = mid;
|
|
213
|
-
} else if (direction === "darker") lo = mid;
|
|
214
|
-
else hi = mid;
|
|
215
|
-
}
|
|
216
|
-
return direction === "darker" ? lo : hi;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/* ── Colour-vision deficiency ─────────────────────────────────────────────── */
|
|
220
|
-
|
|
221
|
-
export type CvdType = "protanopia" | "deuteranopia" | "tritanopia";
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Brettel/Viénot-style dichromat simulation in linear RGB.
|
|
225
|
-
*
|
|
226
|
-
* An approximation, and a well-established one. It is here so the kit can FAIL a
|
|
227
|
-
* categorical ramp that two of its series become indistinguishable under, rather than
|
|
228
|
-
* asserting CVD-safety in a comment the way `chart-palette.ts` did — the audit found
|
|
229
|
-
* four of the nine default light chart hues below the 3:1 they were claimed to hold.
|
|
230
|
-
*/
|
|
231
|
-
const CVD_MATRIX: Record<CvdType, number[][]> = {
|
|
232
|
-
protanopia: [
|
|
233
|
-
[0.1705, 0.8295, 0],
|
|
234
|
-
[0.1705, 0.8295, 0],
|
|
235
|
-
[-0.0045, 0.0045, 1],
|
|
236
|
-
],
|
|
237
|
-
deuteranopia: [
|
|
238
|
-
[0.33066, 0.66934, 0],
|
|
239
|
-
[0.33066, 0.66934, 0],
|
|
240
|
-
[-0.02785, 0.02785, 1],
|
|
241
|
-
],
|
|
242
|
-
tritanopia: [
|
|
243
|
-
[1, 0.1273, -0.1273],
|
|
244
|
-
[0, 0.8739, 0.1261],
|
|
245
|
-
[0, 0.8739, 0.1261],
|
|
246
|
-
],
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
export function simulateCvd(rgb: Rgb, type: CvdType): Rgb {
|
|
250
|
-
const m = CVD_MATRIX[type];
|
|
251
|
-
const [r, g, b] = [toLinear(rgb.r), toLinear(rgb.g), toLinear(rgb.b)];
|
|
252
|
-
return {
|
|
253
|
-
r: fromLinear(m[0][0] * r + m[0][1] * g + m[0][2] * b),
|
|
254
|
-
g: fromLinear(m[1][0] * r + m[1][1] * g + m[1][2] * b),
|
|
255
|
-
b: fromLinear(m[2][0] * r + m[2][1] * g + m[2][2] * b),
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Perceptual distance in OKLab, which is what that space is FOR: a Euclidean distance
|
|
261
|
-
* in OKLab corresponds far more closely to "how different do these look" than one in
|
|
262
|
-
* sRGB, where the same numeric gap is obvious among greens and invisible among blues.
|
|
263
|
-
*/
|
|
264
|
-
export function deltaE(a: Rgb, b: Rgb): number {
|
|
265
|
-
const A = rgbToOklch(a);
|
|
266
|
-
const B = rgbToOklch(b);
|
|
267
|
-
const aA = A.c * Math.cos((A.h * Math.PI) / 180);
|
|
268
|
-
const aB = A.c * Math.sin((A.h * Math.PI) / 180);
|
|
269
|
-
const bA = B.c * Math.cos((B.h * Math.PI) / 180);
|
|
270
|
-
const bB = B.c * Math.sin((B.h * Math.PI) / 180);
|
|
271
|
-
return Math.hypot(A.l - B.l, aA - bA, aB - bB);
|
|
272
|
-
}
|