@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,567 +0,0 @@
|
|
|
1
|
-
import { useId, useLayoutEffect, useRef } from "react";
|
|
2
|
-
import type { CSSProperties, KeyboardEvent as ReactKeyboardEvent, ReactNode } from "react";
|
|
3
|
-
import { Link } from "react-router";
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { HoverMenu, type HoverMenuProps } from "../components/hover-menu";
|
|
6
|
-
import { MenuItem } from "../components/menu-item";
|
|
7
|
-
import type { MenuItemTone } from "../components/menu-item";
|
|
8
|
-
import { StatusDot } from "../components/status-dot";
|
|
9
|
-
import { Tooltip } from "../components/tooltip";
|
|
10
|
-
import type { UserAvatarBadge } from "../components/user-avatar";
|
|
11
|
-
import { TOPBAR_TRIGGER_CLASS } from "./topbar-controls";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* One row of a {@link TopBarActionMenu}. An `action` (default) runs `onSelect`, a
|
|
15
|
-
* `link` navigates via react-router, a `divider` draws a rule, and a `heading` names
|
|
16
|
-
* the rows after it. Action and link rows close the menu automatically when chosen.
|
|
17
|
-
* `kind` may be omitted for actions, keeping the common case terse.
|
|
18
|
-
*
|
|
19
|
-
* The rows are {@link MenuItem}s, so they take its options: `tone: "danger"` for the
|
|
20
|
-
* log-out row, `checked` (+ `checkable`) for a choice, `current` for the link to the
|
|
21
|
-
* page already open, `disabled`.
|
|
22
|
-
*/
|
|
23
|
-
export type TopBarMenuEntry =
|
|
24
|
-
| {
|
|
25
|
-
kind?: "action";
|
|
26
|
-
key: string;
|
|
27
|
-
icon?: ReactNode;
|
|
28
|
-
label: ReactNode;
|
|
29
|
-
trailing?: ReactNode;
|
|
30
|
-
onSelect: () => void;
|
|
31
|
-
tone?: MenuItemTone;
|
|
32
|
-
/** Makes the row a choice (`menuitemradio`, or `menuitemcheckbox` with
|
|
33
|
-
* `checkable: "checkbox"`) and says whether it is chosen. */
|
|
34
|
-
checked?: boolean;
|
|
35
|
-
checkable?: "radio" | "checkbox";
|
|
36
|
-
disabled?: boolean;
|
|
37
|
-
}
|
|
38
|
-
| {
|
|
39
|
-
kind: "link";
|
|
40
|
-
key: string;
|
|
41
|
-
icon?: ReactNode;
|
|
42
|
-
label: ReactNode;
|
|
43
|
-
trailing?: ReactNode;
|
|
44
|
-
to: string;
|
|
45
|
-
tone?: MenuItemTone;
|
|
46
|
-
/** The link to the page already open: `aria-current="page"` and a check mark. */
|
|
47
|
-
current?: boolean;
|
|
48
|
-
disabled?: boolean;
|
|
49
|
-
}
|
|
50
|
-
| { kind: "divider"; key: string }
|
|
51
|
-
| {
|
|
52
|
-
/**
|
|
53
|
-
* A group heading (0.23, keksdose's guided-tours menu): the rows after it, up to
|
|
54
|
-
* the next heading, the next `divider` or the end of `entries`, are ONE group
|
|
55
|
-
* named by `label`. keksdose files its tours by topic and separated the blocks
|
|
56
|
-
* with bare dividers — "the kit's menu has no heading row to name them with"
|
|
57
|
-
* (tour-menu.tsx) — so a sighted reader had to guess what each block was and a
|
|
58
|
-
* screen reader was told nothing at all.
|
|
59
|
-
*
|
|
60
|
-
* Not a row: it takes no focus, the arrow keys (and Home/End) pass over it, and it
|
|
61
|
-
* never closes the menu. It is announced the way the kit's other grouped lists
|
|
62
|
-
* announce theirs (`CommandPalette`): the group's rows sit in a `role="group"`
|
|
63
|
-
* whose `aria-labelledby` is this heading, so a reader says "On this page, group"
|
|
64
|
-
* when the focus enters the first row, and nothing between rows.
|
|
65
|
-
*
|
|
66
|
-
* A divider ENDS the group, so a closing row such as "All tours…" behind a rule
|
|
67
|
-
* belongs to no topic. A heading with no rows under it is not drawn — an empty
|
|
68
|
-
* group names nothing; build the list from data and it may well be empty.
|
|
69
|
-
*
|
|
70
|
-
* The menu-wide `heading` prop is the panel's title, drawn once above everything;
|
|
71
|
-
* with group headings it is usually redundant (two stacked caps lines read as one),
|
|
72
|
-
* and the trigger's `aria-label` already names the menu.
|
|
73
|
-
*/
|
|
74
|
-
kind: "heading";
|
|
75
|
-
key: string;
|
|
76
|
-
/** The group's name, shown above its rows and announced as the group's name. Keep
|
|
77
|
-
* it short: it is set in small caps and wraps on a narrow panel. */
|
|
78
|
-
label: ReactNode;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
type HeadingEntry = Extract<TopBarMenuEntry, { kind: "heading" }>;
|
|
82
|
-
type DividerEntry = Extract<TopBarMenuEntry, { kind: "divider" }>;
|
|
83
|
-
type RowEntry = Exclude<TopBarMenuEntry, HeadingEntry | DividerEntry>;
|
|
84
|
-
|
|
85
|
-
/** What the panel draws from `entries`: loose rows and rules, and headed groups. */
|
|
86
|
-
type Block =
|
|
87
|
-
{ kind: "loose"; entry: RowEntry | DividerEntry } | { kind: "group"; heading: HeadingEntry; rows: RowEntry[] };
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Cut `entries` into blocks: a heading opens a group that takes the rows after it until
|
|
91
|
-
* the next heading or divider; everything else stands alone, as it always has.
|
|
92
|
-
*/
|
|
93
|
-
function toBlocks(entries: readonly TopBarMenuEntry[]): Block[] {
|
|
94
|
-
const blocks: Block[] = [];
|
|
95
|
-
let group: Extract<Block, { kind: "group" }> | null = null;
|
|
96
|
-
for (const entry of entries) {
|
|
97
|
-
if (entry.kind === "heading") {
|
|
98
|
-
group = { kind: "group", heading: entry, rows: [] };
|
|
99
|
-
blocks.push(group);
|
|
100
|
-
} else if (entry.kind === "divider") {
|
|
101
|
-
group = null;
|
|
102
|
-
blocks.push({ kind: "loose", entry });
|
|
103
|
-
} else if (group) {
|
|
104
|
-
group.rows.push(entry);
|
|
105
|
-
} else {
|
|
106
|
-
blocks.push({ kind: "loose", entry });
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// A heading with nothing under it names nothing: not drawn (see the `heading` kind).
|
|
110
|
-
return blocks.filter((block) => block.kind === "loose" || block.rows.length > 0);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/** One column of `columns` (0.51.4): a group and the loose entries after it, up to the
|
|
114
|
-
* next group — so a group's own way out behind a rule (DevMenu's "Back to {role}") stays
|
|
115
|
-
* under it instead of running across the panel. */
|
|
116
|
-
type LooseBlock = Extract<Block, { kind: "loose" }>;
|
|
117
|
-
type Column = { group: Extract<Block, { kind: "group" }>; after: Array<RowEntry | DividerEntry>; index: number };
|
|
118
|
-
|
|
119
|
-
/** `blocks` as the columns layout draws them: what comes before the first group, then a
|
|
120
|
-
* column per group. A rule that would end a column is dropped: the column's edge is the
|
|
121
|
-
* separation there. */
|
|
122
|
-
function toColumns(blocks: readonly Block[]): { lead: LooseBlock[]; columns: Column[] } {
|
|
123
|
-
const lead: LooseBlock[] = [];
|
|
124
|
-
const columns: Column[] = [];
|
|
125
|
-
blocks.forEach((block, index) => {
|
|
126
|
-
if (block.kind === "group") columns.push({ group: block, after: [], index });
|
|
127
|
-
else if (columns.length === 0) lead.push(block);
|
|
128
|
-
else columns[columns.length - 1]!.after.push(block.entry);
|
|
129
|
-
});
|
|
130
|
-
for (const column of columns) {
|
|
131
|
-
while (column.after.at(-1)?.kind === "divider") column.after.pop();
|
|
132
|
-
}
|
|
133
|
-
return { lead, columns };
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* `columns`' panel: each column 14rem, the panel as wide as its columns (a CSS variable
|
|
138
|
-
* the list sets) but never wider than the glass, and from `md` up only. The grid places
|
|
139
|
-
* as many 14rem columns as that width holds, so a narrow desktop wraps the groups onto a
|
|
140
|
-
* second row instead of scrolling sideways. The header, the title and the footer span
|
|
141
|
-
* the row.
|
|
142
|
-
*/
|
|
143
|
-
const COLUMNS_PANEL =
|
|
144
|
-
"md:grid md:grid-cols-[repeat(auto-fill,minmax(14rem,1fr))] md:items-start md:gap-y-2 md:w-[min(calc(100vw-2rem),var(--menu-columns-width))]";
|
|
145
|
-
const SPAN_ALL = "md:col-span-full";
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* The non-interactive identity block at the top of an account menu — kastlan's name +
|
|
149
|
-
* role, keksdose's display name + email + role chip. It is text, not a `menuitem`: the
|
|
150
|
-
* arrow keys pass over it.
|
|
151
|
-
*/
|
|
152
|
-
export interface TopBarMenuHeader {
|
|
153
|
-
/** The first line — the user's name. */
|
|
154
|
-
title: ReactNode;
|
|
155
|
-
/** The muted second line — an email, a role. */
|
|
156
|
-
subtitle?: ReactNode;
|
|
157
|
-
/**
|
|
158
|
-
* Anything below — a role chip. A link or button here stays out of the arrow keys
|
|
159
|
-
* and in the Tab order, like the footer's.
|
|
160
|
-
*
|
|
161
|
-
* Pass a function to get `close`, as `footer` does — keksdose F7: its admin role
|
|
162
|
-
* chip links to the admin area, and a router link does not unmount the menu, so
|
|
163
|
-
* without `close` the panel stayed open over the page it had just navigated to.
|
|
164
|
-
*/
|
|
165
|
-
extra?: ReactNode | ((close: () => void) => ReactNode);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/** What a control is, as far as `HoverMenu` is concerned, when it lives in the header
|
|
169
|
-
* or the footer: not a menu row. */
|
|
170
|
-
const SECTION_CONTROLS = "a[href]:not([role]),button:not([role])";
|
|
171
|
-
const TABBABLE =
|
|
172
|
-
"a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]";
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* `scrollable`'s cap (0.51, DevMenu): the glass under the bar. Under `TopBar` the panel
|
|
176
|
-
* starts about 50px down — the `size-9` trigger centred in the `h-12` bar ends at 42px,
|
|
177
|
-
* and `HoverMenu` hangs the panel `pt-2` below it — so 4rem (64px) leaves some 14px clear
|
|
178
|
-
* under the last row. `dvh`, not `vh`: on a phone `100vh` is the viewport with the
|
|
179
|
-
* browser's toolbars put away, taller than the glass while they show.
|
|
180
|
-
* `overscroll-contain`, so a fling past the last row does not scroll the page behind.
|
|
181
|
-
*/
|
|
182
|
-
const SCROLLABLE_PANEL = "max-h-[calc(100dvh-4rem)] overflow-y-auto overscroll-contain";
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* A header or footer inside the menu panel.
|
|
186
|
-
*
|
|
187
|
-
* `HoverMenu` promotes EVERY role-less button and link in its panel to a `menuitem` out
|
|
188
|
-
* of the Tab order, and turns every list into `role="none"` — right for the rows, wrong
|
|
189
|
-
* for a footer of legal links, which would join the arrow-key cycle and drop out of Tab.
|
|
190
|
-
* So before it looks (a child's layout effect runs before its parent's), the controls
|
|
191
|
-
* in here get their own role spelled out, which `HoverMenu` leaves alone, and any list
|
|
192
|
-
* keeps its list semantics.
|
|
193
|
-
*/
|
|
194
|
-
function MenuSection({ className, children }: { className: string; children: ReactNode }) {
|
|
195
|
-
const ref = useRef<HTMLLIElement>(null);
|
|
196
|
-
useLayoutEffect(() => {
|
|
197
|
-
const el = ref.current;
|
|
198
|
-
if (!el) return;
|
|
199
|
-
for (const c of el.querySelectorAll<HTMLElement>(SECTION_CONTROLS)) {
|
|
200
|
-
c.setAttribute("role", c.tagName === "A" ? "link" : "button");
|
|
201
|
-
}
|
|
202
|
-
for (const l of el.querySelectorAll<HTMLElement>("ul:not([role]),ol:not([role])")) l.setAttribute("role", "list");
|
|
203
|
-
for (const l of el.querySelectorAll<HTMLElement>("li:not([role])")) l.setAttribute("role", "listitem");
|
|
204
|
-
});
|
|
205
|
-
return (
|
|
206
|
-
<li ref={ref} role="none" className={className}>
|
|
207
|
-
{children}
|
|
208
|
-
</li>
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* `HoverMenu` closes on any Tab inside the panel — right when Tab leaves it, wrong when
|
|
214
|
-
* Tab is on its way from a row to a footer link, or from one footer link to the next:
|
|
215
|
-
* the panel would unmount under the focus. So a Tab whose next stop is still inside the
|
|
216
|
-
* panel stops here and the browser moves focus; one that leaves reaches `HoverMenu`,
|
|
217
|
-
* which closes.
|
|
218
|
-
*/
|
|
219
|
-
function keepTabInsidePanel(e: ReactKeyboardEvent<HTMLUListElement>) {
|
|
220
|
-
if (e.key !== "Tab") return;
|
|
221
|
-
const from = e.target as HTMLElement;
|
|
222
|
-
const stops = Array.from(e.currentTarget.querySelectorAll<HTMLElement>(TABBABLE)).filter(
|
|
223
|
-
(el) => el.getAttribute("tabindex") !== "-1",
|
|
224
|
-
);
|
|
225
|
-
const way = e.shiftKey ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
|
|
226
|
-
if (stops.some((el) => el !== from && from.compareDocumentPosition(el) & way)) e.stopPropagation();
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* A top-bar icon button that opens a {@link HoverMenu} of actions and/or links,
|
|
231
|
-
* with an optional uppercase heading and divider rules. Generic glue over the
|
|
232
|
-
* shared top-bar chrome — e.g. the feedback launcher or the guided-tours menu —
|
|
233
|
-
* so those call sites describe their rows as data instead of rebuilding the
|
|
234
|
-
* trigger + list markup. For a checkmarked value-switcher use
|
|
235
|
-
* {@link OptionSwitcherMenu} instead.
|
|
236
|
-
*
|
|
237
|
-
* It is also the ACCOUNT menu kastlan and keksdose each hand-build on `HoverMenu`: a
|
|
238
|
-
* custom `trigger` (the avatar), a `header` (name + role / email), the rows, and a
|
|
239
|
-
* free-content `footer` (the legal links).
|
|
240
|
-
*
|
|
241
|
-
* A long menu is grouped by topic with `{ kind: "heading" }` entries (0.23) — see
|
|
242
|
-
* {@link TopBarMenuEntry}. There is no separate phone layout: the panel is the same
|
|
243
|
-
* hover panel at 390px, kept inside the viewport by `HoverMenu`, and a heading wraps
|
|
244
|
-
* rather than widening it. A menu that can grow taller than a phone's glass passes
|
|
245
|
-
* `scrollable` (0.51), since that clamp is sideways only.
|
|
246
|
-
*/
|
|
247
|
-
export function TopBarActionMenu({
|
|
248
|
-
icon,
|
|
249
|
-
iconBadge,
|
|
250
|
-
trigger,
|
|
251
|
-
triggerClassName,
|
|
252
|
-
href,
|
|
253
|
-
"aria-label": ariaLabel,
|
|
254
|
-
heading,
|
|
255
|
-
header,
|
|
256
|
-
entries,
|
|
257
|
-
leading,
|
|
258
|
-
children,
|
|
259
|
-
footer,
|
|
260
|
-
footerLabel,
|
|
261
|
-
align,
|
|
262
|
-
panelClassName,
|
|
263
|
-
scrollable = false,
|
|
264
|
-
columns = false,
|
|
265
|
-
triggerAttributes,
|
|
266
|
-
}: {
|
|
267
|
-
/** The trigger's face for the usual icon button. Ignored when `trigger` is given. */
|
|
268
|
-
icon?: ReactNode;
|
|
269
|
-
/**
|
|
270
|
-
* A status dot in the top-end corner of `icon` — keksdose's unread-support dot on the
|
|
271
|
-
* feedback trigger. Like `UserAvatar`'s `badge`, its `label` joins the trigger's name
|
|
272
|
-
* ("Send feedback 2 unread"), so the dot is not something only the eye is told about.
|
|
273
|
-
* Ignored with `trigger`: give the face its own badge there.
|
|
274
|
-
*/
|
|
275
|
-
iconBadge?: UserAvatarBadge | null;
|
|
276
|
-
/**
|
|
277
|
-
* A face of your own for the trigger — the account menu's `UserAvatar`. It is drawn
|
|
278
|
-
* INSIDE the kit's button, which keeps the wiring: `aria-haspopup`, `aria-expanded`,
|
|
279
|
-
* the toggle, the keyboard. `open` is there for a chevron that turns.
|
|
280
|
-
*
|
|
281
|
-
* The button is named by `aria-label` followed by any readable text in the face — a
|
|
282
|
-
* `UserAvatar` `badge` label reaches a screen reader that way ("Account menu 3
|
|
283
|
-
* unread"), where an `aria-label` on the button would have hidden it. A
|
|
284
|
-
* `UserAvatar`'s initials are `aria-hidden`, so the person's name is only in the
|
|
285
|
-
* name if `aria-label` carries it ("Marcel Eifert, account menu").
|
|
286
|
-
*/
|
|
287
|
-
trigger?: (state: { open: boolean }) => ReactNode;
|
|
288
|
-
/** Extra classes for the trigger button — `rounded-full` round an avatar. */
|
|
289
|
-
triggerClassName?: string;
|
|
290
|
-
/**
|
|
291
|
-
* Make the trigger a LINK to this route (keksdose dev #585, Marcel: "clicking on the
|
|
292
|
-
* guided tours icon shall lead to the tours page like the all tours element does").
|
|
293
|
-
* A click or Enter follows it and shuts the panel; hover still opens the panel after
|
|
294
|
-
* the usual delay, and ↓/↑ on the focused trigger still open it onto the first/last
|
|
295
|
-
* row, so the rows stay reachable by keyboard. A tap on a touch screen follows the
|
|
296
|
-
* link — so use it where the destination offers everything the menu does. Rendered as
|
|
297
|
-
* an `<a>` (the router's `Link`) with `aria-haspopup="menu"` and `aria-expanded`,
|
|
298
|
-
* named by `aria-label`: a link inside the kit's button would be interactive content
|
|
299
|
-
* inside interactive content.
|
|
300
|
-
*/
|
|
301
|
-
href?: string;
|
|
302
|
-
/** Names the trigger and the menu. Required: the trigger is an icon (refactor audit
|
|
303
|
-
* 2026-10, API-1 — the `ariaLabel` spelling went in 0.35). */
|
|
304
|
-
"aria-label": string;
|
|
305
|
-
heading?: string;
|
|
306
|
-
/** A non-interactive identity block above the rows. */
|
|
307
|
-
header?: TopBarMenuHeader;
|
|
308
|
-
entries: TopBarMenuEntry[];
|
|
309
|
-
/**
|
|
310
|
-
* Rows the entry data cannot describe (a `Disclosure` sub-list, an app's own
|
|
311
|
-
* section), after `entries`. Render `<li>`s holding `MenuItem`s or plain controls;
|
|
312
|
-
* `close` shuts the menu.
|
|
313
|
-
*/
|
|
314
|
-
children?: (close: () => void) => ReactNode;
|
|
315
|
-
/**
|
|
316
|
-
* Rows like {@link children}, but BEFORE `entries`, under the header — the account
|
|
317
|
-
* menu's `AccountMenuLanguage`, which goes first after the app's context rows (§6.5)
|
|
318
|
-
* in a menu whose other rows are all entries (kastlan, build review B1). Render `<li>`s;
|
|
319
|
-
* `close` shuts the menu.
|
|
320
|
-
*/
|
|
321
|
-
leading?: (close: () => void) => ReactNode;
|
|
322
|
-
/**
|
|
323
|
-
* Free content below the rows, behind a rule — the legal links. Its links and
|
|
324
|
-
* buttons are NOT menu rows: the arrow keys skip them and Tab reaches them. Pass a
|
|
325
|
-
* function to get `close` for the links' `onClick`.
|
|
326
|
-
*/
|
|
327
|
-
footer?: ReactNode | ((close: () => void) => ReactNode);
|
|
328
|
-
/** Wraps the footer in a `<nav>` with this name ("Legal"). Without it, a plain block. */
|
|
329
|
-
footerLabel?: string;
|
|
330
|
-
/** Which edge of the trigger the panel lines up with, `start` or `end` in the reading
|
|
331
|
-
* direction (see `HoverMenu`, whose type this is). Default `end`. */
|
|
332
|
-
align?: HoverMenuProps["align"];
|
|
333
|
-
panelClassName?: string;
|
|
334
|
-
/**
|
|
335
|
-
* Cap the panel at the glass under the top bar and scroll the rows inside it (0.51,
|
|
336
|
-
* `DevMenu`). `HoverMenu` keeps a panel inside the viewport sideways only, so a tall
|
|
337
|
-
* one ran off the bottom of the screen: DevMenu's ~25 rows on a 390×844 phone, with
|
|
338
|
-
* the last ones out of reach — the page cannot scroll them up, the panel hangs from
|
|
339
|
-
* the sticky bar.
|
|
340
|
-
*
|
|
341
|
-
* Off by default: a menu that fits keeps its natural height and has no scroll
|
|
342
|
-
* container (`TourMenu` keeps its own `max-h-[70vh]`). The keyboard needs nothing
|
|
343
|
-
* extra: `HoverMenu`'s roving focus is a plain `focus()`, which the browser follows by
|
|
344
|
-
* scrolling the panel to the row, so ↓, ↑, Home and End reach a row below the cap. The
|
|
345
|
-
* header and the footer are inside the list and scroll with the rows.
|
|
346
|
-
*/
|
|
347
|
-
scrollable?: boolean;
|
|
348
|
-
/**
|
|
349
|
-
* From `md` up, lay the heading groups side by side, one column per group (0.51.4,
|
|
350
|
-
* `DevMenu`; keksdose dev #640, Marcel: "Each group gets a column. That way it would be
|
|
351
|
-
* much better visible for desktop users"). Below `md`, the one column as before.
|
|
352
|
-
*
|
|
353
|
-
* A column is a group and the loose rows after it up to the next heading, so a row
|
|
354
|
-
* behind a rule at the end of a group (DevMenu's "Back to {role}") stays in that
|
|
355
|
-
* group's column. Loose rows before the first heading, the header, the menu-wide
|
|
356
|
-
* `heading` and the footer span the panel. The DOM order is unchanged, so ↓/↑ walk the
|
|
357
|
-
* rows down one column and on into the next, as a reader reads them. `leading` and
|
|
358
|
-
* `children` rows take a cell each; add `md:col-span-full` to one that should span.
|
|
359
|
-
*/
|
|
360
|
-
columns?: boolean;
|
|
361
|
-
/** `data-*` attributes for the trigger itself — a tour's anchor (`data-tour`), a test
|
|
362
|
-
* hook. The parts built on this menu (`TourMenu`) pass theirs through here. */
|
|
363
|
-
triggerAttributes?: { [key: `data-${string}`]: string | number | boolean | undefined };
|
|
364
|
-
}) {
|
|
365
|
-
// Names the groups' headings for `aria-labelledby`. Positional rather than from the
|
|
366
|
-
// entry's `key`, which is the caller's text and may hold a space — and a space in
|
|
367
|
-
// `aria-labelledby` is a list separator.
|
|
368
|
-
const uid = useId();
|
|
369
|
-
const blocks = toBlocks(entries);
|
|
370
|
-
const grouped = columns ? toColumns(blocks) : null;
|
|
371
|
-
// A menu with no group has nothing to put side by side: the list as always.
|
|
372
|
-
const laidOut = grouped && grouped.columns.length > 0 ? grouped : null;
|
|
373
|
-
return (
|
|
374
|
-
<HoverMenu
|
|
375
|
-
aria-label={ariaLabel}
|
|
376
|
-
align={align}
|
|
377
|
-
trigger={({ open, toggle, close }) => {
|
|
378
|
-
// One element for both kinds: the router's link when `href` is set, else the
|
|
379
|
-
// kit's button. Same classes and face either way.
|
|
380
|
-
//
|
|
381
|
-
// Its name in the kit's Tooltip on hover and focus (0.48, keksdose dev#610): an
|
|
382
|
-
// icon alone told a sighted user nothing the screen reader was told. In a
|
|
383
|
-
// fragment, as IconButton does it, so the bubble is not the trigger's
|
|
384
|
-
// `aria-describedby` — the name it repeats is the trigger's own, and a reader
|
|
385
|
-
// would hear it twice. Portalled, like the top bar's other triggers.
|
|
386
|
-
const control = (className: string, children: ReactNode, label?: string) => (
|
|
387
|
-
<Tooltip label={ariaLabel} portal>
|
|
388
|
-
<>
|
|
389
|
-
{href ? (
|
|
390
|
-
<Link {...triggerAttributes} to={href} onClick={close} aria-label={label} className={className}>
|
|
391
|
-
{children}
|
|
392
|
-
</Link>
|
|
393
|
-
) : (
|
|
394
|
-
<button {...triggerAttributes} type="button" onClick={toggle} aria-label={label} className={className}>
|
|
395
|
-
{children}
|
|
396
|
-
</button>
|
|
397
|
-
)}
|
|
398
|
-
</>
|
|
399
|
-
</Tooltip>
|
|
400
|
-
);
|
|
401
|
-
if (trigger) {
|
|
402
|
-
return control(
|
|
403
|
-
cn(TOPBAR_TRIGGER_CLASS, "relative", triggerClassName),
|
|
404
|
-
<>
|
|
405
|
-
<span className="sr-only">{ariaLabel}</span>
|
|
406
|
-
{/* The space keeps the name from running into the face's text ("Account
|
|
407
|
-
menu3 unread"); as a flex item it takes no room. */}{" "}
|
|
408
|
-
{trigger({ open })}
|
|
409
|
-
</>,
|
|
410
|
-
);
|
|
411
|
-
}
|
|
412
|
-
if (iconBadge) {
|
|
413
|
-
// Named by its content, like the custom-trigger branch, so the badge label is
|
|
414
|
-
// part of the name; an `aria-label` would have hidden it.
|
|
415
|
-
return control(
|
|
416
|
-
cn(TOPBAR_TRIGGER_CLASS, "relative", triggerClassName),
|
|
417
|
-
<>
|
|
418
|
-
<span className="sr-only">{ariaLabel}</span>{" "}
|
|
419
|
-
<span aria-hidden className="relative inline-flex">
|
|
420
|
-
{icon}
|
|
421
|
-
<StatusDot ring tone={iconBadge.tone ?? "danger"} className="absolute -end-0.5 -top-0.5" />
|
|
422
|
-
</span>{" "}
|
|
423
|
-
<span className="sr-only">{iconBadge.label}</span>
|
|
424
|
-
</>,
|
|
425
|
-
);
|
|
426
|
-
}
|
|
427
|
-
return control(cn(TOPBAR_TRIGGER_CLASS, triggerClassName), icon, ariaLabel);
|
|
428
|
-
}}
|
|
429
|
-
>
|
|
430
|
-
{(close) => {
|
|
431
|
-
const footerBody = typeof footer === "function" ? footer(close) : footer;
|
|
432
|
-
const headerExtra = typeof header?.extra === "function" ? header.extra(close) : header?.extra;
|
|
433
|
-
const footerClass =
|
|
434
|
-
"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted [&_a:hover]:text-primary [&_a]:rounded-sm [&_a:focus-visible]:outline-none [&_a:focus-visible]:ring-focus [&_a:focus-visible]:ring-brand";
|
|
435
|
-
/** One action or link row — loose, or inside a heading's group. */
|
|
436
|
-
const row = (entry: RowEntry, className?: string) => (
|
|
437
|
-
<li key={entry.key} className={className}>
|
|
438
|
-
{entry.kind === "link" ? (
|
|
439
|
-
<MenuItem
|
|
440
|
-
href={entry.to}
|
|
441
|
-
renderLink={({ href, ...p }) => <Link to={href} {...p} />}
|
|
442
|
-
onClick={close}
|
|
443
|
-
leading={entry.icon}
|
|
444
|
-
trailing={entry.trailing}
|
|
445
|
-
tone={entry.tone}
|
|
446
|
-
current={entry.current}
|
|
447
|
-
disabled={entry.disabled}
|
|
448
|
-
>
|
|
449
|
-
{entry.label}
|
|
450
|
-
</MenuItem>
|
|
451
|
-
) : (
|
|
452
|
-
<MenuItem
|
|
453
|
-
onClick={() => {
|
|
454
|
-
entry.onSelect();
|
|
455
|
-
close();
|
|
456
|
-
}}
|
|
457
|
-
leading={entry.icon}
|
|
458
|
-
trailing={entry.trailing}
|
|
459
|
-
tone={entry.tone}
|
|
460
|
-
checked={entry.checked}
|
|
461
|
-
checkable={entry.checkable}
|
|
462
|
-
disabled={entry.disabled}
|
|
463
|
-
>
|
|
464
|
-
{entry.label}
|
|
465
|
-
</MenuItem>
|
|
466
|
-
)}
|
|
467
|
-
</li>
|
|
468
|
-
);
|
|
469
|
-
/** A rule or a row outside any group; `span` stretches it across the columns. */
|
|
470
|
-
const loose = (block: LooseBlock, span: boolean) => {
|
|
471
|
-
const entry = block.entry;
|
|
472
|
-
if (entry.kind === "divider") {
|
|
473
|
-
return <li key={entry.key} className={cn("my-1 border-t border-subtle", span && SPAN_ALL)} />;
|
|
474
|
-
}
|
|
475
|
-
return row(entry, span ? SPAN_ALL : undefined);
|
|
476
|
-
};
|
|
477
|
-
/** A heading's group: its name, then its rows in a named `role="group"`. */
|
|
478
|
-
const group = (block: Extract<Block, { kind: "group" }>, i: number, tight: boolean, inColumn = false) => {
|
|
479
|
-
const headingId = `${uid}-group-${i}`;
|
|
480
|
-
return (
|
|
481
|
-
<li key={block.heading.key} role="none">
|
|
482
|
-
<div
|
|
483
|
-
id={headingId}
|
|
484
|
-
role="presentation"
|
|
485
|
-
className={cn(
|
|
486
|
-
"px-3 pb-0.5 text-caption font-semibold uppercase tracking-wide text-muted [overflow-wrap:anywhere]",
|
|
487
|
-
// A column's heading lines up with its neighbours' at the top of the
|
|
488
|
-
// grid row; under `md` the columns stack, and it spaces like the list's.
|
|
489
|
-
tight ? "pt-1" : cn("pt-2.5", inColumn && "md:pt-1"),
|
|
490
|
-
)}
|
|
491
|
-
>
|
|
492
|
-
{block.heading.label}
|
|
493
|
-
</div>
|
|
494
|
-
<ul role="group" aria-labelledby={headingId}>
|
|
495
|
-
{block.rows.map((entry) => row(entry))}
|
|
496
|
-
</ul>
|
|
497
|
-
</li>
|
|
498
|
-
);
|
|
499
|
-
};
|
|
500
|
-
return (
|
|
501
|
-
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- a Tab bubbling up from a row or footer link, see keepTabInsidePanel
|
|
502
|
-
<ul
|
|
503
|
-
className={cn("py-1", scrollable && SCROLLABLE_PANEL, laidOut && COLUMNS_PANEL, panelClassName)}
|
|
504
|
-
style={
|
|
505
|
-
laidOut ? ({ "--menu-columns-width": `${laidOut.columns.length * 14}rem` } as CSSProperties) : undefined
|
|
506
|
-
}
|
|
507
|
-
onKeyDown={keepTabInsidePanel}
|
|
508
|
-
>
|
|
509
|
-
{header && (
|
|
510
|
-
<MenuSection className={cn("mb-1 border-b border-subtle px-3 py-2", laidOut && SPAN_ALL)}>
|
|
511
|
-
<div className="truncate text-sm font-medium text-primary">{header.title}</div>
|
|
512
|
-
{header.subtitle != null && <div className="truncate text-xs text-muted">{header.subtitle}</div>}
|
|
513
|
-
{headerExtra != null && headerExtra !== false && <div className="mt-1">{headerExtra}</div>}
|
|
514
|
-
</MenuSection>
|
|
515
|
-
)}
|
|
516
|
-
{heading && (
|
|
517
|
-
<li
|
|
518
|
-
className={cn(
|
|
519
|
-
"px-3 py-1 text-micro font-semibold uppercase tracking-wide text-placeholder",
|
|
520
|
-
laidOut && SPAN_ALL,
|
|
521
|
-
)}
|
|
522
|
-
>
|
|
523
|
-
{heading}
|
|
524
|
-
</li>
|
|
525
|
-
)}
|
|
526
|
-
{leading?.(close)}
|
|
527
|
-
{laidOut ? (
|
|
528
|
-
<>
|
|
529
|
-
{laidOut.lead.map((block) => loose(block, true))}
|
|
530
|
-
{laidOut.columns.map((column, c) => (
|
|
531
|
-
// A column of the grid; under `md` a group as in the list, its rows
|
|
532
|
-
// following.
|
|
533
|
-
<li key={column.group.heading.key} role="none" data-menu-column="" className="min-w-0">
|
|
534
|
-
<ul role="none">
|
|
535
|
-
{group(column.group, column.index, c === 0 && laidOut.lead.length === 0, true)}
|
|
536
|
-
{column.after.map((entry) => loose({ kind: "loose", entry }, false))}
|
|
537
|
-
</ul>
|
|
538
|
-
</li>
|
|
539
|
-
))}
|
|
540
|
-
</>
|
|
541
|
-
) : (
|
|
542
|
-
blocks.map((block, i) => {
|
|
543
|
-
if (block.kind === "loose") return loose(block, false);
|
|
544
|
-
const before = blocks[i - 1];
|
|
545
|
-
// Under a rule (or at the top of the rows) the rule's margin is the gap;
|
|
546
|
-
// straight under another group's last row the heading makes its own.
|
|
547
|
-
return group(block, i, !before || (before.kind === "loose" && before.entry.kind === "divider"));
|
|
548
|
-
})
|
|
549
|
-
)}
|
|
550
|
-
{children?.(close)}
|
|
551
|
-
{footerBody != null && footerBody !== false && (
|
|
552
|
-
<MenuSection className={cn("mt-1 border-t border-subtle px-3 py-2", laidOut && SPAN_ALL)}>
|
|
553
|
-
{footerLabel ? (
|
|
554
|
-
<nav aria-label={footerLabel} className={footerClass}>
|
|
555
|
-
{footerBody}
|
|
556
|
-
</nav>
|
|
557
|
-
) : (
|
|
558
|
-
<div className={footerClass}>{footerBody}</div>
|
|
559
|
-
)}
|
|
560
|
-
</MenuSection>
|
|
561
|
-
)}
|
|
562
|
-
</ul>
|
|
563
|
-
);
|
|
564
|
-
}}
|
|
565
|
-
</HoverMenu>
|
|
566
|
-
);
|
|
567
|
-
}
|