"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
function _export(target, all) {
    for(var name in all)Object.defineProperty(target, name, {
        enumerable: true,
        get: Object.getOwnPropertyDescriptor(all, name).get
    });
}
_export(exports, {
    get comboboxConfig () {
        return comboboxConfig;
    },
    get comboboxRoot () {
        return comboboxRoot;
    }
});
var _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
var _utils = require("../../../utils");
var _hooks = require("../../../hooks");
var _utils1 = require("./utils");
var _Comboboxtokens = require("./Combobox.tokens");
var _FloatingPopover = require("./FloatingPopover");
var _useKeyboardNavigation = require("./hooks/useKeyboardNavigation");
var _ui = require("./ui");
var _reducers = require("./reducers");
var _getPathMaps = require("./hooks/getPathMaps");
var _Comboboxstyles = require("./Combobox.styles");
var _base = require("./variations/_view/base");
var _base1 = require("./variations/_size/base");
var _SelectNative = require("./ui/SelectNative/SelectNative");
var _Comboboxcontext = require("./Combobox.context");
function _array_like_to_array(arr, len) {
    if (len == null || len > arr.length) len = arr.length;
    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
    return arr2;
}
function _array_with_holes(arr) {
    if (Array.isArray(arr)) return arr;
}
function _define_property(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}
function _getRequireWildcardCache(nodeInterop) {
    if (typeof WeakMap !== "function") return null;
    var cacheBabelInterop = new WeakMap();
    var cacheNodeInterop = new WeakMap();
    return (_getRequireWildcardCache = function(nodeInterop) {
        return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
    })(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
    if (!nodeInterop && obj && obj.__esModule) {
        return obj;
    }
    if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
        return {
            default: obj
        };
    }
    var cache = _getRequireWildcardCache(nodeInterop);
    if (cache && cache.has(obj)) {
        return cache.get(obj);
    }
    var newObj = {
        __proto__: null
    };
    var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
    for(var key in obj){
        if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
            var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
            if (desc && (desc.get || desc.set)) {
                Object.defineProperty(newObj, key, desc);
            } else {
                newObj[key] = obj[key];
            }
        }
    }
    newObj.default = obj;
    if (cache) {
        cache.set(obj, newObj);
    }
    return newObj;
}
function _iterable_to_array_limit(arr, i) {
    var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
    if (_i == null) return;
    var _arr = [];
    var _n = true;
    var _d = false;
    var _s, _e;
    try {
        for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
            _arr.push(_s.value);
            if (i && _arr.length === i) break;
        }
    } catch (err) {
        _d = true;
        _e = err;
    } finally{
        try {
            if (!_n && _i["return"] != null) _i["return"]();
        } finally{
            if (_d) throw _e;
        }
    }
    return _arr;
}
function _non_iterable_rest() {
    throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _object_spread(target) {
    for(var i = 1; i < arguments.length; i++){
        var source = arguments[i] != null ? arguments[i] : {};
        var ownKeys = Object.keys(source);
        if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
                return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
        }
        ownKeys.forEach(function(key) {
            _define_property(target, key, source[key]);
        });
    }
    return target;
}
function ownKeys(object, enumerableOnly) {
    var keys = Object.keys(object);
    if (Object.getOwnPropertySymbols) {
        var symbols = Object.getOwnPropertySymbols(object);
        if (enumerableOnly) {
            symbols = symbols.filter(function(sym) {
                return Object.getOwnPropertyDescriptor(object, sym).enumerable;
            });
        }
        keys.push.apply(keys, symbols);
    }
    return keys;
}
function _object_spread_props(target, source) {
    source = source != null ? source : {};
    if (Object.getOwnPropertyDescriptors) {
        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
    } else {
        ownKeys(Object(source)).forEach(function(key) {
            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
        });
    }
    return target;
}
function _object_without_properties(source, excluded) {
    if (source == null) return {};
    var target = {}, sourceKeys, key, i;
    if (typeof Reflect !== "undefined" && Reflect.ownKeys) {
        sourceKeys = Reflect.ownKeys(source);
        for(i = 0; i < sourceKeys.length; i++){
            key = sourceKeys[i];
            if (excluded.indexOf(key) >= 0) continue;
            if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
            target[key] = source[key];
        }
        return target;
    }
    target = _object_without_properties_loose(source, excluded);
    if (Object.getOwnPropertySymbols) {
        sourceKeys = Object.getOwnPropertySymbols(source);
        for(i = 0; i < sourceKeys.length; i++){
            key = sourceKeys[i];
            if (excluded.indexOf(key) >= 0) continue;
            if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
            target[key] = source[key];
        }
    }
    return target;
}
function _object_without_properties_loose(source, excluded) {
    if (source == null) return {};
    var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;
    for(i = 0; i < sourceKeys.length; i++){
        key = sourceKeys[i];
        if (excluded.indexOf(key) >= 0) continue;
        if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
        target[key] = source[key];
    }
    return target;
}
function _sliced_to_array(arr, i) {
    return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
}
function _type_of(obj) {
    "@swc/helpers - typeof";
    return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
}
function _unsupported_iterable_to_array(o, minLen) {
    if (!o) return;
    if (typeof o === "string") return _array_like_to_array(o, minLen);
    var n = Object.prototype.toString.call(o).slice(8, -1);
    if (n === "Object" && o.constructor) n = o.constructor.name;
    if (n === "Map" || n === "Set") return Array.from(n);
    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
}
var comboboxRoot = function comboboxRoot(Root) {
    return /*#__PURE__*/ (0, _react.forwardRef)(function(props, ref) {
        var _getItemByFocused;
        var name = props.name, multiple = props.multiple, outerValue = props.value, outerOnChange = props.onChange, defaultValue = props.defaultValue, isTargetAmount = props.isTargetAmount, targetAmount = props.targetAmount, items = props.items, _props_treeView = props.treeView, treeView = _props_treeView === void 0 ? false : _props_treeView, _props_arrowPlacement = props.arrowPlacement, arrowPlacement = _props_arrowPlacement === void 0 ? 'left' : _props_arrowPlacement, _props_placement = props.placement, placement = _props_placement === void 0 ? 'bottom-start' : _props_placement, label = props.label, placeholder = props.placeholder, helperText = props.helperText, contentLeft = props.contentLeft, contentRight = props.contentRight, textBefore = props.textBefore, textAfter = props.textAfter, _props_variant = props.variant, variant = _props_variant === void 0 ? 'normal' : _props_variant, listOverflow = props.listOverflow, listHeight = props.listHeight, listMaxHeight = props.listMaxHeight, listWidth = props.listWidth, portal = props.portal, renderItem = props.renderItem, renderSelectionIcon = props.renderSelectionIcon, view = props.view, size = props.size, labelPlacement = props.labelPlacement, keepPlaceholder = props.keepPlaceholder, _props_readOnly = props.readOnly, readOnly = _props_readOnly === void 0 ? false : _props_readOnly, _props_disabled = props.disabled, disabled = _props_disabled === void 0 ? false : _props_disabled, _props_alwaysOpened = props.alwaysOpened, alwaysOpened = _props_alwaysOpened === void 0 ? false : _props_alwaysOpened, filter = props.filter, outerCloseAfterSelect = props.closeAfterSelect, renderValue = props.renderValue, zIndex = props.zIndex, beforeList = props.beforeList, afterList = props.afterList, _props_virtual = props.virtual, virtual = _props_virtual === void 0 ? false : _props_virtual, hintView = props.hintView, hintSize = props.hintSize, emptyStateDescription = props.emptyStateDescription, onChangeValue = props.onChangeValue, filterValue = props.filterValue, onScroll = props.onScroll, onToggle = props.onToggle, _props_mode = props.mode, mode = _props_mode === void 0 ? 'default' : _props_mode, _props_chipClickArea = props.chipClickArea, chipClickArea = _props_chipClickArea === void 0 ? 'full' : _props_chipClickArea, shift = props.shift, flip = props.flip, singleLine = props.singleLine, // @ts-ignore
        _offset = props._offset, rest = _object_without_properties(props, [
            "name",
            "multiple",
            "value",
            "onChange",
            "defaultValue",
            "isTargetAmount",
            "targetAmount",
            "items",
            "treeView",
            "arrowPlacement",
            "placement",
            "label",
            "placeholder",
            "helperText",
            "contentLeft",
            "contentRight",
            "textBefore",
            "textAfter",
            "variant",
            "listOverflow",
            "listHeight",
            "listMaxHeight",
            "listWidth",
            "portal",
            "renderItem",
            "renderSelectionIcon",
            "view",
            "size",
            "labelPlacement",
            "keepPlaceholder",
            "readOnly",
            "disabled",
            "alwaysOpened",
            "filter",
            "closeAfterSelect",
            "renderValue",
            "zIndex",
            "beforeList",
            "afterList",
            "virtual",
            "hintView",
            "hintSize",
            "emptyStateDescription",
            "onChangeValue",
            "filterValue",
            "onScroll",
            "onToggle",
            "mode",
            "chipClickArea",
            "shift",
            "flip",
            "singleLine",
            "_offset"
        ]);
        var transformedItems = (0, _react.useMemo)(function() {
            return (0, _utils1.initialItemsTransform)(items || []);
        }, [
            items
        ]);
        // Создаем структуры для быстрой работы с деревом
        var _useMemo = _sliced_to_array((0, _react.useMemo)(function() {
            return (0, _getPathMaps.getTreeMaps)(transformedItems);
        }, [
            items
        ]), 3), valueToCheckedMap = _useMemo[0], valueToItemMap = _useMemo[1], valueToPathMap = _useMemo[2];
        // Состояние поля поиска в target
        var _useState = _sliced_to_array((0, _react.useState)((0, _utils1.getTextValue)(multiple, outerValue, valueToItemMap, renderValue)), 2), textValue = _useState[0], setTextValueState = _useState[1];
        // Внутреннее состояние выбранных элементов
        var _useState1 = _sliced_to_array((0, _react.useState)(multiple ? [] : ''), 2), internalValue = _useState1[0], setInternalValue = _useState1[1];
        var value = outerValue !== null && outerValue !== undefined ? outerValue : internalValue;
        var rootRef = (0, _react.useRef)(null);
        var inputRef = (0, _react.useRef)(null);
        var floatingPopoverRef = (0, _react.useRef)(null);
        var inputForkRef = (0, _hooks.useForkRef)(inputRef, ref);
        var listWrapperRef = (0, _react.useRef)(null);
        var treeId = (0, _utils.safeUseId)();
        var filterCb = filter || _utils1.defaultFilter;
        var filteredItems = (0, _react.useMemo)(function() {
            return (0, _utils1.filterItems)(transformedItems, textValue, (0, _utils1.getTextValue)(multiple, value, valueToItemMap, renderValue), filter);
        }, [
            transformedItems,
            textValue,
            filter,
            value
        ]);
        var _useMemo1 = _sliced_to_array((0, _react.useMemo)(function() {
            return (0, _getPathMaps.getPathMap)(filteredItems);
        }, [
            filteredItems,
            textValue
        ]), 2), pathMap = _useMemo1[0], focusedToValueMap = _useMemo1[1];
        var initialPath = alwaysOpened ? [
            'root'
        ] : [];
        // Состояния дерева элементов
        var _useReducer = _sliced_to_array((0, _react.useReducer)(_reducers.pathReducer, initialPath), 2), path = _useReducer[0], dispatchPath = _useReducer[1];
        var _useReducer1 = _sliced_to_array((0, _react.useReducer)(_reducers.focusedPathReducer, []), 2), focusedPath = _useReducer1[0], dispatchFocusedPath = _useReducer1[1];
        var _useState2 = _sliced_to_array((0, _react.useState)(valueToCheckedMap), 2), checked = _useState2[0], setChecked = _useState2[1];
        var _useReducer2 = _sliced_to_array((0, _react.useReducer)(_reducers.treePathReducer, {}), 2), treePath = _useReducer2[0], dispatchTreePath = _useReducer2[1];
        var isCurrentListOpen = Boolean(path[0]);
        var activeDescendantItemValue = ((_getItemByFocused = (0, _useKeyboardNavigation.getItemByFocused)(focusedPath, focusedToValueMap)) === null || _getItemByFocused === void 0 ? void 0 : _getItemByFocused.value) || '';
        var withArrowInverse = isCurrentListOpen ? _Comboboxtokens.classes.arrowInverse : undefined;
        var closeAfterSelect = outerCloseAfterSelect !== null && outerCloseAfterSelect !== void 0 ? outerCloseAfterSelect : !multiple;
        var setTextValue = function setTextValue(newTextValue) {
            /* Если значение поля ввода не изменилось, то выходим из функции */ if (newTextValue === textValue) {
                return;
            }
            setTextValueState(newTextValue);
            if (onChangeValue) {
                onChangeValue(newTextValue);
            }
        };
        /* Логика работы при клике за пределами выпадающего списка */ (0, _hooks.useOutsideClick)(function() {
            if (!isCurrentListOpen || alwaysOpened) {
                return;
            }
            handleListToggle(false);
        }, [
            floatingPopoverRef,
            listWrapperRef
        ]);
        // Эта функция срабатывает при изменении Combobox и
        // при изменении нативного Select для формы (срабатывает только после изменения internalValue и рендера).
        var onChange = function onChange(newValue, item) {
            // Условие для отправки изменений наружу
            if (props.onChange) {
                // Условие для отправки, если комбобокс используется без формы.
                if (!props.name && (typeof newValue === 'string' || Array.isArray(newValue))) {
                    props.onChange(newValue, item || null);
                }
                // Условие для отправки, если комбобокс используется с формой.
                if (props.name && (typeof newValue === "undefined" ? "undefined" : _type_of(newValue)) === 'object' && !Array.isArray(newValue)) {
                    props.onChange(newValue);
                }
            }
            // Условие для изменения внутреннего значения (только если newValue строка или массив строк).
            if (typeof newValue === 'string' || Array.isArray(newValue)) {
                setInternalValue(newValue);
            }
        };
        var handleClickArrow = function handleClickArrow(e) {
            handleListToggle(!isCurrentListOpen);
            // При клике на иконку закрытия фокус не должен становиться в инпут.
            e.stopPropagation();
        };
        // Обработчик изменения значения в инпуте
        var handleTextValueChange = function handleTextValueChange(e) {
            if (!filterValue || filterValue(e.target.value)) {
                setTextValue(e.target.value);
            }
            dispatchPath({
                type: 'opened_first_level'
            });
            dispatchFocusedPath({
                type: 'reset'
            });
        };
        // Обработчик чипов
        var handleChipClick = function handleChipClick(chip) {
            if (!Array.isArray(value)) return;
            if (isTargetAmount) {
                // При закрытии чипа в режиме isTargetAmount в value оставляем только disabled-элементы
                onChange(value.filter(function(val) {
                    var _valueToItemMap_get;
                    return valueToItemMap === null || valueToItemMap === void 0 ? void 0 : (_valueToItemMap_get = valueToItemMap.get(val)) === null || _valueToItemMap_get === void 0 ? void 0 : _valueToItemMap_get.disabled;
                }), null);
            } else {
                onChange(value.filter(function(val) {
                    return val !== chip.value;
                }), valueToItemMap.get(chip.value) || {
                    value: chip.value,
                    label: chip.label
                });
            }
        };
        // Обработчик открытия/закрытия выпадающего списка
        var handleListToggle = function handleListToggle(opened) {
            if (disabled || readOnly) {
                return;
            }
            if (opened) {
                dispatchPath({
                    type: 'opened_first_level'
                });
            } else {
                var _rootRef_current;
                dispatchFocusedPath({
                    type: 'reset'
                });
                dispatchPath({
                    type: 'reset'
                });
                dispatchTreePath({
                    type: 'reset'
                });
                // Возвращаем актуальное значение поля ввода после закрытия выпадающего списка.
                setTextValue((0, _utils1.getTextValue)(multiple, value, valueToItemMap, renderValue));
                // Скроллим чипы к левому краю при закрытии компонента
                var el = rootRef === null || rootRef === void 0 ? void 0 : (_rootRef_current = rootRef.current) === null || _rootRef_current === void 0 ? void 0 : _rootRef_current.querySelector('.input-scrollable-wrapper');
                if (multiple && value.length > 0 && el) {
                    el.scrollLeft = 0;
                }
            }
            if (onToggle) {
                onToggle(opened);
            }
        };
        // Обработчик выбора чекбоксов (только при multiple)
        var handleCheckboxChange = function handleCheckboxChange(item) {
            if (!multiple) {
                return;
            }
            var checkedCopy = new Map(checked);
            switch(checkedCopy.get(item.value)){
                // Если чекбокс в состоянии indeterminate
                case 'indeterminate':
                    {
                        (0, _utils1.updateDescendants)(item, checkedCopy, true, valueToItemMap);
                        break;
                    }
                // Если чекбокс в состоянии checked
                case true:
                    {
                        (0, _utils1.updateDescendants)(item, checkedCopy, false, valueToItemMap);
                        checkedCopy.set(item.value, false);
                        break;
                    }
                // Если чекбокс в состоянии unchecked
                case false:
                    {
                        (0, _utils1.updateDescendants)(item, checkedCopy, true, valueToItemMap);
                        checkedCopy.set(item.value, true);
                        break;
                    }
                default:
                    {
                        break;
                    }
            }
            var newValues = [];
            valueToItemMap.forEach(function(item, key) {
                if (checkedCopy.get(key)) {
                    newValues.push(item.value);
                }
            });
            // Оставляем values, которых нет в items.
            if (Array.isArray(value)) {
                value.forEach(function(val) {
                    if (!valueToItemMap.has(val)) {
                        newValues.push(val);
                    }
                });
            }
            if (!alwaysOpened && closeAfterSelect) {
                dispatchPath({
                    type: 'reset'
                });
                dispatchFocusedPath({
                    type: 'reset'
                });
                dispatchTreePath({
                    type: 'reset'
                });
            }
            if (onChange) {
                onChange(newValues, item);
            }
        };
        // Обработчик клика по айтему выпадающего списка
        var handleItemClick = function handleItemClick(item, e) {
            if (!(0, _utils.isEmpty)(item === null || item === void 0 ? void 0 : item.items)) {
                return;
            }
            if (multiple) {
                handleCheckboxChange(item);
                return;
            }
            if (e) {
                e.stopPropagation();
            }
            var isCurrentChecked = checked.get(item.value);
            if (!alwaysOpened && closeAfterSelect) {
                dispatchPath({
                    type: 'reset'
                });
                dispatchFocusedPath({
                    type: 'reset'
                });
                dispatchTreePath({
                    type: 'reset'
                });
            }
            // Закрываем список, если элемент уже выбран.
            if (mode === 'radio' && isCurrentChecked) {
                return;
            }
            if (onChange) {
                onChange(isCurrentChecked ? '' : item.value, item);
            }
        };
        // Обработчик клика на таргет
        var handleTargetClick = function handleTargetClick() {
            if (!isCurrentListOpen) {
                handleListToggle(true);
            }
        };
        var getChips = function getChips() {
            if (multiple && Array.isArray(value)) {
                if (value.length === 0) return [];
                if (isTargetAmount) {
                    return [
                        {
                            value: '_removeAll',
                            label: "Выбрано ".concat(targetAmount || value.length),
                            disabled: value.every(function(val) {
                                var _valueToItemMap_get;
                                return valueToItemMap === null || valueToItemMap === void 0 ? void 0 : (_valueToItemMap_get = valueToItemMap.get(val)) === null || _valueToItemMap_get === void 0 ? void 0 : _valueToItemMap_get.disabled;
                            })
                        }
                    ];
                }
                return value.map(function(value) {
                    var _valueToItemMap_get, _valueToItemMap_get1;
                    var currentLabel = renderValue ? renderValue(valueToItemMap.get(value) || {
                        value: value,
                        label: value
                    }) : ((_valueToItemMap_get = valueToItemMap.get(value)) === null || _valueToItemMap_get === void 0 ? void 0 : _valueToItemMap_get.label) || value.toString();
                    return {
                        value: value,
                        label: currentLabel,
                        disabled: ((_valueToItemMap_get1 = valueToItemMap.get(value)) === null || _valueToItemMap_get1 === void 0 ? void 0 : _valueToItemMap_get1.disabled) || false
                    };
                });
            }
            return [];
        };
        var handlePressDown = function handlePressDown(item, e) {
            if ((0, _utils.isEmpty)(item.items)) {
                handleItemClick(item, e);
            } else if (multiple) {
                handleCheckboxChange(item);
            }
        };
        var helperTextStopPropagation = function helperTextStopPropagation(event) {
            event.stopPropagation();
        };
        var onKeyDown = (0, _useKeyboardNavigation.useKeyNavigation)({
            focusedPath: focusedPath,
            dispatchFocusedPath: dispatchFocusedPath,
            path: path,
            dispatchPath: dispatchPath,
            pathMap: pathMap,
            focusedToValueMap: focusedToValueMap,
            handleListToggle: handleListToggle,
            handlePressDown: handlePressDown,
            setTextValue: setTextValue,
            multiple: multiple,
            value: value,
            textValue: textValue,
            valueToItemMap: valueToItemMap,
            treePath: treePath,
            dispatchTreePath: dispatchTreePath,
            treeView: treeView,
            valueToPathMap: valueToPathMap,
            items: filteredItems
        }).onKeyDown;
        // В данном эффекте мы следим за изменениями value снаружи и вносим коррективы в дерево чекбоксов.
        // Пример: когда юзер очистил value извне, тогда нужно пройтись по элементам и выключить все чекбоксы.
        (0, _react.useLayoutEffect)(function() {
            var checkedCopy = new Map(valueToCheckedMap);
            checkedCopy.forEach(function(_, key) {
                checkedCopy.set(key, false);
            });
            if (!(0, _utils.isEmpty)(value)) {
                if (Array.isArray(value)) {
                    value.forEach(function(val) {
                        // Только если value находится в items, т.к. value может и не существовать в items.
                        if (valueToItemMap.has(val)) {
                            checkedCopy.set(val, true);
                            (0, _utils1.updateDescendants)(valueToItemMap.get(val), checkedCopy, true);
                            (0, _utils1.updateAncestors)(valueToItemMap.get(val), checkedCopy);
                        }
                    });
                } else {
                    // Только если value находится в items, т.к. value может и не существовать в items.
                    // eslint-disable-next-line no-lonely-if
                    if (valueToItemMap.has(value)) {
                        checkedCopy.set(value, 'done');
                        (0, _utils1.updateSingleAncestors)(valueToItemMap.get(value), checkedCopy, 'dot');
                    }
                }
            }
            setChecked(checkedCopy);
        // В deps мы кладем именно outerValue и internalValue, а не просто value.
        // Т.к. вначале нужно отфильтровать и провалидировать outerValue и результат положить в переменную.
        // А переменную, содержащую сложные типы данных, нельзя помещать в deps.
        }, [
            outerValue,
            internalValue,
            items
        ]);
        // Эффект для исключительных случаев, когда нужно обновить значение textValue при изменении items,
        // но только если значение textValue совпадает с value в item.
        (0, _react.useLayoutEffect)(function() {
            var _valueToItemMap_get;
            if (!multiple && value && ((_valueToItemMap_get = valueToItemMap.get(value)) === null || _valueToItemMap_get === void 0 ? void 0 : _valueToItemMap_get.value) === textValue) {
                var _valueToItemMap_get1;
                setTextValue(((_valueToItemMap_get1 = valueToItemMap.get(value)) === null || _valueToItemMap_get1 === void 0 ? void 0 : _valueToItemMap_get1.label) || value.toString());
            }
        }, [
            items
        ]);
        // При изменении value нужно возвращать значение в инпуте к исходному.
        (0, _hooks.useDidMountLayoutEffect)(function() {
            setTextValue((0, _utils1.getTextValue)(multiple, value, valueToItemMap, renderValue));
        }, [
            outerValue,
            internalValue
        ]);
        (0, _react.useLayoutEffect)(function() {
            if (defaultValue) {
                setInternalValue(defaultValue);
            }
        }, [
            defaultValue
        ]);
        // Эффект для раскрытия дерева при поиске.
        (0, _react.useLayoutEffect)(function() {
            if (treeView) {
                // Если поле ввода стало пустым или если пользователь выбирает элемент,
                // то скрываем все узлы дерева и выходим из эффекта.
                if (textValue === '' || textValue === (0, _utils1.getTextValue)(multiple, value, valueToItemMap, renderValue)) {
                    dispatchTreePath({
                        type: 'reset'
                    });
                    return;
                }
                // Иначе раскрываем все узлы, когда пользователь начинает вводить текст в поле ввода.
                dispatchTreePath({
                    type: 'expand_by_key',
                    value: {
                        filteredItems: filteredItems,
                        filterCb: filterCb,
                        textValue: textValue
                    }
                });
            }
        }, [
            textValue
        ]);
        return /*#__PURE__*/ _react.default.createElement(Root, {
            size: size,
            view: view,
            labelPlacement: labelPlacement,
            disabled: disabled,
            readOnly: readOnly,
            name: name,
            hintView: hintView,
            hintSize: hintSize,
            ref: rootRef
        }, name && /*#__PURE__*/ _react.default.createElement(_SelectNative.SelectNative, {
            items: valueToItemMap,
            name: name,
            value: internalValue,
            multiple: multiple,
            onChange: onChange,
            onSetValue: setInternalValue,
            ref: ref
        }), /*#__PURE__*/ _react.default.createElement("div", null, /*#__PURE__*/ _react.default.createElement(_Comboboxcontext.Context.Provider, {
            value: {
                focusedPath: focusedPath,
                checked: checked,
                multiple: multiple,
                size: size,
                handleCheckboxChange: handleCheckboxChange,
                handleItemClick: handleItemClick,
                variant: variant,
                renderItem: renderItem,
                renderSelectionIcon: renderSelectionIcon,
                treeId: treeId,
                // eslint-disable-next-line @typescript-eslint/ban-ts-comment
                // @ts-ignore
                // eslint-disable-next-line no-underscore-dangle
                _checkboxAppearance: rest._checkboxAppearance,
                treePath: treePath,
                dispatchTreePath: dispatchTreePath,
                arrowPlacement: arrowPlacement,
                valueToPathMap: valueToPathMap,
                singleLine: singleLine
            }
        }, /*#__PURE__*/ _react.default.createElement(_FloatingPopover.FloatingPopover, {
            ref: floatingPopoverRef,
            opened: isCurrentListOpen,
            placement: placement,
            portal: portal,
            listWidth: listWidth,
            offset: _offset,
            target: function target(referenceRef) {
                return /*#__PURE__*/ _react.default.createElement("div", {
                    onClick: handleTargetClick
                }, /*#__PURE__*/ _react.default.createElement(_ui.StyledTextField, _object_spread_props(_object_spread({
                    ref: name ? inputRef : inputForkRef,
                    inputWrapperRef: referenceRef,
                    value: textValue,
                    onChange: handleTextValueChange,
                    size: size,
                    view: view,
                    disabled: disabled,
                    readOnly: readOnly,
                    label: label,
                    placeholder: placeholder,
                    contentLeft: contentLeft,
                    contentRight: contentRight || contentRight !== undefined ? contentRight : /*#__PURE__*/ _react.default.createElement(_Comboboxstyles.IconArrowWrapper, {
                        disabled: disabled,
                        readOnly: readOnly,
                        onClick: handleClickArrow,
                        className: _Comboboxtokens.classes.comboboxTargetArrow
                    }, /*#__PURE__*/ _react.default.createElement(_Comboboxstyles.StyledArrow, {
                        color: "inherit",
                        size: (0, _utils1.sizeToIconSize)(size),
                        className: withArrowInverse
                    })),
                    textBefore: textBefore,
                    textAfter: textAfter,
                    onKeyDown: onKeyDown,
                    leftHelper: helperText && /*#__PURE__*/ _react.default.createElement(_Comboboxstyles.StyledLeftHelper, {
                        onClick: helperTextStopPropagation
                    }, helperText),
                    role: "combobox",
                    "aria-autocomplete": "list",
                    "aria-controls": "".concat(treeId, "_tree_level_1"),
                    "aria-expanded": isCurrentListOpen,
                    "aria-activedescendant": activeDescendantItemValue ? (0, _utils1.getItemId)(treeId, activeDescendantItemValue) : '',
                    labelPlacement: labelPlacement,
                    keepPlaceholder: keepPlaceholder
                }, multiple ? {
                    enumerationType: 'chip',
                    _chipClickArea: chipClickArea,
                    _chips: getChips(),
                    _onChipCloseClick: handleChipClick
                } : {
                    enumerationType: 'plain'
                }, rest), {
                    _onEnterDisabled: true // Пропс для отключения обработчика Enter внутри Textfield
                })));
            },
            zIndex: zIndex,
            isInner: false,
            shift: shift,
            flip: flip
        }, /*#__PURE__*/ _react.default.createElement(Root, {
            size: size,
            view: view,
            labelPlacement: labelPlacement,
            disabled: disabled,
            readOnly: readOnly,
            name: name
        }, treeView ? /*#__PURE__*/ _react.default.createElement(_ui.TreeList, {
            items: filteredItems,
            listMaxHeight: listMaxHeight || listHeight,
            onScroll: virtual ? undefined : onScroll,
            virtual: virtual,
            beforeList: beforeList,
            afterList: afterList,
            emptyStateDescription: emptyStateDescription
        }) : /*#__PURE__*/ _react.default.createElement(_Comboboxstyles.ListWrapper, {
            ref: listWrapperRef,
            listWidth: listWidth
        }, /*#__PURE__*/ _react.default.createElement(_Comboboxstyles.Ul, {
            role: "tree",
            id: "".concat(treeId, "_tree_level_1"),
            "aria-multiselectable": Boolean(multiple),
            listMaxHeight: listMaxHeight || listHeight,
            virtual: virtual,
            onScroll: virtual ? undefined : onScroll
        }, beforeList, props.multiple && props.selectAllOptions && // TODO: #2004
        /*#__PURE__*/ _react.default.createElement(_ui.SelectAll, {
            selectAllOptions: props.selectAllOptions,
            variant: variant
        }), (0, _utils.isEmpty)(filteredItems) ? /*#__PURE__*/ _react.default.createElement(_Comboboxstyles.StyledEmptyState, {
            className: _Comboboxtokens.classes.emptyStateWrapper,
            description: emptyStateDescription || 'Ничего не найдено'
        }) : /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, virtual ? /*#__PURE__*/ _react.default.createElement(_ui.VirtualList, {
            items: filteredItems,
            listMaxHeight: listMaxHeight || listHeight,
            onScroll: onScroll
        }) : filteredItems.map(function(item, index) {
            return /*#__PURE__*/ _react.default.createElement(_ui.Inner, {
                key: "".concat(index, "/0"),
                item: item,
                currentLevel: 0,
                path: path,
                dispatchPath: dispatchPath,
                index: index,
                listWidth: listWidth,
                portal: listWrapperRef,
                shift: shift,
                flip: flip
            });
        })), afterList)))))));
    });
};
var comboboxConfig = {
    name: 'Select',
    tag: 'div',
    layout: comboboxRoot,
    base: _Comboboxstyles.base,
    variations: {
        view: {
            css: _base.base
        },
        size: {
            css: _base1.base
        },
        readOnly: {
            css: _base1.base
        }
    },
    defaults: {
        view: 'default',
        size: 'm',
        labelPlacement: 'outer'
    }
};
