@eifi1/ui-kit 0.51.3 → 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 +6 -6
- 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 +5 -9
- 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 +13 -11
- 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 +7 -5
- 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 +49 -57
- 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.d.ts +8 -0
- 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 +11 -12
- 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 +6 -10
- 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 +6 -12
- 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 +8 -2
- package/dist/components/legal-labels.js.map +1 -1
- package/dist/components/legal-page.d.ts +18 -1
- package/dist/components/legal-page.js +27 -2
- package/dist/components/legal-page.js.map +1 -1
- package/dist/components/legal.d.ts +40 -5
- package/dist/components/legal.js +41 -5
- 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-labels.js +3 -1
- package/dist/components/list-labels.js.map +1 -1
- package/dist/components/list.d.ts +18 -1
- package/dist/components/list.js +54 -13
- 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.d.ts +3 -1
- package/dist/feedback/feedback-table.js +22 -5
- 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 +15 -4
- 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 +19 -4
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/es.js +15 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +15 -4
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +15 -4
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +15 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +11 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/plurals.js.map +1 -1
- package/dist/i18n/review.js +15 -7
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +17 -17
- 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 +20 -0
- package/dist/lib/text-match.js +11 -1
- 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-focus.d.ts +7 -0
- package/dist/settings/use-settings-focus.js +2 -0
- package/dist/settings/use-settings-focus.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.d.ts +5 -0
- package/dist/shell/dev-menu.js +14 -7
- 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.d.ts +14 -1
- package/dist/shell/topbar-action-menu.js +85 -34
- 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/shell.d.ts +1 -1
- package/dist/shell.js +2 -1
- package/dist/shell.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 +17 -47
- 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 +16 -18
- 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 +7 -7
- package/src/components/data-table-groups.tsx +3 -1
- package/src/components/data-table-head.tsx +32 -46
- 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 +497 -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 +21 -16
- 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 +9 -20
- package/src/components/image-grid.tsx +1 -6
- package/src/components/inline-edit-field.tsx +1 -5
- package/src/components/inline-entity-combobox.tsx +11 -25
- package/src/components/input.tsx +14 -2
- package/src/components/jump-calendar.tsx +2 -6
- package/src/components/legal-labels.ts +8 -3
- package/src/components/legal-page.tsx +56 -6
- package/src/components/legal.tsx +83 -10
- package/src/components/lightbox.tsx +1 -3
- package/src/components/line-items.tsx +7 -15
- package/src/components/list-labels.ts +2 -0
- package/src/components/list.tsx +81 -27
- 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 +29 -9
- 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 +42 -50
- package/src/i18n/kit-labels.tsx +5 -20
- package/src/i18n/languages.ts +2 -8
- package/src/i18n/locales/en.ts +15 -31
- package/src/i18n/locales/es.ts +44 -50
- package/src/i18n/locales/fr.ts +43 -52
- package/src/i18n/locales/hu.ts +35 -38
- package/src/i18n/locales/it.ts +44 -53
- package/src/i18n/locales/zh.ts +23 -33
- package/src/i18n/plurals.ts +4 -1
- package/src/i18n/review.ts +20 -7
- package/src/i18n/shared-labels.ts +1 -2
- package/src/index.ts +107 -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 +43 -1
- 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-focus.ts +8 -0
- 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 +18 -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 +130 -45
- package/src/shell/topbar-controls.tsx +5 -19
- package/src/shell/tour-menu.tsx +9 -1
- package/src/shell.ts +1 -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
|
@@ -128,10 +128,7 @@ type Entry = { at: number; order: number; message: FeedbackThreadMessage };
|
|
|
128
128
|
|
|
129
129
|
/** The admin's Hide / Unhide as a promise — a sync throw or a `void` return included —
|
|
130
130
|
* so the click can catch it as Delete's does. */
|
|
131
|
-
const hideComment = async (
|
|
132
|
-
onHide: NonNullable<FeedbackCommentThreadProps["onHide"]>,
|
|
133
|
-
comment: FeedbackComment,
|
|
134
|
-
) => {
|
|
131
|
+
const hideComment = async (onHide: NonNullable<FeedbackCommentThreadProps["onHide"]>, comment: FeedbackComment) => {
|
|
135
132
|
await onHide(comment, !comment.hidden);
|
|
136
133
|
};
|
|
137
134
|
|
|
@@ -186,7 +183,10 @@ export function FeedbackCommentThread({
|
|
|
186
183
|
? [{ name: attachmentName(reply.attachment_url), url: reply.attachment_url }]
|
|
187
184
|
: undefined,
|
|
188
185
|
badge: (
|
|
189
|
-
<span
|
|
186
|
+
<span
|
|
187
|
+
className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1"
|
|
188
|
+
data-feedback-entry-kind="rework"
|
|
189
|
+
>
|
|
190
190
|
<FeedbackReworkEntryChip />
|
|
191
191
|
{reply.status_to && (
|
|
192
192
|
<span className="inline-flex items-center gap-1" data-feedback-reply-status={reply.status_to}>
|
|
@@ -215,7 +215,10 @@ export function FeedbackCommentThread({
|
|
|
215
215
|
: undefined,
|
|
216
216
|
staff: true,
|
|
217
217
|
badge: reply.status_to ? (
|
|
218
|
-
<span
|
|
218
|
+
<span
|
|
219
|
+
className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1"
|
|
220
|
+
data-feedback-reply-status={reply.status_to}
|
|
221
|
+
>
|
|
219
222
|
<span className="sr-only">{replyLabels.statusChanged}</span>
|
|
220
223
|
<span aria-hidden>→</span>
|
|
221
224
|
<FeedbackStatusBadge status={reply.status_to} />
|
|
@@ -179,10 +179,7 @@ export function FeedbackContextBox({
|
|
|
179
179
|
const lead = line.endsWith(submitter) ? line.slice(0, line.length - submitter.length) : null;
|
|
180
180
|
return (
|
|
181
181
|
<div
|
|
182
|
-
className={cn(
|
|
183
|
-
"space-y-1 rounded-md border border-subtle bg-surface-2 px-3 py-2 text-xs text-muted",
|
|
184
|
-
className,
|
|
185
|
-
)}
|
|
182
|
+
className={cn("space-y-1 rounded-md border border-subtle bg-surface-2 px-3 py-2 text-xs text-muted", className)}
|
|
186
183
|
>
|
|
187
184
|
<div className="[overflow-wrap:anywhere]">
|
|
188
185
|
{lead === null ? (
|
|
@@ -251,16 +251,15 @@ export function FeedbackDialog(props: FeedbackDialogProps) {
|
|
|
251
251
|
const [files, setFiles] = useState<File[]>([]);
|
|
252
252
|
const isMobile = usePhoneLayout();
|
|
253
253
|
const noticeId = useId();
|
|
254
|
-
const hasNotice =
|
|
254
|
+
const hasNotice =
|
|
255
|
+
publicNotice !== undefined && publicNotice !== null && publicNotice !== false && publicNotice !== "";
|
|
255
256
|
const labels = useKitLabels("feedbackDialog", DEFAULT_FEEDBACK_DIALOG_LABELS, labelsProp);
|
|
256
257
|
const attachmentText = useKitLabels("feedbackAttachment", DEFAULT_FEEDBACK_ATTACHMENT_LABELS, labelsProp);
|
|
257
258
|
// Under `multiple` the heading is `attachmentList` — a screenshot AND photos — which
|
|
258
259
|
// also names the chip list beneath it: one string, so the two cannot disagree. Its old
|
|
259
260
|
// second name, `feedbackDialog.attachments`, went in 0.34.
|
|
260
261
|
const listHeading =
|
|
261
|
-
labelsProp?.attachmentList ??
|
|
262
|
-
attachmentText.attachmentList ??
|
|
263
|
-
DEFAULT_FEEDBACK_ATTACHMENT_LABELS.attachmentList!;
|
|
262
|
+
labelsProp?.attachmentList ?? attachmentText.attachmentList ?? DEFAULT_FEEDBACK_ATTACHMENT_LABELS.attachmentList!;
|
|
264
263
|
// The attachment field resolves its own keys from `feedbackAttachment`; it gets the
|
|
265
264
|
// prop's (so a caller's `attachmentAdd` still wins) plus the resolved heading.
|
|
266
265
|
const attachmentLabels =
|
|
@@ -239,9 +239,7 @@ export function FeedbackStatusTransitions({
|
|
|
239
239
|
variant === "icon"
|
|
240
240
|
? cn(
|
|
241
241
|
"flex size-7 items-center justify-center rounded",
|
|
242
|
-
active
|
|
243
|
-
? cn(meta.activeBg, meta.activeText)
|
|
244
|
-
: "text-placeholder hover:text-secondary",
|
|
242
|
+
active ? cn(meta.activeBg, meta.activeText) : "text-placeholder hover:text-secondary",
|
|
245
243
|
)
|
|
246
244
|
: cn(
|
|
247
245
|
"inline-flex items-center gap-1.5 rounded-md border px-2 py-1 text-xs font-medium",
|
|
@@ -529,9 +527,7 @@ export function FeedbackDetailSection({
|
|
|
529
527
|
return (
|
|
530
528
|
<div>
|
|
531
529
|
<div className="mb-1 flex items-center justify-between gap-2">
|
|
532
|
-
<div className="text-xs font-medium uppercase tracking-wide text-muted">
|
|
533
|
-
{title}
|
|
534
|
-
</div>
|
|
530
|
+
<div className="text-xs font-medium uppercase tracking-wide text-muted">{title}</div>
|
|
535
531
|
{action}
|
|
536
532
|
</div>
|
|
537
533
|
{children}
|
|
@@ -552,7 +548,5 @@ export function FeedbackDetail({ children, className }: { children: ReactNode; c
|
|
|
552
548
|
* carry the entire "this arrived after the answer" reading. */
|
|
553
549
|
export function FeedbackProse({ children, empty }: { children?: string; empty?: ReactNode }) {
|
|
554
550
|
if (!children) return <p className="text-placeholder">{empty ?? "—"}</p>;
|
|
555
|
-
return
|
|
556
|
-
<p className="whitespace-pre-wrap text-secondary">{children}</p>
|
|
557
|
-
);
|
|
551
|
+
return <p className="whitespace-pre-wrap text-secondary">{children}</p>;
|
|
558
552
|
}
|
|
@@ -12,7 +12,13 @@ import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
|
12
12
|
import { cn } from "../lib/cn";
|
|
13
13
|
import { FILL_HEIGHT_CLASS } from "../shell/fill-height";
|
|
14
14
|
import { EMPTY_FORMATTED_VALUE } from "../lib/format";
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
FeedbackCategoryBadge,
|
|
17
|
+
FeedbackDetail,
|
|
18
|
+
FeedbackDetailSection,
|
|
19
|
+
FeedbackProse,
|
|
20
|
+
FeedbackStatusBadge,
|
|
21
|
+
} from "./feedback-inbox";
|
|
16
22
|
import { useFeedbackCategoryLabels } from "./feedback-labels";
|
|
17
23
|
import { FeedbackCommentThread, type FeedbackCommentsLabels } from "./feedback-comment-thread";
|
|
18
24
|
import type { FeedbackEntryUploadOptions } from "./feedback-entry-file";
|
|
@@ -161,11 +161,7 @@ export const DEFAULT_MAX_ATTACHMENTS = 5;
|
|
|
161
161
|
* A plain array (not frozen) because `accept` takes `string[]`, as
|
|
162
162
|
* `DEFAULT_ATTACHMENT_ACCEPT` does — copy it before changing it.
|
|
163
163
|
*/
|
|
164
|
-
export const FEEDBACK_ATTACHMENT_ACCEPT: string[] = [
|
|
165
|
-
...DEFAULT_ATTACHMENT_ACCEPT,
|
|
166
|
-
"application/pdf",
|
|
167
|
-
"text/plain",
|
|
168
|
-
];
|
|
164
|
+
export const FEEDBACK_ATTACHMENT_ACCEPT: string[] = [...DEFAULT_ATTACHMENT_ACCEPT, "application/pdf", "text/plain"];
|
|
169
165
|
|
|
170
166
|
/**
|
|
171
167
|
* The categories a person can pick — every one but `CRASH`, in triage order (Bug, Idea,
|
|
@@ -305,12 +301,7 @@ export function feedbackAttachmentLine(url: string): string {
|
|
|
305
301
|
* something foreign — and written anyway it would sit in the body as prose that no
|
|
306
302
|
* reader recognises as a file.
|
|
307
303
|
*/
|
|
308
|
-
export function appendRework(
|
|
309
|
-
body: string,
|
|
310
|
-
note: string,
|
|
311
|
-
url?: string | null,
|
|
312
|
-
now: Date = new Date(),
|
|
313
|
-
): string | null {
|
|
304
|
+
export function appendRework(body: string, note: string, url?: string | null, now: Date = new Date()): string | null {
|
|
314
305
|
const text = note.trim();
|
|
315
306
|
if (!text) return null;
|
|
316
307
|
if (url && !ATTACHMENT_URL.test(url)) {
|
|
@@ -339,9 +330,10 @@ export function reworkCount(body: string): number {
|
|
|
339
330
|
* before server-kit 0.13, whose reworks are still `--- REWORK … ---` blocks). What the
|
|
340
331
|
* Rework chip counts.
|
|
341
332
|
*/
|
|
342
|
-
export function feedbackReworkCount(
|
|
343
|
-
|
|
344
|
-
|
|
333
|
+
export function feedbackReworkCount(row: {
|
|
334
|
+
body?: string | null;
|
|
335
|
+
replies?: readonly Pick<FeedbackReply, "kind">[] | null;
|
|
336
|
+
}): number {
|
|
345
337
|
if (row.replies) {
|
|
346
338
|
const entries = row.replies.filter((reply) => reply.kind === "rework").length;
|
|
347
339
|
// A row migrated by an app that answers `replies` but not yet `kind` keeps its body's
|
|
@@ -102,7 +102,10 @@ export interface FeedbackReplyTimelineProps {
|
|
|
102
102
|
function EntryStatus({ reply, statusChanged }: { reply: FeedbackReply; statusChanged: string }) {
|
|
103
103
|
if (!reply.status_to) return null;
|
|
104
104
|
return (
|
|
105
|
-
<span
|
|
105
|
+
<span
|
|
106
|
+
className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1"
|
|
107
|
+
data-feedback-reply-status={reply.status_to}
|
|
108
|
+
>
|
|
106
109
|
<span className="sr-only">{statusChanged}</span>
|
|
107
110
|
{reply.status_from && reply.status_from !== reply.status_to && (
|
|
108
111
|
<>
|
|
@@ -167,7 +170,11 @@ export function FeedbackReplyTimeline({
|
|
|
167
170
|
</time>
|
|
168
171
|
<EntryStatus reply={reply} statusChanged={labels.statusChanged} />
|
|
169
172
|
</div>
|
|
170
|
-
<p
|
|
173
|
+
<p
|
|
174
|
+
data-private={priv}
|
|
175
|
+
dir="auto"
|
|
176
|
+
className="mt-0.5 whitespace-pre-wrap break-words text-start text-primary"
|
|
177
|
+
>
|
|
171
178
|
{reply.body}
|
|
172
179
|
</p>
|
|
173
180
|
{reply.attachment_url && (
|
|
@@ -312,9 +319,7 @@ export function FeedbackReplyComposer({
|
|
|
312
319
|
aria-label={labels.status}
|
|
313
320
|
value={picked}
|
|
314
321
|
disabled={pending || uploading}
|
|
315
|
-
onChange={(event) =>
|
|
316
|
-
setPick({ under: suggestedStatus, value: event.target.value as FeedbackStatus | "" })
|
|
317
|
-
}
|
|
322
|
+
onChange={(event) => setPick({ under: suggestedStatus, value: event.target.value as FeedbackStatus | "" })}
|
|
318
323
|
data-feedback-reply-status-pick=""
|
|
319
324
|
>
|
|
320
325
|
<option value="">{labels.noChange}</option>
|
|
@@ -234,8 +234,7 @@ export function feedbackPageUrl(context: FeedbackContext | null | undefined): st
|
|
|
234
234
|
* keyed by URL, a React key clash keksdose had).
|
|
235
235
|
*/
|
|
236
236
|
export function feedbackAttachmentUrls(
|
|
237
|
-
row: Pick<FeedbackRecord, "screenshot_url" | "attachment_urls" | "body"> &
|
|
238
|
-
Partial<Pick<FeedbackRecord, "replies">>,
|
|
237
|
+
row: Pick<FeedbackRecord, "screenshot_url" | "attachment_urls" | "body"> & Partial<Pick<FeedbackRecord, "replies">>,
|
|
239
238
|
): string[] {
|
|
240
239
|
const urls = [
|
|
241
240
|
...(row.screenshot_url ? [row.screenshot_url] : []),
|
|
@@ -695,9 +694,7 @@ export function FeedbackRowDetail({
|
|
|
695
694
|
<FeedbackDetailSection title={labels.subject}>
|
|
696
695
|
<p className="flex flex-wrap items-center gap-x-2 gap-y-1 text-sm" data-feedback-subject="">
|
|
697
696
|
<FeedbackCategoryBadge category={row.category} />
|
|
698
|
-
<span className="min-w-0 font-medium text-primary [overflow-wrap:anywhere]">
|
|
699
|
-
{row.title}
|
|
700
|
-
</span>
|
|
697
|
+
<span className="min-w-0 font-medium text-primary [overflow-wrap:anywhere]">{row.title}</span>
|
|
701
698
|
</p>
|
|
702
699
|
</FeedbackDetailSection>
|
|
703
700
|
)}
|
|
@@ -37,10 +37,7 @@ export interface FeedbackStatusPatch {
|
|
|
37
37
|
* Failure is the mutation's own business: its `onError` toasts the server's `detail`,
|
|
38
38
|
* else `feedbackToast.updateFailed` (§4.4) — this hook adds no second error toast.
|
|
39
39
|
*/
|
|
40
|
-
export type FeedbackStatusMutate = (
|
|
41
|
-
patch: FeedbackStatusPatch,
|
|
42
|
-
callbacks: { onSuccess: () => void },
|
|
43
|
-
) => void;
|
|
40
|
+
export type FeedbackStatusMutate = (patch: FeedbackStatusPatch, callbacks: { onSuccess: () => void }) => void;
|
|
44
41
|
|
|
45
42
|
/** What the change needs to know about the row: which one, what it is called in the
|
|
46
43
|
* toast, and where it stood (the status Undo goes back to). */
|
|
@@ -107,12 +107,12 @@ export function FeedbackSubmitDialog({
|
|
|
107
107
|
)
|
|
108
108
|
}
|
|
109
109
|
onCaptureScreenshot={onCaptureScreenshot}
|
|
110
|
-
publicNotice={
|
|
111
|
-
publicNotice ? (dialogText.publicNotice ?? DEFAULT_FEEDBACK_DIALOG_LABELS.publicNotice) : undefined
|
|
112
|
-
}
|
|
110
|
+
publicNotice={publicNotice ? (dialogText.publicNotice ?? DEFAULT_FEEDBACK_DIALOG_LABELS.publicNotice) : undefined}
|
|
113
111
|
// The context is read off the very values the box below shows (§3.2).
|
|
114
112
|
onSubmit={(data) => onSubmit(data, feedbackContext({ user, attachUrl, url, environment, version }))}
|
|
115
|
-
contextSlot={
|
|
113
|
+
contextSlot={
|
|
114
|
+
<FeedbackContextBox user={user} url={url} attachUrl={attachUrl} onAttachUrlChange={onAttachUrlChange} />
|
|
115
|
+
}
|
|
116
116
|
/>
|
|
117
117
|
);
|
|
118
118
|
}
|
|
@@ -29,7 +29,12 @@ import {
|
|
|
29
29
|
type FeedbackCategoryLabels,
|
|
30
30
|
type FeedbackStatusLabels,
|
|
31
31
|
} from "./feedback-labels";
|
|
32
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
FEEDBACK_AWAITING_STATUSES,
|
|
34
|
+
feedbackReworkCount,
|
|
35
|
+
type FeedbackContext,
|
|
36
|
+
type FeedbackRecord,
|
|
37
|
+
} from "./feedback-record";
|
|
33
38
|
import type { FeedbackStatusChange } from "./feedback-status-undo";
|
|
34
39
|
import { feedbackPageHref, feedbackPagePath } from "./feedback-row-detail";
|
|
35
40
|
import type { CommitScope } from "../components/write-lock";
|
|
@@ -356,8 +361,7 @@ function FeedbackPageLinkCell({ context, openPage }: { context: FeedbackContext
|
|
|
356
361
|
<>
|
|
357
362
|
{/* The space outside the hidden span: a flex container drops it from the layout,
|
|
358
363
|
and the accessible name keeps it ("Open page /accounts"). */}
|
|
359
|
-
<span className="sr-only">{openPage}</span>
|
|
360
|
-
<code className="min-w-0 truncate text-xs">{path}</code>
|
|
364
|
+
<span className="sr-only">{openPage}</span> <code className="min-w-0 truncate text-xs">{path}</code>
|
|
361
365
|
<ExternalLink className="size-3 shrink-0" aria-hidden />
|
|
362
366
|
</>
|
|
363
367
|
);
|
|
@@ -453,7 +457,9 @@ function statusRank(status: FeedbackStatus): number {
|
|
|
453
457
|
* - Fitted to the table's width (0.48, keksdose live #451): Subject `grow`s and
|
|
454
458
|
* ellipsises, and a narrow table leaves out URL, then Email, then Resolved
|
|
455
459
|
* (`fitPriority` 1–3) — the open report repeats all three — then Votes and Category
|
|
456
|
-
* (4, 5)
|
|
460
|
+
* (4, 5), then User, Date and # (6–8, 0.51.4) before Subject would drop below 8rem
|
|
461
|
+
* (`growMin`, 0.51.4; the table's default floor is 10).
|
|
462
|
+
* Drop the two keys with
|
|
457
463
|
* `{ ...col, grow: undefined, fitPriority: undefined }` for the 0.47 layout.
|
|
458
464
|
* - `/my-feedback` shows the same nine: the Email cell's context fallback exists for it
|
|
459
465
|
* (the admin list's join is absent there, §3.1), and its phone card drops the submitter
|
|
@@ -499,6 +505,9 @@ export function feedbackColumns<T extends FeedbackTableRow>({
|
|
|
499
505
|
sortBy: (row) => row.id,
|
|
500
506
|
filter: { type: "number", getValue: (row) => row.id },
|
|
501
507
|
mobileHidden: true,
|
|
508
|
+
// The very last to go (0.51.4, Kurvenschmiede): replies and the feedback loop name a
|
|
509
|
+
// report by its number, so it stays while anything else can give way.
|
|
510
|
+
fitPriority: 8,
|
|
502
511
|
},
|
|
503
512
|
{
|
|
504
513
|
key: "date",
|
|
@@ -506,6 +515,8 @@ export function feedbackColumns<T extends FeedbackTableRow>({
|
|
|
506
515
|
cell: (row) => <FeedbackDate value={row.created_at} renderDate={renderDate} />,
|
|
507
516
|
sortBy: (row) => instant(row.created_at),
|
|
508
517
|
filter: { type: "date", getValue: (row) => row.created_at },
|
|
518
|
+
// Seventh to go (0.51.4): the open report shows it.
|
|
519
|
+
fitPriority: 7,
|
|
509
520
|
},
|
|
510
521
|
{
|
|
511
522
|
key: "category",
|
|
@@ -536,6 +547,11 @@ export function feedbackColumns<T extends FeedbackTableRow>({
|
|
|
536
547
|
// The rest of the row, one line and an ellipsis (0.48, keksdose live #451: one long
|
|
537
548
|
// crash title pushed Status and the row actions off the edge).
|
|
538
549
|
grow: true,
|
|
550
|
+
// 8rem, not the table's 10 (0.51.4, Kurvenschmiede): at 768px beside a sidebar only
|
|
551
|
+
// Subject, Status (a fixed 13.5rem) and the row actions are left, and they were up
|
|
552
|
+
// to 20px too wide (Hungarian). A subject's first words carry it; the open report
|
|
553
|
+
// has the rest.
|
|
554
|
+
growMin: 8,
|
|
539
555
|
},
|
|
540
556
|
{
|
|
541
557
|
key: "user",
|
|
@@ -556,9 +572,11 @@ export function feedbackColumns<T extends FeedbackTableRow>({
|
|
|
556
572
|
// Name AND email, so either finds the person; the erased ones by the placeholder
|
|
557
573
|
// (their context holds no name any more).
|
|
558
574
|
filterBy: (row) =>
|
|
559
|
-
row.user_id == null
|
|
560
|
-
|
|
561
|
-
|
|
575
|
+
row.user_id == null ? labels.deletedUser : `${feedbackSubmitter(row, labels)} ${feedbackSubmitterEmail(row)}`,
|
|
576
|
+
// Sixth to go (0.51.4, Kurvenschmiede): with only 1–5, Subject reached its floor while
|
|
577
|
+
// #, Date and User were still drawn, and the inbox scrolled sideways from 768 to
|
|
578
|
+
// ~1115px beside an open sidebar. The open report names the submitter.
|
|
579
|
+
fitPriority: 6,
|
|
562
580
|
},
|
|
563
581
|
{
|
|
564
582
|
key: "email",
|
|
@@ -638,8 +656,10 @@ export function feedbackColumns<T extends FeedbackTableRow>({
|
|
|
638
656
|
|
|
639
657
|
/** What {@link useFeedbackColumns} takes: {@link FeedbackColumnsOptions} with the words
|
|
640
658
|
* read from the provider, and `renderDate` optional. */
|
|
641
|
-
export interface UseFeedbackColumnsOptions
|
|
642
|
-
|
|
659
|
+
export interface UseFeedbackColumnsOptions extends Omit<
|
|
660
|
+
FeedbackColumnsOptions,
|
|
661
|
+
"renderDate" | "labels" | "statusLabels" | "categoryLabels" | "votesHeader"
|
|
662
|
+
> {
|
|
643
663
|
/** Default: the kit's date with the weekday ({@link useFeedbackRenderDate}). */
|
|
644
664
|
renderDate?: FeedbackRenderDate;
|
|
645
665
|
/** Over the `feedbackPage` namespace. Keep it stable (module scope or memoised): it is
|
|
@@ -18,10 +18,7 @@ import { FeedbackAttachmentField } from "./feedback-attachment";
|
|
|
18
18
|
import type { FeedbackAttachmentFieldSingleProps } from "./feedback-attachment";
|
|
19
19
|
import type { FeedbackNoteAttachment } from "./feedback-inbox";
|
|
20
20
|
import type { FeedbackAttachmentLabels } from "./feedback-dialog";
|
|
21
|
-
import {
|
|
22
|
-
DEFAULT_FEEDBACK_COMPOSER_LABELS,
|
|
23
|
-
DEFAULT_FEEDBACK_THREAD_LABELS,
|
|
24
|
-
} from "./feedback-thread-labels";
|
|
21
|
+
import { DEFAULT_FEEDBACK_COMPOSER_LABELS, DEFAULT_FEEDBACK_THREAD_LABELS } from "./feedback-thread-labels";
|
|
25
22
|
|
|
26
23
|
/**
|
|
27
24
|
* The conversation under a report: who said what, when, with what attached — and the
|
|
@@ -217,12 +214,7 @@ export function FeedbackThread({
|
|
|
217
214
|
}
|
|
218
215
|
if (messages.length === 0) {
|
|
219
216
|
return (
|
|
220
|
-
<EmptyState
|
|
221
|
-
variant="inline"
|
|
222
|
-
size="sm"
|
|
223
|
-
title={empty ?? labels.empty}
|
|
224
|
-
className={cn("justify-start", className)}
|
|
225
|
-
/>
|
|
217
|
+
<EmptyState variant="inline" size="sm" title={empty ?? labels.empty} className={cn("justify-start", className)} />
|
|
226
218
|
);
|
|
227
219
|
}
|
|
228
220
|
|
|
@@ -288,9 +280,7 @@ export function FeedbackThread({
|
|
|
288
280
|
<article
|
|
289
281
|
className={cn(
|
|
290
282
|
"max-w-[85%] min-w-0 rounded-lg px-3 py-2 text-sm",
|
|
291
|
-
message.own
|
|
292
|
-
? "rounded-ee-sm bg-brand-soft"
|
|
293
|
-
: "rounded-es-sm bg-surface-2",
|
|
283
|
+
message.own ? "rounded-ee-sm bg-brand-soft" : "rounded-es-sm bg-surface-2",
|
|
294
284
|
)}
|
|
295
285
|
>
|
|
296
286
|
<header className="mb-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-caption text-muted">
|
|
@@ -361,9 +351,7 @@ function DefaultAttachment({
|
|
|
361
351
|
{/* A file name wraps from Large up, as the attachments of the composer do (text
|
|
362
352
|
size §10.17; round 0.34 T1: the sweep read "export-20…"). */}
|
|
363
353
|
<span className="min-w-0 truncate-until-large">{name}</span>
|
|
364
|
-
{attachment.size !== undefined && (
|
|
365
|
-
<span className="shrink-0 text-muted">{size(attachment.size)}</span>
|
|
366
|
-
)}
|
|
354
|
+
{attachment.size !== undefined && <span className="shrink-0 text-muted">{size(attachment.size)}</span>}
|
|
367
355
|
</>
|
|
368
356
|
);
|
|
369
357
|
const chip =
|
|
@@ -37,15 +37,7 @@ import type { LucideIcon } from "lucide-react";
|
|
|
37
37
|
* implementation", and nobody works an OPEN row. `REWORK` joined in 0.40 (§10.2
|
|
38
38
|
* decisions 2, 4): "sent back, released for work again" — a READY that came back. */
|
|
39
39
|
export type FeedbackStatus =
|
|
40
|
-
| "
|
|
41
|
-
| "READY"
|
|
42
|
-
| "REWORK"
|
|
43
|
-
| "IN_PROGRESS"
|
|
44
|
-
| "IN_EVALUATION"
|
|
45
|
-
| "NEEDS_LIVE_TEST"
|
|
46
|
-
| "POSTPONED"
|
|
47
|
-
| "DONE"
|
|
48
|
-
| "WONT_DO";
|
|
40
|
+
"OPEN" | "READY" | "REWORK" | "IN_PROGRESS" | "IN_EVALUATION" | "NEEDS_LIVE_TEST" | "POSTPONED" | "DONE" | "WONT_DO";
|
|
49
41
|
|
|
50
42
|
/** What a report is about. `CRASH` is filed by an error boundary and never
|
|
51
43
|
* chosen, which is exactly why it is loud below and absent from every picker. */
|
|
@@ -61,79 +53,77 @@ export type FeedbackCategory = "CRASH" | "BUG" | "IDEA" | "QUESTION" | "OTHER";
|
|
|
61
53
|
* a restated list cannot be checked for exhaustiveness: an eighth status would
|
|
62
54
|
* break the build here and leave a literal eight long (as READY did in 0.31).
|
|
63
55
|
*/
|
|
64
|
-
export const FEEDBACK_STATUS_META: Record<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
},
|
|
136
|
-
};
|
|
56
|
+
export const FEEDBACK_STATUS_META: Record<FeedbackStatus, { icon: LucideIcon; activeBg: string; activeText: string }> =
|
|
57
|
+
{
|
|
58
|
+
OPEN: {
|
|
59
|
+
icon: Inbox,
|
|
60
|
+
activeBg: "bg-active",
|
|
61
|
+
activeText: "text-primary",
|
|
62
|
+
},
|
|
63
|
+
// Triaged and released for implementation (feedback contract §8.2, keksdose live
|
|
64
|
+
// #396): OPEN is "filed, nobody has looked yet", READY is "go". The brand tint at full
|
|
65
|
+
// strength, so it reads as the go-ahead beside OPEN's neutral fill and
|
|
66
|
+
// NEEDS_LIVE_TEST's muted brand.
|
|
67
|
+
READY: {
|
|
68
|
+
icon: ClipboardCheck,
|
|
69
|
+
activeBg: "bg-brand-soft",
|
|
70
|
+
activeText: "text-brand",
|
|
71
|
+
},
|
|
72
|
+
// Sent back by its author or an admin and released for work again (0.40, feedback
|
|
73
|
+
// contract §10.2 decision 4): the Rework button's `RotateCcw`, in the danger tint so the
|
|
74
|
+
// queue shows reworks apart from new reports. Not IN_PROGRESS's warning tint — that is
|
|
75
|
+
// where a REWORK row moves next — and WONT_DO, the only other red, sits at the far end
|
|
76
|
+
// with `Ban`.
|
|
77
|
+
REWORK: {
|
|
78
|
+
icon: RotateCcw,
|
|
79
|
+
activeBg: "bg-danger-soft",
|
|
80
|
+
activeText: "text-danger",
|
|
81
|
+
},
|
|
82
|
+
IN_PROGRESS: {
|
|
83
|
+
icon: Wrench,
|
|
84
|
+
activeBg: "bg-warning-soft",
|
|
85
|
+
activeText: "text-warning",
|
|
86
|
+
},
|
|
87
|
+
// Where solved work is parked, waiting on the person who reported it. Its own
|
|
88
|
+
// colour, because "somebody has to check this" is a state you want to find by
|
|
89
|
+
// scanning rather than by reading.
|
|
90
|
+
IN_EVALUATION: {
|
|
91
|
+
icon: Eye,
|
|
92
|
+
activeBg: "bg-info-soft",
|
|
93
|
+
activeText: "text-info",
|
|
94
|
+
},
|
|
95
|
+
// Resolved but only checkable on a deployed build — the SOFT brand tint, so it
|
|
96
|
+
// reads as "waiting on something" rather than as a done or a refusal, and it
|
|
97
|
+
// follows whatever the consumer's brand is instead of pinning an indigo island
|
|
98
|
+
// beside it.
|
|
99
|
+
NEEDS_LIVE_TEST: {
|
|
100
|
+
icon: CloudUpload,
|
|
101
|
+
activeBg: "bg-brand-soft",
|
|
102
|
+
activeText: "text-brand-muted",
|
|
103
|
+
},
|
|
104
|
+
// Parked on purpose. Muted, not `--danger`: it is not a refusal.
|
|
105
|
+
POSTPONED: {
|
|
106
|
+
icon: PauseCircle,
|
|
107
|
+
activeBg: "bg-active",
|
|
108
|
+
activeText: "text-secondary",
|
|
109
|
+
},
|
|
110
|
+
// The one status with nowhere to move to: the vocabulary has a brand, an info, a
|
|
111
|
+
// warning and a danger, and nothing that means "succeeded". Deliberately NOT
|
|
112
|
+
// borrowed from a family that means something else — `--status-synced` is a
|
|
113
|
+
// FIELD's trip to the database rather than an outcome, and tokens.css says so in
|
|
114
|
+
// as many words. Green beside WONT_DO's red is the classic CVD-unsafe pair, which
|
|
115
|
+
// is why both carry a glyph and neither leans on colour alone.
|
|
116
|
+
DONE: {
|
|
117
|
+
icon: CheckCircle2,
|
|
118
|
+
activeBg: "bg-success-soft",
|
|
119
|
+
activeText: "text-success",
|
|
120
|
+
},
|
|
121
|
+
WONT_DO: {
|
|
122
|
+
icon: Ban,
|
|
123
|
+
activeBg: "bg-danger-soft",
|
|
124
|
+
activeText: "text-danger",
|
|
125
|
+
},
|
|
126
|
+
};
|
|
137
127
|
|
|
138
128
|
/** Chain order, then the three off it. The order a picker offers, and the rank a
|
|
139
129
|
* status column sorts by — so a list sorted by status reads as a queue rather
|
|
@@ -74,8 +74,7 @@ export function FeedbackVoteButton({
|
|
|
74
74
|
// pressed against: a refetch that brings new numbers is the truth.
|
|
75
75
|
const [shown, setShown] = useState<{ base: FeedbackVoteState; state: FeedbackVoteState } | null>(null);
|
|
76
76
|
const busy = useRef(false);
|
|
77
|
-
const current =
|
|
78
|
-
shown && shown.base.votes === votes && shown.base.voted === voted ? shown.state : { votes, voted };
|
|
77
|
+
const current = shown && shown.base.votes === votes && shown.base.voted === voted ? shown.state : { votes, voted };
|
|
79
78
|
const pressed = own || current.voted;
|
|
80
79
|
|
|
81
80
|
const press = () => {
|
|
@@ -85,12 +84,14 @@ export function FeedbackVoteButton({
|
|
|
85
84
|
const next = !before.voted;
|
|
86
85
|
busy.current = true;
|
|
87
86
|
setShown({ base, state: { votes: Math.max(0, before.votes + (next ? 1 : -1)), voted: next } });
|
|
88
|
-
onVote(next)
|
|
89
|
-
(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
87
|
+
onVote(next)
|
|
88
|
+
.then(
|
|
89
|
+
(answer) => setShown({ base, state: { votes: answer.votes, voted: answer.voted } }),
|
|
90
|
+
() => setShown({ base, state: before }),
|
|
91
|
+
)
|
|
92
|
+
.finally(() => {
|
|
93
|
+
busy.current = false;
|
|
94
|
+
});
|
|
94
95
|
};
|
|
95
96
|
|
|
96
97
|
const count = formatNumber(current.votes, { locale });
|
|
@@ -36,10 +36,7 @@ export function sameRect<R extends { top: number; left: number; width: number; h
|
|
|
36
36
|
* Measured in a layout effect so the position is ready before paint (no flicker
|
|
37
37
|
* on open).
|
|
38
38
|
*/
|
|
39
|
-
export function useAnchoredRect<T extends HTMLElement>(
|
|
40
|
-
ref: RefObject<T | null>,
|
|
41
|
-
open: boolean,
|
|
42
|
-
): AnchorRect | null {
|
|
39
|
+
export function useAnchoredRect<T extends HTMLElement>(ref: RefObject<T | null>, open: boolean): AnchorRect | null {
|
|
43
40
|
const [rect, setRect] = useState<AnchorRect | null>(null);
|
|
44
41
|
|
|
45
42
|
useLayoutEffect(() => {
|
|
@@ -19,7 +19,9 @@ export function useDocumentTitle(parts: ReadonlyArray<string | null | undefined
|
|
|
19
19
|
const { format, appName } = useKitDocumentTitle();
|
|
20
20
|
const [page, section, app] = parts.map((p) => (typeof p === "string" && p.trim() !== "" ? p : undefined));
|
|
21
21
|
const any = parts.some((p) => typeof p === "string" && p.trim() !== "");
|
|
22
|
-
const title = any
|
|
22
|
+
const title = any
|
|
23
|
+
? formatDocumentTitle(format ?? DEFAULT_DOCUMENT_TITLE_FORMAT, { page, section, app: app ?? appName })
|
|
24
|
+
: null;
|
|
23
25
|
useEffect(() => {
|
|
24
26
|
if (title === null || title === "") return;
|
|
25
27
|
const before = document.title;
|
|
@@ -111,9 +111,7 @@ export function useDragTarget<E extends Element = Element>({
|
|
|
111
111
|
return { dropProps, isOver: over && !disabled };
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
export function useFileDrop<E extends Element = Element>(
|
|
115
|
-
options: UseFileDropOptions,
|
|
116
|
-
): UseFileDropReturn<E> {
|
|
114
|
+
export function useFileDrop<E extends Element = Element>(options: UseFileDropOptions): UseFileDropReturn<E> {
|
|
117
115
|
const picker = useFilePicker(options);
|
|
118
116
|
const { dropProps, isOver } = useDragTarget<E>({
|
|
119
117
|
disabled: options.disabled,
|