@transferwise/components 46.122.1 → 46.123.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/build/inputs/SelectInput.js +32 -1
  2. package/build/inputs/SelectInput.js.map +1 -1
  3. package/build/inputs/SelectInput.mjs +32 -1
  4. package/build/inputs/SelectInput.mjs.map +1 -1
  5. package/build/main.css +97 -77
  6. package/build/prompt/InlinePrompt/InlinePrompt.js +8 -10
  7. package/build/prompt/InlinePrompt/InlinePrompt.js.map +1 -1
  8. package/build/prompt/InlinePrompt/InlinePrompt.mjs +9 -11
  9. package/build/prompt/InlinePrompt/InlinePrompt.mjs.map +1 -1
  10. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js +45 -0
  11. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -0
  12. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs +43 -0
  13. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -0
  14. package/build/styles/main.css +97 -77
  15. package/build/styles/prompt/InlinePrompt/InlinePrompt.css +2 -23
  16. package/build/styles/prompt/PrimitivePrompt/PrimitivePrompt.css +41 -0
  17. package/build/types/inputs/SelectInput.d.ts +2 -1
  18. package/build/types/inputs/SelectInput.d.ts.map +1 -1
  19. package/build/types/prompt/InlinePrompt/InlinePrompt.d.ts +1 -1
  20. package/build/types/prompt/InlinePrompt/InlinePrompt.d.ts.map +1 -1
  21. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts +30 -0
  22. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -0
  23. package/build/types/prompt/PrimitivePrompt/index.d.ts +3 -0
  24. package/build/types/prompt/PrimitivePrompt/index.d.ts.map +1 -0
  25. package/package.json +8 -8
  26. package/src/alert/Alert.tests.story.tsx +1 -0
  27. package/src/button/_stories/Button.brightGreen.tests.story.tsx +1 -1
  28. package/src/button/_stories/Button.dark.tests.story.tsx +1 -1
  29. package/src/button/_stories/Button.default.tests.story.tsx +1 -1
  30. package/src/button/_stories/Button.forestGreen.tests.story.tsx +1 -1
  31. package/src/button/_stories/Button.tests.story.tsx +1 -1
  32. package/src/circularButton/CircularButton.tests.story.tsx +1 -0
  33. package/src/dateInput/DateInput.tests.story.tsx +1 -0
  34. package/src/dateLookup/DateLookup.tests.story.tsx +1 -0
  35. package/src/header/Header.tests.story.tsx +1 -1
  36. package/src/inputs/SelectInput.spec.tsx +54 -0
  37. package/src/inputs/SelectInput.story.tsx +68 -0
  38. package/src/inputs/SelectInput.tsx +57 -6
  39. package/src/legacylistItem/LegacyListItem.tests.story.tsx +1 -1
  40. package/src/listItem/ListItem.spec.tsx +6 -8
  41. package/src/listItem/_stories/ListItem.focus.test.story.tsx +1 -1
  42. package/src/listItem/_stories/ListItem.layout.test.story.tsx +1 -1
  43. package/src/listItem/_stories/variants/ListItem.brightGreen.test.story.tsx +1 -1
  44. package/src/listItem/_stories/variants/ListItem.dark.test.story.tsx +1 -1
  45. package/src/listItem/_stories/variants/ListItem.forestGreen.test.story.tsx +1 -1
  46. package/src/listItem/_stories/variants/ListItem.medium.test.story.tsx +1 -1
  47. package/src/listItem/_stories/variants/ListItem.neutral.test.story.tsx +1 -1
  48. package/src/listItem/_stories/variants/ListItem.personal.test.story.tsx +1 -1
  49. package/src/listItem/_stories/variants/ListItem.rtl.test.story.tsx +1 -1
  50. package/src/listItem/_stories/variants/ListItem.small.test.story.tsx +1 -1
  51. package/src/main.css +97 -77
  52. package/src/main.less +2 -1
  53. package/src/prompt/InlinePrompt/InlinePrompt.css +2 -23
  54. package/src/prompt/InlinePrompt/InlinePrompt.less +3 -18
  55. package/src/prompt/InlinePrompt/InlinePrompt.spec.tsx +6 -6
  56. package/src/prompt/InlinePrompt/InlinePrompt.tsx +6 -7
  57. package/src/prompt/PrimitivePrompt/PrimitivePrompt.css +41 -0
  58. package/src/prompt/PrimitivePrompt/PrimitivePrompt.less +37 -0
  59. package/src/prompt/PrimitivePrompt/PrimitivePrompt.tsx +70 -0
  60. package/src/prompt/PrimitivePrompt/index.ts +2 -0
  61. package/src/radioGroup/RadioGroup.test.story.tsx +1 -1
  62. package/src/sentimentSurface/SentimentSurface.tests.story.tsx +1 -1
  63. package/src/snackbar/Snackbar.tests.story.tsx +1 -1
  64. package/src/stepper/Stepper.tests.story.tsx +1 -0
  65. package/src/summary/Summary.tests.story.tsx +1 -0
  66. package/src/title/Title.test.story.tsx +1 -0
  67. package/src/upload/Upload.tests.story.tsx +1 -0
  68. package/src/uploadInput/UploadInput.tests.story.tsx +1 -0
  69. package/src/withId/withId.story.tsx +1 -1
@@ -97,6 +97,24 @@ function filterSelectInputItems(items, predicate) {
97
97
  return false;
98
98
  });
99
99
  }
