@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,339 +0,0 @@
|
|
|
1
|
-
import { useId } from "react";
|
|
2
|
-
import type { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactElement, ReactNode, Ref } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { DEFAULT_COMMON_LABELS, useKitLabels, useKitLink } from "../i18n/kit-labels";
|
|
5
|
-
import type { KitLinkComponent, KitLinkProps } from "../i18n/kit-labels";
|
|
6
|
-
import { pickLinkRenderer, replacingClick, routerLinkNavigation } from "./text-link";
|
|
7
|
-
import { useCommitReason } from "./write-lock";
|
|
8
|
-
import type { CommitScope } from "./write-lock";
|
|
9
|
-
import { hasContent } from "../lib/presence";
|
|
10
|
-
import { LockedReason, type DisabledReasonDisplay } from "./field-parts";
|
|
11
|
-
import { Spinner } from "./spinner";
|
|
12
|
-
import { BUTTON_LINK_PRESSED, ICON_BUTTON_PRESSED, RenderedButtonLink, buttonLook } from "./button-look";
|
|
13
|
-
import type { ButtonSize, ButtonTone, ButtonVariant } from "./button-look";
|
|
14
|
-
|
|
15
|
-
// The kit's text button, and `<Button href>`, the link that looks like one. Its look —
|
|
16
|
-
// the variant, size and tone maps, and `buttonClasses` — is ./button-look, which
|
|
17
|
-
// IconButton shares (0.34, MOD-2, refactor audit 2026-10).
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* ⚠️ No default `type`: like a native `<button>`, a `Button` inside a `<form>` SUBMITS
|
|
21
|
-
* it unless you pass `type="button"`. Kept native on purpose — a form's own submit
|
|
22
|
-
* button relies on it, and changing the default would silently stop those forms from
|
|
23
|
-
* submitting. Pass `type="button"` for every other action in a form (keksdose had six
|
|
24
|
-
* link buttons submitting their form).
|
|
25
|
-
*/
|
|
26
|
-
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
27
|
-
/** `default` (the quiet action, what a Button without `variant` draws), `accent` (the
|
|
28
|
-
* strong call to action, solid brand), `secondary`, `ghost`, `danger` or `link`. See
|
|
29
|
-
* {@link ButtonVariant}. */
|
|
30
|
-
variant?: ButtonVariant;
|
|
31
|
-
/** `md` (default) is the page's action button. `sm` is the compact one — 12px text
|
|
32
|
-
* and `px-2 py-1` — for the secondary actions in a toolbar, a card header or a
|
|
33
|
-
* table's header row (keksdose writes `px-2 py-1 text-xs` over `secondary` by hand
|
|
34
|
-
* there). Every variant takes either size. */
|
|
35
|
-
size?: ButtonSize;
|
|
36
|
-
/** In a flex row next to a taller labelled field, fill the field's height so the
|
|
37
|
-
* two line up. No effect outside a flex row. */
|
|
38
|
-
stretch?: boolean;
|
|
39
|
-
/** The `<button>` element. React 19 passes `ref` to a function component as an
|
|
40
|
-
* ordinary prop, so it rides `...rest` onto the element with no `forwardRef` —
|
|
41
|
-
* declared here only because `ButtonHTMLAttributes` does not carry it. */
|
|
42
|
-
ref?: Ref<HTMLButtonElement>;
|
|
43
|
-
/** Text colour for `link` and `ghost`: `muted` (quiet, body colour on hover) or
|
|
44
|
-
* `danger` (quiet, `--danger` on hover). `danger` also makes `secondary` an
|
|
45
|
-
* outlined destructive button and `default` a soft one; ignored by the other
|
|
46
|
-
* variants. See {@link ButtonTone}. */
|
|
47
|
-
tone?: ButtonTone;
|
|
48
|
-
/**
|
|
49
|
-
* Make it a toggle button, as {@link IconButton}'s `pressed` does. `true` sets
|
|
50
|
-
* `aria-pressed="true"` and draws the "on" look — on a `link`, the brand colour and a
|
|
51
|
-
* medium weight; on the boxed variants, the quiet brand fill IconButton uses — and
|
|
52
|
-
* `false` sets `aria-pressed="false"` with the ordinary look. Left out, no
|
|
53
|
-
* `aria-pressed` (or the caller's own). For lenkbank's "All speeds" text toggle
|
|
54
|
-
* (gear/hysteresis-charts.tsx:482), which is a hand-rolled `<button aria-pressed>`
|
|
55
|
-
* swapping two class strings; with `variant="link" tone="muted"` it is this.
|
|
56
|
-
*/
|
|
57
|
-
pressed?: boolean;
|
|
58
|
-
/**
|
|
59
|
-
* Why the action is not available — the button's half of DangerConfirm's
|
|
60
|
-
* `lockedReason` (kastlan handover-detail-page.tsx:197 locks a signed handover).
|
|
61
|
-
*
|
|
62
|
-
* A disabled button that cannot say why is a dead end: the native `disabled` takes it
|
|
63
|
-
* out of the tab order, so a keyboard user never lands on it, and a pointer gets a
|
|
64
|
-
* `not-allowed` cursor and nothing else. With a reason the button is `aria-disabled`
|
|
65
|
-
* instead — still focusable, still hoverable — clicks (and the Enter/Space and form
|
|
66
|
-
* submission they stand for) do nothing, and the reason is shown in the kit
|
|
67
|
-
* {@link Tooltip} and attached with `aria-describedby`, so a screen reader hears it
|
|
68
|
-
* on focus. It wins over `disabled`: passing both keeps the button reachable, which is
|
|
69
|
-
* the point of giving a reason.
|
|
70
|
-
*
|
|
71
|
-
* The description is a `hidden` copy of the reason rather than the bubble itself: the
|
|
72
|
-
* bubble exists only while hovered or focused once it is portalled, and a description
|
|
73
|
-
* that comes and goes is read inconsistently. The bubble is kept visual, the way
|
|
74
|
-
* DangerConfirm keeps its own.
|
|
75
|
-
*/
|
|
76
|
-
disabledReason?: ReactNode;
|
|
77
|
-
/**
|
|
78
|
-
* Where `disabledReason` shows (0.32, §4 "No fact only in a tooltip"): by default a
|
|
79
|
-
* line under the button at Large and on a touch screen, the tooltip otherwise. See
|
|
80
|
-
* {@link DisabledReasonDisplay}.
|
|
81
|
-
*/
|
|
82
|
-
disabledReasonDisplay?: DisabledReasonDisplay;
|
|
83
|
-
/**
|
|
84
|
-
* This button COMMITS — it saves, creates, deletes. Under a locked
|
|
85
|
-
* {@link WriteLockProvider} it is disabled the `disabledReason` way, with the lock's
|
|
86
|
-
* reason (which wins over a `disabledReason` of its own). No provider, or an
|
|
87
|
-
* unlocked one: no effect. See {@link WriteLockProvider}; a {@link CommitScope} since
|
|
88
|
-
* 0.33 (`COMMIT_EXCEPT_BILLING`: every lock but a lapsed plan's).
|
|
89
|
-
*/
|
|
90
|
-
commit?: CommitScope;
|
|
91
|
-
/**
|
|
92
|
-
* Busy — the save is in flight: a spinner, `aria-busy`, and no second submit.
|
|
93
|
-
*
|
|
94
|
-
* kastlan's FormActions (form-actions.tsx:50) disables its submit and swaps in a
|
|
95
|
-
* `submittingLabel`, so the button jumps width mid-click and a screen reader hears
|
|
96
|
-
* the name change instead of "busy". Here the label STAYS — it is still the
|
|
97
|
-
* accessible name and still holds the button's width — and the spinner is drawn over
|
|
98
|
-
* it in the text colour, so nothing beside the button moves.
|
|
99
|
-
*
|
|
100
|
-
* The same prop {@link FileButton} has (`pending`), with one difference: this one is
|
|
101
|
-
* `aria-disabled`, not `disabled`. The button being pressed is the one that has focus,
|
|
102
|
-
* and a native `disabled` drops that focus to `<body>` the moment the save starts;
|
|
103
|
-
* clicks, and the Enter that submits a form through it, are swallowed instead.
|
|
104
|
-
*/
|
|
105
|
-
pending?: boolean;
|
|
106
|
-
/** Only on the link form — see {@link ButtonLinkProps}. */
|
|
107
|
-
href?: never;
|
|
108
|
-
renderLink?: never;
|
|
109
|
-
external?: never;
|
|
110
|
-
replace?: never;
|
|
111
|
-
reloadDocument?: never;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* `<Button href>`: a link that looks like a button — for an action that NAVIGATES.
|
|
116
|
-
*
|
|
117
|
-
* kastlan paints `buttonClasses(…)` onto router Links by hand in six places (the
|
|
118
|
-
* invoice / lease / unit preview dialogs' "Open" at invoice-preview-dialog.tsx:36,
|
|
119
|
-
* platform-companies-page.tsx:111, verify-email-page.tsx:86's "Log in",
|
|
120
|
-
* billing-history-page.tsx:85's PDF download), and has 26 `<Button onClick={() =>
|
|
121
|
-
* navigate(…)}>` that are links in all but markup: no middle-click, no "open in new
|
|
122
|
-
* tab", no URL on hover, and a screen reader announces a button that then changes the
|
|
123
|
-
* page. With `href` it is an `<a>`: the provider's router link
|
|
124
|
-
* ({@link UiKitProvider}'s `linkComponent`), or `renderLink` if given, else a plain one.
|
|
125
|
-
*
|
|
126
|
-
* `type` and `form` are typed out: they are a `<button>`'s, and a link never submits.
|
|
127
|
-
*/
|
|
128
|
-
export interface ButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "type" | "href"> {
|
|
129
|
-
href: string;
|
|
130
|
-
variant?: ButtonVariant;
|
|
131
|
-
size?: ButtonSize;
|
|
132
|
-
stretch?: boolean;
|
|
133
|
-
tone?: ButtonTone;
|
|
134
|
-
/** The in-app router link, over the provider's `linkComponent` (see
|
|
135
|
-
* {@link KitLinkComponent}). Ignored when `external`. */
|
|
136
|
-
renderLink?: KitLinkComponent;
|
|
137
|
-
/** Leaves the app: a plain `<a target="_blank" rel="noopener noreferrer">`, never the
|
|
138
|
-
* router link, and "(opens in a new tab)" read after the label — billing-history's
|
|
139
|
-
* Stripe PDF. A `target="_blank"` of your own is announced the same way. */
|
|
140
|
-
external?: boolean;
|
|
141
|
-
/**
|
|
142
|
-
* Navigate by replacing the current history entry, so Back does not return here —
|
|
143
|
-
* keksdose F1: the "Continue" out of a one-shot page (an emailed confirmation link, a
|
|
144
|
-
* payment return URL) that must not be landed on again. Handed to the router link as
|
|
145
|
-
* `replace` (see `KitLinkProps.replace` for mapping it); on a plain `<a>` a plain click
|
|
146
|
-
* becomes `location.replace(href)`. Ignored when `external`.
|
|
147
|
-
*/
|
|
148
|
-
replace?: boolean;
|
|
149
|
-
/**
|
|
150
|
-
* A plain `<a>` for an in-app `href`, so the browser loads the whole document instead
|
|
151
|
-
* of the router swapping the view — keksdose F1: a route the SPA does not own (a
|
|
152
|
-
* server-rendered export, a logout that must drop every in-memory cache). Wins over
|
|
153
|
-
* `renderLink` and the provider's `linkComponent`.
|
|
154
|
-
*/
|
|
155
|
-
reloadDocument?: boolean;
|
|
156
|
-
/** A link cannot be `disabled`, so this renders an `<a>` with NO `href` —
|
|
157
|
-
* `role="link"` and `aria-disabled`, out of the tab order like a disabled button,
|
|
158
|
-
* with the disabled look. The router link is not used: it needs somewhere to go. */
|
|
159
|
-
disabled?: boolean;
|
|
160
|
-
ref?: Ref<HTMLAnchorElement>;
|
|
161
|
-
type?: never;
|
|
162
|
-
form?: never;
|
|
163
|
-
pending?: never;
|
|
164
|
-
pressed?: never;
|
|
165
|
-
disabledReason?: never;
|
|
166
|
-
disabledReasonDisplay?: never;
|
|
167
|
-
commit?: never;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Declared link-first so `<Button href>` picks the link props; the LAST signature is
|
|
171
|
-
// what `ComponentProps<typeof Button>` reads, so wrappers (FileButton) still see the
|
|
172
|
-
// `<button>` props they always did.
|
|
173
|
-
export function Button(props: ButtonLinkProps): ReactElement;
|
|
174
|
-
export function Button(props: ButtonProps): ReactElement;
|
|
175
|
-
export function Button(props: ButtonProps | ButtonLinkProps): ReactElement {
|
|
176
|
-
if (props.href !== undefined) return <ButtonLink {...(props as ButtonLinkProps)} />;
|
|
177
|
-
return <ButtonElement {...(props as ButtonProps)} />;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function ButtonLink({
|
|
181
|
-
href,
|
|
182
|
-
renderLink,
|
|
183
|
-
external,
|
|
184
|
-
replace,
|
|
185
|
-
reloadDocument,
|
|
186
|
-
disabled,
|
|
187
|
-
variant = "default",
|
|
188
|
-
size = "md",
|
|
189
|
-
stretch,
|
|
190
|
-
tone = "default",
|
|
191
|
-
className,
|
|
192
|
-
children,
|
|
193
|
-
target,
|
|
194
|
-
rel,
|
|
195
|
-
onClick,
|
|
196
|
-
...rest
|
|
197
|
-
}: ButtonLinkProps) {
|
|
198
|
-
const kitLink = useKitLink();
|
|
199
|
-
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
200
|
-
// The same rule as every kit link (`pickLinkRenderer`): an external `href` or an
|
|
201
|
-
// in-page `#anchor` is never handed to the provider's router link, even without
|
|
202
|
-
// `external`.
|
|
203
|
-
// `reloadDocument` is the caller saying "not the router" for this one link.
|
|
204
|
-
const Link = reloadDocument ? undefined : pickLinkRenderer<KitLinkProps>(renderLink, kitLink, href);
|
|
205
|
-
const newTab = !disabled && (external || target === "_blank");
|
|
206
|
-
const cls = cn(
|
|
207
|
-
buttonLook(variant, size, stretch, tone),
|
|
208
|
-
// `relative` holds the sr-only note (see sr-only-containment.test).
|
|
209
|
-
newTab && "relative",
|
|
210
|
-
// BUTTON_BASE's `disabled:` classes never match an `<a>`; no pointer events also
|
|
211
|
-
// keeps the hover fill from lighting up on something that refuses the click.
|
|
212
|
-
disabled && "pointer-events-none cursor-not-allowed opacity-50",
|
|
213
|
-
className,
|
|
214
|
-
);
|
|
215
|
-
const body = (
|
|
216
|
-
<>
|
|
217
|
-
{children}
|
|
218
|
-
{/* The space OUTSIDE the sr-only span: a name computation trims each child's
|
|
219
|
-
text, so one inside it was lost ("Download(opens…"). In a flex box a bare
|
|
220
|
-
space draws nothing. */}
|
|
221
|
-
{newTab && " "}
|
|
222
|
-
{newTab && <span className="sr-only">({common.opensInNewTab})</span>}
|
|
223
|
-
</>
|
|
224
|
-
);
|
|
225
|
-
if (disabled) {
|
|
226
|
-
return (
|
|
227
|
-
<a {...rest} role="link" aria-disabled="true" className={cls}>
|
|
228
|
-
{body}
|
|
229
|
-
</a>
|
|
230
|
-
);
|
|
231
|
-
}
|
|
232
|
-
if (external || !Link) {
|
|
233
|
-
return (
|
|
234
|
-
<a
|
|
235
|
-
{...rest}
|
|
236
|
-
href={href}
|
|
237
|
-
target={external ? "_blank" : target}
|
|
238
|
-
rel={external ? (rel ?? "noopener noreferrer") : rel}
|
|
239
|
-
onClick={external ? onClick : replacingClick(onClick, href, replace, target)}
|
|
240
|
-
className={cls}
|
|
241
|
-
>
|
|
242
|
-
{body}
|
|
243
|
-
</a>
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
return (
|
|
247
|
-
<RenderedButtonLink
|
|
248
|
-
render={Link}
|
|
249
|
-
{...rest}
|
|
250
|
-
{...routerLinkNavigation(replace)}
|
|
251
|
-
href={href}
|
|
252
|
-
target={target}
|
|
253
|
-
rel={rel}
|
|
254
|
-
onClick={onClick}
|
|
255
|
-
className={cls}
|
|
256
|
-
>
|
|
257
|
-
{body}
|
|
258
|
-
</RenderedButtonLink>
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function ButtonElement({
|
|
263
|
-
variant = "default",
|
|
264
|
-
size = "md",
|
|
265
|
-
stretch,
|
|
266
|
-
tone = "default",
|
|
267
|
-
pressed,
|
|
268
|
-
disabledReason: ownDisabledReason,
|
|
269
|
-
disabledReasonDisplay,
|
|
270
|
-
commit,
|
|
271
|
-
pending,
|
|
272
|
-
className,
|
|
273
|
-
onClick,
|
|
274
|
-
children,
|
|
275
|
-
href: _href,
|
|
276
|
-
renderLink: _renderLink,
|
|
277
|
-
external: _external,
|
|
278
|
-
replace: _replace,
|
|
279
|
-
reloadDocument: _reloadDocument,
|
|
280
|
-
...rest
|
|
281
|
-
}: ButtonProps) {
|
|
282
|
-
const reasonId = useId();
|
|
283
|
-
const disabledReason = useCommitReason(commit, ownDisabledReason);
|
|
284
|
-
const locked = hasContent(disabledReason);
|
|
285
|
-
const inert = locked || Boolean(pending);
|
|
286
|
-
const ownDescribedBy = rest["aria-describedby"];
|
|
287
|
-
const button = (
|
|
288
|
-
<button
|
|
289
|
-
{...rest}
|
|
290
|
-
disabled={inert ? undefined : rest.disabled}
|
|
291
|
-
aria-disabled={inert || rest["aria-disabled"]}
|
|
292
|
-
aria-busy={pending || rest["aria-busy"]}
|
|
293
|
-
aria-describedby={locked ? (ownDescribedBy ? `${ownDescribedBy} ${reasonId}` : reasonId) : ownDescribedBy}
|
|
294
|
-
aria-pressed={pressed ?? rest["aria-pressed"]}
|
|
295
|
-
onClick={(e) => {
|
|
296
|
-
// `preventDefault` as well as not calling through: a locked submit button must
|
|
297
|
-
// not submit its form, and the browser does that after this handler returns.
|
|
298
|
-
if (inert) {
|
|
299
|
-
e.preventDefault();
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
onClick?.(e);
|
|
303
|
-
}}
|
|
304
|
-
className={cn(
|
|
305
|
-
buttonLook(variant, size, stretch, tone),
|
|
306
|
-
pressed && (variant === "link" ? BUTTON_LINK_PRESSED : ICON_BUTTON_PRESSED),
|
|
307
|
-
// The disabled look for the focusable kind of disabled.
|
|
308
|
-
locked && "cursor-not-allowed opacity-50",
|
|
309
|
-
// No dimming while pending: the spinner IS the state, and at half opacity it
|
|
310
|
-
// would be the faintest thing on the button. `relative` anchors it.
|
|
311
|
-
pending && "relative cursor-progress",
|
|
312
|
-
className,
|
|
313
|
-
)}
|
|
314
|
-
>
|
|
315
|
-
{pending ? (
|
|
316
|
-
<>
|
|
317
|
-
{/* Transparent, not hidden: it keeps the width AND stays the accessible
|
|
318
|
-
name (`visibility: hidden` would drop it from the name). `gap-[inherit]`
|
|
319
|
-
keeps an icon + text spaced as the button spaces them. */}
|
|
320
|
-
<span className="inline-flex items-center justify-center gap-[inherit] opacity-0">{children}</span>
|
|
321
|
-
{/* Decorative: `aria-busy` says it, as on FileButton. */}
|
|
322
|
-
<Spinner label={null} className="absolute inset-0 m-auto size-4 border-current/30 border-t-current" />
|
|
323
|
-
</>
|
|
324
|
-
) : (
|
|
325
|
-
children
|
|
326
|
-
)}
|
|
327
|
-
</button>
|
|
328
|
-
);
|
|
329
|
-
if (!locked) return button;
|
|
330
|
-
return (
|
|
331
|
-
<LockedReason
|
|
332
|
-
lock={{ reason: disabledReason, reasonId }}
|
|
333
|
-
display={disabledReasonDisplay}
|
|
334
|
-
className={stretch ? "self-stretch" : undefined}
|
|
335
|
-
>
|
|
336
|
-
{button}
|
|
337
|
-
</LockedReason>
|
|
338
|
-
);
|
|
339
|
-
}
|
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import { useEffect, useEffectEvent, useMemo, useRef, useState } from "react";
|
|
2
|
-
import type { RefObject } from "react";
|
|
3
|
-
import { Calculator as CalculatorIcon, Delete } from "lucide-react";
|
|
4
|
-
import { Popover } from "./popover";
|
|
5
|
-
import { cn } from "../lib/cn";
|
|
6
|
-
import { FIELD_TOUCH_TEXT } from "./field-base";
|
|
7
|
-
import { FOCUS_RING } from "./focus-ring";
|
|
8
|
-
import { evaluateExpression, formatResult, isBareAmount, splitLeadingSign } from "../lib/calc";
|
|
9
|
-
import { DEFAULT_CALCULATOR_LABELS, useKitLabels, type CalculatorLabels } from "../i18n/kit-labels";
|
|
10
|
-
|
|
11
|
-
/** Screen-reader names for the calculator panel's own controls — any part of the
|
|
12
|
-
* kit's `calculator` namespace. Once three optional keys of its own; widened, not
|
|
13
|
-
* replaced, so every object that type-checked before still does. */
|
|
14
|
-
export type CalculatorButtonLabels = Partial<CalculatorLabels>;
|
|
15
|
-
|
|
16
|
-
interface CalculatorButtonProps {
|
|
17
|
-
/** Current field text — seeds the keypad so the user can keep calculating
|
|
18
|
-
* from what's already entered. */
|
|
19
|
-
value: string;
|
|
20
|
-
/**
|
|
21
|
-
* Called with the evaluated result whenever the running expression resolves
|
|
22
|
-
* to a number, so the host field tracks the keypad live.
|
|
23
|
-
*
|
|
24
|
-
* `expression` is the TEXT that result came out of — `"-42+50"` for an 8 — and
|
|
25
|
-
* is omitted when there was no calculation (a cleared pad). A host that keeps
|
|
26
|
-
* the sign of its figure OUTSIDE the text (see `AmountInput`'s `negative` /
|
|
27
|
-
* `onNegativeChange`, where a direction toggle owns it) cannot otherwise tell
|
|
28
|
-
* that 8 from a freshly typed one: the first is a sum that came out positive
|
|
29
|
-
* and has to take the direction with it, the second is a magnitude that must
|
|
30
|
-
* leave the direction alone. Hosts whose text carries its own sign can take
|
|
31
|
-
* the one argument and ignore this.
|
|
32
|
-
*/
|
|
33
|
-
onChange: (value: string, expression?: string) => void;
|
|
34
|
-
/**
|
|
35
|
-
* Called ONCE per calculator session, with the result the host should keep: on "="
|
|
36
|
-
* (the key, or Enter in the display), and when the panel closes — Escape, a press
|
|
37
|
-
* outside, the trigger — on a result `onChange` reported after the last commit. Never
|
|
38
|
-
* per keystroke: `onChange` is the live channel, this is the one to save on.
|
|
39
|
-
*
|
|
40
|
-
* Not called when the button goes away with its panel open (a lock or `disabled`
|
|
41
|
-
* arriving, the field unmounting): those say the value must not move, and the result
|
|
42
|
-
* stays where `onChange` put it.
|
|
43
|
-
*
|
|
44
|
-
* Refactor audit 2026-10-30, INP-1: the pad had no commit point of its own, and the
|
|
45
|
-
* two field engines guessed in opposite directions. NumberInput never committed a
|
|
46
|
-
* result, so Kurvenschmiede's dialogs saved the number from before the calculation;
|
|
47
|
-
* AmountInput committed every keystroke that resolved, so "100+50" saved 105 on its way
|
|
48
|
-
* to 150, and keksdose's threshold field, `disabled` while it saves, lost its pad to the
|
|
49
|
-
* first of them.
|
|
50
|
-
*/
|
|
51
|
-
onCommit?: (value: string) => void;
|
|
52
|
-
className?: string;
|
|
53
|
-
/** The trigger's accessible name; wins over `calculator.open` from the provider. */
|
|
54
|
-
"aria-label"?: string;
|
|
55
|
-
/** Screen-reader names for the panel's own controls. `aria-label` above already
|
|
56
|
-
* covers the trigger; these three were hardcoded English inside the popover,
|
|
57
|
-
* which a translating host had no way to reach. */
|
|
58
|
-
labels?: CalculatorButtonLabels;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Keypad layout (4 columns). The final C/= row is rendered separately. `name` is
|
|
62
|
-
* the key of the {@link CalculatorLabels} entry that names a non-digit key; a digit
|
|
63
|
-
* is named by its own glyph. */
|
|
64
|
-
type Key = { kind: "ins"; label: string; ins: string; accent?: boolean; name?: KeyName } | { kind: "back" };
|
|
65
|
-
|
|
66
|
-
type KeyName = "plus" | "minus" | "times" | "divide" | "decimal";
|
|
67
|
-
|
|
68
|
-
const KEYS: Key[] = [
|
|
69
|
-
{ kind: "ins", label: "7", ins: "7" },
|
|
70
|
-
{ kind: "ins", label: "8", ins: "8" },
|
|
71
|
-
{ kind: "ins", label: "9", ins: "9" },
|
|
72
|
-
{ kind: "ins", label: "÷", ins: "÷", accent: true, name: "divide" },
|
|
73
|
-
{ kind: "ins", label: "4", ins: "4" },
|
|
74
|
-
{ kind: "ins", label: "5", ins: "5" },
|
|
75
|
-
{ kind: "ins", label: "6", ins: "6" },
|
|
76
|
-
{ kind: "ins", label: "×", ins: "×", accent: true, name: "times" },
|
|
77
|
-
{ kind: "ins", label: "1", ins: "1" },
|
|
78
|
-
{ kind: "ins", label: "2", ins: "2" },
|
|
79
|
-
{ kind: "ins", label: "3", ins: "3" },
|
|
80
|
-
{ kind: "ins", label: "−", ins: "−", accent: true, name: "minus" },
|
|
81
|
-
{ kind: "ins", label: "0", ins: "0" },
|
|
82
|
-
{ kind: "ins", label: ".", ins: ".", name: "decimal" },
|
|
83
|
-
{ kind: "back" },
|
|
84
|
-
{ kind: "ins", label: "+", ins: "+", accent: true, name: "plus" },
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
// The kit's one focus frame (text-size §5). Until 0.34 the keys rang in `ring-strong` on
|
|
88
|
-
// `focus:`, so a pointer click left a grey ring on the key it pressed (DOC-7).
|
|
89
|
-
const KEY_BASE = `flex h-9 items-center justify-center rounded-md text-sm font-medium transition-colors ${FOCUS_RING}`;
|
|
90
|
-
// Two key families, two fills: digits sit on the inset surface and darken on
|
|
91
|
-
// hover, operators sit a step down on `--bg-active` and lift toward that surface —
|
|
92
|
-
// the same split `NumberPadSheet` uses for this keypad on a phone. The tokens
|
|
93
|
-
// flip with the theme, so neither needs a `dark:` twin.
|
|
94
|
-
//
|
|
95
|
-
// 0.33 (docs/colour-roles-harmonization.md §12.2, §12.9): the digits hover onto
|
|
96
|
-
// `--bg-active`, 1.11–1.18:1 from the key — `--bg-hover` is mixed against the card and
|
|
97
|
-
// sat only 1.04:1 from the well, which in light is the page. The operators rest on
|
|
98
|
-
// `--bg-active` rather than `--border`: More contrast steps the border until it is a
|
|
99
|
-
// 3:1 LINE, and as a fill under the label that left 2.2–2.7:1.
|
|
100
|
-
const KEY_DIGIT = "bg-surface-2 text-primary hover:bg-active";
|
|
101
|
-
const KEY_ACCENT = "bg-active text-secondary hover:bg-surface-2";
|
|
102
|
-
|
|
103
|
-
function seed(initial: string): string {
|
|
104
|
-
const t = initial.trim();
|
|
105
|
-
return t === "-" ? "" : t;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function CalculatorPanel({
|
|
109
|
-
initial,
|
|
110
|
-
onChange,
|
|
111
|
-
onEquals,
|
|
112
|
-
labels,
|
|
113
|
-
}: {
|
|
114
|
-
initial: string;
|
|
115
|
-
onChange: (value: string, expression?: string) => void;
|
|
116
|
-
/** "=" was pressed on a result: the session's commit point. */
|
|
117
|
-
onEquals: () => void;
|
|
118
|
-
labels: CalculatorLabels;
|
|
119
|
-
}) {
|
|
120
|
-
const [expr, setExpr] = useState(() => seed(initial));
|
|
121
|
-
const inputRef = useRef<HTMLInputElement>(null);
|
|
122
|
-
// What the pad SHOWS. Normally the expression it holds — but when the host owns
|
|
123
|
-
// the sign of the figure, the magnitude it hands back is not the whole number:
|
|
124
|
-
// type 50 into a pad opened on an outflow and the host answers "-50". Derived
|
|
125
|
-
// rather than stored, so there is no echo to guard against and a host that
|
|
126
|
-
// ignores `onChange` entirely (a static `value`) still sees its own keystrokes:
|
|
127
|
-
// the pad only defers when the host's text is character-for-character its own
|
|
128
|
-
// last number with a minus in front.
|
|
129
|
-
const host = splitLeadingSign(initial.trim());
|
|
130
|
-
const text = host.sign === "-" && isBareAmount(expr) && host.rest === expr.trim() ? initial.trim() : expr;
|
|
131
|
-
const result = evaluateExpression(text);
|
|
132
|
-
|
|
133
|
-
// Focus the display on open so the user can type or hit Enter immediately.
|
|
134
|
-
useEffect(() => {
|
|
135
|
-
inputRef.current?.focus();
|
|
136
|
-
}, []);
|
|
137
|
-
|
|
138
|
-
// Update the host field whenever the expression resolves to a number; an
|
|
139
|
-
// incomplete expression (e.g. "12+") simply leaves the field untouched. The
|
|
140
|
-
// expression rides along with the result — see `onChange` above.
|
|
141
|
-
const apply = (next: string) => {
|
|
142
|
-
setExpr(next);
|
|
143
|
-
const n = evaluateExpression(next);
|
|
144
|
-
if (n !== null) onChange(formatResult(n), next);
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const clearAll = () => {
|
|
148
|
-
setExpr("");
|
|
149
|
-
onChange("");
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
const equals = () => {
|
|
153
|
-
if (result === null) return;
|
|
154
|
-
const out = formatResult(result);
|
|
155
|
-
setExpr(out);
|
|
156
|
-
onChange(out, text);
|
|
157
|
-
onEquals();
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
return (
|
|
161
|
-
<div className="space-y-2">
|
|
162
|
-
<input
|
|
163
|
-
ref={inputRef}
|
|
164
|
-
aria-label={labels.calculation}
|
|
165
|
-
value={text}
|
|
166
|
-
inputMode="decimal"
|
|
167
|
-
onChange={(e) => apply(e.target.value)}
|
|
168
|
-
onKeyDown={(e) => {
|
|
169
|
-
if (e.key === "Enter") {
|
|
170
|
-
e.preventDefault();
|
|
171
|
-
equals();
|
|
172
|
-
}
|
|
173
|
-
}}
|
|
174
|
-
// Arithmetic reads left to right in every script, and a calculator display
|
|
175
|
-
// is right-aligned in every script too — so both stay physical, pinned
|
|
176
|
-
// with `dir="ltr"` rather than mirrored in a right-to-left form.
|
|
177
|
-
dir="ltr"
|
|
178
|
-
className={cn(
|
|
179
|
-
"block w-full rounded-md border border-subtle bg-surface px-2 py-1.5 text-right font-mono text-sm text-primary focus:border-strong focus:ring-strong",
|
|
180
|
-
FIELD_TOUCH_TEXT,
|
|
181
|
-
)}
|
|
182
|
-
/>
|
|
183
|
-
<div dir="ltr" className="h-4 pr-1 text-right font-mono text-xs text-placeholder">
|
|
184
|
-
{result !== null && formatResult(result) !== text.trim() ? `= ${formatResult(result)}` : ""}
|
|
185
|
-
</div>
|
|
186
|
-
<div className="grid grid-cols-4 gap-1.5">
|
|
187
|
-
{KEYS.map((key, i) =>
|
|
188
|
-
key.kind === "back" ? (
|
|
189
|
-
<button
|
|
190
|
-
key="back"
|
|
191
|
-
type="button"
|
|
192
|
-
aria-label={labels.backspace}
|
|
193
|
-
onClick={() => apply(text.slice(0, -1))}
|
|
194
|
-
className={cn(KEY_BASE, KEY_ACCENT)}
|
|
195
|
-
>
|
|
196
|
-
<Delete className="size-4" />
|
|
197
|
-
</button>
|
|
198
|
-
) : (
|
|
199
|
-
<button
|
|
200
|
-
key={`${key.ins}-${i}`}
|
|
201
|
-
type="button"
|
|
202
|
-
aria-label={key.name ? labels[key.name] : undefined}
|
|
203
|
-
onClick={() => apply(text + key.ins)}
|
|
204
|
-
className={cn(KEY_BASE, key.accent ? KEY_ACCENT : KEY_DIGIT)}
|
|
205
|
-
>
|
|
206
|
-
{key.label}
|
|
207
|
-
</button>
|
|
208
|
-
),
|
|
209
|
-
)}
|
|
210
|
-
<button
|
|
211
|
-
type="button"
|
|
212
|
-
// "C" is a convention, not a name: read aloud it is the letter.
|
|
213
|
-
aria-label={labels.clear}
|
|
214
|
-
onClick={clearAll}
|
|
215
|
-
className={cn(KEY_BASE, "col-span-2", KEY_ACCENT)}
|
|
216
|
-
>
|
|
217
|
-
C
|
|
218
|
-
</button>
|
|
219
|
-
<button
|
|
220
|
-
type="button"
|
|
221
|
-
aria-label={labels.equals}
|
|
222
|
-
onClick={equals}
|
|
223
|
-
className={cn(
|
|
224
|
-
KEY_BASE,
|
|
225
|
-
// The one chip that inverts against the page. There is no hover token for
|
|
226
|
-
// an inverted fill, so the hover is the chip mixed back toward the
|
|
227
|
-
// surface — a step quieter in either theme, and still a colour, so
|
|
228
|
-
// KEY_BASE's `transition-colors` carries it.
|
|
229
|
-
"col-span-2 bg-inverse text-inverse hover:bg-[color-mix(in_oklab,var(--bg-inverse)_88%,var(--bg-surface))]",
|
|
230
|
-
)}
|
|
231
|
-
>
|
|
232
|
-
=
|
|
233
|
-
</button>
|
|
234
|
-
</div>
|
|
235
|
-
</div>
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* The trigger, and the place a session ends. The render in which `open` turns false is
|
|
241
|
-
* the panel closing, however it closed — Escape, a press outside, this button — and
|
|
242
|
-
* that is when a result the pad left unsettled is committed. A component of its own
|
|
243
|
-
* because `open` lives in Popover and reaches only the trigger.
|
|
244
|
-
*
|
|
245
|
-
* Not the panel's unmount: the panel also goes when a lock or `disabled` takes the
|
|
246
|
-
* calculator away, and nothing may commit then. Those unmount this button with it, so no
|
|
247
|
-
* render ever sees `open` turn false.
|
|
248
|
-
*/
|
|
249
|
-
function CalculatorTrigger({
|
|
250
|
-
open,
|
|
251
|
-
onToggle,
|
|
252
|
-
onClosed,
|
|
253
|
-
buttonRef,
|
|
254
|
-
label,
|
|
255
|
-
className,
|
|
256
|
-
}: {
|
|
257
|
-
open: boolean;
|
|
258
|
-
onToggle: () => void;
|
|
259
|
-
onClosed: () => void;
|
|
260
|
-
buttonRef: RefObject<HTMLButtonElement | null>;
|
|
261
|
-
label: string;
|
|
262
|
-
className?: string;
|
|
263
|
-
}) {
|
|
264
|
-
const closed = useEffectEvent(onClosed);
|
|
265
|
-
const wasOpen = useRef(open);
|
|
266
|
-
useEffect(() => {
|
|
267
|
-
if (wasOpen.current && !open) closed();
|
|
268
|
-
wasOpen.current = open;
|
|
269
|
-
}, [open]);
|
|
270
|
-
return (
|
|
271
|
-
<button
|
|
272
|
-
ref={buttonRef}
|
|
273
|
-
type="button"
|
|
274
|
-
tabIndex={-1}
|
|
275
|
-
onClick={onToggle}
|
|
276
|
-
aria-label={label}
|
|
277
|
-
aria-expanded={open}
|
|
278
|
-
className={cn(
|
|
279
|
-
"flex items-center justify-center text-placeholder transition-colors hover:text-secondary",
|
|
280
|
-
className,
|
|
281
|
-
)}
|
|
282
|
-
>
|
|
283
|
-
<CalculatorIcon className="size-4" />
|
|
284
|
-
</button>
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* A calculator icon that opens a small keypad popover anchored to its host
|
|
290
|
-
* field. Designed as a trailing-edge adornment: render it inside the field's
|
|
291
|
-
* `relative` wrapper, positioned absolutely. The keypad seeds from the current
|
|
292
|
-
* field value and writes evaluated results straight back through `onChange`, and
|
|
293
|
-
* commits the session once through `onCommit`.
|
|
294
|
-
*/
|
|
295
|
-
export function CalculatorButton({
|
|
296
|
-
value,
|
|
297
|
-
onChange,
|
|
298
|
-
onCommit,
|
|
299
|
-
className,
|
|
300
|
-
"aria-label": ariaLabel,
|
|
301
|
-
labels: labelsProp,
|
|
302
|
-
}: CalculatorButtonProps) {
|
|
303
|
-
// prop > provider > English, with the name prop folded in as the `open` key it has
|
|
304
|
-
// always been.
|
|
305
|
-
const fromProps = useMemo(
|
|
306
|
-
() => (ariaLabel === undefined ? labelsProp : { ...labelsProp, open: ariaLabel }),
|
|
307
|
-
[ariaLabel, labelsProp],
|
|
308
|
-
);
|
|
309
|
-
const labels = useKitLabels("calculator", DEFAULT_CALCULATOR_LABELS, fromProps);
|
|
310
|
-
// The last result `onChange` reported that no commit has covered yet — what closing
|
|
311
|
-
// the panel commits. Written by the pad's handlers and read when it closes; never
|
|
312
|
-
// rendered, so a ref.
|
|
313
|
-
const unsettled = useRef<string | null>(null);
|
|
314
|
-
const change = (next: string, expression?: string) => {
|
|
315
|
-
unsettled.current = next;
|
|
316
|
-
onChange(next, expression);
|
|
317
|
-
};
|
|
318
|
-
const settle = () => {
|
|
319
|
-
const next = unsettled.current;
|
|
320
|
-
unsettled.current = null;
|
|
321
|
-
if (next !== null) onCommit?.(next);
|
|
322
|
-
};
|
|
323
|
-
return (
|
|
324
|
-
<Popover
|
|
325
|
-
width="14rem"
|
|
326
|
-
labels={{ panel: labels.panel }}
|
|
327
|
-
trigger={({ open, toggle, ref }) => (
|
|
328
|
-
<CalculatorTrigger
|
|
329
|
-
open={open}
|
|
330
|
-
onToggle={toggle}
|
|
331
|
-
onClosed={settle}
|
|
332
|
-
buttonRef={ref}
|
|
333
|
-
label={labels.open}
|
|
334
|
-
className={className}
|
|
335
|
-
/>
|
|
336
|
-
)}
|
|
337
|
-
>
|
|
338
|
-
{() => <CalculatorPanel initial={value} onChange={change} onEquals={settle} labels={labels} />}
|
|
339
|
-
</Popover>
|
|
340
|
-
);
|
|
341
|
-
}
|