@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
package/src/lib/format.ts
DELETED
|
@@ -1,522 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import { useKitLocale, useKitTimeZone } from "../i18n/kit-labels";
|
|
3
|
-
import { parseIsoDate } from "./dates";
|
|
4
|
-
import { dateFormatter } from "./intl-cache";
|
|
5
|
-
import { isBareIsoDay } from "./iso-day";
|
|
6
|
-
import { formatWithMinus, type MinusStyle } from "./minus";
|
|
7
|
-
import { roundHalfAway } from "./round";
|
|
8
|
-
|
|
9
|
-
export type { MinusStyle } from "./minus";
|
|
10
|
-
// 0.50 (KIT-1 follow-up): the kit's minus for an app's OWN `Intl.NumberFormat` wrapper.
|
|
11
|
-
export { formatWithMinus } from "./minus";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Number, money, percentage, date and relative-time formatting — `Intl`, in one place,
|
|
15
|
-
* for the figures an app prints OUTSIDE a kit component.
|
|
16
|
-
*
|
|
17
|
-
* Each app grew its own: kastlan's `utils/formatters.ts` (a Swiss-pinned
|
|
18
|
-
* `formatNumber`/`formatCurrency`, a date-fns `formatDate`, and a `formatRelativeTime`
|
|
19
|
-
* whose "5m ago" / "3h ago" / "2d ago" stayed English in every language), its tenancy
|
|
20
|
-
* `format.ts` (`formatChf`, a `formatPct` gluing a "+" onto `toFixed(2)`), keksdose's
|
|
21
|
-
* own set. Every one of them is `Intl` with a locale bolted on, so the only thing
|
|
22
|
-
* worth sharing is the locale — and the kit already has one, the provider's.
|
|
23
|
-
*
|
|
24
|
-
* The plain functions take a `locale` (none: the runtime default, as every `Intl` API
|
|
25
|
-
* reads `undefined`). Inside a component, {@link useKitFormat} hands back the same
|
|
26
|
-
* functions bound to the `<UiKitProvider locale>`, so a page formats exactly like the
|
|
27
|
-
* kit components on it.
|
|
28
|
-
*
|
|
29
|
-
* A missing value — `null`, `undefined`, an unparseable date — formats as `empty`
|
|
30
|
-
* (default "—", the dash `StatTile` shows for no value), never as "NaN" or "Invalid
|
|
31
|
-
* Date". A number may also arrive as a numeric STRING (0.49, KIT-2) — "1850.00", "-12.5",
|
|
32
|
-
* "0": a Decimal field off a Python API — and is formatted like the number. Anything
|
|
33
|
-
* else (a non-numeric string, an object, `NaN`, ±`Infinity`) prints `empty` too, but is
|
|
34
|
-
* a bug upstream rather than a gap in the data, so a development build says so on the
|
|
35
|
-
* console, once per call site. Zero is a figure: `0` and `"0"` print "CHF 0.00", never
|
|
36
|
-
* the dash.
|
|
37
|
-
*
|
|
38
|
-
* A negative figure carries the typographic minus, U+2212 (0.49, KIT-1), in every
|
|
39
|
-
* locale — `Intl` writes a hyphen in most. `minus: "ascii"` for text a machine reads
|
|
40
|
-
* back (a CSV, the clipboard).
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
/** What every formatter here prints for a missing value, unless told otherwise. */
|
|
44
|
-
export const EMPTY_FORMATTED_VALUE = "—";
|
|
45
|
-
|
|
46
|
-
/** Fraction digits: a number pins both the minimum and the maximum (`2` → "3.10");
|
|
47
|
-
* an object sets them apart (a meter reading, 1–3). */
|
|
48
|
-
export type FormatDigits = number | { min?: number; max?: number };
|
|
49
|
-
|
|
50
|
-
interface BaseOptions {
|
|
51
|
-
/** BCP 47 tag. Left out: the runtime default (the hook: the provider's). */
|
|
52
|
-
locale?: string;
|
|
53
|
-
/** Printed for a missing value. Default {@link EMPTY_FORMATTED_VALUE}. */
|
|
54
|
-
empty?: string;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** The options every number formatter shares (money and percent carry their own unit). */
|
|
58
|
-
export interface FormatNumberBaseOptions extends BaseOptions {
|
|
59
|
-
digits?: FormatDigits;
|
|
60
|
-
/** Compact notation: 12 400 → "12K". */
|
|
61
|
-
compact?: boolean;
|
|
62
|
-
/** `"exceptZero"` for a change ("+3", "−3", "0"). Default: the minus only. */
|
|
63
|
-
signDisplay?: Intl.NumberFormatOptions["signDisplay"];
|
|
64
|
-
/** Any further `Intl.NumberFormat` options, merged over the ones above. */
|
|
65
|
-
options?: Intl.NumberFormatOptions;
|
|
66
|
-
/**
|
|
67
|
-
* The minus sign of a negative figure (0.49, KIT-1). `"typographic"` (default):
|
|
68
|
-
* U+2212, as wide as "+" and the digits, as `SignedAmount` prints it — in every
|
|
69
|
-
* locale, also where `Intl` writes a hyphen. `"ascii"`: U+002D, for an export a
|
|
70
|
-
* machine parses back (a CSV download, the clipboard) — there, also pass
|
|
71
|
-
* `options: { useGrouping: false }` or write the raw number.
|
|
72
|
-
*/
|
|
73
|
-
minus?: MinusStyle;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** The options {@link formatNumber} takes: the shared ones plus a free-text `unit`. */
|
|
77
|
-
export interface FormatNumberOptions extends FormatNumberBaseOptions {
|
|
78
|
-
/**
|
|
79
|
-
* A unit printed after the figure, joined by a narrow no-break space (U+202F):
|
|
80
|
-
* "3.400 N", "12 kg", "4,5 m²". lenkbank (P8) prints forces, masses and lengths in
|
|
81
|
-
* every table and summary, and each call site glued `${n} N` together with a plain
|
|
82
|
-
* space — which wraps the "N" onto the next line in a narrow column and reads loose
|
|
83
|
-
* beside the digit grouping. The narrow no-break space is the SI brochure's and the
|
|
84
|
-
* Swiss typesetting rule's separator between value and unit, and it never breaks.
|
|
85
|
-
*
|
|
86
|
-
* Free text, not `Intl`'s `style: "unit"`: that one only knows the ECMA-402
|
|
87
|
-
* sanctioned units (no "N", no "kN", no "m³/h"), so an app would still be gluing.
|
|
88
|
-
* A missing value prints `empty` ALONE — "— N" says there is a newton-shaped
|
|
89
|
-
* nothing, which is noise in a column that already heads its unit.
|
|
90
|
-
*/
|
|
91
|
-
unit?: string;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** Narrow no-break space (U+202F): between a figure and its {@link FormatNumberOptions.unit}. */
|
|
95
|
-
const UNIT_SEPARATOR = "\u202F";
|
|
96
|
-
|
|
97
|
-
export interface FormatMoneyOptions extends FormatNumberBaseOptions {
|
|
98
|
-
/** `"symbol"` (default), `"narrowSymbol"`, `"code"` ("CHF 12.00") or `"name"`. */
|
|
99
|
-
currencyDisplay?: Intl.NumberFormatOptions["currencyDisplay"];
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export interface FormatPercentOptions extends FormatNumberBaseOptions {
|
|
103
|
-
/**
|
|
104
|
-
* `true` (default): `value` is a RATIO, as `Intl` and `StatTile`'s percent delta read
|
|
105
|
-
* it — `0.12` is 12 %. `false`: it is already a percentage — `12` is 12 %
|
|
106
|
-
* (kastlan's rent `change_pct`).
|
|
107
|
-
*/
|
|
108
|
-
ratio?: boolean;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// One formatter per option set: a table formats the same way thousands of times, and
|
|
112
|
-
// constructing an Intl formatter is the expensive part.
|
|
113
|
-
const numberFormatters = new Map<string, Intl.NumberFormat>();
|
|
114
|
-
function numberFormatter(locale: string | undefined, options: Intl.NumberFormatOptions): Intl.NumberFormat {
|
|
115
|
-
const key = `${locale ?? ""}|${JSON.stringify(options)}`;
|
|
116
|
-
let f = numberFormatters.get(key);
|
|
117
|
-
if (!f) {
|
|
118
|
-
f = new Intl.NumberFormat(locale, options);
|
|
119
|
-
numberFormatters.set(key, f);
|
|
120
|
-
}
|
|
121
|
-
return f;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function digitOptions(digits: FormatDigits | undefined): Intl.NumberFormatOptions {
|
|
125
|
-
if (digits === undefined) return {};
|
|
126
|
-
if (typeof digits === "number") return { minimumFractionDigits: digits, maximumFractionDigits: digits };
|
|
127
|
-
return {
|
|
128
|
-
...(digits.min !== undefined ? { minimumFractionDigits: digits.min } : null),
|
|
129
|
-
...(digits.max !== undefined ? { maximumFractionDigits: digits.max } : null),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function numberOptions(o: FormatNumberBaseOptions): Intl.NumberFormatOptions {
|
|
134
|
-
return {
|
|
135
|
-
...digitOptions(o.digits),
|
|
136
|
-
...(o.compact ? { notation: "compact" } : null),
|
|
137
|
-
...(o.signDisplay ? { signDisplay: o.signDisplay } : null),
|
|
138
|
-
...o.options,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* What the number formatters take (0.49, KIT-2): a number, a numeric string ("1850.00",
|
|
144
|
-
* "-12.5", "1e3" — what a Decimal arrives as in JSON), or `null` / `undefined` for no
|
|
145
|
-
* value. A string is read with `Number()`, so a figure with more significant digits than
|
|
146
|
-
* a double holds (about 15–17) is printed as its nearest double.
|
|
147
|
-
*/
|
|
148
|
-
export type FormattableNumber = number | string | null | undefined;
|
|
149
|
-
|
|
150
|
-
/** A plain decimal: optional sign, digits with an optional point, an optional exponent.
|
|
151
|
-
* No grouping marks, no decimal comma, no currency — those are formatted text, and
|
|
152
|
-
* reading them back is a locale's guess. */
|
|
153
|
-
const NUMERIC_STRING = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
154
|
-
|
|
155
|
-
/** The kit's dev switch, as `lib/logger.ts` reads it: a development build, never a
|
|
156
|
-
* production one (the consumer's bundler makes `import.meta.env.DEV` false) and never
|
|
157
|
-
* under vitest. Read per call so a test can switch it on with `vi.stubEnv`. */
|
|
158
|
-
function devWarnings(): boolean {
|
|
159
|
-
return Boolean(import.meta.env?.DEV) && !import.meta.env?.VITEST;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const warnedSites = new Set<string>();
|
|
163
|
-
/** This module's own frames, skipped to find the caller ("Object.formatMoney" is a
|
|
164
|
-
* `useKitFormat` wrapper). */
|
|
165
|
-
const OWN_FRAME = /\b(?:formatNumber|formatMoney|formatPercent|toFormattable|warnInvalid|callSite)\b/;
|
|
166
|
-
|
|
167
|
-
/** The first stack frame outside the formatters: where the bad value was passed. */
|
|
168
|
-
function callSite(): string {
|
|
169
|
-
const frames = (new Error().stack ?? "").split("\n").slice(1);
|
|
170
|
-
return frames.find((frame) => !OWN_FRAME.test(frame))?.trim() ?? "";
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
function describeValue(value: unknown): string {
|
|
174
|
-
if (typeof value === "number" || typeof value === "bigint" || typeof value === "boolean") return String(value);
|
|
175
|
-
try {
|
|
176
|
-
return JSON.stringify(value) ?? String(value);
|
|
177
|
-
} catch {
|
|
178
|
-
return Object.prototype.toString.call(value);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/** A development build's console note about an invalid value — once per call site. */
|
|
183
|
-
function warnInvalid(fn: string, value: unknown): void {
|
|
184
|
-
if (!devWarnings()) return;
|
|
185
|
-
const site = callSite();
|
|
186
|
-
const key = `${fn}|${site || typeof value}`;
|
|
187
|
-
if (warnedSites.has(key)) return;
|
|
188
|
-
warnedSites.add(key);
|
|
189
|
-
const type = Array.isArray(value) ? "array" : typeof value;
|
|
190
|
-
console.warn(
|
|
191
|
-
`[ui-kit] ${fn} got ${describeValue(value)} (${type}), which is not a number: printed the empty value. ` +
|
|
192
|
-
"Pass a number, a numeric string, or null/undefined for a missing value." +
|
|
193
|
-
(site ? `\n at ${site.replace(/^at /, "")}` : ""),
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* `value` as a finite number to format, or `undefined` to print `empty`. `null` and
|
|
199
|
-
* `undefined` are a missing value and pass quietly; anything that is neither a finite
|
|
200
|
-
* number nor a numeric string is an invalid one — ±Infinity included (lenkbank, adopting
|
|
201
|
-
* 0.13: a division by zero upstream; "∞" in a money column reads like data) — and a
|
|
202
|
-
* development build warns. `-0` is folded into `0`: zero carries no sign.
|
|
203
|
-
*/
|
|
204
|
-
function toFormattable(fn: string, value: unknown): number | undefined {
|
|
205
|
-
if (value === null || value === undefined) return undefined;
|
|
206
|
-
let n: number | undefined;
|
|
207
|
-
if (typeof value === "number") n = value;
|
|
208
|
-
else if (typeof value === "string" && NUMERIC_STRING.test(value.trim())) n = Number(value.trim());
|
|
209
|
-
if (n === undefined || !Number.isFinite(n)) {
|
|
210
|
-
warnInvalid(fn, value);
|
|
211
|
-
return undefined;
|
|
212
|
-
}
|
|
213
|
-
return n + 0;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** A number in `locale`: "1,234.5", "1.234,5", "1’234.5" — with `unit`, "3.400 N". */
|
|
217
|
-
export function formatNumber(value: FormattableNumber, options: FormatNumberOptions = {}): string {
|
|
218
|
-
const n = toFormattable("formatNumber", value);
|
|
219
|
-
if (n === undefined) return options.empty ?? EMPTY_FORMATTED_VALUE;
|
|
220
|
-
const figure = formatWithMinus(numberFormatter(options.locale, numberOptions(options)), n, options.minus);
|
|
221
|
-
return options.unit ? `${figure}${UNIT_SEPARATOR}${options.unit}` : figure;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/** An amount of `currency` (ISO 4217) in `locale`: "CHF 1’234.50", "1.234,50 €". */
|
|
225
|
-
export function formatMoney(value: FormattableNumber, currency: string, options: FormatMoneyOptions = {}): string {
|
|
226
|
-
const n = toFormattable("formatMoney", value);
|
|
227
|
-
if (n === undefined) return options.empty ?? EMPTY_FORMATTED_VALUE;
|
|
228
|
-
const formatter = numberFormatter(options.locale, {
|
|
229
|
-
style: "currency",
|
|
230
|
-
currency,
|
|
231
|
-
...(options.currencyDisplay ? { currencyDisplay: options.currencyDisplay } : null),
|
|
232
|
-
...numberOptions(options),
|
|
233
|
-
});
|
|
234
|
-
return formatWithMinus(formatter, n, options.minus);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/** A percentage in `locale` ("12%", "12 %", "+1.25%"). See {@link FormatPercentOptions.ratio}
|
|
238
|
-
* for what `value` means. Default digits: at most one. */
|
|
239
|
-
export function formatPercent(value: FormattableNumber, options: FormatPercentOptions = {}): string {
|
|
240
|
-
const n = toFormattable("formatPercent", value);
|
|
241
|
-
if (n === undefined) return options.empty ?? EMPTY_FORMATTED_VALUE;
|
|
242
|
-
const ratio = options.ratio === false ? n / 100 : n;
|
|
243
|
-
const formatter = numberFormatter(options.locale, {
|
|
244
|
-
style: "percent",
|
|
245
|
-
...(options.digits === undefined ? { maximumFractionDigits: 1 } : null),
|
|
246
|
-
...numberOptions(options),
|
|
247
|
-
});
|
|
248
|
-
return formatWithMinus(formatter, ratio, options.minus);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/* ── Dates ─────────────────────────────────────────────────────────────────── */
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* The shapes a date is printed in, each a set of `Intl.DateTimeFormat` options:
|
|
255
|
-
* - `short` / `medium` / `long` / `full` — the date alone, at that `dateStyle`
|
|
256
|
-
* ("08/07/2026", "8 Jul 2026", "8 July 2026", "Wednesday, 8 July 2026" in en-GB).
|
|
257
|
-
* - `dateTime` — medium date and short time: a timestamp ("8 Jul 2026, 14:05").
|
|
258
|
-
* - `time` — the short time alone ("14:05").
|
|
259
|
-
* - `monthYear` — "July 2026".
|
|
260
|
-
*
|
|
261
|
-
* Or pass `Intl.DateTimeFormatOptions` for anything else. A date-fns PATTERN
|
|
262
|
-
* ("dd.MM.yyyy") is deliberately not accepted: a pattern is one locale's order baked
|
|
263
|
-
* into a string, which is how an English page ends up with German dates.
|
|
264
|
-
*/
|
|
265
|
-
export type FormatDateStyle = "short" | "medium" | "long" | "full" | "dateTime" | "time" | "monthYear";
|
|
266
|
-
|
|
267
|
-
const DATE_STYLES: Record<FormatDateStyle, Intl.DateTimeFormatOptions> = {
|
|
268
|
-
short: { dateStyle: "short" },
|
|
269
|
-
medium: { dateStyle: "medium" },
|
|
270
|
-
long: { dateStyle: "long" },
|
|
271
|
-
full: { dateStyle: "full" },
|
|
272
|
-
dateTime: { dateStyle: "medium", timeStyle: "short" },
|
|
273
|
-
time: { timeStyle: "short" },
|
|
274
|
-
monthYear: { month: "long", year: "numeric" },
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
export interface FormatDateOptions extends BaseOptions {
|
|
278
|
-
/** An IANA zone ("Europe/Zurich") for a timestamp. Left out: the device's. A bare
|
|
279
|
-
* "YYYY-MM-DD" ignores it: a calendar day is the day it names in every zone. */
|
|
280
|
-
timeZone?: string;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/** What {@link formatDate} and {@link formatRelativeTime} accept. */
|
|
284
|
-
export type DateInput = string | number | Date | null | undefined;
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* `value` as a Date, or null. A bare "YYYY-MM-DD" is a CALENDAR day and is read on the
|
|
288
|
-
* local calendar (`parseIsoDate`) — `new Date("2026-07-08")` is UTC midnight, which is
|
|
289
|
-
* the 7th anywhere west of Greenwich. Anything else (a full ISO timestamp, epoch
|
|
290
|
-
* milliseconds, a Date) is an instant and goes through `Date` as is.
|
|
291
|
-
*/
|
|
292
|
-
export function toDate(value: DateInput): Date | null {
|
|
293
|
-
if (value === null || value === undefined || value === "") return null;
|
|
294
|
-
if (isBareIsoDay(value)) return parseIsoDate(value);
|
|
295
|
-
const d = value instanceof Date ? value : new Date(value);
|
|
296
|
-
return Number.isNaN(d.getTime()) ? null : d;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* A date or timestamp in `locale`. Takes an ISO date ("2026-07-08", read on the local
|
|
301
|
-
* calendar), an ISO timestamp ("2026-07-08T14:05:00Z"), epoch milliseconds or a Date.
|
|
302
|
-
* `style` defaults to `medium`; see {@link FormatDateStyle}.
|
|
303
|
-
*
|
|
304
|
-
* `formatIsoDate` (`@eifi1/ui-kit/dates`) remains for a plain "YYYY-MM-DD" with an
|
|
305
|
-
* explicit locale; this is its superset for timestamps and the named styles.
|
|
306
|
-
*/
|
|
307
|
-
export function formatDate(
|
|
308
|
-
value: DateInput,
|
|
309
|
-
style: FormatDateStyle | Intl.DateTimeFormatOptions = "medium",
|
|
310
|
-
options: FormatDateOptions = {},
|
|
311
|
-
): string {
|
|
312
|
-
const d = toDate(value);
|
|
313
|
-
if (!d) return options.empty ?? EMPTY_FORMATTED_VALUE;
|
|
314
|
-
const base = typeof style === "string" ? DATE_STYLES[style] : style;
|
|
315
|
-
// A bare "YYYY-MM-DD" is a calendar day, which has no zone: it is the day it names
|
|
316
|
-
// wherever it is read, so a `timeZone` (in `options` or the style) never moves it — the
|
|
317
|
-
// device's local midnight shown in a zone west of it was the day before (round 0.45, N9).
|
|
318
|
-
if (isBareIsoDay(value)) {
|
|
319
|
-
const day = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
|
|
320
|
-
return dateFormatter(options.locale, { ...base, timeZone: "UTC" }).format(day);
|
|
321
|
-
}
|
|
322
|
-
return dateFormatter(options.locale, options.timeZone ? { ...base, timeZone: options.timeZone } : base).format(d);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
export interface FormatRelativeTimeOptions extends BaseOptions {
|
|
326
|
-
/** The zone of the date printed past `absoluteAfterDays` (0.46), and (0.51.7) the zone
|
|
327
|
-
* whose calendar days "yesterday" and "2 days ago" count. Left out: the device's. */
|
|
328
|
-
timeZone?: string;
|
|
329
|
-
/** The moment it is measured from. Default: now. */
|
|
330
|
-
now?: DateInput;
|
|
331
|
-
/** `"auto"` (default): "yesterday", "now", "next week". `"always"`: "1 day ago". */
|
|
332
|
-
numeric?: Intl.RelativeTimeFormatNumeric;
|
|
333
|
-
/** `"long"` (default) "3 hours ago", `"short"` "3 hr. ago", `"narrow"` "3h ago". */
|
|
334
|
-
style?: Intl.RelativeTimeFormatStyle;
|
|
335
|
-
/**
|
|
336
|
-
* Past this many days either way, print the date instead ({@link formatDate} in
|
|
337
|
-
* `absoluteStyle`) — kastlan's feed switches to the date after a week, because "5
|
|
338
|
-
* weeks ago" makes a reader do sums. Default: never.
|
|
339
|
-
*/
|
|
340
|
-
absoluteAfterDays?: number;
|
|
341
|
-
/** The style of that date. Default `medium`. */
|
|
342
|
-
absoluteStyle?: FormatDateStyle | Intl.DateTimeFormatOptions;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const SECOND = 1000;
|
|
346
|
-
const MINUTE = 60 * SECOND;
|
|
347
|
-
const HOUR = 60 * MINUTE;
|
|
348
|
-
const DAY = 24 * HOUR;
|
|
349
|
-
|
|
350
|
-
/** [the largest |difference| a unit is used for, the unit, its length]. */
|
|
351
|
-
const RELATIVE_STEPS: Array<[number, Intl.RelativeTimeFormatUnit, number]> = [
|
|
352
|
-
[45 * SECOND, "second", SECOND],
|
|
353
|
-
[45 * MINUTE, "minute", MINUTE],
|
|
354
|
-
[22 * HOUR, "hour", HOUR],
|
|
355
|
-
[6.5 * DAY, "day", DAY],
|
|
356
|
-
[26 * DAY, "week", 7 * DAY],
|
|
357
|
-
[320 * DAY, "month", 30.44 * DAY],
|
|
358
|
-
[Infinity, "year", 365.25 * DAY],
|
|
359
|
-
];
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* `d`'s calendar day in `timeZone` (left out: the device's), as a whole number of days:
|
|
363
|
-
* that day's UTC midnight over a day's length. Two of them subtract to whole calendar
|
|
364
|
-
* days — a 23- or 25-hour DST day still counts one.
|
|
365
|
-
*/
|
|
366
|
-
function dayNumber(d: Date, timeZone: string | undefined): number {
|
|
367
|
-
if (!timeZone) return Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()) / DAY;
|
|
368
|
-
// `en-US`: Gregorian, Latin digits — the parts are read back as numbers.
|
|
369
|
-
const fields: Intl.DateTimeFormatOptions = { timeZone, year: "numeric", month: "numeric", day: "numeric" };
|
|
370
|
-
const parts = dateFormatter("en-US", fields).formatToParts(d);
|
|
371
|
-
const part = (type: Intl.DateTimeFormatPartTypes) => Number(parts.find((p) => p.type === type)?.value);
|
|
372
|
-
return Date.UTC(part("year"), part("month") - 1, part("day")) / DAY;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const relativeFormatters = new Map<string, Intl.RelativeTimeFormat>();
|
|
376
|
-
function relativeFormatter(
|
|
377
|
-
locale: string | undefined,
|
|
378
|
-
numeric: Intl.RelativeTimeFormatNumeric,
|
|
379
|
-
style: Intl.RelativeTimeFormatStyle,
|
|
380
|
-
): Intl.RelativeTimeFormat {
|
|
381
|
-
const key = `${locale ?? ""}|${numeric}|${style}`;
|
|
382
|
-
let f = relativeFormatters.get(key);
|
|
383
|
-
if (!f) {
|
|
384
|
-
f = new Intl.RelativeTimeFormat(locale, { numeric, style });
|
|
385
|
-
relativeFormatters.set(key, f);
|
|
386
|
-
}
|
|
387
|
-
return f;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
/**
|
|
391
|
-
* How long ago (or until) `value` is, in `locale`'s words, through
|
|
392
|
-
* `Intl.RelativeTimeFormat`: "3 hours ago", "vor 3 Stunden", "il y a 3 heures",
|
|
393
|
-
* "in 2 days", and under 45 seconds "now". The unit is picked by size — seconds,
|
|
394
|
-
* minutes, hours, days, weeks, months, years — and the count is rounded; days are
|
|
395
|
-
* CALENDAR days (0.51.7), in `timeZone` when given: "yesterday" is the day before today,
|
|
396
|
-
* however few hours ago that was.
|
|
397
|
-
*/
|
|
398
|
-
export function formatRelativeTime(value: DateInput, options: FormatRelativeTimeOptions = {}): string {
|
|
399
|
-
const d = toDate(value);
|
|
400
|
-
if (!d) return options.empty ?? EMPTY_FORMATTED_VALUE;
|
|
401
|
-
const now = toDate(options.now ?? new Date()) ?? new Date();
|
|
402
|
-
const diff = d.getTime() - now.getTime();
|
|
403
|
-
const abs = Math.abs(diff);
|
|
404
|
-
if (options.absoluteAfterDays !== undefined && abs > options.absoluteAfterDays * DAY) {
|
|
405
|
-
return formatDate(d, options.absoluteStyle ?? "medium", options);
|
|
406
|
-
}
|
|
407
|
-
const rtf = relativeFormatter(options.locale, options.numeric ?? "auto", options.style ?? "long");
|
|
408
|
-
const [, unit, size] = RELATIVE_STEPS.find(([limit]) => abs < limit)!;
|
|
409
|
-
if (unit === "day") {
|
|
410
|
-
// By the calendar, not in 24-hour units (refactor audit 2026-10-30, DSP-7): rounded
|
|
411
|
-
// elapsed time made 00:10 seen at 23:50 "yesterday" and 01:00 yesterday seen at 23:30
|
|
412
|
-
// "2 days ago", beside an exact date (DateMark's second line, the feedback thread's
|
|
413
|
-
// tooltip) that said otherwise. Counted in `timeZone`, the zone that date is printed
|
|
414
|
-
// in; a bare "YYYY-MM-DD" is the day it names wherever it is read, as in formatDate.
|
|
415
|
-
// Still the same day (22 hours and more since just after midnight): in hours.
|
|
416
|
-
const bareDay = isBareIsoDay(value);
|
|
417
|
-
const days = dayNumber(d, bareDay ? undefined : options.timeZone) - dayNumber(now, options.timeZone);
|
|
418
|
-
return days === 0 ? rtf.format(Math.round(diff / HOUR), "hour") : rtf.format(days, "day");
|
|
419
|
-
}
|
|
420
|
-
// Under 45 seconds is "now" rather than "12 seconds ago": a feed that ticks through
|
|
421
|
-
// the seconds is noise, and nothing reads a timestamp to the second.
|
|
422
|
-
const count = unit === "second" ? 0 : Math.round(diff / size);
|
|
423
|
-
// `+ 0` folds -0 into 0: `format(-0, …)` says "0 seconds ago" instead of "now".
|
|
424
|
-
return rtf.format(count + 0, unit);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
/* ── Bound to the provider ─────────────────────────────────────────────────── */
|
|
428
|
-
|
|
429
|
-
type WithoutLocale<T> = Omit<T, "locale"> & { locale?: string };
|
|
430
|
-
|
|
431
|
-
/** What {@link useKitFormat} returns: the formatters above with the provider's locale
|
|
432
|
-
* as their default (an explicit `locale` in the options still wins). */
|
|
433
|
-
export interface KitFormat {
|
|
434
|
-
/** The locale they format in — the provider's, or `undefined` (runtime default). */
|
|
435
|
-
locale: string | undefined;
|
|
436
|
-
formatNumber: (value: FormattableNumber, options?: WithoutLocale<FormatNumberOptions>) => string;
|
|
437
|
-
formatMoney: (value: FormattableNumber, currency: string, options?: WithoutLocale<FormatMoneyOptions>) => string;
|
|
438
|
-
formatPercent: (value: FormattableNumber, options?: WithoutLocale<FormatPercentOptions>) => string;
|
|
439
|
-
formatDate: (
|
|
440
|
-
value: DateInput,
|
|
441
|
-
style?: FormatDateStyle | Intl.DateTimeFormatOptions,
|
|
442
|
-
options?: WithoutLocale<FormatDateOptions>,
|
|
443
|
-
) => string;
|
|
444
|
-
formatRelativeTime: (value: DateInput, options?: WithoutLocale<FormatRelativeTimeOptions>) => string;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
/**
|
|
448
|
-
* The formatters, bound to the `<UiKitProvider locale>` (or to `locale`, which wins
|
|
449
|
-
* over it — the same precedence as a component's `locale` prop):
|
|
450
|
-
*
|
|
451
|
-
* const { formatMoney, formatRelativeTime } = useKitFormat();
|
|
452
|
-
* formatMoney(row.balance, "CHF");
|
|
453
|
-
*/
|
|
454
|
-
export function useKitFormat(locale?: string): KitFormat {
|
|
455
|
-
const kitLocale = useKitLocale(locale);
|
|
456
|
-
// 0.46 (§10.3): the provider's `timeZone` for timestamps; a call's own wins, and a bare
|
|
457
|
-
// "YYYY-MM-DD" ignores it (formatDate).
|
|
458
|
-
const timeZone = useKitTimeZone();
|
|
459
|
-
return useMemo<KitFormat>(
|
|
460
|
-
() => ({
|
|
461
|
-
locale: kitLocale,
|
|
462
|
-
formatNumber: (value, options) => formatNumber(value, { locale: kitLocale, ...options }),
|
|
463
|
-
formatMoney: (value, currency, options) => formatMoney(value, currency, { locale: kitLocale, ...options }),
|
|
464
|
-
formatPercent: (value, options) => formatPercent(value, { locale: kitLocale, ...options }),
|
|
465
|
-
formatDate: (value, style, options) => formatDate(value, style, { locale: kitLocale, timeZone, ...options }),
|
|
466
|
-
formatRelativeTime: (value, options) => formatRelativeTime(value, { locale: kitLocale, timeZone, ...options }),
|
|
467
|
-
}),
|
|
468
|
-
[kitLocale, timeZone],
|
|
469
|
-
);
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
/* ── Currency minor units ──────────────────────────────────────────────────── */
|
|
473
|
-
|
|
474
|
-
/**
|
|
475
|
-
* The decimals a currency is written with — its minor unit: CHF and EUR 2, JPY 0,
|
|
476
|
-
* KWD 3 — from `Intl`, or `undefined` for a code `Intl` does not accept. The rule
|
|
477
|
-
* AmountInput settles a typed figure by, for a host that needs it outside the field.
|
|
478
|
-
*/
|
|
479
|
-
export function currencyMinorDigits(currency: string | null | undefined): number | undefined {
|
|
480
|
-
if (!currency) return undefined;
|
|
481
|
-
try {
|
|
482
|
-
return new Intl.NumberFormat("en", { style: "currency", currency }).resolvedOptions().maximumFractionDigits;
|
|
483
|
-
} catch {
|
|
484
|
-
return undefined;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
/** The options form of {@link roundToCurrency}'s third argument. */
|
|
489
|
-
export interface RoundToCurrencyOptions {
|
|
490
|
-
/** Decimals to round to, whatever the currency — the plain `digits` argument. */
|
|
491
|
-
digits?: number;
|
|
492
|
-
/**
|
|
493
|
-
* Decimals for a currency `Intl` cannot resolve — no code yet (`null`, `""`), or a
|
|
494
|
-
* malformed one ("EURO", "€"). Left out, such a value comes back unchanged, as
|
|
495
|
-
* before. Note that `Intl` resolves ANY well-formed three-letter code, a made-up
|
|
496
|
-
* "XYZ" included (to 2), so this is the case of a missing or broken code, not of a
|
|
497
|
-
* rare currency.
|
|
498
|
-
*/
|
|
499
|
-
fallbackDigits?: number;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* `value` rounded to the currency's minor unit (or to `digits`), half away from zero,
|
|
504
|
-
* in decimal arithmetic: 93.4213 CHF → 93.42, 1.005 EUR → 1.01 (`Math.round(1.005 *
|
|
505
|
-
* 100)` is 100, since 1.005 is 1.00499… in binary). A non-finite value, or a currency
|
|
506
|
-
* `Intl` does not know without `digits`, comes back unchanged (keksdose live #356: an
|
|
507
|
-
* FX estimate set into an AmountInput showed four decimals) — unless the options form
|
|
508
|
-
* gives `fallbackDigits`: `roundToCurrency(v, code, { fallbackDigits: 2 })` rounds a
|
|
509
|
-
* figure whose currency is not chosen yet to cents rather than leaving 0.1 + 0.2 as is.
|
|
510
|
-
* A finite value never comes back NaN or -0, however small or large (BUG-11):
|
|
511
|
-
* 0.1 + 0.2 - 0.3 → 0, -0.004 → 0.
|
|
512
|
-
*/
|
|
513
|
-
export function roundToCurrency(
|
|
514
|
-
value: number,
|
|
515
|
-
currency: string | null | undefined,
|
|
516
|
-
digits?: number | RoundToCurrencyOptions,
|
|
517
|
-
): number {
|
|
518
|
-
const options = typeof digits === "object" && digits !== null ? digits : { digits };
|
|
519
|
-
const places = options.digits ?? currencyMinorDigits(currency) ?? options.fallbackDigits;
|
|
520
|
-
if (places === undefined) return value;
|
|
521
|
-
return roundHalfAway(value, places);
|
|
522
|
-
}
|
package/src/lib/http-status.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The HTTP status of a thrown error, as one probe (DUP-11, refactor audit 2026-10: the
|
|
3
|
-
* session refresh carried its own copy).
|
|
4
|
-
*
|
|
5
|
-
* It lived in `auth/auth-errors.ts` until 0.52, which made `lib/session-refresh` and
|
|
6
|
-
* `/sync`'s engine import the auth folder — and put auth's English error words in the
|
|
7
|
-
* `/sync` entry's closure — for a three-line reader of `status` (refactor audit
|
|
8
|
-
* 2026-10-30, MOD-6). `auth-errors.ts` re-exports it, so nothing that imported it there
|
|
9
|
-
* moved.
|
|
10
|
-
*
|
|
11
|
-
* @internal Package-private — not re-exported from the barrel.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
type Bag = Record<string, unknown>;
|
|
15
|
-
|
|
16
|
-
const isBag = (value: unknown): value is Bag => typeof value === "object" && value !== null;
|
|
17
|
-
|
|
18
|
-
/** An HTTP status as a number, or undefined. */
|
|
19
|
-
function statusOf(value: unknown): number | undefined {
|
|
20
|
-
return typeof value === "number" && Number.isInteger(value) ? value : undefined;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The HTTP status a thrown error carries, wherever the apps' HTTP clients put it —
|
|
25
|
-
* without depending on any of them:
|
|
26
|
-
*
|
|
27
|
-
* 1. `err.response.status` — axios (all three apps' clients);
|
|
28
|
-
* 2. `err.status` — ofetch's `FetchError`, the generated OpenAPI clients' `ApiError`, and
|
|
29
|
-
* a `Response` thrown as it came;
|
|
30
|
-
* 3. `err.statusCode` — ofetch's alias, and Node-style errors.
|
|
31
|
-
*
|
|
32
|
-
* `undefined` when none is a whole number.
|
|
33
|
-
*/
|
|
34
|
-
export function httpStatusOf(err: unknown): number | undefined {
|
|
35
|
-
if (!isBag(err)) return undefined;
|
|
36
|
-
const response = err.response;
|
|
37
|
-
return (isBag(response) ? statusOf(response.status) : undefined) ?? statusOf(err.status) ?? statusOf(err.statusCode);
|
|
38
|
-
}
|