{"version":3,"file":"container.mjs","sources":["../../src/popup/container.tsx"],"sourcesContent":["import {\n  defineComponent,\n  getCurrentInstance,\n  onMounted,\n  ref,\n  Fragment,\n  Text,\n  watch,\n  PropType,\n  VNode,\n  Teleport,\n  onUpdated,\n  ComponentInternalInstance,\n  Comment,\n} from 'vue';\nimport props from './props';\nimport useResizeObserver from '../hooks/useResizeObserver';\nimport isArray from 'lodash/isArray';\nimport { getSSRAttach, getAttach } from '../utils/dom';\n\nfunction filterEmpty(children: VNode[] = []) {\n  const vnodes: VNode[] = [];\n  children.forEach((child) => {\n    if (isArray(child)) {\n      vnodes.push(...child);\n    } else if (child.type === Fragment) {\n      vnodes.push(...filterEmpty(child.children as VNode[]));\n    } else {\n      vnodes.push(child);\n    }\n  });\n  return vnodes.filter(\n    (c) =>\n      !(\n        c &&\n        (c.type === Comment ||\n          (c.type === Fragment && c.children.length === 0) ||\n          (c.type === Text && (c.children as string).trim() === ''))\n      ),\n  );\n}\n\nfunction isRectChanged(rect1: DOMRectReadOnly, rect2: DOMRectReadOnly) {\n  if (!rect1 && !rect2) return false;\n  if (!rect1 || !rect2) return true;\n  if (['width', 'height', 'x', 'y'].some((k) => rect1[k] !== rect2[k])) {\n    return true;\n  }\n  return false;\n}\n\nfunction useElement<T = HTMLElement>(getter: (instance: ComponentInternalInstance) => T) {\n  const instance = getCurrentInstance();\n  const el = ref<T>();\n\n  onMounted(() => {\n    el.value = getter(instance);\n  });\n  onUpdated(() => {\n    const newEl = getter(instance);\n    if (el.value !== newEl) {\n      el.value = newEl;\n    }\n  });\n\n  return el;\n}\n\n// eslint-disable-next-line vue/one-component-per-file\nconst Trigger = defineComponent({\n  name: 'XPopupTrigger',\n  props: {\n    forwardRef: Function as PropType<(el: HTMLElement) => void>,\n  },\n  emits: ['resize'],\n  setup(props, { emit, slots }) {\n    const el = useElement((vm) => {\n      const containerNode = vm.parent.vnode;\n      // skip the first text node due to `Fragment`\n      return containerNode.el.nextElementSibling;\n    });\n    const contentRect = ref<DOMRectReadOnly>();\n\n    watch(el, () => {\n      props.forwardRef?.(el.value);\n    });\n\n    useResizeObserver(el, ([{ contentRect: newContentRect }]) => {\n      contentRect.value = newContentRect;\n    });\n\n    watch(contentRect, (newRect, oldRect) => {\n      if (isRectChanged(newRect, oldRect)) {\n        emit('resize');\n      }\n    });\n\n    return () => {\n      const children = filterEmpty(slots.default?.());\n      if (children.length > 1 || children[0]?.type === Text) {\n        return <span>{children}</span>;\n      }\n      return children[0];\n    };\n  },\n});\n\n// eslint-disable-next-line vue/one-component-per-file\nconst Content = defineComponent({\n  name: 'XPopupContent',\n  emits: ['resize'],\n  setup(props, { emit, slots }) {\n    const contentEl = useElement((vm) => vm.vnode.el.children[0]);\n    useResizeObserver(contentEl, () => {\n      emit('resize');\n    });\n\n    return () => {\n      return <div style=\"position: absolute; top: 0px; left: 0px; width: 100%\">{slots.default()}</div>;\n    };\n  },\n});\n\n// eslint-disable-next-line vue/one-component-per-file\nexport default defineComponent({\n  name: 'XPopupContainer',\n  inheritAttrs: false,\n  props: {\n    parent: Object,\n    visible: Boolean,\n    attach: props.attach,\n    forwardRef: Function as PropType<(el: HTMLElement) => void>,\n  },\n  emits: ['resize', 'contentMounted'],\n  setup(props, { emit, attrs, slots, expose }) {\n    const triggerEl = ref<HTMLElement>();\n    const mountContent = ref(false);\n\n    function emitResize() {\n      emit('resize');\n    }\n\n    onMounted(() => {\n      requestAnimationFrame(() => {\n        mountContent.value = props.visible;\n      });\n    });\n\n    watch(\n      () => props.visible,\n      (visible) => {\n        if (visible) {\n          mountContent.value = props.visible;\n        }\n      },\n    );\n\n    expose({\n      unmountContent() {\n        mountContent.value = false;\n      },\n    });\n\n    return () => {\n      const getElement = () => getSSRAttach() || getAttach(props.attach, triggerEl.value);\n      return (\n        <Fragment>\n          <Trigger\n            class={attrs.class}\n            forwardRef={(el: HTMLElement) => {\n              props.forwardRef(el);\n              triggerEl.value = el;\n            }}\n            onResize={emitResize}\n          >\n            {slots.default()}\n          </Trigger>\n          {mountContent.value && (\n            <Teleport disabled={!getElement()} to={getElement()}>\n              <Content onResize={emitResize} onVnodeMounted={() => emit('contentMounted')}>\n                {slots.content && slots.content()}\n              </Content>\n            </Teleport>\n          )}\n        </Fragment>\n      );\n    };\n  },\n});\n"],"names":["_isVNode","children","isArray","vnodes","onMounted","el","onUpdated","name","props","forwardRef","setup","useResizeObserver","watch","_createVNode","inheritAttrs","parent","visible","emits","requestAnimationFrame","mountContent","expose","_Fragment"],"mappings":"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"}