@eifi1/ui-kit 0.51.4 → 0.51.5
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 +3 -3
- package/dist/account/account-settings-labels.js.map +1 -1
- package/dist/account/account-settings.js +11 -9
- package/dist/account/account-settings.js.map +1 -1
- package/dist/account/delete-account-setting.js +56 -65
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/account/email-change-setting-labels.js.map +1 -1
- package/dist/account/email-change-setting.js.map +1 -1
- package/dist/account/passkeys-setting.js.map +1 -1
- 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-action-log.js.map +1 -1
- package/dist/admin/admin-area-labels.js +4 -1
- package/dist/admin/admin-area-labels.js.map +1 -1
- package/dist/admin/admin-overview.js +19 -11
- package/dist/admin/admin-overview.js.map +1 -1
- package/dist/admin/admin-sections.js.map +1 -1
- package/dist/admin/admin-tool-links.d.ts +1 -1
- package/dist/admin/admin-tool-links.js +7 -1
- package/dist/admin/admin-tool-links.js.map +1 -1
- package/dist/admin/invitations-panel.js +2 -13
- package/dist/admin/invitations-panel.js.map +1 -1
- package/dist/admin/mail-test-card.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.js +4 -11
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/admin/role-select.js.map +1 -1
- package/dist/admin/user-roster.js +1 -9
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/accept-invitation.js.map +1 -1
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/forgot-password-form.js +23 -31
- package/dist/auth/forgot-password-form.js.map +1 -1
- package/dist/auth/register-form.js.map +1 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/sign-in-form.js +13 -5
- package/dist/auth/sign-in-form.js.map +1 -1
- package/dist/auth/verify-email.js +1 -8
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/billing/billing-banner.js.map +1 -1
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/checkout-processing.js.map +1 -1
- package/dist/billing/plan-card.js +91 -85
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-limit-toast.js.map +1 -1
- package/dist/billing/plan-limit.js.map +1 -1
- package/dist/billing/plan-price.js.map +1 -1
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/billing/subscription-actions.js.map +1 -1
- package/dist/bin/eifi1-pay-page.mjs +6 -1
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/alert-banner.js +1 -5
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.js +29 -12
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/authed-image.js.map +1 -1
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +1 -4
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button-group.js.map +1 -1
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/button.js +1 -7
- package/dist/components/button.js.map +1 -1
- package/dist/components/calculator.js +5 -5
- package/dist/components/calculator.js.map +1 -1
- package/dist/components/calendar-heatmap.js +4 -10
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/card.js +1 -8
- package/dist/components/card.js.map +1 -1
- package/dist/components/chart-zoom-core.js +3 -17
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/chart.d.ts +1 -1
- package/dist/components/chart.js +4 -22
- package/dist/components/chart.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -4
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/chip-input.js +4 -1
- package/dist/components/chip-input.js.map +1 -1
- package/dist/components/chip.js +10 -5
- package/dist/components/chip.js.map +1 -1
- package/dist/components/choice-card.js +58 -74
- package/dist/components/choice-card.js.map +1 -1
- package/dist/components/column-mapper-labels.js.map +1 -1
- package/dist/components/column-mapper.js +167 -227
- package/dist/components/column-mapper.js.map +1 -1
- package/dist/components/combobox-core.js +1 -4
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +1 -4
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/country-select.d.ts +5 -4
- package/dist/components/country-select.js +3 -19
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.js +10 -8
- package/dist/components/currency-option-list.js.map +1 -1
- package/dist/components/currency-select.js +1 -6
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-cells.js.map +1 -1
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filter-popover.js +2 -18
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-groups.js +3 -1
- package/dist/components/data-table-groups.js.map +1 -1
- package/dist/components/data-table-head.js +44 -56
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-mobile.js +31 -44
- package/dist/components/data-table-mobile.js.map +1 -1
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-row-actions.js +19 -16
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table-row.js.map +1 -1
- package/dist/components/data-table-shared.js.map +1 -1
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table-virtual.js +4 -1
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/data-table.js +30 -39
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +1 -6
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/description-list.js +10 -10
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog-frame.js +9 -2
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/disclosure.js +17 -27
- package/dist/components/disclosure.js.map +1 -1
- package/dist/components/dropdown.js +25 -35
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/empty-state.js.map +1 -1
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/field-base.js +5 -5
- package/dist/components/field-base.js.map +1 -1
- package/dist/components/field-parts.d.ts +1 -1
- package/dist/components/field-parts.js +10 -14
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-sync.js +8 -10
- package/dist/components/field-sync.js.map +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/floating-panel.js +4 -1
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/focus-ring.js.map +1 -1
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/grouped-picker.js +6 -8
- package/dist/components/grouped-picker.js.map +1 -1
- package/dist/components/hover-menu.js +1 -4
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/iban-input-labels.js.map +1 -1
- package/dist/components/icon-button.js +4 -1
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/icon-picker.js +2 -7
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/image-grid.js +41 -50
- package/dist/components/image-grid.js.map +1 -1
- package/dist/components/inline-edit-field.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -8
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +14 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +1 -7
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal-labels.js.map +1 -1
- package/dist/components/legal-page.js +14 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.js +12 -2
- package/dist/components/legal.js.map +1 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/line-items.js +26 -36
- package/dist/components/line-items.js.map +1 -1
- package/dist/components/list.js +22 -10
- package/dist/components/list.js.map +1 -1
- package/dist/components/measured-grid.js +29 -53
- package/dist/components/measured-grid.js.map +1 -1
- package/dist/components/menu-item.js.map +1 -1
- package/dist/components/mini-calendar.js +13 -31
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/money-field.js.map +1 -1
- package/dist/components/month-picker.js +10 -21
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +3 -16
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/nav-pills.js +10 -1
- package/dist/components/nav-pills.js.map +1 -1
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.js +1 -7
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numpad-sheet.js +1 -4
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/one-time-code-input.js +1 -7
- package/dist/components/one-time-code-input.js.map +1 -1
- package/dist/components/page-contents.js +13 -22
- package/dist/components/page-contents.js.map +1 -1
- package/dist/components/page-header.js +1 -11
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/password-strength-labels.js.map +1 -1
- package/dist/components/password-strength.js +2 -8
- package/dist/components/password-strength.js.map +1 -1
- package/dist/components/phone-input.js +42 -57
- package/dist/components/phone-input.js.map +1 -1
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/pie-chart.js +1 -8
- package/dist/components/pie-chart.js.map +1 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/progress-bar.js +16 -9
- package/dist/components/progress-bar.js.map +1 -1
- package/dist/components/qr-code.js +1 -8
- package/dist/components/qr-code.js.map +1 -1
- package/dist/components/row-actions.js +5 -1
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/search-field.js.map +1 -1
- package/dist/components/select.js +28 -38
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.js +1 -5
- package/dist/components/separator.js.map +1 -1
- package/dist/components/series-chart-axes.js +4 -1
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart-budget.js.map +1 -1
- package/dist/components/series-chart-ticks.js.map +1 -1
- package/dist/components/series-chart.js +29 -45
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/settings-fields.js +21 -17
- package/dist/components/settings-fields.js.map +1 -1
- package/dist/components/share-card.js +4 -9
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/sign-chip.js.map +1 -1
- package/dist/components/signature-pad.js +4 -13
- package/dist/components/signature-pad.js.map +1 -1
- package/dist/components/signed-amount.js +12 -5
- package/dist/components/signed-amount.js.map +1 -1
- package/dist/components/skeleton.js +2 -17
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/slider.js +13 -36
- package/dist/components/slider.js.map +1 -1
- package/dist/components/sparkline.js.map +1 -1
- package/dist/components/stat-tile.js +14 -10
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/swatch-picker.js +14 -4
- package/dist/components/swatch-picker.js.map +1 -1
- package/dist/components/swipeable-row.d.ts +1 -1
- package/dist/components/swipeable-row.js +1 -8
- package/dist/components/swipeable-row.js.map +1 -1
- package/dist/components/table-skeleton.js +4 -1
- package/dist/components/table-skeleton.js.map +1 -1
- package/dist/components/table.js +12 -9
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +5 -24
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/text-link.js.map +1 -1
- package/dist/components/text.js.map +1 -1
- package/dist/components/tile-radio.js +1 -7
- package/dist/components/tile-radio.js.map +1 -1
- package/dist/components/time-input.js.map +1 -1
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +6 -1
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle-legend.js +2 -11
- package/dist/components/toggle-legend.js.map +1 -1
- package/dist/components/tooltip.js +2 -22
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/translation-review-editor.js +1 -4
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review-parts.d.ts +1 -1
- package/dist/components/translation-review-parts.js +7 -1
- package/dist/components/translation-review-parts.js.map +1 -1
- package/dist/components/translation-review.js +18 -7
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/tree-view.js +14 -10
- package/dist/components/tree-view.js.map +1 -1
- package/dist/components/treemap.js +1 -13
- package/dist/components/treemap.js.map +1 -1
- package/dist/components/trigger-aria.js.map +1 -1
- package/dist/components/use-table-state.js +14 -11
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/components/user-avatar.js +3 -26
- package/dist/components/user-avatar.js.map +1 -1
- package/dist/demo/demo-start.js +8 -4
- package/dist/demo/demo-start.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/feedback/feedback-attachment-labels.js.map +1 -1
- package/dist/feedback/feedback-attachment.js +1 -8
- package/dist/feedback/feedback-attachment.js.map +1 -1
- package/dist/feedback/feedback-capture.d.ts +1 -1
- package/dist/feedback/feedback-capture.js +3 -1
- package/dist/feedback/feedback-capture.js.map +1 -1
- package/dist/feedback/feedback-comment-thread.js +27 -13
- package/dist/feedback/feedback-comment-thread.js.map +1 -1
- package/dist/feedback/feedback-context.js +1 -4
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox.js.map +1 -1
- package/dist/feedback/feedback-public-list.js +7 -1
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-record.js +1 -5
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-replies.js +25 -10
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-table.js +4 -1
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread.js +2 -13
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback/feedback-vote-button.js.map +1 -1
- package/dist/hooks/use-anchored-rect.js.map +1 -1
- package/dist/hooks/use-document-title.js.map +1 -1
- package/dist/hooks/use-file-drop.js.map +1 -1
- package/dist/hooks/use-file-picker-labels.js.map +1 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-overlay-history.js +10 -5
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/hooks/use-row-swipe.d.ts +1 -1
- package/dist/hooks/use-row-swipe.js +1 -6
- package/dist/hooks/use-row-swipe.js.map +1 -1
- package/dist/i18n/defaults.js +1 -4
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +4 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.js +2 -8
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/languages.js.map +1 -1
- package/dist/i18n/locales/en.js +4 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/es.js +4 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +4 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +4 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +4 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/plurals.js.map +1 -1
- package/dist/i18n/review.js +13 -7
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/index.js +40 -23
- package/dist/index.js.map +1 -1
- package/dist/landing/access.js +1 -4
- package/dist/landing/access.js.map +1 -1
- package/dist/landing/landing-sections.js +35 -38
- package/dist/landing/landing-sections.js.map +1 -1
- package/dist/landing/page-seo.js.map +1 -1
- package/dist/lib/calc.js.map +1 -1
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/decimal-marks.js.map +1 -1
- package/dist/lib/device-settings.js +2 -1
- package/dist/lib/device-settings.js.map +1 -1
- package/dist/lib/direction.js.map +1 -1
- package/dist/lib/iban.js.map +1 -1
- package/dist/lib/logger.js +1 -5
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/person-name.js.map +1 -1
- package/dist/lib/phone.js.map +1 -1
- package/dist/lib/qr-encode.js +344 -8
- package/dist/lib/qr-encode.js.map +1 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/table-text.js +15 -3
- package/dist/lib/table-text.js.map +1 -1
- package/dist/lib/text-match.d.ts +4 -0
- package/dist/lib/text-match.js.map +1 -1
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/notifications/notification-inbox.js +63 -44
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-parts.js.map +1 -1
- package/dist/notifications/notification-types-setting.js.map +1 -1
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/push-device-setting.js +6 -1
- package/dist/notifications/push-device-setting.js.map +1 -1
- package/dist/notifications/push-devices-setting.js.map +1 -1
- package/dist/notifications/push-worker.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/notifications/use-push-device.js +4 -1
- package/dist/notifications/use-push-device.js.map +1 -1
- package/dist/offline/pwa-update-prompt.d.ts +1 -1
- package/dist/offline/pwa-update-prompt.js +7 -1
- package/dist/offline/pwa-update-prompt.js.map +1 -1
- package/dist/offline/query-persistence.js.map +1 -1
- package/dist/offline.d.ts +1 -1
- package/dist/offline.js +6 -1
- package/dist/offline.js.map +1 -1
- package/dist/pay/pay.css +8 -1
- package/dist/rhf/fields.d.ts +1 -2
- package/dist/rhf/fields.js +1 -10
- package/dist/rhf/fields.js.map +1 -1
- package/dist/rhf/form-core.js +1 -4
- package/dist/rhf/form-core.js.map +1 -1
- package/dist/rhf/line-items.js.map +1 -1
- package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
- package/dist/search/command-palette.js +71 -62
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.js +34 -5
- package/dist/search/global-search.js.map +1 -1
- package/dist/search/search-index.js.map +1 -1
- package/dist/settings/device-reset-setting.js +1 -6
- package/dist/settings/device-reset-setting.js.map +1 -1
- package/dist/settings/settings-heading.js.map +1 -1
- package/dist/settings/settings-layout.js +9 -20
- package/dist/settings/settings-layout.js.map +1 -1
- package/dist/settings/use-settings-route.js.map +1 -1
- package/dist/shell/app-shell.js +62 -31
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/auth-layout.js +1 -10
- package/dist/shell/auth-layout.js.map +1 -1
- package/dist/shell/dev-menu.js +12 -6
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/option-switcher-menu.js.map +1 -1
- package/dist/shell/sync-status-indicator.js +7 -6
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell/topbar-action-menu.js.map +1 -1
- package/dist/shell/topbar-controls.js +1 -10
- package/dist/shell/topbar-controls.js.map +1 -1
- package/dist/shell/tour-menu.js +9 -1
- package/dist/shell/tour-menu.js.map +1 -1
- package/dist/sync/db.js.map +1 -1
- package/dist/sync/engine.js +24 -6
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync.d.ts +2 -2
- package/dist/sync.js +7 -1
- package/dist/sync.js.map +1 -1
- package/dist/testing/css-variables.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +1 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/react.js.map +1 -1
- package/dist/testing/viewport.js +7 -4
- package/dist/testing/viewport.js.map +1 -1
- package/dist/theme/contrast-tokens.js +13 -2
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/palette-derive.d.ts +1 -1
- package/dist/theme/palette-derive.js +18 -29
- package/dist/theme/palette-derive.js.map +1 -1
- package/dist/theme/palette-presets.js.map +1 -1
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/text-size.js.map +1 -1
- package/dist/theme/theme-store.js +1 -3
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour-catalogue.js.map +1 -1
- package/dist/tour/tour-dock.js +5 -1
- package/dist/tour/tour-dock.js.map +1 -1
- package/dist/tour/tour-engine.js +1 -4
- package/dist/tour/tour-engine.js.map +1 -1
- package/dist/tour/tour.js +21 -12
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour/use-tour-progress.js.map +1 -1
- package/dist/tour/use-tour-url-sync.js.map +1 -1
- package/dist/wizard/stepper-nav.js +3 -24
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.js +24 -28
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.js.map +1 -1
- package/dist/wizard/wizard-context.js.map +1 -1
- package/dist/wizard/wizard-step.d.ts +1 -1
- package/dist/wizard/wizard-step.js +1 -8
- package/dist/wizard/wizard-step.js.map +1 -1
- package/dist/wizard/wizard-summary.js.map +1 -1
- package/package.json +5 -2
- package/src/account/account-settings-labels.ts +1 -2
- package/src/account/account-settings.tsx +11 -17
- package/src/account/delete-account-setting.tsx +1 -6
- package/src/account/email-change-setting-labels.ts +1 -2
- package/src/account/email-change-setting.tsx +3 -1
- package/src/account/passkeys-setting.tsx +1 -3
- package/src/account/sessions-setting.tsx +4 -2
- package/src/admin/admin-action-confirm.tsx +4 -7
- package/src/admin/admin-action-log.tsx +29 -29
- package/src/admin/admin-area-labels.ts +4 -1
- package/src/admin/admin-overview.tsx +8 -2
- package/src/admin/admin-sections.tsx +3 -1
- package/src/admin/admin-tool-links.tsx +7 -1
- package/src/admin/invitations-panel.tsx +5 -11
- package/src/admin/mail-test-card.tsx +1 -2
- package/src/admin/reviewer-scope-editor.tsx +4 -9
- package/src/admin/role-select.tsx +4 -2
- package/src/admin/user-roster.tsx +2 -11
- package/src/auth/accept-invitation.tsx +1 -7
- package/src/auth/auth-errors.ts +1 -6
- package/src/auth/forgot-password-form.tsx +2 -7
- package/src/auth/register-form.tsx +7 -8
- package/src/auth/reset-password-form.tsx +2 -5
- package/src/auth/sign-in-form.tsx +15 -14
- package/src/auth/verify-email.tsx +2 -7
- package/src/billing/billing-banner.tsx +3 -7
- package/src/billing/billing-labels.ts +6 -4
- package/src/billing/checkout-processing.ts +0 -1
- package/src/billing/plan-card.tsx +9 -8
- package/src/billing/plan-limit-toast.tsx +1 -2
- package/src/billing/plan-limit.ts +1 -2
- package/src/billing/plan-price.ts +1 -4
- package/src/billing/plan-switch.tsx +1 -2
- package/src/billing/subscription-actions.tsx +5 -2
- package/src/components/account-chips.tsx +1 -7
- package/src/components/alert-banner.tsx +2 -8
- package/src/components/amount-input.tsx +206 -178
- package/src/components/authed-image.tsx +7 -4
- package/src/components/autocomplete.tsx +7 -9
- package/src/components/bulk-action-bar.tsx +2 -7
- package/src/components/button-group.tsx +1 -2
- package/src/components/button-look.ts +6 -17
- package/src/components/button.tsx +1 -4
- package/src/components/calculator.tsx +6 -9
- package/src/components/calendar-heatmap.tsx +5 -10
- package/src/components/card.tsx +9 -13
- package/src/components/chart-zoom-core.tsx +6 -33
- package/src/components/chart.tsx +8 -31
- package/src/components/checkbox-group.tsx +1 -4
- package/src/components/chip-input.tsx +6 -6
- package/src/components/chip.tsx +14 -26
- package/src/components/choice-card.tsx +4 -18
- package/src/components/column-mapper-labels.ts +3 -10
- package/src/components/column-mapper.tsx +33 -122
- package/src/components/combobox-core.tsx +12 -42
- package/src/components/combobox.tsx +2 -6
- package/src/components/confirm-dialog.tsx +1 -3
- package/src/components/copy-button.tsx +2 -4
- package/src/components/country-select.tsx +9 -21
- package/src/components/currency-option-list.tsx +13 -14
- package/src/components/currency-select.tsx +2 -7
- package/src/components/danger-confirm.tsx +8 -9
- package/src/components/data-table-cells.tsx +1 -2
- package/src/components/data-table-column-settings.tsx +1 -3
- package/src/components/data-table-filter-popover.tsx +5 -19
- package/src/components/data-table-filters.ts +1 -6
- package/src/components/data-table-fit.ts +1 -3
- package/src/components/data-table-groups.tsx +3 -1
- package/src/components/data-table-head.tsx +27 -45
- package/src/components/data-table-mobile.tsx +99 -108
- package/src/components/data-table-pagination.tsx +2 -6
- package/src/components/data-table-row-actions.tsx +25 -24
- package/src/components/data-table-row.tsx +16 -17
- package/src/components/data-table-shared.tsx +10 -16
- package/src/components/data-table-sort.ts +1 -2
- package/src/components/data-table-virtual.ts +9 -4
- package/src/components/data-table.tsx +489 -501
- package/src/components/date-picker.tsx +1 -7
- package/src/components/date-range-picker.tsx +3 -13
- package/src/components/description-list.tsx +7 -13
- package/src/components/dialog-frame.tsx +12 -3
- package/src/components/disclosure.tsx +8 -12
- package/src/components/dropdown.tsx +3 -11
- package/src/components/empty-state.tsx +1 -3
- package/src/components/entity-combobox.tsx +2 -6
- package/src/components/error-boundary.tsx +7 -7
- package/src/components/field-base.tsx +8 -14
- package/src/components/field-parts.tsx +12 -23
- package/src/components/field-sync.tsx +7 -11
- package/src/components/file-button.tsx +7 -3
- package/src/components/file-dropzone.tsx +7 -12
- package/src/components/floating-panel.tsx +44 -51
- package/src/components/focus-ring.ts +1 -2
- package/src/components/form-actions.tsx +1 -4
- package/src/components/grouped-picker.tsx +6 -8
- package/src/components/hover-menu.tsx +1 -4
- package/src/components/iban-input-labels.ts +1 -2
- package/src/components/icon-button.tsx +46 -48
- package/src/components/icon-picker.tsx +4 -17
- package/src/components/image-grid.tsx +1 -6
- package/src/components/inline-edit-field.tsx +1 -5
- package/src/components/inline-entity-combobox.tsx +6 -21
- package/src/components/input.tsx +14 -2
- package/src/components/jump-calendar.tsx +2 -6
- package/src/components/legal-labels.ts +1 -2
- package/src/components/legal-page.tsx +18 -7
- package/src/components/legal.tsx +14 -5
- package/src/components/lightbox.tsx +1 -3
- package/src/components/line-items.tsx +7 -15
- package/src/components/list.tsx +29 -25
- package/src/components/measured-grid.tsx +8 -30
- package/src/components/menu-item.tsx +1 -3
- package/src/components/mini-calendar.tsx +129 -159
- package/src/components/money-field.tsx +4 -2
- package/src/components/month-picker.tsx +14 -21
- package/src/components/multi-entity-combobox.tsx +6 -26
- package/src/components/multi-select.tsx +5 -9
- package/src/components/nav-pills.tsx +10 -2
- package/src/components/number-field.tsx +18 -15
- package/src/components/number-input.tsx +3 -19
- package/src/components/numpad-sheet.tsx +9 -13
- package/src/components/one-time-code-input.tsx +6 -11
- package/src/components/page-contents.tsx +2 -9
- package/src/components/page-header.tsx +5 -10
- package/src/components/password-strength-labels.ts +1 -2
- package/src/components/password-strength.tsx +6 -9
- package/src/components/phone-input.tsx +2 -13
- package/src/components/picker-sheet.tsx +2 -5
- package/src/components/pie-chart.tsx +6 -12
- package/src/components/popover.tsx +2 -1
- package/src/components/progress-bar.tsx +16 -25
- package/src/components/qr-code.tsx +2 -9
- package/src/components/row-actions.tsx +9 -1
- package/src/components/search-field.tsx +4 -5
- package/src/components/select.tsx +2 -10
- package/src/components/separator.tsx +1 -5
- package/src/components/series-chart-axes.ts +5 -5
- package/src/components/series-chart-budget.ts +1 -4
- package/src/components/series-chart-ticks.ts +1 -4
- package/src/components/series-chart.tsx +43 -83
- package/src/components/settings-fields.tsx +20 -15
- package/src/components/share-card.tsx +6 -14
- package/src/components/sign-chip.tsx +16 -16
- package/src/components/signature-pad.tsx +21 -13
- package/src/components/signed-amount.tsx +6 -14
- package/src/components/skeleton.tsx +2 -13
- package/src/components/slider.tsx +9 -20
- package/src/components/sparkline.tsx +2 -13
- package/src/components/stat-tile.tsx +13 -24
- package/src/components/swatch-picker.tsx +8 -3
- package/src/components/swipeable-row.tsx +2 -11
- package/src/components/table-skeleton.tsx +4 -1
- package/src/components/table.tsx +12 -8
- package/src/components/tabs.tsx +24 -39
- package/src/components/text-link.tsx +6 -6
- package/src/components/text.tsx +1 -2
- package/src/components/tile-radio.tsx +6 -19
- package/src/components/time-input.tsx +4 -5
- package/src/components/toast.tsx +3 -12
- package/src/components/toggle-group.tsx +9 -9
- package/src/components/toggle-legend.tsx +4 -16
- package/src/components/tooltip.tsx +9 -48
- package/src/components/translation-review-editor.tsx +4 -4
- package/src/components/translation-review-parts.tsx +7 -1
- package/src/components/translation-review.tsx +15 -16
- package/src/components/tree-view.tsx +17 -20
- package/src/components/treemap.tsx +3 -15
- package/src/components/trigger-aria.ts +1 -4
- package/src/components/use-table-state.ts +16 -17
- package/src/components/user-avatar.tsx +4 -21
- package/src/demo/demo-start.tsx +8 -4
- package/src/feedback/feedback-attachment-labels.ts +2 -1
- package/src/feedback/feedback-attachment.tsx +16 -29
- package/src/feedback/feedback-capture.ts +3 -1
- package/src/feedback/feedback-comment-thread.tsx +9 -6
- package/src/feedback/feedback-context.tsx +1 -4
- package/src/feedback/feedback-dialog.tsx +3 -4
- package/src/feedback/feedback-inbox.tsx +3 -9
- package/src/feedback/feedback-public-list.tsx +7 -1
- package/src/feedback/feedback-record.ts +6 -14
- package/src/feedback/feedback-replies.tsx +10 -5
- package/src/feedback/feedback-row-detail.tsx +2 -5
- package/src/feedback/feedback-status-undo.ts +1 -4
- package/src/feedback/feedback-submit-dialog.tsx +4 -4
- package/src/feedback/feedback-table.tsx +12 -8
- package/src/feedback/feedback-thread.tsx +4 -16
- package/src/feedback/feedback-vocabulary.ts +72 -82
- package/src/feedback/feedback-vote-button.tsx +9 -8
- package/src/hooks/use-anchored-rect.ts +1 -4
- package/src/hooks/use-document-title.ts +3 -1
- package/src/hooks/use-file-drop.ts +1 -3
- package/src/hooks/use-file-picker-labels.ts +1 -2
- package/src/hooks/use-file-picker.tsx +1 -5
- package/src/hooks/use-focus-trap.ts +1 -2
- package/src/hooks/use-overlay-history.ts +10 -5
- package/src/hooks/use-row-swipe.ts +1 -6
- package/src/i18n/defaults.ts +1 -4
- package/src/i18n/german.ts +33 -49
- package/src/i18n/kit-labels.tsx +5 -20
- package/src/i18n/languages.ts +2 -8
- package/src/i18n/locales/en.ts +11 -31
- package/src/i18n/locales/es.ts +35 -49
- package/src/i18n/locales/fr.ts +34 -51
- package/src/i18n/locales/hu.ts +26 -37
- package/src/i18n/locales/it.ts +35 -52
- package/src/i18n/locales/zh.ts +14 -32
- package/src/i18n/plurals.ts +4 -1
- package/src/i18n/review.ts +18 -7
- package/src/i18n/shared-labels.ts +1 -2
- package/src/index.ts +106 -32
- package/src/landing/access.ts +2 -7
- package/src/landing/landing-sections.tsx +14 -15
- package/src/landing/page-seo.ts +1 -3
- package/src/lib/calc.ts +4 -1
- package/src/lib/clipboard-minus.ts +4 -1
- package/src/lib/dates.ts +2 -10
- package/src/lib/decimal-marks.ts +1 -3
- package/src/lib/device-settings.ts +2 -1
- package/src/lib/direction.ts +1 -3
- package/src/lib/iban.ts +89 -9
- package/src/lib/logger.ts +1 -5
- package/src/lib/person-name.ts +1 -3
- package/src/lib/phone.ts +5 -8
- package/src/lib/qr-encode.ts +32 -8
- package/src/lib/session-refresh.ts +5 -6
- package/src/lib/table-text.ts +24 -6
- package/src/lib/text-match.ts +15 -3
- package/src/lib/translation-review.ts +1 -3
- package/src/notifications/notification-inbox.tsx +17 -4
- package/src/notifications/notification-parts.tsx +1 -2
- package/src/notifications/notification-types-setting.tsx +19 -18
- package/src/notifications/notifications-labels.ts +1 -2
- package/src/notifications/push-device-setting.tsx +7 -1
- package/src/notifications/push-devices-setting.tsx +7 -3
- package/src/notifications/push-worker.ts +10 -2
- package/src/notifications/quiet-hours-setting.tsx +4 -1
- package/src/notifications/use-push-device.ts +4 -1
- package/src/offline/pwa-update-prompt.tsx +7 -1
- package/src/offline/query-persistence.ts +9 -6
- package/src/offline.ts +6 -1
- package/src/rhf/fields.tsx +50 -19
- package/src/rhf/form-core.tsx +2 -6
- package/src/rhf/line-items.tsx +5 -7
- package/src/rhf/use-rhf-wizard-step.ts +3 -12
- package/src/search/command-palette.tsx +15 -23
- package/src/search/global-search.tsx +38 -8
- package/src/search/search-index.ts +5 -1
- package/src/settings/device-reset-setting.tsx +5 -8
- package/src/settings/settings-heading.tsx +3 -1
- package/src/settings/settings-layout.tsx +6 -13
- package/src/settings/use-settings-route.ts +4 -3
- package/src/shell/app-shell.tsx +48 -24
- package/src/shell/auth-layout.tsx +1 -6
- package/src/shell/dev-menu.tsx +12 -6
- package/src/shell/option-switcher-menu.tsx +1 -3
- package/src/shell/sync-status-indicator.tsx +14 -12
- package/src/shell/top-bar-parts-labels.ts +1 -3
- package/src/shell/topbar-action-menu.tsx +9 -8
- package/src/shell/topbar-controls.tsx +5 -19
- package/src/shell/tour-menu.tsx +9 -1
- package/src/sync/db.ts +5 -1
- package/src/sync/engine.ts +44 -12
- package/src/sync.ts +16 -2
- package/src/testing/css-variables.ts +1 -2
- package/src/testing/index.ts +1 -6
- package/src/testing/react.ts +1 -2
- package/src/testing/viewport.ts +9 -9
- package/src/theme/contrast-tokens.ts +13 -2
- package/src/theme/palette-derive.ts +24 -50
- package/src/theme/palette-presets.ts +0 -1
- package/src/theme/palette-store.ts +1 -4
- package/src/theme/text-size.ts +1 -1
- package/src/theme/theme-store.ts +2 -6
- package/src/tour/tour-catalogue.tsx +4 -2
- package/src/tour/tour-dock.ts +5 -1
- package/src/tour/tour-engine.ts +2 -6
- package/src/tour/tour.tsx +28 -12
- package/src/tour/use-tour-progress.ts +8 -2
- package/src/tour/use-tour-url-sync.ts +3 -1
- package/src/vite-env.d.ts +1 -4
- package/src/wizard/stepper-nav.tsx +10 -35
- package/src/wizard/types.ts +1 -4
- package/src/wizard/use-wizard.ts +28 -43
- package/src/wizard/validation.ts +1 -5
- package/src/wizard/wizard-context.tsx +2 -6
- package/src/wizard/wizard-step.tsx +1 -8
- package/src/wizard/wizard-summary.tsx +2 -6
- package/tokens.css +393 -152
|
@@ -45,10 +45,7 @@ import { useCallback, useEffect, useRef } from "react";
|
|
|
45
45
|
import type { FieldPath, FieldValues, UseFormReturn } from "react-hook-form";
|
|
46
46
|
import { useOptionalWizardContext } from "../wizard/wizard-context";
|
|
47
47
|
|
|
48
|
-
export type RhfWizardStepOptions<
|
|
49
|
-
TFieldValues extends FieldValues,
|
|
50
|
-
TTransformed = TFieldValues,
|
|
51
|
-
> =
|
|
48
|
+
export type RhfWizardStepOptions<TFieldValues extends FieldValues, TTransformed = TFieldValues> =
|
|
52
49
|
| {
|
|
53
50
|
/** Validate only these fields — the step's share of a form that spans steps. */
|
|
54
51
|
fields: readonly FieldPath<TFieldValues>[];
|
|
@@ -68,15 +65,9 @@ export type RhfWizardStepOptions<
|
|
|
68
65
|
* Connects `form` to the wizard's step validation and returns the step's validator.
|
|
69
66
|
* See the module note for the two modes.
|
|
70
67
|
*/
|
|
71
|
-
export function useRhfWizardStep<
|
|
72
|
-
TFieldValues extends FieldValues,
|
|
73
|
-
TContext = unknown,
|
|
74
|
-
TTransformed = TFieldValues,
|
|
75
|
-
>(
|
|
68
|
+
export function useRhfWizardStep<TFieldValues extends FieldValues, TContext = unknown, TTransformed = TFieldValues>(
|
|
76
69
|
form: UseFormReturn<TFieldValues, TContext, TTransformed>,
|
|
77
|
-
options?:
|
|
78
|
-
| RhfWizardStepOptions<TFieldValues, TTransformed>
|
|
79
|
-
| ((values: TTransformed) => void),
|
|
70
|
+
options?: RhfWizardStepOptions<TFieldValues, TTransformed> | ((values: TTransformed) => void),
|
|
80
71
|
): () => Promise<boolean> {
|
|
81
72
|
const opts = typeof options === "function" ? { onValid: options } : (options ?? {});
|
|
82
73
|
const optsRef = useRef(opts);
|
|
@@ -227,8 +227,7 @@ export function CommandPalette({
|
|
|
227
227
|
// go from a German name to an English "Search" on update — so a translated
|
|
228
228
|
// placeholder keeps doing the job until a `dialog` is supplied.
|
|
229
229
|
const dialogName =
|
|
230
|
-
l.dialog ??
|
|
231
|
-
(l.placeholder !== DEFAULT_COMMAND_PALETTE_LABELS.placeholder ? l.placeholder : DEFAULT_DIALOG_NAME);
|
|
230
|
+
l.dialog ?? (l.placeholder !== DEFAULT_COMMAND_PALETTE_LABELS.placeholder ? l.placeholder : DEFAULT_DIALOG_NAME);
|
|
232
231
|
const [ownQuery, setOwnQuery] = useState("");
|
|
233
232
|
const controlled = queryProp !== undefined;
|
|
234
233
|
const query = controlled ? queryProp : ownQuery;
|
|
@@ -426,9 +425,7 @@ export function CommandPalette({
|
|
|
426
425
|
data-fullscreen={isPhone || undefined}
|
|
427
426
|
className={cn(
|
|
428
427
|
"flex w-full flex-col overflow-hidden bg-surface outline-none",
|
|
429
|
-
isPhone
|
|
430
|
-
? "h-full"
|
|
431
|
-
: "max-h-[70vh] max-w-xl rounded-xl border border-subtle shadow-2xl",
|
|
428
|
+
isPhone ? "h-full" : "max-h-[70vh] max-w-xl rounded-xl border border-subtle shadow-2xl",
|
|
432
429
|
)}
|
|
433
430
|
// Full screen means edge to edge, so the notch, the home indicator and the
|
|
434
431
|
// rounded corners are the panel's to keep clear of.
|
|
@@ -518,7 +515,13 @@ export function CommandPalette({
|
|
|
518
515
|
the list markup in between is presentational so the listbox's children are
|
|
519
516
|
groups and options only — as a plain <li>/<ul> tree a reader announced
|
|
520
517
|
"list, 2 items" between options and never tied the heading to its rows. */}
|
|
521
|
-
<ul
|
|
518
|
+
<ul
|
|
519
|
+
id={listId}
|
|
520
|
+
ref={listRef}
|
|
521
|
+
role="listbox"
|
|
522
|
+
aria-label={dialogName}
|
|
523
|
+
className="min-h-0 flex-1 overflow-y-auto py-1"
|
|
524
|
+
>
|
|
522
525
|
{groups.map(({ group, items }, groupIndex) => (
|
|
523
526
|
<li key={group} role="presentation">
|
|
524
527
|
<div
|
|
@@ -540,7 +543,9 @@ export function CommandPalette({
|
|
|
540
543
|
comfortable ? "min-h-11 py-2.5" : "py-2",
|
|
541
544
|
)}
|
|
542
545
|
>
|
|
543
|
-
{item.icon &&
|
|
546
|
+
{item.icon && (
|
|
547
|
+
<span className="flex size-4 shrink-0 items-center justify-center">{item.icon}</span>
|
|
548
|
+
)}
|
|
544
549
|
<span className="min-w-0 flex-1 truncate">{item.label}</span>
|
|
545
550
|
</li>
|
|
546
551
|
);
|
|
@@ -561,9 +566,7 @@ export function CommandPalette({
|
|
|
561
566
|
className: cn(
|
|
562
567
|
"flex w-full items-center gap-2.5 px-3 text-start",
|
|
563
568
|
comfortable ? "min-h-11 py-2.5 text-base" : "py-2 text-sm",
|
|
564
|
-
isActive
|
|
565
|
-
? "bg-active text-primary"
|
|
566
|
-
: "text-secondary",
|
|
569
|
+
isActive ? "bg-active text-primary" : "text-secondary",
|
|
567
570
|
),
|
|
568
571
|
};
|
|
569
572
|
const inner = (
|
|
@@ -595,14 +598,7 @@ export function CommandPalette({
|
|
|
595
598
|
// #451) — and the palette deliberately stays OPEN for
|
|
596
599
|
// it: ⌘-clicking three results in a row is the reason to
|
|
597
600
|
// want this, and closing after the first would undo it.
|
|
598
|
-
if (
|
|
599
|
-
e.button !== 0 ||
|
|
600
|
-
e.metaKey ||
|
|
601
|
-
e.ctrlKey ||
|
|
602
|
-
e.shiftKey ||
|
|
603
|
-
e.altKey
|
|
604
|
-
)
|
|
605
|
-
return;
|
|
601
|
+
if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
606
602
|
e.preventDefault();
|
|
607
603
|
choose(item);
|
|
608
604
|
}}
|
|
@@ -622,11 +618,7 @@ export function CommandPalette({
|
|
|
622
618
|
))}
|
|
623
619
|
</ul>
|
|
624
620
|
|
|
625
|
-
{l.hint &&
|
|
626
|
-
<div className="border-t border-subtle px-3 py-1.5 text-caption text-placeholder">
|
|
627
|
-
{l.hint}
|
|
628
|
-
</div>
|
|
629
|
-
)}
|
|
621
|
+
{l.hint && <div className="border-t border-subtle px-3 py-1.5 text-caption text-placeholder">{l.hint}</div>}
|
|
630
622
|
</div>
|
|
631
623
|
</div>,
|
|
632
624
|
document.body,
|
|
@@ -206,9 +206,17 @@ const identity = (href: string) => href;
|
|
|
206
206
|
function signature(entries: readonly SearchEntry[]): string {
|
|
207
207
|
return entries
|
|
208
208
|
.map((e) =>
|
|
209
|
-
[
|
|
210
|
-
|
|
211
|
-
|
|
209
|
+
[
|
|
210
|
+
e.id,
|
|
211
|
+
e.title,
|
|
212
|
+
(e.keywords ?? []).join("\u0003"),
|
|
213
|
+
e.description,
|
|
214
|
+
e.group,
|
|
215
|
+
e.hint,
|
|
216
|
+
e.href,
|
|
217
|
+
e.weight,
|
|
218
|
+
e.redact,
|
|
219
|
+
].join("\u0001"),
|
|
212
220
|
)
|
|
213
221
|
.join("\u0002");
|
|
214
222
|
}
|
|
@@ -217,7 +225,9 @@ function signature(entries: readonly SearchEntry[]): string {
|
|
|
217
225
|
* row that was clicked (and held focus) is gone. */
|
|
218
226
|
function refocusField() {
|
|
219
227
|
requestAnimationFrame(() => {
|
|
220
|
-
const fields = document.querySelectorAll<HTMLInputElement>(
|
|
228
|
+
const fields = document.querySelectorAll<HTMLInputElement>(
|
|
229
|
+
'[role="dialog"][aria-modal="true"] input[role="combobox"]',
|
|
230
|
+
);
|
|
221
231
|
fields[fields.length - 1]?.focus();
|
|
222
232
|
});
|
|
223
233
|
}
|
|
@@ -458,8 +468,7 @@ function GlobalSearchImpl({
|
|
|
458
468
|
|
|
459
469
|
if (!q) {
|
|
460
470
|
const out: CommandItem[] = [];
|
|
461
|
-
const groupOf = (entry: SearchEntry) =>
|
|
462
|
-
suggestionsKeepGroups ? (entry.group ?? l.suggestions) : l.suggestions;
|
|
471
|
+
const groupOf = (entry: SearchEntry) => (suggestionsKeepGroups ? (entry.group ?? l.suggestions) : l.suggestions);
|
|
463
472
|
suggestionList.forEach((s, i) => {
|
|
464
473
|
if (typeof s === "string") {
|
|
465
474
|
const entry = byId.get(s);
|
|
@@ -532,7 +541,26 @@ function GlobalSearchImpl({
|
|
|
532
541
|
}
|
|
533
542
|
|
|
534
543
|
return ordered(out);
|
|
535
|
-
}, [
|
|
544
|
+
}, [
|
|
545
|
+
q,
|
|
546
|
+
suggestionList,
|
|
547
|
+
suggestionsKeepGroups,
|
|
548
|
+
byId,
|
|
549
|
+
index,
|
|
550
|
+
sourceList,
|
|
551
|
+
sourceResults,
|
|
552
|
+
order,
|
|
553
|
+
groupLimit,
|
|
554
|
+
toItem,
|
|
555
|
+
l.suggestions,
|
|
556
|
+
l.results,
|
|
557
|
+
pl.loading,
|
|
558
|
+
pl.error,
|
|
559
|
+
setOpen,
|
|
560
|
+
setQuery,
|
|
561
|
+
noop,
|
|
562
|
+
redactLabels,
|
|
563
|
+
]);
|
|
536
564
|
/* eslint-enable react-hooks/refs */
|
|
537
565
|
|
|
538
566
|
// The palette re-runs its provider on a `revision` change, never on the provider's
|
|
@@ -577,7 +605,9 @@ function GlobalSearchImpl({
|
|
|
577
605
|
>
|
|
578
606
|
<Search
|
|
579
607
|
className={triggerIconSize === undefined ? "size-4" : undefined}
|
|
580
|
-
style={
|
|
608
|
+
style={
|
|
609
|
+
triggerIconSize === undefined ? undefined : { width: triggerIconSize, height: triggerIconSize }
|
|
610
|
+
}
|
|
581
611
|
/>
|
|
582
612
|
</button>
|
|
583
613
|
</Tooltip>
|
|
@@ -158,7 +158,11 @@ function withinDistance(a: string, b: string, max: number): boolean {
|
|
|
158
158
|
|
|
159
159
|
type WordKind = keyof typeof WORD_SCORE;
|
|
160
160
|
|
|
161
|
-
function matchWord(
|
|
161
|
+
function matchWord(
|
|
162
|
+
q: string,
|
|
163
|
+
word: string,
|
|
164
|
+
opts: Required<Pick<SearchIndexOptions, "typoMinLength" | "infixMinLength">>,
|
|
165
|
+
): WordKind | null {
|
|
162
166
|
if (word === q) return "exact";
|
|
163
167
|
if (word.startsWith(q)) return "prefix";
|
|
164
168
|
if (q.length >= opts.infixMinLength && word.includes(q)) return "infix";
|
|
@@ -41,8 +41,10 @@ export { DEFAULT_DEVICE_RESET_LABELS };
|
|
|
41
41
|
export const DEVICE_RESET_ANCHOR = "settings-device-reset";
|
|
42
42
|
|
|
43
43
|
// `onReset` is the card's own: the DOM's form-reset handler never fires on a div.
|
|
44
|
-
export interface DeviceResetSettingProps
|
|
45
|
-
|
|
44
|
+
export interface DeviceResetSettingProps extends Omit<
|
|
45
|
+
SettingsSectionProps,
|
|
46
|
+
"anchor" | "title" | "description" | "children" | "onReset"
|
|
47
|
+
> {
|
|
46
48
|
/** The app's sentence after the kit's description: what of its own goes back, and what
|
|
47
49
|
* stays (keksdose: the date format, the feature set and the gestures go; presentation
|
|
48
50
|
* mode and the home position stay). */
|
|
@@ -72,12 +74,7 @@ export interface DeviceResetSettingProps
|
|
|
72
74
|
* `deviceReset`; `title` and `keywords` from these labels), last in its appearance group:
|
|
73
75
|
* inside a `SettingsLayout`, `SettingsSection` throws in development without it.
|
|
74
76
|
*/
|
|
75
|
-
export function DeviceResetSetting({
|
|
76
|
-
description,
|
|
77
|
-
labels: labelsProp,
|
|
78
|
-
onReset,
|
|
79
|
-
...rest
|
|
80
|
-
}: DeviceResetSettingProps) {
|
|
77
|
+
export function DeviceResetSetting({ description, labels: labelsProp, onReset, ...rest }: DeviceResetSettingProps) {
|
|
81
78
|
const labels = useKitLabels("deviceReset", DEFAULT_DEVICE_RESET_LABELS, labelsProp);
|
|
82
79
|
const confirm = useConfirm();
|
|
83
80
|
|
|
@@ -50,7 +50,9 @@ export function useSettingsHeadingLevel(): SettingsHeadingTag | null {
|
|
|
50
50
|
export function SettingsCardTitle({ className, ...props }: ComponentPropsWithoutRef<"div">) {
|
|
51
51
|
const level = useSettingsHeadingLevel();
|
|
52
52
|
if (!level) return <div {...props} className={cn(CARD_TITLE_CLASS, className)} />;
|
|
53
|
-
return
|
|
53
|
+
return (
|
|
54
|
+
<SettingsHeading as={level} tabIndex={-1} {...props} className={cn(CARD_TITLE_CLASS, "outline-none", className)} />
|
|
55
|
+
);
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
/**
|
|
@@ -16,12 +16,7 @@ import { cn } from "../lib/cn";
|
|
|
16
16
|
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
17
17
|
import { createSearchIndex } from "../search/search-index";
|
|
18
18
|
import type { SearchEntry } from "../search/search-index";
|
|
19
|
-
import {
|
|
20
|
-
normalizeSettingsBase,
|
|
21
|
-
settingsHref,
|
|
22
|
-
settingsKeywords,
|
|
23
|
-
visibleSettingsEntries,
|
|
24
|
-
} from "./settings-catalogue";
|
|
19
|
+
import { normalizeSettingsBase, settingsHref, settingsKeywords, visibleSettingsEntries } from "./settings-catalogue";
|
|
25
20
|
import type { SettingsEntry, SettingsGroup } from "./settings-catalogue";
|
|
26
21
|
import { SettingsLayoutContext } from "./settings-context";
|
|
27
22
|
import type { SettingsLayoutContextValue } from "./settings-context";
|
|
@@ -337,7 +332,10 @@ export function SettingsLayout<G extends string>({
|
|
|
337
332
|
e.preventDefault();
|
|
338
333
|
route.back();
|
|
339
334
|
}}
|
|
340
|
-
className={cn(
|
|
335
|
+
className={cn(
|
|
336
|
+
"-ms-1 inline-flex items-center gap-0.5 self-start rounded-md pe-1 text-sm font-medium text-muted hover:text-primary",
|
|
337
|
+
FOCUS_RING,
|
|
338
|
+
)}
|
|
341
339
|
>
|
|
342
340
|
<ChevronLeft aria-hidden className="size-4 rtl:-scale-x-100" />
|
|
343
341
|
{pageTitle}
|
|
@@ -458,12 +456,7 @@ export function SettingsLayout<G extends string>({
|
|
|
458
456
|
{searching ? (
|
|
459
457
|
results
|
|
460
458
|
) : open ? (
|
|
461
|
-
<div
|
|
462
|
-
id={panelId}
|
|
463
|
-
role="tabpanel"
|
|
464
|
-
aria-labelledby={`${panelId}-tab`}
|
|
465
|
-
className="space-y-4"
|
|
466
|
-
>
|
|
459
|
+
<div id={panelId} role="tabpanel" aria-labelledby={`${panelId}-tab`} className="space-y-4">
|
|
467
460
|
<PageHeader as="h2" size="sm" title={open.title} description={open.help} />
|
|
468
461
|
{cards(open.id)}
|
|
469
462
|
</div>
|
|
@@ -70,7 +70,9 @@ export function settingsFromListState(): Record<string, true> {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
function isFromList(state: unknown): boolean {
|
|
73
|
-
return
|
|
73
|
+
return (
|
|
74
|
+
typeof state === "object" && state !== null && (state as Record<string, unknown>)[SETTINGS_FROM_LIST_STATE] === true
|
|
75
|
+
);
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
export interface SettingsLocation {
|
|
@@ -197,8 +199,7 @@ export function useSettingsRoute<G extends string>(options: UseSettingsRouteOpti
|
|
|
197
199
|
return map;
|
|
198
200
|
}, [entries]);
|
|
199
201
|
const ids = visible.map((g) => g.id);
|
|
200
|
-
const fallback =
|
|
201
|
-
defaultGroup !== undefined && ids.includes(defaultGroup) ? defaultGroup : (ids[0] ?? null);
|
|
202
|
+
const fallback = defaultGroup !== undefined && ids.includes(defaultGroup) ? defaultGroup : (ids[0] ?? null);
|
|
202
203
|
|
|
203
204
|
const { group, sub, redirect } = resolveSettingsLocation(location, {
|
|
204
205
|
basePath: base,
|
package/src/shell/app-shell.tsx
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
useCallback,
|
|
4
|
+
useContext,
|
|
5
|
+
useEffect,
|
|
6
|
+
useId,
|
|
7
|
+
useLayoutEffect,
|
|
8
|
+
useMemo,
|
|
9
|
+
useRef,
|
|
10
|
+
useState,
|
|
11
|
+
} from "react";
|
|
2
12
|
import type { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
|
|
3
13
|
import { createPortal } from "react-dom";
|
|
4
14
|
import { Link, NavLink, matchPath, useHref, useLocation } from "react-router";
|
|
@@ -401,9 +411,7 @@ function useNavHeightVar(
|
|
|
401
411
|
// the OUTERMOST shell, for what it portals to <body> (a sheet docking on the bar).
|
|
402
412
|
// The DOM check backs up the context for a shell mounted in a separate React root.
|
|
403
413
|
const global = !embedded && !shell?.parentElement?.closest("[data-app-shell]");
|
|
404
|
-
const targets = [shell, global ? document.documentElement : null].filter(
|
|
405
|
-
(el): el is HTMLElement => el !== null,
|
|
406
|
-
);
|
|
414
|
+
const targets = [shell, global ? document.documentElement : null].filter((el): el is HTMLElement => el !== null);
|
|
407
415
|
// `getBoundingClientRect().height`, rounded DOWN — not `offsetHeight`, and not
|
|
408
416
|
// ceil. Measured on the running app at 406x816: the bar is **55.5px** tall, and
|
|
409
417
|
// both `offsetHeight` and `Math.ceil` answer 56. That is why live #314 round four
|
|
@@ -484,8 +492,7 @@ export function AppShell({
|
|
|
484
492
|
useNavDevWarnings(nav);
|
|
485
493
|
// An embedded shell sharing the default key would overwrite the outer app's sidebar
|
|
486
494
|
// preference with its own — so it persists only when given a key of its own.
|
|
487
|
-
const collapseStorageKey =
|
|
488
|
-
collapseStorageKeyProp ?? (embedded ? null : "appLayout.sidebarCollapsed");
|
|
495
|
+
const collapseStorageKey = collapseStorageKeyProp ?? (embedded ? null : "appLayout.sidebarCollapsed");
|
|
489
496
|
// The three props are per-shell overrides of the provider's `appShell`; one left
|
|
490
497
|
// undefined falls through to the provider rather than to English.
|
|
491
498
|
const labels = useKitLabels("appShell", DEFAULT_APP_SHELL_LABELS, {
|
|
@@ -692,10 +699,7 @@ export function AppShell({
|
|
|
692
699
|
group's `items` were simply unreachable below `md`. ONE measured box, so
|
|
693
700
|
`--app-nav-h` covers both rows and whatever docks on the bar sits on the
|
|
694
701
|
whole of it. */}
|
|
695
|
-
<div
|
|
696
|
-
ref={navRef}
|
|
697
|
-
className="md:hidden fixed bottom-0 inset-x-0 z-30 border-t border-subtle bg-surface"
|
|
698
|
-
>
|
|
702
|
+
<div ref={navRef} className="md:hidden fixed bottom-0 inset-x-0 z-30 border-t border-subtle bg-surface">
|
|
699
703
|
{mobileSubNav && <MobileSubNav nav={nav} layout={mobileSubNavLayout} />}
|
|
700
704
|
<nav
|
|
701
705
|
data-tour="nav"
|
|
@@ -854,9 +858,7 @@ const mobileCellClass = (active: boolean) =>
|
|
|
854
858
|
// label on two lines never leaves its neighbours a different shape.
|
|
855
859
|
"relative flex h-full w-full flex-col items-center justify-start py-2 text-caption gap-0.5 transition-colors",
|
|
856
860
|
"before:absolute before:content-[''] before:inset-x-4 before:top-0 before:h-0.5 before:rounded-full before:transition-colors",
|
|
857
|
-
active
|
|
858
|
-
? "font-semibold text-brand before:bg-brand"
|
|
859
|
-
: "text-muted before:bg-transparent",
|
|
861
|
+
active ? "font-semibold text-brand before:bg-brand" : "text-muted before:bg-transparent",
|
|
860
862
|
);
|
|
861
863
|
|
|
862
864
|
/**
|
|
@@ -939,7 +941,11 @@ function SheetLink({
|
|
|
939
941
|
level === "entry"
|
|
940
942
|
? "flex min-h-11 items-center gap-3 rounded-md px-3 py-2 text-sm transition-colors"
|
|
941
943
|
: "flex min-h-11 items-center gap-2.5 rounded-md px-2.5 py-1.5 text-sm transition-colors",
|
|
942
|
-
isActive
|
|
944
|
+
isActive
|
|
945
|
+
? "bg-inverse text-inverse"
|
|
946
|
+
: level === "entry"
|
|
947
|
+
? "text-primary hover:bg-hover"
|
|
948
|
+
: "text-secondary hover:bg-hover",
|
|
943
949
|
)
|
|
944
950
|
}
|
|
945
951
|
>
|
|
@@ -1001,7 +1007,14 @@ function MobileGroupCell({
|
|
|
1001
1007
|
<ul className="space-y-1">
|
|
1002
1008
|
{!ownPageListed && (
|
|
1003
1009
|
<li>
|
|
1004
|
-
<SheetLink
|
|
1010
|
+
<SheetLink
|
|
1011
|
+
to={item.to}
|
|
1012
|
+
end={item.end}
|
|
1013
|
+
icon={item.icon}
|
|
1014
|
+
label={labels.overview}
|
|
1015
|
+
onClick={close}
|
|
1016
|
+
level="entry"
|
|
1017
|
+
/>
|
|
1005
1018
|
</li>
|
|
1006
1019
|
)}
|
|
1007
1020
|
{pages.map((sub) => (
|
|
@@ -1090,12 +1103,26 @@ function MobileMoreCell({
|
|
|
1090
1103
|
<ul className="space-y-1">
|
|
1091
1104
|
{hidden.map((item) => (
|
|
1092
1105
|
<li key={item.to}>
|
|
1093
|
-
<SheetLink
|
|
1106
|
+
<SheetLink
|
|
1107
|
+
to={item.to}
|
|
1108
|
+
end={item.end}
|
|
1109
|
+
icon={item.icon}
|
|
1110
|
+
label={item.label}
|
|
1111
|
+
onClick={close}
|
|
1112
|
+
level="entry"
|
|
1113
|
+
/>
|
|
1094
1114
|
{!!item.items?.length && (
|
|
1095
1115
|
<ul aria-label={item.label} className="ms-[1.3rem] mt-0.5 space-y-0.5 border-s border-subtle ps-2">
|
|
1096
1116
|
{item.items.map((sub) => (
|
|
1097
1117
|
<li key={sub.to}>
|
|
1098
|
-
<SheetLink
|
|
1118
|
+
<SheetLink
|
|
1119
|
+
to={sub.to}
|
|
1120
|
+
end={sub.end}
|
|
1121
|
+
icon={sub.icon}
|
|
1122
|
+
label={sub.label}
|
|
1123
|
+
onClick={close}
|
|
1124
|
+
level="page"
|
|
1125
|
+
/>
|
|
1099
1126
|
</li>
|
|
1100
1127
|
))}
|
|
1101
1128
|
</ul>
|
|
@@ -1182,7 +1209,8 @@ function MobileSubNav({ nav, layout }: { nav: AppShellNavItem[]; layout: "wrap"
|
|
|
1182
1209
|
|
|
1183
1210
|
/** `strong` is the current page; `trail` is the group that CONTAINS the current page
|
|
1184
1211
|
* while the page itself is shown elsewhere (the inline list below it). */
|
|
1185
|
-
const navLinkClass =
|
|
1212
|
+
const navLinkClass =
|
|
1213
|
+
(collapsed: boolean, forceActive: boolean, trail = false) =>
|
|
1186
1214
|
({ isActive }: { isActive: boolean }) =>
|
|
1187
1215
|
`flex items-center gap-3 min-h-9 ${collapsed ? "justify-center px-2" : "px-3"} py-2 rounded-md text-sm transition-colors duration-150 ${
|
|
1188
1216
|
isActive || (forceActive && !trail)
|
|
@@ -1390,9 +1418,7 @@ function SidebarGroup({
|
|
|
1390
1418
|
className={({ isActive }) =>
|
|
1391
1419
|
cn(
|
|
1392
1420
|
"flex min-h-8 items-center gap-2.5 rounded-md px-2.5 py-1.5 text-sm transition-colors",
|
|
1393
|
-
isActive
|
|
1394
|
-
? "bg-inverse text-inverse"
|
|
1395
|
-
: "text-secondary hover:bg-hover",
|
|
1421
|
+
isActive ? "bg-inverse text-inverse" : "text-secondary hover:bg-hover",
|
|
1396
1422
|
)
|
|
1397
1423
|
}
|
|
1398
1424
|
>
|
|
@@ -1528,9 +1554,7 @@ function SidebarFlyout({ item, children }: { item: AppShellNavItem; children: Re
|
|
|
1528
1554
|
className={({ isActive }) =>
|
|
1529
1555
|
cn(
|
|
1530
1556
|
"flex items-center gap-2.5 px-3 py-2 text-sm",
|
|
1531
|
-
isActive
|
|
1532
|
-
? "bg-active font-medium text-primary"
|
|
1533
|
-
: "text-secondary hover:bg-hover",
|
|
1557
|
+
isActive ? "bg-active font-medium text-primary" : "text-secondary hover:bg-hover",
|
|
1534
1558
|
)
|
|
1535
1559
|
}
|
|
1536
1560
|
>
|
|
@@ -125,12 +125,7 @@ export function AuthLayout({
|
|
|
125
125
|
<div className="mb-2">{logo}</div>
|
|
126
126
|
))}
|
|
127
127
|
{title != null && (
|
|
128
|
-
<Heading
|
|
129
|
-
className={cn(
|
|
130
|
-
"font-semibold leading-tight text-primary",
|
|
131
|
-
wide ? "text-2xl md:text-3xl" : "text-2xl",
|
|
132
|
-
)}
|
|
133
|
-
>
|
|
128
|
+
<Heading className={cn("font-semibold leading-tight text-primary", wide ? "text-2xl md:text-3xl" : "text-2xl")}>
|
|
134
129
|
{title}
|
|
135
130
|
</Heading>
|
|
136
131
|
)}
|
package/src/shell/dev-menu.tsx
CHANGED
|
@@ -182,9 +182,12 @@ export function DevMenu<R extends string, P extends string>({
|
|
|
182
182
|
roles && roles.length > 0 && role !== undefined && onRole
|
|
183
183
|
? [
|
|
184
184
|
{ kind: "heading", key: "head-role", label: words.roleHeading },
|
|
185
|
-
...roles.map(
|
|
186
|
-
|
|
187
|
-
|
|
185
|
+
...roles.map((r): TopBarMenuEntry => ({
|
|
186
|
+
key: `role-${r}`,
|
|
187
|
+
label: roleLabel(r),
|
|
188
|
+
checked: r === role,
|
|
189
|
+
onSelect: () => pickRole(r),
|
|
190
|
+
})),
|
|
188
191
|
// Behind a rule, which ends the role group: "Back to" is a way out, not a role.
|
|
189
192
|
...(original !== undefined && original !== role
|
|
190
193
|
? ([
|
|
@@ -225,9 +228,12 @@ export function DevMenu<R extends string, P extends string>({
|
|
|
225
228
|
words.planHeading
|
|
226
229
|
),
|
|
227
230
|
},
|
|
228
|
-
...plans.map(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
+
...plans.map((p): TopBarMenuEntry => ({
|
|
232
|
+
key: `plan-${p}`,
|
|
233
|
+
label: planLabel(p),
|
|
234
|
+
checked: p === plan,
|
|
235
|
+
onSelect: () => onPlan(p),
|
|
236
|
+
})),
|
|
231
237
|
]
|
|
232
238
|
: [];
|
|
233
239
|
|
|
@@ -60,9 +60,7 @@ export function OptionSwitcherMenu<T extends string>({
|
|
|
60
60
|
{(close) => (
|
|
61
61
|
<ul className="py-1">
|
|
62
62
|
{heading && (
|
|
63
|
-
<li className="px-3 py-1 text-micro font-semibold uppercase tracking-wide text-placeholder">
|
|
64
|
-
{heading}
|
|
65
|
-
</li>
|
|
63
|
+
<li className="px-3 py-1 text-micro font-semibold uppercase tracking-wide text-placeholder">{heading}</li>
|
|
66
64
|
)}
|
|
67
65
|
{options.map((opt) => (
|
|
68
66
|
<li key={opt.value}>
|
|
@@ -160,10 +160,7 @@ export function SyncStatusIndicator({
|
|
|
160
160
|
|
|
161
161
|
const onlineOnly = storage === "none";
|
|
162
162
|
// Online-only: nothing waits on the device, so only offline, error, saving and settled.
|
|
163
|
-
const state = syncState(
|
|
164
|
-
onlineOnly ? { ...status, pending: 0, blocked: 0, waitingForPlan: 0 } : status,
|
|
165
|
-
refreshing,
|
|
166
|
-
);
|
|
163
|
+
const state = syncState(onlineOnly ? { ...status, pending: 0, blocked: 0, waitingForPlan: 0 } : status, refreshing);
|
|
167
164
|
const data = dataAttributes(rest);
|
|
168
165
|
if (hideWhenIdle && state === "synced") return null;
|
|
169
166
|
|
|
@@ -190,12 +187,13 @@ export function SyncStatusIndicator({
|
|
|
190
187
|
text = words.pending(status.pending);
|
|
191
188
|
break;
|
|
192
189
|
default:
|
|
193
|
-
text =
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
190
|
+
text =
|
|
191
|
+
!onlineOnly && status.lastSyncedAt
|
|
192
|
+
? words.syncedAt(
|
|
193
|
+
// A clock time in the UI's language, never the browser's (keksdose live #246).
|
|
194
|
+
new Date(status.lastSyncedAt).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit" }),
|
|
195
|
+
)
|
|
196
|
+
: words.idle;
|
|
199
197
|
}
|
|
200
198
|
if (scope) {
|
|
201
199
|
text = state === "offline" && scope.offline ? scope.offline : words.scoped(scope.name, text);
|
|
@@ -272,7 +270,10 @@ export function SyncStatusIndicator({
|
|
|
272
270
|
{...data}
|
|
273
271
|
role="status"
|
|
274
272
|
data-sync-state={state}
|
|
275
|
-
className={cn(
|
|
273
|
+
className={cn(
|
|
274
|
+
"relative inline-flex size-9 shrink-0 items-center justify-center [&>svg]:size-5",
|
|
275
|
+
TEXT_TONE[tone],
|
|
276
|
+
)}
|
|
276
277
|
>
|
|
277
278
|
{glyph}
|
|
278
279
|
<span className="sr-only">{name}</span>
|
|
@@ -288,7 +289,8 @@ export function SyncStatusIndicator({
|
|
|
288
289
|
</Tooltip>
|
|
289
290
|
);
|
|
290
291
|
|
|
291
|
-
if (!showLabel || !short)
|
|
292
|
+
if (!showLabel || !short)
|
|
293
|
+
return className ? <span className={cn("inline-flex", className)}>{control}</span> : control;
|
|
292
294
|
return (
|
|
293
295
|
<span className={cn("inline-flex items-center gap-1", className)}>
|
|
294
296
|
{control}
|
|
@@ -115,9 +115,7 @@ export const DEFAULT_TOP_BAR_PARTS_LABELS: TopBarPartsLabels = {
|
|
|
115
115
|
},
|
|
116
116
|
sync: {
|
|
117
117
|
blocked: (count) =>
|
|
118
|
-
count === 1
|
|
119
|
-
? "1 change cannot be sent from this device"
|
|
120
|
-
: `${count} changes cannot be sent from this device`,
|
|
118
|
+
count === 1 ? "1 change cannot be sent from this device" : `${count} changes cannot be sent from this device`,
|
|
121
119
|
offline: "Offline — changes are saved on this device and will sync when you reconnect",
|
|
122
120
|
refused: "The server refused the last sync",
|
|
123
121
|
syncing: "Syncing…",
|
|
@@ -83,7 +83,8 @@ type DividerEntry = Extract<TopBarMenuEntry, { kind: "divider" }>;
|
|
|
83
83
|
type RowEntry = Exclude<TopBarMenuEntry, HeadingEntry | DividerEntry>;
|
|
84
84
|
|
|
85
85
|
/** What the panel draws from `entries`: loose rows and rules, and headed groups. */
|
|
86
|
-
type Block =
|
|
86
|
+
type Block =
|
|
87
|
+
{ kind: "loose"; entry: RowEntry | DividerEntry } | { kind: "group"; heading: HeadingEntry; rows: RowEntry[] };
|
|
87
88
|
|
|
88
89
|
/**
|
|
89
90
|
* Cut `entries` into blocks: a heading opens a group that takes the rows after it until
|
|
@@ -167,7 +168,8 @@ export interface TopBarMenuHeader {
|
|
|
167
168
|
/** What a control is, as far as `HoverMenu` is concerned, when it lives in the header
|
|
168
169
|
* or the footer: not a menu row. */
|
|
169
170
|
const SECTION_CONTROLS = "a[href]:not([role]),button:not([role])";
|
|
170
|
-
const TABBABLE =
|
|
171
|
+
const TABBABLE =
|
|
172
|
+
"a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]";
|
|
171
173
|
|
|
172
174
|
/**
|
|
173
175
|
* `scrollable`'s cap (0.51, DevMenu): the glass under the bar. Under `TopBar` the panel
|
|
@@ -402,8 +404,7 @@ export function TopBarActionMenu({
|
|
|
402
404
|
<>
|
|
403
405
|
<span className="sr-only">{ariaLabel}</span>
|
|
404
406
|
{/* The space keeps the name from running into the face's text ("Account
|
|
405
|
-
menu3 unread"); as a flex item it takes no room. */}
|
|
406
|
-
{" "}
|
|
407
|
+
menu3 unread"); as a flex item it takes no room. */}{" "}
|
|
407
408
|
{trigger({ open })}
|
|
408
409
|
</>,
|
|
409
410
|
);
|
|
@@ -500,15 +501,15 @@ export function TopBarActionMenu({
|
|
|
500
501
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- a Tab bubbling up from a row or footer link, see keepTabInsidePanel
|
|
501
502
|
<ul
|
|
502
503
|
className={cn("py-1", scrollable && SCROLLABLE_PANEL, laidOut && COLUMNS_PANEL, panelClassName)}
|
|
503
|
-
style={
|
|
504
|
+
style={
|
|
505
|
+
laidOut ? ({ "--menu-columns-width": `${laidOut.columns.length * 14}rem` } as CSSProperties) : undefined
|
|
506
|
+
}
|
|
504
507
|
onKeyDown={keepTabInsidePanel}
|
|
505
508
|
>
|
|
506
509
|
{header && (
|
|
507
510
|
<MenuSection className={cn("mb-1 border-b border-subtle px-3 py-2", laidOut && SPAN_ALL)}>
|
|
508
511
|
<div className="truncate text-sm font-medium text-primary">{header.title}</div>
|
|
509
|
-
{header.subtitle != null &&
|
|
510
|
-
<div className="truncate text-xs text-muted">{header.subtitle}</div>
|
|
511
|
-
)}
|
|
512
|
+
{header.subtitle != null && <div className="truncate text-xs text-muted">{header.subtitle}</div>}
|
|
512
513
|
{headerExtra != null && headerExtra !== false && <div className="mt-1">{headerExtra}</div>}
|
|
513
514
|
</MenuSection>
|
|
514
515
|
)}
|