{"version":3,"file":"simulated_hover.js","names":["n","a","t","bindContainer","rowSelector","container","abortController","pointerX","pointerY","simulatedHoverRow","isDetached","trackPointer","event","clearSimulatedHover","updateSimulatedHover","row","options","setupSimulatedHover"],"sources":["../../static_src/js/scripts/simulated_hover.js"],"sourcesContent":["/**\n * Mirrors hover styling on the element under a stationary pointer while\n * the page scrolls.\n *\n * Browsers only re-evaluate :hover when the pointer moves, so hover-revealed\n * content stays invisible for someone who scrolls without moving the mouse.\n * Wheel events carry pointer coordinates even when it is stationary.\n *\n * Add `data-simulated-hover-rows` to a container element with a CSS\n * selector for the elements that should receive the attribute.\n */\nconst bindContainer = (container) => {\n  const rowSelector = container.dataset.simulatedHoverRows\n  const abortController = new AbortController()\n  let pointerX = null\n  let pointerY = null\n  let simulatedHoverRow = null\n  const isDetached = () => {\n    if (container.isConnected) return false\n    abortController.abort()\n    return true\n  }\n  const trackPointer = (event) => {\n    pointerX = event.clientX\n    pointerY = event.clientY\n  }\n  const clearSimulatedHover = () => {\n    simulatedHoverRow?.removeAttribute(\"data-simulated-hover\")\n    simulatedHoverRow = null\n  }\n  const updateSimulatedHover = () => {\n    if (isDetached() || pointerX === null) return\n    const row = document\n      .elementFromPoint(pointerX, pointerY)\n      ?.closest(rowSelector)\n    if (row === simulatedHoverRow) return\n    clearSimulatedHover()\n    if (row && container.contains(row)) {\n      row.setAttribute(\"data-simulated-hover\", \"\")\n      simulatedHoverRow = row\n    }\n  }\n  const options = { passive: true, signal: abortController.signal }\n  window.addEventListener(\"wheel\", trackPointer, options)\n  window.addEventListener(\"scroll\", updateSimulatedHover, options)\n  window.addEventListener(\n    \"pointermove\",\n    (event) => {\n      if (isDetached()) return\n      trackPointer(event)\n      clearSimulatedHover()\n    },\n    options,\n  )\n}\n\nexport const setupSimulatedHover = () => {\n  document\n    .querySelectorAll(\"[data-simulated-hover-rows]\")\n    .forEach((container) => {\n      if (container._simulatedHoverBound) return\n      container._simulatedHoverBound = true\n      bindContainer(container)\n    })\n}\n\nsetupSimulatedHover()\ndocument.addEventListener(\"htmx:load\", setupSimulatedHover)\n"],"mappings":"CAWA,UAAA,CAAA,GAAA,CAAA,IAAA,EAAA,OAAA,OAAA,IAAA,OAAA,OAAA,OAAA,IAAA,OAAA,OAAA,WAAA,IAAA,WAAA,OAAA,KAAA,IAAA,KAAA,CAAA,EAAA,EAAA,sBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,sBAAA,IAAA,EAAA,MAAA,CAAA,CAAA,OAAA,SAAA,EAAA,CAAA,IAAA,IAAAA,EAAA,EAAAA,EAAA,UAAA,OAAA,IAAA,CAAA,IAAAC,EAAA,UAAAD,GAAA,GAAAC,GAAA,KAAA,IAAA,IAAAC,KAAAD,EAAAA,EAAA,eAAAC,CAAA,IAAA,EAAAA,GAAAD,EAAAC,GAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,EAAA,sBAAA,IAAA,EAAA,MAAA,CAAA,CAAA,OAAA,CAAA,gDAAA,EAAA,CAAA,EAAA,IAAAF,EAAA,IAAA,EAAA,MAAA,CAAA,CAAA,MAAAA,IAAA,EAAA,gBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,gBAAAA,GAAA,uCAAA,EAAA,yBAAA,mDAAA,MAAA,CAAA,CAAA,EAAA,CAAA,EAAA,IAAMG,EAAiB,GAAc,CACnC,IAAMC,EAAcC,EAAU,QAAQ,mBAChCC,EAAkB,IAAI,gBACxBC,EAAW,KACXC,EAAW,KACXC,EAAoB,KAClBC,MACJ,CAAIL,EAAU,cACdC,EAAgB,MAAM,EACf,IAEHK,EAAgB,GAAU,CAC9B,EAAWC,EAAM,QACjB,EAAWA,EAAM,OACnB,EACMC,MAA4B,CAChCJ,GAAmB,gBAAgB,sBAAsB,EACzD,EAAoB,IACtB,EACMK,MAA6B,CACjC,GAAIJ,EAAW,GAAKH,IAAa,KAAM,OACvC,IAAMQ,EAAM,SACT,iBAAiBR,EAAUC,CAAQ,CAAC,EACnC,QAAQJ,CAAW,EACnBW,IAAQN,IACZI,EAAoB,EAChBE,GAAOV,EAAU,SAASU,CAAG,IAC/BA,EAAI,aAAa,uBAAwB,EAAE,EAC3C,EAAoBA,GAExB,EACMC,EAAU,CAAE,QAAS,GAAM,OAAQV,EAAgB,MAAO,EAChE,OAAO,iBAAiB,QAASK,EAAcK,CAAO,EACtD,OAAO,iBAAiB,SAAUF,EAAsBE,CAAO,EAC/D,OAAO,iBACL,cACC,GAAU,CACLN,EAAW,IACfC,EAAaC,CAAK,EAClBC,EAAoB,EACtB,EACAG,CACF,CACF,EAEaC,MAA4B,CACvC,SACG,iBAAiB,6BAA6B,CAAC,CAC/C,QAAS,GAAc,CAClBZ,EAAU,uBACd,EAAU,qBAAuB,GACjCF,EAAcE,CAAS,EACzB,CAAC,CACL,EAEAY,EAAoB,EACpB,SAAS,iBAAiB,YAAaA,CAAmB"}