@entur/dropdown 8.0.0-beta.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dropdown.cjs.js +26 -13
- package/dist/dropdown.cjs.js.map +1 -1
- package/dist/dropdown.esm.js +26 -13
- package/dist/dropdown.esm.js.map +1 -1
- package/package.json +8 -8
package/dist/dropdown.cjs.js
CHANGED
|
@@ -325,25 +325,25 @@ const useNormalizedItems = (items) => React.useMemo(
|
|
|
325
325
|
);
|
|
326
326
|
const useResolvedItems = (itemsOrItemsResolver, debounceTimeout = 250) => {
|
|
327
327
|
const itemsIsAFunction = typeof itemsOrItemsResolver === "function";
|
|
328
|
-
const [
|
|
329
|
-
itemsIsAFunction ? [] : itemsOrItemsResolver
|
|
330
|
-
);
|
|
328
|
+
const [resolvedItems, setResolvedItems] = React.useState([]);
|
|
331
329
|
const [loading, setLoading] = React.useState(false);
|
|
332
330
|
const abortControllerRef = React.useRef(
|
|
333
331
|
new AbortController()
|
|
334
332
|
);
|
|
335
333
|
const itemsResolver = React.useMemo(() => {
|
|
336
|
-
if (itemsIsAFunction)
|
|
334
|
+
if (itemsIsAFunction) {
|
|
337
335
|
return itemsOrItemsResolver;
|
|
338
|
-
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
339
338
|
}, [itemsOrItemsResolver, itemsIsAFunction]);
|
|
340
339
|
const updateItems = async (inputValue) => {
|
|
340
|
+
if (!itemsResolver) return;
|
|
341
341
|
if (abortControllerRef?.current) abortControllerRef?.current?.abort();
|
|
342
342
|
const abortController = new AbortController();
|
|
343
343
|
abortControllerRef.current = abortController;
|
|
344
344
|
setLoading(true);
|
|
345
345
|
try {
|
|
346
|
-
const
|
|
346
|
+
const fetchedItems = await itemsResolver(
|
|
347
347
|
inputValue ?? "",
|
|
348
348
|
abortControllerRef
|
|
349
349
|
);
|
|
@@ -357,8 +357,7 @@ const useResolvedItems = (itemsOrItemsResolver, debounceTimeout = 250) => {
|
|
|
357
357
|
);
|
|
358
358
|
return;
|
|
359
359
|
}
|
|
360
|
-
|
|
361
|
-
setItems(resolvedItems);
|
|
360
|
+
setResolvedItems(fetchedItems);
|
|
362
361
|
} catch (error2) {
|
|
363
362
|
if (error2 && typeof error2 === "object" && "name" in error2 && error2.name === "AbortError") {
|
|
364
363
|
return;
|
|
@@ -367,9 +366,12 @@ const useResolvedItems = (itemsOrItemsResolver, debounceTimeout = 250) => {
|
|
|
367
366
|
"The following error was received but not handled inside Entur Designsystems useResolvedItems hook:"
|
|
368
367
|
);
|
|
369
368
|
throw error2;
|
|
369
|
+
} finally {
|
|
370
|
+
setLoading(false);
|
|
370
371
|
}
|
|
371
372
|
};
|
|
372
373
|
const debouncedFetchItems = utils.useDebounce(updateItems, debounceTimeout);
|
|
374
|
+
const items = itemsIsAFunction ? resolvedItems : itemsOrItemsResolver;
|
|
373
375
|
const normalizedItems = useNormalizedItems(items);
|
|
374
376
|
React.useEffect(() => {
|
|
375
377
|
return () => abortControllerRef?.current?.abort("Component unmounted");
|
|
@@ -561,15 +563,24 @@ const SearchableDropdown = React.forwardRef(
|
|
|
561
563
|
switch (type) {
|
|
562
564
|
// empty input to show selected item and reset dropdown list on item selection
|
|
563
565
|
case downshift.useCombobox.stateChangeTypes.ItemClick:
|
|
564
|
-
case downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
566
|
+
case downshift.useCombobox.stateChangeTypes.InputKeyDownEnter: {
|
|
565
567
|
return resetInputState(changes);
|
|
566
|
-
|
|
568
|
+
}
|
|
569
|
+
case downshift.useCombobox.stateChangeTypes.InputBlur: {
|
|
567
570
|
return resetInputState({
|
|
568
571
|
...changes,
|
|
569
572
|
selectedItem: state.selectedItem
|
|
570
573
|
});
|
|
571
|
-
|
|
574
|
+
}
|
|
575
|
+
case downshift.useCombobox.stateChangeTypes.InputKeyDownEscape: {
|
|
576
|
+
return {
|
|
577
|
+
...changes,
|
|
578
|
+
selectedItem: clearable && !state.isOpen ? null : state.selectedItem
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
case downshift.useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: {
|
|
572
582
|
return { ...changes, inputValue: state.inputValue };
|
|
583
|
+
}
|
|
573
584
|
// remove leading whitespace, select element with spacebar on empty input
|
|
574
585
|
case downshift.useCombobox.stateChangeTypes.InputChange: {
|
|
575
586
|
const isSpacePressedOnEmptyInput = changes.inputValue === " ";
|
|
@@ -598,7 +609,7 @@ const SearchableDropdown = React.forwardRef(
|
|
|
598
609
|
return changes;
|
|
599
610
|
}
|
|
600
611
|
},
|
|
601
|
-
[listItems, EMPTY_INPUT]
|
|
612
|
+
[listItems, EMPTY_INPUT, clearable]
|
|
602
613
|
);
|
|
603
614
|
const {
|
|
604
615
|
isOpen,
|
|
@@ -1197,7 +1208,7 @@ const Dropdown = React.forwardRef(
|
|
|
1197
1208
|
ariaLabelOpenList = "Åpne liste med valg",
|
|
1198
1209
|
ariaLabelSelectedItem,
|
|
1199
1210
|
className,
|
|
1200
|
-
clearable
|
|
1211
|
+
clearable,
|
|
1201
1212
|
disabled = false,
|
|
1202
1213
|
disableLabelAnimation,
|
|
1203
1214
|
feedback,
|
|
@@ -1299,6 +1310,8 @@ const Dropdown = React.forwardRef(
|
|
|
1299
1310
|
if (selectOnTab && highlitedItem && highlitedItem !== selectedItem) {
|
|
1300
1311
|
selectItem(highlitedItem);
|
|
1301
1312
|
}
|
|
1313
|
+
} else if (!isOpen && e.key === "Escape" && clearable) {
|
|
1314
|
+
reset();
|
|
1302
1315
|
}
|
|
1303
1316
|
}
|
|
1304
1317
|
});
|
package/dist/dropdown.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.cjs.js","sources":["../src/components/DropdownList.tsx","../src/components/FieldComponents.tsx","../src/useNormalizedItems.ts","../src/useResolvedItems.ts","../src/utils.ts","../src/SearchableDropdown.tsx","../src/MultiSelect.tsx","../src/Dropdown.tsx","../src/NativeDropdown.tsx","../src/index.tsx"],"sourcesContent":["import React, { MutableRefObject } from 'react';\nimport classNames from 'classnames';\nimport { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { Checkbox } from '@entur/form';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './DropdownList.scss';\n\ntype DropdownListProps<ValueType> = {\n ariaLabelChosenSingular?: string;\n ariaLabelSelectedItem?: string;\n getItemProps:\n | UseComboboxPropGetters<ValueType>['getItemProps']\n | UseSelectPropGetters<ValueType>['getItemProps'];\n highlightedIndex: number;\n isOpen: boolean;\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n floatingStyles: { [key: string]: any } | undefined;\n innerRef?:\n | MutableRefObject<HTMLUListElement>\n | ((node: HTMLElement | null) => void);\n loading?: boolean;\n loadingText?: string;\n noMatchesText?: string;\n selectAllCheckboxState?: boolean | 'indeterminate';\n selectAllItem?: NormalizedDropdownItemType<string>;\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n style?: React.CSSProperties;\n readOnly?: boolean;\n};\n\nexport const DropdownList = <ValueType extends NonNullable<any>>({\n ariaLabelChosenSingular = 'valgt',\n ariaLabelSelectedItem = ', valgt element',\n getItemProps,\n isOpen,\n highlightedIndex,\n listItems,\n floatingStyles,\n innerRef,\n loading = false,\n loadingText = 'Laster inn …',\n noMatchesText = 'Ingen treff for søket',\n readOnly = false,\n selectAllCheckboxState,\n selectAllItem,\n selectedItems,\n style,\n ...rest\n}: DropdownListProps<ValueType>) => {\n const isMultiselect = selectAllItem !== undefined;\n const isNoMatches =\n !loading &&\n (listItems.length === 0 ||\n (listItems?.length === 1 &&\n listItems?.[0]?.value === selectAllItem?.value));\n const isItemSelected = (\n item: NormalizedDropdownItemType<ValueType | string>,\n ) =>\n selectedItems.some(selectedItem => {\n // Primary match: value must always match\n if (selectedItem?.value !== item?.value) return false;\n\n // If both have labels, they must match for accessibility consistency\n // This ensures screen readers announce the same label for selected items\n // that users see in the dropdown list, preventing confusion\n if (selectedItem?.label && item?.label) {\n return selectedItem.label === item.label;\n }\n\n return true;\n });\n\n const ariaValuesSelectAll = () => {\n switch (selectAllCheckboxState) {\n case 'indeterminate': {\n return {\n label: `${selectAllItem?.label}, delvis valgt`,\n selected: false,\n };\n }\n case true: {\n return {\n label: `${selectAllItem?.label}, ${ariaLabelChosenSingular}`,\n selected: true,\n };\n }\n default: {\n return { label: `${selectAllItem?.label}`, selected: false };\n }\n }\n };\n\n const selectAllListItemContent = () => (\n <>\n <Checkbox\n aria-hidden=\"true\"\n checked={selectAllCheckboxState}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n <span\n className=\"eds-dropdown__list__item__text\"\n aria-label={ariaValuesSelectAll().label}\n >\n {selectAllItem?.label}\n </span>\n </>\n );\n\n const isReactComponent = (icon: any): icon is React.ComponentType<any> => {\n return (\n typeof icon === 'function' ||\n (typeof icon === 'object' &&\n icon !== null &&\n '$$typeof' in icon &&\n typeof icon.$$typeof === 'symbol')\n );\n };\n\n const listItemContent = (item: NormalizedDropdownItemType<ValueType>) => {\n return (\n <>\n {isMultiselect && (\n <Checkbox\n aria-hidden=\"true\"\n checked={isItemSelected(item)}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n )}\n <span className=\"eds-dropdown__list__item__text\">\n {item.label}\n <VisuallyHidden>\n {isItemSelected(item) ? ariaLabelSelectedItem : ''}\n </VisuallyHidden>\n </span>\n {Array.isArray(item.icons)\n ? item.icons.filter(isReactComponent).map((Icon, index) => {\n const key = `${\n Icon.displayName ?? Icon.name ?? Icon.name\n }-${index}`;\n return (\n <Icon\n key={key}\n inline\n className=\"eds-dropdown__list__item__icon\"\n />\n );\n })\n : null}\n </>\n );\n };\n\n return (\n <ul\n className=\"eds-dropdown__list\"\n ref={innerRef}\n style={{\n display: isOpen && !readOnly ? undefined : 'none',\n ...floatingStyles,\n ...style,\n }}\n {...rest}\n >\n {(() => {\n if (!isOpen || readOnly) return null;\n\n if (loading) {\n return (\n <li\n key=\"dropdown-list-loading\"\n className=\"eds-dropdown__list__item\"\n >\n {loadingText}\n </li>\n );\n }\n\n if (isNoMatches) {\n return (\n <li\n key=\"dropdown-list-no-match\"\n className=\"eds-dropdown__list__item\"\n >\n {noMatchesText}\n </li>\n );\n }\n\n return listItems.map((item, index) => {\n const key =\n item.itemKey ??\n `${item.label ?? ''}-${item.value ?? ''}-${(item.icons ?? [])\n .map(icon => icon?.displayName ?? icon?.name ?? 'unknown')\n .join('-')}`;\n const itemIsSelectAll = item.value === selectAllItem?.value;\n if (itemIsSelectAll && listItems.length <= 2) return null;\n return (\n <li\n className={classNames('eds-dropdown__list__item', {\n 'eds-dropdown__list__item--select-all': itemIsSelectAll,\n 'eds-dropdown__list__item--highlighted':\n highlightedIndex === index,\n 'eds-dropdown__list__item--selected':\n !isMultiselect && isItemSelected(item),\n })}\n key={key}\n {...getItemProps({\n // @ts-expect-error Since getItemProps expects the same item type\n // here as items, it throws error when selectAllItem is a string.\n // This does, however, not cause any functional issues.\n item,\n index,\n 'aria-selected': itemIsSelectAll\n ? ariaValuesSelectAll().selected\n : isItemSelected(item),\n })}\n >\n {itemIsSelectAll\n ? selectAllListItemContent()\n : listItemContent(\n item as NormalizedDropdownItemType<ValueType>,\n )}\n </li>\n );\n });\n })()}\n </ul>\n );\n};\n","import React, { forwardRef } from 'react';\nimport classNames from 'classnames';\nimport {\n UseComboboxGetToggleButtonPropsReturnValue,\n UseMultipleSelectionGetSelectedItemPropsOptions,\n} from 'downshift';\n\nimport { IconButton } from '@entur/button';\nimport { TagChip } from '@entur/chip';\nimport { CloseSmallIcon, DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { Tooltip } from '@entur/tooltip';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './FieldComponents.scss';\n\nexport const SelectedItemTag = <ValueType extends NonNullable<any>>({\n ariaLabelRemoveSelected,\n ariaLabelChosen = 'valgt',\n disabled,\n getSelectedItemProps,\n index,\n readOnly,\n removeSelectedItem,\n selectedItem,\n}: {\n ariaLabelRemoveSelected: string;\n ariaLabelChosen?: string;\n disabled?: boolean;\n getSelectedItemProps?: (\n options: UseMultipleSelectionGetSelectedItemPropsOptions<\n NormalizedDropdownItemType<ValueType>\n >,\n ) => any;\n index?: number;\n readOnly?: boolean;\n removeSelectedItem: (item: NormalizedDropdownItemType<ValueType>) => void;\n selectedItem: NormalizedDropdownItemType<ValueType>;\n}) => {\n if (!selectedItem) return null;\n\n const { tabIndex: _, ...selectedItemProps } =\n getSelectedItemProps?.({\n selectedItem,\n index,\n }) ?? {};\n return (\n <TagChip\n size=\"small\"\n className={classNames('eds-dropdown__selected-item-tag', {\n 'eds-dropdown__selected-item-tag--readonly': readOnly,\n 'eds-dropdown__selected-item-tag--disabled': disabled,\n })}\n {...selectedItemProps}\n onClose={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n removeSelectedItem(selectedItem);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n closeButtonAriaLabel={`${selectedItem.label} ${ariaLabelChosen}, ${ariaLabelRemoveSelected} `}\n key={selectedItem.value}\n aria-live=\"polite\"\n >\n <span\n aria-hidden=\"true\"\n className=\"eds-dropdown__selected-item-tag__text\"\n >\n {selectedItem.label}\n </span>\n </TagChip>\n );\n};\n\ntype FieldAppendProps = Partial<UseComboboxGetToggleButtonPropsReturnValue> & {\n ariaLabelCloseList: string;\n ariaLabelOpenList: string;\n clearable?: boolean;\n labelClearSelected: string;\n disabled?: boolean;\n focusable?: boolean;\n isOpen: boolean;\n loading: boolean;\n loadingText: string | undefined;\n onClear: () => void;\n itemIsSelected: boolean;\n};\n\nexport const DropdownFieldAppendix = forwardRef(\n (\n {\n ariaLabelCloseList,\n ariaLabelOpenList,\n clearable = false,\n labelClearSelected,\n focusable = false,\n disabled,\n isOpen,\n loading = false,\n loadingText,\n onClear,\n itemIsSelected,\n ...rest\n }: FieldAppendProps,\n ref: React.ForwardedRef<HTMLButtonElement>,\n ) => {\n function getToggleAriaLabel() {\n if (loading) return loadingText;\n if (isOpen) return ariaLabelCloseList;\n return ariaLabelOpenList;\n }\n\n return (\n <>\n {!disabled && (\n <div className=\"eds-dropdown__appendix\">\n {clearable && itemIsSelected && (\n <ClearableButton\n onClear={onClear}\n focusable={true}\n labelClearSelectedItems={labelClearSelected}\n />\n )}\n\n <IconButton\n className={classNames('eds-dropdown__appendix__toggle-button', {\n 'eds-dropdown__appendix__toggle-button--open': isOpen,\n })}\n ref={ref}\n aria-label={getToggleAriaLabel()}\n {...rest}\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n >\n {!loading ? (\n <DownArrowIcon aria-hidden=\"true\" />\n ) : (\n <LoadingDots aria-hidden=\"true\" />\n )}\n </IconButton>\n </div>\n )}\n </>\n );\n },\n);\n\nexport const ClearableButton = ({\n onClear,\n labelClearSelectedItems = 'Fjern valgte',\n focusable = false,\n}: {\n onClear: () => void;\n labelClearSelectedItems?: string;\n focusable?: boolean;\n ariaLabelClearItems?: string;\n}) => {\n return (\n <>\n <Tooltip\n aria-hidden=\"true\"\n placement=\"top\"\n content={labelClearSelectedItems}\n className=\"eds-dropdown__appendix__clear-button__tooltip\"\n >\n <IconButton\n className=\"eds-dropdown__appendix__clear-button\"\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n // These events bubble up to the Dropdown container and trigger openMenu.\n // To avoid this, stopPropagation and preventDefault are added.\n onClick={e => {\n e.stopPropagation();\n onClear();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onClear();\n }\n }}\n aria-label={labelClearSelectedItems}\n >\n <CloseSmallIcon aria-hidden=\"true\" />\n </IconButton>\n </Tooltip>\n <div className=\"eds-dropdown__appendix__divider\" />\n </>\n );\n};\n","import React from 'react';\n\nimport { DropdownItemType, NormalizedDropdownItemType } from './types';\n\nexport const useNormalizedItems = <ValueType = string>(\n items: DropdownItemType<ValueType>[],\n): NormalizedDropdownItemType<ValueType>[] =>\n React.useMemo(\n () =>\n items.map(item => {\n if (typeof item == 'string') {\n return {\n value: item as ValueType,\n label: item,\n };\n }\n\n if (item?.value === undefined) {\n return {\n ...item,\n value: item.label as ValueType,\n };\n }\n return { ...item, value: item.value };\n }),\n [items],\n );\n","import React from 'react';\n\nimport { useDebounce } from '@entur/utils';\n\nimport { useNormalizedItems } from './useNormalizedItems';\n\nimport {\n PotentiallyAsyncDropdownItemType,\n DropdownItemType,\n NormalizedDropdownItemType,\n AsyncDropdownItemType,\n} from './types';\n\nexport const useResolvedItems = <ValueType extends NonNullable<any>>(\n /** The list of items, or an async function that resolves the list of items */\n itemsOrItemsResolver: PotentiallyAsyncDropdownItemType<ValueType>,\n /** The time to wait after the input changes to the fetchItems method is called */\n debounceTimeout = 250,\n): {\n fetchItems: (query?: string) => void;\n loading: boolean;\n items: NormalizedDropdownItemType<ValueType>[];\n} => {\n const itemsIsAFunction = typeof itemsOrItemsResolver === 'function';\n\n const [items, setItems] = React.useState<DropdownItemType<ValueType>[]>(\n itemsIsAFunction ? [] : itemsOrItemsResolver,\n );\n const [loading, setLoading] = React.useState(false);\n\n const abortControllerRef = React.useRef<AbortController>(\n new AbortController(),\n );\n\n // We normalize the itemsResolver argument to an async function, so we\n // can use it without thinking about the differences later\n const itemsResolver = React.useMemo(() => {\n if (itemsIsAFunction)\n return itemsOrItemsResolver as AsyncDropdownItemType<ValueType>;\n return () =>\n Promise.resolve(itemsOrItemsResolver as DropdownItemType<ValueType>[]);\n }, [itemsOrItemsResolver, itemsIsAFunction]);\n\n // This should be called whenever the input value changes\n const updateItems = async (inputValue?: string) => {\n // The abortController handles cleanup of the previous request and unmounting\n if (abortControllerRef?.current) abortControllerRef?.current?.abort();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setLoading(true);\n\n try {\n const resolvedItems = await itemsResolver(\n inputValue ?? '',\n abortControllerRef,\n );\n\n if (abortControllerRef?.current?.signal?.aborted) {\n console.warn(\n 'Avbryt den asynkrone funksjonen din med signalet fra AbortController-en for å for å unngå minnelekkasje.',\n 'Funksjonen bør kaste en DOMException med navnet \"AbortError\" når den avbrytes.',\n '',\n '\\n\\nSe eksempel her: https://linje.entur.no/komponenter/skjemaelementer/dropdown#s%C3%B8kbar-dropdown-med-valg-fra-nettverkskall-bassert-p%C3%A5-tekstinput',\n '\\nLes mer om AbortController her: https://developer.mozilla.org/en-US/docs/Web/API/AbortController',\n );\n return;\n }\n\n setLoading(false);\n setItems(resolvedItems);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'AbortError'\n ) {\n // Stop execution if the request was aborted\n return;\n }\n console.warn(\n 'The following error was received but not handled inside Entur Designsystems useResolvedItems hook:',\n );\n throw error;\n }\n };\n\n const debouncedFetchItems = useDebounce(updateItems, debounceTimeout);\n const normalizedItems = useNormalizedItems(items);\n\n React.useEffect(() => {\n // send abort signal to previous request on unmount for cleanup\n return () => abortControllerRef?.current?.abort('Component unmounted');\n }, []);\n\n React.useEffect(() => {\n // Let's fetch the list initially if it's specified\n if (itemsIsAFunction) {\n debouncedFetchItems('');\n }\n }, [itemsIsAFunction, itemsResolver]);\n\n return {\n items: normalizedItems,\n loading: itemsIsAFunction ? loading : false,\n fetchItems: debouncedFetchItems,\n };\n};\n","import { useMemo } from 'react';\nimport { UseComboboxState } from 'downshift';\nimport { NormalizedDropdownItemType } from './types';\n\n// Redeclare forwardRef\ndeclare module 'react' {\n function forwardRef<T, P = object>(\n render: (props: P, ref: React.Ref<T>) => React.ReactElement | null,\n ): (props: P & React.RefAttributes<T>) => React.ReactElement | null;\n}\n\n/* start general utils */\nexport const EMPTY_INPUT = '';\n\nexport function lowerCaseFilterTest(\n item: NormalizedDropdownItemType<any>,\n input: string | undefined,\n) {\n if (!input) {\n return true;\n }\n const sanitizeEscapeCharacters = input.replace(\n /[-/\\\\^$*+?.()|[\\]{}]/g,\n '\\\\$&',\n );\n const inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');\n return inputRegex.test(item.label);\n}\n\nexport function noFilter<ValueType>(\n //@ts-expect-error only here to comply with dropdown filter API\n item: NormalizedDropdownItemType<ValueType>,\n //@ts-expect-error only here to comply with dropdown filter API\n input: string | undefined,\n) {\n return true;\n}\n\nexport const itemToString = (item: NormalizedDropdownItemType<any> | null) =>\n item ? item.label : '';\n\nexport const itemToKey = (item: NormalizedDropdownItemType<any> | null) =>\n item?.label + item?.value;\n\nexport const isFunctionWithQueryArgument = (object: any) =>\n typeof object === 'function' && object.length > 0;\n\nexport const clamp = (val: number, min = 1, max = 10) =>\n Math.min(Math.max(val, min), max);\n\nexport const resetInputState = <ValueType>(\n changes: Partial<UseComboboxState<NormalizedDropdownItemType<ValueType>>>,\n) => ({\n ...changes,\n inputValue: EMPTY_INPUT,\n});\n\n/* end general utils */\n/* start multiselect utils */\n\ntype useMultiselectUtilsType<ValueType> = {\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n selectAll: NormalizedDropdownItemType<string>;\n};\n\nexport const useMultiselectUtils = <ValueType>({\n listItems,\n selectedItems,\n selectAll,\n}: useMultiselectUtilsType<ValueType>) => {\n const hasSelectedItems = selectedItems.length > 0;\n\n const listItemsWithoutSelectAll = listItems.filter(\n item => item.value !== selectAll.value,\n ) as NormalizedDropdownItemType<ValueType>[];\n\n const unselectedItemsInListItems = listItemsWithoutSelectAll.filter(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const allListItemsAreSelected = !listItemsWithoutSelectAll.some(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const someListItemsAreSelected = listItemsWithoutSelectAll.some(listItem =>\n selectedItems.some(selectedItem => selectedItem.value === listItem.value),\n );\n\n const addClickedItemToSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => onChange([...selectedItems, clickedItem]);\n\n const clickedItemIsInSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n ) =>\n selectedItems.some(\n selectedItem => selectedItem.value === clickedItem.value,\n );\n\n const clickedItemIsSelectAll = (\n clickedItem: NormalizedDropdownItemType<string | ValueType>,\n ): clickedItem is NormalizedDropdownItemType<string> =>\n clickedItem.value === selectAll.value;\n\n const handleListItemClicked = ({\n clickedItem,\n onChange,\n }: {\n clickedItem: NormalizedDropdownItemType<any>;\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void;\n }) => {\n if (clickedItemIsSelectAll(clickedItem)) {\n if (allListItemsAreSelected) {\n return unselectAllListItems(onChange);\n }\n return selectAllUnselectedItemsInListItems(onChange);\n }\n\n if (clickedItemIsInSelectedItems(clickedItem)) {\n return removeClickedItemFromSelectedItems(clickedItem, onChange);\n }\n addClickedItemToSelectedItems(clickedItem, onChange);\n };\n\n const removeClickedItemFromSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) =>\n onChange(\n selectedItems.filter(\n selectedItem => selectedItem.value !== clickedItem.value,\n ),\n );\n\n const selectAllCheckboxState: boolean | 'indeterminate' = useMemo(() => {\n if (allListItemsAreSelected) return true;\n if (someListItemsAreSelected) return 'indeterminate';\n return false;\n }, [allListItemsAreSelected, someListItemsAreSelected]);\n\n const selectAllUnselectedItemsInListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n onChange([...selectedItems, ...unselectedItemsInListItems]);\n };\n\n const unselectAllListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n const selectedItemsWithoutItemsInListItems = selectedItems.filter(\n selectedItem =>\n !listItemsWithoutSelectAll.some(\n listItem => listItem.value === selectedItem.value,\n ),\n );\n onChange(selectedItemsWithoutItemsInListItems);\n };\n\n return {\n addClickedItemToSelectedItems,\n allListItemsAreSelected,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n handleListItemClicked,\n hasSelectedItems,\n listItemsWithoutSelectAll,\n removeClickedItemFromSelectedItems,\n selectAllCheckboxState,\n selectAllUnselectedItemsInListItems,\n someListItemsAreSelected,\n unselectAllListItems,\n };\n};\n\n/* end multiselect utils */\n/* start a11y utils */\n\n// called when the state changes:\n// selectedItem, highlightedIndex, inputValue or isOpen.\nexport function getA11yStatusMessage<ValueType>(\n options: UseComboboxState<NormalizedDropdownItemType<ValueType>> & {\n selectAllItemIncluded?: boolean;\n resultCount: number;\n },\n): string {\n const { isOpen, selectAllItemIncluded = false, resultCount } = options;\n\n if (!isOpen) {\n return '';\n }\n\n const resultCountWithoutSelectAll = selectAllItemIncluded\n ? resultCount - 1\n : resultCount;\n\n if (resultCountWithoutSelectAll === 0) {\n return 'Ingen resultater';\n }\n\n return `${resultCountWithoutSelectAll} resultat${\n resultCountWithoutSelectAll === 1 ? '' : 'er'\n } tilgjengelig, naviger med pil opp eller ned, velg elementer med Enter.`;\n}\n/* end a11y utils */\n","/* eslint-disable no-warning-comments */\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n UseComboboxState,\n UseComboboxStateChangeOptions,\n useCombobox,\n} from 'downshift';\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\n\nimport { DropdownProps } from './Dropdown';\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n resetInputState,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Antall millisekunder man venter etter tekstinput før det gjøres kall for å oppdatere items\n * Denne er kun relevant hvis du sender inn en funksjon som items.\n */\n debounceTimeout?: number;\n /** Tekst som kommer opp når det ikke er noe treff på filtreringsøket\n * @default \"Ingen treff for søket\"\n */\n noMatchesText?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når input-feltet får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const SearchableDropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = true,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation = false,\n feedback,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange = () => undefined,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem: value,\n selectOnTab = false,\n style,\n variant = 'info',\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: SearchableDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [showSelectedItem, setShowSelectedItem] = useState(value !== null);\n const [lastHighlightedIndex, setLastHighlightedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const [listItems, setListItems] = useState(normalizedItems);\n\n const filterListItems = ({ inputValue }: { inputValue: string }) =>\n setListItems(\n normalizedItems.filter(item => itemFilter(item, inputValue)),\n );\n\n const updateListItems = ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n };\n\n const inputHasFocus =\n typeof document !== 'undefined'\n ? inputRef?.current === document?.activeElement\n : false;\n\n useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const stateReducer = useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<NormalizedDropdownItemType<ValueType>>,\n ) => {\n switch (type) {\n // empty input to show selected item and reset dropdown list on item selection\n case useCombobox.stateChangeTypes.ItemClick:\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n return resetInputState<ValueType>(changes);\n case useCombobox.stateChangeTypes.InputBlur:\n // We dont want to change selection on blur so we keep previous selectedItem\n return resetInputState<ValueType>({\n ...changes,\n selectedItem: state.selectedItem,\n });\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:\n return { ...changes, inputValue: state.inputValue };\n // remove leading whitespace, select element with spacebar on empty input\n case useCombobox.stateChangeTypes.InputChange: {\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n\n if (!isSpacePressedOnEmptyInput)\n return { ...changes, highlightedIndex: 0 };\n\n const sanitizedInputValue = (changes.inputValue ?? '').replace(\n /^\\s+/,\n EMPTY_INPUT,\n );\n\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n const i = changes.highlightedIndex ?? -1;\n if (i >= 0 && i < listItems.length)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[i],\n };\n\n return { ...changes, inputValue: sanitizedInputValue };\n }\n default:\n return changes;\n }\n },\n [listItems, EMPTY_INPUT],\n );\n\n const {\n isOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n highlightedIndex,\n getItemProps,\n selectedItem,\n inputValue,\n setInputValue,\n selectItem,\n reset,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex,\n items: listItems,\n itemToString,\n selectedItem: value,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange(newSelectedItem);\n },\n onHighlightedIndexChange: ({ highlightedIndex }) => {\n if (highlightedIndex >= 0) setLastHighlightedIndex(highlightedIndex);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({ ...options, resultCount: listItems.length }),\n });\n\n useEffect(() => {\n // sync internal state on initial render\n if (value !== null && !inputHasFocus) {\n setShowSelectedItem(true);\n updateListItems({ inputValue: EMPTY_INPUT });\n setInputValue(EMPTY_INPUT);\n }\n }, [value]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const labelProps = getLabelProps();\n const toggleButtonProps = getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading) ? undefined : 'true',\n });\n const menuProps = getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n const inputProps = getInputProps({\n onKeyDown(e: React.KeyboardEvent) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (selectOnTab && highlitedItem) {\n selectItem(highlitedItem);\n setShowSelectedItem(true);\n }\n }\n },\n onBlur(e) {\n if (selectedItem !== null) setShowSelectedItem(true);\n onBlur?.(e);\n },\n onFocus(e) {\n if (!readOnly) setShowSelectedItem(false);\n onFocus?.(e);\n },\n disabled: disabled,\n readOnly: readOnly,\n placeholder: selectedItem?.label ?? placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n ref: mergeRefs(inputRef, ref),\n });\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--searchable',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={selectedItem !== null || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={labelProps.id}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) inputProps?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n prepend={prepend}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n tabIndex={disabled || readOnly ? -1 : undefined}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <span\n className={classNames('eds-dropdown--searchable__selected-item', {\n 'eds-dropdown--searchable__selected-item--hidden':\n !showSelectedItem,\n })}\n onClick={event => {\n if (!disabled && !readOnly) {\n inputRef.current?.focus();\n inputProps?.onClick?.(event);\n }\n }}\n tabIndex={readOnly ? 0 : -1}\n >\n {showSelectedItem ? selectedItem?.label : ''}\n </span>\n <input\n className={classNames('eds-dropdown__input eds-form-control', {\n 'eds-dropdown__input--hidden': showSelectedItem,\n })}\n {...inputProps}\n />\n <DropdownFieldAppendix\n {...toggleButtonProps}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, {\n Dispatch,\n SetStateAction,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n useMultipleSelection,\n useCombobox,\n UseComboboxStateChangeOptions,\n UseComboboxState,\n} from 'downshift';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, useRandomId } from '@entur/utils';\n\nimport {\n DropdownFieldAppendix,\n SelectedItemTag,\n} from './components/FieldComponents';\nimport { DropdownList } from './components/DropdownList';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport { DropdownProps } from './Dropdown';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToKey,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n resetInputState,\n useMultiselectUtils,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type MultiSelectProps<ValueType> = Omit<\n DropdownProps<ValueType>,\n 'selectedItem' | 'onChange'\n> & {\n /** Elementer som er valgt blant 'items'. Bruk tom liste for ingen valgte\n */\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n /** Callback med alle valgte verdier.\n * Bruk denne til å oppdatere selectedItems-listen */\n onChange?: (\n selectedItems: NormalizedDropdownItemType<ValueType>[],\n ) => void | Dispatch<SetStateAction<NormalizedDropdownItemType<ValueType>[]>>;\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Skjuler «Velg alle» fra listen med valg\n * @default false\n */\n hideSelectAll?: boolean;\n /** Antall millisekunder man venter før man kaller en potensiell items-funksjon\n * @default 250\n */\n debounceTimeout?: number;\n /** Maks antall individuelle valgt-element-tags i MultiSelect-en før de blir til en samle-tag\n * @default 10\n */\n maxChips?: number;\n /** Resetter input etter at et element er valgt i listen\n * @default false\n */\n clearInputOnSelect?: boolean;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Velg alle\"\n */\n labelSelectAll?: string;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Alle valgt\"\n */\n labelAllItemsSelected?: string;\n /** Skjermleser-tekst som for å fjerne alle valg\n * @default \"Fjern valgte\"\n */\n labelClearAllItems?: string;\n /** Tekst for skjemleser på knapper for å fjerne valgt element\n * @default \"trykk for å fjerne valg\"\n */\n ariaLabelRemoveSelected?: string;\n /** Tekst for skjemleser for å indikere at et element er valgt\n * @default \"valgte\"\n */\n ariaLabelChosenPlural?: string;\n /** Tekst for skjemleser for å hoppe til input-feltet\n * @default `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`\n */\n ariaLabelJumpToInput?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når input-feltet får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const MultiSelect = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n className,\n clearable = true,\n clearInputOnSelect = false,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation,\n feedback,\n hideSelectAll = false,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelAllItemsSelected = 'Alle valgt',\n labelClearAllItems = 'Fjern valgte',\n labelSelectAll = 'Velg alle',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n maxChips = 10,\n noMatchesText,\n onChange = () => undefined,\n placeholder,\n readOnly = false,\n selectedItems = [],\n selectOnTab = false,\n style,\n variant = 'information',\n ariaLabelChosenSingular,\n ariaLabelChosenPlural = 'valgte',\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelJumpToInput = `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`,\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelRemoveSelected = 'trykk for å fjerne valg',\n ariaLabelSelectedItem,\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: MultiSelectProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [lastHighlightedIndex, setLastHighlightedIndex] = React.useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n //@ts-expect-error this is done to aid developers debug wrong prop usage\n if (rest.selectedItem !== undefined)\n console.warn(\n \"Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?\",\n );\n //@ts-expect-error selectedItem should not actually exist in rest\n }, [rest.selectedItem]);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const isAllNonAsyncItemsSelected =\n typeof initialItems !== 'function' &&\n selectedItems.length === normalizedItems.length;\n\n // special 'item' used as Select All entry in the dropdown list\n const selectAllUniqueId = useRandomId('select-all');\n const selectAll: NormalizedDropdownItemType<string> = React.useMemo(\n () => ({\n value: selectAllUniqueId,\n label: labelSelectAll,\n }),\n [labelSelectAll],\n );\n\n // special 'item' used as a replacement selected item tag for when\n // there are more selected element than maxChips\n const summarySelectedItems: NormalizedDropdownItemType<string> =\n React.useMemo(\n () => ({\n value: EMPTY_INPUT,\n label: isAllNonAsyncItemsSelected\n ? labelAllItemsSelected\n : selectedItems.length + ' ' + ariaLabelChosenPlural,\n }),\n [\n isAllNonAsyncItemsSelected,\n selectedItems,\n labelAllItemsSelected,\n ariaLabelChosenPlural,\n ],\n );\n\n const [listItems, setListItems] = useState([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems,\n ]);\n\n const filterListItems = React.useCallback(\n ({ inputValue }: { inputValue: string }) =>\n setListItems([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems.filter(item => itemFilter(item, inputValue)),\n ]),\n [hideSelectAll, selectAll, normalizedItems, itemFilter],\n );\n\n const updateListItems = React.useCallback(\n ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n },\n [filterListItems, initialItems, fetchItems],\n );\n\n React.useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const {\n hasSelectedItems,\n handleListItemClicked,\n selectAllCheckboxState,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n } = useMultiselectUtils<ValueType>({\n listItems,\n selectAll,\n selectedItems,\n });\n\n const {\n getSelectedItemProps,\n getDropdownProps,\n reset,\n removeSelectedItem,\n setSelectedItems,\n } = useMultipleSelection({\n selectedItems,\n // @ts-expect-error prop missing from library types\n itemToString,\n itemToKey,\n onSelectedItemsChange({ selectedItems: newSelectedItems }) {\n onChange(newSelectedItems);\n },\n });\n\n const stateReducer = React.useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType | string>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<\n NormalizedDropdownItemType<ValueType | string>\n >,\n ) => {\n switch (type) {\n // keep menu open and edit input value on item selection\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick: {\n return {\n ...changes,\n isOpen: true,\n inputValue: clearInputOnSelect ? EMPTY_INPUT : state.inputValue,\n };\n }\n // reset input value when leaving input field\n case useCombobox.stateChangeTypes.InputBlur: {\n const { selectedItem: _, ...otherChanges } = changes;\n return resetInputState<ValueType | string>(otherChanges);\n }\n // edit input value when selected items is updated outside component\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: {\n return { ...changes, inputValue: state.inputValue };\n }\n // remove leading whitespace, select item with spacebar if input is empty and filter list items\n case useCombobox.stateChangeTypes.InputChange: {\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n\n if (!isSpacePressedOnEmptyInput)\n return { ...changes, highlightedIndex: hideSelectAll ? 0 : 1 };\n\n const sanitizedInputValue = (changes.inputValue ?? '').replace(\n /^\\s+/,\n EMPTY_INPUT,\n );\n\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n const i = changes.highlightedIndex ?? -1;\n if (i >= 0 && i < listItems.length)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[i],\n };\n\n return { ...changes, inputValue: sanitizedInputValue };\n }\n default:\n return changes;\n }\n },\n [hideSelectAll, listItems, clearInputOnSelect],\n );\n\n const {\n getInputProps,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n inputValue,\n isOpen,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex, // after selection, highlight previously selected item.\n items: listItems,\n itemToString,\n selectedItem: null,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: clickedItem }) {\n // clickedItem means item chosen either via mouse or keyboard\n if (!clickedItem) return;\n\n handleListItemClicked({\n clickedItem,\n onChange: setSelectedItems,\n });\n },\n onHighlightedIndexChange: ({ highlightedIndex }) => {\n if (highlightedIndex >= 0) setLastHighlightedIndex(highlightedIndex);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({\n ...options,\n selectAllItemIncluded: !hideSelectAll,\n resultCount: listItems.length,\n }),\n ...rest,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n const dropdownProps = getDropdownProps({\n preventKeyAction: isOpen,\n value: inputValue ?? EMPTY_INPUT,\n ref: mergeRefs(inputRef, ref),\n });\n const inputProps = getInputProps({\n onKeyDown: (e: React.KeyboardEvent) => {\n if (selectOnTab && isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (!highlitedItem) return;\n\n // Skip tab selection for select all or if item already is selected\n const shouldSkipTabSelection =\n clickedItemIsSelectAll(highlitedItem) ||\n (!clickedItemIsSelectAll(highlitedItem) &&\n clickedItemIsInSelectedItems(highlitedItem));\n\n if (shouldSkipTabSelection) return;\n\n handleListItemClicked({\n clickedItem: highlitedItem,\n onChange: setSelectedItems,\n });\n }\n },\n onBlur,\n onFocus,\n ...dropdownProps,\n className: 'eds-dropdown__input eds-form-control',\n disabled: readOnly || disabled,\n placeholder: placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n });\n const labelProps = getLabelProps();\n const menuProps = getMenuProps({\n 'aria-multiselectable': true,\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n const toggleButtonProps = getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading) ? undefined : 'true',\n });\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--multiselect',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={hasSelectedItems || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={labelProps.id}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) inputProps?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectAllCheckboxState={selectAllCheckboxState}\n selectAllItem={selectAll}\n selectedItems={selectedItems}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n >\n <div\n className={classNames(\n 'eds-dropdown--multiselect__selected-items-and-input',\n {\n 'eds-dropdown--multiselect__selected-items-and-input--filled':\n hasSelectedItems,\n },\n )}\n >\n {selectedItems.length > 1 ? (\n <VisuallyHidden onClick={() => inputRef.current?.focus()}>\n {ariaLabelJumpToInput}\n </VisuallyHidden>\n ) : null}\n {selectedItems.length <= maxChips ? (\n selectedItems.map((selectedItem, index) => (\n <SelectedItemTag\n ariaLabelChosen={ariaLabelChosenSingular}\n ariaLabelRemoveSelected={ariaLabelRemoveSelected}\n disabled={disabled}\n getSelectedItemProps={getSelectedItemProps}\n index={index}\n key={\n selectedItem?.label +\n (typeof selectedItem?.value === 'string'\n ? selectedItem.value\n : '')\n }\n readOnly={readOnly}\n removeSelectedItem={() => {\n removeSelectedItem(selectedItem);\n inputRef?.current?.focus();\n }}\n selectedItem={selectedItem}\n />\n ))\n ) : (\n <SelectedItemTag\n ariaLabelRemoveSelected={labelClearAllItems}\n ariaLabelChosen=\"\"\n disabled={disabled}\n readOnly={readOnly}\n removeSelectedItem={handleOnClear}\n selectedItem={summarySelectedItems}\n />\n )}\n <input {...inputProps} />\n </div>\n <DropdownFieldAppendix\n {...toggleButtonProps}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearAllItems}\n isOpen={isOpen}\n itemIsSelected={selectedItems.length > 0}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { Dispatch, SetStateAction, useLayoutEffect } from 'react';\nimport classNames from 'classnames';\nimport { useSelect } from 'downshift';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, VariantType } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\nimport { useResolvedItems } from './useResolvedItems';\nimport { clamp, itemToString } from './utils';\n\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type DropdownProps<ValueType> = {\n /** Tilgjengelige valg i dropdown-en */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Valgt verdi. Bruk null for ingen verdi. */\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n /** Callback ved valg som skal oppdatere selectedItem */\n onChange?: (\n selectedItem: NormalizedDropdownItemType<ValueType> | null,\n ) => void | Dispatch<\n SetStateAction<NormalizedDropdownItemType<ValueType> | null>\n >;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** Placeholder-tekst når ingenting er satt */\n placeholder?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default false\n */\n clearable?: boolean;\n /** Velg det markerte elementet når brukeren \"tab-er\" seg vekk fra komponenten/input-feltet */\n selectOnTab?: boolean;\n /** Deaktiver dropdown-en */\n disabled?: boolean;\n /** Setter dropdown-en i read-only modus */\n readOnly?: boolean;\n /** Hvilken valideringsvariant som gjelder */\n variant?: VariantType | typeof error | typeof info;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Tekst eller ikon som kommer først i dropdown-feltet */\n prepend?: React.ReactNode;\n /** */\n loading?: boolean;\n /** En tekst som beskriver hva som skjer når man venter på items\n * @default 'Laster inn …'\n */\n loadingText?: string;\n /** Tekst som kommer opp når det ikke er noe elementer å vise\n * @default \"Ingen tilgjengelige valg …\"\n */\n noMatchesText?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default \"fjern valgt\"\n */\n labelClearSelectedItem?: string;\n /** En tooltip som gir ekstra info om inputfeltet */\n labelTooltip?: React.ReactNode;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Ekstra klassenavn */\n className?: string;\n /** Styling som sendes ned til Dropdown-lista */\n listStyle?: { [key: string]: any };\n /** Styling for Dropdown-en */\n style?: { [key: string]: any };\n /** Tekst for skjemleser for knapp som lukker listen med valg\n * @default \"Lukk liste med valg\"\n */\n ariaLabelCloseList?: string;\n /** Tekst for skjemleser for knapp som åpner listen med valg\n * @default \"Åpne liste med valg\"\n */\n ariaLabelOpenList?: string;\n /** Ord for at et element er valgt i entall\n * eks. 'Element 1, _valgt_'\n * @default 'valgt'\n */\n ariaLabelChosenSingular?: string;\n /** Tekst for skjermleser som beskriver statusen til et element som valgt\n * @default ', valgt element, trykk for å fjerne'\n */\n ariaLabelSelectedItem?: string;\n};\n\nexport const Dropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = false,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items: initialItems,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem,\n selectOnTab = false,\n style,\n variant = 'information',\n ...rest\n }: DropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLDivElement>,\n ) => {\n const { items: normalizedItems, loading: resolvedItemsLoading } =\n useResolvedItems(initialItems);\n const isFilled = selectedItem !== null || placeholder !== undefined;\n const {\n isOpen,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n selectItem,\n reset,\n } = useSelect({\n items: normalizedItems,\n defaultHighlightedIndex: selectedItem ? undefined : 0,\n selectedItem,\n stateReducer(state, { changes, type }) {\n const toggleButtonIsFocused =\n typeof document !== 'undefined' &&\n document.activeElement === refs.reference.current;\n\n switch (type) {\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowDown:\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowUp:\n if (!toggleButtonIsFocused) return { ...changes, isOpen: false };\n break;\n case useSelect.stateChangeTypes.ToggleButtonBlur:\n return { ...changes, selectedItem: state.selectedItem };\n }\n return changes;\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange?.(newSelectedItem);\n },\n itemToString,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n refs.reference.current?.focus();\n reset();\n };\n\n const labelProps = getLabelProps({\n isFilled,\n });\n const toggleButtonProps = getToggleButtonProps({\n ref: mergeRefs(ref, refs.setReference),\n 'aria-disabled': disabled,\n 'aria-label': disabled ? 'Disabled dropdown' : '',\n disabled: disabled,\n readOnly: readOnly,\n label: label,\n labelId: labelProps?.id,\n tabIndex: disabled || readOnly ? -1 : 0,\n onKeyDown(e) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = normalizedItems[highlightedIndex];\n // we don't want to clear selection with tab\n if (selectOnTab && highlitedItem && highlitedItem !== selectedItem) {\n selectItem(highlitedItem);\n }\n }\n },\n });\n const menuProps = getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n\n return (\n <BaseFormControl\n className={classNames('eds-dropdown', className, {\n 'eds-dropdown--has-tooltip': labelTooltip !== undefined,\n })}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n prepend={prepend}\n style={style}\n variant={variant}\n {...toggleButtonProps}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={normalizedItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <div className=\"eds-dropdown__selected-item\">\n {selectedItem?.label ?? (\n <div\n className={classNames(\n 'eds-dropdown__selected-item__placeholder',\n {\n 'eds-dropdown__selected-item__placeholder--readonly':\n readOnly,\n },\n )}\n >\n {placeholder}\n </div>\n )}\n </div>\n <DropdownFieldAppendix\n aria-busy={!(loading ?? resolvedItemsLoading) ? undefined : 'true'}\n aria-expanded={isOpen}\n clearable={clearable}\n onClear={handleOnClear}\n disabled={disabled || readOnly}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n loading={false}\n loadingText={undefined}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { forwardRef } from 'react';\nimport { BaseFormControl } from '@entur/form';\nimport { DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { useRandomId, VariantType } from '@entur/utils';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type NativeDropdownProps<ValueType> = {\n /** Ekstra klassenavn */\n className?: string;\n /**\n * For å deaktivere dropdow-nen\n * @default false\n **/\n disabled?: boolean;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Alle valg for dropdown-en å ha */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** En callback for endringer av value\n * Obs: merk at parameter her denne ikke er samme som i en HTML select.\n * Bruk { target } hvis du trenger info om select-elementet som ble trykket på\n */\n onChange?: ({\n value,\n selectedItem,\n target,\n }: {\n value: string;\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n target: EventTarget & HTMLSelectElement;\n }) => void;\n /** Tekst eller ikon som kommer før dropdown-en */\n prepend?: React.ReactNode;\n /**\n * Setter dropdown-en i read-only modus\n * @default false\n **/\n readOnly?: boolean;\n /** Den valgte verdien som NormalizedDropdownItemType\n * (Brukes når komponenten er 'controlled')\n */\n selectedItem?: NormalizedDropdownItemType<ValueType> | null;\n /** Den valgte verdien som sting\n * (Brukes når komponenten er 'controlled)\n */\n value?: string;\n /** Hvilken valideringsvariant som gjelder*/\n variant?: VariantType | typeof error | typeof info;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n [key: string]: any;\n};\n\nexport const NativeDropdown = forwardRef(\n <ValueType extends string | number>(\n {\n className,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items,\n label,\n loadingText,\n onChange,\n prepend,\n readOnly = false,\n selectedItem,\n style,\n value,\n variant,\n ...rest\n }: NativeDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLSelectElement>,\n ) => {\n const { items: normalizedItems, loading } =\n useResolvedItems<ValueType>(items);\n const nativeDropdownId = useRandomId('eds-dropdown-native');\n\n return (\n <BaseFormControl\n disabled={disabled}\n readOnly={readOnly}\n prepend={prepend}\n append={\n <FieldAppend\n hidden={disabled || readOnly}\n loading={loading}\n loadingText={loadingText}\n />\n }\n className={className}\n style={style}\n label={label}\n labelId={nativeDropdownId}\n variant={variant}\n feedback={feedback}\n disableLabelAnimation={disableLabelAnimation}\n isFilled={true}\n >\n <select\n aria-invalid={variant === 'negative' || variant === error}\n aria-labelledby={nativeDropdownId}\n aria-busy={loading}\n className=\"eds-form-control eds-dropdown--native\"\n disabled={disabled || readOnly}\n onChange={event => {\n onChange?.({\n value: event.target.value,\n selectedItem:\n normalizedItems.find(\n item => item.value === event.target.value,\n ) ?? null,\n target: event.target,\n });\n }}\n value={value ?? selectedItem?.value ?? undefined}\n ref={ref}\n {...rest}\n >\n {normalizedItems.map(item => (\n <option key={item.value} value={item.value}>\n {item.label}\n </option>\n ))}\n </select>\n </BaseFormControl>\n );\n },\n);\n\nconst FieldAppend = ({\n loading,\n loadingText,\n hidden,\n}: {\n loading: boolean;\n loadingText?: string;\n hidden: boolean;\n}) => {\n if (loading) {\n return (\n <div className=\"eds-dropdown-native__loading-dots\">\n <LoadingDots aria-label={loadingText} />\n </div>\n );\n }\n if (hidden) {\n return <></>;\n }\n return <DownArrowIcon inline />;\n};\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');\n\nexport type { NormalizedDropdownItemType, DropdownItemType } from './types';\n\nexport * from './SearchableDropdown';\nexport * from './MultiSelect';\nexport * from './Dropdown';\nexport * from './NativeDropdown';\nexport * from './types';\n"],"names":["jsxs","Fragment","jsx","Checkbox","VisuallyHidden","createElement","TagChip","forwardRef","IconButton","DownArrowIcon","LoadingDots","Tooltip","CloseSmallIcon","error","useDebounce","useMemo","useState","useRef","inputValue","useEffect","useCallback","useCombobox","highlightedIndex","useFloating","offset","space","shift","size","flip","useLayoutEffect","autoUpdate","mergeRefs","BaseFormControl","useRandomId","useMultipleSelection","useSelect","warnAboutMissingStyles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dropdown.cjs.js","sources":["../src/components/DropdownList.tsx","../src/components/FieldComponents.tsx","../src/useNormalizedItems.ts","../src/useResolvedItems.ts","../src/utils.ts","../src/SearchableDropdown.tsx","../src/MultiSelect.tsx","../src/Dropdown.tsx","../src/NativeDropdown.tsx","../src/index.tsx"],"sourcesContent":["import React, { MutableRefObject } from 'react';\nimport classNames from 'classnames';\nimport { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { Checkbox } from '@entur/form';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './DropdownList.scss';\n\ntype DropdownListProps<ValueType> = {\n ariaLabelChosenSingular?: string;\n ariaLabelSelectedItem?: string;\n getItemProps:\n | UseComboboxPropGetters<ValueType>['getItemProps']\n | UseSelectPropGetters<ValueType>['getItemProps'];\n highlightedIndex: number;\n isOpen: boolean;\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n floatingStyles: { [key: string]: any } | undefined;\n innerRef?:\n | MutableRefObject<HTMLUListElement>\n | ((node: HTMLElement | null) => void);\n loading?: boolean;\n loadingText?: string;\n noMatchesText?: string;\n selectAllCheckboxState?: boolean | 'indeterminate';\n selectAllItem?: NormalizedDropdownItemType<string>;\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n style?: React.CSSProperties;\n readOnly?: boolean;\n};\n\nexport const DropdownList = <ValueType extends NonNullable<any>>({\n ariaLabelChosenSingular = 'valgt',\n ariaLabelSelectedItem = ', valgt element',\n getItemProps,\n isOpen,\n highlightedIndex,\n listItems,\n floatingStyles,\n innerRef,\n loading = false,\n loadingText = 'Laster inn …',\n noMatchesText = 'Ingen treff for søket',\n readOnly = false,\n selectAllCheckboxState,\n selectAllItem,\n selectedItems,\n style,\n ...rest\n}: DropdownListProps<ValueType>) => {\n const isMultiselect = selectAllItem !== undefined;\n const isNoMatches =\n !loading &&\n (listItems.length === 0 ||\n (listItems?.length === 1 &&\n listItems?.[0]?.value === selectAllItem?.value));\n const isItemSelected = (\n item: NormalizedDropdownItemType<ValueType | string>,\n ) =>\n selectedItems.some(selectedItem => {\n // Primary match: value must always match\n if (selectedItem?.value !== item?.value) return false;\n\n // If both have labels, they must match for accessibility consistency\n // This ensures screen readers announce the same label for selected items\n // that users see in the dropdown list, preventing confusion\n if (selectedItem?.label && item?.label) {\n return selectedItem.label === item.label;\n }\n\n return true;\n });\n\n const ariaValuesSelectAll = () => {\n switch (selectAllCheckboxState) {\n case 'indeterminate': {\n return {\n label: `${selectAllItem?.label}, delvis valgt`,\n selected: false,\n };\n }\n case true: {\n return {\n label: `${selectAllItem?.label}, ${ariaLabelChosenSingular}`,\n selected: true,\n };\n }\n default: {\n return { label: `${selectAllItem?.label}`, selected: false };\n }\n }\n };\n\n const selectAllListItemContent = () => (\n <>\n <Checkbox\n aria-hidden=\"true\"\n checked={selectAllCheckboxState}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n <span\n className=\"eds-dropdown__list__item__text\"\n aria-label={ariaValuesSelectAll().label}\n >\n {selectAllItem?.label}\n </span>\n </>\n );\n\n const isReactComponent = (icon: any): icon is React.ComponentType<any> => {\n return (\n typeof icon === 'function' ||\n (typeof icon === 'object' &&\n icon !== null &&\n '$$typeof' in icon &&\n typeof icon.$$typeof === 'symbol')\n );\n };\n\n const listItemContent = (item: NormalizedDropdownItemType<ValueType>) => {\n return (\n <>\n {isMultiselect && (\n <Checkbox\n aria-hidden=\"true\"\n checked={isItemSelected(item)}\n className=\"eds-dropdown__list__item__checkbox\"\n tabIndex={-1}\n onChange={() => undefined}\n />\n )}\n <span className=\"eds-dropdown__list__item__text\">\n {item.label}\n <VisuallyHidden>\n {isItemSelected(item) ? ariaLabelSelectedItem : ''}\n </VisuallyHidden>\n </span>\n {Array.isArray(item.icons)\n ? item.icons.filter(isReactComponent).map((Icon, index) => {\n const key = `${\n Icon.displayName ?? Icon.name ?? Icon.name\n }-${index}`;\n return (\n <Icon\n key={key}\n inline\n className=\"eds-dropdown__list__item__icon\"\n />\n );\n })\n : null}\n </>\n );\n };\n\n return (\n <ul\n className=\"eds-dropdown__list\"\n ref={innerRef}\n style={{\n display: isOpen && !readOnly ? undefined : 'none',\n ...floatingStyles,\n ...style,\n }}\n {...rest}\n >\n {(() => {\n if (!isOpen || readOnly) return null;\n\n if (loading) {\n return (\n <li\n key=\"dropdown-list-loading\"\n className=\"eds-dropdown__list__item\"\n >\n {loadingText}\n </li>\n );\n }\n\n if (isNoMatches) {\n return (\n <li\n key=\"dropdown-list-no-match\"\n className=\"eds-dropdown__list__item\"\n >\n {noMatchesText}\n </li>\n );\n }\n\n return listItems.map((item, index) => {\n const key =\n item.itemKey ??\n `${item.label ?? ''}-${item.value ?? ''}-${(item.icons ?? [])\n .map(icon => icon?.displayName ?? icon?.name ?? 'unknown')\n .join('-')}`;\n const itemIsSelectAll = item.value === selectAllItem?.value;\n if (itemIsSelectAll && listItems.length <= 2) return null;\n return (\n <li\n className={classNames('eds-dropdown__list__item', {\n 'eds-dropdown__list__item--select-all': itemIsSelectAll,\n 'eds-dropdown__list__item--highlighted':\n highlightedIndex === index,\n 'eds-dropdown__list__item--selected':\n !isMultiselect && isItemSelected(item),\n })}\n key={key}\n {...getItemProps({\n // @ts-expect-error Since getItemProps expects the same item type\n // here as items, it throws error when selectAllItem is a string.\n // This does, however, not cause any functional issues.\n item,\n index,\n 'aria-selected': itemIsSelectAll\n ? ariaValuesSelectAll().selected\n : isItemSelected(item),\n })}\n >\n {itemIsSelectAll\n ? selectAllListItemContent()\n : listItemContent(\n item as NormalizedDropdownItemType<ValueType>,\n )}\n </li>\n );\n });\n })()}\n </ul>\n );\n};\n","import React, { forwardRef } from 'react';\nimport classNames from 'classnames';\nimport {\n UseComboboxGetToggleButtonPropsReturnValue,\n UseMultipleSelectionGetSelectedItemPropsOptions,\n} from 'downshift';\n\nimport { IconButton } from '@entur/button';\nimport { TagChip } from '@entur/chip';\nimport { CloseSmallIcon, DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { Tooltip } from '@entur/tooltip';\n\nimport { NormalizedDropdownItemType } from '../types';\n\nimport './FieldComponents.scss';\n\nexport const SelectedItemTag = <ValueType extends NonNullable<any>>({\n ariaLabelRemoveSelected,\n ariaLabelChosen = 'valgt',\n disabled,\n getSelectedItemProps,\n index,\n readOnly,\n removeSelectedItem,\n selectedItem,\n}: {\n ariaLabelRemoveSelected: string;\n ariaLabelChosen?: string;\n disabled?: boolean;\n getSelectedItemProps?: (\n options: UseMultipleSelectionGetSelectedItemPropsOptions<\n NormalizedDropdownItemType<ValueType>\n >,\n ) => any;\n index?: number;\n readOnly?: boolean;\n removeSelectedItem: (item: NormalizedDropdownItemType<ValueType>) => void;\n selectedItem: NormalizedDropdownItemType<ValueType>;\n}) => {\n if (!selectedItem) return null;\n\n const { tabIndex: _, ...selectedItemProps } =\n getSelectedItemProps?.({\n selectedItem,\n index,\n }) ?? {};\n return (\n <TagChip\n size=\"small\"\n className={classNames('eds-dropdown__selected-item-tag', {\n 'eds-dropdown__selected-item-tag--readonly': readOnly,\n 'eds-dropdown__selected-item-tag--disabled': disabled,\n })}\n {...selectedItemProps}\n onClose={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n removeSelectedItem(selectedItem);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n closeButtonAriaLabel={`${selectedItem.label} ${ariaLabelChosen}, ${ariaLabelRemoveSelected} `}\n key={selectedItem.value}\n aria-live=\"polite\"\n >\n <span\n aria-hidden=\"true\"\n className=\"eds-dropdown__selected-item-tag__text\"\n >\n {selectedItem.label}\n </span>\n </TagChip>\n );\n};\n\ntype FieldAppendProps = Partial<UseComboboxGetToggleButtonPropsReturnValue> & {\n ariaLabelCloseList: string;\n ariaLabelOpenList: string;\n clearable?: boolean;\n labelClearSelected: string;\n disabled?: boolean;\n focusable?: boolean;\n isOpen: boolean;\n loading: boolean;\n loadingText: string | undefined;\n onClear: () => void;\n itemIsSelected: boolean;\n};\n\nexport const DropdownFieldAppendix = forwardRef(\n (\n {\n ariaLabelCloseList,\n ariaLabelOpenList,\n clearable = false,\n labelClearSelected,\n focusable = false,\n disabled,\n isOpen,\n loading = false,\n loadingText,\n onClear,\n itemIsSelected,\n ...rest\n }: FieldAppendProps,\n ref: React.ForwardedRef<HTMLButtonElement>,\n ) => {\n function getToggleAriaLabel() {\n if (loading) return loadingText;\n if (isOpen) return ariaLabelCloseList;\n return ariaLabelOpenList;\n }\n\n return (\n <>\n {!disabled && (\n <div className=\"eds-dropdown__appendix\">\n {clearable && itemIsSelected && (\n <ClearableButton\n onClear={onClear}\n focusable={true}\n labelClearSelectedItems={labelClearSelected}\n />\n )}\n\n <IconButton\n className={classNames('eds-dropdown__appendix__toggle-button', {\n 'eds-dropdown__appendix__toggle-button--open': isOpen,\n })}\n ref={ref}\n aria-label={getToggleAriaLabel()}\n {...rest}\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n >\n {!loading ? (\n <DownArrowIcon aria-hidden=\"true\" />\n ) : (\n <LoadingDots aria-hidden=\"true\" />\n )}\n </IconButton>\n </div>\n )}\n </>\n );\n },\n);\n\nexport const ClearableButton = ({\n onClear,\n labelClearSelectedItems = 'Fjern valgte',\n focusable = false,\n}: {\n onClear: () => void;\n labelClearSelectedItems?: string;\n focusable?: boolean;\n ariaLabelClearItems?: string;\n}) => {\n return (\n <>\n <Tooltip\n aria-hidden=\"true\"\n placement=\"top\"\n content={labelClearSelectedItems}\n className=\"eds-dropdown__appendix__clear-button__tooltip\"\n >\n <IconButton\n className=\"eds-dropdown__appendix__clear-button\"\n type=\"button\"\n tabIndex={focusable ? 0 : -1}\n // These events bubble up to the Dropdown container and trigger openMenu.\n // To avoid this, stopPropagation and preventDefault are added.\n onClick={e => {\n e.stopPropagation();\n onClear();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onClear();\n }\n }}\n aria-label={labelClearSelectedItems}\n >\n <CloseSmallIcon aria-hidden=\"true\" />\n </IconButton>\n </Tooltip>\n <div className=\"eds-dropdown__appendix__divider\" />\n </>\n );\n};\n","import React from 'react';\n\nimport { DropdownItemType, NormalizedDropdownItemType } from './types';\n\nexport const useNormalizedItems = <ValueType = string>(\n items: DropdownItemType<ValueType>[],\n): NormalizedDropdownItemType<ValueType>[] =>\n React.useMemo(\n () =>\n items.map(item => {\n if (typeof item == 'string') {\n return {\n value: item as ValueType,\n label: item,\n };\n }\n\n if (item?.value === undefined) {\n return {\n ...item,\n value: item.label as ValueType,\n };\n }\n return { ...item, value: item.value };\n }),\n [items],\n );\n","import React from 'react';\n\nimport { useDebounce } from '@entur/utils';\n\nimport { useNormalizedItems } from './useNormalizedItems';\n\nimport {\n PotentiallyAsyncDropdownItemType,\n DropdownItemType,\n NormalizedDropdownItemType,\n AsyncDropdownItemType,\n} from './types';\n\nexport const useResolvedItems = <ValueType extends NonNullable<any>>(\n /** The list of items, or an async function that resolves the list of items */\n itemsOrItemsResolver: PotentiallyAsyncDropdownItemType<ValueType>,\n /** The time to wait after the input changes to the fetchItems method is called */\n debounceTimeout = 250,\n): {\n fetchItems: (query?: string) => void;\n loading: boolean;\n items: NormalizedDropdownItemType<ValueType>[];\n} => {\n const itemsIsAFunction = typeof itemsOrItemsResolver === 'function';\n\n // Only maintain state for function-based items - static items are used directly\n const [resolvedItems, setResolvedItems] = React.useState<\n DropdownItemType<ValueType>[]\n >([]);\n const [loading, setLoading] = React.useState(false);\n\n const abortControllerRef = React.useRef<AbortController>(\n new AbortController(),\n );\n\n // Only create resolver for function-based items\n const itemsResolver = React.useMemo(() => {\n if (itemsIsAFunction) {\n return itemsOrItemsResolver as AsyncDropdownItemType<ValueType>;\n }\n return null;\n }, [itemsOrItemsResolver, itemsIsAFunction]);\n\n // This should be called whenever the input value changes (only for function-based items)\n const updateItems = async (inputValue?: string) => {\n if (!itemsResolver) return; // Only works with function-based items\n\n // The abortController handles cleanup of the previous request and unmounting\n if (abortControllerRef?.current) abortControllerRef?.current?.abort();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setLoading(true);\n\n try {\n const fetchedItems = await itemsResolver(\n inputValue ?? '',\n abortControllerRef,\n );\n\n if (abortControllerRef?.current?.signal?.aborted) {\n console.warn(\n 'Avbryt den asynkrone funksjonen din med signalet fra AbortController-en for å for å unngå minnelekkasje.',\n 'Funksjonen bør kaste en DOMException med navnet \"AbortError\" når den avbrytes.',\n '',\n '\\n\\nSe eksempel her: https://linje.entur.no/komponenter/skjemaelementer/dropdown#s%C3%B8kbar-dropdown-med-valg-fra-nettverkskall-bassert-p%C3%A5-tekstinput',\n '\\nLes mer om AbortController her: https://developer.mozilla.org/en-US/docs/Web/API/AbortController',\n );\n return;\n }\n\n setResolvedItems(fetchedItems);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'AbortError'\n ) {\n // Stop execution if the request was aborted\n return;\n }\n console.warn(\n 'The following error was received but not handled inside Entur Designsystems useResolvedItems hook:',\n );\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n const debouncedFetchItems = useDebounce(updateItems, debounceTimeout);\n\n // Use static items directly or resolved items from state\n const items = itemsIsAFunction\n ? resolvedItems\n : (itemsOrItemsResolver as DropdownItemType<ValueType>[]);\n const normalizedItems = useNormalizedItems(items);\n\n React.useEffect(() => {\n // send abort signal to previous request on unmount for cleanup\n return () => abortControllerRef?.current?.abort('Component unmounted');\n }, []);\n\n React.useEffect(() => {\n // Let's fetch the list initially if it's specified\n if (itemsIsAFunction) {\n debouncedFetchItems('');\n }\n }, [itemsIsAFunction, itemsResolver]);\n\n return {\n items: normalizedItems,\n loading: itemsIsAFunction ? loading : false,\n fetchItems: debouncedFetchItems,\n };\n};\n","import { useMemo } from 'react';\nimport { UseComboboxState } from 'downshift';\nimport { NormalizedDropdownItemType } from './types';\n\n// Redeclare forwardRef\ndeclare module 'react' {\n function forwardRef<T, P = object>(\n render: (props: P, ref: React.Ref<T>) => React.ReactElement | null,\n ): (props: P & React.RefAttributes<T>) => React.ReactElement | null;\n}\n\n/* start general utils */\nexport const EMPTY_INPUT = '';\n\nexport function lowerCaseFilterTest(\n item: NormalizedDropdownItemType<any>,\n input: string | undefined,\n) {\n if (!input) {\n return true;\n }\n const sanitizeEscapeCharacters = input.replace(\n /[-/\\\\^$*+?.()|[\\]{}]/g,\n '\\\\$&',\n );\n const inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');\n return inputRegex.test(item.label);\n}\n\nexport function noFilter<ValueType>(\n //@ts-expect-error only here to comply with dropdown filter API\n item: NormalizedDropdownItemType<ValueType>,\n //@ts-expect-error only here to comply with dropdown filter API\n input: string | undefined,\n) {\n return true;\n}\n\nexport const itemToString = (item: NormalizedDropdownItemType<any> | null) =>\n item ? item.label : '';\n\nexport const itemToKey = (item: NormalizedDropdownItemType<any> | null) =>\n item?.label + item?.value;\n\nexport const isFunctionWithQueryArgument = (object: any) =>\n typeof object === 'function' && object.length > 0;\n\nexport const clamp = (val: number, min = 1, max = 10) =>\n Math.min(Math.max(val, min), max);\n\nexport const resetInputState = <ValueType>(\n changes: Partial<UseComboboxState<NormalizedDropdownItemType<ValueType>>>,\n) => ({\n ...changes,\n inputValue: EMPTY_INPUT,\n});\n\n/* end general utils */\n/* start multiselect utils */\n\ntype useMultiselectUtilsType<ValueType> = {\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n listItems: NormalizedDropdownItemType<ValueType | string>[];\n selectAll: NormalizedDropdownItemType<string>;\n};\n\nexport const useMultiselectUtils = <ValueType>({\n listItems,\n selectedItems,\n selectAll,\n}: useMultiselectUtilsType<ValueType>) => {\n const hasSelectedItems = selectedItems.length > 0;\n\n const listItemsWithoutSelectAll = listItems.filter(\n item => item.value !== selectAll.value,\n ) as NormalizedDropdownItemType<ValueType>[];\n\n const unselectedItemsInListItems = listItemsWithoutSelectAll.filter(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const allListItemsAreSelected = !listItemsWithoutSelectAll.some(\n listItem =>\n !selectedItems.some(\n selectedItem => selectedItem.value === listItem.value,\n ),\n );\n\n const someListItemsAreSelected = listItemsWithoutSelectAll.some(listItem =>\n selectedItems.some(selectedItem => selectedItem.value === listItem.value),\n );\n\n const addClickedItemToSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => onChange([...selectedItems, clickedItem]);\n\n const clickedItemIsInSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n ) =>\n selectedItems.some(\n selectedItem => selectedItem.value === clickedItem.value,\n );\n\n const clickedItemIsSelectAll = (\n clickedItem: NormalizedDropdownItemType<string | ValueType>,\n ): clickedItem is NormalizedDropdownItemType<string> =>\n clickedItem.value === selectAll.value;\n\n const handleListItemClicked = ({\n clickedItem,\n onChange,\n }: {\n clickedItem: NormalizedDropdownItemType<any>;\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void;\n }) => {\n if (clickedItemIsSelectAll(clickedItem)) {\n if (allListItemsAreSelected) {\n return unselectAllListItems(onChange);\n }\n return selectAllUnselectedItemsInListItems(onChange);\n }\n\n if (clickedItemIsInSelectedItems(clickedItem)) {\n return removeClickedItemFromSelectedItems(clickedItem, onChange);\n }\n addClickedItemToSelectedItems(clickedItem, onChange);\n };\n\n const removeClickedItemFromSelectedItems = (\n clickedItem: NormalizedDropdownItemType<ValueType>,\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) =>\n onChange(\n selectedItems.filter(\n selectedItem => selectedItem.value !== clickedItem.value,\n ),\n );\n\n const selectAllCheckboxState: boolean | 'indeterminate' = useMemo(() => {\n if (allListItemsAreSelected) return true;\n if (someListItemsAreSelected) return 'indeterminate';\n return false;\n }, [allListItemsAreSelected, someListItemsAreSelected]);\n\n const selectAllUnselectedItemsInListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n onChange([...selectedItems, ...unselectedItemsInListItems]);\n };\n\n const unselectAllListItems = (\n onChange: (value: NormalizedDropdownItemType<ValueType>[]) => void,\n ) => {\n const selectedItemsWithoutItemsInListItems = selectedItems.filter(\n selectedItem =>\n !listItemsWithoutSelectAll.some(\n listItem => listItem.value === selectedItem.value,\n ),\n );\n onChange(selectedItemsWithoutItemsInListItems);\n };\n\n return {\n addClickedItemToSelectedItems,\n allListItemsAreSelected,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n handleListItemClicked,\n hasSelectedItems,\n listItemsWithoutSelectAll,\n removeClickedItemFromSelectedItems,\n selectAllCheckboxState,\n selectAllUnselectedItemsInListItems,\n someListItemsAreSelected,\n unselectAllListItems,\n };\n};\n\n/* end multiselect utils */\n/* start a11y utils */\n\n// called when the state changes:\n// selectedItem, highlightedIndex, inputValue or isOpen.\nexport function getA11yStatusMessage<ValueType>(\n options: UseComboboxState<NormalizedDropdownItemType<ValueType>> & {\n selectAllItemIncluded?: boolean;\n resultCount: number;\n },\n): string {\n const { isOpen, selectAllItemIncluded = false, resultCount } = options;\n\n if (!isOpen) {\n return '';\n }\n\n const resultCountWithoutSelectAll = selectAllItemIncluded\n ? resultCount - 1\n : resultCount;\n\n if (resultCountWithoutSelectAll === 0) {\n return 'Ingen resultater';\n }\n\n return `${resultCountWithoutSelectAll} resultat${\n resultCountWithoutSelectAll === 1 ? '' : 'er'\n } tilgjengelig, naviger med pil opp eller ned, velg elementer med Enter.`;\n}\n/* end a11y utils */\n","/* eslint-disable no-warning-comments */\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n UseComboboxState,\n UseComboboxStateChangeOptions,\n useCombobox,\n} from 'downshift';\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\n\nimport { DropdownProps } from './Dropdown';\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n resetInputState,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Antall millisekunder man venter etter tekstinput før det gjøres kall for å oppdatere items\n * Denne er kun relevant hvis du sender inn en funksjon som items.\n */\n debounceTimeout?: number;\n /** Tekst som kommer opp når det ikke er noe treff på filtreringsøket\n * @default \"Ingen treff for søket\"\n */\n noMatchesText?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når input-feltet får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const SearchableDropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable = true,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation = false,\n feedback,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange = () => undefined,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem: value,\n selectOnTab = false,\n style,\n variant = 'info',\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: SearchableDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [showSelectedItem, setShowSelectedItem] = useState(value !== null);\n const [lastHighlightedIndex, setLastHighlightedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const [listItems, setListItems] = useState(normalizedItems);\n\n const filterListItems = ({ inputValue }: { inputValue: string }) =>\n setListItems(\n normalizedItems.filter(item => itemFilter(item, inputValue)),\n );\n\n const updateListItems = ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n };\n\n const inputHasFocus =\n typeof document !== 'undefined'\n ? inputRef?.current === document?.activeElement\n : false;\n\n useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const stateReducer = useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<NormalizedDropdownItemType<ValueType>>,\n ) => {\n switch (type) {\n // empty input to show selected item and reset dropdown list on item selection\n case useCombobox.stateChangeTypes.ItemClick:\n case useCombobox.stateChangeTypes.InputKeyDownEnter: {\n return resetInputState<ValueType>(changes);\n }\n case useCombobox.stateChangeTypes.InputBlur: {\n // We dont want to change selection on blur so we keep previous selectedItem\n return resetInputState<ValueType>({\n ...changes,\n selectedItem: state.selectedItem,\n });\n }\n case useCombobox.stateChangeTypes.InputKeyDownEscape: {\n return {\n ...changes,\n selectedItem:\n clearable && !state.isOpen ? null : state.selectedItem,\n };\n }\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: {\n return { ...changes, inputValue: state.inputValue };\n }\n // remove leading whitespace, select element with spacebar on empty input\n case useCombobox.stateChangeTypes.InputChange: {\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n\n if (!isSpacePressedOnEmptyInput)\n return { ...changes, highlightedIndex: 0 };\n\n const sanitizedInputValue = (changes.inputValue ?? '').replace(\n /^\\s+/,\n EMPTY_INPUT,\n );\n\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n const i = changes.highlightedIndex ?? -1;\n if (i >= 0 && i < listItems.length)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[i],\n };\n\n return { ...changes, inputValue: sanitizedInputValue };\n }\n default:\n return changes;\n }\n },\n [listItems, EMPTY_INPUT, clearable],\n );\n\n const {\n isOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n highlightedIndex,\n getItemProps,\n selectedItem,\n inputValue,\n setInputValue,\n selectItem,\n reset,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex,\n items: listItems,\n itemToString,\n selectedItem: value,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange(newSelectedItem);\n },\n onHighlightedIndexChange: ({ highlightedIndex }) => {\n if (highlightedIndex >= 0) setLastHighlightedIndex(highlightedIndex);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({ ...options, resultCount: listItems.length }),\n });\n\n useEffect(() => {\n // sync internal state on initial render\n if (value !== null && !inputHasFocus) {\n setShowSelectedItem(true);\n updateListItems({ inputValue: EMPTY_INPUT });\n setInputValue(EMPTY_INPUT);\n }\n }, [value]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const labelProps = getLabelProps();\n const toggleButtonProps = getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading) ? undefined : 'true',\n });\n const menuProps = getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n const inputProps = getInputProps({\n onKeyDown(e: React.KeyboardEvent) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (selectOnTab && highlitedItem) {\n selectItem(highlitedItem);\n setShowSelectedItem(true);\n }\n }\n },\n onBlur(e) {\n if (selectedItem !== null) setShowSelectedItem(true);\n onBlur?.(e);\n },\n onFocus(e) {\n if (!readOnly) setShowSelectedItem(false);\n onFocus?.(e);\n },\n disabled: disabled,\n readOnly: readOnly,\n placeholder: selectedItem?.label ?? placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n ref: mergeRefs(inputRef, ref),\n });\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--searchable',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={selectedItem !== null || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={labelProps.id}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) inputProps?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n prepend={prepend}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n tabIndex={disabled || readOnly ? -1 : undefined}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <span\n className={classNames('eds-dropdown--searchable__selected-item', {\n 'eds-dropdown--searchable__selected-item--hidden':\n !showSelectedItem,\n })}\n onClick={event => {\n if (!disabled && !readOnly) {\n inputRef.current?.focus();\n inputProps?.onClick?.(event);\n }\n }}\n tabIndex={readOnly ? 0 : -1}\n >\n {showSelectedItem ? selectedItem?.label : ''}\n </span>\n <input\n className={classNames('eds-dropdown__input eds-form-control', {\n 'eds-dropdown__input--hidden': showSelectedItem,\n })}\n {...inputProps}\n />\n <DropdownFieldAppendix\n {...toggleButtonProps}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, {\n Dispatch,\n SetStateAction,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n useMultipleSelection,\n useCombobox,\n UseComboboxStateChangeOptions,\n UseComboboxState,\n} from 'downshift';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n} from '@floating-ui/react-dom';\n\nimport { VisuallyHidden } from '@entur/a11y';\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, useRandomId } from '@entur/utils';\n\nimport {\n DropdownFieldAppendix,\n SelectedItemTag,\n} from './components/FieldComponents';\nimport { DropdownList } from './components/DropdownList';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport { DropdownProps } from './Dropdown';\nimport {\n clamp,\n EMPTY_INPUT,\n getA11yStatusMessage,\n isFunctionWithQueryArgument,\n itemToKey,\n itemToString,\n lowerCaseFilterTest,\n noFilter,\n resetInputState,\n useMultiselectUtils,\n} from './utils';\n\nimport { NormalizedDropdownItemType } from './types';\n\nimport './Dropdown.scss';\n\nexport type MultiSelectProps<ValueType> = Omit<\n DropdownProps<ValueType>,\n 'selectedItem' | 'onChange'\n> & {\n /** Elementer som er valgt blant 'items'. Bruk tom liste for ingen valgte\n */\n selectedItems: NormalizedDropdownItemType<ValueType>[];\n /** Callback med alle valgte verdier.\n * Bruk denne til å oppdatere selectedItems-listen */\n onChange?: (\n selectedItems: NormalizedDropdownItemType<ValueType>[],\n ) => void | Dispatch<SetStateAction<NormalizedDropdownItemType<ValueType>[]>>;\n /** Filtreringen som brukes når man skriver inn tekst i inputfeltet\n * @default Regex-test som sjekker om item.label inneholder input-teksten\n */\n itemFilter?: (\n item: NormalizedDropdownItemType<ValueType>,\n inputValue: string | undefined,\n ) => boolean;\n /** Skjuler «Velg alle» fra listen med valg\n * @default false\n */\n hideSelectAll?: boolean;\n /** Antall millisekunder man venter før man kaller en potensiell items-funksjon\n * @default 250\n */\n debounceTimeout?: number;\n /** Maks antall individuelle valgt-element-tags i MultiSelect-en før de blir til en samle-tag\n * @default 10\n */\n maxChips?: number;\n /** Resetter input etter at et element er valgt i listen\n * @default false\n */\n clearInputOnSelect?: boolean;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Velg alle\"\n */\n labelSelectAll?: string;\n /** Teksten som vises for «Velg alle»-elementet i listen\n * @default \"Alle valgt\"\n */\n labelAllItemsSelected?: string;\n /** Skjermleser-tekst som for å fjerne alle valg\n * @default \"Fjern valgte\"\n */\n labelClearAllItems?: string;\n /** Tekst for skjemleser på knapper for å fjerne valgt element\n * @default \"trykk for å fjerne valg\"\n */\n ariaLabelRemoveSelected?: string;\n /** Tekst for skjemleser for å indikere at et element er valgt\n * @default \"valgte\"\n */\n ariaLabelChosenPlural?: string;\n /** Tekst for skjemleser for å hoppe til input-feltet\n * @default `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`\n */\n ariaLabelJumpToInput?: string;\n /** Callback som kalles når brukeren går ut av input-feltet */\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /** Callback når komponenten klikkes */\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Callback når en tast trykkes */\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n /** Callback når input-feltet får fokus */\n onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;\n};\n\nexport const MultiSelect = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n className,\n clearable = true,\n clearInputOnSelect = false,\n debounceTimeout,\n disabled = false,\n disableLabelAnimation,\n feedback,\n hideSelectAll = false,\n items: initialItems,\n itemFilter = isFunctionWithQueryArgument(initialItems)\n ? noFilter\n : lowerCaseFilterTest,\n label,\n labelAllItemsSelected = 'Alle valgt',\n labelClearAllItems = 'Fjern valgte',\n labelSelectAll = 'Velg alle',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n maxChips = 10,\n noMatchesText,\n onChange = () => undefined,\n placeholder,\n readOnly = false,\n selectedItems = [],\n selectOnTab = false,\n style,\n variant = 'information',\n ariaLabelChosenSingular,\n ariaLabelChosenPlural = 'valgte',\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelJumpToInput = `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`,\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelRemoveSelected = 'trykk for å fjerne valg',\n ariaLabelSelectedItem,\n onBlur,\n onClick,\n onKeyDown,\n onFocus,\n ...rest\n }: MultiSelectProps<ValueType>,\n ref: React.ForwardedRef<HTMLInputElement>,\n ) => {\n const [lastHighlightedIndex, setLastHighlightedIndex] = React.useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n //@ts-expect-error this is done to aid developers debug wrong prop usage\n if (rest.selectedItem !== undefined)\n console.warn(\n \"Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?\",\n );\n //@ts-expect-error selectedItem should not actually exist in rest\n }, [rest.selectedItem]);\n\n const {\n items: normalizedItems,\n loading: resolvedItemsLoading,\n fetchItems,\n } = useResolvedItems(initialItems, debounceTimeout);\n\n const isAllNonAsyncItemsSelected =\n typeof initialItems !== 'function' &&\n selectedItems.length === normalizedItems.length;\n\n // special 'item' used as Select All entry in the dropdown list\n const selectAllUniqueId = useRandomId('select-all');\n const selectAll: NormalizedDropdownItemType<string> = React.useMemo(\n () => ({\n value: selectAllUniqueId,\n label: labelSelectAll,\n }),\n [labelSelectAll],\n );\n\n // special 'item' used as a replacement selected item tag for when\n // there are more selected element than maxChips\n const summarySelectedItems: NormalizedDropdownItemType<string> =\n React.useMemo(\n () => ({\n value: EMPTY_INPUT,\n label: isAllNonAsyncItemsSelected\n ? labelAllItemsSelected\n : selectedItems.length + ' ' + ariaLabelChosenPlural,\n }),\n [\n isAllNonAsyncItemsSelected,\n selectedItems,\n labelAllItemsSelected,\n ariaLabelChosenPlural,\n ],\n );\n\n const [listItems, setListItems] = useState([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems,\n ]);\n\n const filterListItems = React.useCallback(\n ({ inputValue }: { inputValue: string }) =>\n setListItems([\n ...(!hideSelectAll ? [selectAll] : []),\n ...normalizedItems.filter(item => itemFilter(item, inputValue)),\n ]),\n [hideSelectAll, selectAll, normalizedItems, itemFilter],\n );\n\n const updateListItems = React.useCallback(\n ({ inputValue }: { inputValue?: string }) => {\n const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);\n if (shouldRefetchItems) fetchItems(inputValue ?? EMPTY_INPUT);\n\n filterListItems({ inputValue: inputValue ?? EMPTY_INPUT });\n },\n [filterListItems, initialItems, fetchItems],\n );\n\n React.useEffect(() => {\n filterListItems({ inputValue });\n }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const {\n hasSelectedItems,\n handleListItemClicked,\n selectAllCheckboxState,\n clickedItemIsInSelectedItems,\n clickedItemIsSelectAll,\n } = useMultiselectUtils<ValueType>({\n listItems,\n selectAll,\n selectedItems,\n });\n\n const {\n getSelectedItemProps,\n getDropdownProps,\n reset,\n removeSelectedItem,\n setSelectedItems,\n } = useMultipleSelection({\n selectedItems,\n // @ts-expect-error prop missing from library types\n itemToString,\n itemToKey,\n onSelectedItemsChange({ selectedItems: newSelectedItems }) {\n onChange(newSelectedItems);\n },\n });\n\n const stateReducer = React.useCallback(\n (\n state: UseComboboxState<NormalizedDropdownItemType<ValueType | string>>,\n {\n type,\n changes,\n }: UseComboboxStateChangeOptions<\n NormalizedDropdownItemType<ValueType | string>\n >,\n ) => {\n switch (type) {\n // keep menu open and edit input value on item selection\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick: {\n return {\n ...changes,\n isOpen: true,\n inputValue: clearInputOnSelect ? EMPTY_INPUT : state.inputValue,\n };\n }\n // reset input value when leaving input field\n case useCombobox.stateChangeTypes.InputBlur: {\n const { selectedItem: _, ...otherChanges } = changes;\n return resetInputState<ValueType | string>(otherChanges);\n }\n // edit input value when selected items is updated outside component\n case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: {\n return { ...changes, inputValue: state.inputValue };\n }\n // remove leading whitespace, select item with spacebar if input is empty and filter list items\n case useCombobox.stateChangeTypes.InputChange: {\n const isSpacePressedOnEmptyInput = changes.inputValue === ' ';\n\n if (!isSpacePressedOnEmptyInput)\n return { ...changes, highlightedIndex: hideSelectAll ? 0 : 1 };\n\n const sanitizedInputValue = (changes.inputValue ?? '').replace(\n /^\\s+/,\n EMPTY_INPUT,\n );\n\n if (!state.isOpen)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n isOpen: true,\n };\n\n const i = changes.highlightedIndex ?? -1;\n if (i >= 0 && i < listItems.length)\n return {\n ...changes,\n inputValue: sanitizedInputValue,\n selectedItem: listItems[i],\n };\n\n return { ...changes, inputValue: sanitizedInputValue };\n }\n default:\n return changes;\n }\n },\n [hideSelectAll, listItems, clearInputOnSelect],\n );\n\n const {\n getInputProps,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n inputValue,\n isOpen,\n } = useCombobox({\n defaultHighlightedIndex: lastHighlightedIndex, // after selection, highlight previously selected item.\n items: listItems,\n itemToString,\n selectedItem: null,\n stateReducer,\n onInputValueChange(changes) {\n updateListItems({ inputValue: changes.inputValue });\n },\n onSelectedItemChange({ selectedItem: clickedItem }) {\n // clickedItem means item chosen either via mouse or keyboard\n if (!clickedItem) return;\n\n handleListItemClicked({\n clickedItem,\n onChange: setSelectedItems,\n });\n },\n onHighlightedIndexChange: ({ highlightedIndex }) => {\n if (highlightedIndex >= 0) setLastHighlightedIndex(highlightedIndex);\n },\n // Accessibility\n getA11yStatusMessage: options =>\n getA11yStatusMessage({\n ...options,\n selectAllItemIncluded: !hideSelectAll,\n resultCount: listItems.length,\n }),\n ...rest,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n inputRef.current?.focus();\n reset();\n };\n\n const dropdownProps = getDropdownProps({\n preventKeyAction: isOpen,\n value: inputValue ?? EMPTY_INPUT,\n ref: mergeRefs(inputRef, ref),\n });\n const inputProps = getInputProps({\n onKeyDown: (e: React.KeyboardEvent) => {\n if (selectOnTab && isOpen && e.key === 'Tab') {\n const highlitedItem = listItems[highlightedIndex];\n if (!highlitedItem) return;\n\n // Skip tab selection for select all or if item already is selected\n const shouldSkipTabSelection =\n clickedItemIsSelectAll(highlitedItem) ||\n (!clickedItemIsSelectAll(highlitedItem) &&\n clickedItemIsInSelectedItems(highlitedItem));\n\n if (shouldSkipTabSelection) return;\n\n handleListItemClicked({\n clickedItem: highlitedItem,\n onChange: setSelectedItems,\n });\n }\n },\n onBlur,\n onFocus,\n ...dropdownProps,\n className: 'eds-dropdown__input eds-form-control',\n disabled: readOnly || disabled,\n placeholder: placeholder,\n tabIndex: disabled || readOnly ? -1 : undefined,\n });\n const labelProps = getLabelProps();\n const menuProps = getMenuProps({\n 'aria-multiselectable': true,\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n const toggleButtonProps = getToggleButtonProps({\n 'aria-busy': !(loading ?? resolvedItemsLoading) ? undefined : 'true',\n });\n\n return (\n <BaseFormControl\n className={classNames(\n 'eds-dropdown',\n 'eds-dropdown--multiselect',\n className,\n { 'eds-dropdown--has-tooltip': labelTooltip !== undefined },\n )}\n disabled={disabled}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n isFilled={hasSelectedItems || inputValue !== EMPTY_INPUT}\n label={label}\n labelId={labelProps.id}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (e.target === e.currentTarget) inputProps?.onClick?.(e);\n onClick?.(e);\n }}\n onKeyDown={onKeyDown}\n readOnly={readOnly}\n ref={refs.setReference}\n style={style}\n variant={variant}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={listItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectAllCheckboxState={selectAllCheckboxState}\n selectAllItem={selectAll}\n selectedItems={selectedItems}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n >\n <div\n className={classNames(\n 'eds-dropdown--multiselect__selected-items-and-input',\n {\n 'eds-dropdown--multiselect__selected-items-and-input--filled':\n hasSelectedItems,\n },\n )}\n >\n {selectedItems.length > 1 ? (\n <VisuallyHidden onClick={() => inputRef.current?.focus()}>\n {ariaLabelJumpToInput}\n </VisuallyHidden>\n ) : null}\n {selectedItems.length <= maxChips ? (\n selectedItems.map((selectedItem, index) => (\n <SelectedItemTag\n ariaLabelChosen={ariaLabelChosenSingular}\n ariaLabelRemoveSelected={ariaLabelRemoveSelected}\n disabled={disabled}\n getSelectedItemProps={getSelectedItemProps}\n index={index}\n key={\n selectedItem?.label +\n (typeof selectedItem?.value === 'string'\n ? selectedItem.value\n : '')\n }\n readOnly={readOnly}\n removeSelectedItem={() => {\n removeSelectedItem(selectedItem);\n inputRef?.current?.focus();\n }}\n selectedItem={selectedItem}\n />\n ))\n ) : (\n <SelectedItemTag\n ariaLabelRemoveSelected={labelClearAllItems}\n ariaLabelChosen=\"\"\n disabled={disabled}\n readOnly={readOnly}\n removeSelectedItem={handleOnClear}\n selectedItem={summarySelectedItems}\n />\n )}\n <input {...inputProps} />\n </div>\n <DropdownFieldAppendix\n {...toggleButtonProps}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n clearable={clearable}\n disabled={disabled || readOnly}\n onClear={handleOnClear}\n focusable={false}\n labelClearSelected={labelClearAllItems}\n isOpen={isOpen}\n itemIsSelected={selectedItems.length > 0}\n loadingText={loadingText}\n loading={loading ?? resolvedItemsLoading}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { Dispatch, SetStateAction, useLayoutEffect } from 'react';\nimport classNames from 'classnames';\nimport { useSelect } from 'downshift';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\n\nimport { BaseFormControl } from '@entur/form';\nimport { space } from '@entur/tokens';\nimport { mergeRefs, VariantType } from '@entur/utils';\n\nimport { DropdownList } from './components/DropdownList';\nimport { DropdownFieldAppendix } from './components/FieldComponents';\nimport { useResolvedItems } from './useResolvedItems';\nimport { clamp, itemToString } from './utils';\n\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type DropdownProps<ValueType> = {\n /** Tilgjengelige valg i dropdown-en */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Valgt verdi. Bruk null for ingen verdi. */\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n /** Callback ved valg som skal oppdatere selectedItem */\n onChange?: (\n selectedItem: NormalizedDropdownItemType<ValueType> | null,\n ) => void | Dispatch<\n SetStateAction<NormalizedDropdownItemType<ValueType> | null>\n >;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** Placeholder-tekst når ingenting er satt */\n placeholder?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default false\n */\n clearable?: boolean;\n /** Velg det markerte elementet når brukeren \"tab-er\" seg vekk fra komponenten/input-feltet */\n selectOnTab?: boolean;\n /** Deaktiver dropdown-en */\n disabled?: boolean;\n /** Setter dropdown-en i read-only modus */\n readOnly?: boolean;\n /** Hvilken valideringsvariant som gjelder */\n variant?: VariantType | typeof error | typeof info;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Tekst eller ikon som kommer først i dropdown-feltet */\n prepend?: React.ReactNode;\n /** */\n loading?: boolean;\n /** En tekst som beskriver hva som skjer når man venter på items\n * @default 'Laster inn …'\n */\n loadingText?: string;\n /** Tekst som kommer opp når det ikke er noe elementer å vise\n * @default \"Ingen tilgjengelige valg …\"\n */\n noMatchesText?: string;\n /** Om man skal ha mulighet for å nullstille Dropdown-en\n * @default \"fjern valgt\"\n */\n labelClearSelectedItem?: string;\n /** En tooltip som gir ekstra info om inputfeltet */\n labelTooltip?: React.ReactNode;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n /** Ekstra klassenavn */\n className?: string;\n /** Styling som sendes ned til Dropdown-lista */\n listStyle?: { [key: string]: any };\n /** Styling for Dropdown-en */\n style?: { [key: string]: any };\n /** Tekst for skjemleser for knapp som lukker listen med valg\n * @default \"Lukk liste med valg\"\n */\n ariaLabelCloseList?: string;\n /** Tekst for skjemleser for knapp som åpner listen med valg\n * @default \"Åpne liste med valg\"\n */\n ariaLabelOpenList?: string;\n /** Ord for at et element er valgt i entall\n * eks. 'Element 1, _valgt_'\n * @default 'valgt'\n */\n ariaLabelChosenSingular?: string;\n /** Tekst for skjermleser som beskriver statusen til et element som valgt\n * @default ', valgt element, trykk for å fjerne'\n */\n ariaLabelSelectedItem?: string;\n};\n\nexport const Dropdown = React.forwardRef(\n <ValueType extends NonNullable<any>>(\n {\n ariaLabelChosenSingular,\n ariaLabelCloseList = 'Lukk liste med valg',\n ariaLabelOpenList = 'Åpne liste med valg',\n ariaLabelSelectedItem,\n className,\n clearable,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items: initialItems,\n label,\n labelClearSelectedItem = 'fjern valgt',\n labelTooltip,\n listStyle,\n loading,\n loadingText = 'Laster resultater …',\n noMatchesText = 'Ingen tilgjengelige valg …',\n onChange,\n placeholder,\n prepend,\n readOnly = false,\n selectedItem,\n selectOnTab = false,\n style,\n variant = 'information',\n ...rest\n }: DropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLDivElement>,\n ) => {\n const { items: normalizedItems, loading: resolvedItemsLoading } =\n useResolvedItems(initialItems);\n const isFilled = selectedItem !== null || placeholder !== undefined;\n const {\n isOpen,\n getItemProps,\n getLabelProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n selectItem,\n reset,\n } = useSelect({\n items: normalizedItems,\n defaultHighlightedIndex: selectedItem ? undefined : 0,\n selectedItem,\n stateReducer(state, { changes, type }) {\n const toggleButtonIsFocused =\n typeof document !== 'undefined' &&\n document.activeElement === refs.reference.current;\n\n switch (type) {\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowDown:\n case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowUp:\n if (!toggleButtonIsFocused) return { ...changes, isOpen: false };\n break;\n case useSelect.stateChangeTypes.ToggleButtonBlur:\n return { ...changes, selectedItem: state.selectedItem };\n }\n return changes;\n },\n onSelectedItemChange({ selectedItem: newSelectedItem }) {\n onChange?.(newSelectedItem);\n },\n itemToString,\n });\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles, update } = useFloating<HTMLDivElement>({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(space.extraSmall2),\n shift({ padding: space.extraSmall }),\n size({\n apply({ elements, availableHeight }) {\n elements.floating.style.setProperty(\n '--list-max-height',\n `${clamp(10 * 16, availableHeight, 20 * 16)}px`,\n );\n },\n }),\n flip({ fallbackStrategy: 'initialPlacement' }),\n ],\n });\n\n // Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside\n // the useFloating hook but this requires the floating element to be conditionally rendered.\n // Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly\n // spread to the component. We therefor use this useLayoutEffect to update position. See https://floating-ui.com/docs/autoupdate#usage\n useLayoutEffect(() => {\n if (isOpen && refs.reference.current && refs.floating.current) {\n return autoUpdate(\n refs.reference.current,\n refs.floating.current,\n update,\n );\n }\n }, [isOpen, refs.reference, refs.floating, update]);\n\n const handleOnClear = () => {\n refs.reference.current?.focus();\n reset();\n };\n\n const labelProps = getLabelProps({\n isFilled,\n });\n const toggleButtonProps = getToggleButtonProps({\n ref: mergeRefs(ref, refs.setReference),\n 'aria-disabled': disabled,\n 'aria-label': disabled ? 'Disabled dropdown' : '',\n disabled: disabled,\n readOnly: readOnly,\n label: label,\n labelId: labelProps?.id,\n tabIndex: disabled || readOnly ? -1 : 0,\n onKeyDown(e) {\n if (isOpen && e.key === 'Tab') {\n const highlitedItem = normalizedItems[highlightedIndex];\n // we don't want to clear selection with tab\n if (selectOnTab && highlitedItem && highlitedItem !== selectedItem) {\n selectItem(highlitedItem);\n }\n } else if (!isOpen && e.key === 'Escape' && clearable) {\n reset();\n }\n },\n });\n const menuProps = getMenuProps({\n refKey: 'innerRef',\n ref: refs.setFloating,\n style: listStyle,\n });\n\n return (\n <BaseFormControl\n className={classNames('eds-dropdown', className, {\n 'eds-dropdown--has-tooltip': labelTooltip !== undefined,\n })}\n disableLabelAnimation={disableLabelAnimation}\n feedback={feedback}\n labelProps={labelProps}\n labelTooltip={labelTooltip}\n prepend={prepend}\n style={style}\n variant={variant}\n {...toggleButtonProps}\n after={\n <DropdownList\n ariaLabelChosenSingular={ariaLabelChosenSingular}\n ariaLabelSelectedItem={ariaLabelSelectedItem}\n floatingStyles={floatingStyles}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n isOpen={isOpen}\n listItems={normalizedItems}\n loading={loading ?? resolvedItemsLoading}\n loadingText={loadingText}\n noMatchesText={noMatchesText}\n selectedItems={selectedItem !== null ? [selectedItem] : []}\n readOnly={readOnly}\n {...menuProps}\n />\n }\n {...rest}\n // Append is not supported as of now\n append={undefined}\n >\n <div className=\"eds-dropdown__selected-item\">\n {selectedItem?.label ?? (\n <div\n className={classNames(\n 'eds-dropdown__selected-item__placeholder',\n {\n 'eds-dropdown__selected-item__placeholder--readonly':\n readOnly,\n },\n )}\n >\n {placeholder}\n </div>\n )}\n </div>\n <DropdownFieldAppendix\n aria-busy={!(loading ?? resolvedItemsLoading) ? undefined : 'true'}\n aria-expanded={isOpen}\n clearable={clearable}\n onClear={handleOnClear}\n disabled={disabled || readOnly}\n focusable={false}\n labelClearSelected={labelClearSelectedItem}\n isOpen={isOpen}\n itemIsSelected={selectedItem !== null}\n ariaLabelCloseList={ariaLabelCloseList}\n ariaLabelOpenList={ariaLabelOpenList}\n loading={false}\n loadingText={undefined}\n />\n </BaseFormControl>\n );\n },\n);\n","import React, { forwardRef } from 'react';\nimport { BaseFormControl } from '@entur/form';\nimport { DownArrowIcon } from '@entur/icons';\nimport { LoadingDots } from '@entur/loader';\nimport { useRandomId, VariantType } from '@entur/utils';\n\nimport { useResolvedItems } from './useResolvedItems';\nimport {\n NormalizedDropdownItemType,\n PotentiallyAsyncDropdownItemType,\n} from './types';\n\nimport './Dropdown.scss';\n\n/** @deprecated use variant=\"information\" instead */\nconst info = 'info';\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type NativeDropdownProps<ValueType> = {\n /** Ekstra klassenavn */\n className?: string;\n /**\n * For å deaktivere dropdow-nen\n * @default false\n **/\n disabled?: boolean;\n /** Valideringsmelding, brukes sammen med `variant` */\n feedback?: string;\n /** Alle valg for dropdown-en å ha */\n items: PotentiallyAsyncDropdownItemType<ValueType>;\n /** Beskrivende tekst som forklarer feltet */\n label: string;\n /** En callback for endringer av value\n * Obs: merk at parameter her denne ikke er samme som i en HTML select.\n * Bruk { target } hvis du trenger info om select-elementet som ble trykket på\n */\n onChange?: ({\n value,\n selectedItem,\n target,\n }: {\n value: string;\n selectedItem: NormalizedDropdownItemType<ValueType> | null;\n target: EventTarget & HTMLSelectElement;\n }) => void;\n /** Tekst eller ikon som kommer før dropdown-en */\n prepend?: React.ReactNode;\n /**\n * Setter dropdown-en i read-only modus\n * @default false\n **/\n readOnly?: boolean;\n /** Den valgte verdien som NormalizedDropdownItemType\n * (Brukes når komponenten er 'controlled')\n */\n selectedItem?: NormalizedDropdownItemType<ValueType> | null;\n /** Den valgte verdien som sting\n * (Brukes når komponenten er 'controlled)\n */\n value?: string;\n /** Hvilken valideringsvariant som gjelder*/\n variant?: VariantType | typeof error | typeof info;\n /** Plasserer labelen statisk på toppen av inputfeltet\n * @default false\n */\n disableLabelAnimation?: boolean;\n [key: string]: any;\n};\n\nexport const NativeDropdown = forwardRef(\n <ValueType extends string | number>(\n {\n className,\n disabled = false,\n disableLabelAnimation,\n feedback,\n items,\n label,\n loadingText,\n onChange,\n prepend,\n readOnly = false,\n selectedItem,\n style,\n value,\n variant,\n ...rest\n }: NativeDropdownProps<ValueType>,\n ref: React.ForwardedRef<HTMLSelectElement>,\n ) => {\n const { items: normalizedItems, loading } =\n useResolvedItems<ValueType>(items);\n const nativeDropdownId = useRandomId('eds-dropdown-native');\n\n return (\n <BaseFormControl\n disabled={disabled}\n readOnly={readOnly}\n prepend={prepend}\n append={\n <FieldAppend\n hidden={disabled || readOnly}\n loading={loading}\n loadingText={loadingText}\n />\n }\n className={className}\n style={style}\n label={label}\n labelId={nativeDropdownId}\n variant={variant}\n feedback={feedback}\n disableLabelAnimation={disableLabelAnimation}\n isFilled={true}\n >\n <select\n aria-invalid={variant === 'negative' || variant === error}\n aria-labelledby={nativeDropdownId}\n aria-busy={loading}\n className=\"eds-form-control eds-dropdown--native\"\n disabled={disabled || readOnly}\n onChange={event => {\n onChange?.({\n value: event.target.value,\n selectedItem:\n normalizedItems.find(\n item => item.value === event.target.value,\n ) ?? null,\n target: event.target,\n });\n }}\n value={value ?? selectedItem?.value ?? undefined}\n ref={ref}\n {...rest}\n >\n {normalizedItems.map(item => (\n <option key={item.value} value={item.value}>\n {item.label}\n </option>\n ))}\n </select>\n </BaseFormControl>\n );\n },\n);\n\nconst FieldAppend = ({\n loading,\n loadingText,\n hidden,\n}: {\n loading: boolean;\n loadingText?: string;\n hidden: boolean;\n}) => {\n if (loading) {\n return (\n <div className=\"eds-dropdown-native__loading-dots\">\n <LoadingDots aria-label={loadingText} />\n </div>\n );\n }\n if (hidden) {\n return <></>;\n }\n return <DownArrowIcon inline />;\n};\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');\n\nexport type { NormalizedDropdownItemType, DropdownItemType } from './types';\n\nexport * from './SearchableDropdown';\nexport * from './MultiSelect';\nexport * from './Dropdown';\nexport * from './NativeDropdown';\nexport * from './types';\n"],"names":["jsxs","Fragment","jsx","Checkbox","VisuallyHidden","createElement","TagChip","forwardRef","IconButton","DownArrowIcon","LoadingDots","Tooltip","CloseSmallIcon","error","useDebounce","useMemo","useState","useRef","inputValue","useEffect","useCallback","useCombobox","highlightedIndex","useFloating","offset","space","shift","size","flip","useLayoutEffect","autoUpdate","mergeRefs","BaseFormControl","useRandomId","useMultipleSelection","useSelect","warnAboutMissingStyles"],"mappings":"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"}
|