@transferwise/components 0.0.0-experimental-c5ba52c → 0.0.0-experimental-8d46704

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.
@@ -6,6 +6,7 @@ var classNames = require('classnames');
6
6
  var mergeProps = require('merge-props');
7
7
  var React = require('react');
8
8
  var reactIntl = require('react-intl');
9
+ var virtua = require('virtua');
9
10
  var useEffectEvent = require('../common/hooks/useEffectEvent.js');
10
11
  var useScreenSize = require('../common/hooks/useScreenSize.js');
11
12
  var PolymorphicWithOverrides = require('../common/polymorphicWithOverrides/PolymorphicWithOverrides.js');
@@ -25,6 +26,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
25
26
  var classNames__default = /*#__PURE__*/_interopDefault(classNames);
26
27
  var mergeProps__default = /*#__PURE__*/_interopDefault(mergeProps);
27
28
 
29
+ const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
28
30
  function searchableString(value) {
29
31
  return value.trim().replace(/\s+/gu, ' ').normalize('NFKC').toLowerCase();
30
32
  }
@@ -68,19 +70,19 @@ function dedupeSelectInputItems(items) {
68
70
  return item;
69
71
  });
70
72
  }
71
- function filterSelectInputOptionItem(item, needle) {
73
+ function selectInputOptionItemIncludesNeedle(item, needle) {
72
74
  return inferSearchableStrings(item.filterMatchers ?? item.value).some(haystack => haystack.includes(needle));
73
75
  }
74
- function filterSelectInputItems(items, needle) {
76
+ function filterSelectInputItems(items, predicate) {
75
77
  return items.filter(item => {
76
78
  switch (item.type) {
77
79
  case 'option':
78
80
  {
79
- return filterSelectInputOptionItem(item, needle);
81
+ return predicate(item);
80
82
  }
81
83
  case 'group':
82
84
  {
83
- return item.options.some(option => filterSelectInputOptionItem(option, needle));
85
+ return item.options.some(option => predicate(option));
84
86
  }
85
87
  }
86
88
  return false;
@@ -181,12 +183,15 @@ function SelectInput({
181
183
  }
182
184
  }, [handleClose, open]);
183
185
  const [filterQuery, _setFilterQuery] = React.useState('');
186
+ const deferredFilterQuery = React.useDeferredValue(filterQuery);
184
187
  const setFilterQuery = useEffectEvent.useEffectEvent(query => {
185
188
  _setFilterQuery(query);
186
- onFilterChange({
187
- query,
188
- queryNormalized: query ? searchableString(query) : null
189
- });
189
+ if (query !== filterQuery) {
190
+ onFilterChange({
191
+ query,
192
+ queryNormalized: query ? searchableString(query) : null
193
+ });
194
+ }
190
195
  });
191
196
  const triggerRef = React.useRef(null);
192
197
  const screenSm = useScreenSize.useScreenSize(breakpoint.Breakpoint.SMALL);
@@ -198,10 +203,7 @@ function SelectInput({
198
203
  name: name,
199
204
  multiple: multiple,
200
205
  defaultValue: defaultValue,
201
- value: controlledValue
202
- // TODO: Remove assertion when upgrading TypeScript to v5
203
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
204
- ,
206
+ value: controlledValue,
205
207
  by: compareValues,
206
208
  disabled: disabled,
207
209
  onChange: value => {
@@ -266,9 +268,7 @@ function SelectInput({
266
268
  setOpen(false);
267
269
  },
268
270
  onCloseEnd: () => {
269
- if (filterQuery !== '') {
270
- setFilterQuery('');
271
- }
271
+ setFilterQuery('');
272
272
  },
273
273
  children: /*#__PURE__*/jsxRuntime.jsx(SelectInputOptions, {
274
274
  items: items,
@@ -278,7 +278,8 @@ function SelectInput({
278
278
  filterPlaceholder: filterPlaceholder,
279
279
  searchInputRef: searchInputRef,
280
280
  listboxRef: listboxRef,
281
- filterQuery: filterQuery,
281
+ value: value,
282
+ filterQuery: deferredFilterQuery,
282
283
  onFilterChange: setFilterQuery
283
284
  })
284
285
  });
@@ -351,6 +352,7 @@ function SelectInputOptions({
351
352
  filterPlaceholder,
352
353
  searchInputRef,
353
354
  listboxRef,
355
+ value,
354
356
  filterQuery,
355
357
  onFilterChange
356
358
  }) {
@@ -362,7 +364,8 @@ function SelectInputOptions({
362
364
  }
363
365
  return undefined;
364
366
  }, [filterQuery, filterable]);
365
- const resultsEmpty = needle != null && filterSelectInputItems(items, needle).length === 0;
367
+ const filteredItems = needle != null ? filterSelectInputItems(items, item => selectInputOptionItemIncludesNeedle(item, needle)) : items;
368
+ const resultsEmpty = needle != null && filteredItems.length === 0;
366
369
  const listboxContainerRef = React.useRef(null);
367
370
  React.useEffect(() => {
368
371
  if (listboxContainerRef.current != null) {
@@ -372,6 +375,22 @@ function SelectInputOptions({
372
375
  const showStatus = resultsEmpty;
373
376
  const statusId = React.useId();
374
377
  const listboxId = React.useId();
378
+ const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;
379
+ const values = React.useMemo(() => new Set(Array.isArray(value) ? value : [value]), [value]);
380
+ const listboxProps = {
381
+ id: listboxId,
382
+ role: 'listbox',
383
+ 'aria-orientation': 'vertical',
384
+ tabIndex: 0,
385
+ className: 'np-select-input-listbox',
386
+ children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => /*#__PURE__*/jsxRuntime.jsx(SelectInputItemView
387
+ // eslint-disable-next-line react/no-array-index-key
388
+ , {
389
+ item: item,
390
+ renderValue: renderValue,
391
+ needle: needle
392
+ }, index))
393
+ };
375
394
  return /*#__PURE__*/jsxRuntime.jsxs(react.Listbox.Options, {
376
395
  as: SelectInputOptionsContainer,
377
396
  static: true,
@@ -398,7 +417,7 @@ function SelectInputOptions({
398
417
  ref: searchInputRef,
399
418
  shape: "rectangle",
400
419
  placeholder: filterPlaceholder,
401
- value: filterQuery,
420
+ defaultValue: filterQuery,
402
421
  "aria-controls": listboxId,
403
422
  "aria-describedby": showStatus ? statusId : undefined,
404
423
  onKeyDown: event => {
@@ -415,7 +434,7 @@ function SelectInputOptions({
415
434
  }) : null, /*#__PURE__*/jsxRuntime.jsxs("section", {
416
435
  ref: listboxContainerRef,
417
436
  tabIndex: -1,
418
- className: classNames__default.default('np-select-input-listbox-container', items.some(item => item.type === 'group') && 'np-select-input-listbox-container--has-group'),
437
+ className: classNames__default.default('np-select-input-listbox-container', virtualized && 'np-select-input-listbox-container--virtualized', needle == null && items.some(item => item.type === 'group') && 'np-select-input-listbox-container--has-group'),
419
438
  children: [resultsEmpty ? /*#__PURE__*/jsxRuntime.jsxs("div", {
420
439
  id: statusId,
421
440
  className: "np-select-input-options-status",
@@ -423,20 +442,19 @@ function SelectInputOptions({
423
442
  size: 16,
424
443
  className: "np-select-input-options-status-icon"
425
444
  }), intl.formatMessage(SelectInput_messages.noResultsFound)]
426
- }) : null, /*#__PURE__*/jsxRuntime.jsx("div", {
445
+ }) : null, !virtualized ? /*#__PURE__*/jsxRuntime.jsx("div", {
427
446
  ref: listboxRef,
428
- id: listboxId,
429
- role: "listbox",
430
- "aria-orientation": "vertical",
431
- tabIndex: 0,
432
- className: "np-select-input-listbox",
433
- children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => /*#__PURE__*/jsxRuntime.jsx(SelectInputItemView
434
- // eslint-disable-next-line react/no-array-index-key
435
- , {
436
- item: item,
437
- renderValue: renderValue,
438
- needle: needle
439
- }, index))
447
+ ...listboxProps
448
+ }) : /*#__PURE__*/React.createElement(virtua.VList, {
449
+ ...listboxProps,
450
+ key: needle,
451
+ keepMounted: (() => {
452
+ let index = 0;
453
+ return filterSelectInputItems(filteredItems, item => values.has(item.value)).map(item => {
454
+ index = filteredItems.indexOf(item, index + 1);
455
+ return index;
456
+ });
457
+ })()
440
458
  }), renderFooter != null ? /*#__PURE__*/jsxRuntime.jsx("footer", {
441
459
  className: "np-select-input-footer",
442
460
  children: /*#__PURE__*/jsxRuntime.jsx("div", {
@@ -464,7 +482,7 @@ function SelectInputItemView({
464
482
  switch (item.type) {
465
483
  case 'option':
466
484
  {
467
- if (item.value != null && (needle == null || filterSelectInputOptionItem(item, needle))) {
485
+ if (item.value != null && (needle == null || selectInputOptionItemIncludesNeedle(item, needle))) {
468
486
  return /*#__PURE__*/jsxRuntime.jsx(SelectInputOption, {
469
487
  value: item.value,
470
488
  disabled: item.disabled,
@@ -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 classNames from 'classnames';\nimport mergeProps from 'merge-props';\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\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';\n\nfunction searchableString(value: string) {\n return value.trim().replace(/\\s+/gu, ' ').normalize('NFKC').toLowerCase();\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): innerValue is string => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\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}>({});\nconst SelectInputOptionContentWithinTriggerContext = createContext(false);\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: string;\n options: readonly SelectInputOptionItem<T>[];\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): SelectInputOptionItem<T | undefined> {\n if (!existingValues.has(item.value)) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\nfunction dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\nfunction filterSelectInputOptionItem<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>(items: readonly SelectInputItem<T>[], needle: string) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return filterSelectInputOptionItem(item, needle);\n }\n case 'group': {\n return item.options.some((option) => filterSelectInputOptionItem(option, needle));\n }\n default:\n }\n return false;\n });\n}\n\nexport interface SelectInputProps<T = string, M extends boolean = false> {\n id?: string;\n name?: string;\n multiple?: M;\n placeholder?: string;\n items: readonly SelectInputItem<NonNullable<T>>[];\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 onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;\n onChange?: (value: M extends true ? T[] : T) => 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={classNames('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={classNames(\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\n extends Pick<React.ComponentPropsWithoutRef<'button'>, 'className' | 'onClick'> {}\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={classNames(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 name,\n multiple,\n placeholder,\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 onFilterChange = noop,\n onChange,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes();\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 useEffect(() => {\n if (initialized.current) {\n if (!open) {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, open]);\n\n const [filterQuery, _setFilterQuery] = useState('');\n const setFilterQuery = useEffectEvent((query: string) => {\n _setFilterQuery(query);\n onFilterChange({\n query,\n queryNormalized: query ? searchableString(query) : null,\n });\n });\n\n const triggerRef = 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 return (\n <ListboxBase\n name={name}\n multiple={multiple}\n defaultValue={defaultValue}\n value={controlledValue}\n // TODO: Remove assertion when upgrading TypeScript to v5\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n by={compareValues as any}\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 triggerRef.current = node;\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\n .map((option: NonNullable<T>) => 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 triggerRef.current?.focus({ preventScroll: true });\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 if (filterQuery !== '') {\n setFilterQuery('');\n }\n }}\n >\n <SelectInputOptions\n items={items}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n filterQuery={filterQuery}\n onFilterChange={setFilterQuery}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\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 __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>\n extends Pick<\n SelectInputProps<T>,\n 'items' | 'renderValue' | 'renderFooter' | 'filterable' | 'filterPlaceholder'\n > {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n}\n\nfunction SelectInputOptions<T = string>({\n items,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n searchInputRef,\n listboxRef,\n filterQuery,\n onFilterChange,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n const resultsEmpty = needle != null && filterSelectInputItems(items, needle).length === 0;\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 const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\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 (value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n if (filterQuery) {\n // Ensure having an active option while filtering\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n value={filterQuery}\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 onFilterChange(event.currentTarget.value);\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={classNames(\n 'np-select-input-listbox-container',\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\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 tabIndex={0}\n className=\"np-select-input-listbox\"\n >\n {(needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => (\n <SelectInputItemView\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n item={item}\n renderValue={renderValue}\n needle={needle}\n />\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 (item.value != null && (needle == null || filterSelectInputOptionItem(item, needle))) {\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>\n extends SelectInputItemViewProps<T, SelectInputGroupItem<T | undefined>> {}\n\nfunction SelectInputGroupItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputGroupItemViewProps<T>) {\n const headerId = useId();\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 role=\"group\"\n aria-labelledby={headerId}\n className={classNames(needle === null && 'np-select-input-group-item--without-needle')}\n >\n {needle == null ? (\n <header\n id={headerId}\n role=\"none\"\n className=\"np-select-input-group-item-header np-text-title-group\"\n >\n {item.label}\n </header>\n ) : 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\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 return (\n <ListboxBase.Option\n as=\"div\"\n value={value}\n disabled={disabled}\n className={({ active, disabled: uiDisabled }) =>\n classNames(\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={classNames(\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\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={classNames(\n 'np-select-input-option-content-container',\n (note || description) && 'np-text-body-large',\n )}\n >\n {icon ? (\n <div\n className={classNames(\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={classNames(\n 'np-select-input-option-content-text-line-1',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n <h4 className=\"np-select-input-option-content-text-primary d-inline\">{title}</h4>\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={classNames(\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":["searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","SelectInputTriggerButtonPropsContext","createContext","SelectInputOptionContentWithinTriggerContext","dedupeSelectInputOptionItem","item","existingValues","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","filterSelectInputOptionItem","needle","filterMatchers","some","haystack","includes","filterSelectInputItems","defaultRenderTrigger","content","placeholderShown","clear","disabled","size","className","_jsx","InputGroup","addonEnd","_jsxs","classNames","children","_Fragment","SelectInputClearButton","onClick","event","preventDefault","ChevronDown","initialContentWidth","padding","SelectInputTriggerButton","as","ButtonInput","intl","useIntl","formatMessage","dateTriggerMessages","ariaLabel","Cross","noop","SelectInput","id","idProp","name","multiple","placeholder","defaultValue","controlledValue","compareValues","renderValue","String","renderFooter","renderTrigger","filterable","filterPlaceholder","UNSAFE_triggerButtonProps","onFilterChange","onChange","onClose","onClear","inputAttributes","useInputAttributes","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","useEffect","current","filterQuery","_setFilterQuery","setFilterQuery","query","queryNormalized","triggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","Popover","BottomSheet","searchInputRef","listboxRef","controllerRef","ListboxBase","by","uiDisabled","Array","isArray","length","placement","ref","getInteractionProps","Provider","node","mergeProps","prev","onKeyDown","key","join","focus","preventScroll","initialFocusRef","onCloseEnd","SelectInputOptions","restProps","interactionProps","useContext","Button","PolymorphicWithOverrides","__overrides","SelectInputOptionsContainer","forwardRef","ariaOrientation","ariaActiveDescendant","role","tabIndex","onAriaActiveDescendantChange","handleAriaActiveDescendantChange","stopPropagation","useMemo","resultsEmpty","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","Options","static","setAttribute","removeAttribute","dispatchEvent","KeyboardEvent","bubbles","SearchInput","shape","test","currentTarget","CrossCircle","messages","noResultsFound","index","SelectInputItemView","SelectInputOption","SelectInputGroupItemView","headerId","label","Option","active","selected","Check","SelectInputOptionContent","title","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 classNames from 'classnames';\nimport mergeProps from 'merge-props';\nimport {\n createContext,\n forwardRef,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\nimport { VList } 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';\n\nconst MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n\nfunction searchableString(value: string) {\n return value.trim().replace(/\\s+/gu, ' ').normalize('NFKC').toLowerCase();\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\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}>({});\nconst SelectInputOptionContentWithinTriggerContext = createContext(false);\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: string;\n options: readonly SelectInputOptionItem<T>[];\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): SelectInputOptionItem<T | undefined> {\n if (!existingValues.has(item.value)) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\nfunction dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues),\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 name?: string;\n multiple?: M;\n placeholder?: string;\n items: readonly SelectInputItem<NonNullable<T>>[];\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 onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;\n onChange?: (value: M extends true ? T[] : T) => 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={classNames('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={classNames(\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\n extends Pick<React.ComponentPropsWithoutRef<'button'>, 'className' | 'onClick'> {}\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={classNames(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 name,\n multiple,\n placeholder,\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 onFilterChange = noop,\n onChange,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes();\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 useEffect(() => {\n if (initialized.current) {\n if (!open) {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, 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 triggerRef = 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 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 triggerRef.current = node;\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 triggerRef.current?.focus({ preventScroll: true });\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 items={items}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n value={value}\n filterQuery={deferredFilterQuery}\n onFilterChange={setFilterQuery}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\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 __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>\n extends Pick<\n SelectInputProps<T>,\n 'items' | 'renderValue' | 'renderFooter' | 'filterable' | 'filterPlaceholder'\n > {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n value: readonly T[] | T;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n}\n\nfunction SelectInputOptions<T = string>({\n items,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n searchInputRef,\n listboxRef,\n value,\n filterQuery,\n onFilterChange,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n\n const filteredItems =\n needle != null\n ? filterSelectInputItems(items, (item) => selectInputOptionItemIncludesNeedle(item, needle))\n : items;\n const resultsEmpty = needle != null && filteredItems.length === 0;\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 const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\n\n const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;\n\n const values = useMemo(\n () => new Set(Array.isArray(value) ? (value as readonly T[]) : [value as T]),\n [value],\n );\n\n const listboxProps = {\n id: listboxId,\n role: 'listbox',\n 'aria-orientation': 'vertical',\n tabIndex: 0,\n className: 'np-select-input-listbox',\n children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => (\n <SelectInputItemView\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n item={item}\n renderValue={renderValue}\n needle={needle}\n />\n )),\n } as const;\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 (value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n if (filterQuery) {\n // Ensure having an active option while filtering\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n defaultValue={filterQuery}\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 onFilterChange(event.currentTarget.value);\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={classNames(\n 'np-select-input-listbox-container',\n virtualized && 'np-select-input-listbox-container--virtualized',\n needle == null &&\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\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 {!virtualized ? (\n <div ref={listboxRef} {...listboxProps} />\n ) : (\n <VList\n {...listboxProps}\n key={needle}\n keepMounted={(() => {\n let index = 0;\n return filterSelectInputItems(filteredItems, (item) => values.has(item.value)).map(\n (item) => {\n index = filteredItems.indexOf(item, index + 1);\n return index;\n },\n );\n })()}\n />\n )}\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>\n extends SelectInputItemViewProps<T, SelectInputGroupItem<T | undefined>> {}\n\nfunction SelectInputGroupItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputGroupItemViewProps<T>) {\n const headerId = useId();\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 role=\"group\"\n aria-labelledby={headerId}\n className={classNames(needle === null && 'np-select-input-group-item--without-needle')}\n >\n {needle == null ? (\n <header\n id={headerId}\n role=\"none\"\n className=\"np-select-input-group-item-header np-text-title-group\"\n >\n {item.label}\n </header>\n ) : 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\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 return (\n <ListboxBase.Option\n as=\"div\"\n value={value}\n disabled={disabled}\n className={({ active, disabled: uiDisabled }) =>\n classNames(\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={classNames(\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\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={classNames(\n 'np-select-input-option-content-container',\n (note || description) && 'np-text-body-large',\n )}\n >\n {icon ? (\n <div\n className={classNames(\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={classNames(\n 'np-select-input-option-content-text-line-1',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n <h4 className=\"np-select-input-option-content-text-primary d-inline\">{title}</h4>\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={classNames(\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","SelectInputTriggerButtonPropsContext","createContext","SelectInputOptionContentWithinTriggerContext","dedupeSelectInputOptionItem","item","existingValues","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","selectInputOptionItemIncludesNeedle","needle","filterMatchers","some","haystack","includes","filterSelectInputItems","predicate","defaultRenderTrigger","content","placeholderShown","clear","disabled","size","className","_jsx","InputGroup","addonEnd","_jsxs","classNames","children","_Fragment","SelectInputClearButton","onClick","event","preventDefault","ChevronDown","initialContentWidth","padding","SelectInputTriggerButton","as","ButtonInput","intl","useIntl","formatMessage","dateTriggerMessages","ariaLabel","Cross","noop","SelectInput","id","idProp","name","multiple","placeholder","defaultValue","controlledValue","compareValues","renderValue","String","renderFooter","renderTrigger","filterable","filterPlaceholder","UNSAFE_triggerButtonProps","onFilterChange","onChange","onClose","onClear","inputAttributes","useInputAttributes","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","useEffect","current","filterQuery","_setFilterQuery","deferredFilterQuery","useDeferredValue","setFilterQuery","query","queryNormalized","triggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","Popover","BottomSheet","searchInputRef","listboxRef","controllerRef","ListboxBase","by","uiDisabled","Array","isArray","length","placement","ref","getInteractionProps","Provider","node","mergeProps","prev","onKeyDown","key","join","focus","preventScroll","initialFocusRef","onCloseEnd","SelectInputOptions","restProps","interactionProps","useContext","Button","PolymorphicWithOverrides","__overrides","SelectInputOptionsContainer","forwardRef","ariaOrientation","ariaActiveDescendant","role","tabIndex","onAriaActiveDescendantChange","handleAriaActiveDescendantChange","stopPropagation","useMemo","filteredItems","resultsEmpty","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","virtualized","listboxProps","index","SelectInputItemView","Options","static","setAttribute","removeAttribute","dispatchEvent","KeyboardEvent","bubbles","SearchInput","shape","test","currentTarget","CrossCircle","messages","noResultsFound","_createElement","VList","keepMounted","indexOf","SelectInputOption","SelectInputGroupItemView","headerId","label","Option","active","selected","Check","SelectInputOptionContent","title","note","description","icon","withinTrigger"],"mappings":"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"}
@@ -2,8 +2,9 @@ import { Listbox } from '@headlessui/react';
2
2
  import { CrossCircle, Check, ChevronDown, Cross } from '@transferwise/icons';
3
3
  import classNames from 'classnames';
4
4
  import mergeProps from 'merge-props';
5
- import { useState, useRef, useEffect, useContext, useMemo, useId, createContext, forwardRef } from 'react';
5
+ import { useState, useRef, useEffect, useDeferredValue, useContext, useMemo, useId, createElement, createContext, forwardRef } from 'react';
6
6
  import { useIntl } from 'react-intl';
7
+ import { VList } from 'virtua';
7
8
  import { useEffectEvent } from '../common/hooks/useEffectEvent.mjs';
8
9
  import { useScreenSize } from '../common/hooks/useScreenSize.mjs';
9
10
  import { PolymorphicWithOverrides } from '../common/polymorphicWithOverrides/PolymorphicWithOverrides.mjs';
@@ -18,6 +19,7 @@ import { SearchInput } from './SearchInput.mjs';
18
19
  import messages from './SelectInput.messages.mjs';
19
20
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
20
21
 
22
+ const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
21
23
  function searchableString(value) {
22
24
  return value.trim().replace(/\s+/gu, ' ').normalize('NFKC').toLowerCase();
23
25
  }
@@ -61,19 +63,19 @@ function dedupeSelectInputItems(items) {
61
63
  return item;
62
64
  });
63
65
  }
64
- function filterSelectInputOptionItem(item, needle) {
66
+ function selectInputOptionItemIncludesNeedle(item, needle) {
65
67
  return inferSearchableStrings(item.filterMatchers ?? item.value).some(haystack => haystack.includes(needle));
66
68
  }
67
- function filterSelectInputItems(items, needle) {
69
+ function filterSelectInputItems(items, predicate) {
68
70
  return items.filter(item => {
69
71
  switch (item.type) {
70
72
  case 'option':
71
73
  {
72
- return filterSelectInputOptionItem(item, needle);
74
+ return predicate(item);
73
75
  }
74
76
  case 'group':
75
77
  {
76
- return item.options.some(option => filterSelectInputOptionItem(option, needle));
78
+ return item.options.some(option => predicate(option));
77
79
  }
78
80
  }
79
81
  return false;
@@ -174,12 +176,15 @@ function SelectInput({
174
176
  }
175
177
  }, [handleClose, open]);
176
178
  const [filterQuery, _setFilterQuery] = useState('');
179
+ const deferredFilterQuery = useDeferredValue(filterQuery);
177
180
  const setFilterQuery = useEffectEvent(query => {
178
181
  _setFilterQuery(query);
179
- onFilterChange({
180
- query,
181
- queryNormalized: query ? searchableString(query) : null
182
- });
182
+ if (query !== filterQuery) {
183
+ onFilterChange({
184
+ query,
185
+ queryNormalized: query ? searchableString(query) : null
186
+ });
187
+ }
183
188
  });
184
189
  const triggerRef = useRef(null);
185
190
  const screenSm = useScreenSize(Breakpoint.SMALL);
@@ -191,10 +196,7 @@ function SelectInput({
191
196
  name: name,
192
197
  multiple: multiple,
193
198
  defaultValue: defaultValue,
194
- value: controlledValue
195
- // TODO: Remove assertion when upgrading TypeScript to v5
196
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
197
- ,
199
+ value: controlledValue,
198
200
  by: compareValues,
199
201
  disabled: disabled,
200
202
  onChange: value => {
@@ -259,9 +261,7 @@ function SelectInput({
259
261
  setOpen(false);
260
262
  },
261
263
  onCloseEnd: () => {
262
- if (filterQuery !== '') {
263
- setFilterQuery('');
264
- }
264
+ setFilterQuery('');
265
265
  },
266
266
  children: /*#__PURE__*/jsx(SelectInputOptions, {
267
267
  items: items,
@@ -271,7 +271,8 @@ function SelectInput({
271
271
  filterPlaceholder: filterPlaceholder,
272
272
  searchInputRef: searchInputRef,
273
273
  listboxRef: listboxRef,
274
- filterQuery: filterQuery,
274
+ value: value,
275
+ filterQuery: deferredFilterQuery,
275
276
  onFilterChange: setFilterQuery
276
277
  })
277
278
  });
@@ -344,6 +345,7 @@ function SelectInputOptions({
344
345
  filterPlaceholder,
345
346
  searchInputRef,
346
347
  listboxRef,
348
+ value,
347
349
  filterQuery,
348
350
  onFilterChange
349
351
  }) {
@@ -355,7 +357,8 @@ function SelectInputOptions({
355
357
  }
356
358
  return undefined;
357
359
  }, [filterQuery, filterable]);
358
- const resultsEmpty = needle != null && filterSelectInputItems(items, needle).length === 0;
360
+ const filteredItems = needle != null ? filterSelectInputItems(items, item => selectInputOptionItemIncludesNeedle(item, needle)) : items;
361
+ const resultsEmpty = needle != null && filteredItems.length === 0;
359
362
  const listboxContainerRef = useRef(null);
360
363
  useEffect(() => {
361
364
  if (listboxContainerRef.current != null) {
@@ -365,6 +368,22 @@ function SelectInputOptions({
365
368
  const showStatus = resultsEmpty;
366
369
  const statusId = useId();
367
370
  const listboxId = useId();
371
+ const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;
372
+ const values = useMemo(() => new Set(Array.isArray(value) ? value : [value]), [value]);
373
+ const listboxProps = {
374
+ id: listboxId,
375
+ role: 'listbox',
376
+ 'aria-orientation': 'vertical',
377
+ tabIndex: 0,
378
+ className: 'np-select-input-listbox',
379
+ children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => /*#__PURE__*/jsx(SelectInputItemView
380
+ // eslint-disable-next-line react/no-array-index-key
381
+ , {
382
+ item: item,
383
+ renderValue: renderValue,
384
+ needle: needle
385
+ }, index))
386
+ };
368
387
  return /*#__PURE__*/jsxs(Listbox.Options, {
369
388
  as: SelectInputOptionsContainer,
370
389
  static: true,
@@ -391,7 +410,7 @@ function SelectInputOptions({
391
410
  ref: searchInputRef,
392
411
  shape: "rectangle",
393
412
  placeholder: filterPlaceholder,
394
- value: filterQuery,
413
+ defaultValue: filterQuery,
395
414
  "aria-controls": listboxId,
396
415
  "aria-describedby": showStatus ? statusId : undefined,
397
416
  onKeyDown: event => {
@@ -408,7 +427,7 @@ function SelectInputOptions({
408
427
  }) : null, /*#__PURE__*/jsxs("section", {
409
428
  ref: listboxContainerRef,
410
429
  tabIndex: -1,
411
- className: classNames('np-select-input-listbox-container', items.some(item => item.type === 'group') && 'np-select-input-listbox-container--has-group'),
430
+ className: classNames('np-select-input-listbox-container', virtualized && 'np-select-input-listbox-container--virtualized', needle == null && items.some(item => item.type === 'group') && 'np-select-input-listbox-container--has-group'),
412
431
  children: [resultsEmpty ? /*#__PURE__*/jsxs("div", {
413
432
  id: statusId,
414
433
  className: "np-select-input-options-status",
@@ -416,20 +435,19 @@ function SelectInputOptions({
416
435
  size: 16,
417
436
  className: "np-select-input-options-status-icon"
418
437
  }), intl.formatMessage(messages.noResultsFound)]
419
- }) : null, /*#__PURE__*/jsx("div", {
438
+ }) : null, !virtualized ? /*#__PURE__*/jsx("div", {
420
439
  ref: listboxRef,
421
- id: listboxId,
422
- role: "listbox",
423
- "aria-orientation": "vertical",
424
- tabIndex: 0,
425
- className: "np-select-input-listbox",
426
- children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => /*#__PURE__*/jsx(SelectInputItemView
427
- // eslint-disable-next-line react/no-array-index-key
428
- , {
429
- item: item,
430
- renderValue: renderValue,
431
- needle: needle
432
- }, index))
440
+ ...listboxProps
441
+ }) : /*#__PURE__*/createElement(VList, {
442
+ ...listboxProps,
443
+ key: needle,
444
+ keepMounted: (() => {
445
+ let index = 0;
446
+ return filterSelectInputItems(filteredItems, item => values.has(item.value)).map(item => {
447
+ index = filteredItems.indexOf(item, index + 1);
448
+ return index;
449
+ });
450
+ })()
433
451
  }), renderFooter != null ? /*#__PURE__*/jsx("footer", {
434
452
  className: "np-select-input-footer",
435
453
  children: /*#__PURE__*/jsx("div", {
@@ -457,7 +475,7 @@ function SelectInputItemView({
457
475
  switch (item.type) {
458
476
  case 'option':
459
477
  {
460
- if (item.value != null && (needle == null || filterSelectInputOptionItem(item, needle))) {
478
+ if (item.value != null && (needle == null || selectInputOptionItemIncludesNeedle(item, needle))) {
461
479
  return /*#__PURE__*/jsx(SelectInputOption, {
462
480
  value: item.value,
463
481
  disabled: item.disabled,
@@ -1 +1 @@
1
- {"version":3,"file":"SelectInput.mjs","sources":["../../src/inputs/SelectInput.tsx"],"sourcesContent":["import { Listbox as ListboxBase } from '@headlessui/react';\nimport { Check, ChevronDown, Cross, CrossCircle } from '@transferwise/icons';\nimport classNames from 'classnames';\nimport mergeProps from 'merge-props';\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\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';\n\nfunction searchableString(value: string) {\n return value.trim().replace(/\\s+/gu, ' ').normalize('NFKC').toLowerCase();\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): innerValue is string => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\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}>({});\nconst SelectInputOptionContentWithinTriggerContext = createContext(false);\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: string;\n options: readonly SelectInputOptionItem<T>[];\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): SelectInputOptionItem<T | undefined> {\n if (!existingValues.has(item.value)) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\nfunction dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\nfunction filterSelectInputOptionItem<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>(items: readonly SelectInputItem<T>[], needle: string) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return filterSelectInputOptionItem(item, needle);\n }\n case 'group': {\n return item.options.some((option) => filterSelectInputOptionItem(option, needle));\n }\n default:\n }\n return false;\n });\n}\n\nexport interface SelectInputProps<T = string, M extends boolean = false> {\n id?: string;\n name?: string;\n multiple?: M;\n placeholder?: string;\n items: readonly SelectInputItem<NonNullable<T>>[];\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 onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;\n onChange?: (value: M extends true ? T[] : T) => 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={classNames('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={classNames(\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\n extends Pick<React.ComponentPropsWithoutRef<'button'>, 'className' | 'onClick'> {}\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={classNames(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 name,\n multiple,\n placeholder,\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 onFilterChange = noop,\n onChange,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes();\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 useEffect(() => {\n if (initialized.current) {\n if (!open) {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, open]);\n\n const [filterQuery, _setFilterQuery] = useState('');\n const setFilterQuery = useEffectEvent((query: string) => {\n _setFilterQuery(query);\n onFilterChange({\n query,\n queryNormalized: query ? searchableString(query) : null,\n });\n });\n\n const triggerRef = 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 return (\n <ListboxBase\n name={name}\n multiple={multiple}\n defaultValue={defaultValue}\n value={controlledValue}\n // TODO: Remove assertion when upgrading TypeScript to v5\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n by={compareValues as any}\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 triggerRef.current = node;\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\n .map((option: NonNullable<T>) => 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 triggerRef.current?.focus({ preventScroll: true });\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 if (filterQuery !== '') {\n setFilterQuery('');\n }\n }}\n >\n <SelectInputOptions\n items={items}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n filterQuery={filterQuery}\n onFilterChange={setFilterQuery}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\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 __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>\n extends Pick<\n SelectInputProps<T>,\n 'items' | 'renderValue' | 'renderFooter' | 'filterable' | 'filterPlaceholder'\n > {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n}\n\nfunction SelectInputOptions<T = string>({\n items,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n searchInputRef,\n listboxRef,\n filterQuery,\n onFilterChange,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n const resultsEmpty = needle != null && filterSelectInputItems(items, needle).length === 0;\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 const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\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 (value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n if (filterQuery) {\n // Ensure having an active option while filtering\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n value={filterQuery}\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 onFilterChange(event.currentTarget.value);\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={classNames(\n 'np-select-input-listbox-container',\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\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 tabIndex={0}\n className=\"np-select-input-listbox\"\n >\n {(needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => (\n <SelectInputItemView\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n item={item}\n renderValue={renderValue}\n needle={needle}\n />\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 (item.value != null && (needle == null || filterSelectInputOptionItem(item, needle))) {\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>\n extends SelectInputItemViewProps<T, SelectInputGroupItem<T | undefined>> {}\n\nfunction SelectInputGroupItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputGroupItemViewProps<T>) {\n const headerId = useId();\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 role=\"group\"\n aria-labelledby={headerId}\n className={classNames(needle === null && 'np-select-input-group-item--without-needle')}\n >\n {needle == null ? (\n <header\n id={headerId}\n role=\"none\"\n className=\"np-select-input-group-item-header np-text-title-group\"\n >\n {item.label}\n </header>\n ) : 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\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 return (\n <ListboxBase.Option\n as=\"div\"\n value={value}\n disabled={disabled}\n className={({ active, disabled: uiDisabled }) =>\n classNames(\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={classNames(\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\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={classNames(\n 'np-select-input-option-content-container',\n (note || description) && 'np-text-body-large',\n )}\n >\n {icon ? (\n <div\n className={classNames(\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={classNames(\n 'np-select-input-option-content-text-line-1',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n <h4 className=\"np-select-input-option-content-text-primary d-inline\">{title}</h4>\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={classNames(\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":["searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","SelectInputTriggerButtonPropsContext","createContext","SelectInputOptionContentWithinTriggerContext","dedupeSelectInputOptionItem","item","existingValues","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","filterSelectInputOptionItem","needle","filterMatchers","some","haystack","includes","filterSelectInputItems","defaultRenderTrigger","content","placeholderShown","clear","disabled","size","className","_jsx","InputGroup","addonEnd","_jsxs","classNames","children","_Fragment","SelectInputClearButton","onClick","event","preventDefault","ChevronDown","initialContentWidth","padding","SelectInputTriggerButton","as","ButtonInput","intl","useIntl","formatMessage","dateTriggerMessages","ariaLabel","Cross","noop","SelectInput","id","idProp","name","multiple","placeholder","defaultValue","controlledValue","compareValues","renderValue","String","renderFooter","renderTrigger","filterable","filterPlaceholder","UNSAFE_triggerButtonProps","onFilterChange","onChange","onClose","onClear","inputAttributes","useInputAttributes","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","useEffect","current","filterQuery","_setFilterQuery","setFilterQuery","query","queryNormalized","triggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","Popover","BottomSheet","searchInputRef","listboxRef","controllerRef","ListboxBase","by","uiDisabled","Array","isArray","length","placement","ref","getInteractionProps","Provider","node","mergeProps","prev","onKeyDown","key","join","focus","preventScroll","initialFocusRef","onCloseEnd","SelectInputOptions","restProps","interactionProps","useContext","Button","PolymorphicWithOverrides","__overrides","SelectInputOptionsContainer","forwardRef","ariaOrientation","ariaActiveDescendant","role","tabIndex","onAriaActiveDescendantChange","handleAriaActiveDescendantChange","stopPropagation","useMemo","resultsEmpty","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","Options","static","setAttribute","removeAttribute","dispatchEvent","KeyboardEvent","bubbles","SearchInput","shape","test","currentTarget","CrossCircle","messages","noResultsFound","index","SelectInputItemView","SelectInputOption","SelectInputGroupItemView","headerId","label","Option","active","selected","Check","SelectInputOptionContent","title","note","description","icon","withinTrigger"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+BA,SAASA,gBAAgBA,CAACC,KAAa,EAAA;EACrC,OAAOA,KAAK,CAACC,IAAI,EAAE,CAACC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAACC,SAAS,CAAC,MAAM,CAAC,CAACC,WAAW,EAAE,CAAA;AAC3E,CAAA;AAEA,SAASC,sBAAsBA,CAACL,KAAc,EAAA;AAC5C,EAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;AAC7B,IAAA,OAAO,CAACD,gBAAgB,CAACC,KAAK,CAAC,CAAC,CAAA;AAClC,GAAA;EAEA,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,IAAI,IAAI,EAAE;IAC9C,OAAOM,MAAM,CAACC,MAAM,CAACP,KAAK,CAAC,CACxBQ,MAAM,CAAEC,UAAU,IAA2B,OAAOA,UAAU,KAAK,QAAQ,CAAC,CAC5EC,GAAG,CAAED,UAAU,IAAKV,gBAAgB,CAACU,UAAU,CAAC,CAAC,CAAA;AACtD,GAAA;AAEA,EAAA,OAAO,EAAE,CAAA;AACX,CAAA;AAEA,MAAME,oCAAoC,gBAAGC,aAAa,CAMvD,EAAE,CAAC,CAAA;AACN,MAAMC,4CAA4C,gBAAGD,aAAa,CAAC,KAAK,CAAC,CAAA;AAwBzE,SAASE,2BAA2BA,CAClCC,IAA8B,EAC9BC,cAAsB,EAAA;EAEtB,IAAI,CAACA,cAAc,CAACC,GAAG,CAACF,IAAI,CAACf,KAAK,CAAC,EAAE;AACnCgB,IAAAA,cAAc,CAACE,GAAG,CAACH,IAAI,CAACf,KAAK,CAAC,CAAA;AAC9B,IAAA,OAAOe,IAAI,CAAA;AACb,GAAA;EACA,OAAO;AAAE,IAAA,GAAGA,IAAI;AAAEf,IAAAA,KAAK,EAAEmB,SAAAA;GAAW,CAAA;AACtC,CAAA;AAEA,SAASC,sBAAsBA,CAC7BC,KAAoC,EAAA;AAEpC,EAAA,MAAML,cAAc,GAAG,IAAIM,GAAG,EAAK,CAAA;AACnC,EAAA,OAAOD,KAAK,CAACX,GAAG,CAAEK,IAAI,IAAI;IACxB,QAAQA,IAAI,CAACQ,IAAI;AACf,MAAA,KAAK,QAAQ;AAAE,QAAA;AACb,UAAA,OAAOT,2BAA2B,CAACC,IAAI,EAAEC,cAAc,CAAC,CAAA;AAC1D,SAAA;AACA,MAAA,KAAK,OAAO;AAAE,QAAA;UACZ,OAAO;AACL,YAAA,GAAGD,IAAI;AACPS,YAAAA,OAAO,EAAET,IAAI,CAACS,OAAO,CAACd,GAAG,CAAEe,MAAM,IAC/BX,2BAA2B,CAACW,MAAM,EAAET,cAAc,CAAC,CAAA;WAEtD,CAAA;AACH,SAAA;AAEF,KAAA;AACA,IAAA,OAAOD,IAAI,CAAA;AACb,GAAC,CAAC,CAAA;AACJ,CAAA;AAEA,SAASW,2BAA2BA,CAAIX,IAA8B,EAAEY,MAAc,EAAA;EACpF,OAAOtB,sBAAsB,CAACU,IAAI,CAACa,cAAc,IAAIb,IAAI,CAACf,KAAK,CAAC,CAAC6B,IAAI,CAAEC,QAAQ,IAC7EA,QAAQ,CAACC,QAAQ,CAACJ,MAAM,CAAC,CAC1B,CAAA;AACH,CAAA;AAEA,SAASK,sBAAsBA,CAAIX,KAAoC,EAAEM,MAAc,EAAA;AACrF,EAAA,OAAON,KAAK,CAACb,MAAM,CAAEO,IAAI,IAAI;IAC3B,QAAQA,IAAI,CAACQ,IAAI;AACf,MAAA,KAAK,QAAQ;AAAE,QAAA;AACb,UAAA,OAAOG,2BAA2B,CAACX,IAAI,EAAEY,MAAM,CAAC,CAAA;AAClD,SAAA;AACA,MAAA,KAAK,OAAO;AAAE,QAAA;AACZ,UAAA,OAAOZ,IAAI,CAACS,OAAO,CAACK,IAAI,CAAEJ,MAAM,IAAKC,2BAA2B,CAACD,MAAM,EAAEE,MAAM,CAAC,CAAC,CAAA;AACnF,SAAA;AAEF,KAAA;AACA,IAAA,OAAO,KAAK,CAAA;AACd,GAAC,CAAC,CAAA;AACJ,CAAA;AAsCA,MAAMM,oBAAoB,GAAIA,CAAC;EAAEC,OAAO;EAAEC,gBAAgB;EAAEC,KAAK;EAAEC,QAAQ;EAAEC,IAAI;AAAEC,EAAAA,SAAAA;AAAW,CAAA,kBAC5FC,GAAA,CAACC,UAAU,EAAA;AACTC,EAAAA,QAAQ,EAAE;AACRR,IAAAA,OAAO,eACLS,IAAA,CAAA,MAAA,EAAA;MAAMJ,SAAS,EAAEK,UAAU,CAAC,iCAAiC,EAAEP,QAAQ,IAAI,UAAU,CAAE;MAAAQ,QAAA,EAAA,CACpFT,KAAK,IAAI,IAAI,IAAI,CAACD,gBAAgB,gBACjCQ,IAAA,CAAAG,QAAA,EAAA;QAAAD,QAAA,EAAA,cACEL,GAAA,CAACO,sBAAsB,EAAA;UACrBC,OAAO,EAAGC,KAAK,IAAI;YACjBA,KAAK,CAACC,cAAc,EAAE,CAAA;AACtBd,YAAAA,KAAK,EAAE,CAAA;AACT,WAAA;SAEF,CAAA,eAAAI,GAAA,CAAA,MAAA,EAAA;AAAMD,UAAAA,SAAS,EAAC,iCAAA;AAAiC,SACnD,CAAA,CAAA;AAAA,OAAA,CAAG,GACD,IAAI,eAERC,GAAA,CAAA,MAAA,EAAA;AAAMD,QAAAA,SAAS,EAAC,uBAAuB;QAAAM,QAAA,eACrCL,GAAA,CAACW,WAAW,EAAA;AAACb,UAAAA,IAAI,EAAE,EAAA;SACrB,CAAA;AAAA,OAAM,CACR,CAAA;AAAA,KAAM,CACP;IACDc,mBAAmB,EAAE,EAAE,GAAG,CAAC;AAC3BC,IAAAA,OAAO,EAAE,IAAA;GACT;AACFhB,EAAAA,QAAQ,EAAEA,QAAS;AACnBE,EAAAA,SAAS,EAAEA,SAAU;EAAAM,QAAA,eAErBL,GAAA,CAACc,wBAAwB,EAAA;AAACC,IAAAA,EAAE,EAAEC,WAAY;AAAClB,IAAAA,IAAI,EAAEA,IAAK;AAAAO,IAAAA,QAAA,eACpDL,GAAA,CAAA,MAAA,EAAA;MACED,SAAS,EAAEK,UAAU,CACnB,yBAAyB,EACzBT,gBAAgB,IAAI,6BAA6B,CACjD;AAAAU,MAAAA,QAAA,EAEDX,OAAAA;KACG,CAAA;GACkB,CAAA;AAC5B,CAAY,CACgC,CAAA;AAK9C,SAASa,sBAAsBA,CAAC;EAAER,SAAS;AAAES,EAAAA,OAAAA;AAAsC,CAAA,EAAA;AACjF,EAAA,MAAMS,IAAI,GAAGC,OAAO,EAAE,CAAA;AAEtB,EAAA,oBACElB,GAAA,CAAA,QAAA,EAAA;AACEjB,IAAAA,IAAI,EAAC,QAAQ;AACb,IAAA,YAAA,EAAYkC,IAAI,CAACE,aAAa,CAACC,mBAAmB,CAACC,SAAS,CAAE;AAC9DtB,IAAAA,SAAS,EAAEK,UAAU,CAACL,SAAS,EAAE,0DAA0D,CAAE;AAC7FS,IAAAA,OAAO,EAAEA,OAAQ;IAAAH,QAAA,eAEjBL,GAAA,CAACsB,KAAK,EAAA;AAACxB,MAAAA,IAAI,EAAE,EAAA;KACf,CAAA;AAAA,GAAQ,CAAC,CAAA;AAEb,CAAA;AAEA,MAAMyB,IAAI,GAAGA,MAAK,EAAG,CAAA;AAEf,SAAUC,WAAWA,CAAwC;AACjEC,EAAAA,EAAE,EAAEC,MAAM;EACVC,IAAI;EACJC,QAAQ;EACRC,WAAW;EACXhD,KAAK;EACLiD,YAAY;AACZtE,EAAAA,KAAK,EAAEuE,eAAe;EACtBC,aAAa;AACbC,EAAAA,WAAW,GAAGC,MAAM;EACpBC,YAAY;AACZC,EAAAA,aAAa,GAAG3C,oBAAoB;EACpC4C,UAAU;EACVC,iBAAiB;EACjBzC,QAAQ;AACRC,EAAAA,IAAI,GAAG,IAAI;EACXC,SAAS;EACTwC,yBAAyB;AACzBC,EAAAA,cAAc,GAAGjB,IAAI;EACrBkB,QAAQ;EACRC,OAAO;AACPC,EAAAA,OAAAA;AACuB,CAAA,EAAA;AACvB,EAAA,MAAMC,eAAe,GAAGC,kBAAkB,EAAE,CAAA;AAC5C,EAAA,MAAMpB,EAAE,GAAGC,MAAM,IAAIkB,eAAe,CAACnB,EAAE,CAAA;EAEvC,MAAM,CAACqB,IAAI,EAAEC,OAAO,CAAC,GAAGC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAEvC,EAAA,MAAMC,WAAW,GAAGC,MAAM,CAAC,KAAK,CAAC,CAAA;EACjC,MAAMC,WAAW,GAAGC,cAAc,CAACV,OAAO,KAAK,MAAK,EAAG,CAAC,CAAC,CAAA;AACzDW,EAAAA,SAAS,CAAC,MAAK;IACb,IAAIJ,WAAW,CAACK,OAAO,EAAE;MACvB,IAAI,CAACR,IAAI,EAAE;AACTK,QAAAA,WAAW,IAAI,CAAA;AACjB,OAAA;AACF,KAAC,MAAM;MACLF,WAAW,CAACK,OAAO,GAAG,IAAI,CAAA;AAC5B,KAAA;AACF,GAAC,EAAE,CAACH,WAAW,EAAEL,IAAI,CAAC,CAAC,CAAA;EAEvB,MAAM,CAACS,WAAW,EAAEC,eAAe,CAAC,GAAGR,QAAQ,CAAC,EAAE,CAAC,CAAA;AACnD,EAAA,MAAMS,cAAc,GAAGL,cAAc,CAAEM,KAAa,IAAI;IACtDF,eAAe,CAACE,KAAK,CAAC,CAAA;AACtBlB,IAAAA,cAAc,CAAC;MACbkB,KAAK;AACLC,MAAAA,eAAe,EAAED,KAAK,GAAGnG,gBAAgB,CAACmG,KAAK,CAAC,GAAG,IAAA;AACpD,KAAA,CAAC,CAAA;AACJ,GAAC,CAAC,CAAA;AAEF,EAAA,MAAME,UAAU,GAAGV,MAAM,CAA2B,IAAI,CAAC,CAAA;AAEzD,EAAA,MAAMW,QAAQ,GAAGC,aAAa,CAACC,UAAU,CAACC,KAAK,CAAC,CAAA;AAChD,EAAA,MAAMC,cAAc,GAAGJ,QAAQ,GAAGK,OAAO,GAAGC,WAAW,CAAA;AAEvD,EAAA,MAAMC,cAAc,GAAGlB,MAAM,CAAmB,IAAI,CAAC,CAAA;AACrD,EAAA,MAAMmB,UAAU,GAAGnB,MAAM,CAAiB,IAAI,CAAC,CAAA;AAC/C,EAAA,MAAMoB,aAAa,GAAGjC,UAAU,GAAG+B,cAAc,GAAGC,UAAU,CAAA;EAE9D,oBACErE,GAAA,CAACuE,OAAW,EAAA;AACV5C,IAAAA,IAAI,EAAEA,IAAK;AACXC,IAAAA,QAAQ,EAAEA,QAAS;AACnBE,IAAAA,YAAY,EAAEA,YAAa;AAC3BtE,IAAAA,KAAK,EAAEuE,eAAAA;AACP;AACA;AAAA;AACAyC,IAAAA,EAAE,EAAExC,aAAqB;AACzBnC,IAAAA,QAAQ,EAAEA,QAAS;IACnB4C,QAAQ,EACJjF,KAAK,IAAI;MACT,IAAI,CAACoE,QAAQ,EAAE;QACbmB,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,OAAA;MACAN,QAAQ,GAAGjF,KAAK,CAAC,CAAA;KAEpB;AAAA6C,IAAAA,QAAA,EAEAA,CAAC;AAAER,MAAAA,QAAQ,EAAE4E,UAAU;AAAEjH,MAAAA,KAAAA;AAAO,KAAA,KAAI;AACnC,MAAA,MAAMmC,gBAAgB,GACpBiC,QAAQ,IAAI8C,KAAK,CAACC,OAAO,CAACnH,KAAK,CAAC,GAAGA,KAAK,CAACoH,MAAM,KAAK,CAAC,GAAGpH,KAAK,IAAI,IAAI,CAAA;MACvE,oBACEwC,GAAA,CAACiE,cAAc,EAAA;AACbY,QAAAA,SAAS,EAAC,cAAc;AACxB/B,QAAAA,IAAI,EAAEA,IAAK;AACXV,QAAAA,aAAa,EAAEA,CAAC;UAAE0C,GAAG;AAAEC,UAAAA,mBAAAA;AAAmB,SAAE,kBAC1C/E,GAAA,CAAC7B,oCAAoC,CAAC6G,QAAQ,EAAA;AAC5C;AACAxH,UAAAA,KAAK,EAAE;YACLsH,GAAG,EAAGG,IAAI,IAAI;cACZH,GAAG,CAACG,IAAI,CAAC,CAAA;cACTrB,UAAU,CAACN,OAAO,GAAG2B,IAAI,CAAA;aAC1B;AACD,YAAA,GAAGrC,eAAe;AAClB,YAAA,GAAGL,yBAAyB;YAC5Bd,EAAE;AACF,YAAA,GAAGyD,UAAU,CACX;cACE1E,OAAO,EAAEA,MAAK;AACZuC,gBAAAA,OAAO,CAAEoC,IAAI,IAAK,CAACA,IAAI,CAAC,CAAA;eACzB;cACDC,SAAS,EAAG3E,KAA0B,IAAI;gBACxC,IACEA,KAAK,CAAC4E,GAAG,KAAK,GAAG,IACjB5E,KAAK,CAAC4E,GAAG,KAAK,OAAO,IACrB5E,KAAK,CAAC4E,GAAG,KAAK,WAAW,IACzB5E,KAAK,CAAC4E,GAAG,KAAK,SAAS,EACvB;AACAtC,kBAAAA,OAAO,CAAEoC,IAAI,IAAK,CAACA,IAAI,CAAC,CAAA;AAC1B,iBAAA;AACF,eAAA;aACD,EACDJ,mBAAmB,EAAE,CAAA;WAEvB;UAAA1E,QAAA,EAED+B,aAAa,CAAC;YACb1C,OAAO,EAAE,CAACC,gBAAgB,gBACxBK,GAAA,CAAC3B,4CAA4C,CAAC2G,QAAQ,EAAA;cAACxH,KAAK,EAAA,IAAA;AAAA6C,cAAAA,QAAA,EACzDuB,QAAQ,IAAI8C,KAAK,CAACC,OAAO,CAACnH,KAAK,CAAC,GAC7BA,KAAK,CACFU,GAAG,CAAEe,MAAsB,IAAKgD,WAAW,CAAChD,MAAM,EAAE,IAAI,CAAC,CAAC,CAC1DjB,MAAM,CAAEiH,IAAI,IAAKA,IAAI,IAAI,IAAI,CAAC,CAC9BK,IAAI,CAAC,IAAI,CAAC,GACbrD,WAAW,CAACzE,KAAuB,EAAE,IAAI,CAAA;aACQ,CAAC,GAExDqE,WACD;YACDlC,gBAAgB;AAChBC,YAAAA,KAAK,EACH+C,OAAO,IAAI,IAAI,GACX,MAAK;AACHA,cAAAA,OAAO,EAAE,CAAA;AACTiB,cAAAA,UAAU,CAACN,OAAO,EAAEiC,KAAK,CAAC;AAAEC,gBAAAA,aAAa,EAAE,IAAA;AAAM,eAAA,CAAC,CAAA;AACpD,aAAC,GACD7G,SAAS;AACfkB,YAAAA,QAAQ,EAAE4E,UAAU;YACpB3E,IAAI;AACJC,YAAAA,SAAAA;WACD,CAAA;AAAC,SAC2C,CAC/C;AACF0F,QAAAA,eAAe,EAAEnB,aAAc;AAC/BxE,QAAAA,IAAI,EAAEuC,UAAU,GAAG,IAAI,GAAG,IAAK;AAC/BxB,QAAAA,OAAO,EAAC,MAAM;QACd6B,OAAO,EAAEA,MAAK;UACZK,OAAO,CAAC,KAAK,CAAC,CAAA;SACd;QACF2C,UAAU,EAAEA,MAAK;UACf,IAAInC,WAAW,KAAK,EAAE,EAAE;YACtBE,cAAc,CAAC,EAAE,CAAC,CAAA;AACpB,WAAA;SACA;QAAApD,QAAA,eAEFL,GAAA,CAAC2F,kBAAkB,EAAA;AACjB9G,UAAAA,KAAK,EAAEA,KAAM;AACboD,UAAAA,WAAW,EAAEA,WAAY;AACzBE,UAAAA,YAAY,EAAEA,YAAa;AAC3BE,UAAAA,UAAU,EAAEA,UAAW;AACvBC,UAAAA,iBAAiB,EAAEA,iBAAkB;AACrC8B,UAAAA,cAAc,EAAEA,cAAe;AAC/BC,UAAAA,UAAU,EAAEA,UAAW;AACvBd,UAAAA,WAAW,EAAEA,WAAY;AACzBf,UAAAA,cAAc,EAAEiB,cAAAA;SAEpB,CAAA;AAAA,OAAgB,CAAC,CAAA;AAErB,KAAA;AAAC,GACU,CAAC,CAAA;AAElB,CAAA;AAQM,SAAU3C,wBAAwBA,CAA2D;AACjGC,EAAAA,EAAE,GAAG,QAAa;EAClB,GAAG6E,SAAAA;AAC8B,CAAA,EAAA;EACjC,MAAM;IAAEd,GAAG;IAAEtE,OAAO;IAAE4E,SAAS;IAAE,GAAGS,gBAAAA;GAAkB,GAAGC,UAAU,CACjE3H,oCAAoC,CACrC,CAAA;AAED,EAAA,oBACE6B,GAAA,CAACuE,OAAW,CAACwB,MAAM,EAAA;AACjBjB,IAAAA,GAAG,EAAEA,GAAI;AACT/D,IAAAA,EAAE,EAAEiF,wBAAyB;AAC7BC,IAAAA,WAAW,EAAE;MAAElF,EAAE;MAAE,GAAG8E,gBAAAA;KAAmB;AAAA,IAAA,GACrCX,UAAU,CAAC;MAAE1E,OAAO;AAAE4E,MAAAA,SAAAA;KAAW,EAAEQ,SAAS,CAAA;AAAC,GAAC,CAClD,CAAA;AAEN,CAAA;AAMA,MAAMM,2BAA2B,gBAAGC,UAAU,CAAC,SAASD,2BAA2BA,CACjF;AACE,EAAA,kBAAkB,EAAEE,eAAe;AACnC,EAAA,uBAAuB,EAAEC,oBAAoB;EAC7CC,IAAI;EACJC,QAAQ;EACRC,4BAA4B;EAC5BpB,SAAS;EACT,GAAGQ,SAAAA;AAC8B,CAAA,EACnCd,GAA8C,EAAA;AAE9C,EAAA,MAAM2B,gCAAgC,GAAGrD,cAAc,CAACoD,4BAA4B,CAAC,CAAA;AACrFnD,EAAAA,SAAS,CAAC,MAAK;IACboD,gCAAgC,CAACJ,oBAAoB,CAAC,CAAA;AACxD,GAAC,EAAE,CAACA,oBAAoB,EAAEI,gCAAgC,CAAC,CAAC,CAAA;AAE5D,EAAA,oBACEzG,GAAA,CAAA,KAAA,EAAA;AACE8E,IAAAA,GAAG,EAAEA,GAAI;AACTwB,IAAAA,IAAI,EAAC,MAAM;IACXlB,SAAS,EAAG3E,KAAK,IAAI;AACnB;MACA,IAAIA,KAAK,CAAC4E,GAAG,KAAK,OAAO,IAAIgB,oBAAoB,IAAI,IAAI,EAAE;AACzD,QAAA,OAAA;AACF,OAAA;AAEA;MACA,IAAI5F,KAAK,CAAC4E,GAAG,KAAK,QAAQ,IAAI5E,KAAK,CAAC4E,GAAG,KAAK,KAAK,EAAE;AACjDD,QAAAA,SAAS,GAAG;AACV,UAAA,GAAG3E,KAAK;AACRC,UAAAA,cAAc,EAAEA,MAAK,EAAG;UACxBgG,eAAe,EAAEA,MAAK,EAAE;AACzB,SAAA,CAAC,CAAA;AACF,QAAA,OAAA;AACF,OAAA;MAEAtB,SAAS,GAAG3E,KAAK,CAAC,CAAA;KAClB;IAAA,GACEmF,SAAAA;AAAS,GAAC,CACd,CAAA;AAEN,CAAC,CAAC,CAAA;AAaF,SAASD,kBAAkBA,CAAa;EACtC9G,KAAK;AACLoD,EAAAA,WAAW,GAAGC,MAAM;EACpBC,YAAY;AACZE,EAAAA,UAAU,GAAG,KAAK;EAClBC,iBAAiB;EACjB8B,cAAc;EACdC,UAAU;EACVd,WAAW;AACXf,EAAAA,cAAAA;AAC2B,CAAA,EAAA;AAC3B,EAAA,MAAMvB,IAAI,GAAGC,OAAO,EAAE,CAAA;AAEtB,EAAA,MAAMoD,aAAa,GAAGjC,UAAU,GAAG+B,cAAc,GAAGC,UAAU,CAAA;AAE9D,EAAA,MAAMlF,MAAM,GAAGwH,OAAO,CAAC,MAAK;AAC1B,IAAA,IAAItE,UAAU,EAAE;AACd,MAAA,OAAOkB,WAAW,GAAGhG,gBAAgB,CAACgG,WAAW,CAAC,GAAG,IAAI,CAAA;AAC3D,KAAA;AACA,IAAA,OAAO5E,SAAS,CAAA;AAClB,GAAC,EAAE,CAAC4E,WAAW,EAAElB,UAAU,CAAC,CAAC,CAAA;AAC7B,EAAA,MAAMuE,YAAY,GAAGzH,MAAM,IAAI,IAAI,IAAIK,sBAAsB,CAACX,KAAK,EAAEM,MAAM,CAAC,CAACyF,MAAM,KAAK,CAAC,CAAA;AAEzF,EAAA,MAAMiC,mBAAmB,GAAG3D,MAAM,CAAiB,IAAI,CAAC,CAAA;AACxDG,EAAAA,SAAS,CAAC,MAAK;AACb,IAAA,IAAIwD,mBAAmB,CAACvD,OAAO,IAAI,IAAI,EAAE;AACvCuD,MAAAA,mBAAmB,CAACvD,OAAO,CAACwD,KAAK,CAACC,WAAW,CAC3C,kBAAkB,EAClB,CAAA,EAAGF,mBAAmB,CAACvD,OAAO,CAAC0D,YAAY,IAAI,CAChD,CAAA;AACH,KAAA;GACD,EAAE,EAAE,CAAC,CAAA;EAEN,MAAMC,UAAU,GAAGL,YAAY,CAAA;AAC/B,EAAA,MAAMM,QAAQ,GAAGC,KAAK,EAAE,CAAA;AACxB,EAAA,MAAMC,SAAS,GAAGD,KAAK,EAAE,CAAA;AAEzB,EAAA,oBACEhH,IAAA,CAACoE,OAAW,CAAC8C,OAAO,EAAA;AAClBtG,IAAAA,EAAE,EAAEmF,2BAA4B;IAChCoB,MAAM,EAAA,IAAA;AACNvH,IAAAA,SAAS,EAAC,mCAAmC;IAC7CyG,4BAA4B,EAAGhJ,KAAoD,IAAI;AACrF,MAAA,IAAI8G,aAAa,CAAChB,OAAO,IAAI,IAAI,EAAE;QACjC,IAAI9F,KAAK,IAAI,IAAI,EAAE;UACjB8G,aAAa,CAAChB,OAAO,CAACiE,YAAY,CAAC,uBAAuB,EAAE/J,KAAK,CAAC,CAAA;AACpE,SAAC,MAAM;AACL8G,UAAAA,aAAa,CAAChB,OAAO,CAACkE,eAAe,CAAC,uBAAuB,CAAC,CAAA;AAC9D,UAAA,IAAIjE,WAAW,EAAE;AACf;YACAe,aAAa,CAAChB,OAAO,CAACmE,aAAa,CACjC,IAAIC,aAAa,CAAC,SAAS,EAAE;AAAErC,cAAAA,GAAG,EAAE,MAAM;AAAEsC,cAAAA,OAAO,EAAE,IAAA;AAAI,aAAE,CAAC,CAC7D,CAAA;AACH,WAAA;AACF,SAAA;AACF,OAAA;KACA;IAAAtH,QAAA,EAAA,CAEDgC,UAAU,gBACTrC,GAAA,CAAA,KAAA,EAAA;AAAKD,MAAAA,SAAS,EAAC,iCAAiC;MAAAM,QAAA,eAC9CL,GAAA,CAAC4H,WAAW,EAAA;AACV9C,QAAAA,GAAG,EAAEV,cAAe;AACpByD,QAAAA,KAAK,EAAC,WAAW;AACjBhG,QAAAA,WAAW,EAAES,iBAAkB;AAC/B9E,QAAAA,KAAK,EAAE+F,WAAY;AACnB,QAAA,eAAA,EAAe6D,SAAU;AACzB,QAAA,kBAAA,EAAkBH,UAAU,GAAGC,QAAQ,GAAGvI,SAAU;QACpDyG,SAAS,EAAG3E,KAAK,IAAI;AACnB;AACA;UACA,IAAI,MAAM,CAACqH,IAAI,CAACrH,KAAK,CAAC4E,GAAG,CAAC,EAAE;YAC1B5E,KAAK,CAACiG,eAAe,EAAE,CAAA;AACzB,WAAA;SACA;QACFjE,QAAQ,EAAGhC,KAAK,IAAI;AAClB+B,UAAAA,cAAc,CAAC/B,KAAK,CAACsH,aAAa,CAACvK,KAAK,CAAC,CAAA;AAC3C,SAAA;OAEJ,CAAA;AAAA,KAAK,CAAC,GACJ,IAAI,eAER2C,IAAA,CAAA,SAAA,EAAA;AACE2E,MAAAA,GAAG,EAAE+B,mBAAoB;MACzBN,QAAQ,EAAE,CAAC,CAAE;AACbxG,MAAAA,SAAS,EAAEK,UAAU,CACnB,mCAAmC,EACnCvB,KAAK,CAACQ,IAAI,CAAEd,IAAI,IAAKA,IAAI,CAACQ,IAAI,KAAK,OAAO,CAAC,IACzC,8CAA8C,CAChD;MAAAsB,QAAA,EAAA,CAEDuG,YAAY,gBACXzG,IAAA,CAAA,KAAA,EAAA;AAAKsB,QAAAA,EAAE,EAAEyF,QAAS;AAACnH,QAAAA,SAAS,EAAC,gCAAgC;QAAAM,QAAA,EAAA,cAC3DL,GAAA,CAACgI,WAAW,EAAA;AAAClI,UAAAA,IAAI,EAAE,EAAG;AAACC,UAAAA,SAAS,EAAC,qCAAA;SACjC,CAAA,EAACkB,IAAI,CAACE,aAAa,CAAC8G,QAAQ,CAACC,cAAc,CAAC,CAAA;AAAA,OACzC,CAAC,GACJ,IAAI,eAERlI,GAAA,CAAA,KAAA,EAAA;AACE8E,QAAAA,GAAG,EAAET,UAAW;AAChB5C,QAAAA,EAAE,EAAE2F,SAAU;AACdd,QAAAA,IAAI,EAAC,SAAS;AACd,QAAA,kBAAA,EAAiB,UAAU;AAC3BC,QAAAA,QAAQ,EAAE,CAAE;AACZxG,QAAAA,SAAS,EAAC,yBAAyB;QAAAM,QAAA,EAElC,CAAClB,MAAM,IAAI,IAAI,GAAGP,sBAAsB,CAACC,KAAK,CAAC,GAAGA,KAAK,EAAEX,GAAG,CAAC,CAACK,IAAI,EAAE4J,KAAK,kBACxEnI,GAAA,CAACoI,mBAAAA;AACC;AAAA,UAAA;AAEA7J,UAAAA,IAAI,EAAEA,IAAK;AACX0D,UAAAA,WAAW,EAAEA,WAAY;AACzB9C,UAAAA,MAAM,EAAEA,MAAAA;AAAO,SAAA,EAHVgJ,KAGU,CAElB,CAAA;AAAC,OACC,CAEL,EAAChG,YAAY,IAAI,IAAI,gBACnBnC,GAAA,CAAA,QAAA,EAAA;AAAQD,QAAAA,SAAS,EAAC,wBAAwB;AAAAM,QAAAA,QAAA,eACxCL,GAAA,CAAA,KAAA,EAAA;AACEsG,UAAAA,IAAI,EAAC,MAAM;UACXlB,SAAS,EAAG3E,KAAK,IAAI;AACnB;AACA,YAAA,IAAIA,KAAK,CAAC4E,GAAG,KAAK,QAAQ,EAAE;cAC1B5E,KAAK,CAACiG,eAAe,EAAE,CAAA;AACzB,aAAA;WACA;UAAArG,QAAA,EAED8B,YAAY,CAAC;YACZyE,YAAY;AACZjD,YAAAA,eAAe,EAAExE,MAAAA;WAClB,CAAA;SACE,CAAA;OACC,CAAC,GACP,IAAI,CAAA;AAAA,KACD,CACX,CAAA;AAAA,GAAqB,CAAC,CAAA;AAE1B,CAAA;AAUA,SAASiJ,mBAAmBA,CAAa;EACvC7J,IAAI;EACJ0D,WAAW;AACX9C,EAAAA,MAAAA;AAC4B,CAAA,EAAA;EAC5B,QAAQZ,IAAI,CAACQ,IAAI;AACf,IAAA,KAAK,QAAQ;AAAE,MAAA;AACb,QAAA,IAAIR,IAAI,CAACf,KAAK,IAAI,IAAI,KAAK2B,MAAM,IAAI,IAAI,IAAID,2BAA2B,CAACX,IAAI,EAAEY,MAAM,CAAC,CAAC,EAAE;UACvF,oBACEa,GAAA,CAACqI,iBAAiB,EAAA;YAAC7K,KAAK,EAAEe,IAAI,CAACf,KAAM;YAACqC,QAAQ,EAAEtB,IAAI,CAACsB,QAAS;AAAAQ,YAAAA,QAAA,EAC3D4B,WAAW,CAAC1D,IAAI,CAACf,KAAK,EAAE,KAAK,CAAA;AAAC,WACd,CAAC,CAAA;AAExB,SAAA;AACA,QAAA,MAAA;AACF,OAAA;AACA,IAAA,KAAK,OAAO;AAAE,MAAA;QACZ,oBAAOwC,GAAA,CAACsI,wBAAwB,EAAA;AAAC/J,UAAAA,IAAI,EAAEA,IAAK;AAAC0D,UAAAA,WAAW,EAAEA,WAAY;AAAC9C,UAAAA,MAAM,EAAEA,MAAAA;AAAO,SAAA,CAAG,CAAA;AAC3F,OAAA;AACA,IAAA,KAAK,WAAW;AAAE,MAAA;QAChB,IAAIA,MAAM,IAAI,IAAI,EAAE;AAClB,UAAA,oBAAOa,GAAA,CAAA,IAAA,EAAA;AAAID,YAAAA,SAAS,EAAC,gCAAA;AAAgC,YAAG,CAAA;AAC1D,SAAA;AACA,QAAA,MAAA;AACF,OAAA;AACF,GAAA;AACA,EAAA,OAAO,IAAI,CAAA;AACb,CAAA;AAKA,SAASuI,wBAAwBA,CAAa;EAC5C/J,IAAI;EACJ0D,WAAW;AACX9C,EAAAA,MAAAA;AACiC,CAAA,EAAA;AACjC,EAAA,MAAMoJ,QAAQ,GAAGpB,KAAK,EAAE,CAAA;AAExB,EAAA;AAAA;AACE;AACA;IACAhH,IAAA,CAAA,SAAA,EAAA;AACEmG,MAAAA,IAAI,EAAC,OAAO;AACZ,MAAA,iBAAA,EAAiBiC,QAAS;MAC1BxI,SAAS,EAAEK,UAAU,CAACjB,MAAM,KAAK,IAAI,IAAI,4CAA4C,CAAE;AAAAkB,MAAAA,QAAA,EAEtFlB,CAAAA,MAAM,IAAI,IAAI,gBACba,GAAA,CAAA,QAAA,EAAA;AACEyB,QAAAA,EAAE,EAAE8G,QAAS;AACbjC,QAAAA,IAAI,EAAC,MAAM;AACXvG,QAAAA,SAAS,EAAC,uDAAuD;QAAAM,QAAA,EAEhE9B,IAAI,CAACiK,KAAAA;AAAK,OACL,CAAC,GACP,IAAI,EACPjK,IAAI,CAACS,OAAO,CAACd,GAAG,CAAC,CAACe,MAAM,EAAEkJ,KAAK,kBAC9BnI,GAAA,CAACoI,mBAAAA;AACC;AAAA,QAAA;AAEA7J,QAAAA,IAAI,EAAEU,MAAO;AACbgD,QAAAA,WAAW,EAAEA,WAAY;AACzB9C,QAAAA,MAAM,EAAEA,MAAAA;OAHHgJ,EAAAA,KAGU,CAElB,CAAC,CAAA;KACK,CAAA;AAAC,IAAA;AAEd,CAAA;AAQA,SAASE,iBAAiBA,CAAa;EAAE7K,KAAK;EAAEqC,QAAQ;AAAEQ,EAAAA,QAAAA;AAAqC,CAAA,EAAA;AAC7F,EAAA,oBACEL,GAAA,CAACuE,OAAW,CAACkE,MAAM,EAAA;AACjB1H,IAAAA,EAAE,EAAC,KAAK;AACRvD,IAAAA,KAAK,EAAEA,KAAM;AACbqC,IAAAA,QAAQ,EAAEA,QAAS;AACnBE,IAAAA,SAAS,EAAEA,CAAC;MAAE2I,MAAM;AAAE7I,MAAAA,QAAQ,EAAE4E,UAAAA;AAAU,KAAE,KAC1CrE,UAAU,CACR,qDAAqD,EACrDsI,MAAM,IAAI,0CAA0C,EACpDjE,UAAU,IAAI,4CAA4C,CAE7D;AAAApE,IAAAA,QAAA,EAEAA,CAAC;AAAEsI,MAAAA,QAAAA;KAAU,kBACZxI,IAAA,CAAAG,QAAA,EAAA;AAAAD,MAAAA,QAAA,gBACEL,GAAA,CAAA,KAAA,EAAA;AAAKD,QAAAA,SAAS,EAAC,wBAAwB;AAAAM,QAAAA,QAAA,EAAEA,QAAAA;AAAQ,OAAM,CACvD,eAAAL,GAAA,CAAC4I,KAAK,EAAA;AACJ9I,QAAAA,IAAI,EAAE,EAAG;QACTC,SAAS,EAAEK,UAAU,CACnB,8BAA8B,EAC9B,CAACuI,QAAQ,IAAI,4CAA4C,CAAA;AACzD,OAEN,CAAA,CAAA;KAAA,CAAA;AACD,GACiB,CAAC,CAAA;AAEzB,CAAA;AASM,SAAUE,wBAAwBA,CAAC;EACvCC,KAAK;EACLC,IAAI;EACJC,WAAW;AACXC,EAAAA,IAAAA;AAC8B,CAAA,EAAA;AAC9B,EAAA,MAAMC,aAAa,GAAGpD,UAAU,CAACzH,4CAA4C,CAAC,CAAA;AAE9E,EAAA,oBACE8B,IAAA,CAAA,KAAA,EAAA;IACEJ,SAAS,EAAEK,UAAU,CACnB,0CAA0C,EAC1C,CAAC2I,IAAI,IAAIC,WAAW,KAAK,oBAAoB,CAC7C;IAAA3I,QAAA,EAAA,CAED4I,IAAI,gBACHjJ,GAAA,CAAA,KAAA,EAAA;MACED,SAAS,EAAEK,UAAU,CACnB,qCAAqC,EACrC,CAAC8I,aAAa,IAAI,yDAAyD,CAC3E;AAAA7I,MAAAA,QAAA,EAED4I,IAAAA;AAAI,KACF,CAAC,GACJ,IAAI,eAER9I,IAAA,CAAA,KAAA,EAAA;AAAKJ,MAAAA,SAAS,EAAC,qCAAqC;AAAAM,MAAAA,QAAA,gBAClDF,IAAA,CAAA,KAAA,EAAA;QACEJ,SAAS,EAAEK,UAAU,CACnB,4CAA4C,EAC5C8I,aAAa,IAAI,oDAAoD,CACrE;AAAA7I,QAAAA,QAAA,gBAEFL,GAAA,CAAA,IAAA,EAAA;AAAID,UAAAA,SAAS,EAAC,sDAAsD;AAAAM,UAAAA,QAAA,EAAEyI,KAAAA;AAAK,SAAK,CAChF,EAACC,IAAI,gBACH/I,GAAA,CAAA,MAAA,EAAA;AAAMD,UAAAA,SAAS,EAAC,oEAAoE;AAAAM,UAAAA,QAAA,EACjF0I,IAAAA;SACG,CAAC,GACL,IAAI,CAAA;AAAA,OACL,CAEL,EAACC,WAAW,gBACVhJ,GAAA,CAAA,KAAA,EAAA;QACED,SAAS,EAAEK,UAAU,CACnB,oEAAoE,EACpE8I,aAAa,IAAI,oDAAoD,CACrE;AAAA7I,QAAAA,QAAA,EAED2I,WAAAA;OACE,CAAC,GACJ,IAAI,CAAA;AAAA,KACL,CACP,CAAA;AAAA,GAAK,CAAC,CAAA;AAEV;;;;"}
1
+ {"version":3,"file":"SelectInput.mjs","sources":["../../src/inputs/SelectInput.tsx"],"sourcesContent":["import { Listbox as ListboxBase } from '@headlessui/react';\nimport { Check, ChevronDown, Cross, CrossCircle } from '@transferwise/icons';\nimport classNames from 'classnames';\nimport mergeProps from 'merge-props';\nimport {\n createContext,\n forwardRef,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\nimport { VList } 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';\n\nconst MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n\nfunction searchableString(value: string) {\n return value.trim().replace(/\\s+/gu, ' ').normalize('NFKC').toLowerCase();\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\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}>({});\nconst SelectInputOptionContentWithinTriggerContext = createContext(false);\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: string;\n options: readonly SelectInputOptionItem<T>[];\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): SelectInputOptionItem<T | undefined> {\n if (!existingValues.has(item.value)) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\nfunction dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues),\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 name?: string;\n multiple?: M;\n placeholder?: string;\n items: readonly SelectInputItem<NonNullable<T>>[];\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 onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;\n onChange?: (value: M extends true ? T[] : T) => 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={classNames('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={classNames(\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\n extends Pick<React.ComponentPropsWithoutRef<'button'>, 'className' | 'onClick'> {}\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={classNames(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 name,\n multiple,\n placeholder,\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 onFilterChange = noop,\n onChange,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes();\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 useEffect(() => {\n if (initialized.current) {\n if (!open) {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, 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 triggerRef = 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 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 triggerRef.current = node;\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 triggerRef.current?.focus({ preventScroll: true });\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 items={items}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n value={value}\n filterQuery={deferredFilterQuery}\n onFilterChange={setFilterQuery}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\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 __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>\n extends Pick<\n SelectInputProps<T>,\n 'items' | 'renderValue' | 'renderFooter' | 'filterable' | 'filterPlaceholder'\n > {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n value: readonly T[] | T;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n}\n\nfunction SelectInputOptions<T = string>({\n items,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n searchInputRef,\n listboxRef,\n value,\n filterQuery,\n onFilterChange,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n\n const filteredItems =\n needle != null\n ? filterSelectInputItems(items, (item) => selectInputOptionItemIncludesNeedle(item, needle))\n : items;\n const resultsEmpty = needle != null && filteredItems.length === 0;\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 const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\n\n const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;\n\n const values = useMemo(\n () => new Set(Array.isArray(value) ? (value as readonly T[]) : [value as T]),\n [value],\n );\n\n const listboxProps = {\n id: listboxId,\n role: 'listbox',\n 'aria-orientation': 'vertical',\n tabIndex: 0,\n className: 'np-select-input-listbox',\n children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => (\n <SelectInputItemView\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n item={item}\n renderValue={renderValue}\n needle={needle}\n />\n )),\n } as const;\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 (value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n if (filterQuery) {\n // Ensure having an active option while filtering\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n defaultValue={filterQuery}\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 onFilterChange(event.currentTarget.value);\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={classNames(\n 'np-select-input-listbox-container',\n virtualized && 'np-select-input-listbox-container--virtualized',\n needle == null &&\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\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 {!virtualized ? (\n <div ref={listboxRef} {...listboxProps} />\n ) : (\n <VList\n {...listboxProps}\n key={needle}\n keepMounted={(() => {\n let index = 0;\n return filterSelectInputItems(filteredItems, (item) => values.has(item.value)).map(\n (item) => {\n index = filteredItems.indexOf(item, index + 1);\n return index;\n },\n );\n })()}\n />\n )}\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>\n extends SelectInputItemViewProps<T, SelectInputGroupItem<T | undefined>> {}\n\nfunction SelectInputGroupItemView<T = string>({\n item,\n renderValue,\n needle,\n}: SelectInputGroupItemViewProps<T>) {\n const headerId = useId();\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 role=\"group\"\n aria-labelledby={headerId}\n className={classNames(needle === null && 'np-select-input-group-item--without-needle')}\n >\n {needle == null ? (\n <header\n id={headerId}\n role=\"none\"\n className=\"np-select-input-group-item-header np-text-title-group\"\n >\n {item.label}\n </header>\n ) : 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\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 return (\n <ListboxBase.Option\n as=\"div\"\n value={value}\n disabled={disabled}\n className={({ active, disabled: uiDisabled }) =>\n classNames(\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={classNames(\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\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={classNames(\n 'np-select-input-option-content-container',\n (note || description) && 'np-text-body-large',\n )}\n >\n {icon ? (\n <div\n className={classNames(\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={classNames(\n 'np-select-input-option-content-text-line-1',\n withinTrigger && 'np-select-input-option-content-text-within-trigger',\n )}\n >\n <h4 className=\"np-select-input-option-content-text-primary d-inline\">{title}</h4>\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={classNames(\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","SelectInputTriggerButtonPropsContext","createContext","SelectInputOptionContentWithinTriggerContext","dedupeSelectInputOptionItem","item","existingValues","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","selectInputOptionItemIncludesNeedle","needle","filterMatchers","some","haystack","includes","filterSelectInputItems","predicate","defaultRenderTrigger","content","placeholderShown","clear","disabled","size","className","_jsx","InputGroup","addonEnd","_jsxs","classNames","children","_Fragment","SelectInputClearButton","onClick","event","preventDefault","ChevronDown","initialContentWidth","padding","SelectInputTriggerButton","as","ButtonInput","intl","useIntl","formatMessage","dateTriggerMessages","ariaLabel","Cross","noop","SelectInput","id","idProp","name","multiple","placeholder","defaultValue","controlledValue","compareValues","renderValue","String","renderFooter","renderTrigger","filterable","filterPlaceholder","UNSAFE_triggerButtonProps","onFilterChange","onChange","onClose","onClear","inputAttributes","useInputAttributes","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","useEffect","current","filterQuery","_setFilterQuery","deferredFilterQuery","useDeferredValue","setFilterQuery","query","queryNormalized","triggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","Popover","BottomSheet","searchInputRef","listboxRef","controllerRef","ListboxBase","by","uiDisabled","Array","isArray","length","placement","ref","getInteractionProps","Provider","node","mergeProps","prev","onKeyDown","key","join","focus","preventScroll","initialFocusRef","onCloseEnd","SelectInputOptions","restProps","interactionProps","useContext","Button","PolymorphicWithOverrides","__overrides","SelectInputOptionsContainer","forwardRef","ariaOrientation","ariaActiveDescendant","role","tabIndex","onAriaActiveDescendantChange","handleAriaActiveDescendantChange","stopPropagation","useMemo","filteredItems","resultsEmpty","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","virtualized","listboxProps","index","SelectInputItemView","Options","static","setAttribute","removeAttribute","dispatchEvent","KeyboardEvent","bubbles","SearchInput","shape","test","currentTarget","CrossCircle","messages","noResultsFound","_createElement","VList","keepMounted","indexOf","SelectInputOption","SelectInputGroupItemView","headerId","label","Option","active","selected","Check","SelectInputOptionContent","title","note","description","icon","withinTrigger"],"mappings":"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"}
package/build/main.css CHANGED
@@ -2655,6 +2655,9 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
2655
2655
  height: auto;
2656
2656
  }
2657
2657
  }
2658
+ .np-select-input-listbox-container--virtualized {
2659
+ height: 100vh;
2660
+ }
2658
2661
  .np-select-input-listbox-container--has-group {
2659
2662
  scroll-padding-top: 32px;
2660
2663
  scroll-padding-top: var(--size-32);
@@ -206,6 +206,9 @@
206
206
  height: auto;
207
207
  }
208
208
  }
209
+ .np-select-input-listbox-container--virtualized {
210
+ height: 100vh;
211
+ }
209
212
  .np-select-input-listbox-container--has-group {
210
213
  scroll-padding-top: 32px;
211
214
  scroll-padding-top: var(--size-32);
@@ -2655,6 +2655,9 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
2655
2655
  height: auto;
2656
2656
  }
2657
2657
  }
2658
+ .np-select-input-listbox-container--virtualized {
2659
+ height: 100vh;
2660
+ }
2658
2661
  .np-select-input-listbox-container--has-group {
2659
2662
  scroll-padding-top: 32px;
2660
2663
  scroll-padding-top: var(--size-32);
@@ -1 +1 @@
1
- {"version":3,"file":"SelectInput.d.ts","sourceRoot":"","sources":["../../../src/inputs/SelectInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectInput.d.ts","sourceRoot":"","sources":["../../../src/inputs/SelectInput.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-c5ba52c",
3
+ "version": "0.0.0-experimental-8d46704",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -93,12 +93,12 @@
93
93
  "rollup-preserve-directives": "^1.1.1",
94
94
  "storybook": "^8.2.2",
95
95
  "@transferwise/less-config": "3.1.0",
96
- "@transferwise/neptune-css": "0.0.0-experimental-c5ba52c",
96
+ "@transferwise/neptune-css": "0.0.0-experimental-8d46704",
97
97
  "@wise/components-theming": "1.4.0"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@transferwise/icons": "^3.7.0",
101
- "@transferwise/neptune-css": "0.0.0-experimental-c5ba52c",
101
+ "@transferwise/neptune-css": "0.0.0-experimental-8d46704",
102
102
  "@wise/art": "^2.7.0",
103
103
  "@wise/components-theming": "^1.0.0",
104
104
  "react": ">=18",
@@ -125,7 +125,8 @@
125
125
  "merge-props": "^6.0.0",
126
126
  "prop-types": "^15.8.1",
127
127
  "react-popper": "^2.3.0",
128
- "react-transition-group": "^4.4.5"
128
+ "react-transition-group": "^4.4.5",
129
+ "virtua": "^0.33.3"
129
130
  },
130
131
  "publishConfig": {
131
132
  "access": "public"
@@ -206,6 +206,9 @@
206
206
  height: auto;
207
207
  }
208
208
  }
209
+ .np-select-input-listbox-container--virtualized {
210
+ height: 100vh;
211
+ }
209
212
  .np-select-input-listbox-container--has-group {
210
213
  scroll-padding-top: 32px;
211
214
  scroll-padding-top: var(--size-32);
@@ -60,6 +60,10 @@
60
60
  }
61
61
  }
62
62
 
63
+ &--virtualized {
64
+ height: 100vh;
65
+ }
66
+
63
67
  &--has-group {
64
68
  scroll-padding-top: var(--size-32);
65
69
  }
@@ -322,6 +322,26 @@ export const Advanced: Story<Month> = {
322
322
  },
323
323
  };
324
324
 
325
+ export const ManyItems: Story<string, true> = {
326
+ args: {
327
+ multiple: true,
328
+ items: Array.from({ length: 1000 }, (_, index) => ({
329
+ type: 'option',
330
+ value: String(index + 1),
331
+ })),
332
+ renderValue: (value, withinTrigger) =>
333
+ withinTrigger ? (
334
+ value
335
+ ) : (
336
+ <SelectInputOptionContent
337
+ title={value}
338
+ description={Number(value) % 10 === 0 ? 'Divisible by 10' : undefined}
339
+ />
340
+ ),
341
+ filterable: true,
342
+ },
343
+ };
344
+
325
345
  export const WithinDrawer: Story<Currency> = {
326
346
  args: CurrenciesArgs,
327
347
  decorators: [
@@ -6,6 +6,7 @@ import {
6
6
  createContext,
7
7
  forwardRef,
8
8
  useContext,
9
+ useDeferredValue,
9
10
  useEffect,
10
11
  useId,
11
12
  useMemo,
@@ -13,6 +14,7 @@ import {
13
14
  useState,
14
15
  } from 'react';
15
16
  import { useIntl } from 'react-intl';
17
+ import { VList } from 'virtua';
16
18
 
17
19
  import { useEffectEvent } from '../common/hooks/useEffectEvent';
18
20
  import { useScreenSize } from '../common/hooks/useScreenSize';
@@ -29,6 +31,8 @@ import { InputGroup } from './InputGroup';
29
31
  import { SearchInput } from './SearchInput';
30
32
  import messages from './SelectInput.messages';
31
33
 
34
+ const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
35
+
32
36
  function searchableString(value: string) {
33
37
  return value.trim().replace(/\s+/gu, ' ').normalize('NFKC').toLowerCase();
34
38
  }
@@ -40,7 +44,7 @@ function inferSearchableStrings(value: unknown) {
40
44
 
41
45
  if (typeof value === 'object' && value != null) {
42
46
  return Object.values(value)
43
- .filter((innerValue): innerValue is string => typeof innerValue === 'string')
47
+ .filter((innerValue) => typeof innerValue === 'string')
44
48
  .map((innerValue) => searchableString(innerValue));
45
49
  }
46
50
 
@@ -112,20 +116,23 @@ function dedupeSelectInputItems<T>(
112
116
  });
113
117
  }
114
118
 
115
- function filterSelectInputOptionItem<T>(item: SelectInputOptionItem<T>, needle: string) {
119
+ function selectInputOptionItemIncludesNeedle<T>(item: SelectInputOptionItem<T>, needle: string) {
116
120
  return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>
117
121
  haystack.includes(needle),
118
122
  );
119
123
  }
120
124
 
121
- function filterSelectInputItems<T>(items: readonly SelectInputItem<T>[], needle: string) {
125
+ function filterSelectInputItems<T>(
126
+ items: readonly SelectInputItem<T>[],
127
+ predicate: (item: SelectInputOptionItem<T>) => boolean,
128
+ ) {
122
129
  return items.filter((item) => {
123
130
  switch (item.type) {
124
131
  case 'option': {
125
- return filterSelectInputOptionItem(item, needle);
132
+ return predicate(item);
126
133
  }
127
134
  case 'group': {
128
- return item.options.some((option) => filterSelectInputOptionItem(option, needle));
135
+ return item.options.some((option) => predicate(option));
129
136
  }
130
137
  default:
131
138
  }
@@ -271,12 +278,15 @@ export function SelectInput<T = string, M extends boolean = false>({
271
278
  }, [handleClose, open]);
272
279
 
273
280
  const [filterQuery, _setFilterQuery] = useState('');
281
+ const deferredFilterQuery = useDeferredValue(filterQuery);
274
282
  const setFilterQuery = useEffectEvent((query: string) => {
275
283
  _setFilterQuery(query);
276
- onFilterChange({
277
- query,
278
- queryNormalized: query ? searchableString(query) : null,
279
- });
284
+ if (query !== filterQuery) {
285
+ onFilterChange({
286
+ query,
287
+ queryNormalized: query ? searchableString(query) : null,
288
+ });
289
+ }
280
290
  });
281
291
 
282
292
  const triggerRef = useRef<HTMLButtonElement | null>(null);
@@ -294,9 +304,7 @@ export function SelectInput<T = string, M extends boolean = false>({
294
304
  multiple={multiple}
295
305
  defaultValue={defaultValue}
296
306
  value={controlledValue}
297
- // TODO: Remove assertion when upgrading TypeScript to v5
298
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
299
- by={compareValues as any}
307
+ by={compareValues}
300
308
  disabled={disabled}
301
309
  onChange={
302
310
  ((value) => {
@@ -349,8 +357,8 @@ export function SelectInput<T = string, M extends boolean = false>({
349
357
  content: !placeholderShown ? (
350
358
  <SelectInputOptionContentWithinTriggerContext.Provider value>
351
359
  {multiple && Array.isArray(value)
352
- ? value
353
- .map((option: NonNullable<T>) => renderValue(option, true))
360
+ ? (value as readonly NonNullable<T>[])
361
+ .map((option) => renderValue(option, true))
354
362
  .filter((node) => node != null)
355
363
  .join(', ')
356
364
  : renderValue(value as NonNullable<T>, true)}
@@ -379,9 +387,7 @@ export function SelectInput<T = string, M extends boolean = false>({
379
387
  setOpen(false);
380
388
  }}
381
389
  onCloseEnd={() => {
382
- if (filterQuery !== '') {
383
- setFilterQuery('');
384
- }
390
+ setFilterQuery('');
385
391
  }}
386
392
  >
387
393
  <SelectInputOptions
@@ -392,7 +398,8 @@ export function SelectInput<T = string, M extends boolean = false>({
392
398
  filterPlaceholder={filterPlaceholder}
393
399
  searchInputRef={searchInputRef}
394
400
  listboxRef={listboxRef}
395
- filterQuery={filterQuery}
401
+ value={value}
402
+ filterQuery={deferredFilterQuery}
396
403
  onFilterChange={setFilterQuery}
397
404
  />
398
405
  </OptionsOverlay>
@@ -481,6 +488,7 @@ interface SelectInputOptionsProps<T = string>
481
488
  > {
482
489
  searchInputRef: React.MutableRefObject<HTMLInputElement | null>;
483
490
  listboxRef: React.MutableRefObject<HTMLDivElement | null>;
491
+ value: readonly T[] | T;
484
492
  filterQuery: string;
485
493
  onFilterChange: (query: string) => void;
486
494
  }
@@ -493,6 +501,7 @@ function SelectInputOptions<T = string>({
493
501
  filterPlaceholder,
494
502
  searchInputRef,
495
503
  listboxRef,
504
+ value,
496
505
  filterQuery,
497
506
  onFilterChange,
498
507
  }: SelectInputOptionsProps<T>) {
@@ -506,7 +515,12 @@ function SelectInputOptions<T = string>({
506
515
  }
507
516
  return undefined;
508
517
  }, [filterQuery, filterable]);
509
- const resultsEmpty = needle != null && filterSelectInputItems(items, needle).length === 0;
518
+
519
+ const filteredItems =
520
+ needle != null
521
+ ? filterSelectInputItems(items, (item) => selectInputOptionItemIncludesNeedle(item, needle))
522
+ : items;
523
+ const resultsEmpty = needle != null && filteredItems.length === 0;
510
524
 
511
525
  const listboxContainerRef = useRef<HTMLDivElement>(null);
512
526
  useEffect(() => {
@@ -522,6 +536,30 @@ function SelectInputOptions<T = string>({
522
536
  const statusId = useId();
523
537
  const listboxId = useId();
524
538
 
539
+ const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;
540
+
541
+ const values = useMemo(
542
+ () => new Set(Array.isArray(value) ? (value as readonly T[]) : [value as T]),
543
+ [value],
544
+ );
545
+
546
+ const listboxProps = {
547
+ id: listboxId,
548
+ role: 'listbox',
549
+ 'aria-orientation': 'vertical',
550
+ tabIndex: 0,
551
+ className: 'np-select-input-listbox',
552
+ children: (needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => (
553
+ <SelectInputItemView
554
+ // eslint-disable-next-line react/no-array-index-key
555
+ key={index}
556
+ item={item}
557
+ renderValue={renderValue}
558
+ needle={needle}
559
+ />
560
+ )),
561
+ } as const;
562
+
525
563
  return (
526
564
  <ListboxBase.Options
527
565
  as={SelectInputOptionsContainer}
@@ -549,7 +587,7 @@ function SelectInputOptions<T = string>({
549
587
  ref={searchInputRef}
550
588
  shape="rectangle"
551
589
  placeholder={filterPlaceholder}
552
- value={filterQuery}
590
+ defaultValue={filterQuery}
553
591
  aria-controls={listboxId}
554
592
  aria-describedby={showStatus ? statusId : undefined}
555
593
  onKeyDown={(event) => {
@@ -571,7 +609,9 @@ function SelectInputOptions<T = string>({
571
609
  tabIndex={-1}
572
610
  className={classNames(
573
611
  'np-select-input-listbox-container',
574
- items.some((item) => item.type === 'group') &&
612
+ virtualized && 'np-select-input-listbox-container--virtualized',
613
+ needle == null &&
614
+ items.some((item) => item.type === 'group') &&
575
615
  'np-select-input-listbox-container--has-group',
576
616
  )}
577
617
  >
@@ -582,24 +622,23 @@ function SelectInputOptions<T = string>({
582
622
  </div>
583
623
  ) : null}
584
624
 
585
- <div
586
- ref={listboxRef}
587
- id={listboxId}
588
- role="listbox"
589
- aria-orientation="vertical"
590
- tabIndex={0}
591
- className="np-select-input-listbox"
592
- >
593
- {(needle != null ? dedupeSelectInputItems(items) : items).map((item, index) => (
594
- <SelectInputItemView
595
- // eslint-disable-next-line react/no-array-index-key
596
- key={index}
597
- item={item}
598
- renderValue={renderValue}
599
- needle={needle}
600
- />
601
- ))}
602
- </div>
625
+ {!virtualized ? (
626
+ <div ref={listboxRef} {...listboxProps} />
627
+ ) : (
628
+ <VList
629
+ {...listboxProps}
630
+ key={needle}
631
+ keepMounted={(() => {
632
+ let index = 0;
633
+ return filterSelectInputItems(filteredItems, (item) => values.has(item.value)).map(
634
+ (item) => {
635
+ index = filteredItems.indexOf(item, index + 1);
636
+ return index;
637
+ },
638
+ );
639
+ })()}
640
+ />
641
+ )}
603
642
 
604
643
  {renderFooter != null ? (
605
644
  <footer className="np-select-input-footer">
@@ -639,7 +678,10 @@ function SelectInputItemView<T = string>({
639
678
  }: SelectInputItemViewProps<T>) {
640
679
  switch (item.type) {
641
680
  case 'option': {
642
- if (item.value != null && (needle == null || filterSelectInputOptionItem(item, needle))) {
681
+ if (
682
+ item.value != null &&
683
+ (needle == null || selectInputOptionItemIncludesNeedle(item, needle))
684
+ ) {
643
685
  return (
644
686
  <SelectInputOption value={item.value} disabled={item.disabled}>
645
687
  {renderValue(item.value, false)}
package/src/main.css CHANGED
@@ -2655,6 +2655,9 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
2655
2655
  height: auto;
2656
2656
  }
2657
2657
  }
2658
+ .np-select-input-listbox-container--virtualized {
2659
+ height: 100vh;
2660
+ }
2658
2661
  .np-select-input-listbox-container--has-group {
2659
2662
  scroll-padding-top: 32px;
2660
2663
  scroll-padding-top: var(--size-32);