{"version":3,"file":"Align.cjs","sources":["../../../../../../packages/vue-components/vc-align/src/Align.tsx"],"sourcesContent":["import type { PropType } from 'vue';\nimport type { AlignResult, AlignType, TargetPoint, TargetType } from './interface';\nimport { addEventListenerWrap, cloneElement, isVisible } from '@antdv/utils';\nimport { alignElement, alignPoint } from 'dom-align';\nimport { isEqual } from 'lodash-es';\n\nimport {\n  computed,\n  defineComponent,\n  nextTick,\n  onMounted,\n  onUnmounted,\n  onUpdated,\n  ref,\n  watch,\n} from 'vue';\nimport useBuffer from './hooks/useBuffer';\nimport { isSamePoint, monitorResize, restoreFocus } from './util';\n\ntype OnAlign = (source: HTMLElement, result: AlignResult) => void;\n\nexport interface AlignProps {\n  align: AlignType;\n  target: TargetType;\n  onAlign?: OnAlign;\n  monitorBufferTime?: number;\n  monitorWindowResize?: boolean;\n  disabled?: boolean;\n}\n\nexport const alignProps = {\n  align: Object as PropType<AlignType>,\n  target: [Object, Function] as PropType<TargetType>,\n  onAlign: Function as PropType<OnAlign>,\n  monitorBufferTime: Number,\n  monitorWindowResize: Boolean,\n  disabled: Boolean,\n};\n\ninterface MonitorRef {\n  element?: HTMLElement;\n  cancel: () => void;\n}\n\nexport interface RefAlign {\n  forceAlign: () => void;\n}\n\nfunction getElement(func: TargetType) {\n  if (typeof func !== 'function') return null;\n  return func();\n}\n\nfunction getPoint(point: TargetType) {\n  if (typeof point !== 'object' || !point) return null;\n  return point;\n}\n\nexport default defineComponent({\n  compatConfig: { MODE: 3 },\n  name: 'Align',\n  props: alignProps,\n  emits: ['align'],\n  setup(props, { expose, slots }) {\n    const cacheRef = ref<{ element?: HTMLElement; point?: TargetPoint; align?: AlignType }>({});\n    const nodeRef = ref();\n    const [forceAlign, cancelForceAlign] = useBuffer(\n      () => {\n        const {\n          disabled: latestDisabled,\n          target: latestTarget,\n          align: latestAlign,\n          onAlign: latestOnAlign,\n        } = props;\n        if (!latestDisabled && latestTarget && nodeRef.value) {\n          const source = nodeRef.value;\n\n          let result: AlignResult;\n          const element = getElement(latestTarget);\n          const point = getPoint(latestTarget);\n\n          cacheRef.value.element = element;\n          cacheRef.value.point = point;\n          cacheRef.value.align = latestAlign;\n          // IE lose focus after element realign\n          // We should record activeElement and restore later\n          const { activeElement } = document;\n          // We only align when element is visible\n          if (element && isVisible(element))\n            result = alignElement(source, element, latestAlign);\n          else if (point)\n            result = alignPoint(source, point, latestAlign);\n\n          restoreFocus(activeElement, source);\n\n          if (latestOnAlign && result)\n            latestOnAlign(source, result);\n\n          return true;\n        }\n\n        return false;\n      },\n      computed(() => props.monitorBufferTime),\n    );\n\n    // ===================== Effect =====================\n    // Listen for target updated\n    const resizeMonitor = ref<MonitorRef>({\n      cancel: () => {},\n    });\n    // Listen for source updated\n    const sourceResizeMonitor = ref<MonitorRef>({\n      cancel: () => {},\n    });\n\n    const goAlign = () => {\n      const target = props.target;\n      const element = getElement(target);\n      const point = getPoint(target);\n\n      if (nodeRef.value !== sourceResizeMonitor.value.element) {\n        sourceResizeMonitor.value.cancel();\n        sourceResizeMonitor.value.element = nodeRef.value;\n        sourceResizeMonitor.value.cancel = monitorResize(nodeRef.value, forceAlign);\n      }\n\n      if (\n        cacheRef.value.element !== element\n        || !isSamePoint(cacheRef.value.point, point)\n        || !isEqual(cacheRef.value.align, props.align)\n      ) {\n        forceAlign();\n\n        // Add resize observer\n        if (resizeMonitor.value.element !== element) {\n          resizeMonitor.value.cancel();\n          resizeMonitor.value.element = element;\n          resizeMonitor.value.cancel = monitorResize(element, forceAlign);\n        }\n      }\n    };\n\n    onMounted(() => {\n      nextTick(() => {\n        goAlign();\n      });\n    });\n\n    onUpdated(() => {\n      nextTick(() => {\n        goAlign();\n      });\n    });\n\n    // Listen for disabled change\n    watch(\n      () => props.disabled,\n      (disabled) => {\n        if (!disabled)\n          forceAlign();\n        else\n          cancelForceAlign();\n      },\n      { immediate: true, flush: 'post' },\n    );\n\n    // Listen for window resize\n    const winResizeRef = ref<{ remove: Function }>(null);\n\n    watch(\n      () => props.monitorWindowResize,\n      (monitorWindowResize) => {\n        if (monitorWindowResize) {\n          if (!winResizeRef.value)\n            winResizeRef.value = addEventListenerWrap(window, 'resize', forceAlign);\n        } else if (winResizeRef.value) {\n          winResizeRef.value.remove();\n          winResizeRef.value = null;\n        }\n      },\n      { flush: 'post' },\n    );\n    onUnmounted(() => {\n      resizeMonitor.value.cancel();\n      sourceResizeMonitor.value.cancel();\n      if (winResizeRef.value) winResizeRef.value.remove();\n      cancelForceAlign();\n    });\n\n    expose({\n      forceAlign: () => forceAlign(true),\n    });\n\n    return () => {\n      const child = slots?.default();\n      if (child)\n        return cloneElement(child[0], { ref: nodeRef }, true, true);\n\n      return null;\n    };\n  },\n});\n"],"names":["alignProps","align","Object","target","Function","onAlign","monitorBufferTime","Number","monitorWindowResize","Boolean","disabled","getElement","func","getPoint","point","defineComponent","compatConfig","MODE","name","props","emits","setup","expose","slots","cacheRef","ref","nodeRef","forceAlign","cancelForceAlign","useBuffer","latestDisabled","latestTarget","latestAlign","latestOnAlign","value","source","result","element","activeElement","document","isVisible","alignElement","alignPoint","restoreFocus","computed","resizeMonitor","cancel","sourceResizeMonitor","goAlign","monitorResize","isSamePoint","isEqual","onMounted","nextTick","onUpdated","watch","immediate","flush","winResizeRef","addEventListenerWrap","window","remove","onUnmounted","child","default","cloneElement"],"mappings":";;;;;;;;;;;;;;AA8BO,MAAMA,UAAa,GAAA;AAAA,EACxBC,KAAOC,EAAAA,MAAAA;AAAAA,EACPC,MAAAA,EAAQ,CAACD,MAAAA,EAAQE,QAAQ,CAAA;AAAA,EACzBC,OAASD,EAAAA,QAAAA;AAAAA,EACTE,iBAAmBC,EAAAA,MAAAA;AAAAA,EACnBC,mBAAqBC,EAAAA,OAAAA;AAAAA,EACrBC,QAAUD,EAAAA,OAAAA;AACZ,EAAA;AAWA,SAASE,WAAWC,IAAkB,EAAA;AACpC,EAAA,IAAI,OAAOA,IAAS,KAAA,UAAA;AAAY,IAAO,OAAA,IAAA,CAAA;AACvC,EAAA,OAAOA,IAAK,EAAA,CAAA;AACd,CAAA;AAEA,SAASC,SAASC,KAAmB,EAAA;AACnC,EAAI,IAAA,OAAOA,KAAU,KAAA,QAAA,IAAY,CAACA,KAAAA;AAAO,IAAO,OAAA,IAAA,CAAA;AAChD,EAAOA,OAAAA,KAAAA,CAAAA;AACT,CAAA;AAEA,4BAA+BC,mBAAA,CAAA;AAAA,EAC7BC,YAAc,EAAA;AAAA,IAAEC,IAAM,EAAA,CAAA;AAAA,GAAE;AAAA,EACxBC,IAAM,EAAA,OAAA;AAAA,EACNC,KAAOnB,EAAAA,UAAAA;AAAAA,EACPoB,KAAAA,EAAO,CAAC,OAAO,CAAA;AAAA,EACfC,MAAMF,KAAO,EAAA;AAAA,IAAEG,MAAAA;AAAAA,IAAQC,KAAAA;AAAAA,GAAS,EAAA;AAC9B,IAAMC,MAAAA,QAAAA,GAAWC,OAAuE,CAAA,EAAE,CAAA,CAAA;AAC1F,IAAA,MAAMC,UAAUD,OAAI,EAAA,CAAA;AACpB,IAAA,MAAM,CAACE,UAAAA,EAAYC,gBAAgB,CAAA,GAAIC,kBACrC,MAAM;AACJ,MAAM,MAAA;AAAA,QACJnB,QAAUoB,EAAAA,cAAAA;AAAAA,QACV3B,MAAQ4B,EAAAA,YAAAA;AAAAA,QACR9B,KAAO+B,EAAAA,WAAAA;AAAAA,QACP3B,OAAS4B,EAAAA,aAAAA;AAAAA,OACPd,GAAAA,KAAAA,CAAAA;AACJ,MAAA,IAAI,CAACW,cAAAA,IAAkBC,YAAgBL,IAAAA,OAAAA,CAAQQ,KAAO,EAAA;AACpD,QAAA,MAAMC,SAAST,OAAQQ,CAAAA,KAAAA,CAAAA;AAEvB,QAAIE,IAAAA,MAAAA,CAAAA;AACJ,QAAMC,MAAAA,OAAAA,GAAU1B,WAAWoB,YAAY,CAAA,CAAA;AACvC,QAAMjB,MAAAA,KAAAA,GAAQD,SAASkB,YAAY,CAAA,CAAA;AAEnCP,QAAAA,QAAAA,CAASU,MAAMG,OAAUA,GAAAA,OAAAA,CAAAA;AACzBb,QAAAA,QAAAA,CAASU,MAAMpB,KAAQA,GAAAA,KAAAA,CAAAA;AACvBU,QAAAA,QAAAA,CAASU,MAAMjC,KAAQ+B,GAAAA,WAAAA,CAAAA;AAGvB,QAAM,MAAA;AAAA,UAAEM,aAAAA;AAAAA,SAAkBC,GAAAA,QAAAA,CAAAA;AAE1B,QAAIF,IAAAA,OAAAA,IAAWG,aAAUH,OAAO,CAAA;AAC9BD,UAASK,MAAAA,GAAAA,qBAAAA,CAAaN,MAAQE,EAAAA,OAAAA,EAASL,WAAW,CAAA,CAAA;AAAA,aAC3ClB,IAAAA,KAAAA;AACPsB,UAASM,MAAAA,GAAAA,mBAAAA,CAAWP,MAAQrB,EAAAA,KAAAA,EAAOkB,WAAW,CAAA,CAAA;AAEhDW,QAAAA,iBAAAA,CAAaL,eAAeH,MAAM,CAAA,CAAA;AAElC,QAAA,IAAIF,aAAiBG,IAAAA,MAAAA;AACnBH,UAAAA,aAAAA,CAAcE,QAAQC,MAAM,CAAA,CAAA;AAE9B,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAO,OAAA,KAAA,CAAA;AAAA,KAETQ,EAAAA,YAAAA,CAAS,MAAMzB,KAAAA,CAAMb,iBAAiB,CACxC,CAAA,CAAA;AAIA,IAAA,MAAMuC,gBAAgBpB,OAAgB,CAAA;AAAA,MACpCqB,QAAQA,MAAM;AAAA,OAAC;AAAA,KAChB,CAAA,CAAA;AAED,IAAA,MAAMC,sBAAsBtB,OAAgB,CAAA;AAAA,MAC1CqB,QAAQA,MAAM;AAAA,OAAC;AAAA,KAChB,CAAA,CAAA;AAED,IAAA,MAAME,UAAUA,MAAM;AACpB,MAAA,MAAM7C,SAASgB,KAAMhB,CAAAA,MAAAA,CAAAA;AACrB,MAAMkC,MAAAA,OAAAA,GAAU1B,WAAWR,MAAM,CAAA,CAAA;AACjC,MAAMW,MAAAA,KAAAA,GAAQD,SAASV,MAAM,CAAA,CAAA;AAE7B,MAAA,IAAIuB,OAAQQ,CAAAA,KAAAA,KAAUa,mBAAoBb,CAAAA,KAAAA,CAAMG,OAAS,EAAA;AACvDU,QAAAA,mBAAAA,CAAoBb,MAAMY,MAAO,EAAA,CAAA;AACjCC,QAAoBb,mBAAAA,CAAAA,KAAAA,CAAMG,UAAUX,OAAQQ,CAAAA,KAAAA,CAAAA;AAC5Ca,QAAAA,mBAAAA,CAAoBb,KAAMY,CAAAA,MAAAA,GAASG,kBAAcvB,CAAAA,OAAAA,CAAQQ,OAAOP,UAAU,CAAA,CAAA;AAAA,OAC5E;AAEA,MAAA,IACEH,SAASU,KAAMG,CAAAA,OAAAA,KAAYA,WACxB,CAACa,gBAAAA,CAAY1B,SAASU,KAAMpB,CAAAA,KAAAA,EAAOA,KAAK,CAAA,IACxC,CAACqC,gBAAQ3B,CAAAA,QAAAA,CAASU,MAAMjC,KAAOkB,EAAAA,KAAAA,CAAMlB,KAAK,CAC7C,EAAA;AACA0B,QAAW,UAAA,EAAA,CAAA;AAGX,QAAIkB,IAAAA,aAAAA,CAAcX,KAAMG,CAAAA,OAAAA,KAAYA,OAAS,EAAA;AAC3CQ,UAAAA,aAAAA,CAAcX,MAAMY,MAAO,EAAA,CAAA;AAC3BD,UAAAA,aAAAA,CAAcX,MAAMG,OAAUA,GAAAA,OAAAA,CAAAA;AAC9BQ,UAAAA,aAAAA,CAAcX,KAAMY,CAAAA,MAAAA,GAASG,kBAAcZ,CAAAA,OAAAA,EAASV,UAAU,CAAA,CAAA;AAAA,SAChE;AAAA,OACF;AAAA,KACF,CAAA;AAEAyB,IAAAA,aAAAA,CAAU,MAAM;AACdC,MAAAA,YAAAA,CAAS,MAAM;AACbL,QAAQ,OAAA,EAAA,CAAA;AAAA,OACT,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAEDM,IAAAA,aAAAA,CAAU,MAAM;AACdD,MAAAA,YAAAA,CAAS,MAAM;AACbL,QAAQ,OAAA,EAAA,CAAA;AAAA,OACT,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAGDO,IACEA,SAAA,CAAA,MAAMpC,KAAMT,CAAAA,QAAAA,EACXA,CAAa,QAAA,KAAA;AACZ,MAAA,IAAI,CAACA,QAAAA;AACHiB,QAAW,UAAA,EAAA,CAAA;AAAA;AAEXC,QAAiB,gBAAA,EAAA,CAAA;AAAA,KAErB,EAAA;AAAA,MAAE4B,SAAW,EAAA,IAAA;AAAA,MAAMC,KAAO,EAAA,MAAA;AAAA,KAC5B,CAAA,CAAA;AAGA,IAAMC,MAAAA,YAAAA,GAAejC,QAA0B,IAAI,CAAA,CAAA;AAEnD8B,IACEA,SAAA,CAAA,MAAMpC,KAAMX,CAAAA,mBAAAA,EACXA,CAAwB,mBAAA,KAAA;AACvB,MAAA,IAAIA,mBAAqB,EAAA;AACvB,QAAA,IAAI,CAACkD,YAAaxB,CAAAA,KAAAA;AAChBwB,UAAAA,YAAAA,CAAaxB,KAAQyB,GAAAA,qCAAAA,CAAqBC,MAAQ,EAAA,QAAA,EAAUjC,UAAU,CAAA,CAAA;AAAA,OAC1E,MAAA,IAAW+B,aAAaxB,KAAO,EAAA;AAC7BwB,QAAAA,YAAAA,CAAaxB,MAAM2B,MAAO,EAAA,CAAA;AAC1BH,QAAAA,YAAAA,CAAaxB,KAAQ,GAAA,IAAA,CAAA;AAAA,OACvB;AAAA,KAEF,EAAA;AAAA,MAAEuB,KAAO,EAAA,MAAA;AAAA,KACX,CAAA,CAAA;AACAK,IAAAA,eAAAA,CAAY,MAAM;AAChBjB,MAAAA,aAAAA,CAAcX,MAAMY,MAAO,EAAA,CAAA;AAC3BC,MAAAA,mBAAAA,CAAoBb,MAAMY,MAAO,EAAA,CAAA;AACjC,MAAA,IAAIY,YAAaxB,CAAAA,KAAAA;AAAOwB,QAAAA,YAAAA,CAAaxB,MAAM2B,MAAO,EAAA,CAAA;AAClDjC,MAAiB,gBAAA,EAAA,CAAA;AAAA,KAClB,CAAA,CAAA;AAEDN,IAAO,MAAA,CAAA;AAAA,MACLK,UAAAA,EAAYA,MAAMA,UAAAA,CAAW,IAAI,CAAA;AAAA,KAClC,CAAA,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,MAAMoC,QAAQxC,KAAOyC,IAAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,OAAAA,EAAAA,CAAAA;AACrB,MAAID,IAAAA,KAAAA;AACF,QAAOE,OAAAA,kBAAAA,CAAaF,KAAM,CAAA,CAAC,CAAG,EAAA;AAAA,UAAEtC,GAAKC,EAAAA,OAAAA;AAAAA,SAAQ,EAAG,MAAM,IAAI,CAAA,CAAA;AAE5D,MAAO,OAAA,IAAA,CAAA;AAAA,KACT,CAAA;AAAA,GACF;AACF,CAAC,CAAA;;;;;"}