{"version":3,"file":"useScrollOverflow.mjs","names":[],"sources":["../../src/ScrollShadow/useScrollOverflow.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from 'react';\n\ninterface ScrollState {\n  bottom: boolean;\n  left: boolean;\n  right: boolean;\n  top: boolean;\n}\n\nconst initialScrollState: ScrollState = {\n  bottom: false,\n  left: false,\n  right: false,\n  top: false,\n};\n\nconst isSameScrollState = (a: ScrollState, b: ScrollState) =>\n  a.bottom === b.bottom && a.left === b.left && a.right === b.right && a.top === b.top;\n\ninterface UseScrollOverflowProps {\n  domRef: RefObject<HTMLElement | null>;\n  isEnabled?: boolean;\n  offset?: number;\n  onVisibilityChange?: (visibility: {\n    bottom?: boolean;\n    left?: boolean;\n    right?: boolean;\n    top?: boolean;\n  }) => void;\n  orientation?: 'vertical' | 'horizontal';\n  updateDeps?: any[];\n}\n\nexport const useScrollOverflow = ({\n  domRef,\n  offset = 0,\n  orientation = 'vertical',\n  isEnabled = true,\n  onVisibilityChange,\n  updateDeps = [],\n}: UseScrollOverflowProps) => {\n  const [scrollState, setScrollState] = useState(initialScrollState);\n  const scrollStateRef = useRef(initialScrollState);\n\n  useEffect(() => {\n    const element = domRef.current;\n    if (!element || !isEnabled) return;\n\n    const checkScroll = () => {\n      const newState = { ...initialScrollState };\n\n      if (orientation === 'vertical') {\n        const hasVerticalScroll = element.scrollHeight > element.clientHeight;\n\n        if (hasVerticalScroll) {\n          newState.top = element.scrollTop > offset;\n          newState.bottom =\n            element.scrollTop + element.clientHeight < element.scrollHeight - offset;\n        } else {\n          newState.top = false;\n          newState.bottom = false;\n        }\n      } else {\n        const hasHorizontalScroll = element.scrollWidth > element.clientWidth;\n\n        if (hasHorizontalScroll) {\n          newState.left = element.scrollLeft > offset;\n          newState.right = element.scrollLeft + element.clientWidth < element.scrollWidth - offset;\n        } else {\n          newState.left = false;\n          newState.right = false;\n        }\n      }\n\n      if (isSameScrollState(scrollStateRef.current, newState)) return;\n\n      scrollStateRef.current = newState;\n      setScrollState(newState);\n      onVisibilityChange?.(newState);\n    };\n\n    // 初始检查\n    checkScroll();\n\n    // 监听滚动事件\n    element.addEventListener('scroll', checkScroll);\n    window.addEventListener('resize', checkScroll);\n\n    // 观察内容变化\n    const resizeObserver = new ResizeObserver(checkScroll);\n    resizeObserver.observe(element);\n\n    return () => {\n      element.removeEventListener('scroll', checkScroll);\n      window.removeEventListener('resize', checkScroll);\n      resizeObserver.disconnect();\n    };\n  }, [domRef, offset, orientation, isEnabled, ...updateDeps]);\n\n  return scrollState;\n};\n"],"mappings":";;AASA,MAAM,qBAAkC;CACtC,QAAQ;CACR,MAAM;CACN,OAAO;CACP,KAAK;CACN;AAED,MAAM,qBAAqB,GAAgB,MACzC,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AAgBnF,MAAa,qBAAqB,EAChC,QACA,SAAS,GACT,cAAc,YACd,YAAY,MACZ,oBACA,aAAa,EAAE,OACa;CAC5B,MAAM,CAAC,aAAa,kBAAkB,SAAS,mBAAmB;CAClE,MAAM,iBAAiB,OAAO,mBAAmB;AAEjD,iBAAgB;EACd,MAAM,UAAU,OAAO;AACvB,MAAI,CAAC,WAAW,CAAC,UAAW;EAE5B,MAAM,oBAAoB;GACxB,MAAM,WAAW,EAAE,GAAG,oBAAoB;AAE1C,OAAI,gBAAgB,WAGlB,KAF0B,QAAQ,eAAe,QAAQ,cAElC;AACrB,aAAS,MAAM,QAAQ,YAAY;AACnC,aAAS,SACP,QAAQ,YAAY,QAAQ,eAAe,QAAQ,eAAe;UAC/D;AACL,aAAS,MAAM;AACf,aAAS,SAAS;;YAGQ,QAAQ,cAAc,QAAQ,aAEjC;AACvB,aAAS,OAAO,QAAQ,aAAa;AACrC,aAAS,QAAQ,QAAQ,aAAa,QAAQ,cAAc,QAAQ,cAAc;UAC7E;AACL,aAAS,OAAO;AAChB,aAAS,QAAQ;;AAIrB,OAAI,kBAAkB,eAAe,SAAS,SAAS,CAAE;AAEzD,kBAAe,UAAU;AACzB,kBAAe,SAAS;AACxB,wBAAqB,SAAS;;AAIhC,eAAa;AAGb,UAAQ,iBAAiB,UAAU,YAAY;AAC/C,SAAO,iBAAiB,UAAU,YAAY;EAG9C,MAAM,iBAAiB,IAAI,eAAe,YAAY;AACtD,iBAAe,QAAQ,QAAQ;AAE/B,eAAa;AACX,WAAQ,oBAAoB,UAAU,YAAY;AAClD,UAAO,oBAAoB,UAAU,YAAY;AACjD,kBAAe,YAAY;;IAE5B;EAAC;EAAQ;EAAQ;EAAa;EAAW,GAAG;EAAW,CAAC;AAE3D,QAAO"}