{"version":3,"file":"Combobox.cjs","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n    type FC,\n    type FocusEvent,\n    type KeyboardEvent,\n    type MouseEvent,\n    useCallback,\n    useEffect,\n    useMemo,\n    useRef,\n    useState,\n} from \"react\";\nimport { useAnimatedHeight } from \"../../hooks/useAnimatedHeight/useAnimatedHeight.js\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport { useListNavigation } from \"../../hooks/useListNavigation/useListNavigation.js\";\nimport type { ValuePair } from \"../../utilities/valuePair.js\";\nimport { Chip } from \"../chip/Chip.js\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CheckIcon } from \"../icon/icons/CheckIcon.js\";\nimport { ArrowVerticalAnimated } from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { TooltipContent } from \"../tooltip/TooltipContent.js\";\nimport { TooltipTrigger } from \"../tooltip/TooltipTrigger.js\";\nimport type { ComboboxProps, ComboboxValuePair } from \"./types.js\";\n\nexport function getComboboxValuePair(\n    item: string | ComboboxValuePair,\n): ComboboxValuePair {\n    return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\nexport const Combobox: FC<ComboboxProps> = (props) => {\n    const {\n        \"data-size\": dataSize,\n        id,\n        placeholder,\n        items,\n        onChange,\n        onFocus,\n        onBlur,\n        value,\n        label,\n        noMatchingOption,\n        labelProps,\n        helpLabel,\n        errorLabel,\n        width,\n        name,\n        className,\n        invalid,\n        description,\n        hasTagHover,\n    } = props;\n    const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n    const labelId = `${listId}_label`;\n    const buttonId = `${listId}_button`;\n    const inputId = `${listId}_search-input`;\n\n    const [selectedValue, setSelectedValue] = useState<\n        Array<ComboboxValuePair>\n    >(value || []);\n    const [showMenu, setShowMenu] = useState<boolean>(false);\n    const [searchValue, setSearchValue] = useState<string>(\"\");\n    const [noResults, setNoResults] = useState(false);\n    const [marked, setMarked] = useState<boolean>(false);\n\n    const searchRef = useRef<HTMLInputElement>(null);\n    const inputRef = useRef<HTMLDivElement>(null);\n    const focusInsideRef = useRef(false);\n\n    useEffect(() => {\n        setSearchValue(\"\");\n        if (showMenu && searchRef.current) {\n            searchRef.current.focus();\n        }\n    }, [showMenu]);\n\n    useEffect(() => {\n        setSelectedValue((prev) => value || prev);\n    }, [value]);\n\n    // Funksjon for å stile valgt element\n    const isSelected = (option: ValuePair) => {\n        if (!selectedValue) {\n            return false;\n        }\n\n        return selectedValue.some((value) => value.value === option.value);\n    };\n\n    // Fjerne ett eller flere valg\n    const removeOption = useCallback(\n        (option: string) => {\n            return selectedValue.filter((value) => value.value !== option);\n        },\n        [selectedValue],\n    );\n\n    const onTagRemove = useCallback(\n        (\n            e:\n                | React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>\n                | React.KeyboardEvent<HTMLInputElement>,\n            option: string,\n        ) => {\n            const newValue = removeOption(option);\n            setSelectedValue(newValue);\n            onChange({\n                type: \"change\",\n                target: { name, value: option, selectedOptions: newValue },\n            });\n            e.stopPropagation();\n\n            if (newValue.length === 0) {\n                setMarked(false);\n            }\n        },\n        [removeOption, onChange, name],\n    );\n\n    // Håndtere valgt verdi i listen\n    const onItemClick = useCallback(\n        (option: string) => {\n            let newValue: Array<ValuePair>;\n\n            if (selectedValue.some((value) => value.value === option)) {\n                newValue = removeOption(option);\n            } else {\n                const item = items.find((i) => i.value === option);\n                newValue = [...selectedValue, item as ValuePair];\n            }\n            searchRef.current?.focus();\n            setSelectedValue(newValue);\n            onChange({\n                type: \"change\",\n                target: { name, value: option, selectedOptions: newValue },\n            });\n        },\n        [selectedValue, onChange, name, removeOption, items],\n    );\n\n    // Funksjon for søk\n    const onSearch = (e: {\n        target: { value: React.SetStateAction<string> };\n    }) => {\n        searchRef.current?.focus();\n        setShowMenu(true);\n        setSearchValue(e.target.value);\n    };\n\n    const options = useMemo(() => {\n        if (!searchValue) {\n            return items;\n        }\n\n        const filteredOptions = items.filter(\n            (option) =>\n                option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >=\n                0,\n        );\n\n        setNoResults(filteredOptions.length === 0);\n\n        return filteredOptions;\n    }, [searchValue, items]);\n\n    // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n    const [activeDescendant, setActiveDescendant] = useState<\n        string | undefined\n    >(options[0]?.value ? `${listId}-${options[0]?.value}` : undefined);\n\n    // Håndtere arrow-state\n    const isPointingDown = !showMenu;\n\n    // Lukk meny med ESC\n    useEffect(() => {\n        const handleEscape = (e: globalThis.KeyboardEvent) => {\n            if (e.key === \"Escape\" && showMenu) {\n                setShowMenu(false);\n            }\n        };\n        if (typeof window !== \"undefined\") {\n            window.addEventListener(\"keydown\", handleEscape);\n        }\n        return () => {\n            if (typeof window !== \"undefined\" && showMenu) {\n                window.removeEventListener(\"keydown\", handleEscape);\n            }\n        };\n    }, [showMenu]);\n\n    // Fokushåndtering\n    const handleFocusPlacement = useCallback((isOpen: boolean) => {\n        if (isOpen) {\n            if (searchRef.current) {\n                searchRef.current.focus();\n            }\n        } else {\n            if (focusInsideRef.current && inputRef.current) {\n                inputRef.current.focus();\n            }\n        }\n    }, []);\n\n    const handleFocus = useCallback(() => {\n        if (!focusInsideRef.current) {\n            if (onFocus) {\n                onFocus({\n                    type: \"change\",\n                    target: {\n                        name,\n                        value: selectedValue?.[0].value || \"\",\n                        selectedOptions: selectedValue,\n                    },\n                });\n            }\n            focusInsideRef.current = true;\n            setShowMenu(true);\n        }\n    }, [onFocus, selectedValue, name]);\n\n    const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n        onFirstVisible: handleFocusPlacement,\n        onTransitionEnd: handleFocusPlacement,\n    });\n\n    useListNavigation({ ref: dropdownRef });\n\n    const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n    const handleBlur = useCallback(\n        (\n            e: FocusEvent<\n                HTMLDivElement | HTMLInputElement | HTMLButtonElement\n            >,\n        ) => {\n            const componentRootElement = componentRootElementRef.current;\n            const nextFocusIsInsideComponent = componentRootElement?.contains(\n                e.relatedTarget as Node,\n            );\n            if (!nextFocusIsInsideComponent) {\n                setSearchValue(\"\");\n\n                if (onBlur) {\n                    onBlur({\n                        type: \"blur\",\n                        target: {\n                            name,\n                            value: selectedValue?.[0]?.value || \"\",\n                            selectedOptions: selectedValue,\n                        },\n                    });\n                    inputRef.current?.dispatchEvent(\n                        new Event(\"focusout\", { bubbles: true }),\n                    );\n                }\n                focusInsideRef.current = false;\n                setShowMenu(false);\n            }\n        },\n        [onBlur, name, selectedValue],\n    );\n\n    const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n        // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n        // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n        (e.target as HTMLButtonElement).focus({ preventScroll: true });\n    }, []);\n\n    // Tastaturnavigasjon\n    const handleSearchOnKeyDown = useCallback(\n        (e: KeyboardEvent<HTMLInputElement>) => {\n            if (e.key === \"ArrowDown\") {\n                e.preventDefault();\n                e.stopPropagation();\n                const listElement = dropdownRef.current;\n                if (listElement) {\n                    listElement\n                        .querySelector<HTMLButtonElement>('[role=\"option\"]')\n                        ?.focus();\n                }\n            } else if (e.key === \"Escape\") {\n                e.preventDefault();\n                e.stopPropagation();\n                setShowMenu(false);\n            }\n\n            if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n                e.preventDefault();\n                e.stopPropagation();\n                const updatedSelectedValue = selectedValue.map((item) => ({\n                    ...item,\n                    isMarked: true,\n                }));\n                setMarked(true);\n                setSelectedValue(updatedSelectedValue);\n            } else if (e.key === \"Backspace\") {\n                e.stopPropagation();\n                setMarked(false);\n\n                // Sjekk om selectedValue er markert\n                const selectedValueIsMarked = selectedValue.some(\n                    (item) => item.isMarked,\n                );\n\n                if (selectedValueIsMarked) {\n                    const updatedSelectedValue = selectedValue.filter(\n                        (item) => !item.isMarked,\n                    );\n                    setSelectedValue(updatedSelectedValue);\n                    setSearchValue(\"\");\n                } else if (selectedValue.length > 0 && searchValue === \"\") {\n                    // Hvis ingen items er markert, fjern siste valgte item\n                    onTagRemove(\n                        e,\n                        selectedValue[selectedValue.length - 1].value,\n                    );\n                }\n            }\n        },\n        [selectedValue, searchValue, dropdownRef, onTagRemove],\n    );\n\n    const handleOptionOnKeyDown = useCallback(\n        (e: KeyboardEvent<HTMLButtonElement>) => {\n            if (e.key === \"Tab\") {\n                if (searchRef.current) {\n                    e.preventDefault();\n                    e.stopPropagation();\n\n                    if (e.shiftKey) {\n                        searchRef.current.focus();\n                    } else {\n                        setShowMenu(false);\n                        searchRef.current.focus();\n                    }\n                }\n            } else if (e.key === \"ArrowUp\") {\n                if (dropdownRef.current && searchRef.current) {\n                    // Can't be based on index since the first item might be filtered out\n                    const firstVisible = dropdownRef.current.querySelector(\n                        '[role=\"option\"]:not([hidden])',\n                    );\n                    if (\n                        e.currentTarget.id === firstVisible?.id &&\n                        searchRef.current\n                    ) {\n                        searchRef.current.focus();\n                    }\n                }\n            }\n        },\n        [dropdownRef],\n    );\n\n    const hasSelection = selectedValue.length >= 1;\n\n    const renderSelectedOption = useCallback(\n        (option: ComboboxValuePair) => (\n            <Chip\n                key={option.value}\n                data-testid=\"jkl-chip\"\n                aria-label={`Fjern ${option.tagLabel}`}\n                className={`jkl-combobox__selected-option ${\n                    marked && \"jkl-combobox__selected-option--marked\"\n                }`}\n                variant=\"input\"\n                onClick={(e) => {\n                    if (searchRef.current) {\n                        searchRef.current.focus();\n                    }\n                    onTagRemove(e, option.value);\n                }}\n                onBlur={handleBlur}\n            >\n                {option.tagLabel ? option.tagLabel : option.label}\n            </Chip>\n        ),\n        [handleBlur, onTagRemove, marked],\n    );\n\n    return (\n        <InputGroup\n            label={label}\n            id={inputId}\n            ref={componentRootElementRef}\n            data-testid=\"jkl-combobox\"\n            data-size={dataSize}\n            className={clsx(\"jkl-combobox\", className, {\n                \"jkl-combobox--invalid\": !!errorLabel || invalid,\n                \"jkl-combobox--menu-open\": showMenu,\n                \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n            })}\n            labelProps={{\n                id: labelId,\n                ...labelProps,\n            }}\n            helpLabel={helpLabel}\n            errorLabel={errorLabel}\n            description={description}\n            render={(inputProps) => (\n                <div\n                    className={clsx(\"jkl-combobox__wrapper\", {\n                        \"jkl-combobox__wrapper--active-value\": hasSelection,\n                    })}\n                    style={{ width }}\n                    tabIndex={-1}\n                    onFocus={handleFocus}\n                    onBlur={handleBlur}\n                >\n                    <div\n                        className=\"jkl-combobox__chips\"\n                        data-testid=\"jkl-combobox__chips\"\n                    >\n                        {selectedValue\n                            .map(getComboboxValuePair)\n                            .map((option) => {\n                                return hasTagHover ? (\n                                    <Tooltip key={option.value}>\n                                        <TooltipTrigger>\n                                            {renderSelectedOption(option)}\n                                        </TooltipTrigger>\n                                        <TooltipContent>\n                                            {option.label}\n                                        </TooltipContent>\n                                    </Tooltip>\n                                ) : (\n                                    renderSelectedOption(option)\n                                );\n                            })}\n                        <input\n                            {...inputProps}\n                            className=\"jkl-combobox__search-input\"\n                            onChange={onSearch}\n                            data-testid=\"jkl-combobox__search-input\"\n                            onFocus={handleFocus}\n                            onBlur={handleBlur}\n                            onKeyDown={handleSearchOnKeyDown}\n                            value={searchValue}\n                            ref={searchRef}\n                            aria-controls={listId}\n                            role=\"combobox\"\n                            aria-autocomplete=\"list\"\n                            aria-expanded={showMenu}\n                            placeholder={\n                                selectedValue.length > 0 ? \"\" : placeholder\n                            }\n                            autoComplete=\"off\"\n                        />\n                    </div>\n\n                    <div\n                        className=\"jkl-combobox__menu\"\n                        // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n                        role=\"listbox\"\n                        ref={dropdownRef}\n                        id={listId}\n                        aria-labelledby={labelId}\n                        aria-multiselectable=\"true\"\n                        aria-activedescendant={activeDescendant}\n                        onFocus={handleFocus}\n                        onBlur={handleBlur}\n                        tabIndex={-1}\n                    >\n                        {options.map((option, i) => (\n                            <button\n                                key={`${listId}-${option.value}`}\n                                type=\"button\"\n                                id={`${listId}__${option.value}`}\n                                aria-selected={isSelected(option)}\n                                // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n                                role=\"option\"\n                                value={option.value}\n                                onBlur={handleBlur}\n                                className={`jkl-combobox__option ${\n                                    isSelected(option) &&\n                                    \"jkl-combobox__option--selected\"\n                                }`}\n                                data-testid=\"jkl-combobox__option\"\n                                data-testautoid={`jkl-combobox__option-${i}`}\n                                onFocus={handleFocus}\n                                onKeyDown={handleOptionOnKeyDown}\n                                onClick={(e) => {\n                                    setActiveDescendant(\n                                        `${listId}__${option.value}`,\n                                    ); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n                                    e.stopPropagation();\n                                    onItemClick(option.value);\n                                    setSearchValue(\"\");\n                                }}\n                                onMouseOver={handleMouseOver}\n                            >\n                                {option.description ? (\n                                    <span>\n                                        {option.label}\n                                        <span className=\"jkl-combobox__option-description\">\n                                            {option.description}\n                                        </span>\n                                    </span>\n                                ) : (\n                                    option.label\n                                )}\n                                {isSelected(option) ? (\n                                    <span>\n                                        <CheckIcon />{\" \"}\n                                    </span>\n                                ) : null}\n                            </button>\n                        ))}\n                        {noResults && (\n                            <div className=\"jkl-combobox__no-option\">\n                                {noMatchingOption}\n                            </div>\n                        )}\n                    </div>\n                    <IconButton\n                        id={buttonId}\n                        onFocus={handleFocus}\n                        onBlur={handleBlur}\n                        className=\"jkl-text-input-action-button\"\n                        data-testid=\"jkl-combobox__button\"\n                        aria-label=\"Åpne meny\"\n                        aria-expanded={showMenu}\n                        aria-controls={listId}\n                        onClick={() => setShowMenu((previous) => !previous)}\n                        onMouseDown={(e) => {\n                            e.preventDefault();\n                            inputRef.current?.focus();\n                        }}\n                    >\n                        <ArrowVerticalAnimated pointingDown={isPointingDown} />\n                    </IconButton>\n                </div>\n            )}\n        />\n    );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","props","dataSize","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","name","className","invalid","description","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","isPointingDown","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","renderSelectedOption","jsx","Chip","tagLabel","variant","onClick","children","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","Tooltip","TooltipTrigger","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","CheckIcon","IconButton","previous","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}