{"version":3,"sources":["jsdelivr-header.js","/npm/@entur/dropdown@8.1.0/src/components/DropdownList.tsx","/npm/@entur/dropdown@8.1.0/src/components/FieldComponents.tsx","/npm/@entur/dropdown@8.1.0/src/useNormalizedItems.ts","/npm/@entur/dropdown@8.1.0/src/useResolvedItems.ts","/npm/@entur/dropdown@8.1.0/src/useShadowDomEnvironment.ts","/npm/@entur/dropdown@8.1.0/src/utils.ts","/npm/@entur/dropdown@8.1.0/src/SearchableDropdown.tsx","/npm/@entur/dropdown@8.1.0/src/MultiSelect.tsx","/npm/@entur/dropdown@8.1.0/src/Dropdown.tsx","/npm/@entur/dropdown@8.1.0/src/NativeDropdown.tsx","/npm/@entur/dropdown@8.1.0/src/index.tsx"],"names":[],"mappings":"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","file":"/npm/@entur/dropdown@8.1.0/dist/dropdown.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@entur/dropdown@8.1.0/dist/dropdown.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","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, RefObject } from 'react';\nimport type { Environment } from 'downshift';\n\n/**\n * Returns the active element, drilling into shadow roots.\n * `document.activeElement` stops at the shadow host — this\n * follows the chain into nested shadow roots.\n */\nexport function getActiveElement(root: Document | ShadowRoot): Element | null {\n  const active = root.activeElement;\n  if (active?.shadowRoot) {\n    return getActiveElement(active.shadowRoot);\n  }\n  return active;\n}\n\n/**\n * Creates a downshift `environment` that works inside shadow DOM.\n *\n * Downshift attaches mouse/touch listeners on `window` by default.\n * In shadow DOM, events that cross the shadow boundary have their\n * `event.target` retargeted to the shadow host, which makes\n * downshift's outside-click detection misfire and close the dropdown\n * before selections register.\n *\n * This adapter redirects downshift's event listeners to the shadow\n * root (where targets are not retargeted) and proxies\n * `document.activeElement` to return the shadow root's active\n * element instead.\n *\n * Outside shadow DOM this returns `undefined`, letting downshift\n * use its default `window` environment.\n *\n * @see https://github.com/downshift-js/downshift/issues/1622\n */\nfunction createShadowEnvironment(shadowRoot: ShadowRoot): Environment {\n  return {\n    addEventListener: shadowRoot.addEventListener.bind(shadowRoot),\n    removeEventListener: shadowRoot.removeEventListener.bind(shadowRoot),\n    Node: window.Node,\n    document: new Proxy(document, {\n      get(target, prop, receiver) {\n        if (prop === 'activeElement') {\n          return getActiveElement(shadowRoot);\n        }\n        const value = Reflect.get(target, prop, receiver);\n        return typeof value === 'function' ? value.bind(target) : value;\n      },\n    }),\n  };\n}\n\n/**\n * Hook that returns a downshift `environment` prop value.\n * Returns a shadow-DOM-aware environment when the ref element\n * lives inside a shadow root, or `undefined` otherwise.\n *\n * Must be passed to every downshift hook (`useSelect`, `useCombobox`,\n * `useMultipleSelection`) used by the component.\n *\n * @param ref – ref to any element inside the dropdown component\n */\nexport function useShadowDomEnvironment(\n  ref: RefObject<HTMLElement | null>,\n): Environment | undefined {\n  return useMemo(() => {\n    const el = ref.current;\n    if (!el) return undefined;\n\n    const root = el.getRootNode();\n    if (!(root instanceof ShadowRoot)) return undefined;\n\n    return createShadowEnvironment(root);\n    // ref.current changes from null to the DOM element after mount,\n    // which triggers recomputation. This is intentional despite being\n    // a ref — we need the environment to be created once the element\n    // is available.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [ref.current]);\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  getActiveElement,\n  useShadowDomEnvironment,\n} from './useShadowDomEnvironment';\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    const environment = useShadowDomEnvironment(inputRef);\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 ===\n        getActiveElement(\n          (inputRef.current?.getRootNode() ?? document) as\n            | Document\n            | ShadowRoot,\n        );\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      ...(environment && { environment }),\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';\nimport { useShadowDomEnvironment } from './useShadowDomEnvironment';\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    const environment = useShadowDomEnvironment(inputRef);\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      ...(environment && { environment }),\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 closing dropdown with Escape\n          case useCombobox.stateChangeTypes.InputKeyDownEscape: {\n            return resetInputState<ValueType | string>(changes);\n          }\n          // reset input value on blur, and preserve current selection\n          // to prevent downshift's default blur behavior from changing it\n          case useCombobox.stateChangeTypes.InputBlur: {\n            return resetInputState<ValueType | string>({\n              ...changes,\n              selectedItem: state.selectedItem,\n            });\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      ...(environment && { environment }),\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, {\n  Dispatch,\n  SetStateAction,\n  useLayoutEffect,\n  useRef,\n} 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';\nimport {\n  getActiveElement,\n  useShadowDomEnvironment,\n} from './useShadowDomEnvironment';\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 toggleButtonRef = useRef<HTMLDivElement>(null);\n    const environment = useShadowDomEnvironment(toggleButtonRef);\n\n    // Downshift may call stateReducer before useFloating refs are initialized, so we store them in a separate holder to avoid access before initialization\n    // eslint-disable-next-line prefer-const\n    let floatingRefs:\n      | ReturnType<typeof useFloating<HTMLDivElement>>['refs']\n      | undefined;\n\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      ...(environment && { environment }),\n      stateReducer(state, { changes, type }) {\n        const root = (toggleButtonRef.current?.getRootNode() ?? document) as\n          | Document\n          | ShadowRoot;\n        const toggleButtonIsFocused =\n          getActiveElement(root) === floatingRefs?.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 to use latest refs from floating-ui\n    floatingRefs = refs;\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, toggleButtonRef),\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"]}