100
+ /**
101
+ * Flattens and sorts filtered options using the provided comparator.
102
+ * Extracts all options from groups, filters out undefined values (deduplicated items),
103
+ * sorts them, and returns as a flat list of option items.
104
+ */
105
+ function sortSelectInputItems(items, compareFn, searchQuery) {
106
+ const flattenedOption = items.flatMap(item => {
107
+ if (item.type === 'option') {
108
+ return item.value !== undefined ? [item] : [];
109
+ }
110
+ if (item.type === 'group') {
111
+ return item.options.filter(option => option.value !== undefined);
112
+ }
113
+ return [];
114
+ });
115
+ // eslint-disable-next-line functional/immutable-data
116
+ return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));
117
+ }
100
118
  const defaultRenderTrigger = ({
101
119
  content,
102
120
  placeholderShown,
@@ -170,6 +188,7 @@ function SelectInput({
170
188
  renderTrigger = defaultRenderTrigger,
171
189
  filterable,
172
190
  filterPlaceholder,
191
+ sortFilteredOptions,
173
192
  disabled,
174
193
  size = 'md',
175
194
  className,
@@ -324,6 +343,7 @@ function SelectInput({
324
343
  renderFooter: renderFooter,
325
344
  filterable: filterable,
326
345
  filterPlaceholder: filterPlaceholder,
346
+ sortFilteredOptions: sortFilteredOptions,
327
347
  searchInputRef: searchInputRef,
328
348
  listboxRef: listboxRef,
329
349
  filterQuery: deferredFilterQuery,
@@ -411,6 +431,7 @@ function SelectInputOptions({
411
431
  renderFooter,
412
432
  filterable = false,
413
433
  filterPlaceholder,
434
+ sortFilteredOptions,
414
435
  searchInputRef,
415
436
  listboxRef,
416
437
  filterQuery,
@@ -463,7 +484,17 @@ function SelectInputOptions({
463
484
  return a === b;
464
485
  };
465
486
  }, [compareValuesProp]);
466
- const filteredItems = needle != null ? filterSelectInputItems(dedupeSelectInputItems(items, compareValues), item => selectInputOptionItemIncludesNeedle(item, needle)) : items;
487
+ const filteredItems = React.useMemo(() => {
488
+ if (needle == null) {
489
+ return items;
490
+ }
491
+ const filtered = filterSelectInputItems(dedupeSelectInputItems(items, compareValues), item => selectInputOptionItemIncludesNeedle(item, needle));
492
+ if (sortFilteredOptions) {
493
+ return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);
494
+ }
495
+ return filtered;
496
+ // eslint-disable-next-line react-hooks/exhaustive-deps
497
+ }, [needle, items, compareValues]);
467
498
  const resultsEmpty = needle != null && filteredItems.length === 0;
468
499
  const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;
469
500
  // Items shown once shall be kept mounted until the needle changes, otherwise
@@ -1 +1 @@
1
- {"version":3,"file":"SelectInput.js","sources":["../../src/inputs/SelectInput.tsx"],"sourcesContent":["import { Listbox as ListboxBase } from '@headlessui/react';\nimport { Check, ChevronDown, Cross, CrossCircle } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport mergeProps from 'merge-props';\nimport {\n createContext,\n forwardRef,\n ReactNode,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\nimport { Virtualizer, type VirtualizerHandle } from 'virtua';\n\nimport { useEffectEvent } from '../common/hooks/useEffectEvent';\nimport { useScreenSize } from '../common/hooks/useScreenSize';\nimport { PolymorphicWithOverrides } from '../common/polymorphicWithOverrides/PolymorphicWithOverrides';\nimport { Breakpoint } from '../common/propsValues/breakpoint';\nimport dateTriggerMessages from '../dateLookup/dateTrigger/DateTrigger.messages';\nimport { Merge } from '../utils';\n\nimport { BottomSheet } from './_BottomSheet';\nimport { ButtonInput } from './_ButtonInput';\nimport { Popover } from './_Popover';\nimport { useInputAttributes, WithInputAttributesProps } from './contexts';\nimport { InputGroup } from './InputGroup';\nimport { SearchInput } from './SearchInput';\nimport messages from './SelectInput.messages';\nimport Header from '../header';\nimport Section from '../section';\nimport { ButtonProps } from '../button/Button.types';\n\nconst MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n\nfunction searchableString(value: string) {\n return (\n value\n .trim()\n .replace(/\\s+/gu, ' ')\n // NFD converts an Å to A + ̊ (and other special characters)\n .normalize('NFD')\n // and then this replaces the ̊ with nothing (and other special characters)\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n );\n}\n\nfunction inferSearchableStrings(value: unknown) {\n if (typeof value === 'string') {\n return [searchableString(value)];\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value)\n .filter((innerValue) => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\n}\n\nexport interface SelectInputOptionItem<T = string> {\n type: 'option';\n value: T;\n filterMatchers?: readonly string[];\n disabled?: boolean;\n}\n\nexport interface SelectInputGroupItem<T = string> {\n type: 'group';\n label: ReactNode;\n options: readonly SelectInputOptionItem<T>[];\n action?: {\n label: string;\n onClick: ButtonProps['onClick'];\n };\n}\n\nexport interface SelectInputSeparatorItem {\n type: 'separator';\n}\n\nexport type SelectInputItem<T = string> =\n | SelectInputOptionItem<T>\n | SelectInputGroupItem<T>\n | SelectInputSeparatorItem;\n\nfunction dedupeSelectInputOptionItem<T>(\n item: SelectInputOptionItem<T>,\n existingValues: Set<T>,\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputOptionItem<T | undefined> {\n const isDuplicate = compareValues\n ? Array.from(existingValues).some((existingValue) => compareValues(item.value, existingValue))\n : existingValues.has(item.value);\n\n if (!isDuplicate) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\n/**\n * Sets the `value` of duplicate option items to `undefined`, hiding them when\n * rendered. Indexes are kept intact within groups to preserve the active item\n * between filter changes when possible.\n */\nfunction dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues, compareValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues, compareValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\nfunction selectInputOptionItemIncludesNeedle<T>(item: SelectInputOptionItem<T>, needle: string) {\n return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>\n haystack.includes(needle),\n );\n}\n\nfunction filterSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n predicate: (item: SelectInputOptionItem<T>) => boolean,\n) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return predicate(item);\n }\n case 'group': {\n return item.options.some((option) => predicate(option));\n }\n default:\n }\n return false;\n });\n}\n\nexport interface SelectInputProps<T = string, M extends boolean = false> {\n id?: string;\n /**\n * Sets the `data-wds-parent` attribute on the listbox container, which is needed for complex components like DateInput to correctly manage event handling.\n * @internal\n */\n parentId?: string;\n name?: string;\n multiple?: M;\n placeholder?: string;\n items: readonly SelectInputItem<NonNullable<T>>[];\n /**\n * Enables browser autocomplete integration through the search input.\n * Accepts standard HTML autocomplete values (e.g., \"country-name\", \"address-level1\").\n *\n * Requires `filterable={true}` to enable the search input.\n *\n * @example\n * <SelectInput\n * name=\"country\"\n * autocomplete=\"country-name\"\n * filterable={true}\n * items={[{\n * type: 'option',\n * value: 'GB',\n * filterMatchers: ['United Kingdom', 'UK']\n * }]}\n * />\n */\n autocomplete?: string;\n defaultValue?: M extends true ? readonly T[] : T;\n value?: M extends true ? readonly T[] : T;\n compareValues?:\n | (keyof NonNullable<T> & string)\n | ((a: T | undefined, b: T | undefined) => boolean);\n renderValue?: (value: NonNullable<T>, withinTrigger: boolean) => React.ReactNode;\n renderFooter?: (args: {\n resultsEmpty: boolean;\n queryNormalized: string | null | undefined;\n }) => React.ReactNode;\n renderTrigger?: (args: {\n content: React.ReactNode;\n placeholderShown: boolean;\n clear: (() => void) | undefined;\n disabled: boolean;\n size: 'sm' | 'md' | 'lg';\n className: string | undefined;\n }) => React.ReactNode;\n filterable?: boolean;\n filterPlaceholder?: string;\n disabled?: boolean;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n UNSAFE_triggerButtonProps?: WithInputAttributesProps['inputAttributes'] & {\n 'aria-label'?: string;\n };\n /** Ref to the select trigger button element. */\n triggerRef?: React.MutableRefObject<HTMLButtonElement | null>;\n onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;\n onChange?: (value: M extends true ? T[] : T) => void;\n onOpen?: () => void;\n onClose?: () => void;\n onClear?: () => void;\n}\n\nconst defaultRenderTrigger = (({ content, placeholderShown, clear, disabled, size, className }) => (\n <InputGroup\n addonEnd={{\n content: (\n <span className={clsx('np-select-input-addon-container', disabled && 'disabled')}>\n {clear != null && !placeholderShown ? (\n <>\n <SelectInputClearButton\n onClick={(event) => {\n event.preventDefault();\n clear();\n }}\n />\n <span className=\"np-select-input-addon-separator\" />\n </>\n ) : null}\n\n <span className=\"np-select-input-addon\">\n <ChevronDown size={16} />\n </span>\n </span>\n ),\n initialContentWidth: 24 + 4,\n padding: 'sm',\n }}\n disabled={disabled}\n className={className}\n >\n <SelectInputTriggerButton as={ButtonInput} size={size}>\n <span\n className={clsx(\n 'np-select-input-content',\n placeholderShown && 'np-select-input-placeholder',\n )}\n >\n {content}\n </span>\n </SelectInputTriggerButton>\n </InputGroup>\n)) satisfies SelectInputProps['renderTrigger'];\n\ninterface SelectInputClearButtonProps extends Pick<\n React.ComponentPropsWithoutRef<'button'>,\n 'className' | 'onClick'\n> {}\n\nfunction SelectInputClearButton({ className, onClick }: SelectInputClearButtonProps) {\n const intl = useIntl();\n\n return (\n <button\n type=\"button\"\n aria-label={intl.formatMessage(dateTriggerMessages.ariaLabel)}\n className={clsx(className, 'np-select-input-addon np-select-input-addon--interactive')}\n onClick={onClick}\n >\n <Cross size={16} />\n </button>\n );\n}\n\nconst noop = () => {};\n\nexport function SelectInput<T = string, M extends boolean = false>({\n id: idProp,\n parentId,\n name,\n multiple,\n placeholder,\n autocomplete,\n items,\n defaultValue,\n value: controlledValue,\n compareValues,\n renderValue = String,\n renderFooter,\n renderTrigger = defaultRenderTrigger,\n filterable,\n filterPlaceholder,\n disabled,\n size = 'md',\n className,\n UNSAFE_triggerButtonProps,\n triggerRef: externalTriggerRef,\n onFilterChange = noop,\n onChange,\n onOpen,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n const id = idProp ?? inputAttributes.id;\n\n const [open, setOpen] = useState(false);\n\n const initialized = useRef(false);\n const handleClose = useEffectEvent(onClose ?? (() => {}));\n const handleOpen = useEffectEvent(onOpen ?? (() => {}));\n useEffect(() => {\n if (initialized.current) {\n if (open) {\n handleOpen?.();\n } else {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, handleOpen, open]);\n\n const [filterQuery, _setFilterQuery] = useState('');\n const deferredFilterQuery = useDeferredValue(filterQuery);\n const setFilterQuery = useEffectEvent((query: string) => {\n _setFilterQuery(query);\n if (query !== filterQuery) {\n onFilterChange({\n query,\n queryNormalized: query ? searchableString(query) : null,\n });\n }\n });\n\n const internalTriggerRef = useRef<HTMLButtonElement | null>(null);\n\n const screenSm = useScreenSize(Breakpoint.SMALL);\n const OptionsOverlay = screenSm ? Popover : BottomSheet;\n\n const searchInputRef = useRef<HTMLInputElement>(null);\n const listboxRef = useRef<HTMLDivElement>(null);\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n /**\n * Attempts to resolve the `listbox` label\n * @see https://storybook.wise.design/?path=/docs/forms-selectinput-accessibility--docs#labelling\n */\n const getListBoxLabelProps = (): {\n listBoxLabel?: string;\n listBoxLabelledBy?: string;\n } => {\n if (UNSAFE_triggerButtonProps?.['aria-label']) {\n return {\n listBoxLabel: UNSAFE_triggerButtonProps['aria-label'],\n };\n }\n\n if (UNSAFE_triggerButtonProps?.['aria-labelledby']) {\n return {\n listBoxLabelledBy: UNSAFE_triggerButtonProps['aria-labelledby'],\n };\n }\n\n if (inputAttributes['aria-labelledby']) {\n return {\n listBoxLabelledBy: inputAttributes['aria-labelledby'],\n };\n }\n\n return {};\n };\n\n return (\n <ListboxBase\n name={name}\n multiple={multiple}\n defaultValue={defaultValue}\n value={controlledValue}\n by={compareValues}\n disabled={disabled}\n onChange={\n ((value) => {\n if (!multiple) {\n setOpen(false);\n }\n onChange?.(value);\n }) satisfies SelectInputProps<T, M>['onChange']\n }\n >\n {({ disabled: uiDisabled, value }) => {\n const placeholderShown =\n multiple && Array.isArray(value) ? value.length === 0 : value == null;\n return (\n <OptionsOverlay\n placement=\"bottom-start\"\n open={open}\n renderTrigger={({ ref, getInteractionProps }) => (\n <SelectInputTriggerButtonPropsContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n ref: (node) => {\n ref(node);\n if (externalTriggerRef) {\n // eslint-disable-next-line no-param-reassign\n externalTriggerRef.current = node;\n } else {\n internalTriggerRef.current = node;\n }\n },\n ...inputAttributes,\n ...UNSAFE_triggerButtonProps,\n id,\n ...mergeProps(\n {\n onClick: () => {\n setOpen((prev) => !prev);\n },\n onKeyDown: (event: React.KeyboardEvent) => {\n if (\n event.key === ' ' ||\n event.key === 'Enter' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n setOpen((prev) => !prev);\n }\n },\n },\n getInteractionProps(),\n ),\n }}\n >\n {renderTrigger({\n content: !placeholderShown ? (\n <SelectInputOptionContentWithinTriggerContext.Provider value>\n {multiple && Array.isArray(value)\n ? (value as readonly NonNullable<T>[])\n .map((option) => renderValue(option, true))\n .filter((node) => node != null)\n .join(', ')\n : renderValue(value as NonNullable<T>, true)}\n </SelectInputOptionContentWithinTriggerContext.Provider>\n ) : (\n placeholder\n ),\n placeholderShown,\n clear:\n onClear != null\n ? () => {\n onClear();\n (externalTriggerRef?.current ?? internalTriggerRef.current)?.focus({\n preventScroll: true,\n });\n }\n : undefined,\n disabled: uiDisabled,\n size,\n className,\n })}\n </SelectInputTriggerButtonPropsContext.Provider>\n )}\n initialFocusRef={controllerRef}\n size={filterable ? 'lg' : 'md'}\n padding=\"none\"\n onClose={() => {\n setOpen(false);\n }}\n onCloseEnd={() => {\n setFilterQuery('');\n }}\n >\n <SelectInputOptions\n id={id ? `${id}Search` : undefined}\n parentId={parentId}\n items={items}\n compareValues={compareValues}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n filterQuery={deferredFilterQuery}\n autocomplete={autocomplete}\n name={name}\n onFilterChange={setFilterQuery}\n onAutocompleteSelect={(matchedValue) => {\n onChange?.(matchedValue as M extends true ? T[] : T);\n if (!multiple) {\n setOpen(false);\n }\n }}\n {...getListBoxLabelProps()}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\n}\n\nconst SelectInputTriggerButtonPropsContext = createContext<{\n ref?: React.ForwardedRef<HTMLButtonElement | null>;\n id?: string;\n onClick?: (event: React.MouseEvent) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n [key: string]: unknown;\n}>({});\n\ntype SelectInputTriggerButtonElementType = 'button' | React.ComponentType;\n\nexport type SelectInputTriggerButtonProps<\n T extends SelectInputTriggerButtonElementType = 'button',\n> = Merge<React.ComponentPropsWithoutRef<T>, { as?: T }>;\n\nexport function SelectInputTriggerButton<T extends SelectInputTriggerButtonElementType = 'button'>({\n as = 'button' as T,\n ...restProps\n}: SelectInputTriggerButtonProps<T>) {\n const { ref, onClick, onKeyDown, ...interactionProps } = useContext(\n SelectInputTriggerButtonPropsContext,\n );\n\n return (\n <ListboxBase.Button\n ref={ref}\n as={PolymorphicWithOverrides}\n role=\"combobox\"\n __overrides={{ as, ...interactionProps }}\n {...mergeProps({ onClick, onKeyDown }, restProps)}\n />\n );\n}\n\ninterface SelectInputOptionsContainerProps extends React.ComponentPropsWithRef<'div'> {\n onAriaActiveDescendantChange: (value: React.AriaAttributes['aria-activedescendant']) => void;\n}\n\nconst SelectInputOptionsContainer = forwardRef(function SelectInputOptionsContainer(\n {\n 'aria-orientation': ariaOrientation,\n 'aria-activedescendant': ariaActiveDescendant,\n role,\n tabIndex,\n onAriaActiveDescendantChange,\n onKeyDown,\n ...restProps\n }: SelectInputOptionsContainerProps,\n ref: React.ForwardedRef<HTMLDivElement | null>,\n) {\n const handleAriaActiveDescendantChange = useEffectEvent(onAriaActiveDescendantChange);\n useEffect(() => {\n handleAriaActiveDescendantChange(ariaActiveDescendant);\n }, [ariaActiveDescendant, handleAriaActiveDescendantChange]);\n\n return (\n <div\n ref={ref}\n role=\"none\"\n onKeyDown={(event) => {\n // Prevent confirmation close without an active item\n if (event.key === 'Enter' && ariaActiveDescendant == null) {\n return;\n }\n\n // Prevent absorbing actions early\n if (event.key === 'Escape' || event.key === 'Tab') {\n onKeyDown?.({\n ...event,\n preventDefault: () => {},\n stopPropagation: () => {},\n });\n return;\n }\n\n onKeyDown?.(event);\n }}\n {...restProps}\n />\n );\n});\n\ninterface SelectInputOptionsProps<T = string> extends Pick<\n SelectInputProps<T>,\n | 'items'\n | 'renderValue'\n | 'renderFooter'\n | 'filterable'\n | 'filterPlaceholder'\n | 'id'\n | 'parentId'\n | 'compareValues'\n> {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n listBoxLabel?: string;\n listBoxLabelledBy?: string;\n autocomplete?: string;\n name?: string;\n onAutocompleteSelect?: (value: T) => void;\n}\n\nfunction SelectInputOptions<T = string>({\n id,\n parentId,\n items,\n compareValues: compareValuesProp,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n searchInputRef,\n listboxRef,\n filterQuery,\n onFilterChange,\n listBoxLabel,\n listBoxLabelledBy,\n autocomplete,\n name,\n onAutocompleteSelect,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n const virtualiserHandlerRef = useRef<VirtualizerHandle>(null);\n const controllerRef = filterable ? searchInputRef : listboxRef;\n const [initialRender, setInitialRender] = useState(true);\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n useEffect(() => {\n if (needle) {\n // Ensure having an active option while filtering.\n // Without `requestAnimationFrame` upon which React depends for scheduling\n // updates, the active status would only show for a split second and then\n // disappear inadvertently.\n requestAnimationFrame(() => {\n if (\n controllerRef.current != null &&\n !controllerRef.current.hasAttribute('aria-activedescendant')\n ) {\n // Activate first option via synthetic key press\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n });\n }\n }, [controllerRef, needle]);\n\n const compareValues = useMemo(() => {\n if (!compareValuesProp) {\n return undefined;\n }\n\n if (typeof compareValuesProp === 'function') {\n return (a: NonNullable<T>, b: NonNullable<T>) => compareValuesProp(a, b);\n }\n\n const key = compareValuesProp;\n return (a: NonNullable<T>, b: NonNullable<T>) => {\n if (typeof a === 'object' && a != null && typeof b === 'object' && b != null) {\n return (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key];\n }\n return a === b;\n };\n }, [compareValuesProp]);\n\n const filteredItems: readonly SelectInputItem<NonNullable<T> | undefined>[] =\n needle != null\n ? filterSelectInputItems(dedupeSelectInputItems(items, compareValues), (item) =>\n selectInputOptionItemIncludesNeedle(item, needle),\n )\n : items;\n const resultsEmpty = needle != null && filteredItems.length === 0;\n\n const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;\n\n // Items shown once shall be kept mounted until the needle changes, otherwise\n // the scroll position may jump around inadvertently. Pattern adopted from:\n // https://inokawa.github.io/virtua/?path=/story/advanced-keep-offscreen-items--append-only\n const [mountedIndexes, setMountedIndexes] = useState<number[]>([]);\n useEffect(() => {\n // Ensure the 'End' key works as intended by keeping the last item mounted\n setMountedIndexes((prevMountedIndexes) => {\n const indexes = new Set(prevMountedIndexes);\n indexes.add(filteredItems.length - 1);\n return [...indexes]; // Sorting is redundant by nature here\n });\n }, [\n needle, // Needed as `filteredItems.length` may be equal between two updates\n filteredItems.length,\n ]);\n\n const listboxContainerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (listboxContainerRef.current != null) {\n listboxContainerRef.current.style.setProperty(\n '--initial-height',\n `${listboxContainerRef.current.offsetHeight}px`,\n );\n }\n }, []);\n\n useEffect(() => {\n setInitialRender(false);\n }, []);\n\n const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\n\n const getItemNode = (index: number) => {\n const item = filteredItems[index];\n return (\n <SelectInputItemView key={index} item={item} renderValue={renderValue} needle={needle} />\n );\n };\n\n const findMatchingItem = (autocompleteValue: string): T | null => {\n const flatOptions = items\n .flatMap((item) =>\n item.type === 'group' ? item.options : item.type === 'option' ? [item] : [],\n )\n .filter(\n (item): item is SelectInputOptionItem<NonNullable<T>> =>\n item.type === 'option' && item.value != null,\n );\n\n const exactMatch = flatOptions.find(\n (option) =>\n String(option.value) === autocompleteValue ||\n option.filterMatchers?.some((matcher) => matcher === autocompleteValue),\n );\n\n if (exactMatch) {\n return exactMatch.value;\n }\n\n const fuzzyMatch = flatOptions.find((option) =>\n option.filterMatchers?.some((matcher) =>\n matcher.toLowerCase().includes(autocompleteValue.toLowerCase()),\n ),\n );\n\n return fuzzyMatch ? fuzzyMatch.value : null;\n };\n\n return (\n <ListboxBase.Options\n as={SelectInputOptionsContainer}\n static\n className=\"np-select-input-options-container\"\n onAriaActiveDescendantChange={(value: React.AriaAttributes['aria-activedescendant']) => {\n if (controllerRef.current != null) {\n if (!initialRender && value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n id={id}\n name={name}\n autoComplete={autocomplete}\n role=\"combobox\"\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n aria-label={filterPlaceholder}\n defaultValue={filterQuery}\n aria-autocomplete=\"list\"\n aria-expanded\n aria-controls={listboxId}\n aria-describedby={showStatus ? statusId : undefined}\n onKeyDown={(event) => {\n // Prevent interfering with the matcher of Headless UI\n // https://mathiasbynens.be/notes/javascript-unicode#regex\n if (/^.$/u.test(event.key)) {\n event.stopPropagation();\n }\n }}\n onChange={(event) => {\n // Free up resources and ensure not to go out of bounds when the\n // resulting item count is less than before\n const inputValue = event.currentTarget.value;\n\n // Free up resources and ensure not to go out of bounds\n setMountedIndexes([]);\n onFilterChange(inputValue);\n }}\n onInput={(event) => {\n const inputValue = event.currentTarget.value;\n const inputElement = event.currentTarget;\n\n if (autocomplete && onAutocompleteSelect && inputValue) {\n setTimeout(() => {\n if (inputElement.value === inputValue && inputValue.length > 2) {\n const matchedValue = findMatchingItem(inputValue);\n if (matchedValue !== null) {\n onAutocompleteSelect(matchedValue);\n }\n }\n }, 50);\n }\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={clsx(\n 'np-select-input-listbox-container',\n virtualized && 'np-select-input-listbox-container--virtualized',\n needle == null && // Groups aren't shown when filtering\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\n data-wds-parent={parentId ?? undefined}\n >\n {resultsEmpty ? (\n <div id={statusId} className=\"np-select-input-options-status\">\n <CrossCircle size={16} className=\"np-select-input-options-status-icon\" />\n {intl.formatMessage(messages.noResultsFound)}\n </div>\n ) : null}\n\n <div\n ref={listboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-orientation=\"vertical\"\n aria-label={listBoxLabel}\n aria-labelledby={listBoxLabelledBy}\n tabIndex={0}\n className=\"np-select-input-listbox\"\n >\n {!virtualized ? (\n filteredItems.map((_, index) => getItemNode(index))\n ) : (\n <Virtualizer\n ref={virtualiserHandlerRef}\n key={needle}\n data={filteredItems}\n keepMounted={mountedIndexes}\n scrollRef={listboxRef} // `VList` doesn't expose this\n onScroll={async () => {\n if (!virtualiserHandlerRef.current) return;\n\n const startIndex = virtualiserHandlerRef.current.findItemIndex(\n virtualiserHandlerRef.current.scrollOffset,\n );\n const endIndex = virtualiserHandlerRef.current.findItemIndex(\n virtualiserHandlerRef.current.scrollOffset +\n virtualiserHandlerRef.current.viewportSize,\n );\n\n setMountedIndexes((prevMountedIndexes) => {\n const indexes = new Set(prevMountedIndexes);\n\n for (let index = startIndex; index <= endIndex; index += 1) {\n indexes.add(index);\n }\n\n return [...indexes].sort((a, b) => a - b);\n });\n }}\n >\n {(item, index) => (\n // The position of each item can't be inferred by browsers when\n // virtualizing, as some of the items may not be in the DOM\n <SelectInputItemsCountContext.Provider value={filteredItems.length}>\n <SelectInputItemPositionContext.Provider value={index + 1}>\n {getItemNode(index)}\n </SelectInputItemPositionContext.Provider>\n </SelectInputItemsCountContext.Provider>\n )}\n </Virtualizer>\n )}\n </div>\n\n {renderFooter != null ? (\n <footer className=\"np-select-input-footer\">\n <div\n role=\"none\"\n onKeyDown={(event) => {\n // Prevent interfering with Headless UI\n if (event.key !== 'Escape') {\n event.stopPropagation();\n }\n }}\n >\n {renderFooter({\n resultsEmpty,\n queryNormalized: needle,\n })}\n </div>\n </footer>\n ) : null}\n </section>\n </ListboxBase.Options>\n );\n}\n\ninterface SelectInputItemViewProps<\n T = string,\n I extends SelectInputItem<T | undefined> = SelectInputItem<T | undefined>,\n> extends Required<Pick<SelectInputProps<T>, 'renderValue'>> {\n item: I;\n needle: string | null | undefined;\n}\n\nfunction SelectInputItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputItemViewProps<T>) {\n switch (item.type) {\n case 'option': {\n if (\n item.value != null &&\n (needle == null || selectInputOptionItemIncludesNeedle(item, needle))\n ) {\n return (\n <SelectInputOption value={item.value} disabled={item.disabled}>\n {renderValue(item.value, false)}\n </SelectInputOption>\n );\n }\n break;\n }\n case 'group': {\n return <SelectInputGroupItemView item={item} renderValue={renderValue} needle={needle} />;\n }\n case 'separator': {\n if (needle == null) {\n return <hr className=\"np-select-input-separator-item\" />;\n }\n break;\n }\n }\n return null;\n}\n\ninterface SelectInputGroupItemViewProps<T = string> extends SelectInputItemViewProps<\n T,\n SelectInputGroupItem<T | undefined>\n> {}\n\nfunction SelectInputGroupItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputGroupItemViewProps<T>) {\n const headerId = useId();\n\n const header = (\n <Header\n as=\"header\"\n role=\"none\"\n id={headerId}\n title={item.label}\n // @ts-expect-error when we migrate ActionButton to new Button this should be sorted\n action={\n item.action && {\n text: item.action.label,\n onClick: item.action.onClick,\n }\n }\n className=\"np-select-input-group-item-header p-x-1\"\n />\n );\n\n return (\n // An empty container may be rendered when no options match `needle`\n // However, pre-filtering would result in worse performance overall\n <Section\n as=\"section\"\n role=\"group\"\n aria-labelledby={headerId}\n className={clsx('m-y-0', needle === null && 'np-select-input-group-item--without-needle')}\n >\n {needle == null ? header : null}\n {item.options.map((option, index) => (\n <SelectInputItemView\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n item={option}\n renderValue={renderValue}\n needle={needle}\n />\n ))}\n </Section>\n );\n}\n\nconst SelectInputItemsCountContext = createContext<number | undefined>(undefined);\nconst SelectInputItemPositionContext = createContext<number | undefined>(undefined);\n\ninterface SelectInputOptionProps<T = string> {\n value: T;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nfunction SelectInputOption<T = string>({ value, disabled, children }: SelectInputOptionProps<T>) {\n const itemsCount = useContext(SelectInputItemsCountContext);\n const itemPosition = useContext(SelectInputItemPositionContext);\n return (\n <ListboxBase.Option\n as=\"div\"\n value={value}\n aria-setsize={itemsCount}\n aria-posinset={itemPosition}\n disabled={disabled}\n className={({ active, disabled: uiDisabled }) =>\n clsx(\n 'np-select-input-option-container np-text-body-large',\n active && 'np-select-input-option-container--active',\n uiDisabled && 'np-select-input-option-container--disabled',\n )\n }\n >\n {({ selected }) => (\n <>\n <div className=\"np-select-input-option\">{children}</div>\n <Check\n size={16}\n className={clsx(\n 'np-select-input-option-check',\n !selected && 'np-select-input-option-check--not-selected',\n )}\n />\n </>\n )}\n </ListboxBase.Option>\n );\n}\n\nconst SelectInputOptionContentWithinTriggerContext = createContext(false);\n\nexport interface SelectInputOptionContentProps {\n title: string;\n note?: string;\n description?: string;\n icon?: React.ReactNode;\n}\n\nexport function SelectInputOptionContent({\n title,\n note,\n description,\n icon,\n}: SelectInputOptionContentProps) {\n const withinTrigger = useContext(SelectInputOptionContentWithinTriggerContext);\n\n return (\n <div\n className={clsx(\n 'np-select-input-option-content-container',\n (note || description) && 'np-text-body-large',\n )}\n >\n {icon ? (\n <div\n className={clsx(\n 'np-select-input-option-content-icon',\n !withinTrigger && 'np-select-input-option-content-icon--not-within-trigger',\n )}\n >\n {icon}\n </div>\n ) : null}\n\n <div className=\"np-select-input-option-content-text\">\n <div\n className={clsx(\n 'np-select-input-option-content-text-line-1',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n <div className=\"d-inline\">{title}</div>\n {note ? (\n <span className=\"np-select-input-option-content-text-secondary np-text-body-default\">\n {note}\n </span>\n ) : null}\n </div>\n\n {description ? (\n <div\n className={clsx(\n 'np-select-input-option-content-text-secondary np-text-body-default',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n {description}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["MAX_ITEMS_WITHOUT_VIRTUALIZATION","searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","dedupeSelectInputOptionItem","item","existingValues","compareValues","isDuplicate","Array","from","some","existingValue","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","selectInputOptionItemIncludesNeedle","needle","filterMatchers","haystack","includes","filterSelectInputItems","predicate","defaultRenderTrigger","content","placeholderShown","clear","disabled","size","className","_jsx","InputGroup","addonEnd","_jsxs","clsx","children","_Fragment","SelectInputClearButton","onClick","event","preventDefault","ChevronDown","initialContentWidth","padding","SelectInputTriggerButton","as","ButtonInput","intl","useIntl","formatMessage","dateTriggerMessages","ariaLabel","Cross","noop","SelectInput","id","idProp","parentId","name","multiple","placeholder","autocomplete","defaultValue","controlledValue","renderValue","String","renderFooter","renderTrigger","filterable","filterPlaceholder","UNSAFE_triggerButtonProps","triggerRef","externalTriggerRef","onFilterChange","onChange","onOpen","onClose","onClear","inputAttributes","useInputAttributes","nonLabelable","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","handleOpen","useEffect","current","filterQuery","_setFilterQuery","deferredFilterQuery","useDeferredValue","setFilterQuery","query","queryNormalized","internalTriggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","Popover","BottomSheet","searchInputRef","listboxRef","controllerRef","getListBoxLabelProps","listBoxLabel","listBoxLabelledBy","ListboxBase","by","uiDisabled","isArray","length","placement","ref","getInteractionProps","SelectInputTriggerButtonPropsContext","Provider","node","mergeProps","prev","onKeyDown","key","SelectInputOptionContentWithinTriggerContext","join","focus","preventScroll","initialFocusRef","onCloseEnd","SelectInputOptions","onAutocompleteSelect","matchedValue","createContext","restProps","interactionProps","useContext","Button","PolymorphicWithOverrides","role","__overrides","SelectInputOptionsContainer","forwardRef","ariaOrientation","ariaActiveDescendant","tabIndex","onAriaActiveDescendantChange","handleAriaActiveDescendantChange","stopPropagation","compareValuesProp","virtualiserHandlerRef","initialRender","setInitialRender","useMemo","requestAnimationFrame","hasAttribute","dispatchEvent","KeyboardEvent","bubbles","a","b","filteredItems","resultsEmpty","virtualized","mountedIndexes","setMountedIndexes","prevMountedIndexes","indexes","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","getItemNode","index","SelectInputItemView","findMatchingItem","autocompleteValue","flatOptions","flatMap","exactMatch","find","matcher","fuzzyMatch","Options","static","setAttribute","removeAttribute","SearchInput","autoComplete","shape","test","inputValue","currentTarget","onInput","inputElement","setTimeout","CrossCircle","messages","noResultsFound","_","Virtualizer","data","keepMounted","scrollRef","onScroll","startIndex","findItemIndex","scrollOffset","endIndex","viewportSize","sort","SelectInputItemsCountContext","SelectInputItemPositionContext","SelectInputOption","SelectInputGroupItemView","headerId","header","Header","title","label","action","text","Section","itemsCount","itemPosition","Option","active","selected","Check","SelectInputOptionContent","note","description","icon","withinTrigger"],"mappings":"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"}
1
+ {"version":3,"file":"SelectInput.js","sources":["../../src/inputs/SelectInput.tsx"],"sourcesContent":["import { Listbox as ListboxBase } from '@headlessui/react';\nimport { Check, ChevronDown, Cross, CrossCircle } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport mergeProps from 'merge-props';\nimport {\n createContext,\n forwardRef,\n ReactNode,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\nimport { Virtualizer, type VirtualizerHandle } from 'virtua';\n\nimport { useEffectEvent } from '../common/hooks/useEffectEvent';\nimport { useScreenSize } from '../common/hooks/useScreenSize';\nimport { PolymorphicWithOverrides } from '../common/polymorphicWithOverrides/PolymorphicWithOverrides';\nimport { Breakpoint } from '../common/propsValues/breakpoint';\nimport dateTriggerMessages from '../dateLookup/dateTrigger/DateTrigger.messages';\nimport { Merge } from '../utils';\n\nimport { BottomSheet } from './_BottomSheet';\nimport { ButtonInput } from './_ButtonInput';\nimport { Popover } from './_Popover';\nimport { useInputAttributes, WithInputAttributesProps } from './contexts';\nimport { InputGroup } from './InputGroup';\nimport { SearchInput } from './SearchInput';\nimport messages from './SelectInput.messages';\nimport Header from '../header';\nimport Section from '../section';\nimport { ButtonProps } from '../button/Button.types';\n\nconst MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n\nfunction searchableString(value: string) {\n return (\n value\n .trim()\n .replace(/\\s+/gu, ' ')\n // NFD converts an Å to A + ̊ (and other special characters)\n .normalize('NFD')\n // and then this replaces the ̊ with nothing (and other special characters)\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n );\n}\n\nfunction inferSearchableStrings(value: unknown) {\n if (typeof value === 'string') {\n return [searchableString(value)];\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value)\n .filter((innerValue) => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\n}\n\nexport interface SelectInputOptionItem<T = string> {\n type: 'option';\n value: T;\n filterMatchers?: readonly string[];\n disabled?: boolean;\n}\n\nexport interface SelectInputGroupItem<T = string> {\n type: 'group';\n label: ReactNode;\n options: readonly SelectInputOptionItem<T>[];\n action?: {\n label: string;\n onClick: ButtonProps['onClick'];\n };\n}\n\nexport interface SelectInputSeparatorItem {\n type: 'separator';\n}\n\nexport type SelectInputItem<T = string> =\n | SelectInputOptionItem<T>\n | SelectInputGroupItem<T>\n | SelectInputSeparatorItem;\n\nfunction dedupeSelectInputOptionItem<T>(\n item: SelectInputOptionItem<T>,\n existingValues: Set<T>,\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputOptionItem<T | undefined> {\n const isDuplicate = compareValues\n ? Array.from(existingValues).some((existingValue) => compareValues(item.value, existingValue))\n : existingValues.has(item.value);\n\n if (!isDuplicate) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\n/**\n * Sets the `value` of duplicate option items to `undefined`, hiding them when\n * rendered. Indexes are kept intact within groups to preserve the active item\n * between filter changes when possible.\n */\nfunction dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues, compareValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues, compareValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\nfunction selectInputOptionItemIncludesNeedle<T>(item: SelectInputOptionItem<T>, needle: string) {\n return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>\n haystack.includes(needle),\n );\n}\n\nfunction filterSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n predicate: (item: SelectInputOptionItem<T>) => boolean,\n) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return predicate(item);\n }\n case 'group': {\n return item.options.some((option) => predicate(option));\n }\n default:\n }\n return false;\n });\n}\n\n/**\n * Flattens and sorts filtered options using the provided comparator.\n * Extracts all options from groups, filters out undefined values (deduplicated items),\n * sorts them, and returns as a flat list of option items.\n */\nfunction sortSelectInputItems<T>(\n items: readonly SelectInputItem<T | undefined>[],\n compareFn: (\n a: SelectInputOptionItem<NonNullable<T>>,\n b: SelectInputOptionItem<NonNullable<T>>,\n searchQuery: string,\n ) => number,\n searchQuery: string,\n): SelectInputItem<NonNullable<T>>[] {\n const flattenedOption = items.flatMap((item) => {\n if (item.type === 'option') {\n return item.value !== undefined ? [item as SelectInputOptionItem<NonNullable<T>>] : [];\n }\n\n if (item.type === 'group') {\n return item.options.filter(\n (option): option is SelectInputOptionItem<NonNullable<T>> => option.value !== undefined,\n );\n }\n\n return [];\n });\n\n // eslint-disable-next-line functional/immutable-data\n return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));\n}\n\nexport interface SelectInputProps<T = string, M extends boolean = false> {\n id?: string;\n /**\n * Sets the `data-wds-parent` attribute on the listbox container, which is needed for complex components like DateInput to correctly manage event handling.\n * @internal\n */\n parentId?: string;\n name?: string;\n multiple?: M;\n placeholder?: string;\n items: readonly SelectInputItem<NonNullable<T>>[];\n /**\n * Enables browser autocomplete integration through the search input.\n * Accepts standard HTML autocomplete values (e.g., \"country-name\", \"address-level1\").\n *\n * Requires `filterable={true}` to enable the search input.\n *\n * @example\n * <SelectInput\n * name=\"country\"\n * autocomplete=\"country-name\"\n * filterable={true}\n * items={[{\n * type: 'option',\n * value: 'GB',\n * filterMatchers: ['United Kingdom', 'UK']\n * }]}\n * />\n */\n autocomplete?: string;\n defaultValue?: M extends true ? readonly T[] : T;\n value?: M extends true ? readonly T[] : T;\n compareValues?:\n | (keyof NonNullable<T> & string)\n | ((a: T | undefined, b: T | undefined) => boolean);\n renderValue?: (value: NonNullable<T>, withinTrigger: boolean) => React.ReactNode;\n renderFooter?: (args: {\n resultsEmpty: boolean;\n queryNormalized: string | null | undefined;\n }) => React.ReactNode;\n renderTrigger?: (args: {\n content: React.ReactNode;\n placeholderShown: boolean;\n clear: (() => void) | undefined;\n disabled: boolean;\n size: 'sm' | 'md' | 'lg';\n className: string | undefined;\n }) => React.ReactNode;\n filterable?: boolean;\n filterPlaceholder?: string;\n sortFilteredOptions?: (\n a: SelectInputOptionItem<NonNullable<T>>,\n b: SelectInputOptionItem<NonNullable<T>>,\n searchQuery: string,\n ) => number;\n disabled?: boolean;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n UNSAFE_triggerButtonProps?: WithInputAttributesProps['inputAttributes'] & {\n 'aria-label'?: string;\n };\n /** Ref to the select trigger button element. */\n triggerRef?: React.MutableRefObject<HTMLButtonElement | null>;\n onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;\n onChange?: (value: M extends true ? T[] : T) => void;\n onOpen?: () => void;\n onClose?: () => void;\n onClear?: () => void;\n}\n\nconst defaultRenderTrigger = (({ content, placeholderShown, clear, disabled, size, className }) => (\n <InputGroup\n addonEnd={{\n content: (\n <span className={clsx('np-select-input-addon-container', disabled && 'disabled')}>\n {clear != null && !placeholderShown ? (\n <>\n <SelectInputClearButton\n onClick={(event) => {\n event.preventDefault();\n clear();\n }}\n />\n <span className=\"np-select-input-addon-separator\" />\n </>\n ) : null}\n\n <span className=\"np-select-input-addon\">\n <ChevronDown size={16} />\n </span>\n </span>\n ),\n initialContentWidth: 24 + 4,\n padding: 'sm',\n }}\n disabled={disabled}\n className={className}\n >\n <SelectInputTriggerButton as={ButtonInput} size={size}>\n <span\n className={clsx(\n 'np-select-input-content',\n placeholderShown && 'np-select-input-placeholder',\n )}\n >\n {content}\n </span>\n </SelectInputTriggerButton>\n </InputGroup>\n)) satisfies SelectInputProps['renderTrigger'];\n\ninterface SelectInputClearButtonProps extends Pick<\n React.ComponentPropsWithoutRef<'button'>,\n 'className' | 'onClick'\n> {}\n\nfunction SelectInputClearButton({ className, onClick }: SelectInputClearButtonProps) {\n const intl = useIntl();\n\n return (\n <button\n type=\"button\"\n aria-label={intl.formatMessage(dateTriggerMessages.ariaLabel)}\n className={clsx(className, 'np-select-input-addon np-select-input-addon--interactive')}\n onClick={onClick}\n >\n <Cross size={16} />\n </button>\n );\n}\n\nconst noop = () => {};\n\nexport function SelectInput<T = string, M extends boolean = false>({\n id: idProp,\n parentId,\n name,\n multiple,\n placeholder,\n autocomplete,\n items,\n defaultValue,\n value: controlledValue,\n compareValues,\n renderValue = String,\n renderFooter,\n renderTrigger = defaultRenderTrigger,\n filterable,\n filterPlaceholder,\n sortFilteredOptions,\n disabled,\n size = 'md',\n className,\n UNSAFE_triggerButtonProps,\n triggerRef: externalTriggerRef,\n onFilterChange = noop,\n onChange,\n onOpen,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n const id = idProp ?? inputAttributes.id;\n\n const [open, setOpen] = useState(false);\n\n const initialized = useRef(false);\n const handleClose = useEffectEvent(onClose ?? (() => {}));\n const handleOpen = useEffectEvent(onOpen ?? (() => {}));\n useEffect(() => {\n if (initialized.current) {\n if (open) {\n handleOpen?.();\n } else {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, handleOpen, open]);\n\n const [filterQuery, _setFilterQuery] = useState('');\n const deferredFilterQuery = useDeferredValue(filterQuery);\n const setFilterQuery = useEffectEvent((query: string) => {\n _setFilterQuery(query);\n if (query !== filterQuery) {\n onFilterChange({\n query,\n queryNormalized: query ? searchableString(query) : null,\n });\n }\n });\n\n const internalTriggerRef = useRef<HTMLButtonElement | null>(null);\n\n const screenSm = useScreenSize(Breakpoint.SMALL);\n const OptionsOverlay = screenSm ? Popover : BottomSheet;\n\n const searchInputRef = useRef<HTMLInputElement>(null);\n const listboxRef = useRef<HTMLDivElement>(null);\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n /**\n * Attempts to resolve the `listbox` label\n * @see https://storybook.wise.design/?path=/docs/forms-selectinput-accessibility--docs#labelling\n */\n const getListBoxLabelProps = (): {\n listBoxLabel?: string;\n listBoxLabelledBy?: string;\n } => {\n if (UNSAFE_triggerButtonProps?.['aria-label']) {\n return {\n listBoxLabel: UNSAFE_triggerButtonProps['aria-label'],\n };\n }\n\n if (UNSAFE_triggerButtonProps?.['aria-labelledby']) {\n return {\n listBoxLabelledBy: UNSAFE_triggerButtonProps['aria-labelledby'],\n };\n }\n\n if (inputAttributes['aria-labelledby']) {\n return {\n listBoxLabelledBy: inputAttributes['aria-labelledby'],\n };\n }\n\n return {};\n };\n\n return (\n <ListboxBase\n name={name}\n multiple={multiple}\n defaultValue={defaultValue}\n value={controlledValue}\n by={compareValues}\n disabled={disabled}\n onChange={\n ((value) => {\n if (!multiple) {\n setOpen(false);\n }\n onChange?.(value);\n }) satisfies SelectInputProps<T, M>['onChange']\n }\n >\n {({ disabled: uiDisabled, value }) => {\n const placeholderShown =\n multiple && Array.isArray(value) ? value.length === 0 : value == null;\n return (\n <OptionsOverlay\n placement=\"bottom-start\"\n open={open}\n renderTrigger={({ ref, getInteractionProps }) => (\n <SelectInputTriggerButtonPropsContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n ref: (node) => {\n ref(node);\n if (externalTriggerRef) {\n // eslint-disable-next-line no-param-reassign\n externalTriggerRef.current = node;\n } else {\n internalTriggerRef.current = node;\n }\n },\n ...inputAttributes,\n ...UNSAFE_triggerButtonProps,\n id,\n ...mergeProps(\n {\n onClick: () => {\n setOpen((prev) => !prev);\n },\n onKeyDown: (event: React.KeyboardEvent) => {\n if (\n event.key === ' ' ||\n event.key === 'Enter' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n setOpen((prev) => !prev);\n }\n },\n },\n getInteractionProps(),\n ),\n }}\n >\n {renderTrigger({\n content: !placeholderShown ? (\n <SelectInputOptionContentWithinTriggerContext.Provider value>\n {multiple && Array.isArray(value)\n ? (value as readonly NonNullable<T>[])\n .map((option) => renderValue(option, true))\n .filter((node) => node != null)\n .join(', ')\n : renderValue(value as NonNullable<T>, true)}\n </SelectInputOptionContentWithinTriggerContext.Provider>\n ) : (\n placeholder\n ),\n placeholderShown,\n clear:\n onClear != null\n ? () => {\n onClear();\n (externalTriggerRef?.current ?? internalTriggerRef.current)?.focus({\n preventScroll: true,\n });\n }\n : undefined,\n disabled: uiDisabled,\n size,\n className,\n })}\n </SelectInputTriggerButtonPropsContext.Provider>\n )}\n initialFocusRef={controllerRef}\n size={filterable ? 'lg' : 'md'}\n padding=\"none\"\n onClose={() => {\n setOpen(false);\n }}\n onCloseEnd={() => {\n setFilterQuery('');\n }}\n >\n <SelectInputOptions\n id={id ? `${id}Search` : undefined}\n parentId={parentId}\n items={items}\n compareValues={compareValues}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n sortFilteredOptions={sortFilteredOptions}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n filterQuery={deferredFilterQuery}\n autocomplete={autocomplete}\n name={name}\n onFilterChange={setFilterQuery}\n onAutocompleteSelect={(matchedValue) => {\n onChange?.(matchedValue as M extends true ? T[] : T);\n if (!multiple) {\n setOpen(false);\n }\n }}\n {...getListBoxLabelProps()}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\n}\n\nconst SelectInputTriggerButtonPropsContext = createContext<{\n ref?: React.ForwardedRef<HTMLButtonElement | null>;\n id?: string;\n onClick?: (event: React.MouseEvent) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n [key: string]: unknown;\n}>({});\n\ntype SelectInputTriggerButtonElementType = 'button' | React.ComponentType;\n\nexport type SelectInputTriggerButtonProps<\n T extends SelectInputTriggerButtonElementType = 'button',\n> = Merge<React.ComponentPropsWithoutRef<T>, { as?: T }>;\n\nexport function SelectInputTriggerButton<T extends SelectInputTriggerButtonElementType = 'button'>({\n as = 'button' as T,\n ...restProps\n}: SelectInputTriggerButtonProps<T>) {\n const { ref, onClick, onKeyDown, ...interactionProps } = useContext(\n SelectInputTriggerButtonPropsContext,\n );\n\n return (\n <ListboxBase.Button\n ref={ref}\n as={PolymorphicWithOverrides}\n role=\"combobox\"\n __overrides={{ as, ...interactionProps }}\n {...mergeProps({ onClick, onKeyDown }, restProps)}\n />\n );\n}\n\ninterface SelectInputOptionsContainerProps extends React.ComponentPropsWithRef<'div'> {\n onAriaActiveDescendantChange: (value: React.AriaAttributes['aria-activedescendant']) => void;\n}\n\nconst SelectInputOptionsContainer = forwardRef(function SelectInputOptionsContainer(\n {\n 'aria-orientation': ariaOrientation,\n 'aria-activedescendant': ariaActiveDescendant,\n role,\n tabIndex,\n onAriaActiveDescendantChange,\n onKeyDown,\n ...restProps\n }: SelectInputOptionsContainerProps,\n ref: React.ForwardedRef<HTMLDivElement | null>,\n) {\n const handleAriaActiveDescendantChange = useEffectEvent(onAriaActiveDescendantChange);\n useEffect(() => {\n handleAriaActiveDescendantChange(ariaActiveDescendant);\n }, [ariaActiveDescendant, handleAriaActiveDescendantChange]);\n\n return (\n <div\n ref={ref}\n role=\"none\"\n onKeyDown={(event) => {\n // Prevent confirmation close without an active item\n if (event.key === 'Enter' && ariaActiveDescendant == null) {\n return;\n }\n\n // Prevent absorbing actions early\n if (event.key === 'Escape' || event.key === 'Tab') {\n onKeyDown?.({\n ...event,\n preventDefault: () => {},\n stopPropagation: () => {},\n });\n return;\n }\n\n onKeyDown?.(event);\n }}\n {...restProps}\n />\n );\n});\n\ninterface SelectInputOptionsProps<T = string> extends Pick<\n SelectInputProps<T>,\n | 'items'\n | 'renderValue'\n | 'renderFooter'\n | 'filterable'\n | 'filterPlaceholder'\n | 'id'\n | 'parentId'\n | 'compareValues'\n | 'sortFilteredOptions'\n> {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n listBoxLabel?: string;\n listBoxLabelledBy?: string;\n autocomplete?: string;\n name?: string;\n onAutocompleteSelect?: (value: T) => void;\n}\n\nfunction SelectInputOptions<T = string>({\n id,\n parentId,\n items,\n compareValues: compareValuesProp,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n sortFilteredOptions,\n searchInputRef,\n listboxRef,\n filterQuery,\n onFilterChange,\n listBoxLabel,\n listBoxLabelledBy,\n autocomplete,\n name,\n onAutocompleteSelect,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n const virtualiserHandlerRef = useRef<VirtualizerHandle>(null);\n const controllerRef = filterable ? searchInputRef : listboxRef;\n const [initialRender, setInitialRender] = useState(true);\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n useEffect(() => {\n if (needle) {\n // Ensure having an active option while filtering.\n // Without `requestAnimationFrame` upon which React depends for scheduling\n // updates, the active status would only show for a split second and then\n // disappear inadvertently.\n requestAnimationFrame(() => {\n if (\n controllerRef.current != null &&\n !controllerRef.current.hasAttribute('aria-activedescendant')\n ) {\n // Activate first option via synthetic key press\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n });\n }\n }, [controllerRef, needle]);\n\n const compareValues = useMemo(() => {\n if (!compareValuesProp) {\n return undefined;\n }\n\n if (typeof compareValuesProp === 'function') {\n return (a: NonNullable<T>, b: NonNullable<T>) => compareValuesProp(a, b);\n }\n\n const key = compareValuesProp;\n return (a: NonNullable<T>, b: NonNullable<T>) => {\n if (typeof a === 'object' && a != null && typeof b === 'object' && b != null) {\n return (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key];\n }\n return a === b;\n };\n }, [compareValuesProp]);\n\n const filteredItems: readonly SelectInputItem<NonNullable<T> | undefined>[] = useMemo(() => {\n if (needle == null) {\n return items;\n }\n\n const filtered = filterSelectInputItems(dedupeSelectInputItems(items, compareValues), (item) =>\n selectInputOptionItemIncludesNeedle(item, needle),\n );\n\n if (sortFilteredOptions) {\n return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);\n }\n\n return filtered;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needle, items, compareValues]);\n const resultsEmpty = needle != null && filteredItems.length === 0;\n\n const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;\n\n // Items shown once shall be kept mounted until the needle changes, otherwise\n // the scroll position may jump around inadvertently. Pattern adopted from:\n // https://inokawa.github.io/virtua/?path=/story/advanced-keep-offscreen-items--append-only\n const [mountedIndexes, setMountedIndexes] = useState<number[]>([]);\n useEffect(() => {\n // Ensure the 'End' key works as intended by keeping the last item mounted\n setMountedIndexes((prevMountedIndexes) => {\n const indexes = new Set(prevMountedIndexes);\n indexes.add(filteredItems.length - 1);\n return [...indexes]; // Sorting is redundant by nature here\n });\n }, [\n needle, // Needed as `filteredItems.length` may be equal between two updates\n filteredItems.length,\n ]);\n\n const listboxContainerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (listboxContainerRef.current != null) {\n listboxContainerRef.current.style.setProperty(\n '--initial-height',\n `${listboxContainerRef.current.offsetHeight}px`,\n );\n }\n }, []);\n\n useEffect(() => {\n setInitialRender(false);\n }, []);\n\n const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\n\n const getItemNode = (index: number) => {\n const item = filteredItems[index];\n return (\n <SelectInputItemView key={index} item={item} renderValue={renderValue} needle={needle} />\n );\n };\n\n const findMatchingItem = (autocompleteValue: string): T | null => {\n const flatOptions = items\n .flatMap((item) =>\n item.type === 'group' ? item.options : item.type === 'option' ? [item] : [],\n )\n .filter(\n (item): item is SelectInputOptionItem<NonNullable<T>> =>\n item.type === 'option' && item.value != null,\n );\n\n const exactMatch = flatOptions.find(\n (option) =>\n String(option.value) === autocompleteValue ||\n option.filterMatchers?.some((matcher) => matcher === autocompleteValue),\n );\n\n if (exactMatch) {\n return exactMatch.value;\n }\n\n const fuzzyMatch = flatOptions.find((option) =>\n option.filterMatchers?.some((matcher) =>\n matcher.toLowerCase().includes(autocompleteValue.toLowerCase()),\n ),\n );\n\n return fuzzyMatch ? fuzzyMatch.value : null;\n };\n\n return (\n <ListboxBase.Options\n as={SelectInputOptionsContainer}\n static\n className=\"np-select-input-options-container\"\n onAriaActiveDescendantChange={(value: React.AriaAttributes['aria-activedescendant']) => {\n if (controllerRef.current != null) {\n if (!initialRender && value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n id={id}\n name={name}\n autoComplete={autocomplete}\n role=\"combobox\"\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n aria-label={filterPlaceholder}\n defaultValue={filterQuery}\n aria-autocomplete=\"list\"\n aria-expanded\n aria-controls={listboxId}\n aria-describedby={showStatus ? statusId : undefined}\n onKeyDown={(event) => {\n // Prevent interfering with the matcher of Headless UI\n // https://mathiasbynens.be/notes/javascript-unicode#regex\n if (/^.$/u.test(event.key)) {\n event.stopPropagation();\n }\n }}\n onChange={(event) => {\n // Free up resources and ensure not to go out of bounds when the\n // resulting item count is less than before\n const inputValue = event.currentTarget.value;\n\n // Free up resources and ensure not to go out of bounds\n setMountedIndexes([]);\n onFilterChange(inputValue);\n }}\n onInput={(event) => {\n const inputValue = event.currentTarget.value;\n const inputElement = event.currentTarget;\n\n if (autocomplete && onAutocompleteSelect && inputValue) {\n setTimeout(() => {\n if (inputElement.value === inputValue && inputValue.length > 2) {\n const matchedValue = findMatchingItem(inputValue);\n if (matchedValue !== null) {\n onAutocompleteSelect(matchedValue);\n }\n }\n }, 50);\n }\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={clsx(\n 'np-select-input-listbox-container',\n virtualized && 'np-select-input-listbox-container--virtualized',\n needle == null && // Groups aren't shown when filtering\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\n data-wds-parent={parentId ?? undefined}\n >\n {resultsEmpty ? (\n <div id={statusId} className=\"np-select-input-options-status\">\n <CrossCircle size={16} className=\"np-select-input-options-status-icon\" />\n {intl.formatMessage(messages.noResultsFound)}\n </div>\n ) : null}\n\n <div\n ref={listboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-orientation=\"vertical\"\n aria-label={listBoxLabel}\n aria-labelledby={listBoxLabelledBy}\n tabIndex={0}\n className=\"np-select-input-listbox\"\n >\n {!virtualized ? (\n filteredItems.map((_, index) => getItemNode(index))\n ) : (\n <Virtualizer\n ref={virtualiserHandlerRef}\n key={needle}\n data={filteredItems}\n keepMounted={mountedIndexes}\n scrollRef={listboxRef} // `VList` doesn't expose this\n onScroll={async () => {\n if (!virtualiserHandlerRef.current) return;\n\n const startIndex = virtualiserHandlerRef.current.findItemIndex(\n virtualiserHandlerRef.current.scrollOffset,\n );\n const endIndex = virtualiserHandlerRef.current.findItemIndex(\n virtualiserHandlerRef.current.scrollOffset +\n virtualiserHandlerRef.current.viewportSize,\n );\n\n setMountedIndexes((prevMountedIndexes) => {\n const indexes = new Set(prevMountedIndexes);\n\n for (let index = startIndex; index <= endIndex; index += 1) {\n indexes.add(index);\n }\n\n return [...indexes].sort((a, b) => a - b);\n });\n }}\n >\n {(item, index) => (\n // The position of each item can't be inferred by browsers when\n // virtualizing, as some of the items may not be in the DOM\n <SelectInputItemsCountContext.Provider value={filteredItems.length}>\n <SelectInputItemPositionContext.Provider value={index + 1}>\n {getItemNode(index)}\n </SelectInputItemPositionContext.Provider>\n </SelectInputItemsCountContext.Provider>\n )}\n </Virtualizer>\n )}\n </div>\n\n {renderFooter != null ? (\n <footer className=\"np-select-input-footer\">\n <div\n role=\"none\"\n onKeyDown={(event) => {\n // Prevent interfering with Headless UI\n if (event.key !== 'Escape') {\n event.stopPropagation();\n }\n }}\n >\n {renderFooter({\n resultsEmpty,\n queryNormalized: needle,\n })}\n </div>\n </footer>\n ) : null}\n </section>\n </ListboxBase.Options>\n );\n}\n\ninterface SelectInputItemViewProps<\n T = string,\n I extends SelectInputItem<T | undefined> = SelectInputItem<T | undefined>,\n> extends Required<Pick<SelectInputProps<T>, 'renderValue'>> {\n item: I;\n needle: string | null | undefined;\n}\n\nfunction SelectInputItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputItemViewProps<T>) {\n switch (item.type) {\n case 'option': {\n if (\n item.value != null &&\n (needle == null || selectInputOptionItemIncludesNeedle(item, needle))\n ) {\n return (\n <SelectInputOption value={item.value} disabled={item.disabled}>\n {renderValue(item.value, false)}\n </SelectInputOption>\n );\n }\n break;\n }\n case 'group': {\n return <SelectInputGroupItemView item={item} renderValue={renderValue} needle={needle} />;\n }\n case 'separator': {\n if (needle == null) {\n return <hr className=\"np-select-input-separator-item\" />;\n }\n break;\n }\n }\n return null;\n}\n\ninterface SelectInputGroupItemViewProps<T = string> extends SelectInputItemViewProps<\n T,\n SelectInputGroupItem<T | undefined>\n> {}\n\nfunction SelectInputGroupItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputGroupItemViewProps<T>) {\n const headerId = useId();\n\n const header = (\n <Header\n as=\"header\"\n role=\"none\"\n id={headerId}\n title={item.label}\n // @ts-expect-error when we migrate ActionButton to new Button this should be sorted\n action={\n item.action && {\n text: item.action.label,\n onClick: item.action.onClick,\n }\n }\n className=\"np-select-input-group-item-header p-x-1\"\n />\n );\n\n return (\n // An empty container may be rendered when no options match `needle`\n // However, pre-filtering would result in worse performance overall\n <Section\n as=\"section\"\n role=\"group\"\n aria-labelledby={headerId}\n className={clsx('m-y-0', needle === null && 'np-select-input-group-item--without-needle')}\n >\n {needle == null ? header : null}\n {item.options.map((option, index) => (\n <SelectInputItemView\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n item={option}\n renderValue={renderValue}\n needle={needle}\n />\n ))}\n </Section>\n );\n}\n\nconst SelectInputItemsCountContext = createContext<number | undefined>(undefined);\nconst SelectInputItemPositionContext = createContext<number | undefined>(undefined);\n\ninterface SelectInputOptionProps<T = string> {\n value: T;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nfunction SelectInputOption<T = string>({ value, disabled, children }: SelectInputOptionProps<T>) {\n const itemsCount = useContext(SelectInputItemsCountContext);\n const itemPosition = useContext(SelectInputItemPositionContext);\n return (\n <ListboxBase.Option\n as=\"div\"\n value={value}\n aria-setsize={itemsCount}\n aria-posinset={itemPosition}\n disabled={disabled}\n className={({ active, disabled: uiDisabled }) =>\n clsx(\n 'np-select-input-option-container np-text-body-large',\n active && 'np-select-input-option-container--active',\n uiDisabled && 'np-select-input-option-container--disabled',\n )\n }\n >\n {({ selected }) => (\n <>\n <div className=\"np-select-input-option\">{children}</div>\n <Check\n size={16}\n className={clsx(\n 'np-select-input-option-check',\n !selected && 'np-select-input-option-check--not-selected',\n )}\n />\n </>\n )}\n </ListboxBase.Option>\n );\n}\n\nconst SelectInputOptionContentWithinTriggerContext = createContext(false);\n\nexport interface SelectInputOptionContentProps {\n title: string;\n note?: string;\n description?: string;\n icon?: React.ReactNode;\n}\n\nexport function SelectInputOptionContent({\n title,\n note,\n description,\n icon,\n}: SelectInputOptionContentProps) {\n const withinTrigger = useContext(SelectInputOptionContentWithinTriggerContext);\n\n return (\n <div\n className={clsx(\n 'np-select-input-option-content-container',\n (note || description) && 'np-text-body-large',\n )}\n >\n {icon ? (\n <div\n className={clsx(\n 'np-select-input-option-content-icon',\n !withinTrigger && 'np-select-input-option-content-icon--not-within-trigger',\n )}\n >\n {icon}\n </div>\n ) : null}\n\n <div className=\"np-select-input-option-content-text\">\n <div\n className={clsx(\n 'np-select-input-option-content-text-line-1',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n <div className=\"d-inline\">{title}</div>\n {note ? (\n <span className=\"np-select-input-option-content-text-secondary np-text-body-default\">\n {note}\n </span>\n ) : null}\n </div>\n\n {description ? (\n <div\n className={clsx(\n 'np-select-input-option-content-text-secondary np-text-body-default',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n {description}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["MAX_ITEMS_WITHOUT_VIRTUALIZATION","searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","dedupeSelectInputOptionItem","item","existingValues","compareValues","isDuplicate","Array","from","some","existingValue","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","selectInputOptionItemIncludesNeedle","needle","filterMatchers","haystack","includes","filterSelectInputItems","predicate","sortSelectInputItems","compareFn","searchQuery","flattenedOption","flatMap","sort","a","b","defaultRenderTrigger","content","placeholderShown","clear","disabled","size","className","_jsx","InputGroup","addonEnd","_jsxs","clsx","children","_Fragment","SelectInputClearButton","onClick","event","preventDefault","ChevronDown","initialContentWidth","padding","SelectInputTriggerButton","as","ButtonInput","intl","useIntl","formatMessage","dateTriggerMessages","ariaLabel","Cross","noop","SelectInput","id","idProp","parentId","name","multiple","placeholder","autocomplete","defaultValue","controlledValue","renderValue","String","renderFooter","renderTrigger","filterable","filterPlaceholder","sortFilteredOptions","UNSAFE_triggerButtonProps","triggerRef","externalTriggerRef","onFilterChange","onChange","onOpen","onClose","onClear","inputAttributes","useInputAttributes","nonLabelable","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","handleOpen","useEffect","current","filterQuery","_setFilterQuery","deferredFilterQuery","useDeferredValue","setFilterQuery","query","queryNormalized","internalTriggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","Popover","BottomSheet","searchInputRef","listboxRef","controllerRef","getListBoxLabelProps","listBoxLabel","listBoxLabelledBy","ListboxBase","by","uiDisabled","isArray","length","placement","ref","getInteractionProps","SelectInputTriggerButtonPropsContext","Provider","node","mergeProps","prev","onKeyDown","key","SelectInputOptionContentWithinTriggerContext","join","focus","preventScroll","initialFocusRef","onCloseEnd","SelectInputOptions","onAutocompleteSelect","matchedValue","createContext","restProps","interactionProps","useContext","Button","PolymorphicWithOverrides","role","__overrides","SelectInputOptionsContainer","forwardRef","ariaOrientation","ariaActiveDescendant","tabIndex","onAriaActiveDescendantChange","handleAriaActiveDescendantChange","stopPropagation","compareValuesProp","virtualiserHandlerRef","initialRender","setInitialRender","useMemo","requestAnimationFrame","hasAttribute","dispatchEvent","KeyboardEvent","bubbles","filteredItems","filtered","resultsEmpty","virtualized","mountedIndexes","setMountedIndexes","prevMountedIndexes","indexes","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","getItemNode","index","SelectInputItemView","findMatchingItem","autocompleteValue","flatOptions","exactMatch","find","matcher","fuzzyMatch","Options","static","setAttribute","removeAttribute","SearchInput","autoComplete","shape","test","inputValue","currentTarget","onInput","inputElement","setTimeout","CrossCircle","messages","noResultsFound","_","Virtualizer","data","keepMounted","scrollRef","onScroll","startIndex","findItemIndex","scrollOffset","endIndex","viewportSize","SelectInputItemsCountContext","SelectInputItemPositionContext","SelectInputOption","SelectInputGroupItemView","headerId","header","Header","title","label","action","text","Section","itemsCount","itemPosition","Option","active","selected","Check","SelectInputOptionContent","note","description","icon","withinTrigger"],"mappings":"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"}
@@ -91,6 +91,24 @@ function filterSelectInputItems(items, predicate) {
91
91
  return false;
92
92
  });
93
93
  }
94
+ /**
95
+ * Flattens and sorts filtered options using the provided comparator.
96
+ * Extracts all options from groups, filters out undefined values (deduplicated items),
97
+ * sorts them, and returns as a flat list of option items.
98
+ */
99
+ function sortSelectInputItems(items, compareFn, searchQuery) {
100
+ const flattenedOption = items.flatMap(item => {
101
+ if (item.type === 'option') {
102
+ return item.value !== undefined ? [item] : [];
103
+ }
104
+ if (item.type === 'group') {
105
+ return item.options.filter(option => option.value !== undefined);
106
+ }
107
+ return [];
108
+ });
109
+ // eslint-disable-next-line functional/immutable-data
110
+ return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));
111
+ }
94
112
  const defaultRenderTrigger = ({
95
113
  content,
96
114
  placeholderShown,
@@ -164,6 +182,7 @@ function SelectInput({
164
182
  renderTrigger = defaultRenderTrigger,
165
183
  filterable,
166
184
  filterPlaceholder,
185
+ sortFilteredOptions,
167
186
  disabled,
168
187
  size = 'md',
169
188
  className,
@@ -318,6 +337,7 @@ function SelectInput({
318
337
  renderFooter: renderFooter,
319
338
  filterable: filterable,
320
339
  filterPlaceholder: filterPlaceholder,
340
+ sortFilteredOptions: sortFilteredOptions,
321
341
  searchInputRef: searchInputRef,
322
342
  listboxRef: listboxRef,
323
343
  filterQuery: deferredFilterQuery,
@@ -405,6 +425,7 @@ function SelectInputOptions({
405
425
  renderFooter,
406
426
  filterable = false,
407
427
  filterPlaceholder,
428
+ sortFilteredOptions,
408
429
  searchInputRef,
409
430
  listboxRef,
410
431
  filterQuery,
@@ -457,7 +478,17 @@ function SelectInputOptions({
457
478
  return a === b;
458
479
  };
459
480
  }, [compareValuesProp]);
460
- const filteredItems = needle != null ? filterSelectInputItems(dedupeSelectInputItems(items, compareValues), item => selectInputOptionItemIncludesNeedle(item, needle)) : items;
481
+ const filteredItems = useMemo(() => {
482
+ if (needle == null) {
483
+ return items;
484
+ }
485
+ const filtered = filterSelectInputItems(dedupeSelectInputItems(items, compareValues), item => selectInputOptionItemIncludesNeedle(item, needle));
486
+ if (sortFilteredOptions) {
487
+ return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);
488
+ }
489
+ return filtered;
490
+ // eslint-disable-next-line react-hooks/exhaustive-deps
491
+ }, [needle, items, compareValues]);
461
492
  const resultsEmpty = needle != null && filteredItems.length === 0;
462
493
  const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;
463
494
  // Items shown once shall be kept mounted until the needle changes, otherwise