{"version":3,"file":"sticky.mjs","names":["computed","onBeforeUnmount","onMounted","shallowRef","watch","convertToUnit","useSticky","_ref","rootEl","isSticky","layoutItemStyles","isStuck","stuckPosition","stickyStyles","side","value","top","bottom","height","undefined","_defineProperty","val","window","addEventListener","onScroll","passive","removeEventListener","immediate","document","lastScrollTop","_layoutItemStyles$val","direction","scrollY","rect","getBoundingClientRect","layoutTop","parseFloat","Math","max","innerHeight","bodyScroll","getComputedStyle","getPropertyValue"],"sources":["../../../src/components/USidebar/sticky.ts"],"sourcesContent":["// Utilities\nimport { computed, onBeforeUnmount, onMounted, shallowRef, watch } from 'vue'\nimport { convertToUnit } from '@/utils'\n\n// Types\nimport type { CSSProperties, Ref } from 'vue'\n\ninterface StickyProps {\n  rootEl: Ref<HTMLElement | undefined>\n  isSticky: Ref<boolean>\n  layoutItemStyles: Ref<CSSProperties>\n}\n\nexport function useSticky({ rootEl, isSticky, layoutItemStyles }: StickyProps) {\n  const isStuck = shallowRef<boolean | 'top' | 'bottom'>(false)\n  const stuckPosition = shallowRef(0)\n\n  const stickyStyles = computed(() => {\n    const side = typeof isStuck.value === 'boolean' ? 'top' : isStuck.value\n    return [\n      isSticky.value\n        ? { top: 'auto', bottom: 'auto', height: undefined }\n        : undefined,\n      isStuck.value\n        ? { [side]: convertToUnit(stuckPosition.value) }\n        : { top: layoutItemStyles.value.top },\n    ]\n  })\n\n  onMounted(() => {\n    watch(\n      isSticky,\n      (val) => {\n        if (val) {\n          window.addEventListener('scroll', onScroll, { passive: true })\n        } else {\n          window.removeEventListener('scroll', onScroll)\n        }\n      },\n      { immediate: true }\n    )\n  })\n\n  onBeforeUnmount(() => {\n    document.removeEventListener('scroll', onScroll)\n  })\n\n  let lastScrollTop = 0\n  function onScroll() {\n    const direction = lastScrollTop > window.scrollY ? 'up' : 'down'\n    const rect = rootEl.value!.getBoundingClientRect()\n    const layoutTop = parseFloat(layoutItemStyles.value.top ?? 0)\n    const top = window.scrollY - Math.max(0, stuckPosition.value - layoutTop)\n    const bottom =\n      rect.height +\n      Math.max(stuckPosition.value, layoutTop) -\n      window.scrollY -\n      window.innerHeight\n    const bodyScroll =\n      parseFloat(\n        getComputedStyle(rootEl.value!).getPropertyValue('--v-body-scroll-y')\n      ) || 0\n\n    if (rect.height < window.innerHeight - layoutTop) {\n      isStuck.value = 'top'\n      stuckPosition.value = layoutTop\n    } else if (\n      (direction === 'up' && isStuck.value === 'bottom') ||\n      (direction === 'down' && isStuck.value === 'top')\n    ) {\n      stuckPosition.value = window.scrollY + rect.top - bodyScroll\n      isStuck.value = true\n    } else if (direction === 'down' && bottom <= 0) {\n      stuckPosition.value = 0\n      isStuck.value = 'bottom'\n    } else if (direction === 'up' && top <= 0) {\n      if (!bodyScroll) {\n        stuckPosition.value = rect.top + top\n        isStuck.value = 'top'\n      } else if (isStuck.value !== 'top') {\n        stuckPosition.value = -top + bodyScroll + layoutTop\n        isStuck.value = 'top'\n      }\n    }\n\n    lastScrollTop = window.scrollY\n  }\n\n  return { isStuck, stickyStyles }\n}\n"],"mappings":";;;;AAAA;AACA,SAASA,QAAQ,EAAEC,eAAe,EAAEC,SAAS,EAAEC,UAAU,EAAEC,KAAK,QAAQ,KAAK;AAAA,SACpEC,aAAa,iCAEtB;AASA,OAAO,SAASC,SAASA,CAAAC,IAAA,EAAsD;EAAA,IAAnDC,MAAM,GAAAD,IAAA,CAANC,MAAM;IAAEC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;IAAEC,gBAAgB,GAAAH,IAAA,CAAhBG,gBAAgB;EAC5D,IAAMC,OAAO,GAAGR,UAAU,CAA6B,KAAK,CAAC;EAC7D,IAAMS,aAAa,GAAGT,UAAU,CAAC,CAAC,CAAC;EAEnC,IAAMU,YAAY,GAAGb,QAAQ,CAAC,YAAM;IAClC,IAAMc,IAAI,GAAG,OAAOH,OAAO,CAACI,KAAK,KAAK,SAAS,GAAG,KAAK,GAAGJ,OAAO,CAACI,KAAK;IACvE,OAAO,CACLN,QAAQ,CAACM,KAAK,GACV;MAAEC,GAAG,EAAE,MAAM;MAAEC,MAAM,EAAE,MAAM;MAAEC,MAAM,EAAEC;IAAU,CAAC,GAClDA,SAAS,EACbR,OAAO,CAACI,KAAK,GAAAK,eAAA,KACNN,IAAI,EAAGT,aAAa,CAACO,aAAa,CAACG,KAAK,CAAC,IAC5C;MAAEC,GAAG,EAAEN,gBAAgB,CAACK,KAAK,CAACC;IAAI,CAAC,CACxC;EACH,CAAC,CAAC;EAEFd,SAAS,CAAC,YAAM;IACdE,KAAK,CACHK,QAAQ,EACR,UAACY,GAAG,EAAK;MACP,IAAIA,GAAG,EAAE;QACPC,MAAM,CAACC,gBAAgB,CAAC,QAAQ,EAAEC,QAAQ,EAAE;UAAEC,OAAO,EAAE;QAAK,CAAC,CAAC;MAChE,CAAC,MAAM;QACLH,MAAM,CAACI,mBAAmB,CAAC,QAAQ,EAAEF,QAAQ,CAAC;MAChD;IACF,CAAC,EACD;MAAEG,SAAS,EAAE;IAAK,CACpB,CAAC;EACH,CAAC,CAAC;EAEF1B,eAAe,CAAC,YAAM;IACpB2B,QAAQ,CAACF,mBAAmB,CAAC,QAAQ,EAAEF,QAAQ,CAAC;EAClD,CAAC,CAAC;EAEF,IAAIK,aAAa,GAAG,CAAC;EACrB,SAASL,QAAQA,CAAA,EAAG;IAAA,IAAAM,qBAAA;IAClB,IAAMC,SAAS,GAAGF,aAAa,GAAGP,MAAM,CAACU,OAAO,GAAG,IAAI,GAAG,MAAM;IAChE,IAAMC,IAAI,GAAGzB,MAAM,CAACO,KAAK,CAAEmB,qBAAqB,CAAC,CAAC;IAClD,IAAMC,SAAS,GAAGC,UAAU,EAAAN,qBAAA,GAACpB,gBAAgB,CAACK,KAAK,CAACC,GAAG,YAAAc,qBAAA,GAAI,CAAC,CAAC;IAC7D,IAAMd,GAAG,GAAGM,MAAM,CAACU,OAAO,GAAGK,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE1B,aAAa,CAACG,KAAK,GAAGoB,SAAS,CAAC;IACzE,IAAMlB,MAAM,GACVgB,IAAI,CAACf,MAAM,GACXmB,IAAI,CAACC,GAAG,CAAC1B,aAAa,CAACG,KAAK,EAAEoB,SAAS,CAAC,GACxCb,MAAM,CAACU,OAAO,GACdV,MAAM,CAACiB,WAAW;IACpB,IAAMC,UAAU,GACdJ,UAAU,CACRK,gBAAgB,CAACjC,MAAM,CAACO,KAAM,CAAC,CAAC2B,gBAAgB,CAAC,mBAAmB,CACtE,CAAC,IAAI,CAAC;IAER,IAAIT,IAAI,CAACf,MAAM,GAAGI,MAAM,CAACiB,WAAW,GAAGJ,SAAS,EAAE;MAChDxB,OAAO,CAACI,KAAK,GAAG,KAAK;MACrBH,aAAa,CAACG,KAAK,GAAGoB,SAAS;IACjC,CAAC,MAAM,IACJJ,SAAS,KAAK,IAAI,IAAIpB,OAAO,CAACI,KAAK,KAAK,QAAQ,IAChDgB,SAAS,KAAK,MAAM,IAAIpB,OAAO,CAACI,KAAK,KAAK,KAAM,EACjD;MACAH,aAAa,CAACG,KAAK,GAAGO,MAAM,CAACU,OAAO,GAAGC,IAAI,CAACjB,GAAG,GAAGwB,UAAU;MAC5D7B,OAAO,CAACI,KAAK,GAAG,IAAI;IACtB,CAAC,MAAM,IAAIgB,SAAS,KAAK,MAAM,IAAId,MAAM,IAAI,CAAC,EAAE;MAC9CL,aAAa,CAACG,KAAK,GAAG,CAAC;MACvBJ,OAAO,CAACI,KAAK,GAAG,QAAQ;IAC1B,CAAC,MAAM,IAAIgB,SAAS,KAAK,IAAI,IAAIf,GAAG,IAAI,CAAC,EAAE;MACzC,IAAI,CAACwB,UAAU,EAAE;QACf5B,aAAa,CAACG,KAAK,GAAGkB,IAAI,CAACjB,GAAG,GAAGA,GAAG;QACpCL,OAAO,CAACI,KAAK,GAAG,KAAK;MACvB,CAAC,MAAM,IAAIJ,OAAO,CAACI,KAAK,KAAK,KAAK,EAAE;QAClCH,aAAa,CAACG,KAAK,GAAG,CAACC,GAAG,GAAGwB,UAAU,GAAGL,SAAS;QACnDxB,OAAO,CAACI,KAAK,GAAG,KAAK;MACvB;IACF;IAEAc,aAAa,GAAGP,MAAM,CAACU,OAAO;EAChC;EAEA,OAAO;IAAErB,OAAO,EAAPA,OAAO;IAAEE,YAAY,EAAZA;EAAa,CAAC;AAClC"}