js.foresight 0.0.15 → 0.0.17
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/LICENSE +20 -20
- package/README.md +1 -1
- package/dist/index.d.ts +159 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Bart Spaans
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Bart Spaans
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
type Rect = {
|
|
2
|
+
top: number;
|
|
3
|
+
left: number;
|
|
4
|
+
right: number;
|
|
5
|
+
bottom: number;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* A callback function that is executed when a foresight interaction
|
|
9
|
+
* (e.g., hover, trajectory hit) occurs on a registered element.
|
|
10
|
+
* Only triggers ones per interaction
|
|
11
|
+
*/
|
|
12
|
+
type ForesightCallback = () => void;
|
|
13
|
+
/**
|
|
14
|
+
* Represents the HTML element that is being tracked by the ForesightManager.
|
|
15
|
+
* This is typically a standard DOM `Element`.
|
|
16
|
+
*/
|
|
17
|
+
type ForesightElement = Element;
|
|
18
|
+
/**
|
|
19
|
+
* Internal type representing the calculated boundaries of a foresight element,
|
|
20
|
+
* including its original dimensions and the expanded hit area.
|
|
21
|
+
* (This type is not exported, but commenting it is good practice for maintainability)
|
|
22
|
+
*/
|
|
23
|
+
type ElementBounds = {
|
|
24
|
+
/** The expanded rectangle, including hitSlop, used for interaction detection. */
|
|
25
|
+
expandedRect: Rect;
|
|
26
|
+
/** The original bounding rectangle of the element, as returned by `getBoundingClientRect()`. */
|
|
27
|
+
originalRect: DOMRect;
|
|
28
|
+
/** The hit slop values applied to this element. */
|
|
29
|
+
hitSlop: Rect;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Represents the data associated with a registered foresight element.
|
|
33
|
+
*/
|
|
34
|
+
type ForesightElementData = {
|
|
35
|
+
/** The callback function to execute on interaction. */
|
|
36
|
+
callback: ForesightCallback;
|
|
37
|
+
/** The boundary information for the element. */
|
|
38
|
+
elementBounds: ElementBounds;
|
|
39
|
+
/** True if the mouse cursor is currently hovering over the element's expanded bounds. */
|
|
40
|
+
isHovering: boolean;
|
|
41
|
+
/** The name of the element, usefull for debugging */
|
|
42
|
+
name: string;
|
|
43
|
+
/** True if the predicted mouse trajectory has intersected the element's expanded bounds. */
|
|
44
|
+
isTrajectoryHit: boolean;
|
|
45
|
+
/** The timestamp when the last trajectory hit occurred. */
|
|
46
|
+
trajectoryHitTime: number;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Configuration options for the ForesightManager
|
|
50
|
+
*/
|
|
51
|
+
type ForesightManagerProps = {
|
|
52
|
+
/**
|
|
53
|
+
* Number of mouse positions to keep in history for trajectory calculation.
|
|
54
|
+
* A higher number might lead to smoother but slightly delayed predictions.
|
|
55
|
+
* @default 8
|
|
56
|
+
*/
|
|
57
|
+
positionHistorySize: number;
|
|
58
|
+
/**
|
|
59
|
+
* How far ahead (in milliseconds) to predict the mouse trajectory.
|
|
60
|
+
* A larger value means the prediction extends further into the future. (meaning it will trigger callbacks sooner)
|
|
61
|
+
* @default 80
|
|
62
|
+
*/
|
|
63
|
+
trajectoryPredictionTime: number;
|
|
64
|
+
/**
|
|
65
|
+
* Whether to enable mouse trajectory prediction.
|
|
66
|
+
* If false, only direct hover/interaction is considered.
|
|
67
|
+
* @default true
|
|
68
|
+
*/
|
|
69
|
+
enableMousePrediction: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Whether to show visual debugging information on the screen.
|
|
72
|
+
* This includes overlays for elements, hit slop areas, and the predicted mouse path.
|
|
73
|
+
* @default false
|
|
74
|
+
*/
|
|
75
|
+
debug: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Default hit slop to apply to all registered elements if no specific
|
|
78
|
+
* hit slop is provided during registration.
|
|
79
|
+
* Can be a single number for uniform slop on all sides, or a Rect object
|
|
80
|
+
* for different values per side.
|
|
81
|
+
* @default { top: 0, left: 0, right: 0, bottom: 0 }
|
|
82
|
+
*/
|
|
83
|
+
defaultHitSlop: Rect | number;
|
|
84
|
+
/**
|
|
85
|
+
* Amount of time in ms the element bounds get recalculated on scroll/resize of the page.
|
|
86
|
+
* @default 50
|
|
87
|
+
*/
|
|
88
|
+
resizeScrollThrottleDelay: number;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Manages the prediction of user intent based on mouse trajectory and element interactions.
|
|
93
|
+
*
|
|
94
|
+
* ForesightManager is a singleton class responsible for:
|
|
95
|
+
* - Registering HTML elements to monitor.
|
|
96
|
+
* - Tracking mouse movements and predicting future cursor positions.
|
|
97
|
+
* - Detecting when a predicted trajectory intersects with a registered element's bounds.
|
|
98
|
+
* - Invoking callbacks associated with elements upon predicted or actual interaction.
|
|
99
|
+
* - Handling global settings for prediction behavior (e.g., history size, prediction time).
|
|
100
|
+
* - Optionally enabling a {@link ForesightDebugger} for visual feedback.
|
|
101
|
+
* - Automatically updating element bounds on resize using {@link ResizeObserver}.
|
|
102
|
+
* - Automatically unregistering elements removed from the DOM using {@link MutationObserver}.
|
|
103
|
+
* - Detecting broader layout shifts via {@link MutationObserver} to update element positions.
|
|
104
|
+
*
|
|
105
|
+
* It should be initialized once using {@link ForesightManager.initialize} and then
|
|
106
|
+
* accessed via the static getter {@link ForesightManager.instance}.
|
|
107
|
+
*/
|
|
108
|
+
declare class ForesightManager {
|
|
109
|
+
private static manager;
|
|
110
|
+
elements: Map<ForesightElement, ForesightElementData>;
|
|
111
|
+
private isSetup;
|
|
112
|
+
private debugMode;
|
|
113
|
+
private debugger;
|
|
114
|
+
private globalSettings;
|
|
115
|
+
private positions;
|
|
116
|
+
private currentPoint;
|
|
117
|
+
private predictedPoint;
|
|
118
|
+
private lastResizeScrollCallTimestamp;
|
|
119
|
+
private resizeScrollThrottleTimeoutId;
|
|
120
|
+
private domObserver;
|
|
121
|
+
private lastDomMutationRectsUpdateTimestamp;
|
|
122
|
+
private domMutationRectsUpdateTimeoutId;
|
|
123
|
+
private elementResizeObserver;
|
|
124
|
+
private constructor();
|
|
125
|
+
/**
|
|
126
|
+
* Initializes the ForesightManager singleton instance with optional global settings.
|
|
127
|
+
*/
|
|
128
|
+
static initialize(props?: Partial<ForesightManagerProps>): ForesightManager;
|
|
129
|
+
/**
|
|
130
|
+
* Gets the singleton instance of the ForesightManager.
|
|
131
|
+
*/
|
|
132
|
+
static get instance(): ForesightManager;
|
|
133
|
+
private checkTrajectoryHitExpiration;
|
|
134
|
+
private normalizeHitSlop;
|
|
135
|
+
/**
|
|
136
|
+
* Registers an element with the ForesightManager.
|
|
137
|
+
*/
|
|
138
|
+
register(element: ForesightElement, callback: ForesightCallback, hitSlop?: number | Rect, name?: string): () => void;
|
|
139
|
+
private unregister;
|
|
140
|
+
/**
|
|
141
|
+
* Alters the global settings of the ForesightManager at runtime.
|
|
142
|
+
*/
|
|
143
|
+
alterGlobalSettings(props?: Partial<ForesightManagerProps>): void;
|
|
144
|
+
private turnOnDebugMode;
|
|
145
|
+
private getExpandedRect;
|
|
146
|
+
private updateExpandedRect;
|
|
147
|
+
private updateAllRects;
|
|
148
|
+
private predictMousePosition;
|
|
149
|
+
private lineSegmentIntersectsRect;
|
|
150
|
+
private handleMouseMove;
|
|
151
|
+
private handleResizeOrScroll;
|
|
152
|
+
private handleElementResize;
|
|
153
|
+
private handleDomMutations;
|
|
154
|
+
private setupGlobalListeners;
|
|
155
|
+
private removeGlobalListeners;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { ForesightManager };
|
|
159
|
+
export type { ForesightCallback, ForesightElement, ForesightManagerProps, Rect as ForesightRect };
|
package/dist/index.js
ADDED
|
@@ -0,0 +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;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/.pnpm/@rollup+plugin-typescript@12.1.2_rollup@4.40.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../src/ForesightManager/ForesightDebugger.ts","../src/ForesightManager/ForesightManager.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import type { ForesightManager } from \"./ForesightManager\"\r\nimport type {\r\n ForesightElementData,\r\n ForesightElement,\r\n ForesightManagerProps,\r\n Point,\r\n} from \"../types/types\"\r\n\r\n/**\r\n * Manages the visual debugging interface for the ForesightManager.\r\n *\r\n * This class is responsible for creating and updating all visual elements\r\n * related to debugging, such as element overlays, trajectory lines,\r\n * predicted mouse indicators, and control panels. It operates within a\r\n * shadow DOM to avoid interfering with the host page's styles and structure.\r\n *\r\n * The ForesightDebugger is typically instantiated and controlled by the\r\n * {@link ForesightManager} when its debug mode is enabled.\r\n */\r\nexport class ForesightDebugger {\r\n private foresightManagerInstance: ForesightManager\r\n private shadowHost: HTMLElement | null = null\r\n private shadowRoot: ShadowRoot | null = null\r\n private debugContainer: HTMLElement | null = null\r\n private debugLinkOverlays: Map<\r\n ForesightElement,\r\n {\r\n linkOverlay: HTMLElement\r\n expandedOverlay: HTMLElement\r\n nameLabel: HTMLElement\r\n }\r\n > = new Map()\r\n private debugPredictedMouseIndicator: HTMLElement | null = null\r\n private debugTrajectoryLine: HTMLElement | null = null\r\n private debugControlsContainer: HTMLElement | null = null\r\n private debugStyleElement: HTMLStyleElement | null = null\r\n\r\n private currentGlobalSettings: ForesightManagerProps | null = null\r\n private lastElementData: Map<\r\n ForesightElement,\r\n { isHovering: boolean; isTrajectoryHit: boolean }\r\n > = new Map()\r\n\r\n constructor(intentManager: ForesightManager) {\r\n this.foresightManagerInstance = intentManager\r\n }\r\n\r\n public initialize(\r\n links: Map<ForesightElement, ForesightElementData>,\r\n currentSettings: ForesightManagerProps,\r\n currentPoint: Point,\r\n predictedPoint: Point\r\n ): void {\r\n if (typeof window === \"undefined\") return\r\n this.cleanup()\r\n\r\n this.currentGlobalSettings = { ...currentSettings }\r\n\r\n this.shadowHost = document.createElement(\"div\")\r\n this.shadowHost.id = \"jsforesight-debugger-shadow-host\"\r\n this.shadowHost.style.pointerEvents = \"none\"\r\n document.body.appendChild(this.shadowHost)\r\n this.shadowRoot = this.shadowHost.attachShadow({ mode: \"open\" })\r\n\r\n this.debugStyleElement = document.createElement(\"style\")\r\n this.debugStyleElement.textContent = `\r\n #jsforesight-debug-container {\r\n position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n pointer-events: none; z-index: 9999;\r\n }\r\n .jsforesight-link-overlay {\r\n position: absolute; border: 2px solid transparent;\r\n background-color: rgba(0, 0, 255, 0.1); box-sizing: border-box;\r\n transition: opacity 0.2s ease, border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n .jsforesight-link-overlay.active {\r\n border-color: oklch(83.7% 0.128 66.29); background-color: rgba(255, 0, 0, 0.1);\r\n }\r\n .jsforesight-link-overlay.trajectory-hit {\r\n border-color: oklch(89.7% 0.196 126.665); background-color: rgba(0, 255, 0, 0.3);\r\n box-shadow: 0 0 10px rgba(0, 255, 0, 0.8);\r\n }\r\n .jsforesight-expanded-overlay {\r\n position: absolute; border: 1px dashed rgba(0, 0, 255, 0.3);\r\n background-color: rgba(0, 0, 255, 0.05); box-sizing: border-box;\r\n }\r\n .jsforesight-mouse-predicted {\r\n position: absolute; width: 20px; height: 20px; border-radius: 50%;\r\n border: 2px solid oklch(83.7% 0.128 66.29); background-color: rgba(255, 165, 0, 0.3);\r\n transform: translate(-50%, -50%); z-index: 10000;\r\n }\r\n .jsforesight-trajectory-line {\r\n position: absolute; height: 2px; background-color: rgba(255, 100, 0, 0.5);\r\n transform-origin: left center; z-index: 9999;\r\n }\r\n .jsforesight-name-label {\r\n position: absolute;\r\n background-color: rgba(0, 0, 0, 0.75);\r\n color: white;\r\n padding: 3px 6px;\r\n font-size: 11px;\r\n font-family: Arial, sans-serif;\r\n border-radius: 3px;\r\n z-index: 10001;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n }\r\n #jsforesight-debug-controls {\r\n position: fixed; bottom: 10px; right: 10px;\r\n background-color: rgba(0, 0, 0, 0.75); color: white; padding: 12px;\r\n border-radius: 5px; font-family: Arial, sans-serif; font-size: 13px;\r\n z-index: 10001; pointer-events: auto; display: flex; flex-direction: column; gap: 8px;\r\n min-width: 300px;\r\n }\r\n .jsforesight-debugger-title-container {\r\n display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 8px;\r\n }\r\n .jsforesight-debugger-title-container h3 { margin: 0; font-size: 15px; }\r\n #jsforesight-debug-controls label { display: flex; align-items: center; gap: 5px; cursor: pointer; }\r\n #jsforesight-debug-controls input[type=\"range\"] { flex-grow: 1; margin: 0 5px; cursor: pointer;}\r\n #jsforesight-debug-controls input[type=\"checkbox\"] { margin-right: 5px; cursor: pointer; }\r\n #jsforesight-debug-controls .control-row { display: flex; align-items: center; justify-content: space-between; }\r\n #jsforesight-debug-controls .control-row label { flex-basis: auto; }\r\n #jsforesight-debug-controls .control-row span:not(.jsforesight-info-icon) { min-width: 30px; text-align: right; }\r\n .jsforesight-info-icon {\r\n display: inline-flex; align-items: center; justify-content: center;\r\n width: 16px; height: 16px; border-radius: 50%;\r\n background-color: #555; color: white;\r\n font-size: 10px; font-style: italic; font-weight: bold;\r\n font-family: 'Georgia', serif;\r\n cursor: help; user-select: none;\r\n flex-shrink: 0;\r\n }\r\n .jsforesight-prefetch-indicator {\r\n position: absolute;\r\n background-color: black;\r\n color: white;\r\n padding: 3px 6px; /* Smaller padding */\r\n font-size: 10px; /* Smaller font */\r\n font-family: Arial, sans-serif;\r\n font-weight: bold;\r\n border-radius: 4px; /* Slightly smaller radius */\r\n z-index: 10002;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n opacity: 1;\r\n transition: transform 0.6s cubic-bezier(0.15, 0.5, 0.35, 1), /* Shorter duration */\r\n opacity 0.6s cubic-bezier(0.4, 0, 0.8, 1); /* Shorter duration */\r\n }\r\n `\r\n this.shadowRoot.appendChild(this.debugStyleElement)\r\n\r\n this.debugContainer = document.createElement(\"div\")\r\n this.debugContainer.id = \"jsforesight-debug-container\"\r\n this.shadowRoot.appendChild(this.debugContainer)\r\n\r\n this.debugPredictedMouseIndicator = document.createElement(\"div\")\r\n this.debugPredictedMouseIndicator.className = \"jsforesight-mouse-predicted\"\r\n this.debugContainer.appendChild(this.debugPredictedMouseIndicator)\r\n\r\n this.debugTrajectoryLine = document.createElement(\"div\")\r\n this.debugTrajectoryLine.className = \"jsforesight-trajectory-line\"\r\n this.debugContainer.appendChild(this.debugTrajectoryLine)\r\n\r\n this.createDebugControls(currentSettings)\r\n\r\n this.lastElementData.clear()\r\n links.forEach((data, element) => {\r\n this.createOrUpdateLinkOverlay(element, data)\r\n })\r\n\r\n this.updateTrajectoryVisuals(\r\n currentPoint,\r\n predictedPoint,\r\n currentSettings.enableMousePrediction\r\n )\r\n }\r\n\r\n public cleanup(): void {\r\n this.shadowHost?.remove()\r\n this.shadowHost = null\r\n this.shadowRoot = null\r\n this.debugLinkOverlays.forEach((overlays) => {\r\n overlays.linkOverlay.remove()\r\n overlays.expandedOverlay.remove()\r\n overlays.nameLabel.remove()\r\n })\r\n this.debugLinkOverlays.clear()\r\n this.lastElementData.clear()\r\n if (this.debugContainer) {\r\n this.debugContainer\r\n .querySelectorAll(\".jsforesight-prefetch-indicator\")\r\n .forEach((el) => el.remove())\r\n }\r\n }\r\n\r\n private showPrefetchAnimation(element: ForesightElement): void {\r\n if (!this.debugContainer) return\r\n\r\n const rect = element.getBoundingClientRect()\r\n if (rect.width === 0 && rect.height === 0) return\r\n\r\n const indicator = document.createElement(\"div\")\r\n indicator.className = \"jsforesight-prefetch-indicator\"\r\n indicator.textContent = \"Prefetched\"\r\n\r\n this.debugContainer.appendChild(indicator)\r\n\r\n const centerX = rect.left + rect.width / 2\r\n const centerY = rect.top + rect.height / 2\r\n\r\n // Shorter random end position for the \"arch\" flight\r\n // Horizontal: -40px to +40px from the element's center\r\n const randomXEnd = (Math.random() - 0.5) * 80\r\n // Vertical: -50px to -80px (upwards) from the element's center\r\n const randomYEnd = -50 - Math.random() * 30\r\n\r\n indicator.style.left = `${centerX}px`\r\n indicator.style.top = `${centerY}px`\r\n indicator.style.opacity = \"1\"\r\n indicator.style.transform = `translate(-50%, -50%) translate(0px, 0px) scale(0.7)`\r\n\r\n void indicator.offsetWidth\r\n\r\n indicator.style.opacity = \"0\"\r\n indicator.style.transform = `translate(-50%, -50%) translate(${randomXEnd}px, ${randomYEnd}px) scale(1)`\r\n\r\n setTimeout(() => {\r\n indicator.remove()\r\n }, 800)\r\n }\r\n\r\n public createOrUpdateLinkOverlay(element: ForesightElement, newData: ForesightElementData): void {\r\n if (!this.debugContainer || !this.shadowRoot) return\r\n\r\n if (this.currentGlobalSettings) {\r\n const oldData = this.lastElementData.get(element)\r\n let callbackLikelyTriggered = false\r\n\r\n const newTrajectoryHit = newData.isTrajectoryHit && (!oldData || !oldData.isTrajectoryHit)\r\n const newHover = newData.isHovering && (!oldData || !oldData.isHovering)\r\n\r\n if (newTrajectoryHit) {\r\n callbackLikelyTriggered = true\r\n } else if (newHover) {\r\n if (\r\n !newData.isTrajectoryHit ||\r\n (newData.isTrajectoryHit && !this.currentGlobalSettings.enableMousePrediction)\r\n ) {\r\n callbackLikelyTriggered = true\r\n }\r\n }\r\n\r\n if (callbackLikelyTriggered) {\r\n this.showPrefetchAnimation(element)\r\n }\r\n }\r\n this.lastElementData.set(element, {\r\n isHovering: newData.isHovering,\r\n isTrajectoryHit: newData.isTrajectoryHit,\r\n })\r\n\r\n let overlays = this.debugLinkOverlays.get(element)\r\n if (!overlays) {\r\n const linkOverlay = document.createElement(\"div\")\r\n linkOverlay.className = \"jsforesight-link-overlay\"\r\n this.debugContainer.appendChild(linkOverlay)\r\n\r\n const expandedOverlay = document.createElement(\"div\")\r\n expandedOverlay.className = \"jsforesight-expanded-overlay\"\r\n this.debugContainer.appendChild(expandedOverlay)\r\n\r\n const nameLabel = document.createElement(\"div\")\r\n nameLabel.className = \"jsforesight-name-label\"\r\n this.debugContainer.appendChild(nameLabel)\r\n\r\n overlays = { linkOverlay, expandedOverlay, nameLabel }\r\n this.debugLinkOverlays.set(element, overlays)\r\n }\r\n\r\n const { linkOverlay, expandedOverlay, nameLabel } = overlays\r\n const rect = element.getBoundingClientRect()\r\n\r\n linkOverlay.style.left = `${rect.left}px`\r\n linkOverlay.style.top = `${rect.top}px`\r\n linkOverlay.style.width = `${rect.width}px`\r\n linkOverlay.style.height = `${rect.height}px`\r\n linkOverlay.classList.toggle(\"trajectory-hit\", newData.isTrajectoryHit)\r\n linkOverlay.classList.toggle(\"active\", newData.isHovering)\r\n\r\n if (newData.elementBounds.expandedRect) {\r\n expandedOverlay.style.left = `${newData.elementBounds.expandedRect.left}px`\r\n expandedOverlay.style.top = `${newData.elementBounds.expandedRect.top}px`\r\n expandedOverlay.style.width = `${\r\n newData.elementBounds.expandedRect.right - newData.elementBounds.expandedRect.left\r\n }px`\r\n expandedOverlay.style.height = `${\r\n newData.elementBounds.expandedRect.bottom - newData.elementBounds.expandedRect.top\r\n }px`\r\n expandedOverlay.style.display = \"block\"\r\n } else {\r\n expandedOverlay.style.display = \"none\"\r\n }\r\n\r\n if (newData.name && newData.name !== \"Unnamed\") {\r\n nameLabel.textContent = newData.name\r\n nameLabel.style.display = \"block\"\r\n nameLabel.style.left = `${rect.left}px`\r\n nameLabel.style.top = `${rect.top - 22}px`\r\n } else {\r\n nameLabel.style.display = \"none\"\r\n }\r\n }\r\n\r\n public removeLinkOverlay(element: ForesightElement): void {\r\n const overlays = this.debugLinkOverlays.get(element)\r\n if (overlays) {\r\n overlays.linkOverlay.remove()\r\n overlays.expandedOverlay.remove()\r\n overlays.nameLabel.remove()\r\n this.debugLinkOverlays.delete(element)\r\n }\r\n this.lastElementData.delete(element)\r\n }\r\n\r\n public updateAllLinkVisuals(links: Map<ForesightElement, ForesightElementData>): void {\r\n if (!this.shadowRoot || !this.debugContainer) return\r\n\r\n const currentElements = new Set(links.keys())\r\n this.debugLinkOverlays.forEach((_, element) => {\r\n if (!currentElements.has(element)) {\r\n this.removeLinkOverlay(element)\r\n }\r\n })\r\n\r\n links.forEach((data, element) => {\r\n this.createOrUpdateLinkOverlay(element, data)\r\n })\r\n }\r\n\r\n public updateTrajectoryVisuals(\r\n currentPoint: Point,\r\n predictedPoint: Point,\r\n enableMousePrediction: boolean\r\n ): void {\r\n if (!this.shadowRoot || !this.debugContainer) return\r\n\r\n if (this.debugPredictedMouseIndicator) {\r\n this.debugPredictedMouseIndicator.style.left = `${predictedPoint?.x || 0}px`\r\n this.debugPredictedMouseIndicator.style.top = `${predictedPoint?.y || 0}px`\r\n this.debugPredictedMouseIndicator.style.display =\r\n enableMousePrediction && predictedPoint ? \"block\" : \"none\"\r\n }\r\n\r\n if (this.debugTrajectoryLine) {\r\n if (enableMousePrediction && currentPoint && predictedPoint) {\r\n const dx = predictedPoint.x - currentPoint.x\r\n const dy = predictedPoint.y - currentPoint.y\r\n const length = Math.sqrt(dx * dx + dy * dy)\r\n const angle = (Math.atan2(dy, dx) * 180) / Math.PI\r\n\r\n this.debugTrajectoryLine.style.left = `${currentPoint.x}px`\r\n this.debugTrajectoryLine.style.top = `${currentPoint.y}px`\r\n this.debugTrajectoryLine.style.width = `${length}px`\r\n this.debugTrajectoryLine.style.transform = `translateY(-50%) rotate(${angle}deg)`\r\n this.debugTrajectoryLine.style.display = \"block\"\r\n } else {\r\n this.debugTrajectoryLine.style.display = \"none\"\r\n }\r\n }\r\n }\r\n\r\n private createDebugControls(initialSettings: ForesightManagerProps): void {\r\n if (!this.shadowRoot) return\r\n\r\n this.debugControlsContainer = document.createElement(\"div\")\r\n this.debugControlsContainer.id = \"jsforesight-debug-controls\"\r\n this.shadowRoot.appendChild(this.debugControlsContainer)\r\n\r\n this.debugControlsContainer.innerHTML = `\r\n <div class=\"jsforesight-debugger-title-container\">\r\n <h3>Foresight Debugger</h3>\r\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>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-trajectory-enabled\">\r\n Enable Mouse Prediction\r\n <span class=\"jsforesight-info-icon\" title=\"Toggles mouse movement prediction. If disabled, only direct hovers trigger actions.\">i</span>\r\n </label>\r\n <input type=\"checkbox\" id=\"jsforesight-trajectory-enabled\" ${\r\n initialSettings.enableMousePrediction ? \"checked\" : \"\"\r\n }>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-history-size\">\r\n History Size\r\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>\r\n </label>\r\n <input type=\"range\" id=\"jsforesight-history-size\" min=\"2\" max=\"20\" value=\"${\r\n initialSettings.positionHistorySize\r\n }\">\r\n <span id=\"jsforesight-history-value\">${initialSettings.positionHistorySize}</span>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-prediction-time\">\r\n Prediction Time (ms)\r\n <span class=\"jsforesight-info-icon\" title=\"How far (ms) to project trajectory (Min: 10, Max: 500). Larger values detect intent sooner.\">i</span>\r\n </label>\r\n <input type=\"range\" id=\"jsforesight-prediction-time\" min=\"10\" max=\"500\" step=\"10\" value=\"${\r\n initialSettings.trajectoryPredictionTime\r\n }\">\r\n <span id=\"jsforesight-prediction-value\">${initialSettings.trajectoryPredictionTime}</span>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-throttle-delay\">\r\n Scroll/Resize Throttle (ms)\r\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>\r\n </label>\r\n <input type=\"range\" id=\"jsforesight-throttle-delay\" min=\"0\" max=\"500\" step=\"10\" value=\"${\r\n initialSettings.resizeScrollThrottleDelay\r\n }\">\r\n <span id=\"jsforesight-throttle-value\">${initialSettings.resizeScrollThrottleDelay}</span>\r\n </div>\r\n `\r\n\r\n const enabledCheckbox = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-trajectory-enabled\"\r\n ) as HTMLInputElement\r\n enabledCheckbox.addEventListener(\"change\", () => {\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n enableMousePrediction: enabledCheckbox.checked,\r\n })\r\n })\r\n\r\n const historySlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-size\"\r\n ) as HTMLInputElement\r\n const historyValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-value\"\r\n ) as HTMLSpanElement\r\n historySlider.addEventListener(\"input\", () => {\r\n const value = parseInt(historySlider.value)\r\n historyValueSpan.textContent = value.toString()\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n positionHistorySize: value,\r\n })\r\n })\r\n\r\n const predictionSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-time\"\r\n ) as HTMLInputElement\r\n const predictionValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-value\"\r\n ) as HTMLSpanElement\r\n predictionSlider.addEventListener(\"input\", () => {\r\n const value = parseInt(predictionSlider.value)\r\n predictionValueSpan.textContent = value.toString()\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n trajectoryPredictionTime: value,\r\n })\r\n })\r\n\r\n const throttleSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-delay\"\r\n ) as HTMLInputElement\r\n const throttleValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-value\"\r\n ) as HTMLSpanElement\r\n throttleSlider.addEventListener(\"input\", () => {\r\n const value = parseInt(throttleSlider.value)\r\n throttleValueSpan.textContent = value.toString()\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n resizeScrollThrottleDelay: value,\r\n })\r\n })\r\n }\r\n\r\n public updateControlsState(settings: ForesightManagerProps): void {\r\n this.currentGlobalSettings = { ...settings }\r\n\r\n if (!this.debugControlsContainer) return\r\n\r\n const enabledCheckbox = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-trajectory-enabled\"\r\n ) as HTMLInputElement\r\n if (enabledCheckbox) enabledCheckbox.checked = settings.enableMousePrediction\r\n\r\n const historySlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-size\"\r\n ) as HTMLInputElement\r\n const historyValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-value\"\r\n ) as HTMLSpanElement\r\n if (historySlider && historyValueSpan) {\r\n historySlider.value = settings.positionHistorySize.toString()\r\n historyValueSpan.textContent = settings.positionHistorySize.toString()\r\n }\r\n\r\n const predictionSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-time\"\r\n ) as HTMLInputElement\r\n const predictionValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-value\"\r\n ) as HTMLSpanElement\r\n if (predictionSlider && predictionValueSpan) {\r\n predictionSlider.value = settings.trajectoryPredictionTime.toString()\r\n predictionValueSpan.textContent = settings.trajectoryPredictionTime.toString()\r\n }\r\n\r\n const throttleSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-delay\"\r\n ) as HTMLInputElement\r\n const throttleValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-value\"\r\n ) as HTMLSpanElement\r\n if (throttleSlider && throttleValueSpan) {\r\n throttleSlider.value = settings.resizeScrollThrottleDelay.toString()\r\n throttleValueSpan.textContent = settings.resizeScrollThrottleDelay.toString()\r\n }\r\n }\r\n}\r\n","import { ForesightDebugger } from \"./ForesightDebugger\"\r\nimport type {\r\n ForesightCallback,\r\n ForesightManagerProps,\r\n ForesightElementData,\r\n ForesightElement,\r\n MousePosition,\r\n Point,\r\n Rect,\r\n} from \"../types/types\"\r\n\r\n/**\r\n * Manages the prediction of user intent based on mouse trajectory and element interactions.\r\n *\r\n * ForesightManager is a singleton class responsible for:\r\n * - Registering HTML elements to monitor.\r\n * - Tracking mouse movements and predicting future cursor positions.\r\n * - Detecting when a predicted trajectory intersects with a registered element's bounds.\r\n * - Invoking callbacks associated with elements upon predicted or actual interaction.\r\n * - Handling global settings for prediction behavior (e.g., history size, prediction time).\r\n * - Optionally enabling a {@link ForesightDebugger} for visual feedback.\r\n * - Automatically updating element bounds on resize using {@link ResizeObserver}.\r\n * - Automatically unregistering elements removed from the DOM using {@link MutationObserver}.\r\n * - Detecting broader layout shifts via {@link MutationObserver} to update element positions.\r\n *\r\n * It should be initialized once using {@link ForesightManager.initialize} and then\r\n * accessed via the static getter {@link ForesightManager.instance}.\r\n */\r\nexport class ForesightManager {\r\n private static manager: ForesightManager\r\n public elements: Map<ForesightElement, ForesightElementData> = new Map()\r\n\r\n private isSetup: boolean = false\r\n private debugMode: boolean = false\r\n private debugger: ForesightDebugger | null = null\r\n\r\n private globalSettings: ForesightManagerProps = {\r\n debug: false,\r\n enableMousePrediction: true,\r\n positionHistorySize: 8,\r\n trajectoryPredictionTime: 80,\r\n defaultHitSlop: { top: 0, left: 0, right: 0, bottom: 0 },\r\n resizeScrollThrottleDelay: 50,\r\n }\r\n\r\n private positions: MousePosition[] = []\r\n private currentPoint: Point = { x: 0, y: 0 }\r\n private predictedPoint: Point = { x: 0, y: 0 }\r\n\r\n // Throttling for window resize/scroll triggered updates\r\n private lastResizeScrollCallTimestamp: number = 0\r\n private resizeScrollThrottleTimeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n // For automatic unregistration and detecting layout shifts\r\n private domObserver: MutationObserver | null = null\r\n // Throttling for DOM mutation-triggered rect updates\r\n private lastDomMutationRectsUpdateTimestamp: number = 0\r\n private domMutationRectsUpdateTimeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n // For observing individual element resizes\r\n private elementResizeObserver: ResizeObserver | null = null\r\n\r\n private constructor() {\r\n this.globalSettings.defaultHitSlop = this.normalizeHitSlop(this.globalSettings.defaultHitSlop)\r\n setInterval(this.checkTrajectoryHitExpiration.bind(this), 100)\r\n }\r\n\r\n /**\r\n * Initializes the ForesightManager singleton instance with optional global settings.\r\n */\r\n public static initialize(props?: Partial<ForesightManagerProps>): ForesightManager {\r\n if (!ForesightManager.manager) {\r\n ForesightManager.manager = new ForesightManager()\r\n if (props) {\r\n ForesightManager.manager.alterGlobalSettings(props)\r\n } else {\r\n // Ensure debugger is initialized if debug is true by default and no props are passed\r\n if (ForesightManager.manager.globalSettings.debug) {\r\n ForesightManager.manager.turnOnDebugMode()\r\n }\r\n }\r\n } else if (props) {\r\n console.warn(\r\n \"ForesightManager is already initialized. Use alterGlobalSettings to update settings. Make sure to not put the ForesightManager.initialize() in a place that rerenders often.\"\r\n )\r\n ForesightManager.manager.alterGlobalSettings(props)\r\n }\r\n // Ensure debugMode property reflects the potentially updated globalSettings.debug\r\n ForesightManager.manager.debugMode = ForesightManager.manager.globalSettings.debug\r\n return ForesightManager.manager\r\n }\r\n\r\n /**\r\n * Gets the singleton instance of the ForesightManager.\r\n */\r\n public static get instance() {\r\n if (!ForesightManager.manager) {\r\n return this.initialize() // Initializes with defaults if not already done\r\n }\r\n return ForesightManager.manager\r\n }\r\n\r\n private checkTrajectoryHitExpiration(): void {\r\n const now = performance.now()\r\n const updatedForesightElements: ForesightElement[] = []\r\n\r\n this.elements.forEach((foresightElementData, element) => {\r\n if (\r\n foresightElementData.isTrajectoryHit &&\r\n now - foresightElementData.trajectoryHitTime > 200 // Expiration time for trajectory hit state\r\n ) {\r\n this.elements.set(element, {\r\n ...foresightElementData,\r\n isTrajectoryHit: false,\r\n })\r\n updatedForesightElements.push(element)\r\n }\r\n })\r\n\r\n if (updatedForesightElements.length > 0 && this.debugMode && this.debugger) {\r\n updatedForesightElements.forEach((element) => {\r\n const data = this.elements.get(element)\r\n if (data) {\r\n this.debugger!.createOrUpdateLinkOverlay(element, data)\r\n }\r\n })\r\n }\r\n }\r\n\r\n private normalizeHitSlop = (hitSlop: number | Rect): Rect => {\r\n if (typeof hitSlop === \"number\") {\r\n return {\r\n top: hitSlop,\r\n left: hitSlop,\r\n right: hitSlop,\r\n bottom: hitSlop,\r\n }\r\n }\r\n return hitSlop\r\n }\r\n\r\n /**\r\n * Registers an element with the ForesightManager.\r\n */\r\n public register(\r\n element: ForesightElement,\r\n callback: ForesightCallback,\r\n hitSlop?: number | Rect,\r\n name?: string\r\n ): () => void {\r\n // console.log(\"Registering element:\", name || element);\r\n const normalizedHitSlop = hitSlop\r\n ? this.normalizeHitSlop(hitSlop)\r\n : (this.globalSettings.defaultHitSlop as Rect)\r\n const originalRect = element.getBoundingClientRect()\r\n const newForesightElementData: ForesightElementData = {\r\n callback,\r\n elementBounds: {\r\n expandedRect: this.getExpandedRect(originalRect, normalizedHitSlop),\r\n originalRect: originalRect,\r\n hitSlop: normalizedHitSlop,\r\n },\r\n isHovering: false,\r\n isTrajectoryHit: false,\r\n trajectoryHitTime: 0,\r\n name: name ?? \"Unnamed\",\r\n }\r\n this.elements.set(element, newForesightElementData)\r\n\r\n if (!this.isSetup) {\r\n this.setupGlobalListeners()\r\n }\r\n\r\n if (this.elementResizeObserver) {\r\n this.elementResizeObserver.observe(element)\r\n }\r\n\r\n if (this.debugMode && this.debugger) {\r\n const data = this.elements.get(element)\r\n if (data) this.debugger.createOrUpdateLinkOverlay(element, data)\r\n }\r\n\r\n return () => this.unregister(element)\r\n }\r\n\r\n private unregister(element: ForesightElement): void {\r\n const isRegistered = this.elements.has(element)\r\n if (isRegistered) {\r\n console.log(\"Unregistering element:\", this.elements.get(element)?.name || element)\r\n if (this.elementResizeObserver) {\r\n this.elementResizeObserver.unobserve(element)\r\n }\r\n\r\n if (this.debugMode && this.debugger) {\r\n this.debugger.removeLinkOverlay(element)\r\n }\r\n this.elements.delete(element)\r\n\r\n if (this.elements.size === 0 && this.isSetup) {\r\n this.removeGlobalListeners()\r\n }\r\n } else {\r\n console.log(\"Attempted to unregister element not found:\", element)\r\n }\r\n }\r\n\r\n /**\r\n * Alters the global settings of the ForesightManager at runtime.\r\n */\r\n public alterGlobalSettings(props?: Partial<ForesightManagerProps>): void {\r\n let settingsActuallyChanged = false\r\n\r\n if (\r\n props?.positionHistorySize !== undefined &&\r\n this.globalSettings.positionHistorySize !== props.positionHistorySize\r\n ) {\r\n this.globalSettings.positionHistorySize = props.positionHistorySize\r\n settingsActuallyChanged = true\r\n }\r\n\r\n if (\r\n props?.trajectoryPredictionTime !== undefined &&\r\n this.globalSettings.trajectoryPredictionTime !== props.trajectoryPredictionTime\r\n ) {\r\n this.globalSettings.trajectoryPredictionTime = props.trajectoryPredictionTime\r\n settingsActuallyChanged = true\r\n }\r\n\r\n if (\r\n props?.enableMousePrediction !== undefined &&\r\n this.globalSettings.enableMousePrediction !== props.enableMousePrediction\r\n ) {\r\n this.globalSettings.enableMousePrediction = props.enableMousePrediction\r\n settingsActuallyChanged = true\r\n if (this.globalSettings.enableMousePrediction) {\r\n this.predictedPoint = this.predictMousePosition(this.currentPoint)\r\n } else {\r\n this.predictedPoint = this.currentPoint\r\n }\r\n }\r\n\r\n if (\r\n props?.defaultHitSlop !== undefined &&\r\n JSON.stringify(this.globalSettings.defaultHitSlop) !==\r\n JSON.stringify(this.normalizeHitSlop(props.defaultHitSlop))\r\n ) {\r\n this.globalSettings.defaultHitSlop = this.normalizeHitSlop(props.defaultHitSlop)\r\n settingsActuallyChanged = true\r\n this.elements.forEach((data, el) => {\r\n // Re-evaluate expandedRect for all elements as default has changed\r\n this.updateExpandedRect(el, data.elementBounds.hitSlop)\r\n })\r\n }\r\n\r\n if (\r\n props?.resizeScrollThrottleDelay !== undefined &&\r\n this.globalSettings.resizeScrollThrottleDelay !== props.resizeScrollThrottleDelay\r\n ) {\r\n this.globalSettings.resizeScrollThrottleDelay = props.resizeScrollThrottleDelay\r\n settingsActuallyChanged = true\r\n }\r\n\r\n if (props?.debug !== undefined && this.globalSettings.debug !== props.debug) {\r\n this.globalSettings.debug = props.debug\r\n settingsActuallyChanged = true // Mark true so debugger visuals update if other settings also changed\r\n if (this.globalSettings.debug) {\r\n this.turnOnDebugMode()\r\n } else {\r\n if (this.debugger) {\r\n this.debugger.cleanup()\r\n this.debugger = null\r\n }\r\n }\r\n this.debugMode = this.globalSettings.debug\r\n }\r\n\r\n if (settingsActuallyChanged && this.globalSettings.debug && this.debugger) {\r\n this.debugger.updateControlsState(this.globalSettings)\r\n this.debugger.updateTrajectoryVisuals(\r\n this.currentPoint,\r\n this.predictedPoint,\r\n this.globalSettings.enableMousePrediction\r\n )\r\n this.elements.forEach((data, el) => {\r\n this.debugger!.createOrUpdateLinkOverlay(el, data)\r\n })\r\n }\r\n }\r\n\r\n private turnOnDebugMode() {\r\n this.debugMode = true\r\n if (!this.debugger) {\r\n this.debugger = new ForesightDebugger(this)\r\n this.debugger.initialize(\r\n this.elements,\r\n this.globalSettings,\r\n this.currentPoint,\r\n this.predictedPoint\r\n )\r\n } else {\r\n this.debugger.updateControlsState(this.globalSettings)\r\n this.debugger.updateAllLinkVisuals(this.elements)\r\n this.debugger.updateTrajectoryVisuals(\r\n this.currentPoint,\r\n this.predictedPoint,\r\n this.globalSettings.enableMousePrediction\r\n )\r\n }\r\n }\r\n\r\n private getExpandedRect(baseRect: Rect | DOMRect, hitSlop: Rect): Rect {\r\n return {\r\n left: baseRect.left - hitSlop.left,\r\n right: baseRect.right + hitSlop.right,\r\n top: baseRect.top - hitSlop.top,\r\n bottom: baseRect.bottom + hitSlop.bottom,\r\n }\r\n }\r\n\r\n private updateExpandedRect(\r\n element: ForesightElement,\r\n hitSlop: Rect // This should be the element's specific hitSlop\r\n ): void {\r\n const foresightElementData = this.elements.get(element)\r\n if (!foresightElementData) return\r\n\r\n const newOriginalRect = element.getBoundingClientRect()\r\n // Use the element's own hitSlop, not the global default, unless it is the default\r\n const currentHitSlop = foresightElementData.elementBounds.hitSlop\r\n const expandedRect = this.getExpandedRect(newOriginalRect, currentHitSlop)\r\n\r\n if (\r\n JSON.stringify(expandedRect) !==\r\n JSON.stringify(foresightElementData.elementBounds.expandedRect) ||\r\n JSON.stringify(newOriginalRect) !==\r\n JSON.stringify(foresightElementData.elementBounds.originalRect)\r\n ) {\r\n this.elements.set(element, {\r\n ...foresightElementData,\r\n elementBounds: {\r\n ...foresightElementData.elementBounds,\r\n originalRect: newOriginalRect,\r\n expandedRect,\r\n },\r\n })\r\n\r\n if (this.debugMode && this.debugger) {\r\n const updatedData = this.elements.get(element)\r\n if (updatedData) this.debugger.createOrUpdateLinkOverlay(element, updatedData)\r\n }\r\n }\r\n }\r\n\r\n private updateAllRects(): void {\r\n // console.log('Updating all rects due to scroll, resize, or DOM mutation.');\r\n this.elements.forEach((data, element) => {\r\n this.updateExpandedRect(element, data.elementBounds.hitSlop)\r\n })\r\n }\r\n\r\n private predictMousePosition = (point: Point): Point => {\r\n const now = performance.now()\r\n const currentPosition: MousePosition = { point, time: now }\r\n const { x, y } = point\r\n\r\n this.positions.push(currentPosition)\r\n if (this.positions.length > this.globalSettings.positionHistorySize) {\r\n this.positions.shift()\r\n }\r\n\r\n if (this.positions.length < 2) {\r\n return { x, y }\r\n }\r\n\r\n const first = this.positions[0]\r\n const last = this.positions[this.positions.length - 1]\r\n const dt = (last.time - first.time) / 1000\r\n\r\n if (dt === 0) {\r\n return { x, y }\r\n }\r\n\r\n const dx = last.point.x - first.point.x\r\n const dy = last.point.y - first.point.y\r\n const vx = dx / dt\r\n const vy = dy / dt\r\n\r\n const trajectoryPredictionTimeInSeconds = this.globalSettings.trajectoryPredictionTime / 1000\r\n const predictedX = x + vx * trajectoryPredictionTimeInSeconds\r\n const predictedY = y + vy * trajectoryPredictionTimeInSeconds\r\n return { x: predictedX, y: predictedY }\r\n }\r\n\r\n private lineSegmentIntersectsRect(p1: Point, p2: Point, rect: Rect): boolean {\r\n let t0 = 0.0\r\n let t1 = 1.0\r\n const dx = p2.x - p1.x\r\n const dy = p2.y - p1.y\r\n\r\n const clipTest = (p: number, q: number): boolean => {\r\n if (p === 0) {\r\n if (q < 0) return false\r\n } else {\r\n const r = q / p\r\n if (p < 0) {\r\n if (r > t1) return false\r\n if (r > t0) t0 = r\r\n } else {\r\n if (r < t0) return false\r\n if (r < t1) t1 = r\r\n }\r\n }\r\n return true\r\n }\r\n\r\n if (!clipTest(-dx, p1.x - rect.left)) return false\r\n if (!clipTest(dx, rect.right - p1.x)) return false\r\n if (!clipTest(-dy, p1.y - rect.top)) return false\r\n if (!clipTest(dy, rect.bottom - p1.y)) return false\r\n\r\n return t0 <= t1\r\n }\r\n\r\n private handleMouseMove = (e: MouseEvent): void => {\r\n this.currentPoint = { x: e.clientX, y: e.clientY }\r\n this.predictedPoint = this.globalSettings.enableMousePrediction\r\n ? this.predictMousePosition(this.currentPoint)\r\n : this.currentPoint\r\n\r\n const elementsToUpdateInDebugger: ForesightElement[] = []\r\n\r\n this.elements.forEach((currentData, element) => {\r\n const previousData = { ...currentData } // Shallow copy for comparison\r\n\r\n let callbackFiredThisCycle = false\r\n let finalIsHovering = previousData.isHovering\r\n let finalIsTrajectoryHit = previousData.isTrajectoryHit\r\n let finalTrajectoryHitTime = previousData.trajectoryHitTime\r\n\r\n const { expandedRect } = previousData.elementBounds\r\n\r\n const isCurrentlyPhysicallyHovering =\r\n this.currentPoint.x >= expandedRect.left &&\r\n this.currentPoint.x <= expandedRect.right &&\r\n this.currentPoint.y >= expandedRect.top &&\r\n this.currentPoint.y <= expandedRect.bottom\r\n\r\n let isNewTrajectoryActivation = false\r\n if (\r\n this.globalSettings.enableMousePrediction &&\r\n !isCurrentlyPhysicallyHovering &&\r\n !previousData.isTrajectoryHit\r\n ) {\r\n if (this.lineSegmentIntersectsRect(this.currentPoint, this.predictedPoint, expandedRect)) {\r\n isNewTrajectoryActivation = true\r\n }\r\n }\r\n\r\n if (isNewTrajectoryActivation) {\r\n previousData.callback()\r\n callbackFiredThisCycle = true\r\n finalIsTrajectoryHit = true\r\n finalTrajectoryHitTime = performance.now()\r\n }\r\n\r\n const isNewPhysicalHoverEvent = isCurrentlyPhysicallyHovering && !previousData.isHovering\r\n\r\n if (isNewPhysicalHoverEvent) {\r\n const hoverCanTriggerCallback =\r\n !previousData.isTrajectoryHit ||\r\n (previousData.isTrajectoryHit && !this.globalSettings.enableMousePrediction)\r\n\r\n if (!callbackFiredThisCycle && hoverCanTriggerCallback) {\r\n previousData.callback()\r\n // callbackFiredThisCycle = true; // Not strictly needed here as it's the last callback check\r\n }\r\n }\r\n\r\n finalIsHovering = isCurrentlyPhysicallyHovering\r\n\r\n const newElementData: ForesightElementData = {\r\n ...previousData, // Start with previous data\r\n elementBounds: previousData.elementBounds, // Keep existing bounds object\r\n isHovering: finalIsHovering,\r\n isTrajectoryHit: finalIsTrajectoryHit,\r\n trajectoryHitTime: finalTrajectoryHitTime,\r\n }\r\n\r\n const stateActuallyChanged =\r\n newElementData.isHovering !== previousData.isHovering ||\r\n newElementData.isTrajectoryHit !== previousData.isTrajectoryHit ||\r\n (newElementData.isTrajectoryHit &&\r\n newElementData.trajectoryHitTime !== previousData.trajectoryHitTime)\r\n\r\n if (stateActuallyChanged) {\r\n this.elements.set(element, newElementData)\r\n elementsToUpdateInDebugger.push(element)\r\n }\r\n })\r\n\r\n if (this.debugMode && this.debugger) {\r\n elementsToUpdateInDebugger.forEach((element) => {\r\n const data = this.elements.get(element)\r\n if (data) this.debugger!.createOrUpdateLinkOverlay(element, data)\r\n })\r\n this.debugger.updateTrajectoryVisuals(\r\n this.currentPoint,\r\n this.predictedPoint,\r\n this.globalSettings.enableMousePrediction\r\n )\r\n }\r\n }\r\n\r\n private handleResizeOrScroll = (): void => {\r\n if (this.resizeScrollThrottleTimeoutId) {\r\n clearTimeout(this.resizeScrollThrottleTimeoutId)\r\n }\r\n\r\n const now = performance.now()\r\n const timeSinceLastCall = now - this.lastResizeScrollCallTimestamp\r\n const currentDelay = this.globalSettings.resizeScrollThrottleDelay\r\n\r\n if (timeSinceLastCall >= currentDelay) {\r\n this.updateAllRects()\r\n this.lastResizeScrollCallTimestamp = now\r\n this.resizeScrollThrottleTimeoutId = null\r\n } else {\r\n this.resizeScrollThrottleTimeoutId = setTimeout(() => {\r\n this.updateAllRects()\r\n this.lastResizeScrollCallTimestamp = performance.now()\r\n this.resizeScrollThrottleTimeoutId = null\r\n }, currentDelay - timeSinceLastCall)\r\n }\r\n }\r\n\r\n private handleElementResize = (entries: ResizeObserverEntry[]): void => {\r\n for (const entry of entries) {\r\n const element = entry.target as ForesightElement\r\n const foresightElementData = this.elements.get(element)\r\n\r\n if (foresightElementData) {\r\n // console.log('ResizeObserver detected resize for:', foresightElementData.name || element);\r\n this.updateExpandedRect(element, foresightElementData.elementBounds.hitSlop)\r\n }\r\n }\r\n }\r\n\r\n private handleDomMutations = (mutationsList: MutationRecord[]): void => {\r\n let structuralChangeDetected = false\r\n for (const mutation of mutationsList) {\r\n if (mutation.type === \"childList\" && mutation.removedNodes.length > 0) {\r\n const currentElements = Array.from(this.elements.keys())\r\n for (const element of currentElements) {\r\n if (!element.isConnected) {\r\n if (this.elements.has(element)) {\r\n this.unregister(element)\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n mutation.type === \"childList\" ||\r\n (mutation.type === \"attributes\" &&\r\n (mutation.attributeName === \"style\" || mutation.attributeName === \"class\"))\r\n ) {\r\n structuralChangeDetected = true\r\n }\r\n }\r\n\r\n if (structuralChangeDetected && this.elements.size > 0) {\r\n if (this.domMutationRectsUpdateTimeoutId) {\r\n clearTimeout(this.domMutationRectsUpdateTimeoutId)\r\n }\r\n const now = performance.now()\r\n const delay = this.globalSettings.resizeScrollThrottleDelay\r\n const timeSinceLastCall = now - this.lastDomMutationRectsUpdateTimestamp\r\n\r\n if (timeSinceLastCall >= delay) {\r\n console.log(\"DOM Mutation: Updating all rects immediately\")\r\n this.updateAllRects()\r\n this.lastDomMutationRectsUpdateTimestamp = now\r\n this.domMutationRectsUpdateTimeoutId = null\r\n }\r\n }\r\n }\r\n\r\n private setupGlobalListeners(): void {\r\n console.log(\"Setting up global listeners\")\r\n if (this.isSetup) return\r\n // console.log(\"Setting up global listeners\");\r\n document.addEventListener(\"mousemove\", this.handleMouseMove)\r\n window.addEventListener(\"resize\", this.handleResizeOrScroll)\r\n window.addEventListener(\"scroll\", this.handleResizeOrScroll)\r\n\r\n if (!this.domObserver) {\r\n this.domObserver = new MutationObserver(this.handleDomMutations)\r\n }\r\n this.domObserver.observe(document.documentElement, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true, // Observe attribute changes that might affect layout\r\n // attributeFilter: ['style', 'class'], // More targeted, but broader is safer\r\n })\r\n\r\n if (!this.elementResizeObserver) {\r\n this.elementResizeObserver = new ResizeObserver(this.handleElementResize)\r\n // Existing elements (if any from a re-setup, though unlikely with singleton)\r\n // would need to be re-observed. New elements are observed in register().\r\n this.elements.forEach((_, element) => this.elementResizeObserver!.observe(element))\r\n }\r\n this.isSetup = true\r\n }\r\n\r\n private removeGlobalListeners(): void {\r\n // console.log(\"Removing global listeners\");\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove)\r\n window.removeEventListener(\"resize\", this.handleResizeOrScroll)\r\n window.removeEventListener(\"scroll\", this.handleResizeOrScroll)\r\n\r\n if (this.resizeScrollThrottleTimeoutId) {\r\n clearTimeout(this.resizeScrollThrottleTimeoutId)\r\n this.resizeScrollThrottleTimeoutId = null\r\n }\r\n if (this.domMutationRectsUpdateTimeoutId) {\r\n clearTimeout(this.domMutationRectsUpdateTimeoutId)\r\n this.domMutationRectsUpdateTimeoutId = null\r\n }\r\n\r\n if (this.domObserver) {\r\n this.domObserver.disconnect()\r\n }\r\n if (this.elementResizeObserver) {\r\n this.elementResizeObserver.disconnect()\r\n }\r\n this.isSetup = false\r\n }\r\n}\r\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","SuppressedError","ForesightDebugger","intentManager","shadowHost","shadowRoot","debugContainer","debugLinkOverlays","Map","debugPredictedMouseIndicator","debugTrajectoryLine","debugControlsContainer","debugStyleElement","currentGlobalSettings","lastElementData","foresightManagerInstance","initialize","links","currentSettings","currentPoint","predictedPoint","_this","window","cleanup","document","createElement","id","style","pointerEvents","body","appendChild","attachShadow","mode","textContent","className","createDebugControls","clear","forEach","data","element","createOrUpdateLinkOverlay","updateTrajectoryVisuals","enableMousePrediction","_a","remove","overlays","linkOverlay","expandedOverlay","nameLabel","querySelectorAll","el","showPrefetchAnimation","rect","getBoundingClientRect","width","height","indicator","centerX","left","centerY","top","randomXEnd","Math","random","randomYEnd","concat","opacity","transform","offsetWidth","setTimeout","newData","oldData","get","callbackLikelyTriggered","newTrajectoryHit","isTrajectoryHit","newHover","isHovering","set","linkOverlay_1","expandedOverlay_1","nameLabel_1","classList","toggle","elementBounds","expandedRect","right","bottom","display","name","removeLinkOverlay","delete","updateAllLinkVisuals","currentElements","Set","keys","_","has","x","y","dx","dy","length_1","sqrt","angle","atan2","PI","initialSettings","innerHTML","positionHistorySize","trajectoryPredictionTime","resizeScrollThrottleDelay","enabledCheckbox","querySelector","addEventListener","alterGlobalSettings","checked","historySlider","historyValueSpan","value","parseInt","toString","predictionSlider","predictionValueSpan","throttleSlider","throttleValueSpan","updateControlsState","settings","ForesightManager","elements","isSetup","debugMode","debugger","globalSettings","debug","defaultHitSlop","positions","lastResizeScrollCallTimestamp","resizeScrollThrottleTimeoutId","domObserver","lastDomMutationRectsUpdateTimestamp","domMutationRectsUpdateTimeoutId","elementResizeObserver","normalizeHitSlop","hitSlop","predictMousePosition","point","currentPosition","time","performance","now","push","shift","first","last","dt","vx","vy","trajectoryPredictionTimeInSeconds","handleMouseMove","e","clientX","clientY","elementsToUpdateInDebugger","currentData","previousData","callbackFiredThisCycle","finalIsHovering","finalIsTrajectoryHit","finalTrajectoryHitTime","trajectoryHitTime","isCurrentlyPhysicallyHovering","isNewTrajectoryActivation","lineSegmentIntersectsRect","callback","hoverCanTriggerCallback","newElementData","handleResizeOrScroll","clearTimeout","timeSinceLastCall","currentDelay","updateAllRects","handleElementResize","entries","_i","entries_1","target","foresightElementData","updateExpandedRect","handleDomMutations","mutationsList","structuralChangeDetected","mutationsList_1","mutation","type","removedNodes","currentElements_1","Array","from","isConnected","unregister","attributeName","size","delay","console","log","setInterval","checkTrajectoryHitExpiration","bind","props","manager","warn","turnOnDebugMode","defineProperty","updatedForesightElements","register","normalizedHitSlop","originalRect","newForesightElementData","getExpandedRect","setupGlobalListeners","observe","unobserve","removeGlobalListeners","settingsActuallyChanged","undefined","JSON","stringify","baseRect","newOriginalRect","currentHitSlop","updatedData","p1","p2","t0","t1","clipTest","q","r","MutationObserver","documentElement","childList","subtree","attributes","ResizeObserver","removeEventListener","disconnect"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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}();export{i as ForesightManager};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../node_modules/.pnpm/@rollup+plugin-typescript@12.1.2_rollup@4.40.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../src/ForesightManager/ForesightDebugger.ts","../src/ForesightManager/ForesightManager.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import type { ForesightManager } from \"./ForesightManager\"\r\nimport type {\r\n ForesightElementData,\r\n ForesightElement,\r\n ForesightManagerProps,\r\n Point,\r\n} from \"../types/types\"\r\n\r\n/**\r\n * Manages the visual debugging interface for the ForesightManager.\r\n *\r\n * This class is responsible for creating and updating all visual elements\r\n * related to debugging, such as element overlays, trajectory lines,\r\n * predicted mouse indicators, and control panels. It operates within a\r\n * shadow DOM to avoid interfering with the host page's styles and structure.\r\n *\r\n * The ForesightDebugger is typically instantiated and controlled by the\r\n * {@link ForesightManager} when its debug mode is enabled.\r\n */\r\nexport class ForesightDebugger {\r\n private foresightManagerInstance: ForesightManager\r\n private shadowHost: HTMLElement | null = null\r\n private shadowRoot: ShadowRoot | null = null\r\n private debugContainer: HTMLElement | null = null\r\n private debugLinkOverlays: Map<\r\n ForesightElement,\r\n {\r\n linkOverlay: HTMLElement\r\n expandedOverlay: HTMLElement\r\n nameLabel: HTMLElement\r\n }\r\n > = new Map()\r\n private debugPredictedMouseIndicator: HTMLElement | null = null\r\n private debugTrajectoryLine: HTMLElement | null = null\r\n private debugControlsContainer: HTMLElement | null = null\r\n private debugStyleElement: HTMLStyleElement | null = null\r\n\r\n private currentGlobalSettings: ForesightManagerProps | null = null\r\n private lastElementData: Map<\r\n ForesightElement,\r\n { isHovering: boolean; isTrajectoryHit: boolean }\r\n > = new Map()\r\n\r\n constructor(intentManager: ForesightManager) {\r\n this.foresightManagerInstance = intentManager\r\n }\r\n\r\n public initialize(\r\n links: Map<ForesightElement, ForesightElementData>,\r\n currentSettings: ForesightManagerProps,\r\n currentPoint: Point,\r\n predictedPoint: Point\r\n ): void {\r\n if (typeof window === \"undefined\") return\r\n this.cleanup()\r\n\r\n this.currentGlobalSettings = { ...currentSettings }\r\n\r\n this.shadowHost = document.createElement(\"div\")\r\n this.shadowHost.id = \"jsforesight-debugger-shadow-host\"\r\n this.shadowHost.style.pointerEvents = \"none\"\r\n document.body.appendChild(this.shadowHost)\r\n this.shadowRoot = this.shadowHost.attachShadow({ mode: \"open\" })\r\n\r\n this.debugStyleElement = document.createElement(\"style\")\r\n this.debugStyleElement.textContent = `\r\n #jsforesight-debug-container {\r\n position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n pointer-events: none; z-index: 9999;\r\n }\r\n .jsforesight-link-overlay {\r\n position: absolute; border: 2px solid transparent;\r\n background-color: rgba(0, 0, 255, 0.1); box-sizing: border-box;\r\n transition: opacity 0.2s ease, border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n .jsforesight-link-overlay.active {\r\n border-color: oklch(83.7% 0.128 66.29); background-color: rgba(255, 0, 0, 0.1);\r\n }\r\n .jsforesight-link-overlay.trajectory-hit {\r\n border-color: oklch(89.7% 0.196 126.665); background-color: rgba(0, 255, 0, 0.3);\r\n box-shadow: 0 0 10px rgba(0, 255, 0, 0.8);\r\n }\r\n .jsforesight-expanded-overlay {\r\n position: absolute; border: 1px dashed rgba(0, 0, 255, 0.3);\r\n background-color: rgba(0, 0, 255, 0.05); box-sizing: border-box;\r\n }\r\n .jsforesight-mouse-predicted {\r\n position: absolute; width: 20px; height: 20px; border-radius: 50%;\r\n border: 2px solid oklch(83.7% 0.128 66.29); background-color: rgba(255, 165, 0, 0.3);\r\n transform: translate(-50%, -50%); z-index: 10000;\r\n }\r\n .jsforesight-trajectory-line {\r\n position: absolute; height: 2px; background-color: rgba(255, 100, 0, 0.5);\r\n transform-origin: left center; z-index: 9999;\r\n }\r\n .jsforesight-name-label {\r\n position: absolute;\r\n background-color: rgba(0, 0, 0, 0.75);\r\n color: white;\r\n padding: 3px 6px;\r\n font-size: 11px;\r\n font-family: Arial, sans-serif;\r\n border-radius: 3px;\r\n z-index: 10001;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n }\r\n #jsforesight-debug-controls {\r\n position: fixed; bottom: 10px; right: 10px;\r\n background-color: rgba(0, 0, 0, 0.75); color: white; padding: 12px;\r\n border-radius: 5px; font-family: Arial, sans-serif; font-size: 13px;\r\n z-index: 10001; pointer-events: auto; display: flex; flex-direction: column; gap: 8px;\r\n min-width: 300px;\r\n }\r\n .jsforesight-debugger-title-container {\r\n display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 8px;\r\n }\r\n .jsforesight-debugger-title-container h3 { margin: 0; font-size: 15px; }\r\n #jsforesight-debug-controls label { display: flex; align-items: center; gap: 5px; cursor: pointer; }\r\n #jsforesight-debug-controls input[type=\"range\"] { flex-grow: 1; margin: 0 5px; cursor: pointer;}\r\n #jsforesight-debug-controls input[type=\"checkbox\"] { margin-right: 5px; cursor: pointer; }\r\n #jsforesight-debug-controls .control-row { display: flex; align-items: center; justify-content: space-between; }\r\n #jsforesight-debug-controls .control-row label { flex-basis: auto; }\r\n #jsforesight-debug-controls .control-row span:not(.jsforesight-info-icon) { min-width: 30px; text-align: right; }\r\n .jsforesight-info-icon {\r\n display: inline-flex; align-items: center; justify-content: center;\r\n width: 16px; height: 16px; border-radius: 50%;\r\n background-color: #555; color: white;\r\n font-size: 10px; font-style: italic; font-weight: bold;\r\n font-family: 'Georgia', serif;\r\n cursor: help; user-select: none;\r\n flex-shrink: 0;\r\n }\r\n .jsforesight-prefetch-indicator {\r\n position: absolute;\r\n background-color: black;\r\n color: white;\r\n padding: 3px 6px; /* Smaller padding */\r\n font-size: 10px; /* Smaller font */\r\n font-family: Arial, sans-serif;\r\n font-weight: bold;\r\n border-radius: 4px; /* Slightly smaller radius */\r\n z-index: 10002;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n opacity: 1;\r\n transition: transform 0.6s cubic-bezier(0.15, 0.5, 0.35, 1), /* Shorter duration */\r\n opacity 0.6s cubic-bezier(0.4, 0, 0.8, 1); /* Shorter duration */\r\n }\r\n `\r\n this.shadowRoot.appendChild(this.debugStyleElement)\r\n\r\n this.debugContainer = document.createElement(\"div\")\r\n this.debugContainer.id = \"jsforesight-debug-container\"\r\n this.shadowRoot.appendChild(this.debugContainer)\r\n\r\n this.debugPredictedMouseIndicator = document.createElement(\"div\")\r\n this.debugPredictedMouseIndicator.className = \"jsforesight-mouse-predicted\"\r\n this.debugContainer.appendChild(this.debugPredictedMouseIndicator)\r\n\r\n this.debugTrajectoryLine = document.createElement(\"div\")\r\n this.debugTrajectoryLine.className = \"jsforesight-trajectory-line\"\r\n this.debugContainer.appendChild(this.debugTrajectoryLine)\r\n\r\n this.createDebugControls(currentSettings)\r\n\r\n this.lastElementData.clear()\r\n links.forEach((data, element) => {\r\n this.createOrUpdateLinkOverlay(element, data)\r\n })\r\n\r\n this.updateTrajectoryVisuals(\r\n currentPoint,\r\n predictedPoint,\r\n currentSettings.enableMousePrediction\r\n )\r\n }\r\n\r\n public cleanup(): void {\r\n this.shadowHost?.remove()\r\n this.shadowHost = null\r\n this.shadowRoot = null\r\n this.debugLinkOverlays.forEach((overlays) => {\r\n overlays.linkOverlay.remove()\r\n overlays.expandedOverlay.remove()\r\n overlays.nameLabel.remove()\r\n })\r\n this.debugLinkOverlays.clear()\r\n this.lastElementData.clear()\r\n if (this.debugContainer) {\r\n this.debugContainer\r\n .querySelectorAll(\".jsforesight-prefetch-indicator\")\r\n .forEach((el) => el.remove())\r\n }\r\n }\r\n\r\n private showPrefetchAnimation(element: ForesightElement): void {\r\n if (!this.debugContainer) return\r\n\r\n const rect = element.getBoundingClientRect()\r\n if (rect.width === 0 && rect.height === 0) return\r\n\r\n const indicator = document.createElement(\"div\")\r\n indicator.className = \"jsforesight-prefetch-indicator\"\r\n indicator.textContent = \"Prefetched\"\r\n\r\n this.debugContainer.appendChild(indicator)\r\n\r\n const centerX = rect.left + rect.width / 2\r\n const centerY = rect.top + rect.height / 2\r\n\r\n // Shorter random end position for the \"arch\" flight\r\n // Horizontal: -40px to +40px from the element's center\r\n const randomXEnd = (Math.random() - 0.5) * 80\r\n // Vertical: -50px to -80px (upwards) from the element's center\r\n const randomYEnd = -50 - Math.random() * 30\r\n\r\n indicator.style.left = `${centerX}px`\r\n indicator.style.top = `${centerY}px`\r\n indicator.style.opacity = \"1\"\r\n indicator.style.transform = `translate(-50%, -50%) translate(0px, 0px) scale(0.7)`\r\n\r\n void indicator.offsetWidth\r\n\r\n indicator.style.opacity = \"0\"\r\n indicator.style.transform = `translate(-50%, -50%) translate(${randomXEnd}px, ${randomYEnd}px) scale(1)`\r\n\r\n setTimeout(() => {\r\n indicator.remove()\r\n }, 800)\r\n }\r\n\r\n public createOrUpdateLinkOverlay(element: ForesightElement, newData: ForesightElementData): void {\r\n if (!this.debugContainer || !this.shadowRoot) return\r\n\r\n if (this.currentGlobalSettings) {\r\n const oldData = this.lastElementData.get(element)\r\n let callbackLikelyTriggered = false\r\n\r\n const newTrajectoryHit = newData.isTrajectoryHit && (!oldData || !oldData.isTrajectoryHit)\r\n const newHover = newData.isHovering && (!oldData || !oldData.isHovering)\r\n\r\n if (newTrajectoryHit) {\r\n callbackLikelyTriggered = true\r\n } else if (newHover) {\r\n if (\r\n !newData.isTrajectoryHit ||\r\n (newData.isTrajectoryHit && !this.currentGlobalSettings.enableMousePrediction)\r\n ) {\r\n callbackLikelyTriggered = true\r\n }\r\n }\r\n\r\n if (callbackLikelyTriggered) {\r\n this.showPrefetchAnimation(element)\r\n }\r\n }\r\n this.lastElementData.set(element, {\r\n isHovering: newData.isHovering,\r\n isTrajectoryHit: newData.isTrajectoryHit,\r\n })\r\n\r\n let overlays = this.debugLinkOverlays.get(element)\r\n if (!overlays) {\r\n const linkOverlay = document.createElement(\"div\")\r\n linkOverlay.className = \"jsforesight-link-overlay\"\r\n this.debugContainer.appendChild(linkOverlay)\r\n\r\n const expandedOverlay = document.createElement(\"div\")\r\n expandedOverlay.className = \"jsforesight-expanded-overlay\"\r\n this.debugContainer.appendChild(expandedOverlay)\r\n\r\n const nameLabel = document.createElement(\"div\")\r\n nameLabel.className = \"jsforesight-name-label\"\r\n this.debugContainer.appendChild(nameLabel)\r\n\r\n overlays = { linkOverlay, expandedOverlay, nameLabel }\r\n this.debugLinkOverlays.set(element, overlays)\r\n }\r\n\r\n const { linkOverlay, expandedOverlay, nameLabel } = overlays\r\n const rect = element.getBoundingClientRect()\r\n\r\n linkOverlay.style.left = `${rect.left}px`\r\n linkOverlay.style.top = `${rect.top}px`\r\n linkOverlay.style.width = `${rect.width}px`\r\n linkOverlay.style.height = `${rect.height}px`\r\n linkOverlay.classList.toggle(\"trajectory-hit\", newData.isTrajectoryHit)\r\n linkOverlay.classList.toggle(\"active\", newData.isHovering)\r\n\r\n if (newData.elementBounds.expandedRect) {\r\n expandedOverlay.style.left = `${newData.elementBounds.expandedRect.left}px`\r\n expandedOverlay.style.top = `${newData.elementBounds.expandedRect.top}px`\r\n expandedOverlay.style.width = `${\r\n newData.elementBounds.expandedRect.right - newData.elementBounds.expandedRect.left\r\n }px`\r\n expandedOverlay.style.height = `${\r\n newData.elementBounds.expandedRect.bottom - newData.elementBounds.expandedRect.top\r\n }px`\r\n expandedOverlay.style.display = \"block\"\r\n } else {\r\n expandedOverlay.style.display = \"none\"\r\n }\r\n\r\n if (newData.name && newData.name !== \"Unnamed\") {\r\n nameLabel.textContent = newData.name\r\n nameLabel.style.display = \"block\"\r\n nameLabel.style.left = `${rect.left}px`\r\n nameLabel.style.top = `${rect.top - 22}px`\r\n } else {\r\n nameLabel.style.display = \"none\"\r\n }\r\n }\r\n\r\n public removeLinkOverlay(element: ForesightElement): void {\r\n const overlays = this.debugLinkOverlays.get(element)\r\n if (overlays) {\r\n overlays.linkOverlay.remove()\r\n overlays.expandedOverlay.remove()\r\n overlays.nameLabel.remove()\r\n this.debugLinkOverlays.delete(element)\r\n }\r\n this.lastElementData.delete(element)\r\n }\r\n\r\n public updateAllLinkVisuals(links: Map<ForesightElement, ForesightElementData>): void {\r\n if (!this.shadowRoot || !this.debugContainer) return\r\n\r\n const currentElements = new Set(links.keys())\r\n this.debugLinkOverlays.forEach((_, element) => {\r\n if (!currentElements.has(element)) {\r\n this.removeLinkOverlay(element)\r\n }\r\n })\r\n\r\n links.forEach((data, element) => {\r\n this.createOrUpdateLinkOverlay(element, data)\r\n })\r\n }\r\n\r\n public updateTrajectoryVisuals(\r\n currentPoint: Point,\r\n predictedPoint: Point,\r\n enableMousePrediction: boolean\r\n ): void {\r\n if (!this.shadowRoot || !this.debugContainer) return\r\n\r\n if (this.debugPredictedMouseIndicator) {\r\n this.debugPredictedMouseIndicator.style.left = `${predictedPoint?.x || 0}px`\r\n this.debugPredictedMouseIndicator.style.top = `${predictedPoint?.y || 0}px`\r\n this.debugPredictedMouseIndicator.style.display =\r\n enableMousePrediction && predictedPoint ? \"block\" : \"none\"\r\n }\r\n\r\n if (this.debugTrajectoryLine) {\r\n if (enableMousePrediction && currentPoint && predictedPoint) {\r\n const dx = predictedPoint.x - currentPoint.x\r\n const dy = predictedPoint.y - currentPoint.y\r\n const length = Math.sqrt(dx * dx + dy * dy)\r\n const angle = (Math.atan2(dy, dx) * 180) / Math.PI\r\n\r\n this.debugTrajectoryLine.style.left = `${currentPoint.x}px`\r\n this.debugTrajectoryLine.style.top = `${currentPoint.y}px`\r\n this.debugTrajectoryLine.style.width = `${length}px`\r\n this.debugTrajectoryLine.style.transform = `translateY(-50%) rotate(${angle}deg)`\r\n this.debugTrajectoryLine.style.display = \"block\"\r\n } else {\r\n this.debugTrajectoryLine.style.display = \"none\"\r\n }\r\n }\r\n }\r\n\r\n private createDebugControls(initialSettings: ForesightManagerProps): void {\r\n if (!this.shadowRoot) return\r\n\r\n this.debugControlsContainer = document.createElement(\"div\")\r\n this.debugControlsContainer.id = \"jsforesight-debug-controls\"\r\n this.shadowRoot.appendChild(this.debugControlsContainer)\r\n\r\n this.debugControlsContainer.innerHTML = `\r\n <div class=\"jsforesight-debugger-title-container\">\r\n <h3>Foresight Debugger</h3>\r\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>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-trajectory-enabled\">\r\n Enable Mouse Prediction\r\n <span class=\"jsforesight-info-icon\" title=\"Toggles mouse movement prediction. If disabled, only direct hovers trigger actions.\">i</span>\r\n </label>\r\n <input type=\"checkbox\" id=\"jsforesight-trajectory-enabled\" ${\r\n initialSettings.enableMousePrediction ? \"checked\" : \"\"\r\n }>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-history-size\">\r\n History Size\r\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>\r\n </label>\r\n <input type=\"range\" id=\"jsforesight-history-size\" min=\"2\" max=\"20\" value=\"${\r\n initialSettings.positionHistorySize\r\n }\">\r\n <span id=\"jsforesight-history-value\">${initialSettings.positionHistorySize}</span>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-prediction-time\">\r\n Prediction Time (ms)\r\n <span class=\"jsforesight-info-icon\" title=\"How far (ms) to project trajectory (Min: 10, Max: 500). Larger values detect intent sooner.\">i</span>\r\n </label>\r\n <input type=\"range\" id=\"jsforesight-prediction-time\" min=\"10\" max=\"500\" step=\"10\" value=\"${\r\n initialSettings.trajectoryPredictionTime\r\n }\">\r\n <span id=\"jsforesight-prediction-value\">${initialSettings.trajectoryPredictionTime}</span>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"jsforesight-throttle-delay\">\r\n Scroll/Resize Throttle (ms)\r\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>\r\n </label>\r\n <input type=\"range\" id=\"jsforesight-throttle-delay\" min=\"0\" max=\"500\" step=\"10\" value=\"${\r\n initialSettings.resizeScrollThrottleDelay\r\n }\">\r\n <span id=\"jsforesight-throttle-value\">${initialSettings.resizeScrollThrottleDelay}</span>\r\n </div>\r\n `\r\n\r\n const enabledCheckbox = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-trajectory-enabled\"\r\n ) as HTMLInputElement\r\n enabledCheckbox.addEventListener(\"change\", () => {\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n enableMousePrediction: enabledCheckbox.checked,\r\n })\r\n })\r\n\r\n const historySlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-size\"\r\n ) as HTMLInputElement\r\n const historyValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-value\"\r\n ) as HTMLSpanElement\r\n historySlider.addEventListener(\"input\", () => {\r\n const value = parseInt(historySlider.value)\r\n historyValueSpan.textContent = value.toString()\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n positionHistorySize: value,\r\n })\r\n })\r\n\r\n const predictionSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-time\"\r\n ) as HTMLInputElement\r\n const predictionValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-value\"\r\n ) as HTMLSpanElement\r\n predictionSlider.addEventListener(\"input\", () => {\r\n const value = parseInt(predictionSlider.value)\r\n predictionValueSpan.textContent = value.toString()\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n trajectoryPredictionTime: value,\r\n })\r\n })\r\n\r\n const throttleSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-delay\"\r\n ) as HTMLInputElement\r\n const throttleValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-value\"\r\n ) as HTMLSpanElement\r\n throttleSlider.addEventListener(\"input\", () => {\r\n const value = parseInt(throttleSlider.value)\r\n throttleValueSpan.textContent = value.toString()\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n resizeScrollThrottleDelay: value,\r\n })\r\n })\r\n }\r\n\r\n public updateControlsState(settings: ForesightManagerProps): void {\r\n this.currentGlobalSettings = { ...settings }\r\n\r\n if (!this.debugControlsContainer) return\r\n\r\n const enabledCheckbox = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-trajectory-enabled\"\r\n ) as HTMLInputElement\r\n if (enabledCheckbox) enabledCheckbox.checked = settings.enableMousePrediction\r\n\r\n const historySlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-size\"\r\n ) as HTMLInputElement\r\n const historyValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-history-value\"\r\n ) as HTMLSpanElement\r\n if (historySlider && historyValueSpan) {\r\n historySlider.value = settings.positionHistorySize.toString()\r\n historyValueSpan.textContent = settings.positionHistorySize.toString()\r\n }\r\n\r\n const predictionSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-time\"\r\n ) as HTMLInputElement\r\n const predictionValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-prediction-value\"\r\n ) as HTMLSpanElement\r\n if (predictionSlider && predictionValueSpan) {\r\n predictionSlider.value = settings.trajectoryPredictionTime.toString()\r\n predictionValueSpan.textContent = settings.trajectoryPredictionTime.toString()\r\n }\r\n\r\n const throttleSlider = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-delay\"\r\n ) as HTMLInputElement\r\n const throttleValueSpan = this.debugControlsContainer.querySelector(\r\n \"#jsforesight-throttle-value\"\r\n ) as HTMLSpanElement\r\n if (throttleSlider && throttleValueSpan) {\r\n throttleSlider.value = settings.resizeScrollThrottleDelay.toString()\r\n throttleValueSpan.textContent = settings.resizeScrollThrottleDelay.toString()\r\n }\r\n }\r\n}\r\n","import { ForesightDebugger } from \"./ForesightDebugger\"\r\nimport type {\r\n ForesightCallback,\r\n ForesightManagerProps,\r\n ForesightElementData,\r\n ForesightElement,\r\n MousePosition,\r\n Point,\r\n Rect,\r\n} from \"../types/types\"\r\n\r\n/**\r\n * Manages the prediction of user intent based on mouse trajectory and element interactions.\r\n *\r\n * ForesightManager is a singleton class responsible for:\r\n * - Registering HTML elements to monitor.\r\n * - Tracking mouse movements and predicting future cursor positions.\r\n * - Detecting when a predicted trajectory intersects with a registered element's bounds.\r\n * - Invoking callbacks associated with elements upon predicted or actual interaction.\r\n * - Handling global settings for prediction behavior (e.g., history size, prediction time).\r\n * - Optionally enabling a {@link ForesightDebugger} for visual feedback.\r\n * - Automatically updating element bounds on resize using {@link ResizeObserver}.\r\n * - Automatically unregistering elements removed from the DOM using {@link MutationObserver}.\r\n * - Detecting broader layout shifts via {@link MutationObserver} to update element positions.\r\n *\r\n * It should be initialized once using {@link ForesightManager.initialize} and then\r\n * accessed via the static getter {@link ForesightManager.instance}.\r\n */\r\nexport class ForesightManager {\r\n private static manager: ForesightManager\r\n public elements: Map<ForesightElement, ForesightElementData> = new Map()\r\n\r\n private isSetup: boolean = false\r\n private debugMode: boolean = false\r\n private debugger: ForesightDebugger | null = null\r\n\r\n private globalSettings: ForesightManagerProps = {\r\n debug: false,\r\n enableMousePrediction: true,\r\n positionHistorySize: 8,\r\n trajectoryPredictionTime: 80,\r\n defaultHitSlop: { top: 0, left: 0, right: 0, bottom: 0 },\r\n resizeScrollThrottleDelay: 50,\r\n }\r\n\r\n private positions: MousePosition[] = []\r\n private currentPoint: Point = { x: 0, y: 0 }\r\n private predictedPoint: Point = { x: 0, y: 0 }\r\n\r\n // Throttling for window resize/scroll triggered updates\r\n private lastResizeScrollCallTimestamp: number = 0\r\n private resizeScrollThrottleTimeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n // For automatic unregistration and detecting layout shifts\r\n private domObserver: MutationObserver | null = null\r\n // Throttling for DOM mutation-triggered rect updates\r\n private lastDomMutationRectsUpdateTimestamp: number = 0\r\n private domMutationRectsUpdateTimeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n // For observing individual element resizes\r\n private elementResizeObserver: ResizeObserver | null = null\r\n\r\n private constructor() {\r\n this.globalSettings.defaultHitSlop = this.normalizeHitSlop(this.globalSettings.defaultHitSlop)\r\n setInterval(this.checkTrajectoryHitExpiration.bind(this), 100)\r\n }\r\n\r\n /**\r\n * Initializes the ForesightManager singleton instance with optional global settings.\r\n */\r\n public static initialize(props?: Partial<ForesightManagerProps>): ForesightManager {\r\n if (!ForesightManager.manager) {\r\n ForesightManager.manager = new ForesightManager()\r\n if (props) {\r\n ForesightManager.manager.alterGlobalSettings(props)\r\n } else {\r\n // Ensure debugger is initialized if debug is true by default and no props are passed\r\n if (ForesightManager.manager.globalSettings.debug) {\r\n ForesightManager.manager.turnOnDebugMode()\r\n }\r\n }\r\n } else if (props) {\r\n console.warn(\r\n \"ForesightManager is already initialized. Use alterGlobalSettings to update settings. Make sure to not put the ForesightManager.initialize() in a place that rerenders often.\"\r\n )\r\n ForesightManager.manager.alterGlobalSettings(props)\r\n }\r\n // Ensure debugMode property reflects the potentially updated globalSettings.debug\r\n ForesightManager.manager.debugMode = ForesightManager.manager.globalSettings.debug\r\n return ForesightManager.manager\r\n }\r\n\r\n /**\r\n * Gets the singleton instance of the ForesightManager.\r\n */\r\n public static get instance() {\r\n if (!ForesightManager.manager) {\r\n return this.initialize() // Initializes with defaults if not already done\r\n }\r\n return ForesightManager.manager\r\n }\r\n\r\n private checkTrajectoryHitExpiration(): void {\r\n const now = performance.now()\r\n const updatedForesightElements: ForesightElement[] = []\r\n\r\n this.elements.forEach((foresightElementData, element) => {\r\n if (\r\n foresightElementData.isTrajectoryHit &&\r\n now - foresightElementData.trajectoryHitTime > 200 // Expiration time for trajectory hit state\r\n ) {\r\n this.elements.set(element, {\r\n ...foresightElementData,\r\n isTrajectoryHit: false,\r\n })\r\n updatedForesightElements.push(element)\r\n }\r\n })\r\n\r\n if (updatedForesightElements.length > 0 && this.debugMode && this.debugger) {\r\n updatedForesightElements.forEach((element) => {\r\n const data = this.elements.get(element)\r\n if (data) {\r\n this.debugger!.createOrUpdateLinkOverlay(element, data)\r\n }\r\n })\r\n }\r\n }\r\n\r\n private normalizeHitSlop = (hitSlop: number | Rect): Rect => {\r\n if (typeof hitSlop === \"number\") {\r\n return {\r\n top: hitSlop,\r\n left: hitSlop,\r\n right: hitSlop,\r\n bottom: hitSlop,\r\n }\r\n }\r\n return hitSlop\r\n }\r\n\r\n /**\r\n * Registers an element with the ForesightManager.\r\n */\r\n public register(\r\n element: ForesightElement,\r\n callback: ForesightCallback,\r\n hitSlop?: number | Rect,\r\n name?: string\r\n ): () => void {\r\n // console.log(\"Registering element:\", name || element);\r\n const normalizedHitSlop = hitSlop\r\n ? this.normalizeHitSlop(hitSlop)\r\n : (this.globalSettings.defaultHitSlop as Rect)\r\n const originalRect = element.getBoundingClientRect()\r\n const newForesightElementData: ForesightElementData = {\r\n callback,\r\n elementBounds: {\r\n expandedRect: this.getExpandedRect(originalRect, normalizedHitSlop),\r\n originalRect: originalRect,\r\n hitSlop: normalizedHitSlop,\r\n },\r\n isHovering: false,\r\n isTrajectoryHit: false,\r\n trajectoryHitTime: 0,\r\n name: name ?? \"Unnamed\",\r\n }\r\n this.elements.set(element, newForesightElementData)\r\n\r\n if (!this.isSetup) {\r\n this.setupGlobalListeners()\r\n }\r\n\r\n if (this.elementResizeObserver) {\r\n this.elementResizeObserver.observe(element)\r\n }\r\n\r\n if (this.debugMode && this.debugger) {\r\n const data = this.elements.get(element)\r\n if (data) this.debugger.createOrUpdateLinkOverlay(element, data)\r\n }\r\n\r\n return () => this.unregister(element)\r\n }\r\n\r\n private unregister(element: ForesightElement): void {\r\n const isRegistered = this.elements.has(element)\r\n if (isRegistered) {\r\n console.log(\"Unregistering element:\", this.elements.get(element)?.name || element)\r\n if (this.elementResizeObserver) {\r\n this.elementResizeObserver.unobserve(element)\r\n }\r\n\r\n if (this.debugMode && this.debugger) {\r\n this.debugger.removeLinkOverlay(element)\r\n }\r\n this.elements.delete(element)\r\n\r\n if (this.elements.size === 0 && this.isSetup) {\r\n this.removeGlobalListeners()\r\n }\r\n } else {\r\n console.log(\"Attempted to unregister element not found:\", element)\r\n }\r\n }\r\n\r\n /**\r\n * Alters the global settings of the ForesightManager at runtime.\r\n */\r\n public alterGlobalSettings(props?: Partial<ForesightManagerProps>): void {\r\n let settingsActuallyChanged = false\r\n\r\n if (\r\n props?.positionHistorySize !== undefined &&\r\n this.globalSettings.positionHistorySize !== props.positionHistorySize\r\n ) {\r\n this.globalSettings.positionHistorySize = props.positionHistorySize\r\n settingsActuallyChanged = true\r\n }\r\n\r\n if (\r\n props?.trajectoryPredictionTime !== undefined &&\r\n this.globalSettings.trajectoryPredictionTime !== props.trajectoryPredictionTime\r\n ) {\r\n this.globalSettings.trajectoryPredictionTime = props.trajectoryPredictionTime\r\n settingsActuallyChanged = true\r\n }\r\n\r\n if (\r\n props?.enableMousePrediction !== undefined &&\r\n this.globalSettings.enableMousePrediction !== props.enableMousePrediction\r\n ) {\r\n this.globalSettings.enableMousePrediction = props.enableMousePrediction\r\n settingsActuallyChanged = true\r\n if (this.globalSettings.enableMousePrediction) {\r\n this.predictedPoint = this.predictMousePosition(this.currentPoint)\r\n } else {\r\n this.predictedPoint = this.currentPoint\r\n }\r\n }\r\n\r\n if (\r\n props?.defaultHitSlop !== undefined &&\r\n JSON.stringify(this.globalSettings.defaultHitSlop) !==\r\n JSON.stringify(this.normalizeHitSlop(props.defaultHitSlop))\r\n ) {\r\n this.globalSettings.defaultHitSlop = this.normalizeHitSlop(props.defaultHitSlop)\r\n settingsActuallyChanged = true\r\n this.elements.forEach((data, el) => {\r\n // Re-evaluate expandedRect for all elements as default has changed\r\n this.updateExpandedRect(el, data.elementBounds.hitSlop)\r\n })\r\n }\r\n\r\n if (\r\n props?.resizeScrollThrottleDelay !== undefined &&\r\n this.globalSettings.resizeScrollThrottleDelay !== props.resizeScrollThrottleDelay\r\n ) {\r\n this.globalSettings.resizeScrollThrottleDelay = props.resizeScrollThrottleDelay\r\n settingsActuallyChanged = true\r\n }\r\n\r\n if (props?.debug !== undefined && this.globalSettings.debug !== props.debug) {\r\n this.globalSettings.debug = props.debug\r\n settingsActuallyChanged = true // Mark true so debugger visuals update if other settings also changed\r\n if (this.globalSettings.debug) {\r\n this.turnOnDebugMode()\r\n } else {\r\n if (this.debugger) {\r\n this.debugger.cleanup()\r\n this.debugger = null\r\n }\r\n }\r\n this.debugMode = this.globalSettings.debug\r\n }\r\n\r\n if (settingsActuallyChanged && this.globalSettings.debug && this.debugger) {\r\n this.debugger.updateControlsState(this.globalSettings)\r\n this.debugger.updateTrajectoryVisuals(\r\n this.currentPoint,\r\n this.predictedPoint,\r\n this.globalSettings.enableMousePrediction\r\n )\r\n this.elements.forEach((data, el) => {\r\n this.debugger!.createOrUpdateLinkOverlay(el, data)\r\n })\r\n }\r\n }\r\n\r\n private turnOnDebugMode() {\r\n this.debugMode = true\r\n if (!this.debugger) {\r\n this.debugger = new ForesightDebugger(this)\r\n this.debugger.initialize(\r\n this.elements,\r\n this.globalSettings,\r\n this.currentPoint,\r\n this.predictedPoint\r\n )\r\n } else {\r\n this.debugger.updateControlsState(this.globalSettings)\r\n this.debugger.updateAllLinkVisuals(this.elements)\r\n this.debugger.updateTrajectoryVisuals(\r\n this.currentPoint,\r\n this.predictedPoint,\r\n this.globalSettings.enableMousePrediction\r\n )\r\n }\r\n }\r\n\r\n private getExpandedRect(baseRect: Rect | DOMRect, hitSlop: Rect): Rect {\r\n return {\r\n left: baseRect.left - hitSlop.left,\r\n right: baseRect.right + hitSlop.right,\r\n top: baseRect.top - hitSlop.top,\r\n bottom: baseRect.bottom + hitSlop.bottom,\r\n }\r\n }\r\n\r\n private updateExpandedRect(\r\n element: ForesightElement,\r\n hitSlop: Rect // This should be the element's specific hitSlop\r\n ): void {\r\n const foresightElementData = this.elements.get(element)\r\n if (!foresightElementData) return\r\n\r\n const newOriginalRect = element.getBoundingClientRect()\r\n // Use the element's own hitSlop, not the global default, unless it is the default\r\n const currentHitSlop = foresightElementData.elementBounds.hitSlop\r\n const expandedRect = this.getExpandedRect(newOriginalRect, currentHitSlop)\r\n\r\n if (\r\n JSON.stringify(expandedRect) !==\r\n JSON.stringify(foresightElementData.elementBounds.expandedRect) ||\r\n JSON.stringify(newOriginalRect) !==\r\n JSON.stringify(foresightElementData.elementBounds.originalRect)\r\n ) {\r\n this.elements.set(element, {\r\n ...foresightElementData,\r\n elementBounds: {\r\n ...foresightElementData.elementBounds,\r\n originalRect: newOriginalRect,\r\n expandedRect,\r\n },\r\n })\r\n\r\n if (this.debugMode && this.debugger) {\r\n const updatedData = this.elements.get(element)\r\n if (updatedData) this.debugger.createOrUpdateLinkOverlay(element, updatedData)\r\n }\r\n }\r\n }\r\n\r\n private updateAllRects(): void {\r\n // console.log('Updating all rects due to scroll, resize, or DOM mutation.');\r\n this.elements.forEach((data, element) => {\r\n this.updateExpandedRect(element, data.elementBounds.hitSlop)\r\n })\r\n }\r\n\r\n private predictMousePosition = (point: Point): Point => {\r\n const now = performance.now()\r\n const currentPosition: MousePosition = { point, time: now }\r\n const { x, y } = point\r\n\r\n this.positions.push(currentPosition)\r\n if (this.positions.length > this.globalSettings.positionHistorySize) {\r\n this.positions.shift()\r\n }\r\n\r\n if (this.positions.length < 2) {\r\n return { x, y }\r\n }\r\n\r\n const first = this.positions[0]\r\n const last = this.positions[this.positions.length - 1]\r\n const dt = (last.time - first.time) / 1000\r\n\r\n if (dt === 0) {\r\n return { x, y }\r\n }\r\n\r\n const dx = last.point.x - first.point.x\r\n const dy = last.point.y - first.point.y\r\n const vx = dx / dt\r\n const vy = dy / dt\r\n\r\n const trajectoryPredictionTimeInSeconds = this.globalSettings.trajectoryPredictionTime / 1000\r\n const predictedX = x + vx * trajectoryPredictionTimeInSeconds\r\n const predictedY = y + vy * trajectoryPredictionTimeInSeconds\r\n return { x: predictedX, y: predictedY }\r\n }\r\n\r\n private lineSegmentIntersectsRect(p1: Point, p2: Point, rect: Rect): boolean {\r\n let t0 = 0.0\r\n let t1 = 1.0\r\n const dx = p2.x - p1.x\r\n const dy = p2.y - p1.y\r\n\r\n const clipTest = (p: number, q: number): boolean => {\r\n if (p === 0) {\r\n if (q < 0) return false\r\n } else {\r\n const r = q / p\r\n if (p < 0) {\r\n if (r > t1) return false\r\n if (r > t0) t0 = r\r\n } else {\r\n if (r < t0) return false\r\n if (r < t1) t1 = r\r\n }\r\n }\r\n return true\r\n }\r\n\r\n if (!clipTest(-dx, p1.x - rect.left)) return false\r\n if (!clipTest(dx, rect.right - p1.x)) return false\r\n if (!clipTest(-dy, p1.y - rect.top)) return false\r\n if (!clipTest(dy, rect.bottom - p1.y)) return false\r\n\r\n return t0 <= t1\r\n }\r\n\r\n private handleMouseMove = (e: MouseEvent): void => {\r\n this.currentPoint = { x: e.clientX, y: e.clientY }\r\n this.predictedPoint = this.globalSettings.enableMousePrediction\r\n ? this.predictMousePosition(this.currentPoint)\r\n : this.currentPoint\r\n\r\n const elementsToUpdateInDebugger: ForesightElement[] = []\r\n\r\n this.elements.forEach((currentData, element) => {\r\n const previousData = { ...currentData } // Shallow copy for comparison\r\n\r\n let callbackFiredThisCycle = false\r\n let finalIsHovering = previousData.isHovering\r\n let finalIsTrajectoryHit = previousData.isTrajectoryHit\r\n let finalTrajectoryHitTime = previousData.trajectoryHitTime\r\n\r\n const { expandedRect } = previousData.elementBounds\r\n\r\n const isCurrentlyPhysicallyHovering =\r\n this.currentPoint.x >= expandedRect.left &&\r\n this.currentPoint.x <= expandedRect.right &&\r\n this.currentPoint.y >= expandedRect.top &&\r\n this.currentPoint.y <= expandedRect.bottom\r\n\r\n let isNewTrajectoryActivation = false\r\n if (\r\n this.globalSettings.enableMousePrediction &&\r\n !isCurrentlyPhysicallyHovering &&\r\n !previousData.isTrajectoryHit\r\n ) {\r\n if (this.lineSegmentIntersectsRect(this.currentPoint, this.predictedPoint, expandedRect)) {\r\n isNewTrajectoryActivation = true\r\n }\r\n }\r\n\r\n if (isNewTrajectoryActivation) {\r\n previousData.callback()\r\n callbackFiredThisCycle = true\r\n finalIsTrajectoryHit = true\r\n finalTrajectoryHitTime = performance.now()\r\n }\r\n\r\n const isNewPhysicalHoverEvent = isCurrentlyPhysicallyHovering && !previousData.isHovering\r\n\r\n if (isNewPhysicalHoverEvent) {\r\n const hoverCanTriggerCallback =\r\n !previousData.isTrajectoryHit ||\r\n (previousData.isTrajectoryHit && !this.globalSettings.enableMousePrediction)\r\n\r\n if (!callbackFiredThisCycle && hoverCanTriggerCallback) {\r\n previousData.callback()\r\n // callbackFiredThisCycle = true; // Not strictly needed here as it's the last callback check\r\n }\r\n }\r\n\r\n finalIsHovering = isCurrentlyPhysicallyHovering\r\n\r\n const newElementData: ForesightElementData = {\r\n ...previousData, // Start with previous data\r\n elementBounds: previousData.elementBounds, // Keep existing bounds object\r\n isHovering: finalIsHovering,\r\n isTrajectoryHit: finalIsTrajectoryHit,\r\n trajectoryHitTime: finalTrajectoryHitTime,\r\n }\r\n\r\n const stateActuallyChanged =\r\n newElementData.isHovering !== previousData.isHovering ||\r\n newElementData.isTrajectoryHit !== previousData.isTrajectoryHit ||\r\n (newElementData.isTrajectoryHit &&\r\n newElementData.trajectoryHitTime !== previousData.trajectoryHitTime)\r\n\r\n if (stateActuallyChanged) {\r\n this.elements.set(element, newElementData)\r\n elementsToUpdateInDebugger.push(element)\r\n }\r\n })\r\n\r\n if (this.debugMode && this.debugger) {\r\n elementsToUpdateInDebugger.forEach((element) => {\r\n const data = this.elements.get(element)\r\n if (data) this.debugger!.createOrUpdateLinkOverlay(element, data)\r\n })\r\n this.debugger.updateTrajectoryVisuals(\r\n this.currentPoint,\r\n this.predictedPoint,\r\n this.globalSettings.enableMousePrediction\r\n )\r\n }\r\n }\r\n\r\n private handleResizeOrScroll = (): void => {\r\n if (this.resizeScrollThrottleTimeoutId) {\r\n clearTimeout(this.resizeScrollThrottleTimeoutId)\r\n }\r\n\r\n const now = performance.now()\r\n const timeSinceLastCall = now - this.lastResizeScrollCallTimestamp\r\n const currentDelay = this.globalSettings.resizeScrollThrottleDelay\r\n\r\n if (timeSinceLastCall >= currentDelay) {\r\n this.updateAllRects()\r\n this.lastResizeScrollCallTimestamp = now\r\n this.resizeScrollThrottleTimeoutId = null\r\n } else {\r\n this.resizeScrollThrottleTimeoutId = setTimeout(() => {\r\n this.updateAllRects()\r\n this.lastResizeScrollCallTimestamp = performance.now()\r\n this.resizeScrollThrottleTimeoutId = null\r\n }, currentDelay - timeSinceLastCall)\r\n }\r\n }\r\n\r\n private handleElementResize = (entries: ResizeObserverEntry[]): void => {\r\n for (const entry of entries) {\r\n const element = entry.target as ForesightElement\r\n const foresightElementData = this.elements.get(element)\r\n\r\n if (foresightElementData) {\r\n // console.log('ResizeObserver detected resize for:', foresightElementData.name || element);\r\n this.updateExpandedRect(element, foresightElementData.elementBounds.hitSlop)\r\n }\r\n }\r\n }\r\n\r\n private handleDomMutations = (mutationsList: MutationRecord[]): void => {\r\n let structuralChangeDetected = false\r\n for (const mutation of mutationsList) {\r\n if (mutation.type === \"childList\" && mutation.removedNodes.length > 0) {\r\n const currentElements = Array.from(this.elements.keys())\r\n for (const element of currentElements) {\r\n if (!element.isConnected) {\r\n if (this.elements.has(element)) {\r\n this.unregister(element)\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n mutation.type === \"childList\" ||\r\n (mutation.type === \"attributes\" &&\r\n (mutation.attributeName === \"style\" || mutation.attributeName === \"class\"))\r\n ) {\r\n structuralChangeDetected = true\r\n }\r\n }\r\n\r\n if (structuralChangeDetected && this.elements.size > 0) {\r\n if (this.domMutationRectsUpdateTimeoutId) {\r\n clearTimeout(this.domMutationRectsUpdateTimeoutId)\r\n }\r\n const now = performance.now()\r\n const delay = this.globalSettings.resizeScrollThrottleDelay\r\n const timeSinceLastCall = now - this.lastDomMutationRectsUpdateTimestamp\r\n\r\n if (timeSinceLastCall >= delay) {\r\n console.log(\"DOM Mutation: Updating all rects immediately\")\r\n this.updateAllRects()\r\n this.lastDomMutationRectsUpdateTimestamp = now\r\n this.domMutationRectsUpdateTimeoutId = null\r\n }\r\n }\r\n }\r\n\r\n private setupGlobalListeners(): void {\r\n console.log(\"Setting up global listeners\")\r\n if (this.isSetup) return\r\n // console.log(\"Setting up global listeners\");\r\n document.addEventListener(\"mousemove\", this.handleMouseMove)\r\n window.addEventListener(\"resize\", this.handleResizeOrScroll)\r\n window.addEventListener(\"scroll\", this.handleResizeOrScroll)\r\n\r\n if (!this.domObserver) {\r\n this.domObserver = new MutationObserver(this.handleDomMutations)\r\n }\r\n this.domObserver.observe(document.documentElement, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true, // Observe attribute changes that might affect layout\r\n // attributeFilter: ['style', 'class'], // More targeted, but broader is safer\r\n })\r\n\r\n if (!this.elementResizeObserver) {\r\n this.elementResizeObserver = new ResizeObserver(this.handleElementResize)\r\n // Existing elements (if any from a re-setup, though unlikely with singleton)\r\n // would need to be re-observed. New elements are observed in register().\r\n this.elements.forEach((_, element) => this.elementResizeObserver!.observe(element))\r\n }\r\n this.isSetup = true\r\n }\r\n\r\n private removeGlobalListeners(): void {\r\n // console.log(\"Removing global listeners\");\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove)\r\n window.removeEventListener(\"resize\", this.handleResizeOrScroll)\r\n window.removeEventListener(\"scroll\", this.handleResizeOrScroll)\r\n\r\n if (this.resizeScrollThrottleTimeoutId) {\r\n clearTimeout(this.resizeScrollThrottleTimeoutId)\r\n this.resizeScrollThrottleTimeoutId = null\r\n }\r\n if (this.domMutationRectsUpdateTimeoutId) {\r\n clearTimeout(this.domMutationRectsUpdateTimeoutId)\r\n this.domMutationRectsUpdateTimeoutId = null\r\n }\r\n\r\n if (this.domObserver) {\r\n this.domObserver.disconnect()\r\n }\r\n if (this.elementResizeObserver) {\r\n this.elementResizeObserver.disconnect()\r\n }\r\n this.isSetup = false\r\n }\r\n}\r\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","SuppressedError","ForesightDebugger","intentManager","shadowHost","shadowRoot","debugContainer","debugLinkOverlays","Map","debugPredictedMouseIndicator","debugTrajectoryLine","debugControlsContainer","debugStyleElement","currentGlobalSettings","lastElementData","foresightManagerInstance","initialize","links","currentSettings","currentPoint","predictedPoint","_this","window","cleanup","document","createElement","id","style","pointerEvents","body","appendChild","attachShadow","mode","textContent","className","createDebugControls","clear","forEach","data","element","createOrUpdateLinkOverlay","updateTrajectoryVisuals","enableMousePrediction","_a","remove","overlays","linkOverlay","expandedOverlay","nameLabel","querySelectorAll","el","showPrefetchAnimation","rect","getBoundingClientRect","width","height","indicator","centerX","left","centerY","top","randomXEnd","Math","random","randomYEnd","concat","opacity","transform","offsetWidth","setTimeout","newData","oldData","get","callbackLikelyTriggered","newTrajectoryHit","isTrajectoryHit","newHover","isHovering","set","linkOverlay_1","expandedOverlay_1","nameLabel_1","classList","toggle","elementBounds","expandedRect","right","bottom","display","name","removeLinkOverlay","delete","updateAllLinkVisuals","currentElements","Set","keys","_","has","x","y","dx","dy","length_1","sqrt","angle","atan2","PI","initialSettings","innerHTML","positionHistorySize","trajectoryPredictionTime","resizeScrollThrottleDelay","enabledCheckbox","querySelector","addEventListener","alterGlobalSettings","checked","historySlider","historyValueSpan","value","parseInt","toString","predictionSlider","predictionValueSpan","throttleSlider","throttleValueSpan","updateControlsState","settings","ForesightManager","elements","isSetup","debugMode","debugger","globalSettings","debug","defaultHitSlop","positions","lastResizeScrollCallTimestamp","resizeScrollThrottleTimeoutId","domObserver","lastDomMutationRectsUpdateTimestamp","domMutationRectsUpdateTimeoutId","elementResizeObserver","normalizeHitSlop","hitSlop","predictMousePosition","point","currentPosition","time","performance","now","push","shift","first","last","dt","vx","vy","trajectoryPredictionTimeInSeconds","handleMouseMove","e","clientX","clientY","elementsToUpdateInDebugger","currentData","previousData","callbackFiredThisCycle","finalIsHovering","finalIsTrajectoryHit","finalTrajectoryHitTime","trajectoryHitTime","isCurrentlyPhysicallyHovering","isNewTrajectoryActivation","lineSegmentIntersectsRect","callback","hoverCanTriggerCallback","newElementData","handleResizeOrScroll","clearTimeout","timeSinceLastCall","currentDelay","updateAllRects","handleElementResize","entries","_i","entries_1","target","foresightElementData","updateExpandedRect","handleDomMutations","mutationsList","structuralChangeDetected","mutationsList_1","mutation","type","removedNodes","currentElements_1","Array","from","isConnected","unregister","attributeName","size","delay","console","log","setInterval","checkTrajectoryHitExpiration","bind","props","manager","warn","turnOnDebugMode","defineProperty","updatedForesightElements","register","normalizedHitSlop","originalRect","newForesightElementData","getExpandedRect","setupGlobalListeners","observe","unobserve","removeGlobalListeners","settingsActuallyChanged","undefined","JSON","stringify","baseRect","newOriginalRect","currentHitSlop","updatedData","p1","p2","t0","t1","clipTest","q","r","MutationObserver","documentElement","childList","subtree","attributes","ResizeObserver","removeEventListener","disconnect"],"mappings":"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","x_google_ignoreList":[0]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "js.foresight",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17",
|
|
4
4
|
"description": "Predicts mouse trajectory to trigger actions as users approach elements, enabling anticipatory UI updates or pre-loading. Made with vanilla javascript and usable in every framework.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|