js.foresight-devtools 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1855,4 +1855,3 @@ Click on the copy icon to easely copy the new setting into your project
1855
1855
  display: block;
1856
1856
  }
1857
1857
  `],l._instance=null,n([zn()],l.prototype,"isInitialized",2),l=n([jn("foresight-devtools")],l);export{l as ForesightDevtools};
1858
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js.foresight-devtools",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Visual debugging tools for ForesightJS - mouse trajectory prediction and element interaction visualization",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -43,14 +43,15 @@
43
43
  "tsup": "^8.5.0",
44
44
  "typescript": "^5.8.3",
45
45
  "vitest": "^3.2.4",
46
- "js.foresight": "3.2.0"
46
+ "js.foresight": "3.2.1"
47
47
  },
48
48
  "dependencies": {
49
49
  "@thednp/position-observer": "^1.1.0",
50
50
  "lit": "^3.3.0"
51
51
  },
52
52
  "scripts": {
53
- "build": "tsup --clean --minify",
53
+ "build": "tsup --sourcemap",
54
+ "build:prod": "tsup",
54
55
  "dev": "tsup --watch",
55
56
  "test": "vitest",
56
57
  "test:watch": "vitest --watch",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
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/svg/svg-icons.ts","../src/lit-entry/control-panel/base-tab/chip.ts","../src/lit-entry/control-panel/base-tab/tab-content.ts","../src/lit-entry/control-panel/base-tab/tab-header.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/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/lit-entry/control-panel/element-tab/reactivate-countdown.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, LogEvents } 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 elementReactivated: 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 private constructor() {\r\n super()\r\n }\r\n\r\n private static createAndAppendInstance(): void {\r\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\r\n return\r\n }\r\n ForesightDevtools._instance = document.createElement(\"foresight-devtools\") as ForesightDevtools\r\n document.body.appendChild(ForesightDevtools._instance)\r\n }\r\n\r\n public static initialize(props?: DeepPartial<DevtoolsSettings>): ForesightDevtools {\r\n if (!ForesightDevtools._instance) {\r\n ForesightDevtools.createAndAppendInstance()\r\n }\r\n\r\n // If still no instance after create attempt (SSR case), return early\r\n if (!ForesightDevtools._instance) {\r\n return ForesightDevtools._instance!\r\n }\r\n\r\n const devtools = ForesightDevtools._instance\r\n devtools.isInitialized = true\r\n devtools.alterDevtoolsSettings(props)\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 private updateLoggingSetting<K extends keyof LogEvents>(\r\n key: K,\r\n newValue: LogEvents[K] | undefined\r\n ): void {\r\n if (this.shouldUpdateSetting(newValue, this.devtoolsSettings.logging[key])) {\r\n this.devtoolsSettings.logging[key] = newValue!\r\n }\r\n }\r\n\r\n public alterDevtoolsSettings(props?: DeepPartial<DevtoolsSettings>) {\r\n if (props === undefined) 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\r\n this.updateLoggingSetting(\"callbackCompleted\", props.logging.callbackCompleted)\r\n this.updateLoggingSetting(\"callbackInvoked\", props.logging.callbackInvoked)\r\n this.updateLoggingSetting(\"elementDataUpdated\", props.logging.elementDataUpdated)\r\n this.updateLoggingSetting(\"elementRegistered\", props.logging.elementRegistered)\r\n this.updateLoggingSetting(\"elementUnregistered\", props.logging.elementUnregistered)\r\n this.updateLoggingSetting(\"managerSettingsChanged\", props.logging.managerSettingsChanged)\r\n this.updateLoggingSetting(\"mouseTrajectoryUpdate\", props.logging.mouseTrajectoryUpdate)\r\n this.updateLoggingSetting(\"scrollTrajectoryUpdate\", props.logging.scrollTrajectoryUpdate)\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\"\nimport { customElement, state } from \"lit/decorators.js\"\nimport { classMap } from \"lit/directives/class-map.js\"\n\nimport \"./element-tab/element-tab\"\nimport \"./base-tab/tab-selector\"\nimport \"./log-tab/log-tab\"\nimport \"./settings-tab/settings-tab\"\nimport type { ControllerTabs } from \"../../types/types\"\nimport { ForesightDevtools } from \"../foresight-devtools\"\n\n@customElement(\"control-panel\")\nexport class ControlPanel extends LitElement {\n static styles = css`\n .control-wrapper {\n padding: 12px;\n position: fixed;\n bottom: 10px;\n right: 10px;\n background-color: rgba(0, 0, 0, 0.9);\n color: white;\n font-family: Arial, sans-serif;\n font-size: 13px;\n z-index: 10001;\n pointer-events: auto;\n display: flex;\n flex-direction: column;\n width: 450px;\n height: 450px;\n transition: width 0.3s ease, height 0.3s ease;\n box-sizing: border-box;\n }\n .control-wrapper.minimized {\n width: 230px;\n height: 45px;\n }\n\n .title-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0;\n flex-shrink: 0;\n }\n\n .title-wrapper h1 {\n margin: 0;\n font-size: 15px;\n }\n\n .minimize-button {\n background: none;\n border: none;\n color: white;\n font-size: 22px;\n cursor: pointer;\n line-height: 1;\n padding: 0;\n }\n\n .tab-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n\n .tab-container.hidden {\n display: none;\n }\n\n .tab-content {\n flex: 1;\n position: relative;\n }\n\n .tab-content > * {\n display: none;\n }\n\n .tab-content > .active {\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n `\n @state() private activeTab: ControllerTabs\n @state() private isMinimized: boolean =\n ForesightDevtools.instance.devtoolsSettings.isControlPanelDefaultMinimized\n\n private localStorageSelectedTabKey = \"foresight-devtools-control-panel-tab\"\n constructor() {\n super()\n this.activeTab = this.getStoredTab()\n }\n\n private getStoredTab(): ControllerTabs {\n try {\n const tab = localStorage.getItem(this.localStorageSelectedTabKey)\n return (tab as ControllerTabs) || \"logs\"\n } catch (error) {\n console.error(error)\n return \"logs\"\n }\n }\n private _handleTabChange(event: CustomEvent) {\n this.activeTab = event.detail.tab\n this.setStoredTab(this.activeTab)\n }\n\n private setStoredTab(tab: ControllerTabs): void {\n try {\n localStorage.setItem(this.localStorageSelectedTabKey, tab)\n } catch (error) {\n // Silently fail - localStorage may be disabled (private browsing, etc.)\n console.warn(\"ForesightDevtools: Failed to save tab preference to localStorage:\", error)\n }\n }\n\n protected render() {\n return html`\n <div class=\"control-wrapper ${this.isMinimized ? \"minimized\" : \"\"}\">\n <div class=\"title-wrapper\">\n <button @click=\"${() => (this.isMinimized = !this.isMinimized)}\" class=\"minimize-button\">\n -\n </button>\n <h1>Foresight DevTools</h1>\n <div></div>\n </div>\n\n <div class=\"tab-container ${this.isMinimized ? \"hidden\" : \"\"}\">\n <tab-selector\n .activeTab=\"${this.activeTab}\"\n @tab-change=\"${this._handleTabChange}\"\n ></tab-selector>\n\n <div class=\"tab-content\">\n <log-tab class=${classMap({ active: this.activeTab === \"logs\" })}></log-tab>\n <element-tab class=${classMap({ active: this.activeTab === \"elements\" })}></element-tab>\n <settings-tab\n class=${classMap({ active: this.activeTab === \"settings\" })}\n ></settings-tab>\n </div>\n </div>\n </div>\n `\n }\n}\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 type {\r\n CallbackCompletedEvent,\r\n CallbackHits,\r\n CallbackHitType,\r\n CallbackInvokedEvent,\r\n ElementDataUpdatedEvent,\r\n ElementReactivatedEvent,\r\n ElementRegisteredEvent,\r\n ElementUnregisteredEvent,\r\n} from \"js.foresight\"\r\nimport { ForesightManager, type ForesightElement, type ForesightElementData } from \"js.foresight\"\r\nimport { DOCUMENT_SVG, INSERTION_SVG, VISIBILITY_SVG } from \"../../../svg/svg-icons\"\r\nimport type { SortElementList } from \"../../../types/types\"\r\nimport { ForesightDevtools } from \"../../foresight-devtools\"\r\nimport \"../base-tab/chip\"\r\nimport \"../base-tab/tab-content\"\r\nimport \"../base-tab/tab-header\"\r\nimport \"../dropdown/single-select-dropdown\"\r\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\r\nimport \"../element-tab/single-element\"\r\nimport \"./reactivate-countdown\"\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-section {\r\n margin-bottom: 16px;\r\n }\r\n\r\n .element-section:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .section-header {\r\n margin: 4px 0 4px 0;\r\n font-size: 12px;\r\n font-weight: 600;\r\n }\r\n\r\n .section-header.active {\r\n color: #e8e8e8;\r\n }\r\n\r\n .section-header.inactive {\r\n color: #999;\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() private sortDropdown: DropdownOption[]\r\n @state() private sortOrder: SortElementList\r\n @state() private elementListItems: Map<ForesightElement, ForesightElementData> = new Map()\r\n @state() private noContentMessage: string = \"No Elements Registered To The Foresight Manager\"\r\n @state() private runningCallbacks: Set<ForesightElement> = new Set()\r\n @state() private expandedElementIds: Set<string> = new Set()\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 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 _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\r\n ForesightManager.instance.addEventListener(\r\n \"elementRegistered\",\r\n (e: ElementRegisteredEvent) => {\r\n this.elementListItems.set(e.elementData.element, e.elementData)\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 this.elementListItems.set(e.elementData.element, e.elementData)\r\n this.requestUpdate()\r\n }\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"elementReactivated\",\r\n (e: ElementReactivatedEvent) => {\r\n const existingElementData = this.elementListItems.get(e.elementData.element)\r\n if (existingElementData) {\r\n this.elementListItems.set(e.elementData.element, e.elementData)\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 if (!this.elementListItems.size) {\r\n this.noContentMessage = \"No Elements Registered To The Foresight Manager\"\r\n }\r\n this.runningCallbacks.delete(e.elementData.element)\r\n this.requestUpdate()\r\n },\r\n { signal }\r\n )\r\n\r\n ForesightManager.instance.addEventListener(\r\n \"callbackInvoked\",\r\n (e: CallbackInvokedEvent) => {\r\n const existingElementData = this.elementListItems.get(e.elementData.element)\r\n if (existingElementData) {\r\n this.elementListItems.set(e.elementData.element, e.elementData)\r\n }\r\n this.runningCallbacks.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 const existingElementData = this.elementListItems.get(e.elementData.element)\r\n if (existingElementData) {\r\n this.elementListItems.set(e.elementData.element, e.elementData)\r\n }\r\n this.handleCallbackCompleted(e.hitType)\r\n this.runningCallbacks.delete(e.elementData.element)\r\n this.requestUpdate()\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 this.elementListItems = new Map(ForesightManager.instance.registeredElements)\r\n }\r\n\r\n private handleCallbackCompleted(hitType: CallbackHitType) {\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 this.requestUpdate()\r\n }\r\n\r\n private getSortedElements(): ForesightElementData[] {\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((a: ForesightElementData, b: ForesightElementData) => {\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 default:\r\n this.sortOrder satisfies never\r\n return elementsData\r\n }\r\n }\r\n\r\n private getActiveElements(): ForesightElementData[] {\r\n return this.getSortedElements().filter(data => data.callbackInfo.isCallbackActive)\r\n }\r\n\r\n private getInactiveElements(): ForesightElementData[] {\r\n return this.getSortedElements().filter(data => !data.callbackInfo.isCallbackActive)\r\n }\r\n\r\n private 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 render() {\r\n return html`\r\n <tab-header>\r\n <div slot=\"chips\" class=\"chips-container\">\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 ${this.getActiveElements().length > 0\r\n ? html`\r\n <div class=\"element-section\">\r\n <h3 class=\"section-header active\">\r\n Active Elements (${this.getActiveElements().length})\r\n </h3>\r\n ${map(this.getActiveElements(), elementData => {\r\n return html`\r\n <single-element\r\n .elementData=${elementData}\r\n .isActive=${this.runningCallbacks.has(elementData.element)}\r\n .isExpanded=${this.expandedElementIds.has(elementData.id)}\r\n .onToggle=${this.handleElementToggle}\r\n >\r\n </single-element>\r\n `\r\n })}\r\n </div>\r\n `\r\n : \"\"}\r\n ${this.getInactiveElements().length > 0\r\n ? html`\r\n <div class=\"element-section\">\r\n <h3 class=\"section-header inactive\">\r\n Inactive Elements (${this.getInactiveElements().length})\r\n </h3>\r\n ${map(this.getInactiveElements(), elementData => {\r\n return html`\r\n <single-element\r\n .elementData=${elementData}\r\n .isActive=${this.runningCallbacks.has(elementData.element)}\r\n .isExpanded=${this.expandedElementIds.has(elementData.id)}\r\n .onToggle=${this.handleElementToggle}\r\n >\r\n </single-element>\r\n `\r\n })}\r\n </div>\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 { html } from \"lit\"\n\nexport const CONTROL_PANEL_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"15\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\"></line>\n <line x1=\"7\" y1=\"21\" x2=\"17\" y2=\"21\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line>\n </svg>\n`\n\nexport const CONSOLE_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"4 17 10 11 4 5\"></polyline>\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line>\n </svg>\n`\n\nexport const NONE_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"></path>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"></path>\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>\n </svg>\n`\n\nexport const BOTH_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M12 2v8\" />\n <path d=\"M12 10l-6 6\" />\n <path d=\"M12 10l6 6\" />\n <circle cx=\"6\" cy=\"18\" r=\"2\" />\n <circle cx=\"18\" cy=\"18\" r=\"2\" />\n </svg>\n`\n\n// Keep the existing SVGs that were not requested to be changed\nexport const VISIBILITY_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n`\nexport const DOCUMENT_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\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\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <line x1=\"10\" y1=\"9\" x2=\"8\" y2=\"9\" />\n </svg>\n`\n\nexport const INSERTION_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </svg>\n`\n\nexport const FILTER_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polygon points=\"22,3 2,3 10,12.46 10,19 14,21 14,12.46\" />\n </svg>\n`\n\nexport const CLEAR_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\" />\n </svg>\n`\n\nexport const COPY_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n`\n\nexport const TICK_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n`\n\nexport const WARNING_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n 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\"\n ></path>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n`\n\n// Alternative: State machine style icon\nexport const STATE_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"3\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"3\"></circle>\n <path d=\"M9 12h6\"></path>\n <path d=\"M15 9l3 3-3 3\"></path>\n <circle cx=\"12\" cy=\"6\" r=\"2\"></circle>\n <circle cx=\"12\" cy=\"18\" r=\"2\"></circle>\n <path d=\"M10 8l2-2 2 2\"></path>\n <path d=\"M14 16l-2 2-2-2\"></path>\n </svg>\n`\n\nexport const UNREGISTER_SVG = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n`\n","import { LitElement, html, css } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\n\n@customElement(\"chip-element\")\nexport class ChipElement extends LitElement {\n static styles = [\n css`\n :host {\n display: inline-block;\n }\n\n .chip {\n display: inline-flex;\n align-items: center;\n padding: 3px 8px;\n background-color: rgba(255, 255, 255, 0.05);\n color: #e8e8e8;\n font-size: 10px;\n font-weight: 500;\n white-space: nowrap;\n border: 1px solid rgba(255, 255, 255, 0.1);\n font-family: \"SF Mono\", \"Monaco\", \"Consolas\", \"Liberation Mono\", \"Courier New\", monospace;\n letter-spacing: 0.02em;\n line-height: 1.2;\n transition: all 0.2s ease;\n }\n `,\n ]\n\n @property({ type: String }) title: string = \"\"\n\n render() {\n return html`\n <span class=\"chip\" title=\"${this.title}\">\n <slot></slot>\n </span>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"chip-element\": ChipElement\n }\n}\n","import { LitElement, html, css } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\n\n@customElement(\"tab-content\")\nexport class TabContent extends LitElement {\n static styles = [\n css`\n :host {\n overflow: hidden;\n }\n\n .content-container::-webkit-scrollbar {\n width: 8px;\n }\n\n .content-container::-webkit-scrollbar-track {\n background: rgba(30, 30, 30, 0.5);\n }\n\n .content-container::-webkit-scrollbar-thumb {\n background-color: rgba(176, 196, 222, 0.5);\n border: 2px solid rgba(0, 0, 0, 0.2);\n }\n\n .content-container::-webkit-scrollbar-thumb:hover {\n background-color: rgba(176, 196, 222, 0.7);\n }\n\n .content-container {\n scrollbar-gutter: stable;\n height: 100%;\n min-height: 150px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: rgba(176, 196, 222, 0.5) rgba(30, 30, 30, 0.5);\n }\n\n .no-content-message {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n color: #afafaf;\n font-style: italic;\n font-family: \"Courier New\", monospace;\n }\n `,\n ]\n\n @property({ type: String, attribute: \"no-content-message\" })\n noContentMessage: string = \"No content available.\"\n\n @property({ type: Boolean })\n hasContent: boolean = true\n\n render() {\n return html`\n <div class=\"content-container\">\n ${this.hasContent\n ? html`<slot></slot>`\n : html`<div class=\"no-content-message\">${this.noContentMessage}</div>`}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"tab-content\": TabContent\n }\n}\n","import { LitElement, html, css } from \"lit\"\nimport { customElement } from \"lit/decorators.js\"\n\n@customElement(\"tab-header\")\nexport class TabHeader extends LitElement {\n static styles = [\n css`\n :host {\n }\n .tab-bar-info {\n display: flex;\n gap: 12px;\n align-items: center;\n flex: 1;\n }\n\n .stats-chips {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n .chip {\n font-size: 11px;\n font-weight: 500;\n padding: 4px 8px;\n border: 1px solid #555;\n white-space: nowrap;\n letter-spacing: 0.3px;\n background: rgba(40, 40, 40, 0.7);\n color: #b0c4de;\n }\n\n .tab-bar-actions {\n display: flex;\n gap: 6px;\n align-items: center;\n position: relative;\n flex-direction: row;\n }\n .tab-bar-elements {\n display: flex;\n justify-content: space-between;\n padding: 4px 0 4px 0;\n border-bottom: 1px solid #444;\n position: sticky;\n top: 0;\n z-index: 5;\n min-height: 36px;\n }\n `,\n ]\n\n render() {\n return html`\n <div class=\"tab-bar-elements\">\n <div class=\"tab-bar-info\">\n <div class=\"stats-chips\">\n <slot name=\"chips\"></slot>\n </div>\n </div>\n <div class=\"tab-bar-actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"tab-header\": TabHeader\n }\n}\n","import { html, type TemplateResult } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\nimport { BaseDropdown, type DropdownOption } from \"./base-dropdown\"\n\nexport type { DropdownOption } from \"./base-dropdown\"\n\n@customElement(\"single-select-dropdown\")\nexport class SingleSelectDropdown extends BaseDropdown {\n @property({ type: String }) selectedOptionValue: string = \"\"\n @property({ type: Function }) onSelectionChange?: (value: string) => void\n\n connectedCallback() {\n super.connectedCallback()\n if (this.dropdownOptions.length > 0 && !this.selectedOptionValue) {\n this.selectedOptionValue = this.dropdownOptions[0].value\n }\n }\n\n willUpdate(changedProperties: Map<PropertyKey, unknown>) {\n if (\n changedProperties.has(\"dropdownOptions\") &&\n this.dropdownOptions.length > 0 &&\n !this.selectedOptionValue\n ) {\n this.selectedOptionValue = this.dropdownOptions[0].value\n }\n }\n\n protected _handleOptionClick(option: DropdownOption): void {\n if (option.value !== this.selectedOptionValue) {\n this.selectedOptionValue = option.value\n this.onSelectionChange?.(option.value)\n }\n this._closeDropdown()\n }\n\n protected _getTriggerIcon(): TemplateResult {\n const selectedOption = this._getSelectedOption()\n return selectedOption ? selectedOption.icon : html``\n }\n\n protected _isOptionSelected(option: DropdownOption): boolean {\n return option.value === this.selectedOptionValue\n }\n\n protected _getTriggerTitle(): string {\n const selected = this._getSelectedOption()\n return selected ? selected.title : \"Change selection\"\n }\n\n protected _getTriggerLabel(): string {\n const selected = this._getSelectedOption()\n return selected ? `Current selection: ${selected.label}` : \"No selection\"\n }\n\n private _getSelectedOption(): DropdownOption | undefined {\n return this.dropdownOptions.find(option => option.value === this.selectedOptionValue)\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"single-select-dropdown\": SingleSelectDropdown\n }\n}\n","import { LitElement, html, css, type TemplateResult } from \"lit\"\nimport { property, state } from \"lit/decorators.js\"\n\nexport type DropdownOption = {\n value: string\n label: string\n title: string\n icon: TemplateResult\n}\n\nexport abstract class BaseDropdown extends LitElement {\n private static currentlyOpen: BaseDropdown | null = null\n\n static styles = [\n css`\n :host {\n display: inline-block;\n }\n\n .dropdown-container {\n position: relative;\n display: inline-block;\n }\n\n .trigger-button {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n padding: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n transition: all 0.2s ease;\n }\n\n .trigger-button svg {\n width: 16px;\n height: 16px;\n stroke: white;\n transition: stroke 0.2s;\n }\n\n .trigger-button .arrow-icon {\n width: 10px;\n height: 10px;\n stroke: white;\n fill: none;\n stroke-width: 2;\n transition:\n transform 0.2s ease,\n stroke 0.2s;\n }\n\n .trigger-button:hover {\n background-color: rgba(176, 196, 222, 0.1);\n }\n\n .trigger-button:hover svg,\n .trigger-button:hover .arrow-icon {\n stroke: #b0c4de;\n }\n\n .trigger-button.active {\n background-color: rgba(176, 196, 222, 0.2);\n }\n\n .trigger-button.active svg {\n stroke: #b0c4de;\n }\n\n .trigger-button.active .arrow-icon {\n transform: rotate(180deg);\n stroke: #b0c4de;\n }\n\n .dropdown-menu {\n position: fixed;\n z-index: 9999;\n display: none;\n flex-direction: column;\n background-color: #3a3a3a;\n border: 1px solid #555;\n min-width: 200px;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n }\n\n .dropdown-menu.active {\n display: flex;\n }\n\n .dropdown-menu button {\n background: none;\n border: none;\n color: #ccc;\n font-size: 12px;\n text-align: left;\n padding: 8px 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n box-sizing: border-box;\n }\n\n .dropdown-menu button:hover {\n background-color: #555;\n color: white;\n }\n\n .dropdown-menu button.active {\n color: #b0c4de;\n font-weight: bold;\n background-color: rgba(176, 196, 222, 0.1);\n }\n\n .dropdown-menu button.active::after {\n content: \"✓\";\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n color: #b0c4de;\n font-weight: bold;\n }\n `,\n ]\n\n @state() protected isDropdownOpen: boolean = false\n @property({ type: Array }) dropdownOptions: DropdownOption[] = []\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener(\"click\", this._handleOutsideClick)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener(\"click\", this._handleOutsideClick)\n if (BaseDropdown.currentlyOpen === this) {\n BaseDropdown.currentlyOpen = null\n }\n }\n\n protected _toggleDropdown = (event: MouseEvent) => {\n event.stopPropagation()\n\n if (this.isDropdownOpen) {\n this._closeDropdown()\n } else {\n if (BaseDropdown.currentlyOpen && BaseDropdown.currentlyOpen !== this) {\n BaseDropdown.currentlyOpen._closeDropdown()\n }\n\n this.isDropdownOpen = true\n BaseDropdown.currentlyOpen = this\n\n requestAnimationFrame(() => {\n this._positionDropdown()\n })\n }\n }\n\n protected _closeDropdown(): void {\n this.isDropdownOpen = false\n if (BaseDropdown.currentlyOpen === this) {\n BaseDropdown.currentlyOpen = null\n }\n }\n\n protected _positionDropdown() {\n const triggerButton = this.shadowRoot?.querySelector(\".trigger-button\") as HTMLElement\n const dropdownMenu = this.shadowRoot?.querySelector(\".dropdown-menu\") as HTMLElement\n\n if (triggerButton && dropdownMenu) {\n const rect = triggerButton.getBoundingClientRect()\n const dropdownHeight = dropdownMenu.offsetHeight || 200\n\n const top = rect.bottom + 5\n const right = window.innerWidth - rect.right\n\n const availableSpaceBelow = window.innerHeight - rect.bottom\n const shouldPositionAbove = availableSpaceBelow < dropdownHeight && rect.top > dropdownHeight\n\n if (shouldPositionAbove) {\n dropdownMenu.style.top = `${rect.top - dropdownHeight - 5}px`\n } else {\n dropdownMenu.style.top = `${top}px`\n }\n\n dropdownMenu.style.right = `${right}px`\n }\n }\n\n protected _handleOutsideClick = (event: MouseEvent) => {\n if (this.isDropdownOpen) {\n if (!event.composedPath().includes(this)) {\n this._closeDropdown()\n }\n }\n }\n\n protected abstract _handleOptionClick(option: DropdownOption): void\n protected abstract _getTriggerIcon(): TemplateResult\n protected abstract _isOptionSelected(option: DropdownOption): boolean\n protected abstract _getTriggerTitle(): string\n protected abstract _getTriggerLabel(): string\n\n render() {\n const buttonClass = `trigger-button ${this.isDropdownOpen ? \"active\" : \"\"}`\n const menuClass = `dropdown-menu ${this.isDropdownOpen ? \"active\" : \"\"}`\n\n return html`\n <div class=\"dropdown-container\">\n <button\n class=\"${buttonClass}\"\n title=\"${this._getTriggerTitle()}\"\n @click=\"${this._toggleDropdown}\"\n aria-haspopup=\"true\"\n aria-expanded=\"${this.isDropdownOpen}\"\n aria-controls=\"dropdown-menu\"\n aria-label=\"${this._getTriggerLabel()}\"\n >\n ${this._getTriggerIcon()}\n <svg\n class=\"arrow-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n\n <div class=\"${menuClass}\" id=\"dropdown-menu\" role=\"menu\">\n ${this.dropdownOptions.map(\n option => html`\n <button\n value=\"${option.value}\"\n title=\"${option.title}\"\n class=\"${this._isOptionSelected(option) ? \"active\" : \"\"}\"\n @click=\"${() => this._handleOptionClick(option)}\"\n role=\"menuitem\"\n >\n ${option.label}\n </button>\n `\n )}\n </div>\n </div>\n `\n }\n}\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\nimport \"./reactivate-countdown\"\r\nimport { ForesightManager } from \"js.foresight\"\r\nimport { UNREGISTER_SVG } from \"../../../svg/svg-icons\"\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-wrapper {\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 margin-left: 2px;\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 .status-indicator.inactive {\r\n background-color: #999;\r\n box-shadow: 0 0 0 2px rgba(153, 153, 153, 0.3);\r\n }\r\n\r\n .unregister-button {\r\n all: unset;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 14px;\r\n height: 14px;\r\n padding: 1px;\r\n cursor: pointer;\r\n color: #999;\r\n }\r\n\r\n .unregister-button:hover {\r\n background-color: rgba(255, 107, 107, 0.1);\r\n color: #ff6b6b;\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 .element-name.callback-inactive {\r\n color: #999;\r\n font-weight: 500;\r\n }\r\n\r\n .reactivate-countdown {\r\n font-size: 14px;\r\n color: #ffa726;\r\n font-weight: 500;\r\n min-width: 0;\r\n white-space: nowrap;\r\n }\r\n\r\n .reactivate-countdown:empty {\r\n display: none;\r\n }\r\n\r\n :host(.not-visible) {\r\n opacity: 0.5;\r\n }\r\n\r\n .element-wrapper.not-visible {\r\n opacity: 0.5;\r\n }\r\n `,\r\n ]\r\n\r\n @property({ hasChanged: () => true }) elementData!: ForesightElementData\r\n @property() isActive: boolean = false\r\n @property() isExpanded: boolean = false\r\n @property() onToggle: ((elementId: string) => void) | undefined\r\n private getBorderColor(): string {\r\n if (this.isActive) {\r\n return \"#ffeb3b\"\r\n }\r\n if (!this.elementData.callbackInfo.isCallbackActive) {\r\n return \"#999\"\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 if (!this.elementData.callbackInfo.isCallbackActive) {\r\n return \"inactive\"\r\n }\r\n return this.elementData.isIntersectingWithViewport ? \"visible\" : \"hidden\"\r\n }\r\n\r\n private getStatusText(): string {\r\n if (this.isActive) {\r\n return \"callback active\"\r\n }\r\n if (!this.elementData.callbackInfo.isCallbackActive) {\r\n return \"callback inactive\"\r\n }\r\n return this.elementData.isIntersectingWithViewport ? \"in viewport\" : \"not in viewport\"\r\n }\r\n\r\n private formatElementDetails(): string {\r\n const elementData = this.elementData\r\n const details = {\r\n status: this.getStatusText(),\r\n tagName: elementData.element.tagName.toLowerCase(),\r\n isIntersecting: elementData.isIntersectingWithViewport,\r\n registerCount: elementData.registerCount,\r\n hitSlop: {\r\n top: elementData.elementBounds.hitSlop.top,\r\n right: elementData.elementBounds.hitSlop.right,\r\n bottom: elementData.elementBounds.hitSlop.bottom,\r\n left: elementData.elementBounds.hitSlop.left,\r\n },\r\n callbackInfo: elementData.callbackInfo,\r\n meta: this.elementData.meta,\r\n }\r\n\r\n return JSON.stringify(details, null, 2)\r\n }\r\n\r\n private handleUnregister = (e: MouseEvent) => {\r\n e.stopPropagation()\r\n ForesightManager.instance.unregister(this.elementData.element, \"devtools\")\r\n }\r\n\r\n render() {\r\n const isNotVisible = !this.elementData.isIntersectingWithViewport\r\n\r\n return html`\r\n <div class=\"element-wrapper ${isNotVisible ? \"not-visible\" : \"\"}\">\r\n <expandable-item\r\n .borderColor=${this.getBorderColor()}\r\n .showCopyButton=${true}\r\n .itemId=${this.elementData.id}\r\n .isExpanded=${this.isExpanded}\r\n .onToggle=${this.onToggle}\r\n >\r\n <div slot=\"content\" class=\"element-content\" title=\"Status: ${this.getStatusText()}\">\r\n <div class=\"status-indicator ${this.getStatusIndicatorClass()}\"></div>\r\n <span\r\n class=\"element-name ${this.isActive\r\n ? \"callback-active\"\r\n : !this.elementData.callbackInfo.isCallbackActive\r\n ? \"callback-inactive\"\r\n : \"\"}\"\r\n >\r\n ${this.elementData.name || \"unnamed\"}\r\n </span>\r\n <reactivate-countdown .elementData=${this.elementData}> </reactivate-countdown>\r\n <button\r\n class=\"unregister-button\"\r\n @click=\"${this.handleUnregister}\"\r\n title=\"Unregister element\"\r\n >\r\n ${UNREGISTER_SVG}\r\n </button>\r\n </div>\r\n <div slot=\"details\">${this.formatElementDetails()}</div>\r\n </expandable-item>\r\n </div>\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\r\n user-select: none;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\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: 14px;\r\n height: 14px;\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\"\nimport { customElement, property, state } from \"lit/decorators.js\"\nimport { COPY_SVG, TICK_SVG } from \"../../../svg/svg-icons\"\n\n@customElement(\"copy-icon\")\nexport class CopyIcon extends LitElement {\n static styles = css`\n .copy-button {\n background: transparent;\n border: 0px;\n cursor: pointer;\n padding: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.6;\n transition:\n opacity 0.2s ease,\n background-color 0.2s ease;\n }\n\n :host([positioned]) .copy-button {\n position: absolute;\n top: 10px;\n right: 1px;\n }\n\n .copy-button:hover {\n background-color: rgba(176, 196, 222, 0.1);\n }\n\n .copy-button:hover svg {\n stroke: #b0c4de;\n }\n\n .copy-button svg {\n width: 14px;\n height: 14px;\n stroke: #ddd;\n stroke-width: 2.5;\n }\n\n .copy-button.copied svg {\n stroke: #4caf50;\n }\n `\n\n @property({ type: String }) title: string = \"Copy to clipboard\"\n @property({ type: Function }) onCopy?: (event: MouseEvent) => Promise<void> | void\n\n @state() private isCopied: boolean = false\n @state() private copyTimeout: ReturnType<typeof setTimeout> | null = null\n\n private async handleClick(event: MouseEvent): Promise<void> {\n if (this.isCopied) return\n\n if (this.onCopy) {\n try {\n await this.onCopy(event)\n } catch (error) {\n console.error(\"Error in onCopy function:\", error)\n }\n }\n\n this.isCopied = true\n\n if (this.copyTimeout) {\n clearTimeout(this.copyTimeout)\n }\n\n this.copyTimeout = setTimeout(() => {\n this.isCopied = false\n this.copyTimeout = null\n }, 2000)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n if (this.copyTimeout) {\n clearTimeout(this.copyTimeout)\n this.copyTimeout = null\n }\n }\n\n render() {\n return html`\n <button\n class=\"copy-button ${this.isCopied ? \"copied\" : \"\"}\"\n title=\"${this.title}\"\n @click=${this.handleClick}\n >\n ${this.isCopied ? TICK_SVG : COPY_SVG}\n </button>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"copy-icon\": CopyIcon\n }\n}\n","import { ForesightManager, type ForesightElementData } from \"js.foresight\"\r\nimport { LitElement, css, html } from \"lit\"\r\nimport { customElement, property, state } from \"lit/decorators.js\"\r\n\r\n@customElement(\"reactivate-countdown\")\r\nexport class ReactivateCountdown extends LitElement {\r\n static styles = [\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .reactivate-button {\r\n all: unset;\r\n cursor: pointer;\r\n padding: 2px 4px;\r\n transition: background-color 0.2s ease;\r\n }\r\n\r\n .reactivate-button:hover {\r\n background-color: rgba(255, 165, 0, 0.1);\r\n }\r\n\r\n .countdown-time {\r\n color: #ffa726;\r\n font-weight: 500;\r\n font-size: 10px;\r\n }\r\n\r\n .countdown-time.infinity {\r\n font-size: 12px;\r\n font-weight: 600;\r\n }\r\n\r\n .countdown-time.clickable {\r\n cursor: pointer;\r\n }\r\n `,\r\n ]\r\n\r\n @property({ hasChanged: () => true }) elementData!: ForesightElementData\r\n @state()\r\n private remainingTime: number = 0\r\n\r\n @state()\r\n private isCountdownActive: boolean = false\r\n\r\n private intervalId: number | null = null\r\n private startTime: number = 0\r\n\r\n connectedCallback() {\r\n super.connectedCallback()\r\n this.checkAndStartCountdown()\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this.clearCountdown()\r\n }\r\n\r\n updated(changedProperties: Map<string | number | symbol, unknown>) {\r\n super.updated(changedProperties)\r\n if (changedProperties.has(\"elementData\")) {\r\n this.checkAndStartCountdown()\r\n }\r\n }\r\n\r\n private checkAndStartCountdown() {\r\n const callbackInfo = this.elementData?.callbackInfo\r\n\r\n if (!callbackInfo) {\r\n this.clearCountdown()\r\n return\r\n }\r\n\r\n // Show countdown when:\r\n // 1. Callback is inactive (not currently active)\r\n // 2. Callback has completed at least once (has lastCallbackCompletedAt OR lastCallbackInvokedAt)\r\n // 3. reactivateAfter is not 0 (otherwise instant reactivation)\r\n const hasCallbackHistory =\r\n callbackInfo.lastCallbackCompletedAt || callbackInfo.lastCallbackInvokedAt\r\n const shouldShowCountdown =\r\n !callbackInfo.isCallbackActive && hasCallbackHistory && callbackInfo.reactivateAfter > 0\r\n\r\n if (shouldShowCountdown) {\r\n this.startCountdown()\r\n } else {\r\n this.clearCountdown()\r\n }\r\n }\r\n\r\n private startCountdown() {\r\n this.clearCountdown()\r\n\r\n const callbackInfo = this.elementData?.callbackInfo\r\n if (!callbackInfo) {\r\n return\r\n }\r\n\r\n this.isCountdownActive = true\r\n\r\n if (callbackInfo.reactivateAfter === Infinity) {\r\n this.remainingTime = Infinity\r\n return\r\n }\r\n\r\n const reactivateAfter = callbackInfo.reactivateAfter\r\n const startTime = callbackInfo.lastCallbackCompletedAt || callbackInfo.lastCallbackInvokedAt\r\n\r\n if (!startTime) {\r\n // No callback has been invoked yet, don't show countdown\r\n this.clearCountdown()\r\n return\r\n }\r\n\r\n this.startTime = startTime\r\n\r\n const updateCountdown = () => {\r\n const elapsed = Date.now() - this.startTime\r\n const remaining = Math.max(0, reactivateAfter - elapsed)\r\n\r\n this.remainingTime = remaining\r\n this.requestUpdate()\r\n\r\n if (remaining <= 0 || this.elementData.callbackInfo.isCallbackActive) {\r\n this.clearCountdown()\r\n }\r\n }\r\n\r\n updateCountdown()\r\n\r\n if (this.remainingTime > 0) {\r\n this.intervalId = window.setInterval(updateCountdown, 100)\r\n }\r\n }\r\n\r\n private clearCountdown() {\r\n if (this.intervalId !== null) {\r\n clearInterval(this.intervalId)\r\n this.intervalId = null\r\n }\r\n this.isCountdownActive = false\r\n this.remainingTime = 0\r\n }\r\n\r\n private handleTimerClick = (e: MouseEvent) => {\r\n e.stopPropagation()\r\n ForesightManager.instance.reactivate(this.elementData.element)\r\n }\r\n\r\n private formatTime(ms: number): string {\r\n if (ms === Infinity) {\r\n return \"∞\"\r\n }\r\n\r\n const totalSeconds = Math.ceil(ms / 1000)\r\n\r\n if (totalSeconds < 60) {\r\n return `${totalSeconds}s`\r\n }\r\n\r\n const minutes = Math.floor(totalSeconds / 60)\r\n const seconds = totalSeconds % 60\r\n\r\n if (minutes < 60) {\r\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`\r\n }\r\n\r\n const hours = Math.floor(minutes / 60)\r\n const remainingMinutes = minutes % 60\r\n\r\n if (remainingMinutes > 0) {\r\n return `${hours}h ${remainingMinutes}m`\r\n }\r\n\r\n return `${hours}h`\r\n }\r\n\r\n render() {\r\n if (!this.isCountdownActive) {\r\n return html``\r\n }\r\n\r\n if (this.remainingTime === Infinity) {\r\n return html`\r\n <button\r\n class=\"reactivate-button\"\r\n @click=\"${this.handleTimerClick}\"\r\n title=\"Click to reactivate manually\"\r\n >\r\n <span class=\"countdown-time infinity\">∞</span>\r\n </button>\r\n `\r\n }\r\n\r\n if (this.remainingTime <= 0) {\r\n return html``\r\n }\r\n\r\n return html`\r\n <button\r\n class=\"reactivate-button\"\r\n @click=\"${this.handleTimerClick}\"\r\n title=\"Click to reactivate immediately\"\r\n >\r\n <span class=\"countdown-time clickable\">${this.formatTime(this.remainingTime)}</span>\r\n </button>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"reactivate-countdown\": ReactivateCountdown\r\n }\r\n}\r\n","import { css, html, LitElement } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\nimport type { ControllerTabs } from \"../../../types/types\"\n\n@customElement(\"tab-selector\")\nexport class TabSelector extends LitElement {\n static styles = css`\n .tab-selector-wrapper {\n border-bottom: 2px solid #444;\n margin-top: 12px;\n display: flex;\n justify-content: space-evenly;\n width: 100%;\n }\n\n .tab-button {\n background: none;\n border: none;\n color: #9e9e9e;\n flex: 1;\n padding: 8px;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n transition: all 0.2s ease;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n }\n .tab-button:hover {\n color: #b0c4de;\n background-color: rgba(176, 196, 222, 0.1);\n }\n\n .tab-button.active {\n color: #b0c4de;\n border-bottom-color: #b0c4de;\n }\n `\n\n @property({ type: String })\n activeTab: ControllerTabs = \"settings\"\n\n private tabs: ControllerTabs[] = [\"settings\", \"elements\", \"logs\"]\n\n private _handleTabClick(selectedTab: ControllerTabs) {\n this.dispatchEvent(\n new CustomEvent(\"tab-change\", {\n detail: { tab: selectedTab },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n protected render() {\n return html`\n <div class=\"tab-selector-wrapper\">\n ${this.tabs.map(\n tab => html`\n <button\n class=\"tab-button ${this.activeTab === tab ? \"active\" : \"\"}\"\n @click=\"${() => this._handleTabClick(tab)}\"\n data-tab=\"${tab}\"\n >\n ${tab.charAt(0).toUpperCase() + tab.slice(1)}\n </button>\n `\n )}\n </div>\n `\n }\n}\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 safeSerializeManagerData,\r\n type SerializedEventData,\r\n} from \"../../../helpers/safeSerializeEventData\"\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 STATE_SVG,\r\n WARNING_SVG,\r\n} from \"../../../svg/svg-icons\"\r\nimport type { LogEvents, LoggingLocations } from \"../../../types/types\"\r\nimport { ForesightDevtools } from \"../../foresight-devtools\"\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 \"../dropdown/multi-select-dropdown\"\r\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\r\nimport \"./single-log\"\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 .single-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 .single-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 .single-button:hover {\r\n background-color: rgba(176, 196, 222, 0.1);\r\n }\r\n\r\n .single-button:hover svg {\r\n stroke: #b0c4de;\r\n }\r\n\r\n .single-button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .single-button:disabled:hover {\r\n background: none;\r\n }\r\n\r\n .single-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> = []\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: \"elementReactivated\",\r\n label: \"Element Reactivated\",\r\n title: \"Show when element gets reactivated after stale time has passed\",\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 //TODO fix these events and in single-log\r\n private getEventColor(eventType: ForesightEvent): string {\r\n const colorMap: Record<ForesightEvent, string> = {\r\n elementRegistered: \"#2196f3\",\r\n elementReactivated: \"#ff9800\",\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 addLog(log: SerializedEventData) {\r\n this.logs.unshift(log)\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 private logManagerData(): void {\r\n if (this.logLocation === \"none\") {\r\n return\r\n }\r\n if (this.logLocation === \"console\" || this.logLocation === \"both\") {\r\n console.log(ForesightManager.instance.getManagerData)\r\n }\r\n if (this.logLocation === \"controlPanel\" || this.logLocation === \"both\") {\r\n this.addManagerLog()\r\n }\r\n }\r\n\r\n private addManagerLog(): void {\r\n const log = safeSerializeManagerData(\r\n ForesightManager.instance.getManagerData,\r\n (++this.logIdCounter).toString()\r\n )\r\n this.addLog(log)\r\n }\r\n\r\n private addEventLog<K extends ForesightEvent>(event: ForesightEventMap[K]): void {\r\n const log = safeSerializeEventData(event, (++this.logIdCounter).toString())\r\n if (log.type === \"serializationError\") {\r\n console.error(log.error, log.errorMessage)\r\n return\r\n }\r\n this.addLog(log)\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=\"single-button\"\r\n title=\"Log the state from the manager\"\r\n @click=\"${this.logManagerData}\"\r\n >\r\n ${STATE_SVG}\r\n </button>\r\n <button\r\n class=\"single-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 CallbackHits,\r\n CallbackHitType,\r\n ElementCallbackInfo,\r\n ForesightElementData,\r\n ForesightEvent,\r\n ForesightEventMap,\r\n ForesightManagerData,\r\n ForesightManagerSettings,\r\n HitSlop,\r\n Point,\r\n ScrollDirection,\r\n UpdatedDataPropertyNames,\r\n UpdatedManagerSetting,\r\n} from \"js.foresight/types/types\"\r\n\r\ntype SerializedEventType = ForesightEvent | \"serializationError\" | \"managerDataPayload\"\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 logId: string\r\n}\r\n\r\ninterface ElementRegisteredPayload extends PayloadBase {\r\n type: \"elementRegistered\"\r\n name: string\r\n id: string\r\n callbackInfo: ElementCallbackInfo\r\n hitslop: HitSlop\r\n meta: Record<string, unknown>\r\n}\r\n\r\ninterface ElementUnregisteredEvent extends PayloadBase {\r\n type: \"elementUnregistered\"\r\n}\r\n\r\ninterface ElementReactivatedPayload extends PayloadBase {\r\n type: \"elementReactivated\"\r\n name: string\r\n id: string\r\n callbackInfo: ElementCallbackInfo\r\n meta: Record<string, unknown>\r\n}\r\n\r\ninterface ElementDataUpdatedPayload extends PayloadBase {\r\n type: \"elementDataUpdated\"\r\n name: string\r\n updatedProps: UpdatedDataPropertyNames[]\r\n callbackInfo: ElementCallbackInfo\r\n isIntersecting: boolean\r\n meta: Record<string, unknown>\r\n}\r\n\r\ninterface CallbackInvokedPayload extends PayloadBase {\r\n type: \"callbackInvoked\"\r\n name: string\r\n hitType: CallbackHitType\r\n callbackInfo: ElementCallbackInfo\r\n meta: Record<string, unknown>\r\n}\r\n\r\ninterface CallbackCompletedPayload extends PayloadBase {\r\n type: \"callbackCompleted\"\r\n name: string\r\n hitType: CallbackHitType\r\n status: \"success\" | \"error\" | undefined\r\n errorMessage: string | undefined | null\r\n callbackInfo: ElementCallbackInfo\r\n meta: Record<string, unknown>\r\n}\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\ninterface ManagerDataPayload extends PayloadBase {\r\n type: \"managerDataPayload\"\r\n warning: string\r\n globalCallbackHits: CallbackHits\r\n eventListenerCount: Record<string, number>\r\n managerSettings: ForesightManagerSettings\r\n registeredElements: Array<Omit<ForesightElementData, \"element\"> & { elementInfo: string }>\r\n}\r\n\r\nexport type SerializedEventData =\r\n | ElementRegisteredPayload\r\n | ElementUnregisteredEvent\r\n | ElementReactivatedPayload\r\n | ElementDataUpdatedPayload\r\n | CallbackInvokedPayload\r\n | CallbackCompletedPayload\r\n | MouseTrajectoryUpdatePayload\r\n | ScrollTrajectoryUpdatePayload\r\n | ManagerSettingsChangedPayload\r\n | ManagerDataPayload\r\n | SerializationErrorPayload\r\n\r\nexport function safeSerializeManagerData(\r\n data: ForesightManagerData,\r\n logId: string\r\n): ManagerDataPayload {\r\n const eventListeners: Record<string, number> = {}\r\n data.eventListeners.forEach((listeners, eventType) => {\r\n eventListeners[eventType] = listeners.length\r\n })\r\n const registeredElements: Array<Omit<ForesightElementData, \"element\"> & { elementInfo: string }> =\r\n []\r\n data.registeredElements.forEach((elementData, element) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { element: _, ...elementDataWithoutElement } = elementData\r\n registeredElements.push({\r\n ...elementDataWithoutElement,\r\n elementInfo: `${element.tagName.toLowerCase()}${element.id ? `#${element.id}` : \"\"}${\r\n element.className ? `.${element.className.replace(/\\s+/g, \".\")}` : \"\"\r\n }`,\r\n })\r\n })\r\n\r\n return {\r\n type: \"managerDataPayload\",\r\n warning: \"this is a lot easier to view in the console\",\r\n logId: logId,\r\n globalCallbackHits: data.globalCallbackHits,\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n eventListenerCount: eventListeners,\r\n managerSettings: data.globalSettings,\r\n registeredElements: registeredElements,\r\n summary: `${registeredElements.length} elements, ${\r\n Object.values(eventListeners).flat().length\r\n } listeners,\r\n ${data.globalCallbackHits.total} hits`,\r\n }\r\n}\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 logId: string\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 callbackInfo: event.elementData.callbackInfo,\r\n hitslop: event.elementData.elementBounds.hitSlop,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n meta: event.elementData.meta,\r\n // if its the 2nd+ time of the element registering, give the user a heads up in the summary\r\n logId: logId,\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 \"elementReactivated\":\r\n return {\r\n type: \"elementReactivated\",\r\n name: event.elementData.name,\r\n id: event.elementData.element.id || \"\",\r\n callbackInfo: event.elementData.callbackInfo,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n meta: event.elementData.meta,\r\n // if its the 2nd+ time of the element registering, give the user a heads up in the summary\r\n logId: logId,\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 // meta: event.elementData.meta,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n logId: logId,\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 callbackInfo: event.elementData.callbackInfo,\r\n isIntersecting: event.elementData.isIntersectingWithViewport,\r\n meta: event.elementData.meta,\r\n localizedTimestamp: new Date().toLocaleTimeString(),\r\n logId: logId,\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 callbackInfo: event.elementData.callbackInfo,\r\n meta: event.elementData.meta,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n logId: logId,\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 name: event.elementData.name,\r\n hitType: event.hitType,\r\n callbackInfo: event.elementData.callbackInfo,\r\n meta: event.elementData.meta,\r\n localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\r\n logId: logId,\r\n status: event.elementData.callbackInfo.lastCallbackStatus,\r\n errorMessage: event.elementData.callbackInfo.lastCallbackErrorMessage,\r\n summary: `${event.elementData.name} - ${elapsed}`,\r\n }\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 logId: logId,\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 logId: logId,\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 logId: logId,\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 logId: logId,\r\n summary: \"\",\r\n }\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 logId: logId,\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\"\nimport { customElement, property } from \"lit/decorators.js\"\nimport { BaseDropdown, type DropdownOption } from \"./base-dropdown\"\nimport { FILTER_SVG } from \"../../../svg/svg-icons\"\n\n@customElement(\"multi-select-dropdown\")\nexport class MultiSelectDropdown extends BaseDropdown {\n static styles = [\n ...BaseDropdown.styles,\n css`\n .dropdown-menu button.active::after {\n content: \"✓\";\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n color: #b0c4de;\n font-weight: bold;\n }\n\n .selected-count {\n font-size: 10px;\n color: #b0c4de;\n margin-left: 2px;\n }\n `,\n ]\n\n @property({ type: Array }) selectedValues: string[] = []\n @property() onSelectionChange?: (changedValue: string, isSelected: boolean) => void\n\n protected _handleOptionClick(option: DropdownOption): void {\n const isCurrentlySelected = this.selectedValues.includes(option.value)\n\n if (isCurrentlySelected) {\n this.selectedValues = this.selectedValues.filter(value => value !== option.value)\n } else {\n this.selectedValues = [...this.selectedValues, option.value]\n }\n const newSelectionState = !isCurrentlySelected\n this.onSelectionChange?.(option.value, newSelectionState)\n }\n\n protected _getTriggerIcon(): TemplateResult {\n return FILTER_SVG\n }\n\n protected _isOptionSelected(option: DropdownOption): boolean {\n return this.selectedValues.includes(option.value)\n }\n\n protected _getTriggerTitle(): string {\n const count = this.selectedValues.length\n if (count === 0) {\n return \"No items selected\"\n } else if (count === 1) {\n return \"1 item selected\"\n } else {\n return `${count} items selected`\n }\n }\n\n protected _getTriggerLabel(): string {\n return `Filter options: ${this.selectedValues.length} selected`\n }\n\n render() {\n const buttonClass = `trigger-button ${this.isDropdownOpen ? \"active\" : \"\"}`\n const menuClass = `dropdown-menu ${this.isDropdownOpen ? \"active\" : \"\"}`\n\n return html`\n <div class=\"dropdown-container\">\n <button\n class=\"${buttonClass}\"\n title=\"${this._getTriggerTitle()}\"\n @click=\"${this._toggleDropdown}\"\n aria-haspopup=\"true\"\n aria-expanded=\"${this.isDropdownOpen}\"\n aria-controls=\"dropdown-menu\"\n aria-label=\"${this._getTriggerLabel()}\"\n >\n ${this._getTriggerIcon()}\n <span class=\"selected-count\">${this.selectedValues.length}</span>\n <svg\n class=\"arrow-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n\n <div class=\"${menuClass}\" id=\"dropdown-menu\" role=\"menu\">\n ${this.dropdownOptions.map(\n option => html`\n <button\n value=\"${option.value}\"\n title=\"${option.title}\"\n class=\"${this._isOptionSelected(option) ? \"active\" : \"\"}\"\n @click=\"${() => this._handleOptionClick(option)}\"\n role=\"menuitem\"\n >\n ${option.label}\n </button>\n `\n )}\n </div>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"multi-select-dropdown\": MultiSelectDropdown\n }\n}\n","import { LitElement, html, css, PropertyValues } 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 * The background color is now driven by a CSS variable.\r\n * This allows us to set it from TypeScript without touching the class.\r\n */\r\n background-color: var(--log-background-color, transparent);\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 /* The color is driven by a CSS variable set in updated() */\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 /*\r\n * The :host(.error-status) selector is no longer needed,\r\n * as all styling is now handled by setting CSS variables below.\r\n * This makes the component's styling more self-contained.\r\n */\r\n `,\r\n ]\r\n\r\n @property({ attribute: false })\r\n log: SerializedEventData\r\n\r\n constructor(log: SerializedEventData) {\r\n super()\r\n this.log = log\r\n }\r\n\r\n @property({ type: Boolean })\r\n isExpanded: boolean = false\r\n\r\n @property()\r\n onToggle: ((logId: string) => void) | undefined\r\n\r\n protected updated(changedProperties: PropertyValues<this>) {\r\n // Only run this logic if the `log` property has changed.\r\n if (changedProperties.has(\"log\") && this.log) {\r\n const log = this.log\r\n const isError = log.type === \"callbackCompleted\" && \"status\" in log && log.status === \"error\"\r\n\r\n // Instead of toggling a class, we now set CSS custom properties\r\n // directly on the host element's style. This is an encapsulated\r\n // pattern that does not interfere with external classes.\r\n const color = isError ? \"#f44336\" : this.getLogTypeColor(log.type)\r\n const bgColor = isError ? \"rgba(244, 67, 54, 0.1)\" : \"transparent\"\r\n\r\n this.style.setProperty(\"--log-color\", color)\r\n this.style.setProperty(\"--log-background-color\", bgColor)\r\n }\r\n }\r\n\r\n private serializeLogDataWithoutSummary(log: SerializedEventData): string {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 elementReactivated: \"#ff9800\",\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 elementReactivated: \"Reactivated\",\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 managerDataPayload: \"ManagerData\",\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 const isError = log.type === \"callbackCompleted\" && \"status\" in log && log.status === \"error\"\r\n\r\n // The border color for the child component is still fine to calculate here.\r\n const borderColor = isError ? \"#f44336\" : 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, UpdatedManagerSetting } 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/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// A helper type to represent a change in a Devtools setting\r\ntype UpdatedDevtoolsSetting = {\r\n [K in keyof DevtoolsSettings]: {\r\n setting: K\r\n newValue: DevtoolsSettings[K]\r\n oldValue: DevtoolsSettings[K]\r\n }\r\n}[keyof DevtoolsSettings]\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: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[] = []\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: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[] = []\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: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[]\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 oldValue = this.initialSettings.manager[key]\r\n const newValue = this.managerSettings[key]\r\n if (oldValue !== newValue) {\r\n changes.push({\r\n setting: key,\r\n oldValue,\r\n newValue,\r\n } as UpdatedManagerSetting)\r\n }\r\n }\r\n }\r\n\r\n private _checkDevtoolsSettingsChanges(\r\n changes: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[]\r\n ): void {\r\n const devtoolsKeys: (keyof DevtoolsSettings)[] = [\"showNameTags\"]\r\n\r\n for (const key of devtoolsKeys) {\r\n const oldValue = this.initialSettings.devtools[key]\r\n const newValue = this.devtoolsSettings[key]\r\n if (oldValue !== newValue) {\r\n changes.push({\r\n setting: key,\r\n oldValue,\r\n newValue,\r\n } as UpdatedDevtoolsSetting)\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.setting}: ${JSON.stringify(change.oldValue)} -> ${JSON.stringify(\r\n change.newValue\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\nexport const DEFAULT_SHOW_DEBUGGER = true\nexport const DEFAULT_SHOW_NAME_TAGS = true\nexport const DEFAULT_SORT_ELEMENT_LIST = \"visibility\" as const\nexport const MAX_POSITION_HISTORY_SIZE = 30\nexport const MAX_SCROLL_MARGIN = 300\nexport const MAX_TAB_OFFSET = 20\nexport const MAX_TRAJECTORY_PREDICTION_TIME = 200\nexport const MIN_POSITION_HISTORY_SIZE = 2\nexport const MIN_SCROLL_MARGIN = 30\nexport const MIN_TAB_OFFSET = 0\nexport const MIN_TRAJECTORY_PREDICTION_TIME = 10\nexport const POSITION_HISTORY_SIZE_UNIT = \"points\"\nexport const SCROLL_MARGIN_UNIT = \"px\"\nexport const TAB_OFFSET_UNIT = \"tabs\"\nexport const TRAJECTORY_PREDICTION_TIME_UNIT = \"ms\"\n","import { LitElement, html, css } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\n\nimport \"./setting-item\"\nimport { ForesightManager, type ForesightManagerSettings } from \"js.foresight\"\nimport type { DevtoolsSettings } from \"../../../../types/types\"\n@customElement(\"setting-item-checkbox\")\nexport class SettingItemCheckbox extends LitElement {\n static styles = [\n css`\n input[type=\"checkbox\"] {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n position: relative;\n width: 44px;\n height: 22px;\n background-color: #444;\n cursor: pointer;\n outline: none;\n transition: all 0.3s ease;\n vertical-align: middle;\n flex-shrink: 0;\n margin: 0;\n border: 2px solid #555;\n }\n\n input[type=\"checkbox\"]::before {\n content: \"\";\n position: absolute;\n width: 16px;\n height: 16px;\n background-color: white;\n top: 1px;\n left: 1px;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n }\n\n input[type=\"checkbox\"]:checked {\n background-color: #b0c4de;\n border-color: #b0c4de;\n }\n\n input[type=\"checkbox\"]:checked::before {\n transform: translateX(22px);\n background-color: white;\n }\n\n input[type=\"checkbox\"]:hover {\n box-shadow: 0 0 0 3px rgba(176, 196, 222, 0.1);\n }\n `,\n ]\n\n @property({ type: Boolean }) isChecked: boolean = false\n @property({ type: String }) header: string = \"\"\n @property({ type: String }) description: string = \"\"\n @property({ type: String }) setting: keyof ForesightManagerSettings | keyof DevtoolsSettings =\n \"enableMousePrediction\"\n\n private handleCheckboxChange(event: Event): void {\n const target = event.target\n if (target instanceof HTMLInputElement) {\n const targetIsChecked = target.checked\n\n if (this.setting === \"showNameTags\") {\n this.dispatchEvent(\n new CustomEvent(\"setting-changed\", {\n detail: { setting: this.setting, value: targetIsChecked },\n bubbles: true,\n })\n )\n } else {\n ForesightManager.instance.alterGlobalSettings({\n [this.setting]: targetIsChecked,\n })\n }\n }\n }\n\n render() {\n return html`<setting-item header=${this.header} description=${this.description}>\n <input\n slot=\"controls\"\n type=\"checkbox\"\n .checked=${this.isChecked}\n @change=${this.handleCheckboxChange}\n />\n </setting-item>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"setting-item-checkbox\": SettingItemCheckbox\n }\n}\n","import { LitElement, html, css } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\n\n@customElement(\"setting-item\")\nexport class SettingItem extends LitElement {\n static styles = [\n css`\n .setting-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n border-bottom: 1px solid rgba(80, 80, 80, 0.2);\n }\n\n .setting-item:last-child {\n border-bottom: none;\n }\n .setting-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n .setting-description {\n font-size: 11px;\n color: #9e9e9e;\n line-height: 1.3;\n font-weight: normal;\n }\n .setting-item label {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-weight: 500;\n color: #fff;\n font-size: 13px;\n cursor: pointer;\n min-width: 180px;\n }\n .setting-header {\n font-weight: 500;\n color: #fff;\n font-size: 13px;\n }\n `,\n ]\n\n @property({ type: String }) header: string = \"\"\n @property({ type: String }) description: string = \"\"\n\n render() {\n return html`<div class=\"setting-item\">\n <label>\n <span class=\"setting-header\">${this.header}</span>\n <span class=\"setting-description\"> ${this.description} </span>\n </label>\n <div class=\"setting-controls\">\n <slot name=\"controls\"></slot>\n </div>\n </div>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"setting-item\": SettingItem\n }\n}\n","import { LitElement, html, css, type PropertyValues } from \"lit\"\nimport { customElement, property, state } from \"lit/decorators.js\"\n\nimport \"./setting-item\"\nimport { ForesightManager, type ForesightManagerSettings } from \"js.foresight\"\n@customElement(\"setting-item-range\")\nexport class SettingItemRange extends LitElement {\n static styles = [\n css`\n .setting-range-value {\n font-size: 12px;\n color: #b0c4de;\n font-weight: 500;\n min-width: 45px;\n text-align: right;\n }\n\n .range-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n input[type=\"range\"] {\n margin: 0;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n background: transparent;\n height: 22px;\n vertical-align: middle;\n width: 100px;\n }\n\n input[type=\"range\"]::-webkit-slider-runnable-track {\n height: 6px;\n background: #444;\n border: 1px solid #555;\n }\n\n input[type=\"range\"]::-moz-range-track {\n height: 6px;\n background: #444;\n border: 1px solid #555;\n }\n\n input[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n margin-top: -7px;\n background: #b0c4de;\n height: 20px;\n width: 20px;\n border: 2px solid #333;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n transition: all 0.2s ease;\n }\n\n input[type=\"range\"]::-moz-range-thumb {\n background: #b0c4de;\n height: 20px;\n width: 20px;\n border: 2px solid #333;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n transition: all 0.2s ease;\n }\n\n input[type=\"range\"]:hover::-webkit-slider-thumb {\n transform: scale(1.1);\n box-shadow: 0 0 0 4px rgba(176, 196, 222, 0.2);\n }\n\n input[type=\"range\"]:hover::-moz-range-thumb {\n transform: scale(1.1);\n box-shadow: 0 0 0 4px rgba(176, 196, 222, 0.2);\n }\n `,\n ]\n\n @property({ type: Number }) minValue: number = 0\n @property({ type: Number }) maxValue: number = 100\n @property({ type: Number }) currentValue: number = 50\n @property({ type: String }) unit: string = \"px\"\n @property({ type: String }) header: string = \"\"\n @property({ type: String }) description: string = \"\"\n @property({ type: String }) setting: keyof ForesightManagerSettings = \"tabOffset\"\n\n @state() private displayValue: number = 50\n\n private handleRangeInput(event: Event): void {\n const target = event.target\n if (target instanceof HTMLInputElement) {\n this.displayValue = parseInt(target.value, 10)\n }\n }\n\n private handleRangeChange(event: Event): void {\n const target = event.target\n if (target instanceof HTMLInputElement) {\n const value = parseInt(target.value, 10)\n this.displayValue = value\n ForesightManager.instance.alterGlobalSettings({\n [this.setting]: value,\n })\n }\n }\n\n willUpdate(changedProperties: PropertyValues) {\n super.willUpdate(changedProperties)\n if (changedProperties.has(\"currentValue\")) {\n this.displayValue = this.currentValue\n }\n }\n\n render() {\n return html`<setting-item header=${this.header} description=${this.description}>\n <div slot=\"controls\" class=\"range-wrapper\">\n <input\n slot=\"controls\"\n type=\"range\"\n min=\"${this.minValue}\"\n max=\"${this.maxValue}\"\n step=\"1\"\n .value=${this.displayValue}\n @input=${this.handleRangeInput}\n @change=${this.handleRangeChange}\n />\n <span class=\"setting-range-value\">${this.displayValue} ${this.unit}</span>\n </div>\n </setting-item>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"setting-item-range\": SettingItemRange\n }\n}\n","import { LitElement, css, html } from \"lit\"\r\nimport { customElement } from \"lit/decorators.js\"\r\nimport \"./element-overlays\"\r\nimport \"./mouse-trajectory\"\r\nimport \"./scroll-trajectory\"\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} from \"js.foresight\"\r\nimport type {\r\n CallbackCompletedEvent,\r\n CallbackInvokedEvent,\r\n ElementDataUpdatedEvent,\r\n ElementReactivatedEvent,\r\n ElementRegisteredEvent,\r\n ElementUnregisteredEvent,\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 \"elementReactivated\",\r\n (e: ElementReactivatedEvent) => {\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 \"elementDataUpdated\",\r\n (e: ElementDataUpdatedEvent) => {\r\n if (e.updatedProps.includes(\"bounds\") && e.elementData.callbackInfo.isCallbackActive) {\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 this.removeElementOverlay(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 return\r\n }\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 private unhighlightElementCallback(elementData: ForesightElementData) {\r\n const overlays = this.overlayMap.get(elementData.element)\r\n if (!overlays) {\r\n return\r\n }\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 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.callbackAnimations.forEach(animation => {\r\n clearTimeout(animation.timeoutId)\r\n })\r\n this.callbackAnimations.clear()\r\n this.overlayMap.clear()\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\nimport type { ElementUnregisteredEvent } 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 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 \"elementUnregistered\",\r\n this.handleElementUnregistered,\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 // On last element make sure to remove any leftovers\r\n private handleElementUnregistered = (e: ElementUnregisteredEvent) => {\r\n if (e.wasLastElement) {\r\n this._isVisible = false\r\n this._trajectoryStyles = {\r\n transform: `translate3d(0px, 0px, 0) rotate(0deg)`,\r\n width: `0px`,\r\n }\r\n }\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 this.requestUpdate()\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\r\n const { currentPoint, predictedPoint } = e.trajectoryPositions\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 const angle = Math.atan2(dy, dx) * 57.29577951308232 // Pre-calculate rad to deg\r\n this._trajectoryStyles = {\r\n transform: `translate3d(${currentPoint.x}px, ${currentPoint.y}px, 0) rotate(${angle}deg)`,\r\n width: `${length}px`,\r\n }\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 {\r\n ScrollTrajectoryUpdateEvent,\r\n ManagerSettingsChangedEvent,\r\n ElementUnregisteredEvent,\r\n} 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 \"elementUnregistered\",\r\n this.handleElementUnregistered,\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 // On last element make sure to remove any leftovers\r\n private handleElementUnregistered = (e: ElementUnregisteredEvent) => {\r\n if (e.wasLastElement) {\r\n this._isVisible = false\r\n }\r\n }\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","ForesightManager","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","STATE_SVG","UNREGISTER_SVG","LitElement","html","css","customElement","property","ChipElement","LitElement","html","css","__decorateClass","property","customElement","LitElement","html","css","customElement","property","TabContent","LitElement","html","css","__decorateClass","property","customElement","LitElement","html","css","customElement","TabHeader","LitElement","html","css","__decorateClass","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","LitElement","html","css","customElement","property","LitElement","html","css","customElement","property","state","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","ForesightManager","LitElement","css","html","customElement","property","state","ReactivateCountdown","LitElement","ForesightManager","changedProperties","callbackInfo","hasCallbackHistory","reactivateAfter","startTime","updateCountdown","elapsed","remaining","ms","totalSeconds","minutes","seconds","hours","remainingMinutes","html","css","__decorateClass","property","state","customElement","ForesightManager","SingleElement","LitElement","ForesightManager","elementData","details","isNotVisible","html","UNREGISTER_SVG","css","__decorateClass","property","customElement","ElementTab","LitElement","value","elementId","newExpandedElementIds","a","b","position","ForesightDevtools","VISIBILITY_SVG","DOCUMENT_SVG","INSERTION_SVG","hitCounts","lines","signal","ForesightManager","e","hitType","elementsData","data","html","map","elementData","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","safeSerializeManagerData","data","logId","eventListeners","listeners","eventType","registeredElements","elementData","element","_","elementDataWithoutElement","safeSerializeEventData","event","getOrdinalSuffix","elapsed","formatElapsed","setting","error","ms","n","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","changedProperties","isError","color","bgColor","_","rest","logType","eventType","summary","maxLength","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","log","safeSerializeManagerData","safeSerializeEventData","html","WARNING_SVG","STATE_SVG","CLEAR_SVG","map","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","oldValue","newValue","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","ForesightDevtools","error","event","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","animation","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","key","html","css","__decorateClass","state","customElement"]}