js.foresight 2.0.0 → 2.0.2

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/README.md CHANGED
@@ -1,11 +1,27 @@
1
- # ForesightJS
1
+ # [ForesightJS](https://foresightjs.com/)
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/js.foresight.svg)](https://www.npmjs.com/package/js.foresight)
4
- [![npm downloads](https://img.shields.io/npm/dm/js.foresight.svg)](https://www.npmjs.com/package/js.foresight)
5
4
  [![npm downloads](https://img.shields.io/npm/dt/js.foresight.svg)](https://www.npmjs.com/package/js.foresight)
5
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/js.foresight)](https://bundlephobia.com/package/js.foresight)
6
+ [![GitHub stars](https://img.shields.io/github/stars/spaansba/ForesightJS.svg?style=social&label=Star)](https://github.com/spaansba/ForesightJS)
7
+ [![GitHub last commit](https://img.shields.io/github/last-commit/spaansba/ForesightJS)](https://github.com/spaansba/ForesightJS/commits)
8
+
9
+
10
+ [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)
6
11
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
12
+ [![Demo](https://img.shields.io/badge/demo-live-blue)](https://foresightjs.com/)
13
+
14
+ ForesightJS is a lightweight JavaScript library with full TypeScript support that predicts user intent based on mouse movements and keyboard navigation. By analyzing cursor trajectory and tab sequences, it anticipates which elements a user is likely to interact with, allowing developers to trigger actions before the actual hover or click occurs (for example prefetching).
15
+
16
+ ### Understanding ForesightJS's Role:
17
+ When you over simplify prefetching it exists of three parts.
7
18
 
8
- ForesightJS is a lightweight JavaScript library that predicts user intent based on mouse movements and keyboard navigation. By analyzing cursor trajectory and tab sequences, it anticipates which elements a user is likely to interact with, allowing developers to trigger actions before the actual hover or click occurs (for example prefetching).
19
+ + **What** resource or data to load
20
+ + **How** the loading method and caching strategy is
21
+ + **When** the optimal moment to start fetching is
22
+
23
+ ForesightJS takes care of the **When** by predicting user intent with mouse trajectory and tab navigation.
24
+ You supply the **What** and **How** inside your `callback` when you register an element.
9
25
 
10
26
  ### [ForesightJS docs (with interactive demo)](https://foresightjs.com/)
11
27
 
@@ -15,33 +31,35 @@ _In the GIF above, [debug mode](https://foresightjs.com/docs/debug) is on. Norma
15
31
  ## Download
16
32
 
17
33
  ```bash
34
+ pnpm add js.foresight
35
+ # or
18
36
  npm install js.foresight
19
37
  # or
20
38
  yarn add js.foresight
21
- # or
22
- pnpm add js.foresight
23
39
  ```
24
40
 
25
- ## Which problems does ForesightJS solve??
41
+ ## Which problems does ForesightJS solve?
26
42
 
27
- ### Problem 1: On-Hover Prefetching is Too Late
43
+ ### Problem 1: On-Hover Prefetching Still Has Latency
28
44
 
29
- Traditional hover-based prefetching only starts after the user hovers over an element. This wastes the 100-200ms between user intent (moving toward a button) and the actual hover event.
45
+ Traditional hover-based prefetching only triggers after the user's cursor reaches an element. This approach wastes the critical 100-200ms window between when a user begins moving toward a target and when the hover event actually fires—time that could be used for prefetching.
30
46
 
31
47
  ### Problem 2: Viewport-Based Prefetching is Wasteful
32
48
 
33
- Many modern frameworks (like Next.js) automatically prefetch resources for all links that enter the viewport. This means every visible link is getting prefetched even though the user is most likely not going to interact with it. Simply scrolling up and down the Next.js homepage can trigger 1.59MB of unnecessary prefetch requests.
49
+ Many modern frameworks (like Next.js) automatically prefetch resources for all links that enter the viewport. While well-intentioned, this creates significant overhead since users typically interact with only a small fraction of visible elements. Simply scrolling up and down the Next.js homepage can trigger ***1.59MB*** of unnecessary prefetch requests.
34
50
 
35
- ### Problem 3: Routers don't take keyboard users into consideration
51
+ ### Problem 3: Hover-Based Prefetching Excludes Keyboard Users
36
52
 
37
- Many routers prefetch either based on viewport or hover and leave keyboard users prefetching on click. This means keyboard users get slower page loads since prefetching only happens after they click.
53
+ Many routers rely on hover-based prefetching, but this approach completely excludes keyboard users since keyboard navigation never triggers hover events. This means keyboard users miss out on the performance benefits that mouse users get from hover-based prefetching.
38
54
 
39
55
  ### The ForesightJS Solution
40
56
 
41
- ForesightJS sits between viewport and hover prefetching. By predicting which element the user will interact with next, it can prefetch before hover without wasting resources like viewport prefetching. To make these predictions, it analyzes mouse movement to predict where the cursor is headed and tracks keyboard navigation by monitoring how many tab stops away the user is from registered elements.
57
+ ForesightJS bridges the gap between wasteful viewport prefetching and basic hover prefetching. The `ForesightManager` predicts user interactions by analyzing mouse trajectory patterns and keyboard navigation sequences. This allows you to prefetch resources at the optimal time to improve performance, but targeted enough to avoid waste.
42
58
 
43
59
  ## Basic Usage Example
44
60
 
61
+ Both global and element speicif configuration details can be found [here](https://foresightjs.com/docs/config).
62
+
45
63
  ```javascript
46
64
  import { ForesightManager } from "foresightjs"
47
65
 
@@ -49,7 +67,7 @@ import { ForesightManager } from "foresightjs"
49
67
  // If you dont want global settings, you dont have to initialize the manager
50
68
  ForesightManager.initialize({
51
69
  debug: false, // Set to true to see visualization
52
- defaultHitSlop: { top: 30, left: 30, bottom: 80, right: 30 }, // Adds invisible margin around an element to increase its hitbox
70
+ trajectoryPredictionTime: 80, // How far ahead (in milliseconds) to predict the mouse trajectory
53
71
  })
54
72
 
55
73
  // Register an element to be tracked
@@ -58,8 +76,8 @@ const myButton = document.getElementById("my-button")
58
76
  const { isTouchDevice, unregister } = ForesightManager.instance.register({
59
77
  element: myButton,
60
78
  callback: () => {
61
- console.log("prefetching")
62
- }, // Callback when user is predicted to interact with the element,
79
+ // This is where your prefetching logic goes
80
+ },
63
81
  hitSlop: 20, // Optional: "hit slop" in pixels. Overwrites defaultHitSlop
64
82
  })
65
83
 
@@ -84,3 +102,11 @@ ForesightJS can be used bare-bones but also can be configured. For all configura
84
102
  ## Debugging visualization
85
103
 
86
104
  ForesightJS includes a [Visual Debugging](https://foresightjs.com/docs/debugging) system that helps you understand and tune how foresight is working in your application. This is particularly helpful when setting up ForesightJS for the first time or when fine-tuning for specific UI components.
105
+
106
+ ## How does ForesightJS work?
107
+
108
+ For a detailed technical explanation of its prediction algorithms and internal architecture, see the **[Behind the Scenes documentation](https://foresightjs.com/docs/Behind_the_Scenes)**.
109
+
110
+ # Contributing
111
+
112
+ Please see the [contributing guidelines](/CONTRIBUTING.md)
package/dist/index.d.ts CHANGED
@@ -17,7 +17,6 @@ type ForesightElement = Element;
17
17
  /**
18
18
  * Internal type representing the calculated boundaries of a foresight element,
19
19
  * including its original dimensions and the expanded hit area.
20
- * (This type is not exported, but commenting it is good practice for maintainability)
21
20
  */
22
21
  type ElementBounds = {
23
22
  /** The expanded rectangle, including hitSlop, used for interaction detection. */
@@ -65,12 +64,16 @@ type BaseForesightManagerProps = {
65
64
  /**
66
65
  * Number of mouse positions to keep in history for trajectory calculation.
67
66
  * A higher number might lead to smoother but slightly delayed predictions.
67
+ *
68
+ * **This value is clamped between 2 and 50.**
68
69
  * @default 8
69
70
  */
70
71
  positionHistorySize: number;
71
72
  /**
72
73
  * How far ahead (in milliseconds) to predict the mouse trajectory.
73
74
  * A larger value means the prediction extends further into the future. (meaning it will trigger callbacks sooner)
75
+ *
76
+ * **This value is clamped between 10 and 200.**
74
77
  * @default 80
75
78
  */
76
79
  trajectoryPredictionTime: number;
@@ -80,16 +83,28 @@ type BaseForesightManagerProps = {
80
83
  * @default true
81
84
  */
82
85
  enableMousePrediction: boolean;
86
+ /**
87
+ * Toggles whether keyboard prediction is on
88
+ * @default true
89
+ */
83
90
  enableTabPrediction: boolean;
91
+ /**
92
+ * Tab stops away from an element to trigger callback. Only works when @argument enableTabPrediction is true
93
+ *
94
+ * **This value is clamped between 0 and 20.**
95
+ * @default 3
96
+ */
84
97
  tabOffset: number;
85
98
  /**
86
99
  * Whether to show visual debugging information on the screen.
87
- * This includes overlays for elements, hit slop areas, and the predicted mouse path.
100
+ * This includes overlays for elements, hit slop areas, the predicted mouse path and a debug control panel.
88
101
  * @default false
89
102
  */
90
103
  debug: boolean;
91
104
  /**
92
105
  * Amount of time in ms the element bounds get recalculated on scroll/resize of the page.
106
+ *
107
+ * **This value is clamped between 0 and 500.**
93
108
  * @default 50
94
109
  */
95
110
  resizeScrollThrottleDelay: number;
@@ -142,12 +157,16 @@ declare class ForesightManager {
142
157
  private domMutationRectsUpdateTimeoutId;
143
158
  private elementResizeObserver;
144
159
  private lastKeyDown;
160
+ private globalListenersController;
145
161
  private constructor();
146
162
  static initialize(props?: Partial<UpdateForsightManagerProps>): ForesightManager;
147
163
  static get instance(): ForesightManager;
148
164
  register({ element, callback, hitSlop, unregisterOnCallback, name, }: ForesightRegisterOptions): ForesightRegisterResult;
149
165
  private unregister;
166
+ private updateNumericSettings;
167
+ private updateBooleanSetting;
150
168
  alterGlobalSettings(props?: Partial<UpdateForsightManagerProps>): void;
169
+ private updateDebuggerWithNewSettings;
151
170
  private turnOnDebugMode;
152
171
  private updateExpandedRect;
153
172
  private updateAllRects;
@@ -165,7 +184,7 @@ declare class ForesightManager {
165
184
  private handleKeyDown;
166
185
  private handleFocusIn;
167
186
  private callCallback;
168
- private setupGlobalListeners;
187
+ private initializeGlobalListeners;
169
188
  private removeGlobalListeners;
170
189
  }
171
190
 
package/dist/index.js CHANGED
@@ -3,5 +3,5 @@
3
3
  * tabbable 6.2.0
4
4
  * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
5
5
  */
6
- var t=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"].join(","),n="undefined"==typeof Element,i=n?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,o=!n&&Element.prototype.getRootNode?function(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}:function(e){return null==e?void 0:e.ownerDocument},r=function e(t,n){var i;void 0===n&&(n=!0);var o=null==t||null===(i=t.getAttribute)||void 0===i?void 0:i.call(t,"inert");return""===o||"true"===o||n&&t&&e(t.parentNode)},s=function e(n,o,s){for(var a=[],l=Array.from(n);l.length;){var c=l.shift();if(!r(c,!1))if("SLOT"===c.tagName){var d=c.assignedElements(),u=e(d.length?d:c.children,!0,s);s.flatten?a.push.apply(a,u):a.push({scopeParent:c,candidates:u})}else{i.call(c,t)&&s.filter(c)&&(o||!n.includes(c))&&a.push(c);var h=c.shadowRoot||"function"==typeof s.getShadowRoot&&s.getShadowRoot(c),g=!r(h,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(c));if(h&&g){var p=e(!0===h?c.children:h.children,!0,s);s.flatten?a.push.apply(a,p):a.push({scopeParent:c,candidates:p})}else l.unshift.apply(l,c.children)}}return a},a=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},l=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||function(e){var t,n=null==e||null===(t=e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable");return""===n||"true"===n}(e))&&!a(e)?0:e.tabIndex},c=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},d=function(e){return"INPUT"===e.tagName},u=function(e){return function(e){return d(e)&&"radio"===e.type}(e)&&!function(e){if(!e.name)return!0;var t,n=e.form||o(e),i=function(e){return n.querySelectorAll('input[type="radio"][name="'+e+'"]')};if("undefined"!=typeof window&&void 0!==window.CSS&&"function"==typeof window.CSS.escape)t=i(window.CSS.escape(e.name));else try{t=i(e.name)}catch(e){return console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s",e.message),!1}var r=function(e,t){for(var n=0;n<e.length;n++)if(e[n].checked&&e[n].form===t)return e[n]}(t,e.form);return!r||r===e}(e)},h=function(e){var t=e.getBoundingClientRect(),n=t.width,i=t.height;return 0===n&&0===i},g=function(e,t){var n=t.displayCheck,r=t.getShadowRoot;if("hidden"===getComputedStyle(e).visibility)return!0;var s=i.call(e,"details>summary:first-of-type")?e.parentElement:e;if(i.call(s,"details:not([open]) *"))return!0;if(n&&"full"!==n&&"legacy-full"!==n){if("non-zero-area"===n)return h(e)}else{if("function"==typeof r){for(var a=e;e;){var l=e.parentElement,c=o(e);if(l&&!l.shadowRoot&&!0===r(l))return h(e);e=e.assignedSlot?e.assignedSlot:l||c===e.ownerDocument?l:c.host}e=a}if(function(e){var t,n,i,r,s=e&&o(e),a=null===(t=s)||void 0===t?void 0:t.host,l=!1;if(s&&s!==e)for(l=!!(null!==(n=a)&&void 0!==n&&null!==(i=n.ownerDocument)&&void 0!==i&&i.contains(a)||null!=e&&null!==(r=e.ownerDocument)&&void 0!==r&&r.contains(e));!l&&a;){var c,d,u;l=!(null===(d=a=null===(c=s=o(a))||void 0===c?void 0:c.host)||void 0===d||null===(u=d.ownerDocument)||void 0===u||!u.contains(a))}return l}(e))return!e.getClientRects().length;if("legacy-full"!==n)return!0}return!1},p=function(e,t){return!(t.disabled||r(t)||function(e){return d(e)&&"hidden"===e.type}(t)||g(t,e)||function(e){return"DETAILS"===e.tagName&&Array.prototype.slice.apply(e.children).some((function(e){return"SUMMARY"===e.tagName}))}(t)||function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if("FIELDSET"===t.tagName&&t.disabled){for(var n=0;n<t.children.length;n++){var o=t.children.item(n);if("LEGEND"===o.tagName)return!!i.call(t,"fieldset[disabled] *")||!o.contains(e)}return!0}t=t.parentElement}return!1}(t))},b=function(e,t){return!(u(t)||l(t)<0||!p(e,t))},m=function(e){var t=parseInt(e.getAttribute("tabindex"),10);return!!(isNaN(t)||t>=0)},y=function e(t){var n=[],i=[];return t.forEach((function(t,o){var r=!!t.scopeParent,s=r?t.scopeParent:t,c=function(e,t){var n=l(e);return n<0&&t&&!a(e)?0:n}(s,r),d=r?e(t.candidates):s;0===c?r?n.push.apply(n,d):n.push(s):i.push({documentOrder:o,tabIndex:c,item:t,isScope:r,content:d})})),i.sort(c).reduce((function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e}),[]).concat(n)},f=function(e,n){var o;return o=(n=n||{}).getShadowRoot?s([e],n.includeContainer,{filter:b.bind(null,n),flatten:!1,getShadowRoot:n.getShadowRoot,shadowRootFilter:m}):function(e,n,o){if(r(e))return[];var s=Array.prototype.slice.apply(e.querySelectorAll(t));return n&&i.call(e,t)&&s.unshift(e),s.filter(o)}(e,n.includeContainer,b.bind(null,n)),y(o)},v='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>',S=function(){function e(e){this.shadowRoot=null,this.controlsContainer=null,this.elementListItemsContainer=null,this.elementCountSpan=null,this.elementListItems=new Map,this.controlPanelStyleElement=null,this.trajectoryEnabledCheckbox=null,this.tabEnabledCheckbox=null,this.historySizeSlider=null,this.historyValueSpan=null,this.predictionTimeSlider=null,this.predictionValueSpan=null,this.throttleDelaySlider=null,this.throttleValueSpan=null,this.tabOffsetSlider=null,this.tabOffsetValueSpan=null,this.containerMinimizeButton=null,this.allSettingsSectionsContainer=null,this.debuggerElementsSection=null,this.isContainerMinimized=!1,this.isMouseSettingsMinimized=!0,this.isKeyboardSettingsMinimized=!0,this.isGeneralSettingsMinimized=!0,this.isElementsListMinimized=!0,this.SESSION_STORAGE_KEY="jsforesightDebuggerSectionStates",this.copySettingsButton=null,this.copyTimeoutId=null,this.foresightManagerInstance=e}return e.prototype.initialize=function(e,t){this.shadowRoot=e,this.createDOM(),t.isControlPanelDefaultMinimized&&(this.isContainerMinimized=!0),this.controlsContainer&&this.shadowRoot&&(this.controlPanelStyleElement=document.createElement("style"),this.controlPanelStyleElement.textContent=this.getStyles(),this.controlPanelStyleElement.id="debug-control-panel",this.shadowRoot.appendChild(this.controlPanelStyleElement),this.shadowRoot.appendChild(this.controlsContainer),this.queryDOMElements(),this.originalSectionStates(),this.setupEventListeners(),this.refreshElementList(),this.applyMinimizedStateVisuals())},e.prototype.loadSectionStatesFromSessionStorage=function(){var e,t,n,i,o=sessionStorage.getItem(this.SESSION_STORAGE_KEY),r={};return o&&(r=JSON.parse(o)),this.isMouseSettingsMinimized=null===(e=r.mouse)||void 0===e||e,this.isKeyboardSettingsMinimized=null===(t=r.keyboard)||void 0===t||t,this.isGeneralSettingsMinimized=null===(n=r.general)||void 0===n||n,this.isElementsListMinimized=null!==(i=r.elements)&&void 0!==i&&i,r},e.prototype.saveSectionStatesToSessionStorage=function(){var e={mouse:this.isMouseSettingsMinimized,keyboard:this.isKeyboardSettingsMinimized,general:this.isGeneralSettingsMinimized,elements:this.isElementsListMinimized};try{sessionStorage.setItem(this.SESSION_STORAGE_KEY,JSON.stringify(e))}catch(e){console.error("Foresight Debugger: Could not save section states to session storage.",e)}},e.prototype.queryDOMElements=function(){this.controlsContainer&&(this.trajectoryEnabledCheckbox=this.controlsContainer.querySelector("#trajectory-enabled"),this.tabEnabledCheckbox=this.controlsContainer.querySelector("#tab-enabled"),this.historySizeSlider=this.controlsContainer.querySelector("#history-size"),this.historyValueSpan=this.controlsContainer.querySelector("#history-value"),this.predictionTimeSlider=this.controlsContainer.querySelector("#prediction-time"),this.predictionValueSpan=this.controlsContainer.querySelector("#prediction-value"),this.throttleDelaySlider=this.controlsContainer.querySelector("#throttle-delay"),this.throttleValueSpan=this.controlsContainer.querySelector("#throttle-value"),this.tabOffsetSlider=this.controlsContainer.querySelector("#tab-offset"),this.tabOffsetValueSpan=this.controlsContainer.querySelector("#tab-offset-value"),this.elementListItemsContainer=this.controlsContainer.querySelector("#element-list-items-container"),this.elementCountSpan=this.controlsContainer.querySelector("#element-count"),this.containerMinimizeButton=this.controlsContainer.querySelector(".minimize-button"),this.allSettingsSectionsContainer=this.controlsContainer.querySelector(".all-settings-sections-container"),this.debuggerElementsSection=this.controlsContainer.querySelector(".debugger-elements"),this.copySettingsButton=this.controlsContainer.querySelector(".copy-settings-button"))},e.prototype.handleCopySettings=function(){var e,t,n,i,o,r,s,a,l,c,d,u,h=this;if(this.copySettingsButton){var g=null!==(t=null===(e=this.trajectoryEnabledCheckbox)||void 0===e?void 0:e.checked)&&void 0!==t&&t,p=null!==(i=null===(n=this.tabEnabledCheckbox)||void 0===n?void 0:n.checked)&&void 0!==i&&i,b=parseInt(null!==(r=null===(o=this.historySizeSlider)||void 0===o?void 0:o.value)&&void 0!==r?r:"8",10),m=parseInt(null!==(a=null===(s=this.predictionTimeSlider)||void 0===s?void 0:s.value)&&void 0!==a?a:"80",10),y=parseInt(null!==(c=null===(l=this.throttleDelaySlider)||void 0===l?void 0:l.value)&&void 0!==c?c:"50",10),f=parseInt(null!==(u=null===(d=this.tabOffsetSlider)||void 0===d?void 0:d.value)&&void 0!==u?u:"2",10),S={debug:!0,debuggerSettings:{isControlPanelDefaultMinimized:this.isContainerMinimized},enableMousePrediction:g,enableTabPrediction:p,positionHistorySize:b,resizeScrollThrottleDelay:y,tabOffset:f,trajectoryPredictionTime:m},x="ForesightManager.initialize({\n";x+=" debug: ".concat(S.debug,",\n"),x+=" debuggerSettings: {\n",x+=" isControlPanelDefaultMinimized: ".concat(S.debuggerSettings.isControlPanelDefaultMinimized,",\n"),x+=" },\n",x+=" enableMousePrediction: ".concat(S.enableMousePrediction,",\n"),x+=" enableTabPrediction: ".concat(S.enableTabPrediction,",\n"),x+=" positionHistorySize: ".concat(S.positionHistorySize,",\n"),x+=" resizeScrollThrottleDelay: ".concat(S.resizeScrollThrottleDelay,",\n"),x+=" tabOffset: ".concat(S.tabOffset,",\n"),x+=" trajectoryPredictionTime: ".concat(S.trajectoryPredictionTime,",\n"),x+="})",navigator.clipboard.writeText(x).then((function(){h.copySettingsButton.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>',h.copyTimeoutId&&clearTimeout(h.copyTimeoutId),h.copyTimeoutId=setTimeout((function(){h.copySettingsButton&&(h.copySettingsButton.innerHTML=v),h.copyTimeoutId=null}),3e3)})).catch((function(e){console.error("Foresight Debugger: Could not copy settings to clipboard",e)}))}},e.prototype.setupEventListeners=function(){var e,t,n,i,o,r,s,a,l=this;null===(e=this.trajectoryEnabledCheckbox)||void 0===e||e.addEventListener("change",(function(e){l.foresightManagerInstance.alterGlobalSettings({enableMousePrediction:e.target.checked})})),null===(t=this.tabEnabledCheckbox)||void 0===t||t.addEventListener("change",(function(e){l.foresightManagerInstance.alterGlobalSettings({enableTabPrediction:e.target.checked})})),null===(n=this.historySizeSlider)||void 0===n||n.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.historyValueSpan&&(l.historyValueSpan.textContent="".concat(t," points")),l.foresightManagerInstance.alterGlobalSettings({positionHistorySize:t})})),null===(i=this.predictionTimeSlider)||void 0===i||i.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.predictionValueSpan&&(l.predictionValueSpan.textContent="".concat(t," ms")),l.foresightManagerInstance.alterGlobalSettings({trajectoryPredictionTime:t})})),null===(o=this.throttleDelaySlider)||void 0===o||o.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.throttleValueSpan&&(l.throttleValueSpan.textContent="".concat(t," ms")),l.foresightManagerInstance.alterGlobalSettings({resizeScrollThrottleDelay:t})})),null===(r=this.tabOffsetSlider)||void 0===r||r.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.tabOffsetValueSpan&&(l.tabOffsetValueSpan.textContent="".concat(t," tabs")),l.foresightManagerInstance.alterGlobalSettings({tabOffset:t})})),null===(s=this.containerMinimizeButton)||void 0===s||s.addEventListener("click",(function(){l.isContainerMinimized=!l.isContainerMinimized,l.applyMinimizedStateVisuals()})),null===(a=this.copySettingsButton)||void 0===a||a.addEventListener("click",this.handleCopySettings.bind(this));var c=function(e,t){var n=null==e?void 0:e.querySelector(".debugger-section-header");null==n||n.addEventListener("click",(function(n){n.stopPropagation(),l.toggleMinimizeSection(e,l[t]=!l[t])}))};this.controlsContainer&&(c(this.controlsContainer.querySelector(".mouse-settings-section"),"isMouseSettingsMinimized"),c(this.controlsContainer.querySelector(".keyboard-settings-section"),"isKeyboardSettingsMinimized"),c(this.controlsContainer.querySelector(".general-settings-section"),"isGeneralSettingsMinimized"),c(this.controlsContainer.querySelector(".debugger-elements"),"isElementsListMinimized"))},e.prototype.toggleMinimizeSection=function(e,t){if(e){var n=e.querySelector(".debugger-section-content"),i=e.querySelector(".section-minimize-button");n&&i&&(t?(n.style.display="none",i.textContent="+"):(n.style.display="flex",i.textContent="-")),this.saveSectionStatesToSessionStorage()}},e.prototype.originalSectionStates=function(){var e,t,n,i,o=this.loadSectionStatesFromSessionStorage();this.controlsContainer&&(this.toggleMinimizeSection(this.controlsContainer.querySelector(".mouse-settings-section"),null===(e=o.mouse)||void 0===e||e),this.toggleMinimizeSection(this.controlsContainer.querySelector(".keyboard-settings-section"),null===(t=o.keyboard)||void 0===t||t),this.toggleMinimizeSection(this.controlsContainer.querySelector(".general-settings-section"),null===(n=o.general)||void 0===n||n),this.toggleMinimizeSection(this.controlsContainer.querySelector(".debugger-elements"),null!==(i=o.elements)&&void 0!==i&&i))},e.prototype.applyMinimizedStateVisuals=function(){this.controlsContainer&&this.containerMinimizeButton&&(this.isContainerMinimized?(this.controlsContainer.classList.add("minimized"),this.containerMinimizeButton.textContent="+",this.allSettingsSectionsContainer&&(this.allSettingsSectionsContainer.style.display="none"),this.debuggerElementsSection&&(this.debuggerElementsSection.style.display="none"),this.copySettingsButton&&(this.copySettingsButton.style.display="none")):(this.controlsContainer.classList.remove("minimized"),this.containerMinimizeButton.textContent="-",this.allSettingsSectionsContainer&&(this.allSettingsSectionsContainer.style.display=""),this.debuggerElementsSection&&(this.debuggerElementsSection.style.display=""),this.copySettingsButton&&(this.copySettingsButton.style.display="")))},e.prototype.updateControlsState=function(e){this.trajectoryEnabledCheckbox&&(this.trajectoryEnabledCheckbox.checked=e.enableMousePrediction),this.tabEnabledCheckbox&&(this.tabEnabledCheckbox.checked=e.enableTabPrediction),this.historySizeSlider&&this.historyValueSpan&&(this.historySizeSlider.value=e.positionHistorySize.toString(),this.historyValueSpan.textContent="".concat(e.positionHistorySize," points")),this.predictionTimeSlider&&this.predictionValueSpan&&(this.predictionTimeSlider.value=e.trajectoryPredictionTime.toString(),this.predictionValueSpan.textContent="".concat(e.trajectoryPredictionTime," ms")),this.throttleDelaySlider&&this.throttleValueSpan&&(this.throttleDelaySlider.value=e.resizeScrollThrottleDelay.toString(),this.throttleValueSpan.textContent="".concat(e.resizeScrollThrottleDelay," ms")),this.tabOffsetSlider&&this.tabOffsetValueSpan&&(this.tabOffsetSlider.value=e.tabOffset.toString(),this.tabOffsetValueSpan.textContent="".concat(e.tabOffset," tabs"))},e.prototype.refreshElementList=function(){var e=this;if(this.elementListItemsContainer){this.elementListItemsContainer.innerHTML="",this.elementListItems.clear();var t=this.foresightManagerInstance.elements;this.elementCountSpan&&(this.elementCountSpan.textContent=t.size.toString()),0!==t.size?t.forEach((function(t,n){var i=document.createElement("div");i.className="element-list-item",e.updateListItemContent(i,t),e.elementListItemsContainer.appendChild(i),e.elementListItems.set(n,i)})):this.elementListItemsContainer.innerHTML="<em>No elements registered.</em>"}},e.prototype.updateListItemContent=function(e,t){e.classList.toggle("hovering",t.isHovering),e.classList.toggle("trajectory-hit",t.trajectoryHitData.isTrajectoryHit);var n=t.unregisterOnCallback?"Single":"Multi",i=t.unregisterOnCallback?"Callback triggers once, then element unregisters.":"Callback can trigger multiple times.",o="N/A",r="Hit Slop: Not defined";if(t.elementBounds.hitSlop){var s=t.elementBounds.hitSlop,a=s.top,l=s.right,c=s.bottom,d=s.left;o="T:".concat(a," R:").concat(l," B:").concat(c," L:").concat(d),r="Hit Slop (px): Top: ".concat(a,", Right: ").concat(l,", Bottom: ").concat(c,", Left: ").concat(d)}e.innerHTML="\n ".concat('<span class="status-indicator"></span>','\n <span class="element-name" title="').concat(t.name||"Unnamed Element",'">').concat(t.name||"Unnamed Element",'</span>\n <span class="hit-slop" title="').concat(r,'">').concat(o,'</span>\n <span class="hit-behavior" title="').concat(i,'">').concat(n,"</span>\n\n ")},e.prototype.cleanup=function(){var e,t;null===(e=this.controlsContainer)||void 0===e||e.remove(),null===(t=this.controlPanelStyleElement)||void 0===t||t.remove(),this.copyTimeoutId&&(clearTimeout(this.copyTimeoutId),this.copyTimeoutId=null),this.controlsContainer=null,this.elementListItemsContainer=null,this.controlPanelStyleElement=null,this.elementCountSpan=null,this.elementListItems.clear(),this.containerMinimizeButton=null,this.allSettingsSectionsContainer=null,this.debuggerElementsSection=null,this.trajectoryEnabledCheckbox=null,this.tabEnabledCheckbox=null,this.historySizeSlider=null,this.historyValueSpan=null,this.predictionTimeSlider=null,this.predictionValueSpan=null,this.throttleDelaySlider=null,this.throttleValueSpan=null,this.tabOffsetSlider=null,this.tabOffsetValueSpan=null,this.copySettingsButton=null},e.prototype.createDOM=function(){this.controlsContainer=document.createElement("div"),this.controlsContainer.id="debug-controls",this.controlsContainer.innerHTML='\n <div class="debugger-title-container">\n <button class="minimize-button">-</button>\n <div class="title-group">\n <h2>Foresight Debugger</h2>\n <span class="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 <button class="copy-settings-button" title="Copy current settings to clipboard">\n '.concat(v,'\n </button>\n </div>\n\n <div class="all-settings-sections-container">\n <div class="debugger-section mouse-settings-section">\n <div class="debugger-section-header mouse-settings-header">\n <h3>Mouse Settings</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content mouse-settings-content">\n <div class="control-row">\n <label for="trajectory-enabled">\n Enable Mouse Prediction\n <span class="info-icon" title="Toggles mouse movement prediction. If disabled, only direct hovers trigger actions (or tab if enabled).">i</span>\n </label>\n <input type="checkbox" id="trajectory-enabled">\n </div>\n <div class="control-row">\n <label for="history-size">\n History Size\n <span class="info-icon" title="Number of past mouse positions to use for velocity calculation. Higher values smooth predictions but add latency.">i</span>\n </label>\n <input type="range" id="history-size" min="2" max="20">\n <span id="history-value"></span>\n </div>\n <div class="control-row">\n <label for="prediction-time">\n Prediction Time\n <span class="info-icon" title="How many ms in the future to calculate the mouse trajectory. Larger values detect intent sooner.">i</span>\n </label>\n <input type="range" id="prediction-time" min="10" max="200" step="10">\n <span id="prediction-value"></span>\n </div>\n </div>\n </div>\n\n <div class="debugger-section keyboard-settings-section">\n <div class="debugger-section-header keyboard-settings-header">\n <h3>Keyboard Settings</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content keyboard-settings-content">\n <div class="control-row">\n <label for="tab-enabled">\n Enable Tab Prediction\n <span class="info-icon" title="With tab prediction the callback will be executed when the user is tabOffset amount of tabs away from an registered element (works with reversed shift-tabs).">i</span>\n </label>\n <input type="checkbox" id="tab-enabled">\n </div>\n <div class="control-row">\n <label for="tab-offset">\n Tab Prediction Offset\n <span class="info-icon" title="Number of next/previous tabbable elements to consider for prediction when using the Tab key.">i</span>\n </label>\n <input type="range" id="tab-offset" min="0" max="10">\n <span id="tab-offset-value"></span>\n </div>\n </div>\n </div>\n\n <div class="debugger-section general-settings-section">\n <div class="debugger-section-header general-settings-header">\n <h3>General Settings</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content general-settings-content">\n <div class="control-row">\n <label for="throttle-delay">\n Scroll/Resize Throttle\n <span class="info-icon" title="Delay (ms) for recalculating element positions on resize/scroll. Higher values improve performance during rapid events.">i</span>\n </label>\n <input type="range" id="throttle-delay" min="0" max="500" step="10">\n <span id="throttle-value"></span>\n </div>\n </div>\n </div>\n </div>\n\n <div class="debugger-section debugger-elements">\n <div class="debugger-section-header elements-list-header">\n <h3>Registered Elements (<span id="element-count">0</span>)</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content element-list">\n <div id="element-list-items-container">\n <em>Initializing...</em>\n </div>\n </div>\n </div>\n ')},e.prototype.getStyles=function(){return'\n #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 width: 380px;\n transition: width 0.3s ease, height 0.3s ease;\n }\n #debug-controls.minimized {\n width: 220px;\n overflow: hidden;\n padding: 12px 0; \n }\n #debug-controls.minimized .debugger-title-container {\n justify-content: flex-start; \n padding-left: 10px; \n padding-right: 10px;\n gap: 10px; \n }\n #debug-controls.minimized .debugger-title-container h2 {\n display: inline;\n font-size: 14px;\n margin: 0;\n white-space: nowrap;\n }\n #debug-controls.minimized .info-icon {\n display: none;\n }\n\n .debugger-title-container {\n display: flex;\n align-items: center;\n justify-content: space-between; \n padding: 0 0px; \n }\n .title-group { \n display: flex;\n align-items: center;\n gap: 8px; \n\n }\n .minimize-button {\n background: none; border: none; color: white;\n font-size: 22px; cursor: pointer;\n line-height: 1;\n }\n .debugger-title-container h2 { margin: 0; font-size: 15px; }\n\n .copy-settings-button {\n background: none; border: none; color: white;\n cursor: pointer; padding: 0;\n display: flex; align-items: center; justify-content: center;\n }\n .copy-settings-button svg {\n width: 16px; height: 16px;\n stroke: white;\n }\n\n .all-settings-sections-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .debugger-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 5px;\n margin-bottom: 2px;\n padding-bottom: 2px;\n border-bottom: 1px solid #444;\n cursor: pointer;\n }\n .debugger-section-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: bold;\n color: #b0c4de;\n }\n\n .section-minimize-button {\n background: none;\n border: none;\n color: white;\n font-size: 18px;\n cursor: pointer;\n padding: 0;\n line-height: 1;\n }\n\n #debug-controls .control-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n #debug-controls label {\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: pointer;\n }\n #debug-controls .control-row:has(input[type="checkbox"]) label {\n flex-grow: 1;\n }\n #debug-controls .control-row input[type="checkbox"] {\n appearance: none; -webkit-appearance: none; -moz-appearance: none;\n position: relative; width: 40px; height: 18px;\n background-color: #555; border-radius: 10px; cursor: pointer;\n outline: none; transition: background-color 0.2s ease;\n vertical-align: middle; flex-shrink: 0; margin: 0;\n }\n #debug-controls .control-row input[type="checkbox"]::before {\n content: ""; position: absolute; width: 14px; height: 14px;\n border-radius: 50%; background-color: white; top: 2px; left: 2px;\n transition: transform 0.2s ease; box-shadow: 0 1px 3px rgba(0,0,0,0.4);\n }\n #debug-controls .control-row input[type="checkbox"]:checked {\n background-color: #b0c4de;\n }\n #debug-controls .control-row input[type="checkbox"]:checked::before {\n transform: translateX(22px);\n }\n #debug-controls .control-row:has(input[type="range"]) label {\n flex-basis: 170px; flex-shrink: 0;\n }\n #debug-controls input[type="range"] {\n flex-grow: 1; margin: 0; cursor: pointer; -webkit-appearance: none;\n appearance: none; background: transparent; height: 18px; vertical-align: middle;\n }\n #debug-controls input[type="range"]::-webkit-slider-runnable-track {\n height: 6px; background: #555; border-radius: 3px;\n }\n #debug-controls input[type="range"]::-moz-range-track {\n height: 6px; background: #555; border-radius: 3px;\n }\n #debug-controls input[type="range"]::-webkit-slider-thumb {\n -webkit-appearance: none; appearance: none; margin-top: -5px;\n background: #b0c4de; height: 16px; width: 16px;\n border-radius: 50%; border: 1px solid #333;\n }\n #debug-controls input[type="range"]::-moz-range-thumb {\n background: #b0c4de; height: 16px; width: 16px;\n border-radius: 50%; border: 1px solid #333; border: none;\n }\n #debug-controls .control-row:has(input[type="range"]) span:not(.info-icon) {\n width: 55px; min-width: 55px; text-align: right; flex-shrink: 0;\n }\n .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; font-size: 10px;\n font-style: italic; font-weight: bold; font-family: \'Georgia\', serif;\n cursor: help; user-select: none; flex-shrink: 0;\n }\n .debugger-section {\n display: flex; flex-direction: column; gap: 6px;\n }\n .debugger-section-content {\n display: none; flex-direction: column; gap: 8px;\n }\n\n /* Element List Styles */\n .element-list { /* Scroll container */\n min-height: '.concat(161,"px;\n max-height: ").concat(161,"px; \n overflow-y: auto;\n background-color: rgba(20, 20, 20, 0.5);\n border-radius: 3px;\n padding: 0;\n display: flex;\n }\n\n /* Modern Scrollbar Styling */\n .element-list::-webkit-scrollbar {\n width: 8px; \n }\n .element-list::-webkit-scrollbar-track {\n background: rgba(30, 30, 30, 0.5); \n border-radius: 4px;\n }\n .element-list::-webkit-scrollbar-thumb {\n background-color: rgba(176, 196, 222, 0.5); \n border-radius: 4px; \n border: 2px solid rgba(0, 0, 0, 0.2); \n }\n .element-list::-webkit-scrollbar-thumb:hover {\n background-color: rgba(176, 196, 222, 0.7);\n }\n /* Firefox scrollbar styling */\n .element-list {\n scrollbar-width: thin;\n scrollbar-color: rgba(176, 196, 222, 0.5) rgba(30, 30, 30, 0.5);\n }\n\n\n #element-list-items-container { \n display: flex;\n flex-wrap: wrap;\n gap: ").concat(3,"px;\n padding: ").concat(6,"px;\n min-height: ").concat(149,"px;\n box-sizing: border-box;\n align-content: flex-start;\n }\n #element-list-items-container > em {\n flex-basis: 100%;\n text-align: center;\n padding: 10px 0;\n font-style: italic;\n color: #ccc;\n font-size: 12px;\n }\n .element-list-item {\n flex-basis: calc((100% - (").concat(0," * ").concat(3,"px)) / ").concat(1,");\n flex-grow: 0;\n flex-shrink: 0;\n height: ").concat(35,"px;\n box-sizing: border-box;\n padding: 3px 5px;\n border-radius: 2px;\n display: flex;\n align-items: center;\n gap: 5px;\n background-color: rgba(50,50,50,0.7);\n transition: background-color 0.2s ease;\n font-size: 11px; \n overflow: hidden;\n }\n .element-list-item .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background-color: #777;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 8px;\n }\n .element-list-item.hovering .status-indicator {\n background-color: oklch(83.7% 0.128 66.29 / 0.7);\n }\n .element-list-item.trajectory-hit .status-indicator {\n background-color: oklch(89.7% 0.196 126.665 / 0.7);\n }\n .element-list-item.hovering.trajectory-hit .status-indicator {\n background: linear-gradient(45deg, oklch(89.7% 0.196 126.665 / 0.7) 50%, oklch(83.7% 0.128 66.29 / 0.7) 50%);\n }\n .element-list-item .element-name {\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 12px; \n font-weight: bold;\n }\n .element-list-item .hit-behavior,\n .element-list-item .hit-slop {\n font-size: 10px; \n color: #b0b0b0;\n padding: 2px 5px; \n border-radius: 3px; \n background-color: rgba(0,0,0,0.2);\n flex-shrink: 0;\n }\n ")},e}(),x=function(){return window.matchMedia("(pointer: coarse)").matches&&navigator.maxTouchPoints>0},w=function(){function e(e){this.shadowHost=null,this.shadowRoot=null,this.debugContainer=null,this.debugLinkOverlays=new Map,this.debugPredictedMouseIndicator=null,this.debugTrajectoryLine=null,this.debuggerStyleElement=null,this.debugCallbackIndicator=null,this.controlPanel=null,this.lastElementData=new Map,document.querySelectorAll("#jsforesight-debugger-shadow-host").forEach((function(e){return e.remove()})),this.foresightManagerInstance=e,this.controlPanel=new S(this.foresightManagerInstance)}return e.getInstance=function(t){return e.debuggerInstance||(e.debuggerInstance=new e(t)),e.debuggerInstance},e.prototype.initialize=function(e,t,n,i){var o=this;if("undefined"==typeof window||x())this.shadowHost&&this.cleanup();else{if(this.shadowHost)return console.warn("ForesightDebugger already initialized."),this.updateControlsState(t),this.updateTrajectoryVisuals(n,i,t.enableMousePrediction),void this.refreshDisplayedElements();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.debuggerStyleElement=document.createElement("style"),this.debuggerStyleElement.id="debug-container",this.debuggerStyleElement.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-callback-indicator {\n position: absolute;\n border: 4px solid oklch(60% 0.1 270); \n border-radius: 5px;\n box-sizing: border-box;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.3s ease-out;\n z-index: 10002;\n }\n .jsforesight-callback-indicator.animate {\n animation: jsforesight-callback-pulse 0.4s ease-out forwards;\n }\n\n @keyframes jsforesight-callback-pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(1.1);\n opacity: 0;\n }\n }\n ",this.shadowRoot.appendChild(this.debuggerStyleElement),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.debugCallbackIndicator=document.createElement("div"),this.debugCallbackIndicator.className="jsforesight-callback-indicator",this.debugContainer.appendChild(this.debugCallbackIndicator),this.shadowRoot&&this.controlPanel&&this.controlPanel.initialize(this.shadowRoot,t.debuggerSettings),e.forEach((function(e,t){o.createOrUpdateLinkOverlay(t,e)})),this.updateTrajectoryVisuals(n,i,t.enableMousePrediction)}},e.prototype.cleanup=function(){var t,n;null===(t=this.controlPanel)||void 0===t||t.cleanup(),null===(n=this.shadowHost)||void 0===n||n.remove(),this.shadowHost=null,this.shadowRoot=null,this.debugContainer=null,this.debugLinkOverlays.clear(),this.lastElementData.clear(),this.debugPredictedMouseIndicator=null,this.debugTrajectoryLine=null,this.debuggerStyleElement=null,this.debugCallbackIndicator=null,e.debuggerInstance=void 0},e.prototype.createOrUpdateLinkOverlay=function(e,t){var n;if(this.debugContainer&&this.shadowRoot){this.lastElementData.set(e,{isHovering:t.isHovering,isTrajectoryHit:t.trajectoryHitData.isTrajectoryHit});var i=this.debugLinkOverlays.get(e);if(!i){var o=document.createElement("div");o.className="jsforesight-link-overlay",this.debugContainer.appendChild(o);var r=document.createElement("div");r.className="jsforesight-expanded-overlay",this.debugContainer.appendChild(r);var s=document.createElement("div");s.className="jsforesight-name-label",this.debugContainer.appendChild(s),i={linkOverlay:o,expandedOverlay:r,nameLabel:s},this.debugLinkOverlays.set(e,i)}var a=i.linkOverlay,l=i.expandedOverlay,c=i.nameLabel,d=e.getBoundingClientRect();a.style.left="".concat(d.left,"px"),a.style.top="".concat(d.top,"px"),a.style.width="".concat(d.width,"px"),a.style.height="".concat(d.height,"px"),a.classList.toggle("trajectory-hit",t.trajectoryHitData.isTrajectoryHit),a.classList.toggle("active",t.isHovering),t.elementBounds.expandedRect?(l.style.left="".concat(t.elementBounds.expandedRect.left,"px"),l.style.top="".concat(t.elementBounds.expandedRect.top,"px"),l.style.width="".concat(t.elementBounds.expandedRect.right-t.elementBounds.expandedRect.left,"px"),l.style.height="".concat(t.elementBounds.expandedRect.bottom-t.elementBounds.expandedRect.top,"px"),l.style.display="block"):l.style.display="none",t.name&&"Unnamed"!==t.name?(c.textContent=t.name,c.style.display="block",c.style.left="".concat(d.left,"px"),c.style.top="".concat(d.top-22,"px")):c.style.display="none",null===(n=this.controlPanel)||void 0===n||n.refreshElementList()}},e.prototype.removeLinkOverlay=function(e){var t,n=this.debugLinkOverlays.get(e);n&&(n.linkOverlay.remove(),n.expandedOverlay.remove(),n.nameLabel.remove(),this.debugLinkOverlays.delete(e)),this.lastElementData.delete(e),null===(t=this.controlPanel)||void 0===t||t.refreshElementList()},e.prototype.refreshDisplayedElements=function(){var e,t=this;if(this.shadowRoot&&this.debugContainer){var n=new Set(this.foresightManagerInstance.elements.keys());this.foresightManagerInstance.elements.forEach((function(e,n){t.createOrUpdateLinkOverlay(n,e)})),Array.from(this.debugLinkOverlays.keys()).filter((function(e){return!n.has(e)})).forEach((function(e){var n=t.debugLinkOverlays.get(e);null==n||n.linkOverlay.remove(),null==n||n.expandedOverlay.remove(),null==n||n.nameLabel.remove(),t.debugLinkOverlays.delete(e),t.lastElementData.delete(e)})),null===(e=this.controlPanel)||void 0===e||e.refreshElementList()}},e.prototype.updateAllLinkVisuals=function(){this.shadowRoot&&this.debugContainer&&this.refreshDisplayedElements()},e.prototype.updateTrajectoryVisuals=function(e,t,n){if(this.shadowRoot&&this.debugContainer&&(this.debugPredictedMouseIndicator&&(this.debugPredictedMouseIndicator.style.left="".concat(t.x,"px"),this.debugPredictedMouseIndicator.style.top="".concat(t.y,"px"),this.debugPredictedMouseIndicator.style.display=n?"block":"none"),this.debugTrajectoryLine))if(n&&e&&t){var i=t.x-e.x,o=t.y-e.y;if(n&&(Math.abs(i)>1||Math.abs(o)>1)){var r=Math.sqrt(i*i+o*o),s=180*Math.atan2(o,i)/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"}else this.debugTrajectoryLine.style.display="none"},e.prototype.updateControlsState=function(e){var t;null===(t=this.controlPanel)||void 0===t||t.updateControlsState(e)},e.prototype.getAllElementData=function(){return this.foresightManagerInstance.elements},e.prototype.showCallbackPopup=function(e){var t=this;this.debugContainer&&this.shadowRoot&&this.debugCallbackIndicator&&(this.debugCallbackIndicator.style.left="".concat(e.left,"px"),this.debugCallbackIndicator.style.top="".concat(e.top,"px"),this.debugCallbackIndicator.style.width="".concat(e.right-e.left,"px"),this.debugCallbackIndicator.style.height="".concat(e.bottom-e.top,"px"),this.debugCallbackIndicator.classList.remove("animate"),requestAnimationFrame((function(){t.debugCallbackIndicator.classList.add("animate")})))},e}();function k(e,t,n,i){var o={point:e,time:performance.now()},r=e.x,s=e.y;if(t.push(o),t.length>n&&t.shift(),t.length<2)return{x:r,y:s};var a=t[0],l=t[t.length-1],c=(l.time-a.time)/1e3;if(0===c)return{x:r,y:s};var d=i/1e3;return{x:r+(l.point.x-a.point.x)/c*d,y:s+(l.point.y-a.point.y)/c*d}}function C(e){return"number"==typeof e?{top:e,left:e,right:e,bottom:e}:e}function T(e,t){return{left:e.left-t.left,right:e.right+t.right,top:e.top-t.top,bottom:e.bottom+t.bottom}}function z(e,t){return e&&t?e.left===t.left&&e.right===t.right&&e.top===t.top&&e.bottom===t.bottom:e===t}var E=function(){function t(){var t=this;this.elements=new Map,this.isSetup=!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,debuggerSettings:{isControlPanelDefaultMinimized:!1},enableTabPrediction:!0,tabOffset:2},this.positions=[],this.currentPoint={x:0,y:0},this.predictedPoint={x:0,y:0},this.lastResizeScrollCallTimestamp=0,this.resizeScrollThrottleTimeoutId=null,this.domObserver=null,this.domMutationRectsUpdateTimeoutId=null,this.elementResizeObserver=null,this.lastKeyDown=null,this.handleMouseMove=function(n){t.updatePointerState(n);var i=null;t.debugger&&(i=[]),t.elements.forEach((function(n,o){if(t.elements.has(o)){var r,s,a={isHovering:n.isHovering,trajectoryHitData:n.trajectoryHitData},l=!1,c=n.isHovering,d=n.trajectoryHitData.isTrajectoryHit,u=n.trajectoryHitData.trajectoryHitTime,h=n.elementBounds.expandedRect,g=(r=t.currentPoint,s=h,r.x>=s.left&&r.x<=s.right&&r.y>=s.top&&r.y<=s.bottom),p=!1;if(!t.globalSettings.enableMousePrediction||g||n.trajectoryHitData.isTrajectoryHit||function(e,t,n){var i=0,o=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 n=t/e;if(e<0){if(n>o)return!1;n>i&&(i=n)}else{if(n<i)return!1;n<o&&(o=n)}}return!0};return!!a(-r,e.x-n.left)&&!!a(r,n.right-e.x)&&!!a(-s,e.y-n.top)&&!!a(s,n.bottom-e.y)&&i<=o}(t.currentPoint,t.predictedPoint,h)&&(p=!0),p&&(d=!0,u=performance.now(),l=!0,t.callCallback(n,o)),g&&!n.isHovering){var b=!n.trajectoryHitData.isTrajectoryHit||n.trajectoryHitData.isTrajectoryHit&&!t.globalSettings.enableMousePrediction;!l&&b&&(l=!0,t.callCallback(n,o))}if(((c=g)!==a.isHovering||d!==a.trajectoryHitData.isTrajectoryHit||d&&u!==a.trajectoryHitData.trajectoryHitTime)&&t.elements.has(o)){var m=e(e({},n),{isHovering:c,trajectoryHitData:{isTrajectoryHit:d,trajectoryHitTime:u,trajectoryHitExpirationTimeoutId:a.trajectoryHitData.trajectoryHitExpirationTimeoutId}});m.trajectoryHitData.isTrajectoryHit&&!a.trajectoryHitData.isTrajectoryHit?(m.trajectoryHitData.trajectoryHitExpirationTimeoutId&&clearTimeout(m.trajectoryHitData.trajectoryHitExpirationTimeoutId),m.trajectoryHitData.trajectoryHitExpirationTimeoutId=setTimeout((function(){var n=t.elements.get(o);if(n&&n.trajectoryHitData.isTrajectoryHit&&n.trajectoryHitData.trajectoryHitTime===m.trajectoryHitData.trajectoryHitTime){var i=e(e({},n),{trajectoryHitData:{isTrajectoryHit:!1,trajectoryHitExpirationTimeoutId:void 0,trajectoryHitTime:n.trajectoryHitData.trajectoryHitTime}});t.elements.set(o,i),t.debugger&&t.debugger.createOrUpdateLinkOverlay(o,i)}}),200)):!m.trajectoryHitData.isTrajectoryHit&&a.trajectoryHitData.isTrajectoryHit&&m.trajectoryHitData.trajectoryHitExpirationTimeoutId&&(clearTimeout(m.trajectoryHitData.trajectoryHitExpirationTimeoutId),m.trajectoryHitData.trajectoryHitExpirationTimeoutId=void 0),t.elements.set(o,m),i&&i.push(o)}}})),t.debugger&&(null==i||i.forEach((function(e){var n=t.elements.get(e);n&&t.debugger.createOrUpdateLinkOverlay(e,n)})),t.debugger.updateTrajectoryVisuals(t.currentPoint,t.predictedPoint,t.globalSettings.enableMousePrediction))},this.handleResizeOrScroll=function(){t.resizeScrollThrottleTimeoutId&&clearTimeout(t.resizeScrollThrottleTimeoutId);var e=performance.now(),n=e-t.lastResizeScrollCallTimestamp,i=t.globalSettings.resizeScrollThrottleDelay;n>=i?(t.updateAllRects(),t.lastResizeScrollCallTimestamp=e,t.resizeScrollThrottleTimeoutId=null):t.resizeScrollThrottleTimeoutId=setTimeout((function(){t.updateAllRects(),t.lastResizeScrollCallTimestamp=performance.now(),t.resizeScrollThrottleTimeoutId=null}),i-n)},this.handleElementResize=function(e){for(var n=0,i=e;n<i.length;n++){var o=i[n].target;t.elements.get(o)&&t.updateExpandedRect(o)}},this.handleDomMutations=function(e){for(var n=0,i=e;n<i.length;n++){var o=i[n];if("childList"===o.type&&o.removedNodes.length>0)for(var r=0,s=Array.from(t.elements.keys());r<s.length;r++){var a=s[r];a.isConnected||t.elements.has(a)&&t.unregister(a)}}},this.handleKeyDown=function(e){"Tab"===e.key?t.lastKeyDown=e:t.lastKeyDown=null},this.handleFocusIn=function(e){if(t.lastKeyDown&&t.globalSettings.enableTabPrediction){var n=e.target;if(n instanceof HTMLElement){var i=f(document.documentElement),o=i.findIndex((function(e){return e===n})),r=t.lastKeyDown.shiftKey?-t.globalSettings.tabOffset:t.globalSettings.tabOffset;t.lastKeyDown=null;for(var s=[],a=0;a<i.length;a++){var l=i[a];(r>0?a>=o&&a<=o+r:a<=o&&a>=o+r)&&t.elements.has(l)&&s.push(l)}s.forEach((function(e){t.callCallback(t.elements.get(e),e)}))}}}}return t.initialize=function(e){return t.manager?e&&t.manager.alterGlobalSettings(e):(t.manager=new t,e?t.manager.alterGlobalSettings(e):t.manager.globalSettings.debug&&t.manager.turnOnDebugMode()),t.manager},Object.defineProperty(t,"instance",{get:function(){return t.manager?t.manager:this.initialize()},enumerable:!1,configurable:!0}),t.prototype.register=function(e){var t=this,n=e.element,i=e.callback,o=e.hitSlop,r=e.unregisterOnCallback,s=e.name;if(x())return{isTouchDevice:!0,unregister:function(){}};var a=o?C(o):this.globalSettings.defaultHitSlop,l=n.getBoundingClientRect(),c=null==r||r,d={callback:i,elementBounds:{expandedRect:T(l,a),originalRect:l,hitSlop:a},isHovering:!1,trajectoryHitData:{isTrajectoryHit:!1,trajectoryHitTime:0,trajectoryHitExpirationTimeoutId:void 0},name:null!=s?s:"",unregisterOnCallback:c};if(this.elements.set(n,d),this.isSetup||this.setupGlobalListeners(),this.elementResizeObserver&&this.elementResizeObserver.observe(n),this.debugger){var u=this.elements.get(n);u&&this.debugger.createOrUpdateLinkOverlay(n,u),this.debugger.refreshDisplayedElements()}return{isTouchDevice:!1,unregister:function(){return t.unregister(n)}}},t.prototype.unregister=function(e){if(this.elements.has(e)){var t=this.elements.get(e);(null==t?void 0:t.trajectoryHitData.trajectoryHitExpirationTimeoutId)&&clearTimeout(t.trajectoryHitData.trajectoryHitExpirationTimeoutId),this.elementResizeObserver&&this.elementResizeObserver.unobserve(e),this.elements.delete(e),this.debugger&&(this.debugger.removeLinkOverlay(e),this.debugger.refreshDisplayedElements()),0===this.elements.size&&this.isSetup&&(this.debugger||this.removeGlobalListeners())}},t.prototype.alterGlobalSettings=function(t){var n,i=this,o=!1;if(void 0!==(null==t?void 0:t.positionHistorySize)&&this.globalSettings.positionHistorySize!==t.positionHistorySize&&(this.globalSettings.positionHistorySize=t.positionHistorySize,o=!0),void 0!==(null==t?void 0:t.trajectoryPredictionTime)&&this.globalSettings.trajectoryPredictionTime!==t.trajectoryPredictionTime&&(this.globalSettings.trajectoryPredictionTime=t.trajectoryPredictionTime,o=!0),void 0!==(null==t?void 0:t.enableTabPrediction)&&this.globalSettings.enableTabPrediction!==t.enableTabPrediction&&(this.globalSettings.enableTabPrediction=t.enableTabPrediction,o=!0),void 0!==(null==t?void 0:t.tabOffset)&&this.globalSettings.tabOffset!==t.tabOffset&&(this.globalSettings.tabOffset=t.tabOffset,o=!0),void 0!==(null==t?void 0:t.enableMousePrediction)&&this.globalSettings.enableMousePrediction!==t.enableMousePrediction&&(this.globalSettings.enableMousePrediction=t.enableMousePrediction,o=!0,this.globalSettings.enableMousePrediction?this.predictedPoint=k(this.currentPoint,this.positions,this.globalSettings.positionHistorySize,this.globalSettings.trajectoryPredictionTime):(this.predictedPoint=this.currentPoint,this.elements.forEach((function(t,n){if(t.trajectoryHitData.isTrajectoryHit){t.trajectoryHitData.trajectoryHitExpirationTimeoutId&&clearTimeout(t.trajectoryHitData.trajectoryHitExpirationTimeoutId);var o=e(e({},t),{trajectoryHitData:{isTrajectoryHit:!1,trajectoryHitTime:0,trajectoryHitExpirationTimeoutId:void 0}});i.elements.set(n,o),i.debugger&&i.debugger.createOrUpdateLinkOverlay(n,o)}})))),void 0!==(null===(n=null==t?void 0:t.debuggerSettings)||void 0===n?void 0:n.isControlPanelDefaultMinimized)&&(this.globalSettings.debuggerSettings.isControlPanelDefaultMinimized=t.debuggerSettings.isControlPanelDefaultMinimized,o=!0),void 0!==(null==t?void 0:t.defaultHitSlop)){var r=C(t.defaultHitSlop);z(this.globalSettings.defaultHitSlop,r)||(this.globalSettings.defaultHitSlop=r,o=!0,this.elements.forEach((function(e,t){i.updateExpandedRect(t)})))}void 0!==(null==t?void 0:t.resizeScrollThrottleDelay)&&this.globalSettings.resizeScrollThrottleDelay!==t.resizeScrollThrottleDelay&&(this.globalSettings.resizeScrollThrottleDelay=t.resizeScrollThrottleDelay,o=!0),void 0!==(null==t?void 0:t.debug)&&this.globalSettings.debug!==t.debug&&(this.globalSettings.debug=t.debug,o=!0,this.globalSettings.debug?this.turnOnDebugMode():this.debugger&&(this.debugger.cleanup(),this.debugger=null)),o&&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,t){i.debugger.createOrUpdateLinkOverlay(t,e)})),this.debugger.refreshDisplayedElements())},t.prototype.turnOnDebugMode=function(){this.debugger?(this.debugger.updateControlsState(this.globalSettings),this.debugger.updateAllLinkVisuals(),this.debugger.updateTrajectoryVisuals(this.currentPoint,this.predictedPoint,this.globalSettings.enableMousePrediction)):(this.debugger=w.getInstance(this),this.debugger.initialize(this.elements,this.globalSettings,this.currentPoint,this.predictedPoint))},t.prototype.updateExpandedRect=function(t){var n=this.elements.get(t);if(n){var i=t.getBoundingClientRect(),o=T(i,n.elementBounds.hitSlop);if(!z(o,n.elementBounds.expandedRect)&&(this.elements.set(t,e(e({},n),{elementBounds:e(e({},n.elementBounds),{originalRect:i,expandedRect:o})})),this.debugger)){var r=this.elements.get(t);r&&this.debugger.createOrUpdateLinkOverlay(t,r)}}},t.prototype.updateAllRects=function(){var e=this;this.elements.forEach((function(t,n){e.updateExpandedRect(n)}))},t.prototype.updatePointerState=function(t){this.currentPoint={x:t.clientX,y:t.clientY},this.predictedPoint=this.globalSettings.enableMousePrediction?k(this.currentPoint,this.positions,this.globalSettings.positionHistorySize,this.globalSettings.trajectoryPredictionTime):e({},this.currentPoint)},t.prototype.callCallback=function(e,t){e&&(e.callback(),this.debugger&&this.debugger.showCallbackPopup(e.elementBounds.expandedRect),e.unregisterOnCallback&&this.unregister(t))},t.prototype.setupGlobalListeners=function(){var e=this;this.isSetup||(document.addEventListener("mousemove",this.handleMouseMove),window.addEventListener("resize",this.handleResizeOrScroll),window.addEventListener("scroll",this.handleResizeOrScroll),document.addEventListener("keydown",this.handleKeyDown),document.addEventListener("focusin",this.handleFocusIn),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,n){return e.elementResizeObserver.observe(n)}))),this.isSetup=!0)},t.prototype.removeGlobalListeners=function(){document.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("resize",this.handleResizeOrScroll),window.removeEventListener("scroll",this.handleResizeOrScroll),document.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("focusin",this.handleFocusIn),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},t}();exports.ForesightManager=E;
6
+ var t=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"].join(","),n="undefined"==typeof Element,i=n?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,o=!n&&Element.prototype.getRootNode?function(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}:function(e){return null==e?void 0:e.ownerDocument},r=function e(t,n){var i;void 0===n&&(n=!0);var o=null==t||null===(i=t.getAttribute)||void 0===i?void 0:i.call(t,"inert");return""===o||"true"===o||n&&t&&e(t.parentNode)},s=function e(n,o,s){for(var a=[],l=Array.from(n);l.length;){var c=l.shift();if(!r(c,!1))if("SLOT"===c.tagName){var d=c.assignedElements(),u=e(d.length?d:c.children,!0,s);s.flatten?a.push.apply(a,u):a.push({scopeParent:c,candidates:u})}else{i.call(c,t)&&s.filter(c)&&(o||!n.includes(c))&&a.push(c);var h=c.shadowRoot||"function"==typeof s.getShadowRoot&&s.getShadowRoot(c),g=!r(h,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(c));if(h&&g){var p=e(!0===h?c.children:h.children,!0,s);s.flatten?a.push.apply(a,p):a.push({scopeParent:c,candidates:p})}else l.unshift.apply(l,c.children)}}return a},a=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},l=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||function(e){var t,n=null==e||null===(t=e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable");return""===n||"true"===n}(e))&&!a(e)?0:e.tabIndex},c=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},d=function(e){return"INPUT"===e.tagName},u=function(e){return function(e){return d(e)&&"radio"===e.type}(e)&&!function(e){if(!e.name)return!0;var t,n=e.form||o(e),i=function(e){return n.querySelectorAll('input[type="radio"][name="'+e+'"]')};if("undefined"!=typeof window&&void 0!==window.CSS&&"function"==typeof window.CSS.escape)t=i(window.CSS.escape(e.name));else try{t=i(e.name)}catch(e){return console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s",e.message),!1}var r=function(e,t){for(var n=0;n<e.length;n++)if(e[n].checked&&e[n].form===t)return e[n]}(t,e.form);return!r||r===e}(e)},h=function(e){var t=e.getBoundingClientRect(),n=t.width,i=t.height;return 0===n&&0===i},g=function(e,t){var n=t.displayCheck,r=t.getShadowRoot;if("hidden"===getComputedStyle(e).visibility)return!0;var s=i.call(e,"details>summary:first-of-type")?e.parentElement:e;if(i.call(s,"details:not([open]) *"))return!0;if(n&&"full"!==n&&"legacy-full"!==n){if("non-zero-area"===n)return h(e)}else{if("function"==typeof r){for(var a=e;e;){var l=e.parentElement,c=o(e);if(l&&!l.shadowRoot&&!0===r(l))return h(e);e=e.assignedSlot?e.assignedSlot:l||c===e.ownerDocument?l:c.host}e=a}if(function(e){var t,n,i,r,s=e&&o(e),a=null===(t=s)||void 0===t?void 0:t.host,l=!1;if(s&&s!==e)for(l=!!(null!==(n=a)&&void 0!==n&&null!==(i=n.ownerDocument)&&void 0!==i&&i.contains(a)||null!=e&&null!==(r=e.ownerDocument)&&void 0!==r&&r.contains(e));!l&&a;){var c,d,u;l=!(null===(d=a=null===(c=s=o(a))||void 0===c?void 0:c.host)||void 0===d||null===(u=d.ownerDocument)||void 0===u||!u.contains(a))}return l}(e))return!e.getClientRects().length;if("legacy-full"!==n)return!0}return!1},p=function(e,t){return!(t.disabled||r(t)||function(e){return d(e)&&"hidden"===e.type}(t)||g(t,e)||function(e){return"DETAILS"===e.tagName&&Array.prototype.slice.apply(e.children).some((function(e){return"SUMMARY"===e.tagName}))}(t)||function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if("FIELDSET"===t.tagName&&t.disabled){for(var n=0;n<t.children.length;n++){var o=t.children.item(n);if("LEGEND"===o.tagName)return!!i.call(t,"fieldset[disabled] *")||!o.contains(e)}return!0}t=t.parentElement}return!1}(t))},b=function(e,t){return!(u(t)||l(t)<0||!p(e,t))},m=function(e){var t=parseInt(e.getAttribute("tabindex"),10);return!!(isNaN(t)||t>=0)},y=function e(t){var n=[],i=[];return t.forEach((function(t,o){var r=!!t.scopeParent,s=r?t.scopeParent:t,c=function(e,t){var n=l(e);return n<0&&t&&!a(e)?0:n}(s,r),d=r?e(t.candidates):s;0===c?r?n.push.apply(n,d):n.push(s):i.push({documentOrder:o,tabIndex:c,item:t,isScope:r,content:d})})),i.sort(c).reduce((function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e}),[]).concat(n)},f=function(e,n){var o;return o=(n=n||{}).getShadowRoot?s([e],n.includeContainer,{filter:b.bind(null,n),flatten:!1,getShadowRoot:n.getShadowRoot,shadowRootFilter:m}):function(e,n,o){if(r(e))return[];var s=Array.prototype.slice.apply(e.querySelectorAll(t));return n&&i.call(e,t)&&s.unshift(e),s.filter(o)}(e,n.includeContainer,b.bind(null,n)),y(o)},v=2e3,S='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>',x=function(){function e(e){this.shadowRoot=null,this.controlsContainer=null,this.elementListItemsContainer=null,this.elementCountSpan=null,this.elementListItems=new Map,this.controlPanelStyleElement=null,this.trajectoryEnabledCheckbox=null,this.tabEnabledCheckbox=null,this.historySizeSlider=null,this.historyValueSpan=null,this.predictionTimeSlider=null,this.predictionValueSpan=null,this.throttleDelaySlider=null,this.throttleValueSpan=null,this.tabOffsetSlider=null,this.tabOffsetValueSpan=null,this.containerMinimizeButton=null,this.allSettingsSectionsContainer=null,this.debuggerElementsSection=null,this.isContainerMinimized=!1,this.isMouseSettingsMinimized=!0,this.isKeyboardSettingsMinimized=!0,this.isGeneralSettingsMinimized=!0,this.isElementsListMinimized=!0,this.SESSION_STORAGE_KEY="jsforesightDebuggerSectionStates",this.copySettingsButton=null,this.copyTimeoutId=null,this.foresightManagerInstance=e}return e.prototype.initialize=function(e,t){this.shadowRoot=e,this.createDOM(),t.isControlPanelDefaultMinimized&&(this.isContainerMinimized=!0),this.controlsContainer&&this.shadowRoot&&(this.controlPanelStyleElement=document.createElement("style"),this.controlPanelStyleElement.textContent=this.getStyles(),this.controlPanelStyleElement.id="debug-control-panel",this.shadowRoot.appendChild(this.controlPanelStyleElement),this.shadowRoot.appendChild(this.controlsContainer),this.queryDOMElements(),this.originalSectionStates(),this.setupEventListeners(),this.refreshElementList(),this.applyMinimizedStateVisuals())},e.prototype.loadSectionStatesFromSessionStorage=function(){var e,t,n,i,o=sessionStorage.getItem(this.SESSION_STORAGE_KEY),r={};return o&&(r=JSON.parse(o)),this.isMouseSettingsMinimized=null===(e=r.mouse)||void 0===e||e,this.isKeyboardSettingsMinimized=null===(t=r.keyboard)||void 0===t||t,this.isGeneralSettingsMinimized=null===(n=r.general)||void 0===n||n,this.isElementsListMinimized=null!==(i=r.elements)&&void 0!==i&&i,r},e.prototype.saveSectionStatesToSessionStorage=function(){var e={mouse:this.isMouseSettingsMinimized,keyboard:this.isKeyboardSettingsMinimized,general:this.isGeneralSettingsMinimized,elements:this.isElementsListMinimized};try{sessionStorage.setItem(this.SESSION_STORAGE_KEY,JSON.stringify(e))}catch(e){console.error("Foresight Debugger: Could not save section states to session storage.",e)}},e.prototype.queryDOMElements=function(){this.controlsContainer&&(this.trajectoryEnabledCheckbox=this.controlsContainer.querySelector("#trajectory-enabled"),this.tabEnabledCheckbox=this.controlsContainer.querySelector("#tab-enabled"),this.historySizeSlider=this.controlsContainer.querySelector("#history-size"),this.historyValueSpan=this.controlsContainer.querySelector("#history-value"),this.predictionTimeSlider=this.controlsContainer.querySelector("#prediction-time"),this.predictionValueSpan=this.controlsContainer.querySelector("#prediction-value"),this.throttleDelaySlider=this.controlsContainer.querySelector("#throttle-delay"),this.throttleValueSpan=this.controlsContainer.querySelector("#throttle-value"),this.tabOffsetSlider=this.controlsContainer.querySelector("#tab-offset"),this.tabOffsetValueSpan=this.controlsContainer.querySelector("#tab-offset-value"),this.elementListItemsContainer=this.controlsContainer.querySelector("#element-list-items-container"),this.elementCountSpan=this.controlsContainer.querySelector("#element-count"),this.containerMinimizeButton=this.controlsContainer.querySelector(".minimize-button"),this.allSettingsSectionsContainer=this.controlsContainer.querySelector(".all-settings-sections-container"),this.debuggerElementsSection=this.controlsContainer.querySelector(".debugger-elements"),this.copySettingsButton=this.controlsContainer.querySelector(".copy-settings-button"))},e.prototype.handleCopySettings=function(){var e,t,n,i,o,r,s,a,l,c,d,u,h=this;if(this.copySettingsButton){var g=null!==(t=null===(e=this.trajectoryEnabledCheckbox)||void 0===e?void 0:e.checked)&&void 0!==t&&t,p=null!==(i=null===(n=this.tabEnabledCheckbox)||void 0===n?void 0:n.checked)&&void 0!==i&&i,b=parseInt(null!==(r=null===(o=this.historySizeSlider)||void 0===o?void 0:o.value)&&void 0!==r?r:"8",10),m=parseInt(null!==(a=null===(s=this.predictionTimeSlider)||void 0===s?void 0:s.value)&&void 0!==a?a:"80",10),y=parseInt(null!==(c=null===(l=this.throttleDelaySlider)||void 0===l?void 0:l.value)&&void 0!==c?c:"50",10),f=parseInt(null!==(u=null===(d=this.tabOffsetSlider)||void 0===d?void 0:d.value)&&void 0!==u?u:"2",10),v={debug:!0,debuggerSettings:{isControlPanelDefaultMinimized:this.isContainerMinimized},enableMousePrediction:g,enableTabPrediction:p,positionHistorySize:b,resizeScrollThrottleDelay:y,tabOffset:f,trajectoryPredictionTime:m},x="ForesightManager.initialize({\n";x+=" debug: ".concat(v.debug,",\n"),x+=" debuggerSettings: {\n",x+=" isControlPanelDefaultMinimized: ".concat(v.debuggerSettings.isControlPanelDefaultMinimized,",\n"),x+=" },\n",x+=" enableMousePrediction: ".concat(v.enableMousePrediction,",\n"),x+=" enableTabPrediction: ".concat(v.enableTabPrediction,",\n"),x+=" positionHistorySize: ".concat(v.positionHistorySize,",\n"),x+=" resizeScrollThrottleDelay: ".concat(v.resizeScrollThrottleDelay,",\n"),x+=" tabOffset: ".concat(v.tabOffset,",\n"),x+=" trajectoryPredictionTime: ".concat(v.trajectoryPredictionTime,",\n"),x+="})",navigator.clipboard.writeText(x).then((function(){h.copySettingsButton.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>',h.copyTimeoutId&&clearTimeout(h.copyTimeoutId),h.copyTimeoutId=setTimeout((function(){h.copySettingsButton&&(h.copySettingsButton.innerHTML=S),h.copyTimeoutId=null}),3e3)})).catch((function(e){console.error("Foresight Debugger: Could not copy settings to clipboard",e)}))}},e.prototype.setupEventListeners=function(){var e,t,n,i,o,r,s,a,l=this;null===(e=this.trajectoryEnabledCheckbox)||void 0===e||e.addEventListener("change",(function(e){l.foresightManagerInstance.alterGlobalSettings({enableMousePrediction:e.target.checked})})),null===(t=this.tabEnabledCheckbox)||void 0===t||t.addEventListener("change",(function(e){l.foresightManagerInstance.alterGlobalSettings({enableTabPrediction:e.target.checked})})),null===(n=this.historySizeSlider)||void 0===n||n.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.historyValueSpan&&(l.historyValueSpan.textContent="".concat(t," points")),l.foresightManagerInstance.alterGlobalSettings({positionHistorySize:t})})),null===(i=this.predictionTimeSlider)||void 0===i||i.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.predictionValueSpan&&(l.predictionValueSpan.textContent="".concat(t," ms")),l.foresightManagerInstance.alterGlobalSettings({trajectoryPredictionTime:t})})),null===(o=this.throttleDelaySlider)||void 0===o||o.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.throttleValueSpan&&(l.throttleValueSpan.textContent="".concat(t," ms")),l.foresightManagerInstance.alterGlobalSettings({resizeScrollThrottleDelay:t})})),null===(r=this.tabOffsetSlider)||void 0===r||r.addEventListener("input",(function(e){var t=parseInt(e.target.value,10);l.tabOffsetValueSpan&&(l.tabOffsetValueSpan.textContent="".concat(t," tabs")),l.foresightManagerInstance.alterGlobalSettings({tabOffset:t})})),null===(s=this.containerMinimizeButton)||void 0===s||s.addEventListener("click",(function(){l.isContainerMinimized=!l.isContainerMinimized,l.applyMinimizedStateVisuals()})),null===(a=this.copySettingsButton)||void 0===a||a.addEventListener("click",this.handleCopySettings.bind(this));var c=function(e,t){var n=null==e?void 0:e.querySelector(".debugger-section-header");null==n||n.addEventListener("click",(function(n){n.stopPropagation(),l.toggleMinimizeSection(e,l[t]=!l[t])}))};this.controlsContainer&&(c(this.controlsContainer.querySelector(".mouse-settings-section"),"isMouseSettingsMinimized"),c(this.controlsContainer.querySelector(".keyboard-settings-section"),"isKeyboardSettingsMinimized"),c(this.controlsContainer.querySelector(".general-settings-section"),"isGeneralSettingsMinimized"),c(this.controlsContainer.querySelector(".debugger-elements"),"isElementsListMinimized"))},e.prototype.toggleMinimizeSection=function(e,t){if(e){var n=e.querySelector(".debugger-section-content"),i=e.querySelector(".section-minimize-button");n&&i&&(t?(n.style.display="none",i.textContent="+"):(n.style.display="flex",i.textContent="-")),this.saveSectionStatesToSessionStorage()}},e.prototype.originalSectionStates=function(){var e,t,n,i,o=this.loadSectionStatesFromSessionStorage();this.controlsContainer&&(this.toggleMinimizeSection(this.controlsContainer.querySelector(".mouse-settings-section"),null===(e=o.mouse)||void 0===e||e),this.toggleMinimizeSection(this.controlsContainer.querySelector(".keyboard-settings-section"),null===(t=o.keyboard)||void 0===t||t),this.toggleMinimizeSection(this.controlsContainer.querySelector(".general-settings-section"),null===(n=o.general)||void 0===n||n),this.toggleMinimizeSection(this.controlsContainer.querySelector(".debugger-elements"),null!==(i=o.elements)&&void 0!==i&&i))},e.prototype.applyMinimizedStateVisuals=function(){this.controlsContainer&&this.containerMinimizeButton&&(this.isContainerMinimized?(this.controlsContainer.classList.add("minimized"),this.containerMinimizeButton.textContent="+",this.allSettingsSectionsContainer&&(this.allSettingsSectionsContainer.style.display="none"),this.debuggerElementsSection&&(this.debuggerElementsSection.style.display="none"),this.copySettingsButton&&(this.copySettingsButton.style.display="none")):(this.controlsContainer.classList.remove("minimized"),this.containerMinimizeButton.textContent="-",this.allSettingsSectionsContainer&&(this.allSettingsSectionsContainer.style.display=""),this.debuggerElementsSection&&(this.debuggerElementsSection.style.display=""),this.copySettingsButton&&(this.copySettingsButton.style.display="")))},e.prototype.updateControlsState=function(e){this.trajectoryEnabledCheckbox&&(this.trajectoryEnabledCheckbox.checked=e.enableMousePrediction),this.tabEnabledCheckbox&&(this.tabEnabledCheckbox.checked=e.enableTabPrediction),this.historySizeSlider&&this.historyValueSpan&&(this.historySizeSlider.value=e.positionHistorySize.toString(),this.historyValueSpan.textContent="".concat(e.positionHistorySize," points")),this.predictionTimeSlider&&this.predictionValueSpan&&(this.predictionTimeSlider.value=e.trajectoryPredictionTime.toString(),this.predictionValueSpan.textContent="".concat(e.trajectoryPredictionTime," ms")),this.throttleDelaySlider&&this.throttleValueSpan&&(this.throttleDelaySlider.value=e.resizeScrollThrottleDelay.toString(),this.throttleValueSpan.textContent="".concat(e.resizeScrollThrottleDelay," ms")),this.tabOffsetSlider&&this.tabOffsetValueSpan&&(this.tabOffsetSlider.value=e.tabOffset.toString(),this.tabOffsetValueSpan.textContent="".concat(e.tabOffset," tabs"))},e.prototype.refreshElementList=function(){var e=this;if(this.elementListItemsContainer){this.elementListItemsContainer.innerHTML="",this.elementListItems.clear();var t=this.foresightManagerInstance.elements;this.elementCountSpan&&(this.elementCountSpan.textContent=t.size.toString()),0!==t.size?t.forEach((function(t,n){var i=document.createElement("div");i.className="element-list-item",e.updateListItemContent(i,t),e.elementListItemsContainer.appendChild(i),e.elementListItems.set(n,i)})):this.elementListItemsContainer.innerHTML="<em>No elements registered.</em>"}},e.prototype.updateListItemContent=function(e,t){e.classList.toggle("hovering",t.isHovering),e.classList.toggle("trajectory-hit",t.trajectoryHitData.isTrajectoryHit);var n=t.unregisterOnCallback?"Single":"Multi",i=t.unregisterOnCallback?"Callback triggers once, then element unregisters.":"Callback can trigger multiple times.",o="N/A",r="Hit Slop: Not defined";if(t.elementBounds.hitSlop){var s=t.elementBounds.hitSlop,a=s.top,l=s.right,c=s.bottom,d=s.left;o="T:".concat(a," R:").concat(l," B:").concat(c," L:").concat(d),r="Hit Slop (px): Top: ".concat(a,", Right: ").concat(l,", Bottom: ").concat(c,", Left: ").concat(d)}e.innerHTML="\n ".concat('<span class="status-indicator"></span>','\n <span class="element-name" title="').concat(t.name||"Unnamed Element",'">').concat(t.name||"Unnamed Element",'</span>\n <span class="hit-slop" title="').concat(r,'">').concat(o,'</span>\n <span class="hit-behavior" title="').concat(i,'">').concat(n,"</span>\n\n ")},e.prototype.cleanup=function(){var e,t;null===(e=this.controlsContainer)||void 0===e||e.remove(),null===(t=this.controlPanelStyleElement)||void 0===t||t.remove(),this.copyTimeoutId&&(clearTimeout(this.copyTimeoutId),this.copyTimeoutId=null),this.controlsContainer=null,this.elementListItemsContainer=null,this.controlPanelStyleElement=null,this.elementCountSpan=null,this.elementListItems.clear(),this.containerMinimizeButton=null,this.allSettingsSectionsContainer=null,this.debuggerElementsSection=null,this.trajectoryEnabledCheckbox=null,this.tabEnabledCheckbox=null,this.historySizeSlider=null,this.historyValueSpan=null,this.predictionTimeSlider=null,this.predictionValueSpan=null,this.throttleDelaySlider=null,this.throttleValueSpan=null,this.tabOffsetSlider=null,this.tabOffsetValueSpan=null,this.copySettingsButton=null},e.prototype.createDOM=function(){this.controlsContainer=document.createElement("div"),this.controlsContainer.id="debug-controls",this.controlsContainer.innerHTML='\n <div class="debugger-title-container">\n <button class="minimize-button">-</button>\n <div class="title-group">\n <h2>Foresight Debugger</h2>\n <span class="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 <button class="copy-settings-button" title="Copy current settings to clipboard">\n '.concat(S,'\n </button>\n </div>\n\n <div class="all-settings-sections-container">\n <div class="debugger-section mouse-settings-section">\n <div class="debugger-section-header mouse-settings-header">\n <h3>Mouse Settings</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content mouse-settings-content">\n <div class="control-row">\n <label for="trajectory-enabled">\n Enable Mouse Prediction\n <span class="info-icon" title="Toggles mouse movement prediction. If disabled, only direct hovers trigger actions (or tab if enabled).">i</span>\n </label>\n <input type="checkbox" id="trajectory-enabled">\n </div>\n <div class="control-row">\n <label for="history-size">\n History Size\n <span class="info-icon" title="Number of past mouse positions to use for velocity calculation. Higher values smooth predictions but add latency.">i</span>\n </label>\n <input type="range" id="history-size" min="').concat(2,'" max="').concat(50,'">\n <span id="history-value"></span>\n </div>\n <div class="control-row">\n <label for="prediction-time">\n Prediction Time\n <span class="info-icon" title="How many ms in the future to calculate the mouse trajectory. Larger values detect intent sooner.">i</span>\n </label>\n <input type="range" id="prediction-time" min="').concat(10,'" max="').concat(200,'" step="10">\n <span id="prediction-value"></span>\n </div>\n </div>\n </div>\n\n <div class="debugger-section keyboard-settings-section">\n <div class="debugger-section-header keyboard-settings-header">\n <h3>Keyboard Settings</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content keyboard-settings-content">\n <div class="control-row">\n <label for="tab-enabled">\n Enable Tab Prediction\n <span class="info-icon" title="With tab prediction the callback will be executed when the user is tabOffset amount of tabs away from an registered element (works with reversed shift-tabs).">i</span>\n </label>\n <input type="checkbox" id="tab-enabled">\n </div>\n <div class="control-row">\n <label for="tab-offset">\n Tab Prediction Offset\n <span class="info-icon" title="Number of next/previous tabbable elements to consider for prediction when using the Tab key.">i</span>\n </label>\n <input type="range" id="tab-offset" min="').concat(0,'" max="').concat(20,'" step="1">\n <span id="tab-offset-value"></span>\n </div>\n </div>\n </div>\n\n <div class="debugger-section general-settings-section">\n <div class="debugger-section-header general-settings-header">\n <h3>General Settings</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content general-settings-content">\n <div class="control-row">\n <label for="throttle-delay">\n Scroll/Resize Throttle\n <span class="info-icon" title="Delay (ms) for recalculating element positions on resize/scroll. Higher values improve performance during rapid events.">i</span>\n </label>\n <input type="range" id="throttle-delay" min="').concat(0,'" max="').concat(500,'" step="10">\n <span id="throttle-value"></span>\n </div>\n </div>\n </div>\n </div>\n\n <div class="debugger-section debugger-elements">\n <div class="debugger-section-header elements-list-header">\n <h3>Registered Elements (<span id="element-count">0</span>)</h3>\n <button class="section-minimize-button">-</button>\n </div>\n <div class="debugger-section-content element-list">\n <div id="element-list-items-container">\n <em>Initializing...</em>\n </div>\n </div>\n </div>\n ')},e.prototype.getStyles=function(){return'\n #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 width: 380px;\n transition: width 0.3s ease, height 0.3s ease;\n }\n #debug-controls.minimized {\n width: 220px;\n overflow: hidden;\n padding: 12px 0; \n }\n #debug-controls.minimized .debugger-title-container {\n justify-content: flex-start; \n padding-left: 10px; \n padding-right: 10px;\n gap: 10px; \n }\n #debug-controls.minimized .debugger-title-container h2 {\n display: inline;\n font-size: 14px;\n margin: 0;\n white-space: nowrap;\n }\n #debug-controls.minimized .info-icon {\n display: none;\n }\n\n .debugger-title-container {\n display: flex;\n align-items: center;\n justify-content: space-between; \n padding: 0 0px; \n }\n .title-group { \n display: flex;\n align-items: center;\n gap: 8px; \n\n }\n .minimize-button {\n background: none; border: none; color: white;\n font-size: 22px; cursor: pointer;\n line-height: 1;\n }\n .debugger-title-container h2 { margin: 0; font-size: 15px; }\n\n .copy-settings-button {\n background: none; border: none; color: white;\n cursor: pointer; padding: 0;\n display: flex; align-items: center; justify-content: center;\n }\n .copy-settings-button svg {\n width: 16px; height: 16px;\n stroke: white;\n }\n\n .all-settings-sections-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .debugger-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 5px;\n margin-bottom: 2px;\n padding-bottom: 2px;\n border-bottom: 1px solid #444;\n cursor: pointer;\n }\n .debugger-section-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: bold;\n color: #b0c4de;\n }\n\n .section-minimize-button {\n background: none;\n border: none;\n color: white;\n font-size: 18px;\n cursor: pointer;\n padding: 0;\n line-height: 1;\n }\n\n #debug-controls .control-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n #debug-controls label {\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: pointer;\n }\n #debug-controls .control-row:has(input[type="checkbox"]) label {\n flex-grow: 1;\n }\n #debug-controls .control-row input[type="checkbox"] {\n appearance: none; -webkit-appearance: none; -moz-appearance: none;\n position: relative; width: 40px; height: 18px;\n background-color: #555; border-radius: 10px; cursor: pointer;\n outline: none; transition: background-color 0.2s ease;\n vertical-align: middle; flex-shrink: 0; margin: 0;\n }\n #debug-controls .control-row input[type="checkbox"]::before {\n content: ""; position: absolute; width: 14px; height: 14px;\n border-radius: 50%; background-color: white; top: 2px; left: 2px;\n transition: transform 0.2s ease; box-shadow: 0 1px 3px rgba(0,0,0,0.4);\n }\n #debug-controls .control-row input[type="checkbox"]:checked {\n background-color: #b0c4de;\n }\n #debug-controls .control-row input[type="checkbox"]:checked::before {\n transform: translateX(22px);\n }\n #debug-controls .control-row:has(input[type="range"]) label {\n flex-basis: 170px; flex-shrink: 0;\n }\n #debug-controls input[type="range"] {\n flex-grow: 1; margin: 0; cursor: pointer; -webkit-appearance: none;\n appearance: none; background: transparent; height: 18px; vertical-align: middle;\n }\n #debug-controls input[type="range"]::-webkit-slider-runnable-track {\n height: 6px; background: #555; border-radius: 3px;\n }\n #debug-controls input[type="range"]::-moz-range-track {\n height: 6px; background: #555; border-radius: 3px;\n }\n #debug-controls input[type="range"]::-webkit-slider-thumb {\n -webkit-appearance: none; appearance: none; margin-top: -5px;\n background: #b0c4de; height: 16px; width: 16px;\n border-radius: 50%; border: 1px solid #333;\n }\n #debug-controls input[type="range"]::-moz-range-thumb {\n background: #b0c4de; height: 16px; width: 16px;\n border-radius: 50%; border: 1px solid #333; border: none;\n }\n #debug-controls .control-row:has(input[type="range"]) span:not(.info-icon) {\n width: 55px; min-width: 55px; text-align: right; flex-shrink: 0;\n }\n .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; font-size: 10px;\n font-style: italic; font-weight: bold; font-family: \'Georgia\', serif;\n cursor: help; user-select: none; flex-shrink: 0;\n }\n .debugger-section {\n display: flex; flex-direction: column; gap: 6px;\n }\n .debugger-section-content {\n display: none; flex-direction: column; gap: 8px;\n }\n\n /* Element List Styles */\n .element-list { /* Scroll container */\n min-height: '.concat(161,"px;\n max-height: ").concat(161,"px; \n overflow-y: auto;\n background-color: rgba(20, 20, 20, 0.5);\n border-radius: 3px;\n padding: 0;\n display: flex;\n }\n\n /* Modern Scrollbar Styling */\n .element-list::-webkit-scrollbar {\n width: 8px; \n }\n .element-list::-webkit-scrollbar-track {\n background: rgba(30, 30, 30, 0.5); \n border-radius: 4px;\n }\n .element-list::-webkit-scrollbar-thumb {\n background-color: rgba(176, 196, 222, 0.5); \n border-radius: 4px; \n border: 2px solid rgba(0, 0, 0, 0.2); \n }\n .element-list::-webkit-scrollbar-thumb:hover {\n background-color: rgba(176, 196, 222, 0.7);\n }\n /* Firefox scrollbar styling */\n .element-list {\n scrollbar-width: thin;\n scrollbar-color: rgba(176, 196, 222, 0.5) rgba(30, 30, 30, 0.5);\n }\n\n\n #element-list-items-container { \n display: flex;\n flex-wrap: wrap;\n gap: ").concat(3,"px;\n padding: ").concat(6,"px;\n min-height: ").concat(149,"px;\n box-sizing: border-box;\n align-content: flex-start;\n }\n #element-list-items-container > em {\n flex-basis: 100%;\n text-align: center;\n padding: 10px 0;\n font-style: italic;\n color: #ccc;\n font-size: 12px;\n }\n .element-list-item {\n flex-basis: calc((100% - (").concat(0," * ").concat(3,"px)) / ").concat(1,");\n flex-grow: 0;\n flex-shrink: 0;\n height: ").concat(35,"px;\n box-sizing: border-box;\n padding: 3px 5px;\n border-radius: 2px;\n display: flex;\n align-items: center;\n gap: 5px;\n background-color: rgba(50,50,50,0.7);\n transition: background-color 0.2s ease;\n font-size: 11px; \n overflow: hidden;\n }\n .element-list-item .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background-color: #777;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 8px;\n }\n .element-list-item.hovering .status-indicator {\n background-color: oklch(83.7% 0.128 66.29 / 0.7);\n }\n .element-list-item.trajectory-hit .status-indicator {\n background-color: oklch(89.7% 0.196 126.665 / 0.7);\n }\n .element-list-item.hovering.trajectory-hit .status-indicator {\n background: linear-gradient(45deg, oklch(89.7% 0.196 126.665 / 0.7) 50%, oklch(83.7% 0.128 66.29 / 0.7) 50%);\n }\n .element-list-item .element-name {\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 12px; \n font-weight: bold;\n }\n .element-list-item .hit-behavior,\n .element-list-item .hit-slop {\n font-size: 10px; \n color: #b0b0b0;\n padding: 2px 5px; \n border-radius: 3px; \n background-color: rgba(0,0,0,0.2);\n flex-shrink: 0;\n }\n ")},e}(),w=function(){return window.matchMedia("(pointer: coarse)").matches&&navigator.maxTouchPoints>0},C=function(){function e(e){this.shadowHost=null,this.shadowRoot=null,this.debugContainer=null,this.debugLinkOverlays=new Map,this.debugPredictedMouseIndicator=null,this.debugTrajectoryLine=null,this.debuggerStyleElement=null,this.debugCallbackIndicator=null,this.controlPanel=null,this.lastElementData=new Map,document.querySelectorAll("#jsforesight-debugger-shadow-host").forEach((function(e){return e.remove()})),this.foresightManagerInstance=e,this.controlPanel=new x(this.foresightManagerInstance)}return e.getInstance=function(t){return e.debuggerInstance||(e.debuggerInstance=new e(t)),e.debuggerInstance},e.prototype.initialize=function(e,t,n,i){var o=this;if("undefined"==typeof window||w())this.shadowHost&&this.cleanup();else{if(this.shadowHost)return console.warn("ForesightDebugger already initialized."),this.updateControlsState(t),this.updateTrajectoryVisuals(n,i,t.enableMousePrediction),void this.refreshDisplayedElements();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.debuggerStyleElement=document.createElement("style"),this.debuggerStyleElement.id="debug-container",this.debuggerStyleElement.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-callback-indicator {\n position: absolute;\n border: 4px solid oklch(60% 0.1 270); \n border-radius: 5px;\n box-sizing: border-box;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.3s ease-out;\n z-index: 10002;\n }\n .jsforesight-callback-indicator.animate {\n animation: jsforesight-callback-pulse 0.4s ease-out forwards;\n }\n\n @keyframes jsforesight-callback-pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(1.1);\n opacity: 0;\n }\n }\n ",this.shadowRoot.appendChild(this.debuggerStyleElement),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.debugCallbackIndicator=document.createElement("div"),this.debugCallbackIndicator.className="jsforesight-callback-indicator",this.debugContainer.appendChild(this.debugCallbackIndicator),this.shadowRoot&&this.controlPanel&&this.controlPanel.initialize(this.shadowRoot,t.debuggerSettings),e.forEach((function(e,t){o.createOrUpdateLinkOverlay(t,e)})),this.updateTrajectoryVisuals(n,i,t.enableMousePrediction)}},e.prototype.cleanup=function(){var t,n;null===(t=this.controlPanel)||void 0===t||t.cleanup(),null===(n=this.shadowHost)||void 0===n||n.remove(),this.shadowHost=null,this.shadowRoot=null,this.debugContainer=null,this.debugLinkOverlays.clear(),this.lastElementData.clear(),this.debugPredictedMouseIndicator=null,this.debugTrajectoryLine=null,this.debuggerStyleElement=null,this.debugCallbackIndicator=null,e.debuggerInstance=void 0},e.prototype.createOrUpdateLinkOverlay=function(e,t){var n;if(this.debugContainer&&this.shadowRoot){this.lastElementData.set(e,{isHovering:t.isHovering,isTrajectoryHit:t.trajectoryHitData.isTrajectoryHit});var i=this.debugLinkOverlays.get(e);if(!i){var o=document.createElement("div");o.className="jsforesight-link-overlay",this.debugContainer.appendChild(o);var r=document.createElement("div");r.className="jsforesight-expanded-overlay",this.debugContainer.appendChild(r);var s=document.createElement("div");s.className="jsforesight-name-label",this.debugContainer.appendChild(s),i={linkOverlay:o,expandedOverlay:r,nameLabel:s},this.debugLinkOverlays.set(e,i)}var a=i.linkOverlay,l=i.expandedOverlay,c=i.nameLabel,d=e.getBoundingClientRect();a.style.left="".concat(d.left,"px"),a.style.top="".concat(d.top,"px"),a.style.width="".concat(d.width,"px"),a.style.height="".concat(d.height,"px"),a.classList.toggle("trajectory-hit",t.trajectoryHitData.isTrajectoryHit),a.classList.toggle("active",t.isHovering),t.elementBounds.expandedRect?(l.style.left="".concat(t.elementBounds.expandedRect.left,"px"),l.style.top="".concat(t.elementBounds.expandedRect.top,"px"),l.style.width="".concat(t.elementBounds.expandedRect.right-t.elementBounds.expandedRect.left,"px"),l.style.height="".concat(t.elementBounds.expandedRect.bottom-t.elementBounds.expandedRect.top,"px"),l.style.display="block"):l.style.display="none",t.name&&"Unnamed"!==t.name?(c.textContent=t.name,c.style.display="block",c.style.left="".concat(d.left,"px"),c.style.top="".concat(d.top-22,"px")):c.style.display="none",null===(n=this.controlPanel)||void 0===n||n.refreshElementList()}},e.prototype.removeLinkOverlay=function(e){var t,n=this.debugLinkOverlays.get(e);n&&(n.linkOverlay.remove(),n.expandedOverlay.remove(),n.nameLabel.remove(),this.debugLinkOverlays.delete(e)),this.lastElementData.delete(e),null===(t=this.controlPanel)||void 0===t||t.refreshElementList()},e.prototype.refreshDisplayedElements=function(){var e,t=this;if(this.shadowRoot&&this.debugContainer){var n=new Set(this.foresightManagerInstance.elements.keys());this.foresightManagerInstance.elements.forEach((function(e,n){t.createOrUpdateLinkOverlay(n,e)})),Array.from(this.debugLinkOverlays.keys()).filter((function(e){return!n.has(e)})).forEach((function(e){var n=t.debugLinkOverlays.get(e);null==n||n.linkOverlay.remove(),null==n||n.expandedOverlay.remove(),null==n||n.nameLabel.remove(),t.debugLinkOverlays.delete(e),t.lastElementData.delete(e)})),null===(e=this.controlPanel)||void 0===e||e.refreshElementList()}},e.prototype.updateTrajectoryVisuals=function(e,t,n){if(this.shadowRoot&&this.debugContainer&&this.debugPredictedMouseIndicator&&this.debugTrajectoryLine)if(this.debugPredictedMouseIndicator.style.left="".concat(t.x,"px"),this.debugPredictedMouseIndicator.style.top="".concat(t.y,"px"),this.debugPredictedMouseIndicator.style.display=n?"block":"none",0!==t.x||0!==t.y){if(n){var i=t.x-e.x,o=t.y-e.y;if(Math.abs(i)>1||Math.abs(o)>1){var r=Math.sqrt(i*i+o*o),s=180*Math.atan2(o,i)/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"}}else this.debugPredictedMouseIndicator.style.display="none"},e.prototype.updateControlsState=function(e){var t;null===(t=this.controlPanel)||void 0===t||t.updateControlsState(e)},e.prototype.getAllElementData=function(){return this.foresightManagerInstance.elements},e.prototype.showCallbackPopup=function(e){var t=this;this.debugContainer&&this.shadowRoot&&this.debugCallbackIndicator&&(this.debugCallbackIndicator.style.left="".concat(e.left,"px"),this.debugCallbackIndicator.style.top="".concat(e.top,"px"),this.debugCallbackIndicator.style.width="".concat(e.right-e.left,"px"),this.debugCallbackIndicator.style.height="".concat(e.bottom-e.top,"px"),this.debugCallbackIndicator.classList.remove("animate"),requestAnimationFrame((function(){t.debugCallbackIndicator.classList.add("animate")})))},e}();function k(e,t,n,i,o){return i&&(e<t?console.warn('ForesightJS: "'.concat(o,'" value ').concat(e," is below minimum bound ").concat(t,", clamping to ").concat(t)):e>n&&console.warn('ForesightJS: "'.concat(o,'" value ').concat(e," is above maximum bound ").concat(n,", clamping to ").concat(n))),Math.min(Math.max(e,t),n)}function T(e,t){if("number"==typeof e){var n=k(e,0,v,t,"hitslop");return{top:n,left:n,right:n,bottom:n}}return{top:k(e.top,0,v,t,"hitslop - top"),left:k(e.left,0,v,t,"hitslop - left"),right:k(e.right,0,v,t,"hitslop - right"),bottom:k(e.bottom,0,v,t,"hitslop - bottom")}}function z(e,t){return{left:e.left-t.left,right:e.right+t.right,top:e.top-t.top,bottom:e.bottom+t.bottom}}function E(e,t){return e&&t?e.left===t.left&&e.right===t.right&&e.top===t.top&&e.bottom===t.bottom:e===t}function j(e,t){return void 0!==e&&t!==e}var M=function(){function t(){var t=this;this.elements=new Map,this.isSetup=!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,debuggerSettings:{isControlPanelDefaultMinimized:!1},enableTabPrediction:!0,tabOffset:2},this.positions=[],this.currentPoint={x:0,y:0},this.predictedPoint={x:0,y:0},this.lastResizeScrollCallTimestamp=0,this.resizeScrollThrottleTimeoutId=null,this.domObserver=null,this.domMutationRectsUpdateTimeoutId=null,this.elementResizeObserver=null,this.lastKeyDown=null,this.globalListenersController=null,this.handleMouseMove=function(n){t.updatePointerState(n);var i=null;t.debugger&&(i=[]),t.elements.forEach((function(n,o){if(t.elements.has(o)){var r,s,a={isHovering:n.isHovering,trajectoryHitData:n.trajectoryHitData},l=!1,c=n.isHovering,d=n.trajectoryHitData.isTrajectoryHit,u=n.trajectoryHitData.trajectoryHitTime,h=n.elementBounds.expandedRect,g=(r=t.currentPoint,s=h,r.x>=s.left&&r.x<=s.right&&r.y>=s.top&&r.y<=s.bottom),p=!1;if(!t.globalSettings.enableMousePrediction||g||n.trajectoryHitData.isTrajectoryHit||function(e,t,n){var i=0,o=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 n=t/e;if(e<0){if(n>o)return!1;n>i&&(i=n)}else{if(n<i)return!1;n<o&&(o=n)}}return!0};return!!a(-r,e.x-n.left)&&!!a(r,n.right-e.x)&&!!a(-s,e.y-n.top)&&!!a(s,n.bottom-e.y)&&i<=o}(t.currentPoint,t.predictedPoint,h)&&(p=!0),p&&(d=!0,u=performance.now(),l=!0,t.callCallback(n,o)),g&&!n.isHovering){var b=!n.trajectoryHitData.isTrajectoryHit||n.trajectoryHitData.isTrajectoryHit&&!t.globalSettings.enableMousePrediction;!l&&b&&(l=!0,t.callCallback(n,o))}if(((c=g)!==a.isHovering||d!==a.trajectoryHitData.isTrajectoryHit||d&&u!==a.trajectoryHitData.trajectoryHitTime)&&t.elements.has(o)){var m=e(e({},n),{isHovering:c,trajectoryHitData:{isTrajectoryHit:d,trajectoryHitTime:u,trajectoryHitExpirationTimeoutId:a.trajectoryHitData.trajectoryHitExpirationTimeoutId}});m.trajectoryHitData.isTrajectoryHit&&!a.trajectoryHitData.isTrajectoryHit?(m.trajectoryHitData.trajectoryHitExpirationTimeoutId&&clearTimeout(m.trajectoryHitData.trajectoryHitExpirationTimeoutId),m.trajectoryHitData.trajectoryHitExpirationTimeoutId=setTimeout((function(){var n=t.elements.get(o);if(n&&n.trajectoryHitData.isTrajectoryHit&&n.trajectoryHitData.trajectoryHitTime===m.trajectoryHitData.trajectoryHitTime){var i=e(e({},n),{trajectoryHitData:{isTrajectoryHit:!1,trajectoryHitExpirationTimeoutId:void 0,trajectoryHitTime:n.trajectoryHitData.trajectoryHitTime}});t.elements.set(o,i),t.debugger&&t.debugger.createOrUpdateLinkOverlay(o,i)}}),200)):!m.trajectoryHitData.isTrajectoryHit&&a.trajectoryHitData.isTrajectoryHit&&m.trajectoryHitData.trajectoryHitExpirationTimeoutId&&(clearTimeout(m.trajectoryHitData.trajectoryHitExpirationTimeoutId),m.trajectoryHitData.trajectoryHitExpirationTimeoutId=void 0),t.elements.set(o,m),i&&i.push(o)}}})),t.debugger&&(null==i||i.forEach((function(e){var n=t.elements.get(e);n&&t.debugger.createOrUpdateLinkOverlay(e,n)})),t.debugger.updateTrajectoryVisuals(t.currentPoint,t.predictedPoint,t.globalSettings.enableMousePrediction))},this.handleResizeOrScroll=function(){t.resizeScrollThrottleTimeoutId&&clearTimeout(t.resizeScrollThrottleTimeoutId);var e=performance.now(),n=e-t.lastResizeScrollCallTimestamp,i=t.globalSettings.resizeScrollThrottleDelay;n>=i?(t.updateAllRects(),t.lastResizeScrollCallTimestamp=e,t.resizeScrollThrottleTimeoutId=null):t.resizeScrollThrottleTimeoutId=setTimeout((function(){t.updateAllRects(),t.lastResizeScrollCallTimestamp=performance.now(),t.resizeScrollThrottleTimeoutId=null}),i-n)},this.handleElementResize=function(e){for(var n=0,i=e;n<i.length;n++){var o=i[n].target;t.elements.get(o)&&t.updateExpandedRect(o)}},this.handleDomMutations=function(e){for(var n=0,i=e;n<i.length;n++){var o=i[n];if("childList"===o.type&&o.removedNodes.length>0)for(var r=0,s=Array.from(t.elements.keys());r<s.length;r++){var a=s[r];a.isConnected||t.elements.has(a)&&t.unregister(a)}}},this.handleKeyDown=function(e){"Tab"===e.key?t.lastKeyDown=e:t.lastKeyDown=null},this.handleFocusIn=function(e){if(t.lastKeyDown&&t.globalSettings.enableTabPrediction){var n=e.target;if(n instanceof HTMLElement){var i=f(document.documentElement),o=i.findIndex((function(e){return e===n})),r=t.lastKeyDown.shiftKey?-t.globalSettings.tabOffset:t.globalSettings.tabOffset;t.lastKeyDown=null;for(var s=[],a=0;a<i.length;a++){var l=i[a];(r>0?a>=o&&a<=o+r:a<=o&&a>=o+r)&&t.elements.has(l)&&s.push(l)}s.forEach((function(e){t.callCallback(t.elements.get(e),e)}))}}}}return t.initialize=function(e){return t.manager||(t.manager=new t),e&&t.manager.alterGlobalSettings(e),t.manager},Object.defineProperty(t,"instance",{get:function(){return t.manager?t.manager:this.initialize()},enumerable:!1,configurable:!0}),t.prototype.register=function(e){var t=this,n=e.element,i=e.callback,o=e.hitSlop,r=e.unregisterOnCallback,s=e.name;if(w())return{isTouchDevice:!0,unregister:function(){}};var a=o?T(o,this.globalSettings.debug):this.globalSettings.defaultHitSlop,l=n.getBoundingClientRect(),c=null==r||r,d={callback:i,elementBounds:{expandedRect:z(l,a),originalRect:l,hitSlop:a},isHovering:!1,trajectoryHitData:{isTrajectoryHit:!1,trajectoryHitTime:0,trajectoryHitExpirationTimeoutId:void 0},name:null!=s?s:"",unregisterOnCallback:c};if(this.elements.set(n,d),this.isSetup||this.initializeGlobalListeners(),this.elementResizeObserver&&this.elementResizeObserver.observe(n),this.debugger){var u=this.elements.get(n);u&&this.debugger.createOrUpdateLinkOverlay(n,u),this.debugger.refreshDisplayedElements()}return{isTouchDevice:!1,unregister:function(){return t.unregister(n)}}},t.prototype.unregister=function(e){if(this.elements.has(e)){var t=this.elements.get(e);(null==t?void 0:t.trajectoryHitData.trajectoryHitExpirationTimeoutId)&&clearTimeout(t.trajectoryHitData.trajectoryHitExpirationTimeoutId),this.elementResizeObserver&&this.elementResizeObserver.unobserve(e),this.elements.delete(e),this.debugger&&(this.debugger.removeLinkOverlay(e),this.debugger.refreshDisplayedElements()),0===this.elements.size&&this.isSetup&&(this.debugger?console.log("%cForesightJS: All elements have successfully been unregistered. ForesightJS would typically perform cleanup actions now, but these are currently skipped while in debug mode.","color: #28a745; font-weight: bold;"):this.removeGlobalListeners())}},t.prototype.updateNumericSettings=function(e,t,n,i){return!!j(e,this.globalSettings[t])&&(this.globalSettings[t]=k(e,n,i,this.globalSettings.debug,t),!0)},t.prototype.updateBooleanSetting=function(e,t){return!!j(e,this.globalSettings[t])&&(this.globalSettings[t]=e,!0)},t.prototype.alterGlobalSettings=function(e){var t,n=this,i=!1;if(i||(i=this.updateNumericSettings(null==e?void 0:e.positionHistorySize,"positionHistorySize",2,50)),i||(i=this.updateNumericSettings(null==e?void 0:e.trajectoryPredictionTime,"trajectoryPredictionTime",10,200)),i||(i=this.updateNumericSettings(null==e?void 0:e.tabOffset,"tabOffset",0,20)),i||(i=this.updateNumericSettings(null==e?void 0:e.resizeScrollThrottleDelay,"resizeScrollThrottleDelay",0,500)),i||(i=this.updateBooleanSetting(null==e?void 0:e.enableMousePrediction,"enableMousePrediction")),i||(i=this.updateBooleanSetting(null==e?void 0:e.enableTabPrediction,"enableTabPrediction")),void 0!==(null===(t=null==e?void 0:e.debuggerSettings)||void 0===t?void 0:t.isControlPanelDefaultMinimized)&&(this.globalSettings.debuggerSettings.isControlPanelDefaultMinimized=e.debuggerSettings.isControlPanelDefaultMinimized,i=!0),void 0!==(null==e?void 0:e.defaultHitSlop)){var o=T(e.defaultHitSlop,this.globalSettings.debug);E(this.globalSettings.defaultHitSlop,o)||(this.globalSettings.defaultHitSlop=o,i=!0,this.elements.forEach((function(e,t){n.updateExpandedRect(t)})))}void 0!==(null==e?void 0:e.debug)&&this.globalSettings.debug!==e.debug&&"undefined"!=typeof window&&"undefined"!=typeof document&&(this.globalSettings.debug=e.debug,i=!0,this.globalSettings.debug?this.turnOnDebugMode():this.debugger&&(this.debugger.cleanup(),this.debugger=null)),i&&this.updateDebuggerWithNewSettings()},t.prototype.updateDebuggerWithNewSettings=function(){var e=this;this.globalSettings.debug&&this.debugger&&(this.debugger.updateControlsState(this.globalSettings),this.debugger.updateTrajectoryVisuals(this.currentPoint,this.predictedPoint,this.globalSettings.enableMousePrediction),this.elements.forEach((function(t,n){e.debugger.createOrUpdateLinkOverlay(n,t)})),this.debugger.refreshDisplayedElements())},t.prototype.turnOnDebugMode=function(){this.debugger?this.updateDebuggerWithNewSettings():(this.debugger=C.getInstance(this),this.debugger.initialize(this.elements,this.globalSettings,this.currentPoint,this.predictedPoint))},t.prototype.updateExpandedRect=function(t){var n=this.elements.get(t);if(n){var i=t.getBoundingClientRect(),o=z(i,n.elementBounds.hitSlop);if(!E(o,n.elementBounds.expandedRect)&&(this.elements.set(t,e(e({},n),{elementBounds:e(e({},n.elementBounds),{originalRect:i,expandedRect:o})})),this.debugger)){var r=this.elements.get(t);r&&this.debugger.createOrUpdateLinkOverlay(t,r)}}},t.prototype.updateAllRects=function(){var e=this;this.elements.forEach((function(t,n){e.updateExpandedRect(n)}))},t.prototype.updatePointerState=function(t){this.currentPoint={x:t.clientX,y:t.clientY},this.predictedPoint=this.globalSettings.enableMousePrediction?function(e,t,n,i){var o={point:e,time:performance.now()},r=e.x,s=e.y;if(t.push(o),t.length>n&&t.shift(),t.length<2)return{x:r,y:s};var a=t[0],l=t[t.length-1],c=(l.time-a.time)/1e3;if(0===c)return{x:r,y:s};var d=i/1e3;return{x:r+(l.point.x-a.point.x)/c*d,y:s+(l.point.y-a.point.y)/c*d}}(this.currentPoint,this.positions,this.globalSettings.positionHistorySize,this.globalSettings.trajectoryPredictionTime):e({},this.currentPoint)},t.prototype.callCallback=function(e,t){e&&(e.callback(),this.debugger&&this.debugger.showCallbackPopup(e.elementBounds.expandedRect),e.unregisterOnCallback&&this.unregister(t))},t.prototype.initializeGlobalListeners=function(){var e=this;if(!this.isSetup&&"undefined"!=typeof window&&"undefined"!=typeof document){this.globalListenersController=new AbortController;var t=this.globalListenersController.signal;document.addEventListener("mousemove",this.handleMouseMove,{signal:t}),window.addEventListener("resize",this.handleResizeOrScroll,{signal:t}),window.addEventListener("scroll",this.handleResizeOrScroll,{signal:t}),document.addEventListener("keydown",this.handleKeyDown,{signal:t}),document.addEventListener("focusin",this.handleFocusIn,{signal:t}),this.domObserver=new MutationObserver(this.handleDomMutations),this.domObserver.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0}),console.log("rerunning"),this.elementResizeObserver=new ResizeObserver(this.handleElementResize),this.elements.forEach((function(t,n){return e.elementResizeObserver.observe(n)})),this.isSetup=!0}},t.prototype.removeGlobalListeners=function(){var e,t,n;null===(e=this.globalListenersController)||void 0===e||e.abort(),this.globalListenersController=null,null===(t=this.domObserver)||void 0===t||t.disconnect(),null===(n=this.elementResizeObserver)||void 0===n||n.disconnect(),this.resizeScrollThrottleTimeoutId&&(clearTimeout(this.resizeScrollThrottleTimeoutId),this.resizeScrollThrottleTimeoutId=null),this.domMutationRectsUpdateTimeoutId&&(clearTimeout(this.domMutationRectsUpdateTimeoutId),this.domMutationRectsUpdateTimeoutId=null),this.isSetup=!1},t}();exports.ForesightManager=M;
7
7
  //# sourceMappingURL=index.js.map