{"version":3,"file":"popover.vue.mjs","sources":["../../../../../packages/components/popover/src/popover.vue"],"sourcesContent":["<script setup>\r\nimport { ref, watch, watchEffect, onUnmounted, onMounted, nextTick } from \"vue\";\r\nimport { useNamespace } from \"@ui-library/hook\";\r\n\r\nconst ns = useNamespace(\"popover\");\r\n\r\nconst props = defineProps({\r\n  content: { type: String }, // 提示内容\r\n  position: { type: String, default: \"top\" }, // 位置：top/bottom/left/right\r\n  trigger: { type: String, default: \"hover\" }, // 触发方式：hover/click\r\n  delay: { type: Number, default: 300 }, // 延迟显示（仅 hover）\r\n  title: { type: String, default: \"\" }, // 标题\r\n});\r\n\r\ndefineOptions({\r\n  name: \"x-popover\",\r\n});\r\n\r\nconst isVisible = ref(false);\r\nlet timer = null;\r\n\r\n// 事件处理\r\nconst handleHover = (state) => {\r\n  if (props.trigger !== \"hover\") return;\r\n  clearTimeout(timer);\r\n  timer = setTimeout(() => (isVisible.value = state), state ? props.delay : 0);\r\n};\r\n\r\nconst handleClick = () => {\r\n  if (props.trigger == \"click\") {\r\n    isVisible.value = !isVisible.value;\r\n  }\r\n};\r\n\r\n// 点击外部关闭（仅 click 模式）\r\nconst clickOutsideHandler = (e) => {\r\n  // 使用 ns.b() 获取正确的类名\r\n  if (!isVisible.value || !e.target.closest(`.${ns.b()}`)) {\r\n    isVisible.value = false;\r\n  }\r\n};\r\n\r\n// 生命周期\r\nwatchEffect(() => {\r\n  if (props.trigger === \"click\") {\r\n    document.addEventListener(\"click\", clickOutsideHandler);\r\n  } else {\r\n    document.removeEventListener(\"click\", clickOutsideHandler);\r\n  }\r\n});\r\n\r\nonUnmounted(() => {\r\n  document.removeEventListener(\"click\", clickOutsideHandler);\r\n});\r\n\r\n// 添加位置计算逻辑\r\nconst popoverRef = ref(null);\r\nconst computedPosition = ref(props.position);\r\n\r\nconst updatePosition = () => {\r\n  if (!popoverRef.value) return;\r\n\r\n  //   const triggerEl = popoverRef.value.parentElement;\r\n  const triggerEl =\r\n    popoverRef.value.parentElement.querySelector(\":first-child\");\r\n  const popoverEl = popoverRef.value;\r\n  const rect = triggerEl.getBoundingClientRect();\r\n  const popoverRect = popoverEl.getBoundingClientRect();\r\n\r\n  // 获取视口尺寸\r\n  const viewportWidth = window.innerWidth;\r\n  const viewportHeight = window.innerHeight;\r\n\r\n  // 检查各个方向的可用空间\r\n  const spaces = {\r\n    top: rect.top,\r\n    bottom: viewportHeight - rect.bottom,\r\n    left: rect.left,\r\n    right: viewportWidth - rect.right,\r\n  };\r\n\r\n  // 根据当前位置和可用空间自动调整\r\n  switch (props.position) {\r\n    case \"top\":\r\n      if (spaces.top < popoverRect.height) {\r\n        computedPosition.value = \"bottom\";\r\n      }\r\n      break;\r\n    case \"bottom\":\r\n      if (spaces.bottom < popoverRect.height) {\r\n        computedPosition.value = \"top\";\r\n      }\r\n      break;\r\n    case \"left\":\r\n      if (spaces.left < popoverRect.width) {\r\n        computedPosition.value = \"right\";\r\n      }\r\n      break;\r\n    case \"right\":\r\n      if (spaces.right < popoverRect.width) {\r\n        computedPosition.value = \"left\";\r\n      }\r\n      break;\r\n  }\r\n};\r\n\r\n// 监听显示状态变化时更新位置\r\nwatch(\r\n  () => isVisible.value,\r\n  (val) => {\r\n    if (val) {\r\n      nextTick(() => {\r\n        updatePosition();\r\n      });\r\n    }\r\n  }\r\n);\r\n\r\n// 监听窗口大小变化\r\nonMounted(() => {\r\n  window.addEventListener(\"resize\", updatePosition);\r\n});\r\n\r\nonUnmounted(() => {\r\n  window.removeEventListener(\"resize\", updatePosition);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    :class=\"ns.b()\"\r\n    @mouseenter=\"handleHover(true)\"\r\n    @mouseleave=\"handleHover(false)\"\r\n    @click=\"handleClick\"\r\n  >\r\n    <slot></slot>\r\n\r\n    <Transition :name=\"ns.b()\">\r\n      <div\r\n        v-if=\"isVisible\"\r\n        ref=\"popoverRef\"\r\n        :class=\"[ns.e('content'), ns.m('content', computedPosition)]\"\r\n      >\r\n        <div v-if=\"title\" :class=\"ns.e('title')\">{{ title }}</div>\r\n\r\n        <div v-if=\"content\">\r\n          {{ content }}\r\n        </div>\r\n        <div v-if=\"$slots?.content && !content\">\r\n          <slot name=\"content\"></slot>\r\n        </div>\r\n      </div>\r\n    </Transition>\r\n  </div>\r\n</template>\r\n"],"names":[],"mappings":"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"}