@bigbinary/neeto-atoms 1.0.114 → 1.0.115
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/dist/{Select-C5ZsQHGK.js → Select-CLfVAG_p.js} +13 -12
- package/dist/Select-CLfVAG_p.js.map +1 -0
- package/dist/{Toastr-CXqmoXjn.js → Toastr-FXUexjdi.js} +13 -4
- package/dist/Toastr-FXUexjdi.js.map +1 -0
- package/dist/cjs/{Select-DRH-AINK.js → Select-DFz2VIUv.js} +13 -12
- package/dist/cjs/Select-DFz2VIUv.js.map +1 -0
- package/dist/cjs/{Toastr-9DXjD-Mq.js → Toastr-Bp5zV23g.js} +13 -4
- package/dist/cjs/Toastr-Bp5zV23g.js.map +1 -0
- package/dist/cjs/components/Select.js +1 -1
- package/dist/cjs/components/Toastr.js +1 -1
- package/dist/cjs/components/index.js +2 -2
- package/dist/cjs/formik/Select.js +1 -1
- package/dist/cjs/formik/index.js +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/components/Select.js +1 -1
- package/dist/components/Toastr.js +1 -1
- package/dist/components/index.js +2 -2
- package/dist/formik/Select.js +1 -1
- package/dist/formik/index.js +1 -1
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/Select-C5ZsQHGK.js.map +0 -1
- package/dist/Toastr-CXqmoXjn.js.map +0 -1
- package/dist/cjs/Select-DRH-AINK.js.map +0 -1
- package/dist/cjs/Toastr-9DXjD-Mq.js.map +0 -1
|
@@ -157,7 +157,7 @@ function useCreatableItems({
|
|
|
157
157
|
if (!isCreatable || trimmedInput.length === 0) return false;
|
|
158
158
|
const lower = trimmedInput.toLowerCase();
|
|
159
159
|
return !flatOptions.some(
|
|
160
|
-
(o) => o.label.toLowerCase() === lower || o.value.toLowerCase() === lower
|
|
160
|
+
(o) => String(o.label).toLowerCase() === lower || String(o.value).toLowerCase() === lower
|
|
161
161
|
) && !selectedValues.includes(trimmedInput);
|
|
162
162
|
}, [isCreatable, trimmedInput, flatOptions, selectedValues]);
|
|
163
163
|
const effectiveItems = React__default.useMemo(
|
|
@@ -174,7 +174,7 @@ function useCreatableItems({
|
|
|
174
174
|
(itemValue, query, itemToString) => {
|
|
175
175
|
if (isCreateValue(itemValue)) return true;
|
|
176
176
|
const label = itemToString?.(itemValue) ?? itemValue;
|
|
177
|
-
return label.toLowerCase().includes(query.toLowerCase());
|
|
177
|
+
return String(label).toLowerCase().includes(query.toLowerCase());
|
|
178
178
|
},
|
|
179
179
|
[]
|
|
180
180
|
);
|
|
@@ -357,7 +357,7 @@ function useSelectState(props) {
|
|
|
357
357
|
const handleValueChange = useCallback(
|
|
358
358
|
(next) => {
|
|
359
359
|
const raw = next ?? "";
|
|
360
|
-
if (raw
|
|
360
|
+
if (isCreateValue(raw)) {
|
|
361
361
|
const newValue = raw.slice(CREATE_PREFIX.length);
|
|
362
362
|
onCreateOption?.(newValue);
|
|
363
363
|
applyValue(newValue);
|
|
@@ -386,7 +386,7 @@ function useSelectState(props) {
|
|
|
386
386
|
return false;
|
|
387
387
|
const lower = trimmedInput.toLowerCase();
|
|
388
388
|
return !opt.flatOptions.some(
|
|
389
|
-
(o) => o.label.toLowerCase() === lower || o.value.toLowerCase() === lower
|
|
389
|
+
(o) => String(o.label).toLowerCase() === lower || String(o.value).toLowerCase() === lower
|
|
390
390
|
);
|
|
391
391
|
}, [isCreatable, trimmedInput, currentValue, opt.flatOptions]);
|
|
392
392
|
const effectiveItems = useMemo(() => {
|
|
@@ -412,7 +412,7 @@ function useSelectState(props) {
|
|
|
412
412
|
(itemValue, query, itemToString) => {
|
|
413
413
|
if (isCreateValue(itemValue)) return true;
|
|
414
414
|
const label2 = itemToString?.(itemValue) ?? itemValue;
|
|
415
|
-
return label2.toLowerCase().includes(query.toLowerCase());
|
|
415
|
+
return String(label2).toLowerCase().includes(query.toLowerCase());
|
|
416
416
|
},
|
|
417
417
|
[]
|
|
418
418
|
);
|
|
@@ -423,7 +423,7 @@ function useSelectState(props) {
|
|
|
423
423
|
helpTextId
|
|
424
424
|
);
|
|
425
425
|
const testIdPrefix = buildTestIdPrefix(dataTestId, label);
|
|
426
|
-
const showClearButton = isClearable &&
|
|
426
|
+
const showClearButton = isClearable && currentValue !== "" && currentValue !== null && !isDisabled;
|
|
427
427
|
const isSearchable = resolveIsSearchable({
|
|
428
428
|
isSearchable: isSearchableProp,
|
|
429
429
|
searchThreshold,
|
|
@@ -439,7 +439,7 @@ function useSelectState(props) {
|
|
|
439
439
|
if (isCreateValue(val)) {
|
|
440
440
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
441
441
|
}
|
|
442
|
-
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
442
|
+
return String(flatOptionsMap.get(val)?.label ?? val ?? "");
|
|
443
443
|
},
|
|
444
444
|
[flatOptionsMap, formatCreateLabel]
|
|
445
445
|
);
|
|
@@ -581,7 +581,7 @@ function useMultiSelectState(props) {
|
|
|
581
581
|
if (isCreateValue(val)) {
|
|
582
582
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
583
583
|
}
|
|
584
|
-
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
584
|
+
return String(flatOptionsMap.get(val)?.label ?? val ?? "");
|
|
585
585
|
},
|
|
586
586
|
[flatOptionsMap, formatCreateLabel]
|
|
587
587
|
);
|
|
@@ -789,8 +789,9 @@ const SelectCombobox = forwardRef(
|
|
|
789
789
|
const renderTriggerInput = searchPosition !== "content";
|
|
790
790
|
const isTriggerSearch = isSearchable && renderTriggerInput;
|
|
791
791
|
const useTriggerAnchor = !isTriggerSearch;
|
|
792
|
-
const
|
|
793
|
-
const
|
|
792
|
+
const hasValue = currentValue !== "" && currentValue !== null;
|
|
793
|
+
const showValue = hasValue && (!isTriggerSearch || inputValue === "");
|
|
794
|
+
const showPlaceholder = !hasValue && !isTriggerSearch;
|
|
794
795
|
const setTriggerEl = useCallback(
|
|
795
796
|
(element) => {
|
|
796
797
|
setAnchorEl(element);
|
|
@@ -858,7 +859,7 @@ const SelectCombobox = forwardRef(
|
|
|
858
859
|
{
|
|
859
860
|
ref,
|
|
860
861
|
id,
|
|
861
|
-
placeholder: isTriggerSearch && !
|
|
862
|
+
placeholder: isTriggerSearch && !hasValue ? placeholder : void 0,
|
|
862
863
|
"aria-invalid": !!error || void 0,
|
|
863
864
|
"aria-describedby": ariaDescribedBy,
|
|
864
865
|
"aria-required": required || void 0,
|
|
@@ -1361,4 +1362,4 @@ const Select = forwardRef((props, ref) => {
|
|
|
1361
1362
|
Select.displayName = "Select";
|
|
1362
1363
|
|
|
1363
1364
|
export { Select as S };
|
|
1364
|
-
//# sourceMappingURL=Select-
|
|
1365
|
+
//# sourceMappingURL=Select-CLfVAG_p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select-CLfVAG_p.js","sources":["../src/components/Select/hooks/useAsyncOptions.ts","../src/components/Select/hooks/useLazyLoadSentinel.ts","../src/components/Select/constants.ts","../src/components/Select/hooks/useCreatableItems.ts","../src/components/Select/types.ts","../src/components/Select/utils.ts","../src/components/Select/hooks/useMultiSelectOptions.ts","../src/components/Select/hooks/useSelectState.ts","../src/components/Select/hooks/useMultiSelectState.ts","../src/components/Select/OptionItem.tsx","../src/components/Select/MultiSelectDropdown.tsx","../src/components/Select/SelectAnchor.tsx","../src/components/Select/SelectCombobox.tsx","../src/components/Select/MultiSelectCombobox.tsx","../src/components/Select/Select.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { SelectOptionBase } from \"src/components/Select/types\";\n\ninterface UseAsyncOptionsConfig {\n loadOptions?: (inputValue: string) => Promise<SelectOptionBase[]>;\n defaultOptions?: boolean | SelectOptionBase[];\n cacheOptions?: boolean;\n}\n\ninterface UseAsyncOptionsReturn {\n asyncOptions: SelectOptionBase[];\n isLoading: boolean;\n handleAsyncInputChange: (value: string) => void;\n}\n\nexport function useAsyncOptions({\n loadOptions,\n defaultOptions = false,\n cacheOptions = false,\n}: UseAsyncOptionsConfig): UseAsyncOptionsReturn {\n const [asyncOptions, setAsyncOptions] = useState<SelectOptionBase[]>(() =>\n Array.isArray(defaultOptions) ? defaultOptions : []\n );\n const [isLoading, setIsLoading] = useState(false);\n const cacheRef = useRef<Record<string, SelectOptionBase[]>>({});\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestRequestRef = useRef(0);\n const mountedRef = useRef(true);\n\n // Load default options on mount when `defaultOptions === true`\n useEffect(() => {\n if (!loadOptions || defaultOptions !== true) return;\n let cancelled = false;\n setIsLoading(true);\n loadOptions(\"\")\n .then(results => {\n if (cancelled) return;\n setAsyncOptions(results);\n if (cacheOptions) cacheRef.current[\"\"] = results;\n setIsLoading(false);\n })\n .catch(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n // Clean up debounce timer and mark unmounted\n useEffect(() => {\n return () => {\n mountedRef.current = false;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, []);\n\n const handleAsyncInputChange = useCallback(\n (value: string) => {\n if (!loadOptions) return;\n\n const query = value.trim();\n\n // Check cache first\n if (cacheOptions && query in cacheRef.current) {\n setAsyncOptions(cacheRef.current[query]);\n return;\n }\n\n // Debounce the fetch\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n const requestId = ++latestRequestRef.current;\n setIsLoading(true);\n loadOptions(query)\n .then(results => {\n if (requestId !== latestRequestRef.current || !mountedRef.current)\n return;\n setAsyncOptions(results);\n if (cacheOptions) cacheRef.current[query] = results;\n setIsLoading(false);\n })\n .catch(() => {\n if (requestId === latestRequestRef.current && mountedRef.current) {\n setIsLoading(false);\n }\n });\n }, 300);\n },\n [loadOptions, cacheOptions]\n );\n\n return { asyncOptions, isLoading, handleAsyncInputChange };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\ninterface UseLazyLoadSentinelConfig {\n fetchMore?: () => void;\n isEnabled: boolean;\n}\n\nexport function useLazyLoadSentinel({\n fetchMore,\n isEnabled,\n}: UseLazyLoadSentinelConfig) {\n const observerRef = useRef<IntersectionObserver | null>(null);\n const fetchMoreRef = useRef(fetchMore);\n fetchMoreRef.current = fetchMore;\n\n const sentinelRef = useCallback(\n (node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n\n if (!node || !isEnabled) return;\n\n const observer = new IntersectionObserver(\n entries => {\n if (entries[0]?.isIntersecting) fetchMoreRef.current?.();\n },\n { root: null, rootMargin: \"0px\", threshold: 0.1 }\n );\n observer.observe(node);\n observerRef.current = observer;\n },\n [isEnabled]\n );\n\n // Clean up observer on unmount\n useEffect(() => {\n return () => {\n observerRef.current?.disconnect();\n };\n }, []);\n\n return sentinelRef;\n}\n","// Base UI's change reason for \"the user typed in the input\". Every other reason\n// (item press, popup close, clear) is a programmatic write we deliberately\n// ignore so the search query is never seeded with the selected label.\nexport const INPUT_CHANGE_REASON = \"input-change\";\n\n// SIZE_CONFIG is shared by both SelectCombobox (single-select) and\n// MultiSelectCombobox (multi-select). Keys mirror the MultiSelect constants\n// that previously lived in MultiSelect.constants.ts.\n//\n// Mobile (<768px) uses 16px input font-size to prevent iOS Safari auto-zoom\n// on focus. Desktop (md+) keeps the original text sizes. Chip sizing is\n// unchanged because chips are non-interactive badges that don't trigger\n// iOS zoom.\n// `clearIcon` is intentionally one step smaller than `icon`. The clear (X) and\n// the dropdown chevron share the indicator row, but lucide's XIcon fills its\n// box far more than ChevronDownIcon (the X spans a 12x12 square of the 24 view\n// box, the chevron only 12x6), so at an equal size the X reads as visibly\n// larger. Nudging the clear icon down a step balances the two marks.\nexport const SIZE_CONFIG: Record<\n \"small\" | \"medium\" | \"large\",\n {\n chips: string;\n input: string;\n chip: string;\n icon: string;\n clearIcon: string;\n }\n> = {\n small: {\n chips: \"min-h-8 md:min-h-7 text-base md:text-xs gap-0.5 px-1 py-0.5\",\n input: \"text-base md:text-xs\",\n chip: \"h-4.5 text-[0.6875rem] px-1\",\n icon: \"size-3.5\",\n clearIcon: \"size-3\",\n },\n medium: {\n chips: \"min-h-8 text-base md:text-sm gap-1 px-2.5 py-1\",\n input: \"text-base md:text-sm\",\n chip: \"h-5.25 text-xs px-1.5\",\n icon: \"size-4\",\n clearIcon: \"size-3.5\",\n },\n large: {\n chips: \"min-h-10 text-base md:text-sm gap-1 px-2.5 py-1.5\",\n input: \"text-base md:text-sm\",\n chip: \"h-6 text-xs px-2\",\n icon: \"size-5\",\n clearIcon: \"size-4\",\n },\n};\n","import React, { useCallback, useMemo, useState } from \"react\";\n\nimport { computeEffectiveItems } from \"src/components/Select/utils\";\nimport { INPUT_CHANGE_REASON } from \"src/components/Select/constants\";\nimport type { SelectOptionBase as MultiSelectOptionBase } from \"src/components/Select/types\";\n\nexport const CREATE_PREFIX = \"__create__:\";\n\nexport const isCreateValue = (val: unknown): val is string =>\n typeof val === \"string\" && val.startsWith(CREATE_PREFIX);\n\ninterface UseCreatableItemsConfig {\n isCreatable: boolean;\n isGrouped: boolean;\n flatOptions: MultiSelectOptionBase[];\n selectedValues: string[];\n baseUiItems?: string[] | { label: string; items: string[] }[];\n onCreateOption?: (inputValue: string) => void;\n onChange?: (values: string[]) => void;\n onAsyncInputChange?: (value: string) => void;\n children?: React.ReactNode;\n}\n\ninterface UseCreatableItemsReturn {\n inputValue: string;\n showCreateOption: boolean;\n effectiveItems: string[] | { label: string; items: string[] }[] | undefined;\n creatableFilter: (\n itemValue: string,\n query: string,\n itemToString?: (v: string) => string\n ) => boolean;\n handleInputValueChange: (\n value: string,\n details?: { reason?: string }\n ) => void;\n handleValueChange: (next: string[] | null) => void;\n}\n\nexport function useCreatableItems({\n isCreatable,\n isGrouped,\n flatOptions,\n selectedValues,\n baseUiItems,\n onCreateOption,\n onChange,\n onAsyncInputChange,\n children,\n}: UseCreatableItemsConfig): UseCreatableItemsReturn {\n const [inputValue, setInputValue] = useState(\"\");\n\n // Mirrors `useSelectState`: only user typing is a real query. Every other\n // reason (item press, popup close, clear) is a programmatic write, so the\n // query resets and no refetch is issued — keeping the last async results\n // around is what lets the chips resolve their labels.\n const handleInputValueChange = useCallback(\n (value: string, details?: { reason?: string }) => {\n const isTyping = details?.reason === INPUT_CHANGE_REASON;\n const nextValue = isTyping ? value : \"\";\n setInputValue(nextValue);\n if (isTyping) onAsyncInputChange?.(nextValue);\n },\n [onAsyncInputChange]\n );\n\n const trimmedInput = inputValue.trim();\n const showCreateOption = useMemo(() => {\n if (!isCreatable || trimmedInput.length === 0) return false;\n const lower = trimmedInput.toLowerCase();\n return (\n !flatOptions.some(\n o =>\n String(o.label).toLowerCase() === lower ||\n String(o.value).toLowerCase() === lower\n ) && !selectedValues.includes(trimmedInput)\n );\n }, [isCreatable, trimmedInput, flatOptions, selectedValues]);\n\n const effectiveItems = React.useMemo(\n () =>\n computeEffectiveItems(\n children,\n baseUiItems,\n showCreateOption,\n isGrouped,\n trimmedInput\n ),\n [baseUiItems, children, isGrouped, showCreateOption, trimmedInput]\n );\n\n // Custom filter: always pass the \"Create\" item through\n const creatableFilter = useCallback(\n (\n itemValue: string,\n query: string,\n itemToString?: (v: string) => string\n ) => {\n if (isCreateValue(itemValue)) return true;\n const label = itemToString?.(itemValue) ?? itemValue;\n return String(label).toLowerCase().includes(query.toLowerCase());\n },\n []\n );\n\n const handleValueChange = useCallback(\n (next: string[] | null) => {\n const raw = next ?? [];\n\n const createEntry = raw.find(v => isCreateValue(v));\n if (createEntry) {\n const newValue = createEntry.slice(CREATE_PREFIX.length);\n const withNewValue = raw.map(v => (v === createEntry ? newValue : v));\n onCreateOption?.(newValue);\n onChange?.(withNewValue);\n return;\n }\n\n onChange?.(raw);\n },\n [onChange, onCreateOption]\n );\n\n return {\n inputValue,\n showCreateOption,\n effectiveItems,\n creatableFilter,\n handleInputValueChange,\n handleValueChange,\n };\n}\n","import type React from \"react\";\n\nimport type { ComboboxContent } from \"src/primitives/Combobox\";\nimport type { FieldLabel } from \"src/primitives/Field\";\n\nexport interface OptionBase {\n /** Display text for the option. */\n label: string;\n /** Unique value for the option. */\n value: string;\n /** Whether the option is disabled. */\n disabled?: boolean;\n}\n\nexport interface OptionGroup {\n /** Group heading text. */\n label: string;\n /** Options within this group. */\n options: OptionBase[];\n}\n\nexport type Option = OptionBase | OptionGroup;\n\nexport function isOptionGroup(opt: Option): opt is OptionGroup {\n return \"options\" in opt && Array.isArray(opt.options);\n}\n\nexport type SelectOptionBase = OptionBase;\nexport type SelectOptionGroup = OptionGroup;\nexport type SelectOption = Option;\n\ntype SelectSize = \"small\" | \"medium\" | \"large\";\n\ninterface SelectSharedProps {\n /** Unique identifier for the select. Auto-generated if omitted. */\n id?: string;\n /** Name attribute forwarded to the underlying input. */\n name?: string;\n /** Size of the trigger. */\n size?: SelectSize;\n /** Label displayed above the select. */\n label?: string;\n /** Error message displayed below the select. */\n error?: string;\n /** Help text displayed below the select. */\n helpText?: React.ReactNode;\n /** Placeholder text when no value is selected. */\n placeholder?: string;\n /** Flat or grouped option list. */\n options?: SelectOption[];\n /** Disable the select. */\n isDisabled?: boolean;\n /** Mark as required. */\n required?: boolean;\n /**\n * Enable search/filtering of options by typing in the input.\n * When false, the input is hidden and the trigger shows the selected label.\n * @default true\n */\n isSearchable?: boolean;\n /**\n * Where the search field lives.\n * - `\"trigger\"`: type directly in the control, like react-select.\n * - `\"content\"`: the control becomes a read-only trigger showing the\n * selection, and the search field renders at the top of the dropdown.\n * The trigger itself is then the form control, so a forwarded `ref`\n * resolves to that element (a focusable `div`, not an `<input>`).\n * @default \"trigger\"\n */\n searchPosition?: \"trigger\" | \"content\";\n /**\n * Placeholder for the in-dropdown search field.\n * Only used when `searchPosition` is `\"content\"`.\n * @default \"Search...\"\n */\n searchPlaceholder?: string;\n /**\n * Hide the search field when there are fewer than this many options, so\n * short dropdowns stay clean. Ignored when options are async, creatable or\n * lazy-loaded, since the total count isn't known upfront.\n * @default undefined (search is always shown)\n */\n searchThreshold?: number;\n /** Whether the first matching item is highlighted automatically. @default true */\n autoHighlight?: boolean;\n /** Callback fired when the dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Positioning strategy for the dropdown content.\n * @deprecated The Combobox primitive always uses popper-style positioning.\n * Use `contentProps.side` and `contentProps.align` for positioning control.\n */\n position?: \"item-aligned\" | \"popper\";\n /** Show a clear/reset button when a value is selected. */\n isClearable?: boolean;\n /**\n * Allow creating new options by typing a value that doesn't exist.\n * Works in both single and multi mode.\n */\n isCreatable?: boolean;\n /**\n * Callback fired when a new option is created via the \"Create X\" item.\n * The parent should update the `options` list to include the new value.\n */\n onCreateOption?: (inputValue: string) => void;\n /**\n * Customize the label for the \"Create\" option in the dropdown.\n * @default (inputValue) => `Create \"${inputValue}\"`\n */\n formatCreateLabel?: (inputValue: string) => string;\n /**\n * Async function that fetches options based on the current input value.\n * Works in both single and multi mode.\n */\n loadOptions?: (inputValue: string) => Promise<SelectOptionBase[]>;\n /**\n * Options to show before the user types anything.\n * When `true`, `loadOptions(\"\")` is called on mount.\n * @default false\n */\n defaultOptions?: boolean | SelectOptionBase[];\n /**\n * Cache results from `loadOptions` so repeated queries are instant.\n * @default false\n */\n cacheOptions?: boolean;\n /** Text shown while `loadOptions` is fetching. @default \"Loading…\" */\n loadingMessage?: string;\n /** Text displayed when no options match. @default \"No results found.\" */\n emptyMessage?: string;\n /**\n * Enable lazy loading of options as the user scrolls.\n * @default false\n */\n isAsyncLoadOptionEnabled?: boolean;\n /** Callback to load the next batch of options (lazy loading). */\n fetchMore?: () => void;\n /** Total number of options on the server (lazy loading). */\n totalOptionsCount?: number;\n /** Custom data-testid prefix for the component tree. */\n dataTestId?: string;\n /** Props forwarded to the FieldLabel. */\n labelProps?: Omit<\n React.ComponentProps<typeof FieldLabel>,\n \"htmlFor\" | \"children\"\n >;\n /** Props forwarded to the ComboboxContent. */\n contentProps?: Omit<\n React.ComponentProps<typeof ComboboxContent>,\n \"anchor\" | \"children\"\n >;\n /** Additional CSS class names for the outermost wrapper. */\n className?: string;\n /** Additional CSS class names for the input/trigger element. */\n inputClassName?: string;\n /** Children rendered inside the dropdown (overrides `options`). */\n children?: React.ReactNode;\n /**\n * Customize how each option is rendered. Receives the matched option (looked\n * up from `options` by value) and returns a ReactNode. Used in the dropdown\n * list and in the trigger (single-select label / multi-select chips).\n * String filtering still uses `option.label` for searchable behavior.\n */\n formatOptionLabel?: (option: SelectOptionBase) => React.ReactNode;\n /**\n * Extract the value string from a raw option object. Use when your options\n * are not already in `{ value, label }` shape (for example `{ id, name }`).\n * Called for each entry in `options`, each group child, `defaultOptions`, and\n * the array returned from `loadOptions`. Without this prop the option must\n * already have a `value` field.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getOptionValue?: (option: any) => string;\n /**\n * Extract the label string from a raw option object. Pairs with\n * `getOptionValue` to support custom option shapes without forcing\n * call-site `.map` boilerplate. Without this prop the option must already\n * have a `label` field.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getOptionLabel?: (option: any) => string;\n /**\n * Customize how the selected value is rendered in the trigger only. When\n * provided, takes precedence over `formatOptionLabel` for the trigger;\n * dropdown rows still use `formatOptionLabel` (or the default label).\n * Single-select only. Useful when the trigger needs a compact representation\n * (e.g. flag-only) while options show fuller content (flag + name).\n */\n formatTriggerLabel?: (option: SelectOptionBase) => React.ReactNode;\n}\n\ninterface SingleSelectProps extends SelectSharedProps {\n /** When true, multiple values can be selected and the trigger shows chips. @default false */\n isMulti?: false;\n /** Controlled selected value. */\n value?: string;\n /** Default selected value (uncontrolled). */\n defaultValue?: string;\n /** Callback fired when value changes. */\n onChange?: (value: string) => void;\n}\n\ninterface MultiSelectVariantProps extends SelectSharedProps {\n /** When true, multiple values can be selected and the trigger shows chips. */\n isMulti: true;\n /** Controlled selected values. */\n value?: string[];\n /** Default selected values (uncontrolled). */\n defaultValue?: string[];\n /** Callback fired when selected values change. */\n onChange?: (values: string[]) => void;\n /** Additional CSS class names for the chips container. */\n chipsClassName?: string;\n /** Hide the remove button on individual chips. */\n hideChipRemove?: boolean;\n}\n\nexport type SelectProps = SingleSelectProps | MultiSelectVariantProps;\n\nexport type MultiSelectProps = Extract<SelectProps, { isMulti: true }>;\n","import type React from \"react\";\n\nimport { CREATE_PREFIX } from \"./hooks/useCreatableItems\";\nimport { isOptionGroup } from \"./types\";\nimport type {\n SelectOption as MultiSelectOption,\n SelectOptionBase as MultiSelectOptionBase,\n} from \"./types\";\n\n/** Write an element into a callback or object ref, ignoring `null` refs. */\nexport function assignRef<T>(ref: React.Ref<T> | undefined, element: T | null) {\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref) {\n (ref as React.MutableRefObject<T | null>).current = element;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AccessorFn = (option: any) => string;\n\nexport function normalizeOption(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n option: any,\n getValue?: AccessorFn,\n getLabel?: AccessorFn\n): MultiSelectOptionBase {\n if (!getValue && !getLabel) return option as MultiSelectOptionBase;\n return {\n ...option,\n value: getValue ? getValue(option) : option?.value,\n label: getLabel ? getLabel(option) : option?.label,\n };\n}\n\nexport function normalizeOptions(\n options: MultiSelectOption[] | undefined,\n getValue?: AccessorFn,\n getLabel?: AccessorFn\n): MultiSelectOption[] | undefined {\n if (!options) return options;\n if (!getValue && !getLabel) return options;\n return options.map(opt =>\n opt && Array.isArray((opt as { options?: unknown[] }).options)\n ? {\n ...opt,\n options: (opt as { options: unknown[] }).options.map(o =>\n normalizeOption(o, getValue, getLabel)\n ),\n }\n : normalizeOption(opt, getValue, getLabel)\n );\n}\n\n/** Flatten grouped options into a flat lookup array. */\nexport function flattenOptions(\n options: MultiSelectOption[]\n): MultiSelectOptionBase[] {\n return options.flatMap(opt => (isOptionGroup(opt) ? opt.options : [opt]));\n}\n\n/** Check if any option is a group. */\nexport function hasGroups(options: MultiSelectOption[]): boolean {\n return options.some(isOptionGroup);\n}\n\n/** Convert options to base-ui `items` format for filtering support. */\nexport function toBaseUiItems(\n options: MultiSelectOption[]\n): string[] | { label: string; items: string[] }[] {\n if (hasGroups(options)) {\n return options.filter(isOptionGroup).map(g => ({\n label: g.label,\n items: g.options.map(o => o.value),\n }));\n }\n return (options as MultiSelectOptionBase[]).map(o => o.value);\n}\n\ninterface ResolveIsSearchableConfig {\n isSearchable: boolean;\n searchThreshold?: number;\n optionCount: number;\n /** Async, creatable and lazy-loaded lists grow after mount, so `optionCount`\n * isn't the real list size and the threshold must not apply. */\n isCountKnown: boolean;\n}\n\n/** Apply `searchThreshold` on top of `isSearchable`. */\nexport function resolveIsSearchable({\n isSearchable,\n searchThreshold,\n optionCount,\n isCountKnown,\n}: ResolveIsSearchableConfig): boolean {\n if (!isSearchable) return false;\n if (searchThreshold === undefined || !isCountKnown) return true;\n return optionCount >= searchThreshold;\n}\n\n/** Build the effective items array, appending a \"Create\" entry when needed. */\nexport function computeEffectiveItems(\n children: unknown,\n baseUiItems: string[] | { label: string; items: string[] }[] | undefined,\n showCreateOption: boolean,\n isGrouped: boolean,\n trimmedInput: string\n): string[] | { label: string; items: string[] }[] | undefined {\n if (children) return undefined;\n\n const createValue = showCreateOption\n ? `${CREATE_PREFIX}${trimmedInput}`\n : null;\n\n if (!baseUiItems && !createValue) return undefined;\n\n const base = baseUiItems ?? ([] as string[]);\n\n if (!createValue) return base;\n\n if (!isGrouped) {\n return [...(base as string[]), createValue];\n }\n\n return [\n ...(base as { label: string; items: string[] }[]),\n { label: \"\", items: [createValue] },\n ];\n}\n","import React from \"react\";\n\nimport { useAsyncOptions } from \"./useAsyncOptions\";\nimport { useLazyLoadSentinel } from \"./useLazyLoadSentinel\";\nimport {\n flattenOptions,\n hasGroups,\n toBaseUiItems,\n} from \"src/components/Select/utils\";\nimport type { SelectOption as MultiSelectOption } from \"src/components/Select/types\";\n\ninterface UseMultiSelectOptionsConfig {\n options?: MultiSelectOption[];\n loadOptions?: (\n inputValue: string\n ) => Promise<{ label: string; value: string; disabled?: boolean }[]>;\n defaultOptions?:\n | boolean\n | { label: string; value: string; disabled?: boolean }[];\n cacheOptions?: boolean;\n isAsyncLoadOptionEnabled?: boolean;\n fetchMore?: () => void;\n totalOptionsCount?: number;\n}\n\nexport function useMultiSelectOptions(props: UseMultiSelectOptionsConfig) {\n const isAsync = !!props.loadOptions;\n\n const { asyncOptions, isLoading, handleAsyncInputChange } = useAsyncOptions({\n loadOptions: props.loadOptions,\n defaultOptions: props.defaultOptions ?? false,\n cacheOptions: props.cacheOptions ?? false,\n });\n\n const resolvedOptions: MultiSelectOption[] = isAsync\n ? asyncOptions\n : (props.options ?? []);\n const flatOptions = flattenOptions(resolvedOptions);\n const isGrouped = hasGroups(resolvedOptions);\n\n const baseUiItems = React.useMemo(\n () =>\n resolvedOptions.length > 0 ? toBaseUiItems(resolvedOptions) : undefined,\n [resolvedOptions]\n );\n\n const hasMoreLazy =\n (props.isAsyncLoadOptionEnabled ?? false) &&\n typeof props.totalOptionsCount === \"number\" &&\n flatOptions.length < props.totalOptionsCount;\n\n const loaderCallbackRef = useLazyLoadSentinel({\n fetchMore: props.fetchMore,\n isEnabled: props.isAsyncLoadOptionEnabled ?? false,\n });\n\n return {\n isAsync,\n resolvedOptions,\n flatOptions,\n isGrouped,\n isLoading,\n handleAsyncInputChange,\n baseUiItems,\n hasMoreLazy,\n loaderCallbackRef,\n };\n}\n","import { useCallback, useId, useMemo, useState } from \"react\";\nimport type React from \"react\";\n\nimport { buildAriaDescribedBy, buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { useMultiSelectOptions } from \"./useMultiSelectOptions\";\nimport { CREATE_PREFIX, isCreateValue } from \"./useCreatableItems\";\nimport { resolveIsSearchable } from \"src/components/Select/utils\";\nimport {\n INPUT_CHANGE_REASON,\n SIZE_CONFIG,\n} from \"src/components/Select/constants\";\nimport type { SelectProps } from \"src/components/Select/types\";\n\ntype SingleSelectProps = Extract<SelectProps, { isMulti?: false }>;\n\nconst defaultFormatCreateLabel = (v: string) => `Create \"${v}\"`;\n\nexport function useSelectState(props: SingleSelectProps) {\n const {\n id: idProp,\n size = \"medium\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n value: valueProp,\n defaultValue,\n onChange,\n dataTestId,\n isCreatable = false,\n onCreateOption,\n formatCreateLabel = defaultFormatCreateLabel,\n formatOptionLabel,\n formatTriggerLabel,\n isClearable = false,\n isDisabled = false,\n required = false,\n isSearchable: isSearchableProp = true,\n searchPosition = \"trigger\",\n searchPlaceholder = \"Search...\",\n searchThreshold,\n isAsyncLoadOptionEnabled = false,\n autoHighlight = true,\n onOpenChange,\n children,\n } = props;\n\n const opt = useMultiSelectOptions(props);\n\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n const labelId = `label_${id}`;\n const sizeConfig = SIZE_CONFIG[size];\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? \"\"\n );\n const currentValue = isControlled ? (valueProp ?? \"\") : internalValue;\n\n const applyValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n const handleValueChange = useCallback(\n (next: string | null) => {\n // Options carry whatever value the consumer put on them, so `next` is not\n // guaranteed to be a string. Apps migrating from neeto-ui (react-select)\n // routinely pass numeric option values, and those must round-trip\n // unchanged rather than crash on a string-only method.\n const raw = next ?? \"\";\n\n // Handle the creatable \"Create X\" option\n if (isCreateValue(raw)) {\n const newValue = raw.slice(CREATE_PREFIX.length);\n onCreateOption?.(newValue);\n applyValue(newValue);\n return;\n }\n\n applyValue(raw);\n },\n [applyValue, onCreateOption]\n );\n\n const [inputValue, setInputValueState] = useState(\"\");\n const trimmedInput = inputValue.trim();\n\n // The combobox input is controlled so that Base UI never fills it with the\n // selected option's label. Typing then always starts a fresh search instead\n // of appending to the previous selection, matching neeto-ui (react-select),\n // which renders the selected label as its own element and keeps the input\n // empty. Only user typing is accepted; every other reason (item press, close,\n // clear) resets the query.\n const combinedHandleInputValueChange = useCallback(\n (value: string, details?: { reason?: string }) => {\n const isTyping = details?.reason === INPUT_CHANGE_REASON;\n const nextValue = isTyping ? value : \"\";\n setInputValueState(nextValue);\n // Skip refetching on a programmatic reset: keeping the last async results\n // around is what lets the trigger resolve the selected option's label.\n if (isTyping && opt.isAsync) opt.handleAsyncInputChange(nextValue);\n },\n [opt.isAsync, opt.handleAsyncInputChange]\n );\n\n const handleClear = useCallback(() => {\n applyValue(\"\");\n }, [applyValue]);\n\n const showCreateOption = useMemo(() => {\n if (\n !isCreatable ||\n trimmedInput.length === 0 ||\n currentValue === trimmedInput\n )\n return false;\n\n const lower = trimmedInput.toLowerCase();\n return !opt.flatOptions.some(\n o =>\n String(o.label).toLowerCase() === lower ||\n String(o.value).toLowerCase() === lower\n );\n }, [isCreatable, trimmedInput, currentValue, opt.flatOptions]);\n\n const effectiveItems = useMemo(() => {\n if (children) return undefined;\n const base = opt.baseUiItems;\n if (!showCreateOption) return base;\n const createValue = `${CREATE_PREFIX}${trimmedInput}`;\n if (!opt.isGrouped) {\n return [...((base as string[]) ?? []), createValue];\n }\n return [\n ...((base as { label: string; items: string[] }[]) ?? []),\n { label: \"\", items: [createValue] },\n ];\n }, [\n children,\n opt.baseUiItems,\n opt.isGrouped,\n showCreateOption,\n trimmedInput,\n ]);\n\n const creatableFilter = useCallback(\n (\n itemValue: string,\n query: string,\n itemToString?: (v: string) => string\n ) => {\n if (isCreateValue(itemValue)) return true;\n const label = itemToString?.(itemValue) ?? itemValue;\n return String(label).toLowerCase().includes(query.toLowerCase());\n },\n []\n );\n\n const ariaDescribedBy = buildAriaDescribedBy(\n error,\n errorId,\n helpText,\n helpTextId\n );\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const showClearButton =\n isClearable && currentValue !== \"\" && currentValue !== null && !isDisabled;\n\n const isSearchable = resolveIsSearchable({\n isSearchable: isSearchableProp,\n searchThreshold,\n optionCount: opt.flatOptions.length,\n isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled,\n });\n\n const flatOptionsMap = useMemo(\n () => new Map(opt.flatOptions.map(o => [o.value, o])),\n [opt.flatOptions]\n );\n\n const labelForValue = useCallback(\n (val: string) => {\n if (isCreateValue(val)) {\n return formatCreateLabel(val.slice(CREATE_PREFIX.length));\n }\n // Doubles as Base UI's `itemToStringLabel`, which filters on the result,\n // so a non-string label must be coerced rather than passed through.\n return String(flatOptionsMap.get(val)?.label ?? val ?? \"\");\n },\n [flatOptionsMap, formatCreateLabel]\n );\n\n const renderOption = useCallback<(val: string) => React.ReactNode>(\n val => {\n if (formatOptionLabel && !isCreateValue(val)) {\n const option = flatOptionsMap.get(val);\n if (option) return formatOptionLabel(option);\n }\n return labelForValue(val);\n },\n [formatOptionLabel, flatOptionsMap, labelForValue]\n );\n\n const renderTrigger = useCallback<(val: string) => React.ReactNode>(\n val => {\n if (formatTriggerLabel && !isCreateValue(val)) {\n const option = flatOptionsMap.get(val);\n if (option) return formatTriggerLabel(option);\n }\n return renderOption(val);\n },\n [formatTriggerLabel, flatOptionsMap, renderOption]\n );\n\n return {\n ...opt,\n id,\n errorId,\n helpTextId,\n labelId,\n sizeConfig,\n isControlled,\n currentValue,\n effectiveItems,\n creatableFilter,\n handleValueChange,\n handleInputValueChange: combinedHandleInputValueChange,\n handleClear,\n showCreateOption,\n showClearButton,\n ariaDescribedBy,\n testIdPrefix,\n labelForValue,\n renderOption,\n renderTrigger,\n flatOptionsMap,\n label,\n error,\n helpText,\n isDisabled,\n required,\n isSearchable,\n searchPosition,\n searchPlaceholder,\n inputValue,\n autoHighlight,\n onOpenChange,\n isClearable,\n };\n}\n","import { useCallback, useId, useMemo, useState } from \"react\";\nimport type React from \"react\";\n\nconst defaultFormatCreateLabel = (v: string) => `Create \"${v}\"`;\n\nimport { buildAriaDescribedBy, buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport {\n useCreatableItems,\n CREATE_PREFIX,\n isCreateValue,\n} from \"./useCreatableItems\";\nimport { useMultiSelectOptions } from \"./useMultiSelectOptions\";\nimport { resolveIsSearchable } from \"src/components/Select/utils\";\nimport { SIZE_CONFIG } from \"src/components/Select/constants\";\nimport type { MultiSelectProps } from \"src/components/Select/types\";\n\nexport function useMultiSelectState(props: MultiSelectProps) {\n const {\n id: idProp,\n size = \"medium\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n value: valueProp,\n defaultValue,\n onChange,\n dataTestId,\n isCreatable = false,\n onCreateOption,\n formatCreateLabel = defaultFormatCreateLabel,\n formatOptionLabel,\n isSearchable: isSearchableProp = true,\n searchPosition = \"trigger\",\n searchPlaceholder = \"Search...\",\n searchThreshold,\n isAsyncLoadOptionEnabled = false,\n children,\n } = props;\n\n const opt = useMultiSelectOptions(props);\n\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n const labelId = `label_${id}`;\n const sizeConfig = SIZE_CONFIG[size];\n\n const isSearchable = resolveIsSearchable({\n isSearchable: isSearchableProp,\n searchThreshold,\n optionCount: opt.flatOptions.length,\n isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled,\n });\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string[]>(\n defaultValue ?? []\n );\n const selectedValues = isControlled ? valueProp : internalValue;\n\n const handleChange = useCallback(\n (values: string[]) => {\n setInternalValue(values);\n onChange?.(values);\n },\n [onChange]\n );\n\n const {\n showCreateOption,\n effectiveItems,\n creatableFilter,\n handleInputValueChange,\n handleValueChange,\n } = useCreatableItems({\n isCreatable,\n isGrouped: opt.isGrouped,\n flatOptions: opt.flatOptions,\n selectedValues,\n baseUiItems: opt.baseUiItems,\n onCreateOption,\n onChange: handleChange,\n onAsyncInputChange: opt.isAsync ? opt.handleAsyncInputChange : undefined,\n children,\n });\n\n const ariaDescribedBy = buildAriaDescribedBy(\n error,\n errorId,\n helpText,\n helpTextId\n );\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n const flatOptionsMap = useMemo(\n () => new Map(opt.flatOptions.map(o => [o.value, o])),\n [opt.flatOptions]\n );\n\n const labelForValue = useCallback(\n (val: string) => {\n if (isCreateValue(val)) {\n return formatCreateLabel(val.slice(CREATE_PREFIX.length));\n }\n // Doubles as Base UI's `itemToStringLabel`, which filters on the result,\n // so a non-string label must be coerced rather than passed through.\n return String(flatOptionsMap.get(val)?.label ?? val ?? \"\");\n },\n [flatOptionsMap, formatCreateLabel]\n );\n\n const renderOption = useCallback<(val: string) => React.ReactNode>(\n val => {\n if (formatOptionLabel && !isCreateValue(val)) {\n const option = flatOptionsMap.get(val);\n if (option) return formatOptionLabel(option);\n }\n return labelForValue(val);\n },\n [formatOptionLabel, flatOptionsMap, labelForValue]\n );\n\n return {\n ...opt,\n id,\n errorId,\n helpTextId,\n labelId,\n sizeConfig,\n isControlled,\n selectedValues,\n isSearchable,\n searchPosition,\n searchPlaceholder,\n effectiveItems,\n creatableFilter,\n handleInputValueChange,\n handleValueChange,\n showCreateOption,\n ariaDescribedBy,\n testIdPrefix,\n labelForValue,\n renderOption,\n flatOptionsMap,\n label,\n error,\n helpText,\n };\n}\n","import type React from \"react\";\n\nimport { ComboboxItem } from \"src/primitives/Combobox\";\nimport { isCreateValue } from \"./hooks/useCreatableItems\";\nimport type { OptionBase } from \"./types\";\n\ninterface OptionItemProps {\n val: string;\n flatOptionsMap: Map<string, OptionBase>;\n renderOption: (val: string) => React.ReactNode;\n testIdPrefix?: string;\n}\n\nexport function OptionItem({\n val,\n flatOptionsMap,\n renderOption,\n testIdPrefix,\n}: OptionItemProps) {\n const isCreateItem = isCreateValue(val);\n\n return (\n <ComboboxItem\n key={val}\n value={val}\n disabled={!isCreateItem && flatOptionsMap.get(val)?.disabled}\n className={isCreateItem ? \"text-primary\" : undefined}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-option` }\n : {})}\n >\n {renderOption(val)}\n </ComboboxItem>\n );\n}\n","import type React from \"react\";\n\nimport {\n ComboboxList,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n} from \"src/primitives/Combobox\";\nimport { Spinner } from \"src/primitives/Spinner\";\nimport { OptionItem } from \"./OptionItem\";\nimport type { DropdownPassthroughProps } from \"./MultiSelectCombobox.types\";\n\ninterface MultiSelectDropdownProps extends DropdownPassthroughProps {\n renderOption: (val: string) => React.ReactNode;\n testIdPrefix?: string;\n children?: React.ReactNode;\n}\n\nexport function MultiSelectDropdown({\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n loadingMessage,\n emptyMessage,\n showCreateOption,\n renderOption,\n testIdPrefix,\n hasMoreLazy,\n loaderCallbackRef,\n children,\n}: MultiSelectDropdownProps) {\n return (\n <ComboboxList\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-menu` }\n : {})}\n >\n {isLoading && (\n <div className=\"flex w-full justify-center py-2 text-center text-sm text-muted-foreground\">\n {loadingMessage}\n </div>\n )}\n {!isLoading && !showCreateOption && (\n <ComboboxEmpty>{emptyMessage}</ComboboxEmpty>\n )}\n {children ??\n (resolvedOptions.length > 0 || showCreateOption ? (\n isGrouped ? (\n <ComboboxCollection>\n {(group: { label: string; items: string[] }) => (\n <ComboboxGroup\n key={group.label || \"__create__\"}\n items={group.items}\n >\n {group.label && <ComboboxLabel>{group.label}</ComboboxLabel>}\n <ComboboxCollection>\n {(val: string) => (\n <OptionItem\n key={val}\n val={val}\n flatOptionsMap={flatOptionsMap}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n />\n )}\n </ComboboxCollection>\n </ComboboxGroup>\n )}\n </ComboboxCollection>\n ) : (\n <ComboboxCollection>\n {(val: string) => (\n <OptionItem\n key={val}\n val={val}\n flatOptionsMap={flatOptionsMap}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n />\n )}\n </ComboboxCollection>\n )\n ) : null)}\n {hasMoreLazy && (\n <div\n ref={loaderCallbackRef}\n className=\"flex w-full items-center justify-center py-3\"\n data-testid={`${testIdPrefix}-lazy-loader`}\n >\n <Spinner />\n </div>\n )}\n </ComboboxList>\n );\n}\n","import { forwardRef } from \"react\";\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\";\n\nimport { assignRef } from \"./utils\";\n\ninterface SelectAnchorProps {\n /**\n * Render the anchor as a `Combobox.Trigger` instead of a plain wrapper. Used\n * when the control itself is not a search input — either because search is\n * off, or because the search field lives inside the dropdown. Base UI then\n * treats this element as the combobox: it gets `role=\"combobox\"`,\n * `tabIndex=0` and the expanded/haspopup state.\n */\n renderAsTrigger: boolean;\n className?: string;\n dataTestId?: string;\n /**\n * Accessibility props applied only when the trigger, rather than a hidden\n * input, is the form control (`searchPosition=\"content\"`).\n */\n triggerFieldProps?: {\n id?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"aria-required\"?: boolean;\n \"aria-invalid\"?: boolean;\n };\n children: React.ReactNode;\n}\n\n/** Drop undefined entries so they don't clobber the props Base UI supplies. */\nconst omitUndefined = <T extends Record<string, unknown>>(props: T): T =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined)\n ) as T;\n\nexport const SelectAnchor = forwardRef<HTMLDivElement, SelectAnchorProps>(\n (\n { renderAsTrigger, className, dataTestId, triggerFieldProps, children },\n ref\n ) => {\n if (!renderAsTrigger) {\n return (\n <div\n ref={ref}\n className={className}\n {...(dataTestId ? { \"data-testid\": dataTestId } : {})}\n >\n {children}\n </div>\n );\n }\n\n const { id, ...ariaProps } = triggerFieldProps ?? {};\n\n return (\n <ComboboxPrimitive.Trigger\n nativeButton={false}\n // Passed to the Trigger itself (not the rendered element) so Base UI\n // registers it as the labelable control.\n {...(id ? { id } : {})}\n // `props.ref` carries Base UI's own trigger registration (it records the\n // element on the combobox store). Overwriting it instead of merging\n // leaves `triggerElement` null, which breaks focus restoration when the\n // popup closes. Everything else may be spread over `props` safely:\n // `ariaProps` only holds static field attributes, never the dynamic\n // state (`aria-expanded`, `aria-controls`, `role`) Base UI manages.\n render={({ ref: baseUiRef, ...props }) => (\n <div\n {...props}\n {...omitUndefined(ariaProps)}\n ref={element => {\n assignRef(baseUiRef, element);\n assignRef(ref, element);\n }}\n className={className}\n {...(dataTestId ? { \"data-testid\": dataTestId } : {})}\n />\n )}\n >\n {children}\n </ComboboxPrimitive.Trigger>\n );\n }\n);\n\nSelectAnchor.displayName = \"SelectAnchor\";\n","import { forwardRef, useCallback, useState } from \"react\";\nimport { ChevronDownIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Combobox,\n ComboboxContent,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxInput,\n ComboboxTrigger,\n} from \"src/primitives/Combobox\";\nimport { MultiSelectDropdown } from \"./MultiSelectDropdown\";\nimport { SelectAnchor } from \"./SelectAnchor\";\nimport { assignRef } from \"./utils\";\nimport type { SelectComboboxProps } from \"./SelectCombobox.types\";\n\nexport const SelectCombobox = forwardRef<HTMLInputElement, SelectComboboxProps>(\n (\n {\n name,\n id,\n labelId,\n effectiveItems,\n labelForValue,\n renderOption,\n renderTrigger,\n isSearchable,\n searchPosition,\n searchPlaceholder,\n inputValue,\n isAsync,\n isCreatable,\n creatableFilter,\n currentValue,\n handleValueChange,\n handleInputValueChange,\n handleClear,\n onOpenChange,\n isDisabled,\n autoHighlight,\n required,\n showClearButton,\n sizeConfig,\n error,\n placeholder,\n ariaDescribedBy,\n testIdPrefix,\n inputClassName,\n contentProps,\n dropdownProps,\n children,\n },\n ref\n ) => {\n const [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);\n\n // With the search field inside the dropdown, the trigger itself is the form\n // control. Only one `Combobox.Input` may be mounted at a time, so the\n // trigger input is dropped entirely in that mode.\n const isContentSearch = isSearchable && searchPosition === \"content\";\n const renderTriggerInput = searchPosition !== \"content\";\n // Whether the user types into the control itself.\n const isTriggerSearch = isSearchable && renderTriggerInput;\n const useTriggerAnchor = !isTriggerSearch;\n // Emptiness is \"\" (the sentinel `useSelectState` normalises to), never\n // falsiness: a numeric option value of 0 is a real selection.\n const hasValue = currentValue !== \"\" && currentValue !== null;\n // Mirrors react-select: the selected label is its own element and gets out\n // of the way as soon as there is a search query.\n const showValue = hasValue && (!isTriggerSearch || inputValue === \"\");\n const showPlaceholder = !hasValue && !isTriggerSearch;\n\n const setTriggerEl = useCallback(\n (element: HTMLDivElement | null) => {\n setAnchorEl(element);\n // Without a trigger input there is no `<input>` to forward. Base UI\n // makes the trigger itself the field control in that mode (it gets\n // `role=\"combobox\"` and is what `useRegisterFieldControl` registers),\n // so the trigger element is what the ref must point at. It is an\n // `HTMLDivElement`, kept under the component's `HTMLInputElement` ref\n // type so the public API stays stable; see the `searchPosition` docs.\n if (renderTriggerInput) return;\n assignRef(ref as unknown as React.Ref<HTMLDivElement>, element);\n },\n [ref, renderTriggerInput]\n );\n\n const handleClearClick = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n handleClear();\n },\n [handleClear]\n );\n\n return (\n // @ts-expect-error — conditional spread creates a union that TS cannot narrow to the Combobox discriminated-union props\n <Combobox\n name={name}\n {...(effectiveItems && !children\n ? {\n items: effectiveItems,\n itemToStringLabel: labelForValue as (val: unknown) => string,\n ...(!isSearchable || isAsync\n ? { filter: null }\n : isCreatable\n ? { filter: creatableFilter }\n : {}),\n }\n : {})}\n value={currentValue}\n onValueChange={handleValueChange as (next: unknown) => void}\n // Controlled so Base UI never seeds the query with the selected label.\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n onOpenChange={onOpenChange}\n disabled={isDisabled}\n autoHighlight={autoHighlight}\n >\n <SelectAnchor\n ref={setTriggerEl}\n dataTestId={testIdPrefix}\n renderAsTrigger={useTriggerAnchor}\n className={useTriggerAnchor ? \"cursor-pointer\" : undefined}\n triggerFieldProps={\n renderTriggerInput\n ? undefined\n : {\n id,\n \"aria-labelledby\": labelId,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-required\": required || undefined,\n \"aria-invalid\": !!error || undefined,\n }\n }\n >\n <ComboboxChips\n className={cn(\n sizeConfig.chips,\n !!error &&\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\",\n inputClassName\n )}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-container` }\n : {})}\n >\n {/* Stacked in one grid cell so the label sits behind the caret\n instead of pushing it to the right, the way react-select does. */}\n <div className=\"grid min-w-0 flex-1 items-center [&>*]:col-start-1 [&>*]:row-start-1\">\n {showValue && (\n <span className=\"min-w-0 truncate\">\n {renderTrigger(currentValue)}\n </span>\n )}\n {showPlaceholder && (\n <span className=\"min-w-0 truncate text-muted-foreground\">\n {placeholder}\n </span>\n )}\n {renderTriggerInput && (\n <ComboboxChipsInput\n ref={ref}\n id={id}\n placeholder={\n isTriggerSearch && !hasValue ? placeholder : undefined\n }\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={required || undefined}\n className={cn(\n sizeConfig.input,\n \"w-full min-w-0\",\n !isSearchable && \"w-0 overflow-hidden p-0 opacity-0\"\n )}\n disabled={isDisabled}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-input` }\n : {})}\n />\n )}\n </div>\n {showClearButton && (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label=\"Clear selection\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={handleClearClick}\n >\n <XIcon className={sizeConfig.clearIcon} />\n </button>\n )}\n {isTriggerSearch ? (\n <ComboboxTrigger\n className={cn(\n \"shrink-0 bg-transparent p-0 text-muted-foreground hover:bg-transparent\",\n sizeConfig.icon\n )}\n />\n ) : (\n <ChevronDownIcon\n aria-hidden\n className={cn(\n \"pointer-events-none shrink-0 text-muted-foreground\",\n sizeConfig.icon\n )}\n />\n )}\n </ComboboxChips>\n </SelectAnchor>\n\n <ComboboxContent anchor={anchorEl} {...contentProps}>\n {isContentSearch && (\n <ComboboxInput\n showTrigger={false}\n placeholder={searchPlaceholder}\n // Base UI gives this input no accessible name of its own. Tie it\n // to the field label when there is one so the popup's search box\n // announces what it filters; fall back to its own placeholder.\n {...(labelId\n ? { \"aria-labelledby\": labelId }\n : { \"aria-label\": searchPlaceholder })}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-input` }\n : {})}\n />\n )}\n <MultiSelectDropdown\n {...dropdownProps}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n >\n {children}\n </MultiSelectDropdown>\n </ComboboxContent>\n </Combobox>\n );\n }\n);\n\nSelectCombobox.displayName = \"SelectCombobox\";\n","import { forwardRef, useCallback, useState } from \"react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Combobox,\n ComboboxContent,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxInput,\n} from \"src/primitives/Combobox\";\nimport { MultiSelectDropdown } from \"./MultiSelectDropdown\";\nimport { SelectAnchor } from \"./SelectAnchor\";\nimport { assignRef } from \"./utils\";\nimport type { MultiSelectComboboxProps } from \"./MultiSelectCombobox.types\";\n\nexport const MultiSelectCombobox = forwardRef<\n HTMLInputElement,\n MultiSelectComboboxProps\n>(\n (\n {\n name,\n id,\n labelId,\n effectiveItems,\n labelForValue,\n renderOption,\n isSearchable,\n searchPosition,\n searchPlaceholder,\n isAsync,\n isCreatable,\n creatableFilter,\n isControlled,\n valueProp,\n defaultValue,\n selectedValues,\n handleValueChange,\n handleInputValueChange,\n onOpenChange,\n isDisabled,\n autoHighlight,\n required,\n sizeConfig,\n error,\n chipsClassName,\n inputClassName,\n placeholder,\n hideChipRemove,\n ariaDescribedBy,\n testIdPrefix,\n contentProps,\n dropdownProps,\n children,\n },\n ref\n ) => {\n const [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);\n\n // Only one `Combobox.Input` may be mounted, so moving search into the\n // dropdown means the chips container loses its input and the trigger\n // itself becomes the form control.\n const isContentSearch = isSearchable && searchPosition === \"content\";\n const renderTriggerInput = searchPosition !== \"content\";\n const isTriggerSearch = isSearchable && renderTriggerInput;\n const useTriggerAnchor = !isTriggerSearch;\n\n const setTriggerEl = useCallback(\n (element: HTMLDivElement | null) => {\n setAnchorEl(element);\n // Without a trigger input there is no `<input>` to forward. Base UI\n // makes the trigger itself the field control in that mode, so the\n // trigger element is what the ref must point at. It is an\n // `HTMLDivElement`, kept under the component's `HTMLInputElement` ref\n // type so the public API stays stable; see the `searchPosition` docs.\n if (renderTriggerInput) return;\n assignRef(ref as unknown as React.Ref<HTMLDivElement>, element);\n },\n [ref, renderTriggerInput]\n );\n\n return (\n // @ts-expect-error — conditional spread creates a union that TS cannot narrow to the Combobox discriminated-union props\n <Combobox\n multiple\n name={name}\n {...(effectiveItems && !children\n ? {\n items: effectiveItems,\n itemToStringLabel: labelForValue as (val: unknown) => string,\n ...(!isSearchable || isAsync\n ? { filter: null }\n : isCreatable\n ? { filter: creatableFilter }\n : {}),\n }\n : {})}\n {...(isControlled ? { value: valueProp } : { defaultValue })}\n onValueChange={handleValueChange as (...args: unknown[]) => void}\n {...(isCreatable || isAsync\n ? { onInputValueChange: handleInputValueChange }\n : {})}\n onOpenChange={onOpenChange}\n disabled={isDisabled}\n autoHighlight={autoHighlight}\n >\n <SelectAnchor\n ref={setTriggerEl}\n renderAsTrigger={useTriggerAnchor}\n className={useTriggerAnchor ? \"cursor-pointer\" : undefined}\n triggerFieldProps={\n renderTriggerInput\n ? undefined\n : {\n id,\n \"aria-labelledby\": labelId,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-required\": required || undefined,\n \"aria-invalid\": !!error || undefined,\n }\n }\n >\n <ComboboxChips\n className={cn(\n sizeConfig.chips,\n !!error &&\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\",\n chipsClassName,\n inputClassName\n )}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-container` }\n : {})}\n >\n {selectedValues.map((val, index) => (\n <ComboboxChip\n key={val}\n className={sizeConfig.chip}\n showRemove={!hideChipRemove}\n // Base UI keeps chips at `tabIndex=-1` because the trigger\n // input is normally what you arrow out of to reach them. With\n // no trigger input there is nothing to arrow out of, so the\n // chip group becomes its own tab stop: the first chip is\n // tabbable and Base UI's own chip handler takes over from\n // there (arrows to move between chips, Backspace/Delete to\n // remove, ArrowDown to open the list). Disabled chips stay out\n // of the tab order — their key handler is inert.\n {...(renderTriggerInput || isDisabled\n ? {}\n : { tabIndex: index === 0 ? 0 : -1 })}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-chip` }\n : {})}\n >\n {renderOption(val)}\n </ComboboxChip>\n ))}\n {renderTriggerInput ? (\n <ComboboxChipsInput\n ref={ref}\n id={id}\n placeholder={\n isTriggerSearch && selectedValues.length === 0\n ? placeholder\n : undefined\n }\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={required || undefined}\n className={cn(\n sizeConfig.input,\n !isSearchable && \"w-0 min-w-0 overflow-hidden p-0 opacity-0\"\n )}\n disabled={isDisabled}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-input` }\n : {})}\n />\n ) : (\n <>\n {selectedValues.length === 0 && (\n <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">\n {placeholder}\n </span>\n )}\n <ChevronDownIcon\n aria-hidden\n className={cn(\n \"pointer-events-none ms-auto shrink-0 text-muted-foreground\",\n sizeConfig.icon\n )}\n />\n </>\n )}\n </ComboboxChips>\n </SelectAnchor>\n <ComboboxContent anchor={anchorEl} {...contentProps}>\n {isContentSearch && (\n <ComboboxInput\n showTrigger={false}\n placeholder={searchPlaceholder}\n // Base UI gives this input no accessible name of its own. Tie it\n // to the field label when there is one so the popup's search box\n // announces what it filters; fall back to its own placeholder.\n {...(labelId\n ? { \"aria-labelledby\": labelId }\n : { \"aria-label\": searchPlaceholder })}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-input` }\n : {})}\n />\n )}\n <MultiSelectDropdown\n {...dropdownProps}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n >\n {children}\n </MultiSelectDropdown>\n </ComboboxContent>\n </Combobox>\n );\n }\n);\nMultiSelectCombobox.displayName = \"MultiSelectCombobox\";\n","import { forwardRef, useMemo } from \"react\";\n\nimport { useSelectState } from \"./hooks/useSelectState\";\nimport { useMultiSelectState } from \"./hooks/useMultiSelectState\";\nimport { SelectFieldWrapper } from \"./SelectFieldWrapper\";\nimport { SelectCombobox } from \"./SelectCombobox\";\nimport { MultiSelectCombobox } from \"./MultiSelectCombobox\";\nimport type { SelectProps, MultiSelectProps, SelectOptionBase } from \"./types\";\nimport { normalizeOption, normalizeOptions } from \"./utils\";\n\nexport type {\n SelectProps,\n SelectOption,\n SelectOptionBase,\n SelectOptionGroup,\n} from \"./types\";\n\ntype SingleSelectProps = Extract<SelectProps, { isMulti?: false }>;\n\nconst SingleSelectInner = forwardRef<HTMLInputElement, SingleSelectProps>(\n (props, ref) => {\n const {\n id,\n label,\n error,\n helpText,\n errorId,\n helpTextId,\n labelId,\n isDisabled,\n required,\n testIdPrefix,\n effectiveItems,\n labelForValue,\n renderOption,\n renderTrigger,\n isSearchable,\n searchPosition,\n searchPlaceholder,\n inputValue,\n isAsync,\n creatableFilter,\n isControlled,\n currentValue,\n handleValueChange,\n handleInputValueChange,\n handleClear,\n autoHighlight,\n showClearButton,\n sizeConfig,\n ariaDescribedBy,\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n } = useSelectState(props);\n\n return (\n <SelectFieldWrapper\n id={id}\n label={label}\n error={error}\n helpText={helpText}\n errorId={errorId}\n helpTextId={helpTextId}\n isDisabled={isDisabled}\n required={required}\n testIdPrefix={testIdPrefix}\n labelProps={props.labelProps}\n className={props.className}\n labelId={labelId}\n focusTargetOnLabelClick={searchPosition === \"content\"}\n >\n <SelectCombobox\n ref={ref}\n name={props.name}\n id={id}\n labelId={label ? labelId : undefined}\n effectiveItems={effectiveItems}\n labelForValue={labelForValue}\n renderOption={renderOption}\n renderTrigger={renderTrigger}\n isSearchable={isSearchable}\n searchPosition={searchPosition}\n searchPlaceholder={searchPlaceholder}\n inputValue={inputValue}\n isAsync={isAsync}\n isCreatable={props.isCreatable ?? false}\n creatableFilter={creatableFilter}\n isControlled={isControlled}\n valueProp={props.value}\n defaultValue={props.defaultValue}\n currentValue={currentValue}\n handleValueChange={handleValueChange}\n handleInputValueChange={handleInputValueChange}\n handleClear={handleClear}\n onOpenChange={props.onOpenChange}\n isDisabled={isDisabled}\n autoHighlight={autoHighlight}\n required={required}\n isClearable={props.isClearable ?? false}\n showClearButton={showClearButton}\n sizeConfig={sizeConfig}\n error={error}\n placeholder={props.placeholder ?? \"\"}\n ariaDescribedBy={ariaDescribedBy}\n testIdPrefix={testIdPrefix}\n inputClassName={props.inputClassName}\n contentProps={props.contentProps}\n dropdownProps={{\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n loadingMessage: props.loadingMessage ?? \"Loading\\u2026\",\n emptyMessage: props.emptyMessage ?? \"No results found.\",\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n }}\n >\n {props.children}\n </SelectCombobox>\n </SelectFieldWrapper>\n );\n }\n);\nSingleSelectInner.displayName = \"SingleSelectInner\";\n\nconst MultiSelectInner = forwardRef<HTMLInputElement, MultiSelectProps>(\n (props, ref) => {\n const {\n id,\n label,\n error,\n helpText,\n errorId,\n helpTextId,\n labelId,\n testIdPrefix,\n effectiveItems,\n labelForValue,\n renderOption,\n isSearchable,\n searchPosition,\n searchPlaceholder,\n isAsync,\n creatableFilter,\n isControlled,\n selectedValues,\n handleValueChange,\n handleInputValueChange,\n sizeConfig,\n ariaDescribedBy,\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n } = useMultiSelectState(props);\n const { isDisabled = false, required = false } = props;\n\n return (\n <SelectFieldWrapper\n id={id}\n label={label}\n error={error}\n helpText={helpText}\n errorId={errorId}\n helpTextId={helpTextId}\n isDisabled={isDisabled}\n required={required}\n testIdPrefix={testIdPrefix}\n labelProps={props.labelProps}\n className={props.className}\n labelId={labelId}\n focusTargetOnLabelClick={searchPosition === \"content\"}\n >\n <MultiSelectCombobox\n ref={ref}\n name={props.name}\n id={id}\n labelId={label ? labelId : undefined}\n effectiveItems={effectiveItems}\n labelForValue={labelForValue}\n renderOption={renderOption}\n isSearchable={isSearchable}\n searchPosition={searchPosition}\n searchPlaceholder={searchPlaceholder}\n isAsync={isAsync}\n isCreatable={props.isCreatable ?? false}\n creatableFilter={creatableFilter}\n isControlled={isControlled}\n valueProp={props.value}\n defaultValue={props.defaultValue}\n selectedValues={selectedValues}\n handleValueChange={handleValueChange as (...args: unknown[]) => void}\n handleInputValueChange={\n handleInputValueChange as (...args: unknown[]) => void\n }\n onOpenChange={props.onOpenChange}\n isDisabled={isDisabled}\n autoHighlight={props.autoHighlight ?? true}\n sizeConfig={sizeConfig}\n error={error}\n chipsClassName={props.chipsClassName}\n inputClassName={props.inputClassName}\n placeholder={props.placeholder ?? \"\"}\n hideChipRemove={props.hideChipRemove ?? false}\n ariaDescribedBy={ariaDescribedBy}\n required={required}\n testIdPrefix={testIdPrefix}\n contentProps={props.contentProps}\n dropdownProps={{\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n loadingMessage: props.loadingMessage ?? \"Loading\\u2026\",\n emptyMessage: props.emptyMessage ?? \"No results found.\",\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n }}\n >\n {props.children}\n </MultiSelectCombobox>\n </SelectFieldWrapper>\n );\n }\n);\nMultiSelectInner.displayName = \"MultiSelectInner\";\n\nconst Select = forwardRef<HTMLInputElement, SelectProps>((props, ref) => {\n const {\n getOptionValue,\n getOptionLabel,\n options,\n defaultOptions,\n loadOptions,\n ...rest\n } = props;\n const hasAccessors = Boolean(getOptionValue || getOptionLabel);\n\n const normalizedOptions = useMemo(\n () =>\n hasAccessors\n ? normalizeOptions(options, getOptionValue, getOptionLabel)\n : options,\n [hasAccessors, options, getOptionValue, getOptionLabel]\n );\n\n const normalizedDefaultOptions = useMemo(() => {\n if (!hasAccessors || !Array.isArray(defaultOptions)) {\n return defaultOptions;\n }\n return defaultOptions.map(o =>\n normalizeOption(o, getOptionValue, getOptionLabel)\n );\n }, [hasAccessors, defaultOptions, getOptionValue, getOptionLabel]);\n\n const normalizedLoadOptions = useMemo(() => {\n if (!hasAccessors || !loadOptions) return loadOptions;\n return async (input: string): Promise<SelectOptionBase[]> => {\n const result = await loadOptions(input);\n return result.map(o =>\n normalizeOption(o, getOptionValue, getOptionLabel)\n );\n };\n }, [hasAccessors, loadOptions, getOptionValue, getOptionLabel]);\n\n const nextProps = {\n ...rest,\n options: normalizedOptions,\n defaultOptions: normalizedDefaultOptions,\n loadOptions: normalizedLoadOptions,\n } as SelectProps;\n\n if (nextProps.isMulti === true) {\n return <MultiSelectInner {...(nextProps as MultiSelectProps)} ref={ref} />;\n }\n return <SingleSelectInner {...(nextProps as SingleSelectProps)} ref={ref} />;\n});\n\nSelect.displayName = \"Select\";\n\nexport { Select };\n"],"names":["React","defaultFormatCreateLabel","label","ComboboxPrimitive.Trigger","XIcon","ComboboxTrigger","ChevronDownIcon"],"mappings":"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"}
|
|
@@ -17,6 +17,9 @@ function getContentDir() {
|
|
|
17
17
|
if (typeof document === "undefined") return "ltr";
|
|
18
18
|
return document.documentElement.getAttribute("dir") ?? document.body.getAttribute("dir") ?? "ltr";
|
|
19
19
|
}
|
|
20
|
+
function translateNoticeCode(noticeCode, values) {
|
|
21
|
+
return i18n.t(noticeCode, { count: values.count, replace: values });
|
|
22
|
+
}
|
|
20
23
|
function resolveMessage(message) {
|
|
21
24
|
if (typeof message === "string") return message;
|
|
22
25
|
if (isValidElement(message)) return message;
|
|
@@ -25,7 +28,12 @@ function resolveMessage(message) {
|
|
|
25
28
|
const obj = message;
|
|
26
29
|
if (obj.customMessage) return obj.customMessage;
|
|
27
30
|
if (obj.notice) return obj.notice;
|
|
28
|
-
if (obj.noticeCode)
|
|
31
|
+
if (obj.noticeCode) {
|
|
32
|
+
return translateNoticeCode(
|
|
33
|
+
obj.noticeCode,
|
|
34
|
+
obj
|
|
35
|
+
);
|
|
36
|
+
}
|
|
29
37
|
}
|
|
30
38
|
return String(message);
|
|
31
39
|
}
|
|
@@ -35,10 +43,11 @@ function resolveErrorMessage(errorObject) {
|
|
|
35
43
|
const axiosLike = errorObject;
|
|
36
44
|
if (axiosLike.response?.data) {
|
|
37
45
|
const data = axiosLike.response.data;
|
|
38
|
-
if (data.customMessage) return
|
|
46
|
+
if (data.customMessage) return data.customMessage;
|
|
39
47
|
if (data.error) return String(data.error);
|
|
40
48
|
if (Array.isArray(data.errors)) return data.errors.join("\n");
|
|
41
|
-
if (data.noticeCode)
|
|
49
|
+
if (data.noticeCode)
|
|
50
|
+
return translateNoticeCode(String(data.noticeCode), data);
|
|
42
51
|
}
|
|
43
52
|
if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;
|
|
44
53
|
if (errorObject instanceof Error) return errorObject.message;
|
|
@@ -253,4 +262,4 @@ const Toastr = {
|
|
|
253
262
|
};
|
|
254
263
|
|
|
255
264
|
export { Toastr as T };
|
|
256
|
-
//# sourceMappingURL=Toastr-
|
|
265
|
+
//# sourceMappingURL=Toastr-FXUexjdi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toastr-FXUexjdi.js","sources":["../src/components/Toastr/utils.ts","../src/components/Toastr/ToastrBody.tsx","../src/components/Toastr/Toastr.tsx"],"sourcesContent":["import i18next from \"i18next\";\nimport { isValidElement, type ReactNode } from \"react\";\n\nimport type { ToastrConfig, ToastrErrorInput, ToastrMessage } from \"./Toastr\";\n\nconst activeToasts = new Set<string>();\n\nfunction toastKey(\n type: string,\n message: ReactNode,\n buttonLabel?: string\n): string | null {\n if (typeof message !== \"string\") return null;\n return `${type}::${message}::${buttonLabel ?? \"\"}`;\n}\n\nfunction getContentDir(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") return \"ltr\";\n return (\n (document.documentElement.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n (document.body.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n \"ltr\"\n );\n}\n\n// A `noticeCode` payload carries the interpolation values the key expects\n// alongside it, e.g. `{ noticeCode: \"resource.clone\", entity: \"Form\" }` for\n// \"{{entity}} has been cloned successfully.\"\n//\n// `replace` scopes the payload to interpolation, so a backend field that\n// collides with an i18next option (`ns` forces a namespace and resolves the\n// key to nothing, `lng` forces a language) cannot alter key resolution.\n// `count` is the one option that still has to be promoted, since pluralised\n// keys resolve their `_one`/`_other` suffix from it.\nfunction translateNoticeCode(\n noticeCode: string,\n values: Record<string, unknown>\n): string {\n return i18next.t(noticeCode, { count: values.count, replace: values });\n}\n\nfunction resolveMessage(message: ToastrMessage): ReactNode {\n if (typeof message === \"string\") return message;\n if (isValidElement(message)) return message;\n // Arrays of ReactNodes (e.g. [<a/>, \" \", <b/>]) render natively via {message}.\n if (Array.isArray(message)) return message;\n if (message && typeof message === \"object\") {\n const obj = message as {\n noticeCode?: string;\n customMessage?: string;\n notice?: string;\n };\n if (obj.customMessage) return obj.customMessage;\n if (obj.notice) return obj.notice;\n if (obj.noticeCode) {\n return translateNoticeCode(\n obj.noticeCode,\n obj as Record<string, unknown>\n );\n }\n }\n return String(message);\n}\n\nfunction resolveErrorMessage(errorObject: ToastrErrorInput): ReactNode {\n if (typeof errorObject === \"string\") return errorObject;\n\n if (errorObject && typeof errorObject === \"object\") {\n // Axios-style error\n const axiosLike = errorObject as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n };\n\n if (axiosLike.response?.data) {\n const data = axiosLike.response.data;\n // Not stringified: callers pass React elements here to embed links in an\n // error toast, and the copy affordance already skips non-string messages.\n if (data.customMessage) return data.customMessage as ReactNode;\n if (data.error) return String(data.error);\n if (Array.isArray(data.errors)) return data.errors.join(\"\\n\");\n if (data.noticeCode)\n return translateNoticeCode(String(data.noticeCode), data);\n }\n\n if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;\n\n // Native Error\n if (errorObject instanceof Error) return errorObject.message;\n\n // ToastrMessage (string, React element, array, or notice-shape object)\n return resolveMessage(errorObject as ToastrMessage);\n }\n\n return \"Something went wrong.\";\n}\n\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n\n return true;\n } catch {\n // Clipboard API is unavailable in insecure contexts; fall back to execCommand.\n try {\n const textArea = document.createElement(\"textarea\");\n textArea.value = text;\n textArea.style.position = \"fixed\";\n textArea.style.opacity = \"0\";\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n const isCopied = document.execCommand(\"copy\");\n textArea.remove();\n\n return isCopied;\n } catch {\n return false;\n }\n }\n}\n\nfunction parseConfig(args: unknown[]): ToastrConfig {\n if (args.length === 0) return {};\n\n const first = args[0];\n if (typeof first === \"object\" && first !== null && !Array.isArray(first)) {\n return first as ToastrConfig;\n }\n\n // Legacy positional args: buttonLabel, onClick, customConfig, showIcon\n const [buttonLabel, onClick, customConfig, showIcon] = args as [\n string?,\n (() => void)?,\n Record<string, unknown>?,\n boolean?,\n ];\n\n return {\n ...(buttonLabel ? { buttonLabel } : {}),\n ...(onClick ? { onClick } : {}),\n ...(showIcon !== undefined ? { showIcon } : {}),\n ...(customConfig ?? {}),\n };\n}\n\nexport {\n activeToasts,\n copyToClipboard,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n};\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n OctagonXIcon,\n TriangleAlertIcon,\n XIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { copyToClipboard } from \"./utils\";\n\ntype ToastrType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst ICONS: Record<ToastrType, LucideIcon> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: TriangleAlertIcon,\n error: OctagonXIcon,\n};\n\nconst VARIANT_CLASSES: Record<ToastrType, string> = {\n success:\n \"bg-success-solid text-success-solid-foreground border-success-solid/30\",\n error: \"bg-error-solid text-error-solid-foreground border-error-solid/30\",\n warning:\n \"bg-warning-solid text-warning-solid-foreground border-warning-solid/30\",\n info: \"bg-info-solid text-info-solid-foreground border-info-solid/30\",\n};\n\nexport interface ToastrBodyProps {\n type: ToastrType;\n message: ReactNode;\n /** Plain-text version of the message; renders a copy-to-clipboard affordance when set. */\n copyableMessage?: string;\n showIcon?: boolean;\n dismissible?: boolean;\n buttonLabel?: string;\n onAction?: () => void;\n onDismiss: () => void;\n}\n\nconst COPIED_FEEDBACK_DURATION_MS = 2000;\n\nconst ToastrBody = ({\n type,\n message,\n copyableMessage,\n showIcon = true,\n dismissible = true,\n buttonLabel,\n onAction,\n onDismiss,\n}: ToastrBodyProps) => {\n const Icon = ICONS[type];\n const { t } = useTranslation();\n const [isCopied, setIsCopied] = useState(false);\n const copiedTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n\n useEffect(() => () => clearTimeout(copiedTimeoutRef.current), []);\n\n const handleCopy = async () => {\n if (!copyableMessage || !(await copyToClipboard(copyableMessage))) return;\n\n setIsCopied(true);\n clearTimeout(copiedTimeoutRef.current);\n copiedTimeoutRef.current = setTimeout(\n () => setIsCopied(false),\n COPIED_FEEDBACK_DURATION_MS\n );\n };\n\n return (\n <div\n role={type === \"error\" || type === \"warning\" ? \"alert\" : \"status\"}\n data-testid={`toastr-${type}-container`}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg\",\n VARIANT_CLASSES[type]\n )}\n >\n {showIcon && (\n <Icon\n aria-hidden\n data-testid={`${type}-toast-icon`}\n className=\"size-4 shrink-0\"\n />\n )}\n <span className=\"flex-1\">\n {message}\n {copyableMessage && (\n <>\n {\" \"}\n <button\n type=\"button\"\n data-testid={`toastr-${type}-copy-button`}\n className=\"text-xs italic underline-offset-2 opacity-80 transition-opacity hover:underline hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n onClick={handleCopy}\n >\n {isCopied\n ? t(\"neetoatoms.toastr.copied\", \"Copied!\")\n : t(\"neetoatoms.toastr.copyMessage\", \"Copy this error message\")}\n </button>\n </>\n )}\n </span>\n {buttonLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n data-testid={`toastr-${type}-button`}\n className=\"shrink-0 text-sm font-medium underline-offset-2 hover:underline\"\n >\n {buttonLabel}\n </button>\n )}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n data-testid=\"toastr-close-button\"\n className=\"shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <XIcon aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport { ToastrBody };\n","import type { ReactNode } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ToastrBody } from \"./ToastrBody\";\nimport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n} from \"./utils\";\n\nexport interface ToastrConfig {\n /** Label for an action button inside the toast. */\n buttonLabel?: string;\n /** Callback when the action button is clicked. */\n onClick?: () => void;\n /** Whether to show the type icon in the toast. */\n showIcon?: boolean;\n /** Whether the toast can be dismissed (shows X button + enables swipe). Defaults to true. */\n dismissible?: boolean;\n /** Whether to show the copy-to-clipboard affordance in error toasts. Defaults to true. */\n showCopyButton?: boolean;\n /** Additional sonner toast options (duration, position, etc.). */\n [key: string]: unknown;\n}\n\nexport type ToastrMessage =\n | ReactNode\n | { noticeCode?: string; customMessage?: string; notice?: string };\n\nexport type ToastrErrorInput =\n | string\n | Error\n | {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n }\n | ToastrMessage;\n\ntype SonnerType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nfunction showToast(\n type: SonnerType,\n message: ReactNode,\n config?: ToastrConfig\n): string | number | undefined {\n const {\n buttonLabel,\n onClick,\n showIcon,\n dismissible = true,\n showCopyButton = true,\n onDismiss: userOnDismiss,\n onAutoClose: userOnAutoClose,\n ...restConfig\n } = config ?? {};\n\n const key = toastKey(type, message, buttonLabel);\n\n if (key !== null && activeToasts.has(key)) return undefined;\n if (key !== null) activeToasts.add(key);\n\n // Error toasts stay until dismissed so the message can be read and copied.\n const options: Record<string, unknown> = {\n ...(type === \"error\" && { duration: Infinity }),\n ...restConfig,\n position: getContentDir() === \"rtl\" ? \"bottom-right\" : \"bottom-left\",\n dismissible,\n onDismiss: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnDismiss as ((t: unknown) => void) | undefined)?.(t);\n },\n onAutoClose: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnAutoClose as ((t: unknown) => void) | undefined)?.(t);\n },\n };\n\n const copyableMessage =\n showCopyButton && type === \"error\" && typeof message === \"string\"\n ? message\n : undefined;\n\n return toast.custom(\n id => (\n <ToastrBody\n buttonLabel={buttonLabel}\n copyableMessage={copyableMessage}\n dismissible={dismissible}\n message={message}\n showIcon={showIcon}\n type={type}\n onAction={() => {\n try {\n onClick?.();\n } finally {\n toast.dismiss(id);\n }\n }}\n onDismiss={() => toast.dismiss(id)}\n />\n ),\n options\n );\n}\n\nconst Toastr = {\n success(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"success\", resolveMessage(message), parseConfig(args));\n },\n\n info(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n show(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n warning(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"warning\", resolveMessage(message), parseConfig(args));\n },\n\n error(errorObject: ToastrErrorInput, ...args: unknown[]) {\n const msg = resolveErrorMessage(errorObject);\n return showToast(\"error\", msg, parseConfig(args));\n },\n};\n\nexport { Toastr };\n"],"names":["i18next","CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","XIcon"],"mappings":"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"}
|
|
@@ -163,7 +163,7 @@ function useCreatableItems({
|
|
|
163
163
|
if (!isCreatable || trimmedInput.length === 0) return false;
|
|
164
164
|
const lower = trimmedInput.toLowerCase();
|
|
165
165
|
return !flatOptions.some(
|
|
166
|
-
(o) => o.label.toLowerCase() === lower || o.value.toLowerCase() === lower
|
|
166
|
+
(o) => String(o.label).toLowerCase() === lower || String(o.value).toLowerCase() === lower
|
|
167
167
|
) && !selectedValues.includes(trimmedInput);
|
|
168
168
|
}, [isCreatable, trimmedInput, flatOptions, selectedValues]);
|
|
169
169
|
const effectiveItems = React__default.default.useMemo(
|
|
@@ -180,7 +180,7 @@ function useCreatableItems({
|
|
|
180
180
|
(itemValue, query, itemToString) => {
|
|
181
181
|
if (isCreateValue(itemValue)) return true;
|
|
182
182
|
const label = itemToString?.(itemValue) ?? itemValue;
|
|
183
|
-
return label.toLowerCase().includes(query.toLowerCase());
|
|
183
|
+
return String(label).toLowerCase().includes(query.toLowerCase());
|
|
184
184
|
},
|
|
185
185
|
[]
|
|
186
186
|
);
|
|
@@ -363,7 +363,7 @@ function useSelectState(props) {
|
|
|
363
363
|
const handleValueChange = React.useCallback(
|
|
364
364
|
(next) => {
|
|
365
365
|
const raw = next ?? "";
|
|
366
|
-
if (raw
|
|
366
|
+
if (isCreateValue(raw)) {
|
|
367
367
|
const newValue = raw.slice(CREATE_PREFIX.length);
|
|
368
368
|
onCreateOption?.(newValue);
|
|
369
369
|
applyValue(newValue);
|
|
@@ -392,7 +392,7 @@ function useSelectState(props) {
|
|
|
392
392
|
return false;
|
|
393
393
|
const lower = trimmedInput.toLowerCase();
|
|
394
394
|
return !opt.flatOptions.some(
|
|
395
|
-
(o) => o.label.toLowerCase() === lower || o.value.toLowerCase() === lower
|
|
395
|
+
(o) => String(o.label).toLowerCase() === lower || String(o.value).toLowerCase() === lower
|
|
396
396
|
);
|
|
397
397
|
}, [isCreatable, trimmedInput, currentValue, opt.flatOptions]);
|
|
398
398
|
const effectiveItems = React.useMemo(() => {
|
|
@@ -418,7 +418,7 @@ function useSelectState(props) {
|
|
|
418
418
|
(itemValue, query, itemToString) => {
|
|
419
419
|
if (isCreateValue(itemValue)) return true;
|
|
420
420
|
const label2 = itemToString?.(itemValue) ?? itemValue;
|
|
421
|
-
return label2.toLowerCase().includes(query.toLowerCase());
|
|
421
|
+
return String(label2).toLowerCase().includes(query.toLowerCase());
|
|
422
422
|
},
|
|
423
423
|
[]
|
|
424
424
|
);
|
|
@@ -429,7 +429,7 @@ function useSelectState(props) {
|
|
|
429
429
|
helpTextId
|
|
430
430
|
);
|
|
431
431
|
const testIdPrefix = fieldIds.buildTestIdPrefix(dataTestId, label);
|
|
432
|
-
const showClearButton = isClearable &&
|
|
432
|
+
const showClearButton = isClearable && currentValue !== "" && currentValue !== null && !isDisabled;
|
|
433
433
|
const isSearchable = resolveIsSearchable({
|
|
434
434
|
isSearchable: isSearchableProp,
|
|
435
435
|
searchThreshold,
|
|
@@ -445,7 +445,7 @@ function useSelectState(props) {
|
|
|
445
445
|
if (isCreateValue(val)) {
|
|
446
446
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
447
447
|
}
|
|
448
|
-
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
448
|
+
return String(flatOptionsMap.get(val)?.label ?? val ?? "");
|
|
449
449
|
},
|
|
450
450
|
[flatOptionsMap, formatCreateLabel]
|
|
451
451
|
);
|
|
@@ -587,7 +587,7 @@ function useMultiSelectState(props) {
|
|
|
587
587
|
if (isCreateValue(val)) {
|
|
588
588
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
589
589
|
}
|
|
590
|
-
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
590
|
+
return String(flatOptionsMap.get(val)?.label ?? val ?? "");
|
|
591
591
|
},
|
|
592
592
|
[flatOptionsMap, formatCreateLabel]
|
|
593
593
|
);
|
|
@@ -795,8 +795,9 @@ const SelectCombobox = React.forwardRef(
|
|
|
795
795
|
const renderTriggerInput = searchPosition !== "content";
|
|
796
796
|
const isTriggerSearch = isSearchable && renderTriggerInput;
|
|
797
797
|
const useTriggerAnchor = !isTriggerSearch;
|
|
798
|
-
const
|
|
799
|
-
const
|
|
798
|
+
const hasValue = currentValue !== "" && currentValue !== null;
|
|
799
|
+
const showValue = hasValue && (!isTriggerSearch || inputValue === "");
|
|
800
|
+
const showPlaceholder = !hasValue && !isTriggerSearch;
|
|
800
801
|
const setTriggerEl = React.useCallback(
|
|
801
802
|
(element) => {
|
|
802
803
|
setAnchorEl(element);
|
|
@@ -864,7 +865,7 @@ const SelectCombobox = React.forwardRef(
|
|
|
864
865
|
{
|
|
865
866
|
ref,
|
|
866
867
|
id,
|
|
867
|
-
placeholder: isTriggerSearch && !
|
|
868
|
+
placeholder: isTriggerSearch && !hasValue ? placeholder : void 0,
|
|
868
869
|
"aria-invalid": !!error || void 0,
|
|
869
870
|
"aria-describedby": ariaDescribedBy,
|
|
870
871
|
"aria-required": required || void 0,
|
|
@@ -1367,4 +1368,4 @@ const Select = React.forwardRef((props, ref) => {
|
|
|
1367
1368
|
Select.displayName = "Select";
|
|
1368
1369
|
|
|
1369
1370
|
exports.Select = Select;
|
|
1370
|
-
//# sourceMappingURL=Select-
|
|
1371
|
+
//# sourceMappingURL=Select-DFz2VIUv.js.map
|