@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,114 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A value that follows `value`, but only once it has stopped changing for `ms`.
|
|
5
|
-
*
|
|
6
|
-
* kastlan asked for the pair in this module because each of its search boxes carried
|
|
7
|
-
* its own copy of the same six lines — a `useEffect` with a `setTimeout` — and two of
|
|
8
|
-
* them forgot the cleanup, so a stale query landed AFTER the fresh one and replaced
|
|
9
|
-
* its results. The cleanup is the whole point of having one implementation.
|
|
10
|
-
*
|
|
11
|
-
* The first render returns `value` itself, not `undefined`: a list filtered by the
|
|
12
|
-
* debounced query must render its initial state immediately, not after `ms`.
|
|
13
|
-
*
|
|
14
|
-
* **It re-arms when `value`'s IDENTITY changes** (an effect on `[value, ms]`), not its
|
|
15
|
-
* content. Pass a primitive — the typed query, a JSON string — or a value whose
|
|
16
|
-
* identity is stable (state, a `useMemo`). An object or array built in render is a new
|
|
17
|
-
* one every render, so the timer is re-armed on every render and the value never
|
|
18
|
-
* settles — or, when the debounced value feeds the render that built it, settles,
|
|
19
|
-
* renders, builds another and fires again, every `ms`, with nobody typing
|
|
20
|
-
* (Kurvenschmiede's control page, KS U9). Debounce `JSON.stringify(body)`, or a key that
|
|
21
|
-
* changes exactly when the content does, and build the object from that.
|
|
22
|
-
*/
|
|
23
|
-
export function useDebounce<T>(value: T, ms: number): T {
|
|
24
|
-
const [debounced, setDebounced] = useState(value);
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
const timer = setTimeout(() => setDebounced(value), ms);
|
|
27
|
-
return () => clearTimeout(timer);
|
|
28
|
-
}, [value, ms]);
|
|
29
|
-
return debounced;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface DebouncedCallbackOptions {
|
|
33
|
-
/**
|
|
34
|
-
* The longest a call may be held back, however often it is re-triggered. Without
|
|
35
|
-
* it a user who never stops typing never saves; with it, a draft autosave still
|
|
36
|
-
* lands every `maxWait` ms while the typing goes on.
|
|
37
|
-
*/
|
|
38
|
-
maxWait?: number;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** The debounced function, plus the two escapes a caller needs around it. */
|
|
42
|
-
export type DebouncedFunction<A extends unknown[]> = ((...args: A) => void) & {
|
|
43
|
-
/** Drop the pending call, if there is one. */
|
|
44
|
-
cancel: () => void;
|
|
45
|
-
/** Run the pending call now, if there is one — e.g. on blur or before navigating
|
|
46
|
-
* away, so the last keystrokes of a form are not lost. */
|
|
47
|
-
flush: () => void;
|
|
48
|
-
/** Whether a call is waiting. */
|
|
49
|
-
pending: () => boolean;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* `fn`, called only once calls have stopped arriving for `ms` — with the arguments
|
|
54
|
-
* of the LAST call.
|
|
55
|
-
*
|
|
56
|
-
* The returned function keeps its identity across renders (so it can sit in an
|
|
57
|
-
* effect's dependency list or be handed to a memoised child) and always calls the
|
|
58
|
-
* LATEST `fn`, so a handler that closes over current state never runs a stale copy.
|
|
59
|
-
* A pending call is cancelled on unmount: a debounced save firing into an unmounted
|
|
60
|
-
* form is the bug kastlan reported, not a feature.
|
|
61
|
-
*/
|
|
62
|
-
export function useDebouncedCallback<A extends unknown[]>(
|
|
63
|
-
fn: (...args: A) => void,
|
|
64
|
-
ms: number,
|
|
65
|
-
{ maxWait }: DebouncedCallbackOptions = {},
|
|
66
|
-
): DebouncedFunction<A> {
|
|
67
|
-
const fnRef = useRef(fn);
|
|
68
|
-
// Layout effect, not render-time assignment: a ref written during render is a
|
|
69
|
-
// side effect React may replay or discard. Nothing can call the debounced function
|
|
70
|
-
// between this commit and the layout effect, so it is never one render behind.
|
|
71
|
-
useLayoutEffect(() => {
|
|
72
|
-
fnRef.current = fn;
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
76
|
-
const maxTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
77
|
-
const lastArgs = useRef<A | null>(null);
|
|
78
|
-
|
|
79
|
-
const clear = useCallback(() => {
|
|
80
|
-
if (timer.current) clearTimeout(timer.current);
|
|
81
|
-
if (maxTimer.current) clearTimeout(maxTimer.current);
|
|
82
|
-
timer.current = null;
|
|
83
|
-
maxTimer.current = null;
|
|
84
|
-
}, []);
|
|
85
|
-
|
|
86
|
-
const invoke = useCallback(() => {
|
|
87
|
-
const args = lastArgs.current;
|
|
88
|
-
clear();
|
|
89
|
-
lastArgs.current = null;
|
|
90
|
-
if (args) fnRef.current(...args);
|
|
91
|
-
}, [clear]);
|
|
92
|
-
|
|
93
|
-
useEffect(() => clear, [clear]);
|
|
94
|
-
|
|
95
|
-
return useMemo(() => {
|
|
96
|
-
const debounced = ((...args: A) => {
|
|
97
|
-
lastArgs.current = args;
|
|
98
|
-
if (timer.current) clearTimeout(timer.current);
|
|
99
|
-
timer.current = setTimeout(invoke, ms);
|
|
100
|
-
if (maxWait !== undefined && !maxTimer.current) {
|
|
101
|
-
maxTimer.current = setTimeout(invoke, maxWait);
|
|
102
|
-
}
|
|
103
|
-
}) as DebouncedFunction<A>;
|
|
104
|
-
debounced.cancel = () => {
|
|
105
|
-
clear();
|
|
106
|
-
lastArgs.current = null;
|
|
107
|
-
};
|
|
108
|
-
debounced.flush = () => {
|
|
109
|
-
if (lastArgs.current) invoke();
|
|
110
|
-
};
|
|
111
|
-
debounced.pending = () => lastArgs.current !== null;
|
|
112
|
-
return debounced;
|
|
113
|
-
}, [ms, maxWait, invoke, clear]);
|
|
114
|
-
}
|
package/src/hooks/use-dismiss.ts
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef, useSyncExternalStore } from "react";
|
|
2
|
-
import type { KeyboardEvent as ReactKeyboardEvent, RefObject } from "react";
|
|
3
|
-
import { isComposing } from "../lib/ime";
|
|
4
|
-
|
|
5
|
-
/*
|
|
6
|
-
* # One Escape stack (round 0.34 Wave 2, DUP-1)
|
|
7
|
-
*
|
|
8
|
-
* Escape closes the TOPMOST thing on screen, and only that: a list open in a dialog
|
|
9
|
-
* closes and the dialog stays; the next press closes the dialog.
|
|
10
|
-
*
|
|
11
|
-
* "Who owns Escape" used to be decided five ways. The anchored pickers listened on the
|
|
12
|
-
* document; Modal, FullBleedDialog, PickerSheet and Popover closed in their own panel's
|
|
13
|
-
* `onKeyDown` and stopped the key; CommandPalette closed without stopping it. A dialog's
|
|
14
|
-
* handler sits earlier on the key's path than any document listener, so Escape in an
|
|
15
|
-
* open list inside a Modal closed the MODAL and threw the form away (BUG-1, sev 4,
|
|
16
|
-
* kastlan's lease dialog), and HoverMenu, the numpad and a tooltip could not be
|
|
17
|
-
* dismissed inside a dialog at all. And Modal and FullBleedDialog disagreed on when a
|
|
18
|
-
* child had "claimed" the key: a ChipInput clearing its draft kept a Modal open and
|
|
19
|
-
* closed a FullBleedDialog.
|
|
20
|
-
*
|
|
21
|
-
* Now every overlay and picker pushes a layer while it is open ({@link useDismissLayer}),
|
|
22
|
-
* last in, first out, the way `use-overlay-history` stacks the Back gesture. One
|
|
23
|
-
* capture-phase listener on the document notes which layer is on top as each Escape
|
|
24
|
-
* goes down — before any handler on the page runs, so a layer that closes on the way
|
|
25
|
-
* cannot pass the key on to the one beneath it. That layer, and only that one, is
|
|
26
|
-
* handed the key:
|
|
27
|
-
*
|
|
28
|
-
* - at the first layer element the key passes on its way back up ({@link takeEscape},
|
|
29
|
-
* which Modal's panel, a picker's search box and the rest call from their
|
|
30
|
-
* `onKeyDown`). The key is stopped there, so nothing around the layers — a
|
|
31
|
-
* FloatingPanel, an app's own panel — closes with it;
|
|
32
|
-
* - or, when focus is in none of them (a hover menu, a tooltip, the numpad over its
|
|
33
|
-
* field, a press on the page), at the document once the key has been everywhere else.
|
|
34
|
-
*
|
|
35
|
-
* Layers stack in the order they OPEN, which is the order their effects run. Two that
|
|
36
|
-
* open in the same commit stack child first — the one case that order gets wrong, and
|
|
37
|
-
* one no overlay in the kit does: each opens on a press, after whatever it sits in.
|
|
38
|
-
*
|
|
39
|
-
* ## Claiming the key: one rule
|
|
40
|
-
*
|
|
41
|
-
* An Escape that means "undo this step" is not a dismissal: ChipInput clearing its
|
|
42
|
-
* draft, InlineEditField cancelling its edit, the date picker's month grid going back to
|
|
43
|
-
* the days. Those call {@link claimEscape}, and no layer is handed the key. The only
|
|
44
|
-
* other claim is the layer owner's OWN handler — a dialog's `onKeyDown` prop calling
|
|
45
|
-
* `preventDefault()` on Escape (Kurvenschmiede's gear wizard asking first), through
|
|
46
|
-
* {@link runOwnKeyDown}. A dialog holding itself open while its request runs passes
|
|
47
|
-
* Modal's `busy` instead (0.51.7, DUP-3), which holds the backdrop and Back as well. A `preventDefault()`
|
|
48
|
-
* anywhere else claims nothing: a search box keeping Chromium from clearing itself
|
|
49
|
-
* must not hold a dialog open (FullBleedDialog's 0.8.0 fix, which Modal never had).
|
|
50
|
-
*
|
|
51
|
-
* The owner's handler hears Escape only while its own layer is on top (0.35, KS). It
|
|
52
|
-
* runs before the stack is asked, so with a tooltip, a hover menu or a list open over
|
|
53
|
-
* the dialog and focus on the panel, the gear wizard asked "Discard this gear?" and the
|
|
54
|
-
* tooltip stayed. Now the layer above takes that press, and the next one is the
|
|
55
|
-
* owner's. Every other key reaches the handler as before.
|
|
56
|
-
*
|
|
57
|
-
* A handler that STOPS the key before it reaches a layer element has taken it too —
|
|
58
|
-
* that is the DOM, and it is what the kit's cell editors and confirm buttons do.
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
/** A layer's handler, read through a ref so the stack holds one stable entry per open. */
|
|
62
|
-
interface Layer {
|
|
63
|
-
escape: (e: KeyboardEvent) => void;
|
|
64
|
-
/** Whether it covers the page — a dialog, a sheet, a popover, a list — rather than
|
|
65
|
-
* annotating it (a tooltip). Counted by {@link useOverlayOpen}. */
|
|
66
|
-
overlay: boolean;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** What {@link useDismissLayer} hands back: its layer while open, for
|
|
70
|
-
* {@link runOwnKeyDown} to tell whether that layer is the one on top. */
|
|
71
|
-
export type DismissLayer = RefObject<Layer | null>;
|
|
72
|
-
|
|
73
|
-
/** Open layers, oldest first. Module-level, because the order is ACROSS instances. */
|
|
74
|
-
const layers: Layer[] = [];
|
|
75
|
-
|
|
76
|
-
/** Escapes a claimant has taken — see {@link claimEscape}. Weak: an event is garbage
|
|
77
|
-
* once its dispatch is over. */
|
|
78
|
-
const claimed = new WeakSet<Event>();
|
|
79
|
-
|
|
80
|
-
/** The Escape on its way through the page: the layer that was topmost as it went down,
|
|
81
|
-
* and whether that layer has been handed it yet. */
|
|
82
|
-
let inFlight: { event: KeyboardEvent; layer: Layer; done: boolean } | null = null;
|
|
83
|
-
|
|
84
|
-
function nativeOf(e: KeyboardEvent | ReactKeyboardEvent): KeyboardEvent {
|
|
85
|
-
return "nativeEvent" in e ? e.nativeEvent : e;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function onCapture(e: KeyboardEvent): void {
|
|
89
|
-
if (e.key !== "Escape") return;
|
|
90
|
-
// An Escape inside an IME composition cancels the composition and nothing else.
|
|
91
|
-
const top = isComposing(e) ? undefined : layers[layers.length - 1];
|
|
92
|
-
inFlight = top ? { event: e, layer: top, done: false } : null;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/** The fallback: no layer element was on the key's path, or none took it. */
|
|
96
|
-
function onBubble(e: KeyboardEvent): void {
|
|
97
|
-
handOver(e, false);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function handOver(e: KeyboardEvent | ReactKeyboardEvent, stop: boolean): boolean {
|
|
101
|
-
const native = nativeOf(e);
|
|
102
|
-
const flight = inFlight;
|
|
103
|
-
if (native.key !== "Escape" || !flight || flight.event !== native || flight.done) return false;
|
|
104
|
-
if (claimed.has(native)) return false;
|
|
105
|
-
flight.done = true;
|
|
106
|
-
// Consumed: a type="search" box does not clear itself as well, and a handler further
|
|
107
|
-
// out that checks `defaultPrevented` (FloatingPanel, an app's own panel) leaves it.
|
|
108
|
-
e.preventDefault();
|
|
109
|
-
if (stop) e.stopPropagation();
|
|
110
|
-
// A layer that closed on the way, by a handler of its own, has had its Escape.
|
|
111
|
-
if (layers.includes(flight.layer)) flight.layer.escape(native);
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function push(layer: Layer): void {
|
|
116
|
-
if (layers.length === 0) {
|
|
117
|
-
document.addEventListener("keydown", onCapture, true);
|
|
118
|
-
document.addEventListener("keydown", onBubble);
|
|
119
|
-
}
|
|
120
|
-
layers.push(layer);
|
|
121
|
-
if (layer.overlay) notifyOverlays();
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function pop(layer: Layer): void {
|
|
125
|
-
const at = layers.indexOf(layer);
|
|
126
|
-
if (at >= 0) layers.splice(at, 1);
|
|
127
|
-
if (at >= 0 && layer.overlay) notifyOverlays();
|
|
128
|
-
if (layers.length > 0) return;
|
|
129
|
-
document.removeEventListener("keydown", onCapture, true);
|
|
130
|
-
document.removeEventListener("keydown", onBubble);
|
|
131
|
-
inFlight = null;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* An Escape layer on the stack while `open`: the topmost layer is handed the next
|
|
136
|
-
* Escape and calls `onEscape`, every layer under it waits its turn. A list opened inside
|
|
137
|
-
* a dialog is above the dialog; a popover opened from a list, above the list.
|
|
138
|
-
*
|
|
139
|
-
* Where focus can be INSIDE the layer, its element's `onKeyDown` calls
|
|
140
|
-
* {@link takeEscape} too, so the key stops there — see the module note. `onEscape` is
|
|
141
|
-
* read live, so it need not be memoised; the layer is pushed and popped only when
|
|
142
|
-
* `open` flips. The layer it returns is for the owner's {@link runOwnKeyDown}.
|
|
143
|
-
*/
|
|
144
|
-
export function useDismissLayer(
|
|
145
|
-
open: boolean,
|
|
146
|
-
onEscape: (e: KeyboardEvent) => void,
|
|
147
|
-
{ overlay = true }: { overlay?: boolean } = {},
|
|
148
|
-
): DismissLayer {
|
|
149
|
-
const handlerRef = useRef(onEscape);
|
|
150
|
-
const layerRef = useRef<Layer | null>(null);
|
|
151
|
-
// Written in an effect, not during render, so it satisfies react-hooks/refs: a
|
|
152
|
-
// render that React starts and then discards — a transition, a Suspense retry —
|
|
153
|
-
// would otherwise leave this holding a handler from a tree that never committed,
|
|
154
|
-
// and the stack would go on to call it. Keydown events fire after the commit, so
|
|
155
|
-
// the ref is always current by the time one arrives.
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
handlerRef.current = onEscape;
|
|
158
|
-
});
|
|
159
|
-
useEffect(() => {
|
|
160
|
-
if (!open || typeof document === "undefined") return;
|
|
161
|
-
const layer: Layer = { escape: (e) => handlerRef.current(e), overlay };
|
|
162
|
-
layerRef.current = layer;
|
|
163
|
-
push(layer);
|
|
164
|
-
return () => {
|
|
165
|
-
pop(layer);
|
|
166
|
-
layerRef.current = null;
|
|
167
|
-
};
|
|
168
|
-
}, [open, overlay]);
|
|
169
|
-
return layerRef;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/*
|
|
173
|
-
* Whether an overlay is open (0.49 KIT-11): every layer on the stack but a tooltip's is a
|
|
174
|
-
* dialog, a sheet, a popover, a hover menu or a list covering part of the page, so the
|
|
175
|
-
* stack is also the one place that knows. The floating launchers (`hideWhenOverlay`) step
|
|
176
|
-
* aside while one is open instead of floating over it or beside it.
|
|
177
|
-
*/
|
|
178
|
-
const overlayListeners = new Set<() => void>();
|
|
179
|
-
|
|
180
|
-
function notifyOverlays(): void {
|
|
181
|
-
for (const listener of overlayListeners) listener();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
function subscribeOverlays(listener: () => void): () => void {
|
|
185
|
-
overlayListeners.add(listener);
|
|
186
|
-
return () => {
|
|
187
|
-
overlayListeners.delete(listener);
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
function anyOverlayOpen(): boolean {
|
|
192
|
-
return layers.some((layer) => layer.overlay);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/** True while a kit dialog, sheet, popover, hover menu or list is open (any layer of the
|
|
196
|
-
* Escape stack but a tooltip's). Internal. */
|
|
197
|
-
export function useOverlayOpen(enabled = true): boolean {
|
|
198
|
-
const open = useSyncExternalStore(subscribeOverlays, anyOverlayOpen, () => false);
|
|
199
|
-
return enabled && open;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* For a layer's own element, in its `onKeyDown`: hands an Escape on its way up to the
|
|
204
|
-
* topmost layer — this one, unless something opened over it without taking focus (a
|
|
205
|
-
* tooltip, the numpad) — and stops it here. True when it did; false for any other key,
|
|
206
|
-
* a claimed Escape, or one already handed over.
|
|
207
|
-
*/
|
|
208
|
-
export function takeEscape(e: KeyboardEvent | ReactKeyboardEvent): boolean {
|
|
209
|
-
return handOver(e, true);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* For an Escape that means "undo this step", not "close": the key is the caller's, and
|
|
214
|
-
* no layer is handed it. `preventDefault()`s it as well, so a handler further out that
|
|
215
|
-
* checks `defaultPrevented` leaves it alone, as before.
|
|
216
|
-
*/
|
|
217
|
-
export function claimEscape(e: KeyboardEvent | ReactKeyboardEvent): void {
|
|
218
|
-
claimed.add(nativeOf(e));
|
|
219
|
-
e.preventDefault();
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Runs a layer owner's own key handler — a dialog's `onKeyDown` prop — and turns a
|
|
224
|
-
* `preventDefault()` it makes on Escape into a claim: the one way, beside
|
|
225
|
-
* {@link claimEscape}, to keep a layer open.
|
|
226
|
-
*
|
|
227
|
-
* Given the owner's `layer` (what {@link useDismissLayer} returned), an Escape that went
|
|
228
|
-
* down while another layer was above that one skips the handler: the press is the
|
|
229
|
-
* layer's on top, and the owner hears the next (0.35, KS). Without it, or while the
|
|
230
|
-
* owner's layer is not open, the handler sees every key, as before.
|
|
231
|
-
*/
|
|
232
|
-
export function runOwnKeyDown<E extends ReactKeyboardEvent>(
|
|
233
|
-
e: E,
|
|
234
|
-
handler: ((e: E) => void) | undefined,
|
|
235
|
-
layer?: DismissLayer,
|
|
236
|
-
): void {
|
|
237
|
-
if (!handler) return;
|
|
238
|
-
if (layer && aboveOwner(e, layer.current)) return;
|
|
239
|
-
const before = e.defaultPrevented;
|
|
240
|
-
handler(e);
|
|
241
|
-
if (e.key === "Escape" && !before && e.defaultPrevented) claimed.add(nativeOf(e));
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/** Whether this Escape went down with a layer above `owner` — the topmost one then was
|
|
245
|
-
* another, and `owner` is on the stack. An Escape the stack did not note (one inside an
|
|
246
|
-
* IME composition) is nobody else's. */
|
|
247
|
-
function aboveOwner(e: ReactKeyboardEvent, owner: Layer | null): boolean {
|
|
248
|
-
const flight = inFlight;
|
|
249
|
-
if (e.key !== "Escape" || !owner || !flight || flight.event !== nativeOf(e)) return false;
|
|
250
|
-
return flight.layer !== owner && layers.includes(owner);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Calls `handler` on an Escape while `enabled` — as an Escape layer. Since 0.34 this is
|
|
255
|
-
* {@link useDismissLayer} with its arguments the other way round: it hears the key only
|
|
256
|
-
* while nothing opened above it, and inside a dialog it no longer loses the key to the
|
|
257
|
-
* dialog (Wave 2, DUP-1). `handler` is read live, so it need not be memoised.
|
|
258
|
-
*/
|
|
259
|
-
export function useEscapeKey(handler: () => void, enabled = true): void {
|
|
260
|
-
useDismissLayer(enabled, handler);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/** Called with each native press an owner's React tree saw — see {@link useOutsideClick}. */
|
|
264
|
-
type PressMark = (press: Event) => void;
|
|
265
|
-
|
|
266
|
-
/** The outside-click hooks watching each ref, for {@link pressInside}. */
|
|
267
|
-
const watchers = new WeakMap<RefObject<HTMLElement | null>, Set<PressMark>>();
|
|
268
|
-
|
|
269
|
-
/** What an `onPointerDownCapture` hands over: a React event, its press inside. */
|
|
270
|
-
type ReactPress = { nativeEvent: Event };
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* An `onPointerDownCapture` for a panel whose `ref` an outside-click hook watches but
|
|
274
|
-
* whose element the hook's owner does not render — {@link DropdownPanel} and
|
|
275
|
-
* `ComboboxPanel` take `panelRef` from `useDropdown` / `useComboboxCore`. Every press
|
|
276
|
-
* that reaches the panel through the React tree, a portalled list opened inside it
|
|
277
|
-
* included, is marked inside for each hook watching `ref`. See {@link useOutsideClick}.
|
|
278
|
-
*/
|
|
279
|
-
export function pressInside(ref: RefObject<HTMLElement | null> | undefined): ((e: ReactPress) => void) | undefined {
|
|
280
|
-
if (!ref) return undefined;
|
|
281
|
-
return (e) => {
|
|
282
|
-
watchers.get(ref)?.forEach((mark) => mark(e.nativeEvent));
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Calls `handler` on a press that lands outside every supplied element, while
|
|
288
|
-
* `enabled` — the outside-click-to-close half of the same dismissal story. Pass one
|
|
289
|
-
* ref or several (trigger + panel); a press inside any of them is ignored. Refs and
|
|
290
|
-
* `handler` are read live, so an inline `[triggerRef, panelRef]` array is fine and
|
|
291
|
-
* won't churn the listener.
|
|
292
|
-
*
|
|
293
|
-
* ## A panel opened from inside is inside (0.48, keksdose dev#623)
|
|
294
|
-
*
|
|
295
|
-
* A CurrencySelect in a Popover: the currency list is portalled to `<body>`, so in the
|
|
296
|
-
* DOM it is outside the popover's panel, and the first press on a currency closed the
|
|
297
|
-
* POPOVER at pointerdown — the list went with it and the choice never landed. The same
|
|
298
|
-
* for a combobox, a menu, a date picker's popover, a dropdown, at any depth.
|
|
299
|
-
*
|
|
300
|
-
* In the React tree the portal is still where it was opened from, and React passes a
|
|
301
|
-
* press up that tree, through portals. So the hook hands back an
|
|
302
|
-
* `onPointerDownCapture`: put it on the element the press should count as inside of —
|
|
303
|
-
* the kit's Popover panel, HoverMenu, DropdownPanel and ComboboxPanel do — and every
|
|
304
|
-
* press that travels through that element in React, portalled panels opened inside it
|
|
305
|
-
* included, is not outside. React's listeners sit on the root and on each portal's
|
|
306
|
-
* container, so they hear the press before this document listener does. No owner chain
|
|
307
|
-
* to keep: depth is free, and an app's own portal inside a kit panel is covered too. A
|
|
308
|
-
* panel the hook's owner does not render takes {@link pressInside} with the watched ref.
|
|
309
|
-
*
|
|
310
|
-
* **`pointerdown`, not `mousedown`** — one event covering mouse, touch and pen.
|
|
311
|
-
* This listened for `mousedown` alone, which on a touch platform is a SYNTHESISED
|
|
312
|
-
* event: the browser emits it for most taps, which is why nothing obviously broke,
|
|
313
|
-
* but the synthesis is not guaranteed. A tap that begins a scroll, or one that lands
|
|
314
|
-
* on an element which preventDefaults the touch sequence, may never produce one — and
|
|
315
|
-
* on a phone-first PWA whose pickers, menus and flyouts all dismiss through this hook,
|
|
316
|
-
* inheriting that is worse than choosing it.
|
|
317
|
-
*
|
|
318
|
-
* The one behaviour this changes deliberately: a touch-drag that starts outside an
|
|
319
|
-
* open panel now dismisses it at touch-down, where before it did not dismiss at all
|
|
320
|
-
* (a drag synthesises no mousedown). That matches every other platform surface, and
|
|
321
|
-
* the anchored panels re-measure on scroll precisely because the page moves under
|
|
322
|
-
* them.
|
|
323
|
-
*/
|
|
324
|
-
export function useOutsideClick(
|
|
325
|
-
refs: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[],
|
|
326
|
-
handler: () => void,
|
|
327
|
-
enabled = true,
|
|
328
|
-
): (e: ReactPress) => void {
|
|
329
|
-
const refsRef = useRef(refs);
|
|
330
|
-
const handlerRef = useRef(handler);
|
|
331
|
-
// The last press this owner's React tree saw: the one the document listener is about
|
|
332
|
-
// to hear, when it went through a panel the owner marked.
|
|
333
|
-
const insideRef = useRef<Event | null>(null);
|
|
334
|
-
// In an effect rather than during render — see the note in useDismissLayer.
|
|
335
|
-
useEffect(() => {
|
|
336
|
-
refsRef.current = refs;
|
|
337
|
-
handlerRef.current = handler;
|
|
338
|
-
});
|
|
339
|
-
const markInside = useCallback((e: ReactPress) => {
|
|
340
|
-
insideRef.current = e.nativeEvent;
|
|
341
|
-
}, []);
|
|
342
|
-
useEffect(() => {
|
|
343
|
-
if (!enabled) return;
|
|
344
|
-
const mark: PressMark = (press) => {
|
|
345
|
-
insideRef.current = press;
|
|
346
|
-
};
|
|
347
|
-
const watched = Array.isArray(refsRef.current) ? refsRef.current : [refsRef.current];
|
|
348
|
-
for (const r of watched) {
|
|
349
|
-
const set = watchers.get(r) ?? new Set<PressMark>();
|
|
350
|
-
set.add(mark);
|
|
351
|
-
watchers.set(r, set);
|
|
352
|
-
}
|
|
353
|
-
const onPointerDown = (e: Event) => {
|
|
354
|
-
const inside = insideRef.current === e;
|
|
355
|
-
insideRef.current = null;
|
|
356
|
-
if (inside) return;
|
|
357
|
-
const target = e.target as Node;
|
|
358
|
-
const list = Array.isArray(refsRef.current) ? refsRef.current : [refsRef.current];
|
|
359
|
-
for (const r of list) {
|
|
360
|
-
if (r.current?.contains(target)) return;
|
|
361
|
-
}
|
|
362
|
-
handlerRef.current();
|
|
363
|
-
};
|
|
364
|
-
document.addEventListener("pointerdown", onPointerDown);
|
|
365
|
-
return () => {
|
|
366
|
-
document.removeEventListener("pointerdown", onPointerDown);
|
|
367
|
-
for (const r of watched) watchers.get(r)?.delete(mark);
|
|
368
|
-
};
|
|
369
|
-
}, [enabled]);
|
|
370
|
-
return markInside;
|
|
371
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
import { useKitDocumentTitle } from "../i18n/kit-labels";
|
|
3
|
-
import { DEFAULT_DOCUMENT_TITLE_FORMAT, formatDocumentTitle } from "../lib/document-title";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Writes the window's title (`document.title`) while the calling component is mounted,
|
|
7
|
-
* and puts back the title it found when it unmounts (0.49 KIT-9).
|
|
8
|
-
*
|
|
9
|
-
* `parts` are positional: `[page, section, app]`. The app falls back to the provider's
|
|
10
|
-
* `appName`, the format to the provider's `documentTitleFormat` (default
|
|
11
|
-
* "{page} · {section} · {app}"); a missing part drops with its separator
|
|
12
|
-
* ({@link formatDocumentTitle}). Parts that are ALL empty write nothing — the provider's
|
|
13
|
-
* app alone is not a page's title.
|
|
14
|
-
*
|
|
15
|
-
* `PageHeader` calls it for its `h1` (`documentTitle`); call it yourself for a page
|
|
16
|
-
* without one.
|
|
17
|
-
*/
|
|
18
|
-
export function useDocumentTitle(parts: ReadonlyArray<string | null | undefined | false>): void {
|
|
19
|
-
const { format, appName } = useKitDocumentTitle();
|
|
20
|
-
const [page, section, app] = parts.map((p) => (typeof p === "string" && p.trim() !== "" ? p : undefined));
|
|
21
|
-
const any = parts.some((p) => typeof p === "string" && p.trim() !== "");
|
|
22
|
-
const title = any
|
|
23
|
-
? formatDocumentTitle(format ?? DEFAULT_DOCUMENT_TITLE_FORMAT, { page, section, app: app ?? appName })
|
|
24
|
-
: null;
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
if (title === null || title === "") return;
|
|
27
|
-
const before = document.title;
|
|
28
|
-
document.title = title;
|
|
29
|
-
return () => {
|
|
30
|
-
document.title = before;
|
|
31
|
-
};
|
|
32
|
-
}, [title]);
|
|
33
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { useRef, useState } from "react";
|
|
2
|
-
import type { DragEvent, ReactElement } from "react";
|
|
3
|
-
import { useFilePicker } from "./use-file-picker";
|
|
4
|
-
import type { UseFilePickerOptions } from "./use-file-picker";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Turn ANY element into a file drop target — kastlan's ask, for the document list of
|
|
8
|
-
* a booking and the rows of its gantt, which are drop targets without being a
|
|
9
|
-
* `FileDropzone` (a dashed box with a Browse button inside would be the wrong thing
|
|
10
|
-
* to draw over a list).
|
|
11
|
-
*
|
|
12
|
-
* ```tsx
|
|
13
|
-
* const { dropProps, isOver, element } = useFileDrop({ accept: ".pdf", multiple: true,
|
|
14
|
-
* maxSize: 10_000_000, onFiles: attach, onReject: ([r]) => setError(r.message) });
|
|
15
|
-
* return <>{element}<ul {...dropProps} data-drop-over={isOver || undefined}>…</ul></>;
|
|
16
|
-
* ```
|
|
17
|
-
*
|
|
18
|
-
* The screening is `useFilePicker`'s own — `accept` re-checked (a drop ignores the
|
|
19
|
-
* dialog's filter), `maxSize`, `maxFiles`, `isValid`, `onPick` — so a file refused by
|
|
20
|
-
* `FileButton` is refused here in the same words. It comes with `open()` as well, so
|
|
21
|
-
* the same options can also back a "choose a file" menu item beside the drop target.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/** `useFilePicker`'s options, minus `capture` (a camera does not take drops). */
|
|
25
|
-
export type UseFileDropOptions = Omit<UseFilePickerOptions, "capture">;
|
|
26
|
-
|
|
27
|
-
/** Spread onto the drop target. Four handlers, nothing else: the element keeps its
|
|
28
|
-
* own role, name and focus behaviour. */
|
|
29
|
-
export interface FileDropProps<E extends Element = Element> {
|
|
30
|
-
onDragEnter: (e: DragEvent<E>) => void;
|
|
31
|
-
onDragOver: (e: DragEvent<E>) => void;
|
|
32
|
-
onDragLeave: (e: DragEvent<E>) => void;
|
|
33
|
-
onDrop: (e: DragEvent<E>) => void;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface UseFileDropReturn<E extends Element = Element> {
|
|
37
|
-
dropProps: FileDropProps<E>;
|
|
38
|
-
/** A FILE drag is over the target (and it is not `disabled`). Style from this. */
|
|
39
|
-
isOver: boolean;
|
|
40
|
-
/** Open the system picker with the same options — from a click handler only. */
|
|
41
|
-
open: () => void;
|
|
42
|
-
/** Screen and deliver files that arrived another way (a paste). */
|
|
43
|
-
take: (files: ArrayLike<File> | null | undefined) => void;
|
|
44
|
-
/** The live region that speaks a refusal (and the picker's hidden input). Render it
|
|
45
|
-
* once, anywhere; without it a refusal reaches `onReject` but is not announced. */
|
|
46
|
-
element: ReactElement;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** Whether a drag carries files — a dragged link, text or a row of the page does not,
|
|
50
|
-
* and must not light the target up or be swallowed by it. */
|
|
51
|
-
export function dragHasFiles(e: DragEvent): boolean {
|
|
52
|
-
return Array.from(e.dataTransfer?.types ?? []).includes("Files");
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @internal The drag half on its own, shared with `FileDropzone`.
|
|
57
|
-
*
|
|
58
|
-
* `dragenter`/`dragleave` fire for every CHILD the pointer crosses: moving from the
|
|
59
|
-
* target onto a label inside it is a leave of the target followed by an enter of the
|
|
60
|
-
* label, which bubbles. A boolean flipped by each one flickers off and on across
|
|
61
|
-
* every child, and `relatedTarget` — the usual fix — is `null` in Safari's drag
|
|
62
|
-
* events. So this counts: +1 per enter, -1 per leave, over while above zero, and a
|
|
63
|
-
* drop resets it (the drop replaces the leave that would have balanced the enter).
|
|
64
|
-
*
|
|
65
|
-
* A file drag stops propagating here, so a target nested in another (a row inside a
|
|
66
|
-
* page-wide drop area) takes its own drop, and the outer one's count falls back to
|
|
67
|
-
* zero while the pointer is over the inner one — only one of them lights up.
|
|
68
|
-
*/
|
|
69
|
-
export function useDragTarget<E extends Element = Element>({
|
|
70
|
-
disabled,
|
|
71
|
-
onDropFiles,
|
|
72
|
-
}: {
|
|
73
|
-
disabled?: boolean;
|
|
74
|
-
onDropFiles: (files: FileList | File[]) => void;
|
|
75
|
-
}): { dropProps: FileDropProps<E>; isOver: boolean } {
|
|
76
|
-
const depth = useRef(0);
|
|
77
|
-
const [over, setOver] = useState(false);
|
|
78
|
-
|
|
79
|
-
const dropProps: FileDropProps<E> = {
|
|
80
|
-
onDragEnter: (e) => {
|
|
81
|
-
if (!dragHasFiles(e)) return;
|
|
82
|
-
e.stopPropagation();
|
|
83
|
-
e.preventDefault();
|
|
84
|
-
depth.current += 1;
|
|
85
|
-
if (!disabled) setOver(true);
|
|
86
|
-
},
|
|
87
|
-
onDragOver: (e) => {
|
|
88
|
-
if (!dragHasFiles(e)) return;
|
|
89
|
-
e.stopPropagation();
|
|
90
|
-
// Always cancelled for a file drag, disabled or not: an uncancelled drop makes
|
|
91
|
-
// the browser NAVIGATE to the file, which loses the page.
|
|
92
|
-
e.preventDefault();
|
|
93
|
-
e.dataTransfer.dropEffect = disabled ? "none" : "copy";
|
|
94
|
-
},
|
|
95
|
-
onDragLeave: (e) => {
|
|
96
|
-
if (!dragHasFiles(e)) return;
|
|
97
|
-
e.stopPropagation();
|
|
98
|
-
depth.current = Math.max(0, depth.current - 1);
|
|
99
|
-
if (depth.current === 0) setOver(false);
|
|
100
|
-
},
|
|
101
|
-
onDrop: (e) => {
|
|
102
|
-
if (!dragHasFiles(e)) return;
|
|
103
|
-
e.stopPropagation();
|
|
104
|
-
e.preventDefault();
|
|
105
|
-
depth.current = 0;
|
|
106
|
-
setOver(false);
|
|
107
|
-
if (!disabled) onDropFiles(e.dataTransfer.files);
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
return { dropProps, isOver: over && !disabled };
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function useFileDrop<E extends Element = Element>(options: UseFileDropOptions): UseFileDropReturn<E> {
|
|
115
|
-
const picker = useFilePicker(options);
|
|
116
|
-
const { dropProps, isOver } = useDragTarget<E>({
|
|
117
|
-
disabled: options.disabled,
|
|
118
|
-
onDropFiles: picker.take,
|
|
119
|
-
});
|
|
120
|
-
return { dropProps, isOver, open: picker.open, take: picker.take, element: picker.element };
|
|
121
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// The English words of the file pickers (./use-file-picker), in a module with no component
|
|
2
|
-
// code: the English catalogue (src/i18n/defaults.ts) imports them without the component, so
|
|
3
|
-
// `en` loads as one chunk like the other languages (0.34, KS U8). In hooks/ beside the hook
|
|
4
|
-
// since 0.34 (MOD-8); components/file-button re-exports them.
|
|
5
|
-
|
|
6
|
-
import type { FilePickerLabels } from "./use-file-picker";
|
|
7
|
-
|
|
8
|
-
export const DEFAULT_FILE_PICKER_LABELS: FilePickerLabels = {
|
|
9
|
-
rejectedType: (name) => `“${name}” is not a supported file type`,
|
|
10
|
-
rejectedTypeOnly: (accept) => `Only ${accept} files`,
|
|
11
|
-
rejectedSize: (name, maxSize) => `“${name}” is larger than ${maxSize}`,
|
|
12
|
-
rejectedCount: (name, maxFiles) =>
|
|
13
|
-
`“${name}” was not added: at most ${maxFiles} ${maxFiles === 1 ? "file" : "files"}`,
|
|
14
|
-
rejectedInvalid: (name) => `“${name}” cannot be used here`,
|
|
15
|
-
rejectedMany: (count) => `${count} files were not added`,
|
|
16
|
-
rejectedPick: (count) => (count === 1 ? "The file was not added" : `None of the ${count} files were added`),
|
|
17
|
-
selected: (count, firstName) => (count === 1 ? `“${firstName}” selected` : `${count} files selected`),
|
|
18
|
-
remove: (name) => `Remove “${name}”`,
|
|
19
|
-
clearAll: "Remove all files",
|
|
20
|
-
removed: (name) => `“${name}” removed`,
|
|
21
|
-
cleared: "All files removed",
|
|
22
|
-
dropzone: "File upload",
|
|
23
|
-
browse: "Browse",
|
|
24
|
-
empty: "Drop a file here",
|
|
25
|
-
emptyMultiple: "Drop files here",
|
|
26
|
-
hint: (accept) => (accept ? `Accepted: ${accept}` : "Any file type"),
|
|
27
|
-
busy: "Uploading…",
|
|
28
|
-
};
|