@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,123 +0,0 @@
|
|
|
1
|
-
import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithoutRef, Ref, RefObject } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { mergeRefs } from "./field-parts";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Whether `ref`'s element currently overflows its box — the one fact a scroll
|
|
8
|
-
* container needs to decide whether it is a keyboard stop.
|
|
9
|
-
*
|
|
10
|
-
* Measured on every commit (cheap: two reads, and state is set only on a change) and
|
|
11
|
-
* whenever the element or one of its direct children resizes, which covers both
|
|
12
|
-
* "the panel got narrower" and "the rows arrived". Without `ResizeObserver` (jsdom,
|
|
13
|
-
* very old engines) the per-commit measurement is what remains.
|
|
14
|
-
*
|
|
15
|
-
* Shared with {@link Table}'s overflow wrapper, which has the same obligation.
|
|
16
|
-
*/
|
|
17
|
-
export function useScrollOverflow(ref: RefObject<HTMLElement | null>): boolean {
|
|
18
|
-
const [overflowing, setOverflowing] = useState(false);
|
|
19
|
-
|
|
20
|
-
const measure = useCallback(() => {
|
|
21
|
-
const el = ref.current;
|
|
22
|
-
if (!el) return;
|
|
23
|
-
const next = el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1;
|
|
24
|
-
setOverflowing((prev) => (prev === next ? prev : next));
|
|
25
|
-
}, [ref]);
|
|
26
|
-
|
|
27
|
-
// No dependency list on purpose: content changes arrive as re-renders.
|
|
28
|
-
useLayoutEffect(() => {
|
|
29
|
-
measure();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
useLayoutEffect(() => {
|
|
33
|
-
const el = ref.current;
|
|
34
|
-
if (!el || typeof ResizeObserver === "undefined") return;
|
|
35
|
-
const ro = new ResizeObserver(measure);
|
|
36
|
-
ro.observe(el);
|
|
37
|
-
for (const child of Array.from(el.children)) ro.observe(child);
|
|
38
|
-
return () => ro.disconnect();
|
|
39
|
-
}, [ref, measure]);
|
|
40
|
-
|
|
41
|
-
return overflowing;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** Thin, token-coloured scrollbars. `scrollbar-width` / `scrollbar-color` are the
|
|
45
|
-
* standard (Firefox, Chrome 121+); the `::-webkit-scrollbar` rules are for Safari,
|
|
46
|
-
* which has neither. Where the standard pair applies, Chrome ignores the rest. */
|
|
47
|
-
export const THIN_SCROLLBAR_CLASS = cn(
|
|
48
|
-
"[scrollbar-width:thin] [scrollbar-color:var(--border-strong)_transparent]",
|
|
49
|
-
"[&::-webkit-scrollbar]:size-2 [&::-webkit-scrollbar-track]:bg-transparent",
|
|
50
|
-
"[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-[var(--border-strong)]",
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const AXIS = {
|
|
54
|
-
vertical: "overflow-y-auto overflow-x-hidden",
|
|
55
|
-
horizontal: "overflow-x-auto overflow-y-hidden",
|
|
56
|
-
both: "overflow-auto",
|
|
57
|
-
} as const;
|
|
58
|
-
|
|
59
|
-
export interface ScrollAreaProps extends ComponentPropsWithoutRef<"div"> {
|
|
60
|
-
/** Which way the content may scroll. Default `vertical`. */
|
|
61
|
-
orientation?: keyof typeof AXIS;
|
|
62
|
-
/**
|
|
63
|
-
* The region's accessible name. With it (or `aria-labelledby`) the container is a
|
|
64
|
-
* `role="region"` a reader can find and name; without it, it is a plain box.
|
|
65
|
-
* Name every ScrollArea whose content can overflow: once it is a tab stop, a
|
|
66
|
-
* reader announces it on focus, and an unnamed one is announced as nothing.
|
|
67
|
-
*/
|
|
68
|
-
label?: string;
|
|
69
|
-
ref?: Ref<HTMLDivElement>;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* A styled overflow container: a thin scrollbar in the kit's colours, a focus ring,
|
|
74
|
-
* and the keyboard access a plain `overflow-auto` div does not have.
|
|
75
|
-
*
|
|
76
|
-
* kastlan used Radix's ScrollArea for this and nothing else from it. Radix draws a
|
|
77
|
-
* custom scrollbar in JavaScript; the platform's own, thinned and coloured, costs no
|
|
78
|
-
* script and keeps native momentum, overscroll and scrollbar-dragging behaviour.
|
|
79
|
-
*
|
|
80
|
-
* A container that scrolls but holds nothing focusable cannot be scrolled from the
|
|
81
|
-
* keyboard at all — Tab jumps straight past it (WCAG 2.1.1). So while the content
|
|
82
|
-
* overflows, the container itself is a tab stop (`tabIndex=0`), and arrow keys and
|
|
83
|
-
* Page Up/Down scroll it natively. While nothing overflows it is not, so a short list
|
|
84
|
-
* adds no empty stop to the tab order.
|
|
85
|
-
*/
|
|
86
|
-
export function ScrollArea({
|
|
87
|
-
orientation = "vertical",
|
|
88
|
-
label,
|
|
89
|
-
className,
|
|
90
|
-
ref,
|
|
91
|
-
tabIndex,
|
|
92
|
-
"aria-labelledby": labelledBy,
|
|
93
|
-
...rest
|
|
94
|
-
}: ScrollAreaProps) {
|
|
95
|
-
const inner = useRef<HTMLDivElement | null>(null);
|
|
96
|
-
const overflowing = useScrollOverflow(inner);
|
|
97
|
-
const setRef = useMemo(() => mergeRefs(inner, ref), [ref]);
|
|
98
|
-
const named = label !== undefined || labelledBy !== undefined;
|
|
99
|
-
|
|
100
|
-
return (
|
|
101
|
-
<div
|
|
102
|
-
{...rest}
|
|
103
|
-
ref={setRef}
|
|
104
|
-
role={named ? "region" : undefined}
|
|
105
|
-
aria-label={label}
|
|
106
|
-
aria-labelledby={labelledBy}
|
|
107
|
-
tabIndex={tabIndex ?? (overflowing ? 0 : undefined)}
|
|
108
|
-
data-overflowing={overflowing || undefined}
|
|
109
|
-
data-orientation={orientation}
|
|
110
|
-
className={cn(
|
|
111
|
-
"relative min-h-0 min-w-0",
|
|
112
|
-
AXIS[orientation],
|
|
113
|
-
THIN_SCROLLBAR_CLASS,
|
|
114
|
-
// An OUTLINE, inset: a ring is a box-shadow, which paints beneath the content —
|
|
115
|
-
// a row with its own background would cover exactly the part of the ring that
|
|
116
|
-
// says where focus is. An outline paints above it, and the negative offset
|
|
117
|
-
// keeps it inside a parent that clips.
|
|
118
|
-
"focus-visible:outline-focus focus-visible:-outline-offset-2 focus-visible:outline-brand",
|
|
119
|
-
className,
|
|
120
|
-
)}
|
|
121
|
-
/>
|
|
122
|
-
);
|
|
123
|
-
}
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { useMemo, useRef } from "react";
|
|
2
|
-
import type { InputHTMLAttributes, Ref } from "react";
|
|
3
|
-
import { Search, X } from "lucide-react";
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { FIELD_BASE, FIELD_TOUCH_TEXT } from "./field-base";
|
|
6
|
-
import { mergeRefs } from "./field-parts";
|
|
7
|
-
import { DEFAULT_COMMON_LABELS, useKitLabels } from "../i18n/kit-labels";
|
|
8
|
-
|
|
9
|
-
interface SearchFieldOwnProps extends Omit<
|
|
10
|
-
InputHTMLAttributes<HTMLInputElement>,
|
|
11
|
-
"value" | "onChange" | "type" | "aria-label"
|
|
12
|
-
> {
|
|
13
|
-
value: string;
|
|
14
|
-
/** The typed text. Emitted as a plain string, not an event: every caller of the
|
|
15
|
-
* four this replaced wanted the string, and one of them held it in a URL param
|
|
16
|
-
* rather than in state. */
|
|
17
|
-
onChange: (value: string) => void;
|
|
18
|
-
/** Names the clear button. Default: the catalogue's `common.clear`, in the
|
|
19
|
-
* provider's language. */
|
|
20
|
-
clearLabel?: string;
|
|
21
|
-
/**
|
|
22
|
-
* Draw the "×" that empties the field once there is something in it. Default
|
|
23
|
-
* `true`.
|
|
24
|
-
*
|
|
25
|
-
* It used to appear only when a `clearLabel` was passed, and every kastlan call
|
|
26
|
-
* site passed one — lease-list-page.tsx:91, trial-balance-page.tsx:~196,
|
|
27
|
-
* account-ledger-page.tsx:~131 and data-table/resource-list-page.tsx:256 each
|
|
28
|
-
* spelled `clearLabel={t("table.clear")}` — so the opt-in was boilerplate: a filter
|
|
29
|
-
* you can type into and not untype is the complaint that produced the button in
|
|
30
|
-
* the first place, and the catalogue already names it. `false` is for a field
|
|
31
|
-
* whose clearing lives elsewhere (a "Reset filters" beside it).
|
|
32
|
-
*/
|
|
33
|
-
clearable?: boolean;
|
|
34
|
-
/**
|
|
35
|
-
* `"field"` (default): the bordered filter box that sits on a page.
|
|
36
|
-
*
|
|
37
|
-
* `"inline"`: no box at all — no border, no fill, no padding of its own — and no
|
|
38
|
-
* type size of its own either, so it takes the size of the header it sits in.
|
|
39
|
-
* For a search that IS the header: a command-palette sheet, a picker's top line
|
|
40
|
-
* (Keksdose's transaction search, which lost its `text-base` headline to a
|
|
41
|
-
* bordered `text-sm` box when it moved onto this component). The container is
|
|
42
|
-
* what frames it, so give the container the focus cue if it needs one
|
|
43
|
-
* (`focus-within:`); the caret is the field's own.
|
|
44
|
-
*/
|
|
45
|
-
variant?: "field" | "inline";
|
|
46
|
-
/** Classes for the `<input>` itself. `className` styles the wrapper — the box the
|
|
47
|
-
* icon and the clear button are positioned against — so it could set a width
|
|
48
|
-
* and nothing else. See {@link Input}'s `inputClassName`. */
|
|
49
|
-
inputClassName?: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// The inline look: FIELD_DISPLAY's idea (the chrome gone, the value the thing
|
|
53
|
-
// itself) without even its baseline, because the header it sits in already draws
|
|
54
|
-
// the line. No `text-*` size, on purpose — the input inherits the caller's.
|
|
55
|
-
const SEARCH_INLINE =
|
|
56
|
-
"block w-full min-w-0 border-0 bg-transparent py-1 text-primary shadow-none placeholder:text-placeholder focus:outline-none focus:ring-0 " +
|
|
57
|
-
// FIELD_BASE carries the 16 px touch floor (§10.1); the inline look needs it too.
|
|
58
|
-
FIELD_TOUCH_TEXT;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* `aria-label` is REQUIRED: the whole reason this component exists is that two of the
|
|
62
|
-
* four boxes it replaced were named by nothing but their placeholder — which disappears
|
|
63
|
-
* the moment someone types, i.e. exactly when a screen-reader user is working in the
|
|
64
|
-
* field. The `label` spelling it also took from 0.5 was removed in 0.34.
|
|
65
|
-
*/
|
|
66
|
-
export type SearchFieldProps = SearchFieldOwnProps & {
|
|
67
|
-
"aria-label": string;
|
|
68
|
-
/** The `<input>`. A React 19 ref prop since 0.34 (MOD-4, refactor audit 2026-10); it
|
|
69
|
-
* was `forwardRef`. */
|
|
70
|
-
ref?: Ref<HTMLInputElement>;
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* The page-level filter box: a search icon, a `type="search"` input, and a clear
|
|
75
|
-
* "×" that appears once there is something to clear.
|
|
76
|
-
*
|
|
77
|
-
* ## Why it is a component
|
|
78
|
-
*
|
|
79
|
-
* Keksdose had four of these and no two agreed. Two were character-identical
|
|
80
|
-
* twenty-line copies (the settings catalogue filter and the tour list filter) —
|
|
81
|
-
* the same absolute icon at `left-3`, the same `pl-9 pr-9`, the same
|
|
82
|
-
* `[&::-webkit-search-cancel-button]:appearance-none`, the same conditional clear
|
|
83
|
-
* button at `right-2` — differing only in which state setter they called. The
|
|
84
|
-
* third (the admin support queue) was the same idea at `left-2`/`size-3.5`/`pl-7`
|
|
85
|
-
* with no clear button and no `type="search"`, so it had neither the `searchbox`
|
|
86
|
-
* role nor a way to empty itself. The fourth (the bank picker) was a bare `<Input
|
|
87
|
-
* placeholder="Search">`: no icon, no clear, and no accessible name at all once
|
|
88
|
-
* the placeholder went away.
|
|
89
|
-
*
|
|
90
|
-
* None of that is a design decision anyone made; it is four people solving the
|
|
91
|
-
* same problem on four days. A shared component is how the fourth screen gets the
|
|
92
|
-
* clear button the first one earned.
|
|
93
|
-
*
|
|
94
|
-
* ## The two X's
|
|
95
|
-
*
|
|
96
|
-
* `type="search"` is what gives the field its `searchbox` role — and, in Chrome, a
|
|
97
|
-
* NATIVE clear cross that paints right next to ours, so a non-empty box shows two
|
|
98
|
-
* X's an inch apart. Ours is the one that survives: it carries an accessible name
|
|
99
|
-
* and matches the app's other icon buttons, and it returns focus to the input so
|
|
100
|
-
* the next query can be typed straight away.
|
|
101
|
-
*/
|
|
102
|
-
export function SearchField({
|
|
103
|
-
ref,
|
|
104
|
-
value,
|
|
105
|
-
onChange,
|
|
106
|
-
clearLabel: clearLabelProp,
|
|
107
|
-
clearable = true,
|
|
108
|
-
className,
|
|
109
|
-
inputClassName,
|
|
110
|
-
placeholder,
|
|
111
|
-
variant = "field",
|
|
112
|
-
"aria-label": ariaLabel,
|
|
113
|
-
...rest
|
|
114
|
-
}: SearchFieldProps) {
|
|
115
|
-
const innerRef = useRef<HTMLInputElement>(null);
|
|
116
|
-
const setRef = useMemo(() => mergeRefs(innerRef, ref), [ref]);
|
|
117
|
-
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
118
|
-
const clearLabel = clearable ? (clearLabelProp ?? common.clear) : undefined;
|
|
119
|
-
// The accessible name AND the placeholder fallback, so the box says what it is
|
|
120
|
-
// before anyone has typed in it.
|
|
121
|
-
const name = ariaLabel;
|
|
122
|
-
const inline = variant === "inline";
|
|
123
|
-
return (
|
|
124
|
-
<div className={cn("relative", className)}>
|
|
125
|
-
<Search
|
|
126
|
-
aria-hidden
|
|
127
|
-
className={cn(
|
|
128
|
-
"pointer-events-none absolute top-1/2 size-4 -translate-y-1/2 text-placeholder",
|
|
129
|
-
// Logical sides throughout, so a right-to-left page gets the icon at the
|
|
130
|
-
// start of the line and the clear button at its end.
|
|
131
|
-
inline ? "start-0" : "start-3",
|
|
132
|
-
)}
|
|
133
|
-
/>
|
|
134
|
-
<input
|
|
135
|
-
ref={setRef}
|
|
136
|
-
type="search"
|
|
137
|
-
value={value}
|
|
138
|
-
onChange={(e) => onChange(e.target.value)}
|
|
139
|
-
aria-label={name}
|
|
140
|
-
placeholder={placeholder ?? name}
|
|
141
|
-
// Keksdose live #333: *"Entering the search here — is that set as password?
|
|
142
|
-
// … I got prompted for remembering my name or mail address"*, typed into the
|
|
143
|
-
// settings filter on a phone.
|
|
144
|
-
//
|
|
145
|
-
// A `type="search"` input with no `name` and no `autocomplete` is a field
|
|
146
|
-
// Chrome's autofill classifies by GUESSWORK, from the labels around it and
|
|
147
|
-
// the other fields on the page — and a settings page has an email and a
|
|
148
|
-
// password on it. Naming the field and declaring the intent is what takes it
|
|
149
|
-
// out of that guess: `autocomplete="off"` says it is not part of any profile,
|
|
150
|
-
// and a `name` of "search" is the strongest hint the heuristics take.
|
|
151
|
-
//
|
|
152
|
-
// The three that follow are not about autofill but about the same keyboard:
|
|
153
|
-
// a filter box that capitalises the first letter and autocorrects "2fa" to
|
|
154
|
-
// "2FA" is fighting the person typing into it. Declared BEFORE `{...rest}` so
|
|
155
|
-
// a caller with a reason can still override any of them.
|
|
156
|
-
name="search"
|
|
157
|
-
autoComplete="off"
|
|
158
|
-
autoCapitalize="none"
|
|
159
|
-
autoCorrect="off"
|
|
160
|
-
spellCheck={false}
|
|
161
|
-
{...rest}
|
|
162
|
-
className={cn(
|
|
163
|
-
inline ? SEARCH_INLINE : FIELD_BASE,
|
|
164
|
-
inline ? "ps-7" : "ps-9",
|
|
165
|
-
// Room for our own "×" only when there is one; a field that can't be
|
|
166
|
-
// cleared has no reason to reserve the space.
|
|
167
|
-
clearLabel === undefined ? (inline ? "pe-0" : "pe-3") : inline ? "pe-8" : "pe-9",
|
|
168
|
-
"[&::-webkit-search-cancel-button]:appearance-none",
|
|
169
|
-
inputClassName,
|
|
170
|
-
)}
|
|
171
|
-
/>
|
|
172
|
-
{clearLabel !== undefined && value !== "" && (
|
|
173
|
-
<button
|
|
174
|
-
type="button"
|
|
175
|
-
onClick={() => {
|
|
176
|
-
onChange("");
|
|
177
|
-
// Clearing is the start of the next query far more often than it is the
|
|
178
|
-
// end of this one, so the caret stays where it can be typed into.
|
|
179
|
-
innerRef.current?.focus();
|
|
180
|
-
}}
|
|
181
|
-
aria-label={clearLabel}
|
|
182
|
-
className={cn(
|
|
183
|
-
"absolute top-1/2 -translate-y-1/2 rounded p-1 text-placeholder hover:text-secondary",
|
|
184
|
-
inline ? "end-0" : "end-2",
|
|
185
|
-
)}
|
|
186
|
-
>
|
|
187
|
-
<X className="size-4" />
|
|
188
|
-
</button>
|
|
189
|
-
)}
|
|
190
|
-
</div>
|
|
191
|
-
);
|
|
192
|
-
}
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { useId } from "react";
|
|
2
|
-
import type { KeyboardEvent, MouseEvent, ReactNode, Ref, SelectHTMLAttributes } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import type { CommitScope } from "./write-lock";
|
|
5
|
-
import {
|
|
6
|
-
LockedReason,
|
|
7
|
-
mergeDescribedBy,
|
|
8
|
-
type DisabledReasonDisplay,
|
|
9
|
-
type FieldHelpProps,
|
|
10
|
-
useFieldError,
|
|
11
|
-
useFieldHint,
|
|
12
|
-
useLockReason,
|
|
13
|
-
} from "./field-parts";
|
|
14
|
-
import {
|
|
15
|
-
FIELD_BASE,
|
|
16
|
-
FIELD_FLOATING_PAD,
|
|
17
|
-
FIELD_INVALID,
|
|
18
|
-
FieldChevron,
|
|
19
|
-
FieldGroup,
|
|
20
|
-
FloatingField,
|
|
21
|
-
SELECT_MENU_DRESS,
|
|
22
|
-
SELECT_SM,
|
|
23
|
-
fieldBelow,
|
|
24
|
-
} from "./field-base";
|
|
25
|
-
|
|
26
|
-
export interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, "size">, FieldHelpProps {
|
|
27
|
-
label?: ReactNode;
|
|
28
|
-
/** See {@link Input}'s `invalid`. */
|
|
29
|
-
invalid?: boolean;
|
|
30
|
-
/** See {@link Input}'s `error`. */
|
|
31
|
-
error?: ReactNode;
|
|
32
|
-
/** A {@link FieldHint} for the label line — see {@link FloatingField}. Plain
|
|
33
|
-
* TEXT (a string or a number) is a caption instead, and goes UNDER the field
|
|
34
|
-
* like every other field's hint, attached through `aria-describedby`: the label
|
|
35
|
-
* line is 11px of strip shared with the label, and a sentence placed there was
|
|
36
|
-
* set in the value's type on top of both the label and the value. On an
|
|
37
|
-
* UNLABELLED Select (no label line) a FieldHint sits at the field's end edge,
|
|
38
|
-
* outside the box. Since 0.34 a FieldHint is the caption at Large and on a touch
|
|
39
|
-
* screen, as on Input (`useInlineHint`); a `HelpPopover` stays a "?". Beside a
|
|
40
|
-
* `help` (0.36) the hint is the caption at every size: the help's "?" is the only one. */
|
|
41
|
-
hint?: ReactNode;
|
|
42
|
-
/**
|
|
43
|
-
* `"sm"`: a 28px, 12px-type select for a toolbar or a table header, where the
|
|
44
|
-
* 36px field stands a head taller than the buttons beside it. `"md"` (default)
|
|
45
|
-
* is the field every form uses. Unlabelled selects only — a floating label needs
|
|
46
|
-
* the tall box to float in, so a labelled Select ignores `"sm"`.
|
|
47
|
-
*
|
|
48
|
-
* A NUMBER is still the native attribute (the rows of a list box) and is passed
|
|
49
|
-
* straight through, so the one HTML meaning of `size` keeps working. Above 1 (as
|
|
50
|
-
* with `multiple`) the browser draws a list box, and the Select drops its chevron
|
|
51
|
-
* and the end padding reserved for it.
|
|
52
|
-
*/
|
|
53
|
-
size?: "sm" | "md" | number;
|
|
54
|
-
/** Classes for the `<select>` itself. `className` styles the WRAPPER — the box
|
|
55
|
-
* the chevron is positioned against — so it could set a width and nothing
|
|
56
|
-
* else; this is the way to the element. See {@link Input}'s `inputClassName`. */
|
|
57
|
-
selectClassName?: string;
|
|
58
|
-
/**
|
|
59
|
-
* Why the choice cannot be changed — {@link Button}'s `disabledReason`, for a select
|
|
60
|
-
* that SAVES on change (a role picker in a members table, a status in a row). keksdose
|
|
61
|
-
* K3: those sat inside a hand-rolled `SaveGuard` that forced a native `disabled`, which
|
|
62
|
-
* took the field out of the tab order so the reason never reached a keyboard.
|
|
63
|
-
*
|
|
64
|
-
* With a reason the select is `aria-disabled` instead — still focusable, still showing
|
|
65
|
-
* its value — its list does not open (pointer and keys are swallowed, Tab and Escape
|
|
66
|
-
* excepted), `onChange` is never called, and the reason is a line under the field at
|
|
67
|
-
* Large and on a touch screen, else in the kit {@link Tooltip} (`disabledReasonDisplay`),
|
|
68
|
-
* and on `aria-describedby`. It wears the settled look of a disabled field and drops
|
|
69
|
-
* its chevron, as a disabled Select does (dev#474). It wins over `disabled`.
|
|
70
|
-
*
|
|
71
|
-
* Use it CONTROLLED (`value` + `onChange`): React puts a controlled value back after
|
|
72
|
-
* the swallowed change. A touch platform's own picker may still open; nothing it picks
|
|
73
|
-
* is kept or reported.
|
|
74
|
-
*/
|
|
75
|
-
disabledReason?: ReactNode;
|
|
76
|
-
/**
|
|
77
|
-
* Where the reason shows — {@link Button}'s `disabledReasonDisplay`: by default a line
|
|
78
|
-
* under the field at Large and on a touch screen, the tooltip otherwise (§4 "No fact
|
|
79
|
-
* only in a tooltip"; DUP-3, refactor audit 2026-10).
|
|
80
|
-
*/
|
|
81
|
-
disabledReasonDisplay?: DisabledReasonDisplay;
|
|
82
|
-
/**
|
|
83
|
-
* This select COMMITS — choosing saves. Under a locked {@link WriteLockProvider} it is
|
|
84
|
-
* locked the `disabledReason` way with the lock's reason (which wins over its own).
|
|
85
|
-
* No provider, or an unlocked one: no effect. Button's `commit`, for keksdose K3; a
|
|
86
|
-
* {@link CommitScope} since 0.33.
|
|
87
|
-
*/
|
|
88
|
-
commit?: CommitScope;
|
|
89
|
-
/** The `<select>`. A React 19 ref prop since 0.34 — see {@link InputProps.ref}. */
|
|
90
|
-
ref?: Ref<HTMLSelectElement>;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** Keys a locked select still answers: leaving it, and dismissing its tooltip. Every
|
|
94
|
-
* other key would open the list or step the value. */
|
|
95
|
-
const LOCKED_SELECT_KEYS = new Set(["Tab", "Escape", "Shift"]);
|
|
96
|
-
|
|
97
|
-
/** FIELD_BASE's `disabled:` look, for a select that is locked without being `disabled`
|
|
98
|
-
* (the `:disabled` variants cannot match it). */
|
|
99
|
-
const FIELD_LOCKED = "cursor-not-allowed bg-surface-2 text-muted";
|
|
100
|
-
|
|
101
|
-
export function Select(props: SelectProps) {
|
|
102
|
-
const {
|
|
103
|
-
ref,
|
|
104
|
-
className,
|
|
105
|
-
label,
|
|
106
|
-
id,
|
|
107
|
-
children,
|
|
108
|
-
invalid,
|
|
109
|
-
error,
|
|
110
|
-
hint: hintProp,
|
|
111
|
-
help,
|
|
112
|
-
size,
|
|
113
|
-
selectClassName,
|
|
114
|
-
disabledReason,
|
|
115
|
-
disabledReasonDisplay,
|
|
116
|
-
commit,
|
|
117
|
-
onMouseDown,
|
|
118
|
-
onKeyDown,
|
|
119
|
-
onChange,
|
|
120
|
-
...rest
|
|
121
|
-
} = props;
|
|
122
|
-
// See Input's `reserve`.
|
|
123
|
-
const reserve = "error" in props || "hint" in props || "showCount" in props;
|
|
124
|
-
const generated = useId();
|
|
125
|
-
const lock = useLockReason(commit, disabledReason);
|
|
126
|
-
const locked = lock.locked;
|
|
127
|
-
// Only a number reaches the DOM; the two words are this component's own.
|
|
128
|
-
const nativeSize = typeof size === "number" ? size : undefined;
|
|
129
|
-
// A numeric size above 1 (or `multiple`) makes the browser draw a LIST BOX — all
|
|
130
|
-
// the rows in the field, no menu to drop. The dropdown dress did not fit it: the
|
|
131
|
-
// chevron was centred on a box several rows tall, sat on top of the rows' text
|
|
132
|
-
// at the end edge, and `pe-9` clipped every option nine units early. A list box
|
|
133
|
-
// gets the plain field instead — its own native scroll, no chevron, even padding.
|
|
134
|
-
const listBox = (nativeSize !== undefined && nativeSize > 1) || Boolean(rest.multiple);
|
|
135
|
-
const small = size === "sm" && label === undefined;
|
|
136
|
-
const fieldId = id ?? generated;
|
|
137
|
-
// Text is a caption under the field; a FieldHint rides the label line — and at Large
|
|
138
|
-
// and on a touch screen is its words, a caption like any text (§4; a HelpPopover stays
|
|
139
|
-
// on the label line, §10.23). See `hint` above. Through useFieldHint since 0.34, not a
|
|
140
|
-
// copy of its rule (DUP-2, refactor audit 2026-10).
|
|
141
|
-
const hintParts = useFieldHint(hintProp, rest["aria-describedby"], { help, name: label ?? rest["aria-label"] });
|
|
142
|
-
const hint = hintParts.labelHint;
|
|
143
|
-
const { isInvalid, describedBy, errorEl } = useFieldError(
|
|
144
|
-
error,
|
|
145
|
-
invalid,
|
|
146
|
-
// The caption goes in BEFORE the error — the standing advice first, the news
|
|
147
|
-
// second, the order useFieldError keeps for a caller's own description. A lock's
|
|
148
|
-
// reason sits between the two.
|
|
149
|
-
mergeDescribedBy(hintParts.describedBy, locked && lock.reasonId),
|
|
150
|
-
rest["aria-invalid"],
|
|
151
|
-
);
|
|
152
|
-
const below = fieldBelow(hintParts, null, errorEl);
|
|
153
|
-
// Custom chevron (native arrow hidden via appearance-none) so it sits a touch
|
|
154
|
-
// in from the end border and matches both themes — feedback #223. A DISABLED
|
|
155
|
-
// select has no menu to drop, so it drops the chevron too: the arrow is the one
|
|
156
|
-
// thing on the control that promises a choice (Keksdose dev#474, where the
|
|
157
|
-
// account type became read-only and still looked exactly like a picker). A locked
|
|
158
|
-
// one has no menu either.
|
|
159
|
-
const chevron =
|
|
160
|
-
rest.disabled || listBox || locked ? null : <FieldChevron className={small ? "end-1.5 size-3.5" : undefined} />;
|
|
161
|
-
// `pe-9` is the room the chevron takes; a list box has none to make room for.
|
|
162
|
-
//
|
|
163
|
-
// A list box's height is `size` rows plus its padding, but its rows are clipped at
|
|
164
|
-
// the PADDING edge, not the content edge — so FIELD_BASE's `pb-2` showed the next
|
|
165
|
-
// row through the bottom padding: `size={4}` drew four and a half. The vertical room
|
|
166
|
-
// moves onto the rows instead (option padding counts toward the row height the
|
|
167
|
-
// browser sizes the box by), and the box keeps no bottom padding: exactly `size`
|
|
168
|
-
// whole rows, at any width.
|
|
169
|
-
const dress = listBox ? "overflow-y-auto [&_option]:py-1" : SELECT_MENU_DRESS;
|
|
170
|
-
// Locked: focusable, but nothing opens the list or moves the value, and nothing is
|
|
171
|
-
// reported. The no-op `onChange` keeps a controlled select's value where React put
|
|
172
|
-
// it (and keeps React from warning about a `value` with no handler).
|
|
173
|
-
const interaction = locked
|
|
174
|
-
? {
|
|
175
|
-
disabled: undefined,
|
|
176
|
-
"aria-disabled": true as const,
|
|
177
|
-
onMouseDown: (e: MouseEvent<HTMLSelectElement>) => e.preventDefault(),
|
|
178
|
-
onKeyDown: (e: KeyboardEvent<HTMLSelectElement>) => {
|
|
179
|
-
if (!LOCKED_SELECT_KEYS.has(e.key) && !e.ctrlKey && !e.metaKey) e.preventDefault();
|
|
180
|
-
},
|
|
181
|
-
onChange: () => {},
|
|
182
|
-
}
|
|
183
|
-
: { onMouseDown, onKeyDown, onChange };
|
|
184
|
-
// While locked the field sits in the reason's frame (the line, or the Tooltip), which
|
|
185
|
-
// becomes the outermost box — so `className` (a width, a grid cell) moves onto it, and
|
|
186
|
-
// the form keeps its layout. `block` so a full-width field stays full width inside it.
|
|
187
|
-
const boxClass = locked ? undefined : className;
|
|
188
|
-
const withReason = (box: ReactNode) =>
|
|
189
|
-
locked ? (
|
|
190
|
-
<LockedReason lock={lock} display={disabledReasonDisplay} className={cn("block", className)}>
|
|
191
|
-
{box}
|
|
192
|
-
</LockedReason>
|
|
193
|
-
) : (
|
|
194
|
-
box
|
|
195
|
-
);
|
|
196
|
-
if (label === undefined) {
|
|
197
|
-
const select = (
|
|
198
|
-
<select
|
|
199
|
-
ref={ref}
|
|
200
|
-
// `id` is destructured out of the props to feed `fieldId`, and this branch
|
|
201
|
-
// never put it back — so an UNLABELLED Select swallowed it and the
|
|
202
|
-
// consumer's own `<label for="…">` pointed at nothing. The control stayed
|
|
203
|
-
// in the tab order with no accessible name at all: reachable, and silent
|
|
204
|
-
// when it was reached. Input and Textarea both forward it here; this is
|
|
205
|
-
// the third one doing the same thing.
|
|
206
|
-
id={id}
|
|
207
|
-
size={nativeSize}
|
|
208
|
-
{...rest}
|
|
209
|
-
{...interaction}
|
|
210
|
-
// OR-ed with the spread for the reason spelled out on Input's copy: this
|
|
211
|
-
// branch wrote `invalid || undefined`, so passing `aria-invalid` by hand
|
|
212
|
-
// to a Select — which is what a caller does when the validity is
|
|
213
|
-
// `"grammar"` or `"spelling"`, or when the paint is not wanted — had the
|
|
214
|
-
// attribute silently dropped. Input has never done that.
|
|
215
|
-
aria-invalid={isInvalid || rest["aria-invalid"] || undefined}
|
|
216
|
-
aria-describedby={describedBy}
|
|
217
|
-
className={cn(
|
|
218
|
-
FIELD_BASE,
|
|
219
|
-
dress,
|
|
220
|
-
listBox && "py-0",
|
|
221
|
-
small && SELECT_SM,
|
|
222
|
-
locked && FIELD_LOCKED,
|
|
223
|
-
selectClassName,
|
|
224
|
-
isInvalid && FIELD_INVALID,
|
|
225
|
-
)}
|
|
226
|
-
>
|
|
227
|
-
{children}
|
|
228
|
-
</select>
|
|
229
|
-
);
|
|
230
|
-
// A FieldHint with no label line to ride (0.15.5 P8): an unlabelled Select — named
|
|
231
|
-
// by `aria-label` or a `<label>` of the caller's — dropped a non-text `hint`
|
|
232
|
-
// without a trace, so the "?" a caller passed never rendered and a test looking
|
|
233
|
-
// for its button found none. It goes at the end of the field instead, outside the
|
|
234
|
-
// box, as the label line's own hint goes at the end of the label.
|
|
235
|
-
if (hint !== undefined) {
|
|
236
|
-
return (
|
|
237
|
-
<FieldGroup errorEl={below} reserve={reserve}>
|
|
238
|
-
{withReason(
|
|
239
|
-
<div className={cn("flex items-center gap-1.5", boxClass)}>
|
|
240
|
-
<div className="relative min-w-0 flex-1">
|
|
241
|
-
{select}
|
|
242
|
-
{chevron}
|
|
243
|
-
</div>
|
|
244
|
-
<span className="flex shrink-0 items-center">{hint}</span>
|
|
245
|
-
</div>,
|
|
246
|
-
)}
|
|
247
|
-
</FieldGroup>
|
|
248
|
-
);
|
|
249
|
-
}
|
|
250
|
-
return (
|
|
251
|
-
<FieldGroup errorEl={below} reserve={reserve}>
|
|
252
|
-
{withReason(
|
|
253
|
-
<div className={cn("relative", boxClass)}>
|
|
254
|
-
{select}
|
|
255
|
-
{chevron}
|
|
256
|
-
</div>,
|
|
257
|
-
)}
|
|
258
|
-
</FieldGroup>
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
return (
|
|
262
|
-
<FieldGroup errorEl={below} reserve={reserve}>
|
|
263
|
-
{withReason(
|
|
264
|
-
<FloatingField className={boxClass} htmlFor={fieldId} label={label} staticLabel hint={hint}>
|
|
265
|
-
<select
|
|
266
|
-
ref={ref}
|
|
267
|
-
id={fieldId}
|
|
268
|
-
size={nativeSize}
|
|
269
|
-
{...rest}
|
|
270
|
-
{...interaction}
|
|
271
|
-
aria-invalid={isInvalid || rest["aria-invalid"] || undefined}
|
|
272
|
-
aria-describedby={describedBy}
|
|
273
|
-
className={cn(
|
|
274
|
-
FIELD_BASE,
|
|
275
|
-
// The floated label takes the top strip of a list box too, so its first
|
|
276
|
-
// row starts under the label rather than behind it. No bottom padding — see
|
|
277
|
-
// `dress`.
|
|
278
|
-
// At Large the label stands above the field (§10.17): no strip.
|
|
279
|
-
listBox ? "pt-5 pb-0 large:pt-2" : FIELD_FLOATING_PAD,
|
|
280
|
-
"peer",
|
|
281
|
-
dress,
|
|
282
|
-
locked && FIELD_LOCKED,
|
|
283
|
-
selectClassName,
|
|
284
|
-
isInvalid && FIELD_INVALID,
|
|
285
|
-
)}
|
|
286
|
-
>
|
|
287
|
-
{children}
|
|
288
|
-
</select>
|
|
289
|
-
{chevron}
|
|
290
|
-
</FloatingField>,
|
|
291
|
-
)}
|
|
292
|
-
</FieldGroup>
|
|
293
|
-
);
|
|
294
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { ComponentPropsWithRef } from "react";
|
|
2
|
-
import { cn } from "../lib/cn";
|
|
3
|
-
|
|
4
|
-
export interface SeparatorProps extends Omit<ComponentPropsWithRef<"div">, "children" | "role"> {
|
|
5
|
-
orientation?: "horizontal" | "vertical";
|
|
6
|
-
/**
|
|
7
|
-
* `false` (default, as in Radix): a real `role="separator"`, which a reader
|
|
8
|
-
* announces — right between groups of controls, a menu's sections, a toolbar's
|
|
9
|
-
* halves. `true`: a line for the eye only (`role="none"`), for a divider that
|
|
10
|
-
* separates nothing the structure does not already separate.
|
|
11
|
-
*/
|
|
12
|
-
decorative?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* A hairline between two things.
|
|
17
|
-
*
|
|
18
|
-
* kastlan's other Radix leftover. `aria-orientation` is set only when vertical:
|
|
19
|
-
* horizontal is the role's default, and stating a default is noise in every reader's
|
|
20
|
-
* verbose mode.
|
|
21
|
-
*/
|
|
22
|
-
export function Separator({ orientation = "horizontal", decorative = false, className, ...rest }: SeparatorProps) {
|
|
23
|
-
const vertical = orientation === "vertical";
|
|
24
|
-
return (
|
|
25
|
-
<div
|
|
26
|
-
{...rest}
|
|
27
|
-
role={decorative ? "none" : "separator"}
|
|
28
|
-
aria-orientation={!decorative && vertical ? "vertical" : undefined}
|
|
29
|
-
data-orientation={orientation}
|
|
30
|
-
className={cn("shrink-0 bg-[var(--border)]", vertical ? "w-px self-stretch" : "h-px w-full", className)}
|
|
31
|
-
/>
|
|
32
|
-
);
|
|
33
|
-
}
|