@eifi1/ui-kit 0.53.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -82
- package/dist/account/delete-account-setting.d.ts +3 -2
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +36 -0
- package/dist/auth/auth-errors.js +20 -0
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +2 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +6 -4
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-option-list.d.ts +2 -1
- package/dist/components/currency-option-list.js +10 -3
- package/dist/components/currency-option-list.js.map +1 -1
- package/dist/components/currency-select.d.ts +3 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +22 -1
- package/dist/components/danger-confirm.js +52 -30
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +2 -1
- package/dist/components/data-table-filter-popover.js +3 -2
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +33 -3
- package/dist/components/data-table-filters.js +6 -4
- 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-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +5 -1
- package/dist/components/dialog-frame.js +6 -2
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +16 -7
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +48 -0
- package/dist/components/modal.js +26 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/stat-tile.d.ts +21 -2
- package/dist/components/stat-tile.js +4 -2
- package/dist/components/stat-tile.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/currencies.d.ts +16 -2
- package/dist/currencies.js +2 -1
- package/dist/currencies.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-context-labels.js +2 -1
- package/dist/feedback/feedback-context-labels.js.map +1 -1
- package/dist/feedback/feedback-context.d.ts +19 -3
- package/dist/feedback/feedback-context.js +12 -1
- package/dist/feedback/feedback-context.js.map +1 -1
- package/dist/feedback/feedback-diagnostics.d.ts +17 -0
- package/dist/feedback/feedback-diagnostics.js +27 -0
- package/dist/feedback/feedback-diagnostics.js.map +1 -0
- package/dist/feedback/feedback-dialog.d.ts +10 -0
- package/dist/feedback/feedback-dialog.js +6 -4
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-record.d.ts +5 -0
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +1 -0
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +3 -0
- package/dist/feedback/feedback-row-detail.js +3 -0
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
- package/dist/feedback/feedback-submit-dialog.js +15 -3
- package/dist/feedback/feedback-submit-dialog.js.map +1 -1
- package/dist/feedback/feedback-submit.d.ts +30 -2
- package/dist/feedback/feedback-submit.js +5 -2
- package/dist/feedback/feedback-submit.js.map +1 -1
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +2 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +78 -4
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +95 -5
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +74 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +75 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +77 -4
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +77 -4
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +74 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +27 -8
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +36 -4
- package/dist/lib/dates.js +49 -13
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/format.d.ts +37 -2
- package/dist/lib/format.js +25 -1
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/intl-cache.d.ts +4 -2
- package/dist/lib/intl-cache.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/lib/translation-review.d.ts +26 -0
- package/dist/lib/translation-review.js +14 -0
- package/dist/lib/translation-review.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -341
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -370
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -815
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -594
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -180
- package/src/components/currency-select.tsx +0 -341
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -934
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -281
- package/src/components/data-table-filters.ts +0 -287
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -276
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -789
- package/src/components/modal.tsx +0 -505
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -558
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -725
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -70
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -10
- package/src/feedback/feedback-context.tsx +0 -213
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -440
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -423
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -30
- package/src/feedback/feedback-row-detail.tsx +0 -858
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -118
- package/src/feedback/feedback-submit.tsx +0 -237
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -189
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2057
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1997
- package/src/i18n/locales/fr.ts +0 -2035
- package/src/i18n/locales/hu.ts +0 -2002
- package/src/i18n/locales/it.ts +0 -2012
- package/src/i18n/locales/zh.ts +0 -1910
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1179
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -266
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -522
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -25
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -717
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,524 +0,0 @@
|
|
|
1
|
-
import { useMemo, useState } from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { ChevronLeft, ChevronRight, MessageSquare, ThumbsUp } from "lucide-react";
|
|
4
|
-
import { DataTable, type DataTableColumn } from "../components/data-table";
|
|
5
|
-
import { DEFAULT_DATA_TABLE_LABELS } from "../components/data-table-labels";
|
|
6
|
-
import { IconButton } from "../components/icon-button";
|
|
7
|
-
import { SearchField } from "../components/search-field";
|
|
8
|
-
import { ToggleGroup } from "../components/toggle-group";
|
|
9
|
-
import type { CommitScope } from "../components/write-lock";
|
|
10
|
-
import type { AuthedFetcher } from "../hooks/use-authed-src";
|
|
11
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
12
|
-
import { cn } from "../lib/cn";
|
|
13
|
-
import { FILL_HEIGHT_CLASS } from "../shell/fill-height";
|
|
14
|
-
import { EMPTY_FORMATTED_VALUE } from "../lib/format";
|
|
15
|
-
import {
|
|
16
|
-
FeedbackCategoryBadge,
|
|
17
|
-
FeedbackDetail,
|
|
18
|
-
FeedbackDetailSection,
|
|
19
|
-
FeedbackProse,
|
|
20
|
-
FeedbackStatusBadge,
|
|
21
|
-
} from "./feedback-inbox";
|
|
22
|
-
import { useFeedbackCategoryLabels } from "./feedback-labels";
|
|
23
|
-
import { FeedbackCommentThread, type FeedbackCommentsLabels } from "./feedback-comment-thread";
|
|
24
|
-
import type { FeedbackEntryUploadOptions } from "./feedback-entry-file";
|
|
25
|
-
import { DEFAULT_FEEDBACK_PUBLIC_LABELS, type FeedbackPublicLabels } from "./feedback-public-labels";
|
|
26
|
-
import type {
|
|
27
|
-
FeedbackComment,
|
|
28
|
-
FeedbackPublicListItem,
|
|
29
|
-
FeedbackPublicRecord,
|
|
30
|
-
FeedbackPublicSort,
|
|
31
|
-
FeedbackVoteState,
|
|
32
|
-
} from "./feedback-public-types";
|
|
33
|
-
import {
|
|
34
|
-
useFeedbackPageLabels,
|
|
35
|
-
useFeedbackRenderDate,
|
|
36
|
-
type FeedbackPageLabels,
|
|
37
|
-
type FeedbackRenderDate,
|
|
38
|
-
} from "./feedback-table";
|
|
39
|
-
import { FeedbackVoteButton } from "./feedback-vote-button";
|
|
40
|
-
|
|
41
|
-
export { DEFAULT_FEEDBACK_PUBLIC_LABELS };
|
|
42
|
-
export type { FeedbackPublicLabels };
|
|
43
|
-
|
|
44
|
-
/** `feedbackPublic` resolved: English, then `<UiKitProvider labels>`, then `labels`. */
|
|
45
|
-
export function useFeedbackPublicLabels(labels?: LabelOverride<FeedbackPublicLabels>): FeedbackPublicLabels {
|
|
46
|
-
return useKitLabels("feedbackPublic", DEFAULT_FEEDBACK_PUBLIC_LABELS, labels);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** The sort toggle's order: the server's default first (§9.6). */
|
|
50
|
-
const SORTS: readonly FeedbackPublicSort[] = ["newest", "votes", "updated"];
|
|
51
|
-
|
|
52
|
-
/** A date in a cell, as the inbox writes it: `<time>`, nowrap, tabular figures. */
|
|
53
|
-
function PublicDate({ value, renderDate }: { value: string | null | undefined; renderDate: FeedbackRenderDate }) {
|
|
54
|
-
if (!value) return <span className="text-placeholder">{EMPTY_FORMATTED_VALUE}</span>;
|
|
55
|
-
return (
|
|
56
|
-
<time dateTime={value} className="whitespace-nowrap tabular-nums text-muted">
|
|
57
|
-
{renderDate(value)}
|
|
58
|
-
</time>
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** The visible comments as a small chip beside the title — the count in figures, the
|
|
63
|
-
* words for a screen reader. Nothing at 0. */
|
|
64
|
-
function CommentCount({ count, labels }: { count: number; labels: FeedbackPublicLabels }) {
|
|
65
|
-
if (!count) return null;
|
|
66
|
-
return (
|
|
67
|
-
<span className="inline-flex shrink-0 items-center gap-1 text-xs text-muted" data-feedback-comment-count={count}>
|
|
68
|
-
<MessageSquare className="size-3.5" aria-hidden />
|
|
69
|
-
<span aria-hidden className="tabular-nums">
|
|
70
|
-
{count}
|
|
71
|
-
</span>
|
|
72
|
-
<span className="sr-only">{labels.comments(count)}</span>
|
|
73
|
-
</span>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** The votes on a phone card: the thumb and the count, in the brand colour when the
|
|
78
|
-
* viewer's own. */
|
|
79
|
-
function VoteCount({ count, voted, labels }: { count: number; voted: boolean; labels: FeedbackPublicLabels }) {
|
|
80
|
-
return (
|
|
81
|
-
<span
|
|
82
|
-
className={cn("ms-auto inline-flex shrink-0 items-center gap-1 text-xs", voted ? "text-brand" : "text-muted")}
|
|
83
|
-
data-feedback-vote-count={count}
|
|
84
|
-
>
|
|
85
|
-
<ThumbsUp className="size-3.5" aria-hidden />
|
|
86
|
-
<span aria-hidden className="tabular-nums">
|
|
87
|
-
{count}
|
|
88
|
-
</span>
|
|
89
|
-
<span className="sr-only">{labels.votes(count)}</span>
|
|
90
|
-
</span>
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** 0.38.1: previous / next over the server's pages when it answers no total
|
|
95
|
-
* (`GET /feedback/public` — Kurvenschmiede): "Page 3" between two arrows. The arrows'
|
|
96
|
-
* names are `dataTable`'s, the strip's; the page's is `feedbackPublic.page`. */
|
|
97
|
-
function PublicPager({
|
|
98
|
-
page,
|
|
99
|
-
hasMore,
|
|
100
|
-
onPageChange,
|
|
101
|
-
labels,
|
|
102
|
-
}: {
|
|
103
|
-
page: number;
|
|
104
|
-
hasMore: boolean;
|
|
105
|
-
onPageChange: (page: number) => void;
|
|
106
|
-
labels: FeedbackPublicLabels;
|
|
107
|
-
}) {
|
|
108
|
-
const tableLabels = useKitLabels("dataTable", DEFAULT_DATA_TABLE_LABELS);
|
|
109
|
-
const name = labels.page(page + 1);
|
|
110
|
-
return (
|
|
111
|
-
<div
|
|
112
|
-
role="group"
|
|
113
|
-
aria-label={name}
|
|
114
|
-
className="flex items-center justify-end gap-2 text-sm text-secondary"
|
|
115
|
-
data-feedback-public-pager={page}
|
|
116
|
-
>
|
|
117
|
-
<IconButton
|
|
118
|
-
size="sm"
|
|
119
|
-
variant="secondary"
|
|
120
|
-
label={tableLabels.prevPage}
|
|
121
|
-
disabled={page <= 0}
|
|
122
|
-
onClick={() => onPageChange(page - 1)}
|
|
123
|
-
>
|
|
124
|
-
{/* "Previous" points back along the line — left in LTR, right in RTL. */}
|
|
125
|
-
<ChevronLeft className="rtl:-scale-x-100" />
|
|
126
|
-
</IconButton>
|
|
127
|
-
<span className="tabular-nums" aria-hidden>
|
|
128
|
-
{name}
|
|
129
|
-
</span>
|
|
130
|
-
<IconButton
|
|
131
|
-
size="sm"
|
|
132
|
-
variant="secondary"
|
|
133
|
-
label={tableLabels.nextPage}
|
|
134
|
-
disabled={!hasMore}
|
|
135
|
-
onClick={() => onPageChange(page + 1)}
|
|
136
|
-
>
|
|
137
|
-
<ChevronRight className="rtl:-scale-x-100" />
|
|
138
|
-
</IconButton>
|
|
139
|
-
</div>
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/* ── The list ─────────────────────────────────────────────────────────────── */
|
|
144
|
-
|
|
145
|
-
export interface FeedbackPublicListProps<T extends FeedbackPublicListItem = FeedbackPublicListItem> {
|
|
146
|
-
/** `GET /feedback/public?sort=&q=` — the server's page, in the server's order.
|
|
147
|
-
* `readonly` since 0.52 (refactor audit 2026-10-30, API-7): the list never changes it. */
|
|
148
|
-
rows: readonly T[];
|
|
149
|
-
/** How many the query has in all — the line beside the sort. Left out, no line. */
|
|
150
|
-
total?: number;
|
|
151
|
-
/** The server sorts (§9.6): the toggle only says which way. */
|
|
152
|
-
sort: FeedbackPublicSort;
|
|
153
|
-
onSortChange: (sort: FeedbackPublicSort) => void;
|
|
154
|
-
/** The search box's text (`q`, titles only). */
|
|
155
|
-
search?: string;
|
|
156
|
-
/**
|
|
157
|
-
* The search box is drawn ONLY with this handler: where the app's titles are sealed
|
|
158
|
-
* (Kurvenschmiede, `FeedbackDeps.public_search=False`, §9.9) there is nothing to search
|
|
159
|
-
* on and the server answers `q` with a 422 — so it passes none.
|
|
160
|
-
*/
|
|
161
|
-
onSearchChange?: (search: string) => void;
|
|
162
|
-
/** The opened row: the app's {@link FeedbackPublicDetail} with the row's
|
|
163
|
-
* `GET /feedback/public/{id}` and its comments. */
|
|
164
|
-
renderDetail: (row: T) => ReactNode;
|
|
165
|
-
/** `PUT` / `DELETE /feedback/{id}/vote` for a row's button (`next`: the new state);
|
|
166
|
-
* resolve with the answer, reject to roll back. */
|
|
167
|
-
onVote: (row: T, next: boolean) => Promise<FeedbackVoteState>;
|
|
168
|
-
/** The page is loading: the table says so where its rows would be. */
|
|
169
|
-
loading?: boolean;
|
|
170
|
-
/** The opened row's id, when the app keeps it (a `?row=` param). Left out, the list
|
|
171
|
-
* keeps it itself. */
|
|
172
|
-
openId?: number | null;
|
|
173
|
-
/** 0.52: a row was opened (its id) or closed (`null`) — `openId`'s pair. Named for
|
|
174
|
-
* what it carries: every other `onOpenChange` in the kit is a boolean (refactor audit
|
|
175
|
-
* 2026-10-30, API-5). */
|
|
176
|
-
onOpenIdChange?: (id: number | null) => void;
|
|
177
|
-
/**
|
|
178
|
-
* 0.38.1: the opened report when it is NOT on this page — a `?row=` link to an older
|
|
179
|
-
* one (Kurvenschmiede). The app fetches it (`GET /feedback/public/{id}`, a list item's
|
|
180
|
-
* fields and more) and passes it with `openId`; while `openId` is its id it is drawn
|
|
181
|
-
* first, above the page's rows, and opened with `renderDetail` (on the phone, in the
|
|
182
|
-
* full-screen dialog). Closed, it is gone. A row the page has already is never drawn
|
|
183
|
-
* twice: the page's own is opened instead.
|
|
184
|
-
*/
|
|
185
|
-
openRow?: T | null;
|
|
186
|
-
/**
|
|
187
|
-
* 0.38.1: the server's page, from 0 — for a pager where `/feedback/public` answers no
|
|
188
|
-
* total (Kurvenschmiede). With {@link onPageChange} a **Previous / Page n / Next**
|
|
189
|
-
* strip stands under the table; Next is off without {@link hasMore}. Left out, no
|
|
190
|
-
* pager: the server's `limit` is all there is.
|
|
191
|
-
*/
|
|
192
|
-
page?: number;
|
|
193
|
-
/** 0.38.1: there is a page after this one (e.g. the page came back full). */
|
|
194
|
-
hasMore?: boolean;
|
|
195
|
-
/** 0.38.1: go to another page (`page ± 1`); the app fetches it. Draws the pager. */
|
|
196
|
-
onPageChange?: (page: number) => void;
|
|
197
|
-
/** A vote COMMITS — see Button's `commit`. */
|
|
198
|
-
commit?: CommitScope;
|
|
199
|
-
/** See {@link FeedbackRenderDate}. Default: the kit's, with the weekday. */
|
|
200
|
-
renderDate?: FeedbackRenderDate;
|
|
201
|
-
/** Over the `feedbackPublic` namespace. The shared column names (#, Date, Category,
|
|
202
|
-
* Subject, Status) are `feedbackPage`'s: pass `pageLabels` for those. */
|
|
203
|
-
labels?: LabelOverride<FeedbackPublicLabels>;
|
|
204
|
-
pageLabels?: LabelOverride<FeedbackPageLabels>;
|
|
205
|
-
/** 0.40.1: the list fills the window as DataTable's `fillHeight` (page layout §1) — the
|
|
206
|
-
* public feedback page passes §1.2's rule. Below md the page scrolls, as everywhere. */
|
|
207
|
-
fillHeight?: boolean;
|
|
208
|
-
className?: string;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* **All feedback** — the reports every user the app lets in may read (round 0.38,
|
|
213
|
-
* docs/feedback-harmonization.md §9.3, §9.9; keksdose's `/all-feedback`).
|
|
214
|
-
*
|
|
215
|
-
* - **Titles only** (decision 23): #, Date, Category, Subject (with the visible
|
|
216
|
-
* comments), Votes, Status. No body, no submitter, no file — the list item carries
|
|
217
|
-
* none of them (§9.10).
|
|
218
|
-
* - **The server sorts**: the toggle **Newest / Most wanted / Recently updated** sets
|
|
219
|
-
* `sort`, and the columns themselves do not sort (a page of 50 sorted in the browser
|
|
220
|
-
* would not be the 50 the sort asks for).
|
|
221
|
-
* - **The search box only with `onSearchChange`**: an app whose titles are sealed
|
|
222
|
-
* passes none (§9.9).
|
|
223
|
-
* - **Votes** are `FeedbackVoteButton`s, optimistic, the viewer's own report pressed
|
|
224
|
-
* and locked ("Your report", §9.6).
|
|
225
|
-
* - A row opens in place with `renderDetail` — on the phone, in a full-screen dialog.
|
|
226
|
-
* The phone cards carry the title, the status, the category, the date and the two
|
|
227
|
-
* counts; the vote itself is in the opened report (a button inside the card, which is
|
|
228
|
-
* the row's own button, would be two controls in one).
|
|
229
|
-
*
|
|
230
|
-
* No client paging: the server's `limit` is the page, and `total` says how many there
|
|
231
|
-
* are. For more than one page, `page` / `hasMore` / `onPageChange` draw a previous /
|
|
232
|
-
* next strip that needs no total (0.38.1); `openRow` shows a `?row=` report from
|
|
233
|
-
* another page. Needs a router, as every `DataTable` does.
|
|
234
|
-
*/
|
|
235
|
-
export function FeedbackPublicList<T extends FeedbackPublicListItem = FeedbackPublicListItem>({
|
|
236
|
-
rows,
|
|
237
|
-
total,
|
|
238
|
-
sort,
|
|
239
|
-
onSortChange,
|
|
240
|
-
search = "",
|
|
241
|
-
onSearchChange,
|
|
242
|
-
renderDetail,
|
|
243
|
-
onVote,
|
|
244
|
-
loading = false,
|
|
245
|
-
openId: openIdProp,
|
|
246
|
-
onOpenIdChange,
|
|
247
|
-
openRow,
|
|
248
|
-
page: pageIndex = 0,
|
|
249
|
-
hasMore = false,
|
|
250
|
-
onPageChange,
|
|
251
|
-
commit,
|
|
252
|
-
renderDate: renderDateProp,
|
|
253
|
-
labels: labelsProp,
|
|
254
|
-
pageLabels: pageLabelsProp,
|
|
255
|
-
fillHeight,
|
|
256
|
-
className,
|
|
257
|
-
}: FeedbackPublicListProps<T>) {
|
|
258
|
-
const labels = useFeedbackPublicLabels(labelsProp);
|
|
259
|
-
const page = useFeedbackPageLabels(pageLabelsProp);
|
|
260
|
-
const categoryLabels = useFeedbackCategoryLabels();
|
|
261
|
-
const renderDate = useFeedbackRenderDate(renderDateProp);
|
|
262
|
-
const [ownOpenId, setOwnOpenId] = useState<number | null>(null);
|
|
263
|
-
const openId = openIdProp !== undefined ? openIdProp : ownOpenId;
|
|
264
|
-
const setOpen = (id: number | null) => {
|
|
265
|
-
if (openIdProp === undefined) setOwnOpenId(id);
|
|
266
|
-
onOpenIdChange?.(id);
|
|
267
|
-
};
|
|
268
|
-
// A `?row=` report from another page: first, while it is the open one, and only when
|
|
269
|
-
// the page does not have it itself.
|
|
270
|
-
// `as T[]`: DataTable's `rows` is still mutable in its type (API-7), and never mutated.
|
|
271
|
-
const shownRows = (
|
|
272
|
-
openRow && openId === openRow.id && !rows.some((row) => row.id === openRow.id) ? [openRow, ...rows] : rows
|
|
273
|
-
) as T[];
|
|
274
|
-
|
|
275
|
-
const columns = useMemo<DataTableColumn<T>[]>(
|
|
276
|
-
() => [
|
|
277
|
-
{
|
|
278
|
-
key: "id",
|
|
279
|
-
header: page.columnId,
|
|
280
|
-
cell: (row) => <span className="font-mono text-xs text-muted">{row.id}</span>,
|
|
281
|
-
mobileHidden: true,
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
key: "date",
|
|
285
|
-
header: page.columnDate,
|
|
286
|
-
cell: (row) => <PublicDate value={row.created_at} renderDate={renderDate} />,
|
|
287
|
-
},
|
|
288
|
-
{
|
|
289
|
-
key: "category",
|
|
290
|
-
header: page.columnCategory,
|
|
291
|
-
cell: (row) => <FeedbackCategoryBadge category={row.category} label={categoryLabels[row.category]} />,
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
key: "title",
|
|
295
|
-
header: page.columnSubject,
|
|
296
|
-
cell: (row) => (
|
|
297
|
-
<span className="inline-flex min-w-0 max-w-full items-center gap-2 large:items-start">
|
|
298
|
-
<span className="min-w-0 truncate-until-large font-medium">{row.title}</span>
|
|
299
|
-
<CommentCount count={row.comment_count} labels={labels} />
|
|
300
|
-
</span>
|
|
301
|
-
),
|
|
302
|
-
mobilePrimary: true,
|
|
303
|
-
},
|
|
304
|
-
{
|
|
305
|
-
key: "votes",
|
|
306
|
-
header: labels.columnVotes,
|
|
307
|
-
className: "whitespace-nowrap",
|
|
308
|
-
// The cell is a button: the row's own link must never wrap it.
|
|
309
|
-
noRowLink: true,
|
|
310
|
-
cell: (row) => (
|
|
311
|
-
<FeedbackVoteButton
|
|
312
|
-
votes={row.votes}
|
|
313
|
-
voted={row.voted}
|
|
314
|
-
own={row.mine}
|
|
315
|
-
onVote={(next) => onVote(row, next)}
|
|
316
|
-
commit={commit}
|
|
317
|
-
size="sm"
|
|
318
|
-
/>
|
|
319
|
-
),
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
key: "status",
|
|
323
|
-
header: page.columnStatus,
|
|
324
|
-
className: "whitespace-nowrap",
|
|
325
|
-
cell: (row) => <FeedbackStatusBadge status={row.status} />,
|
|
326
|
-
},
|
|
327
|
-
],
|
|
328
|
-
[page, labels, categoryLabels, renderDate, onVote, commit],
|
|
329
|
-
);
|
|
330
|
-
|
|
331
|
-
return (
|
|
332
|
-
<div
|
|
333
|
-
className={cn("flex flex-col gap-3", fillHeight && FILL_HEIGHT_CLASS, className)}
|
|
334
|
-
data-feedback-public-list=""
|
|
335
|
-
aria-busy={loading || undefined}
|
|
336
|
-
>
|
|
337
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
338
|
-
<ToggleGroup
|
|
339
|
-
aria-label={labels.sort}
|
|
340
|
-
value={sort}
|
|
341
|
-
onChange={(value) => onSortChange(value)}
|
|
342
|
-
options={SORTS.map((value) => ({
|
|
343
|
-
value,
|
|
344
|
-
label: value === "newest" ? labels.sortNewest : value === "votes" ? labels.sortVotes : labels.sortUpdated,
|
|
345
|
-
}))}
|
|
346
|
-
/>
|
|
347
|
-
{onSearchChange && (
|
|
348
|
-
<SearchField
|
|
349
|
-
aria-label={labels.search}
|
|
350
|
-
placeholder={labels.search}
|
|
351
|
-
value={search}
|
|
352
|
-
onChange={onSearchChange}
|
|
353
|
-
className="min-w-[12rem] flex-1 md:max-w-xs"
|
|
354
|
-
/>
|
|
355
|
-
)}
|
|
356
|
-
{total !== undefined && (
|
|
357
|
-
<span className="ms-auto text-sm text-muted" data-feedback-public-total={total}>
|
|
358
|
-
{labels.total(total)}
|
|
359
|
-
</span>
|
|
360
|
-
)}
|
|
361
|
-
</div>
|
|
362
|
-
<DataTable
|
|
363
|
-
rows={shownRows}
|
|
364
|
-
columns={columns}
|
|
365
|
-
rowKey={(row) => row.id}
|
|
366
|
-
rowName={(row) => row.title}
|
|
367
|
-
onRowClick={(row) => setOpen(openId === row.id ? null : row.id)}
|
|
368
|
-
isExpanded={(row) => row.id === openId}
|
|
369
|
-
expandedRow={(row) => renderDetail(row)}
|
|
370
|
-
mobileExpandAsDialog
|
|
371
|
-
paginated={false}
|
|
372
|
-
fillHeight={fillHeight}
|
|
373
|
-
empty={loading ? labels.loading : labels.empty}
|
|
374
|
-
mobileCard={(row) => (
|
|
375
|
-
<div className="min-w-0 space-y-1">
|
|
376
|
-
<div className="flex items-start justify-between gap-2">
|
|
377
|
-
<span className="min-w-0 flex-1 font-medium [overflow-wrap:anywhere]">{row.title}</span>
|
|
378
|
-
<FeedbackStatusBadge status={row.status} className="shrink-0" />
|
|
379
|
-
</div>
|
|
380
|
-
<div className="flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted">
|
|
381
|
-
<FeedbackCategoryBadge category={row.category} compact label={categoryLabels[row.category]} />
|
|
382
|
-
<PublicDate value={row.created_at} renderDate={renderDate} />
|
|
383
|
-
<CommentCount count={row.comment_count} labels={labels} />
|
|
384
|
-
{/* A count, not the button: the whole card is the row's button, and a button
|
|
385
|
-
inside it is two controls in one. The vote is in the opened report. */}
|
|
386
|
-
<VoteCount count={row.votes} voted={row.voted || row.mine} labels={labels} />
|
|
387
|
-
</div>
|
|
388
|
-
</div>
|
|
389
|
-
)}
|
|
390
|
-
/>
|
|
391
|
-
{onPageChange && (pageIndex > 0 || hasMore) && (
|
|
392
|
-
<PublicPager page={pageIndex} hasMore={hasMore} onPageChange={onPageChange} labels={labels} />
|
|
393
|
-
)}
|
|
394
|
-
</div>
|
|
395
|
-
);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/* ── The detail ───────────────────────────────────────────────────────────── */
|
|
399
|
-
|
|
400
|
-
export interface FeedbackPublicDetailProps {
|
|
401
|
-
/** `GET /feedback/public/{id}`: the public body (attachment URLs already stripped by
|
|
402
|
-
* the server, §9.4) and the replies. */
|
|
403
|
-
row: FeedbackPublicRecord;
|
|
404
|
-
/** `GET /feedback/{id}/comments`, oldest first; `undefined` while it loads. */
|
|
405
|
-
comments: readonly FeedbackComment[] | undefined;
|
|
406
|
-
/** `PUT` / `DELETE /feedback/{id}/vote`; resolve with the answer, reject to roll back. */
|
|
407
|
-
onVote: (next: boolean) => Promise<FeedbackVoteState>;
|
|
408
|
-
/** The viewer is the app's admin: Hide / Unhide on the comments. */
|
|
409
|
-
isAdmin?: boolean;
|
|
410
|
-
/** `POST /feedback/{id}/comments`. Left out — a demo, a reader who may not write — no
|
|
411
|
-
* composer. 0.47 (§12): `attachmentUrl` is the one file uploaded with it (with
|
|
412
|
-
* `onUpload`). */
|
|
413
|
-
onComment?: (body: string, attachmentUrl?: string) => void | Promise<unknown>;
|
|
414
|
-
/** 0.47 (§12): `POST /feedback/attachments` — the comment box then takes one file,
|
|
415
|
-
* pasted, captured or picked, as the rework note does. Left out, text only. */
|
|
416
|
-
onUpload?: FeedbackEntryUploadOptions["onUpload"];
|
|
417
|
-
/** 0.47: the comment box's "Capture screenshot". */
|
|
418
|
-
onCaptureScreenshot?: FeedbackEntryUploadOptions["onCaptureScreenshot"];
|
|
419
|
-
/** 0.47: the comment box's file field, over the contract's defaults. */
|
|
420
|
-
attachment?: FeedbackEntryUploadOptions["attachment"];
|
|
421
|
-
/** 0.47: the app's authenticated GET for the comments' pictures, drawn inline. */
|
|
422
|
-
fetcher?: AuthedFetcher | null;
|
|
423
|
-
/** The admin's hide (`PATCH …/comments/{id} {hidden}`). */
|
|
424
|
-
onHide?: (comment: FeedbackComment, hidden: boolean) => void | Promise<unknown>;
|
|
425
|
-
/** The writer's delete (`DELETE …/comments/{id}`), after a confirm. */
|
|
426
|
-
onDelete?: (comment: FeedbackComment) => void | Promise<unknown>;
|
|
427
|
-
/** A comment is being sent. */
|
|
428
|
-
pending?: boolean;
|
|
429
|
-
/** The vote and the thread's buttons COMMIT — see Button's `commit`. */
|
|
430
|
-
commit?: CommitScope;
|
|
431
|
-
/** Voting is off for this viewer (a demo): `true`, or the reason. */
|
|
432
|
-
voteDisabled?: boolean | string;
|
|
433
|
-
/** See {@link FeedbackRenderDate}. */
|
|
434
|
-
renderDate?: FeedbackRenderDate;
|
|
435
|
-
/** "Now" for the thread's relative times — pin it in tests and stories. */
|
|
436
|
-
now?: Date | number;
|
|
437
|
-
/** Over the `feedbackPublic` namespace. */
|
|
438
|
-
labels?: LabelOverride<FeedbackPublicLabels>;
|
|
439
|
-
/** Over the `feedbackComments` namespace, for the thread. */
|
|
440
|
-
commentLabels?: LabelOverride<FeedbackCommentsLabels>;
|
|
441
|
-
className?: string;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* One public report opened (round 0.38, docs/feedback-harmonization.md §9.3, §9.10): who
|
|
446
|
-
* filed it — the first name the server sent, else **"A user"** (§9.5) — and when; the
|
|
447
|
-
* **vote**; the **public body**; and the **conversation**, the admin's replies and other
|
|
448
|
-
* people's comments merged oldest first (§9.8, `FeedbackCommentThread`), with the box to
|
|
449
|
-
* add one.
|
|
450
|
-
*
|
|
451
|
-
* What it never draws, because the public record never carries it (§9.10): an address,
|
|
452
|
-
* a last name, the report's screenshot or files, the page the report was filed on. The
|
|
453
|
-
* body is the server's `public_body` — the client strips nothing and adds nothing. The
|
|
454
|
-
* one file it shows (0.47, §12) is a comment's own, posted with it to be seen.
|
|
455
|
-
*/
|
|
456
|
-
export function FeedbackPublicDetail({
|
|
457
|
-
row,
|
|
458
|
-
comments,
|
|
459
|
-
onVote,
|
|
460
|
-
isAdmin = false,
|
|
461
|
-
onComment,
|
|
462
|
-
onHide,
|
|
463
|
-
onDelete,
|
|
464
|
-
onUpload,
|
|
465
|
-
onCaptureScreenshot,
|
|
466
|
-
attachment,
|
|
467
|
-
fetcher,
|
|
468
|
-
pending,
|
|
469
|
-
commit,
|
|
470
|
-
voteDisabled,
|
|
471
|
-
renderDate: renderDateProp,
|
|
472
|
-
now,
|
|
473
|
-
labels: labelsProp,
|
|
474
|
-
commentLabels,
|
|
475
|
-
className,
|
|
476
|
-
}: FeedbackPublicDetailProps) {
|
|
477
|
-
const labels = useFeedbackPublicLabels(labelsProp);
|
|
478
|
-
const renderDate = useFeedbackRenderDate(renderDateProp);
|
|
479
|
-
return (
|
|
480
|
-
<FeedbackDetail className={className}>
|
|
481
|
-
<div className="flex flex-wrap items-center gap-x-3 gap-y-2" data-feedback-public-detail={row.id}>
|
|
482
|
-
<span className="text-sm text-secondary" data-feedback-author="">
|
|
483
|
-
{labels.filedBy(row.author_name ?? labels.anonymous)}
|
|
484
|
-
</span>
|
|
485
|
-
<PublicDate value={row.created_at} renderDate={renderDate} />
|
|
486
|
-
<FeedbackVoteButton
|
|
487
|
-
votes={row.votes}
|
|
488
|
-
voted={row.voted}
|
|
489
|
-
own={row.mine}
|
|
490
|
-
onVote={onVote}
|
|
491
|
-
disabled={voteDisabled}
|
|
492
|
-
commit={commit}
|
|
493
|
-
className="ms-auto"
|
|
494
|
-
/>
|
|
495
|
-
</div>
|
|
496
|
-
<FeedbackDetailSection title={labels.body}>
|
|
497
|
-
{/* Rework rounds stay in it — the author's own words (§9.4) — on a server before
|
|
498
|
-
server-kit 0.13; since then each is an entry in the conversation (§10.3). */}
|
|
499
|
-
<FeedbackProse>{row.body}</FeedbackProse>
|
|
500
|
-
</FeedbackDetailSection>
|
|
501
|
-
<FeedbackDetailSection title={labels.conversation}>
|
|
502
|
-
<FeedbackCommentThread
|
|
503
|
-
replies={row.replies}
|
|
504
|
-
comments={comments ?? []}
|
|
505
|
-
loading={comments === undefined}
|
|
506
|
-
isAdmin={isAdmin}
|
|
507
|
-
// 0.40 (§10.3): the author's rework entries are theirs — at the reading end.
|
|
508
|
-
isAuthor={row.mine}
|
|
509
|
-
onComment={onComment}
|
|
510
|
-
onHide={onHide}
|
|
511
|
-
onDelete={onDelete}
|
|
512
|
-
onUpload={onUpload}
|
|
513
|
-
onCaptureScreenshot={onCaptureScreenshot}
|
|
514
|
-
attachment={attachment}
|
|
515
|
-
fetcher={fetcher}
|
|
516
|
-
pending={pending}
|
|
517
|
-
commit={commit}
|
|
518
|
-
now={now}
|
|
519
|
-
labels={commentLabels}
|
|
520
|
-
/>
|
|
521
|
-
</FeedbackDetailSection>
|
|
522
|
-
</FeedbackDetail>
|
|
523
|
-
);
|
|
524
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { Switch } from "../components/switch";
|
|
2
|
-
import type { CommitScope } from "../components/write-lock";
|
|
3
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
4
|
-
import { FEEDBACK_AUTHOR_EDITABLE_STATUSES, type FeedbackRecord } from "./feedback-record";
|
|
5
|
-
import { DEFAULT_FEEDBACK_PUBLIC_LABELS, type FeedbackPublicLabels } from "./feedback-public-labels";
|
|
6
|
-
|
|
7
|
-
/** What the switch reads off a report: {@link FeedbackRecord}'s fields (§9.3). */
|
|
8
|
-
export type FeedbackPublicSwitchRow = Pick<
|
|
9
|
-
FeedbackRecord,
|
|
10
|
-
"user_id" | "category" | "status" | "public" | "filed_private" | "mine"
|
|
11
|
-
>;
|
|
12
|
-
|
|
13
|
-
/** Who is looking: the app's admin check, and the signed-in user's id. */
|
|
14
|
-
export interface FeedbackPublicSwitchViewer {
|
|
15
|
-
isAdmin: boolean;
|
|
16
|
-
viewerId?: number | null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** The viewer filed the row — `mine` when the server sent it, else the ids (never for an
|
|
20
|
-
* erased author, `user_id: null`). */
|
|
21
|
-
function isAuthorOf(row: FeedbackPublicSwitchRow, viewerId: number | null | undefined): boolean {
|
|
22
|
-
if (row.mine != null) return row.mine;
|
|
23
|
-
return row.user_id !== null && viewerId !== undefined && viewerId !== null && row.user_id === viewerId;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Whether the viewer may flip a report's `public` flag — the server's rule (§9.3), so the
|
|
28
|
-
* switch never offers what the `PATCH {public}` would refuse with a 403:
|
|
29
|
-
*
|
|
30
|
-
* - never on a CRASH (decision 9: a crash is private whatever its flag);
|
|
31
|
-
* - an admin, at any status;
|
|
32
|
-
* - the author while the status is OPEN, READY or IN_PROGRESS
|
|
33
|
-
* (`FEEDBACK_AUTHOR_EDITABLE_STATUSES`), and on a `filed_private` report — one the
|
|
34
|
-
* 0.38 migration made public — at any status: that is the opt-out the notice offers.
|
|
35
|
-
*/
|
|
36
|
-
export function feedbackPublicSwitchAllowed(
|
|
37
|
-
row: FeedbackPublicSwitchRow,
|
|
38
|
-
{ isAdmin, viewerId }: FeedbackPublicSwitchViewer,
|
|
39
|
-
): boolean {
|
|
40
|
-
if (row.category === "CRASH") return false;
|
|
41
|
-
if (isAdmin) return true;
|
|
42
|
-
if (!isAuthorOf(row, viewerId)) return false;
|
|
43
|
-
return row.filed_private === true || FEEDBACK_AUTHOR_EDITABLE_STATUSES.includes(row.status);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface FeedbackPublicSwitchProps extends FeedbackPublicSwitchViewer {
|
|
47
|
-
row: FeedbackPublicSwitchRow;
|
|
48
|
-
/** `PATCH /feedback/{id} {"public": next}` — the app's mutation. */
|
|
49
|
-
onChange: (next: boolean) => void;
|
|
50
|
-
/** The PATCH is in flight: the switch holds still. */
|
|
51
|
-
pending?: boolean;
|
|
52
|
-
/** Flipping it SAVES: pass `true` to put it under the page's `WriteLockProvider`
|
|
53
|
-
* (Switch's `commit`). Off by default, as on the inbox's status buttons. */
|
|
54
|
-
commit?: CommitScope;
|
|
55
|
-
/** Over the `feedbackPublic` namespace (`visibleToOthers`, `visibleHint`,
|
|
56
|
-
* `visibleLocked`). */
|
|
57
|
-
labels?: LabelOverride<FeedbackPublicLabels>;
|
|
58
|
-
className?: string;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* **Visible to others** — a report's `public` flag (round 0.38, docs/feedback-harmonization.md
|
|
63
|
-
* §9.3, decision 6), for the row detail (`FeedbackRowDetail`'s `onPublicChange`) or an
|
|
64
|
-
* app's own page.
|
|
65
|
-
*
|
|
66
|
-
* - Drawn for the admin and the author only: nobody else is sent `public` (§9.10). Not
|
|
67
|
-
* drawn on a CRASH, and not when the row carries no `public` at all (a server before
|
|
68
|
-
* 0.38, or an app without public parts — kastlan).
|
|
69
|
-
* - The author past the open window sees it **locked with the reason** ("Only while the
|
|
70
|
-
* report is open"), focusable, so the reason reaches a keyboard; a `filed_private`
|
|
71
|
-
* report is never locked for its author ({@link feedbackPublicSwitchAllowed}).
|
|
72
|
-
* - The line under it says what "visible" means: the title and the text, never the
|
|
73
|
-
* screenshots or files (decision 1).
|
|
74
|
-
*/
|
|
75
|
-
export function FeedbackPublicSwitch({
|
|
76
|
-
row,
|
|
77
|
-
isAdmin,
|
|
78
|
-
viewerId,
|
|
79
|
-
onChange,
|
|
80
|
-
pending = false,
|
|
81
|
-
commit,
|
|
82
|
-
labels: labelsProp,
|
|
83
|
-
className,
|
|
84
|
-
}: FeedbackPublicSwitchProps) {
|
|
85
|
-
const labels = useKitLabels("feedbackPublic", DEFAULT_FEEDBACK_PUBLIC_LABELS, labelsProp);
|
|
86
|
-
if (row.category === "CRASH" || row.public == null) return null;
|
|
87
|
-
if (!isAdmin && !isAuthorOf(row, viewerId)) return null;
|
|
88
|
-
const allowed = feedbackPublicSwitchAllowed(row, { isAdmin, viewerId });
|
|
89
|
-
return (
|
|
90
|
-
<Switch
|
|
91
|
-
className={className}
|
|
92
|
-
label={labels.visibleToOthers}
|
|
93
|
-
description={labels.visibleHint}
|
|
94
|
-
checked={row.public === true}
|
|
95
|
-
disabled={pending}
|
|
96
|
-
disabledReason={allowed ? undefined : labels.visibleLocked}
|
|
97
|
-
commit={commit}
|
|
98
|
-
onCheckedChange={(next) => onChange(next)}
|
|
99
|
-
data-feedback-public={row.public ? "on" : "off"}
|
|
100
|
-
/>
|
|
101
|
-
);
|
|
102
|
-
}
|