@eifi1/ui-kit 0.51.7 → 0.53.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 +178 -67
- package/dist/account/account-parts.d.ts +10 -8
- package/dist/account/account-parts.js +1 -18
- package/dist/account/account-parts.js.map +1 -1
- package/dist/account/data-export-setting-labels.js +1 -1
- package/dist/account/data-export-setting-labels.js.map +1 -1
- package/dist/account/delete-account-setting-labels.js +1 -1
- package/dist/account/delete-account-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting-labels.js +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/passkeys-setting.d.ts +9 -2
- package/dist/account/passkeys-setting.js +41 -29
- package/dist/account/passkeys-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +3 -2
- package/dist/account/sessions-setting.js +10 -8
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.js +1 -3
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/admin-parts.d.ts +6 -3
- package/dist/admin/admin-parts.js +6 -21
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/mail-test-card-labels.js +1 -1
- package/dist/admin/mail-test-card-labels.js.map +1 -1
- package/dist/admin/plan-change-labels.d.ts +2 -2
- package/dist/admin/plan-change-labels.js +1 -17
- package/dist/admin/plan-change-labels.js.map +1 -1
- package/dist/admin/plan-change.d.ts +3 -42
- package/dist/admin/plan-change.js +1 -1
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +3 -3
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/auth/auth-errors-labels.d.ts +11 -0
- package/dist/auth/auth-errors-labels.js +13 -0
- package/dist/auth/auth-errors-labels.js.map +1 -0
- package/dist/auth/auth-errors.d.ts +7 -23
- package/dist/auth/auth-errors.js +2 -15
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.js +2 -1
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/forgot-password-form-labels.js +1 -1
- package/dist/auth/forgot-password-form-labels.js.map +1 -1
- package/dist/auth/forgot-password-form.js +7 -2
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form-labels.js +1 -1
- package/dist/auth/register-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form-labels.js +1 -1
- package/dist/auth/reset-password-form-labels.js.map +1 -1
- package/dist/auth/reset-password-form.js +5 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form-labels.js +1 -1
- package/dist/auth/sign-in-form-labels.js.map +1 -1
- package/dist/auth/status-parts.d.ts +0 -3
- package/dist/auth/status-parts.js +0 -4
- package/dist/auth/status-parts.js.map +1 -1
- package/dist/auth/verify-email-labels.js +1 -1
- package/dist/auth/verify-email-labels.js.map +1 -1
- package/dist/auth/verify-email.js +7 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/cancel-subscription.d.ts +10 -7
- package/dist/billing/cancel-subscription.js +6 -6
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/plan-card.d.ts +5 -3
- package/dist/billing/plan-card.js +7 -8
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-change-labels.d.ts +42 -0
- package/dist/billing/plan-change-labels.js +22 -0
- package/dist/billing/plan-change-labels.js.map +1 -0
- package/dist/billing/plan-switch.d.ts +9 -6
- package/dist/billing/plan-switch.js +7 -5
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +4 -3
- package/dist/chart.js +72 -4
- package/dist/chart.js.map +1 -1
- package/dist/components/account-chips.d.ts +5 -5
- package/dist/components/account-chips.js +11 -13
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.d.ts +16 -5
- package/dist/components/alert-banner.js +46 -1
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +13 -0
- package/dist/components/amount-input.js +1 -0
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +57 -65
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.d.ts +12 -2
- package/dist/components/bulk-action-bar.js +65 -21
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-look.d.ts +5 -5
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/chart-edge.d.ts +16 -0
- package/dist/components/chart-edge.js +14 -1
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-figure.d.ts +13 -0
- package/dist/components/chart-figure.js +15 -0
- package/dist/components/chart-figure.js.map +1 -0
- package/dist/components/chart-zoom-core.js +1 -4
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +8 -1
- package/dist/components/chart.js +19 -10
- package/dist/components/chart.js.map +1 -1
- package/dist/components/combobox-core.d.ts +111 -2
- package/dist/components/combobox-core.js +148 -42
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +141 -130
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/copy-button.d.ts +6 -5
- package/dist/components/copy-button.js +5 -3
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.js +2 -2
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +1 -1
- package/dist/components/data-table-column-settings.js +33 -7
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +4 -2
- package/dist/components/data-table-filters.js +2 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +6 -4
- package/dist/components/data-table-fit.js +4 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.d.ts +1 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.d.ts +1 -1
- package/dist/components/data-table-head.js +15 -12
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.d.ts +12 -7
- package/dist/components/data-table-mobile.js +43 -30
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js +11 -6
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-resize.d.ts +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +2 -2
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.d.ts +6 -2
- package/dist/components/data-table-row.js +17 -10
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-selection.d.ts +1 -1
- package/dist/components/data-table-selection.js.map +1 -1
- package/dist/components/data-table-shared.d.ts +10 -2
- package/dist/components/data-table-shared.js +18 -0
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.d.ts +21 -2
- package/dist/components/data-table-sort.js +24 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.d.ts +1 -1
- package/dist/components/data-table-virtual.js +18 -6
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.d.ts +13 -4
- package/dist/components/data-table.js +139 -36
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-field.d.ts +25 -3
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +16 -3
- package/dist/components/date-picker.js +55 -26
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +38 -24
- package/dist/components/date-range-picker.js +23 -7
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/error-boundary.js +37 -30
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
- package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
- package/dist/components/field-base-labels.js.map +1 -0
- package/dist/components/field-base.d.ts +4 -3
- package/dist/components/field-base.js +3 -3
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/form-actions.js +11 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.d.ts +3 -0
- package/dist/components/hover-menu.js +5 -3
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +14 -9
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.d.ts +43 -0
- package/dist/components/inline-confirm.js +67 -0
- package/dist/components/inline-confirm.js.map +1 -0
- package/dist/components/inline-entity-combobox.d.ts +4 -3
- package/dist/components/inline-entity-combobox.js +148 -140
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +28 -112
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-page.d.ts +3 -1
- package/dist/components/legal-page.js +3 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +4 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.d.ts +2 -2
- package/dist/components/lightbox.js +17 -6
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/list.d.ts +6 -2
- package/dist/components/list.js +3 -2
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.d.ts +1 -1
- package/dist/components/measured-grid.js +2 -1
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/mini-calendar.js +3 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.js +3 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-grid.d.ts +55 -0
- package/dist/components/month-grid.js +148 -0
- package/dist/components/month-grid.js.map +1 -0
- package/dist/components/month-picker.d.ts +36 -4
- package/dist/components/month-picker.js +123 -146
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-select.d.ts +2 -2
- package/dist/components/multi-select.js +11 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/nav-pills.d.ts +1 -1
- package/dist/components/nav-pills.js.map +1 -1
- package/dist/components/picker-sheet.js +2 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart-labels.d.ts +7 -0
- package/dist/components/pie-chart-labels.js +1 -0
- package/dist/components/pie-chart-labels.js.map +1 -1
- package/dist/components/pie-chart.d.ts +5 -3
- package/dist/components/pie-chart.js +7 -22
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.d.ts +3 -0
- package/dist/components/popover.js +7 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/row-actions.js +2 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +4 -4
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +7 -4
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +92 -23
- package/dist/components/series-chart.js +74 -30
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/share-card.js +3 -3
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/tabs-labels.d.ts +2 -0
- package/dist/components/tabs-labels.js +11 -0
- package/dist/components/tabs-labels.js.map +1 -0
- package/dist/components/tabs.d.ts +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +2 -2
- package/dist/components/toggle-legend.js +6 -6
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -2
- package/dist/components/translation-review-editor.js +2 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review.d.ts +2 -1
- package/dist/components/translation-review.js +2 -2
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +31 -0
- package/dist/components/treemap-labels.js +10 -0
- package/dist/components/treemap-labels.js.map +1 -0
- package/dist/components/treemap-layout.d.ts +62 -0
- package/dist/components/treemap-layout.js +126 -0
- package/dist/components/treemap-layout.js.map +1 -0
- package/dist/components/treemap.d.ts +167 -19
- package/dist/components/treemap.js +340 -100
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/use-table-state.d.ts +5 -5
- package/dist/components/use-table-state.js +4 -1
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +1 -2
- package/dist/data-table.js +1 -4
- package/dist/data-table.js.map +1 -1
- package/dist/demo/demo-countdown.d.ts +0 -5
- package/dist/demo/demo-countdown.js +0 -4
- package/dist/demo/demo-countdown.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +36 -7
- package/dist/eslint/role-utilities.js +42 -9
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +25 -16
- package/dist/feedback/feedback-dialog.js +6 -2
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-mutation.d.ts +18 -0
- package/dist/feedback/feedback-mutation.js +8 -0
- package/dist/feedback/feedback-mutation.js.map +1 -0
- package/dist/feedback/feedback-page-link.d.ts +53 -0
- package/dist/feedback/feedback-page-link.js +37 -0
- package/dist/feedback/feedback-page-link.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +8 -4
- package/dist/feedback/feedback-public-list.js +2 -2
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-replies.d.ts +3 -1
- package/dist/feedback/feedback-replies.js +5 -4
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +0 -3
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +33 -44
- package/dist/feedback/feedback-row-detail.js +28 -34
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +17 -14
- package/dist/feedback/feedback-status-undo.js +10 -15
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
- package/dist/feedback/feedback-submit-dialog.js +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.js +9 -3
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +21 -9
- package/dist/feedback/feedback-table.js +45 -25
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread-labels.d.ts +2 -2
- package/dist/feedback/feedback-thread-labels.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +15 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +6 -6
- package/dist/feedback.js +90 -6
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +35 -0
- package/dist/hooks/use-focus-trap.js +6 -4
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +5 -2
- package/dist/hooks/use-hotkey.js +5 -4
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-long-press.d.ts +7 -4
- package/dist/hooks/use-long-press.js +3 -0
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-media-query.js +12 -4
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-mounted.d.ts +22 -0
- package/dist/hooks/use-mounted.js +24 -0
- package/dist/hooks/use-mounted.js.map +1 -0
- package/dist/hooks/use-overlay-history.js +19 -3
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +4 -9
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -18
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -11
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +15 -64
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -18
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -27
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -18
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -19
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -18
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +12 -2
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js +0 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +21 -23
- package/dist/index.js +50 -65
- package/dist/index.js.map +1 -1
- package/dist/landing/routing.d.ts +3 -1
- package/dist/landing/routing.js +4 -7
- package/dist/landing/routing.js.map +1 -1
- package/dist/lib/broadcast.d.ts +17 -0
- package/dist/lib/broadcast.js +30 -0
- package/dist/lib/broadcast.js.map +1 -0
- package/dist/lib/date-format.d.ts +37 -2
- package/dist/lib/date-format.js +34 -8
- package/dist/lib/date-format.js.map +1 -1
- package/dist/lib/day-format.d.ts +46 -0
- package/dist/lib/day-format.js +46 -0
- package/dist/lib/day-format.js.map +1 -0
- package/dist/lib/describe-failure.d.ts +14 -0
- package/dist/lib/describe-failure.js +9 -0
- package/dist/lib/describe-failure.js.map +1 -0
- package/dist/lib/direction.d.ts +16 -0
- package/dist/lib/direction.js +9 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/focus-left.d.ts +63 -0
- package/dist/lib/focus-left.js +67 -0
- package/dist/lib/focus-left.js.map +1 -0
- package/dist/lib/format.js +5 -14
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/http-status.d.ts +24 -0
- package/dist/lib/http-status.js +14 -0
- package/dist/lib/http-status.js.map +1 -0
- package/dist/lib/intl-cache.d.ts +14 -0
- package/dist/lib/intl-cache.js +15 -0
- package/dist/lib/intl-cache.js.map +1 -0
- package/dist/lib/iso-day.d.ts +11 -0
- package/dist/lib/iso-day.js +8 -0
- package/dist/lib/iso-day.js.map +1 -0
- package/dist/lib/lazy-with-fallback.d.ts +31 -0
- package/dist/lib/lazy-with-fallback.js +40 -0
- package/dist/lib/lazy-with-fallback.js.map +1 -0
- package/dist/lib/path-pattern.d.ts +34 -0
- package/dist/lib/path-pattern.js +24 -0
- package/dist/lib/path-pattern.js.map +1 -0
- package/dist/lib/reduced-motion.d.ts +2 -1
- package/dist/lib/reduced-motion.js.map +1 -1
- package/dist/lib/round.d.ts +2 -1
- package/dist/lib/round.js +2 -1
- package/dist/lib/round.js.map +1 -1
- package/dist/lib/safe-storage.d.ts +24 -5
- package/dist/lib/safe-storage.js +27 -2
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/lib/session-refresh.js +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/share-format.d.ts +13 -0
- package/dist/lib/share-format.js +10 -0
- package/dist/lib/share-format.js.map +1 -0
- package/dist/lib/text-case.d.ts +17 -0
- package/dist/lib/text-case.js +8 -0
- package/dist/lib/text-case.js.map +1 -0
- package/dist/lib/text-match.d.ts +29 -0
- package/dist/lib/text-match.js +20 -2
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/thenable.d.ts +13 -0
- package/dist/lib/thenable.js +8 -0
- package/dist/lib/thenable.js.map +1 -0
- package/dist/lib/translation-review.d.ts +7 -2
- package/dist/lib/translation-review.js +4 -4
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/device-zone-report.js +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +2 -1
- package/dist/notifications/notification-bell.js +3 -3
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +10 -6
- package/dist/notifications/notification-inbox.js +26 -48
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.d.ts +3 -2
- package/dist/notifications/notification-parts.js +1 -3
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.d.ts +6 -0
- package/dist/notifications/notifications-labels.js +1 -0
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +1 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.d.ts +2 -1
- package/dist/notifications/push-devices-setting.js +27 -49
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +10 -3
- package/dist/notifications/quiet-hours-setting.js +65 -26
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/unsubscribe-panel.js +4 -7
- package/dist/notifications/unsubscribe-panel.js.map +1 -1
- package/dist/notifications/use-push-device.d.ts +39 -1
- package/dist/notifications/use-push-device.js +28 -7
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/query-persistence.d.ts +3 -1
- package/dist/offline/query-persistence.js +19 -2
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/rhf/fields.d.ts +11 -4
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/command-palette.js +1 -1
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +19 -9
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/search-index.d.ts +0 -6
- package/dist/search/search-index.js +0 -4
- package/dist/search/search-index.js.map +1 -1
- package/dist/search/use-command-key.d.ts +12 -1
- package/dist/search/use-command-key.js +3 -12
- package/dist/search/use-command-key.js.map +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.js +6 -1
- package/dist/search.js.map +1 -1
- package/dist/settings/use-settings-focus.js +1 -0
- package/dist/settings/use-settings-focus.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +5 -3
- package/dist/shell/account-menu-language.js +2 -2
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +9 -6
- package/dist/shell/account-menu-text-size.js +2 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/app-shell.d.ts +0 -10
- package/dist/shell/app-shell.js +1 -7
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/company-switcher.d.ts +1 -1
- package/dist/shell/company-switcher.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/top-bar-actions.d.ts +1 -1
- package/dist/shell/top-bar-actions.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +1 -3
- package/dist/shell/top-bar-parts-labels.js +0 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +7 -10
- package/dist/shell.js +14 -23
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +30 -4
- package/dist/sync/engine.js +172 -52
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +2 -2
- package/dist/sync.js +2 -10
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js +3 -8
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +0 -5
- package/dist/theme/chart-palette.js +0 -2
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -1
- package/dist/theme/contrast.js +3 -8
- package/dist/theme/contrast.js.map +1 -1
- package/dist/theme/palette-store.js +6 -6
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js +3 -8
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +3 -6
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.d.ts +7 -4
- package/dist/tour/tour-catalogue.js +12 -10
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.d.ts +0 -2
- package/dist/tour/tour-dock.js +0 -2
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-gates.d.ts +4 -0
- package/dist/tour/tour-gates.js +14 -0
- package/dist/tour/tour-gates.js.map +1 -1
- package/dist/tour/tour-overlay.d.ts +27 -0
- package/dist/tour/tour-overlay.js +741 -0
- package/dist/tour/tour-overlay.js.map +1 -0
- package/dist/tour/tour.d.ts +13 -3
- package/dist/tour/tour.js +59 -781
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +6 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.d.ts +3 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.d.ts +3 -1
- package/dist/wizard/validation.js.map +1 -1
- package/package.json +10 -6
- package/src/account/account-parts.ts +5 -25
- package/src/account/data-export-setting-labels.ts +1 -1
- package/src/account/delete-account-setting-labels.ts +1 -1
- package/src/account/email-change-setting-labels.ts +1 -1
- package/src/account/passkeys-setting.tsx +60 -38
- package/src/account/sessions-setting.tsx +18 -12
- package/src/admin/admin-action-confirm.tsx +1 -5
- package/src/admin/admin-parts.ts +11 -25
- package/src/admin/mail-test-card-labels.ts +1 -1
- package/src/admin/plan-change-labels.ts +5 -23
- package/src/admin/plan-change.tsx +7 -44
- package/src/admin/reviewer-scope-editor.tsx +3 -3
- package/src/auth/auth-errors-labels.ts +23 -0
- package/src/auth/auth-errors.ts +11 -38
- package/src/auth/complete-name-dialog.tsx +4 -1
- package/src/auth/forgot-password-form-labels.ts +1 -1
- package/src/auth/forgot-password-form.tsx +11 -6
- package/src/auth/register-form-labels.ts +1 -1
- package/src/auth/reset-password-form-labels.ts +1 -1
- package/src/auth/reset-password-form.tsx +8 -4
- package/src/auth/sign-in-form-labels.ts +1 -1
- package/src/auth/status-parts.tsx +0 -6
- package/src/auth/verify-email-labels.ts +1 -1
- package/src/auth/verify-email.tsx +11 -6
- package/src/billing/cancel-subscription.tsx +15 -12
- package/src/billing/plan-card.tsx +18 -10
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +15 -12
- package/src/chart.ts +73 -6
- package/src/components/account-chips.tsx +20 -23
- package/src/components/alert-banner.tsx +82 -5
- package/src/components/amount-input.tsx +18 -7
- package/src/components/autocomplete.tsx +64 -70
- package/src/components/bulk-action-bar.tsx +70 -2
- package/src/components/button-look.ts +5 -5
- package/src/components/button.tsx +2 -2
- package/src/components/chart-edge.ts +34 -1
- package/src/components/chart-figure.tsx +35 -0
- package/src/components/chart-zoom-core.tsx +6 -5
- package/src/components/chart.tsx +26 -5
- package/src/components/combobox-core.tsx +293 -62
- package/src/components/combobox.tsx +183 -153
- package/src/components/copy-button.tsx +34 -23
- package/src/components/country-select.tsx +16 -11
- package/src/components/data-table-column-settings.tsx +52 -10
- package/src/components/data-table-filters.ts +6 -4
- package/src/components/data-table-fit.ts +19 -5
- package/src/components/data-table-groups.tsx +1 -1
- package/src/components/data-table-head.tsx +32 -22
- package/src/components/data-table-mobile.tsx +61 -26
- package/src/components/data-table-pagination.tsx +21 -6
- package/src/components/data-table-resize.ts +1 -1
- package/src/components/data-table-row-actions.tsx +3 -3
- package/src/components/data-table-row.tsx +25 -14
- package/src/components/data-table-selection.ts +1 -1
- package/src/components/data-table-shared.tsx +33 -1
- package/src/components/data-table-sort.ts +57 -2
- package/src/components/data-table-virtual.ts +32 -8
- package/src/components/data-table.tsx +239 -68
- package/src/components/date-field.tsx +66 -9
- package/src/components/date-picker.tsx +125 -49
- package/src/components/date-range-picker.tsx +71 -36
- package/src/components/error-boundary.tsx +53 -39
- package/src/components/field-base-labels.ts +20 -0
- package/src/components/field-base.tsx +13 -7
- package/src/components/form-actions.tsx +20 -5
- package/src/components/hover-menu.tsx +18 -8
- package/src/components/icon-button.tsx +14 -9
- package/src/components/inline-confirm.tsx +116 -0
- package/src/components/inline-entity-combobox.tsx +197 -153
- package/src/components/input.tsx +1 -1
- package/src/components/jump-calendar.tsx +30 -146
- package/src/components/legal-page.tsx +10 -7
- package/src/components/legal.tsx +4 -2
- package/src/components/lightbox.tsx +21 -8
- package/src/components/list.tsx +10 -4
- package/src/components/measured-grid.tsx +8 -4
- package/src/components/mini-calendar.tsx +6 -5
- package/src/components/modal.tsx +6 -1
- package/src/components/month-grid.tsx +229 -0
- package/src/components/month-picker.tsx +192 -200
- package/src/components/multi-select.tsx +21 -9
- package/src/components/nav-pills.tsx +1 -1
- package/src/components/picker-sheet.tsx +12 -9
- package/src/components/pie-chart-labels.ts +8 -0
- package/src/components/pie-chart.tsx +22 -28
- package/src/components/popover.tsx +18 -1
- package/src/components/row-actions.tsx +2 -1
- package/src/components/series-chart-axes.ts +9 -4
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +253 -87
- package/src/components/share-card.tsx +6 -6
- package/src/components/tabs-labels.ts +13 -0
- package/src/components/tabs.tsx +2 -2
- package/src/components/toggle-legend.tsx +16 -11
- package/src/components/translation-review-editor.tsx +6 -5
- package/src/components/translation-review.tsx +4 -3
- package/src/components/treemap-labels.ts +47 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +780 -138
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +1 -4
- package/src/demo/demo-countdown.ts +3 -8
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +20 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +13 -7
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +0 -3
- package/src/feedback/feedback-row-detail.tsx +70 -84
- package/src/feedback/feedback-status-undo.ts +28 -28
- package/src/feedback/feedback-submit-dialog.tsx +2 -2
- package/src/feedback/feedback-submit.tsx +21 -7
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/feedback/feedback-table.tsx +86 -38
- package/src/feedback/feedback-thread-labels.ts +2 -2
- package/src/feedback/feedback-thread.tsx +18 -26
- package/src/feedback.ts +89 -6
- package/src/hooks/use-focus-trap.ts +8 -24
- package/src/hooks/use-hotkey.ts +24 -7
- package/src/hooks/use-long-press.ts +16 -2
- package/src/hooks/use-media-query.ts +20 -4
- package/src/hooks/use-mounted.ts +39 -0
- package/src/hooks/use-overlay-history.ts +32 -3
- package/src/i18n/defaults.ts +4 -9
- package/src/i18n/german.ts +8 -19
- package/src/i18n/kit-labels.tsx +9 -11
- package/src/i18n/locales/es.ts +8 -19
- package/src/i18n/locales/fr.ts +21 -30
- package/src/i18n/locales/hu.ts +10 -19
- package/src/i18n/locales/it.ts +8 -20
- package/src/i18n/locales/zh.ts +9 -19
- package/src/i18n/review.ts +12 -2
- package/src/i18n/shared-labels.ts +0 -1
- package/src/index.ts +57 -49
- package/src/landing/routing.tsx +14 -10
- package/src/lib/broadcast.ts +52 -0
- package/src/lib/date-format.ts +89 -13
- package/src/lib/day-format.ts +96 -0
- package/src/lib/describe-failure.ts +18 -0
- package/src/lib/direction.ts +39 -0
- package/src/lib/focus-left.ts +156 -0
- package/src/lib/format.ts +5 -17
- package/src/lib/http-status.ts +38 -0
- package/src/lib/intl-cache.ts +25 -0
- package/src/lib/iso-day.ts +13 -0
- package/src/lib/lazy-with-fallback.ts +82 -0
- package/src/lib/path-pattern.ts +55 -0
- package/src/lib/reduced-motion.ts +2 -1
- package/src/lib/round.ts +7 -2
- package/src/lib/safe-storage.ts +48 -6
- package/src/lib/session-refresh.ts +1 -1
- package/src/lib/share-format.ts +18 -0
- package/src/lib/text-case.ts +19 -0
- package/src/lib/text-match.ts +57 -2
- package/src/lib/thenable.ts +19 -0
- package/src/lib/translation-review.ts +13 -5
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-bell.tsx +7 -4
- package/src/notifications/notification-inbox.tsx +40 -58
- package/src/notifications/notification-parts.tsx +3 -4
- package/src/notifications/notification-types-setting.tsx +1 -1
- package/src/notifications/notifications-labels.ts +7 -0
- package/src/notifications/push-device-setting.tsx +1 -1
- package/src/notifications/push-devices-setting.tsx +30 -55
- package/src/notifications/quiet-hours-setting.tsx +93 -31
- package/src/notifications/unsubscribe-panel.tsx +4 -7
- package/src/notifications/use-push-device.ts +76 -10
- package/src/offline/query-persistence.ts +35 -3
- package/src/rhf/fields.tsx +11 -4
- package/src/search/command-palette.tsx +2 -4
- package/src/search/global-search.tsx +36 -15
- package/src/search/search-index.ts +0 -15
- package/src/search/use-command-key.ts +13 -12
- package/src/search.ts +10 -1
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +6 -4
- package/src/shell/account-menu-text-size.tsx +10 -7
- package/src/shell/app-shell.tsx +0 -13
- package/src/shell/company-switcher.tsx +1 -1
- package/src/shell/dev-menu.tsx +8 -22
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +1 -4
- package/src/shell.ts +21 -17
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +2 -8
- package/src/testing/css-variables.ts +8 -9
- package/src/theme/chart-palette.ts +0 -2
- package/src/theme/contrast.ts +8 -9
- package/src/theme/palette-store.ts +9 -9
- package/src/theme/text-size.ts +6 -8
- package/src/theme/theme-store.ts +7 -9
- package/src/tour/tour-catalogue.tsx +26 -15
- package/src/tour/tour-dock.ts +0 -2
- package/src/tour/tour-gates.ts +23 -0
- package/src/tour/tour-overlay.tsx +1170 -0
- package/src/tour/tour.tsx +108 -1202
- package/src/tour/use-tour-progress.ts +1 -1
- package/src/wizard/stepper-nav.tsx +3 -1
- package/src/wizard/types.ts +11 -2
- package/src/wizard/use-wizard.ts +2 -1
- package/src/wizard/validation.ts +8 -2
- package/tokens.css +6 -5
- package/dist/components/field-sync-labels.d.ts +0 -2
- package/dist/components/field-sync-labels.js +0 -12
- package/dist/components/field-sync-labels.js.map +0 -1
- package/dist/components/field-sync.d.ts +0 -164
- package/dist/components/field-sync.js +0 -269
- package/dist/components/field-sync.js.map +0 -1
- package/dist/components/section-nav.d.ts +0 -37
- package/dist/components/section-nav.js +0 -33
- package/dist/components/section-nav.js.map +0 -1
- package/dist/components/sign-chip-labels.d.ts +0 -2
- package/dist/components/sign-chip-labels.js +0 -11
- package/dist/components/sign-chip-labels.js.map +0 -1
- package/dist/components/sign-chip.d.ts +0 -68
- package/dist/components/sign-chip.js +0 -47
- package/dist/components/sign-chip.js.map +0 -1
- package/dist/components/ui-labels.js.map +0 -1
- package/dist/lib/isin.d.ts +0 -28
- package/dist/lib/isin.js +0 -36
- package/dist/lib/isin.js.map +0 -1
- package/dist/shell/dev-switchers.d.ts +0 -6
- package/dist/shell/dev-switchers.js +0 -12
- package/dist/shell/dev-switchers.js.map +0 -1
- package/dist/shell/role-switcher.d.ts +0 -21
- package/dist/shell/role-switcher.js +0 -31
- package/dist/shell/role-switcher.js.map +0 -1
- package/src/components/field-sync-labels.ts +0 -13
- package/src/components/field-sync.tsx +0 -482
- package/src/components/section-nav.tsx +0 -65
- package/src/components/sign-chip-labels.ts +0 -12
- package/src/components/sign-chip.tsx +0 -124
- package/src/components/ui-labels.ts +0 -24
- package/src/lib/isin.ts +0 -62
- package/src/shell/dev-switchers.tsx +0 -18
- package/src/shell/role-switcher.tsx +0 -46
package/src/index.ts
CHANGED
|
@@ -16,12 +16,25 @@ export { logger, setStoreLog } from "./lib/logger";
|
|
|
16
16
|
// Intl number / money / percent / date / relative-time formatting, and `useKitFormat()`
|
|
17
17
|
// for the same bound to the provider's locale (kastlan's formatters.ts, English "5m ago").
|
|
18
18
|
export * from "./lib/format";
|
|
19
|
-
// localStorage that never throws (Safari private mode, blocked site data).
|
|
20
|
-
|
|
19
|
+
// localStorage that never throws (Safari private mode, blocked site data). 0.52 (DUP-8,
|
|
20
|
+
// refactor audit 2026-10-30): the remove, the sessionStorage pair and a JSON pair with a
|
|
21
|
+
// shape check — 16 files in the apps wrap storage by hand, a few of them with no guard.
|
|
22
|
+
export {
|
|
23
|
+
readStored,
|
|
24
|
+
writeStored,
|
|
25
|
+
removeStored,
|
|
26
|
+
readSessionStored,
|
|
27
|
+
writeSessionStored,
|
|
28
|
+
readStoredJson,
|
|
29
|
+
writeStoredJson,
|
|
30
|
+
} from "./lib/safe-storage";
|
|
31
|
+
// 0.52 (DUP-8): `prefers-reduced-motion`, asked at the moment of the motion (KS copied it).
|
|
32
|
+
export { prefersReducedMotion } from "./lib/reduced-motion";
|
|
21
33
|
// Save a fetched Blob as a download, and read the name a Content-Disposition asks for
|
|
22
34
|
// (`filename*` first) — 0.34, KS U5; the kit's own three downloads use them.
|
|
23
35
|
export { saveBlob, filenameFromDisposition } from "./lib/download";
|
|
24
|
-
//
|
|
36
|
+
// The local-calendar ISO date helpers are the "@eifi1/ui-kit/dates" entry, standalone: none
|
|
37
|
+
// of its names is in this barrel (public-surface.test.ts, STANDALONE).
|
|
25
38
|
// One fold and one ranking for every list's search box (DUP-5), for an app's own lists;
|
|
26
39
|
// and the pickers' every-word match (0.51.5), for an async `loadOptions` that filters itself.
|
|
27
40
|
export { foldForSearch, rankMatch, searchWords, matchesSearch } from "./lib/text-match";
|
|
@@ -109,12 +122,11 @@ export type {
|
|
|
109
122
|
TranslationReviewSwipeAction,
|
|
110
123
|
TranslationReviewSwipeBinding,
|
|
111
124
|
} from "./lib/translation-review";
|
|
112
|
-
// 0.22.0, the inputs round: the country list and the IBAN
|
|
125
|
+
// 0.22.0, the inputs round: the country list and the IBAN and phone helpers that
|
|
113
126
|
// CountrySelect, IbanInput and PhoneInput are built on.
|
|
114
127
|
export { COUNTRY_CODES, countryName } from "./lib/countries";
|
|
115
128
|
export { IBAN_LENGTHS, compactIban, formatIban, ibanCheckDigits, ibanProblem, isValidIban, isQrIban } from "./lib/iban";
|
|
116
129
|
export type { IbanKind, IbanProblem } from "./lib/iban";
|
|
117
|
-
export { formatIsin, isinCheckDigit, isValidIsin } from "./lib/isin";
|
|
118
130
|
export { PHONE_DIAL_CODES, PHONE_COUNTRIES, parsePhone, formatNationalPhone, formatPhone, isE164 } from "./lib/phone";
|
|
119
131
|
export type { PhoneCountryCode, PhoneCountry, ParsedPhone } from "./lib/phone";
|
|
120
132
|
// 0.23.0: ColumnMapper's pure half (Kurvenschmiede's columns input, keksdose's import map).
|
|
@@ -156,12 +168,16 @@ export type { UseAnnounceReturn, UseAnnounceOptions, AnnounceRegionProps } from
|
|
|
156
168
|
export { useOverlayHistory } from "./hooks/use-overlay-history";
|
|
157
169
|
export { useCloseTransition, OVERLAY_EXIT_MS } from "./hooks/use-close-transition";
|
|
158
170
|
export { useRowSwipe } from "./hooks/use-row-swipe";
|
|
171
|
+
// 0.52 (DUP-8): DataTable's press-and-hold, which keksdose wrote first and still keeps.
|
|
172
|
+
export { useLongPress } from "./hooks/use-long-press";
|
|
173
|
+
export type { LongPressOptions, LongPressResult } from "./hooks/use-long-press";
|
|
159
174
|
// 0.28: keksdose's noindex marker, for the legal and auth pages of every app.
|
|
160
175
|
export { useNoIndex } from "./hooks/use-noindex";
|
|
161
176
|
// 0.49 KIT-9: the window's title from page, section and app, in the provider's format.
|
|
162
177
|
export { useDocumentTitle } from "./hooks/use-document-title";
|
|
163
|
-
// 0.
|
|
164
|
-
|
|
178
|
+
// 0.53: the 55 names no app reads left the entry points (deprecated in 0.52, refactor audit
|
|
179
|
+
// 2026-10-30, API-4, decision 4) — here 0.49 KIT-1b's `asciiMinusInNumbers`, the copy
|
|
180
|
+
// handler's rule, among them. Their modules keep the ones the kit itself uses.
|
|
165
181
|
export { DEFAULT_DOCUMENT_TITLE_FORMAT, formatDocumentTitle } from "./lib/document-title";
|
|
166
182
|
export type { DocumentTitleParts } from "./lib/document-title";
|
|
167
183
|
export type { SwipeStage, RowSwipeOptions, RowSwipeReturn } from "./hooks/use-row-swipe";
|
|
@@ -321,10 +337,6 @@ export * from "./components/multi-select";
|
|
|
321
337
|
export * from "./components/tooltip";
|
|
322
338
|
export * from "./components/user-avatar";
|
|
323
339
|
export * from "./components/settings-fields";
|
|
324
|
-
// Sync state for a database-backed field: the engine (`useFieldSync`) and the
|
|
325
|
-
// affordance (`FieldSyncIndicator`), kept separate because the state is useful
|
|
326
|
-
// without the dot — a form can gate its submit on any field being `pending`.
|
|
327
|
-
export * from "./components/field-sync";
|
|
328
340
|
export * from "./components/month-picker";
|
|
329
341
|
export * from "./components/checkbox";
|
|
330
342
|
export * from "./components/switch";
|
|
@@ -398,8 +410,6 @@ export * from "./components/alert-banner";
|
|
|
398
410
|
export * from "./components/toggle-group";
|
|
399
411
|
// A wrapping set of links/buttons marked `aria-current` — Tabs-like looks, not tabs.
|
|
400
412
|
export * from "./components/nav-pills";
|
|
401
|
-
// 0.49.0 (KIT-6): a section's pages on the phone, one scrolling row of pills.
|
|
402
|
-
export * from "./components/section-nav";
|
|
403
413
|
// A pill carrying one VALUE — inert, a link, or a toggle, depending on which prop it is
|
|
404
414
|
// given — and the list field built from it. Distinct from Button on purpose: a row of
|
|
405
415
|
// buttons reads as "choose an action", a row of chips as "here are the things".
|
|
@@ -416,7 +426,16 @@ export * from "./components/full-bleed-dialog";
|
|
|
416
426
|
export * from "./components/grouped-picker";
|
|
417
427
|
export * from "./components/file-dropzone";
|
|
418
428
|
export * from "./components/mini-calendar";
|
|
419
|
-
|
|
429
|
+
// Named, not `*`: `heatmapLevel` is CalendarHeatmap's own since 0.53 (API-4).
|
|
430
|
+
export {
|
|
431
|
+
CalendarHeatmap,
|
|
432
|
+
DEFAULT_CALENDAR_HEATMAP_LABELS,
|
|
433
|
+
heatmapWindowEnd,
|
|
434
|
+
type CalendarHeatmapLabels,
|
|
435
|
+
type CalendarHeatmapDatum,
|
|
436
|
+
type CalendarHeatmapDay,
|
|
437
|
+
type CalendarHeatmapProps,
|
|
438
|
+
} from "./components/calendar-heatmap";
|
|
420
439
|
export * from "./components/date-picker";
|
|
421
440
|
export * from "./components/tree-view";
|
|
422
441
|
// 0.8.0 layout and feedback primitives the apps hand-rolled or took from shadcn/Radix.
|
|
@@ -436,8 +455,9 @@ export {
|
|
|
436
455
|
COMMIT_EXCEPT_BILLING,
|
|
437
456
|
DEFAULT_WRITE_LOCK_LABELS,
|
|
438
457
|
} from "./components/write-lock";
|
|
439
|
-
// 0.46 (kastlan K4): the offline lock
|
|
440
|
-
|
|
458
|
+
// 0.46 (kastlan K4): the offline lock's scope and its source (the kind, `OFFLINE_LOCK`, left
|
|
459
|
+
// the surface in 0.53: it is the string "offline").
|
|
460
|
+
export { COMMIT_EXCEPT_OFFLINE, useOfflineWriteLock } from "./components/write-lock";
|
|
441
461
|
export type {
|
|
442
462
|
WriteLock,
|
|
443
463
|
WriteLockLabels,
|
|
@@ -501,7 +521,13 @@ export * from "./components/error-boundary";
|
|
|
501
521
|
export * from "./components/copy-button";
|
|
502
522
|
export { AuthedImage, DEFAULT_AUTHED_IMAGE_LABELS } from "./components/authed-image";
|
|
503
523
|
export type { AuthedImageProps, AuthedImageLabels } from "./components/authed-image";
|
|
504
|
-
|
|
524
|
+
// Named, not `*`: `splitFileName` is ImageGrid's own since 0.53 (API-4).
|
|
525
|
+
export {
|
|
526
|
+
ImageGrid,
|
|
527
|
+
DEFAULT_IMAGE_GRID_LABELS,
|
|
528
|
+
type ImageGridLabels,
|
|
529
|
+
type ImageGridProps,
|
|
530
|
+
} from "./components/image-grid";
|
|
505
531
|
export * from "./components/lightbox";
|
|
506
532
|
export * from "./components/button-group";
|
|
507
533
|
export * from "./components/table";
|
|
@@ -529,14 +555,7 @@ export type {
|
|
|
529
555
|
// The toast layer over sonner (an OPTIONAL peer, loaded lazily): `toast` mirrors sonner's
|
|
530
556
|
// API so apps migrate by swapping the import; `<Toaster>` carries the placement, theme,
|
|
531
557
|
// tones and z-index both apps had wired by hand.
|
|
532
|
-
export {
|
|
533
|
-
toast,
|
|
534
|
-
Toaster,
|
|
535
|
-
DEFAULT_TOAST_LABELS,
|
|
536
|
-
TOAST_ACTION_DURATION,
|
|
537
|
-
TOASTER_OFFSET_TOP,
|
|
538
|
-
TOASTER_OFFSET_BOTTOM,
|
|
539
|
-
} from "./components/toast";
|
|
558
|
+
export { toast, Toaster, DEFAULT_TOAST_LABELS } from "./components/toast";
|
|
540
559
|
export type {
|
|
541
560
|
ToastId,
|
|
542
561
|
ToastAction,
|
|
@@ -626,6 +645,8 @@ export {
|
|
|
626
645
|
isDateFormatPreference,
|
|
627
646
|
resolveDateFormat,
|
|
628
647
|
formatDateWithPreference,
|
|
648
|
+
// 0.52 (refactor audit 2026-10-30, DUP-2): a timestamp, the preference's date and the language's clock.
|
|
649
|
+
formatDateTimeWithPreference,
|
|
629
650
|
dateFormatSample,
|
|
630
651
|
dateFormatterFor,
|
|
631
652
|
} from "./lib/date-format";
|
|
@@ -639,7 +660,6 @@ export {
|
|
|
639
660
|
// 0.47.0 (keksdose N17): a hand-built table's actions heading and cell.
|
|
640
661
|
RowActionsHead,
|
|
641
662
|
ROW_ACTIONS_CELL_CLASS,
|
|
642
|
-
ROW_ACTIONS_HEAD_CLASS,
|
|
643
663
|
} from "./components/row-actions";
|
|
644
664
|
export type {
|
|
645
665
|
RowAction,
|
|
@@ -660,7 +680,6 @@ export * from "./components/one-time-code-input";
|
|
|
660
680
|
export * from "./components/language-select";
|
|
661
681
|
export * from "./components/tile-radio";
|
|
662
682
|
export * from "./components/inline-edit-field";
|
|
663
|
-
export * from "./components/sign-chip";
|
|
664
683
|
export * from "./components/country-select";
|
|
665
684
|
export * from "./components/iban-input";
|
|
666
685
|
export * from "./components/phone-input";
|
|
@@ -814,11 +833,9 @@ export type { DataExportSettingProps, DataExportLabels, DataExportFile } from ".
|
|
|
814
833
|
// 0.30.0 (docs/user-admin-harmonization.md): the admin user list and its actions, and the
|
|
815
834
|
// invitations panel. Callbacks only; the confirmation level is the server's.
|
|
816
835
|
export {
|
|
817
|
-
userRosterColumns,
|
|
818
836
|
useUserRosterColumns,
|
|
819
837
|
UserIdentityCell,
|
|
820
838
|
UserRowActions,
|
|
821
|
-
adminUserStates,
|
|
822
839
|
userRosterSort,
|
|
823
840
|
USER_ROSTER_SORT_KEYS,
|
|
824
841
|
DEFAULT_USER_ROSTER_LABELS,
|
|
@@ -898,7 +915,7 @@ export { adminSectionOrder } from "./admin/admin-sections";
|
|
|
898
915
|
export type { AdminSectionPlace, AdminSectionOrderOptions, AdminKeptSection } from "./admin/admin-sections";
|
|
899
916
|
export { AdminForbidden } from "./admin/admin-forbidden";
|
|
900
917
|
export type { AdminForbiddenProps } from "./admin/admin-forbidden";
|
|
901
|
-
export { AdminOverview, AttentionTile, adminWaitingCount
|
|
918
|
+
export { AdminOverview, AttentionTile, adminWaitingCount } from "./admin/admin-overview";
|
|
902
919
|
export type {
|
|
903
920
|
AdminAttention,
|
|
904
921
|
AdminAttentionTile,
|
|
@@ -913,16 +930,10 @@ export type {
|
|
|
913
930
|
export { AdminToolLinks } from "./admin/admin-tool-links";
|
|
914
931
|
export type { AdminToolLink, AdminToolLinksProps } from "./admin/admin-tool-links";
|
|
915
932
|
// 0.45.0 (docs/admin-harmonization.md §9.2.4): "Send a test mail to me".
|
|
916
|
-
export { MailTestCard, DEFAULT_MAIL_TEST_CARD_LABELS, MAIL_TEST_ANCHOR
|
|
933
|
+
export { MailTestCard, DEFAULT_MAIL_TEST_CARD_LABELS, MAIL_TEST_ANCHOR } from "./admin/mail-test-card";
|
|
917
934
|
export type { MailTestCardProps, MailTestCardLabels, MailTestAnswer } from "./admin/mail-test-card";
|
|
918
935
|
// 0.33.0: the operator's plan parts (docs/billing-harmonization.md §14.12).
|
|
919
|
-
export {
|
|
920
|
-
planColumn,
|
|
921
|
-
usePlanColumn,
|
|
922
|
-
PlanChangeConfirm,
|
|
923
|
-
usePlanChangeResult,
|
|
924
|
-
DEFAULT_PLAN_CHANGE_LABELS,
|
|
925
|
-
} from "./admin/plan-change";
|
|
936
|
+
export { usePlanColumn, PlanChangeConfirm, usePlanChangeResult, DEFAULT_PLAN_CHANGE_LABELS } from "./admin/plan-change";
|
|
926
937
|
export type {
|
|
927
938
|
PlanChangeLabels,
|
|
928
939
|
PlanColumnOptions,
|
|
@@ -947,7 +958,7 @@ export type {
|
|
|
947
958
|
PlanPrices,
|
|
948
959
|
PlanPriceAnswer,
|
|
949
960
|
} from "./billing/plan-price";
|
|
950
|
-
export { PlanCard, PlanPicker, GrantWarningConfirm
|
|
961
|
+
export { PlanCard, PlanPicker, GrantWarningConfirm } from "./billing/plan-card";
|
|
951
962
|
export type {
|
|
952
963
|
BillingPlan,
|
|
953
964
|
PlanRelation,
|
|
@@ -981,15 +992,10 @@ export {
|
|
|
981
992
|
withoutCheckoutReturn,
|
|
982
993
|
checkoutReturnUrl,
|
|
983
994
|
} from "./billing/checkout-return";
|
|
984
|
-
export {
|
|
985
|
-
checkoutFingerprint,
|
|
986
|
-
checkoutLanded,
|
|
987
|
-
noteCheckoutStarted,
|
|
988
|
-
useCheckoutProcessing,
|
|
989
|
-
} from "./billing/checkout-processing";
|
|
995
|
+
export { checkoutFingerprint, noteCheckoutStarted, useCheckoutProcessing } from "./billing/checkout-processing";
|
|
990
996
|
export type { CheckoutOverview, CheckoutProcessingOptions } from "./billing/checkout-processing";
|
|
991
997
|
// The link to the pay page and Paddle's locale (§14.4); the page itself ships as dist/pay/.
|
|
992
|
-
export {
|
|
998
|
+
export { paddleLocale, payPageUrl } from "./billing/pay-page";
|
|
993
999
|
export type { PaddleEnvironment } from "./billing/pay-page";
|
|
994
1000
|
// 0.39 (§15.2.6): the apps every pay page serves, by their `billing_app` tag.
|
|
995
1001
|
export { PAY_PAGE_APPS } from "./billing/pay-page";
|
|
@@ -1039,7 +1045,7 @@ export type {
|
|
|
1039
1045
|
ResolveAccountLanguageInput,
|
|
1040
1046
|
ResolvedAccountLanguage,
|
|
1041
1047
|
} from "./settings/use-account-language";
|
|
1042
|
-
export { useAccountAppearance
|
|
1048
|
+
export { useAccountAppearance } from "./settings/use-account-appearance";
|
|
1043
1049
|
export type {
|
|
1044
1050
|
AppearanceSource,
|
|
1045
1051
|
AccountAppearanceFields,
|
|
@@ -1090,6 +1096,8 @@ export {
|
|
|
1090
1096
|
notifyPushSubscriptionChanged,
|
|
1091
1097
|
pushSupported,
|
|
1092
1098
|
PushDeviceError,
|
|
1099
|
+
// 0.52 (§10.6, refactor audit 2026-10-30 FLW-2): an explicit sign-out releases this device's push.
|
|
1100
|
+
releaseThisDevicePush,
|
|
1093
1101
|
} from "./notifications/use-push-device";
|
|
1094
1102
|
export type {
|
|
1095
1103
|
PushDevice,
|
|
@@ -1114,7 +1122,7 @@ export type {
|
|
|
1114
1122
|
} from "./notifications/push-worker";
|
|
1115
1123
|
export { PushDeviceSetting } from "./notifications/push-device-setting";
|
|
1116
1124
|
export type { PushDeviceSettingProps, PushDeviceAction } from "./notifications/push-device-setting";
|
|
1117
|
-
export { PushDevicesSetting
|
|
1125
|
+
export { PushDevicesSetting } from "./notifications/push-devices-setting";
|
|
1118
1126
|
export type { PushDevicesSettingProps } from "./notifications/push-devices-setting";
|
|
1119
1127
|
export { UnsubscribePanel, unsubscribeTokenType } from "./notifications/unsubscribe-panel";
|
|
1120
1128
|
export type { UnsubscribePanelProps } from "./notifications/unsubscribe-panel";
|
|
@@ -1161,7 +1169,7 @@ export { DEFAULT_DEMO_LABELS, useDemoLabels } from "./demo/demo-labels";
|
|
|
1161
1169
|
export type { DemoLabels } from "./demo/demo-labels";
|
|
1162
1170
|
export { isDemoSession } from "./demo/demo-session";
|
|
1163
1171
|
export type { DemoModel, DemoSessionUser } from "./demo/demo-session";
|
|
1164
|
-
export { useDemoCountdown
|
|
1172
|
+
export { useDemoCountdown } from "./demo/demo-countdown";
|
|
1165
1173
|
export type { DemoCountdown, DemoCountdownOptions, DemoExpiry } from "./demo/demo-countdown";
|
|
1166
1174
|
export { DemoStart } from "./demo/demo-start";
|
|
1167
1175
|
export type { DemoStartProps } from "./demo/demo-start";
|
package/src/landing/routing.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import { useEffect } from "react";
|
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
import { Navigate, Outlet, useLocation } from "react-router";
|
|
4
4
|
|
|
5
|
+
import { matchesPathPattern, routerPathname } from "../lib/path-pattern";
|
|
5
6
|
import { readStored, removeStored, writeStored } from "../lib/safe-storage";
|
|
6
7
|
import type { LandingSession } from "./landing-actions";
|
|
7
8
|
import { LoadingState } from "../components/loading-state";
|
|
@@ -61,7 +62,9 @@ export function safeNextPath(raw: string | null | undefined): string | null {
|
|
|
61
62
|
/* ── The last visited page (§3.2) ────────────────────────────────────────── */
|
|
62
63
|
|
|
63
64
|
/** A path to leave out: a string is the path and everything under it (`/demo` is
|
|
64
|
-
* `/demo` and `/demo/ended`; `/` is only `/`), a RegExp is tested on the pathname.
|
|
65
|
+
* `/demo` and `/demo/ended`; `/` is only `/`), a RegExp is tested on the pathname. Both
|
|
66
|
+
* as React Router matches a route: case-insensitive (a RegExp gets the `i` flag) and on
|
|
67
|
+
* the percent-decoded path (0.52). */
|
|
65
68
|
export type PathPattern = string | RegExp;
|
|
66
69
|
|
|
67
70
|
/**
|
|
@@ -85,16 +88,17 @@ export const DEFAULT_LAST_VISITED_EXCLUDES: readonly PathPattern[] = Object.free
|
|
|
85
88
|
"/terms",
|
|
86
89
|
]);
|
|
87
90
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
/** Whether `pathname` is one of the defaults or the app's `exclude`. */
|
|
91
|
+
/**
|
|
92
|
+
* Whether `pathname` is one of the defaults or the app's `exclude` — read as the ROUTER
|
|
93
|
+
* reads it, decoded and case-insensitive (lib/path-pattern). This module's own copy of the
|
|
94
|
+
* rule compared the raw pathname case-sensitively after the feedback guard's copy had
|
|
95
|
+
* learnt both, and `exclude: ["/banks/callback"]` recorded `/Banks/Callback?code=…` as the
|
|
96
|
+
* page the next launch resumes on (0.52 code review, lib/path-pattern.ts). One rule now.
|
|
97
|
+
*/
|
|
96
98
|
function isExcluded(pathname: string, exclude: readonly PathPattern[]): boolean {
|
|
97
|
-
|
|
99
|
+
const path = routerPathname(pathname);
|
|
100
|
+
const named = (pattern: PathPattern) => matchesPathPattern(path, pattern);
|
|
101
|
+
return DEFAULT_LAST_VISITED_EXCLUDES.some(named) || exclude.some(named);
|
|
98
102
|
}
|
|
99
103
|
|
|
100
104
|
export interface LastVisitedPageOptions {
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The cross-tab messages of the sync engine (the copy's new epoch after `forget()`) and of the
|
|
3
|
+
* query copy (`clear`), refactor audit 2026-10-30 FLW-1. 0.52 code review
|
|
4
|
+
* (src/sync/engine.ts, src/offline/query-persistence.ts): both wrote the open, the feature
|
|
5
|
+
* check, the try/catch and the close by hand, the listening side twice too — and the two
|
|
6
|
+
* listeners had drifted (only the query copy's let go of Node's worker).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Tell this origin's other tabs one thing over a `BroadcastChannel`, and let go of the
|
|
11
|
+
* channel at once.
|
|
12
|
+
*
|
|
13
|
+
* Best-effort by design: the message makes another tab stop sooner, and each caller has a
|
|
14
|
+
* fallback that holds without it (the epoch in `meta`, the key deleted from storage).
|
|
15
|
+
*
|
|
16
|
+
* The message goes out on a channel of its own, so a caller that listens on `name` itself
|
|
17
|
+
* hears it too, like every other channel of that name in this tab: it ignores its own.
|
|
18
|
+
*/
|
|
19
|
+
export function postOnce(name: string, message: unknown): void {
|
|
20
|
+
// Older browsers and some test environments have none: nothing is posted.
|
|
21
|
+
if (typeof BroadcastChannel === "undefined") return;
|
|
22
|
+
try {
|
|
23
|
+
const channel = new BroadcastChannel(name);
|
|
24
|
+
try {
|
|
25
|
+
channel.postMessage(message);
|
|
26
|
+
} finally {
|
|
27
|
+
channel.close();
|
|
28
|
+
}
|
|
29
|
+
} catch {
|
|
30
|
+
/* best-effort: a message that cannot be cloned, a channel refused (an opaque origin) */
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Hear what this origin's other tabs post on `name` until the returned function is called.
|
|
36
|
+
* Nothing is heard (and closing is a no-op) where there is no BroadcastChannel or none can be
|
|
37
|
+
* opened (an opaque origin): each caller has a fallback that holds without it.
|
|
38
|
+
*/
|
|
39
|
+
export function listenOn(name: string, onMessage: (data: unknown) => void): () => void {
|
|
40
|
+
if (typeof BroadcastChannel === "undefined") return () => undefined;
|
|
41
|
+
let channel: BroadcastChannel;
|
|
42
|
+
try {
|
|
43
|
+
channel = new BroadcastChannel(name);
|
|
44
|
+
} catch {
|
|
45
|
+
return () => undefined;
|
|
46
|
+
}
|
|
47
|
+
// Node's channel (an app's tests) holds its worker open while it listens, and a test that
|
|
48
|
+
// never stops the listener would keep it listening. Browsers have no `unref`.
|
|
49
|
+
(channel as BroadcastChannel & { unref?: () => void }).unref?.();
|
|
50
|
+
channel.onmessage = ({ data }: MessageEvent<unknown>) => onMessage(data);
|
|
51
|
+
return () => channel.close();
|
|
52
|
+
}
|
package/src/lib/date-format.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { formatLocaleOf } from "../i18n/languages";
|
|
2
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";
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* The date-format preference (0.46, lifted from keksdose's `date-format-store.ts`,
|
|
@@ -56,6 +59,15 @@ export interface DateFormatOptions {
|
|
|
56
59
|
/** Name the day of the week too, in the interface language ("Mo., 01.08.2026"). A date
|
|
57
60
|
* in a COLUMN carries it; a date in a SENTENCE does not (keksdose dev#546). */
|
|
58
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;
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
/**
|
|
@@ -80,9 +92,6 @@ export function resolveDateFormat(
|
|
|
80
92
|
return { locale: preference, options: { year: "numeric", month: "2-digit", day: "2-digit" }, ...weekday };
|
|
81
93
|
}
|
|
82
94
|
|
|
83
|
-
/** A bare calendar day: no time, no zone. */
|
|
84
|
-
const DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
|
|
85
|
-
|
|
86
95
|
/**
|
|
87
96
|
* `dateText`, already rendered under the preference, with the day's NAME around it in
|
|
88
97
|
* `locale` (the language's). Not "weekday alone + comma": German says "So" alone and
|
|
@@ -93,7 +102,7 @@ const DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
|
|
|
93
102
|
*/
|
|
94
103
|
function withWeekday(date: Date, dateText: string, locale: string | undefined, options: Intl.DateTimeFormatOptions) {
|
|
95
104
|
const isDatePart = (p: Intl.DateTimeFormatPart) => p.type === "day" || p.type === "month" || p.type === "year";
|
|
96
|
-
const parts =
|
|
105
|
+
const parts = dateFormatter(locale, { weekday: "short", ...options }).formatToParts(date);
|
|
97
106
|
const first = parts.findIndex(isDatePart);
|
|
98
107
|
if (first === -1) return dateText;
|
|
99
108
|
let last = first;
|
|
@@ -108,8 +117,9 @@ function withWeekday(date: Date, dateText: string, locale: string | undefined, o
|
|
|
108
117
|
* A date under the preference: `""` for no value, the input itself when it does not
|
|
109
118
|
* parse. A bare "YYYY-MM-DD" is the calendar day it names in every zone (formatted in
|
|
110
119
|
* UTC, undoing `new Date`'s UTC-midnight parse — west of Greenwich it read a day early);
|
|
111
|
-
* a timestamp is an instant
|
|
112
|
-
* is rendered in the same zone, so a Sunday is never captioned
|
|
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.
|
|
113
123
|
*/
|
|
114
124
|
export function formatDateWithPreference(
|
|
115
125
|
value: string | Date | null | undefined,
|
|
@@ -119,17 +129,83 @@ export function formatDateWithPreference(
|
|
|
119
129
|
): string {
|
|
120
130
|
if (!value) return "";
|
|
121
131
|
const resolved = resolveDateFormat(preference, language, options);
|
|
122
|
-
const dateOnly =
|
|
132
|
+
const dateOnly = isBareIsoDay(value);
|
|
123
133
|
const date = typeof value === "string" ? new Date(value) : value;
|
|
124
134
|
if (Number.isNaN(date.getTime())) return String(value);
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
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);
|
|
128
141
|
return resolved.weekday ? withWeekday(date, text, resolved.weekday.locale, intl) : text;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
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
|
+
}
|
|
132
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)}`;
|
|
133
209
|
}
|
|
134
210
|
|
|
135
211
|
/** The sample an option is labelled with — 1 August 2026 in its shape, the shape being
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useKitDateFormatter, useKitLocale, useKitTimeZone } from "../i18n/kit-labels";
|
|
3
|
+
import { toLocalIso } from "./dates";
|
|
4
|
+
import { clockTime } from "./date-format";
|
|
5
|
+
import { EMPTY_FORMATTED_VALUE, formatDate, toDate, type DateInput, type FormatDateStyle } from "./format";
|
|
6
|
+
import { dateFormatter } from "./intl-cache";
|
|
7
|
+
import { isBareIsoDay } from "./iso-day";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* How a kit component prints a day — ONE ladder (refactor audit 2026-10-30, DUP-2):
|
|
11
|
+
*
|
|
12
|
+
* 1. the component's own prop (`formatDate`, `renderDate`), when the app gave one and it
|
|
13
|
+
* answers;
|
|
14
|
+
* 2. else the `<UiKitProvider formatDate>` (keksdose K12: the app's date-format
|
|
15
|
+
* preference), asked for the calendar day with `source: "dateMark"`;
|
|
16
|
+
* 3. else the kit's `formatDate` in the provider's locale AND `timeZone` (0.46).
|
|
17
|
+
*
|
|
18
|
+
* 0.46's rule — "a label that identifies a day follows the preference" — held only where
|
|
19
|
+
* a component wrote that ladder itself: four copies (admin's `useDayText`, AccountStateChip,
|
|
20
|
+
* DateMark, the feedback table), while about twelve components took their own prop or
|
|
21
|
+
* nothing and went straight to `lib/format`. keksdose set the provider's `formatDate` and
|
|
22
|
+
* still passed it into six components by hand; and the 10 that imported the raw
|
|
23
|
+
* `formatDate` ignored the provider's `timeZone`.
|
|
24
|
+
*
|
|
25
|
+
* @internal Not part of the barrel: the components' props are the public way in.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** What a {@link DayFormatter} call may ask for. */
|
|
29
|
+
export interface DayTextOptions {
|
|
30
|
+
/**
|
|
31
|
+
* Name the day of the week — what the provider's formatter is told (its `weekday`).
|
|
32
|
+
* keksdose's rule: a date in a COLUMN carries it, a date in a SENTENCE does not
|
|
33
|
+
* (dev#546). Default `false`. The kit's own rendering follows `style`, not this.
|
|
34
|
+
*/
|
|
35
|
+
weekday?: boolean;
|
|
36
|
+
/** Add the clock time, in the language (date-format rule 3): a timestamp. Default false. */
|
|
37
|
+
time?: boolean;
|
|
38
|
+
/** The kit's own rendering (step 3). Default `"medium"`, `"dateTime"` with `time`. */
|
|
39
|
+
style?: FormatDateStyle | Intl.DateTimeFormatOptions;
|
|
40
|
+
/** `false`: skip the provider (step 2) — a component's explicit style wins over it,
|
|
41
|
+
* as `DateMark`'s `dateStyle` does. Default `true`. */
|
|
42
|
+
preference?: boolean;
|
|
43
|
+
/** Printed for no value. Default "—". */
|
|
44
|
+
empty?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** A component's day printer: a value in, its text out. */
|
|
48
|
+
export type DayFormatter<V extends DateInput = DateInput> = (value: V, options?: DayTextOptions) => string;
|
|
49
|
+
|
|
50
|
+
/** The calendar day `date` falls on in `timeZone`, as "YYYY-MM-DD" — so the day the
|
|
51
|
+
* provider is asked for is the day the kit's own rendering would print. */
|
|
52
|
+
function isoDayIn(date: Date, timeZone: string | undefined): string {
|
|
53
|
+
if (!timeZone) return toLocalIso(date);
|
|
54
|
+
try {
|
|
55
|
+
// `en-CA` writes YYYY-MM-DD with Latin digits.
|
|
56
|
+
const parts = dateFormatter("en-CA", { timeZone, year: "numeric", month: "2-digit", day: "2-digit" }).formatToParts(
|
|
57
|
+
date,
|
|
58
|
+
);
|
|
59
|
+
const part = (type: Intl.DateTimeFormatPartTypes) => parts.find((p) => p.type === type)?.value ?? "";
|
|
60
|
+
return `${part("year")}-${part("month")}-${part("day")}`;
|
|
61
|
+
} catch {
|
|
62
|
+
return toLocalIso(date);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The component's day printer, bound to its `prop`, the provider's `formatDate`, locale
|
|
68
|
+
* and `timeZone`. `prop` is called with the value as the component passed it, and wins
|
|
69
|
+
* whenever it answers non-empty. A value that does not parse is printed as it came
|
|
70
|
+
* (a bug upstream is better seen than hidden behind a dash).
|
|
71
|
+
*/
|
|
72
|
+
export function useDayFormatter<V extends DateInput = DateInput>(
|
|
73
|
+
prop?: ((value: V) => string) | null,
|
|
74
|
+
localeProp?: string,
|
|
75
|
+
): DayFormatter<V> {
|
|
76
|
+
const locale = useKitLocale(localeProp);
|
|
77
|
+
const timeZone = useKitTimeZone();
|
|
78
|
+
const fromProvider = useKitDateFormatter();
|
|
79
|
+
return useCallback<DayFormatter<V>>(
|
|
80
|
+
(value, options = {}) => {
|
|
81
|
+
const own = prop?.(value);
|
|
82
|
+
if (own) return own;
|
|
83
|
+
if (value === null || value === undefined || value === "") return options.empty ?? EMPTY_FORMATTED_VALUE;
|
|
84
|
+
const date = toDate(value);
|
|
85
|
+
if (!date) return String(value);
|
|
86
|
+
const bareDay = isBareIsoDay(value);
|
|
87
|
+
if (fromProvider && options.preference !== false) {
|
|
88
|
+
const iso = bareDay ? value : isoDayIn(date, timeZone);
|
|
89
|
+
const day = fromProvider(iso, { unit: "day", source: "dateMark", locale, weekday: options.weekday ?? false });
|
|
90
|
+
if (day) return options.time && !bareDay ? `${day}, ${clockTime(date, locale, timeZone)}` : day;
|
|
91
|
+
}
|
|
92
|
+
return formatDate(value, options.style ?? (options.time ? "dateTime" : "medium"), { locale, timeZone });
|
|
93
|
+
},
|
|
94
|
+
[prop, fromProvider, locale, timeZone],
|
|
95
|
+
);
|
|
96
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { hasContent } from "./presence";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The failure ladder, once: the app's words for a failure when it has any, else the
|
|
6
|
+
* kit's `fallback`.
|
|
7
|
+
*
|
|
8
|
+
* "Any" is {@link hasContent}, so an app's `describeError` answering `""` (nothing to say
|
|
9
|
+
* about this one) gets the kit's sentence. Written as `own ?? fallback` in the auth forms,
|
|
10
|
+
* where `""` printed an empty alert, and both ways within one file in the reviewer scope
|
|
11
|
+
* editor; it lived in the notification cards' parts only (refactor audit 2026-10-30,
|
|
12
|
+
* DUP-14).
|
|
13
|
+
*
|
|
14
|
+
* @internal Package-private — not re-exported from the barrel.
|
|
15
|
+
*/
|
|
16
|
+
export function describeFailure(own: ReactNode | undefined, fallback: ReactNode): ReactNode {
|
|
17
|
+
return hasContent(own) ? own : fallback;
|
|
18
|
+
}
|