@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,602 +0,0 @@
|
|
|
1
|
-
import { useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef, CSSProperties, HTMLAttributes, KeyboardEvent, Key, ReactNode } from "react";
|
|
3
|
-
import { Plus, Trash2 } from "lucide-react";
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { hasContent } from "../lib/presence";
|
|
6
|
-
import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
|
|
7
|
-
import { Button } from "./button";
|
|
8
|
-
import { IconButton } from "./icon-button";
|
|
9
|
-
import { DEFAULT_LINE_ITEMS_LABELS } from "./line-items-labels";
|
|
10
|
-
|
|
11
|
-
/** The words {@link LineItems} renders on its own behalf. Row numbers are 1-based. */
|
|
12
|
-
export interface LineItemsLabels {
|
|
13
|
-
/** The dashed add button. */
|
|
14
|
-
add: string;
|
|
15
|
-
/** The remove button's name for one row. */
|
|
16
|
-
remove: (row: number) => string;
|
|
17
|
-
/** Its name while it waits for the second press (`confirmRemove`). */
|
|
18
|
-
confirmRemove: (row: number) => string;
|
|
19
|
-
/** A row's group name, when the caller gives no `rowLabel`. */
|
|
20
|
-
row: (row: number) => string;
|
|
21
|
-
/** The name a cell's field should carry: the column, and which row. */
|
|
22
|
-
cell: (column: string, row: number) => string;
|
|
23
|
-
/** The totals row's label, and its group name. */
|
|
24
|
-
totals: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Defined in ./line-items-labels, which holds no component code (0.34, KS U8).
|
|
28
|
-
export { DEFAULT_LINE_ITEMS_LABELS };
|
|
29
|
-
|
|
30
|
-
/** What a column's `render` receives for one row. */
|
|
31
|
-
export interface LineItemCellContext<T> {
|
|
32
|
-
item: T;
|
|
33
|
-
/** 0-based. */
|
|
34
|
-
index: number;
|
|
35
|
-
/** The accessible name for the cell's field — "Debit, row 2". The header is
|
|
36
|
-
* hidden from assistive tech (each row repeats it), so the field has to carry it:
|
|
37
|
-
* `<Input aria-label={label} … />`. */
|
|
38
|
-
label: string;
|
|
39
|
-
/** The column's own name ("Debit") for the field's VISIBLE label — set only when the
|
|
40
|
-
* cell's labels are `"floating"` (see {@link LineItemsProps.fieldLabels}), so one
|
|
41
|
-
* render serves both modes: `<Input label={fieldLabel} aria-label={label} … />`.
|
|
42
|
-
* Undefined there, the Input stays a bare compact control; set, it floats "Debit"
|
|
43
|
-
* while `aria-label` still says which row. */
|
|
44
|
-
fieldLabel?: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** How a cell's field is labelled. `aria`: the field is a bare control named by
|
|
48
|
-
* `aria-label`, under a header row (stacked: a small copy of the header over it).
|
|
49
|
-
* `floating`: the field shows its own floating label ({@link LineItemCellContext.fieldLabel}),
|
|
50
|
-
* so the list draws no header for it. */
|
|
51
|
-
export type LineItemsFieldLabels = "aria" | "floating";
|
|
52
|
-
|
|
53
|
-
/** The colour of a {@link LineItemsSummary}'s value — a verdict (`success` /
|
|
54
|
-
* `danger`), quiet (`muted`), or the money pair (`income` / `expense`, the colours
|
|
55
|
-
* `SignedAmount` draws a figure in) for a remainder that reads as the row it settles. */
|
|
56
|
-
export type LineItemsSummaryTone = "neutral" | "success" | "danger" | "muted" | "income" | "expense";
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* A line under the lines that says where they stand — a split's remainder ("Left to
|
|
60
|
-
* assign CHF 0.00", green at zero, red otherwise, muted while the total is not known
|
|
61
|
-
* yet), with an optional action that settles it ("Set amount to total").
|
|
62
|
-
*/
|
|
63
|
-
export interface LineItemsSummary {
|
|
64
|
-
label: ReactNode;
|
|
65
|
-
value?: ReactNode;
|
|
66
|
-
/** The value's colour. Default `neutral`. The label stays neutral: the colour is a
|
|
67
|
-
* second signal, never the only one — the value and label carry the meaning.
|
|
68
|
-
* With no `value` the line is a state on its own ("Waiting for the total"), and
|
|
69
|
-
* the tone colours the label instead — `muted` quiets the whole line. */
|
|
70
|
-
tone?: LineItemsSummaryTone;
|
|
71
|
-
/** Beside the value: a chip or badge that names the state ("Balanced" next to a
|
|
72
|
-
* journal entry's zero difference). */
|
|
73
|
-
status?: ReactNode;
|
|
74
|
-
/** A small button at the end of the line. Disabled along with the list's
|
|
75
|
-
* `disabled`. `variant`: `secondary` (default) is a boxed button; `link` a muted
|
|
76
|
-
* text link, for an action that is an aside rather than the way to settle it. */
|
|
77
|
-
action?: { label: ReactNode; onClick: () => void; disabled?: boolean; variant?: "secondary" | "link" };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** Where a row's remove button sits. `row` (default): stacked, a row of the card to
|
|
81
|
-
* itself (paired, the whole width); wide, its own track. `inline`: stacked, beside
|
|
82
|
-
* the row's last field ("category + amount" over "memo + delete"); wide, unchanged. */
|
|
83
|
-
export type LineItemsRemovePlacement = "row" | "inline";
|
|
84
|
-
|
|
85
|
-
/** How the remove button sits in the height of a wide row: at its top, centred, or at
|
|
86
|
-
* its foot. */
|
|
87
|
-
export type LineItemsRemoveAlign = "start" | "center" | "end";
|
|
88
|
-
|
|
89
|
-
export interface LineItemsColumn<T> {
|
|
90
|
-
/** Stable id: the React key, and the key into `totals`. */
|
|
91
|
-
key: string;
|
|
92
|
-
/** The column header (and the small label over the cell once the rows stack). */
|
|
93
|
-
header: ReactNode;
|
|
94
|
-
/** The column's name for {@link LineItemCellContext.label}, when `header` is not a
|
|
95
|
-
* string. */
|
|
96
|
-
label?: string;
|
|
97
|
-
/** The grid track once the rows are wide enough to be a table. Default
|
|
98
|
-
* `minmax(0,1fr)`; `"7rem"` for an amount. */
|
|
99
|
-
width?: string;
|
|
100
|
-
/** `end` for figures: the header and the totals cell end-align with the field. */
|
|
101
|
-
align?: "start" | "end";
|
|
102
|
-
/** This column's labelling, over the list's {@link LineItemsProps.fieldLabels} — a
|
|
103
|
-
* read-only "Sum" cell in a floating list keeps its header with `"aria"`. */
|
|
104
|
-
fieldLabels?: LineItemsFieldLabels;
|
|
105
|
-
/** With {@link LineItemsProps.narrowColumns} `2`: `2` gives the cell a whole row of
|
|
106
|
-
* the stacked card (a description), where short fields pair up two to a row.
|
|
107
|
-
* Default `1`. No effect on the wide grid. */
|
|
108
|
-
narrowSpan?: 1 | 2;
|
|
109
|
-
render: (ctx: LineItemCellContext<T>) => ReactNode;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* What {@link LineItemsProps.rowProps} returns for one row: `data-*` hooks, an `id`, a
|
|
114
|
-
* class, handlers. A `data-*` attribute is typed so `{ "data-tour": "rule-condition" }`
|
|
115
|
-
* needs no cast.
|
|
116
|
-
*/
|
|
117
|
-
export type LineItemsRowProps = Omit<
|
|
118
|
-
HTMLAttributes<HTMLDivElement>,
|
|
119
|
-
"children" | "dangerouslySetInnerHTML" | "role"
|
|
120
|
-
> & {
|
|
121
|
-
[key: `data-${string}`]: string | number | boolean | undefined;
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
export interface LineItemsProps<T> extends Omit<ComponentPropsWithRef<"div">, "children"> {
|
|
125
|
-
items: readonly T[];
|
|
126
|
-
columns: readonly LineItemsColumn<T>[];
|
|
127
|
-
/** The row's React key. Default: the item's `id` (react-hook-form's `useFieldArray`
|
|
128
|
-
* `fields` carry one), else its index. */
|
|
129
|
-
getKey?: (item: T, index: number) => Key;
|
|
130
|
-
/** Append a row. Omitted: no add button. The first field of the new row is focused. */
|
|
131
|
-
onAdd?: () => void;
|
|
132
|
-
/** Remove the row at `index`. Omitted: no remove buttons. */
|
|
133
|
-
onRemove?: (index: number) => void;
|
|
134
|
-
/** Remove is disabled at or below this many rows (a journal entry needs two).
|
|
135
|
-
* Default 0. */
|
|
136
|
-
minItems?: number;
|
|
137
|
-
/** Add is disabled at this many rows. */
|
|
138
|
-
maxItems?: number;
|
|
139
|
-
/**
|
|
140
|
-
* Ask before a row goes:
|
|
141
|
-
* - `true`: the remove button asks for a second press — it fills red and its name
|
|
142
|
-
* becomes `lineItems.confirmRemove`; Escape, or leaving it, calls it off.
|
|
143
|
-
* - a function: called with the row, and the row goes only if it answers `true`
|
|
144
|
-
* (`(item, i) => confirm({ title: … , tone: "danger" })` with `useConfirm`).
|
|
145
|
-
*/
|
|
146
|
-
confirmRemove?: boolean | ((item: T, index: number) => boolean | Promise<boolean>);
|
|
147
|
-
/** The add button's text. Default `lineItems.add`. */
|
|
148
|
-
addLabel?: ReactNode;
|
|
149
|
-
/** A row's group name ("Line 2"). Default `lineItems.row`. */
|
|
150
|
-
rowLabel?: (index: number, item: T) => string;
|
|
151
|
-
/** A totals row under the lines, one entry per column `key`. The first column
|
|
152
|
-
* without an entry carries {@link totalsLabel}. Omitted: no totals row. */
|
|
153
|
-
totals?: Partial<Record<string, ReactNode>>;
|
|
154
|
-
/** Default `lineItems.totals`, "Total". */
|
|
155
|
-
totalsLabel?: ReactNode;
|
|
156
|
-
/** Shown in place of the rows when there are none. */
|
|
157
|
-
empty?: ReactNode;
|
|
158
|
-
/** A message about the list as a whole ("The entry does not balance"). */
|
|
159
|
-
error?: ReactNode;
|
|
160
|
-
/** A line under the lines and totals — the remainder of a split, say. See
|
|
161
|
-
* {@link LineItemsSummary}. */
|
|
162
|
-
summary?: LineItemsSummary;
|
|
163
|
-
/** How the cells' fields are labelled. Default `aria` (compact bare controls under a
|
|
164
|
-
* header row); `floating` hands each cell its column's name as
|
|
165
|
-
* {@link LineItemCellContext.fieldLabel} for a visible floating label, and drops the
|
|
166
|
-
* header for those columns. A column's own `fieldLabels` wins. */
|
|
167
|
-
fieldLabels?: LineItemsFieldLabels;
|
|
168
|
-
/** Stacked (a narrow pane), how many fields share a row of a line's card: `2` pairs
|
|
169
|
-
* them up (a column's `narrowSpan={2}` takes a whole row), once the pane is wide
|
|
170
|
-
* enough for two fields (18rem); narrower still, one. Default `1`. */
|
|
171
|
-
narrowColumns?: 1 | 2;
|
|
172
|
-
/** Stacked, where the remove button goes: a row of its own (`row`, default) or
|
|
173
|
-
* beside the last field (`inline`). See {@link LineItemsRemovePlacement}. */
|
|
174
|
-
removePlacement?: LineItemsRemovePlacement;
|
|
175
|
-
/** On the wide grid, the remove button's place in the row's height. Default `start`
|
|
176
|
-
* — or `center` when a column floats its label (`fieldLabels="floating"`): a
|
|
177
|
-
* floating field is taller than the button, and centred is level with its control.
|
|
178
|
-
* A field that shows a message under itself grows the row; pin `start` then. */
|
|
179
|
-
removeAlign?: LineItemsRemoveAlign;
|
|
180
|
-
/** Disables add and remove (the fields are the caller's to disable). */
|
|
181
|
-
disabled?: boolean;
|
|
182
|
-
/**
|
|
183
|
-
* Extra attributes for one row's element (the `role="group"` that holds its fields) —
|
|
184
|
-
* keksdose K20: its rule editor's tour points at the first condition row with
|
|
185
|
-
* `[data-tour="rule-condition"]` (dev#495), and with nowhere to put the anchor on the
|
|
186
|
-
* row it wrapped a cell's field in a `span` instead, which the spotlight then drew
|
|
187
|
-
* around one field rather than the row. Test ids the same way.
|
|
188
|
-
*
|
|
189
|
-
* MERGED under the list's own, which win: `role`, the group's `aria-label` (that is
|
|
190
|
-
* {@link rowLabel}'s) and `data-line-items-row` stay the list's — the row's name and
|
|
191
|
-
* the hook its focus handling finds rows by. `className` is added after the row's
|
|
192
|
-
* own classes, `style` is passed through, and an `onKeyDown` runs BEFORE the row's
|
|
193
|
-
* Ctrl/⌘+Enter "add a row" (call `preventDefault()` to keep that from happening).
|
|
194
|
-
*/
|
|
195
|
-
rowProps?: (item: T, index: number) => LineItemsRowProps | undefined;
|
|
196
|
-
labels?: LabelOverride<LineItemsLabels>;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const REMOVE_TRACK = "2.25rem";
|
|
200
|
-
const SUMMARY_TONE: Record<LineItemsSummaryTone, string> = {
|
|
201
|
-
neutral: "text-primary",
|
|
202
|
-
success: "text-success",
|
|
203
|
-
danger: "text-danger",
|
|
204
|
-
muted: "text-muted",
|
|
205
|
-
// SignedAmount's money palette (toneTextClass "income" / "expense").
|
|
206
|
-
income: "text-money-income",
|
|
207
|
-
expense: "text-money-expense",
|
|
208
|
-
};
|
|
209
|
-
const REMOVE_ALIGN: Record<LineItemsRemoveAlign, string> = {
|
|
210
|
-
start: "@lg:self-start",
|
|
211
|
-
center: "@lg:self-center",
|
|
212
|
-
end: "@lg:self-end",
|
|
213
|
-
};
|
|
214
|
-
const FOCUSABLE =
|
|
215
|
-
"input:not([disabled]):not([type=hidden]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex='-1'])";
|
|
216
|
-
|
|
217
|
-
function defaultKey(item: unknown, index: number): Key {
|
|
218
|
-
if (typeof item === "object" && item !== null && "id" in item) {
|
|
219
|
-
const id = (item as { id: unknown }).id;
|
|
220
|
-
if (typeof id === "string" || typeof id === "number") return id;
|
|
221
|
-
}
|
|
222
|
-
return index;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
type PendingFocus = { kind: "added" } | { kind: "removed"; index: number };
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* An editable list of lines — journal entry lines, lease components, invoice
|
|
229
|
-
* positions, budget rows: column headers, a row of fields per item, a remove button
|
|
230
|
-
* per row, a dashed "add" button under them, and an optional totals row.
|
|
231
|
-
*
|
|
232
|
-
* Presentation only: the rows are the caller's `items` and the fields are the
|
|
233
|
-
* caller's, rendered per column. So it works over plain state —
|
|
234
|
-
*
|
|
235
|
-
* ```tsx
|
|
236
|
-
* <LineItems items={lines} columns={cols} onAdd={() => setLines([...lines, blank()])}
|
|
237
|
-
* onRemove={(i) => setLines(lines.filter((_, j) => j !== i))} minItems={2} />
|
|
238
|
-
* ```
|
|
239
|
-
*
|
|
240
|
-
* — and over react-hook-form's `useFieldArray` alike (`items={fields}`, `onAdd={() =>
|
|
241
|
-
* append(blank())}`, `onRemove={remove}`), for which `@eifi1/ui-kit/rhf` has
|
|
242
|
-
* `RhfLineItems`.
|
|
243
|
-
*
|
|
244
|
-
* On a wide pane the rows are a grid under the headers; on a narrow one (a container
|
|
245
|
-
* query, so a dialog stacks where it is cramped) each row stacks its fields, each
|
|
246
|
-
* under a small copy of its header. The headers are `aria-hidden`: every row is a
|
|
247
|
-
* named group and every field is named by `render`'s `label` ("Debit, row 2"), which
|
|
248
|
-
* is what a screen reader needs — a header row it would read once, out of context.
|
|
249
|
-
*
|
|
250
|
-
* Keyboard: after Add, focus lands in the new row's first field; after a remove, on
|
|
251
|
-
* the row that took its place (else the add button). Ctrl/⌘+Enter in any row adds a
|
|
252
|
-
* row.
|
|
253
|
-
*/
|
|
254
|
-
export function LineItems<T>({
|
|
255
|
-
items,
|
|
256
|
-
columns,
|
|
257
|
-
getKey = defaultKey,
|
|
258
|
-
onAdd,
|
|
259
|
-
onRemove,
|
|
260
|
-
minItems = 0,
|
|
261
|
-
maxItems,
|
|
262
|
-
confirmRemove,
|
|
263
|
-
addLabel,
|
|
264
|
-
rowLabel,
|
|
265
|
-
totals,
|
|
266
|
-
totalsLabel,
|
|
267
|
-
empty,
|
|
268
|
-
error,
|
|
269
|
-
summary,
|
|
270
|
-
fieldLabels = "aria",
|
|
271
|
-
narrowColumns = 1,
|
|
272
|
-
removePlacement = "row",
|
|
273
|
-
removeAlign: removeAlignProp,
|
|
274
|
-
disabled = false,
|
|
275
|
-
rowProps,
|
|
276
|
-
labels: labelsProp,
|
|
277
|
-
className,
|
|
278
|
-
style,
|
|
279
|
-
...rest
|
|
280
|
-
}: LineItemsProps<T>) {
|
|
281
|
-
const labels = useKitLabels("lineItems", DEFAULT_LINE_ITEMS_LABELS, labelsProp);
|
|
282
|
-
const rowRefs = useRef<Array<HTMLDivElement | null>>([]);
|
|
283
|
-
const addRef = useRef<HTMLButtonElement>(null);
|
|
284
|
-
const pendingFocus = useRef<PendingFocus | null>(null);
|
|
285
|
-
const [confirmingAt, setConfirming] = useState<number | null>(null);
|
|
286
|
-
// A confirm waiting on a row that has since gone is void.
|
|
287
|
-
const confirming = confirmingAt !== null && confirmingAt < items.length ? confirmingAt : null;
|
|
288
|
-
|
|
289
|
-
const tracks = [...columns.map((c) => c.width ?? "minmax(0,1fr)"), ...(onRemove ? [REMOVE_TRACK] : [])];
|
|
290
|
-
const gridStyle = { "--line-items-cols": tracks.join(" ") } as CSSProperties;
|
|
291
|
-
const canAdd = Boolean(onAdd) && !disabled && (maxItems === undefined || items.length < maxItems);
|
|
292
|
-
const canRemove = Boolean(onRemove) && !disabled && items.length > minItems;
|
|
293
|
-
const hasError = hasContent(error);
|
|
294
|
-
|
|
295
|
-
// Focus after the list has re-rendered with the new rows — a layout effect, so the
|
|
296
|
-
// caret is where it belongs before paint.
|
|
297
|
-
useLayoutEffect(() => {
|
|
298
|
-
const pending = pendingFocus.current;
|
|
299
|
-
if (!pending) return;
|
|
300
|
-
pendingFocus.current = null;
|
|
301
|
-
if (pending.kind === "added") {
|
|
302
|
-
const row = rowRefs.current[items.length - 1];
|
|
303
|
-
row?.querySelector<HTMLElement>(FOCUSABLE)?.focus();
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
const row = rowRefs.current[Math.min(pending.index, items.length - 1)];
|
|
307
|
-
const target =
|
|
308
|
-
row?.querySelector<HTMLElement>("[data-line-items-remove]:not([disabled])") ??
|
|
309
|
-
row?.querySelector<HTMLElement>(FOCUSABLE) ??
|
|
310
|
-
addRef.current;
|
|
311
|
-
target?.focus();
|
|
312
|
-
}, [items.length]);
|
|
313
|
-
|
|
314
|
-
const add = useCallback(() => {
|
|
315
|
-
if (!canAdd || !onAdd) return;
|
|
316
|
-
pendingFocus.current = { kind: "added" };
|
|
317
|
-
onAdd();
|
|
318
|
-
}, [canAdd, onAdd]);
|
|
319
|
-
|
|
320
|
-
const removeAt = async (index: number) => {
|
|
321
|
-
if (!canRemove || !onRemove) return;
|
|
322
|
-
if (confirmRemove === true && confirming !== index) {
|
|
323
|
-
setConfirming(index);
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
if (typeof confirmRemove === "function") {
|
|
327
|
-
const ok = await confirmRemove(items[index], index);
|
|
328
|
-
if (!ok) return;
|
|
329
|
-
}
|
|
330
|
-
setConfirming(null);
|
|
331
|
-
pendingFocus.current = { kind: "removed", index };
|
|
332
|
-
onRemove(index);
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
const onRowKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
|
|
336
|
-
if (e.key === "Enter" && (e.ctrlKey || e.metaKey) && canAdd) {
|
|
337
|
-
e.preventDefault();
|
|
338
|
-
add();
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
const columnName = (column: LineItemsColumn<T>) =>
|
|
343
|
-
column.label ?? (typeof column.header === "string" ? column.header : column.key);
|
|
344
|
-
const floats = (column: LineItemsColumn<T>) => (column.fieldLabels ?? fieldLabels) === "floating";
|
|
345
|
-
// A header row only for the columns that still need one: with every field floating
|
|
346
|
-
// its own label, a row of headers would say each name twice.
|
|
347
|
-
const showHeader = columns.some((c) => !floats(c));
|
|
348
|
-
const pairs = narrowColumns === 2;
|
|
349
|
-
const removeAlign = removeAlignProp ?? (columns.some(floats) ? "center" : "start");
|
|
350
|
-
const inline = removePlacement === "inline" && Boolean(onRemove) && columns.length > 0;
|
|
351
|
-
const lastColumn = columns[columns.length - 1];
|
|
352
|
-
|
|
353
|
-
const headerCell = (column: LineItemsColumn<T>) => (
|
|
354
|
-
<span
|
|
355
|
-
key={column.key}
|
|
356
|
-
className={cn("min-w-0 truncate text-xs font-medium text-muted", column.align === "end" && "text-end")}
|
|
357
|
-
>
|
|
358
|
-
{floats(column) ? null : column.header}
|
|
359
|
-
</span>
|
|
360
|
-
);
|
|
361
|
-
|
|
362
|
-
const removeCell = (index: number, row: number, isConfirming: boolean) => (
|
|
363
|
-
<div
|
|
364
|
-
data-line-items-remove-cell=""
|
|
365
|
-
className={cn(
|
|
366
|
-
"flex justify-end @lg:justify-center",
|
|
367
|
-
REMOVE_ALIGN[removeAlign],
|
|
368
|
-
// Paired, the remove button keeps a row of its own at the card's end rather
|
|
369
|
-
// than squeezing in beside the last field — unless asked to go `inline`.
|
|
370
|
-
inline ? "shrink-0" : pairs && "@2xs:col-span-2 @lg:col-span-1",
|
|
371
|
-
)}
|
|
372
|
-
>
|
|
373
|
-
<IconButton
|
|
374
|
-
type="button"
|
|
375
|
-
data-line-items-remove=""
|
|
376
|
-
variant={isConfirming ? "danger" : "ghost"}
|
|
377
|
-
tone={isConfirming ? undefined : "danger"}
|
|
378
|
-
label={isConfirming ? labels.confirmRemove(row) : labels.remove(row)}
|
|
379
|
-
// The icon alone at every text size (docs/text-size-harmonization.md §10.8): the
|
|
380
|
-
// row's one control, in a grid column sized for an icon, whose name becomes a
|
|
381
|
-
// sentence while it waits ("Remove row 3? Press again to confirm") — as text at
|
|
382
|
-
// Large it would push the row's fields aside and change width between the two
|
|
383
|
-
// presses. The name stays the accessible name; the red fill says "confirm".
|
|
384
|
-
labelVisible={false}
|
|
385
|
-
disabled={!canRemove}
|
|
386
|
-
onClick={() => void removeAt(index)}
|
|
387
|
-
onBlur={() => {
|
|
388
|
-
if (isConfirming) setConfirming(null);
|
|
389
|
-
}}
|
|
390
|
-
onKeyDown={(e) => {
|
|
391
|
-
if (e.key === "Escape" && isConfirming) {
|
|
392
|
-
e.stopPropagation();
|
|
393
|
-
setConfirming(null);
|
|
394
|
-
}
|
|
395
|
-
}}
|
|
396
|
-
>
|
|
397
|
-
<Trash2 />
|
|
398
|
-
</IconButton>
|
|
399
|
-
</div>
|
|
400
|
-
);
|
|
401
|
-
|
|
402
|
-
const showTotals = totals !== undefined;
|
|
403
|
-
const summaryTone = summary?.tone ?? "neutral";
|
|
404
|
-
const summaryHasValue = hasContent(summary?.value);
|
|
405
|
-
const labelColumn = showTotals ? columns.find((c) => !hasContent(totals[c.key]))?.key : undefined;
|
|
406
|
-
|
|
407
|
-
return (
|
|
408
|
-
<div
|
|
409
|
-
data-slot="line-items"
|
|
410
|
-
{...rest}
|
|
411
|
-
style={{ ...gridStyle, ...style }}
|
|
412
|
-
className={cn("@container space-y-2", className)}
|
|
413
|
-
>
|
|
414
|
-
{showHeader && (
|
|
415
|
-
<div aria-hidden className="hidden gap-2 @lg:grid @lg:grid-cols-[var(--line-items-cols)]">
|
|
416
|
-
{columns.map(headerCell)}
|
|
417
|
-
{onRemove && <span />}
|
|
418
|
-
</div>
|
|
419
|
-
)}
|
|
420
|
-
|
|
421
|
-
{items.length === 0 && hasContent(empty) && (
|
|
422
|
-
<div className="rounded-md border border-dashed border-subtle px-3 py-4 text-center text-sm text-muted">
|
|
423
|
-
{empty}
|
|
424
|
-
</div>
|
|
425
|
-
)}
|
|
426
|
-
|
|
427
|
-
{items.map((item, index) => {
|
|
428
|
-
const row = index + 1;
|
|
429
|
-
const isConfirming = confirming === index;
|
|
430
|
-
const extra = rowProps?.(item, index);
|
|
431
|
-
return (
|
|
432
|
-
// The row's Ctrl/⌘+Enter is a shortcut for the add button, which is itself
|
|
433
|
-
// reachable by Tab; the group only listens for it bubbling from its fields.
|
|
434
|
-
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
435
|
-
<div
|
|
436
|
-
{...extra}
|
|
437
|
-
key={getKey(item, index)}
|
|
438
|
-
ref={(el) => {
|
|
439
|
-
rowRefs.current[index] = el;
|
|
440
|
-
}}
|
|
441
|
-
role="group"
|
|
442
|
-
aria-label={rowLabel ? rowLabel(index, item) : labels.row(row)}
|
|
443
|
-
data-line-items-row=""
|
|
444
|
-
onKeyDown={(e) => {
|
|
445
|
-
if (extra?.onKeyDown) {
|
|
446
|
-
extra.onKeyDown(e);
|
|
447
|
-
if (e.defaultPrevented) return;
|
|
448
|
-
}
|
|
449
|
-
onRowKeyDown(e);
|
|
450
|
-
}}
|
|
451
|
-
className={cn(
|
|
452
|
-
"grid grid-cols-1 gap-2 @lg:grid-cols-[var(--line-items-cols)] @lg:items-start",
|
|
453
|
-
// Two short fields to a row of the card — from 18rem, where two fields
|
|
454
|
-
// still fit a figure each; on anything narrower they stack after all.
|
|
455
|
-
pairs && "@2xs:grid-cols-2",
|
|
456
|
-
// Stacked, each row is a card of its own so the rows stay apart.
|
|
457
|
-
"@max-lg:rounded-md @max-lg:border @max-lg:border-subtle @max-lg:p-3",
|
|
458
|
-
extra?.className,
|
|
459
|
-
)}
|
|
460
|
-
>
|
|
461
|
-
{columns.map((column) => {
|
|
462
|
-
const floating = floats(column);
|
|
463
|
-
const isLast = inline && column === lastColumn;
|
|
464
|
-
const span = pairs && column.narrowSpan === 2 && "@2xs:col-span-2 @lg:col-span-1";
|
|
465
|
-
const cell = (
|
|
466
|
-
<div
|
|
467
|
-
key={column.key}
|
|
468
|
-
className={cn(
|
|
469
|
-
"min-w-0 space-y-1 @lg:space-y-0",
|
|
470
|
-
// The wide grid places every cell in its own track again.
|
|
471
|
-
isLast ? "flex-1" : span,
|
|
472
|
-
)}
|
|
473
|
-
>
|
|
474
|
-
{!floating && (
|
|
475
|
-
<span aria-hidden className="block text-xs font-medium text-muted @lg:hidden">
|
|
476
|
-
{column.header}
|
|
477
|
-
</span>
|
|
478
|
-
)}
|
|
479
|
-
{column.render({
|
|
480
|
-
item,
|
|
481
|
-
index,
|
|
482
|
-
label: labels.cell(columnName(column), row),
|
|
483
|
-
fieldLabel: floating ? columnName(column) : undefined,
|
|
484
|
-
})}
|
|
485
|
-
</div>
|
|
486
|
-
);
|
|
487
|
-
if (!isLast) return cell;
|
|
488
|
-
// Inline, the last field and the remove button share one cell of the
|
|
489
|
-
// card; on the wide grid the wrapper dissolves (`contents`) and each is a
|
|
490
|
-
// track of its own again. Level with the field's control: its foot under
|
|
491
|
-
// a header copy, its middle when it floats its own label.
|
|
492
|
-
return (
|
|
493
|
-
<div
|
|
494
|
-
key={column.key}
|
|
495
|
-
data-line-items-inline=""
|
|
496
|
-
className={cn("flex min-w-0 gap-2 @lg:contents", floating ? "items-center" : "items-end", span)}
|
|
497
|
-
>
|
|
498
|
-
{cell}
|
|
499
|
-
{removeCell(index, row, isConfirming)}
|
|
500
|
-
</div>
|
|
501
|
-
);
|
|
502
|
-
})}
|
|
503
|
-
{onRemove && !inline && removeCell(index, row, isConfirming)}
|
|
504
|
-
</div>
|
|
505
|
-
);
|
|
506
|
-
})}
|
|
507
|
-
|
|
508
|
-
{showTotals && (
|
|
509
|
-
<div
|
|
510
|
-
role="group"
|
|
511
|
-
aria-label={typeof totalsLabel === "string" ? totalsLabel : labels.totals}
|
|
512
|
-
data-line-items-totals=""
|
|
513
|
-
className="grid grid-cols-1 gap-2 border-t border-subtle pt-2 text-sm font-semibold tabular-nums text-primary @lg:grid-cols-[var(--line-items-cols)]"
|
|
514
|
-
>
|
|
515
|
-
{columns.map((column) => {
|
|
516
|
-
const value = totals[column.key];
|
|
517
|
-
if (column.key === labelColumn) {
|
|
518
|
-
return (
|
|
519
|
-
<span key={column.key} className="min-w-0">
|
|
520
|
-
{totalsLabel ?? labels.totals}
|
|
521
|
-
</span>
|
|
522
|
-
);
|
|
523
|
-
}
|
|
524
|
-
return (
|
|
525
|
-
<span
|
|
526
|
-
key={column.key}
|
|
527
|
-
className={cn(
|
|
528
|
-
"min-w-0",
|
|
529
|
-
column.align === "end" && "@lg:text-end",
|
|
530
|
-
// Stacked, a column with no total takes no line.
|
|
531
|
-
!hasContent(value) && "@max-lg:hidden",
|
|
532
|
-
)}
|
|
533
|
-
>
|
|
534
|
-
{hasContent(value) && (
|
|
535
|
-
<span className="flex justify-between gap-2 @lg:block">
|
|
536
|
-
<span aria-hidden className="font-normal text-muted @lg:hidden">
|
|
537
|
-
{column.header}
|
|
538
|
-
</span>
|
|
539
|
-
{value}
|
|
540
|
-
</span>
|
|
541
|
-
)}
|
|
542
|
-
</span>
|
|
543
|
-
);
|
|
544
|
-
})}
|
|
545
|
-
{onRemove && <span className="@max-lg:hidden" />}
|
|
546
|
-
</div>
|
|
547
|
-
)}
|
|
548
|
-
|
|
549
|
-
{summary && (
|
|
550
|
-
<div data-line-items-summary="" className="flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-primary">
|
|
551
|
-
{/* With no value the line is a state of its own, and the label takes the
|
|
552
|
-
tone — the only place left to carry it. */}
|
|
553
|
-
<span
|
|
554
|
-
data-tone={summaryHasValue ? undefined : summaryTone}
|
|
555
|
-
className={cn("min-w-0", !summaryHasValue && SUMMARY_TONE[summaryTone])}
|
|
556
|
-
>
|
|
557
|
-
{summary.label}
|
|
558
|
-
</span>
|
|
559
|
-
{summaryHasValue && (
|
|
560
|
-
<span data-tone={summaryTone} className={cn("font-semibold tabular-nums", SUMMARY_TONE[summaryTone])}>
|
|
561
|
-
{summary.value}
|
|
562
|
-
</span>
|
|
563
|
-
)}
|
|
564
|
-
{hasContent(summary.status) && (
|
|
565
|
-
<span data-line-items-summary-status="" className="inline-flex">
|
|
566
|
-
{summary.status}
|
|
567
|
-
</span>
|
|
568
|
-
)}
|
|
569
|
-
{summary.action && (
|
|
570
|
-
<Button
|
|
571
|
-
type="button"
|
|
572
|
-
variant={summary.action.variant === "link" ? "link" : "secondary"}
|
|
573
|
-
tone={summary.action.variant === "link" ? "muted" : undefined}
|
|
574
|
-
size="sm"
|
|
575
|
-
className="ms-auto"
|
|
576
|
-
disabled={disabled || summary.action.disabled}
|
|
577
|
-
onClick={summary.action.onClick}
|
|
578
|
-
>
|
|
579
|
-
{summary.action.label}
|
|
580
|
-
</Button>
|
|
581
|
-
)}
|
|
582
|
-
</div>
|
|
583
|
-
)}
|
|
584
|
-
|
|
585
|
-
{hasError && <p className="text-caption leading-tight text-danger">{error}</p>}
|
|
586
|
-
|
|
587
|
-
{onAdd && (
|
|
588
|
-
<Button
|
|
589
|
-
ref={addRef}
|
|
590
|
-
type="button"
|
|
591
|
-
variant="secondary"
|
|
592
|
-
className="w-full border-dashed"
|
|
593
|
-
disabled={!canAdd}
|
|
594
|
-
onClick={add}
|
|
595
|
-
>
|
|
596
|
-
<Plus aria-hidden className="size-4" />
|
|
597
|
-
{addLabel ?? labels.add}
|
|
598
|
-
</Button>
|
|
599
|
-
)}
|
|
600
|
-
</div>
|
|
601
|
-
);
|
|
602
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// The English words of ./list, in a module with no component code: the English catalogue
|
|
2
|
-
// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk
|
|
3
|
-
// like the other languages (0.34, KS U8). ./list re-exports them.
|
|
4
|
-
|
|
5
|
-
import type { ListLabels } from "./list";
|
|
6
|
-
|
|
7
|
-
export const DEFAULT_LIST_LABELS: ListLabels = {
|
|
8
|
-
unread: "Unread",
|
|
9
|
-
opensInNewTab: "opens in a new tab",
|
|
10
|
-
showAll: (count) => `Show all (${count})`,
|
|
11
|
-
showFewer: "Show fewer",
|
|
12
|
-
};
|