js.foresight 0.0.17 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=function(){return e=Object.assign||function(e){for(var t,i=1,o=arguments.length;i<o;i++)for(var n in t=arguments[i])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},e.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError;var t=function(){function t(e){this.shadowHost=null,this.shadowRoot=null,this.debugContainer=null,this.debugLinkOverlays=new Map,this.debugPredictedMouseIndicator=null,this.debugTrajectoryLine=null,this.debugControlsContainer=null,this.debugStyleElement=null,this.currentGlobalSettings=null,this.lastElementData=new Map,this.foresightManagerInstance=e}return t.prototype.initialize=function(t,i,o,n){var r=this;"undefined"!=typeof window&&(this.cleanup(),this.currentGlobalSettings=e({},i),this.shadowHost=document.createElement("div"),this.shadowHost.id="jsforesight-debugger-shadow-host",this.shadowHost.style.pointerEvents="none",document.body.appendChild(this.shadowHost),this.shadowRoot=this.shadowHost.attachShadow({mode:"open"}),this.debugStyleElement=document.createElement("style"),this.debugStyleElement.textContent='\n #jsforesight-debug-container {\n position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n pointer-events: none; z-index: 9999;\n }\n .jsforesight-link-overlay {\n position: absolute; border: 2px solid transparent;\n background-color: rgba(0, 0, 255, 0.1); box-sizing: border-box;\n transition: opacity 0.2s ease, border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;\n }\n .jsforesight-link-overlay.active {\n border-color: oklch(83.7% 0.128 66.29); background-color: rgba(255, 0, 0, 0.1);\n }\n .jsforesight-link-overlay.trajectory-hit {\n border-color: oklch(89.7% 0.196 126.665); background-color: rgba(0, 255, 0, 0.3);\n box-shadow: 0 0 10px rgba(0, 255, 0, 0.8);\n }\n .jsforesight-expanded-overlay {\n position: absolute; border: 1px dashed rgba(0, 0, 255, 0.3);\n background-color: rgba(0, 0, 255, 0.05); box-sizing: border-box;\n }\n .jsforesight-mouse-predicted {\n position: absolute; width: 20px; height: 20px; border-radius: 50%;\n border: 2px solid oklch(83.7% 0.128 66.29); background-color: rgba(255, 165, 0, 0.3);\n transform: translate(-50%, -50%); z-index: 10000;\n }\n .jsforesight-trajectory-line {\n position: absolute; height: 2px; background-color: rgba(255, 100, 0, 0.5);\n transform-origin: left center; z-index: 9999;\n }\n .jsforesight-name-label {\n position: absolute;\n background-color: rgba(0, 0, 0, 0.75);\n color: white;\n padding: 3px 6px;\n font-size: 11px;\n font-family: Arial, sans-serif;\n border-radius: 3px;\n z-index: 10001;\n white-space: nowrap;\n pointer-events: none;\n }\n #jsforesight-debug-controls {\n position: fixed; bottom: 10px; right: 10px;\n background-color: rgba(0, 0, 0, 0.75); color: white; padding: 12px;\n border-radius: 5px; font-family: Arial, sans-serif; font-size: 13px;\n z-index: 10001; pointer-events: auto; display: flex; flex-direction: column; gap: 8px;\n min-width: 300px;\n }\n .jsforesight-debugger-title-container {\n display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 8px;\n }\n .jsforesight-debugger-title-container h3 { margin: 0; font-size: 15px; }\n #jsforesight-debug-controls label { display: flex; align-items: center; gap: 5px; cursor: pointer; }\n #jsforesight-debug-controls input[type="range"] { flex-grow: 1; margin: 0 5px; cursor: pointer;}\n #jsforesight-debug-controls input[type="checkbox"] { margin-right: 5px; cursor: pointer; }\n #jsforesight-debug-controls .control-row { display: flex; align-items: center; justify-content: space-between; }\n #jsforesight-debug-controls .control-row label { flex-basis: auto; }\n #jsforesight-debug-controls .control-row span:not(.jsforesight-info-icon) { min-width: 30px; text-align: right; }\n .jsforesight-info-icon {\n display: inline-flex; align-items: center; justify-content: center;\n width: 16px; height: 16px; border-radius: 50%;\n background-color: #555; color: white;\n font-size: 10px; font-style: italic; font-weight: bold;\n font-family: \'Georgia\', serif;\n cursor: help; user-select: none;\n flex-shrink: 0;\n }\n .jsforesight-prefetch-indicator {\n position: absolute;\n background-color: black;\n color: white;\n padding: 3px 6px; /* Smaller padding */\n font-size: 10px; /* Smaller font */\n font-family: Arial, sans-serif;\n font-weight: bold;\n border-radius: 4px; /* Slightly smaller radius */\n z-index: 10002;\n white-space: nowrap;\n pointer-events: none;\n opacity: 1;\n transition: transform 0.6s cubic-bezier(0.15, 0.5, 0.35, 1), /* Shorter duration */\n opacity 0.6s cubic-bezier(0.4, 0, 0.8, 1); /* Shorter duration */\n }\n ',this.shadowRoot.appendChild(this.debugStyleElement),this.debugContainer=document.createElement("div"),this.debugContainer.id="jsforesight-debug-container",this.shadowRoot.appendChild(this.debugContainer),this.debugPredictedMouseIndicator=document.createElement("div"),this.debugPredictedMouseIndicator.className="jsforesight-mouse-predicted",this.debugContainer.appendChild(this.debugPredictedMouseIndicator),this.debugTrajectoryLine=document.createElement("div"),this.debugTrajectoryLine.className="jsforesight-trajectory-line",this.debugContainer.appendChild(this.debugTrajectoryLine),this.createDebugControls(i),this.lastElementData.clear(),t.forEach((function(e,t){r.createOrUpdateLinkOverlay(t,e)})),this.updateTrajectoryVisuals(o,n,i.enableMousePrediction))},t.prototype.cleanup=function(){var e;null===(e=this.shadowHost)||void 0===e||e.remove(),this.shadowHost=null,this.shadowRoot=null,this.debugLinkOverlays.forEach((function(e){e.linkOverlay.remove(),e.expandedOverlay.remove(),e.nameLabel.remove()})),this.debugLinkOverlays.clear(),this.lastElementData.clear(),this.debugContainer&&this.debugContainer.querySelectorAll(".jsforesight-prefetch-indicator").forEach((function(e){return e.remove()}))},t.prototype.showPrefetchAnimation=function(e){if(this.debugContainer){var t=e.getBoundingClientRect();if(0!==t.width||0!==t.height){var i=document.createElement("div");i.className="jsforesight-prefetch-indicator",i.textContent="Prefetched",this.debugContainer.appendChild(i);var o=t.left+t.width/2,n=t.top+t.height/2,r=80*(Math.random()-.5),s=-50-30*Math.random();i.style.left="".concat(o,"px"),i.style.top="".concat(n,"px"),i.style.opacity="1",i.style.transform="translate(-50%, -50%) translate(0px, 0px) scale(0.7)",i.offsetWidth,i.style.opacity="0",i.style.transform="translate(-50%, -50%) translate(".concat(r,"px, ").concat(s,"px) scale(1)"),setTimeout((function(){i.remove()}),800)}}},t.prototype.createOrUpdateLinkOverlay=function(e,t){if(this.debugContainer&&this.shadowRoot){if(this.currentGlobalSettings){var i=this.lastElementData.get(e),o=!1,n=t.isTrajectoryHit&&(!i||!i.isTrajectoryHit),r=t.isHovering&&(!i||!i.isHovering);(n||r&&(!t.isTrajectoryHit||t.isTrajectoryHit&&!this.currentGlobalSettings.enableMousePrediction))&&(o=!0),o&&this.showPrefetchAnimation(e)}this.lastElementData.set(e,{isHovering:t.isHovering,isTrajectoryHit:t.isTrajectoryHit});var s=this.debugLinkOverlays.get(e);if(!s){var a=document.createElement("div");a.className="jsforesight-link-overlay",this.debugContainer.appendChild(a);var l=document.createElement("div");l.className="jsforesight-expanded-overlay",this.debugContainer.appendChild(l);var d=document.createElement("div");d.className="jsforesight-name-label",this.debugContainer.appendChild(d),s={linkOverlay:a,expandedOverlay:l,nameLabel:d},this.debugLinkOverlays.set(e,s)}var c=s.linkOverlay,h=s.expandedOverlay,u=s.nameLabel,g=e.getBoundingClientRect();c.style.left="".concat(g.left,"px"),c.style.top="".concat(g.top,"px"),c.style.width="".concat(g.width,"px"),c.style.height="".concat(g.height,"px"),c.classList.toggle("trajectory-hit",t.isTrajectoryHit),c.classList.toggle("active",t.isHovering),t.elementBounds.expandedRect?(h.style.left="".concat(t.elementBounds.expandedRect.left,"px"),h.style.top="".concat(t.elementBounds.expandedRect.top,"px"),h.style.width="".concat(t.elementBounds.expandedRect.right-t.elementBounds.expandedRect.left,"px"),h.style.height="".concat(t.elementBounds.expandedRect.bottom-t.elementBounds.expandedRect.top,"px"),h.style.display="block"):h.style.display="none",t.name&&"Unnamed"!==t.name?(u.textContent=t.name,u.style.display="block",u.style.left="".concat(g.left,"px"),u.style.top="".concat(g.top-22,"px")):u.style.display="none"}},t.prototype.removeLinkOverlay=function(e){var t=this.debugLinkOverlays.get(e);t&&(t.linkOverlay.remove(),t.expandedOverlay.remove(),t.nameLabel.remove(),this.debugLinkOverlays.delete(e)),this.lastElementData.delete(e)},t.prototype.updateAllLinkVisuals=function(e){var t=this;if(this.shadowRoot&&this.debugContainer){var i=new Set(e.keys());this.debugLinkOverlays.forEach((function(e,o){i.has(o)||t.removeLinkOverlay(o)})),e.forEach((function(e,i){t.createOrUpdateLinkOverlay(i,e)}))}},t.prototype.updateTrajectoryVisuals=function(e,t,i){if(this.shadowRoot&&this.debugContainer&&(this.debugPredictedMouseIndicator&&(this.debugPredictedMouseIndicator.style.left="".concat((null==t?void 0:t.x)||0,"px"),this.debugPredictedMouseIndicator.style.top="".concat((null==t?void 0:t.y)||0,"px"),this.debugPredictedMouseIndicator.style.display=i&&t?"block":"none"),this.debugTrajectoryLine))if(i&&e&&t){var o=t.x-e.x,n=t.y-e.y,r=Math.sqrt(o*o+n*n),s=180*Math.atan2(n,o)/Math.PI;this.debugTrajectoryLine.style.left="".concat(e.x,"px"),this.debugTrajectoryLine.style.top="".concat(e.y,"px"),this.debugTrajectoryLine.style.width="".concat(r,"px"),this.debugTrajectoryLine.style.transform="translateY(-50%) rotate(".concat(s,"deg)"),this.debugTrajectoryLine.style.display="block"}else this.debugTrajectoryLine.style.display="none"},t.prototype.createDebugControls=function(e){var t=this;if(this.shadowRoot){this.debugControlsContainer=document.createElement("div"),this.debugControlsContainer.id="jsforesight-debug-controls",this.shadowRoot.appendChild(this.debugControlsContainer),this.debugControlsContainer.innerHTML='\n <div class="jsforesight-debugger-title-container">\n <h3>Foresight Debugger</h3>\n <span class="jsforesight-info-icon" title="Changes made here are for the current session only and won\'t persist. Update initial values in the ForesightManager.initialize() props for permanent changes.">i</span>\n </div>\n <div class="control-row">\n <label for="jsforesight-trajectory-enabled">\n Enable Mouse Prediction\n <span class="jsforesight-info-icon" title="Toggles mouse movement prediction. If disabled, only direct hovers trigger actions.">i</span>\n </label>\n <input type="checkbox" id="jsforesight-trajectory-enabled" '.concat(e.enableMousePrediction?"checked":"",'>\n </div>\n <div class="control-row">\n <label for="jsforesight-history-size">\n History Size\n <span class="jsforesight-info-icon" title="Number of past mouse positions for velocity calculation (Min: 2, Max: 20). Higher values smooth predictions but add latency.">i</span>\n </label>\n <input type="range" id="jsforesight-history-size" min="2" max="20" value="').concat(e.positionHistorySize,'">\n <span id="jsforesight-history-value">').concat(e.positionHistorySize,'</span>\n </div>\n <div class="control-row">\n <label for="jsforesight-prediction-time">\n Prediction Time (ms)\n <span class="jsforesight-info-icon" title="How far (ms) to project trajectory (Min: 10, Max: 500). Larger values detect intent sooner.">i</span>\n </label>\n <input type="range" id="jsforesight-prediction-time" min="10" max="500" step="10" value="').concat(e.trajectoryPredictionTime,'">\n <span id="jsforesight-prediction-value">').concat(e.trajectoryPredictionTime,'</span>\n </div>\n <div class="control-row">\n <label for="jsforesight-throttle-delay">\n Scroll/Resize Throttle (ms)\n <span class="jsforesight-info-icon" title="Delay (ms) for recalculating element positions on resize/scroll (Min: 0, Max: 500). Higher values improve performance during rapid events.">i</span>\n </label>\n <input type="range" id="jsforesight-throttle-delay" min="0" max="500" step="10" value="').concat(e.resizeScrollThrottleDelay,'">\n <span id="jsforesight-throttle-value">').concat(e.resizeScrollThrottleDelay,"</span>\n </div>\n ");var i=this.debugControlsContainer.querySelector("#jsforesight-trajectory-enabled");i.addEventListener("change",(function(){t.foresightManagerInstance.alterGlobalSettings({enableMousePrediction:i.checked})}));var o=this.debugControlsContainer.querySelector("#jsforesight-history-size"),n=this.debugControlsContainer.querySelector("#jsforesight-history-value");o.addEventListener("input",(function(){var e=parseInt(o.value);n.textContent=e.toString(),t.foresightManagerInstance.alterGlobalSettings({positionHistorySize:e})}));var r=this.debugControlsContainer.querySelector("#jsforesight-prediction-time"),s=this.debugControlsContainer.querySelector("#jsforesight-prediction-value");r.addEventListener("input",(function(){var e=parseInt(r.value);s.textContent=e.toString(),t.foresightManagerInstance.alterGlobalSettings({trajectoryPredictionTime:e})}));var a=this.debugControlsContainer.querySelector("#jsforesight-throttle-delay"),l=this.debugControlsContainer.querySelector("#jsforesight-throttle-value");a.addEventListener("input",(function(){var e=parseInt(a.value);l.textContent=e.toString(),t.foresightManagerInstance.alterGlobalSettings({resizeScrollThrottleDelay:e})}))}},t.prototype.updateControlsState=function(t){if(this.currentGlobalSettings=e({},t),this.debugControlsContainer){var i=this.debugControlsContainer.querySelector("#jsforesight-trajectory-enabled");i&&(i.checked=t.enableMousePrediction);var o=this.debugControlsContainer.querySelector("#jsforesight-history-size"),n=this.debugControlsContainer.querySelector("#jsforesight-history-value");o&&n&&(o.value=t.positionHistorySize.toString(),n.textContent=t.positionHistorySize.toString());var r=this.debugControlsContainer.querySelector("#jsforesight-prediction-time"),s=this.debugControlsContainer.querySelector("#jsforesight-prediction-value");r&&s&&(r.value=t.trajectoryPredictionTime.toString(),s.textContent=t.trajectoryPredictionTime.toString());var a=this.debugControlsContainer.querySelector("#jsforesight-throttle-delay"),l=this.debugControlsContainer.querySelector("#jsforesight-throttle-value");a&&l&&(a.value=t.resizeScrollThrottleDelay.toString(),l.textContent=t.resizeScrollThrottleDelay.toString())}},t}(),i=function(){function i(){var t=this;this.elements=new Map,this.isSetup=!1,this.debugMode=!1,this.debugger=null,this.globalSettings={debug:!1,enableMousePrediction:!0,positionHistorySize:8,trajectoryPredictionTime:80,defaultHitSlop:{top:0,left:0,right:0,bottom:0},resizeScrollThrottleDelay:50},this.positions=[],this.currentPoint={x:0,y:0},this.predictedPoint={x:0,y:0},this.lastResizeScrollCallTimestamp=0,this.resizeScrollThrottleTimeoutId=null,this.domObserver=null,this.lastDomMutationRectsUpdateTimestamp=0,this.domMutationRectsUpdateTimeoutId=null,this.elementResizeObserver=null,this.normalizeHitSlop=function(e){return"number"==typeof e?{top:e,left:e,right:e,bottom:e}:e},this.predictMousePosition=function(e){var i={point:e,time:performance.now()},o=e.x,n=e.y;if(t.positions.push(i),t.positions.length>t.globalSettings.positionHistorySize&&t.positions.shift(),t.positions.length<2)return{x:o,y:n};var r=t.positions[0],s=t.positions[t.positions.length-1],a=(s.time-r.time)/1e3;if(0===a)return{x:o,y:n};var l=(s.point.x-r.point.x)/a,d=(s.point.y-r.point.y)/a,c=t.globalSettings.trajectoryPredictionTime/1e3;return{x:o+l*c,y:n+d*c}},this.handleMouseMove=function(i){t.currentPoint={x:i.clientX,y:i.clientY},t.predictedPoint=t.globalSettings.enableMousePrediction?t.predictMousePosition(t.currentPoint):t.currentPoint;var o=[];t.elements.forEach((function(i,n){var r=e({},i),s=!1,a=r.isHovering,l=r.isTrajectoryHit,d=r.trajectoryHitTime,c=r.elementBounds.expandedRect,h=t.currentPoint.x>=c.left&&t.currentPoint.x<=c.right&&t.currentPoint.y>=c.top&&t.currentPoint.y<=c.bottom,u=!1;if(!t.globalSettings.enableMousePrediction||h||r.isTrajectoryHit||t.lineSegmentIntersectsRect(t.currentPoint,t.predictedPoint,c)&&(u=!0),u&&(r.callback(),s=!0,l=!0,d=performance.now()),h&&!r.isHovering){var g=!r.isTrajectoryHit||r.isTrajectoryHit&&!t.globalSettings.enableMousePrediction;!s&&g&&r.callback()}a=h;var p=e(e({},r),{elementBounds:r.elementBounds,isHovering:a,isTrajectoryHit:l,trajectoryHitTime:d});(p.isHovering!==r.isHovering||p.isTrajectoryHit!==r.isTrajectoryHit||p.isTrajectoryHit&&p.trajectoryHitTime!==r.trajectoryHitTime)&&(t.elements.set(n,p),o.push(n))})),t.debugMode&&t.debugger&&(o.forEach((function(e){var i=t.elements.get(e);i&&t.debugger.createOrUpdateLinkOverlay(e,i)})),t.debugger.updateTrajectoryVisuals(t.currentPoint,t.predictedPoint,t.globalSettings.enableMousePrediction))},this.handleResizeOrScroll=function(){t.resizeScrollThrottleTimeoutId&&clearTimeout(t.resizeScrollThrottleTimeoutId);var e=performance.now(),i=e-t.lastResizeScrollCallTimestamp,o=t.globalSettings.resizeScrollThrottleDelay;i>=o?(t.updateAllRects(),t.lastResizeScrollCallTimestamp=e,t.resizeScrollThrottleTimeoutId=null):t.resizeScrollThrottleTimeoutId=setTimeout((function(){t.updateAllRects(),t.lastResizeScrollCallTimestamp=performance.now(),t.resizeScrollThrottleTimeoutId=null}),o-i)},this.handleElementResize=function(e){for(var i=0,o=e;i<o.length;i++){var n=o[i].target,r=t.elements.get(n);r&&t.updateExpandedRect(n,r.elementBounds.hitSlop)}},this.handleDomMutations=function(e){for(var i=!1,o=0,n=e;o<n.length;o++){var r=n[o];if("childList"===r.type&&r.removedNodes.length>0)for(var s=0,a=Array.from(t.elements.keys());s<a.length;s++){var l=a[s];l.isConnected||t.elements.has(l)&&t.unregister(l)}"childList"!==r.type&&("attributes"!==r.type||"style"!==r.attributeName&&"class"!==r.attributeName)||(i=!0)}if(i&&t.elements.size>0){t.domMutationRectsUpdateTimeoutId&&clearTimeout(t.domMutationRectsUpdateTimeoutId);var d=performance.now(),c=t.globalSettings.resizeScrollThrottleDelay;d-t.lastDomMutationRectsUpdateTimestamp>=c&&(console.log("DOM Mutation: Updating all rects immediately"),t.updateAllRects(),t.lastDomMutationRectsUpdateTimestamp=d,t.domMutationRectsUpdateTimeoutId=null)}},this.globalSettings.defaultHitSlop=this.normalizeHitSlop(this.globalSettings.defaultHitSlop),setInterval(this.checkTrajectoryHitExpiration.bind(this),100)}return i.initialize=function(e){return i.manager?e&&(console.warn("ForesightManager is already initialized. Use alterGlobalSettings to update settings. Make sure to not put the ForesightManager.initialize() in a place that rerenders often."),i.manager.alterGlobalSettings(e)):(i.manager=new i,e?i.manager.alterGlobalSettings(e):i.manager.globalSettings.debug&&i.manager.turnOnDebugMode()),i.manager.debugMode=i.manager.globalSettings.debug,i.manager},Object.defineProperty(i,"instance",{get:function(){return i.manager?i.manager:this.initialize()},enumerable:!1,configurable:!0}),i.prototype.checkTrajectoryHitExpiration=function(){var t=this,i=performance.now(),o=[];this.elements.forEach((function(n,r){n.isTrajectoryHit&&i-n.trajectoryHitTime>200&&(t.elements.set(r,e(e({},n),{isTrajectoryHit:!1})),o.push(r))})),o.length>0&&this.debugMode&&this.debugger&&o.forEach((function(e){var i=t.elements.get(e);i&&t.debugger.createOrUpdateLinkOverlay(e,i)}))},i.prototype.register=function(e,t,i,o){var n=this,r=i?this.normalizeHitSlop(i):this.globalSettings.defaultHitSlop,s=e.getBoundingClientRect(),a={callback:t,elementBounds:{expandedRect:this.getExpandedRect(s,r),originalRect:s,hitSlop:r},isHovering:!1,isTrajectoryHit:!1,trajectoryHitTime:0,name:null!=o?o:"Unnamed"};if(this.elements.set(e,a),this.isSetup||this.setupGlobalListeners(),this.elementResizeObserver&&this.elementResizeObserver.observe(e),this.debugMode&&this.debugger){var l=this.elements.get(e);l&&this.debugger.createOrUpdateLinkOverlay(e,l)}return function(){return n.unregister(e)}},i.prototype.unregister=function(e){var t;this.elements.has(e)?(console.log("Unregistering element:",(null===(t=this.elements.get(e))||void 0===t?void 0:t.name)||e),this.elementResizeObserver&&this.elementResizeObserver.unobserve(e),this.debugMode&&this.debugger&&this.debugger.removeLinkOverlay(e),this.elements.delete(e),0===this.elements.size&&this.isSetup&&this.removeGlobalListeners()):console.log("Attempted to unregister element not found:",e)},i.prototype.alterGlobalSettings=function(e){var t=this,i=!1;void 0!==(null==e?void 0:e.positionHistorySize)&&this.globalSettings.positionHistorySize!==e.positionHistorySize&&(this.globalSettings.positionHistorySize=e.positionHistorySize,i=!0),void 0!==(null==e?void 0:e.trajectoryPredictionTime)&&this.globalSettings.trajectoryPredictionTime!==e.trajectoryPredictionTime&&(this.globalSettings.trajectoryPredictionTime=e.trajectoryPredictionTime,i=!0),void 0!==(null==e?void 0:e.enableMousePrediction)&&this.globalSettings.enableMousePrediction!==e.enableMousePrediction&&(this.globalSettings.enableMousePrediction=e.enableMousePrediction,i=!0,this.globalSettings.enableMousePrediction?this.predictedPoint=this.predictMousePosition(this.currentPoint):this.predictedPoint=this.currentPoint),void 0!==(null==e?void 0:e.defaultHitSlop)&&JSON.stringify(this.globalSettings.defaultHitSlop)!==JSON.stringify(this.normalizeHitSlop(e.defaultHitSlop))&&(this.globalSettings.defaultHitSlop=this.normalizeHitSlop(e.defaultHitSlop),i=!0,this.elements.forEach((function(e,i){t.updateExpandedRect(i,e.elementBounds.hitSlop)}))),void 0!==(null==e?void 0:e.resizeScrollThrottleDelay)&&this.globalSettings.resizeScrollThrottleDelay!==e.resizeScrollThrottleDelay&&(this.globalSettings.resizeScrollThrottleDelay=e.resizeScrollThrottleDelay,i=!0),void 0!==(null==e?void 0:e.debug)&&this.globalSettings.debug!==e.debug&&(this.globalSettings.debug=e.debug,i=!0,this.globalSettings.debug?this.turnOnDebugMode():this.debugger&&(this.debugger.cleanup(),this.debugger=null),this.debugMode=this.globalSettings.debug),i&&this.globalSettings.debug&&this.debugger&&(this.debugger.updateControlsState(this.globalSettings),this.debugger.updateTrajectoryVisuals(this.currentPoint,this.predictedPoint,this.globalSettings.enableMousePrediction),this.elements.forEach((function(e,i){t.debugger.createOrUpdateLinkOverlay(i,e)})))},i.prototype.turnOnDebugMode=function(){this.debugMode=!0,this.debugger?(this.debugger.updateControlsState(this.globalSettings),this.debugger.updateAllLinkVisuals(this.elements),this.debugger.updateTrajectoryVisuals(this.currentPoint,this.predictedPoint,this.globalSettings.enableMousePrediction)):(this.debugger=new t(this),this.debugger.initialize(this.elements,this.globalSettings,this.currentPoint,this.predictedPoint))},i.prototype.getExpandedRect=function(e,t){return{left:e.left-t.left,right:e.right+t.right,top:e.top-t.top,bottom:e.bottom+t.bottom}},i.prototype.updateExpandedRect=function(t,i){var o=this.elements.get(t);if(o){var n=t.getBoundingClientRect(),r=o.elementBounds.hitSlop,s=this.getExpandedRect(n,r);if((JSON.stringify(s)!==JSON.stringify(o.elementBounds.expandedRect)||JSON.stringify(n)!==JSON.stringify(o.elementBounds.originalRect))&&(this.elements.set(t,e(e({},o),{elementBounds:e(e({},o.elementBounds),{originalRect:n,expandedRect:s})})),this.debugMode&&this.debugger)){var a=this.elements.get(t);a&&this.debugger.createOrUpdateLinkOverlay(t,a)}}},i.prototype.updateAllRects=function(){var e=this;this.elements.forEach((function(t,i){e.updateExpandedRect(i,t.elementBounds.hitSlop)}))},i.prototype.lineSegmentIntersectsRect=function(e,t,i){var o=0,n=1,r=t.x-e.x,s=t.y-e.y,a=function(e,t){if(0===e){if(t<0)return!1}else{var i=t/e;if(e<0){if(i>n)return!1;i>o&&(o=i)}else{if(i<o)return!1;i<n&&(n=i)}}return!0};return!!a(-r,e.x-i.left)&&(!!a(r,i.right-e.x)&&(!!a(-s,e.y-i.top)&&(!!a(s,i.bottom-e.y)&&o<=n)))},i.prototype.setupGlobalListeners=function(){var e=this;console.log("Setting up global listeners"),this.isSetup||(document.addEventListener("mousemove",this.handleMouseMove),window.addEventListener("resize",this.handleResizeOrScroll),window.addEventListener("scroll",this.handleResizeOrScroll),this.domObserver||(this.domObserver=new MutationObserver(this.handleDomMutations)),this.domObserver.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0}),this.elementResizeObserver||(this.elementResizeObserver=new ResizeObserver(this.handleElementResize),this.elements.forEach((function(t,i){return e.elementResizeObserver.observe(i)}))),this.isSetup=!0)},i.prototype.removeGlobalListeners=function(){document.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("resize",this.handleResizeOrScroll),window.removeEventListener("scroll",this.handleResizeOrScroll),this.resizeScrollThrottleTimeoutId&&(clearTimeout(this.resizeScrollThrottleTimeoutId),this.resizeScrollThrottleTimeoutId=null),this.domMutationRectsUpdateTimeoutId&&(clearTimeout(this.domMutationRectsUpdateTimeoutId),this.domMutationRectsUpdateTimeoutId=null),this.domObserver&&this.domObserver.disconnect(),this.elementResizeObserver&&this.elementResizeObserver.disconnect(),this.isSetup=!1},i}();exports.ForesightManager=i;
1
+ "use strict";var e=function(){return e=Object.assign||function(e){for(var t,i=1,n=arguments.length;i<n;i++)for(var o in t=arguments[i])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},e.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError;var t=function(){function t(e){this.shadowHost=null,this.shadowRoot=null,this.debugContainer=null,this.debugLinkOverlays=new Map,this.debugPredictedMouseIndicator=null,this.debugTrajectoryLine=null,this.debugControlsContainer=null,this.debugStyleElement=null,this.currentGlobalSettings=null,this.lastElementData=new Map,this.debugElementListContainer=null,this.debugElementListItems=new Map,this.elementCountSpan=null,this.foresightManagerInstance=e}return t.prototype.initialize=function(t,i,n,o){var s=this;"undefined"!=typeof window&&(this.cleanup(),this.currentGlobalSettings=e({},i),this.shadowHost=document.createElement("div"),this.shadowHost.id="jsforesight-debugger-shadow-host",this.shadowHost.style.pointerEvents="none",document.body.appendChild(this.shadowHost),this.shadowRoot=this.shadowHost.attachShadow({mode:"open"}),this.debugStyleElement=document.createElement("style"),this.debugStyleElement.textContent='\n #jsforesight-debug-container {\n position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n pointer-events: none; z-index: 9999;\n }\n .jsforesight-link-overlay {\n position: absolute; border: 2px solid transparent;\n background-color: rgba(0, 0, 255, 0.1); box-sizing: border-box;\n transition: opacity 0.2s ease, border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;\n }\n .jsforesight-link-overlay.active {\n border-color: oklch(83.7% 0.128 66.29); background-color: rgba(255, 0, 0, 0.1);\n }\n .jsforesight-link-overlay.trajectory-hit {\n border-color: oklch(89.7% 0.196 126.665); background-color: rgba(0, 255, 0, 0.3);\n box-shadow: 0 0 10px rgba(0, 255, 0, 0.8);\n }\n .jsforesight-expanded-overlay {\n position: absolute; border: 1px dashed rgba(0, 0, 255, 0.3);\n background-color: rgba(0, 0, 255, 0.05); box-sizing: border-box;\n }\n .jsforesight-mouse-predicted {\n position: absolute; width: 20px; height: 20px; border-radius: 50%;\n border: 2px solid oklch(83.7% 0.128 66.29); background-color: rgba(255, 165, 0, 0.3);\n transform: translate(-50%, -50%); z-index: 10000;\n }\n .jsforesight-trajectory-line {\n position: absolute; height: 2px; background-color: rgba(255, 100, 0, 0.5);\n transform-origin: left center; z-index: 9999;\n }\n .jsforesight-name-label {\n position: absolute;\n background-color: rgba(0, 0, 0, 0.75);\n color: white;\n padding: 3px 6px;\n font-size: 11px;\n font-family: Arial, sans-serif;\n border-radius: 3px;\n z-index: 10001;\n white-space: nowrap;\n pointer-events: none;\n }\n #jsforesight-debug-controls {\n position: fixed; bottom: 10px; right: 10px;\n background-color: rgba(0, 0, 0, 0.75); color: white; padding: 12px;\n border-radius: 5px; font-family: Arial, sans-serif; font-size: 13px;\n z-index: 10001; pointer-events: auto; display: flex; flex-direction: column; gap: 8px;\n min-width: 300px; max-width: 350px; /* Added max-width */\n }\n .jsforesight-debugger-title-container {\n display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 8px;\n }\n .jsforesight-debugger-title-container h3 { margin: 0; font-size: 15px; }\n #jsforesight-debug-controls label { display: flex; align-items: center; gap: 5px; cursor: pointer; }\n #jsforesight-debug-controls input[type="range"] { flex-grow: 1; margin: 0 5px; cursor: pointer;}\n #jsforesight-debug-controls input[type="checkbox"] { margin-right: 5px; cursor: pointer; }\n #jsforesight-debug-controls .control-row { display: flex; align-items: center; justify-content: space-between; }\n #jsforesight-debug-controls .control-row label { flex-basis: auto; }\n #jsforesight-debug-controls .control-row span:not(.jsforesight-info-icon) { min-width: 30px; text-align: right; }\n .jsforesight-info-icon {\n display: inline-flex; align-items: center; justify-content: center;\n width: 16px; height: 16px; border-radius: 50%;\n background-color: #555; color: white;\n font-size: 10px; font-style: italic; font-weight: bold;\n font-family: \'Georgia\', serif;\n cursor: help; user-select: none;\n flex-shrink: 0;\n }\n .jsforesight-prefetch-indicator {\n position: absolute;\n background-color: black;\n color: white;\n padding: 3px 6px;\n font-size: 10px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n border-radius: 4px;\n z-index: 10002;\n white-space: nowrap;\n pointer-events: none;\n opacity: 1;\n transition: transform 0.6s cubic-bezier(0.15, 0.5, 0.35, 1),\n opacity 0.6s cubic-bezier(0.4, 0, 0.8, 1);\n }\n .jsforesight-debugger-section {\n margin-top: 15px;\n padding-top: 10px;\n border-top: 1px solid #444;\n }\n .jsforesight-debugger-section h4 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: bold;\n }\n .jsforesight-element-list {\n max-height: 150px;\n overflow-y: auto;\n background-color: rgba(20, 20, 20, 0.5);\n border-radius: 3px;\n padding: 5px;\n font-size: 12px;\n }\n .jsforesight-element-list-item {\n padding: 4px 6px;\n margin-bottom: 3px;\n border-radius: 2px;\n display: flex;\n align-items: center;\n gap: 6px;\n background-color: rgba(50,50,50,0.7);\n transition: background-color 0.2s ease;\n }\n .jsforesight-element-list-item:last-child {\n margin-bottom: 0;\n }\n .jsforesight-element-list-item .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background-color: #777; /* Default */\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 8px;\n }\n .jsforesight-element-list-item.hovering .status-indicator {\n background-color: oklch(83.7% 0.128 66.29 / 0.7);\n }\n .jsforesight-element-list-item.trajectory-hit .status-indicator {\n background-color: oklch(89.7% 0.196 126.665 / 0.7);\n }\n .jsforesight-element-list-item.hovering.trajectory-hit .status-indicator {\n background: linear-gradient(45deg, oklch(89.7% 0.196 126.665 / 0.7) 50%, oklch(83.7% 0.128 66.29 / 0.7) 50%);\n }\n .jsforesight-element-list-item .element-name {\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .jsforesight-element-list-item .element-details {\n font-size: 10px;\n color: #ccc;\n flex-shrink: 0;\n }\n ',this.shadowRoot.appendChild(this.debugStyleElement),this.debugContainer=document.createElement("div"),this.debugContainer.id="jsforesight-debug-container",this.shadowRoot.appendChild(this.debugContainer),this.debugPredictedMouseIndicator=document.createElement("div"),this.debugPredictedMouseIndicator.className="jsforesight-mouse-predicted",this.debugContainer.appendChild(this.debugPredictedMouseIndicator),this.debugTrajectoryLine=document.createElement("div"),this.debugTrajectoryLine.className="jsforesight-trajectory-line",this.debugContainer.appendChild(this.debugTrajectoryLine),this.createDebugControls(i),this.populateDebugElementList(),t.forEach((function(e,t){s.createOrUpdateLinkOverlay(t,e)})),this.updateTrajectoryVisuals(n,o,i.enableMousePrediction))},t.prototype.cleanup=function(){var e;null===(e=this.shadowHost)||void 0===e||e.remove(),this.shadowHost=null,this.shadowRoot=null,this.debugLinkOverlays.forEach((function(e){e.linkOverlay.remove(),e.expandedOverlay.remove(),e.nameLabel.remove()})),this.debugLinkOverlays.clear(),this.lastElementData.clear(),this.debugElementListItems.clear(),this.debugElementListContainer=null,this.elementCountSpan=null,this.debugContainer&&this.debugContainer.querySelectorAll(".jsforesight-prefetch-indicator").forEach((function(e){return e.remove()}))},t.prototype.showPrefetchAnimation=function(e){if(this.debugContainer){var t=e.getBoundingClientRect();if(0!==t.width||0!==t.height){var i=document.createElement("div");i.className="jsforesight-prefetch-indicator",i.textContent="Prefetched",this.debugContainer.appendChild(i);var n=t.left+t.width/2,o=t.top+t.height/2,s=80*(Math.random()-.5),r=-50-30*Math.random();i.style.left="".concat(n,"px"),i.style.top="".concat(o,"px"),i.style.opacity="1",i.style.transform="translate(-50%, -50%) translate(0px, 0px) scale(0.7)",i.offsetWidth,i.style.opacity="0",i.style.transform="translate(-50%, -50%) translate(".concat(s,"px, ").concat(r,"px) scale(1)"),setTimeout((function(){i.remove()}),800)}}},t.prototype.populateDebugElementList=function(){var e=this;if(this.debugElementListContainer){this.debugElementListContainer.innerHTML="",this.debugElementListItems.clear();var t=this.foresightManagerInstance.elements;this.elementCountSpan&&(this.elementCountSpan.textContent=t.size.toString()),0!==t.size?t.forEach((function(t,i){var n=document.createElement("div");n.className="jsforesight-element-list-item",e.updateListItemContent(n,t),e.debugElementListContainer.appendChild(n),e.debugElementListItems.set(i,n)})):this.debugElementListContainer.innerHTML="<em>No elements registered.</em>"}},t.prototype.updateListItemContent=function(e,t){e.classList.toggle("hovering",t.isHovering),e.classList.toggle("trajectory-hit",t.isTrajectoryHit);e.innerHTML="\n ".concat('<span class="status-indicator"></span>','\n <span class="element-name" title="').concat(t.name||"Unnamed Element",'">').concat(t.name||"Unnamed Element",'</span>\n <span class="element-details">(H: ').concat(t.isHovering?"Y":"N",", T: ").concat(t.isTrajectoryHit?"Y":"N",")</span>\n ")},t.prototype.createOrUpdateLinkOverlay=function(e,t){if(this.debugContainer&&this.shadowRoot){if(this.currentGlobalSettings){var i=this.lastElementData.get(e),n=!1,o=t.isTrajectoryHit&&(!i||!i.isTrajectoryHit),s=t.isHovering&&(!i||!i.isHovering);(o||s&&(!t.isTrajectoryHit||t.isTrajectoryHit&&!this.currentGlobalSettings.enableMousePrediction))&&(n=!0),n&&this.showPrefetchAnimation(e)}this.lastElementData.set(e,{isHovering:t.isHovering,isTrajectoryHit:t.isTrajectoryHit});var r=this.debugLinkOverlays.get(e);if(!r){var a=document.createElement("div");a.className="jsforesight-link-overlay",this.debugContainer.appendChild(a);var l=document.createElement("div");l.className="jsforesight-expanded-overlay",this.debugContainer.appendChild(l);var d=document.createElement("div");d.className="jsforesight-name-label",this.debugContainer.appendChild(d),r={linkOverlay:a,expandedOverlay:l,nameLabel:d},this.debugLinkOverlays.set(e,r)}var c=r.linkOverlay,h=r.expandedOverlay,u=r.nameLabel,g=e.getBoundingClientRect();c.style.left="".concat(g.left,"px"),c.style.top="".concat(g.top,"px"),c.style.width="".concat(g.width,"px"),c.style.height="".concat(g.height,"px"),c.classList.toggle("trajectory-hit",t.isTrajectoryHit),c.classList.toggle("active",t.isHovering),t.elementBounds.expandedRect?(h.style.left="".concat(t.elementBounds.expandedRect.left,"px"),h.style.top="".concat(t.elementBounds.expandedRect.top,"px"),h.style.width="".concat(t.elementBounds.expandedRect.right-t.elementBounds.expandedRect.left,"px"),h.style.height="".concat(t.elementBounds.expandedRect.bottom-t.elementBounds.expandedRect.top,"px"),h.style.display="block"):h.style.display="none",t.name&&"Unnamed"!==t.name?(u.textContent=t.name,u.style.display="block",u.style.left="".concat(g.left,"px"),u.style.top="".concat(g.top-22,"px")):u.style.display="none";var p=this.debugElementListItems.get(e);p&&this.updateListItemContent(p,t)}},t.prototype.removeLinkOverlay=function(e){var t=this.debugLinkOverlays.get(e);t&&(t.linkOverlay.remove(),t.expandedOverlay.remove(),t.nameLabel.remove(),this.debugLinkOverlays.delete(e)),this.lastElementData.delete(e);var i=this.debugElementListItems.get(e);i&&(i.remove(),this.debugElementListItems.delete(e))},t.prototype.refreshDisplayedElements=function(){var e=this;this.populateDebugElementList(),this.foresightManagerInstance.elements.forEach((function(t,i){e.createOrUpdateLinkOverlay(i,t)}))},t.prototype.updateAllLinkVisuals=function(e){this.shadowRoot&&this.debugContainer&&this.refreshDisplayedElements()},t.prototype.updateTrajectoryVisuals=function(e,t,i){if(this.shadowRoot&&this.debugContainer&&(this.debugPredictedMouseIndicator&&(this.debugPredictedMouseIndicator.style.left="".concat((null==t?void 0:t.x)||0,"px"),this.debugPredictedMouseIndicator.style.top="".concat((null==t?void 0:t.y)||0,"px"),this.debugPredictedMouseIndicator.style.display=i&&t?"block":"none"),this.debugTrajectoryLine))if(i&&e&&t){var n=t.x-e.x,o=t.y-e.y,s=Math.sqrt(n*n+o*o),r=180*Math.atan2(o,n)/Math.PI;this.debugTrajectoryLine.style.left="".concat(e.x,"px"),this.debugTrajectoryLine.style.top="".concat(e.y,"px"),this.debugTrajectoryLine.style.width="".concat(s,"px"),this.debugTrajectoryLine.style.transform="translateY(-50%) rotate(".concat(r,"deg)"),this.debugTrajectoryLine.style.display="block"}else this.debugTrajectoryLine.style.display="none"},t.prototype.createDebugControls=function(e){var t=this;if(this.shadowRoot){this.debugControlsContainer=document.createElement("div"),this.debugControlsContainer.id="jsforesight-debug-controls";var i='\n <div class="jsforesight-debugger-title-container">\n <h3>Foresight Debugger</h3>\n <span class="jsforesight-info-icon" title="Changes made here are for the current session only and won\'t persist. Update initial values in the ForesightManager.initialize() props for permanent changes.">i</span>\n </div>\n <div class="control-row">\n <label for="jsforesight-trajectory-enabled">\n Enable Mouse Prediction\n <span class="jsforesight-info-icon" title="Toggles mouse movement prediction. If disabled, only direct hovers trigger actions.">i</span>\n </label>\n <input type="checkbox" id="jsforesight-trajectory-enabled" '.concat(e.enableMousePrediction?"checked":"",'>\n </div>\n <div class="control-row">\n <label for="jsforesight-history-size">\n History Size\n <span class="jsforesight-info-icon" title="Number of past mouse positions for velocity calculation (Min: 2, Max: 20). Higher values smooth predictions but add latency.">i</span>\n </label>\n <input type="range" id="jsforesight-history-size" min="2" max="20" value="').concat(e.positionHistorySize,'">\n <span id="jsforesight-history-value">').concat(e.positionHistorySize,'</span>\n </div>\n <div class="control-row">\n <label for="jsforesight-prediction-time">\n Prediction Time (ms)\n <span class="jsforesight-info-icon" title="How far (ms) to project trajectory (Min: 10, Max: 500). Larger values detect intent sooner.">i</span>\n </label>\n <input type="range" id="jsforesight-prediction-time" min="10" max="500" step="10" value="').concat(e.trajectoryPredictionTime,'">\n <span id="jsforesight-prediction-value">').concat(e.trajectoryPredictionTime,'</span>\n </div>\n <div class="control-row">\n <label for="jsforesight-throttle-delay">\n Scroll/Resize Throttle (ms)\n <span class="jsforesight-info-icon" title="Delay (ms) for recalculating element positions on resize/scroll (Min: 0, Max: 500). Higher values improve performance during rapid events.">i</span>\n </label>\n <input type="range" id="jsforesight-throttle-delay" min="0" max="500" step="10" value="').concat(e.resizeScrollThrottleDelay,'">\n <span id="jsforesight-throttle-value">').concat(e.resizeScrollThrottleDelay,"</span>\n </div>\n ");i+='\n <div class="jsforesight-debugger-section">\n <h4>Registered Elements (<span id="jsforesight-element-count">0</span>)</h4>\n <div id="jsforesight-element-list-items-container" class="jsforesight-element-list">\n <em>Initializing...</em>\n </div>\n </div>\n ',this.debugControlsContainer.innerHTML=i,this.shadowRoot.appendChild(this.debugControlsContainer),this.debugElementListContainer=this.debugControlsContainer.querySelector("#jsforesight-element-list-items-container"),this.elementCountSpan=this.debugControlsContainer.querySelector("#jsforesight-element-count");var n=this.debugControlsContainer.querySelector("#jsforesight-trajectory-enabled");n.addEventListener("change",(function(){t.foresightManagerInstance.alterGlobalSettings({enableMousePrediction:n.checked})}));var o=this.debugControlsContainer.querySelector("#jsforesight-history-size"),s=this.debugControlsContainer.querySelector("#jsforesight-history-value");o.addEventListener("input",(function(){var e=parseInt(o.value);s.textContent=e.toString(),t.foresightManagerInstance.alterGlobalSettings({positionHistorySize:e})}));var r=this.debugControlsContainer.querySelector("#jsforesight-prediction-time"),a=this.debugControlsContainer.querySelector("#jsforesight-prediction-value");r.addEventListener("input",(function(){var e=parseInt(r.value);a.textContent=e.toString(),t.foresightManagerInstance.alterGlobalSettings({trajectoryPredictionTime:e})}));var l=this.debugControlsContainer.querySelector("#jsforesight-throttle-delay"),d=this.debugControlsContainer.querySelector("#jsforesight-throttle-value");l.addEventListener("input",(function(){var e=parseInt(l.value);d.textContent=e.toString(),t.foresightManagerInstance.alterGlobalSettings({resizeScrollThrottleDelay:e})}))}},t.prototype.updateControlsState=function(t){if(this.currentGlobalSettings=e({},t),this.debugControlsContainer){var i=this.debugControlsContainer.querySelector("#jsforesight-trajectory-enabled");i&&(i.checked=t.enableMousePrediction);var n=this.debugControlsContainer.querySelector("#jsforesight-history-size"),o=this.debugControlsContainer.querySelector("#jsforesight-history-value");n&&o&&(n.value=t.positionHistorySize.toString(),o.textContent=t.positionHistorySize.toString());var s=this.debugControlsContainer.querySelector("#jsforesight-prediction-time"),r=this.debugControlsContainer.querySelector("#jsforesight-prediction-value");s&&r&&(s.value=t.trajectoryPredictionTime.toString(),r.textContent=t.trajectoryPredictionTime.toString());var a=this.debugControlsContainer.querySelector("#jsforesight-throttle-delay"),l=this.debugControlsContainer.querySelector("#jsforesight-throttle-value");a&&l&&(a.value=t.resizeScrollThrottleDelay.toString(),l.textContent=t.resizeScrollThrottleDelay.toString())}},t}(),i=function(){function i(){var t=this;this.elements=new Map,this.isSetup=!1,this.debugMode=!1,this.debugger=null,this.globalSettings={debug:!1,enableMousePrediction:!0,positionHistorySize:8,trajectoryPredictionTime:80,defaultHitSlop:{top:0,left:0,right:0,bottom:0},resizeScrollThrottleDelay:50},this.positions=[],this.currentPoint={x:0,y:0},this.predictedPoint={x:0,y:0},this.lastResizeScrollCallTimestamp=0,this.resizeScrollThrottleTimeoutId=null,this.domObserver=null,this.lastDomMutationRectsUpdateTimestamp=0,this.domMutationRectsUpdateTimeoutId=null,this.elementResizeObserver=null,this.normalizeHitSlop=function(e){return"number"==typeof e?{top:e,left:e,right:e,bottom:e}:e},this.predictMousePosition=function(e){var i={point:e,time:performance.now()},n=e.x,o=e.y;if(t.positions.push(i),t.positions.length>t.globalSettings.positionHistorySize&&t.positions.shift(),t.positions.length<2)return{x:n,y:o};var s=t.positions[0],r=t.positions[t.positions.length-1],a=(r.time-s.time)/1e3;if(0===a)return{x:n,y:o};var l=(r.point.x-s.point.x)/a,d=(r.point.y-s.point.y)/a,c=t.globalSettings.trajectoryPredictionTime/1e3;return{x:n+l*c,y:o+d*c}},this.handleMouseMove=function(i){t.currentPoint={x:i.clientX,y:i.clientY},t.predictedPoint=t.globalSettings.enableMousePrediction?t.predictMousePosition(t.currentPoint):t.currentPoint;var n=null;t.debugMode&&t.debugger&&(n=[]),t.elements.forEach((function(i,o){var s=i.isHovering,r=i.isTrajectoryHit,a=i.trajectoryHitTime,l=!1,d=i.isHovering,c=i.isTrajectoryHit,h=i.trajectoryHitTime,u=i.elementBounds.expandedRect,g=t.currentPoint.x>=u.left&&t.currentPoint.x<=u.right&&t.currentPoint.y>=u.top&&t.currentPoint.y<=u.bottom,p=!1;if(!t.globalSettings.enableMousePrediction||g||i.isTrajectoryHit||t.lineSegmentIntersectsRect(t.currentPoint,t.predictedPoint,u)&&(p=!0),p&&(i.callback(),l=!0,c=!0,h=performance.now()),g&&!i.isHovering){var m=!i.isTrajectoryHit||i.isTrajectoryHit&&!t.globalSettings.enableMousePrediction;!l&&m&&i.callback()}if((d=g)!==s||c!==r||c&&h!==a){var b=e(e({},i),{isHovering:d,isTrajectoryHit:c,trajectoryHitTime:h});t.elements.set(o,b),n&&n.push(o)}})),n&&t.debugger&&(n.forEach((function(e){var i=t.elements.get(e);i&&t.debugger.createOrUpdateLinkOverlay(e,i)})),t.debugger.updateTrajectoryVisuals(t.currentPoint,t.predictedPoint,t.globalSettings.enableMousePrediction))},this.handleResizeOrScroll=function(){t.resizeScrollThrottleTimeoutId&&clearTimeout(t.resizeScrollThrottleTimeoutId);var e=performance.now(),i=e-t.lastResizeScrollCallTimestamp,n=t.globalSettings.resizeScrollThrottleDelay;i>=n?(t.updateAllRects(),t.lastResizeScrollCallTimestamp=e,t.resizeScrollThrottleTimeoutId=null):t.resizeScrollThrottleTimeoutId=setTimeout((function(){t.updateAllRects(),t.lastResizeScrollCallTimestamp=performance.now(),t.resizeScrollThrottleTimeoutId=null}),n-i)},this.handleElementResize=function(e){for(var i=0,n=e;i<n.length;i++){var o=n[i].target,s=t.elements.get(o);s&&t.updateExpandedRect(o,s.elementBounds.hitSlop)}},this.handleDomMutations=function(e){for(var i=!1,n=0,o=e;n<o.length;n++){var s=o[n];if("childList"===s.type&&s.removedNodes.length>0)for(var r=0,a=Array.from(t.elements.keys());r<a.length;r++){var l=a[r];l.isConnected||t.elements.has(l)&&t.unregister(l)}"childList"!==s.type&&("attributes"!==s.type||"style"!==s.attributeName&&"class"!==s.attributeName)||(i=!0)}if(i&&t.elements.size>0){t.domMutationRectsUpdateTimeoutId&&clearTimeout(t.domMutationRectsUpdateTimeoutId);var d=performance.now(),c=t.globalSettings.resizeScrollThrottleDelay,h=d-t.lastDomMutationRectsUpdateTimestamp;h>=c?(console.log("DOM Mutation: Updating all rects immediately"),t.updateAllRects(),t.lastDomMutationRectsUpdateTimestamp=d,t.domMutationRectsUpdateTimeoutId=null):t.domMutationRectsUpdateTimeoutId=setTimeout((function(){console.log("DOM Mutation: Updating all rects after throttle delay"),t.updateAllRects(),t.lastDomMutationRectsUpdateTimestamp=performance.now(),t.domMutationRectsUpdateTimeoutId=null}),c-h)}},this.globalSettings.defaultHitSlop=this.normalizeHitSlop(this.globalSettings.defaultHitSlop),setInterval(this.checkTrajectoryHitExpiration.bind(this),100)}return i.initialize=function(e){return i.manager?e&&(console.warn("ForesightManager is already initialized. Use alterGlobalSettings to update settings. Make sure to not put the ForesightManager.initialize() in a place that rerenders often."),i.manager.alterGlobalSettings(e)):(i.manager=new i,e?i.manager.alterGlobalSettings(e):i.manager.globalSettings.debug&&i.manager.turnOnDebugMode()),i.manager.debugMode=i.manager.globalSettings.debug,i.manager},Object.defineProperty(i,"instance",{get:function(){return i.manager?i.manager:this.initialize()},enumerable:!1,configurable:!0}),i.prototype.checkTrajectoryHitExpiration=function(){var t=this,i=performance.now(),n=[];this.elements.forEach((function(o,s){o.isTrajectoryHit&&i-o.trajectoryHitTime>200&&(t.elements.set(s,e(e({},o),{isTrajectoryHit:!1})),n.push(s))})),n.length>0&&this.debugMode&&this.debugger&&n.forEach((function(e){var i=t.elements.get(e);i&&t.debugger.createOrUpdateLinkOverlay(e,i)}))},i.prototype.register=function(e,t,i,n){var o=this,s=i?this.normalizeHitSlop(i):this.globalSettings.defaultHitSlop,r=e.getBoundingClientRect(),a={callback:t,elementBounds:{expandedRect:this.getExpandedRect(r,s),originalRect:r,hitSlop:s},isHovering:!1,isTrajectoryHit:!1,trajectoryHitTime:0,name:null!=n?n:"Unnamed"};if(this.elements.set(e,a),this.isSetup||this.setupGlobalListeners(),this.elementResizeObserver&&this.elementResizeObserver.observe(e),this.debugMode&&this.debugger){var l=this.elements.get(e);l&&this.debugger.createOrUpdateLinkOverlay(e,l),this.debugger.refreshDisplayedElements()}return function(){return o.unregister(e)}},i.prototype.unregister=function(e){var t;this.elements.has(e)?(console.log("Unregistering element:",(null===(t=this.elements.get(e))||void 0===t?void 0:t.name)||e),this.elementResizeObserver&&this.elementResizeObserver.unobserve(e),this.debugMode&&this.debugger&&(this.debugger.removeLinkOverlay(e),this.debugger.refreshDisplayedElements()),this.elements.delete(e),0===this.elements.size&&this.isSetup&&this.removeGlobalListeners()):console.log("Attempted to unregister element not found:",e)},i.prototype.alterGlobalSettings=function(e){var t=this,i=!1;void 0!==(null==e?void 0:e.positionHistorySize)&&this.globalSettings.positionHistorySize!==e.positionHistorySize&&(this.globalSettings.positionHistorySize=e.positionHistorySize,i=!0),void 0!==(null==e?void 0:e.trajectoryPredictionTime)&&this.globalSettings.trajectoryPredictionTime!==e.trajectoryPredictionTime&&(this.globalSettings.trajectoryPredictionTime=e.trajectoryPredictionTime,i=!0),void 0!==(null==e?void 0:e.enableMousePrediction)&&this.globalSettings.enableMousePrediction!==e.enableMousePrediction&&(this.globalSettings.enableMousePrediction=e.enableMousePrediction,i=!0,this.globalSettings.enableMousePrediction?this.predictedPoint=this.predictMousePosition(this.currentPoint):this.predictedPoint=this.currentPoint),void 0!==(null==e?void 0:e.defaultHitSlop)&&JSON.stringify(this.globalSettings.defaultHitSlop)!==JSON.stringify(this.normalizeHitSlop(e.defaultHitSlop))&&(this.globalSettings.defaultHitSlop=this.normalizeHitSlop(e.defaultHitSlop),i=!0,this.elements.forEach((function(e,i){t.updateExpandedRect(i,e.elementBounds.hitSlop)}))),void 0!==(null==e?void 0:e.resizeScrollThrottleDelay)&&this.globalSettings.resizeScrollThrottleDelay!==e.resizeScrollThrottleDelay&&(this.globalSettings.resizeScrollThrottleDelay=e.resizeScrollThrottleDelay,i=!0),void 0!==(null==e?void 0:e.debug)&&this.globalSettings.debug!==e.debug&&(this.globalSettings.debug=e.debug,i=!0,this.globalSettings.debug?this.turnOnDebugMode():this.debugger&&(this.debugger.cleanup(),this.debugger=null),this.debugMode=this.globalSettings.debug),i&&this.globalSettings.debug&&this.debugger&&(this.debugger.updateControlsState(this.globalSettings),this.debugger.updateTrajectoryVisuals(this.currentPoint,this.predictedPoint,this.globalSettings.enableMousePrediction),this.elements.forEach((function(e,i){t.debugger.createOrUpdateLinkOverlay(i,e)})),this.debugger.refreshDisplayedElements())},i.prototype.turnOnDebugMode=function(){this.debugMode=!0,this.debugger?(this.debugger.updateControlsState(this.globalSettings),this.debugger.updateAllLinkVisuals(this.elements),this.debugger.updateTrajectoryVisuals(this.currentPoint,this.predictedPoint,this.globalSettings.enableMousePrediction)):(this.debugger=new t(this),this.debugger.initialize(this.elements,this.globalSettings,this.currentPoint,this.predictedPoint))},i.prototype.getExpandedRect=function(e,t){return{left:e.left-t.left,right:e.right+t.right,top:e.top-t.top,bottom:e.bottom+t.bottom}},i.prototype.updateExpandedRect=function(t,i){var n=this.elements.get(t);if(n){var o=t.getBoundingClientRect(),s=n.elementBounds.hitSlop,r=this.getExpandedRect(o,s);if((JSON.stringify(r)!==JSON.stringify(n.elementBounds.expandedRect)||JSON.stringify(o)!==JSON.stringify(n.elementBounds.originalRect))&&(this.elements.set(t,e(e({},n),{elementBounds:e(e({},n.elementBounds),{originalRect:o,expandedRect:r})})),this.debugMode&&this.debugger)){var a=this.elements.get(t);a&&this.debugger.createOrUpdateLinkOverlay(t,a)}}},i.prototype.updateAllRects=function(){var e=this;this.elements.forEach((function(t,i){e.updateExpandedRect(i,t.elementBounds.hitSlop)}))},i.prototype.lineSegmentIntersectsRect=function(e,t,i){var n=0,o=1,s=t.x-e.x,r=t.y-e.y,a=function(e,t){if(0===e){if(t<0)return!1}else{var i=t/e;if(e<0){if(i>o)return!1;i>n&&(n=i)}else{if(i<n)return!1;i<o&&(o=i)}}return!0};return!!a(-s,e.x-i.left)&&(!!a(s,i.right-e.x)&&(!!a(-r,e.y-i.top)&&(!!a(r,i.bottom-e.y)&&n<=o)))},i.prototype.setupGlobalListeners=function(){var e=this;console.log("Setting up global listeners"),this.isSetup||(document.addEventListener("mousemove",this.handleMouseMove),window.addEventListener("resize",this.handleResizeOrScroll),window.addEventListener("scroll",this.handleResizeOrScroll),this.domObserver||(this.domObserver=new MutationObserver(this.handleDomMutations)),this.domObserver.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0}),this.elementResizeObserver||(this.elementResizeObserver=new ResizeObserver(this.handleElementResize),this.elements.forEach((function(t,i){return e.elementResizeObserver.observe(i)}))),this.isSetup=!0)},i.prototype.removeGlobalListeners=function(){document.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("resize",this.handleResizeOrScroll),window.removeEventListener("scroll",this.handleResizeOrScroll),this.resizeScrollThrottleTimeoutId&&(clearTimeout(this.resizeScrollThrottleTimeoutId),this.resizeScrollThrottleTimeoutId=null),this.domMutationRectsUpdateTimeoutId&&(clearTimeout(this.domMutationRectsUpdateTimeoutId),this.domMutationRectsUpdateTimeoutId=null),this.domObserver&&this.domObserver.disconnect(),this.elementResizeObserver&&this.elementResizeObserver.disconnect(),this.isSetup=!1},i}();exports.ForesightManager=i;
2
2
  //# sourceMappingURL=index.js.map