@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,247 +0,0 @@
|
|
|
1
|
-
import { useId } from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { Checkbox } from "./checkbox";
|
|
5
|
-
import { hasContent } from "../lib/presence";
|
|
6
|
-
import { useCommitReason, type CommitScope } from "./write-lock";
|
|
7
|
-
import {
|
|
8
|
-
FIELD_ERROR_CLASS,
|
|
9
|
-
fieldHelpMark,
|
|
10
|
-
mergeDescribedBy,
|
|
11
|
-
RequiredStarOnLegend,
|
|
12
|
-
useInlineHint,
|
|
13
|
-
type FieldHelpProps,
|
|
14
|
-
} from "./field-parts";
|
|
15
|
-
|
|
16
|
-
/** One box of a {@link CheckboxGroup}. */
|
|
17
|
-
export interface CheckboxGroupOption<T extends string = string> {
|
|
18
|
-
value: T;
|
|
19
|
-
/** The words beside the box — its accessible name. */
|
|
20
|
-
label: ReactNode;
|
|
21
|
-
/** A line under the label ("Imprint, Privacy Policy and Terms only"), attached to the
|
|
22
|
-
* box with `aria-describedby` — {@link Checkbox}'s `description`. */
|
|
23
|
-
hint?: ReactNode;
|
|
24
|
-
/** This box cannot be changed; the others can. */
|
|
25
|
-
disabled?: boolean;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Whether the legend is drawn. `"sr-only"` keeps it as the group's name for a screen
|
|
29
|
-
* reader where the dialog's title already says it to the eye. */
|
|
30
|
-
export type CheckboxGroupLegendVisibility = "visible" | "sr-only";
|
|
31
|
-
|
|
32
|
-
export interface CheckboxGroupProps<T extends string = string> extends FieldHelpProps {
|
|
33
|
-
/** The question the boxes answer — the fieldset's `<legend>`, which names the group.
|
|
34
|
-
* Without one, pass `aria-label`. */
|
|
35
|
-
legend?: ReactNode;
|
|
36
|
-
/** Default `"visible"`. */
|
|
37
|
-
legendVisibility?: CheckboxGroupLegendVisibility;
|
|
38
|
-
"aria-label"?: string;
|
|
39
|
-
/** One box per option, in this order. */
|
|
40
|
-
options: CheckboxGroupOption<T>[];
|
|
41
|
-
/** The ticked values. Controlled. */
|
|
42
|
-
value: T[];
|
|
43
|
-
/**
|
|
44
|
-
* The new set on every tick. In the ORDER OF `options`, not the order the boxes were
|
|
45
|
-
* ticked, so a list saved from it does not change with the order someone clicked in
|
|
46
|
-
* (ChoiceCardGroup's rule). A value in `value` that no option carries — a grant for a
|
|
47
|
-
* locale the app no longer offers — is kept, after the known ones: a picker that
|
|
48
|
-
* dropped what it could not show would delete it on the next unrelated tick.
|
|
49
|
-
*/
|
|
50
|
-
onChange: (value: T[]) => void;
|
|
51
|
-
/**
|
|
52
|
-
* `"vertical"` (default): one box per line. `"horizontal"`: a wrapping row, for a few
|
|
53
|
-
* short labels. With `columns`, vertical becomes a grid of that many columns from the
|
|
54
|
-
* `sm` breakpoint up and stays one column on a phone — the reviewer dialog's shape.
|
|
55
|
-
*/
|
|
56
|
-
layout?: "vertical" | "horizontal";
|
|
57
|
-
/** Columns for a vertical group, from `sm` up (one on a phone). Default 1. */
|
|
58
|
-
columns?: 1 | 2 | 3 | 4;
|
|
59
|
-
/** Shared by every box — what a plain form submits the values under. */
|
|
60
|
-
name?: string;
|
|
61
|
-
/** Every box: the fieldset's own `disabled` (which disables them all natively), each
|
|
62
|
-
* box faded as a disabled Checkbox is, and the legend with them. */
|
|
63
|
-
disabled?: boolean;
|
|
64
|
-
/**
|
|
65
|
-
* At least one box must be ticked. Draws the required star after the legend, and puts
|
|
66
|
-
* the native `required` on every box while NONE is ticked — so a form refuses an
|
|
67
|
-
* empty set — and on none once one is (ChoiceCardGroup's rule: checkboxes cannot say
|
|
68
|
-
* "at least one" natively).
|
|
69
|
-
*/
|
|
70
|
-
required?: boolean;
|
|
71
|
-
/**
|
|
72
|
-
* Standing advice for the group, under the boxes, attached to the fieldset with
|
|
73
|
-
* `aria-describedby` before the error — the field anatomy every kit field keeps.
|
|
74
|
-
* A `help` beside it (0.36) is a "?" after the legend — with a visible legend only —
|
|
75
|
-
* and names nothing: the fieldset is then named by the legend's words alone.
|
|
76
|
-
*/
|
|
77
|
-
hint?: ReactNode;
|
|
78
|
-
/** What is wrong with the set, in the caller's words. Under the boxes, on the
|
|
79
|
-
* fieldset's `aria-describedby`, and paints every box invalid. */
|
|
80
|
-
error?: ReactNode;
|
|
81
|
-
/** Paints every box invalid without a message (the message lives elsewhere). */
|
|
82
|
-
invalid?: boolean;
|
|
83
|
-
/**
|
|
84
|
-
* The group SAVES on change — each tick is written straight away (a reviewer's
|
|
85
|
-
* per-locale grants). Under a locked {@link WriteLockProvider} every box is locked
|
|
86
|
-
* the focusable way with the lock's reason. See {@link Checkbox}'s `commit`.
|
|
87
|
-
*/
|
|
88
|
-
commit?: CommitScope;
|
|
89
|
-
/** Why no box can be changed — every box gets it, and it wins over `disabled` (the
|
|
90
|
-
* boxes stay focusable to say it). See {@link Checkbox}'s `disabledReason`. */
|
|
91
|
-
disabledReason?: ReactNode;
|
|
92
|
-
/** The fieldset's id. */
|
|
93
|
-
id?: string;
|
|
94
|
-
/** Classes for the fieldset — the outermost element, where layout belongs. */
|
|
95
|
-
className?: string;
|
|
96
|
-
/** Classes for the box list (the grid or the row). */
|
|
97
|
-
listClassName?: string;
|
|
98
|
-
/** Ids of something else on the page that describes the group; merged before the
|
|
99
|
-
* group's own hint and error. */
|
|
100
|
-
"aria-describedby"?: string;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Literal class strings so Tailwind's scanner sees each one.
|
|
104
|
-
const COLUMNS: Record<NonNullable<CheckboxGroupProps["columns"]>, string> = {
|
|
105
|
-
1: "flex flex-col gap-2",
|
|
106
|
-
2: "grid grid-cols-1 gap-2 sm:grid-cols-2",
|
|
107
|
-
3: "grid grid-cols-1 gap-2 sm:grid-cols-3",
|
|
108
|
-
4: "grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-4",
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* A set of kit {@link Checkbox}es answering one question, in a `<fieldset>`.
|
|
113
|
-
*
|
|
114
|
-
* Kurvenschmiede's reviewer dialog (features/admin/reviewer-dialog.tsx) builds this by
|
|
115
|
-
* hand — a fieldset, an `sr-only` legend, a grid of checkboxes, a `toggle(code, on)`
|
|
116
|
-
* that adds or filters a `string[]` — and keksdose's and kastlan's reviewer grants build
|
|
117
|
-
* the same picker for the same per-locale grant. The hand-built ones differ in the parts
|
|
118
|
-
* that are easy to get wrong: whether the legend names the group, whether a hint or an
|
|
119
|
-
* error is attached to anything, what order the saved list comes out in, and whether a
|
|
120
|
-
* value the picker cannot show survives a tick.
|
|
121
|
-
*
|
|
122
|
-
* Every box is a kit {@link Checkbox}, so the native checkbox semantics stay (each box
|
|
123
|
-
* submits under `name` in a plain form). The legend is the group's name; the hint and
|
|
124
|
-
* error describe the fieldset. For a choice of ONE, use radios ({@link ChoiceCardGroup},
|
|
125
|
-
* {@link ToggleGroup}).
|
|
126
|
-
*/
|
|
127
|
-
export function CheckboxGroup<T extends string = string>({
|
|
128
|
-
legend,
|
|
129
|
-
legendVisibility = "visible",
|
|
130
|
-
"aria-label": ariaLabel,
|
|
131
|
-
options,
|
|
132
|
-
value,
|
|
133
|
-
onChange,
|
|
134
|
-
layout = "vertical",
|
|
135
|
-
columns = 1,
|
|
136
|
-
name,
|
|
137
|
-
disabled,
|
|
138
|
-
required,
|
|
139
|
-
hint,
|
|
140
|
-
help,
|
|
141
|
-
error,
|
|
142
|
-
invalid,
|
|
143
|
-
commit,
|
|
144
|
-
disabledReason,
|
|
145
|
-
id,
|
|
146
|
-
className,
|
|
147
|
-
listClassName,
|
|
148
|
-
"aria-describedby": ariaDescribedBy,
|
|
149
|
-
}: CheckboxGroupProps<T>) {
|
|
150
|
-
const generated = useId();
|
|
151
|
-
const hintId = `${generated}-hint`;
|
|
152
|
-
const errorId = `${generated}-error`;
|
|
153
|
-
// §4: a FieldHint under the group is its words at Large and on a touch screen, not a
|
|
154
|
-
// lone "?" (DUP-2, refactor audit 2026-10). A HelpPopover stays a "?".
|
|
155
|
-
// A `help` "?" after a VISIBLE legend (0.36): the label line a group has. Its FieldHint
|
|
156
|
-
// hint is then its words at every size, as everywhere a help stands beside one.
|
|
157
|
-
const helpMark = fieldHelpMark(legend !== undefined && legendVisibility === "visible" ? help : undefined, legend);
|
|
158
|
-
const legendTextId = `${generated}-legend`;
|
|
159
|
-
const shownHint = useInlineHint(hint, helpMark !== undefined);
|
|
160
|
-
const showHint = hasContent(shownHint);
|
|
161
|
-
const showError = hasContent(error);
|
|
162
|
-
const isInvalid = Boolean(invalid) || showError;
|
|
163
|
-
const ticked = new Set(value);
|
|
164
|
-
// Resolved here rather than per box: a reason has to keep the fieldset from being
|
|
165
|
-
// natively `disabled` too, or it would take every box out of the tab order — the
|
|
166
|
-
// thing a reason exists to prevent.
|
|
167
|
-
const reason = useCommitReason(commit, disabledReason);
|
|
168
|
-
const locked = hasContent(reason);
|
|
169
|
-
|
|
170
|
-
const toggle = (v: T, on: boolean) => {
|
|
171
|
-
const next = new Set(value);
|
|
172
|
-
if (on) next.add(v);
|
|
173
|
-
else next.delete(v);
|
|
174
|
-
const known = new Set(options.map((o) => o.value));
|
|
175
|
-
onChange([
|
|
176
|
-
...options.map((o) => o.value).filter((x) => next.has(x)),
|
|
177
|
-
// Values no option carries, kept in their own order — see `onChange`.
|
|
178
|
-
...value.filter((x) => !known.has(x)),
|
|
179
|
-
]);
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<fieldset
|
|
184
|
-
id={id}
|
|
185
|
-
aria-label={ariaLabel}
|
|
186
|
-
// With a help "?" inside the legend, the legend's WORDS name the group: a legend
|
|
187
|
-
// names its fieldset by its whole content, the "?"'s "About …" included.
|
|
188
|
-
aria-labelledby={helpMark !== undefined && ariaLabel === undefined ? legendTextId : undefined}
|
|
189
|
-
aria-describedby={mergeDescribedBy(ariaDescribedBy, showHint && hintId, showError && errorId)}
|
|
190
|
-
disabled={disabled && !locked}
|
|
191
|
-
// `relative` holds an `sr-only` legend (sr-only-containment.test); `min-w-0`
|
|
192
|
-
// undoes a fieldset's `min-width: min-content`, which would otherwise push a long
|
|
193
|
-
// label past a phone's edge instead of wrapping it.
|
|
194
|
-
className={cn("relative m-0 min-w-0 border-0 p-0", className)}
|
|
195
|
-
>
|
|
196
|
-
{legend !== undefined && (
|
|
197
|
-
<legend
|
|
198
|
-
className={
|
|
199
|
-
legendVisibility === "sr-only"
|
|
200
|
-
? "sr-only"
|
|
201
|
-
: cn("mb-2 p-0 text-sm font-medium text-primary", (disabled || locked) && "opacity-60")
|
|
202
|
-
}
|
|
203
|
-
>
|
|
204
|
-
{helpMark === undefined ? legend : <span id={legendTextId}>{legend}</span>}
|
|
205
|
-
{required && (
|
|
206
|
-
<span aria-hidden className="ms-0.5 text-danger">
|
|
207
|
-
*
|
|
208
|
-
</span>
|
|
209
|
-
)}
|
|
210
|
-
{helpMark !== undefined && <span className="ms-1 inline-flex align-middle font-normal">{helpMark}</span>}
|
|
211
|
-
</legend>
|
|
212
|
-
)}
|
|
213
|
-
<RequiredStarOnLegend.Provider value={true}>
|
|
214
|
-
<div
|
|
215
|
-
className={cn(layout === "horizontal" ? "flex flex-wrap gap-x-4 gap-y-2" : COLUMNS[columns], listClassName)}
|
|
216
|
-
>
|
|
217
|
-
{options.map((o) => (
|
|
218
|
-
<Checkbox
|
|
219
|
-
key={o.value}
|
|
220
|
-
name={name}
|
|
221
|
-
value={o.value}
|
|
222
|
-
label={o.label}
|
|
223
|
-
description={o.hint}
|
|
224
|
-
checked={ticked.has(o.value)}
|
|
225
|
-
onCheckedChange={(on) => toggle(o.value, on)}
|
|
226
|
-
disabled={disabled || o.disabled}
|
|
227
|
-
invalid={isInvalid || undefined}
|
|
228
|
-
required={required && value.length === 0 ? true : undefined}
|
|
229
|
-
disabledReason={reason}
|
|
230
|
-
/>
|
|
231
|
-
))}
|
|
232
|
-
</div>
|
|
233
|
-
</RequiredStarOnLegend.Provider>
|
|
234
|
-
{showHint && (
|
|
235
|
-
// A `div`, not a `p`: a hint may be a node with a link in it.
|
|
236
|
-
<div id={hintId} className="mt-1.5 text-caption leading-tight text-muted">
|
|
237
|
-
{shownHint}
|
|
238
|
-
</div>
|
|
239
|
-
)}
|
|
240
|
-
{showError && (
|
|
241
|
-
<p id={errorId} className={FIELD_ERROR_CLASS}>
|
|
242
|
-
{error}
|
|
243
|
-
</p>
|
|
244
|
-
)}
|
|
245
|
-
</fieldset>
|
|
246
|
-
);
|
|
247
|
-
}
|
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
import { useCallback, useContext, useEffect, useId, useRef } from "react";
|
|
2
|
-
import { Check, Minus } from "lucide-react";
|
|
3
|
-
import type { ChangeEvent, InputHTMLAttributes, ReactNode, Ref } from "react";
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { hasContent } from "../lib/presence";
|
|
6
|
-
import {
|
|
7
|
-
assignRef,
|
|
8
|
-
DISABLED_REASON_LINE_CLASS,
|
|
9
|
-
FIELD_ERROR_CLASS,
|
|
10
|
-
LockedReason,
|
|
11
|
-
mergeDescribedBy,
|
|
12
|
-
RequiredStarOnLegend,
|
|
13
|
-
useDisabledReasonLine,
|
|
14
|
-
useLockReason,
|
|
15
|
-
type DisabledReasonDisplay,
|
|
16
|
-
} from "./field-parts";
|
|
17
|
-
import { FOCUS_RING } from "./focus-ring";
|
|
18
|
-
import type { CommitScope } from "./write-lock";
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* A checkbox that is still `<input type="checkbox">`.
|
|
22
|
-
*
|
|
23
|
-
* The three consuming apps had three answers: ~30 raw inputs in Keksdose leaning on
|
|
24
|
-
* `tokens.css`'s `accent-color`, a label-plus-box `CheckboxField` in Lenkbank, and a
|
|
25
|
-
* Radix `<button role="checkbox">` in Kastlan. The native element is the one that
|
|
26
|
-
* needs no ARIA to be a checkbox — it submits with its form, answers to `required`,
|
|
27
|
-
* resets with the form and takes a `<label for>` click — so it stays underneath, and
|
|
28
|
-
* only its paint is replaced (`appearance-none`, a token-coloured box, and a glyph
|
|
29
|
-
* laid over it that ignores the pointer so the click still lands on the input).
|
|
30
|
-
*
|
|
31
|
-
* `accent-color` alone was not enough: it tints the native box but cannot change its
|
|
32
|
-
* border, so an INVALID checkbox had no way to say so, and the unchecked box kept the
|
|
33
|
-
* browser's own grey outline in both themes.
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
// The box. 1rem (16px at Normal), like every raw checkbox it replaces, so a migration
|
|
37
|
-
// moves nothing; its corner `rounded` (0.25rem) rather than a fixed 4px, so it keeps its
|
|
38
|
-
// shape as it grows with the text (0.32, §3.2).
|
|
39
|
-
//
|
|
40
|
-
// The kit's focus frame (§5), with an offset in the surface colour: a --brand ring
|
|
41
|
-
// touching a --brand-filled (checked) box would be a ring painted in the colour it sits
|
|
42
|
-
// on — present in the DOM and invisible on screen. The offset is what separates the two.
|
|
43
|
-
const BOX =
|
|
44
|
-
"peer size-4 shrink-0 cursor-pointer appearance-none rounded border border-strong bg-surface shadow-sm transition-colors " +
|
|
45
|
-
"checked:border-brand checked:bg-brand " +
|
|
46
|
-
`focus:outline-none ${FOCUS_RING} focus-visible:ring-offset-1 focus-visible:ring-offset-surface ` +
|
|
47
|
-
"disabled:cursor-not-allowed";
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* The 48 px touch target at Large (0.32, §4) for a LABELLED box: the label's own hit
|
|
51
|
-
* area, an invisible `::after` that is part of the `<label>` — so a tap on it ticks the
|
|
52
|
-
* box through `for` — reaching back over the box and its gap (`-start-6`: 1rem + 0.5rem)
|
|
53
|
-
* and out to 48 px tall on a one-line label. It changes no layout; a label already taller
|
|
54
|
-
* than 48 px keeps its own box (`max(0px, …)`). A bare box has no label to grow, and
|
|
55
|
-
* takes its target from where it stands (a table row's tap, the caller's own label).
|
|
56
|
-
*/
|
|
57
|
-
const LABEL_TOUCH_LARGE =
|
|
58
|
-
"large:relative large:after:absolute large:after:-start-6 large:after:end-0 " +
|
|
59
|
-
"large:after:-inset-y-[max(0px,calc((48px-100%)/2))] large:after:content-['']";
|
|
60
|
-
|
|
61
|
-
// A mixed box wears the checked fill whether or not the underlying input is checked:
|
|
62
|
-
// `indeterminate` is a property the browser keeps separately from `checked`, and the
|
|
63
|
-
// dash means "some", which is neither answer.
|
|
64
|
-
const BOX_MIXED = "border-brand bg-brand";
|
|
65
|
-
|
|
66
|
-
// The same geometry as FIELD_INVALID — a border plus a 1px ring, so the highlight
|
|
67
|
-
// survives fractional display scaling on every edge (see the note on FIELD_BASE in field-base.tsx). The
|
|
68
|
-
// focus ring turns danger too, so focusing a wrong box does not repaint it as fine.
|
|
69
|
-
const BOX_INVALID =
|
|
70
|
-
"border-danger-strong ring-1 ring-danger-strong checked:border-danger-strong focus-visible:ring-[var(--danger)]";
|
|
71
|
-
|
|
72
|
-
export interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type"> {
|
|
73
|
-
/**
|
|
74
|
-
* The words beside the box. Rendered as a `<label for>` rather than a label that
|
|
75
|
-
* wraps the input, so `description` and `error` can sit under it without becoming
|
|
76
|
-
* part of the accessible NAME — a wrapping label would have the screen reader read
|
|
77
|
-
* the whole paragraph as the checkbox's name.
|
|
78
|
-
*/
|
|
79
|
-
label?: ReactNode;
|
|
80
|
-
/** Secondary text under the label ("Used when no account is chosen"). Pointed at by
|
|
81
|
-
* `aria-describedby`, merged with any the caller passed. Kastlan's
|
|
82
|
-
* `CheckboxField` `description` variant. */
|
|
83
|
-
description?: ReactNode;
|
|
84
|
-
/**
|
|
85
|
-
* "Some but not all" — the header box of a list whose rows are partly selected.
|
|
86
|
-
* A DOM property with no HTML attribute, so it is set on the element after every
|
|
87
|
-
* render; it does not touch `checked`, and a click clears it (the browser's rule,
|
|
88
|
-
* and the caller's `onChange` decides what the click means).
|
|
89
|
-
*/
|
|
90
|
-
indeterminate?: boolean;
|
|
91
|
-
/** See {@link Input}'s `invalid`: paints the box and sets `aria-invalid` together,
|
|
92
|
-
* so the two cannot be spelled separately. */
|
|
93
|
-
invalid?: boolean;
|
|
94
|
-
/** What is wrong, in the caller's words ("Accept the terms to continue"). Rendered
|
|
95
|
-
* under the label, attached with `aria-describedby`, and implies `invalid`. */
|
|
96
|
-
error?: ReactNode;
|
|
97
|
-
/** The checked state as a boolean — the `(next) => …` shape Lenkbank's
|
|
98
|
-
* `CheckboxField` and Radix's `onCheckedChange` both used, so a migration does not
|
|
99
|
-
* have to unwrap `event.target.checked` at every call site. Fires alongside
|
|
100
|
-
* `onChange`, never instead of it. */
|
|
101
|
-
onCheckedChange?: (checked: boolean) => void;
|
|
102
|
-
/** Classes for the `<input>` itself. `className` styles the OUTERMOST element —
|
|
103
|
-
* the row when there is a label, the box's own wrapper when there is not — which
|
|
104
|
-
* is where layout (`self-end pb-2` to sit on a field's baseline) belongs. */
|
|
105
|
-
inputClassName?: string;
|
|
106
|
-
/**
|
|
107
|
-
* Must be ticked to submit — a consent, an acceptance before paying. Reaches the
|
|
108
|
-
* `<input>` as the native `required` (so a `<form>` refuses to submit without it and a
|
|
109
|
-
* screen reader announces "required"), and draws the kit's required mark after the
|
|
110
|
-
* label, the same `aria-hidden` star as {@link Label}'s: the word is announced from
|
|
111
|
-
* the control, so a star inside the name would only be read out as noise. Write the
|
|
112
|
-
* label WITHOUT a literal "*". No mark without a label.
|
|
113
|
-
*/
|
|
114
|
-
required?: boolean;
|
|
115
|
-
/**
|
|
116
|
-
* Why the box cannot be changed — {@link Button}'s `disabledReason`, for a checkbox
|
|
117
|
-
* that SAVES on change (keksdose K3: a setting ticked straight into the server, kept
|
|
118
|
-
* behind a hand-rolled `SaveGuard` that forced a native `disabled` — out of the tab
|
|
119
|
-
* order, so the reason never reached a keyboard).
|
|
120
|
-
*
|
|
121
|
-
* With a reason the box is `aria-disabled` instead: still focusable, a click or Space
|
|
122
|
-
* changes nothing and fires no `onChange` / `onCheckedChange`, the reason is in the
|
|
123
|
-
* kit {@link Tooltip} on the box and on its `aria-describedby`, and the row fades as a
|
|
124
|
-
* disabled one does. It wins over `disabled`. Changing the lock mounts the box anew (it
|
|
125
|
-
* moves in or out of the Tooltip), as a locked Button is.
|
|
126
|
-
*/
|
|
127
|
-
disabledReason?: ReactNode;
|
|
128
|
-
/**
|
|
129
|
-
* Where `disabledReason` shows (0.32, §4 "No fact only in a tooltip"): by default, at
|
|
130
|
-
* Large and on a touch screen, as a line under the label (a bare box: under the box),
|
|
131
|
-
* and in the tooltip otherwise. See {@link DisabledReasonDisplay}.
|
|
132
|
-
*/
|
|
133
|
-
disabledReasonDisplay?: DisabledReasonDisplay;
|
|
134
|
-
/**
|
|
135
|
-
* This box COMMITS — ticking it saves. Under a locked {@link WriteLockProvider} it is
|
|
136
|
-
* locked the `disabledReason` way with the lock's reason (which wins over its own).
|
|
137
|
-
* No provider, or an unlocked one: no effect. Button's `commit`, for keksdose K3.
|
|
138
|
-
*/
|
|
139
|
-
commit?: CommitScope;
|
|
140
|
-
/** The `<input type="checkbox">`. A React 19 ref prop since 0.34 (MOD-4, refactor
|
|
141
|
-
* audit 2026-10); it was `forwardRef`. */
|
|
142
|
-
ref?: Ref<HTMLInputElement>;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* A native checkbox in the kit's tokens, with an optional label, description and
|
|
147
|
-
* error.
|
|
148
|
-
*
|
|
149
|
-
* Without `label`, `description` or `error` it renders the box and nothing else, so
|
|
150
|
-
* it drops into a table cell or a caller's own `<label>` exactly as the raw input
|
|
151
|
-
* did — give it an `aria-label` there. Every other prop reaches the `<input>`
|
|
152
|
-
* (`checked`, `defaultChecked`, `name`, `required`, `data-*`, `aria-*`), so it works
|
|
153
|
-
* controlled, uncontrolled, and inside a plain `<form>`.
|
|
154
|
-
*/
|
|
155
|
-
export function Checkbox({
|
|
156
|
-
ref,
|
|
157
|
-
label,
|
|
158
|
-
description,
|
|
159
|
-
indeterminate = false,
|
|
160
|
-
invalid,
|
|
161
|
-
error,
|
|
162
|
-
onCheckedChange,
|
|
163
|
-
onChange,
|
|
164
|
-
className,
|
|
165
|
-
inputClassName,
|
|
166
|
-
id,
|
|
167
|
-
disabled,
|
|
168
|
-
required,
|
|
169
|
-
disabledReason,
|
|
170
|
-
disabledReasonDisplay,
|
|
171
|
-
commit,
|
|
172
|
-
onClick,
|
|
173
|
-
...rest
|
|
174
|
-
}: CheckboxProps) {
|
|
175
|
-
const generated = useId();
|
|
176
|
-
const inputId = id ?? generated;
|
|
177
|
-
const lock = useLockReason(commit, disabledReason);
|
|
178
|
-
const locked = lock.locked;
|
|
179
|
-
const reasonLine = useDisabledReasonLine(disabledReasonDisplay);
|
|
180
|
-
// Locked is disabled the focusable way: the row fades and the words stop inviting a
|
|
181
|
-
// click exactly as they do for `disabled`.
|
|
182
|
-
const looksDisabled = Boolean(disabled) || locked;
|
|
183
|
-
// In a CheckboxGroup the legend carries the star; the box keeps `required` itself.
|
|
184
|
-
const starOnLegend = useContext(RequiredStarOnLegend);
|
|
185
|
-
const descriptionId = `${inputId}-description`;
|
|
186
|
-
const errorId = `${inputId}-error`;
|
|
187
|
-
const showError = hasContent(error);
|
|
188
|
-
const showDescription = hasContent(description);
|
|
189
|
-
const isInvalid = Boolean(invalid) || showError;
|
|
190
|
-
// Nothing to lay out beside the box: render the box alone, as the raw input was.
|
|
191
|
-
const bare = label === undefined && !showDescription && !showError;
|
|
192
|
-
|
|
193
|
-
const local = useRef<HTMLInputElement | null>(null);
|
|
194
|
-
const setRef = useCallback(
|
|
195
|
-
(node: HTMLInputElement | null) => {
|
|
196
|
-
local.current = node;
|
|
197
|
-
assignRef(ref, node);
|
|
198
|
-
},
|
|
199
|
-
[ref],
|
|
200
|
-
);
|
|
201
|
-
// After EVERY render, not only when the prop changes: a click clears the property
|
|
202
|
-
// in the DOM, and a controlled caller that keeps `indeterminate` true expects the
|
|
203
|
-
// dash back on the next render even though the prop never changed.
|
|
204
|
-
useEffect(() => {
|
|
205
|
-
if (local.current) local.current.indeterminate = indeterminate;
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
const control = (
|
|
209
|
-
<span className={cn("relative inline-flex shrink-0", bare && !locked && className)}>
|
|
210
|
-
<input
|
|
211
|
-
ref={setRef}
|
|
212
|
-
id={bare ? id : inputId}
|
|
213
|
-
// A reason wins over `disabled`, as on Button: the point of giving one is that
|
|
214
|
-
// the box stays reachable.
|
|
215
|
-
disabled={locked ? undefined : disabled}
|
|
216
|
-
required={required}
|
|
217
|
-
{...rest}
|
|
218
|
-
// After the spread, like Switch: a props object spread at a checkbox must not
|
|
219
|
-
// be able to turn it into something else.
|
|
220
|
-
type="checkbox"
|
|
221
|
-
aria-disabled={locked || rest["aria-disabled"] || undefined}
|
|
222
|
-
// OR-ed with the spread so a caller's own `aria-invalid` survives — Input's rule.
|
|
223
|
-
aria-invalid={isInvalid || rest["aria-invalid"] || undefined}
|
|
224
|
-
aria-describedby={mergeDescribedBy(
|
|
225
|
-
rest["aria-describedby"],
|
|
226
|
-
showDescription && descriptionId,
|
|
227
|
-
locked && lock.reasonId,
|
|
228
|
-
showError && errorId,
|
|
229
|
-
)}
|
|
230
|
-
// A locked box's click is swallowed, as a locked Button's is.
|
|
231
|
-
onClick={locked ? undefined : onClick}
|
|
232
|
-
onChange={(e: ChangeEvent<HTMLInputElement>) => {
|
|
233
|
-
if (locked) {
|
|
234
|
-
// Put the tick back, and report nothing. Undone here rather than by
|
|
235
|
-
// cancelling the click: a cancelled click is reverted by the browser AFTER
|
|
236
|
-
// React has restored a controlled box, and jsdom reverts it by toggling, which
|
|
237
|
-
// turned a restored tick back over (the suites the apps run would have seen a
|
|
238
|
-
// locked box change). Setting the property also keeps React's own record of
|
|
239
|
-
// the value in step, so an uncontrolled box reports its next real change.
|
|
240
|
-
// Covers a click on the label and Space too — both arrive as a click.
|
|
241
|
-
e.currentTarget.checked = !e.currentTarget.checked;
|
|
242
|
-
e.currentTarget.indeterminate = indeterminate;
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
onChange?.(e);
|
|
246
|
-
onCheckedChange?.(e.target.checked);
|
|
247
|
-
}}
|
|
248
|
-
className={cn(
|
|
249
|
-
BOX,
|
|
250
|
-
indeterminate && BOX_MIXED,
|
|
251
|
-
isInvalid && BOX_INVALID,
|
|
252
|
-
locked && "cursor-not-allowed",
|
|
253
|
-
inputClassName,
|
|
254
|
-
)}
|
|
255
|
-
/>
|
|
256
|
-
{/* The glyph is drawn over the box, not inside it (an input has no children),
|
|
257
|
-
and ignores the pointer so a click on the tick still toggles the input. The
|
|
258
|
-
tick is shown by `peer-checked`, so an UNCONTROLLED box shows it too; the
|
|
259
|
-
dash replaces it outright while `indeterminate` holds. */}
|
|
260
|
-
{indeterminate ? (
|
|
261
|
-
<Minus
|
|
262
|
-
aria-hidden
|
|
263
|
-
strokeWidth={3}
|
|
264
|
-
className="pointer-events-none absolute inset-0 m-auto size-3 text-brand-contrast"
|
|
265
|
-
/>
|
|
266
|
-
) : (
|
|
267
|
-
<Check
|
|
268
|
-
aria-hidden
|
|
269
|
-
strokeWidth={3}
|
|
270
|
-
className="pointer-events-none invisible absolute inset-0 m-auto size-3 text-brand-contrast peer-checked:visible"
|
|
271
|
-
/>
|
|
272
|
-
)}
|
|
273
|
-
</span>
|
|
274
|
-
);
|
|
275
|
-
// The reason's Tooltip goes round the BOX, not the row: the row is the caller's
|
|
276
|
-
// layout (`className`), and a wrapper round it would move that into a span. A bare
|
|
277
|
-
// box hands its `className` to the wrapper, which is then the outermost element.
|
|
278
|
-
// With words beside it, the reason LINE goes under them instead (Switch's shape).
|
|
279
|
-
const lineInWords = locked && reasonLine && !bare;
|
|
280
|
-
const box =
|
|
281
|
-
locked && !lineInWords ? (
|
|
282
|
-
<LockedReason lock={lock} line={reasonLine} className={cn("shrink-0", bare && className)}>
|
|
283
|
-
{control}
|
|
284
|
-
</LockedReason>
|
|
285
|
-
) : (
|
|
286
|
-
control
|
|
287
|
-
);
|
|
288
|
-
// The row's fade moves onto its parts while the reason line is in it, as on Switch.
|
|
289
|
-
const dimParts = lineInWords;
|
|
290
|
-
|
|
291
|
-
if (bare) return box;
|
|
292
|
-
|
|
293
|
-
return (
|
|
294
|
-
<div
|
|
295
|
-
className={cn(
|
|
296
|
-
// `items-start` + a 1.25rem cell for the box: the box centres on the label's FIRST
|
|
297
|
-
// line (text-sm's line is 1.25rem), so a label that wraps keeps the box at the top
|
|
298
|
-
// rather than floating to the middle of a paragraph.
|
|
299
|
-
"flex items-start gap-2",
|
|
300
|
-
// The whole row fades, the way ToggleGroup and the fields do, so the label does
|
|
301
|
-
// not stay at full strength beside a box you cannot change.
|
|
302
|
-
looksDisabled && !dimParts && "opacity-60",
|
|
303
|
-
className,
|
|
304
|
-
)}
|
|
305
|
-
>
|
|
306
|
-
<span className={cn("flex h-5 shrink-0 items-center", dimParts && "opacity-60")}>{box}</span>
|
|
307
|
-
<span className="min-w-0">
|
|
308
|
-
{label !== undefined && (
|
|
309
|
-
<label
|
|
310
|
-
htmlFor={inputId}
|
|
311
|
-
className={cn(
|
|
312
|
-
"block text-sm leading-5 text-primary",
|
|
313
|
-
// `select-none`: a double-click to toggle twice would otherwise select the
|
|
314
|
-
// words, and a drag that starts on them starts a native text drag.
|
|
315
|
-
looksDisabled ? "cursor-not-allowed" : "cursor-pointer select-none",
|
|
316
|
-
LABEL_TOUCH_LARGE,
|
|
317
|
-
dimParts && "opacity-60",
|
|
318
|
-
)}
|
|
319
|
-
>
|
|
320
|
-
{label}
|
|
321
|
-
{required && !starOnLegend && (
|
|
322
|
-
<span aria-hidden className="ms-0.5 text-danger">
|
|
323
|
-
*
|
|
324
|
-
</span>
|
|
325
|
-
)}
|
|
326
|
-
</label>
|
|
327
|
-
)}
|
|
328
|
-
{showDescription && (
|
|
329
|
-
<span id={descriptionId} className={cn("mt-0.5 block text-xs text-muted", dimParts && "opacity-60")}>
|
|
330
|
-
{description}
|
|
331
|
-
</span>
|
|
332
|
-
)}
|
|
333
|
-
{lineInWords && (
|
|
334
|
-
<span id={lock.reasonId} className={DISABLED_REASON_LINE_CLASS}>
|
|
335
|
-
{lock.reason}
|
|
336
|
-
</span>
|
|
337
|
-
)}
|
|
338
|
-
{showError && (
|
|
339
|
-
<span id={errorId} className={cn("block", FIELD_ERROR_CLASS)}>
|
|
340
|
-
{error}
|
|
341
|
-
</span>
|
|
342
|
-
)}
|
|
343
|
-
</span>
|
|
344
|
-
</div>
|
|
345
|
-
);
|
|
346
|
-
}
|