@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,464 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
2
|
-
import { cn } from "../lib/cn";
|
|
3
|
-
import type { DateInput } from "../lib/format";
|
|
4
|
-
import { useKitLabels } from "../i18n/kit-labels";
|
|
5
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
6
|
-
import { DateMark } from "../components/account-chips";
|
|
7
|
-
import { Chip } from "../components/chip";
|
|
8
|
-
import { Pagination } from "../components/data-table-pagination";
|
|
9
|
-
import { Caption } from "../components/text";
|
|
10
|
-
import { Button } from "../components/button";
|
|
11
|
-
import { Spinner } from "../components/spinner";
|
|
12
|
-
import { usePersonLabel } from "./admin-parts";
|
|
13
|
-
import type { AdminPerson } from "./admin-parts";
|
|
14
|
-
import { DEFAULT_ADMIN_ACTION_LOG_LABELS } from "./admin-action-log-labels";
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* The admin actions, as the audit table records them (docs/user-admin-harmonization.md
|
|
18
|
-
* §2.3, §4.3): `GET /admin/actions?limit=&offset=&target=`, newest first, on the admin
|
|
19
|
-
* page and filtered to one account from its row.
|
|
20
|
-
*
|
|
21
|
-
* Every app writes the same small `admin_actions` row in the transaction of the action
|
|
22
|
-
* (keksdose and Kurvenschmiede had log lines; kastlan has an HTTP log with no named
|
|
23
|
-
* action), so the vocabulary is shared — {@link AdminActionKind} — and an app's own
|
|
24
|
-
* actions join it through `labels.actions`.
|
|
25
|
-
*
|
|
26
|
-
* What a row says, and what it never does: who, what, to whom, when, and a summary of the
|
|
27
|
-
* `detail` the APP writes (ids, roles, counts — never content, §4.3). Three kinds of
|
|
28
|
-
* actor: an admin; **the user themselves** (`deletion_request`: the actor is the target);
|
|
29
|
-
* and **nobody** (the scheduled erasure, the hand-over at erasure, §2.7), said as
|
|
30
|
-
* "automatically". After an erasure the target's name and address are scrubbed and the
|
|
31
|
-
* row stays: it reads "an erased account".
|
|
32
|
-
*
|
|
33
|
-
* GROUPS (round 0.34, §11): Kurvenschmiede's teams, kastlan's companies and keksdose's
|
|
34
|
-
* budgets are groups of accounts, and the vocabulary has words for what is done to one
|
|
35
|
-
* (`group_create`, `group_rename`, `group_delete`) and to who is in it (`membership_add`,
|
|
36
|
-
* `membership_role`, `membership_remove`). A row about the group itself has the group as
|
|
37
|
-
* its `target`; a row about a person in it has the person as its target and the group as
|
|
38
|
-
* its `group`, drawn after the person by its name alone, muted — no preposition, so no
|
|
39
|
-
* language has to inflect the name. The kinds and codes say "group"; the labels say the
|
|
40
|
-
* app's own noun, picked with `groupNoun` — whole phrases per noun, since a noun dropped
|
|
41
|
-
* into one phrase breaks the participle's agreement in fr and it and the suffix in hu
|
|
42
|
-
* (decision 4). A group with no name left reads as the noun's "a deleted team"; only a
|
|
43
|
-
* missing PERSON is "an erased account".
|
|
44
|
-
*
|
|
45
|
-
* It never fetches: the page of rows and the paging are the app's.
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
/** The shared vocabulary of `admin_actions.action` (§4.3). */
|
|
49
|
-
export type AdminActionKind =
|
|
50
|
-
| "deactivate"
|
|
51
|
-
| "reactivate"
|
|
52
|
-
| "role"
|
|
53
|
-
| "membership_remove"
|
|
54
|
-
| "password_change_require"
|
|
55
|
-
| "password_change_withdraw"
|
|
56
|
-
| "mail_verification"
|
|
57
|
-
| "mail_reset"
|
|
58
|
-
| "reviewer"
|
|
59
|
-
| "invite"
|
|
60
|
-
| "invite_resend"
|
|
61
|
-
| "invite_revoke"
|
|
62
|
-
| "transfer"
|
|
63
|
-
| "deletion_request"
|
|
64
|
-
| "deletion_cancel"
|
|
65
|
-
| "erase"
|
|
66
|
-
// 0.32.1 (keksdose's 0.32 report): server-kit 0.6's `AdminAction.PLAN`, an operator's
|
|
67
|
-
// plan change or grant (docs/billing-harmonization.md §6).
|
|
68
|
-
| "plan"
|
|
69
|
-
// 0.34 (§11.3): what is done to a group of accounts, and to who is in it — beside
|
|
70
|
-
// `membership_remove`. server-kit 0.8's `AdminAction` has the same five.
|
|
71
|
-
| "group_create"
|
|
72
|
-
| "group_rename"
|
|
73
|
-
| "group_delete"
|
|
74
|
-
| "membership_add"
|
|
75
|
-
| "membership_role"
|
|
76
|
-
// 0.45 (admin §9.1.3): a group switched off or on again — kastlan's company PATCH
|
|
77
|
-
// (`is_active`). server-kit 0.15's `AdminAction.GROUP_DEACTIVATE` / `GROUP_REACTIVATE`.
|
|
78
|
-
| "group_deactivate"
|
|
79
|
-
| "group_reactivate";
|
|
80
|
-
|
|
81
|
-
/** Every {@link AdminActionKind}, in the contract's order. */
|
|
82
|
-
export const ADMIN_ACTION_KINDS: readonly AdminActionKind[] = [
|
|
83
|
-
"deactivate",
|
|
84
|
-
"reactivate",
|
|
85
|
-
"role",
|
|
86
|
-
"membership_remove",
|
|
87
|
-
"password_change_require",
|
|
88
|
-
"password_change_withdraw",
|
|
89
|
-
"mail_verification",
|
|
90
|
-
"mail_reset",
|
|
91
|
-
"reviewer",
|
|
92
|
-
"invite",
|
|
93
|
-
"invite_resend",
|
|
94
|
-
"invite_revoke",
|
|
95
|
-
"transfer",
|
|
96
|
-
"deletion_request",
|
|
97
|
-
"deletion_cancel",
|
|
98
|
-
"erase",
|
|
99
|
-
"plan",
|
|
100
|
-
"group_create",
|
|
101
|
-
"group_rename",
|
|
102
|
-
"group_delete",
|
|
103
|
-
"membership_add",
|
|
104
|
-
"membership_role",
|
|
105
|
-
"group_deactivate",
|
|
106
|
-
"group_reactivate",
|
|
107
|
-
];
|
|
108
|
-
|
|
109
|
-
/** The app's word for its groups (§11.5): Kurvenschmiede's teams, kastlan's companies,
|
|
110
|
-
* keksdose's budgets; `group` is the neutral word. Picks the set of phrases the group
|
|
111
|
-
* actions are said in. */
|
|
112
|
-
export type AdminGroupNoun = "group" | "team" | "company" | "budget";
|
|
113
|
-
|
|
114
|
-
/** The kinds said in the noun's words: the five of 0.34, `membership_remove`, and 0.45's
|
|
115
|
-
* `group_deactivate` / `group_reactivate`. */
|
|
116
|
-
type AdminGroupActionKind =
|
|
117
|
-
| "group_create"
|
|
118
|
-
| "group_rename"
|
|
119
|
-
| "group_delete"
|
|
120
|
-
| "group_deactivate"
|
|
121
|
-
| "group_reactivate"
|
|
122
|
-
| "membership_add"
|
|
123
|
-
| "membership_role"
|
|
124
|
-
| "membership_remove";
|
|
125
|
-
|
|
126
|
-
const GROUP_ACTION_KINDS: ReadonlySet<string> = new Set<AdminGroupActionKind>([
|
|
127
|
-
"group_create",
|
|
128
|
-
"group_rename",
|
|
129
|
-
"group_delete",
|
|
130
|
-
"group_deactivate",
|
|
131
|
-
"group_reactivate",
|
|
132
|
-
"membership_add",
|
|
133
|
-
"membership_role",
|
|
134
|
-
"membership_remove",
|
|
135
|
-
]);
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* A group as a log target (§11.4): a row about the group itself (`group_*`, kastlan's
|
|
139
|
-
* `plan`), or the `group` a person was added to, moved in or taken out of. The app joins
|
|
140
|
-
* its `name` when the log is read — from the live group, else from its `group_delete`
|
|
141
|
-
* row's stamp (`target_group_name`, decision 6) — as it joins a person's. With no name
|
|
142
|
-
* left it reads as the noun's "a deleted team".
|
|
143
|
-
*/
|
|
144
|
-
export interface AdminGroupTarget {
|
|
145
|
-
kind: "group";
|
|
146
|
-
id?: string | number | null;
|
|
147
|
-
name?: string | null;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** A target that is neither a person nor a group (§11.4): an app's own action on a demo
|
|
151
|
-
* dataset or a setting, said by its `label`. */
|
|
152
|
-
export interface AdminOtherTarget {
|
|
153
|
-
kind: "other";
|
|
154
|
-
/** What it was done to, in the app's words, as it is drawn. */
|
|
155
|
-
label: string;
|
|
156
|
-
/** The app's id for it, when it has one. Beyond §11.4's shape so that code reading
|
|
157
|
-
* `entry.target.id` on any target — keksdose's filter, the showcase's — still
|
|
158
|
-
* type-checks against the wider union. */
|
|
159
|
-
id?: string | number | null;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/** Whether a target is a group. A person has no `kind`; an object whose `kind` is
|
|
163
|
-
* anything else is read as a person too. */
|
|
164
|
-
export function isGroupTarget(target: unknown): target is AdminGroupTarget {
|
|
165
|
-
return typeof target === "object" && target !== null && (target as { kind?: unknown }).kind === "group";
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function isOtherTarget(target: unknown): target is AdminOtherTarget {
|
|
169
|
-
return typeof target === "object" && target !== null && (target as { kind?: unknown }).kind === "other";
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** One logged action — the app's `admin_actions` row with the people joined in. */
|
|
173
|
-
export interface AdminActionLogEntry {
|
|
174
|
-
id: string | number;
|
|
175
|
-
/** When, as the row's `at`. */
|
|
176
|
-
at: DateInput;
|
|
177
|
-
/**
|
|
178
|
-
* Who did it: a person; `"self"` — the user themselves (a deletion request); or `null`
|
|
179
|
-
* — nobody, the scheduled job. A person whose `id` (or address) is the target's is
|
|
180
|
-
* read as `"self"` too.
|
|
181
|
-
*/
|
|
182
|
-
actor: AdminPerson | "self" | null;
|
|
183
|
-
/** A {@link AdminActionKind}, or one of the app's own (named in `labels.actions`). */
|
|
184
|
-
action: AdminActionKind | (string & {});
|
|
185
|
-
/**
|
|
186
|
-
* What it was done to (§11.4): a person (no `kind`) — `null`, or a person with nothing
|
|
187
|
-
* left in it, is "an erased account", and an invitation's person is its address
|
|
188
|
-
* (`target_email`); a group (`kind: "group"`), for a row about the group itself; or
|
|
189
|
-
* something else (`kind: "other"`), said by its label. Left out: nothing is drawn
|
|
190
|
-
* (until 0.34 it read as erased).
|
|
191
|
-
*/
|
|
192
|
-
target?: AdminPerson | AdminGroupTarget | AdminOtherTarget | null;
|
|
193
|
-
/** The group a `membership_*` or invitation row happened in, drawn after the person
|
|
194
|
-
* by its name (§11.4). */
|
|
195
|
-
group?: AdminGroupTarget | null;
|
|
196
|
-
/** The `detail` in the app's words — "Member → Admin", "12 items to Ben Example". */
|
|
197
|
-
detail?: ReactNode;
|
|
198
|
-
/**
|
|
199
|
-
* 0.45 (admin §9.4, Marcel 2026-10-19): a `group_rename` row's `detail.{from, to}` —
|
|
200
|
-
* kastlan's company rename logs both names. With both, the row reads "Company renamed
|
|
201
|
-
* from A to B" (`renamedFromTo`) in place of the target. A rename that logs `{}` (KS's
|
|
202
|
-
* team rename: never a name) leaves it out and reads "Team renamed" and the group.
|
|
203
|
-
*/
|
|
204
|
-
renamed?: { from?: string | null; to?: string | null } | null;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/** The `adminActionLog` namespace. */
|
|
208
|
-
export interface AdminActionLogLabels {
|
|
209
|
-
/** The list's accessible name. */
|
|
210
|
-
title: string;
|
|
211
|
-
empty: string;
|
|
212
|
-
loading: string;
|
|
213
|
-
/** "by Ada Example". */
|
|
214
|
-
by: (actor: string) => string;
|
|
215
|
-
/** The user acted on their own account. */
|
|
216
|
-
bySelf: string;
|
|
217
|
-
/** No actor: a scheduled job. */
|
|
218
|
-
automatic: string;
|
|
219
|
-
/** A target scrubbed by an erasure. */
|
|
220
|
-
erased: string;
|
|
221
|
-
/** The filter chip: only one account's actions are shown. */
|
|
222
|
-
filteredTo: (target: string) => string;
|
|
223
|
-
/** The chip's ×. */
|
|
224
|
-
showAll: string;
|
|
225
|
-
/** A target name as a filter button — "Show only the actions on Ada Example". */
|
|
226
|
-
filterBy: (target: string) => string;
|
|
227
|
-
/** 0.45: after "Company renamed" when the row carries both names — "from A to B". */
|
|
228
|
-
renamedFromTo: (from: string, to: string) => string;
|
|
229
|
-
/** What each action is called, past tense, keyed by the vocabulary. An app adds its
|
|
230
|
-
* own here (`labels={{ actions: { plan: "Plan changed" } }}`). A word given here
|
|
231
|
-
* outranks the noun's in `groupActions` — so no catalogue holds the group kinds
|
|
232
|
-
* here, `membership_remove` included (0.34). */
|
|
233
|
-
actions: { [K in AdminActionKind]?: string } & { [action: string]: string | undefined };
|
|
234
|
-
/** The group actions in each noun's words (§11.5), picked with `groupNoun`. */
|
|
235
|
-
groupActions: Record<AdminGroupNoun, AdminGroupActionLabels>;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/** One noun's phrases (§11.5): whole phrases, never a noun dropped into one. */
|
|
239
|
-
interface AdminGroupActionLabels {
|
|
240
|
-
/** "Team created". */
|
|
241
|
-
group_create: string;
|
|
242
|
-
/** "Team renamed". */
|
|
243
|
-
group_rename: string;
|
|
244
|
-
/** "Team deleted". */
|
|
245
|
-
group_delete: string;
|
|
246
|
-
/** "Company deactivated" (0.45, admin §9.1.3): the group switched off — its people
|
|
247
|
-
* locked out — not a person's `deactivate`. */
|
|
248
|
-
group_deactivate: string;
|
|
249
|
-
/** "Company reactivated" (0.45). */
|
|
250
|
-
group_reactivate: string;
|
|
251
|
-
/** "Added to the team" — said of the person, so it agrees with the account where a
|
|
252
|
-
* language agrees (es "Añadida", fr "Ajouté"). */
|
|
253
|
-
membership_add: string;
|
|
254
|
-
/** "Role in the team changed" — the role in the group, not the account's (`role`). */
|
|
255
|
-
membership_role: string;
|
|
256
|
-
/** "Removed from the team". The `company` set's is the string `actions` held until
|
|
257
|
-
* 0.34, in every language. */
|
|
258
|
-
membership_remove: string;
|
|
259
|
-
/** A group target with no name left: "a deleted team". */
|
|
260
|
-
deleted: string;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Defined in ./admin-action-log-labels, which holds no component code (0.34, KS U8).
|
|
264
|
-
export { DEFAULT_ADMIN_ACTION_LOG_LABELS };
|
|
265
|
-
|
|
266
|
-
/** The paging of `GET /admin/actions` — DataTable's `ServerPagination`, which the
|
|
267
|
-
* footer is. */
|
|
268
|
-
export interface AdminActionLogPaging {
|
|
269
|
-
/** 0-based. */
|
|
270
|
-
page: number;
|
|
271
|
-
pageSize: number;
|
|
272
|
-
total: number;
|
|
273
|
-
onPageChange: (page: number) => void;
|
|
274
|
-
onPageSizeChange?: (pageSize: number) => void;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
export interface AdminActionLogProps {
|
|
278
|
-
/** One page, newest first, as the server sends it. */
|
|
279
|
-
entries: readonly AdminActionLogEntry[];
|
|
280
|
-
/** Left out: no footer (a short list on a row). */
|
|
281
|
-
paging?: AdminActionLogPaging;
|
|
282
|
-
/** The page is being fetched. */
|
|
283
|
-
loading?: boolean;
|
|
284
|
-
/** The filter in force: only this account's actions are shown (`?target=`). With
|
|
285
|
-
* `onTargetFilter`, a chip says so and its × clears it. */
|
|
286
|
-
target?: AdminPerson | null;
|
|
287
|
-
/** Filter by an account — or clear it with `null`. Given, every person target's name
|
|
288
|
-
* is a button that narrows the list to it; a group or other target never is (0.34:
|
|
289
|
-
* `?target=` stays a person's). Left out, the list is not filterable here. */
|
|
290
|
-
onTargetFilter?: (target: AdminPerson | null) => void;
|
|
291
|
-
/** The app's word for its groups (§11.5): picks the phrases the group actions and "a
|
|
292
|
-
* deleted …" are said in. Default `group`; `labels.actions[kind]` still wins. */
|
|
293
|
-
groupNoun?: AdminGroupNoun;
|
|
294
|
-
className?: string;
|
|
295
|
-
/** Any part, at any depth: `{ groupActions: { team: { group_create: "…" } } }`. */
|
|
296
|
-
labels?: LabelOverride<AdminActionLogLabels>;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/** Whether a person has nothing left that names them — an erased target. */
|
|
300
|
-
function scrubbed(person: AdminPerson | null | undefined): boolean {
|
|
301
|
-
return !person || ![person.first, person.last, person.name, person.email].some((part) => (part ?? "").trim());
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/** Whether two people are the same account. A group or other target is never a person
|
|
305
|
-
* (§11.4), so it never reads "by the user themselves". */
|
|
306
|
-
function samePerson(a: AdminPerson, b: AdminActionLogEntry["target"]): boolean {
|
|
307
|
-
if (!b || isGroupTarget(b) || isOtherTarget(b)) return false;
|
|
308
|
-
if (a.id !== undefined && a.id !== null && b.id !== undefined && b.id !== null) return a.id === b.id;
|
|
309
|
-
const ea = (a.email ?? "").trim().toLowerCase();
|
|
310
|
-
return ea !== "" && ea === (b.email ?? "").trim().toLowerCase();
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
export function AdminActionLog({
|
|
314
|
-
entries,
|
|
315
|
-
paging,
|
|
316
|
-
loading = false,
|
|
317
|
-
target,
|
|
318
|
-
onTargetFilter,
|
|
319
|
-
groupNoun = "group",
|
|
320
|
-
className,
|
|
321
|
-
labels: labelsProp,
|
|
322
|
-
}: AdminActionLogProps) {
|
|
323
|
-
// Merged key by key at every depth, so a deep override is what `useKitLabels` takes.
|
|
324
|
-
const labels = useKitLabels("adminActionLog", DEFAULT_ADMIN_ACTION_LOG_LABELS, labelsProp);
|
|
325
|
-
const nameOf = usePersonLabel();
|
|
326
|
-
const filtered = target !== undefined && target !== null && !scrubbed(target);
|
|
327
|
-
// A noun the type doesn't know (an app in plain JS) says the neutral word.
|
|
328
|
-
const groupWords = labels.groupActions[groupNoun] ?? labels.groupActions.group;
|
|
329
|
-
|
|
330
|
-
/** An app's own word first, then the noun's phrase for a group kind, else the key. */
|
|
331
|
-
const actionText = (action: string): string =>
|
|
332
|
-
labels.actions[action] ??
|
|
333
|
-
(GROUP_ACTION_KINDS.has(action) ? groupWords[action as AdminGroupActionKind] : undefined) ??
|
|
334
|
-
action;
|
|
335
|
-
|
|
336
|
-
/** A group by its name, or — muted, as an erased person is — the noun's "a deleted
|
|
337
|
-
* team" when none is left. */
|
|
338
|
-
const groupText = (group: AdminGroupTarget, className?: string): ReactNode => {
|
|
339
|
-
const name = (group.name ?? "").trim();
|
|
340
|
-
return name ? (
|
|
341
|
-
<span data-private className={className}>
|
|
342
|
-
{name}
|
|
343
|
-
</span>
|
|
344
|
-
) : (
|
|
345
|
-
<span className="italic text-muted">{groupWords.deleted}</span>
|
|
346
|
-
);
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
const actorText = (entry: AdminActionLogEntry): string => {
|
|
350
|
-
const { actor } = entry;
|
|
351
|
-
if (actor === null) return labels.automatic;
|
|
352
|
-
if (actor === "self" || samePerson(actor, entry.target)) return labels.bySelf;
|
|
353
|
-
return labels.by(nameOf(actor) || labels.erased);
|
|
354
|
-
};
|
|
355
|
-
|
|
356
|
-
const targetNode = (entry: AdminActionLogEntry): ReactNode => {
|
|
357
|
-
const subject = entry.target;
|
|
358
|
-
// Left out: nothing (§11.4). `null` is a person the erasure took.
|
|
359
|
-
if (subject === undefined) return null;
|
|
360
|
-
if (isGroupTarget(subject)) return groupText(subject, "font-medium text-primary");
|
|
361
|
-
if (isOtherTarget(subject)) return <span className="font-medium text-primary">{subject.label}</span>;
|
|
362
|
-
if (scrubbed(subject)) return <span className="italic text-muted">{labels.erased}</span>;
|
|
363
|
-
const person = subject!;
|
|
364
|
-
const name = nameOf(person);
|
|
365
|
-
const address = (person.email ?? "").trim();
|
|
366
|
-
const text = (
|
|
367
|
-
<>
|
|
368
|
-
<span data-private className="font-medium text-primary">
|
|
369
|
-
{name}
|
|
370
|
-
</span>
|
|
371
|
-
{address && address !== name && (
|
|
372
|
-
<span data-private className="ms-1 text-xs text-muted">
|
|
373
|
-
{address}
|
|
374
|
-
</span>
|
|
375
|
-
)}
|
|
376
|
-
</>
|
|
377
|
-
);
|
|
378
|
-
if (!onTargetFilter || (filtered && samePerson(person, target))) return text;
|
|
379
|
-
return (
|
|
380
|
-
<Button
|
|
381
|
-
type="button"
|
|
382
|
-
variant="link"
|
|
383
|
-
size="sm"
|
|
384
|
-
className="h-auto min-h-0 p-0 text-start"
|
|
385
|
-
aria-label={labels.filterBy(name)}
|
|
386
|
-
onClick={() => onTargetFilter(person)}
|
|
387
|
-
>
|
|
388
|
-
{text}
|
|
389
|
-
</Button>
|
|
390
|
-
);
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
return (
|
|
394
|
-
<div className={cn("space-y-3", className)}>
|
|
395
|
-
{filtered && onTargetFilter && (
|
|
396
|
-
<Chip size="sm" tone="brand" onRemove={() => onTargetFilter(null)} removeLabel={labels.showAll}>
|
|
397
|
-
<span data-private>{labels.filteredTo(nameOf(target))}</span>
|
|
398
|
-
</Chip>
|
|
399
|
-
)}
|
|
400
|
-
{loading && entries.length === 0 ? (
|
|
401
|
-
<div className="flex justify-center py-4">
|
|
402
|
-
<Spinner label={labels.loading} />
|
|
403
|
-
</div>
|
|
404
|
-
) : entries.length === 0 ? (
|
|
405
|
-
<Caption>{labels.empty}</Caption>
|
|
406
|
-
) : (
|
|
407
|
-
<ol
|
|
408
|
-
aria-label={labels.title}
|
|
409
|
-
aria-busy={loading || undefined}
|
|
410
|
-
className={cn("divide-y divide-subtle", loading && "opacity-60")}
|
|
411
|
-
>
|
|
412
|
-
{entries.map((entry) => {
|
|
413
|
-
const from = (entry.renamed?.from ?? "").trim();
|
|
414
|
-
const to = (entry.renamed?.to ?? "").trim();
|
|
415
|
-
const renamed = entry.action === "group_rename" && from !== "" && to !== "";
|
|
416
|
-
return (
|
|
417
|
-
<li key={entry.id} data-action={entry.action} className="space-y-0.5 py-2 first:pt-0 last:pb-0">
|
|
418
|
-
<div className="flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5">
|
|
419
|
-
<div className="flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5 text-sm">
|
|
420
|
-
<span className="font-medium text-primary">{actionText(entry.action)}</span>
|
|
421
|
-
{renamed ? (
|
|
422
|
-
<span data-private data-renamed className="min-w-0 break-words text-primary">
|
|
423
|
-
{labels.renamedFromTo(from, to)}
|
|
424
|
-
</span>
|
|
425
|
-
) : (
|
|
426
|
-
entry.target !== undefined && <span className="min-w-0 break-words">{targetNode(entry)}</span>
|
|
427
|
-
)}
|
|
428
|
-
{entry.group && (
|
|
429
|
-
<span data-group className="min-w-0 break-words text-xs text-muted">
|
|
430
|
-
{groupText(entry.group)}
|
|
431
|
-
</span>
|
|
432
|
-
)}
|
|
433
|
-
</div>
|
|
434
|
-
<DateMark value={entry.at} display="relative" className="text-xs text-muted" />
|
|
435
|
-
</div>
|
|
436
|
-
<div className="text-xs text-muted">
|
|
437
|
-
<span data-private={entry.actor !== null && entry.actor !== "self" ? true : undefined}>
|
|
438
|
-
{actorText(entry)}
|
|
439
|
-
</span>
|
|
440
|
-
{entry.detail !== undefined && entry.detail !== null && entry.detail !== "" && (
|
|
441
|
-
<>
|
|
442
|
-
{" · "}
|
|
443
|
-
<span className="text-secondary">{entry.detail}</span>
|
|
444
|
-
</>
|
|
445
|
-
)}
|
|
446
|
-
</div>
|
|
447
|
-
</li>
|
|
448
|
-
);
|
|
449
|
-
})}
|
|
450
|
-
</ol>
|
|
451
|
-
)}
|
|
452
|
-
{paging && paging.total > 0 && (
|
|
453
|
-
<Pagination
|
|
454
|
-
page={paging.page}
|
|
455
|
-
pageSize={paging.pageSize}
|
|
456
|
-
total={paging.total}
|
|
457
|
-
totalPages={Math.max(1, Math.ceil(paging.total / Math.max(1, paging.pageSize)))}
|
|
458
|
-
onPage={paging.onPageChange}
|
|
459
|
-
onPageSize={paging.onPageSizeChange}
|
|
460
|
-
/>
|
|
461
|
-
)}
|
|
462
|
-
</div>
|
|
463
|
-
);
|
|
464
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
2
|
-
import type { SettingsGroupLabels } from "../settings/settings-labels";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The `adminArea` namespace (0.42, docs/admin-harmonization.md §3.1): the kit's words of
|
|
6
|
-
* the admin area every app shares — the account menu's "Administration" row, the 403
|
|
7
|
-
* page, the shared sections' names and help lines, the overview's tiles and the Tools
|
|
8
|
-
* list. A module of words with no component code, like every `*-labels.ts` (0.34, KS U8).
|
|
9
|
-
* An app's own sections and tiles bring their own words.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/** The sections every app's admin area shares, in the template's order (§2.3). */
|
|
13
|
-
export type AdminSharedSection = "overview" | "users" | "invitations" | "billing" | "activity";
|
|
14
|
-
|
|
15
|
-
/** The overview's shared tiles (§2.4, §6.1). */
|
|
16
|
-
export interface AdminTileLabels {
|
|
17
|
-
/** `feedback_waiting`: OPEN reports, crash reports included (§6.1). */
|
|
18
|
-
feedbackWaiting: string;
|
|
19
|
-
/** `deletion_requests`. */
|
|
20
|
-
deletionRequests: string;
|
|
21
|
-
/** `invitations_pending`. */
|
|
22
|
-
invitationsPending: string;
|
|
23
|
-
/** `users_total`. */
|
|
24
|
-
users: string;
|
|
25
|
-
/** `users_new_7d`, the line under the users tile. */
|
|
26
|
-
usersNew: (count: number) => string;
|
|
27
|
-
/** 0.46 (Kurvenschmiede 1, admin §9.5): server-kit's `awaiting_verdict` as an `extra`
|
|
28
|
-
* tile — answered reports that wait on a verdict (IN_EVALUATION, NEEDS_LIVE_TEST). */
|
|
29
|
-
awaitingVerdict: string;
|
|
30
|
-
/** Its line under the count. */
|
|
31
|
-
awaitingVerdictHint: string;
|
|
32
|
-
/** 0.46: server-kit's `released_for_work` — the reports released for the work queue. */
|
|
33
|
-
releasedForWork: string;
|
|
34
|
-
/** Its line under the count. */
|
|
35
|
-
releasedForWorkHint: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface AdminAreaLabels {
|
|
39
|
-
/** "Administration": the account menu's row, and the admin page's heading. */
|
|
40
|
-
title: string;
|
|
41
|
-
/** The row's waiting count, for a reader ("Administration, 3 waiting"); the eye sees
|
|
42
|
-
* the number in the badge. */
|
|
43
|
-
waiting: (count: number) => string;
|
|
44
|
-
/**
|
|
45
|
-
* 0.45 (admin §9.3.4): a button's whole name with its count — "Platform, 2 waiting" —
|
|
46
|
-
* for an `IconButton` whose `badge` is an `AdminWaitingBadge`: the badge is decorative
|
|
47
|
-
* there, so the name carries the count. `label` is the button's own name.
|
|
48
|
-
*/
|
|
49
|
-
waitingLabel: (label: string, count: number) => string;
|
|
50
|
-
/** The 403 page's heading (§2.2 decision 8). */
|
|
51
|
-
forbiddenTitle: string;
|
|
52
|
-
/**
|
|
53
|
-
* Under it. Says only that THIS area is closed to the account — never that the person
|
|
54
|
-
* administers nothing anywhere (§6.7: a kastlan superuser who isn't ADMIN in the acting
|
|
55
|
-
* company gets this page).
|
|
56
|
-
*/
|
|
57
|
-
forbiddenBody: (appName: string) => string;
|
|
58
|
-
/** The button back to the app's start, unless the app names its own (`homeLabel`). */
|
|
59
|
-
forbiddenHome: string;
|
|
60
|
-
/** A reviewer's second way out, to the translations review. */
|
|
61
|
-
forbiddenReviewer: string;
|
|
62
|
-
/** The shared sections' names and help lines (§2.3 decision 11). */
|
|
63
|
-
sections: Record<AdminSharedSection, SettingsGroupLabels>;
|
|
64
|
-
/** The overview's tiles. */
|
|
65
|
-
tiles: AdminTileLabels;
|
|
66
|
-
/** 0.43: `AdminOverview`'s `error` — the counts could not be loaded. */
|
|
67
|
-
overviewError: string;
|
|
68
|
-
/** 0.43: its button, which calls `onRetry`. */
|
|
69
|
-
retry: string;
|
|
70
|
-
/** The Tools list's heading and name (§2.5 decision 16). */
|
|
71
|
-
tools: string;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export const DEFAULT_ADMIN_AREA_LABELS: AdminAreaLabels = {
|
|
75
|
-
title: "Administration",
|
|
76
|
-
waiting: (count) => `${count} waiting`,
|
|
77
|
-
waitingLabel: (label, count) => `${label}, ${count} waiting`,
|
|
78
|
-
forbiddenTitle: "Only for administrators",
|
|
79
|
-
forbiddenBody: (appName) => `This is where administrators run ${appName}. Your account cannot open this page.`,
|
|
80
|
-
forbiddenHome: "Go to the start page",
|
|
81
|
-
forbiddenReviewer: "Review translations",
|
|
82
|
-
sections: {
|
|
83
|
-
overview: { title: "Overview", help: "What is waiting, at a glance." },
|
|
84
|
-
users: { title: "Users", help: "Who has an account, and what each may do." },
|
|
85
|
-
invitations: {
|
|
86
|
-
title: "Invitations",
|
|
87
|
-
help: "Invite people by e-mail in their language; resend or revoke what’s still open.",
|
|
88
|
-
},
|
|
89
|
-
billing: { title: "Billing", help: "The plan, the payment and the invoices." },
|
|
90
|
-
activity: { title: "Activity", help: "What the admins did, newest first." },
|
|
91
|
-
},
|
|
92
|
-
tiles: {
|
|
93
|
-
feedbackWaiting: "To triage",
|
|
94
|
-
deletionRequests: "Deletion requests",
|
|
95
|
-
invitationsPending: "Pending invitations",
|
|
96
|
-
users: "Users",
|
|
97
|
-
usersNew: (count) => `${count} new in 7 days`,
|
|
98
|
-
awaitingVerdict: "Awaiting a verdict",
|
|
99
|
-
awaitingVerdictHint: "Answered, and waiting for you or the reporter to confirm the fix",
|
|
100
|
-
releasedForWork: "Released for work",
|
|
101
|
-
releasedForWorkHint: "Ready, rework requested or in progress",
|
|
102
|
-
},
|
|
103
|
-
overviewError: "The overview couldn’t be loaded.",
|
|
104
|
-
retry: "Try again",
|
|
105
|
-
tools: "Tools",
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* The `adminArea` namespace, resolved — English, then the provider, then `labels`. What
|
|
110
|
-
* an app reads to hand {@link adminSections} its words from inside a component.
|
|
111
|
-
*/
|
|
112
|
-
export function useAdminAreaLabels(labels?: LabelOverride<AdminAreaLabels>): AdminAreaLabels {
|
|
113
|
-
return useKitLabels("adminArea", DEFAULT_ADMIN_AREA_LABELS, labels);
|
|
114
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import type { ComponentPropsWithRef } from "react";
|
|
2
|
-
import { ShieldAlert } from "lucide-react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { Button } from "../components/button";
|
|
5
|
-
import { EmptyState } from "../components/empty-state";
|
|
6
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
7
|
-
import { useAdminAreaLabels } from "./admin-area-labels";
|
|
8
|
-
import type { AdminAreaLabels } from "./admin-area-labels";
|
|
9
|
-
|
|
10
|
-
export interface AdminForbiddenProps extends Omit<ComponentPropsWithRef<"div">, "children" | "title"> {
|
|
11
|
-
/** The app's name, in the sentence: "This is where administrators run Kastlan." */
|
|
12
|
-
appName: string;
|
|
13
|
-
/** The button's target: the app's start page (keksdose `/budget`, kastlan `/dashboard`). */
|
|
14
|
-
homeHref: string;
|
|
15
|
-
/** The button's words, where the app names its start ("Back to the budget"). Default
|
|
16
|
-
* `adminArea.forbiddenHome`, "Go to the start page". */
|
|
17
|
-
homeLabel?: string;
|
|
18
|
-
/** Pass it to a translation reviewer: a second button, "Review translations", to the
|
|
19
|
-
* tool their role does have (§2.2 decision 8). */
|
|
20
|
-
reviewerHref?: string;
|
|
21
|
-
/** The heading's level. Default `h1`: the page stands alone inside the app shell. */
|
|
22
|
-
headingAs?: "h1" | "h2" | "h3";
|
|
23
|
-
/** Prop > `<UiKitProvider labels={{ adminArea }}>` > English. */
|
|
24
|
-
labels?: LabelOverride<AdminAreaLabels>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The admin area's 403 page (0.42.0, docs/admin-harmonization.md §2.2 decision 8, §6.7),
|
|
29
|
-
* keksdose's `AdminForbidden`: "Only for administrators" / "This is where administrators
|
|
30
|
-
* run {app}. Your account cannot open this page.", and a button back to the app's start.
|
|
31
|
-
*
|
|
32
|
-
* It RENDERS, it does not redirect: the app's client gate shows it in place of the admin
|
|
33
|
-
* page, on the same admin check the account menu uses, inside the lazy route — so a
|
|
34
|
-
* bookmark keeps its address, and signing in as an admin opens the page that was asked
|
|
35
|
-
* for. The server's gate stays the rule. kastlan shows it on its admin tools (`/admin`,
|
|
36
|
-
* `/import`, `/feedback`); its work pages keep their generic 403.
|
|
37
|
-
*
|
|
38
|
-
* The words say only that this area is closed to this account, never that the person
|
|
39
|
-
* administers nothing anywhere: a kastlan superuser who isn't ADMIN in the acting company
|
|
40
|
-
* gets this page too.
|
|
41
|
-
*/
|
|
42
|
-
export function AdminForbidden({
|
|
43
|
-
appName,
|
|
44
|
-
homeHref,
|
|
45
|
-
homeLabel,
|
|
46
|
-
reviewerHref,
|
|
47
|
-
headingAs = "h1",
|
|
48
|
-
labels: labelsProp,
|
|
49
|
-
className,
|
|
50
|
-
...rest
|
|
51
|
-
}: AdminForbiddenProps) {
|
|
52
|
-
const labels = useAdminAreaLabels(labelsProp);
|
|
53
|
-
return (
|
|
54
|
-
<div {...rest} data-slot="admin-forbidden" className={cn("mx-auto w-full max-w-xl p-4 md:p-6", className)}>
|
|
55
|
-
<EmptyState
|
|
56
|
-
icon={<ShieldAlert />}
|
|
57
|
-
headingAs={headingAs}
|
|
58
|
-
title={labels.forbiddenTitle}
|
|
59
|
-
hint={labels.forbiddenBody(appName)}
|
|
60
|
-
action={
|
|
61
|
-
<>
|
|
62
|
-
<Button href={homeHref} variant="secondary">
|
|
63
|
-
{homeLabel ?? labels.forbiddenHome}
|
|
64
|
-
</Button>
|
|
65
|
-
{reviewerHref !== undefined && (
|
|
66
|
-
<Button href={reviewerHref} variant="secondary">
|
|
67
|
-
{labels.forbiddenReviewer}
|
|
68
|
-
</Button>
|
|
69
|
-
)}
|
|
70
|
-
</>
|
|
71
|
-
}
|
|
72
|
-
/>
|
|
73
|
-
</div>
|
|
74
|
-
);
|
|
75
|
-
}
|