UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 9.82 kB
{"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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"}