@eifi1/ui-kit 0.51.4 → 0.51.6
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 +5 -5
- 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.d.ts +24 -2
- package/dist/components/treemap.js +28 -4
- 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/contrast.d.ts +2 -2
- 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 +59 -9
- 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
|
@@ -5,11 +5,7 @@ import { cn } from "../lib/cn";
|
|
|
5
5
|
import { FIELD_TOUCH_TEXT } from "./field-base";
|
|
6
6
|
import { FOCUS_RING } from "./focus-ring";
|
|
7
7
|
import { evaluateExpression, formatResult, isBareAmount, splitLeadingSign } from "../lib/calc";
|
|
8
|
-
import {
|
|
9
|
-
DEFAULT_CALCULATOR_LABELS,
|
|
10
|
-
useKitLabels,
|
|
11
|
-
type CalculatorLabels,
|
|
12
|
-
} from "../i18n/kit-labels";
|
|
8
|
+
import { DEFAULT_CALCULATOR_LABELS, useKitLabels, type CalculatorLabels } from "../i18n/kit-labels";
|
|
13
9
|
|
|
14
10
|
/** Screen-reader names for the calculator panel's own controls — any part of the
|
|
15
11
|
* kit's `calculator` namespace. Once three optional keys of its own; widened, not
|
|
@@ -46,9 +42,7 @@ interface CalculatorButtonProps {
|
|
|
46
42
|
/** Keypad layout (4 columns). The final C/= row is rendered separately. `name` is
|
|
47
43
|
* the key of the {@link CalculatorLabels} entry that names a non-digit key; a digit
|
|
48
44
|
* is named by its own glyph. */
|
|
49
|
-
type Key =
|
|
50
|
-
| { kind: "ins"; label: string; ins: string; accent?: boolean; name?: KeyName }
|
|
51
|
-
| { kind: "back" };
|
|
45
|
+
type Key = { kind: "ins"; label: string; ins: string; accent?: boolean; name?: KeyName } | { kind: "back" };
|
|
52
46
|
|
|
53
47
|
type KeyName = "plus" | "minus" | "times" | "divide" | "decimal";
|
|
54
48
|
|
|
@@ -158,7 +152,10 @@ function CalculatorPanel({
|
|
|
158
152
|
// is right-aligned in every script too — so both stay physical, pinned
|
|
159
153
|
// with `dir="ltr"` rather than mirrored in a right-to-left form.
|
|
160
154
|
dir="ltr"
|
|
161
|
-
className={cn(
|
|
155
|
+
className={cn(
|
|
156
|
+
"block w-full rounded-md border border-subtle bg-surface px-2 py-1.5 text-right font-mono text-sm text-primary focus:border-strong focus:ring-strong",
|
|
157
|
+
FIELD_TOUCH_TEXT,
|
|
158
|
+
)}
|
|
162
159
|
/>
|
|
163
160
|
<div dir="ltr" className="h-4 pr-1 text-right font-mono text-xs text-placeholder">
|
|
164
161
|
{result !== null && formatResult(result) !== text.trim() ? `= ${formatResult(result)}` : ""}
|
|
@@ -493,7 +493,9 @@ export function CalendarHeatmap({
|
|
|
493
493
|
const gridName = ariaLabel ?? labels.grid;
|
|
494
494
|
let body: ReactNode;
|
|
495
495
|
if (layout === "weeks") {
|
|
496
|
-
const columns = {
|
|
496
|
+
const columns = {
|
|
497
|
+
gridTemplateColumns: `var(--heatmap-label, 2rem) repeat(${weekCount}, var(--heatmap-cell, 0.75rem))`,
|
|
498
|
+
} as CSSProperties;
|
|
497
499
|
const cellSize = "size-[var(--heatmap-cell,0.75rem)]";
|
|
498
500
|
// A month's name over the first column that holds its 1st — or over the first
|
|
499
501
|
// column, when the window opens far enough before the next month for it to fit.
|
|
@@ -576,20 +578,13 @@ export function CalendarHeatmap({
|
|
|
576
578
|
|
|
577
579
|
return (
|
|
578
580
|
<div {...rest} className={cn("min-w-0", className)}>
|
|
579
|
-
{dropped > 0 && (
|
|
580
|
-
<div className="mb-2 text-xs text-muted">{labels.truncated(dropped)}</div>
|
|
581
|
-
)}
|
|
581
|
+
{dropped > 0 && <div className="mb-2 text-xs text-muted">{labels.truncated(dropped)}</div>}
|
|
582
582
|
{body}
|
|
583
583
|
{legend && (
|
|
584
584
|
<div aria-hidden className="mt-2 flex items-center justify-end gap-1 text-micro text-muted">
|
|
585
585
|
<span className="me-0.5">{labels.less}</span>
|
|
586
586
|
{legendLevels.map((l) => (
|
|
587
|
-
<span
|
|
588
|
-
key={l}
|
|
589
|
-
data-legend-level={l}
|
|
590
|
-
className="size-2.5 rounded-sm"
|
|
591
|
-
style={{ background: legendFill(l) }}
|
|
592
|
-
/>
|
|
587
|
+
<span key={l} data-legend-level={l} className="size-2.5 rounded-sm" style={{ background: legendFill(l) }} />
|
|
593
588
|
))}
|
|
594
589
|
<span className="ms-0.5">{labels.more}</span>
|
|
595
590
|
</div>
|
package/src/components/card.tsx
CHANGED
|
@@ -205,14 +205,14 @@ export function Card({
|
|
|
205
205
|
? // No shadow and no `flush`: it sits on a surface that already has both.
|
|
206
206
|
"rounded-lg border border-subtle bg-surface p-4"
|
|
207
207
|
: cn(
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
208
|
+
// Surface + border are theme tokens so the palette switcher (feedback
|
|
209
|
+
// #307) can re-skin every card; a caller's own bg-*/border-* override
|
|
210
|
+
// still wins via tailwind-merge.
|
|
211
|
+
"bg-surface",
|
|
212
|
+
flush
|
|
213
|
+
? "border-y border-subtle md:rounded-lg md:border md:shadow-sm"
|
|
214
|
+
: "rounded-lg border border-subtle shadow-sm",
|
|
215
|
+
),
|
|
216
216
|
toned && (bordered ? toned.border : toned.fill),
|
|
217
217
|
strong && tone && CARD_TONES_STRONG[tone],
|
|
218
218
|
toneFill && bordered && tone && CARD_TONE_WASH[tone],
|
|
@@ -372,10 +372,6 @@ export function CardContent({ className, ...props }: CardContentProps) {
|
|
|
372
372
|
export function CardFooter({ className, ...props }: CardFooterProps) {
|
|
373
373
|
const padded = useContext(CardPaddedContext);
|
|
374
374
|
return (
|
|
375
|
-
<div
|
|
376
|
-
data-slot="card-footer"
|
|
377
|
-
className={cn("flex items-center", !padded && "px-6 pb-6", className)}
|
|
378
|
-
{...props}
|
|
379
|
-
/>
|
|
375
|
+
<div data-slot="card-footer" className={cn("flex items-center", !padded && "px-6 pb-6", className)} {...props} />
|
|
380
376
|
);
|
|
381
377
|
}
|
|
@@ -26,12 +26,7 @@
|
|
|
26
26
|
// types, and until 0.35 the deprecated arithmetic and HOC, which no app imports.
|
|
27
27
|
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
28
28
|
import type { ComponentType, Dispatch, ReactNode, SetStateAction } from "react";
|
|
29
|
-
import {
|
|
30
|
-
usePlotArea,
|
|
31
|
-
useXAxisInverseScale,
|
|
32
|
-
useYAxisInverseScale,
|
|
33
|
-
type InverseScaleFunction,
|
|
34
|
-
} from "recharts";
|
|
29
|
+
import { usePlotArea, useXAxisInverseScale, useYAxisInverseScale, type InverseScaleFunction } from "recharts";
|
|
35
30
|
import { X } from "lucide-react";
|
|
36
31
|
import { cn } from "../lib/cn";
|
|
37
32
|
import { FOCUS_RING } from "./focus-ring";
|
|
@@ -202,9 +197,7 @@ function widen(span: Span, value: unknown): Span {
|
|
|
202
197
|
|
|
203
198
|
/** Which series are measured on an axis. */
|
|
204
199
|
function keysOn(source: ZoomFitSource, axisId: string): string[] {
|
|
205
|
-
return source.series
|
|
206
|
-
.filter((entry) => (entry.axis ?? DEFAULT_Y_AXIS) === axisId)
|
|
207
|
-
.map((entry) => entry.key);
|
|
200
|
+
return source.series.filter((entry) => (entry.axis ?? DEFAULT_Y_AXIS) === axisId).map((entry) => entry.key);
|
|
208
201
|
}
|
|
209
202
|
|
|
210
203
|
/** A row's value as a sample, or 0 for a stack's missing layer — a stacked bar with no
|
|
@@ -274,10 +267,7 @@ export function axisExtent(
|
|
|
274
267
|
* An axis with nothing inside the window is left OUT rather than collapsed: a window
|
|
275
268
|
* between two samples is one where the chart should keep drawing the line across.
|
|
276
269
|
*/
|
|
277
|
-
export function fitYToX(
|
|
278
|
-
source: ZoomFitSource,
|
|
279
|
-
window: readonly [number, number],
|
|
280
|
-
): Record<string, [number, number]> {
|
|
270
|
+
export function fitYToX(source: ZoomFitSource, window: readonly [number, number]): Record<string, [number, number]> {
|
|
281
271
|
const fitted: Record<string, [number, number]> = {};
|
|
282
272
|
for (const axis of source.axes) {
|
|
283
273
|
const span = axisExtent(source, axis.id, window);
|
|
@@ -328,11 +318,7 @@ export const NO_ZOOM: ZoomState = { x: undefined, y: null };
|
|
|
328
318
|
* the first: a band down y keeps the x window when the band holds no samples, and
|
|
329
319
|
* otherwise pulls x in to where they are.
|
|
330
320
|
*/
|
|
331
|
-
export function zoomAfter(
|
|
332
|
-
state: ZoomState,
|
|
333
|
-
selection: ZoomSelection,
|
|
334
|
-
source: ZoomFitSource,
|
|
335
|
-
): ZoomState {
|
|
321
|
+
export function zoomAfter(state: ZoomState, selection: ZoomSelection, source: ZoomFitSource): ZoomState {
|
|
336
322
|
if (selection.which === "both") return { x: selection.x, y: selection.y };
|
|
337
323
|
// Leave y derived, so it fits itself to what is inside the new window.
|
|
338
324
|
if (selection.which === "x") return { x: selection.x, y: null };
|
|
@@ -566,14 +552,7 @@ function ZoomLayer({
|
|
|
566
552
|
// What the drag would do, shown while it is being made: a band paints the full width
|
|
567
553
|
// or height, so the reader sees it is about to let the other axis refit.
|
|
568
554
|
const which = drag
|
|
569
|
-
? zoomAxesFor(
|
|
570
|
-
drag.toX - drag.fromX,
|
|
571
|
-
drag.toY - drag.fromY,
|
|
572
|
-
plot.width,
|
|
573
|
-
plot.height,
|
|
574
|
-
ZOOM_SQUARE_ENOUGH,
|
|
575
|
-
only,
|
|
576
|
-
)
|
|
555
|
+
? zoomAxesFor(drag.toX - drag.fromX, drag.toY - drag.fromY, plot.width, plot.height, ZOOM_SQUARE_ENOUGH, only)
|
|
577
556
|
: null;
|
|
578
557
|
|
|
579
558
|
return (
|
|
@@ -635,13 +614,7 @@ function ZoomLayer({
|
|
|
635
614
|
}
|
|
636
615
|
|
|
637
616
|
/** One axis's pixel→value function, parked where the pointer handler can reach it. */
|
|
638
|
-
function AxisProbe({
|
|
639
|
-
axisId,
|
|
640
|
-
scales,
|
|
641
|
-
}: {
|
|
642
|
-
axisId: string;
|
|
643
|
-
scales: Map<string, InverseScaleFunction | undefined>;
|
|
644
|
-
}) {
|
|
617
|
+
function AxisProbe({ axisId, scales }: { axisId: string; scales: Map<string, InverseScaleFunction | undefined> }) {
|
|
645
618
|
const inverse = useYAxisInverseScale(axisId);
|
|
646
619
|
useEffect(() => {
|
|
647
620
|
scales.set(axisId, inverse);
|
package/src/components/chart.tsx
CHANGED
|
@@ -10,11 +10,7 @@
|
|
|
10
10
|
// that make shadcn charts read as "designed" rather than "default Recharts".
|
|
11
11
|
import { createContext, useContext, useEffect, useId, useLayoutEffect, useRef, useState } from "react";
|
|
12
12
|
import type { ComponentProps, CSSProperties, ReactNode, RefObject } from "react";
|
|
13
|
-
import {
|
|
14
|
-
Legend as RechartsLegend,
|
|
15
|
-
ResponsiveContainer,
|
|
16
|
-
Tooltip as RechartsTooltip,
|
|
17
|
-
} from "recharts";
|
|
13
|
+
import { Legend as RechartsLegend, ResponsiveContainer, Tooltip as RechartsTooltip } from "recharts";
|
|
18
14
|
import { cn } from "../lib/cn";
|
|
19
15
|
import { isRtl } from "../lib/direction";
|
|
20
16
|
import { TYPOGRAPHIC_MINUS } from "../lib/minus";
|
|
@@ -116,8 +112,7 @@ const CSS_IDENT = /^[A-Za-z_][A-Za-z0-9_-]*$/;
|
|
|
116
112
|
* deliberately not accepted: its second argument is an arbitrary value, i.e. the same
|
|
117
113
|
* hole in a shape that looks safe.
|
|
118
114
|
*/
|
|
119
|
-
const CSS_COLOR =
|
|
120
|
-
/^(?:#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}|(?:rgba?|hsla?)\([0-9A-Za-z.,%/ -]*\)|var\(--[A-Za-z0-9_-]+\))$/;
|
|
115
|
+
const CSS_COLOR = /^(?:#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}|(?:rgba?|hsla?)\([0-9A-Za-z.,%/ -]*\)|var\(--[A-Za-z0-9_-]+\))$/;
|
|
121
116
|
|
|
122
117
|
/**
|
|
123
118
|
* The colour an entry is painted with, or `undefined` when the style block refuses it.
|
|
@@ -152,9 +147,7 @@ function ChartStyle({ id, config }: { id: string; config: ChartConfig }) {
|
|
|
152
147
|
return true;
|
|
153
148
|
});
|
|
154
149
|
if (!entries.length) return null;
|
|
155
|
-
const css = `[data-chart=${id}] {\n${entries
|
|
156
|
-
.map(([key, c]) => ` --color-${key}: ${c.color};`)
|
|
157
|
-
.join("\n")}\n}`;
|
|
150
|
+
const css = `[data-chart=${id}] {\n${entries.map(([key, c]) => ` --color-${key}: ${c.color};`).join("\n")}\n}`;
|
|
158
151
|
return <style dangerouslySetInnerHTML={{ __html: css }} />;
|
|
159
152
|
}
|
|
160
153
|
|
|
@@ -387,17 +380,10 @@ export function ChartTooltipContent({
|
|
|
387
380
|
className={cn("flex items-center", inRow ? "min-w-0 max-w-[12rem] gap-1.5" : "gap-2")}
|
|
388
381
|
>
|
|
389
382
|
<span
|
|
390
|
-
className={cn(
|
|
391
|
-
"shrink-0 rounded-[2px]",
|
|
392
|
-
indicator === "dot" ? "h-2.5 w-2.5 rounded-full" : "h-2.5 w-1",
|
|
393
|
-
)}
|
|
383
|
+
className={cn("shrink-0 rounded-[2px]", indicator === "dot" ? "h-2.5 w-2.5 rounded-full" : "h-2.5 w-1")}
|
|
394
384
|
style={{ backgroundColor: color }}
|
|
395
385
|
/>
|
|
396
|
-
<span
|
|
397
|
-
className={cn("min-w-0 text-muted", inRow ? "truncate" : "break-words")}
|
|
398
|
-
>
|
|
399
|
-
{name}
|
|
400
|
-
</span>
|
|
386
|
+
<span className={cn("min-w-0 text-muted", inRow ? "truncate" : "break-words")}>{name}</span>
|
|
401
387
|
<span
|
|
402
388
|
data-private
|
|
403
389
|
// Isolated, so an RTL page does not turn "-26.6" into "26.6-": a figure has no
|
|
@@ -457,9 +443,7 @@ export function ChartTooltipContent({
|
|
|
457
443
|
className="min-w-[9rem] max-w-[min(20rem,calc(100vw-2rem))] rounded-lg border border-subtle bg-surface px-2.5 py-2 text-xs shadow-xl"
|
|
458
444
|
>
|
|
459
445
|
{!hideLabel && label != null && (
|
|
460
|
-
<div className="mb-1.5 font-medium text-primary">
|
|
461
|
-
{labelFormatter ? labelFormatter(label) : label}
|
|
462
|
-
</div>
|
|
446
|
+
<div className="mb-1.5 font-medium text-primary">{labelFormatter ? labelFormatter(label) : label}</div>
|
|
463
447
|
)}
|
|
464
448
|
<div className="grid gap-1.5">{items.map((item, i) => tooltipRow(item, i, false))}</div>
|
|
465
449
|
</div>
|
|
@@ -490,12 +474,7 @@ interface ChartLegendContentProps {
|
|
|
490
474
|
activeKey?: string | null;
|
|
491
475
|
}
|
|
492
476
|
|
|
493
|
-
export function ChartLegendContent({
|
|
494
|
-
payload,
|
|
495
|
-
onItemClick,
|
|
496
|
-
hiddenKeys,
|
|
497
|
-
activeKey,
|
|
498
|
-
}: ChartLegendContentProps) {
|
|
477
|
+
export function ChartLegendContent({ payload, onItemClick, hiddenKeys, activeKey }: ChartLegendContentProps) {
|
|
499
478
|
const hidden = hiddenKeys ? new Set(hiddenKeys) : null;
|
|
500
479
|
const config = useChart();
|
|
501
480
|
if (!payload?.length) return null;
|
|
@@ -536,9 +515,7 @@ export function ChartLegendContent({
|
|
|
536
515
|
// in isolate mode pressed = the isolated one. With neither supplied the
|
|
537
516
|
// legend knows nothing about state, and a pressed="false" it cannot vouch
|
|
538
517
|
// for would lie — so it says nothing.
|
|
539
|
-
aria-pressed={
|
|
540
|
-
hidden ? !off : activeKey === undefined ? undefined : activeKey === cfgKey
|
|
541
|
-
}
|
|
518
|
+
aria-pressed={hidden ? !off : activeKey === undefined ? undefined : activeKey === cfgKey}
|
|
542
519
|
className={className}
|
|
543
520
|
>
|
|
544
521
|
{swatch}
|
|
@@ -212,10 +212,7 @@ export function CheckboxGroup<T extends string = string>({
|
|
|
212
212
|
)}
|
|
213
213
|
<RequiredStarOnLegend.Provider value={true}>
|
|
214
214
|
<div
|
|
215
|
-
className={cn(
|
|
216
|
-
layout === "horizontal" ? "flex flex-wrap gap-x-4 gap-y-2" : COLUMNS[columns],
|
|
217
|
-
listClassName,
|
|
218
|
-
)}
|
|
215
|
+
className={cn(layout === "horizontal" ? "flex flex-wrap gap-x-4 gap-y-2" : COLUMNS[columns], listClassName)}
|
|
219
216
|
>
|
|
220
217
|
{options.map((o) => (
|
|
221
218
|
<Checkbox
|
|
@@ -37,8 +37,7 @@ export { DEFAULT_CHIP_INPUT_LABELS };
|
|
|
37
37
|
* div's `onChange` is omitted rather than shadowed. `placeholder` is likewise this
|
|
38
38
|
* component's, forwarded to the inner `<input>`; the div has none of its own.
|
|
39
39
|
*/
|
|
40
|
-
export interface ChipInputProps
|
|
41
|
-
extends Omit<ComponentPropsWithoutRef<"div">, "onChange" | "placeholder" | "children"> {
|
|
40
|
+
export interface ChipInputProps extends Omit<ComponentPropsWithoutRef<"div">, "onChange" | "placeholder" | "children"> {
|
|
42
41
|
value: string[];
|
|
43
42
|
onChange: (next: string[]) => void;
|
|
44
43
|
placeholder?: string;
|
|
@@ -127,9 +126,7 @@ export function ChipInput({
|
|
|
127
126
|
const errorId = `${id}-error`;
|
|
128
127
|
const rejectedId = `${id}-rejected`;
|
|
129
128
|
const isInvalid = invalid || !!error;
|
|
130
|
-
const describedBy = [error ? errorId : null, rejected ? rejectedId : null]
|
|
131
|
-
.filter(Boolean)
|
|
132
|
-
.join(" ");
|
|
129
|
+
const describedBy = [error ? errorId : null, rejected ? rejectedId : null].filter(Boolean).join(" ");
|
|
133
130
|
|
|
134
131
|
const focusChip = (index: number | null) => {
|
|
135
132
|
setFocusedChip(index);
|
|
@@ -344,7 +341,10 @@ export function ChipInput({
|
|
|
344
341
|
// `w-0` with flex-1: without a width the browser's default input size (20
|
|
345
342
|
// characters) became the field's minimum width and pushed it past a 240 px
|
|
346
343
|
// phone at 150 % (0.32's screenshot run).
|
|
347
|
-
className={cn(
|
|
344
|
+
className={cn(
|
|
345
|
+
"w-0 min-w-[6rem] flex-1 bg-transparent py-0.5 text-sm text-primary outline-none placeholder:text-placeholder disabled:cursor-default",
|
|
346
|
+
FIELD_TOUCH_TEXT,
|
|
347
|
+
)}
|
|
348
348
|
/>
|
|
349
349
|
{/* Additions, removals and rejections move no focus, so nothing would announce
|
|
350
350
|
them. `sr-only-fixed` rather than `sr-only`: this sits inside a consumer's
|
package/src/components/chip.tsx
CHANGED
|
@@ -34,16 +34,7 @@ export type { ChipInputLabels, ChipInputProps } from "./chip-input";
|
|
|
34
34
|
* things". Using `Button` for both is the mistake this exists to prevent.
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
|
-
export type ChipTone =
|
|
38
|
-
| "neutral"
|
|
39
|
-
| "brand"
|
|
40
|
-
| "danger"
|
|
41
|
-
| "warning"
|
|
42
|
-
| "success"
|
|
43
|
-
| "info"
|
|
44
|
-
| "income"
|
|
45
|
-
| "expense"
|
|
46
|
-
| ChipHue;
|
|
37
|
+
export type ChipTone = "neutral" | "brand" | "danger" | "warning" | "success" | "info" | "income" | "expense" | ChipHue;
|
|
47
38
|
/**
|
|
48
39
|
* Categorical hues (0.10.0): colour that says "a different value" and nothing more —
|
|
49
40
|
* kastlan's status-badge.tsx paints ~15 enums in 9 Tailwind hues by hand. Four of those
|
|
@@ -263,10 +254,7 @@ export interface ChipLinkProps {
|
|
|
263
254
|
* {@link Chip}): `split` is then the interactive part's own padding — the full start
|
|
264
255
|
* inset, a short end one before the ×; `tail` is the wrapper's end inset after the ×.
|
|
265
256
|
*/
|
|
266
|
-
const SIZE: Record<
|
|
267
|
-
ChipSize,
|
|
268
|
-
{ body: string; split: string; tail: string; icon: string; remove: string }
|
|
269
|
-
> = {
|
|
257
|
+
const SIZE: Record<ChipSize, { body: string; split: string; tail: string; icon: string; remove: string }> = {
|
|
270
258
|
xs: {
|
|
271
259
|
body: "gap-1 px-1.5 py-0 text-caption leading-4",
|
|
272
260
|
split: "gap-1 ps-1.5 pe-0.5 py-0 text-caption leading-4",
|
|
@@ -582,8 +570,7 @@ export function Chip({
|
|
|
582
570
|
const interactive = !!href || !!onClick;
|
|
583
571
|
// One radius for every rounded piece — the pill, the body inside a split pill, the ×
|
|
584
572
|
// — so a square chip has no round focus ring inside it.
|
|
585
|
-
const radius =
|
|
586
|
-
shape === "square" ? (size === "sm" || size === "xs" ? "rounded" : "rounded-md") : "rounded-full";
|
|
573
|
+
const radius = shape === "square" ? (size === "sm" || size === "xs" ? "rounded" : "rounded-md") : "rounded-full";
|
|
587
574
|
const dot = variant === "dot";
|
|
588
575
|
const type = cn(caps && CAPS[size], variant === "solid" && "justify-center tabular-nums");
|
|
589
576
|
const surface = cn(
|
|
@@ -682,11 +669,7 @@ export function Chip({
|
|
|
682
669
|
// Composed through `common.fieldValue` because the punctuation between the two
|
|
683
670
|
// halves is the language's, not ours. A chip whose content is not plain text
|
|
684
671
|
// has no value to name, and gets the bare verb rather than a dangling colon.
|
|
685
|
-
aria-label={
|
|
686
|
-
typeof children === "string" && children
|
|
687
|
-
? common.fieldValue(common.remove, children)
|
|
688
|
-
: common.remove
|
|
689
|
-
}
|
|
672
|
+
aria-label={typeof children === "string" && children ? common.fieldValue(common.remove, children) : common.remove}
|
|
690
673
|
onClick={(e) => {
|
|
691
674
|
// The chip may itself be a link; removing it must not also follow it.
|
|
692
675
|
e.preventDefault();
|
|
@@ -723,7 +706,15 @@ export function Chip({
|
|
|
723
706
|
ref={snap ? snapRef : undefined}
|
|
724
707
|
data-tone={tone}
|
|
725
708
|
// The pill is the target's box here (§4): the body inside stretches to its height.
|
|
726
|
-
className={cn(
|
|
709
|
+
className={cn(
|
|
710
|
+
CHIP_PILL,
|
|
711
|
+
s.tail,
|
|
712
|
+
radius,
|
|
713
|
+
surface,
|
|
714
|
+
target && CHIP_TOUCH_LARGE,
|
|
715
|
+
snap && "justify-center",
|
|
716
|
+
className,
|
|
717
|
+
)}
|
|
727
718
|
>
|
|
728
719
|
{inner}
|
|
729
720
|
{remove}
|
|
@@ -847,9 +838,6 @@ export function Chip({
|
|
|
847
838
|
}
|
|
848
839
|
|
|
849
840
|
/** Calls a chip's `renderLink` with the props it was given — see its call site. */
|
|
850
|
-
function RenderedLink({
|
|
851
|
-
render,
|
|
852
|
-
...props
|
|
853
|
-
}: ChipLinkProps & { render: (props: ChipLinkProps) => ReactElement }) {
|
|
841
|
+
function RenderedLink({ render, ...props }: ChipLinkProps & { render: (props: ChipLinkProps) => ReactElement }) {
|
|
854
842
|
return render(props);
|
|
855
843
|
}
|
|
@@ -163,10 +163,7 @@ export function ChoiceCard({
|
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
return (
|
|
166
|
-
<label
|
|
167
|
-
htmlFor={inputId}
|
|
168
|
-
className={cn(CARD, disabled && CARD_DISABLED, isInvalid && CARD_INVALID, className)}
|
|
169
|
-
>
|
|
166
|
+
<label htmlFor={inputId} className={cn(CARD, disabled && CARD_DISABLED, isInvalid && CARD_INVALID, className)}>
|
|
170
167
|
{/* A 20px cell, so the box centres on the title's first line (text-sm). */}
|
|
171
168
|
<span className="relative flex h-5 shrink-0 items-center">
|
|
172
169
|
<input
|
|
@@ -187,12 +184,7 @@ export function ChoiceCard({
|
|
|
187
184
|
onChange?.(e);
|
|
188
185
|
onCheckedChange?.(e.target.checked);
|
|
189
186
|
}}
|
|
190
|
-
className={cn(
|
|
191
|
-
BOX,
|
|
192
|
-
type === "radio" ? RADIO : CHECKBOX,
|
|
193
|
-
mixed && "border-brand bg-brand",
|
|
194
|
-
inputClassName,
|
|
195
|
-
)}
|
|
187
|
+
className={cn(BOX, type === "radio" ? RADIO : CHECKBOX, mixed && "border-brand bg-brand", inputClassName)}
|
|
196
188
|
/>
|
|
197
189
|
{type === "checkbox" &&
|
|
198
190
|
(mixed ? (
|
|
@@ -356,11 +348,7 @@ export function ActionCard({
|
|
|
356
348
|
className,
|
|
357
349
|
);
|
|
358
350
|
const labelledBy = rest["aria-labelledby"] ?? titleId;
|
|
359
|
-
const describedBy = mergeDescribedBy(
|
|
360
|
-
rest["aria-describedby"],
|
|
361
|
-
showDescription && descriptionId,
|
|
362
|
-
showMeta && metaId,
|
|
363
|
-
);
|
|
351
|
+
const describedBy = mergeDescribedBy(rest["aria-describedby"], showDescription && descriptionId, showMeta && metaId);
|
|
364
352
|
const body = (
|
|
365
353
|
<>
|
|
366
354
|
{Icon && <Icon aria-hidden className={cn("mt-0.5 size-5 shrink-0", ICON_TONE[iconTone], iconClassName)} />}
|
|
@@ -486,9 +474,7 @@ export interface ChoiceCardMultipleProps<T extends string> extends ChoiceCardGro
|
|
|
486
474
|
onChange: (value: T[]) => void;
|
|
487
475
|
}
|
|
488
476
|
|
|
489
|
-
export type ChoiceCardGroupProps<T extends string> =
|
|
490
|
-
| ChoiceCardSingleProps<T>
|
|
491
|
-
| ChoiceCardMultipleProps<T>;
|
|
477
|
+
export type ChoiceCardGroupProps<T extends string> = ChoiceCardSingleProps<T> | ChoiceCardMultipleProps<T>;
|
|
492
478
|
|
|
493
479
|
/**
|
|
494
480
|
* A set of {@link ChoiceCard}s answering one question, in a `<fieldset>`.
|
|
@@ -10,8 +10,7 @@ export const markedShort = (role: string) => `${role} *`;
|
|
|
10
10
|
|
|
11
11
|
export const DEFAULT_COLUMN_MAPPER_LABELS: ColumnMapperLabels = {
|
|
12
12
|
paste: "Paste a table",
|
|
13
|
-
pasteHint:
|
|
14
|
-
"Copy the rows out of a spreadsheet and paste them here, or drop a CSV or text file.",
|
|
13
|
+
pasteHint: "Copy the rows out of a spreadsheet and paste them here, or drop a CSV or text file.",
|
|
15
14
|
chooseFile: "Choose a file",
|
|
16
15
|
readError: (name) => `“${name}” could not be read`,
|
|
17
16
|
headerRow: "The first line names the columns",
|
|
@@ -23,10 +22,7 @@ export const DEFAULT_COLUMN_MAPPER_LABELS: ColumnMapperLabels = {
|
|
|
23
22
|
separatorSpace: "separated by spaces",
|
|
24
23
|
decimalComma: "decimal comma (1,5)",
|
|
25
24
|
decimalPoint: "decimal point (1.5)",
|
|
26
|
-
unreadCount: (count) =>
|
|
27
|
-
count === 1
|
|
28
|
-
? "1 line could not be read"
|
|
29
|
-
: `${count} lines could not be read`,
|
|
25
|
+
unreadCount: (count) => (count === 1 ? "1 line could not be read" : `${count} lines could not be read`),
|
|
30
26
|
unreadLine: (line) => `Line ${line} could not be read`,
|
|
31
27
|
unreadMore: (count) => `…and ${count} more`,
|
|
32
28
|
noRows: "No line of this text reads as a row of the table.",
|
|
@@ -36,10 +32,7 @@ export const DEFAULT_COLUMN_MAPPER_LABELS: ColumnMapperLabels = {
|
|
|
36
32
|
ignore: "Ignore",
|
|
37
33
|
requiredRole: (role) => `${role} (required)`,
|
|
38
34
|
requiredRoleShort: markedShort,
|
|
39
|
-
previewOf: (shown, total) =>
|
|
40
|
-
shown === 1
|
|
41
|
-
? `The first of ${total} rows`
|
|
42
|
-
: `The first ${shown} of ${total} rows`,
|
|
35
|
+
previewOf: (shown, total) => (shown === 1 ? `The first of ${total} rows` : `The first ${shown} of ${total} rows`),
|
|
43
36
|
oneOf: (roles) => `either ${roles}`,
|
|
44
37
|
missing: (roles) => `Still needed: ${roles}.`,
|
|
45
38
|
};
|