{"version":3,"file":"useDropdown.mjs","sources":["../../../../../packages/components/dropdown/src/useDropdown.ts"],"sourcesContent":["import { inject, computed, ref } from 'vue'\nimport { generateId, on, addClass } from '@element-ultra/utils'\nimport { EVENT_CODE } from '@element-ultra/shared'\nimport { useNamespace } from '@element-ultra/hooks'\nimport type { Nullable } from '@element-ultra/utils'\nimport type { IElDropdownInstance } from './dropdown'\n\nexport const useDropdown = () => {\n  const elDropdown = inject<IElDropdownInstance>('elDropdown', {})\n  const _elDropdownSize = computed(() => elDropdown?.dropdownSize)\n\n  return {\n    elDropdown,\n    _elDropdownSize,\n  }\n}\n\nexport const initDropdownDomEvent = (\n  dropdownChildren,\n  triggerElm,\n  _instance\n) => {\n  const ns = useNamespace('dropdown')\n  const menuItems = ref<Nullable<HTMLButtonElement[]>>(null)\n  const menuItemsArray = ref<Nullable<HTMLElement[]>>(null)\n  const dropdownElm = ref<Nullable<HTMLElement>>(null)\n  const listId = ref(`dropdown-menu-${generateId()}`)\n  dropdownElm.value = dropdownChildren?.subTree.el\n\n  function removeTabindex() {\n    triggerElm.setAttribute('tabindex', '-1')\n    menuItemsArray.value?.forEach((item) => {\n      item.setAttribute('tabindex', '-1')\n    })\n  }\n\n  function resetTabindex(ele) {\n    removeTabindex()\n    ele?.setAttribute('tabindex', '0')\n  }\n\n  function handleTriggerKeyDown(ev: KeyboardEvent) {\n    const code = ev.code\n    if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) {\n      removeTabindex()\n      resetTabindex(menuItems.value[0])\n      menuItems.value[0].focus()\n      ev.preventDefault()\n      ev.stopPropagation()\n    } else if (code === EVENT_CODE.enter) {\n      _instance.handleClick()\n    } else if ([EVENT_CODE.tab, EVENT_CODE.esc].includes(code)) {\n      _instance.hide()\n    }\n  }\n\n  function handleItemKeyDown(ev) {\n    const code = ev.code\n    const target = ev.target\n    const currentIndex = menuItemsArray.value.indexOf(target)\n    const max = menuItemsArray.value.length - 1\n    let nextIndex\n    if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) {\n      if (code === EVENT_CODE.up) {\n        nextIndex = currentIndex !== 0 ? currentIndex - 1 : 0\n      } else {\n        nextIndex = currentIndex < max ? currentIndex + 1 : max\n      }\n      removeTabindex()\n      resetTabindex(menuItems.value[nextIndex])\n      menuItems.value[nextIndex].focus()\n      ev.preventDefault()\n      ev.stopPropagation()\n    } else if (code === EVENT_CODE.enter) {\n      triggerElmFocus()\n      target.click()\n      if (_instance.props.hideOnClick) {\n        _instance.hide()\n      }\n    } else if ([EVENT_CODE.tab, EVENT_CODE.esc].includes(code)) {\n      _instance.hide()\n      triggerElmFocus()\n    }\n  }\n\n  function initAria() {\n    dropdownElm.value.setAttribute('id', listId.value)\n    triggerElm.setAttribute('aria-haspopup', 'list')\n    triggerElm.setAttribute('aria-controls', listId.value)\n    if (!_instance.props.splitButton) {\n      triggerElm.setAttribute('role', 'button')\n      triggerElm.setAttribute('tabindex', _instance.props.tabindex)\n      addClass(triggerElm, ns.b('selfdefine'))\n    }\n  }\n\n  function initEvent() {\n    on(triggerElm, 'keydown', handleTriggerKeyDown)\n    on(dropdownElm.value, 'keydown', handleItemKeyDown, true)\n  }\n\n  function initDomOperation() {\n    menuItems.value = dropdownElm.value.querySelectorAll(\n      \"[tabindex='-1']\"\n    ) as unknown as HTMLButtonElement[]\n    menuItemsArray.value = [].slice.call(menuItems.value)\n\n    initEvent()\n    initAria()\n  }\n\n  function triggerElmFocus() {\n    triggerElm.focus()\n  }\n\n  initDomOperation()\n}\n"],"names":[],"mappings":"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"}