hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 6.02 kB
Source Map (JSON)
{"version":3,"file":"content.mjs","sources":["../../../../../../packages/components/popper/src/content.vue"],"sourcesContent":["<template>\n <div\n ref=\"contentRef\"\n v-bind=\"contentAttrs\"\n :style=\"contentStyle\"\n :class=\"contentClass\"\n tabindex=\"-1\"\n @mouseenter=\"(e) => $emit('mouseenter', e)\"\n @mouseleave=\"(e) => $emit('mouseleave', e)\"\n >\n <hl-focus-trap\n :trapped=\"trapped\"\n :trap-on-focus-in=\"true\"\n :focus-trap-el=\"contentRef\"\n :focus-start-el=\"focusStartRef\"\n @focus-after-trapped=\"onFocusAfterTrapped\"\n @focus-after-released=\"onFocusAfterReleased\"\n @focusin=\"onFocusInTrap\"\n @focusout-prevented=\"onFocusoutPrevented\"\n @release-requested=\"onReleaseRequested\"\n >\n <slot></slot>\n </hl-focus-trap>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, inject, provide, unref, onMounted, watch, onBeforeUnmount } from 'vue'\nimport { NOOP } from '@vue/shared'\nimport { isElement } from '@hongluan-ui/utils'\nimport { isNil } from 'lodash-unified'\nimport HlFocusTrap from '@hongluan-ui/components/focus-trap'\nimport {\n POPPER_CONTENT_INJECTION_KEY,\n formItemContextKey,\n} from '@hongluan-ui/tokens'\nimport { popperContentEmits, popperContentProps } from './content'\nimport {\n usePopperContent,\n usePopperContentDOM,\n usePopperContentFocusTrap,\n} from './composables'\n\nimport type { WatchStopHandle } from 'vue'\n\ndefineOptions({\n name: 'PopperContent',\n})\n\nconst emit = defineEmits(popperContentEmits)\nconst props = defineProps(popperContentProps)\n\nconst {\n focusStartRef,\n trapped,\n\n onFocusAfterReleased,\n onFocusAfterTrapped,\n onFocusInTrap,\n onFocusoutPrevented,\n onReleaseRequested,\n} = usePopperContentFocusTrap(props, emit)\n\nconst { attributes, arrowRef, contentRef, styles, instanceRef, role, update } =\n usePopperContent(props)\n\nconst {\n ariaModal,\n arrowStyle,\n contentAttrs,\n contentClass,\n contentStyle,\n updateZIndex,\n} = usePopperContentDOM(props, {\n styles,\n attributes,\n role,\n})\n\nconst formItemContext = inject(formItemContextKey, undefined)\n\nconst arrowOffset = ref<number>()\nprovide(POPPER_CONTENT_INJECTION_KEY, {\n arrowStyle,\n arrowRef,\n arrowOffset,\n})\n\nif (formItemContext) {\n // disallow auto-id from inside popper content\n provide(formItemContextKey, {\n ...formItemContext,\n addInputId: NOOP,\n removeInputId: NOOP,\n })\n}\n\nlet triggerTargetAriaStopWatch: WatchStopHandle | undefined = undefined\n\nconst updatePopper = (shouldUpdateZIndex = true) => {\n update()\n shouldUpdateZIndex && updateZIndex()\n}\n\nconst togglePopperAlive = () => {\n updatePopper(false)\n if (props.visible && props.focusOnShow) {\n trapped.value = true\n } else if (props.visible === false) {\n trapped.value = false\n }\n}\n\nonMounted(() => {\n watch(\n () => props.triggerTargetEl,\n (triggerTargetEl, prevTriggerTargetEl) => {\n triggerTargetAriaStopWatch?.()\n triggerTargetAriaStopWatch = undefined\n\n const el = unref(triggerTargetEl || contentRef.value)\n const prevEl = unref(prevTriggerTargetEl || contentRef.value)\n\n if (isElement(el)) {\n triggerTargetAriaStopWatch = watch(\n [role, () => props.ariaLabel, ariaModal, () => props.id],\n watches => {\n ['role', 'aria-label', 'aria-modal', 'id'].forEach((key, idx) => {\n isNil(watches[idx])\n ? el.removeAttribute(key)\n : el.setAttribute(key, watches[idx]!)\n })\n },\n { immediate: true },\n )\n }\n if (prevEl !== el && isElement(prevEl)) {\n ['role', 'aria-label', 'aria-modal', 'id'].forEach(key => {\n prevEl.removeAttribute(key)\n })\n }\n },\n { immediate: true },\n )\n\n watch(() => props.visible, togglePopperAlive, { immediate: true })\n})\n\nonBeforeUnmount(() => {\n triggerTargetAriaStopWatch?.()\n triggerTargetAriaStopWatch = undefined\n})\n\ndefineExpose({\n /**\n * @description popper content element\n */\n popperContentRef: contentRef,\n /**\n * @description popperjs instance\n */\n popperInstanceRef: instanceRef,\n /**\n * @description method for updating popper\n */\n updatePopper,\n\n /**\n * @description content style\n */\n contentStyle,\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;oCA6Cc;AAAA,EACZ,MAAM;AACR;;;;;;;AAKA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,0BAA0B,OAAO,IAAI;AAEzC,UAAM,EAAE,YAAY,UAAU,YAAY,QAAQ,aAAa,MAAM,WACnE,iBAAiB,KAAK;AAExB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,oBAAoB,OAAO;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,KACD;AAED,UAAM,kBAAkB,OAAO,oBAAoB,MAAS;AAE5D,UAAM,cAAc;AACpB,YAAQ,8BAA8B;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,KACD;AAED,QAAI,iBAAiB;AAEnB,cAAQ,oBAAoB;AAAA,WACvB;AAAA,QACH,YAAY;AAAA,QACZ,eAAe;AAAA,OAChB;AAAA;AAGH,QAAI,6BAA0D;AAE9D,UAAM,eAAe,CAAC,qBAAqB,SAAS;AAClD;AACA,4BAAsB;AAAa;AAGrC,UAAM,oBAAoB,MAAM;AAC9B,mBAAa,KAAK;AAClB,UAAI,MAAM,WAAW,MAAM,aAAa;AACtC,gBAAQ,QAAQ;AAAA,iBACP,MAAM,YAAY,OAAO;AAClC,gBAAQ,QAAQ;AAAA;AAClB;AAGF,cAAU,MAAM;AACd,YACE,MAAM,MAAM,iBACZ,CAAC,iBAAiB,wBAAwB;AACxC;AACA,qCAA6B;AAE7B,cAAM,KAAK,MAAM,mBAAmB,WAAW,KAAK;AACpD,cAAM,SAAS,MAAM,uBAAuB,WAAW,KAAK;AAE5D,YAAI,UAAU,EAAE,GAAG;AACjB,uCAA6B,MAC3B,CAAC,MAAM,MAAM,MAAM,WAAW,WAAW,MAAM,MAAM,EAAE,GACvD,aAAW;AACT,aAAC,QAAQ,cAAc,cAAc,IAAI,EAAE,QAAQ,CAAC,KAAK,QAAQ;AAC/D,oBAAM,QAAQ,IAAI,IACd,GAAG,gBAAgB,GAAG,IACtB,GAAG,aAAa,KAAK,QAAQ,IAAK;AAAA,aACvC;AAAA,aAEH,EAAE,WAAW,MACf;AAAA;AAEF,YAAI,WAAW,MAAM,UAAU,MAAM,GAAG;AACtC,WAAC,QAAQ,cAAc,cAAc,IAAI,EAAE,QAAQ,SAAO;AACxD,mBAAO,gBAAgB,GAAG;AAAA,WAC3B;AAAA;AACH,SAEF,EAAE,WAAW,MACf;AAEA,YAAM,MAAM,MAAM,SAAS,mBAAmB,EAAE,WAAW,MAAM;AAAA,KAClE;AAED,oBAAgB,MAAM;AACpB;AACA,mCAA6B;AAAA,KAC9B;AAED,WAAa;AAAA,MAIX,kBAAkB;AAAA,MAIlB,mBAAmB;AAAA,MAInB;AAAA,MAKA;AAAA,KACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}