{"version":3,"file":"prefetchIntent.js","names":[],"sources":["esm/link/prefetchIntent.js"],"sourcesContent":["function createPrefetchIntent(options) {\n  const { onPrefetch, maxReach = 500, perpWeight = 5, minSpeed = 8 } = options;\n  const done = /* @__PURE__ */ new Set();\n  let rects = [];\n  let px = 0, py = 0, vx = 0, vy = 0;\n  let moveCount = 0;\n  let lastPrefetchMove = 0;\n  function setRects(newRects) {\n    rects = newRects.filter((r) => !done.has(r.h));\n  }\n  function move(x, y, dx, dy) {\n    moveCount++;\n    const smooth = moveCount < 3 ? 0.3 : 0.6;\n    vx = vx * smooth + dx * (1 - smooth);\n    vy = vy * smooth + dy * (1 - smooth);\n    px = x;\n    py = y;\n    const speed = Math.sqrt(vx * vx + vy * vy);\n    if (speed < minSpeed) return;\n    const ux = vx / speed;\n    const uy = vy / speed;\n    let best = Infinity;\n    let href = \"\";\n    for (const { r, h } of rects) {\n      const cx = (r.left + r.right) / 2 - px;\n      const cy = (r.top + r.bottom) / 2 - py;\n      const dist = Math.sqrt(cx * cx + cy * cy);\n      const along = cx * ux + cy * uy;\n      if (along < 0) continue;\n      const perpX = cx - along * ux;\n      const perpY = cy - along * uy;\n      const perp = Math.sqrt(perpX * perpX + perpY * perpY);\n      const baseRadius = Math.max(r.width, r.height) / 2 + 30;\n      const distanceFactor = Math.max(0.2, 1 - dist / 1e3);\n      const radius = baseRadius * distanceFactor + 20;\n      if (perp > radius) continue;\n      const score = along + perp * perpWeight;\n      if (score < best) {\n        best = score;\n        href = h;\n      }\n    }\n    if (href && best < maxReach && moveCount - lastPrefetchMove > 1) {\n      done.add(href);\n      rects = rects.filter((r) => r.h !== href);\n      lastPrefetchMove = moveCount;\n      onPrefetch(href);\n    }\n  }\n  const nodes = /* @__PURE__ */ new Map();\n  function observe(el, href) {\n    nodes.set(el, href);\n    return () => {\n      nodes.delete(el);\n      done.delete(href);\n    };\n  }\n  return { setRects, move, observe, nodes, done };\n}\nlet instance = null;\nlet started = false;\nfunction startPrefetchIntent(onPrefetch) {\n  if (started) return instance;\n  started = true;\n  instance = createPrefetchIntent({ onPrefetch });\n  let frame = 0;\n  let px = 0, py = 0;\n  function measure() {\n    if (!instance.nodes.size) return setTimeout(measure, 300);\n    const io = new IntersectionObserver((entries) => {\n      io.disconnect();\n      instance.setRects(\n        entries.filter((e) => e.isIntersecting).map((e) => ({\n          r: e.boundingClientRect,\n          h: instance.nodes.get(e.target)\n        })).filter((x) => x.h)\n      );\n      setTimeout(measure, 300);\n    });\n    instance.nodes.forEach((_, el) => io.observe(el));\n  }\n  measure();\n  document.addEventListener(\n    \"mousemove\",\n    (e) => {\n      if (++frame % 4) return;\n      const dx = e.clientX - px;\n      const dy = e.clientY - py;\n      px = e.clientX;\n      py = e.clientY;\n      instance.move(px, py, dx, dy);\n    },\n    { passive: true }\n  );\n  return instance;\n}\nfunction observePrefetchIntent(el, href) {\n  if (!instance) return () => {\n  };\n  return instance.observe(el, href);\n}\nexport {\n  createPrefetchIntent,\n  observePrefetchIntent,\n  startPrefetchIntent\n};\n//# sourceMappingURL=prefetchIntent.js.map\n"],"mappings":"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"}