@bigbinary/neeto-atoms 1.1.5 → 1.1.6-beta1

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.
@@ -130,6 +130,17 @@ const SIZE_CONFIG = {
130
130
  }
131
131
  };
132
132
 
133
+ function useReportInputChange(onInputChange) {
134
+ const onInputChangeRef = useRef(onInputChange);
135
+ onInputChangeRef.current = onInputChange;
136
+ const lastReportedInputRef = useRef("");
137
+ return useCallback((nextValue) => {
138
+ if (nextValue === lastReportedInputRef.current) return;
139
+ lastReportedInputRef.current = nextValue;
140
+ onInputChangeRef.current?.(nextValue);
141
+ }, []);
142
+ }
143
+
133
144
  const CREATE_PREFIX = "__create__:";
134
145
  const isCreateValue = (val) => typeof val === "string" && val.startsWith(CREATE_PREFIX);
135
146
  function useCreatableItems({
@@ -141,17 +152,20 @@ function useCreatableItems({
141
152
  onCreateOption,
142
153
  onChange,
143
154
  onAsyncInputChange,
155
+ onInputChange,
144
156
  children
145
157
  }) {
146
158
  const [inputValue, setInputValue] = useState("");
159
+ const reportInputChange = useReportInputChange(onInputChange);
147
160
  const handleInputValueChange = useCallback(
148
161
  (value, details) => {
149
162
  const isTyping = details?.reason === INPUT_CHANGE_REASON;
150
163
  const nextValue = isTyping ? value : "";
151
164
  setInputValue(nextValue);
165
+ reportInputChange(nextValue);
152
166
  if (isTyping) onAsyncInputChange?.(nextValue);
153
167
  },
154
- [onAsyncInputChange]
168
+ [onAsyncInputChange, reportInputChange]
155
169
  );
156
170
  const trimmedInput = inputValue.trim();
157
171
  const showCreateOption = useMemo(() => {
@@ -331,6 +345,8 @@ function useSelectState(props) {
331
345
  isAsyncLoadOptionEnabled = false,
332
346
  autoHighlight = true,
333
347
  onOpenChange,
348
+ onInputChange,
349
+ filterOption,
334
350
  children
335
351
  } = props;
336
352
  const opt = useMultiSelectOptions(props);
@@ -367,14 +383,16 @@ function useSelectState(props) {
367
383
  );
368
384
  const [inputValue, setInputValueState] = useState("");
369
385
  const trimmedInput = inputValue.trim();
386
+ const reportInputChange = useReportInputChange(onInputChange);
370
387
  const combinedHandleInputValueChange = useCallback(
371
388
  (value, details) => {
372
389
  const isTyping = details?.reason === INPUT_CHANGE_REASON;
373
390
  const nextValue = isTyping ? value : "";
374
391
  setInputValueState(nextValue);
392
+ reportInputChange(nextValue);
375
393
  if (isTyping && opt.isAsync) opt.handleAsyncInputChange(nextValue);
376
394
  },
377
- [opt.isAsync, opt.handleAsyncInputChange]
395
+ [reportInputChange, opt.isAsync, opt.handleAsyncInputChange]
378
396
  );
379
397
  const handleClear = useCallback(() => {
380
398
  applyValue("");
@@ -419,11 +437,12 @@ function useSelectState(props) {
419
437
  );
420
438
  const testIdPrefix = buildTestIdPrefix(dataTestId, label);
421
439
  const showClearButton = isClearable && currentValue !== "" && currentValue !== null && !isDisabled;
440
+ const isServerSearch = filterOption === null;
422
441
  const isSearchable = resolveIsSearchable({
423
442
  isSearchable: isSearchableProp,
424
443
  searchThreshold,
425
444
  optionCount: opt.flatOptions.length,
426
- isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled
445
+ isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled && !isServerSearch
427
446
  });
428
447
  const flatOptionsMap = useMemo(
429
448
  () => new Map(opt.flatOptions.map((o) => [o.value, o])),
@@ -468,7 +487,7 @@ function useSelectState(props) {
468
487
  isControlled,
469
488
  currentValue,
470
489
  effectiveItems,
471
- optionFilter,
490
+ optionFilter: isServerSearch ? null : optionFilter,
472
491
  handleValueChange,
473
492
  handleInputValueChange: combinedHandleInputValueChange,
474
493
  handleClear,
@@ -516,6 +535,8 @@ function useMultiSelectState(props) {
516
535
  searchPlaceholder = "Search...",
517
536
  searchThreshold,
518
537
  isAsyncLoadOptionEnabled = false,
538
+ onInputChange,
539
+ filterOption,
519
540
  children
520
541
  } = props;
521
542
  const opt = useMultiSelectOptions(props);
@@ -525,11 +546,12 @@ function useMultiSelectState(props) {
525
546
  const helpTextId = `helpText_${id}`;
526
547
  const labelId = `label_${id}`;
527
548
  const sizeConfig = SIZE_CONFIG[size];
549
+ const isServerSearch = filterOption === null;
528
550
  const isSearchable = resolveIsSearchable({
529
551
  isSearchable: isSearchableProp,
530
552
  searchThreshold,
531
553
  optionCount: opt.flatOptions.length,
532
- isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled
554
+ isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled && !isServerSearch
533
555
  });
534
556
  const isControlled = valueProp !== void 0;
535
557
  const [internalValue, setInternalValue] = useState(
@@ -558,6 +580,7 @@ function useMultiSelectState(props) {
558
580
  onCreateOption,
559
581
  onChange: handleChange,
560
582
  onAsyncInputChange: opt.isAsync ? opt.handleAsyncInputChange : void 0,
583
+ onInputChange,
561
584
  children
562
585
  });
563
586
  const ariaDescribedBy = buildAriaDescribedBy(
@@ -603,7 +626,7 @@ function useMultiSelectState(props) {
603
626
  searchPosition,
604
627
  searchPlaceholder,
605
628
  effectiveItems,
606
- optionFilter,
629
+ optionFilter: isServerSearch ? null : optionFilter,
607
630
  handleInputValueChange,
608
631
  handleValueChange,
609
632
  showCreateOption,
@@ -812,7 +835,7 @@ const SelectCombobox = forwardRef(
812
835
  ...effectiveItems && !children ? {
813
836
  items: effectiveItems,
814
837
  itemToStringLabel: labelForValue,
815
- ...!isSearchable || isAsync ? { filter: null } : { filter: optionFilter }
838
+ ...!isSearchable || isAsync || !optionFilter ? { filter: null } : { filter: optionFilter }
816
839
  } : {},
817
840
  value: currentValue,
818
841
  onValueChange: handleValueChange,
@@ -988,7 +1011,7 @@ const MultiSelectCombobox = forwardRef(
988
1011
  ...effectiveItems && !children ? {
989
1012
  items: effectiveItems,
990
1013
  itemToStringLabel: labelForValue,
991
- ...!isSearchable || isAsync ? { filter: null } : { filter: optionFilter }
1014
+ ...!isSearchable || isAsync || !optionFilter ? { filter: null } : { filter: optionFilter }
992
1015
  } : {},
993
1016
  ...isControlled ? { value: valueProp } : { defaultValue },
994
1017
  onValueChange: handleValueChange,
@@ -1354,4 +1377,4 @@ const Select = forwardRef((props, ref) => {
1354
1377
  Select.displayName = "Select";
1355
1378
 
1356
1379
  export { Select as S };
1357
- //# sourceMappingURL=Select-DCVlTRBI.js.map
1380
+ //# sourceMappingURL=Select-DrH-AzOD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select-DrH-AzOD.js","sources":["../src/components/Select/hooks/useAsyncOptions.ts","../src/components/Select/hooks/useLazyLoadSentinel.ts","../src/components/Select/constants.ts","../src/components/Select/hooks/useReportInputChange.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 { useCallback, useRef } from \"react\";\n\nexport function useReportInputChange(\n onInputChange?: (inputValue: string) => void\n) {\n const onInputChangeRef = useRef(onInputChange);\n onInputChangeRef.current = onInputChange;\n const lastReportedInputRef = useRef(\"\");\n\n return useCallback((nextValue: string) => {\n if (nextValue === lastReportedInputRef.current) return;\n lastReportedInputRef.current = nextValue;\n onInputChangeRef.current?.(nextValue);\n }, []);\n}\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/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\";\nimport { useReportInputChange } from \"./useReportInputChange\";\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 onInputChange?: (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 optionFilter: (\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 onInputChange,\n children,\n}: UseCreatableItemsConfig): UseCreatableItemsReturn {\n const [inputValue, setInputValue] = useState(\"\");\n const reportInputChange = useReportInputChange(onInputChange);\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 reportInputChange(nextValue);\n if (isTyping) onAsyncInputChange?.(nextValue);\n },\n [onAsyncInputChange, reportInputChange]\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 // Base UI's own matching, but on the query tracked above rather than the one\n // it passes in: Base UI freezes its query while the popup plays its exit\n // animation, and a reopen inside that window strands it, after which the list\n // ignores the input entirely (neeto-desk-web#26287).\n const baseFilter = ComboboxPrimitive.useFilter({ multiple: true });\n const optionFilter = useCallback(\n (itemValue: string, _query: string, itemToString?: (v: string) => string) =>\n isCreateValue(itemValue) ||\n baseFilter.contains(itemValue, trimmedInput, itemToString),\n [baseFilter, trimmedInput]\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 optionFilter,\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,\n * lazy-loaded or server-filtered (`filterOption={null}`), since the total\n * 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 /** Callback fired when the search input value changes. */\n onInputChange?: (inputValue: string) => void;\n /** Pass `null` to skip client-side filtering (server-side search). */\n filterOption?: null;\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\";\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\";\n\nimport { buildAriaDescribedBy, buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { useMultiSelectOptions } from \"./useMultiSelectOptions\";\nimport { useReportInputChange } from \"./useReportInputChange\";\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 onInputChange,\n filterOption,\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 const reportInputChange = useReportInputChange(onInputChange);\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 reportInputChange(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 [reportInputChange, 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 // Base UI's own matching, but on the query tracked above rather than the one\n // it passes in: Base UI freezes its query while the popup plays its exit\n // animation, and a reopen inside that window strands it, after which the list\n // ignores the input entirely (neeto-desk-web#26287). `multiple` selects the\n // plain item matcher — the single-selection variant also returns every option\n // once the query equals the selected label, which only makes sense while Base\n // UI holds that label in the input, and this Select keeps the input empty.\n const baseFilter = ComboboxPrimitive.useFilter({ multiple: true });\n const optionFilter = useCallback(\n (itemValue: string, _query: string, itemToString?: (v: string) => string) =>\n isCreateValue(itemValue) ||\n baseFilter.contains(itemValue, trimmedInput, itemToString),\n [baseFilter, trimmedInput]\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 isServerSearch = filterOption === null;\n const isSearchable = resolveIsSearchable({\n isSearchable: isSearchableProp,\n searchThreshold,\n optionCount: opt.flatOptions.length,\n isCountKnown:\n !opt.isAsync &&\n !isCreatable &&\n !isAsyncLoadOptionEnabled &&\n !isServerSearch,\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 optionFilter: isServerSearch ? null : optionFilter,\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 onInputChange,\n filterOption,\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 isServerSearch = filterOption === null;\n const isSearchable = resolveIsSearchable({\n isSearchable: isSearchableProp,\n searchThreshold,\n optionCount: opt.flatOptions.length,\n isCountKnown:\n !opt.isAsync &&\n !isCreatable &&\n !isAsyncLoadOptionEnabled &&\n !isServerSearch,\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 optionFilter,\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 onInputChange,\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 optionFilter: isServerSearch ? null : optionFilter,\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 { hyphenize } from \"src/utils/hyphenize\";\nimport { CREATE_PREFIX, 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 const optionLabel = isCreateItem\n ? `Create \"${val.slice(CREATE_PREFIX.length)}\"`\n : (flatOptionsMap.get(val)?.label ?? 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\": `${hyphenize(optionLabel)}-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 optionFilter,\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 || !optionFilter\n ? { filter: null }\n : { filter: optionFilter }),\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-placeholder\">\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 optionFilter,\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 || !optionFilter\n ? { filter: null }\n : { filter: optionFilter }),\n }\n : {})}\n {...(isControlled ? { value: valueProp } : { defaultValue })}\n onValueChange={handleValueChange as (...args: unknown[]) => void}\n // Always tracked — `optionFilter` matches on this query.\n onInputValueChange={handleInputValueChange}\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-placeholder\">\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 optionFilter,\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 optionFilter={optionFilter}\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 optionFilter,\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 optionFilter={optionFilter}\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","ComboboxPrimitive.useFilter","defaultFormatCreateLabel","ComboboxPrimitive.Trigger","XIcon","ComboboxTrigger","ChevronDownIcon"],"mappings":"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"}
@@ -136,6 +136,17 @@ const SIZE_CONFIG = {
136
136
  }
137
137
  };
138
138
 
139
+ function useReportInputChange(onInputChange) {
140
+ const onInputChangeRef = React.useRef(onInputChange);
141
+ onInputChangeRef.current = onInputChange;
142
+ const lastReportedInputRef = React.useRef("");
143
+ return React.useCallback((nextValue) => {
144
+ if (nextValue === lastReportedInputRef.current) return;
145
+ lastReportedInputRef.current = nextValue;
146
+ onInputChangeRef.current?.(nextValue);
147
+ }, []);
148
+ }
149
+
139
150
  const CREATE_PREFIX = "__create__:";
140
151
  const isCreateValue = (val) => typeof val === "string" && val.startsWith(CREATE_PREFIX);
141
152
  function useCreatableItems({
@@ -147,17 +158,20 @@ function useCreatableItems({
147
158
  onCreateOption,
148
159
  onChange,
149
160
  onAsyncInputChange,
161
+ onInputChange,
150
162
  children
151
163
  }) {
152
164
  const [inputValue, setInputValue] = React.useState("");
165
+ const reportInputChange = useReportInputChange(onInputChange);
153
166
  const handleInputValueChange = React.useCallback(
154
167
  (value, details) => {
155
168
  const isTyping = details?.reason === INPUT_CHANGE_REASON;
156
169
  const nextValue = isTyping ? value : "";
157
170
  setInputValue(nextValue);
171
+ reportInputChange(nextValue);
158
172
  if (isTyping) onAsyncInputChange?.(nextValue);
159
173
  },
160
- [onAsyncInputChange]
174
+ [onAsyncInputChange, reportInputChange]
161
175
  );
162
176
  const trimmedInput = inputValue.trim();
163
177
  const showCreateOption = React.useMemo(() => {
@@ -337,6 +351,8 @@ function useSelectState(props) {
337
351
  isAsyncLoadOptionEnabled = false,
338
352
  autoHighlight = true,
339
353
  onOpenChange,
354
+ onInputChange,
355
+ filterOption,
340
356
  children
341
357
  } = props;
342
358
  const opt = useMultiSelectOptions(props);
@@ -373,14 +389,16 @@ function useSelectState(props) {
373
389
  );
374
390
  const [inputValue, setInputValueState] = React.useState("");
375
391
  const trimmedInput = inputValue.trim();
392
+ const reportInputChange = useReportInputChange(onInputChange);
376
393
  const combinedHandleInputValueChange = React.useCallback(
377
394
  (value, details) => {
378
395
  const isTyping = details?.reason === INPUT_CHANGE_REASON;
379
396
  const nextValue = isTyping ? value : "";
380
397
  setInputValueState(nextValue);
398
+ reportInputChange(nextValue);
381
399
  if (isTyping && opt.isAsync) opt.handleAsyncInputChange(nextValue);
382
400
  },
383
- [opt.isAsync, opt.handleAsyncInputChange]
401
+ [reportInputChange, opt.isAsync, opt.handleAsyncInputChange]
384
402
  );
385
403
  const handleClear = React.useCallback(() => {
386
404
  applyValue("");
@@ -425,11 +443,12 @@ function useSelectState(props) {
425
443
  );
426
444
  const testIdPrefix = fieldIds.buildTestIdPrefix(dataTestId, label);
427
445
  const showClearButton = isClearable && currentValue !== "" && currentValue !== null && !isDisabled;
446
+ const isServerSearch = filterOption === null;
428
447
  const isSearchable = resolveIsSearchable({
429
448
  isSearchable: isSearchableProp,
430
449
  searchThreshold,
431
450
  optionCount: opt.flatOptions.length,
432
- isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled
451
+ isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled && !isServerSearch
433
452
  });
434
453
  const flatOptionsMap = React.useMemo(
435
454
  () => new Map(opt.flatOptions.map((o) => [o.value, o])),
@@ -474,7 +493,7 @@ function useSelectState(props) {
474
493
  isControlled,
475
494
  currentValue,
476
495
  effectiveItems,
477
- optionFilter,
496
+ optionFilter: isServerSearch ? null : optionFilter,
478
497
  handleValueChange,
479
498
  handleInputValueChange: combinedHandleInputValueChange,
480
499
  handleClear,
@@ -522,6 +541,8 @@ function useMultiSelectState(props) {
522
541
  searchPlaceholder = "Search...",
523
542
  searchThreshold,
524
543
  isAsyncLoadOptionEnabled = false,
544
+ onInputChange,
545
+ filterOption,
525
546
  children
526
547
  } = props;
527
548
  const opt = useMultiSelectOptions(props);
@@ -531,11 +552,12 @@ function useMultiSelectState(props) {
531
552
  const helpTextId = `helpText_${id}`;
532
553
  const labelId = `label_${id}`;
533
554
  const sizeConfig = SIZE_CONFIG[size];
555
+ const isServerSearch = filterOption === null;
534
556
  const isSearchable = resolveIsSearchable({
535
557
  isSearchable: isSearchableProp,
536
558
  searchThreshold,
537
559
  optionCount: opt.flatOptions.length,
538
- isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled
560
+ isCountKnown: !opt.isAsync && !isCreatable && !isAsyncLoadOptionEnabled && !isServerSearch
539
561
  });
540
562
  const isControlled = valueProp !== void 0;
541
563
  const [internalValue, setInternalValue] = React.useState(
@@ -564,6 +586,7 @@ function useMultiSelectState(props) {
564
586
  onCreateOption,
565
587
  onChange: handleChange,
566
588
  onAsyncInputChange: opt.isAsync ? opt.handleAsyncInputChange : void 0,
589
+ onInputChange,
567
590
  children
568
591
  });
569
592
  const ariaDescribedBy = fieldIds.buildAriaDescribedBy(
@@ -609,7 +632,7 @@ function useMultiSelectState(props) {
609
632
  searchPosition,
610
633
  searchPlaceholder,
611
634
  effectiveItems,
612
- optionFilter,
635
+ optionFilter: isServerSearch ? null : optionFilter,
613
636
  handleInputValueChange,
614
637
  handleValueChange,
615
638
  showCreateOption,
@@ -818,7 +841,7 @@ const SelectCombobox = React.forwardRef(
818
841
  ...effectiveItems && !children ? {
819
842
  items: effectiveItems,
820
843
  itemToStringLabel: labelForValue,
821
- ...!isSearchable || isAsync ? { filter: null } : { filter: optionFilter }
844
+ ...!isSearchable || isAsync || !optionFilter ? { filter: null } : { filter: optionFilter }
822
845
  } : {},
823
846
  value: currentValue,
824
847
  onValueChange: handleValueChange,
@@ -994,7 +1017,7 @@ const MultiSelectCombobox = React.forwardRef(
994
1017
  ...effectiveItems && !children ? {
995
1018
  items: effectiveItems,
996
1019
  itemToStringLabel: labelForValue,
997
- ...!isSearchable || isAsync ? { filter: null } : { filter: optionFilter }
1020
+ ...!isSearchable || isAsync || !optionFilter ? { filter: null } : { filter: optionFilter }
998
1021
  } : {},
999
1022
  ...isControlled ? { value: valueProp } : { defaultValue },
1000
1023
  onValueChange: handleValueChange,
@@ -1360,4 +1383,4 @@ const Select = React.forwardRef((props, ref) => {
1360
1383
  Select.displayName = "Select";
1361
1384
 
1362
1385
  exports.Select = Select;
1363
- //# sourceMappingURL=Select-DReP9RU1.js.map
1386
+ //# sourceMappingURL=Select-BP2y7-eM.js.map