UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

180 lines (178 loc) 5.01 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var prefetchIntent_exports = {}; __export(prefetchIntent_exports, { createPrefetchIntent: () => createPrefetchIntent, observePrefetchIntent: () => observePrefetchIntent, startPrefetchIntent: () => startPrefetchIntent }); module.exports = __toCommonJS(prefetchIntent_exports); function createPrefetchIntent(options) { var { onPrefetch, maxReach = 500, perpWeight = 5, minSpeed = 8 } = options; var done = /* @__PURE__ */new Set(); var rects = []; var px = 0, py = 0, vx = 0, vy = 0; var moveCount = 0; var lastPrefetchMove = 0; function setRects(newRects) { rects = newRects.filter(function (r) { return !done.has(r.h); }); } function move(x, y, dx, dy) { moveCount++; var smooth = moveCount < 3 ? 0.3 : 0.6; vx = vx * smooth + dx * (1 - smooth); vy = vy * smooth + dy * (1 - smooth); px = x; py = y; var speed = Math.sqrt(vx * vx + vy * vy); if (speed < minSpeed) return; var ux = vx / speed; var uy = vy / speed; var best = Infinity; var href = ""; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = rects[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var { r, h } = _step.value; var cx = (r.left + r.right) / 2 - px; var cy = (r.top + r.bottom) / 2 - py; var dist = Math.sqrt(cx * cx + cy * cy); var along = cx * ux + cy * uy; if (along < 0) continue; var perpX = cx - along * ux; var perpY = cy - along * uy; var perp = Math.sqrt(perpX * perpX + perpY * perpY); var baseRadius = Math.max(r.width, r.height) / 2 + 30; var distanceFactor = Math.max(0.2, 1 - dist / 1e3); var radius = baseRadius * distanceFactor + 20; if (perp > radius) continue; var score = along + perp * perpWeight; if (score < best) { best = score; href = h; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } if (href && best < maxReach && moveCount - lastPrefetchMove > 1) { done.add(href); rects = rects.filter(function (r2) { return r2.h !== href; }); lastPrefetchMove = moveCount; onPrefetch(href); } } var nodes = /* @__PURE__ */new Map(); function observe(el, href) { nodes.set(el, href); return function () { nodes.delete(el); done.delete(href); }; } return { setRects, move, observe, nodes, done }; } var instance = null; var started = false; function startPrefetchIntent(onPrefetch) { if (started) return instance; started = true; instance = createPrefetchIntent({ onPrefetch }); var frame = 0; var px = 0, py = 0; function measure() { if (!instance.nodes.size) return setTimeout(measure, 300); var io = new IntersectionObserver(function (entries) { io.disconnect(); instance.setRects(entries.filter(function (e) { return e.isIntersecting; }).map(function (e) { return { r: e.boundingClientRect, h: instance.nodes.get(e.target) }; }).filter(function (x) { return x.h; })); setTimeout(measure, 300); }); instance.nodes.forEach(function (_, el) { return io.observe(el); }); } measure(); document.addEventListener("mousemove", function (e) { if (++frame % 4) return; var dx = e.clientX - px; var dy = e.clientY - py; px = e.clientX; py = e.clientY; instance.move(px, py, dx, dy); }, { passive: true }); return instance; } function observePrefetchIntent(el, href) { if (!instance) return function () {}; return instance.observe(el, href); } //# sourceMappingURL=prefetchIntent.native.js.map