@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/countries.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Countries as ISO 3166-1 alpha-2 codes, named by the runtime — for {@link CountrySelect}
|
|
3
|
-
* and for an app that shows the code it stored ("CH") as a name somewhere else (a
|
|
4
|
-
* table cell, an address line).
|
|
5
|
-
*
|
|
6
|
-
* The kit ships CODES, not names. Every runtime the kit supports has
|
|
7
|
-
* `Intl.DisplayNames({ type: "region" })`, which names all of these in every locale
|
|
8
|
-
* the browser knows — so a table of 249 names per language would be a large file
|
|
9
|
-
* that is out of date the day a country is renamed (Türkiye, Czechia, Eswatini) and
|
|
10
|
-
* still covers fewer languages than the browser does. What is left to ship is the
|
|
11
|
-
* list of which codes ARE countries, and that is one string.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Every officially assigned ISO 3166-1 alpha-2 code — the 249 countries, territories
|
|
16
|
-
* and areas of the standard, upper-case, in code order.
|
|
17
|
-
*
|
|
18
|
-
* User-assigned codes are deliberately not in it: `XK` (Kosovo) is a widespread
|
|
19
|
-
* convention, not ISO, and whether to offer it is the app's decision. An app that
|
|
20
|
-
* wants it passes its own list to `CountrySelect`'s `countries` — the runtime names
|
|
21
|
-
* `XK` as well.
|
|
22
|
-
*/
|
|
23
|
-
export const COUNTRY_CODES: readonly string[] = Object.freeze(
|
|
24
|
-
(
|
|
25
|
-
"AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ " +
|
|
26
|
-
"BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM " +
|
|
27
|
-
"DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS " +
|
|
28
|
-
"GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN " +
|
|
29
|
-
"KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ " +
|
|
30
|
-
"MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM " +
|
|
31
|
-
"PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV " +
|
|
32
|
-
"SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI " +
|
|
33
|
-
"VN VU WF WS YE YT ZA ZM ZW"
|
|
34
|
-
).split(" "),
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
/** Two ASCII letters — the shape of an alpha-2 code, whatever the case. */
|
|
38
|
-
const ALPHA_2 = /^[A-Za-z]{2}$/;
|
|
39
|
-
|
|
40
|
-
/** `code` upper-cased when it has the shape of an alpha-2 code, else `undefined`. Does
|
|
41
|
-
* not check that ISO assigned it — see {@link COUNTRY_CODES} for why `XK` must pass. */
|
|
42
|
-
export function normalizeCountryCode(code: string | null | undefined): string | undefined {
|
|
43
|
-
return code && ALPHA_2.test(code) ? code.toUpperCase() : undefined;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// One `DisplayNames` per locale, built on first use. `null` records a locale the
|
|
47
|
-
// runtime refused (a malformed tag) or a runtime without the API, so neither is
|
|
48
|
-
// retried for every row of a 249-row list.
|
|
49
|
-
const namers = new Map<string, Intl.DisplayNames | null>();
|
|
50
|
-
|
|
51
|
-
function namer(locale: string): Intl.DisplayNames | null {
|
|
52
|
-
let n = namers.get(locale);
|
|
53
|
-
if (n === undefined) {
|
|
54
|
-
try {
|
|
55
|
-
n = new Intl.DisplayNames([locale], { type: "region", fallback: "code" });
|
|
56
|
-
} catch {
|
|
57
|
-
n = null;
|
|
58
|
-
}
|
|
59
|
-
namers.set(locale, n);
|
|
60
|
-
}
|
|
61
|
-
return n;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* The name of the country `code` stands for, in `locale` — `countryName("CH", "de-CH")`
|
|
66
|
-
* is "Schweiz". Falls back to the upper-cased code itself when the runtime has no name
|
|
67
|
-
* for it, rejects the locale, or has no `Intl.DisplayNames`: a code is still the right
|
|
68
|
-
* answer, where an empty cell would not be.
|
|
69
|
-
*
|
|
70
|
-
* `locale` defaults to English rather than to the runtime's language, the rule the
|
|
71
|
-
* kit's currency names follow (`currencyName`): an app that never set a locale reads
|
|
72
|
-
* the kit's English everywhere else, and a country list in the browser's language
|
|
73
|
-
* beside English labels — or in the test runner's — is two languages on one form.
|
|
74
|
-
*
|
|
75
|
-
* The code is upper-cased first. `DisplayNames` is case-sensitive about it in some
|
|
76
|
-
* runtimes (Node answers "ch" with "ch"), and the codes reach this from forms,
|
|
77
|
-
* URLs and databases in either case.
|
|
78
|
-
*/
|
|
79
|
-
export function countryName(code: string, locale: string = "en"): string {
|
|
80
|
-
const upper = code.toUpperCase();
|
|
81
|
-
const n = namer(locale);
|
|
82
|
-
if (n) {
|
|
83
|
-
try {
|
|
84
|
-
const name = n.of(upper);
|
|
85
|
-
if (name) return name;
|
|
86
|
-
} catch {
|
|
87
|
-
// Not a well-formed region subtag ("C1", "") — the code is all there is.
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return upper;
|
|
91
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A component's `data-*` props, for its root element (0.50, keksdose): `data-tour`,
|
|
3
|
-
* `data-testid` and the like reach the DOM even when the props are not spread there
|
|
4
|
-
* whole. TypeScript does not check hyphenated JSX attributes, so without this a
|
|
5
|
-
* `data-tour` on such a component vanished without an error.
|
|
6
|
-
*/
|
|
7
|
-
export type DataAttributes = { [attribute: `data-${string}`]: string | number | boolean | undefined };
|
|
8
|
-
|
|
9
|
-
/** Only the `data-*` entries of `props`. */
|
|
10
|
-
export function dataAttributes(props: object): DataAttributes {
|
|
11
|
-
const out: DataAttributes = {};
|
|
12
|
-
for (const [k, v] of Object.entries(props)) if (k.startsWith("data-")) out[k as `data-${string}`] = v;
|
|
13
|
-
return out;
|
|
14
|
-
}
|
package/src/lib/date-format.ts
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { formatLocaleOf } from "../i18n/languages";
|
|
2
|
-
import type { KitDateFormatter } from "../i18n/kit-labels";
|
|
3
|
-
import { pad, toLocalIso } from "./dates";
|
|
4
|
-
import { dateFormatter } from "./intl-cache";
|
|
5
|
-
import { isBareIsoDay } from "./iso-day";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The date-format preference (0.46, lifted from keksdose's `date-format-store.ts`,
|
|
9
|
-
* feedback #180): how a DAY is written — the order of day, month and year and the
|
|
10
|
-
* separator between them — as a choice of its own, apart from the interface language.
|
|
11
|
-
* "Read the app in English and still see German dates", or ISO everywhere.
|
|
12
|
-
*
|
|
13
|
-
* keksdose's rules, which the kit keeps:
|
|
14
|
-
*
|
|
15
|
-
* 1. **A label that identifies a day follows the preference** — anything that prints
|
|
16
|
-
* day, month and year goes through {@link formatDateWithPreference} (or the
|
|
17
|
-
* provider's `formatDate`, {@link dateFormatterFor}, for the kit's own date fields).
|
|
18
|
-
* 2. **A label without a day follows the language**: "August 2026", a month or weekday
|
|
19
|
-
* NAME has no order to arrange. {@link dateFormatterFor} answers `""` for a month or a
|
|
20
|
-
* year, so the kit keeps its own rendering in the language.
|
|
21
|
-
* 3. **A clock time follows the language**: `sv-SE` is a statement about digit order in
|
|
22
|
-
* a date, not about a 12- or 24-hour clock.
|
|
23
|
-
* 4. **A weekday's NAME follows the language** (dev#546): `sv-SE` means "year first,
|
|
24
|
-
* with dashes", not "the reader speaks Swedish" — so with `weekday` the day's name is
|
|
25
|
-
* the language's, joined to the date the preference renders.
|
|
26
|
-
*
|
|
27
|
-
* The preference is the APP's to keep — keksdose holds it per device (a persisted store,
|
|
28
|
-
* not an account column: nothing server-written formats a date for the reader). The kit
|
|
29
|
-
* owns the vocabulary, the resolver, the renderer and the settings field
|
|
30
|
-
* ({@link DateFormatSetting}).
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
/** `"auto"` follows the interface language (the default — nobody's dates move until
|
|
34
|
-
* they ask); the rest are BCP 47 tags chosen for the SHAPE they produce: German
|
|
35
|
-
* 01.08.2026, British 01/08/2026, US 08/01/2026, ISO 2026-08-01. */
|
|
36
|
-
export type DateFormatPreference = "auto" | "de-DE" | "en-GB" | "en-US" | "sv-SE";
|
|
37
|
-
|
|
38
|
-
/** The options in the order the setting lists them: `auto` first (the default), then
|
|
39
|
-
* German → UK → US → ISO. */
|
|
40
|
-
export const DATE_FORMAT_PREFERENCES: readonly DateFormatPreference[] = ["auto", "de-DE", "en-GB", "en-US", "sv-SE"];
|
|
41
|
-
|
|
42
|
-
/** Whether `value` is one of {@link DATE_FORMAT_PREFERENCES} — for a value read back from
|
|
43
|
-
* storage, where anything else falls back to `"auto"`. */
|
|
44
|
-
export function isDateFormatPreference(value: unknown): value is DateFormatPreference {
|
|
45
|
-
return typeof value === "string" && (DATE_FORMAT_PREFERENCES as readonly string[]).includes(value);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** A resolved preference: the locale and `Intl` options the date itself is rendered
|
|
49
|
-
* with, and — only when asked for — the locale the weekday's NAME comes from. */
|
|
50
|
-
export interface ResolvedDateFormat {
|
|
51
|
-
locale: string | undefined;
|
|
52
|
-
options: Intl.DateTimeFormatOptions;
|
|
53
|
-
/** The language's format locale, present when `weekday` was asked for. */
|
|
54
|
-
weekday?: { locale: string | undefined };
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** What {@link resolveDateFormat} and the renderers take beyond the preference. */
|
|
58
|
-
export interface DateFormatOptions {
|
|
59
|
-
/** Name the day of the week too, in the interface language ("Mo., 01.08.2026"). A date
|
|
60
|
-
* in a COLUMN carries it; a date in a SENTENCE does not (keksdose dev#546). */
|
|
61
|
-
weekday?: boolean;
|
|
62
|
-
/**
|
|
63
|
-
* 0.52: the IANA zone a TIMESTAMP's day and clock are read in ("Europe/Zurich") — pass
|
|
64
|
-
* the `<UiKitProvider timeZone>` (`useKitTimeZone()`), so an app's own column says what
|
|
65
|
-
* the kit's components say for the same instant. Left out: the device's. A bare
|
|
66
|
-
* "YYYY-MM-DD" ignores it: a calendar day is the day it names in every zone. A zone
|
|
67
|
-
* `Intl` refuses reads as the device's. The renderers read it; {@link resolveDateFormat}
|
|
68
|
-
* does not.
|
|
69
|
-
*/
|
|
70
|
-
timeZone?: string;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* What a date is rendered with, given the preference and the interface language
|
|
75
|
-
* (`language`: a code or tag — `"de"`, `"en"`, i18next's `resolvedLanguage`; it is read
|
|
76
|
-
* through `formatLocaleOf`, so English is British and an unshipped tag stays itself).
|
|
77
|
-
*
|
|
78
|
-
* `"auto"` keeps the short-month shape ("01 Aug 2026", "01. Aug. 2026"); every explicit
|
|
79
|
-
* choice is all-numeric, the only way it produces the shape its option promises —
|
|
80
|
-
* `month: "short"` under `sv-SE` would print "2026 aug. 01", not ISO.
|
|
81
|
-
*/
|
|
82
|
-
export function resolveDateFormat(
|
|
83
|
-
preference: DateFormatPreference,
|
|
84
|
-
language: string | undefined,
|
|
85
|
-
options: DateFormatOptions = {},
|
|
86
|
-
): ResolvedDateFormat {
|
|
87
|
-
const languageLocale = language ? formatLocaleOf(language) : undefined;
|
|
88
|
-
const weekday = options.weekday ? { weekday: { locale: languageLocale } } : {};
|
|
89
|
-
if (preference === "auto") {
|
|
90
|
-
return { locale: languageLocale, options: { year: "numeric", month: "short", day: "2-digit" }, ...weekday };
|
|
91
|
-
}
|
|
92
|
-
return { locale: preference, options: { year: "numeric", month: "2-digit", day: "2-digit" }, ...weekday };
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* `dateText`, already rendered under the preference, with the day's NAME around it in
|
|
97
|
-
* `locale` (the language's). Not "weekday alone + comma": German says "So" alone and
|
|
98
|
-
* "So., 06.09.2026" in company. The full date is formatted in the language and split
|
|
99
|
-
* into parts; what that language puts before the first and after the last day/month/
|
|
100
|
-
* year part (the weekday, its comma) frames the preference's digits — so where the two
|
|
101
|
-
* locales coincide the output is the native string, character for character.
|
|
102
|
-
*/
|
|
103
|
-
function withWeekday(date: Date, dateText: string, locale: string | undefined, options: Intl.DateTimeFormatOptions) {
|
|
104
|
-
const isDatePart = (p: Intl.DateTimeFormatPart) => p.type === "day" || p.type === "month" || p.type === "year";
|
|
105
|
-
const parts = dateFormatter(locale, { weekday: "short", ...options }).formatToParts(date);
|
|
106
|
-
const first = parts.findIndex(isDatePart);
|
|
107
|
-
if (first === -1) return dateText;
|
|
108
|
-
let last = first;
|
|
109
|
-
parts.forEach((p, i) => {
|
|
110
|
-
if (isDatePart(p)) last = i;
|
|
111
|
-
});
|
|
112
|
-
const join = (ps: Intl.DateTimeFormatPart[]) => ps.map((p) => p.value).join("");
|
|
113
|
-
return join(parts.slice(0, first)) + dateText + join(parts.slice(last + 1));
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* A date under the preference: `""` for no value, the input itself when it does not
|
|
118
|
-
* parse. A bare "YYYY-MM-DD" is the calendar day it names in every zone (formatted in
|
|
119
|
-
* UTC, undoing `new Date`'s UTC-midnight parse — west of Greenwich it read a day early);
|
|
120
|
-
* a timestamp is an instant, read in `options.timeZone`, else the reader's zone. The
|
|
121
|
-
* weekday, when asked for, is rendered in the same zone, so a Sunday is never captioned
|
|
122
|
-
* Saturday.
|
|
123
|
-
*/
|
|
124
|
-
export function formatDateWithPreference(
|
|
125
|
-
value: string | Date | null | undefined,
|
|
126
|
-
preference: DateFormatPreference,
|
|
127
|
-
language: string | undefined,
|
|
128
|
-
options: DateFormatOptions = {},
|
|
129
|
-
): string {
|
|
130
|
-
if (!value) return "";
|
|
131
|
-
const resolved = resolveDateFormat(preference, language, options);
|
|
132
|
-
const dateOnly = isBareIsoDay(value);
|
|
133
|
-
const date = typeof value === "string" ? new Date(value) : value;
|
|
134
|
-
if (Number.isNaN(date.getTime())) return String(value);
|
|
135
|
-
const render = (timeZone: string | undefined) => {
|
|
136
|
-
const intl: Intl.DateTimeFormatOptions = timeZone ? { ...resolved.options, timeZone } : resolved.options;
|
|
137
|
-
// Through the shared cache (refactor audit 2026-10-30, DUP-2): a `toLocaleDateString`
|
|
138
|
-
// builds a formatter per call, which is why keksdose kept its own copy of this
|
|
139
|
-
// renderer — 392 ms per click on a 270-row register (dev#632).
|
|
140
|
-
const text = dateFormatter(resolved.locale, intl).format(date);
|
|
141
|
-
return resolved.weekday ? withWeekday(date, text, resolved.weekday.locale, intl) : text;
|
|
142
|
-
};
|
|
143
|
-
if (dateOnly) return firstAccepted([() => render("UTC")], () => value);
|
|
144
|
-
// A zone `Intl` refuses: the reader's own day, as `clockTime` reads the reader's own
|
|
145
|
-
// clock — never the UTC day `toISOString` gave, a day off around midnight (0.52 code
|
|
146
|
-
// review, this file).
|
|
147
|
-
return firstAccepted([() => render(options.timeZone), () => render(undefined)], () => toLocalIso(date));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** The first of `renders` that `Intl` accepts — a language tag or a zone it refuses
|
|
151
|
-
* throws — else `last()`: the ISO day or the clock rather than nothing (keksdose's
|
|
152
|
-
* fallback). */
|
|
153
|
-
function firstAccepted(renders: readonly (() => string)[], last: () => string): string {
|
|
154
|
-
for (const render of renders) {
|
|
155
|
-
try {
|
|
156
|
-
return render();
|
|
157
|
-
} catch {
|
|
158
|
-
// Refused: the next.
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return last();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* The clock time of `date` as the language writes it ("14:05"), two digits each: rule 3,
|
|
166
|
-
* a clock follows the language, never the preference — `sv-SE` is a statement about the
|
|
167
|
-
* order of a date's digits, not about a 12- or 24-hour clock. `language` is read through
|
|
168
|
-
* `formatLocaleOf`, so English is the British 24-hour clock, not "02:05 PM" in a
|
|
169
|
-
* German household's app. In `timeZone` when given, else the reader's.
|
|
170
|
-
*
|
|
171
|
-
* @internal Shared with the kit's own day formatter; not part of the barrel.
|
|
172
|
-
*/
|
|
173
|
-
export function clockTime(date: Date, language: string | undefined, timeZone?: string): string {
|
|
174
|
-
const locale = language ? formatLocaleOf(language) : undefined;
|
|
175
|
-
const clock = (zone: string | undefined) =>
|
|
176
|
-
dateFormatter(locale, { hour: "2-digit", minute: "2-digit", ...(zone ? { timeZone: zone } : null) }).format(date);
|
|
177
|
-
// A zone `Intl` refuses: the reader's own clock, as `isoDayIn` reads the reader's own
|
|
178
|
-
// day — the UTC clock `toISOString` gave printed 13:05 for 14:05 in Zurich, an hour or
|
|
179
|
-
// more off with no error (0.52 code review, this file).
|
|
180
|
-
const reader = () => `${pad(date.getHours())}:${pad(date.getMinutes())}`;
|
|
181
|
-
return firstAccepted([() => clock(timeZone), () => clock(undefined)], reader);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* A timestamp under the preference (0.52, keksdose's `formatDateTimeFor`, refactor audit
|
|
186
|
-
* 2026-10-30, DUP-2): the date as {@link formatDateWithPreference} writes it, weekday
|
|
187
|
-
* when asked for, then the clock time in the LANGUAGE ({@link clockTime}): "01.08.2026,
|
|
188
|
-
* 14:05", "Sa., 01.08.2026, 14:05". keksdose's notification inbox and admin scheduler
|
|
189
|
-
* were where an explicit ISO choice did nothing until it wrote this. `""` for no value,
|
|
190
|
-
* the input itself when it does not parse; a bare "YYYY-MM-DD" names no moment, so it
|
|
191
|
-
* prints as the date alone.
|
|
192
|
-
*
|
|
193
|
-
* Day and clock in `options.timeZone` — pass the provider's (`useKitTimeZone()`): without
|
|
194
|
-
* it they were the device's, and an app on Zurich time read from New York printed 09:05
|
|
195
|
-
* in its own column where the kit's inbox printed 14:05 for the same instant (0.52 code
|
|
196
|
-
* review, this file).
|
|
197
|
-
*/
|
|
198
|
-
export function formatDateTimeWithPreference(
|
|
199
|
-
value: string | Date | null | undefined,
|
|
200
|
-
preference: DateFormatPreference,
|
|
201
|
-
language: string | undefined,
|
|
202
|
-
options: DateFormatOptions = {},
|
|
203
|
-
): string {
|
|
204
|
-
if (!value) return "";
|
|
205
|
-
if (isBareIsoDay(value)) return formatDateWithPreference(value, preference, language, options);
|
|
206
|
-
const date = typeof value === "string" ? new Date(value) : value;
|
|
207
|
-
if (Number.isNaN(date.getTime())) return String(value);
|
|
208
|
-
return `${formatDateWithPreference(date, preference, language, options)}, ${clockTime(date, language, options.timeZone)}`;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/** The sample an option is labelled with — 1 August 2026 in its shape, the shape being
|
|
212
|
-
* the whole choice (a country name would say nothing about the digit order). */
|
|
213
|
-
export function dateFormatSample(preference: DateFormatPreference, language: string | undefined): string {
|
|
214
|
-
return formatDateWithPreference("2026-08-01", preference, language);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* The `<UiKitProvider formatDate>` for a preference — so the kit's own date fields
|
|
219
|
-
* (DatePicker, DateRangePicker, DateMark) write a day as the app's dates do. A day
|
|
220
|
-
* follows the preference, with the weekday where the kit suggests it; a month or a year
|
|
221
|
-
* answers `""` and keeps the kit's rendering in the language (rule 2). Rebuild it when
|
|
222
|
-
* the preference or the language changes (a `useMemo` on both).
|
|
223
|
-
*/
|
|
224
|
-
export function dateFormatterFor(preference: DateFormatPreference, language: string | undefined): KitDateFormatter {
|
|
225
|
-
return (iso, { unit, weekday, locale }) =>
|
|
226
|
-
unit === "day" ? formatDateWithPreference(iso, preference, locale ?? language, { weekday }) : "";
|
|
227
|
-
}
|
package/src/lib/dates.ts
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ISO date helpers, collected from copies that were scattered across the pages.
|
|
3
|
-
*
|
|
4
|
-
* **Every "what day is it" helper here reads the LOCAL calendar** — one family, not
|
|
5
|
-
* two. It used to be two: these all built a local Date and then read it back through
|
|
6
|
-
* `toISOString()`, which is UTC, so east of Greenwich they all returned YESTERDAY
|
|
7
|
-
* between local midnight and the UTC rollover. The old module note called that
|
|
8
|
-
* deliberate and warned against changing it. It was not defensible, and dev#471 is
|
|
9
|
-
* what it cost:
|
|
10
|
-
*
|
|
11
|
-
* > *"Just entered a tx now from scheduled. But it still shows as upcoming. Is there
|
|
12
|
-
* > a problem with timezones? It is currently 1 o clock middle european summer time."*
|
|
13
|
-
*
|
|
14
|
-
* There was: at 01:00 CEST `todayIso()` answered with the 14th, the row the scheduler
|
|
15
|
-
* had just booked was dated the 15th, and `isUpcoming` compares the two strings — so a
|
|
16
|
-
* transaction entered a second ago read as one still to come. The same slip moved
|
|
17
|
-
* `startOfMonthIso()` onto the last day of the PREVIOUS month for an hour every first
|
|
18
|
-
* of the month, which is a report range nobody would have questioned.
|
|
19
|
-
*
|
|
20
|
-
* A calendar day only means anything to the human reading it, and every caller here —
|
|
21
|
-
* the register's today, the date-range presets, the budget cursor, a new
|
|
22
|
-
* transaction's default date — is asking that question. There is no caller for whom
|
|
23
|
-
* "the UTC day" is the right answer; the server compares plain dates with no zone at
|
|
24
|
-
* all, so sending it the user's local day is also what it wants.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
/** Zero-pad a number to two digits ("3" -> "03"). */
|
|
28
|
-
export function pad(n: number): string {
|
|
29
|
-
return String(n).padStart(2, "0");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Today as "YYYY-MM-DD" on the LOCAL calendar (see the module note). */
|
|
33
|
-
export function todayIso(): string {
|
|
34
|
-
return toLocalIso(new Date());
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** A Date as a local-time "YYYY-MM-DD" string. */
|
|
38
|
-
export function toLocalIso(d: Date): string {
|
|
39
|
-
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** A Date as a local-time "YYYY-MM" month key. */
|
|
43
|
-
export function monthKey(d: Date): string {
|
|
44
|
-
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}`;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// ---------- Date-range presets + calendar helpers ----------
|
|
48
|
-
// Local-calendar like todayIso (see the module note); used by the data-table date
|
|
49
|
-
// filter and its MiniCalendar. Each one mutates a local Date and must therefore READ
|
|
50
|
-
// it back locally — going out through toISOString() is what shifted every one of
|
|
51
|
-
// these by a day near midnight (dev#471).
|
|
52
|
-
|
|
53
|
-
/** Today shifted by `days`, as "YYYY-MM-DD". */
|
|
54
|
-
export function shiftIso(days: number): string {
|
|
55
|
-
const d = new Date();
|
|
56
|
-
d.setDate(d.getDate() + days);
|
|
57
|
-
return toLocalIso(d);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** First day (Monday) of the current week, as "YYYY-MM-DD". */
|
|
61
|
-
export function startOfWeekIso(): string {
|
|
62
|
-
const d = new Date();
|
|
63
|
-
const day = d.getDay();
|
|
64
|
-
const diff = (day + 6) % 7; // monday = 0
|
|
65
|
-
d.setDate(d.getDate() - diff);
|
|
66
|
-
return toLocalIso(d);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** First day of the month `offsetMonths` from now, as "YYYY-MM-DD". */
|
|
70
|
-
export function startOfMonthIso(offsetMonths = 0): string {
|
|
71
|
-
const d = new Date();
|
|
72
|
-
d.setDate(1);
|
|
73
|
-
d.setMonth(d.getMonth() + offsetMonths);
|
|
74
|
-
return toLocalIso(d);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Last day of the month `offsetMonths` from now, as "YYYY-MM-DD". */
|
|
78
|
-
export function endOfMonthIso(offsetMonths = 0): string {
|
|
79
|
-
const d = new Date();
|
|
80
|
-
d.setDate(1);
|
|
81
|
-
d.setMonth(d.getMonth() + offsetMonths + 1);
|
|
82
|
-
d.setDate(0);
|
|
83
|
-
return toLocalIso(d);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** First day of the year `offsetYears` from now, as "YYYY-MM-DD". */
|
|
87
|
-
export function startOfYearIso(offsetYears = 0): string {
|
|
88
|
-
const d = new Date();
|
|
89
|
-
d.setMonth(0);
|
|
90
|
-
d.setDate(1);
|
|
91
|
-
d.setFullYear(d.getFullYear() + offsetYears);
|
|
92
|
-
return toLocalIso(d);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/** Last day of the year `offsetYears` from now, as "YYYY-MM-DD". */
|
|
96
|
-
export function endOfYearIso(offsetYears = 0): string {
|
|
97
|
-
const d = new Date();
|
|
98
|
-
d.setMonth(11);
|
|
99
|
-
d.setDate(31);
|
|
100
|
-
d.setFullYear(d.getFullYear() + offsetYears);
|
|
101
|
-
return toLocalIso(d);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** Parse a "YYYY-MM-DD" string to a local-midnight Date, or null if malformed —
|
|
105
|
-
* where "malformed" includes a date that does not exist.
|
|
106
|
-
*
|
|
107
|
-
* The falsy check alone was not enough. `new Date(y, m - 1, d)` ROLLS OVER out-of-range
|
|
108
|
-
* components rather than refusing them, so "2026-13-45" came back as 2027-02-14 and
|
|
109
|
-
* "2026-02-30" as 2026-03-02: a valid-looking Date for a day that never happened. No
|
|
110
|
-
* caller could tell — {@link formatIsoDate} blanks only on `null`, so the invented
|
|
111
|
-
* date formatted and displayed exactly like a real one.
|
|
112
|
-
*
|
|
113
|
-
* The round-trip is the check: build the Date, then read the components back off it.
|
|
114
|
-
* A value that rolled over cannot answer with the numbers it was given. That is the
|
|
115
|
-
* same shape {@link sameYmd} already expresses, applied to a Date and its source. */
|
|
116
|
-
export function parseIsoDate(s: string): Date | null {
|
|
117
|
-
if (!s) return null;
|
|
118
|
-
const [y, m, d] = s.split("-").map(Number);
|
|
119
|
-
if (!y || !m || !d) return null;
|
|
120
|
-
if (!Number.isInteger(y) || !Number.isInteger(m) || !Number.isInteger(d)) return null;
|
|
121
|
-
const dt = new Date(y, m - 1, d);
|
|
122
|
-
if (Number.isNaN(dt.getTime())) return null;
|
|
123
|
-
if (dt.getFullYear() !== y || dt.getMonth() !== m - 1 || dt.getDate() !== d) return null;
|
|
124
|
-
return dt;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** Format a "YYYY-MM-DD" string for display in `locale` (empty string when
|
|
128
|
-
* unparseable). Defaults to the locale's short numeric date; pass `options` to
|
|
129
|
-
* override (e.g. `{ dateStyle: "medium" }`). `locale` may be `undefined` since 0.34 —
|
|
130
|
-
* the runtime's default, as `Intl` reads it and as every other kit formatter takes it
|
|
131
|
-
* (DUP-11: DatePicker re-wrapped this function only to pass none). */
|
|
132
|
-
export function formatIsoDate(iso: string, locale: string | undefined, options?: Intl.DateTimeFormatOptions): string {
|
|
133
|
-
const d = parseIsoDate(iso);
|
|
134
|
-
return d ? d.toLocaleDateString(locale, options) : "";
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/** A "YYYY-MM-DD" string shifted by `days` (negative shifts back), or the input
|
|
138
|
-
* unchanged when it isn't a parseable date.
|
|
139
|
-
*
|
|
140
|
-
* Local-time throughout — {@link parseIsoDate} builds a local-midnight Date and
|
|
141
|
-
* {@link toLocalIso} reads local components back, so this never slides a day the way
|
|
142
|
-
* a `toISOString()` round-trip does west of UTC. */
|
|
143
|
-
export function addDaysIso(iso: string, days: number): string {
|
|
144
|
-
const d = parseIsoDate(iso);
|
|
145
|
-
if (!d) return iso;
|
|
146
|
-
d.setDate(d.getDate() + days);
|
|
147
|
-
return toLocalIso(d);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* `d` moved by whole months, keeping the day of the month where the target has one.
|
|
152
|
-
* `setMonth` alone ROLLS OVER — 31 January + 1 month is 3 March — which would skip
|
|
153
|
-
* February entirely for anyone paging through the year with PageDown. Returns a new
|
|
154
|
-
* Date; `d` is not touched.
|
|
155
|
-
*/
|
|
156
|
-
export function addMonthsClamped(d: Date, months: number): Date {
|
|
157
|
-
const day = d.getDate();
|
|
158
|
-
const out = new Date(d.getFullYear(), d.getMonth() + months, 1);
|
|
159
|
-
const lastOfTarget = new Date(out.getFullYear(), out.getMonth() + 1, 0).getDate();
|
|
160
|
-
out.setDate(Math.min(day, lastOfTarget));
|
|
161
|
-
return out;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* The first day of the week in `locale`, as a `Date#getDay` index (0 = Sunday).
|
|
166
|
-
*
|
|
167
|
-
* `Intl.Locale#getWeekInfo()` is the standard spelling; V8 shipped it first as the
|
|
168
|
-
* `weekInfo` accessor, and Firefox has neither yet — hence both reads and a Monday
|
|
169
|
-
* fallback, which is ISO 8601. Its `firstDay` counts 1 = Monday … 7 = Sunday, so `% 7`
|
|
170
|
-
* maps it onto `getDay`. `undefined` asks for the runtime's default locale.
|
|
171
|
-
*/
|
|
172
|
-
export function localeWeekStart(locale: string | undefined): 0 | 1 | 2 | 3 | 4 | 5 | 6 {
|
|
173
|
-
try {
|
|
174
|
-
const tag = locale ?? new Intl.DateTimeFormat().resolvedOptions().locale;
|
|
175
|
-
const loc = new Intl.Locale(tag) as Intl.Locale & {
|
|
176
|
-
getWeekInfo?: () => { firstDay: number };
|
|
177
|
-
weekInfo?: { firstDay: number };
|
|
178
|
-
};
|
|
179
|
-
const firstDay = (loc.getWeekInfo?.() ?? loc.weekInfo)?.firstDay;
|
|
180
|
-
if (typeof firstDay === "number") return (firstDay % 7) as 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
181
|
-
} catch {
|
|
182
|
-
// A malformed tag throws from `Intl.Locale`; a calendar still has to render.
|
|
183
|
-
}
|
|
184
|
-
return 1;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/** Whether two Dates fall on the same local calendar day. */
|
|
188
|
-
export function sameYmd(a: Date, b: Date): boolean {
|
|
189
|
-
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export interface DateRangePreset {
|
|
193
|
-
key: string;
|
|
194
|
-
from: string;
|
|
195
|
-
to: string;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* The named ranges offered by the data-table date filter (local-calendar, like
|
|
200
|
-
* {@link todayIso} — see the module note). `key` maps to the consumer's
|
|
201
|
-
* `table.preset_*` labels.
|
|
202
|
-
*/
|
|
203
|
-
export function dateRangePresets(): DateRangePreset[] {
|
|
204
|
-
const mondayOffset = (new Date().getDay() + 6) % 7; // monday = 0
|
|
205
|
-
return [
|
|
206
|
-
{ key: "today", from: todayIso(), to: todayIso() },
|
|
207
|
-
{ key: "yesterday", from: shiftIso(-1), to: shiftIso(-1) },
|
|
208
|
-
{ key: "this_week", from: startOfWeekIso(), to: todayIso() },
|
|
209
|
-
{ key: "last_week", from: shiftIso(-7 - mondayOffset), to: shiftIso(-1 - mondayOffset) },
|
|
210
|
-
{ key: "last_7_days", from: shiftIso(-6), to: todayIso() },
|
|
211
|
-
{ key: "last_30_days", from: shiftIso(-29), to: todayIso() },
|
|
212
|
-
{ key: "this_month", from: startOfMonthIso(0), to: todayIso() },
|
|
213
|
-
{ key: "last_month", from: startOfMonthIso(-1), to: endOfMonthIso(-1) },
|
|
214
|
-
{ key: "last_3_months", from: shiftIso(-90), to: todayIso() },
|
|
215
|
-
{ key: "ytd", from: startOfYearIso(0), to: todayIso() },
|
|
216
|
-
{ key: "last_year", from: startOfYearIso(-1), to: endOfYearIso(-1) },
|
|
217
|
-
];
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/** The last `n` WHOLE calendar months before the current one, as an inclusive
|
|
221
|
-
* `{ from, to }` — on 15 May, `n = 3` is 1 February … 30 April. Local-calendar, like
|
|
222
|
-
* everything here; `now` is for tests and for a host with its own clock. */
|
|
223
|
-
export function lastFullMonthsRange(n: number, now: Date = new Date()): { from: string; to: string } {
|
|
224
|
-
const from = new Date(now.getFullYear(), now.getMonth() - n, 1);
|
|
225
|
-
// Day 0 of the current month is the last day of the previous one.
|
|
226
|
-
const to = new Date(now.getFullYear(), now.getMonth(), 0);
|
|
227
|
-
return { from: toLocalIso(from), to: toLocalIso(to) };
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/** The last `n` WHOLE calendar years before the current one — in 2026, `n = 2` is
|
|
231
|
-
* 1 January 2024 … 31 December 2025. */
|
|
232
|
-
export function lastFullYearsRange(n: number, now: Date = new Date()): { from: string; to: string } {
|
|
233
|
-
const year = now.getFullYear();
|
|
234
|
-
return { from: `${year - n}-01-01`, to: `${year - 1}-12-31` };
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
export interface CalendarMonthPresetOptions {
|
|
238
|
-
/** How many whole months each month preset spans. Default `[3, 6]`. */
|
|
239
|
-
months?: readonly number[];
|
|
240
|
-
/** How many whole years each year preset spans. Default `[2]`. */
|
|
241
|
-
years?: readonly number[];
|
|
242
|
-
/** The day to count back from. Default: now, on the local calendar. */
|
|
243
|
-
now?: Date;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Month-ALIGNED presets, beside the rolling-day ones of {@link dateRangePresets}.
|
|
248
|
-
*
|
|
249
|
-
* kastlan's accounting reports are closed by the month: "the last three months" there
|
|
250
|
-
* means February, March and April, never "the 90 days up to this morning", which
|
|
251
|
-
* starts mid-month and ends with a day that is still being booked. `last_3_months`
|
|
252
|
-
* above is the rolling kind and stays that way for the data table's filter, so these
|
|
253
|
-
* are separate keys rather than a changed meaning under an old one.
|
|
254
|
-
*
|
|
255
|
-
* Keys are `last_<n>_full_months` and `last_<n>_full_years`; the host labels them (the
|
|
256
|
-
* same arrangement as `dateRangePresets`' keys and its `table.preset_*` strings). With
|
|
257
|
-
* `DateRangePicker`, pass the key as the preset's `id` so the choice keeps its
|
|
258
|
-
* identity while the dates are recomputed on every render.
|
|
259
|
-
*/
|
|
260
|
-
export function calendarMonthPresets(options: CalendarMonthPresetOptions = {}): DateRangePreset[] {
|
|
261
|
-
const { months = [3, 6], years = [2], now = new Date() } = options;
|
|
262
|
-
return [
|
|
263
|
-
...months.map((n) => ({ key: `last_${n}_full_months`, ...lastFullMonthsRange(n, now) })),
|
|
264
|
-
...years.map((n) => ({ key: `last_${n}_full_years`, ...lastFullYearsRange(n, now) })),
|
|
265
|
-
];
|
|
266
|
-
}
|