js.foresight-devtools 0.0.2 → 1.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../node_modules/.pnpm/@thednp+shorty@2.0.11/node_modules/@thednp/shorty/dist/shorty.mjs","../../../node_modules/.pnpm/@thednp+position-observer@1.1.0/node_modules/@thednp/position-observer/dist/index.mjs","../src/Debugger/helpers/objectToMethodCall.ts","../src/Debugger/helpers/createAndAppend.ts","../src/Debugger/helpers/getIntersectingIcon.ts","../src/Debugger/DebuggerControlPanel.ts","../src/Debugger/helpers/updateElementOverlays.ts","../src/Debugger/ForesightDebugger.ts"],"sourcesContent":["const Ce = \"2.0.11\", Me = \"aria-checked\", De = \"aria-description\", Le = \"aria-describedby\", Oe = \"aria-expanded\", xe = \"aria-haspopup\", X = \"aria-hidden\", ze = \"aria-label\", Ie = \"aria-labelledby\", Pe = \"aria-modal\", Fe = \"aria-pressed\", Be = \"aria-selected\", Ve = \"aria-valuemin\", He = \"aria-valuemax\", Ue = \"aria-valuenow\", We = \"aria-valuetext\", Y = \"abort\", tt = \"beforeunload\", et = \"blur\", nt = \"change\", ot = \"contextmenu\", U = \"DOMContentLoaded\", st = \"DOMMouseScroll\", rt = \"error\", ct = \"focus\", at = \"focusin\", it = \"focusout\", ut = \"gesturechange\", lt = \"gestureend\", dt = \"gesturestart\", ft = \"keydown\", pt = \"keypress\", gt = \"keyup\", mt = \"load\", vt = \"click\", bt = \"dblclick\", Et = \"mousedown\", ht = \"mouseup\", yt = \"hover\", wt = \"mouseenter\", At = \"mouseleave\", St = \"mousein\", kt = \"mouseout\", Nt = \"mouseover\", Tt = \"mousemove\", Ct = \"mousewheel\", Mt = \"move\", Dt = \"orientationchange\", Lt = \"pointercancel\", Ot = \"pointerdown\", xt = \"pointerleave\", zt = \"pointermove\", It = \"pointerup\", Pt = \"readystatechange\", Ft = \"reset\", Bt = \"resize\", Vt = \"select\", Ht = \"selectend\", Ut = \"selectstart\", Wt = \"scroll\", Rt = \"submit\", Qt = \"touchstart\", jt = \"touchmove\", Kt = \"touchcancel\", qt = \"touchend\", Gt = \"unload\", Re = {\n DOMContentLoaded: U,\n DOMMouseScroll: st,\n abort: Y,\n beforeunload: tt,\n blur: et,\n change: nt,\n click: vt,\n contextmenu: ot,\n dblclick: bt,\n error: rt,\n focus: ct,\n focusin: at,\n focusout: it,\n gesturechange: ut,\n gestureend: lt,\n gesturestart: dt,\n hover: yt,\n keydown: ft,\n keypress: pt,\n keyup: gt,\n load: mt,\n mousedown: Et,\n mousemove: Tt,\n mousein: St,\n mouseout: kt,\n mouseenter: wt,\n mouseleave: At,\n mouseover: Nt,\n mouseup: ht,\n mousewheel: Ct,\n move: Mt,\n orientationchange: Dt,\n pointercancel: Lt,\n pointerdown: Ot,\n pointerleave: xt,\n pointermove: zt,\n pointerup: It,\n readystatechange: Pt,\n reset: Ft,\n resize: Bt,\n scroll: Wt,\n select: Vt,\n selectend: Ht,\n selectstart: Ut,\n submit: Rt,\n touchcancel: Kt,\n touchend: qt,\n touchmove: jt,\n touchstart: Qt,\n unload: Gt\n}, Qe = \"drag\", je = \"dragstart\", Ke = \"dragenter\", qe = \"dragleave\", Ge = \"dragover\", Ze = \"dragend\", _e = \"loadstart\", $e = {\n start: \"mousedown\",\n end: \"mouseup\",\n move: \"mousemove\",\n cancel: \"mouseleave\"\n}, Je = { down: \"mousedown\", up: \"mouseup\" }, Xe = \"onmouseleave\" in document ? [\"mouseenter\", \"mouseleave\"] : [\"mouseover\", \"mouseout\"], Ye = {\n start: \"touchstart\",\n end: \"touchend\",\n move: \"touchmove\",\n cancel: \"touchcancel\"\n}, tn = { in: \"focusin\", out: \"focusout\" }, Zt = 'a[href], button, input, textarea, select, details, [tabindex]:not([tabindex=\"-1\"]', en = {\n Backspace: \"Backspace\",\n Tab: \"Tab\",\n Enter: \"Enter\",\n Shift: \"Shift\",\n Control: \"Control\",\n Alt: \"Alt\",\n Pause: \"Pause\",\n CapsLock: \"CapsLock\",\n Escape: \"Escape\",\n Scape: \"Space\",\n ArrowLeft: \"ArrowLeft\",\n ArrowUp: \"ArrowUp\",\n ArrowRight: \"ArrowRight\",\n ArrowDown: \"ArrowDown\",\n Insert: \"Insert\",\n Delete: \"Delete\",\n Meta: \"Meta\",\n ContextMenu: \"ContextMenu\",\n ScrollLock: \"ScrollLock\"\n}, nn = \"Alt\", on = \"ArrowDown\", sn = \"ArrowUp\", rn = \"ArrowLeft\", cn = \"ArrowRight\", an = \"Backspace\", un = \"CapsLock\", ln = \"Control\", dn = \"Delete\", fn = \"Enter\", pn = \"NumpadEnter\", gn = \"Escape\", mn = \"Insert\", vn = \"Meta\", bn = \"Pause\", En = \"ScrollLock\", hn = \"Shift\", yn = \"Space\", wn = \"Tab\", _t = \"animationDuration\", $t = \"animationDelay\", W = \"animationName\", C = \"animationend\", Jt = \"transitionDuration\", Xt = \"transitionDelay\", M = \"transitionend\", R = \"transitionProperty\", An = \"addEventListener\", Sn = \"removeEventListener\", kn = {\n linear: \"linear\",\n easingSinusoidalIn: \"cubic-bezier(0.47,0,0.745,0.715)\",\n easingSinusoidalOut: \"cubic-bezier(0.39,0.575,0.565,1)\",\n easingSinusoidalInOut: \"cubic-bezier(0.445,0.05,0.55,0.95)\",\n easingQuadraticIn: \"cubic-bezier(0.550,0.085,0.680,0.530)\",\n easingQuadraticOut: \"cubic-bezier(0.250,0.460,0.450,0.940)\",\n easingQuadraticInOut: \"cubic-bezier(0.455,0.030,0.515,0.955)\",\n easingCubicIn: \"cubic-bezier(0.55,0.055,0.675,0.19)\",\n easingCubicOut: \"cubic-bezier(0.215,0.61,0.355,1)\",\n easingCubicInOut: \"cubic-bezier(0.645,0.045,0.355,1)\",\n easingQuarticIn: \"cubic-bezier(0.895,0.03,0.685,0.22)\",\n easingQuarticOut: \"cubic-bezier(0.165,0.84,0.44,1)\",\n easingQuarticInOut: \"cubic-bezier(0.77,0,0.175,1)\",\n easingQuinticIn: \"cubic-bezier(0.755,0.05,0.855,0.06)\",\n easingQuinticOut: \"cubic-bezier(0.23,1,0.32,1)\",\n easingQuinticInOut: \"cubic-bezier(0.86,0,0.07,1)\",\n easingExponentialIn: \"cubic-bezier(0.95,0.05,0.795,0.035)\",\n easingExponentialOut: \"cubic-bezier(0.19,1,0.22,1)\",\n easingExponentialInOut: \"cubic-bezier(1,0,0,1)\",\n easingCircularIn: \"cubic-bezier(0.6,0.04,0.98,0.335)\",\n easingCircularOut: \"cubic-bezier(0.075,0.82,0.165,1)\",\n easingCircularInOut: \"cubic-bezier(0.785,0.135,0.15,0.86)\",\n easingBackIn: \"cubic-bezier(0.6,-0.28,0.735,0.045)\",\n easingBackOut: \"cubic-bezier(0.175,0.885,0.32,1.275)\",\n easingBackInOut: \"cubic-bezier(0.68,-0.55,0.265,1.55)\"\n}, Nn = \"offsetHeight\", Tn = \"offsetWidth\", Cn = \"scrollHeight\", Mn = \"scrollWidth\", Dn = \"tabindex\", Ln = navigator.userAgentData, { userAgent: Yt } = navigator, On = Yt, xn = () => {\n const t = /iPhone|iPad|iPod|Android/i;\n return navigator?.userAgentData?.brands.some(\n (e) => t.test(e.brand)\n ) || t.test(navigator?.userAgent) || !1;\n}, zn = () => {\n const t = /(iPhone|iPod|iPad)/;\n return navigator?.userAgentData?.brands.some(\n (e) => t.test(e.brand)\n ) || t.test(\n navigator?.userAgent\n ) || !1;\n}, In = () => navigator?.userAgent?.includes(\"Firefox\") || !1, te = () => typeof CSS > \"u\" || !CSS.supports ? !1 : CSS.supports(\"-webkit-backdrop-filter\", \"none\"), Pn = () => [\"webkitPerspective\", \"perspective\"].some((t) => t in document.head.style), ee = () => {\n}, Q = (t, e, n, o) => {\n const s = o || !1;\n t.addEventListener(\n e,\n n,\n s\n );\n}, j = (t, e, n, o) => {\n const s = o || !1;\n t.removeEventListener(\n e,\n n,\n s\n );\n}, ne = (t, e, n, o) => {\n const s = (r) => {\n (r.target === t || r.currentTarget === t) && (n.apply(t, [r]), j(t, e, s, o));\n };\n Q(t, e, s, o);\n}, Fn = () => {\n let t = !1;\n try {\n const e = Object.defineProperty({}, \"passive\", {\n get: () => (t = !0, t)\n });\n ne(document, U, ee, e);\n } catch {\n }\n return t;\n}, Bn = () => [\"webkitTransform\", \"transform\"].some((t) => t in document.head.style), Vn = () => \"ontouchstart\" in window || \"msMaxTouchPoints\" in navigator, Hn = () => [\"webkitAnimation\", \"animation\"].some((t) => t in document.head.style), Un = () => [\"webkitTransition\", \"transition\"].some((t) => t in document.head.style), K = (t, e) => t.getAttribute(e), Wn = (t, e, n) => e.getAttributeNS(t, n), oe = (t, e) => t.hasAttribute(e), Rn = (t, e, n) => e.hasAttributeNS(t, n), Qn = (t, e, n) => t.setAttribute(e, n), jn = (t, e, n, o) => e.setAttributeNS(t, n, o), Kn = (t, e) => t.removeAttribute(e), qn = (t, e, n) => e.removeAttributeNS(t, n), Gn = (t, ...e) => {\n t.classList.add(...e);\n}, Zn = (t, ...e) => {\n t.classList.remove(...e);\n}, _n = (t, e) => t.classList.contains(e), { body: $n } = document, { documentElement: Jn } = document, { head: Xn } = document, Yn = (t) => Array.from(t), v = (t) => t != null && typeof t == \"object\" || !1, u = (t) => v(t) && typeof t.nodeType == \"number\" && [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].some(\n (e) => t.nodeType === e\n) || !1, i = (t) => u(t) && t.nodeType === 1 || !1, E = /* @__PURE__ */ new Map(), L = {\n data: E,\n set: (t, e, n) => {\n if (!i(t)) return;\n E.has(e) || E.set(e, /* @__PURE__ */ new Map()), E.get(e).set(t, n);\n },\n getAllFor: (t) => E.get(t) || null,\n get: (t, e) => {\n if (!i(t) || !e) return null;\n const n = L.getAllFor(e);\n return t && n && n.get(t) || null;\n },\n remove: (t, e) => {\n const n = L.getAllFor(e);\n !n || !i(t) || (n.delete(t), n.size === 0 && E.delete(e));\n }\n}, to = (t, e) => L.get(t, e), eo = (t) => t?.charAt(0).toUpperCase() + t?.slice(1), P = (t) => t?.trim().replace(\n /(?:^\\w|[A-Z]|\\b\\w)/g,\n (e, n) => n === 0 ? e.toLowerCase() : e.toUpperCase()\n).replace(/\\s+/g, \"\"), N = (t) => typeof t == \"string\" || !1, q = (t) => v(t) && t.constructor.name === \"Window\" || !1, G = (t) => u(t) && t.nodeType === 9 || !1, d = (t) => G(t) ? t : u(t) ? t.ownerDocument : q(t) ? t.document : globalThis.document, T = (t, ...e) => Object.assign(t, ...e), se = (t) => {\n if (!t) return;\n if (N(t))\n return d().createElement(t);\n const { tagName: e } = t, n = se(e);\n if (!n) return;\n const o = { ...t };\n return delete o.tagName, T(n, o);\n}, re = (t, e) => {\n if (!t || !e) return;\n if (N(e))\n return d().createElementNS(t, e);\n const { tagName: n } = e, o = re(t, n);\n if (!o) return;\n const s = { ...e };\n return delete s.tagName, T(o, s);\n}, Z = (t, e) => t.dispatchEvent(e), no = (t, e, n) => n.indexOf(t) === e, f = (t, e, n) => {\n const o = getComputedStyle(t, n), s = e.replace(\"webkit\", \"Webkit\").replace(/([A-Z])/g, \"-$1\").toLowerCase();\n return o.getPropertyValue(s);\n}, ce = (t) => {\n const e = f(t, W), n = f(t, $t), o = n.includes(\"ms\") ? 1 : 1e3, s = e && e !== \"none\" ? parseFloat(n) * o : 0;\n return Number.isNaN(s) ? 0 : s;\n}, ae = (t) => {\n const e = f(t, W), n = f(t, _t), o = n.includes(\"ms\") ? 1 : 1e3, s = e && e !== \"none\" ? parseFloat(n) * o : 0;\n return Number.isNaN(s) ? 0 : s;\n}, oo = (t, e) => {\n let n = 0;\n const o = new Event(C), s = ae(t), r = ce(t);\n if (s) {\n const a = (l) => {\n l.target === t && (e.apply(t, [l]), t.removeEventListener(C, a), n = 1);\n };\n t.addEventListener(C, a), setTimeout(() => {\n n || Z(t, o);\n }, s + r + 17);\n } else\n e.apply(t, [o]);\n}, ie = (t) => {\n const e = f(t, R), n = f(t, Xt), o = n.includes(\"ms\") ? 1 : 1e3, s = e && e !== \"none\" ? parseFloat(n) * o : 0;\n return Number.isNaN(s) ? 0 : s;\n}, ue = (t) => {\n const e = f(t, R), n = f(t, Jt), o = n.includes(\"ms\") ? 1 : 1e3, s = e && e !== \"none\" ? parseFloat(n) * o : 0;\n return Number.isNaN(s) ? 0 : s;\n}, so = (t, e) => {\n let n = 0;\n const o = new Event(M), s = ue(t), r = ie(t);\n if (s) {\n const a = (l) => {\n l.target === t && (e.apply(t, [l]), t.removeEventListener(M, a), n = 1);\n };\n t.addEventListener(M, a), setTimeout(() => {\n n || Z(t, o);\n }, s + r + 17);\n } else\n e.apply(t, [o]);\n}, ro = (t) => Float32Array.from(Array.from(t)), co = (t) => Float64Array.from(Array.from(t)), ao = (t, e) => t.focus(e), io = (t) => t?.trim().replace(/([a-z])([A-Z])/g, \"$1-$2\").replace(/\\s+/g, \"-\").toLowerCase(), F = (t) => [\"true\", !0].includes(t) ? !0 : [\"false\", !1].includes(t) ? !1 : [\"null\", \"\", null, void 0].includes(t) ? null : t !== \"\" && !Number.isNaN(+t) ? +t : t, S = (t) => Object.entries(t), uo = (t, e, n, o) => {\n if (!i(t)) return e;\n const s = { ...n }, r = { ...t.dataset }, a = { ...e }, l = {}, p = \"title\";\n return S(r).forEach(([c, g]) => {\n const A = o && typeof c == \"string\" && c.includes(o) ? P(c.replace(o, \"\")) : P(c);\n l[A] = F(g);\n }), S(s).forEach(([c, g]) => {\n s[c] = F(g);\n }), S(e).forEach(([c, g]) => {\n c in s ? a[c] = s[c] : c in l ? a[c] = l[c] : a[c] = c === p ? K(t, p) : g;\n }), a;\n}, lo = (t, e) => v(t) && (Object.hasOwn(t, e) || e in t), fo = (t) => Object.keys(t), po = (t) => Object.values(t), go = (t) => Object.fromEntries(t), mo = (t, e) => {\n const n = new CustomEvent(t, {\n cancelable: !0,\n bubbles: !0\n });\n return v(e) && T(n, e), n;\n}, vo = { passive: !0 }, bo = (t) => t.offsetHeight, Eo = (t, e) => {\n S(e).forEach(([n, o]) => {\n if (o && N(n) && n.includes(\"--\"))\n t.style.setProperty(n, o);\n else {\n const s = {};\n s[n] = o, T(t.style, s);\n }\n });\n}, O = (t) => v(t) && t.constructor.name === \"Map\" || !1, le = (t) => typeof t == \"number\" || !1, m = /* @__PURE__ */ new Map(), ho = {\n set: (t, e, n, o) => {\n i(t) && (o && o.length ? (m.has(t) || m.set(t, /* @__PURE__ */ new Map()), m.get(t).set(o, setTimeout(e, n))) : m.set(t, setTimeout(e, n)));\n },\n get: (t, e) => {\n if (!i(t)) return null;\n const n = m.get(t);\n return e && n && O(n) ? n.get(e) || null : le(n) ? n : null;\n },\n clear: (t, e) => {\n if (!i(t)) return;\n const n = m.get(t);\n e && e.length && O(n) ? (clearTimeout(n.get(e)), n.delete(e), n.size === 0 && m.delete(t)) : (clearTimeout(n), m.delete(t));\n }\n}, yo = (t) => t.toLowerCase(), wo = (t) => t.toUpperCase(), de = (t, e) => (u(e) ? e : d()).querySelectorAll(t), z = /* @__PURE__ */ new Map();\nfunction _(t) {\n const { shiftKey: e, code: n } = t, o = d(this), s = [\n ...de(Zt, this)\n ].filter(\n (l) => !oe(l, \"disabled\") && !K(l, X)\n );\n if (!s.length) return;\n const r = s[0], a = s[s.length - 1];\n n === \"Tab\" && (e && o.activeElement === r ? (a.focus(), t.preventDefault()) : !e && o.activeElement === a && (r.focus(), t.preventDefault()));\n}\nconst I = (t) => z.has(t) === !0, fe = (t) => {\n I(t) || (Q(t, \"keydown\", _), z.set(t, !0));\n}, pe = (t) => {\n I(t) && (j(t, \"keydown\", _), z.delete(t));\n}, Ao = (t) => {\n I(t) ? pe(t) : fe(t);\n}, b = (t) => i(t) && \"offsetWidth\" in t || !1, y = (t, e) => {\n const { width: n, height: o, top: s, right: r, bottom: a, left: l } = t.getBoundingClientRect();\n let p = 1, c = 1;\n if (e && b(t)) {\n const { offsetWidth: g, offsetHeight: A } = t;\n p = g > 0 ? Math.round(n) / g : 1, c = A > 0 ? Math.round(o) / A : 1;\n }\n return {\n width: n / p,\n height: o / c,\n top: s / c,\n right: r / p,\n bottom: a / c,\n left: l / p,\n x: l / p,\n y: s / c\n };\n}, So = (t) => d(t).body, w = (t) => d(t).documentElement, ko = (t) => d(t).head, ge = (t) => u(t) ? (t.nodeName || \"\").toLowerCase() : \"#document\", No = (t) => {\n const e = q(t), n = e ? t.scrollX : t.scrollLeft, o = e ? t.scrollY : t.scrollTop;\n return { x: n, y: o };\n}, me = (t) => u(t) && t.constructor.name === \"ShadowRoot\" || !1, k = (t) => t.nodeName === \"HTML\" ? t : i(t) && t.assignedSlot || u(t) && t.parentNode || me(t) && t.host || w(t), ve = (t) => t ? G(t) ? t.defaultView : u(t) ? t?.ownerDocument?.defaultView : t : window, be = (t) => u(t) && [\"TABLE\", \"TD\", \"TH\"].includes(t.nodeName) || !1, Ee = (t, e) => t.matches(e), D = (t) => f(t, \"position\") === \"static\", he = (t) => f(t, \"position\") === \"fixed\", $ = (t) => [\":popover-open\", \":modal\"].some((e) => {\n try {\n return Ee(t, e);\n } catch {\n return !1;\n }\n}), J = (t) => {\n const e = te(), n = i(t) ? getComputedStyle(t) : t;\n return n.transform !== \"none\" || n.perspective !== \"none\" || (n.containerType ? n.containerType !== \"normal\" : !1) || !e && (n.backdropFilter ? n.backdropFilter !== \"none\" : !1) || !e && (n.filter ? n.filter !== \"none\" : !1) || [\"transform\", \"perspective\", \"filter\"].some(\n (o) => (n.willChange || \"\").includes(o)\n ) || [\"paint\", \"layout\", \"strict\", \"content\"].some(\n (o) => (n.contain || \"\").includes(o)\n );\n}, ye = (t) => {\n let e = k(t);\n for (; i(e) && !x(e); ) {\n if (J(e))\n return e;\n if ($(e))\n return null;\n e = k(e);\n }\n return null;\n}, x = (t) => [\"html\", \"body\", \"#document\"].includes(ge(t)), B = (t) => {\n if (!b(t) || he(t))\n return null;\n let e = t.offsetParent;\n return w(t) === e && (e = e.ownerDocument.body), e;\n}, To = (t) => {\n const e = ve(t);\n if (!u(t) || $(t))\n return e;\n if (!b(t)) {\n let o = k(t);\n for (; o && !x(o); ) {\n if (i(o) && !D(o))\n return o;\n o = k(o);\n }\n return e;\n }\n let n = B(t);\n for (; n && be(n) && D(n); )\n n = B(n);\n return n && x(n) && D(n) && !J(n) ? e : n || ye(t) || e;\n}, we = (t) => {\n if (!b(t)) return !1;\n const { width: e, height: n } = y(t), { offsetWidth: o, offsetHeight: s } = t;\n return Math.round(e) !== o || Math.round(n) !== s;\n}, Co = (t, e, n) => {\n const o = b(e), s = y(\n t,\n o && we(e)\n ), r = { x: 0, y: 0 };\n if (o) {\n const a = y(e, !0);\n r.x = a.x + e.clientLeft, r.y = a.y + e.clientTop;\n }\n return {\n x: s.left + n.x - r.x,\n y: s.top + n.y - r.y,\n width: s.width,\n height: s.height\n };\n};\nlet V = 0, H = 0;\nconst h = /* @__PURE__ */ new Map(), Ae = (t, e) => {\n let n = e ? V : H;\n if (e) {\n const o = Ae(t), s = h.get(o) || /* @__PURE__ */ new Map();\n h.has(o) || h.set(o, s), O(s) && !s.has(e) ? (s.set(e, n), V += 1) : n = s.get(e);\n } else {\n const o = t.id || t;\n h.has(o) ? n = h.get(o) : (h.set(o, n), H += 1);\n }\n return n;\n}, Se = (t) => Array.isArray(t) || !1, Mo = (t) => u(t) && t.nodeName === \"CANVAS\" || !1, ke = (t) => b(t) && !!t.shadowRoot || !1, Do = (t) => {\n if (!u(t)) return !1;\n const { top: e, bottom: n } = y(t), { clientHeight: o } = w(t);\n return e <= o && n >= 0;\n}, Lo = (t) => {\n if (!i(t)) return !1;\n const { clientWidth: e, clientHeight: n } = w(t), { top: o, left: s, bottom: r, right: a } = y(t, !0);\n return o >= 0 && s >= 0 && r <= n && a <= e;\n}, Oo = (t) => Se(t) && t.every(i) || !1, xo = (t) => typeof t == \"function\" || !1, zo = (t) => v(t) && t.constructor.name === \"HTMLCollection\" || !1, Io = (t) => b(t) && t.tagName === \"IMG\" || !1, Po = (t) => {\n if (!N(t)) return !1;\n try {\n JSON.parse(t);\n } catch {\n return !1;\n }\n return !0;\n}, Fo = (t) => v(t) && t.constructor.name === \"WeakMap\" || !1, Bo = (t) => u(t) && [\"SVG\", \"Image\", \"Video\", \"Canvas\"].some(\n (e) => t.constructor.name.includes(e)\n) || !1, Vo = (t) => v(t) && t.constructor.name === \"NodeList\" || !1, Ho = (t) => w(t).dir === \"rtl\", Uo = (t) => u(t) && t.constructor.name.includes(\"SVG\") || !1, Ne = (t, e) => !t || !e ? null : t.closest(e) || Ne(t.getRootNode().host, e) || null, Wo = (t, e) => i(t) ? t : (i(e) ? e : d()).querySelector(t), Te = (t, e) => (u(e) ? e : d()).getElementsByTagName(\n t\n), Ro = (t) => [...Te(\"*\", t)].filter(ke), Qo = (t, e) => d(e).getElementById(t), jo = (t, e) => (e && u(e) ? e : d()).getElementsByClassName(\n t\n);\nexport {\n Yn as ArrayFrom,\n U as DOMContentLoadedEvent,\n st as DOMMouseScrollEvent,\n L as Data,\n ro as Float32ArrayFrom,\n co as Float64ArrayFrom,\n T as ObjectAssign,\n S as ObjectEntries,\n go as ObjectFromEntries,\n lo as ObjectHasOwn,\n fo as ObjectKeys,\n po as ObjectValues,\n ho as Timer,\n Y as abortEvent,\n Gn as addClass,\n An as addEventListener,\n fe as addFocusTrap,\n $t as animationDelay,\n _t as animationDuration,\n C as animationEndEvent,\n W as animationName,\n Me as ariaChecked,\n Le as ariaDescribedBy,\n De as ariaDescription,\n Oe as ariaExpanded,\n xe as ariaHasPopup,\n X as ariaHidden,\n ze as ariaLabel,\n Ie as ariaLabelledBy,\n Pe as ariaModal,\n Fe as ariaPressed,\n Be as ariaSelected,\n He as ariaValueMax,\n Ve as ariaValueMin,\n Ue as ariaValueNow,\n We as ariaValueText,\n tt as beforeunloadEvent,\n kn as bezierEasings,\n et as blurEvent,\n P as camelCase,\n eo as capitalize,\n nt as changeEvent,\n Ne as closest,\n ot as contextmenuEvent,\n mo as createCustomEvent,\n se as createElement,\n re as createElementNS,\n Z as dispatchEvent,\n no as distinct,\n $n as documentBody,\n Jn as documentElement,\n Xn as documentHead,\n Qe as dragEvent,\n Ze as dragendEvent,\n Ke as dragenterEvent,\n qe as dragleaveEvent,\n Ge as dragoverEvent,\n je as dragstartEvent,\n oo as emulateAnimationEnd,\n so as emulateTransitionEnd,\n rt as errorEvent,\n ao as focus,\n ct as focusEvent,\n tn as focusEvents,\n Zt as focusableSelector,\n at as focusinEvent,\n it as focusoutEvent,\n ut as gesturechangeEvent,\n lt as gestureendEvent,\n dt as gesturestartEvent,\n K as getAttribute,\n Wn as getAttributeNS,\n y as getBoundingClientRect,\n Ro as getCustomElements,\n d as getDocument,\n So as getDocumentBody,\n w as getDocumentElement,\n ko as getDocumentHead,\n ce as getElementAnimationDelay,\n ae as getElementAnimationDuration,\n Qo as getElementById,\n f as getElementStyle,\n ie as getElementTransitionDelay,\n ue as getElementTransitionDuration,\n jo as getElementsByClassName,\n Te as getElementsByTagName,\n to as getInstance,\n ge as getNodeName,\n No as getNodeScroll,\n To as getOffsetParent,\n k as getParentNode,\n Co as getRectRelativeToOffsetParent,\n Ae as getUID,\n ve as getWindow,\n _ as handleKeyboardNavigation,\n oe as hasAttribute,\n Rn as hasAttributeNS,\n _n as hasClass,\n I as hasFocusTrap,\n zn as isApple,\n Se as isArray,\n Mo as isCanvas,\n ke as isCustomElement,\n G as isDocument,\n i as isElement,\n Do as isElementInScrollRange,\n Lo as isElementInViewport,\n Oo as isElementsArray,\n In as isFirefox,\n xo as isFunction,\n zo as isHTMLCollection,\n b as isHTMLElement,\n Io as isHTMLImageElement,\n Po as isJSON,\n O as isMap,\n Bo as isMedia,\n xn as isMobile,\n u as isNode,\n Vo as isNodeList,\n le as isNumber,\n v as isObject,\n Ho as isRTL,\n Uo as isSVGElement,\n we as isScaledElement,\n me as isShadowRoot,\n N as isString,\n be as isTableElement,\n Fo as isWeakMap,\n te as isWebKit,\n q as isWindow,\n io as kebabCase,\n nn as keyAlt,\n on as keyArrowDown,\n rn as keyArrowLeft,\n cn as keyArrowRight,\n sn as keyArrowUp,\n an as keyBackspace,\n un as keyCapsLock,\n ln as keyControl,\n dn as keyDelete,\n fn as keyEnter,\n gn as keyEscape,\n mn as keyInsert,\n vn as keyMeta,\n pn as keyNumpadEnter,\n bn as keyPause,\n En as keyScrollLock,\n hn as keyShift,\n yn as keySpace,\n wn as keyTab,\n en as keyboardEventKeys,\n ft as keydownEvent,\n pt as keypressEvent,\n gt as keyupEvent,\n mt as loadEvent,\n _e as loadstartEvent,\n Ee as matches,\n Je as mouseClickEvents,\n Xe as mouseHoverEvents,\n $e as mouseSwipeEvents,\n vt as mouseclickEvent,\n bt as mousedblclickEvent,\n Et as mousedownEvent,\n wt as mouseenterEvent,\n yt as mousehoverEvent,\n St as mouseinEvent,\n At as mouseleaveEvent,\n Tt as mousemoveEvent,\n kt as mouseoutEvent,\n Nt as mouseoverEvent,\n ht as mouseupEvent,\n Ct as mousewheelEvent,\n Mt as moveEvent,\n Re as nativeEvents,\n ee as noop,\n uo as normalizeOptions,\n F as normalizeValue,\n j as off,\n Nn as offsetHeight,\n Tn as offsetWidth,\n Q as on,\n ne as one,\n Dt as orientationchangeEvent,\n vo as passiveHandler,\n Lt as pointercancelEvent,\n Ot as pointerdownEvent,\n xt as pointerleaveEvent,\n zt as pointermoveEvent,\n It as pointerupEvent,\n Wo as querySelector,\n de as querySelectorAll,\n Pt as readystatechangeEvent,\n bo as reflow,\n Kn as removeAttribute,\n qn as removeAttributeNS,\n Zn as removeClass,\n Sn as removeEventListener,\n pe as removeFocusTrap,\n Ft as resetEvent,\n Bt as resizeEvent,\n Wt as scrollEvent,\n Cn as scrollHeight,\n Mn as scrollWidth,\n Vt as selectEvent,\n Ht as selectendEvent,\n Ut as selectstartEvent,\n Qn as setAttribute,\n jn as setAttributeNS,\n Eo as setElementStyle,\n Rt as submitEvent,\n Pn as support3DTransform,\n Hn as supportAnimation,\n Fn as supportPassive,\n Vn as supportTouch,\n Bn as supportTransform,\n Un as supportTransition,\n Dn as tabindex,\n yo as toLowerCase,\n wo as toUpperCase,\n Ao as toggleFocusTrap,\n Ye as touchEvents,\n Kt as touchcancelEvent,\n qt as touchendEvent,\n jt as touchmoveEvent,\n Qt as touchstartEvent,\n Xt as transitionDelay,\n Jt as transitionDuration,\n M as transitionEndEvent,\n R as transitionProperty,\n Gt as unloadEvent,\n On as userAgent,\n Ln as userAgentData,\n Ce as version\n};\n//# sourceMappingURL=shorty.mjs.map\n","import { isElement, isFunction } from \"@thednp/shorty\";\n\n//#region package.json\nvar version = \"1.1.0\";\n\n//#endregion\n//#region src/index.ts\nconst callbackModes = [\n\t\"all\",\n\t\"intersecting\",\n\t\"update\"\n];\nconst errorString = \"PositionObserver Error\";\n/**\n* The PositionObserver class is a utility class that observes the position\n* of DOM elements and triggers a callback when their position changes.\n*/\nvar PositionObserver = class {\n\tentries;\n\tstatic version = version;\n\t/** `PositionObserver.tick` */\n\t_t;\n\t/** `PositionObserver.root` */\n\t_r;\n\t/** `PositionObserver.callbackMode` */\n\t_cm;\n\t/** `PositionObserver.root.clientWidth` */\n\t_w;\n\t/** `PositionObserver.root.clientHeight` */\n\t_h;\n\t/** `IntersectionObserver.options.rootMargin` */\n\t_rm;\n\t/** `IntersectionObserver.options.threshold` */\n\t_th;\n\t/** `PositionObserver.callback` */\n\t_c;\n\t/**\n\t* The constructor takes two arguments, a `callback`, which is called\n\t* whenever the position of an observed element changes and an `options` object.\n\t* The callback function takes an array of `PositionObserverEntry` objects\n\t* as its first argument and the PositionObserver instance as its second argument.\n\t*\n\t* @param callback the callback that applies to all targets of this observer\n\t* @param options the options of this observer\n\t*/\n\tconstructor(callback, options) {\n\t\tif (!isFunction(callback)) throw new Error(`${errorString}: ${callback} is not a function.`);\n\t\tthis.entries = /* @__PURE__ */ new Map();\n\t\tthis._c = callback;\n\t\tthis._t = 0;\n\t\tconst root = isElement(options?.root) ? options.root : document?.documentElement;\n\t\tthis._r = root;\n\t\tthis._rm = options?.rootMargin;\n\t\tthis._th = options?.threshold;\n\t\t/* istanbul ignore next @preserve */\n\t\tthis._cm = callbackModes.indexOf(options?.callbackMode || \"intersecting\");\n\t\tthis._w = root.clientWidth;\n\t\tthis._h = root.clientHeight;\n\t}\n\t/**\n\t* Start observing the position of the specified element.\n\t* If the element is not currently attached to the DOM,\n\t* it will NOT be added to the entries.\n\t*\n\t* @param target an `Element` target\n\t*/\n\tobserve = (target) => {\n\t\tif (!isElement(target)) throw new Error(`${errorString}: ${target} is not an instance of Element.`);\n\t\t/* istanbul ignore else @preserve - a guard must be set */\n\t\tif (!this._r.contains(target)) return;\n\t\tthis._n(target).then((ioEntry) => {\n\t\t\t/* istanbul ignore else @preserve - don't allow duplicate entries */\n\t\t\tif (ioEntry.boundingClientRect && !this.getEntry(target)) this.entries.set(target, ioEntry);\n\t\t\t/* istanbul ignore else @preserve */\n\t\t\tif (!this._t) this._t = requestAnimationFrame(this._rc);\n\t\t});\n\t};\n\t/**\n\t* Stop observing the position of the specified element.\n\t*\n\t* @param target an `Element` target\n\t*/\n\tunobserve = (target) => {\n\t\t/* istanbul ignore else @preserve */\n\t\tif (this.entries.has(target)) this.entries.delete(target);\n\t};\n\t/**\n\t* Private method responsible for all the heavy duty,\n\t* the observer's runtime.\n\t* `PositionObserver.runCallback`\n\t*/\n\t_rc = () => {\n\t\t/* istanbul ignore if @preserve - a guard must be set */\n\t\tif (!this.entries.size) {\n\t\t\tthis._t = 0;\n\t\t\treturn;\n\t\t}\n\t\tconst { clientWidth, clientHeight } = this._r;\n\t\tconst queue = new Promise((resolve) => {\n\t\t\tconst updates = [];\n\t\t\tthis.entries.forEach(({ target, boundingClientRect: oldBoundingBox, isIntersecting: oldIsIntersecting }) => {\n\t\t\t\t/* istanbul ignore if @preserve - a guard must be set when target has been removed */\n\t\t\t\tif (!this._r.contains(target)) return;\n\t\t\t\tthis._n(target).then((ioEntry) => {\n\t\t\t\t\t/* istanbul ignore if @preserve - make sure to only count visible entries */\n\t\t\t\t\tif (!ioEntry.isIntersecting) {\n\t\t\t\t\t\tif (this._cm === 1) return;\n\t\t\t\t\t\telse if (this._cm === 2) {\n\t\t\t\t\t\t\tif (oldIsIntersecting) {\n\t\t\t\t\t\t\t\tthis.entries.set(target, ioEntry);\n\t\t\t\t\t\t\t\tupdates.push(ioEntry);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst { left, top } = ioEntry.boundingClientRect;\n\t\t\t\t\t/* istanbul ignore else @preserve - only schedule entries that changed position */\n\t\t\t\t\tif (oldBoundingBox.top !== top || oldBoundingBox.left !== left || this._w !== clientWidth || this._h !== clientHeight) {\n\t\t\t\t\t\tthis.entries.set(target, ioEntry);\n\t\t\t\t\t\tupdates.push(ioEntry);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis._w = clientWidth;\n\t\t\tthis._h = clientHeight;\n\t\t\tresolve(updates);\n\t\t});\n\t\tthis._t = requestAnimationFrame(async () => {\n\t\t\tconst updates = await queue;\n\t\t\t/* istanbul ignore else @preserve */\n\t\t\tif (updates.length) this._c(updates, this);\n\t\t\tthis._rc();\n\t\t});\n\t};\n\t/**\n\t* Check intersection status and resolve it\n\t* right away.\n\t*\n\t* `PositionObserver.newEntryForTarget`\n\t*\n\t* @param target an `Element` target\n\t*/\n\t_n = (target) => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst intersectionObserver = new IntersectionObserver(([ioEntry], ob) => {\n\t\t\t\tob.disconnect();\n\t\t\t\tresolve(ioEntry);\n\t\t\t}, {\n\t\t\t\tthreshold: this._th,\n\t\t\t\trootMargin: this._rm\n\t\t\t});\n\t\t\tintersectionObserver.observe(target);\n\t\t});\n\t};\n\t/**\n\t* Find the entry for a given target.\n\t*\n\t* @param target an `HTMLElement` target\n\t*/\n\tgetEntry = (target) => this.entries.get(target);\n\t/**\n\t* Immediately stop observing all elements.\n\t*/\n\tdisconnect = () => {\n\t\tcancelAnimationFrame(this._t);\n\t\tthis.entries.clear();\n\t\tthis._t = 0;\n\t};\n};\n\n//#endregion\nexport { PositionObserver as default };\n//# sourceMappingURL=index.mjs.map","/**\r\n * Converts a JavaScript object into a readable method call string format.\r\n *\r\n * This utility is designed for copying object configurations and transforming them\r\n * into method call syntax for easy copy-pasting of global settings or configurations.\r\n *\r\n * @template T - The type of the input object, constrained to Record<string, any>\r\n * @param obj - The object to convert to method call format\r\n * @param methodName - The name of the method to wrap the object in (e.g., 'ForesightManager.initialize')\r\n * @returns A formatted string representing the object as a method call with proper indentation\r\n *\r\n */\r\nexport function objectToMethodCall<T extends Record<string, any>>(\r\n obj: T,\r\n methodName: string\r\n): string {\r\n const entries = Object.entries(obj) as Array<[keyof T, T[keyof T]]>\r\n\r\n // Filter out deprecated keys\r\n const filteredEntries = entries.filter(([key]) => {\r\n const keyStr = String(key)\r\n if (keyStr === \"resizeScrollThrottleDelay\") {\r\n return false\r\n }\r\n return true\r\n })\r\n\r\n const formattedEntries = filteredEntries\r\n .map(([key, value]) => ` ${String(key)}: ${formatValue(value)}`)\r\n .join(\",\\n\")\r\n\r\n return `${methodName}({\\n${formattedEntries}\\n})`\r\n}\r\n\r\n/**\r\n * Formats a value with proper indentation and type-appropriate string representation.\r\n *\r\n * @param value - The value to format (can be any type)\r\n * @param indent - The current indentation level (defaults to 2 spaces)\r\n * @returns A formatted string representation of the value\r\n */\r\nconst formatValue = (value: unknown, indent: number = 2): string => {\r\n const spaces = \" \".repeat(indent)\r\n\r\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n if (entries.length === 0) return \"{}\"\r\n\r\n const formattedEntries = entries\r\n .map(([key, val]) => `${spaces} ${key}: ${formatValue(val, indent + 2)}`)\r\n .join(\",\\n\")\r\n\r\n return `{\\n${formattedEntries}\\n${spaces}}`\r\n }\r\n\r\n if (typeof value === \"string\") return `'${value}'`\r\n if (typeof value === \"boolean\" || typeof value === \"number\") return String(value)\r\n if (value === null) return \"null\"\r\n if (value === undefined) return \"undefined\"\r\n if (Array.isArray(value)) return JSON.stringify(value)\r\n\r\n return String(value)\r\n}\r\n","type attributes = {\r\n className?: string\r\n data?: string\r\n id?: string\r\n}\r\n\r\nexport function createAndAppendElement(\r\n tag: string,\r\n parent: Node,\r\n attributes: attributes\r\n): HTMLElement {\r\n const element = document.createElement(tag)\r\n if (attributes.id) element.id = attributes.id\r\n if (attributes.className) element.className = attributes.className\r\n if (attributes.data) element.setAttribute(\"data-value\", attributes.data)\r\n return parent.appendChild(element)\r\n}\r\n\r\nexport function createAndAppendStyle(\r\n styleSheet: string,\r\n parent: Node,\r\n id: string\r\n): HTMLStyleElement {\r\n const element = document.createElement(\"style\")\r\n element.textContent = styleSheet\r\n element.id = id\r\n return parent.appendChild(element)\r\n}\r\n","export const getIntersectingIcon = (isIntersectingWithViewport: boolean): string =>\r\n isIntersectingWithViewport ? \"👁️\" : \"🚫\"\r\n","// DebuggerControlPanel.ts\r\nimport { ForesightManager } from \"js.foresight\"\r\nimport type {\r\n ForesightElementData,\r\n ForesightElement,\r\n ForesightManagerSettings,\r\n UpdateForsightManagerSettings,\r\n} from \"js.foresight\"\r\nimport type { DebuggerSettings, SortElementList, DebuggerBooleanSettingKeys } from \"../types\"\r\n\r\n// Define types that aren't exported from js.foresight but are needed internally\r\ntype NumericSettingKeys = keyof {\r\n [K in keyof UpdateForsightManagerSettings]: UpdateForsightManagerSettings[K] extends number\r\n ? K\r\n : never\r\n}\r\n\r\ntype ManagerBooleanSettingKeys = keyof {\r\n [K in keyof UpdateForsightManagerSettings]: UpdateForsightManagerSettings[K] extends boolean\r\n ? K\r\n : never\r\n}\r\n\r\nconst DEFAULT_IS_DEBUGGER_MINIMIZED = false\r\nconst DEFAULT_SHOW_NAME_TAGS = true\r\nconst MAX_POSITION_HISTORY_SIZE = 30\r\nconst MAX_SCROLL_MARGIN = 300\r\nconst MAX_TAB_OFFSET = 20\r\nconst MAX_TRAJECTORY_PREDICTION_TIME = 200\r\nconst MIN_POSITION_HISTORY_SIZE = 2\r\nconst MIN_SCROLL_MARGIN = 30\r\nconst MIN_TAB_OFFSET = 0\r\nconst MIN_TRAJECTORY_PREDICTION_TIME = 10\r\nconst POSITION_HISTORY_SIZE_UNIT = \"points\"\r\nconst SCROLL_MARGIN_UNIT = \"px\"\r\nconst TAB_OFFSET_UNIT = \"tabs\"\r\nconst TRAJECTORY_PREDICTION_TIME_UNIT = \"ms\"\r\n\r\nimport { objectToMethodCall } from \"./helpers/objectToMethodCall\"\r\nimport { createAndAppendStyle } from \"./helpers/createAndAppend\"\r\nimport { getIntersectingIcon } from \"./helpers/getIntersectingIcon\"\r\nimport type { ForesightDebugger } from \"./ForesightDebugger\"\r\n\r\ntype SectionStates = {\r\n mouse: boolean\r\n keyboard: boolean\r\n scroll: boolean\r\n general: boolean\r\n}\r\n\r\nconst COPY_SVG_ICON = `<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>`\r\nconst TICK_SVG_ICON = `<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>`\r\nconst SORT_SVG_ICON = `<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\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>`\r\nconst NO_ELEMENTS_STRING = \"<em>No elements registered.</em>\"\r\n\r\nexport class DebuggerControlPanel {\r\n private foresightManagerInstance: ForesightManager\r\n private debuggerInstance: ForesightDebugger\r\n private static debuggerControlPanelInstance: DebuggerControlPanel\r\n\r\n // These properties will be assigned in _setupDOMAndListeners\r\n private shadowRoot!: ShadowRoot\r\n private controlsContainer!: HTMLElement\r\n private controlPanelStyleElement!: HTMLStyleElement\r\n private elementListItemsContainer: HTMLElement | null = null\r\n private elementCountSpan: HTMLSpanElement | null = null\r\n private callbackCountSpan: HTMLSpanElement | null = null\r\n private elementListItems: Map<ForesightElement, HTMLElement> = new Map()\r\n\r\n private trajectoryEnabledCheckbox: HTMLInputElement | null = null\r\n private tabEnabledCheckbox: HTMLInputElement | null = null\r\n private scrollEnabledCheckbox: HTMLInputElement | null = null\r\n private historySizeSlider: HTMLInputElement | null = null\r\n private historyValueSpan: HTMLSpanElement | null = null\r\n private predictionTimeSlider: HTMLInputElement | null = null\r\n private predictionValueSpan: HTMLSpanElement | null = null\r\n private tabOffsetSlider: HTMLInputElement | null = null\r\n private tabOffsetValueSpan: HTMLSpanElement | null = null\r\n private scrollMarginSlider: HTMLInputElement | null = null\r\n private scrollMarginValueSpan: HTMLSpanElement | null = null\r\n private showNameTagsCheckbox: HTMLInputElement | null = null\r\n private sortOptionsPopup: HTMLDivElement | null = null\r\n private sortButton: HTMLButtonElement | null = null\r\n\r\n private containerMinimizeButton: HTMLButtonElement | null = null\r\n private allSettingsSectionsContainer: HTMLElement | null = null\r\n private debuggerElementsSection: HTMLElement | null = null\r\n private isContainerMinimized: boolean = false\r\n\r\n private isMouseSettingsMinimized: boolean = true\r\n private isKeyboardSettingsMinimized: boolean = true\r\n private isScrollSettingsMinimized: boolean = true\r\n private isGeneralSettingsMinimized: boolean = true\r\n private readonly SESSION_STORAGE_KEY = \"jsforesightDebuggerSectionStates\"\r\n\r\n private copySettingsButton: HTMLButtonElement | null = null\r\n private minimizedElementCount: HTMLSpanElement | null = null\r\n private copyTimeoutId: ReturnType<typeof setTimeout> | null = null\r\n private closeSortDropdownHandler: ((e: MouseEvent) => void) | null = null\r\n\r\n private constructor(foresightManager: ForesightManager, debuggerInstance: ForesightDebugger) {\r\n this.foresightManagerInstance = foresightManager\r\n this.debuggerInstance = debuggerInstance\r\n }\r\n\r\n /**\r\n * The initialize method now creates the instance if needed,\r\n * then calls the setup method to ensure the UI is ready.\r\n */\r\n public static initialize(\r\n foresightManager: ForesightManager,\r\n debuggerInstance: ForesightDebugger,\r\n shadowRoot: ShadowRoot,\r\n debuggerSettings: DebuggerSettings\r\n ): DebuggerControlPanel {\r\n if (!DebuggerControlPanel.isInitiated) {\r\n DebuggerControlPanel.debuggerControlPanelInstance = new DebuggerControlPanel(\r\n foresightManager,\r\n debuggerInstance\r\n )\r\n }\r\n\r\n const instance = DebuggerControlPanel.debuggerControlPanelInstance\r\n\r\n // This will build the DOM on first run or rebuild it on subsequent runs after cleanup.\r\n instance._setupDOMAndListeners(shadowRoot, debuggerSettings)\r\n\r\n return instance\r\n }\r\n\r\n /**\r\n * All DOM creation and event listener setup logic is moved here.\r\n * This method can be called to \"revive\" a cleaned-up instance.\r\n */\r\n private _setupDOMAndListeners(shadowRoot: ShadowRoot, debuggerSettings: DebuggerSettings) {\r\n // Guard clause to prevent re-running if the UI is already active.\r\n if (this.controlsContainer) {\r\n return\r\n }\r\n\r\n this.shadowRoot = shadowRoot\r\n this.isContainerMinimized = debuggerSettings.isControlPanelDefaultMinimized\r\n this.controlsContainer = this.createControlContainer()\r\n this.shadowRoot.appendChild(this.controlsContainer)\r\n\r\n this.controlPanelStyleElement = createAndAppendStyle(\r\n this.getStyles(),\r\n this.shadowRoot,\r\n \"debug-control-panel\"\r\n )\r\n this.queryDOMElements()\r\n this.originalSectionStates()\r\n this.setupEventListeners()\r\n this.updateContainerVisibilityState()\r\n this.updateControlsState(\r\n this.foresightManagerInstance.getManagerData.globalSettings,\r\n debuggerSettings\r\n )\r\n }\r\n\r\n private static get isInitiated(): boolean {\r\n return !!DebuggerControlPanel.debuggerControlPanelInstance\r\n }\r\n\r\n private loadSectionStatesFromSessionStorage(): Partial<SectionStates> {\r\n const storedStatesRaw = sessionStorage.getItem(this.SESSION_STORAGE_KEY)\r\n let loadedStates: Partial<SectionStates> = {}\r\n\r\n if (storedStatesRaw) {\r\n loadedStates = JSON.parse(storedStatesRaw)\r\n }\r\n\r\n this.isMouseSettingsMinimized = loadedStates.mouse ?? true\r\n this.isKeyboardSettingsMinimized = loadedStates.keyboard ?? true\r\n this.isScrollSettingsMinimized = loadedStates.scroll ?? true\r\n this.isGeneralSettingsMinimized = loadedStates.general ?? true\r\n return loadedStates\r\n }\r\n\r\n private saveSectionStatesToSessionStorage() {\r\n const states: SectionStates = {\r\n mouse: this.isMouseSettingsMinimized,\r\n keyboard: this.isKeyboardSettingsMinimized,\r\n scroll: this.isScrollSettingsMinimized,\r\n general: this.isGeneralSettingsMinimized,\r\n }\r\n try {\r\n sessionStorage.setItem(this.SESSION_STORAGE_KEY, JSON.stringify(states))\r\n } catch (e) {\r\n console.error(\"Foresight Debugger: Could not save section states to session storage.\", e)\r\n }\r\n }\r\n\r\n private queryDOMElements() {\r\n this.trajectoryEnabledCheckbox = this.controlsContainer.querySelector(\"#trajectory-enabled\")\r\n this.tabEnabledCheckbox = this.controlsContainer.querySelector(\"#tab-enabled\")\r\n this.scrollEnabledCheckbox = this.controlsContainer.querySelector(\"#scroll-enabled\")\r\n this.historySizeSlider = this.controlsContainer.querySelector(\"#history-size\")\r\n this.historyValueSpan = this.controlsContainer.querySelector(\"#history-value\")\r\n this.predictionTimeSlider = this.controlsContainer.querySelector(\"#prediction-time\")\r\n this.predictionValueSpan = this.controlsContainer.querySelector(\"#prediction-value\")\r\n this.tabOffsetSlider = this.controlsContainer.querySelector(\"#tab-offset\")\r\n this.tabOffsetValueSpan = this.controlsContainer.querySelector(\"#tab-offset-value\")\r\n this.scrollMarginSlider = this.controlsContainer.querySelector(\"#scroll-margin\")\r\n this.scrollMarginValueSpan = this.controlsContainer.querySelector(\"#scroll-margin-value\")\r\n this.elementListItemsContainer = this.controlsContainer.querySelector(\r\n \"#element-list-items-container\"\r\n )\r\n this.showNameTagsCheckbox = this.controlsContainer.querySelector(\"#toggle-name-tags\")\r\n this.sortOptionsPopup = this.controlsContainer.querySelector(\"#sort-options-popup\")\r\n this.sortButton = this.controlsContainer.querySelector(\".sort-button\")\r\n this.elementCountSpan = this.controlsContainer.querySelector(\"#element-count\")\r\n this.callbackCountSpan = this.controlsContainer.querySelector(\"#callback-count\")\r\n this.containerMinimizeButton = this.controlsContainer.querySelector(\".minimize-button\")\r\n this.allSettingsSectionsContainer = this.controlsContainer.querySelector(\r\n \".all-settings-sections-container\"\r\n )\r\n this.debuggerElementsSection = this.controlsContainer.querySelector(\".debugger-elements\")\r\n this.copySettingsButton = this.controlsContainer.querySelector(\".copy-settings-button\")\r\n this.minimizedElementCount = this.controlsContainer.querySelector(\".minimized-element-count\")\r\n }\r\n\r\n private handleCopySettings() {\r\n if (!this.copySettingsButton) return\r\n navigator.clipboard\r\n .writeText(\r\n objectToMethodCall(\r\n this.foresightManagerInstance.getManagerData.globalSettings,\r\n \"ForesightManager.initialize\"\r\n )\r\n )\r\n .then(() => {\r\n this.copySettingsButton!.innerHTML = TICK_SVG_ICON\r\n if (this.copyTimeoutId) {\r\n clearTimeout(this.copyTimeoutId)\r\n }\r\n this.copyTimeoutId = setTimeout(() => {\r\n if (this.copySettingsButton) {\r\n this.copySettingsButton.innerHTML = COPY_SVG_ICON\r\n }\r\n this.copyTimeoutId = null\r\n }, 3000)\r\n })\r\n .catch(err => {\r\n console.error(\"Foresight Debugger: Could not copy settings to clipboard\", err)\r\n })\r\n }\r\n\r\n private createInputEventListener(\r\n element: HTMLInputElement | null,\r\n spanElement: HTMLSpanElement | null,\r\n unit: string,\r\n setting: NumericSettingKeys\r\n ) {\r\n if (!element || !spanElement) {\r\n return\r\n }\r\n element.addEventListener(\"input\", e => {\r\n const value = parseInt((e.target as HTMLInputElement).value, 10)\r\n spanElement.textContent = `${value} ${unit}`\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n [setting]: value,\r\n })\r\n })\r\n }\r\n\r\n private createChangeEventListener(\r\n element: HTMLElement | null,\r\n setting: ManagerBooleanSettingKeys | DebuggerBooleanSettingKeys\r\n ) {\r\n if (!element) {\r\n return\r\n }\r\n\r\n // This is the crucial part. We get an object representing the debugger's\r\n // settings so we can check against it at runtime.\r\n // Replace `this.debuggerInstance.settings` with however you access\r\n // the settings object on your instance.\r\n const debuggerSettings = this.debuggerInstance.getDebuggerData.settings\r\n\r\n element.addEventListener(\"change\", e => {\r\n const isChecked = (e.target as HTMLInputElement).checked\r\n\r\n // The `in` operator checks if the key (e.g., \"showOverlay\") exists on the\r\n // debuggerSettings object. This is a true runtime check.\r\n if (setting in debuggerSettings) {\r\n // Although we've confirmed the key belongs to the debugger, TypeScript's\r\n // control flow analysis doesn't automatically narrow the type of the\r\n // `setting` variable itself here.\r\n // So, we use a type assertion to satisfy the compiler.\r\n this.debuggerInstance.alterDebuggerSettings({\r\n [setting]: isChecked,\r\n } as Partial<DebuggerSettings>)\r\n } else {\r\n // If the key is not in debuggerSettings, it must be a manager setting.\r\n this.foresightManagerInstance.alterGlobalSettings({\r\n [setting]: isChecked,\r\n } as Partial<UpdateForsightManagerSettings>)\r\n }\r\n })\r\n }\r\n\r\n private createSectionVisibilityToggleEventListener(\r\n section: HTMLDivElement | null,\r\n isMinimizedFlagName:\r\n | \"isMouseSettingsMinimized\"\r\n | \"isKeyboardSettingsMinimized\"\r\n | \"isScrollSettingsMinimized\"\r\n | \"isGeneralSettingsMinimized\"\r\n ) {\r\n const sectionHeader = section?.querySelector(\".debugger-section-header\")\r\n sectionHeader?.addEventListener(\"click\", e => {\r\n e.stopPropagation()\r\n this.toggleMinimizeSection(section, (this[isMinimizedFlagName] = !this[isMinimizedFlagName]))\r\n })\r\n }\r\n\r\n private setupEventListeners() {\r\n this.createChangeEventListener(this.trajectoryEnabledCheckbox, \"enableMousePrediction\")\r\n this.createChangeEventListener(this.tabEnabledCheckbox, \"enableTabPrediction\")\r\n this.createChangeEventListener(this.scrollEnabledCheckbox, \"enableScrollPrediction\")\r\n this.createChangeEventListener(this.showNameTagsCheckbox, \"showNameTags\")\r\n this.createInputEventListener(\r\n this.historySizeSlider,\r\n this.historyValueSpan,\r\n POSITION_HISTORY_SIZE_UNIT,\r\n \"positionHistorySize\"\r\n )\r\n\r\n this.createInputEventListener(\r\n this.predictionTimeSlider,\r\n this.predictionValueSpan,\r\n TRAJECTORY_PREDICTION_TIME_UNIT,\r\n \"trajectoryPredictionTime\"\r\n )\r\n\r\n this.createInputEventListener(\r\n this.tabOffsetSlider,\r\n this.tabOffsetValueSpan,\r\n TAB_OFFSET_UNIT,\r\n \"tabOffset\"\r\n )\r\n\r\n this.createInputEventListener(\r\n this.scrollMarginSlider,\r\n this.scrollMarginValueSpan,\r\n SCROLL_MARGIN_UNIT,\r\n \"scrollMargin\"\r\n )\r\n\r\n this.sortButton?.addEventListener(\"click\", e => {\r\n e.stopPropagation()\r\n this.sortOptionsPopup?.classList.toggle(\"active\")\r\n })\r\n\r\n this.sortOptionsPopup?.addEventListener(\"click\", e => {\r\n const target = e.target as HTMLElement\r\n const sortButton = target.closest(\"[data-sort]\") as HTMLElement | null\r\n if (!sortButton) return\r\n\r\n const value = sortButton.dataset.sort as SortElementList\r\n this.debuggerInstance.alterDebuggerSettings({\r\n sortElementList: value,\r\n })\r\n this.sortAndReorderElements()\r\n this.updateSortOptionUI(value)\r\n this.sortOptionsPopup?.classList.remove(\"active\")\r\n })\r\n\r\n this.closeSortDropdownHandler = (e: MouseEvent) => {\r\n if (\r\n this.sortOptionsPopup?.classList.contains(\"active\") &&\r\n !this.sortButton?.contains(e.target as Node)\r\n ) {\r\n this.sortOptionsPopup.classList.remove(\"active\")\r\n }\r\n }\r\n document.addEventListener(\"click\", this.closeSortDropdownHandler)\r\n\r\n this.containerMinimizeButton?.addEventListener(\"click\", () => {\r\n this.isContainerMinimized = !this.isContainerMinimized\r\n this.updateContainerVisibilityState()\r\n })\r\n this.copySettingsButton?.addEventListener(\"click\", this.handleCopySettings.bind(this))\r\n\r\n this.createSectionVisibilityToggleEventListener(\r\n this.controlsContainer.querySelector(\".mouse-settings-section\"),\r\n \"isMouseSettingsMinimized\"\r\n )\r\n this.createSectionVisibilityToggleEventListener(\r\n this.controlsContainer.querySelector(\".keyboard-settings-section\"),\r\n \"isKeyboardSettingsMinimized\"\r\n )\r\n this.createSectionVisibilityToggleEventListener(\r\n this.controlsContainer.querySelector(\".scroll-settings-section\"),\r\n \"isScrollSettingsMinimized\"\r\n )\r\n this.createSectionVisibilityToggleEventListener(\r\n this.controlsContainer.querySelector(\".general-settings-section\"),\r\n \"isGeneralSettingsMinimized\"\r\n )\r\n }\r\n\r\n private toggleMinimizeSection(section: HTMLDivElement | null, shouldMinimize: boolean) {\r\n if (!section) {\r\n return\r\n }\r\n const sectionContent: HTMLDivElement | null = section.querySelector(\".debugger-section-content\")\r\n const minimizeButton: HTMLButtonElement | null = section.querySelector(\r\n \".section-minimize-button\"\r\n )\r\n if (sectionContent && minimizeButton) {\r\n if (shouldMinimize) {\r\n sectionContent.style.display = \"none\"\r\n minimizeButton.textContent = \"+\"\r\n } else {\r\n sectionContent.style.display = \"flex\"\r\n minimizeButton.textContent = \"-\"\r\n }\r\n }\r\n this.saveSectionStatesToSessionStorage()\r\n }\r\n\r\n private originalSectionStates() {\r\n const states = this.loadSectionStatesFromSessionStorage()\r\n this.toggleMinimizeSection(\r\n this.controlsContainer.querySelector(\".mouse-settings-section\"),\r\n states.mouse ?? true\r\n )\r\n this.toggleMinimizeSection(\r\n this.controlsContainer.querySelector(\".keyboard-settings-section\"),\r\n states.keyboard ?? true\r\n )\r\n this.toggleMinimizeSection(\r\n this.controlsContainer.querySelector(\".scroll-settings-section\"),\r\n states.scroll ?? true\r\n )\r\n this.toggleMinimizeSection(\r\n this.controlsContainer.querySelector(\".general-settings-section\"),\r\n states.general ?? true\r\n )\r\n // Ensure the element list is always open by default\r\n const elementListContent = this.debuggerElementsSection?.querySelector(\r\n \".debugger-section-content\"\r\n )\r\n if (elementListContent) {\r\n ;(elementListContent as HTMLElement).style.display = \"flex\"\r\n }\r\n }\r\n\r\n private updateContainerVisibilityState() {\r\n if (!this.containerMinimizeButton) return\r\n if (this.isContainerMinimized) {\r\n this.controlsContainer.classList.add(\"minimized\")\r\n this.containerMinimizeButton.textContent = \"+\"\r\n if (this.allSettingsSectionsContainer)\r\n this.allSettingsSectionsContainer.style.display = \"none\"\r\n if (this.debuggerElementsSection) this.debuggerElementsSection.style.display = \"none\"\r\n if (this.copySettingsButton) this.copySettingsButton.style.display = \"none\"\r\n if (this.minimizedElementCount) this.minimizedElementCount.style.display = \"\"\r\n } else {\r\n this.controlsContainer.classList.remove(\"minimized\")\r\n this.containerMinimizeButton.textContent = \"-\"\r\n if (this.allSettingsSectionsContainer) this.allSettingsSectionsContainer.style.display = \"\"\r\n if (this.debuggerElementsSection) this.debuggerElementsSection.style.display = \"\"\r\n if (this.copySettingsButton) this.copySettingsButton.style.display = \"\"\r\n if (this.minimizedElementCount) this.minimizedElementCount.style.display = \"none\"\r\n }\r\n }\r\n\r\n // Adds a tick before the choosen sort option\r\n private updateSortOptionUI(currentSort: SortElementList) {\r\n this.sortOptionsPopup?.querySelectorAll(\"[data-sort]\").forEach(button => {\r\n const btn = button as HTMLElement\r\n if (btn.dataset.sort === currentSort) {\r\n btn.classList.add(\"active-sort-option\")\r\n } else {\r\n btn.classList.remove(\"active-sort-option\")\r\n }\r\n })\r\n }\r\n\r\n public updateControlsState(\r\n managerSettings: ForesightManagerSettings,\r\n debuggerSettings: DebuggerSettings\r\n ) {\r\n if (this.trajectoryEnabledCheckbox) {\r\n this.trajectoryEnabledCheckbox.checked = managerSettings.enableMousePrediction\r\n }\r\n if (this.tabEnabledCheckbox) {\r\n this.tabEnabledCheckbox.checked = managerSettings.enableTabPrediction\r\n }\r\n if (this.scrollEnabledCheckbox) {\r\n this.scrollEnabledCheckbox.checked = managerSettings.enableScrollPrediction\r\n }\r\n if (this.showNameTagsCheckbox) {\r\n this.showNameTagsCheckbox.checked = debuggerSettings.showNameTags\r\n }\r\n this.updateSortOptionUI(debuggerSettings.sortElementList ?? \"visibility\")\r\n if (this.historySizeSlider && this.historyValueSpan) {\r\n this.historySizeSlider.value = managerSettings.positionHistorySize.toString()\r\n this.historyValueSpan.textContent = `${managerSettings.positionHistorySize} ${POSITION_HISTORY_SIZE_UNIT}`\r\n }\r\n if (this.predictionTimeSlider && this.predictionValueSpan) {\r\n this.predictionTimeSlider.value = managerSettings.trajectoryPredictionTime.toString()\r\n this.predictionValueSpan.textContent = `${managerSettings.trajectoryPredictionTime} ${TRAJECTORY_PREDICTION_TIME_UNIT}`\r\n }\r\n if (this.tabOffsetSlider && this.tabOffsetValueSpan) {\r\n this.tabOffsetSlider.value = managerSettings.tabOffset.toString()\r\n this.tabOffsetValueSpan.textContent = `${managerSettings.tabOffset} ${TAB_OFFSET_UNIT}`\r\n }\r\n if (this.scrollMarginSlider && this.scrollMarginValueSpan) {\r\n this.scrollMarginSlider.value = managerSettings.scrollMargin.toString()\r\n this.scrollMarginValueSpan.textContent = `${managerSettings.scrollMargin} ${SCROLL_MARGIN_UNIT}`\r\n }\r\n }\r\n\r\n private refreshRegisteredElementCountDisplay(\r\n elementsMap: ReadonlyMap<Element, ForesightElementData>\r\n ) {\r\n if (!this.elementCountSpan || !this.callbackCountSpan) {\r\n return\r\n }\r\n\r\n let visibleElementCount = 0\r\n elementsMap.forEach(data => {\r\n if (data.isIntersectingWithViewport) {\r\n visibleElementCount++\r\n }\r\n })\r\n const totalElements = elementsMap.size\r\n const { tab, mouse, scroll, total } =\r\n this.foresightManagerInstance.getManagerData.globalCallbackHits\r\n const visibleTitle = [\r\n \"Element Visibility Status\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n `Visible in Viewport: ${visibleElementCount}`,\r\n `Not in Viewport: ${totalElements - visibleElementCount}`,\r\n `Total Registered Elements: ${totalElements}`,\r\n \"\",\r\n \"Note: Only elements visible in the viewport\",\r\n \"are actively tracked by intersection observers.\",\r\n ]\r\n if (this.minimizedElementCount) {\r\n this.minimizedElementCount.textContent = `${visibleElementCount}/${totalElements}`\r\n this.minimizedElementCount.title = visibleTitle.join(\"\\n\")\r\n }\r\n\r\n this.elementCountSpan.textContent = `Visible: ${visibleElementCount}/${totalElements} ~ `\r\n this.elementCountSpan.title = visibleTitle.join(\"\\n\")\r\n this.callbackCountSpan.textContent = `Mouse: ${mouse.hover + mouse.trajectory} Tab: ${\r\n tab.forwards + tab.reverse\r\n } Scroll: ${scroll.down + scroll.left + scroll.right + scroll.up}`\r\n this.callbackCountSpan.title = [\r\n \"Callback Execution Stats\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Mouse Callbacks\",\r\n ` • Trajectory: ${mouse.trajectory}`,\r\n ` • Hover: ${mouse.hover}`,\r\n ` • Subtotal: ${mouse.hover + mouse.trajectory}`,\r\n \"\",\r\n \"Keyboard Callbacks:\",\r\n ` • Tab Forward: ${tab.forwards}`,\r\n ` • Tab Reverse: ${tab.reverse}`,\r\n ` • Subtotal: ${tab.forwards + tab.reverse}`,\r\n \"\",\r\n \"Scroll Callbacks:\",\r\n ` • Up: ${scroll.up} | Down: ${scroll.down}`,\r\n ` • Left: ${scroll.left} | Right: ${scroll.right}`,\r\n ` • Subtotal: ${scroll.up + scroll.down + scroll.left + scroll.right}`,\r\n \"\",\r\n \"Total Callbacks: \" + total,\r\n ].join(\"\\n\")\r\n }\r\n\r\n public removeElementFromList(elementData: ForesightElementData) {\r\n if (!this.elementListItemsContainer) return\r\n\r\n const listItem = this.elementListItems.get(elementData.element)\r\n\r\n if (listItem) {\r\n listItem.remove()\r\n this.elementListItems.delete(elementData.element)\r\n const elementsMap = this.foresightManagerInstance.registeredElements\r\n this.refreshRegisteredElementCountDisplay(elementsMap)\r\n\r\n if (this.elementListItems.size === 0) {\r\n this.elementListItemsContainer.innerHTML = NO_ELEMENTS_STRING\r\n }\r\n }\r\n }\r\n\r\n public updateElementVisibilityStatus(elementData: ForesightElementData) {\r\n if (!this.elementListItemsContainer) return\r\n const listItem = this.elementListItems.get(elementData.element)\r\n if (!listItem) {\r\n this.addElementToList(elementData)\r\n return\r\n }\r\n\r\n listItem.classList.toggle(\"not-in-viewport\", !elementData.isIntersectingWithViewport)\r\n const intersectingElement = listItem.querySelector(\".intersecting-indicator\")\r\n if (intersectingElement) {\r\n const intersectingIcon = getIntersectingIcon(elementData.isIntersectingWithViewport)\r\n intersectingElement.textContent = intersectingIcon\r\n }\r\n this.refreshRegisteredElementCountDisplay(this.foresightManagerInstance.registeredElements)\r\n this.sortAndReorderElements()\r\n }\r\n\r\n private sortAndReorderElements() {\r\n if (!this.elementListItemsContainer) return\r\n\r\n const sortOrder = this.debuggerInstance.getDebuggerData.settings.sortElementList ?? \"visibility\"\r\n\r\n const elementsData = Array.from(this.foresightManagerInstance.registeredElements.values())\r\n\r\n if (sortOrder !== \"insertionOrder\") {\r\n const sortByDocumentPosition = (a: ForesightElementData, b: ForesightElementData) => {\r\n const position = a.element.compareDocumentPosition(b.element)\r\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1\r\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1\r\n return 0\r\n }\r\n\r\n if (sortOrder === \"visibility\") {\r\n elementsData.sort((a, b) => {\r\n if (a.isIntersectingWithViewport !== b.isIntersectingWithViewport) {\r\n return a.isIntersectingWithViewport ? -1 : 1\r\n }\r\n return sortByDocumentPosition(a, b)\r\n })\r\n } else if (sortOrder === \"documentOrder\") {\r\n elementsData.sort(sortByDocumentPosition)\r\n }\r\n }\r\n\r\n const fragment = document.createDocumentFragment()\r\n\r\n if (elementsData.length) {\r\n elementsData.forEach(elementData => {\r\n const listItem = this.elementListItems.get(elementData.element)\r\n if (listItem) {\r\n // Appending to the fragment is cheap (it's off-screen)\r\n fragment.appendChild(listItem)\r\n }\r\n })\r\n\r\n this.elementListItemsContainer.innerHTML = \"\"\r\n this.elementListItemsContainer.appendChild(fragment)\r\n }\r\n }\r\n\r\n public addElementToList(elementData: ForesightElementData, sort: boolean = true) {\r\n if (!this.elementListItemsContainer) return\r\n if (this.elementListItemsContainer.innerHTML === NO_ELEMENTS_STRING) {\r\n this.elementListItemsContainer.innerHTML = \"\"\r\n }\r\n if (this.elementListItems.has(elementData.element)) return\r\n const listItem = document.createElement(\"div\")\r\n listItem.className = \"element-list-item\"\r\n this.updateListItemContent(listItem, elementData)\r\n this.elementListItemsContainer!.appendChild(listItem)\r\n this.elementListItems.set(elementData.element, listItem)\r\n this.refreshRegisteredElementCountDisplay(this.foresightManagerInstance.registeredElements)\r\n if (sort) {\r\n this.sortAndReorderElements()\r\n }\r\n }\r\n\r\n private updateListItemContent(listItem: HTMLElement, elementData: ForesightElementData) {\r\n // Determine the viewport icon based on current visibility status\r\n const intersectingIcon = getIntersectingIcon(elementData.isIntersectingWithViewport)\r\n listItem.classList.toggle(\"not-in-viewport\", !elementData.isIntersectingWithViewport)\r\n\r\n let hitSlopText = \"N/A\"\r\n\r\n if (elementData.elementBounds.hitSlop) {\r\n const { top, right, bottom, left } = elementData.elementBounds.hitSlop\r\n hitSlopText = `T:${top} R:${right} B:${bottom} L:${left}`\r\n }\r\n\r\n // Create comprehensive title with all information\r\n const comprehensiveTitle = [\r\n `${elementData.name || \"Unnamed Element\"}`,\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Viewport Status:\",\r\n elementData.isIntersectingWithViewport\r\n ? \" ✓ In viewport - actively tracked by observers\"\r\n : \" ✗ Not in viewport - not being tracked\",\r\n \"\",\r\n \"Hit Slop:\",\r\n elementData.elementBounds.hitSlop\r\n ? [\r\n ` Top: ${elementData.elementBounds.hitSlop.top}px, Bottom: ${elementData.elementBounds.hitSlop.bottom}px `,\r\n ` Right: ${elementData.elementBounds.hitSlop.right}px, Left: ${elementData.elementBounds.hitSlop.left}px`,\r\n ].join(\"\\n\")\r\n : \" • Not defined - using element's natural boundaries\",\r\n \"\",\r\n ].join(\"\\n\")\r\n\r\n listItem.title = comprehensiveTitle\r\n\r\n listItem.innerHTML = `\r\n <span class=\"intersecting-indicator\">${intersectingIcon}</span>\r\n <span class=\"element-name\">${elementData.name || \"Unnamed Element\"}</span>\r\n <span class=\"hit-slop\">${hitSlopText}</span>\r\n `\r\n }\r\n /**\r\n * The cleanup method is updated to be more thorough, nullifying all\r\n * DOM-related properties to put the instance in a dormant state.\r\n */\r\n public cleanup() {\r\n this.controlsContainer?.remove()\r\n this.controlPanelStyleElement?.remove()\r\n\r\n if (this.copyTimeoutId) {\r\n clearTimeout(this.copyTimeoutId)\r\n this.copyTimeoutId = null\r\n }\r\n\r\n if (this.closeSortDropdownHandler) {\r\n document.removeEventListener(\"click\", this.closeSortDropdownHandler)\r\n this.closeSortDropdownHandler = null\r\n }\r\n\r\n // Nullify all DOM-related properties to signal it's \"cleaned up\"\r\n this.controlsContainer = null!\r\n this.controlPanelStyleElement = null!\r\n this.elementListItemsContainer = null\r\n this.elementCountSpan = null\r\n this.callbackCountSpan = null\r\n this.elementListItems.clear()\r\n this.containerMinimizeButton = null\r\n this.allSettingsSectionsContainer = null\r\n this.debuggerElementsSection = null\r\n this.trajectoryEnabledCheckbox = null\r\n this.tabEnabledCheckbox = null\r\n this.scrollEnabledCheckbox = null\r\n this.historySizeSlider = null\r\n this.historyValueSpan = null\r\n this.predictionTimeSlider = null\r\n this.predictionValueSpan = null\r\n this.tabOffsetSlider = null\r\n this.tabOffsetValueSpan = null\r\n this.scrollMarginSlider = null\r\n this.scrollMarginValueSpan = null\r\n this.showNameTagsCheckbox = null\r\n this.sortOptionsPopup = null\r\n this.sortButton = null\r\n this.copySettingsButton = null\r\n }\r\n\r\n private createControlContainer(): HTMLElement {\r\n const container = document.createElement(\"div\")\r\n container.id = \"debug-controls\"\r\n container.innerHTML = /* html */ `\r\n <div class=\"debugger-title-container\">\r\n <button class=\"minimize-button\">-</button>\r\n <div class=\"title-group\">\r\n <h2>Foresight Debugger</h2>\r\n <span class=\"info-icon\" title=\"${[\r\n \"Foresight Debugger Information\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Session-Only Changes:\",\r\n \"All adjustments made here apply only to the\",\r\n \"current browser session and won't persist.\",\r\n \"\",\r\n \"Permanent Configuration:\",\r\n \"To make lasting changes, update the initial\",\r\n \"values in your ForesightManager.initialize().\",\r\n \"\",\r\n \"You can copy the current debugger settings\",\r\n \"with the button on the right\",\r\n ].join(\"\\n\")}\">i</span>\r\n </div>\r\n <button class=\"copy-settings-button\" title=\"${[\r\n \"Copy Settings to Clipboard\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Copies the current configuration as a\",\r\n \"formatted method call that you can paste\",\r\n \"directly into your code.\",\r\n ].join(\"\\n\")}\">\r\n ${COPY_SVG_ICON}\r\n </button>\r\n <span class=\"minimized-element-count\">\r\n </span>\r\n </div>\r\n\r\n <div class=\"all-settings-sections-container\">\r\n <div class=\"debugger-section mouse-settings-section\">\r\n <div class=\"debugger-section-header collapsible\">\r\n <h3>Mouse Settings</h3>\r\n <button class=\"section-minimize-button\">-</button>\r\n </div>\r\n <div class=\"debugger-section-content mouse-settings-content\">\r\n <div class=\"control-row\">\r\n <label for=\"trajectory-enabled\">\r\n Enable Mouse Prediction\r\n <span class=\"info-icon\" title=\"${[\r\n \"Mouse Prediction Control\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"When enabled: Predicts mouse movement\",\r\n \"trajectory and triggers callbacks before\",\r\n \"the cursor reaches the target element.\",\r\n \"\",\r\n \"When disabled: Only direct hover events\",\r\n \"trigger actions (next to tab/scroll).\",\r\n \"\",\r\n \"Property: enableMousePrediction\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"checkbox\" id=\"trajectory-enabled\">\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"history-size\">\r\n History Size\r\n <span class=\"info-icon\" title=\"${[\r\n \"Position History\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Controls how many past mouse positions\",\r\n \"are stored for velocity calculations.\",\r\n \"\",\r\n \"Higher values:\",\r\n \" • More accurate trajectory predictions\",\r\n \" • Smoother movement detection\",\r\n \" • Slightly increased processing overhead\",\r\n \"\",\r\n \"Lower values:\",\r\n \" • Faster response to direction changes\",\r\n \" • Less memory usage\",\r\n \" • May be less accurate for fast movements\",\r\n \"\",\r\n \"Property: positionHistorySize\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"range\" id=\"history-size\" min=\"${MIN_POSITION_HISTORY_SIZE}\" max=\"${MAX_POSITION_HISTORY_SIZE}\">\r\n <span id=\"history-value\"></span>\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"prediction-time\">\r\n Prediction Time\r\n <span class=\"info-icon\" title=\"${[\r\n \"Trajectory Prediction Time\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n `How far into the future (in ${TRAJECTORY_PREDICTION_TIME_UNIT})`,\r\n \"to calculate the mouse trajectory path.\",\r\n \"\",\r\n \"Larger values:\",\r\n \" • Elements are detected sooner\",\r\n \" • More time for preloading/preparation\",\r\n \" • May trigger false positives for curved paths\",\r\n \"\",\r\n \"Smaller values:\",\r\n \" • More precise targeting\",\r\n \" • Reduced false positive rate\",\r\n \" • Less time for preparation\",\r\n \"\",\r\n \"Property: trajectoryPredictionTime\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"range\" id=\"prediction-time\" min=\"${MIN_TRAJECTORY_PREDICTION_TIME}\" max=\"${MAX_TRAJECTORY_PREDICTION_TIME}\" step=\"10\">\r\n <span id=\"prediction-value\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"debugger-section keyboard-settings-section\">\r\n <div class=\"debugger-section-header collapsible\">\r\n <h3>Keyboard Settings</h3>\r\n <button class=\"section-minimize-button\">-</button>\r\n </div>\r\n <div class=\"debugger-section-content keyboard-settings-content\">\r\n <div class=\"control-row\">\r\n <label for=\"tab-enabled\">\r\n Enable Tab Prediction\r\n <span class=\"info-icon\" title=\"${[\r\n \"Tab Navigation Prediction\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"When enabled: Callbacks are executed when\",\r\n `the user is ${this.foresightManagerInstance.getManagerData.globalSettings.tabOffset} (tabOffset) ${TAB_OFFSET_UNIT} away from`,\r\n \"a registered element during tab navigation.\",\r\n \"\",\r\n \"(works with Shift+Tab too).\",\r\n \"\",\r\n \"Property: enableTabPrediction\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"checkbox\" id=\"tab-enabled\">\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"tab-offset\">\r\n Tab Offset\r\n <span class=\"info-icon\" title=\"${[\r\n \"Tab Offset\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Number of tabbable elements to look ahead\",\r\n \"when predicting tab navigation targets.\",\r\n \"\",\r\n \"How it works:\",\r\n \" • Tracks the current focused element\",\r\n \" • Looks ahead by the specified offset\",\r\n \" • Triggers callbacks for registered elements\",\r\n \" within that range\",\r\n \"\",\r\n \"Property: tabOffset\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"range\" id=\"tab-offset\" min=\"${MIN_TAB_OFFSET}\" max=\"${MAX_TAB_OFFSET}\" step=\"1\">\r\n <span id=\"tab-offset-value\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"debugger-section scroll-settings-section\">\r\n <div class=\"debugger-section-header collapsible\">\r\n <h3>Scroll Settings</h3>\r\n <button class=\"section-minimize-button\">-</button>\r\n </div>\r\n <div class=\"debugger-section-content scroll-settings-content\">\r\n <div class=\"control-row\">\r\n <label for=\"scroll-enabled\">\r\n Enable Scroll Prediction\r\n <span class=\"info-icon\" title=\"${[\r\n \"Scroll Prediction\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Enables predictive scrolling based on mouse\",\r\n \"position and scroll direction.\",\r\n \"\",\r\n \"When enabled, calculates scroll direction from\",\r\n \"mouse movement and triggers callbacks for\",\r\n \"elements that intersect the predicted path.\",\r\n \"\",\r\n \"Property: enableScrollPrediction\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"checkbox\" id=\"scroll-enabled\">\r\n </div>\r\n <div class=\"control-row\">\r\n <label for=\"scroll-margin\">\r\n Scroll Margin\r\n <span class=\"info-icon\" title=\"${[\r\n \"Scroll Margin\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Sets the pixel distance to check from the\",\r\n \"mouse position in the scroll direction.\",\r\n \"\",\r\n \"Higher values check further ahead, allowing\",\r\n \"earlier detection of elements that will come\",\r\n \"into view during scrolling.\",\r\n \"\",\r\n \"Property: scrollMargin\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"range\" id=\"scroll-margin\" min=\"${MIN_SCROLL_MARGIN}\" max=\"${MAX_SCROLL_MARGIN}\" step=\"10\">\r\n <span id=\"scroll-margin-value\"></span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"debugger-section general-settings-section\">\r\n <div class=\"debugger-section-header collapsible\">\r\n <h3>General Settings</h3>\r\n <button class=\"section-minimize-button\">-</button>\r\n </div>\r\n <div class=\"debugger-section-content general-settings-content\">\r\n <div class=\"control-row\">\r\n <label for=\"toggle-name-tags\">\r\n Show Name Tags\r\n <span class=\"info-icon\" title=\"${[\r\n \"Visual Debug Name Tags\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"When enabled: Displays name tags over\",\r\n \"each registered element in debug mode.\",\r\n \"\",\r\n \"Property: debuggerSettings.showNameTags\",\r\n ].join(\"\\n\")}\">i</span>\r\n </label>\r\n <input type=\"checkbox\" id=\"toggle-name-tags\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"debugger-section debugger-elements\">\r\n <div class=\"debugger-section-header elements-list-header\">\r\n <h3>Elements <span id=\"element-count\"></span> <span id=\"callback-count\"></span></h3>\r\n <div class=\"header-controls\">\r\n <div class=\"sort-control-container\">\r\n <button class=\"sort-button\" title=\"Change element list sort order\">\r\n ${SORT_SVG_ICON}\r\n </button>\r\n <div id=\"sort-options-popup\">\r\n <button\r\n data-sort=\"visibility\"\r\n title=\"${[\r\n \"Sort by Visibility\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Sorts elements by their viewport visibility\",\r\n \"(visible elements first), with a secondary\",\r\n \"sort by their order in the document.\",\r\n \"\",\r\n \"Property: debuggerSettings.sortElementList\",\r\n \"Value: 'visibility'\",\r\n ].join(\"\\n\")}\">\r\n Visibility\r\n </button>\r\n <button\r\n data-sort=\"documentOrder\"\r\n title=\"${[\r\n \"Sort by Document Order\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Sorts elements based on their order of\",\r\n \"appearance in the document's structure\",\r\n \"(matching the HTML source).\",\r\n \"\",\r\n \"Property: debuggerSettings.sortElementList\",\r\n \"Value: 'documentOrder'\",\r\n ].join(\"\\n\")}\"\r\n >\r\n Document Order\r\n </button>\r\n <button\r\n data-sort=\"insertionOrder\"\r\n title=\"${[\r\n \"Sort by Insertion Order\",\r\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\r\n \"Sorts elements based on the order they\",\r\n \"were registered with the ForesightManager.\",\r\n \"\",\r\n \"Property: debuggerSettings.sortElementList\",\r\n \"Value: 'insertionOrder'\",\r\n ].join(\"\\n\")}\"\r\n >\r\n Insertion Order\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"debugger-section-content element-list\">\r\n <div id=\"element-list-items-container\">\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n return container\r\n }\r\n\r\n private getStyles(): string {\r\n const elementItemHeight = 35 // px\r\n const elementListGap = 3 // px\r\n const elementListItemsContainerPadding = 6 // px\r\n const numRowsToShow = 6\r\n const numItemsPerRow = 1\r\n\r\n const rowsContentHeight =\r\n elementItemHeight * numRowsToShow + elementListGap * (numRowsToShow - 1)\r\n const elementListContainerHeight = rowsContentHeight + elementListItemsContainerPadding * 2\r\n\r\n return /* css */ `\r\n #debug-controls {\r\n position: fixed; bottom: 10px; right: 10px;\r\n background-color: rgba(0, 0, 0, 0.90); color: white; padding: 12px;\r\n border-radius: 5px; font-family: Arial, sans-serif; font-size: 13px;\r\n z-index: 10001; pointer-events: auto; display: flex; flex-direction: column; gap: 8px;\r\n width: 400px;\r\n transition: width 0.3s ease, height 0.3s ease;\r\n }\r\n #debug-controls.minimized {\r\n width: 250px;\r\n overflow: hidden;\r\n padding: 12px 0; \r\n }\r\n #debug-controls.minimized .debugger-title-container {\r\n padding-left: 10px; \r\n padding-right: 10px;\r\n gap: 10px; \r\n }\r\n #debug-controls.minimized .debugger-title-container h2 {\r\n display: inline;\r\n font-size: 14px;\r\n margin: 0;\r\n white-space: nowrap;\r\n }\r\n #debug-controls.minimized .info-icon {\r\n display: none;\r\n }\r\n\r\n #element-count,#callback-count {\r\n font-size: 12px;\r\n color: #9e9e9e;\r\n }\r\n\r\n .debugger-title-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between; \r\n padding: 0 0px; \r\n }\r\n .title-group { \r\n display: flex;\r\n align-items: center;\r\n gap: 8px; \r\n\r\n }\r\n .minimize-button {\r\n background: none; border: none; color: white;\r\n font-size: 22px; cursor: pointer;\r\n line-height: 1;\r\n padding-inline: 0px;\r\n }\r\n .debugger-title-container h2 { margin: 0; font-size: 15px; }\r\n\r\n .copy-settings-button {\r\n background: none; border: none; color: white;\r\n cursor: pointer; padding: 0;\r\n display: flex; align-items: center; justify-content: center;\r\n }\r\n\r\n .copy-settings-button svg {\r\n width: 16px; height: 16px;\r\n stroke: white;\r\n }\r\n\r\n .minimized-element-count {\r\n font-size: 14px;\r\n min-width: 30px;\r\n text-align: right;\r\n }\r\n\r\n .all-settings-sections-container {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n }\r\n\r\n .debugger-section-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: 5px;\r\n margin-bottom: 2px;\r\n padding-bottom: 2px;\r\n border-bottom: 1px solid #444;\r\n }\r\n .debugger-section-header.collapsible {\r\n cursor: pointer;\r\n }\r\n .debugger-section-header h3 {\r\n margin: 0;\r\n font-size: 14px;\r\n font-weight: bold;\r\n color: #b0c4de;\r\n flex-grow: 1;\r\n }\r\n\r\n .section-minimize-button {\r\n background: none;\r\n border: none;\r\n color: white;\r\n font-size: 18px;\r\n cursor: pointer;\r\n padding: 0px;\r\n line-height: 1;\r\n }\r\n\r\n #debug-controls .control-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 8px;\r\n }\r\n #debug-controls label {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n cursor: pointer;\r\n }\r\n #debug-controls .control-row:has(input[type=\"checkbox\"]) label {\r\n flex-grow: 1;\r\n }\r\n #debug-controls .control-row input[type=\"checkbox\"] {\r\n appearance: none; -webkit-appearance: none; -moz-appearance: none;\r\n position: relative; width: 40px; height: 18px;\r\n background-color: #555; border-radius: 10px; cursor: pointer;\r\n outline: none; transition: background-color 0.2s ease;\r\n vertical-align: middle; flex-shrink: 0; margin: 0;\r\n }\r\n #debug-controls .control-row input[type=\"checkbox\"]::before {\r\n content: \"\"; position: absolute; width: 14px; height: 14px;\r\n border-radius: 50%; background-color: white; top: 2px; left: 2px;\r\n transition: transform 0.2s ease; box-shadow: 0 1px 3px rgba(0,0,0,0.4);\r\n }\r\n #debug-controls .control-row input[type=\"checkbox\"]:checked {\r\n background-color: #b0c4de;\r\n }\r\n #debug-controls .control-row input[type=\"checkbox\"]:checked::before {\r\n transform: translateX(22px);\r\n }\r\n #debug-controls .control-row:has(input[type=\"range\"]) label {\r\n flex-basis: 170px; flex-shrink: 0;\r\n }\r\n #debug-controls input[type=\"range\"] {\r\n flex-grow: 1; margin: 0; cursor: pointer; -webkit-appearance: none;\r\n appearance: none; background: transparent; height: 18px; vertical-align: middle;\r\n }\r\n #debug-controls input[type=\"range\"]::-webkit-slider-runnable-track {\r\n height: 6px; background: #555; border-radius: 3px;\r\n }\r\n #debug-controls input[type=\"range\"]::-moz-range-track {\r\n height: 6px; background: #555; border-radius: 3px;\r\n }\r\n #debug-controls input[type=\"range\"]::-webkit-slider-thumb {\r\n -webkit-appearance: none; appearance: none; margin-top: -5px;\r\n background: #b0c4de; height: 16px; width: 16px;\r\n border-radius: 50%; border: 1px solid #333;\r\n }\r\n #debug-controls input[type=\"range\"]::-moz-range-thumb {\r\n background: #b0c4de; height: 16px; width: 16px;\r\n border-radius: 50%; border: 1px solid #333; border: none;\r\n }\r\n #debug-controls .control-row:has(input[type=\"range\"]) span:not(.info-icon) {\r\n width: 55px; min-width: 55px; text-align: right; flex-shrink: 0;\r\n }\r\n .info-icon {\r\n display: inline-flex; align-items: center; justify-content: center;\r\n width: 16px; height: 16px; border-radius: 50%;\r\n background-color: #555; color: white; font-size: 10px;\r\n font-style: italic; font-weight: bold; font-family: 'Georgia', serif;\r\n cursor: help; user-select: none; flex-shrink: 0;\r\n }\r\n .debugger-section {\r\n display: flex; flex-direction: column; gap: 6px;\r\n }\r\n .debugger-section-content {\r\n display: none; flex-direction: column; gap: 8px;\r\n }\r\n\r\n /* Element List Styles */\r\n .elements-list-header { cursor: default; }\r\n .header-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n .sort-control-container {\r\n position: relative;\r\n }\r\n .sort-button {\r\n background: none; border: none; color: white; cursor: pointer;\r\n padding: 0; display: flex; align-items: center; justify-content: center;\r\n }\r\n .sort-button svg {\r\n width: 16px; height: 16px; stroke: #b0c4de; transition: stroke 0.2s;\r\n }\r\n .sort-button:hover svg { stroke: white; }\r\n \r\n #sort-options-popup {\r\n position: absolute;\r\n bottom: calc(100% + 5px);\r\n right: -5px;\r\n z-index: 10;\r\n display: none;\r\n flex-direction: column;\r\n gap: 4px;\r\n background-color: #3a3a3a;\r\n border: 1px solid #555;\r\n border-radius: 4px;\r\n padding: 3px;\r\n width: 200px;\r\n box-shadow: 0 4px 8px rgba(0,0,0,0.3);\r\n }\r\n #sort-options-popup.active {\r\n display: flex;\r\n }\r\n #sort-options-popup button {\r\n background: none; border: none; color: #ccc;\r\n font-size: 12px; text-align: left; padding: 5px 8px;\r\n cursor: pointer; border-radius: 3px;\r\n transition: background-color 0.2s, color 0.2s;\r\n display: flex;\r\n align-items: center;\r\n height: 26px;\r\n }\r\n #sort-options-popup button:hover {\r\n background-color: #555;\r\n color: white;\r\n }\r\n #sort-options-popup button.active-sort-option {\r\n color: #b0c4de;\r\n font-weight: bold;\r\n }\r\n #sort-options-popup button.active-sort-option::before {\r\n content: '✓';\r\n margin-right: 6px;\r\n width: 10px;\r\n }\r\n #sort-options-popup button::before {\r\n content: '';\r\n margin-right: 6px;\r\n width: 10px;\r\n }\r\n\r\n .element-list { /* Scroll container */\r\n min-height: ${elementListContainerHeight}px;\r\n max-height: ${elementListContainerHeight}px; \r\n overflow-y: auto;\r\n background-color: rgba(20, 20, 20, 0.5);\r\n border-radius: 3px;\r\n padding: 0;\r\n display: flex;\r\n }\r\n\r\n /* Modern Scrollbar Styling */\r\n .element-list::-webkit-scrollbar { width: 8px; }\r\n .element-list::-webkit-scrollbar-track { background: rgba(30, 30, 30, 0.5); border-radius: 4px; }\r\n .element-list::-webkit-scrollbar-thumb { background-color: rgba(176, 196, 222, 0.5); border-radius: 4px; border: 2px solid rgba(0, 0, 0, 0.2); }\r\n .element-list::-webkit-scrollbar-thumb:hover { background-color: rgba(176, 196, 222, 0.7); }\r\n .element-list { scrollbar-width: thin; scrollbar-color: rgba(176, 196, 222, 0.5) rgba(30, 30, 30, 0.5); }\r\n\r\n #element-list-items-container { \r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: ${elementListGap}px;\r\n padding: ${elementListItemsContainerPadding}px;\r\n min-height: ${rowsContentHeight}px;\r\n box-sizing: border-box;\r\n align-content: flex-start;\r\n }\r\n #element-list-items-container > em {\r\n flex-basis: 100%;\r\n text-align: center;\r\n padding: 10px 0;\r\n font-style: italic;\r\n color: #ccc;\r\n font-size: 12px;\r\n }\r\n .element-list-item {\r\n flex-basis: calc((100% - (${\r\n numItemsPerRow - 1\r\n } * ${elementListGap}px)) / ${numItemsPerRow});\r\n flex-grow: 0;\r\n flex-shrink: 0;\r\n height: ${elementItemHeight}px;\r\n box-sizing: border-box;\r\n padding: 3px 5px;\r\n border-radius: 2px;\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n background-color: rgba(50,50,50,0.7);\r\n transition: background-color 0.2s ease, opacity 0.2s ease;\r\n font-size: 11px; \r\n overflow: hidden;\r\n }\r\n \r\n /* Viewport intersection styling */\r\n .element-list-item.not-in-viewport { opacity: 0.4; }\r\n \r\n .element-list-item .element-name {\r\n flex-grow: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n font-size: 12px; \r\n font-weight: bold;\r\n }\r\n .element-list-item .intersecting-indicator {\r\n font-size: 12px;\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n }\r\n .element-list-item .hit-behavior,\r\n .element-list-item .hit-slop {\r\n font-size: 10px; \r\n color: #b0b0b0;\r\n padding: 2px 5px; \r\n border-radius: 3px; \r\n background-color: rgba(0,0,0,0.2);\r\n flex-shrink: 0;\r\n }\r\n `\r\n }\r\n}\r\n","import type { ElementOverlays } from \"../ForesightDebugger\"\r\nimport type { ForesightElementData } from \"js.foresight\"\r\n\r\nexport function updateElementOverlays(\r\n currentOverlays: ElementOverlays,\r\n newData: ForesightElementData,\r\n showNameTags: boolean\r\n) {\r\n const { expandedOverlay, nameLabel } = currentOverlays\r\n const { expandedRect } = newData.elementBounds\r\n\r\n const expandedWidth = expandedRect.right - expandedRect.left\r\n const expandedHeight = expandedRect.bottom - expandedRect.top\r\n expandedOverlay.style.width = `${expandedWidth}px`\r\n expandedOverlay.style.height = `${expandedHeight}px`\r\n expandedOverlay.style.transform = `translate3d(${expandedRect.left}px, ${expandedRect.top}px, 0)`\r\n expandedOverlay.style.display = \"block\"\r\n\r\n nameLabel.textContent = newData.name\r\n if (newData.name === \"\" || !showNameTags) {\r\n nameLabel.style.display = \"none\"\r\n } else {\r\n nameLabel.style.display = \"block\"\r\n nameLabel.style.transform = `translate3d(${expandedRect.left}px, ${expandedRect.top - 25}px, 0)`\r\n }\r\n}\r\n","import { ForesightManager } from 'js.foresight'\r\nimport type {\r\n CallbackFiredEvent,\r\n ElementDataUpdatedEvent,\r\n ElementRegisteredEvent,\r\n ElementUnregisteredEvent,\r\n ForesightElement,\r\n ForesightElementData,\r\n HitSlop,\r\n ManagerSettingsChangedEvent,\r\n MouseTrajectoryUpdateEvent,\r\n ScrollTrajectoryUpdateEvent,\r\n} from 'js.foresight'\r\nimport PositionObserver from '@thednp/position-observer'\r\nimport type { DebuggerSettings, ForesightDebuggerData } from '../types'\r\nimport { DebuggerControlPanel } from './DebuggerControlPanel'\r\nimport { createAndAppendElement, createAndAppendStyle } from './helpers/createAndAppend'\r\nimport { updateElementOverlays } from './helpers/updateElementOverlays'\r\n// PositionObserver imported above\r\n\r\n// Import constants that should be available from js.foresight\r\n// These constants need to be part of the main package's public API\r\nconst DEFAULT_IS_DEBUGGER_MINIMIZED = false\r\nconst DEFAULT_SHOW_DEBUGGER = true\r\nconst DEFAULT_SHOW_NAME_TAGS = true\r\nconst DEFAULT_SORT_ELEMENT_LIST = 'visibility' as const\r\n\r\n// Helper function that should be available from js.foresight or implemented locally\r\nfunction shouldUpdateSetting<T>(newValue: T | undefined, currentValue: T): boolean {\r\n return newValue !== undefined && newValue !== currentValue\r\n}\r\n\r\n// Helper function that should be available from js.foresight or implemented locally\r\nfunction evaluateRegistrationConditions(): { shouldRegister: boolean } {\r\n return {\r\n shouldRegister: typeof window !== 'undefined' && !('ontouchstart' in window),\r\n }\r\n}\r\n\r\nexport type ElementOverlays = {\r\n expandedOverlay: HTMLElement\r\n nameLabel: HTMLElement\r\n}\r\n\r\ntype callbackAnimation = {\r\n hitSlop: Exclude<HitSlop, number>\r\n overlay: HTMLElement\r\n timeoutId: ReturnType<typeof setTimeout>\r\n}\r\nexport class ForesightDebugger {\r\n private static debuggerInstance: ForesightDebugger\r\n private callbackAnimations: Map<Element, callbackAnimation> = new Map()\r\n private foresightManagerInstance: ForesightManager\r\n private shadowHost!: HTMLElement\r\n private shadowRoot!: ShadowRoot\r\n private debugContainer!: HTMLElement\r\n private controlPanel!: DebuggerControlPanel\r\n\r\n private _debuggerSettings: DebuggerSettings = {\r\n showDebugger: DEFAULT_SHOW_DEBUGGER,\r\n isControlPanelDefaultMinimized: DEFAULT_IS_DEBUGGER_MINIMIZED,\r\n showNameTags: DEFAULT_SHOW_NAME_TAGS,\r\n sortElementList: DEFAULT_SORT_ELEMENT_LIST,\r\n }\r\n\r\n private debugElementOverlays: Map<ForesightElement, ElementOverlays> = new Map()\r\n private predictedMouseIndicator: HTMLElement | null = null\r\n private mouseTrajectoryLine: HTMLElement | null = null\r\n private scrollTrajectoryLine: HTMLElement | null = null\r\n private managerSubscriptionsController: AbortController | null = null\r\n private constructor(foresightManager: ForesightManager) {\r\n this.foresightManagerInstance = foresightManager\r\n }\r\n private animationPositionObserver: PositionObserver | null = null\r\n\r\n public get getDebuggerData(): Readonly<ForesightDebuggerData> {\r\n return {\r\n settings: this._debuggerSettings,\r\n }\r\n }\r\n\r\n public static initialize(\r\n foresightManager: ForesightManager,\r\n props?: Partial<DebuggerSettings>\r\n ): ForesightDebugger | null {\r\n if (typeof window === 'undefined' || !evaluateRegistrationConditions().shouldRegister) {\r\n return null\r\n }\r\n if (!ForesightDebugger.isInitiated) {\r\n ForesightDebugger.debuggerInstance = new ForesightDebugger(foresightManager)\r\n }\r\n\r\n const instance = ForesightDebugger.debuggerInstance\r\n instance.subscribeToManagerEvents()\r\n instance.alterDebuggerSettings(props)\r\n\r\n // Always call at the end of the initialize function\r\n if (!instance.shadowHost) {\r\n instance._setupDOM()\r\n }\r\n return instance\r\n }\r\n\r\n public static get instance(): ForesightDebugger {\r\n if (!ForesightDebugger.debuggerInstance) {\r\n throw new Error(\r\n 'ForesightDebugger has not been initialized. Call ForesightDebugger.initialize() first.'\r\n )\r\n }\r\n return ForesightDebugger.debuggerInstance\r\n }\r\n\r\n private _setupDOM() {\r\n // If for some reason we call this on an already-setup instance, do nothing.\r\n if (this.shadowHost) {\r\n return\r\n }\r\n\r\n this.shadowHost = createAndAppendElement('div', document.body, {\r\n id: 'jsforesight-debugger-shadow-host',\r\n })\r\n this.shadowRoot = this.shadowHost.attachShadow({ mode: 'open' })\r\n this.debugContainer = createAndAppendElement('div', this.shadowRoot, {\r\n id: 'jsforesight-debug-container',\r\n })\r\n this.predictedMouseIndicator = createAndAppendElement('div', this.debugContainer, {\r\n className: 'jsforesight-mouse-predicted',\r\n })\r\n this.mouseTrajectoryLine = createAndAppendElement('div', this.debugContainer, {\r\n className: 'jsforesight-trajectory-line',\r\n })\r\n this.scrollTrajectoryLine = createAndAppendElement('div', this.debugContainer, {\r\n className: 'jsforesight-scroll-trajectory-line',\r\n })\r\n this.controlPanel = DebuggerControlPanel.initialize(\r\n this.foresightManagerInstance,\r\n ForesightDebugger.debuggerInstance,\r\n this.shadowRoot,\r\n this._debuggerSettings\r\n )\r\n createAndAppendStyle(debuggerCSS, this.shadowRoot, 'screen-visuals')\r\n\r\n this.animationPositionObserver = new PositionObserver(this.handleAnimationPositionChange)\r\n }\r\n\r\n private handleAnimationPositionChange = (entries: IntersectionObserverEntry[]) => {\r\n for (const entry of entries) {\r\n const animationData = this.callbackAnimations.get(entry.target)\r\n if (animationData) {\r\n const rect = entry.boundingClientRect\r\n const { hitSlop, overlay } = animationData\r\n\r\n const newLeft = rect.left - hitSlop.left\r\n const newTop = rect.top - hitSlop.top\r\n const newWidth = rect.width + hitSlop.left + hitSlop.right\r\n const newHeight = rect.height + hitSlop.top + hitSlop.bottom\r\n\r\n overlay.style.transform = `translate3d(${newLeft}px, ${newTop}px, 0)`\r\n overlay.style.width = `${newWidth}px`\r\n overlay.style.height = `${newHeight}px`\r\n }\r\n }\r\n }\r\n\r\n private static get isInitiated(): boolean {\r\n return !!ForesightDebugger.debuggerInstance\r\n }\r\n\r\n public alterDebuggerSettings(props?: Partial<DebuggerSettings>) {\r\n if (shouldUpdateSetting(props?.showNameTags, this._debuggerSettings.showNameTags)) {\r\n this._debuggerSettings.showNameTags = props!.showNameTags!\r\n this.toggleNameTagVisibility()\r\n }\r\n if (\r\n shouldUpdateSetting(\r\n props?.isControlPanelDefaultMinimized,\r\n this._debuggerSettings.isControlPanelDefaultMinimized\r\n )\r\n ) {\r\n this._debuggerSettings.isControlPanelDefaultMinimized = props!.isControlPanelDefaultMinimized!\r\n }\r\n if (shouldUpdateSetting(props?.sortElementList, this._debuggerSettings.sortElementList)) {\r\n this._debuggerSettings.sortElementList = props!.sortElementList!\r\n }\r\n if (shouldUpdateSetting(props?.showDebugger, this._debuggerSettings.showDebugger)) {\r\n this._debuggerSettings.showDebugger = props!.showDebugger!\r\n if (this._debuggerSettings.showDebugger) {\r\n ForesightDebugger.initialize(this.foresightManagerInstance)\r\n } else {\r\n this.cleanup()\r\n }\r\n }\r\n }\r\n\r\n private subscribeToManagerEvents() {\r\n this.managerSubscriptionsController = new AbortController()\r\n const signal = this.managerSubscriptionsController.signal\r\n const manager = this.foresightManagerInstance\r\n\r\n manager.addEventListener('elementRegistered', this.handleAddElement, { signal })\r\n manager.addEventListener('elementUnregistered', this.handleRemoveElement, { signal })\r\n manager.addEventListener('elementDataUpdated', this.handleElementDataUpdated, { signal })\r\n manager.addEventListener('mouseTrajectoryUpdate', this.handleMouseTrajectoryUpdate, {\r\n signal,\r\n })\r\n manager.addEventListener('scrollTrajectoryUpdate', this.handleScrollTrajectoryUpdate, {\r\n signal,\r\n })\r\n manager.addEventListener('managerSettingsChanged', this.handleSettingsChanged, { signal })\r\n\r\n manager.addEventListener('callbackFired', this.handleCallbackFired, { signal })\r\n }\r\n\r\n private handleElementDataUpdated = (e: ElementDataUpdatedEvent) => {\r\n switch (e.updatedProp) {\r\n case 'bounds':\r\n this.createOrUpdateElementOverlay(e.elementData)\r\n break\r\n case 'visibility':\r\n if (!e.elementData.isIntersectingWithViewport) {\r\n this.removeElementOverlay(e.elementData)\r\n }\r\n this.controlPanel?.updateElementVisibilityStatus(e.elementData)\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * Removes all debug overlays and data associated with an element.\r\n *\r\n * This method cleans up the link overlay, expanded overlay, and name label\r\n * for the specified element, removes it from internal tracking maps, and\r\n * refreshes the control panel's element list to reflect the removal.\r\n *\r\n * @param element - The ForesightElement to remove from debugging visualization\r\n */\r\n private handleRemoveElement = (e: ElementUnregisteredEvent) => {\r\n this.controlPanel?.removeElementFromList(e.elementData)\r\n this.removeElementOverlay(e.elementData)\r\n }\r\n\r\n private handleCallbackFired = (e: CallbackFiredEvent) => {\r\n this.showCallbackAnimation(e.elementData)\r\n }\r\n\r\n private handleAddElement = (e: ElementRegisteredEvent) => {\r\n this.createOrUpdateElementOverlay(e.elementData)\r\n this.controlPanel.addElementToList(e.elementData, e.sort)\r\n }\r\n\r\n private handleMouseTrajectoryUpdate = (e: MouseTrajectoryUpdateEvent) => {\r\n if (!this.shadowRoot || !this.debugContainer) {\r\n return\r\n }\r\n if (!this.predictedMouseIndicator || !this.mouseTrajectoryLine) {\r\n return\r\n }\r\n //Hide scroll visuals on mouse move\r\n if (this.scrollTrajectoryLine) {\r\n this.scrollTrajectoryLine.style.display = 'none'\r\n }\r\n const { predictedPoint, currentPoint } = e.trajectoryPositions\r\n\r\n // Use transform for positioning to avoid layout reflow.\r\n // The CSS handles centering the element with `translate(-50%, -50%)`.\r\n this.predictedMouseIndicator.style.transform = `translate3d(${predictedPoint.x}px, ${predictedPoint.y}px, 0) translate3d(-50%, -50%, 0)`\r\n this.predictedMouseIndicator.style.display = e.predictionEnabled ? 'block' : 'none'\r\n\r\n // This hides the circle from the UI at the top-left corner when refreshing the page with the cursor outside of the window\r\n if (predictedPoint.x === 0 && predictedPoint.y === 0) {\r\n this.predictedMouseIndicator.style.display = 'none'\r\n return\r\n }\r\n\r\n if (!e.predictionEnabled) {\r\n this.mouseTrajectoryLine.style.display = 'none'\r\n return\r\n }\r\n\r\n const dx = predictedPoint.x - currentPoint.x\r\n const dy = predictedPoint.y - currentPoint.y\r\n\r\n const length = Math.sqrt(dx * dx + dy * dy)\r\n const angle = (Math.atan2(dy, dx) * 180) / Math.PI\r\n\r\n // Use a single transform to position, rotate, and scale the line,\r\n // avoiding reflow from top/left changes.\r\n this.mouseTrajectoryLine.style.transform = `translate3d(${currentPoint.x}px, ${currentPoint.y}px, 0) rotate(${angle}deg)`\r\n this.mouseTrajectoryLine.style.width = `${length}px`\r\n this.mouseTrajectoryLine.style.display = 'block'\r\n }\r\n\r\n private handleScrollTrajectoryUpdate = (e: ScrollTrajectoryUpdateEvent) => {\r\n if (!this.scrollTrajectoryLine) return\r\n const dx = e.predictedPoint.x - e.currentPoint.x\r\n const dy = e.predictedPoint.y - e.currentPoint.y\r\n\r\n const length = Math.sqrt(dx * dx + dy * dy)\r\n const angle = (Math.atan2(dy, dx) * 180) / Math.PI\r\n\r\n this.scrollTrajectoryLine.style.transform = `translate3d(${e.currentPoint.x}px, ${e.currentPoint.y}px, 0) rotate(${angle}deg)`\r\n this.scrollTrajectoryLine.style.width = `${length}px`\r\n this.scrollTrajectoryLine.style.display = 'block'\r\n }\r\n\r\n private handleSettingsChanged = (e: ManagerSettingsChangedEvent) => {\r\n this.controlPanel?.updateControlsState(e.newSettings, this._debuggerSettings)\r\n }\r\n\r\n private createElementOverlays(elementData: ForesightElementData) {\r\n const expandedOverlay = createAndAppendElement('div', this.debugContainer!, {\r\n className: 'jsforesight-expanded-overlay',\r\n data: elementData.name,\r\n })\r\n const nameLabel = createAndAppendElement('div', this.debugContainer, {\r\n className: 'jsforesight-name-label',\r\n })\r\n const overlays = { expandedOverlay, nameLabel }\r\n this.debugElementOverlays.set(elementData.element, overlays)\r\n return overlays\r\n }\r\n\r\n private createOrUpdateElementOverlay(newData: ForesightElementData) {\r\n if (!this.debugContainer || !this.shadowRoot) return\r\n\r\n let overlays = this.debugElementOverlays.get(newData.element)\r\n if (!overlays) {\r\n overlays = this.createElementOverlays(newData)\r\n }\r\n\r\n updateElementOverlays(\r\n overlays,\r\n newData,\r\n this._debuggerSettings.showNameTags ?? DEFAULT_SHOW_NAME_TAGS\r\n )\r\n }\r\n\r\n // TODO :fix\r\n private toggleNameTagVisibility() {\r\n this.foresightManagerInstance.registeredElements.forEach(elementData => {\r\n const overlays = this.debugElementOverlays.get(elementData.element)\r\n if (!overlays) return\r\n updateElementOverlays(\r\n overlays,\r\n elementData,\r\n this._debuggerSettings.showNameTags ?? DEFAULT_SHOW_NAME_TAGS\r\n )\r\n })\r\n }\r\n\r\n private removeElementOverlay(elementData: ForesightElementData) {\r\n const overlays = this.debugElementOverlays.get(elementData.element)\r\n if (overlays) {\r\n overlays.expandedOverlay.remove()\r\n overlays.nameLabel.remove()\r\n this.debugElementOverlays.delete(elementData.element)\r\n }\r\n }\r\n\r\n private showCallbackAnimation(elementData: ForesightElementData) {\r\n const { element, elementBounds } = elementData\r\n const existingAnimation = this.callbackAnimations.get(element)\r\n\r\n // If an animation is already running for this element, reset it\r\n if (existingAnimation) {\r\n clearTimeout(existingAnimation.timeoutId)\r\n existingAnimation.overlay.remove()\r\n this.animationPositionObserver?.unobserve(element)\r\n this.callbackAnimations.delete(element)\r\n }\r\n\r\n const animationOverlay = createAndAppendElement('div', this.debugContainer, {\r\n className: 'jsforesight-callback-indicator',\r\n })\r\n\r\n const { left, top, right, bottom } = elementBounds.expandedRect\r\n const width = right - left\r\n const height = bottom - top\r\n\r\n animationOverlay.style.display = 'block'\r\n animationOverlay.style.transform = `translate3d(${left}px, ${top}px, 0)`\r\n animationOverlay.style.width = `${width}px`\r\n animationOverlay.style.height = `${height}px`\r\n\r\n animationOverlay.classList.add('animate')\r\n\r\n const animationDuration = 500\r\n\r\n const timeoutId = setTimeout(() => {\r\n animationOverlay.remove()\r\n this.callbackAnimations.delete(element)\r\n this.animationPositionObserver?.unobserve(element)\r\n }, animationDuration)\r\n\r\n this.callbackAnimations.set(element, {\r\n hitSlop: elementData.elementBounds.hitSlop,\r\n overlay: animationOverlay,\r\n timeoutId: timeoutId,\r\n })\r\n\r\n this.animationPositionObserver?.observe(element)\r\n }\r\n\r\n public cleanup() {\r\n this.managerSubscriptionsController?.abort()\r\n this.controlPanel?.cleanup()\r\n this.shadowHost?.remove()\r\n this.debugElementOverlays.clear()\r\n this.shadowHost = null!\r\n this.shadowRoot = null!\r\n this.debugContainer = null!\r\n this.predictedMouseIndicator = null\r\n this.mouseTrajectoryLine = null\r\n this.scrollTrajectoryLine = null\r\n this.controlPanel = null!\r\n }\r\n}\r\n\r\nconst debuggerCSS = /* css */ `\r\n #jsforesight-debug-container { \r\n position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n pointer-events: none; z-index: 9999;\r\n }\r\n\r\n .jsforesight-expanded-overlay, \r\n .jsforesight-name-label, \r\n .jsforesight-callback-indicator,\r\n .jsforesight-mouse-predicted,\r\n .jsforesight-scroll-trajectory-line,\r\n .jsforesight-trajectory-line {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n will-change: transform; \r\n }\r\n .jsforesight-trajectory-line{\r\n display: none;\r\n }\r\n .jsforesight-expanded-overlay {\r\n border: 1px dashed rgba(100, 116, 139, 0.4);\r\n background-color: rgba(100, 116, 139, 0.05);\r\n box-sizing: border-box;\r\n border-radius: 8px;\r\n }\r\n .jsforesight-mouse-predicted {\r\n display: none !important;\r\n /* transform is now set dynamically via JS for performance */\r\n }\r\n .jsforesight-trajectory-line {\r\n height: 4px;\r\n background: linear-gradient(90deg, #3b82f6, rgba(59, 130, 246, 0.4));\r\n transform-origin: left center;\r\n z-index: 9999;\r\n border-radius: 2px;\r\n box-shadow: 0 0 12px rgba(59, 130, 246, 0.4);\r\n position: relative;\r\n /* width and transform are set dynamically via JS for performance */\r\n }\r\n .jsforesight-trajectory-line::after {\r\n content: '';\r\n position: absolute;\r\n right: -6px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 8px solid #3b82f6;\r\n border-top: 4px solid transparent;\r\n border-bottom: 4px solid transparent;\r\n filter: drop-shadow(0 0 6px rgba(59, 130, 246, 0.6));\r\n }\r\n .jsforesight-name-label {\r\n background-color: rgba(27, 31, 35, 0.85);\r\n backdrop-filter: blur(4px);\r\n color: white;\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\r\n border-radius: 4px;\r\n z-index: 10001;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n }\r\n .jsforesight-callback-indicator {\r\n border: 4px solid oklch(65% 0.22 280); \r\n border-radius: 8px;\r\n box-sizing: border-box;\r\n pointer-events: none;\r\n opacity: 0;\r\n z-index: 10002;\r\n display: none; \r\n }\r\n .jsforesight-callback-indicator.animate {\r\n animation: jsforesight-callback-pulse 0.5s ease-out forwards;\r\n }\r\n \r\n .jsforesight-scroll-trajectory-line {\r\n height: 4px;\r\n background: repeating-linear-gradient(\r\n 90deg,\r\n #22c55e 0px,\r\n #22c55e 8px,\r\n transparent 8px,\r\n transparent 16px\r\n );\r\n transform-origin: left center;\r\n z-index: 9999;\r\n border-radius: 2px;\r\n display: none;\r\n animation: scroll-dash-flow 1.5s linear infinite;\r\n position: relative;\r\n box-shadow: 0 0 12px rgba(34, 197, 94, 0.4);\r\n }\r\n\r\n .jsforesight-scroll-trajectory-line::after {\r\n content: '';\r\n position: absolute;\r\n right: -6px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 8px solid #22c55e;\r\n border-top: 4px solid transparent;\r\n border-bottom: 4px solid transparent;\r\n filter: drop-shadow(0 0 6px rgba(34, 197, 94, 0.6));\r\n animation: scroll-arrow-pulse 1.5s ease-in-out infinite;\r\n }\r\n\r\n @keyframes scroll-dash-flow {\r\n 0% { background-position: 0px 0px; }\r\n 100% { background-position: 16px 0px; }\r\n }\r\n\r\n @keyframes scroll-arrow-pulse {\r\n 0%, 100% { \r\n transform: translateY(-50%) scale(1);\r\n filter: drop-shadow(0 0 6px rgba(34, 197, 94, 0.6));\r\n }\r\n 50% {\r\n transform: translateY(-50%) scale(1.2);\r\n filter: drop-shadow(0 0 12px rgba(34, 197, 94, 0.8));\r\n }\r\n }\r\n\r\n\r\n \r\n @keyframes jsforesight-callback-pulse {\r\n 0% {\r\n opacity: 1;\r\n box-shadow: 0 0 15px oklch(65% 0.22 280 / 0.7);\r\n }\r\n 100% {\r\n opacity: 0;\r\n box-shadow: 0 0 25px oklch(65% 0.22 280 / 0);\r\n }\r\n }\r\n `\r\n"],"names":["i","t","v","nodeType","some","e","u","callbackModes","errorString","PositionObserver","entries","static","_t","_r","_cm","_w","_h","_rm","_th","_c","constructor","callback","options","Error","this","Map","root","isElement","document","documentElement","rootMargin","threshold","indexOf","callbackMode","clientWidth","clientHeight","observe","target","contains","_n","then","ioEntry","boundingClientRect","getEntry","set","requestAnimationFrame","_rc","unobserve","has","delete","size","queue","Promise","resolve","updates","forEach","oldBoundingBox","isIntersecting","oldIsIntersecting","push","left","top","async","length","IntersectionObserver","ob","disconnect","get","cancelAnimationFrame","clear","formatValue","value","indent","spaces","repeat","Array","isArray","Object","formattedEntries","map","_a","key","val","concat","join","String","undefined","JSON","stringify","createAndAppendElement","tag","parent","attributes","element","createElement","id","className","data","setAttribute","appendChild","createAndAppendStyle","styleSheet","textContent","getIntersectingIcon","isIntersectingWithViewport","POSITION_HISTORY_SIZE_UNIT","TAB_OFFSET_UNIT","TRAJECTORY_PREDICTION_TIME_UNIT","COPY_SVG_ICON","NO_ELEMENTS_STRING","DebuggerControlPanel","foresightManager","debuggerInstance","elementListItemsContainer","elementCountSpan","callbackCountSpan","elementListItems","trajectoryEnabledCheckbox","tabEnabledCheckbox","scrollEnabledCheckbox","historySizeSlider","historyValueSpan","predictionTimeSlider","predictionValueSpan","tabOffsetSlider","tabOffsetValueSpan","scrollMarginSlider","scrollMarginValueSpan","showNameTagsCheckbox","sortOptionsPopup","sortButton","containerMinimizeButton","allSettingsSectionsContainer","debuggerElementsSection","isContainerMinimized","isMouseSettingsMinimized","isKeyboardSettingsMinimized","isScrollSettingsMinimized","isGeneralSettingsMinimized","SESSION_STORAGE_KEY","copySettingsButton","minimizedElementCount","copyTimeoutId","closeSortDropdownHandler","foresightManagerInstance","initialize","shadowRoot","debuggerSettings","isInitiated","debuggerControlPanelInstance","instance","_setupDOMAndListeners","prototype","controlsContainer","isControlPanelDefaultMinimized","createControlContainer","controlPanelStyleElement","getStyles","queryDOMElements","originalSectionStates","setupEventListeners","updateContainerVisibilityState","updateControlsState","getManagerData","globalSettings","defineProperty","loadSectionStatesFromSessionStorage","storedStatesRaw","sessionStorage","getItem","loadedStates","parse","mouse","_b","keyboard","scroll","_d","general","saveSectionStatesToSessionStorage","states","setItem","console","error","querySelector","handleCopySettings","obj","methodName","_this","navigator","clipboard","writeText","filter","innerHTML","clearTimeout","setTimeout","catch","err","createInputEventListener","spanElement","unit","setting","addEventListener","parseInt","alterGlobalSettings","createChangeEventListener","getDebuggerData","settings","isChecked","checked","alterDebuggerSettings","createSectionVisibilityToggleEventListener","section","isMinimizedFlagName","sectionHeader","stopPropagation","toggleMinimizeSection","classList","toggle","closest","dataset","sort","sortElementList","sortAndReorderElements","updateSortOptionUI","remove","bind","shouldMinimize","sectionContent","minimizeButton","style","display","elementListContent","_e","add","currentSort","querySelectorAll","button","btn","managerSettings","enableMousePrediction","enableTabPrediction","enableScrollPrediction","showNameTags","positionHistorySize","toString","trajectoryPredictionTime","tabOffset","scrollMargin","refreshRegisteredElementCountDisplay","elementsMap","visibleElementCount","totalElements","globalCallbackHits","tab","total","visibleTitle","title","hover","trajectory","forwards","reverse","down","right","up","removeElementFromList","elementData","listItem","registeredElements","updateElementVisibilityStatus","intersectingElement","intersectingIcon","addElementToList","sortOrder","elementsData","from","values","sortByDocumentPosition_1","a","b","position","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","fragment","createDocumentFragment","updateListItemContent","hitSlopText","elementBounds","hitSlop","top_1","bottom","comprehensiveTitle","name","cleanup","removeEventListener","container","rowsContentHeight","elementItemHeight","numItemsPerRow","updateElementOverlays","currentOverlays","newData","expandedOverlay","nameLabel","expandedRect","expandedWidth","expandedHeight","width","height","transform","DEFAULT_SHOW_NAME_TAGS","shouldUpdateSetting","newValue","currentValue","ForesightDebugger","callbackAnimations","_debuggerSettings","showDebugger","debugElementOverlays","predictedMouseIndicator","mouseTrajectoryLine","scrollTrajectoryLine","managerSubscriptionsController","animationPositionObserver","handleAnimationPositionChange","_i","entries_1","entry","animationData","rect","overlay","newLeft","newTop","newWidth","newHeight","handleElementDataUpdated","updatedProp","createOrUpdateElementOverlay","removeElementOverlay","controlPanel","handleRemoveElement","handleCallbackFired","showCallbackAnimation","handleAddElement","handleMouseTrajectoryUpdate","debugContainer","trajectoryPositions","predictedPoint","currentPoint","x","y","predictionEnabled","dx","dy","Math","sqrt","angle","atan2","PI","handleScrollTrajectoryUpdate","handleSettingsChanged","newSettings","props","window","subscribeToManagerEvents","shadowHost","_setupDOM","body","attachShadow","mode","debuggerCSS","toggleNameTagVisibility","AbortController","signal","manager","createElementOverlays","overlays","existingAnimation","timeoutId","animationOverlay","abort"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"sources":["../src/lit-entry/foresight-devtools.ts","../src/lit-entry/control-panel/control-panel.ts","../src/lit-entry/control-panel/element-tab/element-tab.ts","../src/lit-entry/control-panel/base-tab/tab-header.ts","../src/lit-entry/control-panel/base-tab/tab-content.ts","../src/lit-entry/control-panel/dropdown/single-select-dropdown.ts","../src/lit-entry/control-panel/dropdown/base-dropdown.ts","../src/lit-entry/control-panel/base-tab/chip.ts","../src/lit-entry/control-panel/element-tab/single-element.ts","../src/lit-entry/control-panel/base-tab/expandable-item.ts","../src/lit-entry/control-panel/copy-icon/copy-icon.ts","../src/svg/svg-icons.ts","../src/lit-entry/control-panel/base-tab/tab-selector.ts","../src/lit-entry/control-panel/log-tab/log-tab.ts","../src/helpers/safeSerializeEventData.ts","../src/lit-entry/control-panel/dropdown/multi-select-dropdown.ts","../src/lit-entry/control-panel/log-tab/single-log.ts","../src/lit-entry/control-panel/settings-tab/settings-tab.ts","../src/constants.ts","../src/lit-entry/control-panel/settings-tab/setting-item/setting-item-checkbox.ts","../src/lit-entry/control-panel/settings-tab/setting-item/setting-item.ts","../src/lit-entry/control-panel/settings-tab/setting-item/setting-item-range.ts","../src/lit-entry/debug-overlay/debug-overlay.ts","../src/lit-entry/debug-overlay/element-overlays.ts","../src/lit-entry/debug-overlay/mouse-trajectory.ts","../src/lit-entry/debug-overlay/scroll-trajectory.ts"],"sourcesContent":["import { LitElement, css, html } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\nimport type { DeepPartial, DevtoolsSettings } from \"../types/types\"\r\n\r\nimport \"./control-panel/control-panel\"\r\nimport \"./debug-overlay/debug-overlay\"\r\n\r\n@customElement(\"foresight-devtools\")\r\nexport class ForesightDevtools extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n `,\r\n ]\r\n\r\n @state() private isInitialized = false\r\n\r\n private static _instance: ForesightDevtools | null = null\r\n\r\n public devtoolsSettings: Required<DevtoolsSettings> = {\r\n showDebugger: true,\r\n isControlPanelDefaultMinimized: false,\r\n showNameTags: true,\r\n sortElementList: \"visibility\",\r\n logging: {\r\n logLocation: \"controlPanel\",\r\n callbackCompleted: true,\r\n callbackInvoked: true,\r\n elementDataUpdated: false,\r\n elementRegistered: false,\r\n elementUnregistered: false,\r\n managerSettingsChanged: true,\r\n mouseTrajectoryUpdate: false,\r\n scrollTrajectoryUpdate: false,\r\n },\r\n }\r\n\r\n public static initialize(props?: DeepPartial<DevtoolsSettings>): ForesightDevtools {\r\n if (!ForesightDevtools._instance) {\r\n ForesightDevtools._instance = document.createElement(\r\n \"foresight-devtools\"\r\n ) as ForesightDevtools\r\n document.body.appendChild(ForesightDevtools._instance)\r\n }\r\n\r\n const devtools = ForesightDevtools._instance\r\n devtools.isInitialized = true\r\n\r\n if (props !== undefined) {\r\n devtools.alterDevtoolsSettings(props)\r\n }\r\n\r\n return devtools\r\n }\r\n\r\n public static get instance(): ForesightDevtools {\r\n if (!ForesightDevtools._instance) {\r\n return ForesightDevtools.initialize()\r\n }\r\n return ForesightDevtools._instance\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this.cleanup()\r\n }\r\n\r\n private shouldUpdateSetting<T>(newValue: T | undefined, currentValue: T): newValue is T {\r\n return newValue !== undefined && newValue !== currentValue\r\n }\r\n\r\n public alterDevtoolsSettings(props?: DeepPartial<DevtoolsSettings>) {\r\n if (!props) return\r\n\r\n if (this.shouldUpdateSetting(props.showNameTags, this.devtoolsSettings.showNameTags)) {\r\n this.devtoolsSettings.showNameTags = props.showNameTags!\r\n this.dispatchEvent(\r\n new CustomEvent(\"showNameTagsChanged\", {\r\n detail: { showNameTags: props.showNameTags! },\r\n bubbles: true,\r\n })\r\n )\r\n }\r\n\r\n if (this.shouldUpdateSetting(props.showDebugger, this.devtoolsSettings.showDebugger)) {\r\n this.devtoolsSettings.showDebugger = props.showDebugger!\r\n this.requestUpdate()\r\n }\r\n\r\n if (\r\n this.shouldUpdateSetting(\r\n props.isControlPanelDefaultMinimized,\r\n this.devtoolsSettings.isControlPanelDefaultMinimized\r\n )\r\n ) {\r\n this.devtoolsSettings.isControlPanelDefaultMinimized = props.isControlPanelDefaultMinimized!\r\n }\r\n if (this.shouldUpdateSetting(props.sortElementList, this.devtoolsSettings.sortElementList)) {\r\n this.devtoolsSettings.sortElementList = props.sortElementList!\r\n }\r\n\r\n // Handle logging settings\r\n if (props.logging) {\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.logLocation,\r\n this.devtoolsSettings.logging.logLocation\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.logLocation = props.logging.logLocation\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.callbackCompleted,\r\n this.devtoolsSettings.logging.callbackCompleted\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.callbackCompleted = props.logging.callbackCompleted\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.callbackInvoked,\r\n this.devtoolsSettings.logging.callbackInvoked\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.callbackInvoked = props.logging.callbackInvoked\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.elementDataUpdated,\r\n this.devtoolsSettings.logging.elementDataUpdated\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.elementDataUpdated = props.logging.elementDataUpdated\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.elementRegistered,\r\n this.devtoolsSettings.logging.elementRegistered\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.elementRegistered = props.logging.elementRegistered\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.elementUnregistered,\r\n this.devtoolsSettings.logging.elementUnregistered\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.elementUnregistered = props.logging.elementUnregistered\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.managerSettingsChanged,\r\n this.devtoolsSettings.logging.managerSettingsChanged\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.managerSettingsChanged = props.logging.managerSettingsChanged\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.mouseTrajectoryUpdate,\r\n this.devtoolsSettings.logging.mouseTrajectoryUpdate\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.mouseTrajectoryUpdate = props.logging.mouseTrajectoryUpdate\r\n }\r\n if (\r\n this.shouldUpdateSetting(\r\n props.logging.scrollTrajectoryUpdate,\r\n this.devtoolsSettings.logging.scrollTrajectoryUpdate\r\n )\r\n ) {\r\n this.devtoolsSettings.logging.scrollTrajectoryUpdate = props.logging.scrollTrajectoryUpdate\r\n }\r\n }\r\n }\r\n\r\n private cleanup() {\r\n // Just trigger a re-render to hide the components\r\n this.requestUpdate()\r\n }\r\n\r\n render() {\r\n if (!this.isInitialized || !this.devtoolsSettings.showDebugger) {\r\n return html``\r\n }\r\n return html`<control-panel></control-panel> <debug-overlay></debug-overlay>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"foresight-devtools\": ForesightDevtools\r\n }\r\n}\r\n","import { LitElement, css, html } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\nimport { classMap } from \"lit/directives/class-map.js\"\r\n\r\nimport \"./element-tab/element-tab\"\r\nimport \"./base-tab/tab-selector\"\r\nimport \"./log-tab/log-tab\"\r\nimport \"./settings-tab/settings-tab\"\r\nimport type { ControllerTabs } from \"../../types/types\"\r\n\r\n@customElement(\"control-panel\")\r\nexport class ControlPanel extends LitElement {\r\n static styles = css`\r\n .control-wrapper {\r\n padding: 12px;\r\n position: fixed;\r\n bottom: 10px;\r\n right: 10px;\r\n background-color: rgba(0, 0, 0, 0.9);\r\n color: white;\r\n font-family: Arial, sans-serif;\r\n font-size: 13px;\r\n z-index: 10001;\r\n pointer-events: auto;\r\n display: flex;\r\n flex-direction: column;\r\n width: 450px;\r\n height: 450px;\r\n transition: width 0.3s ease, height 0.3s ease;\r\n box-sizing: border-box;\r\n }\r\n .control-wrapper.minimized {\r\n width: 230px;\r\n height: 45px;\r\n }\r\n\r\n .title-wrapper {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 0;\r\n flex-shrink: 0;\r\n }\r\n\r\n .title-wrapper h1 {\r\n margin: 0;\r\n font-size: 15px;\r\n }\r\n\r\n .title-element-count {\r\n font-size: 14px;\r\n text-align: right;\r\n }\r\n\r\n .minimize-button {\r\n background: none;\r\n border: none;\r\n color: white;\r\n font-size: 22px;\r\n cursor: pointer;\r\n line-height: 1;\r\n padding: 0;\r\n }\r\n\r\n .tab-container {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n\r\n .tab-container.hidden {\r\n display: none;\r\n }\r\n\r\n .tab-content {\r\n flex: 1;\r\n position: relative;\r\n }\r\n\r\n .tab-content > * {\r\n display: none;\r\n }\r\n\r\n .tab-content > .active {\r\n display: flex;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n `\r\n @state() private activeTab: ControllerTabs\r\n @state() private isMinimized: boolean = false\r\n @state() private visibleCount: number = 0\r\n @state() private totalCount: number = 0\r\n\r\n private localStorageSelectedTabKey = \"foresight-devtools-control-panel-tab\"\r\n constructor() {\r\n super()\r\n const tab = localStorage.getItem(this.localStorageSelectedTabKey)\r\n this.activeTab = (tab as ControllerTabs) || \"logs\"\r\n }\r\n private _handleTabChange(event: CustomEvent) {\r\n this.activeTab = event.detail.tab\r\n localStorage.setItem(this.localStorageSelectedTabKey, this.activeTab)\r\n }\r\n\r\n private _handleVisibilityCountChange = (event: Event) => {\r\n const customEvent = event as CustomEvent<{ visibleCount: number; totalCount: number }>\r\n this.visibleCount = customEvent.detail.visibleCount\r\n this.totalCount = customEvent.detail.totalCount\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback()\r\n this.addEventListener(\"visibility-count-updated\", this._handleVisibilityCountChange)\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this.removeEventListener(\"visibility-count-updated\", this._handleVisibilityCountChange)\r\n }\r\n\r\n protected render() {\r\n return html`\r\n <div class=\"control-wrapper ${this.isMinimized ? \"minimized\" : \"\"}\">\r\n <div class=\"title-wrapper\">\r\n <button @click=\"${() => (this.isMinimized = !this.isMinimized)}\" class=\"minimize-button\">\r\n -\r\n </button>\r\n <h1>Foresight DevTools</h1>\r\n <span\r\n title=\"Number of visible registered elements / total registered elements\"\r\n class=\"title-element-count\"\r\n >${this.visibleCount}/${this.totalCount}</span\r\n >\r\n </div>\r\n\r\n <div class=\"tab-container ${this.isMinimized ? \"hidden\" : \"\"}\">\r\n <tab-selector\r\n .activeTab=\"${this.activeTab}\"\r\n @tab-change=\"${this._handleTabChange}\"\r\n ></tab-selector>\r\n\r\n <div class=\"tab-content\">\r\n <log-tab class=${classMap({ active: this.activeTab === \"logs\" })}></log-tab>\r\n <element-tab class=${classMap({ active: this.activeTab === \"elements\" })}></element-tab>\r\n <settings-tab\r\n class=${classMap({ active: this.activeTab === \"settings\" })}\r\n ></settings-tab>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\nif (!customElements.get(\"control-panel\")) {\r\n customElements.define(\"control-panel\", ControlPanel)\r\n}\r\n","import { css, html, LitElement } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\nimport { map } from \"lit/directives/map.js\"\r\n\r\nimport \"../base-tab/tab-header\"\r\nimport \"../base-tab/tab-content\"\r\nimport \"../dropdown/single-select-dropdown\"\r\nimport \"../base-tab/chip\"\r\nimport \"../element-tab/single-element\"\r\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\r\nimport { ForesightManager, type ForesightElement, type ForesightElementData } from \"js.foresight\"\r\nimport type {\r\n CallbackCompletedEvent,\r\n CallbackInvokedEvent,\r\n ElementDataUpdatedEvent,\r\n ElementRegisteredEvent,\r\n ElementUnregisteredEvent,\r\n} from \"js.foresight\"\r\nimport type { CallbackHits, CallbackHitType } from \"js.foresight\"\r\nimport { ForesightDevtools } from \"../../foresight-devtools\"\r\nimport { DOCUMENT_SVG, INSERTION_SVG, VISIBILITY_SVG } from \"../../../svg/svg-icons\"\r\nimport type { SortElementList } from \"../../../types/types\"\r\n\r\n@customElement(\"element-tab\")\r\nexport class ElementTab extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n }\r\n\r\n .chips-container {\r\n display: flex;\r\n gap: 8px;\r\n }\r\n\r\n .element-content {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1;\r\n }\r\n\r\n .status-indicator {\r\n width: 8px;\r\n height: 8px;\r\n flex-shrink: 0;\r\n transition: all 0.3s ease;\r\n }\r\n\r\n .status-indicator.visible {\r\n background-color: #4caf50;\r\n box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.3);\r\n }\r\n\r\n .status-indicator.hidden {\r\n background-color: #666;\r\n box-shadow: 0 0 0 2px rgba(102, 102, 102, 0.2);\r\n }\r\n\r\n .status-indicator.prefetching {\r\n background-color: #ffeb3b;\r\n box-shadow: 0 0 0 2px rgba(255, 235, 59, 0.4);\r\n }\r\n\r\n .element-name {\r\n flex-grow: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: #e8e8e8;\r\n }\r\n\r\n .element-name.callback-active {\r\n color: #fff;\r\n font-weight: 600;\r\n }\r\n `\r\n\r\n @state()\r\n private hitCount: CallbackHits = {\r\n mouse: { hover: 0, trajectory: 0 },\r\n scroll: { down: 0, left: 0, right: 0, up: 0 },\r\n tab: { forwards: 0, reverse: 0 },\r\n total: 0,\r\n }\r\n\r\n @state()\r\n private visibleElementsCount: number = 0\r\n\r\n @state()\r\n private totalElementsCount: number = 0\r\n\r\n @state() private sortDropdown: DropdownOption[]\r\n @state() private sortOrder: SortElementList\r\n @state() private elementListItems: Map<\r\n ForesightElement,\r\n ForesightElementData & { elementId: string }\r\n > = new Map()\r\n @state() private noContentMessage: string = \"No Elements Registered To The Foresight Manager\"\r\n @state() private activeCallbacks: Set<ForesightElement> = new Set()\r\n @state() private expandedElementIds: Set<string> = new Set()\r\n private elementIdCounter: number = 0\r\n private _abortController: AbortController | null = null\r\n\r\n constructor() {\r\n super()\r\n this.sortOrder = ForesightDevtools.instance.devtoolsSettings.sortElementList\r\n this.sortDropdown = [\r\n {\r\n value: \"visibility\",\r\n label: \"Visibility\",\r\n title: \"Sort by Visibility\",\r\n icon: VISIBILITY_SVG,\r\n },\r\n {\r\n value: \"documentOrder\",\r\n label: \"Document Order\",\r\n title: \"Sort by Document Order\",\r\n icon: DOCUMENT_SVG,\r\n },\r\n {\r\n value: \"insertionOrder\",\r\n label: \"Insertion Order\",\r\n title: \"Sort by Insertion Order\",\r\n icon: INSERTION_SVG,\r\n },\r\n ]\r\n }\r\n\r\n private handleSortChange = (value: string): void => {\r\n this.sortOrder = value as SortElementList\r\n }\r\n\r\n private generateElementId(): string {\r\n return (++this.elementIdCounter).toString()\r\n }\r\n\r\n private handleElementToggle = (elementId: string): void => {\r\n const newExpandedElementIds = new Set(this.expandedElementIds)\r\n if (newExpandedElementIds.has(elementId)) {\r\n newExpandedElementIds.delete(elementId)\r\n } else {\r\n newExpandedElementIds.add(elementId)\r\n }\r\n this.expandedElementIds = newExpandedElementIds\r\n }\r\n\r\n private updateVisibilityCounts() {\r\n let visibleCount = 0\r\n let totalCount = 0\r\n this.elementListItems.forEach(data => {\r\n totalCount++\r\n if (data.isIntersectingWithViewport) {\r\n visibleCount++\r\n }\r\n })\r\n this.visibleElementsCount = visibleCount\r\n this.totalElementsCount = totalCount\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"visibility-count-updated\", {\r\n detail: { visibleCount, totalCount },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n )\r\n }\r\n\r\n private _generateHitsChipTitle(hitCounts: CallbackHits): string {\r\n const lines: string[] = []\r\n\r\n lines.push(`Total Hits: ${hitCounts.total}`)\r\n lines.push(\"\")\r\n\r\n lines.push(`Mouse: Trajectory: ${hitCounts.mouse.trajectory}, Hover: ${hitCounts.mouse.hover}`)\r\n lines.push(\r\n `Scroll: Up: ${hitCounts.scroll.up}, Down: ${hitCounts.scroll.down}, Left: ${hitCounts.scroll.left}, Right: ${hitCounts.scroll.right}`\r\n )\r\n lines.push(`Tab: Forwards: ${hitCounts.tab.forwards}, Reverse: ${hitCounts.tab.reverse}`)\r\n\r\n return lines.join(\"\\n\")\r\n }\r\n\r\n connectedCallback() {\r\n super.connectedCallback()\r\n this._abortController = new AbortController()\r\n const { signal } = this._abortController\r\n this.updateElementListFromManager()\r\n this.updateVisibilityCounts()\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"elementRegistered\",\r\n (e: ElementRegisteredEvent) => {\r\n const elementWithId = {\r\n ...e.elementData,\r\n elementId: this.generateElementId(),\r\n }\r\n this.elementListItems.set(e.elementData.element, elementWithId)\r\n this.updateVisibilityCounts()\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"elementDataUpdated\",\r\n (e: ElementDataUpdatedEvent) => {\r\n const existingElementData = this.elementListItems.get(e.elementData.element)\r\n if (existingElementData) {\r\n const updatedElementWithId = {\r\n ...e.elementData,\r\n elementId: existingElementData.elementId,\r\n }\r\n // Direct Map mutation is more efficient than creating new Map\r\n this.elementListItems.set(e.elementData.element, updatedElementWithId)\r\n this.updateVisibilityCounts()\r\n this.requestUpdate()\r\n }\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"elementUnregistered\",\r\n (e: ElementUnregisteredEvent) => {\r\n this.elementListItems.delete(e.elementData.element)\r\n this.updateVisibilityCounts()\r\n if (!this.elementListItems.size) {\r\n this.noContentMessage = \"No Elements Registered To The Foresight Manager\"\r\n }\r\n this.requestUpdate()\r\n this.activeCallbacks.delete(e.elementData.element)\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"callbackInvoked\",\r\n (e: CallbackInvokedEvent) => {\r\n this.activeCallbacks.add(e.elementData.element)\r\n this.requestUpdate()\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"callbackCompleted\",\r\n (e: CallbackCompletedEvent) => {\r\n this.handleCallbackCompleted(e.hitType)\r\n this.activeCallbacks.delete(e.elementData.element)\r\n },\r\n { signal }\r\n )\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._abortController?.abort()\r\n this._abortController = null\r\n }\r\n\r\n private updateElementListFromManager() {\r\n const elementsWithIds = new Map<\r\n ForesightElement,\r\n ForesightElementData & { elementId: string }\r\n >()\r\n ForesightManager.instance.registeredElements.forEach((elementData, element) => {\r\n elementsWithIds.set(element, {\r\n ...elementData,\r\n elementId: this.generateElementId(),\r\n })\r\n })\r\n this.elementListItems = elementsWithIds\r\n }\r\n\r\n private handleCallbackCompleted(hitType: CallbackHitType) {\r\n // Direct mutation is more efficient than object spreading\r\n switch (hitType.kind) {\r\n case \"mouse\":\r\n this.hitCount.mouse[hitType.subType]++\r\n break\r\n case \"tab\":\r\n this.hitCount.tab[hitType.subType]++\r\n break\r\n case \"scroll\":\r\n this.hitCount.scroll[hitType.subType]++\r\n break\r\n default:\r\n hitType satisfies never\r\n }\r\n\r\n this.hitCount.total++\r\n\r\n // Trigger LIT's reactive update\r\n this.requestUpdate()\r\n }\r\n\r\n private getSortedElements(): (ForesightElementData & { elementId: string })[] {\r\n const elementsData = Array.from(this.elementListItems.values())\r\n\r\n switch (this.sortOrder) {\r\n case \"insertionOrder\":\r\n return elementsData\r\n case \"documentOrder\":\r\n return elementsData.sort(this.sortByDocumentPosition)\r\n case \"visibility\":\r\n return elementsData.sort(\r\n (\r\n a: ForesightElementData & { elementId: string },\r\n b: ForesightElementData & { elementId: string }\r\n ) => {\r\n if (a.isIntersectingWithViewport !== b.isIntersectingWithViewport) {\r\n return a.isIntersectingWithViewport ? -1 : 1\r\n }\r\n return this.sortByDocumentPosition(a, b)\r\n }\r\n )\r\n default:\r\n this.sortOrder satisfies never\r\n return elementsData\r\n }\r\n }\r\n\r\n private sortByDocumentPosition = (\r\n a: ForesightElementData & { elementId: string },\r\n b: ForesightElementData & { elementId: string }\r\n ) => {\r\n const position = a.element.compareDocumentPosition(b.element)\r\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1\r\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1\r\n return 0\r\n }\r\n\r\n render() {\r\n return html`\r\n <tab-header>\r\n <div slot=\"chips\" class=\"chips-container\">\r\n <chip-element title=\"Number of visible registered elements / total registered elements\">\r\n ${this.visibleElementsCount}/${this.totalElementsCount} visible\r\n </chip-element>\r\n <chip-element title=\"${this._generateHitsChipTitle(this.hitCount)}\">\r\n ${this.hitCount.total} hits\r\n </chip-element>\r\n </div>\r\n <div slot=\"actions\">\r\n <single-select-dropdown\r\n .dropdownOptions=\"${this.sortDropdown}\"\r\n .selectedOptionValue=\"${this.sortOrder}\"\r\n .onSelectionChange=\"${this.handleSortChange}\"\r\n ></single-select-dropdown>\r\n </div>\r\n </tab-header>\r\n <tab-content\r\n .noContentMessage=${this.noContentMessage}\r\n .hasContent=${!!this.elementListItems.size}\r\n >\r\n ${map(this.getSortedElements(), elementData => {\r\n return html`\r\n <single-element\r\n .elementData=${elementData}\r\n .isActive=${this.activeCallbacks.has(elementData.element)}\r\n .isExpanded=${this.expandedElementIds.has(elementData.elementId)}\r\n .onToggle=${this.handleElementToggle}\r\n ></single-element>\r\n `\r\n })}\r\n </tab-content>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"element-tab\": ElementTab\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement } from \"lit/decorators.js\"\r\n\r\n@customElement(\"tab-header\")\r\nexport class TabHeader extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n }\r\n .tab-bar-info {\r\n display: flex;\r\n gap: 12px;\r\n align-items: center;\r\n flex: 1;\r\n }\r\n\r\n .stats-chips {\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n }\r\n\r\n .chip {\r\n font-size: 11px;\r\n font-weight: 500;\r\n padding: 4px 8px;\r\n border: 1px solid #555;\r\n white-space: nowrap;\r\n letter-spacing: 0.3px;\r\n background: rgba(40, 40, 40, 0.7);\r\n color: #b0c4de;\r\n }\r\n\r\n .tab-bar-actions {\r\n display: flex;\r\n gap: 6px;\r\n align-items: center;\r\n position: relative;\r\n flex-direction: row;\r\n }\r\n .tab-bar-elements {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 4px 0 4px 0;\r\n border-bottom: 1px solid #444;\r\n position: sticky;\r\n top: 0;\r\n z-index: 5;\r\n min-height: 36px;\r\n }\r\n `,\r\n ]\r\n\r\n render() {\r\n return html`\r\n <div class=\"tab-bar-elements\">\r\n <div class=\"tab-bar-info\">\r\n <div class=\"stats-chips\">\r\n <slot name=\"chips\"></slot>\r\n </div>\r\n </div>\r\n <div class=\"tab-bar-actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"tab-header\": TabHeader\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\n\r\n@customElement(\"tab-content\")\r\nexport class TabContent extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n overflow: hidden;\r\n }\r\n\r\n .content-container::-webkit-scrollbar {\r\n width: 8px;\r\n }\r\n\r\n .content-container::-webkit-scrollbar-track {\r\n background: rgba(30, 30, 30, 0.5);\r\n }\r\n\r\n .content-container::-webkit-scrollbar-thumb {\r\n background-color: rgba(176, 196, 222, 0.5);\r\n border: 2px solid rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n .content-container::-webkit-scrollbar-thumb:hover {\r\n background-color: rgba(176, 196, 222, 0.7);\r\n }\r\n\r\n .content-container {\r\n height: 100%;\r\n min-height: 150px;\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n scrollbar-color: rgba(176, 196, 222, 0.5) rgba(30, 30, 30, 0.5);\r\n }\r\n\r\n .no-content-message {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height: 100%;\r\n color: #afafaf;\r\n font-style: italic;\r\n font-family: \"Courier New\", monospace;\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: String, attribute: \"no-content-message\" })\r\n noContentMessage: string = \"No content available.\"\r\n\r\n @property({ type: Boolean })\r\n hasContent: boolean = true\r\n\r\n render() {\r\n return html`\r\n <div class=\"content-container\">\r\n ${this.hasContent\r\n ? html`<slot></slot>`\r\n : html`<div class=\"no-content-message\">${this.noContentMessage}</div>`}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"tab-content\": TabContent\r\n }\r\n}\r\n","import { html, type TemplateResult } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\nimport { BaseDropdown, type DropdownOption } from \"./base-dropdown\"\r\n\r\nexport type { DropdownOption } from \"./base-dropdown\"\r\n\r\n@customElement(\"single-select-dropdown\")\r\nexport class SingleSelectDropdown extends BaseDropdown {\r\n @property({ type: String }) selectedOptionValue: string = \"\"\r\n @property({ type: Function }) onSelectionChange?: (value: string) => void\r\n\r\n connectedCallback() {\r\n super.connectedCallback()\r\n if (this.dropdownOptions.length > 0 && !this.selectedOptionValue) {\r\n this.selectedOptionValue = this.dropdownOptions[0].value\r\n }\r\n }\r\n\r\n willUpdate(changedProperties: Map<PropertyKey, unknown>) {\r\n if (\r\n changedProperties.has(\"dropdownOptions\") &&\r\n this.dropdownOptions.length > 0 &&\r\n !this.selectedOptionValue\r\n ) {\r\n this.selectedOptionValue = this.dropdownOptions[0].value\r\n }\r\n }\r\n\r\n protected _handleOptionClick(option: DropdownOption): void {\r\n if (option.value !== this.selectedOptionValue) {\r\n this.selectedOptionValue = option.value\r\n this.onSelectionChange?.(option.value)\r\n }\r\n this._closeDropdown()\r\n }\r\n\r\n protected _getTriggerIcon(): TemplateResult {\r\n const selectedOption = this._getSelectedOption()\r\n return selectedOption ? selectedOption.icon : html``\r\n }\r\n\r\n protected _isOptionSelected(option: DropdownOption): boolean {\r\n return option.value === this.selectedOptionValue\r\n }\r\n\r\n protected _getTriggerTitle(): string {\r\n const selected = this._getSelectedOption()\r\n return selected ? selected.title : \"Change selection\"\r\n }\r\n\r\n protected _getTriggerLabel(): string {\r\n const selected = this._getSelectedOption()\r\n return selected ? `Current selection: ${selected.label}` : \"No selection\"\r\n }\r\n\r\n private _getSelectedOption(): DropdownOption | undefined {\r\n return this.dropdownOptions.find(option => option.value === this.selectedOptionValue)\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"single-select-dropdown\": SingleSelectDropdown\r\n }\r\n}\r\n","import { LitElement, html, css, type TemplateResult } from \"lit\"\r\nimport { property, state } from \"lit/decorators.js\"\r\n\r\nexport type DropdownOption = {\r\n value: string\r\n label: string\r\n title: string\r\n icon: TemplateResult\r\n}\r\n\r\nexport abstract class BaseDropdown extends LitElement {\r\n private static currentlyOpen: BaseDropdown | null = null\r\n\r\n static styles = [\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .dropdown-container {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n\r\n .trigger-button {\r\n background: none;\r\n border: none;\r\n color: white;\r\n cursor: pointer;\r\n padding: 6px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n transition: all 0.2s ease;\r\n }\r\n\r\n .trigger-button svg {\r\n width: 16px;\r\n height: 16px;\r\n stroke: white;\r\n transition: stroke 0.2s;\r\n }\r\n\r\n .trigger-button .arrow-icon {\r\n width: 10px;\r\n height: 10px;\r\n stroke: white;\r\n fill: none;\r\n stroke-width: 2;\r\n transition: transform 0.2s ease, stroke 0.2s;\r\n }\r\n\r\n .trigger-button:hover {\r\n background-color: rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .trigger-button:hover svg,\r\n .trigger-button:hover .arrow-icon {\r\n stroke: #b0c4de;\r\n }\r\n\r\n .trigger-button.active {\r\n background-color: rgba(176, 196, 222, 0.2);\r\n }\r\n\r\n .trigger-button.active svg {\r\n stroke: #b0c4de;\r\n }\r\n\r\n .trigger-button.active .arrow-icon {\r\n transform: rotate(180deg);\r\n stroke: #b0c4de;\r\n }\r\n\r\n .dropdown-menu {\r\n position: fixed;\r\n z-index: 9999;\r\n display: none;\r\n flex-direction: column;\r\n background-color: #3a3a3a;\r\n border: 1px solid #555;\r\n min-width: 200px;\r\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\r\n overflow: hidden;\r\n }\r\n\r\n .dropdown-menu.active {\r\n display: flex;\r\n }\r\n\r\n .dropdown-menu button {\r\n background: none;\r\n border: none;\r\n color: #ccc;\r\n font-size: 12px;\r\n text-align: left;\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n position: relative;\r\n width: 100%;\r\n box-sizing: border-box;\r\n }\r\n\r\n .dropdown-menu button:hover {\r\n background-color: #555;\r\n color: white;\r\n }\r\n\r\n .dropdown-menu button.active {\r\n color: #b0c4de;\r\n font-weight: bold;\r\n background-color: rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .dropdown-menu button.active::after {\r\n content: \"✓\";\r\n position: absolute;\r\n right: 8px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: #b0c4de;\r\n font-weight: bold;\r\n }\r\n `,\r\n ]\r\n\r\n @state() protected isDropdownOpen: boolean = false\r\n @property({ type: Array }) dropdownOptions: DropdownOption[] = []\r\n\r\n connectedCallback() {\r\n super.connectedCallback()\r\n document.addEventListener(\"click\", this._handleOutsideClick)\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener(\"click\", this._handleOutsideClick)\r\n if (BaseDropdown.currentlyOpen === this) {\r\n BaseDropdown.currentlyOpen = null\r\n }\r\n }\r\n\r\n protected _toggleDropdown = (event: MouseEvent) => {\r\n event.stopPropagation()\r\n\r\n if (this.isDropdownOpen) {\r\n this._closeDropdown()\r\n } else {\r\n if (BaseDropdown.currentlyOpen && BaseDropdown.currentlyOpen !== this) {\r\n BaseDropdown.currentlyOpen._closeDropdown()\r\n }\r\n\r\n this.isDropdownOpen = true\r\n BaseDropdown.currentlyOpen = this\r\n\r\n requestAnimationFrame(() => {\r\n this._positionDropdown()\r\n })\r\n }\r\n }\r\n\r\n protected _closeDropdown(): void {\r\n this.isDropdownOpen = false\r\n if (BaseDropdown.currentlyOpen === this) {\r\n BaseDropdown.currentlyOpen = null\r\n }\r\n }\r\n\r\n protected _positionDropdown() {\r\n const triggerButton = this.shadowRoot?.querySelector(\".trigger-button\") as HTMLElement\r\n const dropdownMenu = this.shadowRoot?.querySelector(\".dropdown-menu\") as HTMLElement\r\n\r\n if (triggerButton && dropdownMenu) {\r\n const rect = triggerButton.getBoundingClientRect()\r\n const dropdownHeight = dropdownMenu.offsetHeight || 200\r\n\r\n const top = rect.bottom + 5\r\n const right = window.innerWidth - rect.right\r\n\r\n const availableSpaceBelow = window.innerHeight - rect.bottom\r\n const shouldPositionAbove = availableSpaceBelow < dropdownHeight && rect.top > dropdownHeight\r\n\r\n if (shouldPositionAbove) {\r\n dropdownMenu.style.top = `${rect.top - dropdownHeight - 5}px`\r\n } else {\r\n dropdownMenu.style.top = `${top}px`\r\n }\r\n\r\n dropdownMenu.style.right = `${right}px`\r\n }\r\n }\r\n\r\n protected _handleOutsideClick = (event: MouseEvent) => {\r\n if (this.isDropdownOpen) {\r\n if (!event.composedPath().includes(this)) {\r\n this._closeDropdown()\r\n }\r\n }\r\n }\r\n\r\n protected abstract _handleOptionClick(option: DropdownOption): void\r\n protected abstract _getTriggerIcon(): TemplateResult\r\n protected abstract _isOptionSelected(option: DropdownOption): boolean\r\n protected abstract _getTriggerTitle(): string\r\n protected abstract _getTriggerLabel(): string\r\n\r\n render() {\r\n const buttonClass = `trigger-button ${this.isDropdownOpen ? \"active\" : \"\"}`\r\n const menuClass = `dropdown-menu ${this.isDropdownOpen ? \"active\" : \"\"}`\r\n\r\n return html`\r\n <div class=\"dropdown-container\">\r\n <button\r\n class=\"${buttonClass}\"\r\n title=\"${this._getTriggerTitle()}\"\r\n @click=\"${this._toggleDropdown}\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"${this.isDropdownOpen}\"\r\n aria-controls=\"dropdown-menu\"\r\n aria-label=\"${this._getTriggerLabel()}\"\r\n >\r\n ${this._getTriggerIcon()}\r\n <svg\r\n class=\"arrow-icon\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <div class=\"${menuClass}\" id=\"dropdown-menu\" role=\"menu\">\r\n ${this.dropdownOptions.map(\r\n option => html`\r\n <button\r\n value=\"${option.value}\"\r\n title=\"${option.title}\"\r\n class=\"${this._isOptionSelected(option) ? \"active\" : \"\"}\"\r\n @click=\"${() => this._handleOptionClick(option)}\"\r\n role=\"menuitem\"\r\n >\r\n ${option.label}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\n\r\n@customElement(\"chip-element\")\r\nexport class ChipElement extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .chip {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 3px 8px;\r\n background-color: rgba(255, 255, 255, 0.05);\r\n color: #e8e8e8;\r\n font-size: 10px;\r\n font-weight: 500;\r\n white-space: nowrap;\r\n border: 1px solid rgba(255, 255, 255, 0.1);\r\n font-family: \"SF Mono\", \"Monaco\", \"Consolas\", \"Liberation Mono\", \"Courier New\", monospace;\r\n letter-spacing: 0.02em;\r\n line-height: 1.2;\r\n transition: all 0.2s ease;\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: String }) title: string = \"\"\r\n\r\n render() {\r\n return html`\r\n <span class=\"chip\" title=\"${this.title}\">\r\n <slot></slot>\r\n </span>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"chip-element\": ChipElement\r\n }\r\n}\r\n","import type { ForesightElementData } from \"js.foresight\"\r\nimport { LitElement, html, css } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\nimport \"../base-tab/expandable-item\"\r\n\r\n@customElement(\"single-element\")\r\nexport class SingleElement extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .element-content {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex: 1;\r\n }\r\n\r\n .status-indicator {\r\n width: 8px;\r\n height: 8px;\r\n flex-shrink: 0;\r\n transition: all 0.3s ease;\r\n }\r\n\r\n .status-indicator.visible {\r\n background-color: #4caf50;\r\n box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.3);\r\n }\r\n\r\n .status-indicator.hidden {\r\n background-color: #666;\r\n box-shadow: 0 0 0 2px rgba(102, 102, 102, 0.2);\r\n }\r\n\r\n .status-indicator.prefetching {\r\n background-color: #ffeb3b;\r\n box-shadow: 0 0 0 2px rgba(255, 235, 59, 0.4);\r\n }\r\n\r\n .element-name {\r\n flex-grow: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: #e8e8e8;\r\n }\r\n\r\n .element-name.callback-active {\r\n color: #fff;\r\n font-weight: 600;\r\n }\r\n `,\r\n ]\r\n\r\n @property() elementData!: ForesightElementData & { elementId: string }\r\n @property() isActive: boolean = false\r\n @property() isExpanded: boolean = false\r\n @property() onToggle: ((elementId: string) => void) | undefined\r\n\r\n private getBorderColor(): string {\r\n if (this.isActive) {\r\n return \"#ffeb3b\"\r\n }\r\n return this.elementData.isIntersectingWithViewport ? \"#4caf50\" : \"#666\"\r\n }\r\n\r\n private getStatusIndicatorClass(): string {\r\n if (this.isActive) {\r\n return \"prefetching\"\r\n }\r\n return this.elementData.isIntersectingWithViewport ? \"visible\" : \"hidden\"\r\n }\r\n\r\n private formatElementDetails(): string {\r\n const details = {\r\n tagName: this.elementData.element.tagName.toLowerCase(),\r\n isIntersecting: this.elementData.isIntersectingWithViewport,\r\n registerCount: this.elementData.registerCount,\r\n hitSlop: {\r\n top: this.elementData.elementBounds.hitSlop.top,\r\n right: this.elementData.elementBounds.hitSlop.right,\r\n bottom: this.elementData.elementBounds.hitSlop.bottom,\r\n left: this.elementData.elementBounds.hitSlop.left,\r\n },\r\n }\r\n\r\n return JSON.stringify(details, null, 2)\r\n }\r\n\r\n render() {\r\n return html`\r\n <expandable-item\r\n .borderColor=${this.getBorderColor()}\r\n .showCopyButton=${true}\r\n .itemId=${this.elementData.elementId}\r\n .isExpanded=${this.isExpanded}\r\n .onToggle=${this.onToggle}\r\n >\r\n <div slot=\"content\" class=\"element-content\">\r\n <div class=\"status-indicator ${this.getStatusIndicatorClass()}\"></div>\r\n <span class=\"element-name ${this.isActive ? \"callback-active\" : \"\"}\">\r\n ${this.elementData.name || \"unnamed\"}\r\n </span>\r\n </div>\r\n <div slot=\"details\">${this.formatElementDetails()}</div>\r\n </expandable-item>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"single-element\": SingleElement\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\nimport \"../copy-icon/copy-icon\"\r\n\r\n@customElement(\"expandable-item\")\r\nexport class ExpandableItem extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .item-entry {\r\n margin-bottom: 2px;\r\n font-size: 11px;\r\n line-height: 1.3;\r\n overflow: hidden;\r\n transition: all 0.2s ease;\r\n border-left: 2px solid var(--border-color, #555);\r\n padding-left: 6px;\r\n }\r\n\r\n .item-entry:hover:not(.expanded) {\r\n background-color: rgba(255, 255, 255, 0.02);\r\n }\r\n\r\n .item-entry.expanded {\r\n background-color: rgba(255, 255, 255, 0.03);\r\n }\r\n\r\n .item-header {\r\n display: flex;\r\n align-items: center;\r\n padding: 3px 4px;\r\n cursor: pointer;\r\n transition: background-color 0.2s ease;\r\n gap: 8px;\r\n min-height: 20px;\r\n }\r\n\r\n .item-header:hover:not(.expanded) {\r\n background-color: rgba(255, 255, 255, 0.03);\r\n }\r\n\r\n .item-details {\r\n position: relative;\r\n border-top: 1px solid rgba(255, 255, 255, 0.1);\r\n }\r\n\r\n .item-toggle {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n margin-left: 4px;\r\n user-select: none;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n border-radius: 2px;\r\n }\r\n\r\n .item-toggle:hover {\r\n background-color: rgba(255, 255, 255, 0.1);\r\n }\r\n\r\n .item-toggle svg {\r\n width: 12px;\r\n height: 12px;\r\n fill: none;\r\n stroke: #b0c4de;\r\n stroke-width: 2;\r\n stroke-linecap: round;\r\n stroke-linejoin: round;\r\n transition: all 0.2s ease;\r\n }\r\n\r\n .item-toggle:hover svg {\r\n stroke: #d4e4f4;\r\n }\r\n\r\n .item-toggle.expanded svg {\r\n transform: rotate(90deg);\r\n }\r\n\r\n .item-content {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n min-width: 0;\r\n overflow: hidden;\r\n }\r\n\r\n .item-data {\r\n color: #e0e0e0;\r\n white-space: pre;\r\n font-size: 11px;\r\n margin: 0;\r\n padding: 0;\r\n font-family: \"Courier New\", monospace;\r\n line-height: 1.3;\r\n display: block;\r\n overflow-x: auto;\r\n }\r\n `,\r\n ]\r\n\r\n @property() borderColor: string = \"#555\"\r\n @property() showCopyButton: boolean = false\r\n @property() itemId: string = \"\"\r\n @property() isExpanded: boolean = false\r\n @property() onToggle: ((itemId: string) => void) | undefined\r\n\r\n private toggleExpand(): void {\r\n if (this.onToggle) {\r\n this.onToggle(this.itemId)\r\n }\r\n }\r\n\r\n private async handleCopy(event: MouseEvent): Promise<void> {\r\n event.stopPropagation()\r\n const detailsSlot = this.shadowRoot?.querySelector('slot[name=\"details\"]') as HTMLSlotElement\r\n if (detailsSlot) {\r\n const assignedNodes = detailsSlot.assignedNodes()\r\n const textContent = assignedNodes.map(node => node.textContent).join(\"\")\r\n try {\r\n await navigator.clipboard.writeText(textContent)\r\n } catch (err) {\r\n console.error(\"Failed to copy text: \", err)\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n this.style.setProperty(\"--border-color\", this.borderColor)\r\n\r\n return html`\r\n <div class=\"item-entry ${this.isExpanded ? \"expanded\" : \"\"}\">\r\n <div class=\"item-header ${this.isExpanded ? \"expanded\" : \"\"}\" @click=\"${this.toggleExpand}\">\r\n <div class=\"item-content\">\r\n <slot name=\"content\"></slot>\r\n </div>\r\n <span class=\"item-toggle ${this.isExpanded ? \"expanded\" : \"\"}\">\r\n <svg viewBox=\"0 0 24 24\">\r\n <polyline points=\"9,18 15,12 9,6\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n ${this.isExpanded\r\n ? html`\r\n <div class=\"item-details\">\r\n <copy-icon\r\n positioned\r\n title=\"Copy Details\"\r\n .onCopy=${(event: MouseEvent) => this.handleCopy(event)}\r\n ></copy-icon>\r\n <pre class=\"item-data\">\r\n <slot name=\"details\"></slot>\r\n </pre>\r\n </div>\r\n `\r\n : \"\"}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"expandable-item\": ExpandableItem\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property, state } from \"lit/decorators.js\"\r\nimport { COPY_SVG, TICK_SVG } from \"../../../svg/svg-icons\"\r\n\r\n@customElement(\"copy-icon\")\r\nexport class CopyIcon extends LitElement {\r\n static styles = css`\r\n .copy-button {\r\n background: transparent;\r\n border: 0px;\r\n cursor: pointer;\r\n padding: 6px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease, background-color 0.2s ease;\r\n }\r\n\r\n :host([positioned]) .copy-button {\r\n position: absolute;\r\n top: 10px;\r\n right: 1px;\r\n }\r\n\r\n .copy-button:hover {\r\n background-color: rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .copy-button:hover svg {\r\n stroke: #b0c4de;\r\n }\r\n\r\n .copy-button svg {\r\n width: 14px;\r\n height: 14px;\r\n stroke: #ddd;\r\n stroke-width: 2.5;\r\n }\r\n\r\n .copy-button.copied svg {\r\n stroke: #4caf50;\r\n }\r\n `\r\n\r\n @property({ type: String }) title: string = \"Copy to clipboard\"\r\n @property({ type: Function }) onCopy?: (event: MouseEvent) => Promise<void> | void\r\n\r\n @state() private isCopied: boolean = false\r\n @state() private copyTimeout: ReturnType<typeof setTimeout> | null = null\r\n\r\n private async handleClick(event: MouseEvent): Promise<void> {\r\n if (this.isCopied) return\r\n\r\n if (this.onCopy) {\r\n try {\r\n await this.onCopy(event)\r\n } catch (error) {\r\n console.error(\"Error in onCopy function:\", error)\r\n }\r\n }\r\n\r\n this.isCopied = true\r\n\r\n if (this.copyTimeout) {\r\n clearTimeout(this.copyTimeout)\r\n }\r\n\r\n this.copyTimeout = setTimeout(() => {\r\n this.isCopied = false\r\n this.copyTimeout = null\r\n }, 2000)\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n if (this.copyTimeout) {\r\n clearTimeout(this.copyTimeout)\r\n this.copyTimeout = null\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <button\r\n class=\"copy-button ${this.isCopied ? \"copied\" : \"\"}\"\r\n title=\"${this.title}\"\r\n @click=${this.handleClick}\r\n >\r\n ${this.isCopied ? TICK_SVG : COPY_SVG}\r\n </button>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"copy-icon\": CopyIcon\r\n }\r\n}\r\n","import { html } from \"lit\"\r\n\r\nexport const CONTROL_PANEL_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"15\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\"></line>\r\n <line x1=\"7\" y1=\"21\" x2=\"17\" y2=\"21\"></line>\r\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line>\r\n </svg>\r\n`\r\n\r\nexport const CONSOLE_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polyline points=\"4 17 10 11 4 5\"></polyline>\r\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line>\r\n </svg>\r\n`\r\n\r\nexport const NONE_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"></path>\r\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"></path>\r\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>\r\n </svg>\r\n`\r\n\r\nexport const BOTH_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M12 2v8\" />\r\n <path d=\"M12 10l-6 6\" />\r\n <path d=\"M12 10l6 6\" />\r\n <circle cx=\"6\" cy=\"18\" r=\"2\" />\r\n <circle cx=\"18\" cy=\"18\" r=\"2\" />\r\n </svg>\r\n`\r\n\r\n// Keep the existing SVGs that were not requested to be changed\r\nexport const VISIBILITY_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </svg>\r\n`\r\nexport const DOCUMENT_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\r\n <line x1=\"10\" y1=\"9\" x2=\"8\" y2=\"9\" />\r\n </svg>\r\n`\r\n\r\nexport const INSERTION_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\r\n </svg>\r\n`\r\n\r\nexport const FILTER_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polygon points=\"22,3 2,3 10,12.46 10,19 14,21 14,12.46\" />\r\n </svg>\r\n`\r\n\r\nexport const CLEAR_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\" />\r\n </svg>\r\n`\r\n\r\nexport const COPY_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n`\r\n\r\nexport const TICK_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n`\r\n\r\nexport const WARNING_SVG = html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\r\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\r\n </svg>\r\n`\r\n","import { css, html, LitElement } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\nimport type { ControllerTabs } from \"../../../types/types\"\r\n\r\n@customElement(\"tab-selector\")\r\nexport class TabSelector extends LitElement {\r\n static styles = css`\r\n .tab-selector-wrapper {\r\n border-bottom: 2px solid #444;\r\n margin-top: 12px;\r\n display: flex;\r\n justify-content: space-evenly;\r\n width: 100%;\r\n }\r\n\r\n .tab-button {\r\n background: none;\r\n border: none;\r\n color: #9e9e9e;\r\n flex: 1;\r\n padding: 8px;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n transition: all 0.2s ease;\r\n font-size: 13px;\r\n font-weight: 500;\r\n text-align: center;\r\n }\r\n .tab-button:hover {\r\n color: #b0c4de;\r\n background-color: rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .tab-button.active {\r\n color: #b0c4de;\r\n border-bottom-color: #b0c4de;\r\n }\r\n `\r\n\r\n @property({ type: String })\r\n activeTab: ControllerTabs = \"settings\"\r\n\r\n private tabs: ControllerTabs[] = [\"settings\", \"elements\", \"logs\"]\r\n\r\n private _handleTabClick(selectedTab: ControllerTabs) {\r\n this.dispatchEvent(\r\n new CustomEvent(\"tab-change\", {\r\n detail: { tab: selectedTab },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n )\r\n }\r\n\r\n protected render() {\r\n return html`\r\n <div class=\"tab-selector-wrapper\">\r\n ${this.tabs.map(\r\n tab => html`\r\n <button\r\n class=\"tab-button ${this.activeTab === tab ? \"active\" : \"\"}\"\r\n @click=\"${() => this._handleTabClick(tab)}\"\r\n data-tab=\"${tab}\"\r\n >\r\n ${tab.charAt(0).toUpperCase() + tab.slice(1)}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n `\r\n }\r\n}\r\n","import { ForesightManager } from \"js.foresight\"\r\nimport type { ForesightEvent, ForesightEventMap } from \"js.foresight/types/types\"\r\nimport { LitElement, css, html } from \"lit\"\r\nimport { customElement, property, state } from \"lit/decorators.js\"\r\nimport { map } from \"lit/directives/map.js\"\r\nimport {\r\n safeSerializeEventData,\r\n type SerializedEventData,\r\n} from \"../../../helpers/safeSerializeEventData\"\r\nimport type { LogEvents, LoggingLocations } from \"../../../types/types\"\r\nimport {\r\n BOTH_SVG,\r\n CLEAR_SVG,\r\n CONSOLE_SVG,\r\n CONTROL_PANEL_SVG,\r\n FILTER_SVG,\r\n NONE_SVG,\r\n WARNING_SVG,\r\n} from \"../../../svg/svg-icons\"\r\nimport \"../base-tab/chip\"\r\nimport \"../dropdown/multi-select-dropdown\"\r\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\r\nimport \"../base-tab/tab-content\"\r\nimport \"../base-tab/tab-header\"\r\nimport \"../copy-icon/copy-icon\"\r\nimport \"./single-log\"\r\nimport { ForesightDevtools } from \"../../foresight-devtools\"\r\n\r\n@customElement(\"log-tab\")\r\nexport class LogTab extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n }\r\n\r\n .chips-container {\r\n display: flex;\r\n gap: 4px;\r\n }\r\n\r\n .clear-button {\r\n background: none;\r\n border: none;\r\n color: white;\r\n cursor: pointer;\r\n padding: 6px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s ease;\r\n vertical-align: top;\r\n }\r\n\r\n .clear-button svg {\r\n width: 16px;\r\n height: 16px;\r\n stroke: white;\r\n transition: stroke 0.2s;\r\n }\r\n\r\n .clear-button:hover {\r\n background-color: rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .clear-button:hover svg {\r\n stroke: #b0c4de;\r\n }\r\n\r\n .clear-button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .clear-button:disabled:hover {\r\n background: none;\r\n }\r\n\r\n .clear-button:disabled svg {\r\n stroke: #666;\r\n }\r\n\r\n .no-items {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 200px;\r\n text-align: center;\r\n font-family: \"Courier New\", monospace;\r\n font-style: italic;\r\n padding: 20px;\r\n color: #999;\r\n }\r\n\r\n .warning-container {\r\n background: none;\r\n border: none;\r\n color: #ffc107;\r\n cursor: help;\r\n padding: 6px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s ease;\r\n vertical-align: top;\r\n }\r\n\r\n .warning-container svg {\r\n width: 16px;\r\n height: 16px;\r\n stroke: #ffc107;\r\n fill: none;\r\n transition: stroke 0.2s;\r\n }\r\n\r\n .warning-container:hover {\r\n background-color: rgba(255, 193, 7, 0.1);\r\n }\r\n\r\n .warning-container:hover svg {\r\n stroke: #ffdc3e;\r\n }\r\n `,\r\n ]\r\n\r\n @state() private logDropdown: DropdownOption[]\r\n @state() private filterDropdown: DropdownOption[]\r\n @state() private logLocation: LoggingLocations\r\n @state() private eventsEnabled: LogEvents\r\n @state() private logs: Array<SerializedEventData & { logId: string }> = []\r\n @state() private expandedLogIds: Set<string> = new Set()\r\n private MAX_LOGS: number = 100\r\n private logIdCounter: number = 0\r\n\r\n @property() noContentMessage: string = \"No logs available\"\r\n private _abortController: AbortController | null = null\r\n private _eventListeners: Map<ForesightEvent, (event: ForesightEventMap[ForesightEvent]) => void> =\r\n new Map()\r\n\r\n constructor() {\r\n super()\r\n const {\r\n logging: { logLocation, ...eventFlags },\r\n } = ForesightDevtools.instance.devtoolsSettings\r\n this.eventsEnabled = eventFlags\r\n this.logLocation = logLocation\r\n this.logDropdown = [\r\n {\r\n value: \"controlPanel\",\r\n label: \"Control Panel\",\r\n title: \"Log only to the control panel\",\r\n icon: CONTROL_PANEL_SVG,\r\n },\r\n {\r\n value: \"console\",\r\n label: \"Console\",\r\n title: \"Log only to the console\",\r\n icon: CONSOLE_SVG,\r\n },\r\n {\r\n value: \"both\",\r\n label: \"Both\",\r\n title: \"Log to both the control panel and the console\",\r\n icon: BOTH_SVG,\r\n },\r\n {\r\n value: \"none\",\r\n label: \"None\",\r\n title: \"Dont log anywhere\",\r\n icon: NONE_SVG,\r\n },\r\n ]\r\n\r\n this.filterDropdown = [\r\n {\r\n value: \"elementRegistered\",\r\n label: \"Element Registered\",\r\n title: \"Show element registration events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"elementUnregistered\",\r\n label: \"Element Unregistered\",\r\n title: \"Show element unregistration events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"elementDataUpdated\",\r\n label: \"Element Data Updated\",\r\n title: \"Show element data update events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"callbackInvoked\",\r\n label: \"Callback Invoked\",\r\n title: \"Show callback invoked events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"callbackCompleted\",\r\n label: \"Callback Completed\",\r\n title: \"Show callback completed events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"mouseTrajectoryUpdate\",\r\n label: \"Mouse Trajectory Update\",\r\n title: \"Show mouse trajectory update events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"scrollTrajectoryUpdate\",\r\n label: \"Scroll Trajectory Update\",\r\n title: \"Show scroll trajectory update events\",\r\n icon: FILTER_SVG,\r\n },\r\n {\r\n value: \"managerSettingsChanged\",\r\n label: \"Manager Settings Changed\",\r\n title: \"Show manager settings change events\",\r\n icon: FILTER_SVG,\r\n },\r\n ]\r\n }\r\n\r\n private handleLogLocationChange = (value: string): void => {\r\n this.logLocation = value as LoggingLocations\r\n }\r\n\r\n private handleFilterChange = (changedEventType: string, isEnabled: boolean): void => {\r\n this.eventsEnabled = {\r\n ...this.eventsEnabled,\r\n [changedEventType]: isEnabled,\r\n }\r\n if (isEnabled) {\r\n this.addForesightEventListener(changedEventType as ForesightEvent)\r\n } else {\r\n this.removeForesightEventListener(changedEventType as ForesightEvent)\r\n }\r\n }\r\n\r\n private getSelectedEventFilters(): string[] {\r\n return Object.entries(this.eventsEnabled)\r\n .filter(([_, enabled]) => enabled)\r\n .map(([eventType, _]) => eventType)\r\n }\r\n\r\n //TODO check if devtools is open, but is harder than I thought. Look into later\r\n private shouldShowPerformanceWarning(): boolean {\r\n const hasConsoleOutput = this.logLocation === \"console\" || this.logLocation === \"both\"\r\n const hasFrequentEvents =\r\n this.eventsEnabled.mouseTrajectoryUpdate ||\r\n this.eventsEnabled.scrollTrajectoryUpdate ||\r\n this.eventsEnabled.elementDataUpdated\r\n return hasConsoleOutput && hasFrequentEvents\r\n }\r\n\r\n private getNoLogsMessage(): string {\r\n const enabledCount = Object.values(this.eventsEnabled).filter(Boolean).length\r\n if (enabledCount === 0) {\r\n return \"Logging for all events is turned off\"\r\n }\r\n if (this.logLocation === \"console\") {\r\n return \"No logs to display. Logging location is set to console - check browser console for events.\"\r\n }\r\n if (this.logLocation === \"none\") {\r\n return \"No logs to display. Logging location is set to none\"\r\n }\r\n return \"Interact with Foresight to generate events.\"\r\n }\r\n\r\n private handleLogToggle = (logId: string): void => {\r\n const newExpandedLogIds = new Set(this.expandedLogIds)\r\n if (newExpandedLogIds.has(logId)) {\r\n newExpandedLogIds.delete(logId)\r\n } else {\r\n newExpandedLogIds.add(logId)\r\n }\r\n this.expandedLogIds = newExpandedLogIds\r\n }\r\n\r\n private clearLogs(): void {\r\n this.logs = []\r\n this.expandedLogIds.clear()\r\n this.noContentMessage = \"Logs cleared\"\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback()\r\n this._abortController = new AbortController()\r\n this.setupDynamicEventListeners()\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._abortController?.abort()\r\n this.removeAllEventListeners()\r\n }\r\n\r\n private setupDynamicEventListeners(): void {\r\n Object.entries(this.eventsEnabled).forEach(([eventType, enabled]) => {\r\n if (enabled) {\r\n this.addForesightEventListener(eventType as ForesightEvent)\r\n }\r\n })\r\n }\r\n\r\n private addForesightEventListener(eventType: ForesightEvent): void {\r\n if (this._eventListeners.has(eventType)) return\r\n const handler = (event: ForesightEventMap[typeof eventType]) => {\r\n this.handleEvent(eventType, event)\r\n }\r\n this._eventListeners.set(eventType, handler)\r\n ForesightManager.instance.addEventListener(eventType, handler, {\r\n signal: this._abortController?.signal,\r\n })\r\n }\r\n\r\n private removeForesightEventListener(eventType: ForesightEvent): void {\r\n const handler = this._eventListeners.get(eventType)\r\n if (handler) {\r\n ForesightManager.instance.removeEventListener(eventType, handler)\r\n this._eventListeners.delete(eventType)\r\n }\r\n }\r\n\r\n private removeAllEventListeners(): void {\r\n this._eventListeners.forEach((handler, eventType) => {\r\n ForesightManager.instance.removeEventListener(eventType, handler)\r\n })\r\n this._eventListeners.clear()\r\n }\r\n\r\n private getEventColor(eventType: ForesightEvent): string {\r\n const colorMap: Record<ForesightEvent, string> = {\r\n elementRegistered: \"#2196f3\",\r\n callbackInvoked: \"#00bcd4\",\r\n callbackCompleted: \"#4caf50\",\r\n elementDataUpdated: \"#ffc107\",\r\n elementUnregistered: \"#ff9800\",\r\n managerSettingsChanged: \"#f44336\",\r\n mouseTrajectoryUpdate: \"#78909c\",\r\n scrollTrajectoryUpdate: \"#607d8b\",\r\n }\r\n return colorMap[eventType] || \"#ffffff\"\r\n }\r\n\r\n private handleEvent<K extends ForesightEvent>(eventType: K, event: ForesightEventMap[K]): void {\r\n if (this.logLocation === \"none\") {\r\n return\r\n }\r\n if (this.logLocation === \"console\" || this.logLocation === \"both\") {\r\n const color = this.getEventColor(eventType)\r\n console.log(`%c[ForesightJS] ${eventType}`, `color: ${color}; font-weight: bold;`, event)\r\n }\r\n if (this.logLocation === \"controlPanel\" || this.logLocation === \"both\") {\r\n this.addEventLog(event)\r\n }\r\n }\r\n\r\n private addEventLog<K extends ForesightEvent>(event: ForesightEventMap[K]): void {\r\n const logData = safeSerializeEventData(event)\r\n if (logData.type === \"serializationError\") {\r\n console.error(logData.error, logData.errorMessage)\r\n return\r\n }\r\n const logWithId = {\r\n ...logData,\r\n logId: (++this.logIdCounter).toString(),\r\n }\r\n // More efficient: direct array manipulation\r\n this.logs.unshift(logWithId)\r\n if (this.logs.length > this.MAX_LOGS) {\r\n this.logs.pop()\r\n }\r\n this.requestUpdate()\r\n }\r\n\r\n render() {\r\n return html`\r\n <tab-header>\r\n <div slot=\"chips\" class=\"chips-container\">\r\n <chip-element title=\"Number of logged events (Max ${this.MAX_LOGS})\">\r\n ${this.logs.length} events\r\n </chip-element>\r\n </div>\r\n <div slot=\"actions\">\r\n ${this.shouldShowPerformanceWarning()\r\n ? html`\r\n <div\r\n class=\"warning-container\"\r\n title=\"Console logging can be slow with frequent trajectory events.\r\nConsider using 'Control Panel' only for better performance.\"\r\n >\r\n ${WARNING_SVG}\r\n </div>\r\n `\r\n : \"\"}\r\n <single-select-dropdown\r\n .dropdownOptions=\"${this.logDropdown}\"\r\n .selectedOptionValue=\"${this.logLocation}\"\r\n .onSelectionChange=\"${this.handleLogLocationChange}\"\r\n ></single-select-dropdown>\r\n\r\n <multi-select-dropdown\r\n .dropdownOptions=\"${this.filterDropdown}\"\r\n .selectedValues=\"${this.getSelectedEventFilters()}\"\r\n .onSelectionChange=\"${this.handleFilterChange}\"\r\n ></multi-select-dropdown>\r\n <button\r\n class=\"clear-button\"\r\n title=\"Clear all logs\"\r\n ?disabled=\"${this.logs.length === 0}\"\r\n @click=\"${this.clearLogs}\"\r\n >\r\n ${CLEAR_SVG}\r\n </button>\r\n </div>\r\n </tab-header>\r\n <tab-content .noContentMessage=${this.noContentMessage} .hasContent=${!!this.logs.length}>\r\n ${this.logs.length === 0\r\n ? html`<div class=\"no-items\">${this.getNoLogsMessage()}</div>`\r\n : map(this.logs, log => {\r\n return html`\r\n <single-log\r\n .log=${log}\r\n .isExpanded=${this.expandedLogIds.has(log.logId)}\r\n .onToggle=${this.handleLogToggle}\r\n ></single-log>\r\n `\r\n })}\r\n </tab-content>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"log-tab\": LogTab\r\n }\r\n}\r\n","import type {\r\n CallbackHitType,\r\n ForesightEvent,\r\n ForesightEventMap,\r\n ForesightManagerSettings,\r\n HitSlop,\r\n Point,\r\n ScrollDirection,\r\n UpdatedDataPropertyNames,\r\n} from \"js.foresight/types/types\"\r\nimport type { UpdatedManagerSetting } from \"packages/js.foresight/dist\"\r\n\r\ntype SerializedEventType = ForesightEvent | \"serializationError\"\r\n\r\nexport type ControlPanelLogEntry = {\r\n eventData: SerializedEventData\r\n}\r\n\r\ninterface PayloadBase {\r\n type: SerializedEventType\r\n localizedTimestamp: string\r\n summary: string // The text / data you see as preview on the right of the event (keep this short)\r\n}\r\n\r\ninterface ElementRegisteredPayload extends PayloadBase {\r\n type: \"elementRegistered\"\r\n name: string\r\n id: string\r\n registerCount: number\r\n hitslop: HitSlop\r\n}\r\n\r\ninterface ElementUnregisteredPayload extends PayloadBase {\r\n type: \"elementUnregistered\"\r\n name: string\r\n id: string\r\n registerCount: number\r\n unregisterReason: string\r\n}\r\ninterface ElementDataUpdatedPayload extends PayloadBase {\r\n type: \"elementDataUpdated\"\r\n name: string\r\n updatedProps: UpdatedDataPropertyNames[]\r\n isIntersecting: boolean\r\n}\r\n\r\ninterface CallbackInvokedPayload extends PayloadBase {\r\n type: \"callbackInvoked\"\r\n name: string\r\n hitType: CallbackHitType\r\n}\r\n\r\ninterface CallbackCompletedBasePayload extends PayloadBase {\r\n type: \"callbackCompleted\"\r\n name: string\r\n callbackRunTimeFormatted: string\r\n callbackRunTimeRaw: number\r\n hitType: CallbackHitType\r\n status: \"success\" | \"error\"\r\n}\r\n\r\ntype CallbackCompletedPayload = CallbackCompletedBasePayload &\r\n ({ status: \"success\" } | { status: \"error\"; errorMessage: string })\r\n\r\ninterface MouseTrajectoryUpdatePayload extends PayloadBase {\r\n type: \"mouseTrajectoryUpdate\"\r\n currentPoint: Point\r\n predictedPoint: Point\r\n positionCount: number\r\n mousePredictionEnabled: boolean\r\n}\r\n\r\ninterface ScrollTrajectoryUpdatePayload extends PayloadBase {\r\n type: \"scrollTrajectoryUpdate\"\r\n currentPoint: Point\r\n predictedPoint: Point\r\n scrollDirection: ScrollDirection\r\n}\r\n\r\ninterface ManagerSettingsChangedPayload extends PayloadBase {\r\n type: \"managerSettingsChanged\"\r\n globalSettings: ForesightManagerSettings\r\n settingsChanged: UpdatedManagerSetting[]\r\n}\r\n\r\ninterface SerializationErrorPayload extends PayloadBase {\r\n type: \"serializationError\"\r\n error: \"Failed to serialize event data\"\r\n errorMessage: string\r\n}\r\n\r\nexport type SerializedEventData =\r\n | ElementRegisteredPayload\r\n | ElementUnregisteredPayload\r\n | ElementDataUpdatedPayload\r\n | CallbackInvokedPayload\r\n | CallbackCompletedPayload\r\n | MouseTrajectoryUpdatePayload\r\n | ScrollTrajectoryUpdatePayload\r\n | ManagerSettingsChangedPayload\r\n | SerializationErrorPayload\r\n\r\n/**\r\n * Safely serializes ForesightJS event data into a JSON-serializable format\r\n * for logging and debugging purposes.\r\n *\r\n * @param event - The ForesightJS event to serialize\r\n * @returns Serialized event data or error object if serialization fails\r\n */\r\nexport function safeSerializeEventData<K extends keyof ForesightEventMap>(\r\n event: ForesightEventMap[K]\r\n): SerializedEventData {\r\n try {\r\n // For different event types, extract only the relevant serializable data\r\n switch (event.type) {\r\n case \"elementRegistered\":\r\n return {\r\n type: \"elementRegistered\",\r\n name: event.elementData.name,\r\n id: event.elementData.element.id || \"\",\r\n registerCount: event.elementData.registerCount,\r\n hitslop: event.elementData.elementBounds.hitSlop,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n // if its the 2nd+ time of the element registering, give the user a heads up in the summary\r\n summary:\r\n event.elementData.registerCount === 1\r\n ? event.elementData.name\r\n : `${event.elementData.name} - ${getOrdinalSuffix(\r\n event.elementData.registerCount\r\n )} time`,\r\n }\r\n case \"elementUnregistered\":\r\n return {\r\n type: \"elementUnregistered\",\r\n name: event.elementData.name,\r\n id: event.elementData.element.id || \"\",\r\n registerCount: event.elementData.registerCount,\r\n unregisterReason: event.unregisterReason,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n summary: `${event.elementData.name} - ${event.unregisterReason}`,\r\n }\r\n case \"elementDataUpdated\":\r\n return {\r\n type: \"elementDataUpdated\",\r\n name: event.elementData.name,\r\n updatedProps: event.updatedProps || [],\r\n isIntersecting: event.elementData.isIntersectingWithViewport,\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n summary: `${event.elementData.name} - ${event.updatedProps.toString()}`,\r\n }\r\n case \"callbackInvoked\":\r\n return {\r\n type: \"callbackInvoked\",\r\n name: event.elementData.name,\r\n hitType: event.hitType,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n summary: `${event.elementData.name} - ${event.hitType.kind}`,\r\n }\r\n case \"callbackCompleted\":\r\n const elapsed = formatElapsed(event.elapsed)\r\n return {\r\n type: \"callbackCompleted\",\r\n ...(event.status === \"error\"\r\n ? { status: \"error\", errorMessage: event.errorMessage }\r\n : { status: \"success\" }),\r\n name: event.elementData.name,\r\n hitType: event.hitType,\r\n callbackRunTimeFormatted: elapsed,\r\n callbackRunTimeRaw: event.elapsed,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n summary: `${event.elementData.name} - ${elapsed}`,\r\n }\r\n case \"mouseTrajectoryUpdate\":\r\n return {\r\n type: \"mouseTrajectoryUpdate\",\r\n currentPoint: event.trajectoryPositions?.currentPoint,\r\n predictedPoint: event.trajectoryPositions?.predictedPoint,\r\n positionCount: event.trajectoryPositions?.positions?.length || 0,\r\n mousePredictionEnabled: event.predictionEnabled,\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n summary: \"\",\r\n }\r\n case \"scrollTrajectoryUpdate\":\r\n return {\r\n type: \"scrollTrajectoryUpdate\",\r\n currentPoint: event.currentPoint,\r\n predictedPoint: event.predictedPoint,\r\n scrollDirection: event.scrollDirection,\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n summary: event.scrollDirection,\r\n }\r\n case \"managerSettingsChanged\":\r\n return {\r\n type: \"managerSettingsChanged\",\r\n globalSettings: event.managerData?.globalSettings || {},\r\n settingsChanged: event.updatedSettings,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n summary: event.updatedSettings.map(setting => setting.setting).join(\", \"),\r\n }\r\n default:\r\n const _exhaustiveCheck: never = event\r\n return {\r\n type: \"serializationError\",\r\n error: \"Failed to serialize event data\",\r\n errorMessage: JSON.stringify(_exhaustiveCheck),\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n summary: \"\",\r\n }\r\n }\r\n } catch (error) {\r\n // Fallback if serialization fails\r\n return {\r\n type: \"serializationError\",\r\n error: \"Failed to serialize event data\",\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n errorMessage: error instanceof Error ? error.message : String(error),\r\n summary: \"\",\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Formats a duration in milliseconds into seconds.\r\n *\r\n * @param {number} ms Duration in milliseconds\r\n * @returns {string} Duration in seconds, e.g. “0.50 s” or “1.23 s”\r\n */\r\nfunction formatElapsed(ms: number): string {\r\n return `${(ms / 1000).toFixed(4)} s`\r\n}\r\n\r\n/**\r\n * Returns the ordinal suffix for a given number (e.g., \"1st\", \"2nd\", \"3rd\", \"4th\").\r\n *\r\n * @param {number} n The number to get the ordinal suffix for.\r\n * @returns {string} The ordinal suffix.\r\n */\r\nfunction getOrdinalSuffix(n: number): string {\r\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"]\r\n const v = n % 100\r\n return n + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0])\r\n}\r\n","import { html, css, type TemplateResult } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\nimport { BaseDropdown, type DropdownOption } from \"./base-dropdown\"\r\nimport { FILTER_SVG } from \"../../../svg/svg-icons\"\r\n\r\n@customElement(\"multi-select-dropdown\")\r\nexport class MultiSelectDropdown extends BaseDropdown {\r\n static styles = [\r\n ...BaseDropdown.styles,\r\n css`\r\n .dropdown-menu button.active::after {\r\n content: \"✓\";\r\n position: absolute;\r\n right: 8px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: #b0c4de;\r\n font-weight: bold;\r\n }\r\n\r\n .selected-count {\r\n font-size: 10px;\r\n color: #b0c4de;\r\n margin-left: 2px;\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: Array }) selectedValues: string[] = []\r\n @property() onSelectionChange?: (changedValue: string, isSelected: boolean) => void\r\n\r\n protected _handleOptionClick(option: DropdownOption): void {\r\n const isCurrentlySelected = this.selectedValues.includes(option.value)\r\n\r\n if (isCurrentlySelected) {\r\n this.selectedValues = this.selectedValues.filter(value => value !== option.value)\r\n } else {\r\n this.selectedValues = [...this.selectedValues, option.value]\r\n }\r\n const newSelectionState = !isCurrentlySelected\r\n this.onSelectionChange?.(option.value, newSelectionState)\r\n }\r\n\r\n protected _getTriggerIcon(): TemplateResult {\r\n return FILTER_SVG\r\n }\r\n\r\n protected _isOptionSelected(option: DropdownOption): boolean {\r\n return this.selectedValues.includes(option.value)\r\n }\r\n\r\n protected _getTriggerTitle(): string {\r\n const count = this.selectedValues.length\r\n if (count === 0) {\r\n return \"No items selected\"\r\n } else if (count === 1) {\r\n return \"1 item selected\"\r\n } else {\r\n return `${count} items selected`\r\n }\r\n }\r\n\r\n protected _getTriggerLabel(): string {\r\n return `Filter options: ${this.selectedValues.length} selected`\r\n }\r\n\r\n render() {\r\n const buttonClass = `trigger-button ${this.isDropdownOpen ? \"active\" : \"\"}`\r\n const menuClass = `dropdown-menu ${this.isDropdownOpen ? \"active\" : \"\"}`\r\n\r\n return html`\r\n <div class=\"dropdown-container\">\r\n <button\r\n class=\"${buttonClass}\"\r\n title=\"${this._getTriggerTitle()}\"\r\n @click=\"${this._toggleDropdown}\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"${this.isDropdownOpen}\"\r\n aria-controls=\"dropdown-menu\"\r\n aria-label=\"${this._getTriggerLabel()}\"\r\n >\r\n ${this._getTriggerIcon()}\r\n <span class=\"selected-count\">${this.selectedValues.length}</span>\r\n <svg\r\n class=\"arrow-icon\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <div class=\"${menuClass}\" id=\"dropdown-menu\" role=\"menu\">\r\n ${this.dropdownOptions.map(\r\n option => html`\r\n <button\r\n value=\"${option.value}\"\r\n title=\"${option.title}\"\r\n class=\"${this._isOptionSelected(option) ? \"active\" : \"\"}\"\r\n @click=\"${() => this._handleOptionClick(option)}\"\r\n role=\"menuitem\"\r\n >\r\n ${option.label}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"multi-select-dropdown\": MultiSelectDropdown\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\nimport type { SerializedEventData } from \"../../../helpers/safeSerializeEventData\"\r\nimport \"../base-tab/expandable-item\"\r\n\r\n@customElement(\"single-log\")\r\nexport class SingleLog extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .log-time {\r\n color: #b8b8b8;\r\n font-weight: 500;\r\n font-size: 10px;\r\n font-family: \"SF Mono\", \"Monaco\", \"Consolas\", \"Liberation Mono\", \"Courier New\", monospace;\r\n min-width: 70px;\r\n max-width: 70px;\r\n text-align: left;\r\n letter-spacing: 0.02em;\r\n flex-shrink: 0;\r\n }\r\n\r\n .log-type-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 10px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.02em;\r\n color: var(--log-color, #b0c4de);\r\n min-width: 90px;\r\n max-width: 90px;\r\n white-space: nowrap;\r\n text-align: left;\r\n margin-left: 10px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .log-summary {\r\n flex: 1;\r\n color: #ccc;\r\n font-size: 11px;\r\n opacity: 0.9;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n margin-left: 6px;\r\n font-weight: 400;\r\n min-width: 0;\r\n }\r\n\r\n .log-content {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n min-width: 0;\r\n }\r\n\r\n :host(.log-elementRegistered) {\r\n --log-color: #2196f3;\r\n }\r\n :host(.log-callbackInvoked) {\r\n --log-color: #00bcd4;\r\n }\r\n :host(.log-callbackCompleted) {\r\n --log-color: #4caf50;\r\n }\r\n :host(.log-elementDataUpdated) {\r\n --log-color: #ffc107;\r\n }\r\n :host(.log-elementUnregistered) {\r\n --log-color: #ff9800;\r\n }\r\n :host(.log-managerSettingsChanged) {\r\n --log-color: #f44336;\r\n }\r\n :host(.log-mouseTrajectoryUpdate) {\r\n --log-color: #78909c;\r\n }\r\n :host(.log-scrollTrajectoryUpdate) {\r\n --log-color: #607d8b;\r\n }\r\n\r\n :host(.log-callbackCompleted.error-status) {\r\n --log-color: #f44336;\r\n background-color: rgba(244, 67, 54, 0.1);\r\n }\r\n `,\r\n ]\r\n @property() private log: SerializedEventData & { logId: string }\r\n @property() isExpanded: boolean = false\r\n @property() onToggle: ((logId: string) => void) | undefined\r\n\r\n constructor(log: SerializedEventData & { logId: string }) {\r\n super()\r\n this.log = log\r\n }\r\n\r\n private serializeLogDataWithoutSummary(log: SerializedEventData): string {\r\n const { summary, ...rest } = log\r\n return JSON.stringify(rest, null, 2)\r\n }\r\n\r\n private getLogTypeColor(logType: string): string {\r\n const colorMap: Record<string, string> = {\r\n elementRegistered: \"#2196f3\",\r\n callbackInvoked: \"#00bcd4\",\r\n callbackCompleted: \"#4caf50\",\r\n elementDataUpdated: \"#ffc107\",\r\n elementUnregistered: \"#ff9800\",\r\n managerSettingsChanged: \"#f44336\",\r\n mouseTrajectoryUpdate: \"#78909c\",\r\n scrollTrajectoryUpdate: \"#607d8b\",\r\n }\r\n return colorMap[logType] || \"#555\"\r\n }\r\n\r\n private getEventDisplayName(eventType: string): string {\r\n const eventNames: Record<string, string> = {\r\n elementRegistered: \"Registered\",\r\n elementUnregistered: \"Unregistered\",\r\n elementDataUpdated: \"Data Updated\",\r\n callbackInvoked: \"Invoked\",\r\n callbackCompleted: \"Completed\",\r\n mouseTrajectoryUpdate: \"Mouse\",\r\n scrollTrajectoryUpdate: \"Scroll\",\r\n managerSettingsChanged: \"Settings\",\r\n }\r\n return eventNames[eventType] || eventType\r\n }\r\n\r\n private truncateLogSummary(summary: string, maxLength: number = 50): string {\r\n if (summary.length <= maxLength) {\r\n return summary\r\n }\r\n return summary.substring(0, maxLength) + \"...\"\r\n }\r\n\r\n render() {\r\n const log = this.log\r\n let className = `log-${log.type}`\r\n\r\n if (log.type === \"callbackCompleted\" && \"status\" in log && log.status === \"error\") {\r\n className += \" error-status\"\r\n }\r\n\r\n this.className = className\r\n\r\n const borderColor =\r\n log.type === \"callbackCompleted\" && \"status\" in log && log.status === \"error\"\r\n ? \"#f44336\"\r\n : this.getLogTypeColor(log.type)\r\n\r\n return html`\r\n <expandable-item\r\n .borderColor=${borderColor}\r\n .itemId=${log.logId}\r\n .isExpanded=${this.isExpanded}\r\n .onToggle=${this.onToggle}\r\n >\r\n <div slot=\"content\">\r\n <div class=\"log-content\">\r\n <span class=\"log-time\">${log.localizedTimestamp}</span>\r\n <span class=\"log-type-badge\">${this.getEventDisplayName(log.type)}</span>\r\n <span class=\"log-summary\">${this.truncateLogSummary(log.summary)}</span>\r\n </div>\r\n </div>\r\n <div slot=\"details\">${this.serializeLogDataWithoutSummary(log)}</div>\r\n </expandable-item>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"single-log\": SingleLog\r\n }\r\n}\r\n","import type { ForesightManagerSettings } from \"js.foresight\"\r\nimport { ForesightManager } from \"js.foresight\"\r\nimport { css, html, LitElement } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\n\r\nimport type { DevtoolsSettings } from \"../../../types/types\"\r\nimport {\r\n MAX_POSITION_HISTORY_SIZE,\r\n MAX_SCROLL_MARGIN,\r\n MAX_TAB_OFFSET,\r\n MAX_TRAJECTORY_PREDICTION_TIME,\r\n MIN_POSITION_HISTORY_SIZE,\r\n MIN_SCROLL_MARGIN,\r\n MIN_TAB_OFFSET,\r\n MIN_TRAJECTORY_PREDICTION_TIME,\r\n POSITION_HISTORY_SIZE_UNIT,\r\n SCROLL_MARGIN_UNIT,\r\n TAB_OFFSET_UNIT,\r\n TRAJECTORY_PREDICTION_TIME_UNIT,\r\n} from \"../../../constants\"\r\nimport \"../base-tab/chip\"\r\nimport \"../base-tab/tab-content\"\r\nimport \"../base-tab/tab-header\"\r\nimport \"../copy-icon/copy-icon\"\r\nimport \"./setting-item/setting-item-checkbox\"\r\nimport \"./setting-item/setting-item-range\"\r\nimport \"../base-tab/chip\"\r\nimport { ForesightDevtools } from \"../../foresight-devtools\"\r\n\r\n@customElement(\"settings-tab\")\r\nexport class SettingsTab extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n }\r\n\r\n .settings-content {\r\n display: block;\r\n }\r\n\r\n .settings-section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 16px;\r\n }\r\n\r\n .settings-group {\r\n background: rgba(30, 30, 30, 0.6);\r\n padding: 16px;\r\n border: 1px solid rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .settings-group h4 {\r\n margin: 0 0 12px 0;\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #b0c4de;\r\n border-bottom: 1px solid rgba(176, 196, 222, 0.2);\r\n padding-bottom: 8px;\r\n }\r\n `\r\n\r\n @state() private managerSettings: ForesightManagerSettings\r\n @state() private initialSettings: Readonly<{\r\n manager: ForesightManagerSettings\r\n devtools: DevtoolsSettings\r\n }>\r\n @state() private devtoolsSettings: DevtoolsSettings\r\n @state() private changedSettings: {\r\n name: string\r\n initial: any\r\n current: any\r\n }[] = []\r\n\r\n private _abortController: AbortController | null = null\r\n\r\n constructor() {\r\n super()\r\n const currentDevtoolsSettings = ForesightDevtools.instance.devtoolsSettings\r\n const currentManagerSettings = ForesightManager.instance.getManagerData.globalSettings\r\n\r\n // Shallow copy is sufficient for settings objects\r\n this.devtoolsSettings = Object.assign({}, currentDevtoolsSettings)\r\n this.managerSettings = Object.assign({}, currentManagerSettings)\r\n\r\n this.initialSettings = {\r\n devtools: Object.assign({}, currentDevtoolsSettings),\r\n manager: Object.assign({}, currentManagerSettings),\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback()\r\n this._abortController = new AbortController()\r\n const { signal } = this._abortController\r\n ForesightManager.instance.addEventListener(\r\n \"managerSettingsChanged\",\r\n e => {\r\n this.managerSettings = e.managerData.globalSettings\r\n this._updateChangedSettings()\r\n },\r\n { signal }\r\n )\r\n\r\n this._updateChangedSettings()\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._abortController?.abort()\r\n this._abortController = null\r\n }\r\n\r\n private _updateChangedSettings(): void {\r\n const changes: { name: string; initial: any; current: any }[] = []\r\n this._checkManagerSettingsChanges(changes)\r\n this._checkDevtoolsSettingsChanges(changes)\r\n this.changedSettings = changes\r\n }\r\n\r\n private _checkManagerSettingsChanges(\r\n changes: { name: string; initial: any; current: any }[]\r\n ): void {\r\n const managerKeys: (keyof ForesightManagerSettings)[] = [\r\n \"enableMousePrediction\",\r\n \"enableTabPrediction\",\r\n \"enableScrollPrediction\",\r\n \"trajectoryPredictionTime\",\r\n \"positionHistorySize\",\r\n \"tabOffset\",\r\n \"scrollMargin\",\r\n ]\r\n\r\n for (const key of managerKeys) {\r\n const initialValue = this.initialSettings.manager[key]\r\n const currentValue = this.managerSettings[key]\r\n if (initialValue !== currentValue) {\r\n changes.push({ name: key, initial: initialValue, current: currentValue })\r\n }\r\n }\r\n }\r\n\r\n private _checkDevtoolsSettingsChanges(\r\n changes: { name: string; initial: any; current: any }[]\r\n ): void {\r\n const devtoolsKeys: (keyof DevtoolsSettings)[] = [\"showNameTags\"]\r\n\r\n for (const key of devtoolsKeys) {\r\n const initialValue = this.initialSettings.devtools[key]\r\n const currentValue = this.devtoolsSettings[key]\r\n if (initialValue !== currentValue) {\r\n changes.push({ name: key, initial: initialValue, current: currentValue })\r\n }\r\n }\r\n }\r\n\r\n private _handleDevtoolsSettingChange(e: CustomEvent<{ setting: string; value: boolean }>): void {\r\n const { setting, value } = e.detail\r\n\r\n if (setting === \"showNameTags\") {\r\n this.devtoolsSettings = {\r\n ...this.devtoolsSettings,\r\n showNameTags: value,\r\n }\r\n ForesightDevtools.instance.alterDevtoolsSettings({ showNameTags: value })\r\n this._updateChangedSettings()\r\n }\r\n }\r\n\r\n private async handleCopySettings(): Promise<void> {\r\n if (!this.managerSettings) {\r\n return\r\n }\r\n\r\n try {\r\n const settingsCode = this.generateSettingsCode(this.managerSettings)\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n await navigator.clipboard.writeText(settingsCode)\r\n }\r\n } catch (err) {\r\n console.error(\"Failed to copy settings code:\", err)\r\n }\r\n }\r\n\r\n private generateSettingsCode(settings: ForesightManagerSettings): string {\r\n const settingsObject = {\r\n enableMousePrediction: settings.enableMousePrediction,\r\n enableTabPrediction: settings.enableTabPrediction,\r\n enableScrollPrediction: settings.enableScrollPrediction,\r\n positionHistorySize: settings.positionHistorySize,\r\n trajectoryPredictionTime: settings.trajectoryPredictionTime,\r\n tabOffset: settings.tabOffset,\r\n scrollMargin: settings.scrollMargin,\r\n }\r\n\r\n return `ForesightManager.initialize(${JSON.stringify(settingsObject, null, 2)})`\r\n }\r\n\r\n render() {\r\n if (!this.managerSettings || !this.devtoolsSettings) {\r\n return html`<tab-content\r\n .noContentMessage=${\"Loading settings...\"}\r\n .hasContent=${false}\r\n ></tab-content>`\r\n }\r\n const settings = this.managerSettings\r\n\r\n const chipTitle =\r\n this.changedSettings.length > 0\r\n ? `Settings that have been changed this session compared to your initialized settings.\\nClick on the copy icon to easely copy the new setting into your project\\n\\n` +\r\n this.changedSettings\r\n .map(\r\n change =>\r\n `${change.name}: ${JSON.stringify(change.initial)} -> ${JSON.stringify(\r\n change.current\r\n )}`\r\n )\r\n .join(\"\\n\")\r\n : \"No settings changed from initial values\"\r\n\r\n return html`\r\n <tab-header>\r\n <div slot=\"chips\" class=\"chips-container\">\r\n <chip-element .title=${chipTitle}> ${this.changedSettings.length} changed </chip-element>\r\n </div>\r\n <div slot=\"actions\">\r\n <copy-icon\r\n title=\"Copy current settings as code\"\r\n .onCopy=${() => this.handleCopySettings()}\r\n ></copy-icon>\r\n </div>\r\n </tab-header>\r\n\r\n <tab-content .hasContent=${true}>\r\n <div class=\"settings-content\">\r\n <div class=\"settings-section\">\r\n <div class=\"settings-group\">\r\n <h4>Mouse Prediction</h4>\r\n <setting-item-checkbox\r\n .isChecked=${settings.enableMousePrediction}\r\n header=\"Enable Mouse Prediction\"\r\n description=\"Execute callbacks when mouse is ${settings.trajectoryPredictionTime}ms away from registered elements in mouse direction\"\r\n setting=\"enableMousePrediction\"\r\n ></setting-item-checkbox>\r\n <setting-item-range\r\n .currentValue=${settings.trajectoryPredictionTime}\r\n .maxValue=${MAX_TRAJECTORY_PREDICTION_TIME}\r\n .minValue=${MIN_TRAJECTORY_PREDICTION_TIME}\r\n .unit=${TRAJECTORY_PREDICTION_TIME_UNIT}\r\n header=\"Prediction Time\"\r\n description=\"How far into the future to calculate mouse trajectory path\"\r\n setting=\"trajectoryPredictionTime\"\r\n ></setting-item-range>\r\n <setting-item-range\r\n .currentValue=${settings.positionHistorySize}\r\n .maxValue=${MAX_POSITION_HISTORY_SIZE}\r\n .minValue=${MIN_POSITION_HISTORY_SIZE}\r\n .unit=${POSITION_HISTORY_SIZE_UNIT}\r\n header=\"Position History Size\"\r\n description=\"How far into the future, in ${POSITION_HISTORY_SIZE_UNIT}, to calculate mouse trajectory path\"\r\n setting=\"positionHistorySize\"\r\n >\r\n </setting-item-range>\r\n </div>\r\n <div class=\"settings-group\">\r\n <h4>Keyboard Navigation</h4>\r\n <setting-item-checkbox\r\n .isChecked=${settings.enableTabPrediction}\r\n header=\"Enable Tab Prediction\"\r\n description=\"Execute callbacks when user ${settings.tabOffset} tabbable elements away from registered elements in tab direction\"\r\n setting=\"enableTabPrediction\"\r\n >\r\n </setting-item-checkbox>\r\n <setting-item-range\r\n .currentValue=${settings.tabOffset}\r\n .maxValue=${MAX_TAB_OFFSET}\r\n .minValue=${MIN_TAB_OFFSET}\r\n .unit=${TAB_OFFSET_UNIT}\r\n header=\"Tab Offset\"\r\n description=\"Number of tabbable elements to look ahead when predicting navigation\"\r\n setting=\"tabOffset\"\r\n >\r\n </setting-item-range>\r\n </div>\r\n\r\n <div class=\"settings-group\">\r\n <h4>Scroll Prediction</h4>\r\n <setting-item-checkbox\r\n .isChecked=${settings.enableScrollPrediction}\r\n header=\"Enable Scroll Prediction\"\r\n description=\"Execute callbacks when user is ${settings.scrollMargin}px away from registered elements in scroll direction\"\r\n setting=\"enableScrollPrediction\"\r\n ></setting-item-checkbox>\r\n <setting-item-range\r\n .currentValue=${settings.scrollMargin}\r\n .maxValue=${MAX_SCROLL_MARGIN}\r\n .minValue=${MIN_SCROLL_MARGIN}\r\n .unit=${SCROLL_MARGIN_UNIT}\r\n header=\"Scroll Margin\"\r\n description=\"Pixel distance to check from mouse position in scroll direction\"\r\n setting=\"scrollMargin\"\r\n ></setting-item-range>\r\n </div>\r\n\r\n <!-- Developer Tools Group -->\r\n <div class=\"settings-group\">\r\n <h4>Developer Tools</h4>\r\n <setting-item-checkbox\r\n .isChecked=${this.devtoolsSettings.showNameTags}\r\n header=\"Show Name Tags\"\r\n description=\"Display name tags over each registered element in the debugger\"\r\n setting=\"showNameTags\"\r\n @setting-changed=${this._handleDevtoolsSettingChange}\r\n ></setting-item-checkbox>\r\n </div>\r\n </div>\r\n </div>\r\n </tab-content>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"settings-tab\": SettingsTab\r\n }\r\n}\r\n","export const DEFAULT_IS_DEBUGGER_MINIMIZED = false\r\nexport const DEFAULT_SHOW_DEBUGGER = true\r\nexport const DEFAULT_SHOW_NAME_TAGS = true\r\nexport const DEFAULT_SORT_ELEMENT_LIST = \"visibility\" as const\r\nexport const MAX_POSITION_HISTORY_SIZE = 30\r\nexport const MAX_SCROLL_MARGIN = 300\r\nexport const MAX_TAB_OFFSET = 20\r\nexport const MAX_TRAJECTORY_PREDICTION_TIME = 200\r\nexport const MIN_POSITION_HISTORY_SIZE = 2\r\nexport const MIN_SCROLL_MARGIN = 30\r\nexport const MIN_TAB_OFFSET = 0\r\nexport const MIN_TRAJECTORY_PREDICTION_TIME = 10\r\nexport const POSITION_HISTORY_SIZE_UNIT = \"points\"\r\nexport const SCROLL_MARGIN_UNIT = \"px\"\r\nexport const TAB_OFFSET_UNIT = \"tabs\"\r\nexport const TRAJECTORY_PREDICTION_TIME_UNIT = \"ms\"\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property, state } from \"lit/decorators.js\"\r\n\r\nimport \"./setting-item\"\r\nimport { ForesightManager, type ForesightManagerSettings } from \"js.foresight\"\r\nimport type { DevtoolsSettings } from \"../../../../types/types\"\r\n@customElement(\"setting-item-checkbox\")\r\nexport class SettingItemCheckbox extends LitElement {\r\n static styles = [\r\n css`\r\n input[type=\"checkbox\"] {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n position: relative;\r\n width: 44px;\r\n height: 22px;\r\n background-color: #444;\r\n cursor: pointer;\r\n outline: none;\r\n transition: all 0.3s ease;\r\n vertical-align: middle;\r\n flex-shrink: 0;\r\n margin: 0;\r\n border: 2px solid #555;\r\n }\r\n\r\n input[type=\"checkbox\"]::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 16px;\r\n height: 16px;\r\n background-color: white;\r\n top: 1px;\r\n left: 1px;\r\n transition: all 0.3s ease;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n input[type=\"checkbox\"]:checked {\r\n background-color: #b0c4de;\r\n border-color: #b0c4de;\r\n }\r\n\r\n input[type=\"checkbox\"]:checked::before {\r\n transform: translateX(22px);\r\n background-color: white;\r\n }\r\n\r\n input[type=\"checkbox\"]:hover {\r\n box-shadow: 0 0 0 3px rgba(176, 196, 222, 0.1);\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: Boolean }) isChecked: boolean = false\r\n @property({ type: String }) header: string = \"\"\r\n @property({ type: String }) description: string = \"\"\r\n @property({ type: String }) setting: keyof ForesightManagerSettings | keyof DevtoolsSettings =\r\n \"enableMousePrediction\"\r\n\r\n private handleCheckboxChange(event: Event): void {\r\n const target = event.target\r\n if (target instanceof HTMLInputElement) {\r\n const targetIsChecked = target.checked\r\n\r\n if (this.setting === \"showNameTags\") {\r\n this.dispatchEvent(\r\n new CustomEvent(\"setting-changed\", {\r\n detail: { setting: this.setting, value: targetIsChecked },\r\n bubbles: true,\r\n })\r\n )\r\n } else {\r\n ForesightManager.instance.alterGlobalSettings({\r\n [this.setting]: targetIsChecked,\r\n })\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return html`<setting-item header=${this.header} description=${this.description}>\r\n <input\r\n slot=\"controls\"\r\n type=\"checkbox\"\r\n .checked=${this.isChecked}\r\n @change=${this.handleCheckboxChange}\r\n />\r\n </setting-item>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"setting-item-checkbox\": SettingItemCheckbox\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property } from \"lit/decorators.js\"\r\n\r\n@customElement(\"setting-item\")\r\nexport class SettingItem extends LitElement {\r\n static styles = [\r\n css`\r\n .setting-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 10px 0;\r\n border-bottom: 1px solid rgba(80, 80, 80, 0.2);\r\n }\r\n\r\n .setting-item:last-child {\r\n border-bottom: none;\r\n }\r\n .setting-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex-shrink: 0;\r\n }\r\n .setting-description {\r\n font-size: 11px;\r\n color: #9e9e9e;\r\n line-height: 1.3;\r\n font-weight: normal;\r\n }\r\n .setting-item label {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n font-weight: 500;\r\n color: #fff;\r\n font-size: 13px;\r\n cursor: pointer;\r\n min-width: 180px;\r\n }\r\n .setting-header {\r\n font-weight: 500;\r\n color: #fff;\r\n font-size: 13px;\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: String }) header: string = \"\"\r\n @property({ type: String }) description: string = \"\"\r\n\r\n render() {\r\n return html`<div class=\"setting-item\">\r\n <label>\r\n <span class=\"setting-header\">${this.header}</span>\r\n <span class=\"setting-description\"> ${this.description} </span>\r\n </label>\r\n <div class=\"setting-controls\">\r\n <slot name=\"controls\"></slot>\r\n </div>\r\n </div>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"setting-item\": SettingItem\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, property, state } from \"lit/decorators.js\"\r\n\r\nimport \"./setting-item\"\r\nimport { ForesightManager, type ForesightManagerSettings } from \"js.foresight\"\r\n@customElement(\"setting-item-range\")\r\nexport class SettingItemRange extends LitElement {\r\n static styles = [\r\n css`\r\n .setting-range-value {\r\n font-size: 12px;\r\n color: #b0c4de;\r\n font-weight: 500;\r\n min-width: 45px;\r\n text-align: right;\r\n }\r\n\r\n .range-wrapper {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n width: 100%;\r\n }\r\n\r\n input[type=\"range\"] {\r\n margin: 0;\r\n cursor: pointer;\r\n -webkit-appearance: none;\r\n appearance: none;\r\n background: transparent;\r\n height: 22px;\r\n vertical-align: middle;\r\n width: 100px;\r\n }\r\n\r\n input[type=\"range\"]::-webkit-slider-runnable-track {\r\n height: 6px;\r\n background: #444;\r\n border: 1px solid #555;\r\n }\r\n\r\n input[type=\"range\"]::-moz-range-track {\r\n height: 6px;\r\n background: #444;\r\n border: 1px solid #555;\r\n }\r\n\r\n input[type=\"range\"]::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n margin-top: -7px;\r\n background: #b0c4de;\r\n height: 20px;\r\n width: 20px;\r\n border: 2px solid #333;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\r\n transition: all 0.2s ease;\r\n }\r\n\r\n input[type=\"range\"]::-moz-range-thumb {\r\n background: #b0c4de;\r\n height: 20px;\r\n width: 20px;\r\n border: 2px solid #333;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\r\n transition: all 0.2s ease;\r\n }\r\n\r\n input[type=\"range\"]:hover::-webkit-slider-thumb {\r\n transform: scale(1.1);\r\n box-shadow: 0 0 0 4px rgba(176, 196, 222, 0.2);\r\n }\r\n\r\n input[type=\"range\"]:hover::-moz-range-thumb {\r\n transform: scale(1.1);\r\n box-shadow: 0 0 0 4px rgba(176, 196, 222, 0.2);\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: Number }) minValue: number = 0\r\n @property({ type: Number }) maxValue: number = 100\r\n @property({ type: Number }) currentValue: number = 50\r\n @property({ type: String }) unit: string = \"px\"\r\n @property({ type: String }) header: string = \"\"\r\n @property({ type: String }) description: string = \"\"\r\n @property({ type: String }) setting: keyof ForesightManagerSettings = \"tabOffset\"\r\n\r\n @state() private displayValue: number = 50\r\n\r\n private handleRangeInput(event: Event): void {\r\n const target = event.target\r\n if (target instanceof HTMLInputElement) {\r\n this.displayValue = parseInt(target.value, 10)\r\n }\r\n }\r\n\r\n private handleRangeChange(event: Event): void {\r\n const target = event.target\r\n if (target instanceof HTMLInputElement) {\r\n const value = parseInt(target.value, 10)\r\n this.displayValue = value\r\n ForesightManager.instance.alterGlobalSettings({\r\n [this.setting]: value,\r\n })\r\n }\r\n }\r\n\r\n willUpdate(changedProperties: Map<string, any>) {\r\n super.willUpdate(changedProperties)\r\n if (changedProperties.has(\"currentValue\")) {\r\n this.displayValue = this.currentValue\r\n }\r\n }\r\n\r\n render() {\r\n return html`<setting-item header=${this.header} description=${this.description}>\r\n <div slot=\"controls\" class=\"range-wrapper\">\r\n <input\r\n slot=\"controls\"\r\n type=\"range\"\r\n min=\"${this.minValue}\"\r\n max=\"${this.maxValue}\"\r\n step=\"1\"\r\n .value=${this.displayValue}\r\n @input=${this.handleRangeInput}\r\n @change=${this.handleRangeChange}\r\n />\r\n <span class=\"setting-range-value\">${this.displayValue} ${this.unit}</span>\r\n </div>\r\n </setting-item>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"setting-item-range\": SettingItemRange\r\n }\r\n}\r\n","import { LitElement, css, html } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\nimport \"./element-overlays\"\r\nimport \"./mouse-trajectory\"\r\nimport \"./scroll-trajectory\"\r\nimport { ForesightManager } from \"js.foresight\"\r\n\r\n@customElement(\"debug-overlay\")\r\nexport class DebugOverlay extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n #overlay-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n pointer-events: none;\r\n z-index: 9999;\r\n }\r\n `,\r\n ]\r\n\r\n render() {\r\n return html`\r\n <div id=\"overlay-container\">\r\n <mouse-trajectory></mouse-trajectory>\r\n <scroll-trajectory></scroll-trajectory>\r\n <element-overlays></element-overlays>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"debug-overlay\": DebugOverlay\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, state, query } from \"lit/decorators.js\"\r\nimport {\r\n type ForesightElementData,\r\n type ForesightElement,\r\n type CallbackHitType,\r\n ForesightManager,\r\n type ElementUnregisteredEvent,\r\n} from \"js.foresight\"\r\nimport type {\r\n CallbackCompletedEvent,\r\n CallbackInvokedEvent,\r\n ElementDataUpdatedEvent,\r\n ElementRegisteredEvent,\r\n} from \"js.foresight\"\r\nimport { ForesightDevtools } from \"../foresight-devtools\"\r\ninterface ElementOverlay {\r\n expandedOverlay: HTMLElement\r\n nameLabel: HTMLElement\r\n}\r\n\r\ninterface CallbackAnimation {\r\n element: ForesightElement\r\n timeoutId: ReturnType<typeof setTimeout>\r\n}\r\n\r\n@customElement(\"element-overlays\")\r\nexport class ElementOverlays extends LitElement {\r\n @state() private overlayMap: Map<ForesightElement, ElementOverlay> = new Map()\r\n @state() private callbackAnimations: Map<ForesightElement, CallbackAnimation> = new Map()\r\n @query(\"#overlays-container\") private containerElement!: HTMLElement\r\n\r\n static styles = [\r\n css`\r\n :host {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 9999;\r\n }\r\n\r\n .expanded-overlay {\r\n position: absolute;\r\n will-change: transform, box-shadow;\r\n border: 1px dashed rgba(100, 116, 139, 0.4);\r\n background-color: rgba(100, 116, 139, 0.05);\r\n transition: border-color 0.2s ease, background-color 0.2s ease;\r\n }\r\n\r\n .expanded-overlay.invoked-by-scroll {\r\n --glow-color-rgb: 234, 179, 8;\r\n border-color: #eab308;\r\n background-color: rgba(var(--glow-color-rgb), 0.1);\r\n animation: callback-glow 2s ease-in-out infinite;\r\n }\r\n\r\n .expanded-overlay.invoked-by-mouse {\r\n --glow-color-rgb: 59, 130, 246;\r\n border-color: #3b82f6;\r\n background-color: rgba(var(--glow-color-rgb), 0.1);\r\n animation: callback-glow 2s ease-in-out infinite;\r\n }\r\n\r\n .expanded-overlay.invoked-by-tab {\r\n --glow-color-rgb: 249, 115, 22;\r\n border-color: #f97316;\r\n background-color: rgba(var(--glow-color-rgb), 0.1);\r\n animation: callback-glow 2s ease-in-out infinite;\r\n }\r\n @keyframes callback-glow {\r\n 0% {\r\n box-shadow: 0 0 5px 2px rgba(var(--glow-color-rgb), 0.3);\r\n }\r\n 50% {\r\n box-shadow: 0 0 15px 4px rgba(var(--glow-color-rgb), 0.6);\r\n }\r\n 100% {\r\n box-shadow: 0 0 5px 2px rgba(var(--glow-color-rgb), 0.3);\r\n }\r\n }\r\n\r\n .name-label {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n will-change: transform;\r\n background-color: rgba(27, 31, 35, 0.85);\r\n backdrop-filter: blur(4px);\r\n color: white;\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial,\r\n sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\r\n z-index: 10001;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n }\r\n `,\r\n ]\r\n\r\n private _abortController: AbortController | null = null\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback()\r\n this._abortController = new AbortController()\r\n const { signal } = this._abortController\r\n ForesightManager.instance.addEventListener(\r\n \"elementRegistered\",\r\n (e: ElementRegisteredEvent) => {\r\n if (e.elementData.isIntersectingWithViewport) {\r\n this.createOrUpdateElementOverlay(e.elementData)\r\n }\r\n },\r\n { signal }\r\n )\r\n ForesightManager.instance.addEventListener(\r\n \"elementUnregistered\",\r\n (e: ElementUnregisteredEvent) => {\r\n this.removeElementOverlay(e.elementData)\r\n },\r\n { signal }\r\n )\r\n ForesightManager.instance.addEventListener(\r\n \"elementDataUpdated\",\r\n (e: ElementDataUpdatedEvent) => {\r\n if (e.updatedProps.includes(\"bounds\")) {\r\n this.createOrUpdateElementOverlay(e.elementData)\r\n }\r\n if (e.updatedProps.includes(\"visibility\")) {\r\n if (!e.elementData.isIntersectingWithViewport) {\r\n this.removeElementOverlay(e.elementData)\r\n }\r\n }\r\n },\r\n { signal }\r\n )\r\n ForesightManager.instance.addEventListener(\r\n \"callbackInvoked\",\r\n (e: CallbackInvokedEvent) => {\r\n this.highlightElementCallback(e.elementData, e.hitType)\r\n },\r\n { signal }\r\n )\r\n ForesightManager.instance.addEventListener(\r\n \"callbackCompleted\",\r\n (e: CallbackCompletedEvent) => {\r\n this.unhighlightElementCallback(e.elementData)\r\n },\r\n { signal }\r\n )\r\n\r\n document.addEventListener(\r\n \"showNameTagsChanged\",\r\n (e: Event) => {\r\n const customEvent = e as CustomEvent<{ showNameTags: boolean }>\r\n this.updateNameTagVisibility(customEvent.detail.showNameTags)\r\n },\r\n { signal }\r\n )\r\n }\r\n\r\n private createElementOverlays(elementData: ForesightElementData): ElementOverlay {\r\n const expandedOverlay = document.createElement(\"div\")\r\n expandedOverlay.className = \"expanded-overlay\"\r\n const nameLabel = document.createElement(\"div\")\r\n nameLabel.className = \"name-label\"\r\n this.containerElement.appendChild(expandedOverlay)\r\n this.containerElement.appendChild(nameLabel)\r\n const overlays = { expandedOverlay, nameLabel }\r\n this.overlayMap.set(elementData.element, overlays)\r\n return overlays\r\n }\r\n\r\n private updateElementOverlays(overlays: ElementOverlay, elementData: ForesightElementData) {\r\n const { expandedOverlay, nameLabel } = overlays\r\n const { expandedRect } = elementData.elementBounds\r\n\r\n const expandedWidth = expandedRect.right - expandedRect.left\r\n const expandedHeight = expandedRect.bottom - expandedRect.top\r\n expandedOverlay.style.width = `${expandedWidth}px`\r\n expandedOverlay.style.height = `${expandedHeight}px`\r\n expandedOverlay.style.transform = `translate3d(${expandedRect.left}px, ${expandedRect.top}px, 0)`\r\n\r\n if (!ForesightDevtools.instance.devtoolsSettings.showNameTags) {\r\n nameLabel.style.display = \"none\"\r\n } else {\r\n nameLabel.textContent = elementData.name\r\n nameLabel.style.display = \"block\"\r\n nameLabel.style.transform = `translate3d(${expandedRect.left}px, ${\r\n expandedRect.top - 25\r\n }px, 0)`\r\n }\r\n }\r\n\r\n private createOrUpdateElementOverlay(elementData: ForesightElementData) {\r\n let overlays = this.overlayMap.get(elementData.element)\r\n if (!overlays) {\r\n overlays = this.createElementOverlays(elementData)\r\n }\r\n this.updateElementOverlays(overlays, elementData)\r\n }\r\n\r\n private removeElementOverlay(elementData: ForesightElementData) {\r\n const overlays = this.overlayMap.get(elementData.element)\r\n if (overlays) {\r\n overlays.expandedOverlay.remove()\r\n overlays.nameLabel.remove()\r\n this.overlayMap.delete(elementData.element)\r\n }\r\n\r\n this.clearCallbackAnimationTimeout(elementData.element)\r\n }\r\n\r\n private clearCallbackAnimationTimeout(element: ForesightElement) {\r\n const existingAnimation = this.callbackAnimations.get(element)\r\n if (existingAnimation) {\r\n clearTimeout(existingAnimation.timeoutId)\r\n this.callbackAnimations.delete(element)\r\n }\r\n }\r\n\r\n private highlightElementCallback(elementData: ForesightElementData, hitType: CallbackHitType) {\r\n const overlays = this.overlayMap.get(elementData.element)\r\n if (overlays) {\r\n this.clearCallbackAnimationTimeout(elementData.element)\r\n\r\n switch (hitType.kind) {\r\n case \"mouse\":\r\n overlays.expandedOverlay.classList.add(\"invoked-by-mouse\")\r\n break\r\n case \"scroll\":\r\n overlays.expandedOverlay.classList.add(\"invoked-by-scroll\")\r\n break\r\n case \"tab\":\r\n overlays.expandedOverlay.classList.add(\"invoked-by-tab\")\r\n break\r\n default:\r\n hitType satisfies never\r\n }\r\n }\r\n }\r\n\r\n private unhighlightElementCallback(elementData: ForesightElementData) {\r\n const overlays = this.overlayMap.get(elementData.element)\r\n if (overlays) {\r\n const animationDelay = setTimeout(() => {\r\n overlays.expandedOverlay.classList.remove(\"callback-invoked\")\r\n this.callbackAnimations.delete(elementData.element)\r\n }, 400)\r\n\r\n this.callbackAnimations.set(elementData.element, {\r\n element: elementData.element,\r\n timeoutId: animationDelay,\r\n })\r\n }\r\n }\r\n\r\n public updateNameTagVisibility(showNameTags: boolean) {\r\n this.overlayMap.forEach(overlays => {\r\n const nameLabel = overlays.nameLabel\r\n if (!showNameTags) {\r\n nameLabel.style.display = \"none\"\r\n } else {\r\n nameLabel.style.display = \"block\"\r\n }\r\n })\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._abortController?.abort()\r\n this._abortController = null\r\n }\r\n\r\n render() {\r\n return html` <div id=\"overlays-container\"></div> `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"element-overlays\": ElementOverlays\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\nimport { styleMap } from \"lit/directives/style-map.js\"\r\nimport {\r\n ForesightManager,\r\n type MouseTrajectoryUpdateEvent,\r\n type ManagerSettingsChangedEvent,\r\n} from \"js.foresight\"\r\n\r\nexport type Point = {\r\n x: number\r\n y: number\r\n}\r\n@customElement(\"mouse-trajectory\")\r\nexport class MouseTrajectory extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .trajectory-line {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n will-change: transform, width;\r\n transform-origin: left center;\r\n height: 4px;\r\n background: linear-gradient(90deg, #3b82f6, rgba(59, 130, 246, 0.4));\r\n z-index: 9999;\r\n border-radius: 2px;\r\n box-shadow: 0 0 12px rgba(59, 130, 246, 0.4);\r\n }\r\n\r\n .trajectory-line::after {\r\n content: \"\";\r\n position: absolute;\r\n right: -6px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 8px solid #3b82f6;\r\n border-top: 4px solid transparent;\r\n border-bottom: 4px solid transparent;\r\n filter: drop-shadow(0 0 6px rgba(59, 130, 246, 0.6));\r\n }\r\n `,\r\n ]\r\n\r\n private _abortController = new AbortController()\r\n\r\n @state()\r\n private _mousePredictionIsEnabled =\r\n ForesightManager.instance.getManagerData.globalSettings.enableMousePrediction\r\n\r\n @state()\r\n private _isVisible = false\r\n\r\n @state()\r\n private _trajectoryStyles: { [key: string]: string } = {}\r\n\r\n private _isUpdateScheduled = false\r\n private _latestTrajectory: { currentPoint: Point; predictedPoint: Point } | null = null\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback()\r\n const { signal } = this._abortController\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"mouseTrajectoryUpdate\",\r\n this.handleTrajectoryUpdate,\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"scrollTrajectoryUpdate\",\r\n () => {\r\n this._isVisible = false\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"managerSettingsChanged\",\r\n this.handleSettingsChange,\r\n { signal }\r\n )\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._abortController.abort()\r\n }\r\n\r\n // Removed firstUpdated - no longer needed for direct DOM access\r\n\r\n private handleSettingsChange = (e: ManagerSettingsChangedEvent) => {\r\n const isEnabled = e.managerData.globalSettings.enableMousePrediction\r\n this._mousePredictionIsEnabled = isEnabled\r\n if (!isEnabled) {\r\n this._isVisible = false\r\n }\r\n }\r\n\r\n private handleTrajectoryUpdate = (e: MouseTrajectoryUpdateEvent) => {\r\n if (!this._mousePredictionIsEnabled) return\r\n\r\n this._isVisible = true\r\n this._latestTrajectory = e.trajectoryPositions\r\n\r\n if (!this._isUpdateScheduled) {\r\n this._isUpdateScheduled = true\r\n requestAnimationFrame(this.renderTrajectory)\r\n }\r\n }\r\n\r\n private renderTrajectory = () => {\r\n if (!this._latestTrajectory) {\r\n this._isUpdateScheduled = false\r\n return\r\n }\r\n\r\n const { currentPoint, predictedPoint } = this._latestTrajectory\r\n const dx = predictedPoint.x - currentPoint.x\r\n const dy = predictedPoint.y - currentPoint.y\r\n const length = Math.sqrt(dx * dx + dy * dy)\r\n\r\n if (length === 0) {\r\n this._trajectoryStyles = { display: \"none\" }\r\n } else {\r\n const angle = (Math.atan2(dy, dx) * 180) / Math.PI\r\n this._trajectoryStyles = {\r\n transform: `translate(${currentPoint.x}px, ${currentPoint.y}px) rotate(${angle}deg)`,\r\n width: `${length}px`,\r\n }\r\n }\r\n\r\n this._isUpdateScheduled = false\r\n this.requestUpdate()\r\n }\r\n\r\n render() {\r\n const combinedStyles = {\r\n display: this._isVisible ? \"block\" : \"none\",\r\n ...this._trajectoryStyles,\r\n }\r\n return html` <div class=\"trajectory-line\" style=${styleMap(combinedStyles)}></div> `\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\"\r\nimport { customElement, state } from \"lit/decorators.js\"\r\nimport { styleMap } from \"lit/directives/style-map.js\"\r\nimport type { ScrollTrajectoryUpdateEvent, ManagerSettingsChangedEvent } from \"js.foresight\"\r\nimport { ForesightManager } from \"js.foresight\"\r\nimport type { Point } from \"./mouse-trajectory\"\r\n\r\n@customElement(\"scroll-trajectory\")\r\nexport class ScrollTrajectory extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .scroll-trajectory-line {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n will-change: transform, width;\r\n transform-origin: left center;\r\n height: 4px;\r\n background: repeating-linear-gradient(\r\n 90deg,\r\n #eab308 0px,\r\n #eab308 8px,\r\n transparent 8px,\r\n transparent 16px\r\n );\r\n z-index: 9999;\r\n border-radius: 2px;\r\n animation: scroll-dash-flow 1.5s linear infinite;\r\n box-shadow: 0 0 12px rgba(234, 179, 8, 0.4);\r\n }\r\n\r\n .scroll-trajectory-line::after {\r\n content: \"\";\r\n position: absolute;\r\n right: -6px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 8px solid #eab308;\r\n border-top: 4px solid transparent;\r\n border-bottom: 4px solid transparent;\r\n filter: drop-shadow(0 0 6px rgba(234, 179, 8, 0.6));\r\n animation: scroll-arrow-pulse 1.5s ease-in-out infinite;\r\n }\r\n\r\n @keyframes scroll-dash-flow {\r\n 0% {\r\n background-position: 0px 0px;\r\n }\r\n 100% {\r\n background-position: 16px 0px;\r\n }\r\n }\r\n\r\n @keyframes scroll-arrow-pulse {\r\n 0%,\r\n 100% {\r\n transform: translateY(-50%) scale(1);\r\n filter: drop-shadow(0 0 6px rgba(234, 179, 8, 0.6));\r\n }\r\n 50% {\r\n transform: translateY(-50%) scale(1.2);\r\n filter: drop-shadow(0 0 12px rgba(234, 179, 8, 0.8));\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n private _abortController = new AbortController()\r\n\r\n @state()\r\n private _scrollPredictionIsEnabled =\r\n ForesightManager.instance.getManagerData.globalSettings.enableScrollPrediction\r\n\r\n @state()\r\n private _scrollMargin = ForesightManager.instance.getManagerData.globalSettings.scrollMargin\r\n\r\n @state()\r\n private _isVisible = false\r\n\r\n @state()\r\n private _trajectoryStyles: { [key: string]: string } = {}\r\n\r\n private _isUpdateScheduled = false\r\n private _latestScrollTrajectory: { currentPoint: Point; predictedPoint: Point } | null = null\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback()\r\n const { signal } = this._abortController\r\n\r\n ForesightManager.instance.addEventListener(\"scrollTrajectoryUpdate\", this.handleScrollUpdate, {\r\n signal,\r\n })\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"mouseTrajectoryUpdate\",\r\n () => {\r\n this._isVisible = false\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"managerSettingsChanged\",\r\n this.handleSettingsChange,\r\n { signal }\r\n )\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._abortController.abort()\r\n }\r\n\r\n // Removed firstUpdated - no longer needed for direct DOM access\r\n\r\n private handleSettingsChange = (e: ManagerSettingsChangedEvent) => {\r\n const isEnabled = e.managerData.globalSettings.enableScrollPrediction\r\n this._scrollPredictionIsEnabled = isEnabled\r\n if (!isEnabled) {\r\n this._isVisible = false\r\n }\r\n const scrollMarginUpdate = e.updatedSettings.find(update => update.setting === \"scrollMargin\")\r\n if (scrollMarginUpdate) {\r\n this._scrollMargin = scrollMarginUpdate.newValue\r\n }\r\n }\r\n\r\n private handleScrollUpdate = (e: ScrollTrajectoryUpdateEvent) => {\r\n if (!this._scrollPredictionIsEnabled) return\r\n\r\n this._isVisible = true\r\n this._latestScrollTrajectory = {\r\n currentPoint: e.currentPoint,\r\n predictedPoint: e.predictedPoint,\r\n }\r\n\r\n if (!this._isUpdateScheduled) {\r\n this._isUpdateScheduled = true\r\n requestAnimationFrame(this.renderScrollTrajectory)\r\n }\r\n }\r\n\r\n private renderScrollTrajectory = () => {\r\n if (!this._latestScrollTrajectory) {\r\n this._isUpdateScheduled = false\r\n return\r\n }\r\n\r\n const { currentPoint, predictedPoint } = this._latestScrollTrajectory\r\n const dx = predictedPoint.x - currentPoint.x\r\n const dy = predictedPoint.y - currentPoint.y\r\n const angle = (Math.atan2(dy, dx) * 180) / Math.PI\r\n\r\n this._trajectoryStyles = {\r\n transform: `translate(${currentPoint.x}px, ${currentPoint.y}px) rotate(${angle}deg)`,\r\n }\r\n\r\n this._isUpdateScheduled = false\r\n this.requestUpdate()\r\n }\r\n\r\n render() {\r\n const combinedStyles = {\r\n display: this._isVisible ? \"block\" : \"none\",\r\n width: `${this._scrollMargin}px`,\r\n ...this._trajectoryStyles,\r\n }\r\n return html` <div class=\"scroll-trajectory-line\" style=${styleMap(combinedStyles)}></div> `\r\n }\r\n}\r\n"],"mappings":"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","names":["LitElement","css","html","customElement","state","LitElement","css","html","customElement","state","classMap","css","html","LitElement","customElement","state","map","LitElement","html","css","customElement","TabHeader","LitElement","html","css","__decorateClass","customElement","LitElement","html","css","customElement","property","TabContent","LitElement","html","css","__decorateClass","property","customElement","html","customElement","property","LitElement","html","css","property","state","_BaseDropdown","LitElement","event","triggerButton","dropdownMenu","rect","dropdownHeight","top","right","buttonClass","menuClass","html","option","css","__decorateClass","state","property","BaseDropdown","SingleSelectDropdown","BaseDropdown","changedProperties","option","selectedOption","html","selected","__decorateClass","property","customElement","LitElement","html","css","customElement","property","ChipElement","LitElement","html","css","__decorateClass","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","customElement","property","LitElement","html","css","customElement","property","state","html","CONTROL_PANEL_SVG","CONSOLE_SVG","NONE_SVG","BOTH_SVG","VISIBILITY_SVG","DOCUMENT_SVG","INSERTION_SVG","FILTER_SVG","CLEAR_SVG","COPY_SVG","TICK_SVG","WARNING_SVG","CopyIcon","LitElement","event","error","html","TICK_SVG","COPY_SVG","css","__decorateClass","property","state","customElement","ExpandableItem","LitElement","event","detailsSlot","textContent","node","err","html","css","__decorateClass","property","customElement","SingleElement","LitElement","details","html","css","__decorateClass","property","customElement","ForesightManager","ElementTab","LitElement","value","elementId","newExpandedElementIds","a","b","position","ForesightDevtools","VISIBILITY_SVG","DOCUMENT_SVG","INSERTION_SVG","visibleCount","totalCount","data","hitCounts","lines","signal","ForesightManager","e","elementWithId","existingElementData","updatedElementWithId","elementsWithIds","elementData","element","hitType","elementsData","html","map","css","__decorateClass","state","customElement","css","html","LitElement","customElement","property","TabSelector","LitElement","selectedTab","html","tab","css","__decorateClass","property","customElement","ForesightManager","LitElement","css","html","customElement","property","state","map","safeSerializeEventData","event","getOrdinalSuffix","elapsed","formatElapsed","setting","error","ms","suffixes","v","html","css","customElement","property","MultiSelectDropdown","BaseDropdown","option","isCurrentlySelected","value","newSelectionState","FILTER_SVG","count","buttonClass","menuClass","html","css","__decorateClass","property","customElement","LitElement","html","css","customElement","property","SingleLog","LitElement","log","summary","rest","logType","eventType","maxLength","className","borderColor","html","css","__decorateClass","property","customElement","LogTab","LitElement","value","changedEventType","isEnabled","logId","newExpandedLogIds","logLocation","eventFlags","ForesightDevtools","CONTROL_PANEL_SVG","CONSOLE_SVG","BOTH_SVG","NONE_SVG","FILTER_SVG","_","enabled","eventType","hasConsoleOutput","hasFrequentEvents","handler","event","ForesightManager","color","logData","safeSerializeEventData","logWithId","html","WARNING_SVG","CLEAR_SVG","map","log","css","__decorateClass","state","property","customElement","ForesightManager","css","html","LitElement","customElement","state","POSITION_HISTORY_SIZE_UNIT","SCROLL_MARGIN_UNIT","TAB_OFFSET_UNIT","TRAJECTORY_PREDICTION_TIME_UNIT","LitElement","html","css","customElement","property","LitElement","html","css","customElement","property","SettingItem","LitElement","html","css","__decorateClass","property","customElement","ForesightManager","SettingItemCheckbox","LitElement","event","target","targetIsChecked","ForesightManager","html","css","__decorateClass","property","customElement","LitElement","html","css","customElement","property","state","ForesightManager","SettingItemRange","LitElement","event","target","value","ForesightManager","changedProperties","html","css","__decorateClass","property","state","customElement","SettingsTab","LitElement","currentDevtoolsSettings","ForesightDevtools","currentManagerSettings","ForesightManager","signal","e","changes","managerKeys","key","initialValue","currentValue","devtoolsKeys","setting","value","settingsCode","err","settings","settingsObject","html","chipTitle","change","TRAJECTORY_PREDICTION_TIME_UNIT","POSITION_HISTORY_SIZE_UNIT","TAB_OFFSET_UNIT","SCROLL_MARGIN_UNIT","css","__decorateClass","state","customElement","ControlPanel","LitElement","event","customEvent","tab","html","classMap","css","__decorateClass","state","customElement","LitElement","css","html","customElement","LitElement","html","css","customElement","state","query","ForesightManager","ElementOverlays","LitElement","signal","ForesightManager","e","customEvent","elementData","expandedOverlay","nameLabel","overlays","expandedRect","expandedWidth","expandedHeight","ForesightDevtools","element","existingAnimation","hitType","animationDelay","showNameTags","html","css","__decorateClass","state","query","customElement","LitElement","html","css","customElement","state","styleMap","ForesightManager","MouseTrajectory","LitElement","ForesightManager","isEnabled","currentPoint","predictedPoint","dx","dy","length","angle","signal","combinedStyles","html","styleMap","css","__decorateClass","state","customElement","LitElement","html","css","customElement","state","styleMap","ForesightManager","ScrollTrajectory","LitElement","ForesightManager","isEnabled","scrollMarginUpdate","update","currentPoint","predictedPoint","dx","dy","angle","signal","combinedStyles","html","styleMap","css","__decorateClass","state","customElement","DebugOverlay","LitElement","html","css","__decorateClass","customElement","ForesightDevtools","LitElement","props","devtools","newValue","currentValue","html","css","__decorateClass","state","customElement"]}