{"version":3,"file":"use-wheel.mjs","names":[],"sources":["../../../../../../../packages/components/virtual-list/src/hooks/use-wheel.ts"],"sourcesContent":["import { cAF, isFirefox, rAF } from '@element-plus/utils'\nimport { HORIZONTAL } from '../defaults'\n\nimport type { ComputedRef } from 'vue'\nimport type { LayoutDirection } from '../types'\n\ninterface ListWheelState {\n  atStartEdge: ComputedRef<boolean> // exclusive to reachEnd\n  atEndEdge: ComputedRef<boolean>\n  layout: ComputedRef<LayoutDirection>\n}\n\ntype ListWheelHandler = (offset: number) => void\n\nconst useWheel = (\n  { atEndEdge, atStartEdge, layout }: ListWheelState,\n  onWheelDelta: ListWheelHandler\n) => {\n  let frameHandle: number\n  let offset = 0\n\n  const hasReachedEdge = (offset: number) => {\n    const edgeReached =\n      (offset < 0 && atStartEdge.value) || (offset > 0 && atEndEdge.value)\n\n    return edgeReached\n  }\n\n  const onWheel = (e: WheelEvent) => {\n    cAF(frameHandle)\n\n    let { deltaX, deltaY } = e\n    // Special case for windows machine with shift key + wheel scrolling\n    if (e.shiftKey && deltaY !== 0) {\n      deltaX = deltaY\n      deltaY = 0\n    }\n\n    const newOffset = layout.value === HORIZONTAL ? deltaX : deltaY\n\n    if (hasReachedEdge(newOffset)) return\n\n    offset += newOffset\n\n    if (!isFirefox() && newOffset !== 0) {\n      e.preventDefault()\n    }\n\n    frameHandle = rAF(() => {\n      onWheelDelta(offset)\n      offset = 0\n    })\n  }\n\n  return {\n    hasReachedEdge,\n    onWheel,\n  }\n}\n\nexport default useWheel\n"],"mappings":";;;;AAcA,MAAM,YACJ,EAAE,WAAW,aAAa,UAC1B,iBACG;CACH,IAAI;CACJ,IAAI,SAAS;CAEb,MAAM,kBAAkB,WAAmB;EAIzC,OAFG,SAAS,KAAK,YAAY,SAAW,SAAS,KAAK,UAAU;;CAKlE,MAAM,WAAW,MAAkB;EACjC,IAAI,YAAY;EAEhB,IAAI,EAAE,QAAQ,WAAW;EAEzB,IAAI,EAAE,YAAY,WAAW,GAAG;GAC9B,SAAS;GACT,SAAS;;EAGX,MAAM,YAAY,OAAO,UAAA,eAAuB,SAAS;EAEzD,IAAI,eAAe,UAAU,EAAE;EAE/B,UAAU;EAEV,IAAI,CAAC,WAAW,IAAI,cAAc,GAChC,EAAE,gBAAgB;EAGpB,cAAc,UAAU;GACtB,aAAa,OAAO;GACpB,SAAS;IACT;;CAGJ,OAAO;EACL;EACA;EACD"}