@eifi1/ui-kit 0.51.7 → 0.52.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 +141 -23
- 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 +20 -8
- package/dist/billing/cancel-subscription.js +7 -5
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/dialog-close.d.ts +29 -0
- package/dist/billing/dialog-close.js +8 -0
- package/dist/billing/dialog-close.js.map +1 -0
- package/dist/billing/plan-card.d.ts +14 -4
- package/dist/billing/plan-card.js +15 -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 +19 -7
- package/dist/billing/plan-switch.js +8 -4
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +12 -0
- package/dist/chart.js +16 -1
- 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 +24 -2
- package/dist/components/date-field.js +33 -8
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +15 -2
- 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 +47 -20
- 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/field-sync-labels.d.ts +1 -0
- package/dist/components/field-sync-labels.js.map +1 -1
- package/dist/components/field-sync.d.ts +23 -1
- package/dist/components/field-sync.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/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/section-nav.d.ts +7 -0
- package/dist/components/section-nav.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +3 -3
- 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 +31 -7
- package/dist/components/series-chart.js +72 -29
- 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/sign-chip-labels.d.ts +1 -0
- package/dist/components/sign-chip-labels.js.map +1 -1
- package/dist/components/sign-chip.d.ts +10 -1
- package/dist/components/sign-chip.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 +26 -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 +140 -17
- package/dist/components/treemap.js +324 -97
- 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 +6 -2
- package/dist/data-table.js +7 -2
- package/dist/data-table.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 +30 -0
- package/dist/feedback/feedback-mutation.js +16 -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 +12 -3
- package/dist/feedback/feedback-public-list.js +2 -1
- 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 +5 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +64 -28
- package/dist/feedback/feedback-row-detail.js +30 -28
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +30 -11
- 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 +24 -23
- package/dist/feedback/feedback-thread.js +2 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +34 -0
- package/dist/feedback.js +42 -0
- 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 -5
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +7 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +9 -2
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +20 -41
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +7 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +20 -10
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +9 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +8 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +5 -0
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +64 -17
- package/dist/index.js +77 -12
- 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/isin.d.ts +10 -0
- package/dist/lib/isin.js.map +1 -1
- 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/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 +7 -0
- package/dist/search.js +10 -0
- 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 +21 -5
- package/dist/shell/account-menu-language.js +3 -1
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +26 -9
- package/dist/shell/account-menu-text-size.js +3 -2
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/dev-menu.js +5 -18
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/role-switcher.d.ts +7 -0
- package/dist/shell/role-switcher.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 +0 -2
- 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 +27 -8
- package/dist/shell.js +28 -7
- 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 +6 -2
- package/dist/sync.js +6 -1
- 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/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 +26 -12
- package/src/billing/dialog-close.ts +34 -0
- package/src/billing/plan-card.tsx +36 -11
- package/src/billing/plan-change-labels.ts +66 -0
- package/src/billing/plan-switch.tsx +26 -12
- package/src/chart.ts +21 -3
- 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 +65 -8
- package/src/components/date-picker.tsx +125 -48
- package/src/components/date-range-picker.tsx +82 -31
- 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/field-sync-labels.ts +1 -0
- package/src/components/field-sync.tsx +23 -1
- 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/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/section-nav.tsx +7 -0
- package/src/components/series-chart-axes.ts +3 -3
- package/src/components/series-chart-labels.ts +7 -4
- package/src/components/series-chart.tsx +178 -69
- package/src/components/share-card.tsx +6 -6
- package/src/components/sign-chip-labels.ts +1 -0
- package/src/components/sign-chip.tsx +10 -1
- 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 +39 -0
- package/src/components/treemap-layout.ts +210 -0
- package/src/components/treemap.tsx +722 -133
- package/src/components/use-table-state.ts +12 -9
- package/src/data-table.ts +9 -2
- package/src/eslint/role-utilities.ts +97 -19
- package/src/feedback/feedback-dialog.tsx +30 -19
- package/src/feedback/feedback-mutation.ts +41 -0
- package/src/feedback/feedback-page-link.ts +90 -0
- package/src/feedback/feedback-public-list.tsx +17 -5
- package/src/feedback/feedback-replies.tsx +13 -6
- package/src/feedback/feedback-row-detail-labels.ts +5 -0
- package/src/feedback/feedback-row-detail.tsx +103 -67
- package/src/feedback/feedback-status-undo.ts +41 -27
- 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 +27 -25
- package/src/feedback.ts +42 -0
- 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 -5
- package/src/i18n/german.ts +8 -2
- package/src/i18n/kit-labels.tsx +9 -2
- package/src/i18n/locales/es.ts +8 -2
- package/src/i18n/locales/fr.ts +21 -13
- package/src/i18n/locales/hu.ts +10 -2
- package/src/i18n/locales/it.ts +8 -2
- package/src/i18n/locales/zh.ts +9 -2
- package/src/i18n/review.ts +5 -0
- package/src/index.ts +103 -13
- 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/isin.ts +10 -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/use-command-key.ts +13 -12
- package/src/search.ts +9 -0
- package/src/settings/use-settings-focus.ts +3 -0
- package/src/shell/account-menu-language.tsx +27 -5
- package/src/shell/account-menu-text-size.tsx +32 -10
- package/src/shell/dev-menu.tsx +7 -21
- package/src/shell/role-switcher.tsx +7 -0
- package/src/shell/top-bar-actions.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +0 -3
- package/src/shell.ts +40 -9
- package/src/sync/engine.ts +339 -61
- package/src/sync.ts +8 -1
- package/src/testing/css-variables.ts +8 -9
- 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 +2 -1
- package/dist/components/ui-labels.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/src/components/ui-labels.ts +0 -24
- package/src/shell/dev-switchers.tsx +0 -18
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
// The two-date range picker: presets beside the calendar, `
|
|
2
|
-
//
|
|
1
|
+
// The two-date range picker: presets beside the calendar, `apply` drafts, a custom
|
|
2
|
+
// trigger. Moved out of date-picker.tsx as it was (MOD-9, refactor audit
|
|
3
3
|
// 2026-10); date-picker still exports every public name here.
|
|
4
4
|
import { useState } from "react";
|
|
5
5
|
import type { ReactNode } from "react";
|
|
6
6
|
import { cn } from "../lib/cn";
|
|
7
7
|
import { useKitLocale, type DatePickerLabels } from "../i18n/kit-labels";
|
|
8
8
|
import { Button } from "./button";
|
|
9
|
-
import { FieldBox, useFieldMessages } from "./field-parts";
|
|
9
|
+
import { FieldBox, LockedReason, useFieldMessages, useLockReason } from "./field-parts";
|
|
10
|
+
import type { CommitScope } from "./write-lock";
|
|
10
11
|
import { usePhoneLayout } from "../hooks/use-breakpoint";
|
|
11
12
|
import {
|
|
12
13
|
DateField,
|
|
@@ -40,19 +41,13 @@ export interface DateRangePickerPreset {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
/**
|
|
43
|
-
*
|
|
44
|
+
* The 0.x values of DateRangePicker's `commit`, when it was the panel's mode:
|
|
45
|
+
* `"immediate"` is `apply` left out, `"apply"` is `apply`. See
|
|
46
|
+
* {@link DateRangePickerProps.apply}.
|
|
44
47
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* answer.
|
|
49
|
-
* - `"apply"`: the panel works on a DRAFT. A preset ARMS the calendar instead of
|
|
50
|
-
* committing, days can then be nudged ("last 3 months, but end it last Friday"),
|
|
51
|
-
* and nothing reaches `onChange` until Apply — which stays disabled until both ends
|
|
52
|
-
* exist. Cancel, Escape and an outside click discard the draft, and every open
|
|
53
|
-
* starts again from the committed value. keksdose's report range asked for exactly
|
|
54
|
-
* this: each commit there re-runs a whole page of charts, so an intermediate state
|
|
55
|
-
* must never escape the panel.
|
|
48
|
+
* @deprecated 0.52 — DateRangePicker's `apply` (`commit="apply"` → `apply`, `"immediate"`
|
|
49
|
+
* → nothing); removed in 0.53. `commit` is the write lock's opt-in on every other kit
|
|
50
|
+
* control, and since 0.52 on this one too (refactor audit 2026-10-30, API-3).
|
|
56
51
|
*/
|
|
57
52
|
export type DateRangeCommit = "immediate" | "apply";
|
|
58
53
|
|
|
@@ -65,8 +60,9 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
|
|
|
65
60
|
onChange: (from: string, to: string, presetId?: string) => void;
|
|
66
61
|
/** Separator between the two formatted dates in the trigger (default " – "). */
|
|
67
62
|
separator?: string;
|
|
68
|
-
/** Optional named ranges rendered as a start-side column (last month / YTD / …).
|
|
69
|
-
|
|
63
|
+
/** Optional named ranges rendered as a start-side column (last month / YTD / …).
|
|
64
|
+
* `readonly` since 0.52 (API-7): the picker never changes the list. */
|
|
65
|
+
presets?: readonly DateRangePickerPreset[];
|
|
70
66
|
/**
|
|
71
67
|
* The active preset's `id`, controlled — e.g. straight from keksdose's `?preset=`.
|
|
72
68
|
* `null` (or an id no preset has, such as `"custom"`) says "no preset": nothing in
|
|
@@ -77,8 +73,39 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
|
|
|
77
73
|
* itself; with no memory at all it falls back to the first preset whose dates match.
|
|
78
74
|
*/
|
|
79
75
|
preset?: string | null;
|
|
80
|
-
/**
|
|
81
|
-
|
|
76
|
+
/**
|
|
77
|
+
* When the picker hands its range to `onChange`.
|
|
78
|
+
*
|
|
79
|
+
* - Left out (the default, and all of 0.7): a preset click commits and closes, and
|
|
80
|
+
* each calendar click is reported as it happens — the half-made `(from, "")`
|
|
81
|
+
* included. The right shape for quick ranges on a filter, where one click is one
|
|
82
|
+
* answer.
|
|
83
|
+
* - `apply`: the panel works on a DRAFT. A preset ARMS the calendar instead of
|
|
84
|
+
* committing, days can then be nudged ("last 3 months, but end it last Friday"),
|
|
85
|
+
* and nothing reaches `onChange` until Apply — which stays disabled until both ends
|
|
86
|
+
* exist. Cancel, Escape and an outside click discard the draft, and every open
|
|
87
|
+
* starts again from the committed value. keksdose's report range asked for exactly
|
|
88
|
+
* this: each commit there re-runs a whole page of charts, so an intermediate state
|
|
89
|
+
* must never escape the panel.
|
|
90
|
+
*
|
|
91
|
+
* `commit="apply"` until 0.52 (refactor audit 2026-10-30, API-3): `commit` is the write
|
|
92
|
+
* lock's prop on every other kit control. The old spelling still works for 0.52 and
|
|
93
|
+
* goes in 0.53 ({@link DateRangeCommit}); `apply` wins where both are given.
|
|
94
|
+
*/
|
|
95
|
+
apply?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* This picker COMMITS — picking a range saves it (a report's period kept per user, a
|
|
98
|
+
* filter persisted as it moves). Under a locked {@link WriteLockProvider} it is locked
|
|
99
|
+
* the `disabledReason` way, with the lock's reason; a {@link CommitScope}, as on every
|
|
100
|
+
* kit control since 0.33, and on this one since 0.52 (API-3). A range inside a form with
|
|
101
|
+
* its own Save stays editable under the lock — leave this off there.
|
|
102
|
+
*
|
|
103
|
+
* The strings `"immediate"` and `"apply"` are the panel's mode, the 0.x meaning of this
|
|
104
|
+
* prop: deprecated, read as `apply` for one minor, removed in 0.53 — see
|
|
105
|
+
* {@link DateRangeCommit}. They cannot be taken for a scope, which is a boolean or an
|
|
106
|
+
* object.
|
|
107
|
+
*/
|
|
108
|
+
commit?: CommitScope | DateRangeCommit;
|
|
82
109
|
/**
|
|
83
110
|
* Draw the trigger yourself. keksdose's report range field
|
|
84
111
|
* (reports/report-range-field.tsx, "Why this is app-level") is why: its trigger
|
|
@@ -103,7 +130,7 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
|
|
|
103
130
|
*/
|
|
104
131
|
sheetBackCloses?: boolean;
|
|
105
132
|
/**
|
|
106
|
-
* With `
|
|
133
|
+
* With `apply`: a line above the calendar saying what Apply would commit —
|
|
107
134
|
* keksdose's report range writes "Custom · 1 Mar 2026 – …" there
|
|
108
135
|
* (report-range-field.tsx), the one place a preset armed and then nudged by a day is
|
|
109
136
|
* seen to have become "Custom", and a half-made range to still lack its end. Called
|
|
@@ -112,7 +139,7 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
|
|
|
112
139
|
* `""` until the second click. The line is a polite live region, so a screen reader
|
|
113
140
|
* hears the draft change as the calendar is used.
|
|
114
141
|
*
|
|
115
|
-
* Ignored
|
|
142
|
+
* Ignored without `apply`, where there is no draft: every click is the value.
|
|
116
143
|
*/
|
|
117
144
|
renderDraftSummary?: (draft: DateRangeDraftSummary) => ReactNode;
|
|
118
145
|
}
|
|
@@ -218,8 +245,8 @@ function PresetColumn({
|
|
|
218
245
|
}
|
|
219
246
|
|
|
220
247
|
/**
|
|
221
|
-
* The panel's body. A component of its own so `
|
|
222
|
-
*
|
|
248
|
+
* The panel's body. A component of its own so `apply` can keep its draft in state that
|
|
249
|
+
* is born when the panel opens: `Popover` unmounts its children on close,
|
|
223
250
|
* so the draft is re-seeded from the committed value on every open, and an abandoned
|
|
224
251
|
* half-selection cannot survive into the next one.
|
|
225
252
|
*/
|
|
@@ -229,7 +256,7 @@ function RangePanel({
|
|
|
229
256
|
presets,
|
|
230
257
|
activeId,
|
|
231
258
|
controlled,
|
|
232
|
-
|
|
259
|
+
drafting,
|
|
233
260
|
close,
|
|
234
261
|
frame,
|
|
235
262
|
sheet,
|
|
@@ -243,7 +270,8 @@ function RangePanel({
|
|
|
243
270
|
presets: readonly DateRangePickerPreset[] | undefined;
|
|
244
271
|
activeId: string | null | undefined;
|
|
245
272
|
controlled: boolean;
|
|
246
|
-
|
|
273
|
+
/** `apply`: the panel works on a draft. */
|
|
274
|
+
drafting: boolean;
|
|
247
275
|
close: () => void;
|
|
248
276
|
/** Where the body and the Apply row go — see `PanelFrame`. */
|
|
249
277
|
frame: PanelFrame;
|
|
@@ -253,7 +281,6 @@ function RangePanel({
|
|
|
253
281
|
labels: DatePickerLabels;
|
|
254
282
|
renderDraftSummary?: DateRangePickerProps["renderDraftSummary"];
|
|
255
283
|
}) {
|
|
256
|
-
const drafting = commit === "apply";
|
|
257
284
|
const [draft, setDraft] = useState<RangeDraft>({
|
|
258
285
|
from,
|
|
259
286
|
to,
|
|
@@ -360,8 +387,8 @@ function RangePanel({
|
|
|
360
387
|
}
|
|
361
388
|
|
|
362
389
|
/** Two-date range picker: click a start then an end; closes once both are set.
|
|
363
|
-
* With `presets`, a column of named ranges is shown beside the calendar; with
|
|
364
|
-
*
|
|
390
|
+
* With `presets`, a column of named ranges is shown beside the calendar; with `apply`
|
|
391
|
+
* the panel drafts and commits on Apply (see {@link DateRangePickerProps.apply}). */
|
|
365
392
|
export function DateRangePicker(props: DateRangePickerProps) {
|
|
366
393
|
const {
|
|
367
394
|
from,
|
|
@@ -376,7 +403,8 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
376
403
|
separator = " – ",
|
|
377
404
|
presets,
|
|
378
405
|
preset,
|
|
379
|
-
|
|
406
|
+
apply,
|
|
407
|
+
commit,
|
|
380
408
|
renderTrigger,
|
|
381
409
|
sheetBackCloses,
|
|
382
410
|
renderDraftSummary,
|
|
@@ -386,10 +414,13 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
386
414
|
clearable,
|
|
387
415
|
clearLabel,
|
|
388
416
|
disabled,
|
|
417
|
+
disabledReason,
|
|
418
|
+
disabledReasonDisplay,
|
|
389
419
|
invalid,
|
|
390
420
|
hint,
|
|
391
421
|
help,
|
|
392
422
|
error,
|
|
423
|
+
className,
|
|
393
424
|
// The trigger's (API-3).
|
|
394
425
|
ref,
|
|
395
426
|
...rest
|
|
@@ -397,6 +428,11 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
397
428
|
const locale = useKitLocale(localeProp);
|
|
398
429
|
const text = useDatePickerLabels(clearLabel, undefined, undefined);
|
|
399
430
|
const render = useTriggerFormat("dateRangePicker", locale, formatOptions, formatValue);
|
|
431
|
+
// `commit` is two props until 0.53: a string is the deprecated mode, anything else
|
|
432
|
+
// the write lock's scope (API-3).
|
|
433
|
+
const drafting = apply ?? commit === "apply";
|
|
434
|
+
const lock = useLockReason(typeof commit === "string" ? undefined : commit, disabledReason);
|
|
435
|
+
const locked = lock.locked;
|
|
400
436
|
const messages = useFieldMessages({
|
|
401
437
|
hint,
|
|
402
438
|
help,
|
|
@@ -405,6 +441,8 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
405
441
|
invalid,
|
|
406
442
|
describedBy: rest["aria-describedby"],
|
|
407
443
|
ariaInvalid: rest["aria-invalid"],
|
|
444
|
+
// A lock's reason between the caption and the error, as on Select.
|
|
445
|
+
reasonId: locked && lock.reasonId,
|
|
408
446
|
});
|
|
409
447
|
// The preset this picker committed itself, for a caller that does not control
|
|
410
448
|
// `preset`. Cleared by a hand-picked range or a clear.
|
|
@@ -417,6 +455,7 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
417
455
|
const hasPresets = Boolean(presets && presets.length > 0);
|
|
418
456
|
const sheet = usePhoneLayout();
|
|
419
457
|
const commitRange = (f: string, t: string, presetId: string | undefined) => {
|
|
458
|
+
if (locked) return;
|
|
420
459
|
setOwnPreset(presetId);
|
|
421
460
|
// Two arguments when no preset is involved — exactly the 0.7 call, so a caller's
|
|
422
461
|
// `toHaveBeenCalledWith(from, to)` and a variadic handler see no difference.
|
|
@@ -434,6 +473,9 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
434
473
|
clearLabel={text.clear}
|
|
435
474
|
panelLabel={text.rangePanel}
|
|
436
475
|
disabled={disabled}
|
|
476
|
+
locked={locked}
|
|
477
|
+
// Locked, the caller's classes are the reason's frame's (below).
|
|
478
|
+
className={locked ? undefined : className}
|
|
437
479
|
invalid={messages.isInvalid}
|
|
438
480
|
// Widen so the preset column sits beside the calendar (default otherwise).
|
|
439
481
|
width={hasPresets ? "27.5rem" : undefined}
|
|
@@ -463,7 +505,7 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
463
505
|
presets={presets}
|
|
464
506
|
activeId={activeId}
|
|
465
507
|
controlled={controlled}
|
|
466
|
-
|
|
508
|
+
drafting={drafting}
|
|
467
509
|
close={close}
|
|
468
510
|
frame={frame}
|
|
469
511
|
sheet={sheet}
|
|
@@ -475,9 +517,18 @@ export function DateRangePicker(props: DateRangePickerProps) {
|
|
|
475
517
|
)}
|
|
476
518
|
</DateField>
|
|
477
519
|
);
|
|
520
|
+
const box = withEndHint(field, label === undefined ? messages.labelHint : undefined);
|
|
478
521
|
return (
|
|
479
522
|
<FieldBox below={messages.below} reserve={"error" in props || "hint" in props}>
|
|
480
|
-
{
|
|
523
|
+
{locked ? (
|
|
524
|
+
// DatePicker's frame: the line under the field, or the Tooltip with a hidden copy
|
|
525
|
+
// for `aria-describedby`; the outermost box, so it takes the caller's classes.
|
|
526
|
+
<LockedReason lock={lock} display={disabledReasonDisplay} className={cn("block", className)}>
|
|
527
|
+
{box}
|
|
528
|
+
</LockedReason>
|
|
529
|
+
) : (
|
|
530
|
+
box
|
|
531
|
+
)}
|
|
481
532
|
</FieldBox>
|
|
482
533
|
);
|
|
483
534
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component } from "react";
|
|
1
|
+
import { Component, useEffect } from "react";
|
|
2
2
|
import type { ErrorInfo, ReactNode } from "react";
|
|
3
3
|
import { AlertTriangle, RefreshCw, WifiOff } from "lucide-react";
|
|
4
4
|
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
@@ -7,6 +7,7 @@ import { EmptyState } from "./empty-state";
|
|
|
7
7
|
import { CopyButton } from "./copy-button";
|
|
8
8
|
import { Disclosure } from "./disclosure";
|
|
9
9
|
import { documentNavigation } from "../lib/document-navigation";
|
|
10
|
+
import { useAnnounce } from "../hooks/use-announce";
|
|
10
11
|
import { DEFAULT_ERROR_BOUNDARY_LABELS } from "./error-boundary-labels";
|
|
11
12
|
|
|
12
13
|
/** The words of the default fallback. */
|
|
@@ -605,6 +606,17 @@ function ErrorFallback({
|
|
|
605
606
|
const reportText = report ? formatCrashReport(report) : null;
|
|
606
607
|
const errorLine = details.message ? `${details.name}: ${details.message}` : details.name;
|
|
607
608
|
|
|
609
|
+
// The title and the hint, said once through an assertive region of their own (0.52,
|
|
610
|
+
// refactor audit 2026-10-30, DSP-17). `role="alert"` on the whole box put the actions
|
|
611
|
+
// in it, so each later insertion was read out as news: "Copy error report" and
|
|
612
|
+
// "Details" on `componentDidCatch`'s second render, "Reported as …", and on opening
|
|
613
|
+
// Details both stacks of the crash report. EmptyState has no wrapper for title and
|
|
614
|
+
// hint alone, and a region mounted with its message is often missed anyway.
|
|
615
|
+
const alert = useAnnounce({ politeness: "assertive" });
|
|
616
|
+
const { announce } = alert;
|
|
617
|
+
const spoken = `${title}. ${hint}`;
|
|
618
|
+
useEffect(() => announce(spoken), [announce, spoken]);
|
|
619
|
+
|
|
608
620
|
const reloadButton = (
|
|
609
621
|
<Button key="reload" variant={mode === "error" ? "secondary" : "default"} onClick={reloadPage}>
|
|
610
622
|
{text.reload}
|
|
@@ -619,43 +631,45 @@ function ErrorFallback({
|
|
|
619
631
|
);
|
|
620
632
|
|
|
621
633
|
return (
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
<
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
634
|
+
<>
|
|
635
|
+
<span {...alert.regionProps} />
|
|
636
|
+
<EmptyState
|
|
637
|
+
tone={mode === "error" ? "danger" : undefined}
|
|
638
|
+
headingAs={headingAs}
|
|
639
|
+
className={className}
|
|
640
|
+
icon={<Icon />}
|
|
641
|
+
title={title}
|
|
642
|
+
hint={hint}
|
|
643
|
+
action={
|
|
644
|
+
<>
|
|
645
|
+
{showMessage && mode === "error" && (
|
|
646
|
+
// A quotation, not prose: left-aligned and monospaced, so it reads as the
|
|
647
|
+
// program's words and can be read out or screenshotted verbatim.
|
|
648
|
+
<p
|
|
649
|
+
data-error-message=""
|
|
650
|
+
className="-mt-1 mb-1 basis-full whitespace-pre-wrap break-words rounded-md border border-danger-strong bg-danger-soft px-3 py-2 text-start font-mono text-xs text-primary"
|
|
651
|
+
>
|
|
652
|
+
{errorLine}
|
|
653
|
+
</p>
|
|
654
|
+
)}
|
|
655
|
+
{filing === "filed" && (
|
|
656
|
+
<p className="-mt-1 mb-1 basis-full text-xs">{reference ? text.reportedAs(reference) : text.reported}</p>
|
|
657
|
+
)}
|
|
658
|
+
{mode === "error" ? [retryButton, reloadButton] : [reloadButton, retryButton]}
|
|
659
|
+
{copyReport && reportText !== null && filing !== "filed" && (
|
|
660
|
+
<CopyButton variant="label" buttonVariant="ghost" label={text.copyReport} text={reportText} />
|
|
661
|
+
)}
|
|
662
|
+
{actions}
|
|
663
|
+
{showDetails && reportText !== null && (
|
|
664
|
+
<Disclosure variant="bare" title={text.details} className="basis-full text-start">
|
|
665
|
+
<pre className="max-h-60 overflow-auto whitespace-pre-wrap break-words text-xs text-secondary">
|
|
666
|
+
{reportText}
|
|
667
|
+
</pre>
|
|
668
|
+
</Disclosure>
|
|
669
|
+
)}
|
|
670
|
+
</>
|
|
671
|
+
}
|
|
672
|
+
/>
|
|
673
|
+
</>
|
|
660
674
|
);
|
|
661
675
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// The English words of ./field-base, in a module with no component code: the English
|
|
2
|
+
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
|
+
// chunk like the other languages (0.34, KS U8). ./field-base re-exports them.
|
|
4
|
+
//
|
|
5
|
+
// Until 0.52 they shared ui-labels.ts with the tabs' words, named after the ui.tsx that
|
|
6
|
+
// 0.34 split up (MOD-7, refactor audit 2026-10-30): one labels module per component now,
|
|
7
|
+
// as every other `*-labels.ts` is.
|
|
8
|
+
|
|
9
|
+
import type { CharacterCountLabels, PasswordRevealLabels } from "./field-base";
|
|
10
|
+
|
|
11
|
+
export const DEFAULT_PASSWORD_REVEAL_LABELS: PasswordRevealLabels = {
|
|
12
|
+
show: "Show password",
|
|
13
|
+
hide: "Hide password",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const DEFAULT_CHARACTER_COUNT_LABELS: CharacterCountLabels = {
|
|
17
|
+
count: (used, max) => `${used} of ${max} characters`,
|
|
18
|
+
remaining: (left) => (left === 1 ? "1 character left" : `${left} characters left`),
|
|
19
|
+
limitReached: "Character limit reached",
|
|
20
|
+
};
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
STATIC_LABEL_TYPE,
|
|
12
12
|
type FieldHintParts,
|
|
13
13
|
} from "./field-parts";
|
|
14
|
-
import { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from "./
|
|
14
|
+
import { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from "./field-base-labels";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* The field base: what Input, Select and Textarea — and every kit field built on the same
|
|
@@ -20,7 +20,8 @@ import { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from "
|
|
|
20
20
|
* reveal and the character counter. The message under a wrong field is field-parts'
|
|
21
21
|
* `useFieldError`, every field's.
|
|
22
22
|
*
|
|
23
|
-
* Public through
|
|
23
|
+
* Public through the barrel (src/index.ts) by name. `FieldGroup`, the counter and the
|
|
24
|
+
* placeholder helpers are
|
|
24
25
|
* the three fields' shared parts (`@internal`), as are the Select's own classes and its
|
|
25
26
|
* `SelectWidthFloor` (0.51).
|
|
26
27
|
*/
|
|
@@ -47,7 +48,12 @@ export const FIELD_BASE =
|
|
|
47
48
|
// doubles the line inward — FIELD_INVALID's border-plus-ring (live #295), and the
|
|
48
49
|
// DatePicker stepper's fix (0.34) — so every side keeps one fully covered device
|
|
49
50
|
// pixel. Inset: nothing outside the field moves or is covered.
|
|
50
|
-
|
|
51
|
+
//
|
|
52
|
+
// Under More contrast the ring is 2px, so the line is 3px — what `--focus-ring-width`
|
|
53
|
+
// gives every `FOCUS_RING` there, and what `appearance.contrastHelp` promises ("thickens
|
|
54
|
+
// focus frames"); before 0.52 a text field kept its 2px (refactor audit 2026-10-30,
|
|
55
|
+
// DOC-2). Still inset, so nothing moves.
|
|
56
|
+
"focus:ring-1 contrast:focus:ring-2 focus:ring-inset focus:ring-brand " +
|
|
51
57
|
// §10.1: at least 16 px on a touch screen, or iOS zooms the page on focus.
|
|
52
58
|
FIELD_TOUCH_TEXT +
|
|
53
59
|
" " +
|
|
@@ -106,9 +112,9 @@ export const FIELD_FLOATING_PAD = "pt-4 pb-1 large:py-2";
|
|
|
106
112
|
//
|
|
107
113
|
// A ring rather than `border-2`: a box-shadow adds no layout, so an invalid field
|
|
108
114
|
// stays exactly the size of a valid one and nothing beside it moves when the value
|
|
109
|
-
// arrives.
|
|
115
|
+
// arrives. Under More contrast the ring is 2px, as FIELD_BASE's focus line (0.52, DOC-2).
|
|
110
116
|
export const FIELD_INVALID =
|
|
111
|
-
"border-danger-strong ring-1 ring-danger-strong focus:border-[var(--danger)] focus:ring-[var(--danger)]";
|
|
117
|
+
"border-danger-strong ring-1 contrast:ring-2 ring-danger-strong focus:border-[var(--danger)] focus:ring-[var(--danger)]";
|
|
112
118
|
|
|
113
119
|
export const FLOATING_INPUT_CLASS = cn(FIELD_BASE, FIELD_FLOATING_PAD, "peer placeholder:text-transparent");
|
|
114
120
|
|
|
@@ -504,7 +510,7 @@ export interface PasswordRevealLabels {
|
|
|
504
510
|
hide: string;
|
|
505
511
|
}
|
|
506
512
|
|
|
507
|
-
// Defined in ./
|
|
513
|
+
// Defined in ./field-base-labels, which holds no component code (0.34, KS U8).
|
|
508
514
|
export { DEFAULT_PASSWORD_REVEAL_LABELS };
|
|
509
515
|
|
|
510
516
|
/**
|
|
@@ -523,7 +529,7 @@ export interface CharacterCountLabels {
|
|
|
523
529
|
limitReached: string;
|
|
524
530
|
}
|
|
525
531
|
|
|
526
|
-
// Defined in ./
|
|
532
|
+
// Defined in ./field-base-labels, which holds no component code (0.34, KS U8).
|
|
527
533
|
export { DEFAULT_CHARACTER_COUNT_LABELS };
|
|
528
534
|
|
|
529
535
|
/** The length the browser's own `maxLength` counts — UTF-16 code units — so the counter
|
|
@@ -23,9 +23,17 @@ import { DEFAULT_FIELD_SYNC_LABELS } from "./field-sync-labels";
|
|
|
23
23
|
* because the state is useful without the dot — a form can disable its submit
|
|
24
24
|
* button while any field is `pending`, and a router can block navigation while
|
|
25
25
|
* any field is `edited`.
|
|
26
|
+
*
|
|
27
|
+
* Deprecated in 0.52 as a whole, removed in 0.53 (decision 4 of the refactor audit
|
|
28
|
+
* 2026-10-30, MOD-5): no app renders it or calls the hook — 483 lines and a namespace in
|
|
29
|
+
* seven catalogues that only this package's tests and showcase read. An app that wants
|
|
30
|
+
* it keeps a copy of this file.
|
|
31
|
+
*
|
|
32
|
+
* @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
|
|
26
33
|
*/
|
|
27
34
|
export type FieldSyncState = "synced" | "edited" | "pending" | "error";
|
|
28
35
|
|
|
36
|
+
/** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
|
|
29
37
|
export interface FieldSyncLabels {
|
|
30
38
|
synced: string;
|
|
31
39
|
edited: string;
|
|
@@ -38,6 +46,7 @@ export interface FieldSyncLabels {
|
|
|
38
46
|
// Defined in ./field-sync-labels, which holds no component code (0.34, KS U8).
|
|
39
47
|
export { DEFAULT_FIELD_SYNC_LABELS };
|
|
40
48
|
|
|
49
|
+
/** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
|
|
41
50
|
export interface UseFieldSyncOptions<T> {
|
|
42
51
|
/** What the database currently holds. Changing it re-seeds a CLEAN field. */
|
|
43
52
|
value: T;
|
|
@@ -57,6 +66,7 @@ export interface UseFieldSyncOptions<T> {
|
|
|
57
66
|
onError?: (error: Error) => void;
|
|
58
67
|
}
|
|
59
68
|
|
|
69
|
+
/** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
|
|
60
70
|
export interface UseFieldSyncReturn<T> {
|
|
61
71
|
/** The draft — bind this to the input, not the `value` option. */
|
|
62
72
|
value: T;
|
|
@@ -101,6 +111,8 @@ function toError(cause: unknown): Error {
|
|
|
101
111
|
* may be gone — a row scrolled out of a virtualised table, a closed dialog.
|
|
102
112
|
* 4. **`onSave` is read through a ref**, so an inline arrow — which every call
|
|
103
113
|
* site will pass — does not restart the debounce on every render.
|
|
114
|
+
*
|
|
115
|
+
* @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
|
|
104
116
|
*/
|
|
105
117
|
export function useFieldSync<T>({
|
|
106
118
|
value,
|
|
@@ -240,6 +252,7 @@ const STATE_STYLE: Record<FieldSyncState, { color: string; Icon: typeof Check }>
|
|
|
240
252
|
error: { color: "var(--status-error)", Icon: AlertCircle },
|
|
241
253
|
};
|
|
242
254
|
|
|
255
|
+
/** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
|
|
243
256
|
export interface FieldSyncIndicatorProps {
|
|
244
257
|
state: FieldSyncState;
|
|
245
258
|
/** The failure. Its message becomes the tooltip when `state === "error"`. */
|
|
@@ -269,6 +282,8 @@ export interface FieldSyncIndicatorProps {
|
|
|
269
282
|
* The state is also announced: the wrapper is a polite live region, so a screen
|
|
270
283
|
* reader hears "Saving…" then "Saved" without the user going looking. `error` is
|
|
271
284
|
* assertive instead — a failed write is worth interrupting for.
|
|
285
|
+
*
|
|
286
|
+
* @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
|
|
272
287
|
*/
|
|
273
288
|
export function FieldSyncIndicator({
|
|
274
289
|
state,
|
|
@@ -340,6 +355,8 @@ export function FieldSyncIndicator({
|
|
|
340
355
|
* colour does not.
|
|
341
356
|
*
|
|
342
357
|
* Every class is a literal so Tailwind's scanner can see it.
|
|
358
|
+
*
|
|
359
|
+
* @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
|
|
343
360
|
*/
|
|
344
361
|
export const FIELD_SYNC_FRAME: Record<FieldSyncState, string> = {
|
|
345
362
|
synced:
|
|
@@ -352,9 +369,12 @@ export const FIELD_SYNC_FRAME: Record<FieldSyncState, string> = {
|
|
|
352
369
|
"[&_:is(input,select,textarea)]:border-[var(--status-error)] [&_:is(input,select,textarea)]:ring-1 [&_:is(input,select,textarea)]:ring-[var(--status-error)] [&_:is(input,select,textarea):focus]:border-[var(--status-error)] [&_:is(input,select,textarea):focus]:ring-[var(--status-error)]",
|
|
353
370
|
};
|
|
354
371
|
|
|
355
|
-
/** How long the green "saved" frame and check stay after a save lands, in ms.
|
|
372
|
+
/** How long the green "saved" frame and check stay after a save lands, in ms.
|
|
373
|
+
*
|
|
374
|
+
* @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
|
|
356
375
|
export const FIELD_SYNC_SAVED_MS = 1500;
|
|
357
376
|
|
|
377
|
+
/** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
|
|
358
378
|
export interface FieldSyncRowProps<T> extends Omit<FieldSyncIndicatorProps, "state" | "error" | "showLabel"> {
|
|
359
379
|
sync: UseFieldSyncReturn<T>;
|
|
360
380
|
children: ReactNode;
|
|
@@ -386,6 +406,8 @@ export interface FieldSyncRowProps<T> extends Omit<FieldSyncIndicatorProps, "sta
|
|
|
386
406
|
* always in the DOM as a live region — polite for the ordinary states, assertive for
|
|
387
407
|
* a failure. The input gets end padding for the icon whether or not one is showing,
|
|
388
408
|
* so the text never reflows when the state changes.
|
|
409
|
+
*
|
|
410
|
+
* @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
|
|
389
411
|
*/
|
|
390
412
|
export function FieldSyncRow<T>({
|
|
391
413
|
sync,
|
|
@@ -5,7 +5,9 @@ import { cn } from "../lib/cn";
|
|
|
5
5
|
import { useKitLabels } from "../i18n/kit-labels";
|
|
6
6
|
import { useBreakpoint, usePhoneLayout } from "../hooks/use-breakpoint";
|
|
7
7
|
import { useLargeText } from "../hooks/use-large-text";
|
|
8
|
-
import { isApplePlatform } from "../hooks/use-hotkey";
|
|
8
|
+
import { isApplePlatform, matchesHotkey, type ParsedHotkey } from "../hooks/use-hotkey";
|
|
9
|
+
import { isComposing } from "../lib/ime";
|
|
10
|
+
import { hasContent } from "../lib/presence";
|
|
9
11
|
import { Button, type ButtonProps } from "./button";
|
|
10
12
|
import { Spinner } from "./spinner";
|
|
11
13
|
import type { ButtonSize, ButtonVariant } from "./button-look";
|
|
@@ -337,6 +339,17 @@ function shortcutScope(row: HTMLElement | null, formId: string | undefined): Ele
|
|
|
337
339
|
return row.closest("form") ?? row.closest('[role="dialog"]') ?? row.parentElement;
|
|
338
340
|
}
|
|
339
341
|
|
|
342
|
+
/**
|
|
343
|
+
* What {@link FormActionsProps.submitShortcut} answers, on every platform: Ctrl+Enter and
|
|
344
|
+
* Cmd+Enter with nothing else held, read by `matchesHotkey` as every kit shortcut is
|
|
345
|
+
* (refactor audit 2026-10-30, DUP-12). Literals, not `parseHotkey` calls: no module-scope
|
|
346
|
+
* call for a bundler to keep.
|
|
347
|
+
*/
|
|
348
|
+
const SUBMIT_CHORDS: readonly ParsedHotkey[] = [
|
|
349
|
+
{ ctrl: true, meta: false, shift: false, alt: false, key: "Enter" },
|
|
350
|
+
{ ctrl: false, meta: true, shift: false, alt: false, key: "Enter" },
|
|
351
|
+
];
|
|
352
|
+
|
|
340
353
|
function isDestructiveData(value: unknown): value is FormActionsDestructive {
|
|
341
354
|
return typeof value === "object" && value !== null && !isValidElement(value) && "onClick" in value;
|
|
342
355
|
}
|
|
@@ -429,8 +442,9 @@ export function FormActions({
|
|
|
429
442
|
useEffect(() => {
|
|
430
443
|
if (submitShortcut !== "mod-enter") return;
|
|
431
444
|
const onKeyDown = (e: KeyboardEvent) => {
|
|
432
|
-
if (
|
|
433
|
-
|
|
445
|
+
if (!SUBMIT_CHORDS.some((chord) => matchesHotkey(e, chord))) return;
|
|
446
|
+
// `isComposing` is lib/ime's: Safari's composition-ending Enter (keyCode 229) too.
|
|
447
|
+
if (e.repeat || isComposing(e) || e.defaultPrevented || !canSaveRef.current) return;
|
|
434
448
|
const scope = shortcutScope(rootRef.current, form);
|
|
435
449
|
if (!scope || !(e.target instanceof Node) || !scope.contains(e.target)) return;
|
|
436
450
|
e.preventDefault();
|
|
@@ -442,8 +456,9 @@ export function FormActions({
|
|
|
442
456
|
const apple = submitShortcut ? isApplePlatform() : false;
|
|
443
457
|
const placement = useResolvedPlacement(placementProp);
|
|
444
458
|
const bleedLength = bleed === undefined || bleed === "" ? undefined : cssLength(bleed);
|
|
445
|
-
|
|
446
|
-
const
|
|
459
|
+
// `hasContent` (DUP-14): an empty string is no slot either, not an empty `me-auto` box.
|
|
460
|
+
const hasDestructive = isDestructiveData(destructive) || hasContent(destructive);
|
|
461
|
+
const hasStart = hasContent(startSlot);
|
|
447
462
|
const justify = align ?? (hasDestructive || hasStart ? "between" : "end");
|
|
448
463
|
const destructiveNode = !hasDestructive ? null : isDestructiveData(destructive) ? (
|
|
449
464
|
<Button
|