UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

1 lines • 5.67 kB
{"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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"}