@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,67 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
|
|
3
|
-
import { settle } from "../hooks/use-mounted";
|
|
4
|
-
|
|
5
|
-
export interface DeviceZoneReportOptions {
|
|
6
|
-
/** The account's `device_timezone` from `/auth/me`; `undefined` while it loads (no
|
|
7
|
-
* report until it is known). */
|
|
8
|
-
stored: string | null | undefined;
|
|
9
|
-
/** `PATCH /auth/me {device_timezone}` with this device's zone. */
|
|
10
|
-
report: (deviceTimezone: string) => Promise<unknown> | void;
|
|
11
|
-
/** A demo account: never reported (the server ignores it too, §10.3 Settled). */
|
|
12
|
-
isDemo?: boolean;
|
|
13
|
-
/** The signed-in account (its user id): the once-per-start guard is per account, so a
|
|
14
|
-
* second person signed in on a shared PC in the same start is reported too. Without it
|
|
15
|
-
* the guard is cleared when `stored` goes `undefined` (signed out). */
|
|
16
|
-
account?: string | number | null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* This device's IANA zone ("Europe/Zurich"), or `"UTC"` where the runtime names none —
|
|
21
|
-
* the zone `useDeviceZoneReport` reports, which becomes the account's (§10.3, automatic
|
|
22
|
-
* only), and the one sign-up sends (`RegisterRequest.device_timezone`). Here since 0.46.1
|
|
23
|
-
* (keksdose N6).
|
|
24
|
-
*/
|
|
25
|
-
export function deviceTimeZone(): string {
|
|
26
|
-
try {
|
|
27
|
-
return Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC";
|
|
28
|
-
} catch {
|
|
29
|
-
return "UTC";
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** The (account, stored, device) triples already reported in this start of the app. */
|
|
34
|
-
const reportedThisStart = new Set<string>();
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Report this device's zone to the account (0.46, §10.3): the account's zone follows the
|
|
38
|
-
* device last used, else `Europe/Zurich`; screens keep showing device time. Once per start
|
|
39
|
-
* of the app, and only when it differs from the stored `device_timezone` — a bench PC in Zurich never
|
|
40
|
-
* PATCHes on a sign-in — and never for a demo. Per account: a sign-out (`stored` back to
|
|
41
|
-
* `undefined`) clears the guard, and `account` keys it. The report IS the account's zone: it is
|
|
42
|
-
* automatic only (§10.3, amended 2026-10-20), so nothing is ever picked. A failed report
|
|
43
|
-
* is not retried in the same start; the next start tries again. Sign-up sends the zone
|
|
44
|
-
* itself (`RegisterRequest.device_timezone`).
|
|
45
|
-
*
|
|
46
|
-
* useDeviceZoneReport({ stored: me?.device_timezone, isDemo: me?.is_demo, account: me?.id,
|
|
47
|
-
* report: async (zone) => setUser((await api.patch("/auth/me", { device_timezone: zone })).data) });
|
|
48
|
-
*/
|
|
49
|
-
export function useDeviceZoneReport({ stored, report, isDemo = false, account = null }: DeviceZoneReportOptions): void {
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
if (stored === undefined) {
|
|
52
|
-
// Signed out (or still loading): the next account in this start is reported afresh.
|
|
53
|
-
reportedThisStart.clear();
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
if (isDemo) return;
|
|
57
|
-
const device = deviceTimeZone();
|
|
58
|
-
if (device === stored) return;
|
|
59
|
-
const key = `${account ?? ""}|${stored ?? ""}→${device}`;
|
|
60
|
-
if (reportedThisStart.has(key)) return;
|
|
61
|
-
reportedThisStart.add(key);
|
|
62
|
-
void settle(() => report(device)).catch(() => undefined);
|
|
63
|
-
// `report` is the app's request function: a new closure each render must not report
|
|
64
|
-
// again, so only the values decide.
|
|
65
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
66
|
-
}, [stored, isDemo, account]);
|
|
67
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
// The English words of `useFeedbackNotificationTypes` (round 0.38), in a module with no
|
|
2
|
-
// component code, as every `*-labels.ts`: the English catalogue imports them alone.
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* `feedbackNotificationTypes` — the setting words of the feedback notification types
|
|
6
|
-
* (docs/feedback-harmonization.md §9.11). In the kit, not in each app, because two apps
|
|
7
|
-
* declare them (keksdose, Kurvenschmiede; kastlan `feedback_answered` alone). The mail and
|
|
8
|
-
* push texts stay the app's.
|
|
9
|
-
*/
|
|
10
|
-
export interface FeedbackNotificationTypesLabels {
|
|
11
|
-
/** `feedback_answered`: a reply on a report the person wrote or commented on. */
|
|
12
|
-
answered: string;
|
|
13
|
-
answeredDescription: string;
|
|
14
|
-
/** `feedback_comment`: a visible comment on such a report. */
|
|
15
|
-
comment: string;
|
|
16
|
-
commentDescription: string;
|
|
17
|
-
/** 0.46 (feedback §11): `feedback_received`, an admin's alert for a new report, a
|
|
18
|
-
* rework and a new crash. */
|
|
19
|
-
received: string;
|
|
20
|
-
receivedDescription: string;
|
|
21
|
-
/** A heading the apps may put over the admin's types ("Admin"). */
|
|
22
|
-
adminGroup: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS: FeedbackNotificationTypesLabels = {
|
|
26
|
-
answered: "Answers to your reports",
|
|
27
|
-
answeredDescription: "When a report you wrote or commented on gets an answer.",
|
|
28
|
-
comment: "Comments on reports you follow",
|
|
29
|
-
commentDescription: "When someone comments on a report you wrote or commented on.",
|
|
30
|
-
received: "New feedback and reworks",
|
|
31
|
-
receivedDescription: "When someone files a report or sends one back.",
|
|
32
|
-
adminGroup: "Admin",
|
|
33
|
-
};
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
3
|
-
import type { NotificationTypeEntry } from "./notification-types";
|
|
4
|
-
import {
|
|
5
|
-
DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,
|
|
6
|
-
type FeedbackNotificationTypesLabels,
|
|
7
|
-
} from "./feedback-notification-types-labels";
|
|
8
|
-
|
|
9
|
-
export { DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS };
|
|
10
|
-
export type { FeedbackNotificationTypesLabels };
|
|
11
|
-
|
|
12
|
-
/** The feedback notification ids (§9.11, §11), as server-kit's `FEEDBACK_ANSWERED`,
|
|
13
|
-
* `FEEDBACK_COMMENT` and `FEEDBACK_RECEIVED` (0.46: an admin's alert) name them. */
|
|
14
|
-
export type FeedbackNotificationTypeId = "feedback_answered" | "feedback_comment" | "feedback_received";
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* The setting words of the two feedback notification types (round 0.38,
|
|
18
|
-
* docs/feedback-harmonization.md §9.11), for `NotificationTypesSetting`'s `types`:
|
|
19
|
-
*
|
|
20
|
-
* ```tsx
|
|
21
|
-
* const feedbackTypes = useFeedbackNotificationTypes();
|
|
22
|
-
* <NotificationTypesSetting types={[...appTypes, ...feedbackTypes]} … />
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* - **"Answers to your reports"** (`feedback_answered`): a reply from the admin or a
|
|
26
|
-
* loop, to the author and every earlier commenter.
|
|
27
|
-
* - **"Comments on reports you follow"** (`feedback_comment`): a visible comment, to the
|
|
28
|
-
* author and the earlier commenters.
|
|
29
|
-
*
|
|
30
|
-
* - **"New feedback and reworks"** (`feedback_received`, 0.46, feedback §11): to the
|
|
31
|
-
* admins, when someone files a report or sends one back for rework. (A crash is mailed
|
|
32
|
-
* only inside the bundle where an app runs the queue, so the text names no crash.)
|
|
33
|
-
* `labels.adminGroup` ("Admin") is a heading an app may put over it — read it with
|
|
34
|
-
* {@link useFeedbackNotificationTypesLabels} (0.46.1) for the app's own `groups`.
|
|
35
|
-
*
|
|
36
|
-
* Every entry is always returned: the card draws a type only when the server answered
|
|
37
|
-
* it (notifications §2.1), so kastlan, which does not declare `feedback_comment` while its
|
|
38
|
-
* public parts are off, shows the first alone, and a person who is no admin is never
|
|
39
|
-
* answered `feedback_received`. Words: `<UiKitProvider labels={{
|
|
40
|
-
* feedbackNotificationTypes }}>` over English, `labels` over both.
|
|
41
|
-
*/
|
|
42
|
-
export function useFeedbackNotificationTypes(
|
|
43
|
-
labels?: LabelOverride<FeedbackNotificationTypesLabels>,
|
|
44
|
-
): NotificationTypeEntry<FeedbackNotificationTypeId>[] {
|
|
45
|
-
const words = useKitLabels("feedbackNotificationTypes", DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS, labels);
|
|
46
|
-
return useMemo(
|
|
47
|
-
() => [
|
|
48
|
-
{ id: "feedback_answered", label: words.answered, description: words.answeredDescription },
|
|
49
|
-
{ id: "feedback_comment", label: words.comment, description: words.commentDescription },
|
|
50
|
-
{ id: "feedback_received", label: words.received, description: words.receivedDescription },
|
|
51
|
-
],
|
|
52
|
-
[words],
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The `feedbackNotificationTypes` words, resolved — English, then the provider, then
|
|
58
|
-
* `labels` (0.46.1, keksdose N9): what an app reads to head its own `groups` with
|
|
59
|
-
* `adminGroup` ("Admin") in the provider's locale, as {@link useFeedbackNotificationTypes}
|
|
60
|
-
* labels the entries.
|
|
61
|
-
*
|
|
62
|
-
* ```tsx
|
|
63
|
-
* const { adminGroup } = useFeedbackNotificationTypesLabels();
|
|
64
|
-
* groups={[...appGroups, { id: "admin", label: adminGroup, types: ["feedback_received"] }]}
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
export function useFeedbackNotificationTypesLabels(
|
|
68
|
-
labels?: LabelOverride<FeedbackNotificationTypesLabels>,
|
|
69
|
-
): FeedbackNotificationTypesLabels {
|
|
70
|
-
return useKitLabels("feedbackNotificationTypes", DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS, labels);
|
|
71
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { Bell } from "lucide-react";
|
|
2
|
-
import type { LucideIcon } from "lucide-react";
|
|
3
|
-
|
|
4
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
5
|
-
import { useDayFormatter } from "../lib/day-format";
|
|
6
|
-
import { DEFAULT_LIST_LABELS } from "../components/list-labels";
|
|
7
|
-
import { StatusDot } from "../components/status-dot";
|
|
8
|
-
import { TopBarActionMenu } from "../shell/topbar-action-menu";
|
|
9
|
-
import type { TopBarMenuEntry } from "../shell/topbar-action-menu";
|
|
10
|
-
import { useNotificationsLabels } from "./notification-parts";
|
|
11
|
-
import type { NotificationsLabels } from "./notifications-labels";
|
|
12
|
-
import type { NotificationInboxItem } from "./notification-inbox";
|
|
13
|
-
|
|
14
|
-
/** How many rows the bell's panel shows: the newest 20 (§10.1). */
|
|
15
|
-
const BELL_ROWS = 20;
|
|
16
|
-
|
|
17
|
-
export interface NotificationBellProps<Id extends string | number = string | number> {
|
|
18
|
-
/** The inbox, newest first (the bell shows the first 20); `undefined` while it loads. */
|
|
19
|
-
items: readonly NotificationInboxItem<Id>[] | undefined;
|
|
20
|
-
/** Every unread row of the account (`unread_count`): the badge. */
|
|
21
|
-
unreadCount: number;
|
|
22
|
-
/** Open a row: the app marks it read and routes to `item.url` (kastlan switches the
|
|
23
|
-
* acting company first, to `item.company_id`). The panel closes. */
|
|
24
|
-
onOpen: (item: NotificationInboxItem<Id>) => void;
|
|
25
|
-
/** The app's inbox page or card, for "All notifications". */
|
|
26
|
-
href: string;
|
|
27
|
-
/** The row's glyph for a type, as {@link NotificationInbox}'s; `Bell` by default. */
|
|
28
|
-
icon?: (type: string) => LucideIcon | undefined;
|
|
29
|
-
/** A row's time. Default: the provider's `formatDate` (the app's date preference) with
|
|
30
|
-
* the language's clock, else date and time in the provider's locale and `timeZone`. */
|
|
31
|
-
formatDate?: (iso: string) => string;
|
|
32
|
-
labels?: LabelOverride<NotificationsLabels>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** The badge's text: "99+" past 99. */
|
|
36
|
-
const badgeText = (count: number) => (count > 99 ? "99+" : String(Math.floor(count)));
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The top bar's bell (0.46, docs/notifications-harmonization.md §10.1), for
|
|
40
|
-
* `TopBarActions`' `notifications` slot, right before the account menu: an icon button
|
|
41
|
-
* with the unread count as a badge ("99+" past 99), opening the newest 20 rows in the
|
|
42
|
-
* kit's top-bar panel (`TopBarActionMenu`) with "All notifications" under them.
|
|
43
|
-
*
|
|
44
|
-
* **Optional per app.** "One badge per signal": an app shows the bell or an unread dot on
|
|
45
|
-
* the avatar, never both — keksdose keeps its avatar dot and no bell; kastlan's inbox
|
|
46
|
-
* lives in the bell. Shown to every signed-in account in an app that keeps an inbox, the
|
|
47
|
-
* demo included. Props only, as the inbox list: poll the count every
|
|
48
|
-
* {@link INBOX_BADGE_INTERVAL}.
|
|
49
|
-
*/
|
|
50
|
-
export function NotificationBell<Id extends string | number = string | number>({
|
|
51
|
-
items,
|
|
52
|
-
unreadCount,
|
|
53
|
-
onOpen,
|
|
54
|
-
href,
|
|
55
|
-
icon,
|
|
56
|
-
formatDate: formatDateProp,
|
|
57
|
-
labels: labelsProp,
|
|
58
|
-
}: NotificationBellProps<Id>) {
|
|
59
|
-
const labels = useNotificationsLabels(labelsProp);
|
|
60
|
-
const list = useKitLabels("list", DEFAULT_LIST_LABELS);
|
|
61
|
-
// As the inbox's rows: the prop, else the provider's `formatDate` with the language's
|
|
62
|
-
// clock, else the kit's in the provider's locale and `timeZone` (refactor audit 2026-10-30, DUP-2).
|
|
63
|
-
const day = useDayFormatter(formatDateProp);
|
|
64
|
-
const timeOf = (iso: string) => day(iso, { time: true });
|
|
65
|
-
const unread = unreadCount > 0;
|
|
66
|
-
const shown = (items ?? []).slice(0, BELL_ROWS);
|
|
67
|
-
|
|
68
|
-
const entries: TopBarMenuEntry[] = shown.map((item) => {
|
|
69
|
-
const Icon = icon?.(item.notification_type) ?? Bell;
|
|
70
|
-
const isUnread = item.read_at === null;
|
|
71
|
-
return {
|
|
72
|
-
key: `item-${String(item.id)}`,
|
|
73
|
-
icon: <Icon aria-hidden className="size-4" />,
|
|
74
|
-
label: (
|
|
75
|
-
<span className="block min-w-0" data-bell-item={String(item.id)}>
|
|
76
|
-
{item.company && <span className="block truncate text-caption text-muted">{item.company}</span>}
|
|
77
|
-
<span className={isUnread ? "block font-semibold" : "block"}>{item.title}</span>
|
|
78
|
-
<span className="block line-clamp-2 text-xs text-secondary">{item.body}</span>
|
|
79
|
-
<span className="block text-caption text-muted">{timeOf(item.created_at)}</span>
|
|
80
|
-
</span>
|
|
81
|
-
),
|
|
82
|
-
trailing: isUnread ? <StatusDot tone="brand" aria-label={list.unread} /> : undefined,
|
|
83
|
-
onSelect: () => onOpen(item),
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
if (entries.length > 0) entries.push({ kind: "divider", key: "divider" });
|
|
87
|
-
entries.push({ kind: "link", key: "all", to: href, label: labels.allNotifications });
|
|
88
|
-
|
|
89
|
-
return (
|
|
90
|
-
<TopBarActionMenu
|
|
91
|
-
aria-label={labels.bellLabel}
|
|
92
|
-
triggerAttributes={{ "data-notification-bell": "" }}
|
|
93
|
-
trigger={() => (
|
|
94
|
-
<span className="relative inline-flex" data-unread={unread ? unreadCount : undefined}>
|
|
95
|
-
<Bell aria-hidden className="size-5" />
|
|
96
|
-
{unread && (
|
|
97
|
-
<>
|
|
98
|
-
<span
|
|
99
|
-
aria-hidden
|
|
100
|
-
data-badge=""
|
|
101
|
-
className="pointer-events-none absolute -end-2 -top-1.5 h-4 min-w-4 rounded-full bg-danger px-1 text-center text-micro font-semibold leading-4 text-danger-contrast"
|
|
102
|
-
>
|
|
103
|
-
{badgeText(unreadCount)}
|
|
104
|
-
</span>
|
|
105
|
-
<span className="sr-only">{labels.bellUnread(unreadCount)}</span>
|
|
106
|
-
</>
|
|
107
|
-
)}
|
|
108
|
-
</span>
|
|
109
|
-
)}
|
|
110
|
-
header={
|
|
111
|
-
shown.length === 0
|
|
112
|
-
? { title: labels.inboxTitle, subtitle: items === undefined ? labels.inboxLoading : labels.inboxEmpty }
|
|
113
|
-
: undefined
|
|
114
|
-
}
|
|
115
|
-
entries={entries}
|
|
116
|
-
panelClassName="w-80 max-w-[calc(100vw-2rem)]"
|
|
117
|
-
/>
|
|
118
|
-
);
|
|
119
|
-
}
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { useId, useRef, useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
3
|
-
import { Bell, CheckCheck, Trash2 } from "lucide-react";
|
|
4
|
-
import type { LucideIcon } from "lucide-react";
|
|
5
|
-
|
|
6
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
7
|
-
import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
|
|
8
|
-
import { cn } from "../lib/cn";
|
|
9
|
-
import { useDayFormatter } from "../lib/day-format";
|
|
10
|
-
import { Button } from "../components/button";
|
|
11
|
-
import { Card } from "../components/card";
|
|
12
|
-
import { EmptyState } from "../components/empty-state";
|
|
13
|
-
import { IconButton } from "../components/icon-button";
|
|
14
|
-
import { InlineConfirm } from "../components/inline-confirm";
|
|
15
|
-
import { List, ListItem } from "../components/list";
|
|
16
|
-
import { Skeleton } from "../components/skeleton";
|
|
17
|
-
import { COMMIT_EXCEPT_BILLING } from "../components/write-lock";
|
|
18
|
-
import { SettingsCardTitle } from "../settings/settings-heading";
|
|
19
|
-
import { safeNextPath } from "../landing/routing";
|
|
20
|
-
import { settle, useMounted } from "../hooks/use-mounted";
|
|
21
|
-
import { describeFailure, FailureLine, useNotificationsLabels } from "./notification-parts";
|
|
22
|
-
import type { NotificationsLabels } from "./notifications-labels";
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* One inbox row as `GET /notifications/inbox` answers it (server-kit `InboxItem`, §3.7):
|
|
26
|
-
* the title and body already in the recipient's language.
|
|
27
|
-
*/
|
|
28
|
-
export interface NotificationInboxItem<Id extends string | number = string | number> {
|
|
29
|
-
id: Id;
|
|
30
|
-
/** The type id, for the row's icon. */
|
|
31
|
-
notification_type: string;
|
|
32
|
-
title: string;
|
|
33
|
-
body: string;
|
|
34
|
-
/** A path in the app, or `null` (nothing to open). Never `//` or a scheme (§3.7): a url
|
|
35
|
-
* that does not resolve to this origin is drawn as a row with nothing to open. */
|
|
36
|
-
url: string | null;
|
|
37
|
-
/** ISO date-time. */
|
|
38
|
-
created_at: string;
|
|
39
|
-
/** ISO date-time, or `null` while unread. */
|
|
40
|
-
read_at: string | null;
|
|
41
|
-
/** 0.46 (server-kit 0.16 `InboxItem.company`): the company the row is about, named on
|
|
42
|
-
* the row — kastlan's inbox holds every company's rows. */
|
|
43
|
-
company?: string | null;
|
|
44
|
-
/** 0.46.1 (server-kit 0.16.1 `InboxItem.company_id`): the same company by its id, so
|
|
45
|
-
* `onOpen` switches to it exactly (two companies may share a name). */
|
|
46
|
-
company_id?: number | string | null;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** The inbox request that failed, as `describeError` gets it (0.46.1): one row marked read,
|
|
50
|
-
* "Mark all as read", or "Clear all". */
|
|
51
|
-
export type NotificationInboxAction = "read" | "readAll" | "clear";
|
|
52
|
-
|
|
53
|
-
export interface NotificationInboxProps<Id extends string | number = string | number> extends Omit<
|
|
54
|
-
ComponentPropsWithRef<"div">,
|
|
55
|
-
"children" | "title"
|
|
56
|
-
> {
|
|
57
|
-
/** The rows, newest first; `undefined` while the first page loads. */
|
|
58
|
-
items: readonly NotificationInboxItem<Id>[] | undefined;
|
|
59
|
-
/** Every unread row of the account (`unread_count`), not only this page's. */
|
|
60
|
-
unreadCount: number;
|
|
61
|
-
loading?: boolean;
|
|
62
|
-
/** `POST /notifications/inbox/read {ids}` — these rows, or `null` for all. */
|
|
63
|
-
onMarkRead: (ids: Id[] | null) => Promise<unknown> | void;
|
|
64
|
-
/** `DELETE /notifications/inbox`. Asked first, in the header. */
|
|
65
|
-
onClear: () => Promise<unknown> | void;
|
|
66
|
-
/**
|
|
67
|
-
* Open a row: the kit marks it read first, then calls this, and the app routes to
|
|
68
|
-
* `item.url` (kastlan switches the acting company, `item.company_id`, first) — through
|
|
69
|
-
* `safeNextPath`, as the kit does. Every row is a button then.
|
|
70
|
-
* Left out, a row with a `url` is a real link through the provider's router link — the
|
|
71
|
-
* url as a same-origin path (`safeNextPath`) — that marks itself read on a click or a
|
|
72
|
-
* middle click (keksdose #451). A row without one, or with one that leaves the origin
|
|
73
|
-
* (`//host`, a scheme), marks itself read and opens nothing.
|
|
74
|
-
*/
|
|
75
|
-
onOpen?: (item: NotificationInboxItem<Id>) => void;
|
|
76
|
-
/** The row's glyph for a type — the app's map (keksdose's `TYPE_ICONS`). `undefined`,
|
|
77
|
-
* or a type it does not know (a retired one), is the `Bell`. */
|
|
78
|
-
icon?: (type: string) => LucideIcon | undefined;
|
|
79
|
-
/** More rows than shown: a "Show more" row calls `onLoadMore` (the API pages by
|
|
80
|
-
* `offset`). */
|
|
81
|
-
hasMore?: boolean;
|
|
82
|
-
onLoadMore?: () => void;
|
|
83
|
-
/** The next page is loading. */
|
|
84
|
-
loadingMore?: boolean;
|
|
85
|
-
/** A row's time. Default: the provider's `formatDate` (the app's date preference) with
|
|
86
|
-
* the language's clock, else date and time in the provider's locale and `timeZone`. */
|
|
87
|
-
formatDate?: (iso: string) => string;
|
|
88
|
-
/** The heading. Default `labels.inboxTitle` ("Inbox"). */
|
|
89
|
-
title?: ReactNode;
|
|
90
|
-
/** The app's own words for a failed request, or `undefined` for the kit's `failed`.
|
|
91
|
-
* `action` (0.46.1) says which request failed: `"read"` (one row), `"readAll"` ("Mark
|
|
92
|
-
* all as read") or `"clear"` ("Clear all") — so a failed mark-read is not worded as a
|
|
93
|
-
* failed clear. */
|
|
94
|
-
describeError?: (error: unknown, action: NotificationInboxAction) => ReactNode | undefined;
|
|
95
|
-
labels?: LabelOverride<NotificationsLabels>;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* The in-app inbox (0.46, docs/notifications-harmonization.md §10.1), keksdose's list
|
|
100
|
-
* lifted: newest first, an icon per type (`Bell` for one the app does not map), the
|
|
101
|
-
* title and two lines of body, the time, and — kastlan — the company the row is about.
|
|
102
|
-
* Unread rows are bold with a dot. Props only: the app keeps the data (poll the badge
|
|
103
|
-
* every {@link INBOX_BADGE_INTERVAL}, invalidate on its worker's push message).
|
|
104
|
-
*
|
|
105
|
-
* - **Opening a row marks it read** (see `onOpen`).
|
|
106
|
-
* - **"Mark all as read"** while anything is unread; **"Clear all"** asks first, in the
|
|
107
|
-
* header — no `ConfirmProvider` needed — with focus on Cancel.
|
|
108
|
-
* - **"Show more"** with `hasMore`; the list scrolls inside a box of at most
|
|
109
|
-
* `min(24rem, 70vh)`, so it never pushes the settings below it off the page.
|
|
110
|
-
*
|
|
111
|
-
* Under a write lock the header's actions are `commit` controls exempt from billing.
|
|
112
|
-
*/
|
|
113
|
-
export function NotificationInbox<Id extends string | number = string | number>({
|
|
114
|
-
items,
|
|
115
|
-
unreadCount,
|
|
116
|
-
loading,
|
|
117
|
-
onMarkRead,
|
|
118
|
-
onClear,
|
|
119
|
-
onOpen,
|
|
120
|
-
icon,
|
|
121
|
-
hasMore = false,
|
|
122
|
-
onLoadMore,
|
|
123
|
-
loadingMore = false,
|
|
124
|
-
formatDate: formatDateProp,
|
|
125
|
-
title,
|
|
126
|
-
describeError,
|
|
127
|
-
labels: labelsProp,
|
|
128
|
-
className,
|
|
129
|
-
...rest
|
|
130
|
-
}: NotificationInboxProps<Id>) {
|
|
131
|
-
const labels = useNotificationsLabels(labelsProp);
|
|
132
|
-
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
133
|
-
// The prop, else the provider's `formatDate` with the language's clock, else the kit's
|
|
134
|
-
// date and time in the provider's locale and `timeZone` (refactor audit 2026-10-30, DUP-2).
|
|
135
|
-
const day = useDayFormatter(formatDateProp);
|
|
136
|
-
const [asking, setAsking] = useState(false);
|
|
137
|
-
const [busy, setBusy] = useState<"read" | "clear" | null>(null);
|
|
138
|
-
const [failure, setFailure] = useState<ReactNode>(null);
|
|
139
|
-
const mounted = useMounted();
|
|
140
|
-
const headingId = useId();
|
|
141
|
-
// Back to "Clear all" when the confirm leaves, so focus does not fall to <body>.
|
|
142
|
-
const clearRef = useRef<HTMLButtonElement>(null);
|
|
143
|
-
|
|
144
|
-
const timeOf = (iso: string) => day(iso, { time: true });
|
|
145
|
-
const iconOf = (type: string): LucideIcon => icon?.(type) ?? Bell;
|
|
146
|
-
|
|
147
|
-
const run = (which: "read" | "clear", call: () => unknown, after?: () => void) => {
|
|
148
|
-
setBusy(which);
|
|
149
|
-
setFailure(null);
|
|
150
|
-
settle(call).then(
|
|
151
|
-
() => {
|
|
152
|
-
if (!mounted.current) return;
|
|
153
|
-
setBusy(null);
|
|
154
|
-
after?.();
|
|
155
|
-
},
|
|
156
|
-
(error: unknown) => {
|
|
157
|
-
if (!mounted.current) return;
|
|
158
|
-
setBusy(null);
|
|
159
|
-
setFailure(describeFailure(describeError?.(error, which === "read" ? "readAll" : "clear"), labels.failed));
|
|
160
|
-
},
|
|
161
|
-
);
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
/** Mark one row read; a failure is said under the list, the row stays as it is. */
|
|
165
|
-
const markOne = (item: NotificationInboxItem<Id>) => {
|
|
166
|
-
if (item.read_at !== null) return;
|
|
167
|
-
settle(() => onMarkRead([item.id])).catch((error: unknown) => {
|
|
168
|
-
if (mounted.current) setFailure(describeFailure(describeError?.(error, "read"), labels.failed));
|
|
169
|
-
});
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
const count = items?.length ?? 0;
|
|
173
|
-
|
|
174
|
-
const header = asking ? (
|
|
175
|
-
<InlineConfirm
|
|
176
|
-
className="border-b border-subtle px-3 py-2"
|
|
177
|
-
data-inbox-confirm=""
|
|
178
|
-
prompt={labels.clearPrompt}
|
|
179
|
-
confirmLabel={labels.clearAll}
|
|
180
|
-
cancelLabel={common.cancel}
|
|
181
|
-
onConfirm={() => run("clear", onClear, () => setAsking(false))}
|
|
182
|
-
onLeave={() => setAsking(false)}
|
|
183
|
-
busy={busy === "clear"}
|
|
184
|
-
commit={COMMIT_EXCEPT_BILLING}
|
|
185
|
-
returnFocusRef={clearRef}
|
|
186
|
-
/>
|
|
187
|
-
) : (
|
|
188
|
-
<div className="flex items-center justify-between gap-2 border-b border-subtle px-3 py-2">
|
|
189
|
-
<SettingsCardTitle id={headingId}>{title ?? labels.inboxTitle}</SettingsCardTitle>
|
|
190
|
-
<div className="flex items-center gap-0.5">
|
|
191
|
-
<IconButton
|
|
192
|
-
type="button"
|
|
193
|
-
size="xs"
|
|
194
|
-
tone="muted"
|
|
195
|
-
commit={COMMIT_EXCEPT_BILLING}
|
|
196
|
-
onClick={() => run("read", () => onMarkRead(null))}
|
|
197
|
-
disabled={unreadCount === 0 || busy !== null}
|
|
198
|
-
label={labels.markAllRead}
|
|
199
|
-
>
|
|
200
|
-
<CheckCheck />
|
|
201
|
-
</IconButton>
|
|
202
|
-
<IconButton
|
|
203
|
-
ref={clearRef}
|
|
204
|
-
type="button"
|
|
205
|
-
size="xs"
|
|
206
|
-
tone="danger"
|
|
207
|
-
commit={COMMIT_EXCEPT_BILLING}
|
|
208
|
-
onClick={() => setAsking(true)}
|
|
209
|
-
disabled={count === 0 || busy !== null}
|
|
210
|
-
label={labels.clearAll}
|
|
211
|
-
>
|
|
212
|
-
<Trash2 />
|
|
213
|
-
</IconButton>
|
|
214
|
-
</div>
|
|
215
|
-
</div>
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
let body: ReactNode;
|
|
219
|
-
if (loading || items === undefined) {
|
|
220
|
-
body = <Skeleton lines={3} label={labels.inboxLoading} className="p-3" />;
|
|
221
|
-
} else if (items.length === 0) {
|
|
222
|
-
body = <EmptyState variant="inline" title={labels.inboxEmpty} className="px-3 py-2" />;
|
|
223
|
-
} else {
|
|
224
|
-
body = (
|
|
225
|
-
// Named by the heading — except while "Clear all" asks, when the heading is away.
|
|
226
|
-
<List
|
|
227
|
-
className="p-1"
|
|
228
|
-
aria-labelledby={asking ? undefined : headingId}
|
|
229
|
-
aria-label={asking ? labels.inboxTitle : undefined}
|
|
230
|
-
>
|
|
231
|
-
{items.map((item) => {
|
|
232
|
-
const row = {
|
|
233
|
-
title: item.title,
|
|
234
|
-
subtitle: item.body,
|
|
235
|
-
subtitleLines: 2 as const,
|
|
236
|
-
overline: item.company ?? undefined,
|
|
237
|
-
meta: timeOf(item.created_at),
|
|
238
|
-
icon: iconOf(item.notification_type),
|
|
239
|
-
unread: item.read_at === null,
|
|
240
|
-
align: "start" as const,
|
|
241
|
-
};
|
|
242
|
-
if (onOpen) {
|
|
243
|
-
return (
|
|
244
|
-
<ListItem
|
|
245
|
-
key={item.id}
|
|
246
|
-
{...row}
|
|
247
|
-
data-inbox-item={String(item.id)}
|
|
248
|
-
onClick={() => {
|
|
249
|
-
markOne(item);
|
|
250
|
-
onOpen(item);
|
|
251
|
-
}}
|
|
252
|
-
/>
|
|
253
|
-
);
|
|
254
|
-
}
|
|
255
|
-
// A same-origin path or nothing (refactor audit 2026-10-30, FLW-8): `//host` starts
|
|
256
|
-
// with "/" and went through the router link off the origin, and any scheme opened
|
|
257
|
-
// as an external link. The urls are server-written; this is defence in depth.
|
|
258
|
-
const path = safeNextPath(item.url);
|
|
259
|
-
if (!path) {
|
|
260
|
-
return <ListItem key={item.id} {...row} data-inbox-item={String(item.id)} onClick={() => markOne(item)} />;
|
|
261
|
-
}
|
|
262
|
-
// A real link, so a middle click opens a background tab; a middle click fires no
|
|
263
|
-
// `click`, hence `onAuxClick` (keksdose #451).
|
|
264
|
-
return (
|
|
265
|
-
<ListItem
|
|
266
|
-
key={item.id}
|
|
267
|
-
{...row}
|
|
268
|
-
data-inbox-item={String(item.id)}
|
|
269
|
-
href={path}
|
|
270
|
-
onClick={() => markOne(item)}
|
|
271
|
-
onAuxClick={(event) => {
|
|
272
|
-
if (event.button === 1) markOne(item);
|
|
273
|
-
}}
|
|
274
|
-
/>
|
|
275
|
-
);
|
|
276
|
-
})}
|
|
277
|
-
{hasMore && onLoadMore && (
|
|
278
|
-
<li className="px-2 py-1">
|
|
279
|
-
<Button
|
|
280
|
-
type="button"
|
|
281
|
-
size="sm"
|
|
282
|
-
variant="ghost"
|
|
283
|
-
pending={loadingMore}
|
|
284
|
-
onClick={onLoadMore}
|
|
285
|
-
className="w-full"
|
|
286
|
-
>
|
|
287
|
-
{labels.showMore}
|
|
288
|
-
</Button>
|
|
289
|
-
</li>
|
|
290
|
-
)}
|
|
291
|
-
</List>
|
|
292
|
-
);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return (
|
|
296
|
-
<Card {...rest} className={cn("overflow-hidden p-0", className)}>
|
|
297
|
-
{header}
|
|
298
|
-
<div className="max-h-[min(24rem,70vh)] overflow-y-auto overscroll-contain">{body}</div>
|
|
299
|
-
{failure !== null && (
|
|
300
|
-
<div className="px-3 pb-3">
|
|
301
|
-
<FailureLine>{failure}</FailureLine>
|
|
302
|
-
</div>
|
|
303
|
-
)}
|
|
304
|
-
</Card>
|
|
305
|
-
);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/** How often an app polls the unread count for the badge (keksdose's 60 s, `limit:1`). */
|
|
309
|
-
export const INBOX_BADGE_INTERVAL = 60_000;
|