@eifi1/ui-kit 0.21.0 → 0.23.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 +42 -25
- package/dist/chart.d.ts +19 -14
- package/dist/components/account-chips.d.ts +10 -3
- package/dist/components/account-chips.js +5 -2
- package/dist/components/account-chips.js.map +1 -1
- package/dist/components/account-settings.d.ts +33 -2
- package/dist/components/account-settings.js +43 -21
- package/dist/components/account-settings.js.map +1 -1
- package/dist/components/amount-input.d.ts +53 -14
- package/dist/components/amount-input.js +17 -28
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.d.ts +29 -0
- package/dist/components/autocomplete.js +134 -104
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/button-group.d.ts +19 -14
- package/dist/components/calculator.d.ts +19 -14
- package/dist/components/checkbox-group.d.ts +104 -0
- package/dist/components/checkbox-group.js +111 -0
- package/dist/components/checkbox-group.js.map +1 -0
- package/dist/components/checkbox.d.ts +19 -0
- package/dist/components/checkbox.js +30 -7
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/chip.d.ts +18 -0
- package/dist/components/chip.js +47 -10
- package/dist/components/chip.js.map +1 -1
- package/dist/components/column-mapper.d.ts +182 -0
- package/dist/components/column-mapper.js +375 -0
- package/dist/components/column-mapper.js.map +1 -0
- package/dist/components/combobox-core.d.ts +39 -2
- package/dist/components/combobox-core.js +29 -6
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +91 -2
- package/dist/components/combobox.js +454 -308
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/confirm-dialog.d.ts +69 -161
- package/dist/components/confirm-dialog.js +7 -8
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/copy-button.d.ts +16 -11
- package/dist/components/country-select.d.ts +167 -0
- package/dist/components/country-select.js +293 -0
- package/dist/components/country-select.js.map +1 -0
- package/dist/components/currency-select.d.ts +17 -1
- package/dist/components/currency-select.js +56 -23
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +69 -166
- package/dist/components/danger-confirm.js +144 -50
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-cells.d.ts +1 -2
- package/dist/components/data-table-filter-popover.d.ts +1 -2
- package/dist/components/data-table-filters.d.ts +1 -2
- package/dist/components/data-table-labels.d.ts +4 -97
- package/dist/components/data-table-labels.js +9 -1
- package/dist/components/data-table-labels.js.map +1 -1
- package/dist/components/data-table-pagination.d.ts +3 -1
- package/dist/components/data-table.d.ts +1 -2
- package/dist/components/data-table.js +98 -3
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.d.ts +66 -5
- package/dist/components/date-picker.js +378 -66
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/entity-combobox.d.ts +42 -1
- package/dist/components/entity-combobox.js +154 -113
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/facing-pair.d.ts +19 -14
- package/dist/components/field-parts.d.ts +224 -0
- package/dist/components/field-parts.js +156 -0
- package/dist/components/field-parts.js.map +1 -0
- package/dist/components/field-strip.d.ts +105 -0
- package/dist/components/field-strip.js +46 -0
- package/dist/components/field-strip.js.map +1 -0
- package/dist/components/file-button.d.ts +19 -14
- package/dist/components/file-button.js +13 -3
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/file-dropzone.d.ts +41 -15
- package/dist/components/file-dropzone.js +57 -34
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/form-actions.d.ts +18 -13
- package/dist/components/form-actions.js +69 -5
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/iban-input.d.ts +69 -0
- package/dist/components/iban-input.js +125 -0
- package/dist/components/iban-input.js.map +1 -0
- package/dist/components/icon-picker.d.ts +21 -2
- package/dist/components/icon-picker.js +19 -4
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-edit-field.d.ts +167 -0
- package/dist/components/inline-edit-field.js +293 -0
- package/dist/components/inline-edit-field.js.map +1 -0
- package/dist/components/language-select.d.ts +130 -0
- package/dist/components/language-select.js +18 -0
- package/dist/components/language-select.js.map +1 -0
- package/dist/components/line-items.d.ts +25 -3
- package/dist/components/line-items.js +55 -46
- package/dist/components/line-items.js.map +1 -1
- package/dist/components/list.d.ts +25 -0
- package/dist/components/list.js +16 -5
- package/dist/components/list.js.map +1 -1
- package/dist/components/money-field.d.ts +32 -14
- package/dist/components/money-field.js.map +1 -1
- package/dist/components/month-picker.d.ts +52 -4
- package/dist/components/month-picker.js +291 -86
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.d.ts +26 -1
- package/dist/components/multi-entity-combobox.js +143 -102
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.d.ts +8 -1
- package/dist/components/multi-select.js +9 -4
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-field.d.ts +34 -19
- package/dist/components/number-field.js +6 -20
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.d.ts +79 -19
- package/dist/components/number-input.js +90 -38
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numpad-sheet.d.ts +19 -14
- package/dist/components/one-time-code-input.d.ts +100 -0
- package/dist/components/one-time-code-input.js +137 -0
- package/dist/components/one-time-code-input.js.map +1 -0
- package/dist/components/phone-input.d.ts +69 -0
- package/dist/components/phone-input.js +171 -0
- package/dist/components/phone-input.js.map +1 -0
- package/dist/components/reauth-dialog.d.ts +2 -2
- package/dist/components/reauth-dialog.js +6 -8
- package/dist/components/reauth-dialog.js.map +1 -1
- package/dist/components/series-chart.d.ts +19 -14
- package/dist/components/settings-fields.d.ts +19 -14
- package/dist/components/share-card.d.ts +16 -11
- package/dist/components/sign-chip.d.ts +66 -0
- package/dist/components/sign-chip.js +39 -0
- package/dist/components/sign-chip.js.map +1 -0
- package/dist/components/swatch-picker.d.ts +43 -2
- package/dist/components/swatch-picker.js +80 -32
- package/dist/components/swatch-picker.js.map +1 -1
- package/dist/components/switch.d.ts +19 -0
- package/dist/components/switch.js +24 -6
- package/dist/components/switch.js.map +1 -1
- package/dist/components/text-link.d.ts +18 -13
- package/dist/components/tile-radio.d.ts +88 -13
- package/dist/components/tile-radio.js +28 -11
- package/dist/components/tile-radio.js.map +1 -1
- package/dist/components/time-input.d.ts +24 -15
- package/dist/components/time-input.js.map +1 -1
- package/dist/components/toggle-group.d.ts +47 -1
- package/dist/components/toggle-group.js +110 -69
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/trigger-aria.d.ts +3 -0
- package/dist/components/trigger-aria.js +3 -1
- package/dist/components/trigger-aria.js.map +1 -1
- package/dist/components/ui.d.ts +16 -11
- package/dist/components/ui.js +284 -88
- package/dist/components/ui.js.map +1 -1
- package/dist/components/use-table-state.d.ts +1 -2
- package/dist/{data-table-3mi2R3so.d.ts → data-table-labels-B7OdnM0S.d.ts} +140 -3
- package/dist/data-table.d.ts +1 -2
- package/dist/data-table.js +2 -1
- package/dist/data-table.js.map +1 -1
- package/dist/feedback/feedback-attachment.d.ts +1 -1
- package/dist/feedback/feedback-attachment.js +348 -41
- package/dist/feedback/feedback-attachment.js.map +1 -1
- package/dist/feedback/feedback-dialog.d.ts +1 -1
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox.d.ts +3 -2
- package/dist/feedback/feedback-inbox.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +68 -253
- package/dist/feedback/feedback-thread.js +46 -10
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/{kit-labels-D1J2_jyD.d.ts → feedback-BxeQVzwq.d.ts} +1206 -20
- package/dist/{feedback-attachment-WFiXJ8We.d.ts → feedback-attachment-fGAzZPf0.d.ts} +178 -11
- package/dist/feedback.d.ts +66 -2
- package/dist/hooks/use-file-drop.d.ts +19 -14
- package/dist/i18n/defaults.d.ts +19 -14
- package/dist/i18n/defaults.js +19 -2
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.d.ts +19 -14
- package/dist/i18n/german.js +84 -5
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +15 -10
- package/dist/i18n/kit-labels.js +8 -2
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/languages.d.ts +19 -14
- package/dist/i18n/locales/de-CH.d.ts +19 -14
- package/dist/i18n/locales/en.d.ts +19 -14
- package/dist/i18n/locales/en.js +16 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +19 -14
- package/dist/i18n/locales/es.js +83 -5
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +19 -14
- package/dist/i18n/locales/fr.js +82 -5
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +19 -14
- package/dist/i18n/locales/hu.js +85 -5
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +19 -14
- package/dist/i18n/locales/it.js +84 -5
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +19 -14
- package/dist/i18n/locales/zh.js +80 -5
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.d.ts +19 -14
- package/dist/i18n/review.js +27 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +21 -10
- package/dist/index.js +73 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/column-mapping.d.ts +81 -0
- package/dist/lib/column-mapping.js +108 -0
- package/dist/lib/column-mapping.js.map +1 -0
- package/dist/lib/countries.d.ts +43 -0
- package/dist/lib/countries.js +39 -0
- package/dist/lib/countries.js.map +1 -0
- package/dist/lib/decimal-marks.d.ts +46 -0
- package/dist/lib/decimal-marks.js +40 -0
- package/dist/lib/decimal-marks.js.map +1 -0
- package/dist/lib/iban.d.ts +98 -0
- package/dist/lib/iban.js +154 -0
- package/dist/lib/iban.js.map +1 -0
- package/dist/lib/isin.d.ts +30 -0
- package/dist/lib/isin.js +36 -0
- package/dist/lib/isin.js.map +1 -0
- package/dist/lib/phone.d.ts +69 -0
- package/dist/lib/phone.js +121 -0
- package/dist/lib/phone.js.map +1 -0
- package/dist/lib/table-text.d.ts +109 -1
- package/dist/lib/table-text.js +122 -1
- package/dist/lib/table-text.js.map +1 -1
- package/dist/rhf/fields.d.ts +233 -18
- package/dist/rhf/fields.js +456 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/rhf/form.d.ts +19 -14
- package/dist/rhf.d.ts +22 -15
- package/dist/rhf.js.map +1 -1
- package/dist/shell/app-shell.d.ts +18 -13
- package/dist/shell/top-bar-brand.d.ts +19 -14
- package/dist/shell/topbar-action-menu.d.ts +36 -3
- package/dist/shell/topbar-action-menu.js +74 -33
- package/dist/shell/topbar-action-menu.js.map +1 -1
- package/dist/shell.d.ts +18 -13
- package/dist/table-text.d.ts +1 -1
- package/dist/tour/tour.js +20 -24
- package/dist/tour/tour.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +49 -16
- package/dist/wizard/stepper-nav.js +4 -0
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard.d.ts +19 -14
- package/package.json +1 -1
- package/src/components/account-chips.tsx +17 -3
- package/src/components/account-settings.tsx +92 -26
- package/src/components/amount-input.tsx +68 -56
- package/src/components/autocomplete.tsx +198 -114
- package/src/components/checkbox-group.tsx +229 -0
- package/src/components/checkbox.tsx +72 -8
- package/src/components/chip.tsx +80 -10
- package/src/components/column-mapper.tsx +666 -0
- package/src/components/combobox-core.tsx +82 -9
- package/src/components/combobox.tsx +661 -340
- package/src/components/confirm-dialog.tsx +12 -8
- package/src/components/country-select.tsx +556 -0
- package/src/components/currency-select.tsx +109 -33
- package/src/components/danger-confirm.tsx +429 -82
- package/src/components/data-table-labels.ts +16 -1
- package/src/components/data-table.tsx +175 -6
- package/src/components/date-picker.tsx +595 -71
- package/src/components/entity-combobox.tsx +235 -124
- package/src/components/field-parts.tsx +403 -0
- package/src/components/field-strip.tsx +149 -0
- package/src/components/file-button.tsx +36 -3
- package/src/components/file-dropzone.tsx +106 -38
- package/src/components/form-actions.tsx +147 -6
- package/src/components/iban-input.tsx +231 -0
- package/src/components/icon-picker.tsx +47 -6
- package/src/components/inline-edit-field.tsx +533 -0
- package/src/components/language-select.tsx +78 -0
- package/src/components/line-items.tsx +35 -2
- package/src/components/list.tsx +55 -6
- package/src/components/money-field.tsx +13 -0
- package/src/components/month-picker.tsx +400 -63
- package/src/components/multi-entity-combobox.tsx +207 -120
- package/src/components/multi-select.tsx +80 -58
- package/src/components/number-field.tsx +28 -46
- package/src/components/number-input.tsx +210 -43
- package/src/components/one-time-code-input.tsx +288 -0
- package/src/components/phone-input.tsx +299 -0
- package/src/components/reauth-dialog.tsx +17 -18
- package/src/components/sign-chip.tsx +103 -0
- package/src/components/swatch-picker.tsx +143 -31
- package/src/components/switch.tsx +58 -7
- package/src/components/tile-radio.tsx +145 -29
- package/src/components/time-input.tsx +8 -1
- package/src/components/toggle-group.tsx +206 -73
- package/src/components/trigger-aria.ts +5 -0
- package/src/components/ui.tsx +479 -138
- package/src/data-table.ts +2 -1
- package/src/feedback/feedback-attachment.tsx +597 -46
- package/src/feedback/feedback-dialog.tsx +9 -3
- package/src/feedback/feedback-inbox.tsx +3 -2
- package/src/feedback/feedback-thread.tsx +113 -9
- package/src/i18n/defaults.ts +18 -1
- package/src/i18n/german.ts +89 -0
- package/src/i18n/kit-labels.tsx +82 -2
- package/src/i18n/locales/en.ts +36 -4
- package/src/i18n/locales/es.ts +87 -0
- package/src/i18n/locales/fr.ts +87 -0
- package/src/i18n/locales/hu.ts +83 -0
- package/src/i18n/locales/it.ts +88 -0
- package/src/i18n/locales/zh.ts +76 -0
- package/src/i18n/review.ts +26 -0
- package/src/index.ts +71 -3
- package/src/lib/column-mapping.ts +234 -0
- package/src/lib/countries.ts +91 -0
- package/src/lib/decimal-marks.ts +99 -0
- package/src/lib/iban.ts +171 -0
- package/src/lib/isin.ts +62 -0
- package/src/lib/phone.ts +211 -0
- package/src/lib/table-text.ts +271 -0
- package/src/rhf/fields.tsx +860 -9
- package/src/rhf.ts +3 -1
- package/src/shell/topbar-action-menu.tsx +134 -38
- package/src/tour/tour.tsx +66 -28
- package/src/wizard/stepper-nav.tsx +35 -1
|
@@ -2,6 +2,7 @@ import { useMemo, useId } from "react";
|
|
|
2
2
|
import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
3
3
|
import { Check } from "lucide-react";
|
|
4
4
|
import { FieldChevron, FieldLabel, FIELD_TRIGGER, FIELD_INVALID, FIELD_FLOATING_PAD } from "./ui";
|
|
5
|
+
import { hasMessage, mergeDescribedBy } from "./choice-parts";
|
|
5
6
|
import { cn } from "../lib/cn";
|
|
6
7
|
import { DropdownPanel, DropdownSearchHeader, useDropdownSearch } from "./dropdown";
|
|
7
8
|
import {
|
|
@@ -117,6 +118,22 @@ export interface CurrencySelectProps extends Omit<ComponentPropsWithoutRef<"div"
|
|
|
117
118
|
* this package carries it now, so a form can mark any of its fields rather than
|
|
118
119
|
* only the one that happened to have it first. */
|
|
119
120
|
invalid?: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* What is wrong with the choice, in the caller's own words — {@link Input}'s `error`
|
|
123
|
+
* (keksdose K4: of the kit's pickers this one had neither a message nor a caption, so
|
|
124
|
+
* "the account is in EUR" sat in a loose `<p>` beside it that nothing pointed at).
|
|
125
|
+
* Rendered under the field, after a text `hint`; merged into the trigger's
|
|
126
|
+
* `aria-describedby`; implies `invalid`. `null`, `false` and `""` are no message.
|
|
127
|
+
*/
|
|
128
|
+
error?: ReactNode;
|
|
129
|
+
/**
|
|
130
|
+
* {@link Select}'s `hint`, the same rule (keksdose K4). A {@link FieldHint} "?" rides
|
|
131
|
+
* the label's line; on an unlabelled picker it sits at the field's end edge, outside
|
|
132
|
+
* the box. Plain TEXT (a string or a number) is a caption UNDER the field, attached
|
|
133
|
+
* to the trigger through `aria-describedby` — the label line has no room for a
|
|
134
|
+
* sentence.
|
|
135
|
+
*/
|
|
136
|
+
hint?: ReactNode;
|
|
120
137
|
/** Every user-facing string this control owns, shaped like `AmountInput`'s
|
|
121
138
|
* `labels` so the two currency pickers in the kit are configured the same way.
|
|
122
139
|
*
|
|
@@ -156,9 +173,13 @@ export function CurrencySelect({
|
|
|
156
173
|
label,
|
|
157
174
|
options,
|
|
158
175
|
invalid,
|
|
176
|
+
error,
|
|
177
|
+
hint,
|
|
159
178
|
labels,
|
|
160
179
|
currencyNames,
|
|
161
180
|
"aria-label": ariaLabel,
|
|
181
|
+
"aria-describedby": ariaDescribedBy,
|
|
182
|
+
"aria-invalid": ariaInvalid,
|
|
162
183
|
...rest
|
|
163
184
|
}: CurrencySelectProps) {
|
|
164
185
|
const { open, setOpen, wrapperRef, query, setQuery, inputRef } = useDropdownSearch();
|
|
@@ -185,6 +206,18 @@ export function CurrencySelect({
|
|
|
185
206
|
}, [query, pool, currencyNames, locale]);
|
|
186
207
|
|
|
187
208
|
const listboxId = `${useId()}-listbox`;
|
|
209
|
+
const hintId = useId();
|
|
210
|
+
const errorId = useId();
|
|
211
|
+
// Text is a caption under the field; anything else (a FieldHint) rides the label
|
|
212
|
+
// line. See `hint`.
|
|
213
|
+
const textHint = (typeof hint === "string" && hint !== "") || typeof hint === "number";
|
|
214
|
+
const labelHint = !textHint && hasMessage(hint) ? hint : undefined;
|
|
215
|
+
const hasError = hasMessage(error);
|
|
216
|
+
// On the TRIGGER, which is the control with a role: a caller's description used to
|
|
217
|
+
// land on the wrapper `<div>` through the spread, where nothing reads it. The
|
|
218
|
+
// caller's ids first, then the caption, then the error — Select's order.
|
|
219
|
+
const describedBy = mergeDescribedBy(ariaDescribedBy, textHint && hintId, hasError && errorId);
|
|
220
|
+
const isInvalid = Boolean(invalid) || hasError || ariaInvalid === true || ariaInvalid === "true";
|
|
188
221
|
|
|
189
222
|
// The trigger's NAME. A combobox does not take its name from its content, and the
|
|
190
223
|
// floating label is a <span>, not a <label for> — so without `aria-label` from the
|
|
@@ -194,44 +227,70 @@ export function CurrencySelect({
|
|
|
194
227
|
const fieldName = typeof label === "string" ? label : text.currency;
|
|
195
228
|
const name = ariaLabel ?? common.fieldValue(fieldName, selected ? selected.code : (placeholder ?? text.currency));
|
|
196
229
|
|
|
230
|
+
const trigger = (
|
|
231
|
+
<button
|
|
232
|
+
type="button"
|
|
233
|
+
aria-label={name}
|
|
234
|
+
onClick={() => setOpen((v) => !v)}
|
|
235
|
+
// The implicit `button` role supports neither `aria-expanded` nor
|
|
236
|
+
// `aria-invalid`, so this trigger previously wore a red border and announced
|
|
237
|
+
// nothing about being invalid or about there being a list behind it. The role
|
|
238
|
+
// that DESCRIBES it is the one that also supports the attributes — the same
|
|
239
|
+
// treatment its siblings (MultiSelect, the entity comboboxes) now carry, so a
|
|
240
|
+
// form row of pickers reads the same way throughout.
|
|
241
|
+
role="combobox"
|
|
242
|
+
aria-haspopup="listbox"
|
|
243
|
+
aria-controls={listboxId}
|
|
244
|
+
aria-expanded={open}
|
|
245
|
+
aria-invalid={isInvalid || undefined}
|
|
246
|
+
aria-describedby={describedBy}
|
|
247
|
+
className={cn(FIELD_TRIGGER, "pe-9", label !== undefined && FIELD_FLOATING_PAD, isInvalid && FIELD_INVALID)}
|
|
248
|
+
>
|
|
249
|
+
{/* The trigger stays COMPACT — flag + code only — so it never clips in a
|
|
250
|
+
narrow field; the full names live in the (wider) popup (feedback
|
|
251
|
+
#308). */}
|
|
252
|
+
<span className={cn("flex items-center gap-2 min-w-0", selected ? "text-[var(--text-primary)]" : "text-[var(--text-placeholder)]")}>
|
|
253
|
+
{selected ? (
|
|
254
|
+
<>
|
|
255
|
+
<CurrencyFlag country={selected.country} />
|
|
256
|
+
<span className="font-medium">{selected.code}</span>
|
|
257
|
+
</>
|
|
258
|
+
) : (
|
|
259
|
+
placeholder ?? text.currency
|
|
260
|
+
)}
|
|
261
|
+
</span>
|
|
262
|
+
<FieldChevron />
|
|
263
|
+
</button>
|
|
264
|
+
);
|
|
265
|
+
|
|
197
266
|
return (
|
|
198
267
|
// The wrapper takes `rest`; the trigger takes the name. This field's label is a
|
|
199
268
|
// floating <span> rather than a <label for>, so a caller who wants the control to
|
|
200
269
|
// announce more than the code inside it has nowhere else to put it.
|
|
201
270
|
<div {...rest} ref={wrapperRef} className={cn("relative", className)}>
|
|
202
|
-
{label !== undefined &&
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
className=
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
<>
|
|
226
|
-
<CurrencyFlag country={selected.country} />
|
|
227
|
-
<span className="font-medium">{selected.code}</span>
|
|
228
|
-
</>
|
|
229
|
-
) : (
|
|
230
|
-
placeholder ?? text.currency
|
|
231
|
-
)}
|
|
232
|
-
</span>
|
|
233
|
-
<FieldChevron />
|
|
234
|
-
</button>
|
|
271
|
+
{label !== undefined &&
|
|
272
|
+
(labelHint === undefined ? (
|
|
273
|
+
<FieldLabel>{label}</FieldLabel>
|
|
274
|
+
) : (
|
|
275
|
+
// The label and its "?" as one row on the label's line, as FloatingField lays
|
|
276
|
+
// out a static label with a hint: the row places both, the label truncates
|
|
277
|
+
// and the hint keeps its width. `z-10` like FieldLabel's own: the trigger is
|
|
278
|
+
// `relative` and comes later, so it would paint over the strip.
|
|
279
|
+
<div className="pointer-events-none absolute inset-x-3 top-1 z-10 flex items-center gap-1">
|
|
280
|
+
<FieldLabel className="static z-auto min-w-0 max-w-none">{label}</FieldLabel>
|
|
281
|
+
<span className="pointer-events-auto flex shrink-0 items-center">{labelHint}</span>
|
|
282
|
+
</div>
|
|
283
|
+
))}
|
|
284
|
+
{label === undefined && labelHint !== undefined ? (
|
|
285
|
+
// No label line to ride: at the field's end edge, outside the box, as an
|
|
286
|
+
// unlabelled Select places its FieldHint.
|
|
287
|
+
<div className="flex items-center gap-1.5">
|
|
288
|
+
<div className="min-w-0 flex-1">{trigger}</div>
|
|
289
|
+
<span className="flex shrink-0 items-center">{labelHint}</span>
|
|
290
|
+
</div>
|
|
291
|
+
) : (
|
|
292
|
+
trigger
|
|
293
|
+
)}
|
|
235
294
|
{open && (
|
|
236
295
|
<DropdownPanel
|
|
237
296
|
// At least as wide as the trigger, but grows to fit the full currency
|
|
@@ -278,6 +337,23 @@ export function CurrencySelect({
|
|
|
278
337
|
})}
|
|
279
338
|
</DropdownPanel>
|
|
280
339
|
)}
|
|
340
|
+
{/* After the panel, not before it, as MultiSelect places its message: the panel
|
|
341
|
+
is `absolute` with no `top`, so it opens at its place in the flow — under the
|
|
342
|
+
caption, had the caption come first. */}
|
|
343
|
+
{textHint && (
|
|
344
|
+
<p id={hintId} className="mt-1 text-[11px] leading-tight text-[var(--text-muted)]">
|
|
345
|
+
{hint}
|
|
346
|
+
</p>
|
|
347
|
+
)}
|
|
348
|
+
{hasError && (
|
|
349
|
+
<p id={errorId} className={FIELD_ERROR_CLASS}>
|
|
350
|
+
{error}
|
|
351
|
+
</p>
|
|
352
|
+
)}
|
|
281
353
|
</div>
|
|
282
354
|
);
|
|
283
355
|
}
|
|
356
|
+
|
|
357
|
+
// The error line under a field — the type of `ui.tsx`'s (module-private) one, so a
|
|
358
|
+
// CurrencySelect's message is indistinguishable from an Input's.
|
|
359
|
+
const FIELD_ERROR_CLASS = "mt-1 text-[11px] leading-tight text-[var(--danger)]";
|