{"version":3,"file":"sticky.mjs","sources":["../../../../../../../packages/components/sticky/src/sticky.vue"],"sourcesContent":["<template>\n  <div ref=\"root\" :style=\"rootStyle\">\n    <div\n      :class=\"[ns.b(), state.fixed && !isReset && ns.m('fixed')]\"\n      :style=\"stickyStyle\"\n    >\n      <slot />\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, nextTick, reactive, ref, watch } from 'vue'\nimport {\n  useEventListener,\n  useNamespace,\n  useRect,\n  useScrollParent,\n  useVisibilityChange,\n} from '@xzx-design/hooks'\nimport {\n  extend,\n  getScrollTop,\n  getZIndexStyle,\n  isHidden,\n  unitToPx,\n  windowHeight,\n  windowWidth,\n} from '@xzx-design/utils'\nimport { stickyEmits, stickyProps } from './sticky'\n\nimport type { CSSProperties } from 'vue'\n\ndefineOptions({\n  name: 'XzxSticky',\n})\n\nconst props = defineProps(stickyProps)\nconst emits = defineEmits(stickyEmits)\n\nconst ns = useNamespace('sticky')\n\nconst root = ref<HTMLElement>()\nconst scrollParent = useScrollParent(root)\nconst state = reactive({\n  fixed: false,\n  width: 0, // root width\n  height: 0, // root height\n  transform: 0,\n})\nconst isReset = ref(false)\n\nconst offset = computed(() =>\n  unitToPx(props.position === 'top' ? props.offsetTop : props.offsetBottom)\n)\n\n// eslint-disable-next-line vue/return-in-computed-property\nconst rootStyle = computed<CSSProperties | undefined>(() => {\n  if (isReset.value) {\n    return\n  }\n  const { fixed, height, width } = state\n  if (fixed) {\n    return {\n      width: `${width}px`,\n      height: `${height}px`,\n    }\n  }\n})\n\nconst stickyStyle = computed<CSSProperties | undefined>(() => {\n  if (!state.fixed || isReset.value) {\n    return\n  }\n\n  const style: CSSProperties = extend(getZIndexStyle(props.zIndex), {\n    width: `${state.width}px`,\n    height: `${state.height}px`,\n    [props.position]: `${offset.value}px`,\n  })\n\n  if (state.transform) {\n    style.transform = `translate3d(0, ${state.transform}px, 0)`\n  }\n\n  return style\n})\n\nconst emitScroll = (scrollTop: number) =>\n  emits('scroll', {\n    scrollTop,\n    isFixed: state.fixed,\n  })\n\nconst onScroll = () => {\n  if (!root.value || isHidden(root)) {\n    return\n  }\n\n  const { container, position } = props\n  const rootRect = useRect(root)\n  const scrollTop = getScrollTop(window)\n\n  state.width = rootRect.width\n  state.height = rootRect.height\n\n  if (position === 'top') {\n    // The sticky component should be kept inside the container element\n    if (container) {\n      const containerRect = useRect(container)\n      const difference = containerRect.bottom - offset.value - state.height\n      state.fixed = offset.value > rootRect.top && containerRect.bottom > 0\n      state.transform = difference < 0 ? difference : 0\n    } else {\n      state.fixed = offset.value > rootRect.top\n    }\n  } else {\n    const { clientHeight } = document.documentElement\n    if (container) {\n      const containerRect = useRect(container)\n      const difference =\n        clientHeight - containerRect.top - offset.value - state.height\n      state.fixed =\n        clientHeight - offset.value < rootRect.bottom &&\n        clientHeight > containerRect.top\n      state.transform = difference < 0 ? -difference : 0\n    } else {\n      state.fixed = clientHeight - offset.value < rootRect.bottom\n    }\n  }\n\n  emitScroll(scrollTop)\n}\n\nwatch(\n  () => state.fixed,\n  (value) => emits('change', value)\n)\n\nuseEventListener('scroll', onScroll, {\n  target: scrollParent,\n  passive: true,\n})\nuseVisibilityChange(root, onScroll)\n\nwatch([windowWidth, windowHeight], () => {\n  if (!root.value || isHidden(root) || !state.fixed) {\n    return\n  }\n  isReset.value = true\n  nextTick(() => {\n    const rootRect = useRect(root)\n    state.width = rootRect.width\n    state.height = rootRect.height\n    isReset.value = false\n  })\n})\n\n// init here\n</script>\n"],"names":[],"mappings":"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"}