js.foresight 2.0.2 → 2.0.4

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
@@ -6,7 +6,6 @@
6
6
  [![GitHub stars](https://img.shields.io/github/stars/spaansba/ForesightJS.svg?style=social&label=Star)](https://github.com/spaansba/ForesightJS)
7
7
  [![GitHub last commit](https://img.shields.io/github/last-commit/spaansba/ForesightJS)](https://github.com/spaansba/ForesightJS/commits)
8
8
 
9
-
10
9
  [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)
11
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
12
11
  [![Demo](https://img.shields.io/badge/demo-live-blue)](https://foresightjs.com/)
@@ -14,11 +13,12 @@
14
13
  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
14
 
16
15
  ### Understanding ForesightJS's Role:
16
+
17
17
  When you over simplify prefetching it exists of three parts.
18
18
 
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
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
22
 
23
23
  ForesightJS takes care of the **When** by predicting user intent with mouse trajectory and tab navigation.
24
24
  You supply the **What** and **How** inside your `callback` when you register an element.
@@ -26,7 +26,7 @@ You supply the **What** and **How** inside your `callback` when you register an
26
26
  ### [ForesightJS docs (with interactive demo)](https://foresightjs.com/)
27
27
 
28
28
  ![](https://github.com/spaansba/ForesightJS/blob/main/static/ForesightJSDemo.gif)
29
- _In the GIF above, [debug mode](https://foresightjs.com/docs/debug) is on. Normally, users won't see anything that ForesightJS does except the increased perceived speed from early prefetching._
29
+ _In the GIF above, [debug mode](https://foresightjs.com/docs/getting_started/debug) is on. Normally, users won't see anything that ForesightJS does except the increased perceived speed from early prefetching._
30
30
 
31
31
  ## Download
32
32
 
@@ -46,7 +46,7 @@ Traditional hover-based prefetching only triggers after the user's cursor reache
46
46
 
47
47
  ### Problem 2: Viewport-Based Prefetching is Wasteful
48
48
 
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.
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.
50
50
 
51
51
  ### Problem 3: Hover-Based Prefetching Excludes Keyboard Users
52
52
 
@@ -58,7 +58,7 @@ ForesightJS bridges the gap between wasteful viewport prefetching and basic hove
58
58
 
59
59
  ## Basic Usage Example
60
60
 
61
- Both global and element speicif configuration details can be found [here](https://foresightjs.com/docs/config).
61
+ Both global and element speicif configuration details can be found [here](https://foresightjs.com/docs/getting_started/config).
62
62
 
63
63
  ```javascript
64
64
  import { ForesightManager } from "foresightjs"
@@ -85,7 +85,7 @@ const { isTouchDevice, unregister } = ForesightManager.instance.register({
85
85
  unregister()
86
86
  ```
87
87
 
88
- ## What about touch devices?
88
+ ## What About Touch Devices?
89
89
 
90
90
  ForesightJS focuses on using mouse movement for prefetching, so you'll need your own approach for touch devices like phones and tablets. The `ForesightManager.instance.register()` method returns an `isTouchDevice` boolean that you can use to create this separate logic. You can safely call `register()` even on touch devices, as the Foresight manager will bounce touch devices to avoid unnecessary processing.
91
91
 
@@ -97,16 +97,22 @@ Since ForesightJS is framework agnostic, it can be integrated with any JavaScrip
97
97
 
98
98
  ## Configuration
99
99
 
100
- ForesightJS can be used bare-bones but also can be configured. For all configuration possibilities you can reference the [docs](https://foresightjs.com/docs/config).
100
+ ForesightJS can be used bare-bones but also can be configured. For all configuration possibilities you can reference the [docs](https://foresightjs.com/docs/getting_started/config).
101
101
 
102
- ## Debugging visualization
102
+ ## Debugging Visualization
103
103
 
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.
104
+ ForesightJS includes a [Visual Debugging](https://foresightjs.com/docs/getting_started/debug) 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
105
 
106
- ## How does ForesightJS work?
106
+ ## How Does ForesightJS Work?
107
107
 
108
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
109
 
110
+ ## Providing Context to AI Tools
111
+
112
+ Since ForesightJS is a relatively new and unknown library, most AI assistants and large language models (LLMs) may not have comprehensive knowledge about it in their training data. To help AI assistants better understand and work with ForesightJS, you can provide them with context from our [llms.txt](https://foresightjs.com/llms.txt) page, which contains structured information about the library's API and usage patterns.
113
+
114
+ In the future, each documentation page will also receive its own markdown variant following the [llms.txt](https://llmstxt.org/) proposal to make ForesightJS more accessible to AI development workflows.
115
+
110
116
  # Contributing
111
117
 
112
118
  Please see the [contributing guidelines](/CONTRIBUTING.md)
package/dist/index.d.ts CHANGED
@@ -65,7 +65,7 @@ type BaseForesightManagerProps = {
65
65
  * Number of mouse positions to keep in history for trajectory calculation.
66
66
  * A higher number might lead to smoother but slightly delayed predictions.
67
67
  *
68
- * **This value is clamped between 2 and 50.**
68
+ * **This value is clamped between 2 and 30.**
69
69
  * @default 8
70
70
  */
71
71
  positionHistorySize: number;
@@ -74,7 +74,7 @@ type BaseForesightManagerProps = {
74
74
  * A larger value means the prediction extends further into the future. (meaning it will trigger callbacks sooner)
75
75
  *
76
76
  * **This value is clamped between 10 and 200.**
77
- * @default 80
77
+ * @default 120
78
78
  */
79
79
  trajectoryPredictionTime: number;
80
80
  /**
@@ -92,7 +92,7 @@ type BaseForesightManagerProps = {
92
92
  * Tab stops away from an element to trigger callback. Only works when @argument enableTabPrediction is true
93
93
  *
94
94
  * **This value is clamped between 0 and 20.**
95
- * @default 3
95
+ * @default 2
96
96
  */
97
97
  tabOffset: number;
98
98
  /**
@@ -111,6 +111,12 @@ type BaseForesightManagerProps = {
111
111
  /** Options for the debugger */
112
112
  debuggerSettings: DebuggerSettings;
113
113
  };
114
+ /**
115
+ * Configuration options for the ForesightManager
116
+ */
117
+ type ForesightManagerProps = BaseForesightManagerProps & {
118
+ defaultHitSlop: Exclude<HitSlop, number>;
119
+ };
114
120
  type UpdateForsightManagerProps = BaseForesightManagerProps & {
115
121
  defaultHitSlop: HitSlop;
116
122
  };
@@ -144,10 +150,10 @@ type HitSlop = Rect | number;
144
150
  */
145
151
  declare class ForesightManager {
146
152
  private static manager;
147
- elements: Map<ForesightElement, ForesightElementData>;
153
+ private elements;
148
154
  private isSetup;
149
155
  private debugger;
150
- private globalSettings;
156
+ private _globalSettings;
151
157
  private positions;
152
158
  private currentPoint;
153
159
  private predictedPoint;
@@ -160,7 +166,10 @@ declare class ForesightManager {
160
166
  private globalListenersController;
161
167
  private constructor();
162
168
  static initialize(props?: Partial<UpdateForsightManagerProps>): ForesightManager;
169
+ static get isInitiated(): Readonly<boolean>;
163
170
  static get instance(): ForesightManager;
171
+ get globalSettings(): Readonly<ForesightManagerProps>;
172
+ get registeredElements(): ReadonlyMap<ForesightElement, ForesightElementData>;
164
173
  register({ element, callback, hitSlop, unregisterOnCallback, name, }: ForesightRegisterOptions): ForesightRegisterResult;
165
174
  private unregister;
166
175
  private updateNumericSettings;
@@ -189,4 +198,4 @@ declare class ForesightManager {
189
198
  }
190
199
 
191
200
  export { ForesightManager };
192
- export type { ForesightElement, Rect as ForesightRect, ForesightRegisterOptions, ForesightRegisterOptionsWithoutElement, ForesightRegisterResult, UpdateForsightManagerProps };
201
+ export type { ForesightElement, ForesightElementData, ForesightManagerProps, Rect as ForesightRect, ForesightRegisterOptions, ForesightRegisterOptionsWithoutElement, ForesightRegisterResult, UpdateForsightManagerProps };
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=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;
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=!0,x=!0,w='<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>',C=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:x,p=null!==(i=null===(n=this.tabEnabledCheckbox)||void 0===n?void 0:n.checked)&&void 0!==i?i:S,b=parseInt(null!==(r=null===(o=this.historySizeSlider)||void 0===o?void 0:o.value)&&void 0!==r?r:8..toString(),10),m=parseInt(null!==(a=null===(s=this.predictionTimeSlider)||void 0===s?void 0:s.value)&&void 0!==a?a:120..toString(),10),y=parseInt(null!==(c=null===(l=this.throttleDelaySlider)||void 0===l?void 0:l.value)&&void 0!==c?c:50..toString(),10),f=parseInt(null!==(u=null===(d=this.tabOffsetSlider)||void 0===d?void 0:d.value)&&void 0!==u?u:2..toString(),10),v={debug:!0,debuggerSettings:{isControlPanelDefaultMinimized:this.isContainerMinimized},enableMousePrediction:g,enableTabPrediction:p,positionHistorySize:b,resizeScrollThrottleDelay:y,tabOffset:f,trajectoryPredictionTime:m},C="ForesightManager.initialize({\n";C+=" debug: ".concat(v.debug,",\n"),C+=" debuggerSettings: {\n",C+=" isControlPanelDefaultMinimized: ".concat(v.debuggerSettings.isControlPanelDefaultMinimized,",\n"),C+=" },\n",C+=" enableMousePrediction: ".concat(v.enableMousePrediction,",\n"),C+=" enableTabPrediction: ".concat(v.enableTabPrediction,",\n"),C+=" positionHistorySize: ".concat(v.positionHistorySize,",\n"),C+=" resizeScrollThrottleDelay: ".concat(v.resizeScrollThrottleDelay,",\n"),C+=" tabOffset: ".concat(v.tabOffset,",\n"),C+=" trajectoryPredictionTime: ".concat(v.trajectoryPredictionTime,",\n"),C+="})",navigator.clipboard.writeText(C).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=w),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.registeredElements;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(w,'\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). - enableMousePrediction">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. - positionHistorySize">i</span>\n </label>\n <input type="range" id="history-size" min="').concat(2,'" max="').concat(30,'">\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 value detects elements sooner. - trajectoryPredictionTime">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) - enableTabPrediction.">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 - tabOffset.">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 in ms for recalculating element positions on resize/scroll. Higher values improve performance during rapid events. - resizeScrollThrottleDelay">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: 400px;\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}(),k=function(){return window.matchMedia("(pointer: coarse)").matches&&navigator.maxTouchPoints>0},T=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 C(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||k())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;\n border: 2px solid rgba(100, 116, 139, 0.2);\n background-color: rgba(100, 116, 139, 0.08);\n box-sizing: border-box;\n border-radius: 6px;\n transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;\n }\n .jsforesight-link-overlay.active {\n border-color: rgba(100, 116, 139, 0.5);\n background-color: rgba(100, 116, 139, 0.15);\n }\n .jsforesight-link-overlay.trajectory-hit {\n border-color: oklch(65% 0.2 250); /* A nice, modern blue */\n background-color: rgba(79, 70, 229, 0.15);\n box-shadow: 0 0 12px rgba(79, 70, 229, 0.5);\n }\n .jsforesight-expanded-overlay {\n position: absolute;\n border: 1px dashed rgba(100, 116, 139, 0.4);\n background-color: rgba(100, 116, 139, 0.05);\n box-sizing: border-box;\n border-radius: 8px;\n }\n .jsforesight-mouse-predicted {\n position: absolute;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 2px solid #6b98e1;\n background-color: rgba(176, 196, 222, 0.3);\n transform: translate(-50%, -50%);\n z-index: 10000;\n }\n .jsforesight-trajectory-line {\n position: absolute;\n height: 2px;\n background-color: #6b98e1;\n transform-origin: left center;\n z-index: 9999;\n border-radius: 1px;\n }\n .jsforesight-name-label {\n position: absolute;\n background-color: rgba(27, 31, 35, 0.85);\n backdrop-filter: blur(4px);\n color: white;\n padding: 4px 8px;\n font-size: 11px;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";\n border-radius: 4px;\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(65% 0.22 280); /* Vibrant Violet */\n border-radius: 8px;\n box-sizing: border-box;\n pointer-events: none;\n opacity: 0;\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 box-shadow: 0 0 15px oklch(65% 0.22 280 / 0.7);\n }\n 100% {\n transform: scale(1.1);\n opacity: 0;\n box-shadow: 0 0 25px oklch(65% 0.22 280 / 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-28,"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.registeredElements.keys());this.foresightManagerInstance.registeredElements.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.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.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 z(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 E(e,t){if("number"==typeof e){var n=z(e,0,v,t,"hitslop");return{top:n,left:n,right:n,bottom:n}}return{top:z(e.top,0,v,t,"hitslop - top"),left:z(e.left,0,v,t,"hitslop - left"),right:z(e.right,0,v,t,"hitslop - right"),bottom:z(e.bottom,0,v,t,"hitslop - bottom")}}function j(e,t){return{left:e.left-t.left,right:e.right+t.right,top:e.top-t.top,bottom:e.bottom+t.bottom}}function M(e,t){return e&&t?e.left===t.left&&e.right===t.right&&e.top===t.top&&e.bottom===t.bottom:e===t}function H(e,t){return void 0!==e&&t!==e}var I=function(){function t(){var t=this;this.elements=new Map,this.isSetup=!1,this.debugger=null,this._globalSettings={debug:false,enableMousePrediction:x,positionHistorySize:8,trajectoryPredictionTime:120,defaultHitSlop:{top:0,left:0,right:0,bottom:0},resizeScrollThrottleDelay:50,debuggerSettings:{isControlPanelDefaultMinimized:false},enableTabPrediction:S,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 this.isInitiated||(t.manager=new t),void 0!==e&&t.manager.alterGlobalSettings(e),t.manager},Object.defineProperty(t,"isInitiated",{get:function(){return!!t.manager},enumerable:!1,configurable:!0}),Object.defineProperty(t,"instance",{get:function(){return this.initialize()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"globalSettings",{get:function(){return this._globalSettings},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"registeredElements",{get:function(){return this.elements},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(k())return{isTouchDevice:!0,unregister:function(){}};var a=o?E(o,this._globalSettings.debug):this._globalSettings.defaultHitSlop,l=n.getBoundingClientRect(),c=null==r||r,d={callback:i,elementBounds:{expandedRect:j(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!!H(e,this._globalSettings[t])&&(this._globalSettings[t]=z(e,n,i,this._globalSettings.debug,t),!0)},t.prototype.updateBooleanSetting=function(e,t){return!!H(e,this._globalSettings[t])&&(this._globalSettings[t]=e,!0)},t.prototype.alterGlobalSettings=function(e){var t,n=this,i=this._globalSettings.positionHistorySize,o=this.updateNumericSettings(null==e?void 0:e.positionHistorySize,"positionHistorySize",2,30);o&&this._globalSettings.positionHistorySize<i&&this.positions.length>this._globalSettings.positionHistorySize&&(this.positions=this.positions.slice(this.positions.length-this._globalSettings.positionHistorySize));var r=this.updateNumericSettings(null==e?void 0:e.trajectoryPredictionTime,"trajectoryPredictionTime",10,200),s=this.updateNumericSettings(null==e?void 0:e.tabOffset,"tabOffset",0,20),a=this.updateNumericSettings(null==e?void 0:e.resizeScrollThrottleDelay,"resizeScrollThrottleDelay",0,500),l=this.updateBooleanSetting(null==e?void 0:e.enableMousePrediction,"enableMousePrediction"),c=this.updateBooleanSetting(null==e?void 0:e.enableTabPrediction,"enableTabPrediction"),d=!1;void 0!==(null===(t=null==e?void 0:e.debuggerSettings)||void 0===t?void 0:t.isControlPanelDefaultMinimized)&&(this._globalSettings.debuggerSettings.isControlPanelDefaultMinimized=e.debuggerSettings.isControlPanelDefaultMinimized,d=!0);var u=!1;if(void 0!==(null==e?void 0:e.defaultHitSlop)){var h=E(e.defaultHitSlop,this._globalSettings.debug);M(this._globalSettings.defaultHitSlop,h)||(this._globalSettings.defaultHitSlop=h,u=!0,this.elements.forEach((function(e,t){n.updateExpandedRect(t)})))}var g=!1;void 0!==(null==e?void 0:e.debug)&&this._globalSettings.debug!==e.debug&&"undefined"!=typeof window&&"undefined"!=typeof document&&(this._globalSettings.debug=e.debug,g=!0,this._globalSettings.debug?this.turnOnDebugMode():this.debugger&&(this.debugger.cleanup(),this.debugger=null)),(o||r||s||a||l||c||d||u||g)&&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=T.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=j(i,n.elementBounds.hitSlop);if(!M(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}),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=I;
7
7
  //# sourceMappingURL=index.js.map