UNPKG

vuestic-ui

Version:
1 lines 2.43 kB
{"version":3,"file":"useFocusOutside.mjs","sources":["../../../../src/composables/useFocusOutside.ts"],"sourcesContent":["import { Ref, unref } from 'vue'\n\nimport { useEvent } from './useEvent'\nimport { unwrapEl } from '../utils/unwrapEl'\n\nconst checkIfElementChild = (\n parent: HTMLElement,\n child: HTMLElement | Window | null | undefined,\n): boolean => {\n if (!child) {\n return false\n }\n if (child instanceof Window) {\n return false\n }\n if (child.parentElement === parent) {\n return true\n }\n\n return parent.contains(child)\n}\n\ntype MaybeRef<T> = T | Ref<T>;\ntype MaybeArray<T> = T | T[];\n\nconst safeArray = <T>(a: MaybeArray<T>) => (Array.isArray(a) ? a : [a])\n\nexport const useFocusOutside = (\n elements: MaybeArray<MaybeRef<HTMLElement | undefined>>,\n cb: (el: HTMLElement) => void,\n options: {\n onlyKeyboard?: boolean;\n } = {},\n) => {\n let previouslyClicked = false\n if (options.onlyKeyboard) {\n useEvent('mousedown', (e) => {\n previouslyClicked = true\n setTimeout(() => {\n previouslyClicked = false\n }, 200)\n }, true)\n }\n\n useEvent('focus', (event) => {\n if (options.onlyKeyboard && previouslyClicked) {\n return\n }\n\n const focusTarget = event.target as HTMLElement\n\n if ((event.target as HTMLElement).shadowRoot) {\n return\n }\n\n const isFocusInside = safeArray(elements).some((element) => {\n const el = unwrapEl(unref(element))\n return el && checkIfElementChild(el, focusTarget)\n })\n\n if (!isFocusInside) {\n cb(focusTarget)\n }\n }, true)\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,sBAAsB,CAC1B,QACA,UACY;AACZ,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EACT;AACA,MAAI,iBAAiB,QAAQ;AACpB,WAAA;AAAA,EACT;AACI,MAAA,MAAM,kBAAkB,QAAQ;AAC3B,WAAA;AAAA,EACT;AAEO,SAAA,OAAO,SAAS,KAAK;AAC9B;AAKA,MAAM,YAAY,CAAI,MAAsB,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;AAE9D,MAAM,kBAAkB,CAC7B,UACA,IACA,UAEI,CAAA,MACD;AACH,MAAI,oBAAoB;AACxB,MAAI,QAAQ,cAAc;AACf,aAAA,aAAa,CAAC,MAAM;AACP,0BAAA;AACpB,iBAAW,MAAM;AACK,4BAAA;AAAA,SACnB,GAAG;AAAA,OACL,IAAI;AAAA,EACT;AAES,WAAA,SAAS,CAAC,UAAU;AACvB,QAAA,QAAQ,gBAAgB,mBAAmB;AAC7C;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AAErB,QAAA,MAAM,OAAuB,YAAY;AAC5C;AAAA,IACF;AAEA,UAAM,gBAAgB,UAAU,QAAQ,EAAE,KAAK,CAAC,YAAY;AAC1D,YAAM,KAAK,SAAS,MAAM,OAAO,CAAC;AAC3B,aAAA,MAAM,oBAAoB,IAAI,WAAW;AAAA,IAAA,CACjD;AAED,QAAI,CAAC,eAAe;AAClB,SAAG,WAAW;AAAA,IAChB;AAAA,KACC,IAAI;AACT;"}