{"version":3,"file":"useSelect.mjs","names":["isUndefined","isClient","isPlainObject","clamp"],"sources":["../../../../../../packages/components/select/src/useSelect.ts"],"sourcesContent":["import {\n  computed,\n  nextTick,\n  onMounted,\n  reactive,\n  ref,\n  useSlots,\n  watch,\n  watchEffect,\n} from 'vue'\nimport { clamp, findLastIndex, get, isEqual, isNil } from 'lodash-unified'\nimport { useDebounceFn, useResizeObserver } from '@vueuse/core'\nimport {\n  ValidateComponentsMap,\n  debugWarn,\n  ensureArray,\n  getEventCode,\n  isArray,\n  isClient,\n  isEmpty,\n  isFunction,\n  isIOS,\n  isNumber,\n  isObject,\n  isPlainObject,\n  isUndefined,\n  scrollIntoView,\n} from '@element-plus/utils'\nimport {\n  CHANGE_EVENT,\n  EVENT_CODE,\n  MINIMUM_INPUT_WIDTH,\n  UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport {\n  useComposition,\n  useEmptyValues,\n  useFocusController,\n  useId,\n  useLocale,\n  useNamespace,\n} from '@element-plus/hooks'\nimport {\n  useFormDisabled,\n  useFormItem,\n  useFormItemInputId,\n  useFormSize,\n} from '@element-plus/components/form'\n\nimport type { Component } from 'vue'\nimport type { TooltipInstance } from '@element-plus/components/tooltip'\nimport type { ScrollbarInstance } from '@element-plus/components/scrollbar'\nimport type { SelectEmits, SelectProps } from './select'\nimport type {\n  OptionBasic,\n  OptionPublicInstance,\n  OptionValue,\n  SelectStates,\n} from './type'\n\nexport const useSelect = (props: SelectProps, emit: SelectEmits) => {\n  const { t } = useLocale()\n  const slots = useSlots()\n  const contentId = useId()\n  const nsSelect = useNamespace('select')\n  const nsInput = useNamespace('input')\n\n  const states = reactive<SelectStates>({\n    inputValue: '',\n    options: new Map(),\n    cachedOptions: new Map(),\n    optionValues: [], // sorted value of options\n    selected: [],\n    selectionWidth: 0,\n    collapseItemWidth: 0,\n    selectedLabel: '',\n    hoveringIndex: -1,\n    previousQuery: null,\n    inputHovering: false,\n    menuVisibleOnFocus: false,\n    isBeforeHide: false,\n  })\n\n  // template refs\n  const selectRef = ref<HTMLElement>()\n  const selectionRef = ref<HTMLElement>()\n  const tooltipRef = ref<TooltipInstance>()\n  const tagTooltipRef = ref<TooltipInstance>()\n  const inputRef = ref<HTMLInputElement>()\n  const prefixRef = ref<HTMLElement>()\n  const suffixRef = ref<HTMLElement>()\n  const menuRef = ref<HTMLElement>()\n  const tagMenuRef = ref<HTMLElement>()\n  const collapseItemRef = ref<HTMLElement>()\n  const scrollbarRef = ref<ScrollbarInstance>()\n  // the controller of the expanded popup\n  const expanded = ref(false)\n  const hoverOption = ref()\n  const debouncing = ref(false)\n\n  const { form, formItem } = useFormItem()\n  const { inputId } = useFormItemInputId(props, {\n    formItemContext: formItem,\n  })\n  const { valueOnClear, isEmptyValue } = useEmptyValues(props)\n\n  const {\n    isComposing,\n    handleCompositionStart,\n    handleCompositionUpdate,\n    handleCompositionEnd,\n  } = useComposition({\n    afterComposition: (e) => onInput(e),\n  })\n\n  const selectDisabled = useFormDisabled()\n\n  const { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, {\n    disabled: selectDisabled,\n    afterFocus() {\n      if (props.automaticDropdown && !expanded.value) {\n        expanded.value = true\n        states.menuVisibleOnFocus = true\n      }\n    },\n    beforeBlur(event) {\n      return (\n        tooltipRef.value?.isFocusInsideContent(event) ||\n        tagTooltipRef.value?.isFocusInsideContent(event)\n      )\n    },\n    afterBlur() {\n      expanded.value = false\n      states.menuVisibleOnFocus = false\n      if (props.validateEvent) {\n        formItem?.validate?.('blur').catch((err) => debugWarn(err))\n      }\n    },\n  })\n\n  const hasModelValue = computed(() => {\n    return isArray(props.modelValue)\n      ? props.modelValue.length > 0\n      : !isEmptyValue(props.modelValue)\n  })\n\n  const needStatusIcon = computed(() => form?.statusIcon ?? false)\n\n  const showClearBtn = computed(() => {\n    return (\n      props.clearable &&\n      !selectDisabled.value &&\n      hasModelValue.value &&\n      (isFocused.value || states.inputHovering)\n    )\n  })\n  const iconComponent = computed(() =>\n    props.remote && props.filterable && !props.remoteShowSuffix\n      ? ''\n      : props.suffixIcon\n  )\n  const iconReverse = computed(() =>\n    nsSelect.is('reverse', !!(iconComponent.value && expanded.value))\n  )\n\n  const validateState = computed(() => formItem?.validateState || '')\n  const validateIcon = computed(\n    () =>\n      validateState.value &&\n      (ValidateComponentsMap[validateState.value] as Component)\n  )\n\n  const debounce = computed(() => (props.remote ? props.debounce : 0))\n\n  const isRemoteSearchEmpty = computed(\n    () => props.remote && !states.inputValue && states.options.size === 0\n  )\n\n  const emptyText = computed(() => {\n    if (props.loading) {\n      return props.loadingText || t('el.select.loading')\n    } else {\n      if (\n        props.filterable &&\n        states.inputValue &&\n        states.options.size > 0 &&\n        filteredOptionsCount.value === 0\n      ) {\n        return props.noMatchText || t('el.select.noMatch')\n      }\n      if (states.options.size === 0) {\n        return props.noDataText || t('el.select.noData')\n      }\n    }\n    return null\n  })\n\n  const filteredOptionsCount = computed(\n    () => optionsArray.value.filter((option) => option.visible).length\n  )\n\n  const optionsArray = computed(() => {\n    const list = Array.from(states.options.values())\n    const newList: OptionPublicInstance[] = []\n    states.optionValues.forEach((item) => {\n      const index = list.findIndex((i) => i.value === item)\n      if (index > -1) {\n        newList.push(list[index])\n      }\n    })\n    return newList.length >= list.length ? newList : list\n  })\n\n  const cachedOptionsArray = computed(() =>\n    Array.from(states.cachedOptions.values())\n  )\n\n  const showNewOption = computed(() => {\n    const hasExistingOption = optionsArray.value\n      .filter((option) => {\n        return !option.created\n      })\n      .some((option) => {\n        return option.currentLabel === states.inputValue\n      })\n    return (\n      props.filterable &&\n      props.allowCreate &&\n      states.inputValue !== '' &&\n      !hasExistingOption\n    )\n  })\n\n  const updateOptions = () => {\n    if (props.filterable && isFunction(props.filterMethod)) return\n    if (props.filterable && props.remote && isFunction(props.remoteMethod))\n      return\n    optionsArray.value.forEach((option) => {\n      option.updateOption?.(states.inputValue)\n    })\n  }\n\n  const selectSize = useFormSize()\n\n  const collapseTagSize = computed(() =>\n    ['small'].includes(selectSize.value) ? 'small' : 'default'\n  )\n\n  const dropdownMenuVisible = computed({\n    get() {\n      return (\n        expanded.value &&\n        (props.loading ||\n          !isRemoteSearchEmpty.value ||\n          (props.remote && !!slots.empty)) &&\n        (!debouncing.value || !isEmpty(states.previousQuery))\n      )\n    },\n    set(val: boolean) {\n      expanded.value = val\n    },\n  })\n\n  const shouldShowPlaceholder = computed(() => {\n    if (props.multiple && !isUndefined(props.modelValue)) {\n      return ensureArray(props.modelValue).length === 0 && !states.inputValue\n    }\n    const value = isArray(props.modelValue)\n      ? props.modelValue[0]\n      : props.modelValue\n    return props.filterable || isUndefined(value) ? !states.inputValue : true\n  })\n\n  const currentPlaceholder = computed(() => {\n    const _placeholder = props.placeholder ?? t('el.select.placeholder')\n    return props.multiple || !hasModelValue.value\n      ? _placeholder\n      : states.selectedLabel\n  })\n\n  // iOS Safari does not handle click events when a mouseenter event is registered and a DOM-change happens in a child\n  // We use a Vue custom event binding to only register the event on non-iOS devices\n  // ref.: https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n  // Github Issue: https://github.com/vuejs/vue/issues/9859\n  const mouseEnterEventName = computed(() => (isIOS ? null : 'mouseenter'))\n\n  watch(\n    () => props.modelValue,\n    (val, oldVal) => {\n      if (props.multiple) {\n        if (props.filterable && !props.reserveKeyword) {\n          states.inputValue = ''\n          handleQueryChange('')\n        }\n      }\n      setSelected()\n      if (!isEqual(val, oldVal) && props.validateEvent) {\n        formItem?.validate('change').catch((err) => debugWarn(err))\n      }\n    },\n    {\n      flush: 'post',\n      deep: true,\n    }\n  )\n\n  watch(\n    () => expanded.value,\n    (val) => {\n      if (val) {\n        handleQueryChange(states.inputValue)\n      } else {\n        states.inputValue = ''\n        states.previousQuery = null\n        states.isBeforeHide = true\n        states.menuVisibleOnFocus = false\n      }\n    }\n  )\n\n  watch(\n    // fix `Array.prototype.push/splice/..` cannot trigger non-deep watcher\n    // https://github.com/vuejs/vue-next/issues/2116\n    () => states.options.entries(),\n    () => {\n      if (!isClient) return\n      // tooltipRef.value?.updatePopper?.()\n      setSelected()\n      if (\n        props.defaultFirstOption &&\n        (props.filterable || props.remote) &&\n        filteredOptionsCount.value\n      ) {\n        checkDefaultFirstOption()\n      }\n    },\n    {\n      flush: 'post',\n    }\n  )\n\n  watch([() => states.hoveringIndex, optionsArray], ([val]) => {\n    if (isNumber(val) && val > -1) {\n      hoverOption.value = optionsArray.value[val] || {}\n    } else {\n      hoverOption.value = {}\n    }\n    optionsArray.value.forEach((option) => {\n      option.hover = hoverOption.value === option\n    })\n  })\n\n  watchEffect(() => {\n    // Anything could cause options changed, then update options\n    // If you want to control it by condition, write here\n    if (states.isBeforeHide) return\n    updateOptions()\n  })\n\n  const handleQueryChange = (val: string) => {\n    if (states.previousQuery === val || isComposing.value) {\n      return\n    }\n    states.previousQuery = val\n    if (props.filterable && isFunction(props.filterMethod)) {\n      props.filterMethod(val)\n    } else if (\n      props.filterable &&\n      props.remote &&\n      isFunction(props.remoteMethod)\n    ) {\n      props.remoteMethod(val)\n    }\n    if (\n      props.defaultFirstOption &&\n      (props.filterable || props.remote) &&\n      filteredOptionsCount.value\n    ) {\n      nextTick(checkDefaultFirstOption)\n    } else {\n      nextTick(updateHoveringIndex)\n    }\n  }\n\n  /**\n   * find and highlight first option as default selected\n   * @remark\n   * - if the first option in dropdown list is user-created,\n   *   it would be at the end of the optionsArray\n   *   so find it and set hover.\n   *   (NOTE: there must be only one user-created option in dropdown list with query)\n   * - if there's no user-created option in list, just find the first one as usual\n   *   (NOTE: exclude options that are disabled or in disabled-group)\n   */\n  const checkDefaultFirstOption = () => {\n    const optionsInDropdown = optionsArray.value.filter(\n      (n) => n.visible && !n.disabled && !n.states.groupDisabled\n    )\n    const userCreatedOption = optionsInDropdown.find((n) => n.created)\n    const firstOriginOption = optionsInDropdown[0]\n    const valueList = optionsArray.value.map((item) => item.value)\n    states.hoveringIndex = getValueIndex(\n      valueList,\n      userCreatedOption || firstOriginOption\n    )\n  }\n\n  const setSelected = () => {\n    if (!props.multiple) {\n      const value = isArray(props.modelValue)\n        ? props.modelValue[0]\n        : props.modelValue\n      const option = getOption(value)\n      states.selectedLabel = option.currentLabel\n      states.selected = [option]\n      return\n    } else {\n      states.selectedLabel = ''\n    }\n    const result: SelectStates['selected'] = []\n    if (!isUndefined(props.modelValue)) {\n      ensureArray(props.modelValue).forEach((value) => {\n        result.push(getOption(value))\n      })\n    }\n    states.selected = result\n  }\n\n  const getOption = (value: OptionValue) => {\n    let option\n    const isObjectValue = isPlainObject(value)\n\n    for (let i = states.cachedOptions.size - 1; i >= 0; i--) {\n      const cachedOption = cachedOptionsArray.value[i]\n      const isEqualValue = isObjectValue\n        ? get(cachedOption.value, props.valueKey) === get(value, props.valueKey)\n        : cachedOption.value === value\n      if (isEqualValue) {\n        option = {\n          index: optionsArray.value\n            .filter((opt) => !opt.created)\n            .indexOf(cachedOption),\n          value,\n          currentLabel: cachedOption.currentLabel,\n          get isDisabled() {\n            return cachedOption.isDisabled\n          },\n        }\n        break\n      }\n    }\n    if (option) return option\n    const label = isObjectValue ? value.label : (value ?? '')\n    const newOption = {\n      index: -1,\n      value,\n      currentLabel: label,\n    }\n    return newOption\n  }\n\n  const updateHoveringIndex = () => {\n    const length = states.selected.length\n    if (length > 0) {\n      const lastOption = states.selected[length - 1]\n      states.hoveringIndex = optionsArray.value.findIndex(\n        (item) => getValueKey(lastOption) === getValueKey(item)\n      )\n    } else {\n      states.hoveringIndex = -1\n    }\n  }\n\n  const resetSelectionWidth = () => {\n    states.selectionWidth = Number.parseFloat(\n      window.getComputedStyle(selectionRef.value!).width\n    )\n  }\n\n  const resetCollapseItemWidth = () => {\n    states.collapseItemWidth =\n      collapseItemRef.value!.getBoundingClientRect().width\n  }\n\n  const updateTooltip = () => {\n    tooltipRef.value?.updatePopper?.()\n  }\n\n  const updateTagTooltip = () => {\n    tagTooltipRef.value?.updatePopper?.()\n  }\n\n  const onInputChange = () => {\n    if (states.inputValue.length > 0 && !expanded.value) {\n      expanded.value = true\n    }\n    handleQueryChange(states.inputValue)\n  }\n\n  const onInput = (event: Event) => {\n    states.inputValue = (event.target as HTMLInputElement).value\n    if (props.remote) {\n      debouncing.value = true\n      debouncedOnInputChange()\n    } else {\n      return onInputChange()\n    }\n  }\n\n  const debouncedOnInputChange = useDebounceFn(() => {\n    onInputChange()\n    debouncing.value = false\n  }, debounce)\n\n  const emitChange = (val: OptionValue | OptionValue[]) => {\n    if (!isEqual(props.modelValue, val)) {\n      emit(CHANGE_EVENT, val)\n    }\n  }\n\n  const getLastNotDisabledIndex = (value: OptionValue[]) =>\n    findLastIndex(value, (it) => {\n      const option = states.cachedOptions.get(it)\n      return !option?.disabled && !option?.states.groupDisabled\n    })\n\n  const deletePrevTag = (e: KeyboardEvent) => {\n    const code = getEventCode(e)\n    if (!props.multiple) return\n    if (code === EVENT_CODE.delete) return\n    if ((e.target as HTMLInputElement).value.length <= 0) {\n      const value = ensureArray(props.modelValue).slice()\n      const lastNotDisabledIndex = getLastNotDisabledIndex(value)\n      if (lastNotDisabledIndex < 0) return\n      const removeTagValue = value[lastNotDisabledIndex]\n      value.splice(lastNotDisabledIndex, 1)\n      emit(UPDATE_MODEL_EVENT, value)\n      emitChange(value)\n      emit('remove-tag', removeTagValue)\n    }\n  }\n\n  const deleteTag = (event: MouseEvent, tag: OptionBasic) => {\n    const index = states.selected.indexOf(tag)\n    if (index > -1 && !selectDisabled.value) {\n      const value = ensureArray(props.modelValue).slice()\n      value.splice(index, 1)\n      emit(UPDATE_MODEL_EVENT, value)\n      emitChange(value)\n      emit('remove-tag', tag.value)\n    }\n    event.stopPropagation()\n    focus()\n  }\n\n  const deleteSelected = (event: Event) => {\n    event.stopPropagation()\n    const value = props.multiple ? [] : valueOnClear.value\n    if (props.multiple) {\n      for (const item of states.selected) {\n        if (item.isDisabled) value.push(item.value)\n      }\n    }\n    emit(UPDATE_MODEL_EVENT, value)\n    emitChange(value)\n    states.hoveringIndex = -1\n    expanded.value = false\n    emit('clear')\n    focus()\n  }\n\n  const handleOptionSelect = (option: OptionPublicInstance) => {\n    if (props.multiple) {\n      const value = ensureArray(props.modelValue ?? []).slice()\n      const optionIndex = getValueIndex(value, option)\n      if (optionIndex > -1) {\n        value.splice(optionIndex, 1)\n      } else if (\n        props.multipleLimit <= 0 ||\n        value.length < props.multipleLimit\n      ) {\n        value.push(option.value)\n      }\n      emit(UPDATE_MODEL_EVENT, value)\n      emitChange(value)\n      if (option.created) {\n        handleQueryChange('')\n      }\n      if (props.filterable && (option.created || !props.reserveKeyword)) {\n        states.inputValue = ''\n      }\n    } else {\n      !isEqual(props.modelValue, option.value) &&\n        emit(UPDATE_MODEL_EVENT, option.value)\n      emitChange(option.value)\n      expanded.value = false\n    }\n    focus()\n    if (expanded.value) return\n    nextTick(() => {\n      scrollToOption(option)\n    })\n  }\n\n  const getValueIndex = (arr: OptionValue[], option: OptionPublicInstance) => {\n    if (isUndefined(option)) return -1\n    if (!isObject(option.value)) return arr.indexOf(option.value)\n\n    return arr.findIndex((item) => {\n      return isEqual(get(item, props.valueKey), getValueKey(option))\n    })\n  }\n\n  const scrollToOption = (\n    option:\n      | OptionPublicInstance\n      | OptionPublicInstance[]\n      | SelectStates['selected']\n  ) => {\n    const targetOption = isArray(option) ? option[option.length - 1] : option\n    let target = null\n\n    if (!isNil(targetOption?.value)) {\n      const options = optionsArray.value.filter(\n        (item) => item.value === targetOption.value\n      )\n      if (options.length > 0) {\n        target = options[0].$el\n      }\n    }\n\n    if (tooltipRef.value && target) {\n      const menu = tooltipRef.value?.popperRef?.contentRef?.querySelector?.(\n        `.${nsSelect.be('dropdown', 'wrap')}`\n      )\n      if (menu) {\n        scrollIntoView(menu as HTMLElement, target)\n      }\n    }\n    scrollbarRef.value?.handleScroll()\n  }\n\n  const onOptionCreate = (vm: OptionPublicInstance) => {\n    states.options.set(vm.value, vm)\n    states.cachedOptions.set(vm.value, vm)\n  }\n\n  const onOptionDestroy = (key: OptionValue, vm: OptionPublicInstance) => {\n    if (states.options.get(key) === vm) {\n      states.options.delete(key)\n    }\n  }\n\n  const popperRef = computed(() => {\n    return tooltipRef.value?.popperRef?.contentRef\n  })\n\n  const handleMenuEnter = () => {\n    states.isBeforeHide = false\n    nextTick(() => {\n      scrollbarRef.value?.update()\n      scrollToOption(states.selected)\n    })\n  }\n\n  const focus = () => {\n    inputRef.value?.focus()\n  }\n\n  const blur = () => {\n    if (expanded.value) {\n      expanded.value = false\n      nextTick(() => inputRef.value?.blur())\n      return\n    }\n    inputRef.value?.blur()\n  }\n\n  const handleClearClick = (event: Event) => {\n    deleteSelected(event)\n  }\n\n  const handleClickOutside = (event: Event) => {\n    expanded.value = false\n\n    if (isFocused.value) {\n      const _event = new FocusEvent('blur', event)\n      nextTick(() => handleBlur(_event))\n    }\n  }\n\n  const handleEsc = () => {\n    if (states.inputValue.length > 0) {\n      states.inputValue = ''\n    } else {\n      expanded.value = false\n    }\n  }\n\n  const toggleMenu = (event?: Event) => {\n    if (\n      selectDisabled.value ||\n      (props.filterable &&\n        expanded.value &&\n        event &&\n        !suffixRef.value?.contains(event.target as Node))\n    )\n      return\n\n    // We only set the inputHovering state to true on mouseenter event on iOS devices\n    // To keep the state updated we set it here to true\n    if (isIOS) states.inputHovering = true\n\n    if (states.menuVisibleOnFocus) {\n      // controlled by automaticDropdown\n      states.menuVisibleOnFocus = false\n    } else {\n      expanded.value = !expanded.value\n    }\n  }\n\n  const selectOption = () => {\n    if (!expanded.value) {\n      toggleMenu()\n    } else {\n      const option = optionsArray.value[states.hoveringIndex]\n      if (option && !option.isDisabled) {\n        handleOptionSelect(option)\n      }\n    }\n  }\n\n  const getValueKey = (\n    item: OptionPublicInstance | SelectStates['selected'][0]\n  ) => {\n    return isObject(item.value) ? get(item.value, props.valueKey) : item.value\n  }\n\n  const optionsAllDisabled = computed(() =>\n    optionsArray.value\n      .filter((option) => option.visible)\n      .every((option) => option.isDisabled)\n  )\n\n  const showTagList = computed(() => {\n    if (!props.multiple) {\n      return []\n    }\n    return props.collapseTags\n      ? states.selected.slice(0, props.maxCollapseTags)\n      : states.selected\n  })\n\n  const collapseTagList = computed(() => {\n    if (!props.multiple) {\n      return []\n    }\n    return props.collapseTags\n      ? states.selected.slice(props.maxCollapseTags)\n      : []\n  })\n\n  const navigateOptions = (direction: 'prev' | 'next') => {\n    if (!expanded.value) {\n      expanded.value = true\n      return\n    }\n    if (\n      states.options.size === 0 ||\n      filteredOptionsCount.value === 0 ||\n      isComposing.value\n    )\n      return\n\n    if (!optionsAllDisabled.value) {\n      if (direction === 'next') {\n        states.hoveringIndex++\n        if (states.hoveringIndex === states.options.size) {\n          states.hoveringIndex = 0\n        }\n      } else if (direction === 'prev') {\n        states.hoveringIndex--\n        if (states.hoveringIndex < 0) {\n          states.hoveringIndex = states.options.size - 1\n        }\n      }\n      const option = optionsArray.value[states.hoveringIndex]\n      if (option.isDisabled || !option.visible) {\n        navigateOptions(direction)\n      }\n      nextTick(() => scrollToOption(hoverOption.value))\n    }\n  }\n\n  const findFocusableIndex = (\n    arr: any[],\n    start: number,\n    step: number,\n    len: number\n  ) => {\n    for (let i = start; i >= 0 && i < len; i += step) {\n      const obj = arr[i]\n      if (!obj?.isDisabled && obj?.visible) {\n        return i\n      }\n    }\n    return null\n  }\n\n  const focusOption = (targetIndex: number, mode: 'up' | 'down') => {\n    const len = states.options.size\n    if (len === 0) return\n    const start = clamp(targetIndex, 0, len - 1)\n    const options = optionsArray.value\n    const direction = mode === 'up' ? -1 : 1\n    const newIndex =\n      findFocusableIndex(options, start, direction, len) ??\n      findFocusableIndex(options, start - direction, -direction, len)\n\n    if (newIndex != null) {\n      states.hoveringIndex = newIndex\n      nextTick(() => scrollToOption(hoverOption.value))\n    }\n  }\n\n  const handleKeydown = (e: KeyboardEvent) => {\n    const code = getEventCode(e)\n    let isPreventDefault = true\n    switch (code) {\n      case EVENT_CODE.up:\n        navigateOptions('prev')\n        break\n      case EVENT_CODE.down:\n        navigateOptions('next')\n        break\n      case EVENT_CODE.enter:\n      case EVENT_CODE.numpadEnter:\n        if (!isComposing.value) {\n          selectOption()\n        }\n        break\n      case EVENT_CODE.esc:\n        handleEsc()\n        break\n      case EVENT_CODE.backspace:\n        isPreventDefault = false\n        deletePrevTag(e)\n        return\n      case EVENT_CODE.home:\n        if (!expanded.value) return\n        focusOption(0, 'down')\n        break\n      case EVENT_CODE.end:\n        if (!expanded.value) return\n        focusOption(states.options.size - 1, 'up')\n        break\n      case EVENT_CODE.pageUp:\n        if (!expanded.value) return\n        focusOption(states.hoveringIndex - 10, 'up')\n        break\n      case EVENT_CODE.pageDown:\n        if (!expanded.value) return\n        focusOption(states.hoveringIndex + 10, 'down')\n        break\n      default:\n        isPreventDefault = false\n        break\n    }\n    if (isPreventDefault) {\n      e.preventDefault()\n      e.stopPropagation()\n    }\n  }\n\n  const getGapWidth = () => {\n    if (!selectionRef.value) return 0\n    const style = window.getComputedStyle(selectionRef.value)\n    return Number.parseFloat(style.gap || '6px')\n  }\n\n  // computed style\n  const tagStyle = computed(() => {\n    const gapWidth = getGapWidth()\n    const inputSlotWidth = props.filterable ? gapWidth + MINIMUM_INPUT_WIDTH : 0\n    const maxWidth =\n      collapseItemRef.value && props.maxCollapseTags === 1\n        ? states.selectionWidth -\n          states.collapseItemWidth -\n          gapWidth -\n          inputSlotWidth\n        : states.selectionWidth - inputSlotWidth\n    return { maxWidth: `${maxWidth}px` }\n  })\n\n  const collapseTagStyle = computed(() => {\n    return { maxWidth: `${states.selectionWidth}px` }\n  })\n\n  const popupScroll = (data: { scrollTop: number; scrollLeft: number }) => {\n    emit('popup-scroll', data)\n  }\n\n  useResizeObserver(selectionRef, resetSelectionWidth)\n  useResizeObserver(wrapperRef, updateTooltip)\n  useResizeObserver(tagMenuRef, updateTagTooltip)\n  useResizeObserver(collapseItemRef, resetCollapseItemWidth)\n\n  // #21498\n  let stop: (() => void) | undefined\n  watch(\n    () => dropdownMenuVisible.value,\n    (newVal) => {\n      if (newVal) {\n        stop = useResizeObserver(menuRef, updateTooltip).stop\n      } else {\n        stop?.()\n        stop = undefined\n      }\n      emit('visible-change', newVal)\n    }\n  )\n\n  onMounted(() => {\n    setSelected()\n  })\n\n  return {\n    inputId,\n    contentId,\n    nsSelect,\n    nsInput,\n    states,\n    isFocused,\n    expanded,\n    optionsArray,\n    hoverOption,\n    selectSize,\n    filteredOptionsCount,\n    updateTooltip,\n    updateTagTooltip,\n    debouncedOnInputChange,\n    onInput,\n    deletePrevTag,\n    deleteTag,\n    deleteSelected,\n    handleOptionSelect,\n    scrollToOption,\n    hasModelValue,\n    shouldShowPlaceholder,\n    currentPlaceholder,\n    mouseEnterEventName,\n    needStatusIcon,\n    showClearBtn,\n    iconComponent,\n    iconReverse,\n    validateState,\n    validateIcon,\n    showNewOption,\n    updateOptions,\n    collapseTagSize,\n    setSelected,\n    selectDisabled,\n    emptyText,\n    handleCompositionStart,\n    handleCompositionUpdate,\n    handleCompositionEnd,\n    handleKeydown,\n    onOptionCreate,\n    onOptionDestroy,\n    handleMenuEnter,\n    focus,\n    blur,\n    handleClearClick,\n    handleClickOutside,\n    handleEsc,\n    toggleMenu,\n    selectOption,\n    getValueKey,\n    navigateOptions,\n    dropdownMenuVisible,\n    showTagList,\n    collapseTagList,\n    popupScroll,\n    getOption,\n\n    // computed style\n    tagStyle,\n    collapseTagStyle,\n\n    // DOM ref\n    popperRef,\n    inputRef,\n    tooltipRef,\n    tagTooltipRef,\n    prefixRef,\n    suffixRef,\n    selectRef,\n    wrapperRef,\n    selectionRef,\n    scrollbarRef,\n    menuRef,\n    tagMenuRef,\n    collapseItemRef,\n  }\n}\n"],"mappings":"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AACvE,OAAK,gBAAgB,KAAK;;AAG5B,mBAAkB,cAAc,oBAAoB;AACpD,mBAAkB,YAAY,cAAc;AAC5C,mBAAkB,YAAY,iBAAiB;AAC/C,mBAAkB,iBAAiB,uBAAuB;CAG1D,IAAI;AACJ,aACQ,oBAAoB,QACzB,WAAW;AACV,MAAI,OACF,QAAO,kBAAkB,SAAS,cAAc,CAAC;OAC5C;AACL,WAAQ;AACR,UAAO;;AAET,OAAK,kBAAkB,OAAO;GAEjC;AAED,iBAAgB;AACd,eAAa;GACb;AAEF,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}