{"version":3,"file":"Affix.mjs","sources":["../../../../../../packages/components/affix/src/Affix.tsx"],"sourcesContent":["import type { AffixState } from './interface';\nimport { classNames, omit, throttleByAnimationFrame } from '@antdv/utils';\nimport { ResizeObserver } from '@antdv/vue-components';\n\nimport {\n  computed,\n  defineComponent,\n  getCurrentInstance,\n  onMounted,\n  onUnmounted,\n  onUpdated,\n  reactive,\n  shallowRef,\n  watch,\n} from 'vue';\n\nimport useConfigInject from '../../config-provider/src/hooks/useConfigInject';\nimport useStyle from '../style';\nimport { AffixStatus } from './interface';\nimport { affixProps } from './props';\nimport { addObserveTarget, getFixedBottom, getFixedTop, getTargetRect, removeObserveTarget } from './utils';\n\nexport default defineComponent({\n  compatConfig: { MODE: 3 },\n  name: 'AAffix',\n  inheritAttrs: false,\n  props: affixProps(),\n  setup(props, { slots, emit, expose, attrs }) {\n    const placeholderNode = shallowRef();\n    const fixedNode = shallowRef();\n    const state = reactive({\n      affixStyle: undefined,\n      placeholderStyle: undefined,\n      status: AffixStatus.None,\n      lastAffix: false,\n      prevTarget: null,\n      timeout: null,\n    });\n    const currentInstance = getCurrentInstance();\n\n    const offsetTop = computed(() => {\n      return props.offsetBottom === undefined && props.offsetTop === undefined\n        ? 0\n        : props.offsetTop;\n    });\n    const offsetBottom = computed(() => props.offsetBottom);\n    const measure = () => {\n      const { status, lastAffix } = state;\n      const { target } = props;\n      if (status !== AffixStatus.Prepare || !fixedNode.value || !placeholderNode.value || !target)\n        return;\n\n      const targetNode = target();\n      if (!targetNode)\n        return;\n\n      const newState = {\n        status: AffixStatus.None,\n      } as AffixState;\n      const placeholderRect = getTargetRect(placeholderNode.value as HTMLElement);\n\n      if (\n        placeholderRect.top === 0\n        && placeholderRect.left === 0\n        && placeholderRect.width === 0\n        && placeholderRect.height === 0\n      ) {\n        return;\n      }\n\n      const targetRect = getTargetRect(targetNode);\n      const fixedTop = getFixedTop(placeholderRect, targetRect, offsetTop.value);\n      const fixedBottom = getFixedBottom(placeholderRect, targetRect, offsetBottom.value);\n      if (\n        placeholderRect.top === 0\n        && placeholderRect.left === 0\n        && placeholderRect.width === 0\n        && placeholderRect.height === 0\n      ) {\n        return;\n      }\n\n      if (fixedTop !== undefined) {\n        const width = `${placeholderRect.width}px`;\n        const height = `${placeholderRect.height}px`;\n\n        newState.affixStyle = {\n          position: 'fixed',\n          top: fixedTop,\n          width,\n          height,\n        };\n        newState.placeholderStyle = {\n          width,\n          height,\n        };\n      } else if (fixedBottom !== undefined) {\n        const width = `${placeholderRect.width}px`;\n        const height = `${placeholderRect.height}px`;\n\n        newState.affixStyle = {\n          position: 'fixed',\n          bottom: fixedBottom,\n          width,\n          height,\n        };\n        newState.placeholderStyle = {\n          width,\n          height,\n        };\n      }\n\n      newState.lastAffix = !!newState.affixStyle;\n      if (lastAffix !== newState.lastAffix)\n        emit('change', newState.lastAffix);\n\n      // update state\n      Object.assign(state, newState);\n    };\n    const prepareMeasure = () => {\n      Object.assign(state, {\n        status: AffixStatus.Prepare,\n        affixStyle: undefined,\n        placeholderStyle: undefined,\n      });\n      // Test if `updatePosition` called\n      if (process.env.NODE_ENV === 'test')\n        emit('testUpdatePosition');\n    };\n\n    const updatePosition = throttleByAnimationFrame(() => {\n      prepareMeasure();\n    });\n    const lazyUpdatePosition = throttleByAnimationFrame(() => {\n      const { target } = props;\n      const { affixStyle } = state;\n\n      // Check position change before measure to make Safari smooth\n      if (target && affixStyle) {\n        const targetNode = target();\n        if (targetNode && placeholderNode.value) {\n          const targetRect = getTargetRect(targetNode);\n          const placeholderRect = getTargetRect(placeholderNode.value as HTMLElement);\n          const fixedTop = getFixedTop(placeholderRect, targetRect, offsetTop.value);\n          const fixedBottom = getFixedBottom(placeholderRect, targetRect, offsetBottom.value);\n          if (\n            (fixedTop !== undefined && affixStyle.top === fixedTop)\n            || (fixedBottom !== undefined && affixStyle.bottom === fixedBottom)\n          ) {\n            return;\n          }\n        }\n      }\n      // Directly call prepare measure since it's already throttled.\n      prepareMeasure();\n    });\n\n    expose({\n      updatePosition,\n      lazyUpdatePosition,\n    });\n    watch(\n      () => props.target,\n      (val) => {\n        const newTarget = val?.() || null;\n        if (state.prevTarget !== newTarget) {\n          removeObserveTarget(currentInstance);\n          if (newTarget) {\n            addObserveTarget(newTarget, currentInstance);\n            // Mock Event object.\n            updatePosition();\n          }\n          state.prevTarget = newTarget;\n        }\n      },\n    );\n    watch(() => [props.offsetTop, props.offsetBottom], updatePosition);\n    onMounted(() => {\n      const { target } = props;\n      if (target) {\n        // [Legacy] Wait for parent component ref has its value.\n        // We should use target as directly element instead of function which makes element check hard.\n        state.timeout = setTimeout(() => {\n          addObserveTarget(target(), currentInstance);\n          // Mock Event object.\n          updatePosition();\n        });\n      }\n    });\n    onUpdated(() => {\n      measure();\n    });\n    onUnmounted(() => {\n      clearTimeout(state.timeout);\n      removeObserveTarget(currentInstance);\n      (updatePosition as any).cancel();\n      // https://github.com/ant-design/ant-design/issues/22683\n      (lazyUpdatePosition as any).cancel();\n    });\n\n    const { prefixCls } = useConfigInject('affix', props);\n    const [wrapSSR, hashId] = useStyle(prefixCls);\n    return () => {\n      const { affixStyle, placeholderStyle, status } = state;\n      const className = classNames({\n        [prefixCls.value]: affixStyle,\n        [hashId.value]: true,\n      });\n      const restProps = omit(props, [\n        'prefixCls',\n        'offsetTop',\n        'offsetBottom',\n        'target',\n        'onChange',\n        'onTestUpdatePosition',\n      ]);\n      return wrapSSR(\n        <ResizeObserver onResize={updatePosition}>\n          <div {...restProps} {...attrs} ref={placeholderNode} data-measure-status={status}>\n            {affixStyle && <div style={placeholderStyle} aria-hidden=\"true\" />}\n            <div class={className} ref={fixedNode} style={affixStyle}>\n              {slots.default?.()}\n            </div>\n          </div>\n        </ResizeObserver>,\n      );\n    };\n  },\n});\n"],"names":["compatConfig","MODE","name","inheritAttrs","props","affixProps","setup","slots","emit","expose","attrs","placeholderNode","shallowRef","fixedNode","state","reactive","affixStyle","undefined","placeholderStyle","status","AffixStatus","None","lastAffix","prevTarget","timeout","currentInstance","getCurrentInstance","offsetTop","computed","offsetBottom","measure","target","Prepare","value","targetNode","newState","placeholderRect","getTargetRect","top","left","width","height","targetRect","fixedTop","getFixedTop","fixedBottom","getFixedBottom","position","bottom","Object","assign","prepareMeasure","process","env","NODE_ENV","updatePosition","throttleByAnimationFrame","lazyUpdatePosition","watch","val","newTarget","removeObserveTarget","addObserveTarget","onMounted","setTimeout","onUpdated","onUnmounted","clearTimeout","cancel","prefixCls","useConfigInject","wrapSSR","hashId","useStyle","className","classNames","restProps","omit","_createVNode","ResizeObserver","default"],"mappings":"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"}