@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,129 +0,0 @@
|
|
|
1
|
-
import { useId } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
3
|
-
import { LabelStrip, useFieldMessages, type FieldHelpProps } from "./field-parts";
|
|
4
|
-
|
|
5
|
-
/** What a {@link FieldStrip} hands render-prop children. */
|
|
6
|
-
export interface FieldStripIds {
|
|
7
|
-
/** The label's id — for content that names ITSELF by the label (`aria-labelledby`)
|
|
8
|
-
* under `group={false}`, or anything else that has to point at it. */
|
|
9
|
-
labelId: string;
|
|
10
|
-
/** The ids of the caption and the error while they are on screen, else `undefined`.
|
|
11
|
-
* The group is described by them already; spread this on the content under
|
|
12
|
-
* `group={false}`, where there is no group to describe. */
|
|
13
|
-
describedBy: string | undefined;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* A `div`'s props, `ref` included since 0.35 (round 0.35 R4, as Card and EmptyState took
|
|
18
|
-
* it in 0.34, API-2): the ref is the root — the group, or the plain box under
|
|
19
|
-
* `group={false}` — which a caller scrolls into view or measures.
|
|
20
|
-
*/
|
|
21
|
-
export interface FieldStripProps extends Omit<ComponentPropsWithRef<"div">, "children">, FieldHelpProps {
|
|
22
|
-
/** The 11px static label, on the line a labelled field's label sits on. */
|
|
23
|
-
label: ReactNode;
|
|
24
|
-
/**
|
|
25
|
-
* Field anatomy, as on {@link Input}: plain text is a caption under the content (and
|
|
26
|
-
* describes the group); a {@link FieldHint} "?" rides the label line.
|
|
27
|
-
*/
|
|
28
|
-
hint?: ReactNode;
|
|
29
|
-
/** A message under the content, in `--danger`, describing the group. `null`,
|
|
30
|
-
* `false` and `""` are no error. The content's own controls are the caller's to
|
|
31
|
-
* mark `aria-invalid`; a `group` cannot be. */
|
|
32
|
-
error?: ReactNode;
|
|
33
|
-
/**
|
|
34
|
-
* Dims the label with the content, as a disabled field's label dims. The content is
|
|
35
|
-
* the caller's: disable (or hide) its controls yourself — keksdose's location cell
|
|
36
|
-
* turns its map into a picture and drops its buttons, which no flag here could guess.
|
|
37
|
-
*/
|
|
38
|
-
disabled?: boolean;
|
|
39
|
-
/**
|
|
40
|
-
* The wrapper is a `role="group"` named by the label (default), so a screen reader
|
|
41
|
-
* entering the map or the first button hears "Location, group" — what the visible
|
|
42
|
-
* label tells a sighted reader the content is about.
|
|
43
|
-
*
|
|
44
|
-
* `false` for content that is a labelled group ITSELF (a `role="radiogroup"` of the
|
|
45
|
-
* app's own, a TileRadioGroup's container, a fieldset): a group inside a group, both
|
|
46
|
-
* named "Pattern", is read twice. The wrapper is then a plain box, and the content
|
|
47
|
-
* takes the name from the render-prop's `labelId` (and the caption and error from
|
|
48
|
-
* its `describedBy`).
|
|
49
|
-
*/
|
|
50
|
-
group?: boolean;
|
|
51
|
-
/** The content. A function receives {@link FieldStripIds}. */
|
|
52
|
-
children: ReactNode | ((ids: FieldStripIds) => ReactNode);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* The kit's label strip for content of your own — keksdose G8.
|
|
57
|
-
*
|
|
58
|
-
* 0.22 gave three groups a strip label (keksdose K2): ToggleGroup's
|
|
59
|
-
* `labelPlacement="strip"`, SwatchPicker's and IconPicker's `label`. Each draws the
|
|
60
|
-
* 11px label (and its `FieldHint`) on the same line as the labelled fields beside it,
|
|
61
|
-
* over content WITHOUT a field's border round it. keksdose's transaction row has one
|
|
62
|
-
* cell left that is not one of those groups: the location — a map, a "Locate me" and a
|
|
63
|
-
* "Search" button — still built by hand as a `relative` cell, a floated `FieldLabel`
|
|
64
|
-
* and a `pt-5` box (transaction-location-field.tsx), and so is the reconciled-status
|
|
65
|
-
* stand-in (cleared-status-toggle.tsx, `ClearedStatusLocked`). This is the strip on its
|
|
66
|
-
* own, the same component the three groups draw theirs with:
|
|
67
|
-
*
|
|
68
|
-
* ```tsx
|
|
69
|
-
* <FieldStrip label={t("transactions.location")} className={className}>
|
|
70
|
-
* <div className="space-y-2">
|
|
71
|
-
* <PinMap … />
|
|
72
|
-
* <div className="flex flex-wrap gap-2"><Button …>Locate me</Button>…</div>
|
|
73
|
-
* </div>
|
|
74
|
-
* </FieldStrip>
|
|
75
|
-
* ```
|
|
76
|
-
*
|
|
77
|
-
* The label sits where a field's static label sits (`top-1`, `inset-x-3`, 11px in a
|
|
78
|
-
* `leading-tight` line); the content starts 20px down, full width, clear of the label
|
|
79
|
-
* and its "?". `className` styles the wrapper — the grid or flex item in the caller's
|
|
80
|
-
* row — and merges after the strip's padding.
|
|
81
|
-
*
|
|
82
|
-
* Not a {@link Field}: that one sets a 14px label ABOVE its control, in flow, for a form
|
|
83
|
-
* that labels its fields that way. This is for a row whose fields float their labels
|
|
84
|
-
* inside them, where a label above would be the only one of its kind.
|
|
85
|
-
*/
|
|
86
|
-
export function FieldStrip({
|
|
87
|
-
label,
|
|
88
|
-
hint,
|
|
89
|
-
help,
|
|
90
|
-
error,
|
|
91
|
-
disabled = false,
|
|
92
|
-
group = true,
|
|
93
|
-
className,
|
|
94
|
-
children,
|
|
95
|
-
...rest
|
|
96
|
-
}: FieldStripProps) {
|
|
97
|
-
const labelId = useId();
|
|
98
|
-
const messages = useFieldMessages({ hint, help, name: label, error });
|
|
99
|
-
const content = typeof children === "function" ? children({ labelId, describedBy: messages.describedBy }) : children;
|
|
100
|
-
// The caller's own description first, then the caption, then the error — the order
|
|
101
|
-
// every kit field reads them in.
|
|
102
|
-
const groupDescribedBy = [rest["aria-describedby"], messages.describedBy].filter(Boolean).join(" ") || undefined;
|
|
103
|
-
return (
|
|
104
|
-
// `rest` carries the caller's `ref` too (a plain prop in React 19): LabelStrip spreads
|
|
105
|
-
// its own rest onto the wrapper `<div>`, so the ref lands on the root.
|
|
106
|
-
<LabelStrip
|
|
107
|
-
{...rest}
|
|
108
|
-
{...(group
|
|
109
|
-
? {
|
|
110
|
-
role: "group",
|
|
111
|
-
// An explicit name wins, as on the kit's labelled groups.
|
|
112
|
-
"aria-labelledby":
|
|
113
|
-
rest["aria-label"] === undefined && rest["aria-labelledby"] === undefined
|
|
114
|
-
? labelId
|
|
115
|
-
: rest["aria-labelledby"],
|
|
116
|
-
"aria-describedby": groupDescribedBy,
|
|
117
|
-
}
|
|
118
|
-
: null)}
|
|
119
|
-
labelId={labelId}
|
|
120
|
-
label={label}
|
|
121
|
-
hint={messages.labelHint}
|
|
122
|
-
disabled={disabled}
|
|
123
|
-
className={className}
|
|
124
|
-
>
|
|
125
|
-
{content}
|
|
126
|
-
{messages.below}
|
|
127
|
-
</LabelStrip>
|
|
128
|
-
);
|
|
129
|
-
}
|
package/src/components/field.tsx
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A field group with its label ABOVE the control: label, control, hint, error.
|
|
3
|
-
*
|
|
4
|
-
* ```tsx
|
|
5
|
-
* <Field label="IBAN" required hint="22 characters" error={errors.iban}>
|
|
6
|
-
* {(ids) => <Input {...ids} value={iban} onChange={…} />}
|
|
7
|
-
* </Field>
|
|
8
|
-
* ```
|
|
9
|
-
*
|
|
10
|
-
* The kit's `Input` and `Select` float their label inside the field, and the pickers
|
|
11
|
-
* draw theirs the same way. That is the wrong shape for a control the kit did not
|
|
12
|
-
* render, a radio group, a range slider, or a form that sets its labels above the
|
|
13
|
-
* fields throughout — which is what kastlan's wizards are, and why it kept its own
|
|
14
|
-
* `WizardField` after the kit dropped the one it had never rendered. This is that
|
|
15
|
-
* group, with the wiring the old one left to the caller: the label names the control
|
|
16
|
-
* through `htmlFor`, and the control is described by the hint and the error that are
|
|
17
|
-
* actually on screen.
|
|
18
|
-
*
|
|
19
|
-
* ## Wiring
|
|
20
|
-
*
|
|
21
|
-
* Pass a function as `children` and it receives {@link FieldControlProps} — `id`,
|
|
22
|
-
* `aria-describedby`, `aria-invalid` and `aria-required` — to spread on the control.
|
|
23
|
-
* Plain children render as they are, for a control that wires itself (a checkbox that
|
|
24
|
-
* carries its own label, a group with `aria-labelledby`); `htmlFor` then points the
|
|
25
|
-
* label at the control's own id, and the hint and error are on screen but describe
|
|
26
|
-
* nothing — the same as the `WizardField` this replaces.
|
|
27
|
-
*
|
|
28
|
-
* ## Decoupled
|
|
29
|
-
*
|
|
30
|
-
* Deliberately knows neither the wizard nor react-hook-form: `error` is a plain
|
|
31
|
-
* value. Pass `wizard.fieldErrors.iban`, a step-local error, or
|
|
32
|
-
* `fieldState.error?.message` from a react-hook-form `Controller` — the markup is the
|
|
33
|
-
* same whichever of them gates the step, so a step can move between them without its
|
|
34
|
-
* fields changing. (Inside a react-hook-form form, `RhfField` from `@eifi1/ui-kit/rhf`
|
|
35
|
-
* does the same job with the ids taken from the form.)
|
|
36
|
-
*
|
|
37
|
-
* The error is NOT `role="alert"`, for the reason the kit's `error` prop gives (see
|
|
38
|
-
* `useFieldError` in components/field-parts.tsx): it is read when focus reaches the control.
|
|
39
|
-
*/
|
|
40
|
-
import { useId, type ReactNode } from "react";
|
|
41
|
-
import { cn } from "../lib/cn";
|
|
42
|
-
import { hasContent } from "../lib/presence";
|
|
43
|
-
import { fieldHelpMark, useInlineHint, type FieldHelpProps } from "./field-parts";
|
|
44
|
-
import { Label } from "./field-base";
|
|
45
|
-
|
|
46
|
-
/** What a `Field` hands its render-prop children, to spread on the control. */
|
|
47
|
-
export interface FieldControlProps {
|
|
48
|
-
/** The id the label's `htmlFor` points at. */
|
|
49
|
-
id: string;
|
|
50
|
-
/** The ids of the hint and the error that are rendered, or `undefined` when
|
|
51
|
-
* neither is. */
|
|
52
|
-
"aria-describedby": string | undefined;
|
|
53
|
-
/** `true` while the field has an error, `undefined` otherwise. */
|
|
54
|
-
"aria-invalid": true | undefined;
|
|
55
|
-
/** `true` when the field is `required`. The label's star is `aria-hidden`; this
|
|
56
|
-
* is what a screen reader hears instead. */
|
|
57
|
-
"aria-required": true | undefined;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* The second argument of a `Field`'s render-prop children: what a GROUP needs that
|
|
62
|
-
* a single control does not. `htmlFor` names an `<input>`, but a `<label>` pointing
|
|
63
|
-
* at a `role="radiogroup"` div names nothing — so a group (a {@link ToggleGroup})
|
|
64
|
-
* takes `aria-labelledby={labelId}` instead. Kept out of {@link FieldControlProps}
|
|
65
|
-
* so the spread every existing control takes is unchanged.
|
|
66
|
-
*/
|
|
67
|
-
export interface FieldRenderMeta {
|
|
68
|
-
/** The label element's id, or `undefined` when the field has no label. */
|
|
69
|
-
labelId: string | undefined;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Where the label is visible. `"visible"` (default); `"sr-only"`: never drawn, still
|
|
74
|
-
* the control's name; `"below-sm"` / `"below-md"` / `"below-lg"`: drawn only under
|
|
75
|
-
* that breakpoint and screen-reader-only from it up.
|
|
76
|
-
*
|
|
77
|
-
* For table-like editors — kastlan's journal entry lines
|
|
78
|
-
* (accounting/components/wizard/journal-entry-lines-step.tsx) — where a desktop
|
|
79
|
-
* row sits under column headers that already say "Account" and "Amount", but the
|
|
80
|
-
* phone layout stacks each line as a card and needs the labels back. The name stays
|
|
81
|
-
* on the control at every width; only the ink changes.
|
|
82
|
-
*/
|
|
83
|
-
export type FieldLabelVisibility = "visible" | "sr-only" | "below-sm" | "below-md" | "below-lg";
|
|
84
|
-
|
|
85
|
-
// Literal class strings so Tailwind's scanner sees each one.
|
|
86
|
-
const LABEL_VISIBILITY: Record<FieldLabelVisibility, string | undefined> = {
|
|
87
|
-
visible: undefined,
|
|
88
|
-
"sr-only": "sr-only",
|
|
89
|
-
"below-sm": "sm:sr-only",
|
|
90
|
-
"below-md": "md:sr-only",
|
|
91
|
-
"below-lg": "lg:sr-only",
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export interface FieldProps extends FieldHelpProps {
|
|
95
|
-
/** The label above the control. Omit it for a group whose control is labelled
|
|
96
|
-
* some other way; the hint and error still render. */
|
|
97
|
-
label?: ReactNode;
|
|
98
|
-
/** Draws the kit's required mark after the label, and sets `aria-required` on the
|
|
99
|
-
* render-prop control. */
|
|
100
|
-
required?: boolean;
|
|
101
|
-
/** Muted helper text below the control. */
|
|
102
|
-
hint?: ReactNode;
|
|
103
|
-
/** The error below the control. `null`, `false` and `""` are no error — what a
|
|
104
|
-
* `touched && errors.x` evaluates to on the happy path. */
|
|
105
|
-
error?: ReactNode;
|
|
106
|
-
/** The control's id. Defaults to a generated one; set it when the control carries
|
|
107
|
-
* its own id (plain children). */
|
|
108
|
-
htmlFor?: string;
|
|
109
|
-
/** Dims the label with its control. */
|
|
110
|
-
disabled?: boolean;
|
|
111
|
-
/** The label's size: `sm` for a dense row, `md` otherwise. */
|
|
112
|
-
labelSize?: "sm" | "md";
|
|
113
|
-
/** See {@link FieldLabelVisibility}. */
|
|
114
|
-
labelVisibility?: FieldLabelVisibility;
|
|
115
|
-
/** Wrapper className. */
|
|
116
|
-
className?: string;
|
|
117
|
-
/** The control. A function receives {@link FieldControlProps} to spread on it, and
|
|
118
|
-
* {@link FieldRenderMeta} (the label's id, for a group). */
|
|
119
|
-
children: ReactNode | ((control: FieldControlProps, meta: FieldRenderMeta) => ReactNode);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function Field({
|
|
123
|
-
label,
|
|
124
|
-
required,
|
|
125
|
-
hint: hintProp,
|
|
126
|
-
help,
|
|
127
|
-
error,
|
|
128
|
-
htmlFor,
|
|
129
|
-
disabled,
|
|
130
|
-
labelSize,
|
|
131
|
-
labelVisibility = "visible",
|
|
132
|
-
className,
|
|
133
|
-
children,
|
|
134
|
-
}: FieldProps) {
|
|
135
|
-
const generated = useId();
|
|
136
|
-
const id = htmlFor ?? `${generated}-control`;
|
|
137
|
-
const hintId = `${generated}-hint`;
|
|
138
|
-
const errorId = `${generated}-error`;
|
|
139
|
-
const labelId = `${generated}-label`;
|
|
140
|
-
// §4: a FieldHint under the control is its words at Large and on a touch screen, not
|
|
141
|
-
// a lone "?" (DUP-2, refactor audit 2026-10). A HelpPopover stays a "?".
|
|
142
|
-
// With a `help` (0.36) its "?" follows the label, and a FieldHint is its words at
|
|
143
|
-
// every size: the help's is the field's only "?".
|
|
144
|
-
const helpMark = fieldHelpMark(help, label);
|
|
145
|
-
const hint = useInlineHint(hintProp, helpMark !== undefined);
|
|
146
|
-
const hasHint = hasContent(hint);
|
|
147
|
-
const hasError = hasContent(error);
|
|
148
|
-
const describedBy = [hasHint && hintId, hasError && errorId].filter(Boolean).join(" ");
|
|
149
|
-
const control: FieldControlProps = {
|
|
150
|
-
id,
|
|
151
|
-
"aria-describedby": describedBy || undefined,
|
|
152
|
-
"aria-invalid": hasError || undefined,
|
|
153
|
-
"aria-required": required || undefined,
|
|
154
|
-
};
|
|
155
|
-
const labelEl = label !== undefined && (
|
|
156
|
-
<Label
|
|
157
|
-
id={labelId}
|
|
158
|
-
htmlFor={id}
|
|
159
|
-
required={required}
|
|
160
|
-
disabled={disabled}
|
|
161
|
-
size={labelSize}
|
|
162
|
-
data-error={hasError || undefined}
|
|
163
|
-
className={cn("data-[error=true]:text-danger", LABEL_VISIBILITY[labelVisibility])}
|
|
164
|
-
>
|
|
165
|
-
{label}
|
|
166
|
-
</Label>
|
|
167
|
-
);
|
|
168
|
-
return (
|
|
169
|
-
<div
|
|
170
|
-
data-slot="field"
|
|
171
|
-
className={cn(
|
|
172
|
-
// `content-start`: in a grid row next to a taller item (one with a hint), a
|
|
173
|
-
// stretched Field would hand the extra height to its rows — the label grew,
|
|
174
|
-
// and the control sat lower than its neighbour's (showcase audit, #/forms).
|
|
175
|
-
"grid content-start gap-1.5",
|
|
176
|
-
// A hidden label is `position: absolute`; `relative` keeps its containing
|
|
177
|
-
// block here rather than the page's (see sr-only-containment.test).
|
|
178
|
-
labelVisibility !== "visible" && "relative",
|
|
179
|
-
className,
|
|
180
|
-
)}
|
|
181
|
-
>
|
|
182
|
-
{helpMark === undefined && labelEl}
|
|
183
|
-
{helpMark !== undefined && (
|
|
184
|
-
// The label and its "?" on one line; the "?" stays visible where the label is
|
|
185
|
-
// hidden (`labelVisibility`) — a hidden button would still take the focus.
|
|
186
|
-
<div className="flex items-center gap-1">
|
|
187
|
-
{labelEl}
|
|
188
|
-
<span className="flex shrink-0 items-center">{helpMark}</span>
|
|
189
|
-
</div>
|
|
190
|
-
)}
|
|
191
|
-
{typeof children === "function"
|
|
192
|
-
? children(control, { labelId: label !== undefined ? labelId : undefined })
|
|
193
|
-
: children}
|
|
194
|
-
{hasHint && (
|
|
195
|
-
<p id={hintId} className="text-caption leading-tight text-muted">
|
|
196
|
-
{hint}
|
|
197
|
-
</p>
|
|
198
|
-
)}
|
|
199
|
-
{hasError && (
|
|
200
|
-
<p id={errorId} className="text-caption leading-tight text-danger">
|
|
201
|
-
{error}
|
|
202
|
-
</p>
|
|
203
|
-
)}
|
|
204
|
-
</div>
|
|
205
|
-
);
|
|
206
|
-
}
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import { useId, useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithoutRef, DragEvent, ReactNode, Ref } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { hasContent } from "../lib/presence";
|
|
5
|
-
import { useKitLabels } from "../i18n/kit-labels";
|
|
6
|
-
import { Button } from "./button";
|
|
7
|
-
import { Spinner } from "./spinner";
|
|
8
|
-
import { Tooltip } from "./tooltip";
|
|
9
|
-
import { useCommitReason, type CommitScope } from "./write-lock";
|
|
10
|
-
import { DEFAULT_FILE_PICKER_LABELS } from "../hooks/use-file-picker-labels";
|
|
11
|
-
import { useFilePicker, type UseFilePickerOptions } from "../hooks/use-file-picker";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A button that opens the file picker — the shape all three apps kept writing by hand
|
|
15
|
-
* as a `<Button>` plus a hidden `<input type="file">` plus a ref between them (seven
|
|
16
|
-
* copies in keksdose, two each in kastlan and lenkbank).
|
|
17
|
-
*
|
|
18
|
-
* Every copy had to remember the same four things, and each one forgot at least one:
|
|
19
|
-
*
|
|
20
|
-
* 1. **Reset the input after every pick.** A file input fires `change` only when its
|
|
21
|
-
* value CHANGES, so picking the same file twice in a row — the retry after a failed
|
|
22
|
-
* upload, the second photo of the same receipt — did nothing at all, which reads as
|
|
23
|
-
* a broken button. `value = ""` after each pick; always, not per call site.
|
|
24
|
-
* 2. **`type="button"`.** `<Button>` does not set it, and inside a form a bare button
|
|
25
|
-
* submits the form before the picker opens.
|
|
26
|
-
* 3. **Check the file.** `accept` filters the DIALOG, not the result: the dialog's
|
|
27
|
-
* "All files" switch, a drop, and a mobile share sheet all hand over whatever the
|
|
28
|
-
* user chose. So `accept` is re-checked here, along with `maxSize`, `maxFiles` and
|
|
29
|
-
* an optional `isValid`.
|
|
30
|
-
* 4. **Say no without a toast.** A rejection is reported through `onReject`, with a
|
|
31
|
-
* translated message per file, and spoken through a live region — the kit does not
|
|
32
|
-
* decide how an app surfaces errors (keksdose's proposal §1 asked for exactly that).
|
|
33
|
-
*
|
|
34
|
-
* The part that is not a button — the hidden input, the check, the announcement — is
|
|
35
|
-
* {@link useFilePicker}, for the case where the thing that opens the picker is someone
|
|
36
|
-
* else's control (a card's "Add" action, a menu item, a second button for the camera).
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
// The picker's words, its screening and `useFilePicker` live in hooks/use-file-picker
|
|
40
|
-
// since 0.34 (MOD-8, refactor audit 2026-10): useFileDrop is built on the hook, and a hook
|
|
41
|
-
// importing a component module was a folder-level back-edge. Re-exported here, so every
|
|
42
|
-
// import of them from this module keeps working.
|
|
43
|
-
export { DEFAULT_FILE_PICKER_LABELS };
|
|
44
|
-
export {
|
|
45
|
-
formatAccept,
|
|
46
|
-
judgePick,
|
|
47
|
-
matchesAccept,
|
|
48
|
-
screenFiles,
|
|
49
|
-
summariseRejections,
|
|
50
|
-
useFilePicker,
|
|
51
|
-
} from "../hooks/use-file-picker";
|
|
52
|
-
export type {
|
|
53
|
-
FilePickHandler,
|
|
54
|
-
FilePickerLabels,
|
|
55
|
-
FileRejection,
|
|
56
|
-
FileRejectionReason,
|
|
57
|
-
FileScreenOptions,
|
|
58
|
-
UseFilePickerOptions,
|
|
59
|
-
UseFilePickerReturn,
|
|
60
|
-
} from "../hooks/use-file-picker";
|
|
61
|
-
|
|
62
|
-
/* ── FileButton ──────────────────────────────────────────────────────────── */
|
|
63
|
-
|
|
64
|
-
type ButtonOwnProps = ComponentPropsWithoutRef<typeof Button>;
|
|
65
|
-
|
|
66
|
-
export interface FileButtonProps
|
|
67
|
-
extends
|
|
68
|
-
Omit<UseFilePickerOptions, "disabled">,
|
|
69
|
-
// `onDrop` & co. stay the caller's own when `droppable` is off; `type` is fixed to
|
|
70
|
-
// "button" (see 2. above) — a file trigger never submits a form.
|
|
71
|
-
Omit<ButtonOwnProps, "type" | "children" | "accept" | "capture" | "multiple"> {
|
|
72
|
-
/** The button's content — usually an icon and a word. It is the accessible name. */
|
|
73
|
-
children: ReactNode;
|
|
74
|
-
/** Busy: disabled, `aria-busy`, and a spinner before the content — for "uploading". */
|
|
75
|
-
pending?: boolean;
|
|
76
|
-
/** Also accept files dropped ON the button (lenkbank's "drop onto the button").
|
|
77
|
-
* Off by default: a button that silently takes drops is a surprise on a page that
|
|
78
|
-
* has a real drop target elsewhere. */
|
|
79
|
-
droppable?: boolean;
|
|
80
|
-
/**
|
|
81
|
-
* Show what was picked beside the button: the file's name, or "3 files selected"
|
|
82
|
-
* (`filePicker.selected`) for several — a native `<input type="file">` says this,
|
|
83
|
-
* and a bare button that takes a file and says nothing leaves the user to trust it.
|
|
84
|
-
* The read-out is a polite live region and describes the button, so it is heard
|
|
85
|
-
* when it changes and again on focus. It holds the last ACCEPTED pick: a refused
|
|
86
|
-
* file leaves it as it was. Off by default, so the button's layout is unchanged.
|
|
87
|
-
*/
|
|
88
|
-
showFileName?: boolean;
|
|
89
|
-
/**
|
|
90
|
-
* Why picking is not available — {@link Button}'s `disabledReason`, with the picker's
|
|
91
|
-
* half added (keksdose K3): the button is `aria-disabled` but stays focusable, the
|
|
92
|
-
* reason is in the kit Tooltip and its description, a click opens no picker, and a
|
|
93
|
-
* `droppable` button takes no drop (the drag is still cancelled, so the browser does
|
|
94
|
-
* not navigate to the file). Wins over `disabled`, as on Button.
|
|
95
|
-
*/
|
|
96
|
-
disabledReason?: ReactNode;
|
|
97
|
-
/**
|
|
98
|
-
* This pick COMMITS — an upload that starts on pick, an attachment saved at once.
|
|
99
|
-
* Under a locked {@link WriteLockProvider} it takes the `disabledReason` path with
|
|
100
|
-
* the lock's reason (which wins over one of its own). No provider, or an unlocked
|
|
101
|
-
* one: no effect. A picker that only fills a form the user saves later is not a
|
|
102
|
-
* commit, and is left live — the form's Save carries the lock.
|
|
103
|
-
*/
|
|
104
|
-
commit?: CommitScope;
|
|
105
|
-
/** The `<button>`. A React 19 ref prop since 0.34 (MOD-4, refactor audit 2026-10); it
|
|
106
|
-
* was `forwardRef`. */
|
|
107
|
-
ref?: Ref<HTMLButtonElement>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* {@link useFilePicker} behind a {@link Button}: `variant` and every other button prop
|
|
112
|
-
* pass through, and the ref is the `<button>` (so `ref.current.click()` opens the
|
|
113
|
-
* picker from elsewhere too).
|
|
114
|
-
*
|
|
115
|
-
* ```tsx
|
|
116
|
-
* <FileButton accept="image/*,application/pdf" capture="environment" variant="secondary"
|
|
117
|
-
* maxSize={10_000_000} onFiles={([f]) => upload(f)} onReject={([r]) => setError(r.message)}>
|
|
118
|
-
* <Camera aria-hidden /> Photograph receipt
|
|
119
|
-
* </FileButton>
|
|
120
|
-
* ```
|
|
121
|
-
*/
|
|
122
|
-
export function FileButton({
|
|
123
|
-
ref,
|
|
124
|
-
accept,
|
|
125
|
-
multiple,
|
|
126
|
-
capture,
|
|
127
|
-
maxSize,
|
|
128
|
-
maxFiles,
|
|
129
|
-
isValid,
|
|
130
|
-
invalidMessage,
|
|
131
|
-
onFiles,
|
|
132
|
-
onPick,
|
|
133
|
-
onReject,
|
|
134
|
-
labels,
|
|
135
|
-
pending,
|
|
136
|
-
droppable,
|
|
137
|
-
showFileName = false,
|
|
138
|
-
disabled,
|
|
139
|
-
disabledReason: ownDisabledReason,
|
|
140
|
-
commit,
|
|
141
|
-
children,
|
|
142
|
-
className,
|
|
143
|
-
onClick,
|
|
144
|
-
onDragEnter,
|
|
145
|
-
onDragOver,
|
|
146
|
-
onDragLeave,
|
|
147
|
-
onDrop,
|
|
148
|
-
...rest
|
|
149
|
-
}: FileButtonProps) {
|
|
150
|
-
const disabledReason = useCommitReason(commit, ownDisabledReason);
|
|
151
|
-
const locked = hasContent(disabledReason);
|
|
152
|
-
const inert = Boolean(disabled || pending);
|
|
153
|
-
// What takes no files: busy, disabled, or locked with a reason. Kept apart from
|
|
154
|
-
// `inert`, which is what reaches the button's NATIVE `disabled` — a locked button
|
|
155
|
-
// stays focusable (Button's `disabledReason` path), so `locked` must not get there.
|
|
156
|
-
const refusing = inert || locked;
|
|
157
|
-
const [picked, setPicked] = useState<readonly File[]>([]);
|
|
158
|
-
const pickedId = useId();
|
|
159
|
-
const pickerLabels = useKitLabels("filePicker", DEFAULT_FILE_PICKER_LABELS, labels);
|
|
160
|
-
const picker = useFilePicker({
|
|
161
|
-
accept,
|
|
162
|
-
multiple,
|
|
163
|
-
capture,
|
|
164
|
-
maxSize,
|
|
165
|
-
maxFiles,
|
|
166
|
-
isValid,
|
|
167
|
-
invalidMessage,
|
|
168
|
-
onFiles: showFileName
|
|
169
|
-
? (files) => {
|
|
170
|
-
setPicked(files);
|
|
171
|
-
onFiles?.(files);
|
|
172
|
-
}
|
|
173
|
-
: onFiles,
|
|
174
|
-
onPick,
|
|
175
|
-
onReject,
|
|
176
|
-
labels,
|
|
177
|
-
disabled: refusing,
|
|
178
|
-
});
|
|
179
|
-
const pickedText =
|
|
180
|
-
picked.length === 0
|
|
181
|
-
? ""
|
|
182
|
-
: picked.length === 1
|
|
183
|
-
? picked[0].name
|
|
184
|
-
: pickerLabels.selected(picked.length, picked[0].name);
|
|
185
|
-
const [dragOver, setDragOver] = useState(false);
|
|
186
|
-
|
|
187
|
-
const hasFiles = (e: DragEvent) => Array.from(e.dataTransfer?.types ?? []).includes("Files");
|
|
188
|
-
// Only when `droppable`: otherwise the caller's own handlers are passed untouched.
|
|
189
|
-
const dropHandlers = droppable
|
|
190
|
-
? {
|
|
191
|
-
onDragEnter: (e: DragEvent<HTMLButtonElement>) => {
|
|
192
|
-
onDragEnter?.(e);
|
|
193
|
-
if (!hasFiles(e)) return;
|
|
194
|
-
e.preventDefault();
|
|
195
|
-
if (!refusing) setDragOver(true);
|
|
196
|
-
},
|
|
197
|
-
onDragOver: (e: DragEvent<HTMLButtonElement>) => {
|
|
198
|
-
onDragOver?.(e);
|
|
199
|
-
if (!hasFiles(e)) return;
|
|
200
|
-
// Always cancel for a file drag, busy or not: an uncancelled drop makes the
|
|
201
|
-
// browser NAVIGATE to the file, which loses the page.
|
|
202
|
-
e.preventDefault();
|
|
203
|
-
e.dataTransfer.dropEffect = refusing ? "none" : "copy";
|
|
204
|
-
},
|
|
205
|
-
onDragLeave: (e: DragEvent<HTMLButtonElement>) => {
|
|
206
|
-
onDragLeave?.(e);
|
|
207
|
-
if (e.currentTarget.contains(e.relatedTarget as Node | null)) return;
|
|
208
|
-
setDragOver(false);
|
|
209
|
-
},
|
|
210
|
-
onDrop: (e: DragEvent<HTMLButtonElement>) => {
|
|
211
|
-
onDrop?.(e);
|
|
212
|
-
if (!hasFiles(e)) return;
|
|
213
|
-
e.preventDefault();
|
|
214
|
-
setDragOver(false);
|
|
215
|
-
picker.take(e.dataTransfer.files);
|
|
216
|
-
},
|
|
217
|
-
}
|
|
218
|
-
: { onDragEnter, onDragOver, onDragLeave, onDrop };
|
|
219
|
-
|
|
220
|
-
// `Button` is a plain function component; under React 19 `ref` is an ordinary prop
|
|
221
|
-
// and reaches the `<button>` through its `...rest`. Its props type just does not
|
|
222
|
-
// declare it, hence the widening here rather than a second button implementation.
|
|
223
|
-
const refProp = { ref } as { ref?: Ref<HTMLButtonElement> };
|
|
224
|
-
|
|
225
|
-
const button = (
|
|
226
|
-
<Button
|
|
227
|
-
{...rest}
|
|
228
|
-
{...refProp}
|
|
229
|
-
{...dropHandlers}
|
|
230
|
-
type="button"
|
|
231
|
-
disabled={inert}
|
|
232
|
-
// Resolved here rather than passed on as `commit`: the picker above has to know
|
|
233
|
-
// it is locked too, and one resolution keeps the two from disagreeing.
|
|
234
|
-
disabledReason={locked ? disabledReason : undefined}
|
|
235
|
-
aria-busy={pending || undefined}
|
|
236
|
-
aria-describedby={
|
|
237
|
-
showFileName && pickedText
|
|
238
|
-
? [rest["aria-describedby"], pickedId].filter(Boolean).join(" ")
|
|
239
|
-
: rest["aria-describedby"]
|
|
240
|
-
}
|
|
241
|
-
data-drag-over={dragOver || undefined}
|
|
242
|
-
className={cn(
|
|
243
|
-
// A live drag gets the focus ring's colour as a ring: "let go here", in the
|
|
244
|
-
// same vocabulary the button already uses for "you are here".
|
|
245
|
-
dragOver && "ring-2 ring-brand",
|
|
246
|
-
// Beside a long file name it is the NAME that gives way, never the button.
|
|
247
|
-
showFileName && "shrink-0",
|
|
248
|
-
className,
|
|
249
|
-
)}
|
|
250
|
-
onClick={(e) => {
|
|
251
|
-
onClick?.(e);
|
|
252
|
-
if (!e.defaultPrevented) picker.open();
|
|
253
|
-
}}
|
|
254
|
-
>
|
|
255
|
-
{/* `label={null}`: the spinner is decoration here — `aria-busy` says the same
|
|
256
|
-
thing on the button, and a spoken "Loading" would run into its name. */}
|
|
257
|
-
{pending && <Spinner label={null} className="size-4" />}
|
|
258
|
-
{children}
|
|
259
|
-
</Button>
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
if (!showFileName) {
|
|
263
|
-
return (
|
|
264
|
-
<>
|
|
265
|
-
{button}
|
|
266
|
-
{picker.element}
|
|
267
|
-
</>
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
return (
|
|
271
|
-
// One inline row, so the name sits beside the button wherever the button sits; the
|
|
272
|
-
// name truncates rather than pushing the row wider (at Normal: from Large up it wraps,
|
|
273
|
-
// `truncate-until-large`, text size §10.17), and the full list is in the
|
|
274
|
-
// kit's own Tooltip — not a native `title` (0.16.0 shipped one: the one-tooltip rule
|
|
275
|
-
// since keksdose dev#523, and a title never opens on touch). Lazy, so the closed
|
|
276
|
-
// bubble adds nothing to the read-out's text.
|
|
277
|
-
<span className="inline-flex max-w-full min-w-0 items-center gap-2">
|
|
278
|
-
{button}
|
|
279
|
-
{/* The live region is the OUTER span and never remounts: a Tooltip with an empty
|
|
280
|
-
label renders no wrapper, so wrapping the region itself would swap its element
|
|
281
|
-
the moment the first file arrives — and a fresh live region may not announce. */}
|
|
282
|
-
<span
|
|
283
|
-
id={pickedId}
|
|
284
|
-
aria-live="polite"
|
|
285
|
-
data-slot="file-button-name"
|
|
286
|
-
className="flex min-w-0 text-sm text-secondary"
|
|
287
|
-
>
|
|
288
|
-
<Tooltip label={picked.map((f) => f.name).join(", ")} lazy className="min-w-0">
|
|
289
|
-
<span className="block truncate-until-large">{pickedText}</span>
|
|
290
|
-
</Tooltip>
|
|
291
|
-
</span>
|
|
292
|
-
{picker.element}
|
|
293
|
-
</span>
|
|
294
|
-
);
|
|
295
|
-
}
|