UNPKG

tdesign-vue-next

Version:
1 lines 12.3 kB
{"version":3,"file":"container.mjs","sources":["../../../components/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 '@tdesign/shared-hooks';\nimport { isArray } from 'lodash-es';\nimport { getAttach } from '@tdesign/shared-utils';\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'] as const).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: 'TPopupTrigger',\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: 'TPopupContent',\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: 'TPopupContainer',\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 = () => 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":["_isSlot","s","Object","prototype","toString","call","_isVNode","filterEmpty","children","arguments","length","undefined","vnodes","forEach","child","isArray","push","apply","_toConsumableArray","type","Fragment","filter","c","Comment","Text","trim","isRectChanged","rect1","rect2","some","k","useElement","getter","instance","getCurrentInstance","el","ref","onMounted","value","onUpdated","newEl","Trigger","defineComponent","name","props","forwardRef","Function","emits","setup","emit","_ref","slots","vm","containerNode","parent","vnode","nextElementSibling","contentRect","watch","_props2$forwardRef","useResizeObserver","_ref2","_ref3","_slicedToArray","newContentRect","newRect","oldRect","_slots$default","_children$","_createVNode","Content","_ref4","contentEl","inheritAttrs","visible","Boolean","attach","_ref5","attrs","expose","triggerEl","mountContent","emitResize","requestAnimationFrame","unmountContent","_slot","getElement","getAttach","_Fragment","Teleport","_default","onVnodeMounted","content"],"mappings":"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"}