{"version":3,"file":"affix.vue2.mjs","sources":["../../../../../packages/components/affix/src/affix.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as __MACROS_defineComponent } from \"vue\";\nexport default /*#__PURE__*/ __MACROS_defineComponent({\n  name: 'ElAffix',\n});\n</script>\n<template>\n  <div ref=\"root\" :class=\"ns.b()\" :style=\"rootStyle\">\n    <div :class=\"{ [ns.m('fixed')]: state.fixed }\" :style=\"affixStyle\">\n      <slot></slot>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, shallowRef, watch } from 'vue'\nimport { useEventListener, useResizeObserver } from '@vueuse/core'\nimport { getScrollContainer } from '@element-ultra/utils'\nimport { useNamespace } from '@element-ultra/hooks'\nimport { affixEmits, affixProps } from './affix'\n\nimport type { CSSProperties } from 'vue'\n\n\n\nconst props = defineProps(affixProps)\nconst emit = defineEmits(affixEmits)\n\nconst ns = useNamespace('affix')\n\nconst target = shallowRef<HTMLElement>()\nconst root = shallowRef<HTMLDivElement>()\nconst scrollContainer = shallowRef<HTMLElement | Window>()\n\nconst state = reactive({\n  fixed: false,\n  height: 0, // height of root\n  width: 0, // width of root\n  scrollTop: 0, // scrollTop of documentElement\n  clientHeight: 0, // clientHeight of documentElement\n  transform: 0,\n})\n\nconst rootStyle = computed<CSSProperties>(() => {\n  return {\n    height: state.fixed ? `${state.height}px` : '',\n    width: state.fixed ? `${state.width}px` : '',\n  }\n})\n\nconst affixStyle = computed<CSSProperties | undefined>(() => {\n  if (!state.fixed) return\n\n  const offset = props.offset ? `${props.offset}px` : 0\n  const transform = state.transform ? `translateY(${state.transform}px)` : ''\n\n  return {\n    height: `${state.height}px`,\n    width: `${state.width}px`,\n    top: props.position === 'top' ? offset : '',\n    bottom: props.position === 'bottom' ? offset : '',\n    transform,\n    zIndex: props.zIndex,\n  }\n})\n\nconst update = () => {\n  if (!root.value || !target.value || !scrollContainer.value) return\n\n  const rootRect = root.value.getBoundingClientRect()\n  const targetRect = target.value.getBoundingClientRect()\n  state.height = rootRect.height\n  state.width = rootRect.width\n  state.scrollTop =\n    scrollContainer.value instanceof Window\n      ? document.documentElement.scrollTop\n      : scrollContainer.value.scrollTop || 0\n  state.clientHeight = document.documentElement.clientHeight\n\n  if (props.position === 'top') {\n    if (props.target) {\n      const difference = targetRect.bottom - props.offset - state.height\n      state.fixed = props.offset > rootRect.top && targetRect.bottom > 0\n      state.transform = difference < 0 ? difference : 0\n    } else {\n      state.fixed = props.offset > rootRect.top\n    }\n  } else {\n    if (props.target) {\n      const difference =\n        state.clientHeight - targetRect.top - props.offset - state.height\n      state.fixed =\n        state.clientHeight - props.offset < rootRect.bottom &&\n        state.clientHeight > targetRect.top\n      state.transform = difference < 0 ? -difference : 0\n    } else {\n      state.fixed = state.clientHeight - props.offset < rootRect.bottom\n    }\n  }\n}\n\nconst onScroll = () => {\n  update()\n\n  emit('scroll', {\n    scrollTop: state.scrollTop,\n    fixed: state.fixed,\n  })\n}\n\nwatch(\n  () => state.fixed,\n  () => {\n    emit('change', state.fixed)\n  }\n)\n\nonMounted(() => {\n  if (props.target) {\n    target.value =\n      document.querySelector<HTMLElement>(props.target) ?? undefined\n    if (!target.value) {\n      throw new Error(`Target is not existed: ${props.target}`)\n    }\n  } else {\n    target.value = document.documentElement\n  }\n  scrollContainer.value = getScrollContainer(root.value!, true)\n})\n\nuseEventListener(scrollContainer, 'scroll', onScroll)\nuseResizeObserver(root, () => update())\nuseResizeObserver(target, () => update())\n</script>\n"],"names":["__MACROS_defineComponent"],"mappings":"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"}