@eifi1/ui-kit 0.54.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -76
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +2 -2
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js +2 -2
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +3 -1
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +13 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +23 -2
- package/dist/components/modal.js +24 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +1 -10
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +75 -3
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +92 -4
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +71 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +72 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +74 -3
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +74 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +71 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +29 -3
- package/dist/lib/dates.js +41 -12
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -342
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -439
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -816
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -600
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -188
- package/src/components/currency-select.tsx +0 -343
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -987
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -289
- package/src/components/data-table-filters.ts +0 -315
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -284
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -792
- package/src/components/modal.tsx +0 -534
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -559
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -754
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -90
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -11
- package/src/feedback/feedback-context.tsx +0 -245
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-diagnostics.tsx +0 -41
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -452
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -428
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -31
- package/src/feedback/feedback-row-detail.tsx +0 -871
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -131
- package/src/feedback/feedback-submit.tsx +0 -270
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -212
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2059
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1999
- package/src/i18n/locales/fr.ts +0 -2037
- package/src/i18n/locales/hu.ts +0 -2004
- package/src/i18n/locales/it.ts +0 -2014
- package/src/i18n/locales/zh.ts +0 -1912
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1191
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -288
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -585
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -27
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -769
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { matchesSearch, searchWords } from "../lib/text-match";
|
|
5
|
-
import { ComboboxPanel, type ComboboxCore, type ComboOption } from "./combobox-core";
|
|
6
|
-
import { CURRENCIES, type CurrencyOption } from "../currencies";
|
|
7
|
-
|
|
8
|
-
// The one list both currency pickers render (round 0.34 Wave 2, DUP-4). CurrencySelect
|
|
9
|
-
// re-exports the data under its own name, as it always has; the list is package-private.
|
|
10
|
-
// Its own module, so AmountInput can render the list without a cycle through
|
|
11
|
-
// currency-select. The data itself is ../currencies since 0.35: an entry of its own that
|
|
12
|
-
// imports nothing, which an app's build can read in Node (keksdose's flag subset).
|
|
13
|
-
export { CURRENCIES };
|
|
14
|
-
export type { CurrencyOption };
|
|
15
|
-
|
|
16
|
-
export interface CurrencyFlagProps extends ComponentPropsWithRef<"span"> {
|
|
17
|
-
/** ISO 3166-1 alpha-2, lowercase — the class flag-icons keys its sprite by. */
|
|
18
|
-
country: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function CurrencyFlag({ country, className, ...rest }: CurrencyFlagProps) {
|
|
22
|
-
return (
|
|
23
|
-
<span
|
|
24
|
-
{...rest}
|
|
25
|
-
// Stays `aria-hidden` whatever a caller passes: the flag is a picture of the
|
|
26
|
-
// code printed next to it, and a reader that met both would hear the currency
|
|
27
|
-
// twice.
|
|
28
|
-
aria-hidden
|
|
29
|
-
className={cn(
|
|
30
|
-
"fi inline-block w-5 h-[0.9375rem] rounded-sm shadow-[0_0_0_1px_rgba(0,0,0,0.08)] shrink-0",
|
|
31
|
-
`fi-${country}`,
|
|
32
|
-
className,
|
|
33
|
-
)}
|
|
34
|
-
/>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const CURRENCY_BY_CODE = new Map(CURRENCIES.map((c) => [c.code, c]));
|
|
39
|
-
|
|
40
|
-
export function getCurrency(code: string | null | undefined): CurrencyOption | undefined {
|
|
41
|
-
return code ? CURRENCY_BY_CODE.get(code.toUpperCase()) : undefined;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** The name to SHOW for a currency: the caller's translation if they have one for
|
|
45
|
-
* that code; else, when a `locale` is known, the name `Intl.DisplayNames` has for
|
|
46
|
-
* it in that locale; else the English name {@link CURRENCIES} carries. Shared with
|
|
47
|
-
* AmountInput, which renders the same list from the same data.
|
|
48
|
-
*
|
|
49
|
-
* `Intl` only when a locale was actually GIVEN (by prop or `<UiKitProvider>`): an
|
|
50
|
-
* app that never set one keeps the shipped English names it has always shown,
|
|
51
|
-
* rather than whatever language the test runner or the browser happens to be in. */
|
|
52
|
-
export function currencyName(c: CurrencyOption, names?: Record<string, string>, locale?: string): string {
|
|
53
|
-
const own = names?.[c.code];
|
|
54
|
-
if (own !== undefined) return own;
|
|
55
|
-
if (locale) {
|
|
56
|
-
try {
|
|
57
|
-
const shown = new Intl.DisplayNames([locale], { type: "currency" }).of(c.code);
|
|
58
|
-
if (shown && shown !== c.code) return shown;
|
|
59
|
-
} catch {
|
|
60
|
-
// A malformed tag, or a runtime without `DisplayNames`: the shipped name.
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return c.name;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface CurrencyOptionListProps {
|
|
67
|
-
/** The host's `useComboboxCore`: its trigger, its open state, its query. */
|
|
68
|
-
core: ComboboxCore<string>;
|
|
69
|
-
/** What the host's trigger names in `aria-controls`. */
|
|
70
|
-
listboxId: string;
|
|
71
|
-
/** The chosen code, if any — selected and checked in the list. */
|
|
72
|
-
value: string | null | undefined;
|
|
73
|
-
/** A currency was picked. The host closes the list. */
|
|
74
|
-
onChoose: (code: string) => void;
|
|
75
|
-
/** Only these ISO codes, in this order; codes the kit has no definition for are
|
|
76
|
-
* dropped. Default every one of {@link CURRENCIES} that is not `retired` (the chosen
|
|
77
|
-
* one too, if it is). A retired code named here stays: the list is the caller's. */
|
|
78
|
-
codes?: readonly string[];
|
|
79
|
-
/** Translated names by code — see {@link currencyName}. */
|
|
80
|
-
currencyNames?: Record<string, string>;
|
|
81
|
-
locale?: string;
|
|
82
|
-
searchPlaceholder: string;
|
|
83
|
-
/** The phone sheet's title — the field's name. */
|
|
84
|
-
sheetTitle: ReactNode;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* The currency list — its filter and its rows — that CurrencySelect and AmountInput's
|
|
89
|
-
* currency chip both render, on the picker family's `ComboboxPanel` (round 0.34 Wave 2,
|
|
90
|
-
* DUP-4 + BUG-12).
|
|
91
|
-
*
|
|
92
|
-
* The chip's list was a hand copy of CurrencySelect's, and it had drifted: the name kept a
|
|
93
|
-
* plain `truncate` where T1 made CurrencySelect's wrap from Large up, it took no `options`
|
|
94
|
-
* subset, it had no check mark and no listbox id, and it was a fixed 16rem where #308 had
|
|
95
|
-
* given CurrencySelect a panel that grows to the full names. And both were lists of plain
|
|
96
|
-
* buttons under a trigger that promised a listbox. On the shared panel they are a listbox
|
|
97
|
-
* of options, the chosen one selected, with the arrow keys, the live result count, the
|
|
98
|
-
* phone sheet (live #200) and portal anchoring (dev#548: an `overflow` ancestor clipped
|
|
99
|
-
* the absolute panel's first third away).
|
|
100
|
-
*
|
|
101
|
-
* The panel hangs from the trigger's END edge and grows toward the start, as wide as the
|
|
102
|
-
* names need up to 20rem and the glass (feedback #308: a field with content after it is
|
|
103
|
-
* not pushed past the page).
|
|
104
|
-
*/
|
|
105
|
-
export function CurrencyOptionList({
|
|
106
|
-
core,
|
|
107
|
-
listboxId,
|
|
108
|
-
value,
|
|
109
|
-
onChoose,
|
|
110
|
-
codes,
|
|
111
|
-
currencyNames,
|
|
112
|
-
locale,
|
|
113
|
-
searchPlaceholder,
|
|
114
|
-
sheetTitle,
|
|
115
|
-
}: CurrencyOptionListProps) {
|
|
116
|
-
const held = getCurrency(value);
|
|
117
|
-
const chosen = held?.code;
|
|
118
|
-
// A retired currency the field holds — the one the default list keeps for it. Its own
|
|
119
|
-
// key, so a change of an ordinary value does not rebuild the rows and their names.
|
|
120
|
-
const heldRetired = held?.retired ? held.code : undefined;
|
|
121
|
-
// Keyed on the codes' CONTENTS: an inline `options={["EUR", "CHF"]}` is a new array
|
|
122
|
-
// every render.
|
|
123
|
-
const codesKey = codes?.join(",");
|
|
124
|
-
const pool = useMemo(
|
|
125
|
-
() =>
|
|
126
|
-
codesKey === undefined
|
|
127
|
-
? // No currency that was replaced (the lev, since Bulgaria's euro: keksdose audit
|
|
128
|
-
// follow-up, 2026-11-01) — unless the field holds it, which then opens on its
|
|
129
|
-
// own row, checked, rather than on a list where nothing is chosen.
|
|
130
|
-
CURRENCIES.filter((c) => !c.retired || c.code === heldRetired)
|
|
131
|
-
: // The caller's order; codes the kit has no definition for are dropped.
|
|
132
|
-
codesKey
|
|
133
|
-
.split(",")
|
|
134
|
-
.map((code) => getCurrency(code))
|
|
135
|
-
.filter((c): c is CurrencyOption => c !== undefined),
|
|
136
|
-
[codesKey, heldRetired],
|
|
137
|
-
);
|
|
138
|
-
const named = useMemo(
|
|
139
|
-
() => pool.map((c) => ({ c, name: currencyName(c, currencyNames, locale) })),
|
|
140
|
-
[pool, currencyNames, locale],
|
|
141
|
-
);
|
|
142
|
-
const byCode = useMemo(() => new Map(named.map((n) => [n.c.code, n])), [named]);
|
|
143
|
-
|
|
144
|
-
// The code, the name the row SHOWS (so a translated list is searchable in the language
|
|
145
|
-
// it is written in) and the symbol — folded as every kit list folds (DUP-5).
|
|
146
|
-
const query = core.query;
|
|
147
|
-
const results = useMemo(() => {
|
|
148
|
-
// Every word of the query, in the code, the name or the symbol (0.51.4).
|
|
149
|
-
const words = searchWords(query, locale);
|
|
150
|
-
const hits =
|
|
151
|
-
words.length > 0 ? named.filter(({ c, name }) => matchesSearch(words, [c.code, name, c.symbol], locale)) : named;
|
|
152
|
-
return hits.map(({ c, name }): ComboOption<string> => ({
|
|
153
|
-
value: c.code,
|
|
154
|
-
label: name,
|
|
155
|
-
icon: <CurrencyFlag country={c.country} />,
|
|
156
|
-
}));
|
|
157
|
-
}, [named, query, locale]);
|
|
158
|
-
|
|
159
|
-
return (
|
|
160
|
-
<ComboboxPanel
|
|
161
|
-
// The core with the currency filter's rows in place of its own.
|
|
162
|
-
core={{ ...core, results }}
|
|
163
|
-
listboxId={listboxId}
|
|
164
|
-
searchPlaceholder={searchPlaceholder}
|
|
165
|
-
sheetTitle={sheetTitle}
|
|
166
|
-
isSelected={(code) => code === chosen}
|
|
167
|
-
onChoose={(o) => onChoose(o.value)}
|
|
168
|
-
showCreate={false}
|
|
169
|
-
onCreate={() => {}}
|
|
170
|
-
createContent={null}
|
|
171
|
-
width={{ fit: true, maxRem: 20 }}
|
|
172
|
-
align="end"
|
|
173
|
-
renderOption={(o) => {
|
|
174
|
-
const row = byCode.get(o.value);
|
|
175
|
-
if (!row) return o.label;
|
|
176
|
-
return (
|
|
177
|
-
<>
|
|
178
|
-
<span className="w-8 shrink-0 font-mono text-muted">{row.c.symbol}</span>{" "}
|
|
179
|
-
<span className="shrink-0 font-medium text-primary">{row.c.code}</span>{" "}
|
|
180
|
-
{/* The name wraps from Large up (round 0.34 T1); the code beside it is what a
|
|
181
|
-
reader scans for, and it never shrinks. */}
|
|
182
|
-
<span className="min-w-0 truncate-until-large text-muted">{row.name}</span>
|
|
183
|
-
</>
|
|
184
|
-
);
|
|
185
|
-
}}
|
|
186
|
-
/>
|
|
187
|
-
);
|
|
188
|
-
}
|
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
import { useCallback, useId } from "react";
|
|
2
|
-
import type { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
|
|
3
|
-
import { FieldChevron, FIELD_TRIGGER, FIELD_INVALID, FIELD_FLOATING_PAD } from "./field-base";
|
|
4
|
-
import { FieldLabel } from "./field-parts";
|
|
5
|
-
import {
|
|
6
|
-
assignRef,
|
|
7
|
-
EndHintRow,
|
|
8
|
-
LockedReason,
|
|
9
|
-
useFieldMessages,
|
|
10
|
-
useLockReason,
|
|
11
|
-
type DisabledReasonDisplay,
|
|
12
|
-
type FieldHelpProps,
|
|
13
|
-
} from "./field-parts";
|
|
14
|
-
import type { CommitScope } from "./write-lock";
|
|
15
|
-
import { cn } from "../lib/cn";
|
|
16
|
-
import { useComboboxCore } from "./combobox-core";
|
|
17
|
-
import {
|
|
18
|
-
CURRENCIES,
|
|
19
|
-
CurrencyFlag,
|
|
20
|
-
CurrencyOptionList,
|
|
21
|
-
currencyName,
|
|
22
|
-
getCurrency,
|
|
23
|
-
type CurrencyFlagProps,
|
|
24
|
-
type CurrencyOption,
|
|
25
|
-
} from "./currency-option-list";
|
|
26
|
-
import { DEFAULT_COMMON_LABELS, DEFAULT_CURRENCY_LABELS, useKitLabels, useKitLocale } from "../i18n/kit-labels";
|
|
27
|
-
|
|
28
|
-
// The data and the flag are declared beside the one list both currency pickers render
|
|
29
|
-
// (./currency-option-list, round 0.34 Wave 2, DUP-4) and are this module's exports, as
|
|
30
|
-
// they always were.
|
|
31
|
-
export { CURRENCIES, CurrencyFlag, currencyName, getCurrency };
|
|
32
|
-
export type { CurrencyFlagProps, CurrencyOption };
|
|
33
|
-
|
|
34
|
-
/** `onChange` is the kit's — "a currency was picked", carrying the code — rather
|
|
35
|
-
* than the div's form event. */
|
|
36
|
-
export interface CurrencySelectProps extends Omit<ComponentPropsWithoutRef<"div">, "onChange">, FieldHelpProps {
|
|
37
|
-
value: string;
|
|
38
|
-
onChange: (code: string) => void;
|
|
39
|
-
placeholder?: string;
|
|
40
|
-
label?: ReactNode;
|
|
41
|
-
/**
|
|
42
|
-
* Restrict the pickable currencies to these ISO codes (e.g. only the
|
|
43
|
-
* currencies actually present in a budget). Order is preserved. Defaults to
|
|
44
|
-
* the full {@link CURRENCIES} list but a `retired` currency (the lev, since
|
|
45
|
-
* Bulgaria's euro), which only a field that holds it lists. A retired code named
|
|
46
|
-
* here is offered: the list is the caller's.
|
|
47
|
-
*/
|
|
48
|
-
options?: string[];
|
|
49
|
-
/** Required and unanswered — {@link FIELD_INVALID}, the same rose border the
|
|
50
|
-
* native `Select` has worn since feedback #235. Every field-styled control in
|
|
51
|
-
* this package carries it now, so a form can mark any of its fields rather than
|
|
52
|
-
* only the one that happened to have it first. */
|
|
53
|
-
invalid?: boolean;
|
|
54
|
-
/**
|
|
55
|
-
* What is wrong with the choice, in the caller's own words — {@link Input}'s `error`
|
|
56
|
-
* (keksdose K4: of the kit's pickers this one had neither a message nor a caption, so
|
|
57
|
-
* "the account is in EUR" sat in a loose `<p>` beside it that nothing pointed at).
|
|
58
|
-
* Rendered under the field, after a text `hint`; merged into the trigger's
|
|
59
|
-
* `aria-describedby`; implies `invalid`. `null`, `false` and `""` are no message.
|
|
60
|
-
*/
|
|
61
|
-
error?: ReactNode;
|
|
62
|
-
/**
|
|
63
|
-
* {@link Select}'s `hint`, the same rule (keksdose K4). A {@link FieldHint} "?" rides
|
|
64
|
-
* the label's line; on an unlabelled picker it sits at the field's end edge, outside
|
|
65
|
-
* the box. Plain TEXT (a string or a number) is a caption UNDER the field, attached
|
|
66
|
-
* to the trigger through `aria-describedby` — the label line has no room for a
|
|
67
|
-
* sentence.
|
|
68
|
-
*/
|
|
69
|
-
hint?: ReactNode;
|
|
70
|
-
/** Every user-facing string this control owns, shaped like `AmountInput`'s
|
|
71
|
-
* `labels` so the two currency pickers in the kit are configured the same way.
|
|
72
|
-
*
|
|
73
|
-
* `search` exists because `placeholder` used to do BOTH jobs: it named the empty
|
|
74
|
-
* field and, for want of anything else, it was also handed to the search box —
|
|
75
|
-
* so a caller who wrote "Currency" got "Currency" as the prompt for typing a
|
|
76
|
-
* filter, and a caller who wanted to name the filter had to rename the field.
|
|
77
|
-
* `placeholder` still wins for the trigger, so nothing moves for the callers
|
|
78
|
-
* that set it; what changes is that the search box no longer borrows it. */
|
|
79
|
-
labels?: {
|
|
80
|
-
/** The empty trigger, when `placeholder` is not given. */
|
|
81
|
-
currency?: string;
|
|
82
|
-
/** The filter box inside the open panel. */
|
|
83
|
-
search?: string;
|
|
84
|
-
};
|
|
85
|
-
/**
|
|
86
|
-
* Translated currency names, keyed by ISO code — `{ CHF: "Schweizer Franken" }`.
|
|
87
|
-
*
|
|
88
|
-
* {@link CURRENCIES} is data the package ships, so its 27 names were the one
|
|
89
|
-
* string in the row a consumer could not translate: the code and the symbol are
|
|
90
|
-
* language-neutral, and the name beside them stayed English in a German UI. This
|
|
91
|
-
* is a sparse OVERRIDE rather than a replacement list, so an app translates the
|
|
92
|
-
* eight currencies it actually uses and keeps the rest; forking `CURRENCIES` to
|
|
93
|
-
* get there would also fork the flags and symbols, which nobody wants to maintain.
|
|
94
|
-
*
|
|
95
|
-
* The search matches what is SHOWN — type "Franken" and you find CHF — because a
|
|
96
|
-
* filter that only matches the hidden English name is worse than no filter.
|
|
97
|
-
*/
|
|
98
|
-
currencyNames?: Record<string, string>;
|
|
99
|
-
/** As {@link Select}'s: no focus, no list, the settled look, no chevron. */
|
|
100
|
-
disabled?: boolean;
|
|
101
|
-
/**
|
|
102
|
-
* Why the currency cannot be changed — {@link Select}'s `disabledReason` (keksdose,
|
|
103
|
-
* 2026-10-23: a budget's currency for a guest or a viewer, and while offline, which
|
|
104
|
-
* keksdose drew as a one-option `Select` to keep the reason and lost the flag). The
|
|
105
|
-
* trigger stays focusable and `aria-disabled` (never the `disabled` attribute), keeps
|
|
106
|
-
* its flag and code, opens nothing, and `onChange` is never called; the reason is a
|
|
107
|
-
* line under the field at Large and on a touch screen, else in the kit
|
|
108
|
-
* {@link Tooltip} (`disabledReasonDisplay`), and on the trigger's `aria-describedby`
|
|
109
|
-
* (after a caption, before an error). It wears the settled look of a disabled field
|
|
110
|
-
* and drops its chevron, as a locked Select does. It wins over `disabled`.
|
|
111
|
-
*/
|
|
112
|
-
disabledReason?: ReactNode;
|
|
113
|
-
/** Where the reason shows — {@link Select}'s `disabledReasonDisplay`: a line under the
|
|
114
|
-
* field at Large and on a touch screen by default, the tooltip otherwise. */
|
|
115
|
-
disabledReasonDisplay?: DisabledReasonDisplay;
|
|
116
|
-
/**
|
|
117
|
-
* This picker COMMITS — choosing saves. Under a locked {@link WriteLockProvider} it is
|
|
118
|
-
* locked the `disabledReason` way with the lock's reason (which wins over its own).
|
|
119
|
-
* No provider, or an unlocked one: no effect. {@link Select}'s `commit`. A currency
|
|
120
|
-
* field inside a form with its own Save stays editable under the lock — leave this off
|
|
121
|
-
* there, and put `commit` on the Save.
|
|
122
|
-
*/
|
|
123
|
-
commit?: CommitScope;
|
|
124
|
-
/** The TRIGGER — the focusable `<button>` — as a React 19 ref prop, as on
|
|
125
|
-
* {@link MultiSelect} and {@link CountrySelect}: react-hook-form's focus-on-error
|
|
126
|
-
* calls `focus()` on it (0.34, API-3, refactor audit 2026-10). Not the wrapper. */
|
|
127
|
-
ref?: Ref<HTMLButtonElement>;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function CurrencySelect({
|
|
131
|
-
value,
|
|
132
|
-
onChange,
|
|
133
|
-
placeholder,
|
|
134
|
-
className,
|
|
135
|
-
label,
|
|
136
|
-
options,
|
|
137
|
-
invalid,
|
|
138
|
-
error,
|
|
139
|
-
hint,
|
|
140
|
-
help,
|
|
141
|
-
labels,
|
|
142
|
-
currencyNames,
|
|
143
|
-
disabled,
|
|
144
|
-
disabledReason,
|
|
145
|
-
disabledReasonDisplay,
|
|
146
|
-
commit,
|
|
147
|
-
"aria-label": ariaLabel,
|
|
148
|
-
"aria-describedby": ariaDescribedBy,
|
|
149
|
-
"aria-invalid": ariaInvalid,
|
|
150
|
-
ref,
|
|
151
|
-
...rest
|
|
152
|
-
}: CurrencySelectProps) {
|
|
153
|
-
// The picker family's foundation (round 0.34 Wave 2, DUP-4): open state, the query,
|
|
154
|
-
// the highlighted row, portal anchoring, outside press, Escape on the kit's stack and
|
|
155
|
-
// Back — what `useDropdownSearch` gave it, and the rest it did not. `filter: false`:
|
|
156
|
-
// the list's own currency filter hands the panel its rows.
|
|
157
|
-
const core = useComboboxCore<string>({ filter: false, backCloses: true });
|
|
158
|
-
const { open, setOpen, triggerRef, closeToTrigger } = core;
|
|
159
|
-
// The core anchors the panel to the trigger and hands focus back to it; the caller's
|
|
160
|
-
// `ref` wants the same element. One callback feeds both, as on MultiSelect.
|
|
161
|
-
const setTrigger = useCallback(
|
|
162
|
-
(el: HTMLButtonElement | null) => {
|
|
163
|
-
triggerRef.current = el;
|
|
164
|
-
assignRef(ref, el);
|
|
165
|
-
},
|
|
166
|
-
[ref, triggerRef],
|
|
167
|
-
);
|
|
168
|
-
// `labels` > `currency` from the provider > English.
|
|
169
|
-
const text = useKitLabels("currency", DEFAULT_CURRENCY_LABELS, labels);
|
|
170
|
-
const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
|
|
171
|
-
const locale = useKitLocale();
|
|
172
|
-
|
|
173
|
-
const selected = getCurrency(value);
|
|
174
|
-
|
|
175
|
-
// The lock — Select's (`useLockReason`): the WriteLock's reason under `commit`, else
|
|
176
|
-
// the caller's own. Locked or `disabled`, nothing opens the list or picks a value.
|
|
177
|
-
const lock = useLockReason(commit, disabledReason);
|
|
178
|
-
const locked = lock.locked;
|
|
179
|
-
const inert = locked || Boolean(disabled);
|
|
180
|
-
// A lock (or `disabled`) arriving while the list is up closes it — adjusted while
|
|
181
|
-
// rendering, as CountrySelect does, so no frame shows a list that cannot be used.
|
|
182
|
-
if (inert && open) setOpen(false);
|
|
183
|
-
|
|
184
|
-
const listboxId = `${useId()}-listbox`;
|
|
185
|
-
// Text is a caption under the field; anything else (a FieldHint) rides the label
|
|
186
|
-
// line — and a FieldHint is that caption at Large and on touch (§4). See `hint`. On
|
|
187
|
-
// the TRIGGER, which is the control with a role: a caller's description used to land
|
|
188
|
-
// on the wrapper `<div>` through the spread, where nothing reads it. The caller's ids
|
|
189
|
-
// first, then the caption, then the error — Select's order, through useFieldMessages
|
|
190
|
-
// since 0.34 (DUP-2, DUP-8).
|
|
191
|
-
const field = useFieldMessages({
|
|
192
|
-
hint,
|
|
193
|
-
help,
|
|
194
|
-
name: label ?? ariaLabel,
|
|
195
|
-
error,
|
|
196
|
-
invalid,
|
|
197
|
-
describedBy: ariaDescribedBy,
|
|
198
|
-
ariaInvalid,
|
|
199
|
-
// A lock's reason sits between the caption and the error, as on Select.
|
|
200
|
-
reasonId: locked && lock.reasonId,
|
|
201
|
-
});
|
|
202
|
-
const { labelHint, describedBy, isInvalid } = field;
|
|
203
|
-
|
|
204
|
-
// The trigger's NAME. A combobox does not take its name from its content, and the
|
|
205
|
-
// floating label is a <span>, not a <label for> — so without `aria-label` from the
|
|
206
|
-
// caller this trigger had no name at all (keksdose's test suite, 0.5.0). Composed the
|
|
207
|
-
// way MultiSelect and the entity comboboxes compose theirs, "label: value", with the
|
|
208
|
-
// `currency` word standing in for a missing label so it is never nameless.
|
|
209
|
-
const fieldName = typeof label === "string" ? label : text.currency;
|
|
210
|
-
const name = ariaLabel ?? common.fieldValue(fieldName, selected ? selected.code : (placeholder ?? text.currency));
|
|
211
|
-
|
|
212
|
-
const trigger = (
|
|
213
|
-
<button
|
|
214
|
-
// Where Escape on the open list hands focus back to (round 0.34 BUG-1).
|
|
215
|
-
ref={setTrigger}
|
|
216
|
-
type="button"
|
|
217
|
-
aria-label={name}
|
|
218
|
-
// The focusable kind of disabled while locked (Select's rule): native `disabled`
|
|
219
|
-
// would take the field out of the tab order, and the reason with it.
|
|
220
|
-
disabled={locked ? undefined : disabled}
|
|
221
|
-
aria-disabled={locked || undefined}
|
|
222
|
-
onClick={(e) => {
|
|
223
|
-
if (inert) {
|
|
224
|
-
e.preventDefault();
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
setOpen((v) => !v);
|
|
228
|
-
}}
|
|
229
|
-
// Down/Up opens the list from the closed trigger, per the APG; Enter and Space
|
|
230
|
-
// already do through the button's own click.
|
|
231
|
-
onKeyDown={(e) => {
|
|
232
|
-
if (inert) return;
|
|
233
|
-
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
234
|
-
e.preventDefault();
|
|
235
|
-
setOpen(true);
|
|
236
|
-
}
|
|
237
|
-
}}
|
|
238
|
-
// The implicit `button` role supports neither `aria-expanded` nor
|
|
239
|
-
// `aria-invalid`, so this trigger previously wore a red border and announced
|
|
240
|
-
// nothing about being invalid or about there being a list behind it. The role
|
|
241
|
-
// that DESCRIBES it is the one that also supports the attributes — the same
|
|
242
|
-
// treatment its siblings (MultiSelect, the entity comboboxes) now carry, so a
|
|
243
|
-
// form row of pickers reads the same way throughout. And since Wave 2 the popup
|
|
244
|
-
// IS the listbox it promises, of options with the chosen one selected (BUG-12).
|
|
245
|
-
role="combobox"
|
|
246
|
-
aria-haspopup="listbox"
|
|
247
|
-
aria-controls={listboxId}
|
|
248
|
-
aria-expanded={open}
|
|
249
|
-
aria-invalid={isInvalid || undefined}
|
|
250
|
-
aria-describedby={describedBy}
|
|
251
|
-
className={cn(
|
|
252
|
-
FIELD_TRIGGER,
|
|
253
|
-
"pe-9",
|
|
254
|
-
label !== undefined && FIELD_FLOATING_PAD,
|
|
255
|
-
// FIELD_BASE's `disabled:` look, for a trigger locked without being `disabled`
|
|
256
|
-
// (the `:disabled` variants cannot match it) — Select's FIELD_LOCKED. No hover:
|
|
257
|
-
// nothing here answers a press.
|
|
258
|
-
locked && "cursor-not-allowed bg-surface-2 text-muted hover:bg-surface-2",
|
|
259
|
-
isInvalid && FIELD_INVALID,
|
|
260
|
-
)}
|
|
261
|
-
>
|
|
262
|
-
{/* The trigger stays COMPACT — flag + code only — so it never clips in a
|
|
263
|
-
narrow field; the full names live in the (wider) popup (feedback
|
|
264
|
-
#308). */}
|
|
265
|
-
<span
|
|
266
|
-
className={cn(
|
|
267
|
-
"flex items-center gap-2 min-w-0",
|
|
268
|
-
// The settled look reaches the code too: `text-primary` here would outweigh it.
|
|
269
|
-
!selected ? "text-placeholder" : inert ? "text-muted" : "text-primary",
|
|
270
|
-
)}
|
|
271
|
-
>
|
|
272
|
-
{selected ? (
|
|
273
|
-
<>
|
|
274
|
-
<CurrencyFlag country={selected.country} />
|
|
275
|
-
<span className="font-medium">{selected.code}</span>
|
|
276
|
-
</>
|
|
277
|
-
) : (
|
|
278
|
-
(placeholder ?? text.currency)
|
|
279
|
-
)}
|
|
280
|
-
</span>
|
|
281
|
-
{/* No menu to drop while disabled or locked, so no chevron — the arrow is the one
|
|
282
|
-
thing on the control that promises a choice (dev#474, as on Select). */}
|
|
283
|
-
{!inert && <FieldChevron />}
|
|
284
|
-
</button>
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
// Select's frame: the line under the trigger, or the Tooltip with a hidden copy for
|
|
288
|
-
// `aria-describedby`. The wrapper `<div>` keeps `className`, so the layout holds.
|
|
289
|
-
// `flex w-full items-stretch`: the trigger keeps the field's full width in it.
|
|
290
|
-
const control = locked ? (
|
|
291
|
-
<LockedReason lock={lock} display={disabledReasonDisplay} className="flex w-full items-stretch">
|
|
292
|
-
{trigger}
|
|
293
|
-
</LockedReason>
|
|
294
|
-
) : (
|
|
295
|
-
trigger
|
|
296
|
-
);
|
|
297
|
-
|
|
298
|
-
return (
|
|
299
|
-
// The wrapper takes `rest`; the trigger takes the name. This field's label is a
|
|
300
|
-
// floating <span> rather than a <label for>, so a caller who wants the control to
|
|
301
|
-
// announce more than the code inside it has nowhere else to put it.
|
|
302
|
-
<div {...rest} className={cn("relative", className)}>
|
|
303
|
-
{label !== undefined &&
|
|
304
|
-
(labelHint === undefined ? (
|
|
305
|
-
<FieldLabel>{label}</FieldLabel>
|
|
306
|
-
) : (
|
|
307
|
-
// The label and its "?" as one row on the label's line, as FloatingField lays
|
|
308
|
-
// out a static label with a hint: the row places both, the label truncates
|
|
309
|
-
// and the hint keeps its width. `z-10` like FieldLabel's own: the trigger is
|
|
310
|
-
// `relative` and comes later, so it would paint over the strip.
|
|
311
|
-
<div className="pointer-events-none absolute inset-x-3 top-1 z-10 flex items-center gap-1">
|
|
312
|
-
<FieldLabel className="static z-auto min-w-0 max-w-none">{label}</FieldLabel>
|
|
313
|
-
<span className="pointer-events-auto flex shrink-0 items-center">{labelHint}</span>
|
|
314
|
-
</div>
|
|
315
|
-
))}
|
|
316
|
-
{/* No label line to ride: at the field's end edge, outside the box, as an
|
|
317
|
-
unlabelled Select places its FieldHint. */}
|
|
318
|
-
<EndHintRow hint={label === undefined ? labelHint : undefined}>{control}</EndHintRow>
|
|
319
|
-
{field.below}
|
|
320
|
-
{/* Portalled to <body> and anchored to the trigger (dev#548), so where it stands
|
|
321
|
-
in the flow no longer moves it. */}
|
|
322
|
-
<CurrencyOptionList
|
|
323
|
-
core={core}
|
|
324
|
-
listboxId={listboxId}
|
|
325
|
-
value={value}
|
|
326
|
-
codes={options}
|
|
327
|
-
currencyNames={currencyNames}
|
|
328
|
-
locale={locale}
|
|
329
|
-
searchPlaceholder={text.search}
|
|
330
|
-
// On a phone the list is a full-screen sheet, which needs the field's own name
|
|
331
|
-
// to say what it asks for (live #200).
|
|
332
|
-
sheetTitle={label ?? text.currency}
|
|
333
|
-
onChoose={(code) => {
|
|
334
|
-
if (inert) return;
|
|
335
|
-
onChange(code);
|
|
336
|
-
// Back to the trigger: the panel holding focus is about to unmount, and a
|
|
337
|
-
// keyboard user who has answered the field should stand on it, ready to Tab on.
|
|
338
|
-
closeToTrigger();
|
|
339
|
-
}}
|
|
340
|
-
/>
|
|
341
|
-
</div>
|
|
342
|
-
);
|
|
343
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// The English words of ./danger-confirm, in a module with no component code: the English
|
|
2
|
-
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
|
-
// chunk like the other languages (0.34, KS U8). ./danger-confirm re-exports them.
|
|
4
|
-
|
|
5
|
-
import type { DangerConfirmLabels } from "./danger-confirm";
|
|
6
|
-
|
|
7
|
-
/** `satisfies` rather than a type annotation, so `DEFAULT_DANGER_CONFIRM_LABELS.phrase`
|
|
8
|
-
* stays callable for a caller that composes its own label from it. */
|
|
9
|
-
export const DEFAULT_DANGER_CONFIRM_LABELS = {
|
|
10
|
-
arm: "Delete…",
|
|
11
|
-
confirm: "Delete",
|
|
12
|
-
cancel: "Cancel",
|
|
13
|
-
prompt: "This cannot be undone.",
|
|
14
|
-
password: "Password",
|
|
15
|
-
phrase: (phrase: string) => `Type “${phrase}” to confirm`,
|
|
16
|
-
acknowledge: "I have read what this does and want to continue.",
|
|
17
|
-
needsPhrase: (phrase: string) => `Type “${phrase}” to confirm`,
|
|
18
|
-
needsAcknowledge: "Tick the box to confirm",
|
|
19
|
-
needsPassword: "Enter your password to confirm",
|
|
20
|
-
} satisfies DangerConfirmLabels;
|