@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
|
@@ -4,6 +4,7 @@ import { Calendar, ChevronDown, ChevronLeft, ChevronRight } from "lucide-react";
|
|
|
4
4
|
import { cn } from "../lib/cn";
|
|
5
5
|
import { dirOf, horizontalStep, type Direction } from "../lib/direction";
|
|
6
6
|
import { monthKey, pad } from "../lib/dates";
|
|
7
|
+
import { upperFirst } from "../lib/text-case";
|
|
7
8
|
import { Button } from "./button";
|
|
8
9
|
import { FIELD_FLOATING_PAD, FIELD_INVALID, FIELD_TRIGGER } from "./field-base";
|
|
9
10
|
import { IconButton } from "./icon-button";
|
|
@@ -17,11 +18,17 @@ import {
|
|
|
17
18
|
FieldBox,
|
|
18
19
|
FieldLabelLine,
|
|
19
20
|
LABEL_ABOVE_BOX,
|
|
21
|
+
LockedReason,
|
|
22
|
+
mergeDescribedBy,
|
|
20
23
|
mergeRefs,
|
|
21
24
|
useFieldMessages,
|
|
25
|
+
useLockReason,
|
|
26
|
+
type DisabledReasonDisplay,
|
|
22
27
|
type FieldHelpProps,
|
|
23
28
|
} from "./field-parts";
|
|
29
|
+
import { MonthGrid, clampKey, shiftKey, yearArrowsBlocked } from "./month-grid";
|
|
24
30
|
import { DEFAULT_MONTH_PICKER_LABELS } from "./month-picker-labels";
|
|
31
|
+
import type { CommitScope } from "./write-lock";
|
|
25
32
|
|
|
26
33
|
/**
|
|
27
34
|
* Every string the month picker can speak. The month and year names are NOT here —
|
|
@@ -89,8 +96,9 @@ export interface MonthPickerProps extends Omit<ComponentPropsWithoutRef<"div">,
|
|
|
89
96
|
/**
|
|
90
97
|
* Inclusive bounds, as `"YYYY-MM"`. A full ISO date (`"YYYY-MM-DD"`) is accepted and
|
|
91
98
|
* read as its month, so a host holding "the first day we have data for" can pass it
|
|
92
|
-
* straight in. Months outside are shown but refuse selection; a year arrow
|
|
93
|
-
*
|
|
99
|
+
* straight in. Months outside are shown but refuse selection; a year arrow refuses
|
|
100
|
+
* once the whole year beyond it is out of bounds (`aria-disabled`, so the focus stays
|
|
101
|
+
* on the arrow just pressed — 0.52).
|
|
94
102
|
*/
|
|
95
103
|
min?: string;
|
|
96
104
|
max?: string;
|
|
@@ -99,6 +107,26 @@ export interface MonthPickerProps extends Omit<ComponentPropsWithoutRef<"div">,
|
|
|
99
107
|
/** Trigger text when `value` is `""`. */
|
|
100
108
|
placeholder?: string;
|
|
101
109
|
disabled?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Why the month cannot be changed — {@link Select}'s `disabledReason`, for a picker
|
|
112
|
+
* that SAVES on change (a budget page's month, a calendar view kept per user). The
|
|
113
|
+
* trigger stays focusable and `aria-disabled`, the grid does not open, the stepper's
|
|
114
|
+
* Today and ‹ › refuse, and `onChange` never fires; the reason is a line under the
|
|
115
|
+
* field (or the stepper) at Large and on a touch screen, else in the kit
|
|
116
|
+
* {@link Tooltip} (`disabledReasonDisplay`), and on the trigger's `aria-describedby`.
|
|
117
|
+
* Wins over `disabled`. 0.52 (refactor audit 2026-10-30, API-3).
|
|
118
|
+
*/
|
|
119
|
+
disabledReason?: ReactNode;
|
|
120
|
+
/** Where the reason shows — {@link Button}'s `disabledReasonDisplay`: a line under the
|
|
121
|
+
* field at Large and on a touch screen by default, the tooltip otherwise. */
|
|
122
|
+
disabledReasonDisplay?: DisabledReasonDisplay;
|
|
123
|
+
/**
|
|
124
|
+
* This picker COMMITS — picking saves. Under a locked {@link WriteLockProvider} it is
|
|
125
|
+
* locked the `disabledReason` way, with the lock's reason; a {@link CommitScope}, as on
|
|
126
|
+
* every kit control. A month field inside a form with its own Save stays editable
|
|
127
|
+
* under the lock — leave this off there, and put `commit` on the Save. 0.52 (API-3).
|
|
128
|
+
*/
|
|
129
|
+
commit?: CommitScope;
|
|
102
130
|
/** Required and unanswered — {@link FIELD_INVALID}. See {@link Input}'s `invalid`. */
|
|
103
131
|
invalid?: boolean;
|
|
104
132
|
/**
|
|
@@ -217,7 +245,6 @@ function firstOf({ year, month }: YearMonth): Date {
|
|
|
217
245
|
}
|
|
218
246
|
|
|
219
247
|
const DEFAULT_TRIGGER_FORMAT: Intl.DateTimeFormatOptions = { month: "long", year: "numeric" };
|
|
220
|
-
const MONTH_NAME_FORMAT: Intl.DateTimeFormatOptions = { month: "long", year: "numeric" };
|
|
221
248
|
const YEAR_FORMAT: Intl.DateTimeFormatOptions = { year: "numeric" };
|
|
222
249
|
|
|
223
250
|
// ── Year keys ─────────────────────────────────────────────────────────────
|
|
@@ -268,6 +295,7 @@ function MonthHeadingTrigger({
|
|
|
268
295
|
text,
|
|
269
296
|
panelId,
|
|
270
297
|
disabled,
|
|
298
|
+
locked,
|
|
271
299
|
aria,
|
|
272
300
|
}: {
|
|
273
301
|
open: boolean;
|
|
@@ -277,6 +305,8 @@ function MonthHeadingTrigger({
|
|
|
277
305
|
text: string;
|
|
278
306
|
panelId: string;
|
|
279
307
|
disabled?: boolean;
|
|
308
|
+
/** The write lock: the focusable kind of disabled. */
|
|
309
|
+
locked: boolean;
|
|
280
310
|
aria: TriggerAria;
|
|
281
311
|
}) {
|
|
282
312
|
useFocusBackOnClose(open, triggerRef);
|
|
@@ -285,8 +315,11 @@ function MonthHeadingTrigger({
|
|
|
285
315
|
<button
|
|
286
316
|
ref={setTrigger}
|
|
287
317
|
type="button"
|
|
288
|
-
disabled={disabled}
|
|
289
|
-
|
|
318
|
+
disabled={locked ? undefined : disabled}
|
|
319
|
+
aria-disabled={locked || undefined}
|
|
320
|
+
onClick={() => {
|
|
321
|
+
if (!locked) toggle();
|
|
322
|
+
}}
|
|
290
323
|
aria-haspopup="dialog"
|
|
291
324
|
aria-controls={panelId}
|
|
292
325
|
aria-expanded={open}
|
|
@@ -298,7 +331,7 @@ function MonthHeadingTrigger({
|
|
|
298
331
|
"-ms-1.5 inline-flex h-9 min-w-0 items-center gap-1 rounded-md px-1.5 text-lg font-semibold text-primary transition-colors",
|
|
299
332
|
"hover:bg-hover",
|
|
300
333
|
FOCUS_RING,
|
|
301
|
-
disabled && "cursor-not-allowed opacity-50",
|
|
334
|
+
(disabled || locked) && "cursor-not-allowed opacity-50",
|
|
302
335
|
)}
|
|
303
336
|
>
|
|
304
337
|
<span aria-live="polite" className="truncate">
|
|
@@ -328,6 +361,7 @@ function MonthFieldTrigger({
|
|
|
328
361
|
padded,
|
|
329
362
|
small,
|
|
330
363
|
disabled,
|
|
364
|
+
locked,
|
|
331
365
|
invalid,
|
|
332
366
|
className,
|
|
333
367
|
aria,
|
|
@@ -347,6 +381,9 @@ function MonthFieldTrigger({
|
|
|
347
381
|
/** `size="sm"`: the 36px, content-wide toolbar trigger. */
|
|
348
382
|
small: boolean;
|
|
349
383
|
disabled?: boolean;
|
|
384
|
+
/** The write lock: the focusable kind of disabled (Button's rule — native `disabled`
|
|
385
|
+
* would take the field out of the tab order, and the reason with it). */
|
|
386
|
+
locked: boolean;
|
|
350
387
|
invalid?: boolean;
|
|
351
388
|
className?: string;
|
|
352
389
|
}) {
|
|
@@ -357,8 +394,13 @@ function MonthFieldTrigger({
|
|
|
357
394
|
<button
|
|
358
395
|
ref={setTrigger}
|
|
359
396
|
type="button"
|
|
360
|
-
disabled={disabled}
|
|
361
|
-
|
|
397
|
+
disabled={locked ? undefined : disabled}
|
|
398
|
+
aria-disabled={locked || undefined}
|
|
399
|
+
onClick={() => {
|
|
400
|
+
// Locked, the grid does not open. One open when the lock arrives closes: the
|
|
401
|
+
// field moves into the reason's frame, which remounts it, as Select's does.
|
|
402
|
+
if (!locked) toggle();
|
|
403
|
+
}}
|
|
362
404
|
role="combobox"
|
|
363
405
|
aria-haspopup="dialog"
|
|
364
406
|
aria-controls={panelId}
|
|
@@ -377,7 +419,7 @@ function MonthFieldTrigger({
|
|
|
377
419
|
// month — `py-0` with a fixed height so the box is 36px whatever the type's
|
|
378
420
|
// line height. `pe-9` stays: the calendar glyph still sits at the end.
|
|
379
421
|
small && "h-9 w-auto py-0",
|
|
380
|
-
disabled && "cursor-not-allowed opacity-50",
|
|
422
|
+
(disabled || locked) && "cursor-not-allowed opacity-50",
|
|
381
423
|
invalid && FIELD_INVALID,
|
|
382
424
|
className,
|
|
383
425
|
)}
|
|
@@ -400,19 +442,32 @@ function MonthFieldTrigger({
|
|
|
400
442
|
const COLUMNS = 3;
|
|
401
443
|
|
|
402
444
|
/**
|
|
403
|
-
*
|
|
445
|
+
* A year arrow over a grid (the month grid's ‹ › years, the year grid's pages). At a
|
|
446
|
+
* bound it refuses rather than turning `disabled`, JumpCalendar's rule (refactor audit
|
|
447
|
+
* 2026-10-30, INP-4): the press that reaches the bound is made with the focus ON the
|
|
448
|
+
* arrow, and a focused button that turns `disabled` drops the focus to <body>, mid-panel
|
|
449
|
+
* (keksdose's budget MonthPicker passes `min`). `aria-disabled`, a click that does
|
|
450
|
+
* nothing, and the look through `aria-disabled:`.
|
|
451
|
+
*/
|
|
452
|
+
const PANEL_ARROW =
|
|
453
|
+
"flex size-7 items-center justify-center rounded text-muted hover:bg-hover aria-disabled:cursor-not-allowed aria-disabled:opacity-30 aria-disabled:hover:bg-transparent";
|
|
454
|
+
|
|
455
|
+
/** The stepper's Today and ‹ › while refused: Button's look for its focusable kind of
|
|
456
|
+
* disabled — the kit's `disabled:` classes cannot match an `aria-disabled` button. The
|
|
457
|
+
* arrows, ghost IconButtons, also pin their resting fill under hover, as
|
|
458
|
+
* `disabled:hover:` does for them. */
|
|
459
|
+
const STEPPER_REFUSED = "aria-disabled:cursor-not-allowed aria-disabled:opacity-50";
|
|
460
|
+
const STEPPER_ARROW_REFUSED = `${STEPPER_REFUSED} aria-disabled:hover:bg-transparent`;
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* The panel: a year caption between ‹ › arrows, over the year's {@link MonthGrid} (4×3,
|
|
464
|
+
* its keys and its bounds — one with JumpCalendar's since 0.52, DUP-11).
|
|
404
465
|
*
|
|
405
466
|
* Mounted only while the popover is open, so every opening starts from the current
|
|
406
467
|
* value's year — a value moved from outside (a prev/next-month button beside the
|
|
407
468
|
* field) is where the grid lands, with no effect needed to snap it back.
|
|
408
|
-
*
|
|
409
|
-
* A grid in the APG sense, like `MiniCalendar`: one tab stop (the roving tabindex),
|
|
410
|
-
* the arrows walk the months — left/right by one, up/down by a row of three — and
|
|
411
|
-
* walking off either end of the year MOVES the year rather than stopping. PageUp /
|
|
412
|
-
* PageDown step a whole year. Out-of-bounds months are `aria-disabled`, not
|
|
413
|
-
* `disabled`, so the roving tab stop never falls into a hole.
|
|
414
469
|
*/
|
|
415
|
-
function
|
|
470
|
+
function MonthPanel({
|
|
416
471
|
value,
|
|
417
472
|
onPick,
|
|
418
473
|
locale,
|
|
@@ -429,97 +484,15 @@ function MonthGrid({
|
|
|
429
484
|
currentKey: string;
|
|
430
485
|
labels: MonthPickerLabels;
|
|
431
486
|
}) {
|
|
432
|
-
const
|
|
433
|
-
|
|
487
|
+
const selectedKey = value ? toKey(value) : null;
|
|
434
488
|
// The month holding the tab order, and with it the year on screen — one piece of
|
|
435
489
|
// state, as in MiniCalendar, so the two cannot disagree. Opens on the value, or on
|
|
436
490
|
// the current month, pulled inside the bounds.
|
|
437
|
-
const [active, setActive] = useState
|
|
438
|
-
|
|
439
|
-
if (minKey && start < minKey) return parseMonth(minKey)!;
|
|
440
|
-
if (maxKey && start > maxKey) return parseMonth(maxKey)!;
|
|
441
|
-
return parseMonth(start)!;
|
|
442
|
-
});
|
|
443
|
-
const year = active.year;
|
|
444
|
-
|
|
445
|
-
const gridRef = useRef<HTMLDivElement>(null);
|
|
491
|
+
const [active, setActive] = useState(() => clampKey(selectedKey ?? currentKey, minKey, maxKey));
|
|
492
|
+
const year = Number(active.slice(0, 4));
|
|
446
493
|
const captionId = `${useId()}-year`;
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
const shortNames = useMemo(() => {
|
|
450
|
-
const fmt = new Intl.DateTimeFormat(locale, { month: "short" });
|
|
451
|
-
return Array.from({ length: 12 }, (_, i) => fmt.format(new Date(2000, i, 1)));
|
|
452
|
-
}, [locale]);
|
|
453
|
-
const longName = useMemo(() => new Intl.DateTimeFormat(locale, MONTH_NAME_FORMAT), [locale]);
|
|
454
|
-
const yearCaption = new Intl.DateTimeFormat(locale, { year: "numeric" }).format(firstOf({ year, month: 1 }));
|
|
455
|
-
|
|
456
|
-
// A month whose cell must take focus after the next commit. Arrowing across a year
|
|
457
|
-
// boundary re-labels the same twelve buttons, so the one to focus is a DIFFERENT
|
|
458
|
-
// button from the one the key landed on.
|
|
459
|
-
const pendingFocus = useRef<string | null>(null);
|
|
460
|
-
useEffect(() => {
|
|
461
|
-
const key = pendingFocus.current;
|
|
462
|
-
if (!key) return;
|
|
463
|
-
pendingFocus.current = null;
|
|
464
|
-
gridRef.current?.querySelector<HTMLElement>(`[data-month="${key}"]`)?.focus();
|
|
465
|
-
});
|
|
466
|
-
|
|
467
|
-
// Opened because the user asked to pick a month: land them on it. Runs before the
|
|
468
|
-
// popover's focus trap (a child's effect fires first), which then keeps this focus.
|
|
469
|
-
useEffect(() => {
|
|
470
|
-
gridRef.current?.querySelector<HTMLElement>('[tabindex="0"]')?.focus();
|
|
471
|
-
}, []);
|
|
472
|
-
|
|
473
|
-
const moveTo = (next: YearMonth, focus: boolean) => {
|
|
474
|
-
if (focus) pendingFocus.current = toKey(next);
|
|
475
|
-
setActive(next);
|
|
476
|
-
};
|
|
477
|
-
|
|
478
|
-
const onCellKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {
|
|
479
|
-
// Left and right are VISUAL directions: in a right-to-left page the grid runs the
|
|
480
|
-
// other way, so "right" is the previous month there. The panel is portalled, but
|
|
481
|
-
// it carries the field's `dir` (see MonthPicker), so the nearest `dir` is right.
|
|
482
|
-
const step = horizontalStep(e.key, e.currentTarget);
|
|
483
|
-
const col = (active.month - 1) % COLUMNS;
|
|
484
|
-
let delta: number;
|
|
485
|
-
switch (step ? "horizontal" : e.key) {
|
|
486
|
-
case "horizontal":
|
|
487
|
-
delta = step;
|
|
488
|
-
break;
|
|
489
|
-
case "ArrowUp":
|
|
490
|
-
delta = -COLUMNS;
|
|
491
|
-
break;
|
|
492
|
-
case "ArrowDown":
|
|
493
|
-
delta = COLUMNS;
|
|
494
|
-
break;
|
|
495
|
-
case "Home":
|
|
496
|
-
delta = -col;
|
|
497
|
-
break;
|
|
498
|
-
case "End":
|
|
499
|
-
delta = COLUMNS - 1 - col;
|
|
500
|
-
break;
|
|
501
|
-
case "PageUp":
|
|
502
|
-
delta = -12;
|
|
503
|
-
break;
|
|
504
|
-
case "PageDown":
|
|
505
|
-
delta = 12;
|
|
506
|
-
break;
|
|
507
|
-
default:
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
// Before any no-op check: these keys also scroll the panel, and a month that
|
|
511
|
-
// cannot move still must not move the page.
|
|
512
|
-
e.preventDefault();
|
|
513
|
-
if (delta !== 0) moveTo(shiftMonth(active, delta), true);
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
// An arrow is dead once EVERY month of the year it leads to is out of bounds.
|
|
517
|
-
const prevBlocked = Boolean(minKey && toKey({ year: year - 1, month: 12 }) < minKey);
|
|
518
|
-
const nextBlocked = Boolean(maxKey && toKey({ year: year + 1, month: 1 }) > maxKey);
|
|
519
|
-
const selectedKey = value ? toKey(value) : null;
|
|
520
|
-
|
|
521
|
-
const arrow =
|
|
522
|
-
"flex size-7 items-center justify-center rounded text-muted hover:bg-hover disabled:cursor-not-allowed disabled:opacity-30 disabled:hover:bg-transparent";
|
|
494
|
+
const yearCaption = new Intl.DateTimeFormat(locale, YEAR_FORMAT).format(new Date(year, 0, 1));
|
|
495
|
+
const blocked = yearArrowsBlocked(active, minKey, maxKey);
|
|
523
496
|
|
|
524
497
|
return (
|
|
525
498
|
<div className="select-none">
|
|
@@ -527,10 +500,12 @@ function MonthGrid({
|
|
|
527
500
|
<button
|
|
528
501
|
type="button"
|
|
529
502
|
aria-label={labels.previousYear}
|
|
530
|
-
disabled={
|
|
503
|
+
aria-disabled={blocked.previous || undefined}
|
|
531
504
|
// Focus stays on the arrow being pressed — only the grid moves.
|
|
532
|
-
onClick={() =>
|
|
533
|
-
|
|
505
|
+
onClick={() => {
|
|
506
|
+
if (!blocked.previous) setActive(shiftKey(active, -12));
|
|
507
|
+
}}
|
|
508
|
+
className={PANEL_ARROW}
|
|
534
509
|
>
|
|
535
510
|
{/* Mirrored in RTL, where "previous" points the other way. */}
|
|
536
511
|
<ChevronLeft className="size-4 rtl:-scale-x-100" />
|
|
@@ -543,61 +518,28 @@ function MonthGrid({
|
|
|
543
518
|
<button
|
|
544
519
|
type="button"
|
|
545
520
|
aria-label={labels.nextYear}
|
|
546
|
-
disabled={
|
|
547
|
-
onClick={() =>
|
|
548
|
-
|
|
521
|
+
aria-disabled={blocked.next || undefined}
|
|
522
|
+
onClick={() => {
|
|
523
|
+
if (!blocked.next) setActive(shiftKey(active, 12));
|
|
524
|
+
}}
|
|
525
|
+
className={PANEL_ARROW}
|
|
549
526
|
>
|
|
550
527
|
<ChevronRight className="size-4 rtl:-scale-x-100" />
|
|
551
528
|
</button>
|
|
552
529
|
</div>
|
|
553
|
-
<
|
|
554
|
-
{
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
role="gridcell"
|
|
567
|
-
data-month={key}
|
|
568
|
-
tabIndex={ym.month === active.month ? 0 : -1}
|
|
569
|
-
aria-label={labels.month(longName.format(firstOf(ym)))}
|
|
570
|
-
aria-selected={selected}
|
|
571
|
-
aria-disabled={disabled || undefined}
|
|
572
|
-
aria-current={current ? "date" : undefined}
|
|
573
|
-
onClick={() => {
|
|
574
|
-
// The guard `disabled` would have been; see the component note.
|
|
575
|
-
if (disabled) return;
|
|
576
|
-
setActive(ym);
|
|
577
|
-
onPick(key);
|
|
578
|
-
}}
|
|
579
|
-
onKeyDown={onCellKeyDown}
|
|
580
|
-
className={cn(
|
|
581
|
-
"rounded px-2 py-1.5 text-sm capitalize transition-colors",
|
|
582
|
-
FOCUS_RING_WIDTH,
|
|
583
|
-
"focus-visible:outline-none focus-visible:ring-inset",
|
|
584
|
-
// A --brand ring on a --brand fill exists only in the DOM.
|
|
585
|
-
selected && !disabled ? "focus-visible:ring-brand-contrast" : "focus-visible:ring-brand",
|
|
586
|
-
disabled
|
|
587
|
-
? "cursor-not-allowed text-placeholder"
|
|
588
|
-
: selected
|
|
589
|
-
? "bg-brand text-brand-contrast hover:bg-brand-hover"
|
|
590
|
-
: "text-primary hover:bg-hover",
|
|
591
|
-
current && !selected && !disabled && "ring-1 ring-inset ring-strong",
|
|
592
|
-
)}
|
|
593
|
-
>
|
|
594
|
-
{shortNames[ym.month - 1]}
|
|
595
|
-
</button>
|
|
596
|
-
);
|
|
597
|
-
})}
|
|
598
|
-
</div>
|
|
599
|
-
))}
|
|
600
|
-
</div>
|
|
530
|
+
<MonthGrid
|
|
531
|
+
active={active}
|
|
532
|
+
onActiveChange={setActive}
|
|
533
|
+
onPick={onPick}
|
|
534
|
+
from={selectedKey}
|
|
535
|
+
to={selectedKey}
|
|
536
|
+
minKey={minKey}
|
|
537
|
+
maxKey={maxKey}
|
|
538
|
+
currentKey={currentKey}
|
|
539
|
+
locale={locale}
|
|
540
|
+
cellName={labels.month}
|
|
541
|
+
labelledBy={captionId}
|
|
542
|
+
/>
|
|
601
543
|
</div>
|
|
602
544
|
);
|
|
603
545
|
}
|
|
@@ -645,7 +587,7 @@ function YearGrid({
|
|
|
645
587
|
? { first: minYear, count: maxYear - minYear + 1 }
|
|
646
588
|
: null;
|
|
647
589
|
// The year holding the tab order, and with it the page on screen — one piece of
|
|
648
|
-
// state, as in
|
|
590
|
+
// state, as in MonthPanel. Opens on the value, or on this year, inside the bounds.
|
|
649
591
|
const [active, setActive] = useState(() => clamp(value ?? currentYear));
|
|
650
592
|
const anchor = minYear ?? (maxYear !== null ? maxYear - (YEAR_PAGE - 1) : 0);
|
|
651
593
|
const first = whole ? whole.first : anchor + Math.floor((active - anchor) / YEAR_PAGE) * YEAR_PAGE;
|
|
@@ -712,8 +654,6 @@ function YearGrid({
|
|
|
712
654
|
|
|
713
655
|
const prevBlocked = minYear !== null && first - 1 < minYear;
|
|
714
656
|
const nextBlocked = maxYear !== null && first + count > maxYear;
|
|
715
|
-
const arrow =
|
|
716
|
-
"flex size-7 items-center justify-center rounded text-muted hover:bg-hover disabled:cursor-not-allowed disabled:opacity-30 disabled:hover:bg-transparent";
|
|
717
657
|
|
|
718
658
|
return (
|
|
719
659
|
<div className="select-none">
|
|
@@ -722,9 +662,11 @@ function YearGrid({
|
|
|
722
662
|
<button
|
|
723
663
|
type="button"
|
|
724
664
|
aria-label={labels.earlierYears}
|
|
725
|
-
disabled={prevBlocked}
|
|
726
|
-
onClick={() =>
|
|
727
|
-
|
|
665
|
+
aria-disabled={prevBlocked || undefined}
|
|
666
|
+
onClick={() => {
|
|
667
|
+
if (!prevBlocked) moveTo(active - YEAR_PAGE, false);
|
|
668
|
+
}}
|
|
669
|
+
className={PANEL_ARROW}
|
|
728
670
|
>
|
|
729
671
|
<ChevronLeft className="size-4 rtl:-scale-x-100" />
|
|
730
672
|
</button>
|
|
@@ -736,9 +678,11 @@ function YearGrid({
|
|
|
736
678
|
<button
|
|
737
679
|
type="button"
|
|
738
680
|
aria-label={labels.laterYears}
|
|
739
|
-
disabled={nextBlocked}
|
|
740
|
-
onClick={() =>
|
|
741
|
-
|
|
681
|
+
aria-disabled={nextBlocked || undefined}
|
|
682
|
+
onClick={() => {
|
|
683
|
+
if (!nextBlocked) moveTo(active + YEAR_PAGE, false);
|
|
684
|
+
}}
|
|
685
|
+
className={PANEL_ARROW}
|
|
742
686
|
>
|
|
743
687
|
<ChevronRight className="size-4 rtl:-scale-x-100" />
|
|
744
688
|
</button>
|
|
@@ -768,7 +712,8 @@ function YearGrid({
|
|
|
768
712
|
}}
|
|
769
713
|
onKeyDown={onCellKeyDown}
|
|
770
714
|
className={cn(
|
|
771
|
-
|
|
715
|
+
// The month grid's 44px rows (DUP-11): one picker, one row height.
|
|
716
|
+
"h-11 rounded px-1 text-sm tabular-nums transition-colors",
|
|
772
717
|
FOCUS_RING_WIDTH,
|
|
773
718
|
"focus-visible:outline-none focus-visible:ring-inset",
|
|
774
719
|
selected && !disabled ? "focus-visible:ring-brand-contrast" : "focus-visible:ring-brand",
|
|
@@ -803,14 +748,6 @@ function YearGrid({
|
|
|
803
748
|
* and a year list in two popovers). The grid does both jobs — the year arrows and
|
|
804
749
|
* PageUp/PageDown cover what the year list did, without a fixed ±5-year window.
|
|
805
750
|
*/
|
|
806
|
-
/** Upper-case the first letter only, in `locale`. Several locales (fr, es, it, pt, …)
|
|
807
|
-
* write month names in lower case, which at the start of a field reads as a typo —
|
|
808
|
-
* but only the FIRST letter is the field's business: "septiembre de 2026" becomes
|
|
809
|
-
* "Septiembre de 2026", not "Septiembre De 2026". */
|
|
810
|
-
function upperFirst(text: string, locale: string | undefined): string {
|
|
811
|
-
return text.charAt(0).toLocaleUpperCase(locale) + text.slice(1);
|
|
812
|
-
}
|
|
813
|
-
|
|
814
751
|
export function MonthPicker(props: MonthPickerProps) {
|
|
815
752
|
const {
|
|
816
753
|
value,
|
|
@@ -821,6 +758,9 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
821
758
|
label,
|
|
822
759
|
placeholder,
|
|
823
760
|
disabled,
|
|
761
|
+
disabledReason,
|
|
762
|
+
disabledReasonDisplay,
|
|
763
|
+
commit,
|
|
824
764
|
invalid,
|
|
825
765
|
error,
|
|
826
766
|
hint,
|
|
@@ -868,20 +808,44 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
868
808
|
: (placeholder ?? "");
|
|
869
809
|
|
|
870
810
|
const id = useId();
|
|
811
|
+
// The write lock (API-3): Select's — the trigger stays reachable and says why.
|
|
812
|
+
const lock = useLockReason(commit, disabledReason);
|
|
813
|
+
const locked = lock.locked;
|
|
814
|
+
const reasonId = locked ? lock.reasonId : undefined;
|
|
815
|
+
const change = (key: string) => {
|
|
816
|
+
if (!locked) onChange(key);
|
|
817
|
+
};
|
|
871
818
|
// keksdose K4: the caption and the error, on the trigger after the caller's own
|
|
872
|
-
// description
|
|
873
|
-
// which this field has never painted for.
|
|
819
|
+
// description; a lock's reason between the two, as on Select. Painted for `invalid`
|
|
820
|
+
// and a message — not for a bare `aria-invalid`, which this field has never painted for.
|
|
874
821
|
const messages = useFieldMessages({
|
|
875
822
|
hint,
|
|
876
823
|
help,
|
|
877
824
|
name: label ?? rest["aria-label"],
|
|
878
825
|
error,
|
|
879
826
|
describedBy: rest["aria-describedby"],
|
|
827
|
+
reasonId,
|
|
880
828
|
});
|
|
881
829
|
const [ownAria, wrapperRest] = splitTriggerAria(rest);
|
|
882
830
|
// The field's trigger is described by the caption and the error too; the stepper
|
|
883
|
-
// draws neither, so its heading keeps the caller's own description.
|
|
831
|
+
// draws neither, so its heading keeps the caller's own description — and a lock's.
|
|
884
832
|
const aria: TriggerAria = { ...ownAria, "aria-describedby": messages.describedBy };
|
|
833
|
+
const headingAria: TriggerAria = {
|
|
834
|
+
...ownAria,
|
|
835
|
+
"aria-describedby": mergeDescribedBy(ownAria["aria-describedby"], reasonId),
|
|
836
|
+
};
|
|
837
|
+
// Locked, the field (or the stepper) sits in the reason's frame — the line, or the
|
|
838
|
+
// Tooltip — which becomes the outermost box and takes the caller's classes, as on
|
|
839
|
+
// Select, so a lock does not reflow the page.
|
|
840
|
+
const rootClass = locked ? undefined : className;
|
|
841
|
+
const withReason = (box: ReactNode) =>
|
|
842
|
+
locked ? (
|
|
843
|
+
<LockedReason lock={lock} display={disabledReasonDisplay} className={cn("block", className)}>
|
|
844
|
+
{box}
|
|
845
|
+
</LockedReason>
|
|
846
|
+
) : (
|
|
847
|
+
box
|
|
848
|
+
);
|
|
885
849
|
const labelId = `${id}-label`;
|
|
886
850
|
const valueId = `${id}-value`;
|
|
887
851
|
const panelId = `${id}-panel`;
|
|
@@ -906,12 +870,12 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
906
870
|
currentYear={currentYear}
|
|
907
871
|
labels={labels}
|
|
908
872
|
onPick={(key) => {
|
|
909
|
-
|
|
873
|
+
change(key);
|
|
910
874
|
close();
|
|
911
875
|
}}
|
|
912
876
|
/>
|
|
913
877
|
) : (
|
|
914
|
-
<
|
|
878
|
+
<MonthPanel
|
|
915
879
|
value={selected}
|
|
916
880
|
locale={locale}
|
|
917
881
|
minKey={minKey}
|
|
@@ -919,7 +883,7 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
919
883
|
currentKey={currentKey}
|
|
920
884
|
labels={labels}
|
|
921
885
|
onPick={(key) => {
|
|
922
|
-
|
|
886
|
+
change(key);
|
|
923
887
|
close();
|
|
924
888
|
}}
|
|
925
889
|
/>
|
|
@@ -967,51 +931,76 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
967
931
|
text={triggerText}
|
|
968
932
|
panelId={panelId}
|
|
969
933
|
disabled={disabled}
|
|
970
|
-
|
|
934
|
+
locked={locked}
|
|
935
|
+
aria={headingAria}
|
|
971
936
|
/>
|
|
972
937
|
)}
|
|
973
938
|
>
|
|
974
939
|
{grid}
|
|
975
940
|
</Popover>
|
|
976
941
|
);
|
|
977
|
-
|
|
942
|
+
// ‹ › at a bound refuse rather than turn `disabled` (refactor audit 2026-10-30,
|
|
943
|
+
// INP-4): the press that reaches the bound is made with the focus on the arrow, and
|
|
944
|
+
// a focused button that turns `disabled` drops the focus to <body>. A lock refuses
|
|
945
|
+
// them, and Today, the same focusable way — its reason is the frame's, so no name
|
|
946
|
+
// bubble of their own beside it. `disabled` (a lock's reason wins over it) and
|
|
947
|
+
// Today's "now is out of bounds", which no press here changes, stay native.
|
|
948
|
+
const off = Boolean(disabled) && !locked;
|
|
949
|
+
const prevRefused = locked || outside(prevKey);
|
|
950
|
+
const nextRefused = locked || outside(nextKey);
|
|
951
|
+
return withReason(
|
|
978
952
|
// `flex-wrap`: where the heading and the buttons do not fit one row, the buttons
|
|
979
953
|
// take the next line, at the end (0.32.1, the 360 px Extra-large sweep;
|
|
980
954
|
// docs/text-size-harmonization.md §4). In one row at 150 % "Today ‹ ›" left the
|
|
981
955
|
// heading 30 px on a 360 px phone, and "October 2026" was drawn under "Today".
|
|
982
956
|
// Where they fit, nothing changes.
|
|
983
|
-
<div {...wrapperRest} ref={rootRef} className={cn("flex min-w-0 flex-wrap items-center gap-2",
|
|
957
|
+
<div {...wrapperRest} ref={rootRef} className={cn("flex min-w-0 flex-wrap items-center gap-2", rootClass)}>
|
|
984
958
|
{Heading ? <Heading className="m-0 min-w-0 text-lg font-semibold">{trigger}</Heading> : trigger}
|
|
985
959
|
<div className="ms-auto flex shrink-0 items-center gap-1">
|
|
986
960
|
{showToday && (
|
|
987
961
|
<Button
|
|
988
962
|
variant="secondary"
|
|
989
963
|
size="sm"
|
|
990
|
-
disabled={disabled || outside(nowKey)}
|
|
964
|
+
disabled={!locked && (disabled || outside(nowKey))}
|
|
965
|
+
aria-disabled={locked || undefined}
|
|
966
|
+
aria-describedby={reasonId}
|
|
991
967
|
onClick={() => {
|
|
992
|
-
if (nowKey !== shownKey)
|
|
968
|
+
if (nowKey !== shownKey) change(nowKey);
|
|
993
969
|
}}
|
|
970
|
+
className={STEPPER_REFUSED}
|
|
994
971
|
>
|
|
995
972
|
{years ? labels.thisYear : labels.today}
|
|
996
973
|
</Button>
|
|
997
974
|
)}
|
|
998
975
|
<IconButton
|
|
999
976
|
aria-label={years ? labels.previousYear : labels.previousMonth}
|
|
1000
|
-
disabled={
|
|
1001
|
-
|
|
977
|
+
disabled={off}
|
|
978
|
+
aria-disabled={(!off && prevRefused) || undefined}
|
|
979
|
+
aria-describedby={reasonId}
|
|
980
|
+
tooltip={!locked}
|
|
981
|
+
onClick={() => {
|
|
982
|
+
if (!prevRefused) change(prevKey);
|
|
983
|
+
}}
|
|
984
|
+
className={STEPPER_ARROW_REFUSED}
|
|
1002
985
|
>
|
|
1003
986
|
{/* Mirrored in RTL, where "previous" points the other way. */}
|
|
1004
987
|
<ChevronLeft className="rtl:-scale-x-100" />
|
|
1005
988
|
</IconButton>
|
|
1006
989
|
<IconButton
|
|
1007
990
|
aria-label={years ? labels.nextYear : labels.nextMonth}
|
|
1008
|
-
disabled={
|
|
1009
|
-
|
|
991
|
+
disabled={off}
|
|
992
|
+
aria-disabled={(!off && nextRefused) || undefined}
|
|
993
|
+
aria-describedby={reasonId}
|
|
994
|
+
tooltip={!locked}
|
|
995
|
+
onClick={() => {
|
|
996
|
+
if (!nextRefused) change(nextKey);
|
|
997
|
+
}}
|
|
998
|
+
className={STEPPER_ARROW_REFUSED}
|
|
1010
999
|
>
|
|
1011
1000
|
<ChevronRight className="rtl:-scale-x-100" />
|
|
1012
1001
|
</IconButton>
|
|
1013
1002
|
</div>
|
|
1014
|
-
</div
|
|
1003
|
+
</div>,
|
|
1015
1004
|
);
|
|
1016
1005
|
}
|
|
1017
1006
|
|
|
@@ -1023,7 +1012,7 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
1023
1012
|
<div
|
|
1024
1013
|
{...wrapperRest}
|
|
1025
1014
|
ref={rootRef}
|
|
1026
|
-
className={cn("relative", small && "w-fit max-w-full", label !== undefined && LABEL_ABOVE_BOX,
|
|
1015
|
+
className={cn("relative", small && "w-fit max-w-full", label !== undefined && LABEL_ABOVE_BOX, rootClass)}
|
|
1027
1016
|
>
|
|
1028
1017
|
{label !== undefined && <FieldLabelLine label={label} hint={messages.labelHint} />}
|
|
1029
1018
|
{/* The hidden twin the trigger is named by — see DateField. `sr-only-fixed`,
|
|
@@ -1064,6 +1053,7 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
1064
1053
|
padded={label !== undefined}
|
|
1065
1054
|
small={small}
|
|
1066
1055
|
disabled={disabled}
|
|
1056
|
+
locked={locked}
|
|
1067
1057
|
invalid={invalid || hasContent(error)}
|
|
1068
1058
|
className={triggerClassName}
|
|
1069
1059
|
/>
|
|
@@ -1082,13 +1072,15 @@ export function MonthPicker(props: MonthPickerProps) {
|
|
|
1082
1072
|
const endHint = label === undefined ? messages.labelHint : undefined;
|
|
1083
1073
|
return (
|
|
1084
1074
|
<FieldBox below={messages.below} reserve={"error" in props || "hint" in props}>
|
|
1085
|
-
{
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
<div className=
|
|
1090
|
-
|
|
1091
|
-
|
|
1075
|
+
{withReason(
|
|
1076
|
+
endHint === undefined ? (
|
|
1077
|
+
field
|
|
1078
|
+
) : (
|
|
1079
|
+
<div className="flex items-center gap-1.5">
|
|
1080
|
+
<div className={cn("min-w-0", !small && "flex-1")}>{field}</div>
|
|
1081
|
+
<span className="flex shrink-0 items-center">{endHint}</span>
|
|
1082
|
+
</div>
|
|
1083
|
+
),
|
|
1092
1084
|
)}
|
|
1093
1085
|
</FieldBox>
|
|
1094
1086
|
);
|