@eifi1/ui-kit 0.54.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 +90 -76
- 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/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.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 +2 -2
- 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-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js +2 -2
- 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-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 +3 -1
- 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 +13 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +23 -2
- package/dist/components/modal.js +24 -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/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/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-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-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 +1 -10
- 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 +75 -3
- 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 +92 -4
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +71 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +72 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +74 -3
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +74 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +71 -3
- 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 +24 -5
- package/dist/index.js +35 -1
- 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 +29 -3
- package/dist/lib/dates.js +41 -12
- 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/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/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 -342
- 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 -439
- 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 -816
- 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 -600
- 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 -188
- package/src/components/currency-select.tsx +0 -343
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -987
- 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 -289
- package/src/components/data-table-filters.ts +0 -315
- 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 -284
- 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 -792
- package/src/components/modal.tsx +0 -534
- 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 -559
- 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 -754
- 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 -90
- 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 -11
- package/src/feedback/feedback-context.tsx +0 -245
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-diagnostics.tsx +0 -41
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -452
- 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 -428
- 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 -31
- package/src/feedback/feedback-row-detail.tsx +0 -871
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -131
- package/src/feedback/feedback-submit.tsx +0 -270
- 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 -212
- 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 -2059
- 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 -1999
- package/src/i18n/locales/fr.ts +0 -2037
- package/src/i18n/locales/hu.ts +0 -2004
- package/src/i18n/locales/it.ts +0 -2014
- package/src/i18n/locales/zh.ts +0 -1912
- 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 -1191
- 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 -288
- 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 -585
- 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 -27
- 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 -769
- 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
package/src/rhf/form-core.tsx
DELETED
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The react-hook-form adapter: the five parts every bound field is built from, and the
|
|
3
|
-
* hook they share. Behind `@eifi1/ui-kit/rhf`, which exports `Form` alone of them.
|
|
4
|
-
*
|
|
5
|
-
* The kit's own module since 0.34 (refactor audit 2026-10, API-6f): the bound `Rhf*`
|
|
6
|
-
* fields and `RhfField` build on these parts, and import them from here. ./form is the
|
|
7
|
-
* public face — `Form`; the parts left the public surface in 0.35 (deprecated in 0.34),
|
|
8
|
-
* when no app imported them any more.
|
|
9
|
-
*
|
|
10
|
-
* ```tsx
|
|
11
|
-
* <Form {...form}>
|
|
12
|
-
* <FormField control={form.control} name="amount" render={({ field }) => (
|
|
13
|
-
* <FormItem>
|
|
14
|
-
* <FormLabel required>Amount</FormLabel>
|
|
15
|
-
* <FormControl>
|
|
16
|
-
* <NumberField value={field.value} onCommit={field.onChange} />
|
|
17
|
-
* </FormControl>
|
|
18
|
-
* <FormMessage />
|
|
19
|
-
* </FormItem>
|
|
20
|
-
* )} />
|
|
21
|
-
* </Form>
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* The shape is shadcn's `form.tsx`, on purpose: Kastlan builds every form from that
|
|
25
|
-
* file, so moving onto this one is an import line rather than a rewrite. What differs
|
|
26
|
-
* is what the shadcn file gets wrong:
|
|
27
|
-
*
|
|
28
|
-
* - **`aria-describedby` names only what is on screen.** shadcn always points the
|
|
29
|
-
* control at a description id, rendered or not, and at the message id whenever the
|
|
30
|
-
* field has an error, whether a message was rendered for it or not. A reference to
|
|
31
|
-
* a node that does not exist describes the field as nothing. Here the description
|
|
32
|
-
* and the message say when they are mounted, and the control points at exactly
|
|
33
|
-
* those.
|
|
34
|
-
* - **Merged, never replaced.** A control that already carries its own
|
|
35
|
-
* `aria-describedby` keeps it, first — the same rule as the kit's `error` prop
|
|
36
|
-
* (see `useFieldError` in components/field-parts.tsx).
|
|
37
|
-
* - **No Radix.** `FormControl` is a one-child `cloneElement`, not `Slot`, and the
|
|
38
|
-
* label is the kit's own `Label` — the kit carries no Radix dependency and this
|
|
39
|
-
* entry is not the place to start.
|
|
40
|
-
*
|
|
41
|
-
* ## Why this is its own entry
|
|
42
|
-
*
|
|
43
|
-
* The main barrel once shipped a react-hook-form hook (`use-rhf-wizard-step`) and
|
|
44
|
-
* removed it: it made react-hook-form an install every consumer's typecheck paid for,
|
|
45
|
-
* for a hook nobody called (see the wizard section of src/index.ts). This is the
|
|
46
|
-
* answer to that, not a reversal of it. Nothing outside `src/rhf*` imports
|
|
47
|
-
* react-hook-form — `__tests__/packaging-contract.test.ts` holds that — and the peer is
|
|
48
|
-
* optional, so an app that does not use it installs nothing and imports nothing.
|
|
49
|
-
*
|
|
50
|
-
* ## Painting the field
|
|
51
|
-
*
|
|
52
|
-
* `FormControl` sets `aria-invalid` on its child. `NumberField` and the pickers paint
|
|
53
|
-
* from that attribute; `Input`, `Select` and `Textarea` paint only from their
|
|
54
|
-
* `invalid` prop (see its note in components/field-base.tsx: a bare attribute announces but
|
|
55
|
-
* does not paint), so pass it from the render prop —
|
|
56
|
-
* `<Input {...field} invalid={fieldState.invalid} />`. `FormControl` does not inject
|
|
57
|
-
* `invalid` itself because its child may be a native element, which would print it
|
|
58
|
-
* into the DOM as an unknown attribute.
|
|
59
|
-
*
|
|
60
|
-
* ## Clearing a picker: `null`, unless the picker is told otherwise
|
|
61
|
-
*
|
|
62
|
-
* Nothing here touches a value. `FormField` is `Controller`, so what a control hands
|
|
63
|
-
* `field.onChange` is exactly what lands in the form — and what the entity pickers
|
|
64
|
-
* hand it on a clear is `null`: `EntityCombobox`'s "×", `InlineEntityCombobox`'s "×"
|
|
65
|
-
* and its emptied text. (`MultiEntityCombobox` and `MultiSelect` clear to `[]`.)
|
|
66
|
-
*
|
|
67
|
-
* A zod schema that spells "no choice" as `""` (`z.string()`, or `z.literal("")` in a
|
|
68
|
-
* union) then fails on the `null`. Say so on the PICKER, not here:
|
|
69
|
-
*
|
|
70
|
-
* ```tsx
|
|
71
|
-
* <EntityCombobox clearValue="" value={field.value} onChange={field.onChange} … />
|
|
72
|
-
* ```
|
|
73
|
-
*
|
|
74
|
-
* `clearValue` also types `onChange` (`(v: V | "") => void` rather than
|
|
75
|
-
* `V | null`) and reads `""` back as "nothing selected", so an initial `defaultValues`
|
|
76
|
-
* of `""` shows the placeholder rather than an unresolvable id. The adapter does not
|
|
77
|
-
* coerce because it cannot see the schema: mapping `null` to `""` for every field
|
|
78
|
-
* would break every schema that wants `null` (`z.string().nullable()`), which is the
|
|
79
|
-
* pickers' default for a reason — it is the one value no option can have.
|
|
80
|
-
*/
|
|
81
|
-
import {
|
|
82
|
-
Children,
|
|
83
|
-
cloneElement,
|
|
84
|
-
createContext,
|
|
85
|
-
isValidElement,
|
|
86
|
-
useCallback,
|
|
87
|
-
useContext,
|
|
88
|
-
useId,
|
|
89
|
-
useLayoutEffect,
|
|
90
|
-
useMemo,
|
|
91
|
-
useState,
|
|
92
|
-
type ComponentProps,
|
|
93
|
-
type ReactElement,
|
|
94
|
-
} from "react";
|
|
95
|
-
import {
|
|
96
|
-
Controller,
|
|
97
|
-
FormProvider,
|
|
98
|
-
useFormContext,
|
|
99
|
-
useFormState,
|
|
100
|
-
type ControllerProps,
|
|
101
|
-
type FieldPath,
|
|
102
|
-
type FieldValues,
|
|
103
|
-
} from "react-hook-form";
|
|
104
|
-
import { Label, type LabelProps } from "../components/field-base";
|
|
105
|
-
import { cn } from "../lib/cn";
|
|
106
|
-
|
|
107
|
-
/** The form's `useForm()` return, spread in: `<Form {...form}>`. react-hook-form's own
|
|
108
|
-
* `FormProvider`, under the name the shadcn file gave it. */
|
|
109
|
-
export const Form = FormProvider;
|
|
110
|
-
|
|
111
|
-
// ── contexts ─────────────────────────────────────────────────────────────────
|
|
112
|
-
|
|
113
|
-
const FormFieldContext = createContext<{ name: string } | null>(null);
|
|
114
|
-
|
|
115
|
-
/** The two optional nodes a control can be described by. */
|
|
116
|
-
type Described = "description" | "message";
|
|
117
|
-
|
|
118
|
-
interface FormItemContextValue {
|
|
119
|
-
id: string;
|
|
120
|
-
mounted: Record<Described, boolean>;
|
|
121
|
-
mark: (slot: Described, on: boolean) => void;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const FormItemContext = createContext<FormItemContextValue | null>(null);
|
|
125
|
-
|
|
126
|
-
// ── FormField ────────────────────────────────────────────────────────────────
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* react-hook-form's `Controller`, with the field's name put in context for the parts
|
|
130
|
-
* below it. Takes exactly `Controller`'s props.
|
|
131
|
-
*/
|
|
132
|
-
export function FormField<
|
|
133
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
134
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
135
|
-
TTransformedValues = TFieldValues,
|
|
136
|
-
>(props: ControllerProps<TFieldValues, TName, TTransformedValues>) {
|
|
137
|
-
const value = useMemo(() => ({ name: props.name as string }), [props.name]);
|
|
138
|
-
return (
|
|
139
|
-
<FormFieldContext.Provider value={value}>
|
|
140
|
-
<Controller {...props} />
|
|
141
|
-
</FormFieldContext.Provider>
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// ── useFormField ─────────────────────────────────────────────────────────────
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* The ids and the state of the field around the caller: for a part of your own that
|
|
149
|
-
* sits beside the kit's (a character counter that belongs in `aria-describedby`, a
|
|
150
|
-
* label with a different look).
|
|
151
|
-
*
|
|
152
|
-
* Throws outside a `FormField` + `FormItem` pair. shadcn's version answered there with
|
|
153
|
-
* ids like `undefined-form-item`, which label nothing and fail nowhere.
|
|
154
|
-
*/
|
|
155
|
-
export function useFormField() {
|
|
156
|
-
const field = useContext(FormFieldContext);
|
|
157
|
-
const item = useContext(FormItemContext);
|
|
158
|
-
if (!field) throw new Error("useFormField must be used inside <FormField>.");
|
|
159
|
-
if (!item) throw new Error("useFormField must be used inside <FormItem>.");
|
|
160
|
-
const { getFieldState } = useFormContext();
|
|
161
|
-
// Subscribes this part to the field's state, so a label or message re-renders when
|
|
162
|
-
// the field's error changes without the whole form doing so.
|
|
163
|
-
const formState = useFormState({ name: field.name });
|
|
164
|
-
const state = getFieldState(field.name, formState);
|
|
165
|
-
const formDescriptionId = `${item.id}-description`;
|
|
166
|
-
const formMessageId = `${item.id}-message`;
|
|
167
|
-
const describedBy = [item.mounted.description && formDescriptionId, item.mounted.message && formMessageId]
|
|
168
|
-
.filter(Boolean)
|
|
169
|
-
.join(" ");
|
|
170
|
-
return {
|
|
171
|
-
id: item.id,
|
|
172
|
-
name: field.name,
|
|
173
|
-
formItemId: `${item.id}-control`,
|
|
174
|
-
formDescriptionId,
|
|
175
|
-
formMessageId,
|
|
176
|
-
/** The ids of the description and message that are actually rendered, or
|
|
177
|
-
* `undefined` when neither is. */
|
|
178
|
-
describedBy: describedBy || undefined,
|
|
179
|
-
...state,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// ── FormItem ─────────────────────────────────────────────────────────────────
|
|
184
|
-
|
|
185
|
-
export type FormItemProps = ComponentProps<"div">;
|
|
186
|
-
|
|
187
|
-
/** One field's box: mints the id its label, control, description and message share. */
|
|
188
|
-
export function FormItem({ className, ...rest }: FormItemProps) {
|
|
189
|
-
const id = useId();
|
|
190
|
-
const [mounted, setMounted] = useState<Record<Described, boolean>>({
|
|
191
|
-
description: false,
|
|
192
|
-
message: false,
|
|
193
|
-
});
|
|
194
|
-
const mark = useCallback(
|
|
195
|
-
(slot: Described, on: boolean) => setMounted((prev) => (prev[slot] === on ? prev : { ...prev, [slot]: on })),
|
|
196
|
-
[],
|
|
197
|
-
);
|
|
198
|
-
const value = useMemo(() => ({ id, mounted, mark }), [id, mounted, mark]);
|
|
199
|
-
return (
|
|
200
|
-
<FormItemContext.Provider value={value}>
|
|
201
|
-
{/* `content-start`: stretched to a taller neighbour's height in a grid row, the
|
|
202
|
-
item gave the extra to its rows and its control sat lower (showcase audit). */}
|
|
203
|
-
<div data-slot="form-item" {...rest} className={cn("grid content-start gap-1", className)} />
|
|
204
|
-
</FormItemContext.Provider>
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/** Report a describing node's presence to the item, so the control points at it only
|
|
209
|
-
* while it is on screen. A layout effect, so the reference lands before paint. */
|
|
210
|
-
function useDescribes(slot: Described, on: boolean) {
|
|
211
|
-
const item = useContext(FormItemContext);
|
|
212
|
-
const mark = item?.mark;
|
|
213
|
-
useLayoutEffect(() => {
|
|
214
|
-
if (!on || !mark) return;
|
|
215
|
-
mark(slot, true);
|
|
216
|
-
return () => mark(slot, false);
|
|
217
|
-
}, [slot, on, mark]);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// ── FormLabel ────────────────────────────────────────────────────────────────
|
|
221
|
-
|
|
222
|
-
export type FormLabelProps = LabelProps;
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* The kit's {@link Label}, bound to the control by `htmlFor` and turned to the danger
|
|
226
|
-
* colour while the field is invalid. `required` draws the kit's `aria-hidden` mark:
|
|
227
|
-
* whether the field is required is the control's to announce.
|
|
228
|
-
*/
|
|
229
|
-
export function FormLabel({ className, ...rest }: FormLabelProps) {
|
|
230
|
-
const { error, formItemId } = useFormField();
|
|
231
|
-
return (
|
|
232
|
-
<Label
|
|
233
|
-
data-slot="form-label"
|
|
234
|
-
data-error={error ? true : undefined}
|
|
235
|
-
htmlFor={formItemId}
|
|
236
|
-
{...rest}
|
|
237
|
-
className={cn("data-[error=true]:text-danger", className)}
|
|
238
|
-
/>
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// ── FormControl ──────────────────────────────────────────────────────────────
|
|
243
|
-
|
|
244
|
-
export interface FormControlProps {
|
|
245
|
-
/** Exactly one element: the kit field, or a native one. It receives `id`,
|
|
246
|
-
* `aria-describedby` and `aria-invalid`. */
|
|
247
|
-
children: ReactElement;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
type AriaProps = {
|
|
251
|
-
id?: string;
|
|
252
|
-
"aria-describedby"?: string;
|
|
253
|
-
"aria-invalid"?: ComponentProps<"input">["aria-invalid"];
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Wires its one child to the item: the `id` the label points at, `aria-describedby`
|
|
258
|
-
* naming the rendered description and message, and `aria-invalid` while the field has
|
|
259
|
-
* an error.
|
|
260
|
-
*
|
|
261
|
-
* The child's own values win where it has them (an explicit `id`, a set
|
|
262
|
-
* `aria-invalid`), as they did under Radix `Slot`; its own `aria-describedby` is
|
|
263
|
-
* merged in front of the item's rather than replaced.
|
|
264
|
-
*/
|
|
265
|
-
export function FormControl({ children }: FormControlProps) {
|
|
266
|
-
const { invalid, formItemId, describedBy } = useFormField();
|
|
267
|
-
const child = Children.only(children);
|
|
268
|
-
if (!isValidElement<AriaProps>(child)) return child;
|
|
269
|
-
const own = child.props;
|
|
270
|
-
const merged = [own["aria-describedby"], describedBy].filter(Boolean).join(" ");
|
|
271
|
-
return cloneElement(child, {
|
|
272
|
-
id: own.id ?? formItemId,
|
|
273
|
-
"aria-describedby": merged || undefined,
|
|
274
|
-
"aria-invalid": own["aria-invalid"] ?? (invalid || undefined),
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// ── FormDescription / FormMessage ────────────────────────────────────────────
|
|
279
|
-
|
|
280
|
-
export type FormDescriptionProps = ComponentProps<"p">;
|
|
281
|
-
|
|
282
|
-
/** Standing advice under the field ("at least twelve characters"). */
|
|
283
|
-
export function FormDescription({ className, ...rest }: FormDescriptionProps) {
|
|
284
|
-
const { formDescriptionId } = useFormField();
|
|
285
|
-
useDescribes("description", true);
|
|
286
|
-
return (
|
|
287
|
-
<p
|
|
288
|
-
data-slot="form-description"
|
|
289
|
-
{...rest}
|
|
290
|
-
id={formDescriptionId}
|
|
291
|
-
className={cn("text-caption leading-tight text-muted", className)}
|
|
292
|
-
/>
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
export type FormMessageProps = ComponentProps<"p">;
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* The field's error message, from the form — the kit renders no string of its own
|
|
300
|
-
* here; the schema or the `rules` carry the words. Without an error it renders its
|
|
301
|
-
* `children`, if any, and otherwise nothing.
|
|
302
|
-
*
|
|
303
|
-
* Deliberately NOT `role="alert"`, for the reason the kit's `error` prop gives: the
|
|
304
|
-
* message is read when focus reaches the control, which is where a field's own error
|
|
305
|
-
* is wanted, and an alert would interrupt on every keystroke of a form that
|
|
306
|
-
* re-validates as you type.
|
|
307
|
-
*/
|
|
308
|
-
export function FormMessage({ className, children, ...rest }: FormMessageProps) {
|
|
309
|
-
const { error, formMessageId } = useFormField();
|
|
310
|
-
const body = error ? String(error.message ?? "") : children;
|
|
311
|
-
const shown = body !== undefined && body !== null && body !== false && body !== "";
|
|
312
|
-
useDescribes("message", shown);
|
|
313
|
-
if (!shown) return null;
|
|
314
|
-
return (
|
|
315
|
-
<p
|
|
316
|
-
data-slot="form-message"
|
|
317
|
-
{...rest}
|
|
318
|
-
id={formMessageId}
|
|
319
|
-
className={cn("text-caption leading-tight text-danger", className)}
|
|
320
|
-
>
|
|
321
|
-
{body}
|
|
322
|
-
</p>
|
|
323
|
-
);
|
|
324
|
-
}
|
package/src/rhf/form.tsx
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `Form` — the public face of ./form-core, where the shadcn scaffold the bound fields are
|
|
3
|
-
* built from lives (its header has the whole story: what differs from shadcn's file, why
|
|
4
|
-
* /rhf is its own entry, how a picker clears).
|
|
5
|
-
*
|
|
6
|
-
* The scaffold itself (`FormField`, `useFormField`, `FormItem`, `FormLabel`, `FormControl`,
|
|
7
|
-
* `FormDescription`, `FormMessage` and five props types) was public until 0.35 (refactor
|
|
8
|
-
* audit 2026-10, API-6f; deprecated in 0.34): no app builds a form from it any more.
|
|
9
|
-
* kastlan, the one /rhf consumer, uses `Form`, the bound `Rhf*` fields and `RhfField` for
|
|
10
|
-
* a control of its own — the same parts, folded into one element.
|
|
11
|
-
*/
|
|
12
|
-
export { Form } from "./form-core";
|
package/src/rhf/line-items.tsx
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* {@link LineItems} over react-hook-form's `useFieldArray`. `@eifi1/ui-kit/rhf`.
|
|
3
|
-
*
|
|
4
|
-
* ```tsx
|
|
5
|
-
* <RhfLineItems
|
|
6
|
-
* name="components"
|
|
7
|
-
* newItem={() => ({ type: "net_rent", amount: null, validFrom: "" })}
|
|
8
|
-
* minItems={1}
|
|
9
|
-
* columns={[
|
|
10
|
-
* { key: "type", header: "Type", render: ({ name, label }) => (
|
|
11
|
-
* <RhfSelect name={`${name}.type`} options={TYPES} aria-label={label} />
|
|
12
|
-
* ) },
|
|
13
|
-
* { key: "amount", header: "Amount", width: "8rem", align: "end", render: ({ name, label }) => (
|
|
14
|
-
* <RhfMoneyField name={`${name}.amount`} aria-label={label} />
|
|
15
|
-
* ) },
|
|
16
|
-
* ]}
|
|
17
|
-
* totals={{ amount: formatMoney(total) }}
|
|
18
|
-
* />
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* The rows are the array's `fields` (keyed by their `id`, as react-hook-form asks),
|
|
22
|
-
* Add appends `newItem()`, remove is `remove(index)`, and an error on the array
|
|
23
|
-
* itself — the `rules` here, or a resolver's `lines: "At least two lines"` — is the
|
|
24
|
-
* list's `error`. Each cell's `render` gets `name`, the row's path
|
|
25
|
-
* (`"components.2"`), to bind its field to.
|
|
26
|
-
*
|
|
27
|
-
* `summary`, `fieldLabels`, `narrowColumns`, `removePlacement` and `removeAlign` pass
|
|
28
|
-
* through to {@link LineItems}. With
|
|
29
|
-
* `fieldLabels="floating"` a cell's `fieldLabel` is the column's name; the bound
|
|
30
|
-
* fields' own `label` is a label ABOVE the control, so for the floating
|
|
31
|
-
* one render the kit field through `RhfField`:
|
|
32
|
-
* `render={({ field, invalid }) => <Input label={fieldLabel} aria-label={label} {...field} invalid={invalid} />}`.
|
|
33
|
-
*/
|
|
34
|
-
import type { ReactNode } from "react";
|
|
35
|
-
import {
|
|
36
|
-
useFieldArray,
|
|
37
|
-
useFormState,
|
|
38
|
-
type FieldArray,
|
|
39
|
-
type FieldArrayPath,
|
|
40
|
-
type FieldArrayWithId,
|
|
41
|
-
type FieldValues,
|
|
42
|
-
type UseFieldArrayProps,
|
|
43
|
-
} from "react-hook-form";
|
|
44
|
-
import {
|
|
45
|
-
LineItems,
|
|
46
|
-
type LineItemCellContext,
|
|
47
|
-
type LineItemsColumn,
|
|
48
|
-
type LineItemsProps,
|
|
49
|
-
} from "../components/line-items";
|
|
50
|
-
|
|
51
|
-
/** A cell's context, with the row's path in the form. */
|
|
52
|
-
export interface RhfLineItemCellContext<TItem, TArrayName extends string> extends LineItemCellContext<TItem> {
|
|
53
|
-
/** The row's path: `${name}.${index}` — bind the cell's field to
|
|
54
|
-
* `` `${name}.amount` ``. */
|
|
55
|
-
name: `${TArrayName}.${number}`;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export interface RhfLineItemsColumn<TItem, TArrayName extends string> extends Omit<LineItemsColumn<TItem>, "render"> {
|
|
59
|
-
render: (ctx: RhfLineItemCellContext<TItem, TArrayName>) => ReactNode;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface RhfLineItemsProps<
|
|
63
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
64
|
-
TArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
|
|
65
|
-
TTransformed = TFieldValues,
|
|
66
|
-
> extends Omit<
|
|
67
|
-
LineItemsProps<FieldArrayWithId<TFieldValues, TArrayName, "id">>,
|
|
68
|
-
"items" | "columns" | "onAdd" | "onRemove" | "getKey"
|
|
69
|
-
> {
|
|
70
|
-
name: TArrayName;
|
|
71
|
-
/** `form.control`. Optional under `<Form {...form}>`. */
|
|
72
|
-
control?: UseFieldArrayProps<TFieldValues, TArrayName, "id", TTransformed>["control"];
|
|
73
|
-
/** `useFieldArray`'s `rules` (`minLength`, `validate` …); its message is the list's
|
|
74
|
-
* error. */
|
|
75
|
-
rules?: UseFieldArrayProps<TFieldValues, TArrayName, "id", TTransformed>["rules"];
|
|
76
|
-
columns: readonly RhfLineItemsColumn<FieldArrayWithId<TFieldValues, TArrayName, "id">, TArrayName>[];
|
|
77
|
-
/** A new row's values. Omitted: no add button. */
|
|
78
|
-
newItem?: () => FieldArray<TFieldValues, TArrayName>;
|
|
79
|
-
/** `false`: no remove buttons. Default `true`. */
|
|
80
|
-
removable?: boolean;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** The message of an error at `path` in react-hook-form's errors tree: the array's
|
|
84
|
-
* own (`root`, from `rules`) or one a resolver put on the array. */
|
|
85
|
-
function arrayError(errors: unknown, path: string): string | undefined {
|
|
86
|
-
let node: unknown = errors;
|
|
87
|
-
for (const key of path.split(".")) {
|
|
88
|
-
if (node === null || typeof node !== "object") return undefined;
|
|
89
|
-
node = (node as Record<string, unknown>)[key];
|
|
90
|
-
}
|
|
91
|
-
if (node === null || typeof node !== "object") return undefined;
|
|
92
|
-
const { root, message } = node as { root?: { message?: unknown }; message?: unknown };
|
|
93
|
-
const text = root?.message ?? message;
|
|
94
|
-
return typeof text === "string" && text !== "" ? text : undefined;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/** {@link LineItems} bound to a field array. See the module note. */
|
|
98
|
-
export function RhfLineItems<
|
|
99
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
100
|
-
TArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,
|
|
101
|
-
TTransformed = TFieldValues,
|
|
102
|
-
>({
|
|
103
|
-
name,
|
|
104
|
-
control,
|
|
105
|
-
rules,
|
|
106
|
-
columns,
|
|
107
|
-
newItem,
|
|
108
|
-
removable = true,
|
|
109
|
-
error,
|
|
110
|
-
...rest
|
|
111
|
-
}: RhfLineItemsProps<TFieldValues, TArrayName, TTransformed>) {
|
|
112
|
-
const { fields, append, remove } = useFieldArray<TFieldValues, TArrayName, "id", TTransformed>({
|
|
113
|
-
control,
|
|
114
|
-
name,
|
|
115
|
-
rules,
|
|
116
|
-
});
|
|
117
|
-
const { errors } = useFormState({ control, name: name as never });
|
|
118
|
-
const bound: LineItemsColumn<FieldArrayWithId<TFieldValues, TArrayName, "id">>[] = columns.map(
|
|
119
|
-
({ render, ...column }) => ({
|
|
120
|
-
...column,
|
|
121
|
-
render: (ctx) => render({ ...ctx, name: `${name}.${ctx.index}` as `${TArrayName}.${number}` }),
|
|
122
|
-
}),
|
|
123
|
-
);
|
|
124
|
-
return (
|
|
125
|
-
<LineItems
|
|
126
|
-
{...rest}
|
|
127
|
-
items={fields}
|
|
128
|
-
columns={bound}
|
|
129
|
-
getKey={(field) => field.id}
|
|
130
|
-
onAdd={newItem ? () => append(newItem()) : undefined}
|
|
131
|
-
onRemove={removable ? (index) => remove(index) : undefined}
|
|
132
|
-
error={error ?? arrayError(errors, name)}
|
|
133
|
-
/>
|
|
134
|
-
);
|
|
135
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The bridge between a react-hook-form step and the wizard's Next gate.
|
|
3
|
-
* `@eifi1/ui-kit/rhf`.
|
|
4
|
-
*
|
|
5
|
-
* ```tsx
|
|
6
|
-
* function AddressStep({ onUpdate }: { onUpdate: (v: Address) => void }) {
|
|
7
|
-
* const form = useForm<Address>({ defaultValues });
|
|
8
|
-
* useRhfWizardStep(form, { onValid: onUpdate });
|
|
9
|
-
* return <Form {...form}>…</Form>;
|
|
10
|
-
* }
|
|
11
|
-
* ```
|
|
12
|
-
*
|
|
13
|
-
* Inside a `<StepperNav>` the hook registers the step's validator with the wizard, so
|
|
14
|
-
* Next (and Finish on a form-bearing last step) runs it: on success the values go to
|
|
15
|
-
* `onValid` and the wizard advances; on failure the bound fields show their inline
|
|
16
|
-
* messages, react-hook-form focuses the first field in error, and the wizard stays
|
|
17
|
-
* put — and, since the result carries no per-field errors, says its "fill in the
|
|
18
|
-
* required fields" line so the button did not seem to do nothing. It also RETURNS the
|
|
19
|
-
* validator, for a nav of your own outside `<StepperNav>` (where there is no wizard
|
|
20
|
-
* context to register with, so nothing is registered).
|
|
21
|
-
*
|
|
22
|
-
* Two modes:
|
|
23
|
-
*
|
|
24
|
-
* - **The whole form** (no `fields`): `form.handleSubmit`, exactly as kastlan's
|
|
25
|
-
* `use-rhf-wizard-step.ts` — every rule and the resolver run, `onValid` receives
|
|
26
|
-
* the TRANSFORMED values (a zod `.transform()` included), and focus follows the
|
|
27
|
-
* form's own `shouldFocusError` (on by default).
|
|
28
|
-
* - **Some fields** (`fields: ["iban", "bic"]`): `form.trigger(fields)`, for a wizard
|
|
29
|
-
* that keeps one form across several steps, each of which validates only what it
|
|
30
|
-
* shows. The first of those fields in error is focused (`shouldFocus`; the control
|
|
31
|
-
* has to take `field.ref`), errors on fields of later steps are not raised, and
|
|
32
|
-
* `onValid` receives `form.getValues()` — the untransformed values, because a
|
|
33
|
-
* resolver's output is only produced for the whole form.
|
|
34
|
-
*
|
|
35
|
-
* Both callbacks are read through refs, so the validator is registered once per form
|
|
36
|
-
* however the caller writes them (an inline `(v) => onUpdate(v)` is the usual case).
|
|
37
|
-
*
|
|
38
|
-
* The positional `useRhfWizardStep(form, onValid)` of the hook kastlan kept is the
|
|
39
|
-
* whole-form mode, and still accepted.
|
|
40
|
-
*
|
|
41
|
-
* Why it lives here and not in `@eifi1/ui-kit/wizard`: it imports react-hook-form,
|
|
42
|
-
* which only this entry may (see packaging-contract).
|
|
43
|
-
*/
|
|
44
|
-
import { useCallback, useEffect, useRef } from "react";
|
|
45
|
-
import type { FieldPath, FieldValues, UseFormReturn } from "react-hook-form";
|
|
46
|
-
import { useOptionalWizardContext } from "../wizard/wizard-context";
|
|
47
|
-
|
|
48
|
-
export type RhfWizardStepOptions<TFieldValues extends FieldValues, TTransformed = TFieldValues> =
|
|
49
|
-
| {
|
|
50
|
-
/** Validate only these fields — the step's share of a form that spans steps. */
|
|
51
|
-
fields: readonly FieldPath<TFieldValues>[];
|
|
52
|
-
/** Called with `form.getValues()` when the fields pass, before the wizard
|
|
53
|
-
* advances. */
|
|
54
|
-
onValid?: (values: TFieldValues) => void;
|
|
55
|
-
}
|
|
56
|
-
| {
|
|
57
|
-
/** Omitted: validate the whole form through `handleSubmit`. */
|
|
58
|
-
fields?: undefined;
|
|
59
|
-
/** Called with the form's (transformed) values when it passes, before the
|
|
60
|
-
* wizard advances. */
|
|
61
|
-
onValid?: (values: TTransformed) => void;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Connects `form` to the wizard's step validation and returns the step's validator.
|
|
66
|
-
* See the module note for the two modes.
|
|
67
|
-
*/
|
|
68
|
-
export function useRhfWizardStep<TFieldValues extends FieldValues, TContext = unknown, TTransformed = TFieldValues>(
|
|
69
|
-
form: UseFormReturn<TFieldValues, TContext, TTransformed>,
|
|
70
|
-
options?: RhfWizardStepOptions<TFieldValues, TTransformed> | ((values: TTransformed) => void),
|
|
71
|
-
): () => Promise<boolean> {
|
|
72
|
-
const opts = typeof options === "function" ? { onValid: options } : (options ?? {});
|
|
73
|
-
const optsRef = useRef(opts);
|
|
74
|
-
useEffect(() => {
|
|
75
|
-
optsRef.current = opts;
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
const validate = useCallback(async (): Promise<boolean> => {
|
|
79
|
-
const current = optsRef.current;
|
|
80
|
-
if (current.fields) {
|
|
81
|
-
const ok = await form.trigger([...current.fields], { shouldFocus: true });
|
|
82
|
-
if (ok) current.onValid?.(form.getValues());
|
|
83
|
-
return ok;
|
|
84
|
-
}
|
|
85
|
-
const onValid = current.onValid as ((values: TTransformed) => void) | undefined;
|
|
86
|
-
let ok = false;
|
|
87
|
-
await form.handleSubmit(
|
|
88
|
-
(values) => {
|
|
89
|
-
ok = true;
|
|
90
|
-
onValid?.(values);
|
|
91
|
-
},
|
|
92
|
-
() => {
|
|
93
|
-
ok = false;
|
|
94
|
-
},
|
|
95
|
-
)();
|
|
96
|
-
return ok;
|
|
97
|
-
}, [form]);
|
|
98
|
-
|
|
99
|
-
const wizard = useOptionalWizardContext();
|
|
100
|
-
const register = wizard?.registerStepValidate;
|
|
101
|
-
useEffect(() => register?.(validate), [register, validate]);
|
|
102
|
-
|
|
103
|
-
return validate;
|
|
104
|
-
}
|
package/src/rhf.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// `@eifi1/ui-kit/rhf` — the react-hook-form adapter: Form and the bound Rhf* fields (and
|
|
2
|
-
// RhfField as the escape hatch). The shadcn scaffold they are built from (FormField,
|
|
3
|
-
// FormItem, FormLabel, FormControl, FormDescription, FormMessage, useFormField) left the
|
|
4
|
-
// surface in 0.35 (refactor audit 2026-10, API-6f; deprecated in 0.34).
|
|
5
|
-
//
|
|
6
|
-
// The only entry point in the package that requires `react-hook-form`, and an optional
|
|
7
|
-
// peer for that reason: an app without a form library installs nothing for it. NOT
|
|
8
|
-
// re-exported from the main barrel, which would make the peer everyone's — the reason
|
|
9
|
-
// the barrel dropped its last react-hook-form import (see the wizard section of
|
|
10
|
-
// src/index.ts). The packaging contract test holds that line.
|
|
11
|
-
export * from "./rhf/form";
|
|
12
|
-
// The react-hook-form bridge to the wizard's Next gate (useWizard lives in /wizard).
|
|
13
|
-
export * from "./rhf/use-rhf-wizard-step";
|
|
14
|
-
// Bound fields — one line per field (RhfTextField, RhfNumberField, RhfIntegerField, RhfMoneyField,
|
|
15
|
-
// RhfDateField, RhfTextarea, RhfSelect, RhfCheckbox, RhfCombobox, RhfTextCombobox; 0.22: RhfTimeInput,
|
|
16
|
-
// RhfDateRangePicker, RhfToggleGroup, RhfIbanInput, RhfPhoneInput; 0.23: RhfCountrySelect,
|
|
17
|
-
// RhfMonthPicker; 0.24: RhfInlineEntityCombobox)
|
|
18
|
-
// and RhfField, the shell they are built on.
|
|
19
|
-
export * from "./rhf/fields";
|
|
20
|
-
// LineItems over useFieldArray.
|
|
21
|
-
export * from "./rhf/line-items";
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// The English words of ./command-palette, in a module with no component code: the English
|
|
2
|
-
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
|
-
// chunk like the other languages (0.34, KS U8). ./command-palette re-exports them.
|
|
4
|
-
|
|
5
|
-
import type { CommandPaletteLabels } from "./command-palette";
|
|
6
|
-
|
|
7
|
-
export const DEFAULT_COMMAND_PALETTE_LABELS: CommandPaletteLabels = {
|
|
8
|
-
placeholder: "Search…",
|
|
9
|
-
empty: "No results",
|
|
10
|
-
loading: "Searching…",
|
|
11
|
-
dialog: "Search",
|
|
12
|
-
error: "Search failed. Try again.",
|
|
13
|
-
clear: "Clear search",
|
|
14
|
-
submit: "Search",
|
|
15
|
-
close: "Close",
|
|
16
|
-
};
|