{"version":3,"file":"my-popover.vue2.mjs","sources":["../../../../../../src/components/my/popover/my-popover.vue"],"sourcesContent":["<template>\n    <div class=\"my-popover_reference\"\n         :class=\"[props.class]\"\n         ref=\"referenceRef\"\n         @mouseenter=\"mouseenter\"\n         @mouseleave=\"mouseleave\"\n         @click.stop.prevent=\"togglePopperShow\">\n        <slot name=\"reference\"></slot>\n    </div>\n    <teleport to=\".my-popover_container\">\n        <div class=\"my-popover_content\"\n             ref=\"contentRef\"\n             :style=\"styles\"\n             v-show=\"data.visible\">\n            <slot></slot>\n        </div>\n    </teleport>\n</template>\n\n<script setup lang=\"ts\">\nimport { nextTick, onMounted, onUnmounted, reactive, ref, watch } from 'vue-demi';\nimport { createPopper, detectOverflow, Modifier, State } from '@popperjs/core';\nimport { onClickOutside } from '@vueuse/core';\n//@ts-ignore\nimport { Placement } from '@popperjs/core/lib/enums';\nimport { fromPairs } from 'lodash';\n\ndefineExpose({ close });\nconst emit = defineEmits(['show']);\n\nconst props = withDefaults(defineProps<{\n    disabled?: boolean\n    placement?: Placement\n    trigger?: 'hover' | 'click'\n    class?: string\n}>(), {\n    placement: 'top',\n    trigger: 'hover'\n});\n\nconst data = reactive({\n    visible: false\n});\n\nconst referenceRef = ref<HTMLElement>();\nconst contentRef = ref<HTMLElement>();\nlet popperInstance: any = null;\nconst styles = ref({});\n\nfunction deriveState(state: State) {\n    const elements = Object.keys(state.elements) as unknown as Array<\n        keyof State['elements']\n    >;\n    \n    const styles = fromPairs(\n        elements.map(\n            (element) =>\n                [element, state.styles[element] || {}] as [\n                    string,\n                    State['styles'][keyof State['styles']]\n                ]\n        )\n    );\n    \n    const attributes = fromPairs(\n        elements.map(\n            (element) =>\n                [element, state.attributes[element]] as [\n                    string,\n                    State['attributes'][keyof State['attributes']]\n                ]\n        )\n    );\n    \n    return {\n        styles,\n        attributes\n    };\n}\n\nconst stateUpdater = {\n    name: 'updateState',\n    enabled: true,\n    phase: 'write',\n    fn: ({ state }) => {\n        if (!data.visible) {\n            return;\n        }\n        \n        const sss = detectOverflow(state, {\n            // elementContext: 'reference', // 'popper' by default\n        });\n        console.log(sss);\n        const derivedState = deriveState(state);\n        // console.log(derivedState);\n        Object.assign(styles.value, derivedState.styles.popper);\n        // console.log(state.elements.popper);\n        // const rect = state.elements.popper.getBoundingClientRect();\n        // console.log(styles.value);\n        // console.log(state.elements.popper.offsetLeft);\n        // const scroll = state.scrollParents.reference[0];\n        // console.log(scroll);\n        // const scrollElementRect = (scroll as Element).getBoundingClientRect();\n        // console.log(scrollElementRect);\n        // console.log(document.body.clientWidth, rect.x + rect.width, styles.value.transform, rect);\n        // console.log(scrollElementRect.right, rect.right);\n        // if (scrollElementRect.right < rect.right) {\n        //     //\n        //     console.log(scrollElementRect.right);\n        //\n        //     // styles.value['transform'] = `translate3d(0px, 309px, 0)`;\n        // }\n        //\n        \n        // console.log(derivedState);\n        // Object.assign(states.value, derivedState)\n    },\n    requires: ['computeStyles']\n} as Modifier<'updateState', any>;\n\n// 创建 popper 实例\nconst createPopperInstance = () => {\n    popperInstance = createPopper(referenceRef.value!, contentRef.value!, {\n        modifiers: [\n            {\n                name: 'preventOverflow',\n                options: {\n                    altAxis: true,\n                    mainAxis: true,\n                    tether: false\n                    // boundary: document, // true by default\n                    // rootBoundary: document // true by default\n                }\n            },\n            {\n                name: 'flip',\n                enabled: false,\n                options: {\n                    fallbackPlacements: ['top', 'right']\n                }\n            },\n            {\n                name: 'offset',\n                options: {\n                    // 偏移值 左右，上下\n                    offset: [0, 10]\n                }\n            },\n            // stateUpdater,\n            {\n                name: 'arrow',\n                options: {\n                    element: '.popper-arrow'\n                }\n            }\n            // { name: 'applyStyles', enabled: false }\n        \n        ],\n        placement: props.placement\n    });\n    nextTick(() => {\n        // 异步更新\n        if (popperInstance != null) {\n            popperInstance.update();\n        }\n    });\n};\n\n\n// 销毁 popper 实例\nconst destroyPopperInstance = () => {\n    popperInstance?.destroy?.();\n    popperInstance = null;\n};\n\nwatch(() => data.visible, (visible, _o) => {\n    if (visible) {\n        createPopperInstance();\n        // emit('show');\n    } else {\n        // emit('hide');\n    }\n});\n\nonMounted(() => {\n    createPopperInstance();\n    // contentRef.value!.style.minWidth = referenceRef.value!.offsetWidth + 'px';\n});\n\nonUnmounted(() => {\n    destroyPopperInstance();\n});\nlet stopHandle: ReturnType<typeof onClickOutside>;\n\nfunction mouseenter() {\n    if (props.trigger != 'hover') {\n        return;\n    }\n    show();\n}\n\nfunction mouseleave() {\n    if (props.trigger != 'hover') {\n        return;\n    }\n    close();\n}\n\nconst togglePopperShow = () => {\n    if (props.trigger != 'click') {\n        return;\n    }\n    if (props.disabled) {\n        return;\n    }\n    \n    if (data.visible) {\n        // close\n        onClose();\n    } else {\n        if (stopHandle == null) {\n            stopHandle = onClickOutside(contentRef, () => {\n                close();\n            }, {\n                ignore: [referenceRef]\n            });\n        }\n        show();\n    }\n};\n\nfunction onClose() {\n    stopHandle?.();\n    stopHandle = null! as any;\n    data.visible = false;\n}\n\nfunction close() {\n    onClose();\n}\n\nfunction show() {\n    emit('show');\n    data.visible = true;\n}\n\nwatch(\n    () => data.visible,\n    (val) => {\n        if (!val) {\n            onClose();\n        }\n    },\n    {\n        flush: 'post'\n    }\n);\n</script>\n"],"names":["styles"],"mappings":"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"}