{"version":3,"file":"index.mjs","names":[],"sources":["../src/types/types.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/base-dropdown.ts","../src/lit-entry/control-panel/dropdown/single-select-dropdown.ts","../src/lit-entry/control-panel/copy-icon/copy-icon.ts","../src/lit-entry/control-panel/base-tab/expandable-item.ts","../src/lit-entry/control-panel/element-tab/reactivate-countdown.ts","../src/lit-entry/control-panel/element-tab/single-element.ts","../src/lit-entry/control-panel/element-tab/element-tab.ts","../src/lit-entry/control-panel/base-tab/tab-selector.ts","../src/lit-entry/control-panel/dropdown/multi-select-dropdown.ts","../src/helpers/safeSerializeEventData.ts","../src/lit-entry/control-panel/log-tab/log-store.ts","../src/lit-entry/control-panel/log-tab/single-log.ts","../src/lit-entry/control-panel/log-tab/log-tab.ts","../src/constants.ts","../src/lit-entry/control-panel/settings-tab/setting-item/setting-item.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-range.ts","../src/lit-entry/control-panel/settings-tab/settings-tab.ts","../src/lit-entry/control-panel/control-panel.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","../src/lit-entry/debug-overlay/debug-overlay.ts","../src/lit-entry/foresight-devtools.ts"],"sourcesContent":["import type { HitSlop, ForesightEvent } from \"js.foresight\"\n\nexport type Corner = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\"\n\nexport type DeepPartial<T> = T extends object\n  ? {\n      [P in keyof T]?: DeepPartial<T[P]>\n    }\n  : T\n\nexport type ShowSettings = {\n  /**\n   * Show the debugger control panel.\n   * @default true\n   */\n  controlPanel: boolean\n  /**\n   * Show name tags above each registered element.\n   * @default true\n   */\n  nameTags: boolean\n  /**\n   * Show element hit-slop overlays (the expanded boundary around each registered element).\n   *\n   * Note: turning this off also hides name tags, since the labels live inside\n   * the same overlay host.\n   *\n   * @default true\n   */\n  elementOverlays: boolean\n  /**\n   * Show the predicted mouse trajectory line.\n   * @default true\n   */\n  mouseTrajectory: boolean\n  /**\n   * Show the predicted scroll trajectory line.\n   * @default true\n   */\n  scrollTrajectory: boolean\n}\n\nexport type ShowKey = keyof ShowSettings\n\nexport const SHOW_KEYS = [\n  \"controlPanel\",\n  \"nameTags\",\n  \"elementOverlays\",\n  \"mouseTrajectory\",\n  \"scrollTrajectory\",\n] as const satisfies readonly ShowKey[]\n\nexport type DevtoolsSettings = {\n  /**\n   * Granular visibility flags for the devtools UI.\n   *\n   * @link https://foresightjs.com/docs/getting_started/debug\n   */\n  show: ShowSettings\n\n  /**\n   * Determines if the debugger control panel should be initialized in a minimized state.\n   *\n   * @link https://foresightjs.com/docs/getting_started/debug\n   *\n   * @default false\n   */\n  isControlPanelDefaultMinimized: boolean\n  /**\n   * Specifies the default sorting order for the list of registered elements in the debugger panel.\n   * - `'visibility'`: Sorts elements by their viewport visibility (visible elements first),\n   *   with a secondary documentOrder sort.\n   * - `'documentOrder'`: Sorts elements based on their order of appearance in the\n   *   document's structure (matching the HTML source).\n   * - `'insertionOrder'`: Sorts by registration order.\n   *\n   *\n   * @link https://foresightjs.com/docs/getting_started/debug\n   *\n   * @default 'visibility'\n   *\n   */\n  sortElementList: SortElementList\n\n  logging: LogEvents & {\n    logLocation: LoggingLocations\n  }\n}\n\nexport type LogEvents = {\n  [K in ForesightEvent]: boolean\n}\n\nexport type LoggingLocations = \"controlPanel\" | \"console\" | \"both\" | \"none\"\n\nexport type ControllerTabs = \"settings\" | \"elements\" | \"logs\"\n\nexport type SortElementList = \"documentOrder\" | \"visibility\" | \"insertionOrder\"\n\nexport type ForesightDevtoolsData = {\n  settings: Readonly<DevtoolsSettings>\n}\n\nexport type DebuggerBooleanSettingKeys = ShowKey\n\nexport type ElementOverlays = {\n  expandedOverlay: HTMLElement\n  nameLabel: HTMLElement\n}\n\nexport type callbackAnimation = {\n  hitSlop: Exclude<HitSlop, number>\n  overlay: HTMLElement\n  timeoutId: ReturnType<typeof setTimeout>\n}\n\nexport type SectionStates = {\n  mouse: boolean\n  keyboard: boolean\n  scroll: boolean\n  general: boolean\n}\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\nexport const TOUCH_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-12 0c0 2 3 4 6 6 3-2 6-4 6-6z\" />\n    <circle cx=\"12\" cy=\"8\" r=\"3\" />\n  </svg>\n`\n\nexport const VIEWPORT_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=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n    <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n    <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n    <circle cx=\"12\" cy=\"10\" r=\"2\" />\n  </svg>\n`\n\nexport const DISABLED_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 ENABLE_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    <path d=\"M18.36 6.64a9 9 0 1 1-12.73 0\" />\n    <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"12\" />\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 { 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      this._positionDropdown()\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    if (typeof window === \"undefined\") {\n      return\n    }\n\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 { 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\n    this._closeDropdown()\n  }\n\n  protected _getTriggerIcon(): TemplateResult {\n    const selectedOption = this._getSelectedOption()\n\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\n    return selected ? selected.title : \"Change selection\"\n  }\n\n  protected _getTriggerLabel(): string {\n    const selected = this._getSelectedOption()\n\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 } 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) {\n      return\n    }\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 { LitElement, html, css } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\nimport \"../copy-icon/copy-icon\"\n\n@customElement(\"expandable-item\")\nexport class ExpandableItem extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n      }\n\n      .item-entry {\n        margin-bottom: 2px;\n        font-size: 11px;\n        line-height: 1.3;\n        overflow: hidden;\n        transition: all 0.2s ease;\n        border-left: 2px solid var(--border-color, #555);\n        padding-left: 6px;\n      }\n\n      .item-entry:hover:not(.expanded) {\n        background-color: rgba(255, 255, 255, 0.02);\n      }\n\n      .item-entry.expanded {\n        background-color: rgba(255, 255, 255, 0.03);\n      }\n\n      .item-header {\n        display: flex;\n        align-items: center;\n        padding: 3px 4px;\n        cursor: pointer;\n        transition: background-color 0.2s ease;\n        gap: 8px;\n        min-height: 20px;\n      }\n\n      .item-header:hover:not(.expanded) {\n        background-color: rgba(255, 255, 255, 0.03);\n      }\n\n      .item-details {\n        position: relative;\n        border-top: 1px solid rgba(255, 255, 255, 0.1);\n      }\n\n      .item-toggle {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 16px;\n        height: 16px;\n\n        user-select: none;\n        cursor: pointer;\n        transition: all 0.2s ease;\n      }\n\n      .item-toggle:hover {\n        background-color: rgba(255, 255, 255, 0.1);\n      }\n\n      .item-toggle svg {\n        width: 14px;\n        height: 14px;\n        fill: none;\n        stroke: #b0c4de;\n        stroke-width: 2;\n        stroke-linecap: round;\n        stroke-linejoin: round;\n        transition: all 0.2s ease;\n      }\n\n      .item-toggle:hover svg {\n        stroke: #d4e4f4;\n      }\n\n      .item-toggle.expanded svg {\n        transform: rotate(90deg);\n      }\n\n      .item-content {\n        flex: 1;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        min-width: 0;\n        overflow: hidden;\n      }\n\n      .item-data {\n        color: #e0e0e0;\n        white-space: pre;\n        font-size: 11px;\n        margin: 0;\n        padding: 0;\n        font-family: \"Courier New\", monospace;\n        line-height: 1.3;\n        display: block;\n        overflow-x: auto;\n      }\n    `,\n  ]\n\n  @property() borderColor: string = \"#555\"\n  @property() showCopyButton: boolean = false\n  @property() itemId: string = \"\"\n  @property() isExpanded: boolean = false\n  @property() onToggle: ((itemId: string) => void) | undefined\n\n  private toggleExpand(): void {\n    if (this.onToggle) {\n      this.onToggle(this.itemId)\n    }\n  }\n\n  private async handleCopy(event: MouseEvent): Promise<void> {\n    event.stopPropagation()\n    const detailsSlot = this.shadowRoot?.querySelector('slot[name=\"details\"]') as HTMLSlotElement\n    if (detailsSlot) {\n      const assignedNodes = detailsSlot.assignedNodes()\n      const textContent = assignedNodes.map(node => node.textContent).join(\"\")\n      try {\n        await navigator.clipboard.writeText(textContent)\n      } catch (err) {\n        console.error(\"Failed to copy text: \", err)\n      }\n    }\n  }\n\n  render() {\n    this.style.setProperty(\"--border-color\", this.borderColor)\n\n    return html`\n      <div class=\"item-entry ${this.isExpanded ? \"expanded\" : \"\"}\">\n        <div class=\"item-header ${this.isExpanded ? \"expanded\" : \"\"}\" @click=\"${this.toggleExpand}\">\n          <div class=\"item-content\">\n            <slot name=\"content\"></slot>\n          </div>\n          <span class=\"item-toggle ${this.isExpanded ? \"expanded\" : \"\"}\">\n            <svg viewBox=\"0 0 24 24\">\n              <polyline points=\"9,18 15,12 9,6\"></polyline>\n            </svg>\n          </span>\n        </div>\n        ${this.isExpanded\n          ? html`\n              <div class=\"item-details\">\n                <copy-icon\n                  positioned\n                  title=\"Copy Details\"\n                  .onCopy=${(event: MouseEvent) => this.handleCopy(event)}\n                ></copy-icon>\n                <pre class=\"item-data\">\n                  <slot name=\"details\"></slot>\n                </pre>\n              </div>\n            `\n          : \"\"}\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"expandable-item\": ExpandableItem\n  }\n}\n","import { ForesightManager, type ForesightElement, type ForesightElementState } from \"js.foresight\"\nimport { LitElement, css, html } from \"lit\"\nimport { customElement, property, state } from \"lit/decorators.js\"\n\n@customElement(\"reactivate-countdown\")\nexport class ReactivateCountdown extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: inline-block;\n      }\n\n      .reactivate-button {\n        all: unset;\n        cursor: pointer;\n        padding: 2px 4px;\n        transition: background-color 0.2s ease;\n      }\n\n      .reactivate-button:hover {\n        background-color: rgba(255, 165, 0, 0.1);\n      }\n\n      .countdown-time {\n        color: #ffa726;\n        font-weight: 500;\n        font-size: 10px;\n      }\n\n      .countdown-time.infinity {\n        font-size: 12px;\n        font-weight: 600;\n      }\n\n      .countdown-time.clickable {\n        cursor: pointer;\n      }\n    `,\n  ]\n\n  @property({ attribute: false }) element!: ForesightElement\n  @property({ attribute: false }) state!: ForesightElementState\n  @state()\n  private remainingTime: number = 0\n\n  @state()\n  private isCountdownActive: boolean = false\n\n  private intervalId: number | null = null\n  private startTime: number = 0\n  private lastDisplayedTime: string = \"\"\n  private countdownForElement: ForesightElement | null = null\n  private countdownReactivateAfter: number = 0\n\n  connectedCallback() {\n    super.connectedCallback()\n    this.checkAndStartCountdown()\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    this.clearCountdown()\n  }\n\n  willUpdate(changedProperties: Map<string | number | symbol, unknown>) {\n    super.willUpdate(changedProperties)\n    if (changedProperties.has(\"state\")) {\n      this.checkAndStartCountdown()\n    }\n  }\n\n  private checkAndStartCountdown() {\n    const state = this.state\n\n    if (!state) {\n      this.clearCountdown()\n\n      return\n    }\n\n    // Show countdown when:\n    // 1. Callback is inactive (not currently active)\n    // 2. Callback has completed at least once (has a status)\n    // 3. reactivateAfter is not 0 (otherwise instant reactivation)\n    const hasCallbackHistory = state.status !== undefined\n    const shouldShowCountdown = !state.isActive && hasCallbackHistory && state.reactivateAfter > 0\n\n    if (shouldShowCountdown) {\n      this.startCountdown()\n    } else {\n      this.clearCountdown()\n    }\n  }\n\n  private startCountdown() {\n    // Don't restart if already counting down for the same element with the same duration\n    if (\n      this.isCountdownActive &&\n      this.countdownForElement === this.element &&\n      this.countdownReactivateAfter === this.state.reactivateAfter\n    ) {\n      return\n    }\n\n    this.clearCountdown()\n\n    const state = this.state\n    if (!state) {\n      return\n    }\n\n    this.countdownForElement = this.element\n    this.countdownReactivateAfter = state.reactivateAfter\n    this.isCountdownActive = true\n\n    if (state.reactivateAfter === Infinity) {\n      this.remainingTime = Infinity\n\n      return\n    }\n\n    const reactivateAfter = state.reactivateAfter\n\n    // Use the current time as the anchor; the countdown is (re)started each\n    // time the state transitions to inactive, which happens right after the\n    // callback completes.\n    this.startTime = Date.now()\n\n    const updateCountdown = () => {\n      const elapsed = Date.now() - this.startTime\n      const remaining = Math.max(0, reactivateAfter - elapsed)\n      const formatted = this.formatTime(remaining)\n\n      if (formatted !== this.lastDisplayedTime) {\n        this.lastDisplayedTime = formatted\n        this.remainingTime = remaining\n        this.requestUpdate()\n      }\n\n      if (remaining <= 0 || this.state.isActive) {\n        this.clearCountdown()\n      }\n    }\n\n    updateCountdown()\n\n    if (this.remainingTime > 0 && typeof window !== \"undefined\") {\n      this.intervalId = window.setInterval(updateCountdown, 100)\n    }\n  }\n\n  private clearCountdown() {\n    if (this.intervalId !== null) {\n      clearInterval(this.intervalId)\n      this.intervalId = null\n    }\n\n    this.isCountdownActive = false\n    this.remainingTime = 0\n    this.lastDisplayedTime = \"\"\n    this.countdownForElement = null\n    this.countdownReactivateAfter = 0\n  }\n\n  private handleTimerClick = (e: MouseEvent) => {\n    e.stopPropagation()\n    ForesightManager.instance.reactivate(this.element)\n  }\n\n  private formatTime(ms: number): string {\n    if (ms === Infinity) {\n      return \"∞\"\n    }\n\n    const totalSeconds = Math.ceil(ms / 1000)\n\n    if (totalSeconds < 60) {\n      return `${totalSeconds}s`\n    }\n\n    const minutes = Math.floor(totalSeconds / 60)\n    const seconds = totalSeconds % 60\n\n    if (minutes < 60) {\n      return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`\n    }\n\n    const hours = Math.floor(minutes / 60)\n    const remainingMinutes = minutes % 60\n\n    if (remainingMinutes > 0) {\n      return `${hours}h ${remainingMinutes}m`\n    }\n\n    return `${hours}h`\n  }\n\n  render() {\n    if (!this.isCountdownActive) {\n      return html``\n    }\n\n    if (this.remainingTime === Infinity) {\n      return html`\n        <button\n          class=\"reactivate-button\"\n          @click=\"${this.handleTimerClick}\"\n          title=\"Click to reactivate manually\"\n        >\n          <span class=\"countdown-time infinity\">∞</span>\n        </button>\n      `\n    }\n\n    if (this.remainingTime <= 0) {\n      return html``\n    }\n\n    return html`\n      <button\n        class=\"reactivate-button\"\n        @click=\"${this.handleTimerClick}\"\n        title=\"Click to reactivate immediately\"\n      >\n        <span class=\"countdown-time clickable\">${this.formatTime(this.remainingTime)}</span>\n      </button>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"reactivate-countdown\": ReactivateCountdown\n  }\n}\n","import type {\n  DeviceStrategyChangedEvent,\n  ForesightElement,\n  ForesightElementState,\n} from \"js.foresight\"\nimport { LitElement, html, css } from \"lit\"\nimport { customElement, property, state } from \"lit/decorators.js\"\nimport \"../base-tab/expandable-item\"\nimport \"./reactivate-countdown\"\nimport { ForesightManager } from \"js.foresight\"\nimport { DISABLED_SVG, ENABLE_SVG, UNREGISTER_SVG } from \"../../../svg/svg-icons\"\n@customElement(\"single-element\")\nexport class SingleElement extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n      }\n\n      .element-wrapper {\n        display: block;\n      }\n\n      .element-content {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        flex: 1;\n        min-width: 0;\n      }\n\n      .status-indicator {\n        margin-left: 2px;\n        width: 8px;\n        height: 8px;\n        flex-shrink: 0;\n        transition: all 0.3s ease;\n      }\n\n      .status-indicator.visible {\n        background-color: #4caf50;\n        box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.3);\n      }\n\n      .status-indicator.hidden {\n        background-color: #666;\n        box-shadow: 0 0 0 2px rgba(102, 102, 102, 0.2);\n      }\n\n      .status-indicator.prefetching {\n        background-color: #ffeb3b;\n        box-shadow: 0 0 0 2px rgba(255, 235, 59, 0.4);\n      }\n\n      .status-indicator.inactive {\n        background-color: #999;\n        box-shadow: 0 0 0 2px rgba(153, 153, 153, 0.3);\n      }\n\n      .reason-tags {\n        display: inline-flex;\n        align-items: baseline;\n        gap: 7px;\n        flex-shrink: 0;\n        font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n        font-size: 10px;\n      }\n\n      .reason-tag {\n        white-space: nowrap;\n        color: color-mix(in srgb, var(--reason-color) 80%, #fff);\n      }\n\n      .reason-tag::before {\n        content: \"/\";\n        margin-right: 3px;\n        color: #555;\n      }\n\n      .status-indicator.touch-device {\n        background-color: #ba68c8;\n        box-shadow: 0 0 0 2px rgba(186, 104, 200, 0.4);\n      }\n\n      .unregister-button,\n      .toggle-enabled-button,\n      .enable-button {\n        all: unset;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 14px;\n        height: 14px;\n        padding: 1px;\n        cursor: pointer;\n        color: #999;\n      }\n\n      .unregister-button svg,\n      .toggle-enabled-button svg,\n      .enable-button svg {\n        width: 12px;\n        height: 12px;\n      }\n\n      .unregister-button:hover {\n        background-color: rgba(255, 107, 107, 0.1);\n        color: #ff6b6b;\n      }\n\n      .toggle-enabled-button:hover {\n        background-color: rgba(255, 165, 0, 0.1);\n        color: #ffa726;\n      }\n\n      .enable-button:hover {\n        background-color: rgba(76, 175, 80, 0.1);\n        color: #4caf50;\n      }\n\n      .element-name {\n        flex-grow: 1;\n        min-width: 0;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        font-size: 11px;\n        font-weight: 500;\n        color: #e8e8e8;\n      }\n\n      .element-name.callback-active {\n        color: #fff;\n        font-weight: 600;\n      }\n\n      .element-name.callback-inactive {\n        color: #999;\n        font-weight: 500;\n      }\n\n      .reactivate-countdown {\n        font-size: 14px;\n        color: #ffa726;\n        font-weight: 500;\n        min-width: 0;\n        white-space: nowrap;\n      }\n\n      .reactivate-countdown:empty {\n        display: none;\n      }\n\n      :host(.not-visible) {\n        opacity: 0.5;\n      }\n\n      .element-wrapper.not-visible {\n        opacity: 0.5;\n      }\n    `,\n  ]\n\n  @property({ attribute: false }) element!: ForesightElement\n  @property({ attribute: false }) state!: ForesightElementState\n  @property() isExpanded: boolean = false\n  @property() onToggle: ((elementId: string) => void) | undefined\n\n  @state() private currentDeviceStrategy: string = \"mouse\"\n  private _abortController: AbortController | null = null\n  connectedCallback() {\n    super.connectedCallback()\n    this._abortController = new AbortController()\n    const { signal } = this._abortController\n\n    // Initialize current device strategy\n    this.currentDeviceStrategy = ForesightManager.instance.getManagerData.currentDeviceStrategy\n\n    // Listen for device strategy changes\n    ForesightManager.instance.addEventListener(\n      \"deviceStrategyChanged\",\n      (e: DeviceStrategyChangedEvent) => {\n        this.currentDeviceStrategy = e.newStrategy\n      },\n      { signal }\n    )\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    this._abortController?.abort()\n    this._abortController = null\n  }\n\n  private getInactiveReasons(): { label: string; color: string; description: string }[] {\n    const reasons: { label: string; color: string; description: string }[] = []\n\n    if (!this.state.isEnabled) {\n      reasons.push({\n        label: \"disabled\",\n        color: \"#9e9e9e\",\n        description: \"Element is disabled, so its callback won't run until you re-enable it.\",\n      })\n    }\n\n    if (this.state.isParked) {\n      reasons.push({\n        label: \"parked\",\n        color: \"#7986cb\",\n        description:\n          \"Element is detached from the DOM and parked: kept registered but inactive until it reconnects.\",\n      })\n    }\n\n    if (this.state.isLimitedConnection) {\n      reasons.push({\n        label: \"limited\",\n        color: \"#ffb74d\",\n        description:\n          \"Element is on a limited connection (e.g. Save-Data or slow network), so prediction is paused.\",\n      })\n    }\n\n    // Already fired its callback; stays inactive until reactivated, which by\n    // default (`reactivateAfter: Infinity`) never happens.\n    if (\n      this.state.isEnabled &&\n      !this.state.isParked &&\n      !this.state.isLimitedConnection &&\n      !this.state.isActive &&\n      this.state.isPredicted\n    ) {\n      reasons.push({\n        label: \"fired\",\n        color: \"#4dd0e1\",\n        description:\n          \"Callback already fired. Stays inactive until reactivated (never, unless reactivateAfter is set).\",\n      })\n    }\n\n    return reasons\n  }\n\n  private getBorderColor(): string {\n    if (this.state.isCallbackRunning) {\n      return \"#ffeb3b\"\n    }\n\n    if (!this.state.isActive) {\n      return \"#999\"\n    }\n\n    // Use purple for touch devices when active (no opacity variation)\n    if (this.currentDeviceStrategy === \"touch\") {\n      return \"#ba68c8\"\n    }\n\n    // Use green for desktop devices when active\n    return this.state.isIntersectingWithViewport ? \"#4caf50\" : \"#666\"\n  }\n\n  private getStatusIndicatorClass(): string {\n    if (this.state.isCallbackRunning) {\n      return \"prefetching\"\n    }\n\n    if (!this.state.isActive) {\n      return \"inactive\"\n    }\n\n    // Use purple indicator for touch devices (no visibility distinction)\n    if (this.currentDeviceStrategy === \"touch\") {\n      return \"touch-device\"\n    }\n\n    return this.state.isIntersectingWithViewport ? \"visible\" : \"hidden\"\n  }\n\n  private getStatusText(): string {\n    if (this.state.isCallbackRunning) {\n      return \"callback active\"\n    }\n\n    if (!this.state.isActive) {\n      const reasons = this.getInactiveReasons()\n\n      return reasons.length ? `inactive: ${reasons.map(r => r.label).join(\", \")}` : \"inactive\"\n    }\n\n    const baseStatus = this.state.isIntersectingWithViewport ? \"in viewport\" : \"not in viewport\"\n    const deviceStatus = this.currentDeviceStrategy === \"touch\" ? \" (touch device)\" : \"\"\n\n    return baseStatus + deviceStatus\n  }\n\n  private formatElementDetails(): string {\n    if (!this.isExpanded) {\n      return \"\"\n    }\n\n    return JSON.stringify({ ...this.state, status: this.getStatusText() }, null, 2)\n  }\n\n  private handleUnregister = (e: MouseEvent) => {\n    e.stopPropagation()\n    ForesightManager.instance.unregister(this.element, \"devtools\")\n  }\n\n  private handleToggleEnabled = (e: MouseEvent) => {\n    e.stopPropagation()\n    ForesightManager.instance.updateElementOptions(this.element, {\n      enabled: !this.state.isEnabled,\n    })\n  }\n\n  render() {\n    // Don't apply opacity reduction for touch devices since visibility detection isn't reliable\n    const isNotVisible =\n      !this.state.isIntersectingWithViewport && this.currentDeviceStrategy !== \"touch\"\n    const inactiveReasons = this.getInactiveReasons()\n\n    return html`\n      <div class=\"element-wrapper ${isNotVisible ? \"not-visible\" : \"\"}\">\n        <expandable-item\n          .borderColor=${this.getBorderColor()}\n          .showCopyButton=${true}\n          .itemId=${this.state.id}\n          .isExpanded=${this.isExpanded}\n          .onToggle=${this.onToggle}\n        >\n          <div slot=\"content\" class=\"element-content\" title=\"Status: ${this.getStatusText()}\">\n            <div class=\"status-indicator ${this.getStatusIndicatorClass()}\"></div>\n            <span\n              class=\"element-name ${this.state.isCallbackRunning\n                ? \"callback-active\"\n                : !this.state.isActive\n                  ? \"callback-inactive\"\n                  : \"\"}\"\n            >\n              ${this.state.name || \"unnamed\"}\n            </span>\n            ${inactiveReasons.length\n              ? html`\n                  <span class=\"reason-tags\">\n                    ${inactiveReasons.map(\n                      reason =>\n                        html`<span\n                          class=\"reason-tag\"\n                          style=\"--reason-color: ${reason.color}\"\n                          title=\"${reason.label}: ${reason.description}\"\n                          >${reason.label}</span\n                        >`\n                    )}\n                  </span>\n                `\n              : \"\"}\n            ${this.state.isEnabled\n              ? html`\n                  <reactivate-countdown .element=${this.element} .state=${this.state}>\n                  </reactivate-countdown>\n                  <button\n                    class=\"toggle-enabled-button\"\n                    @click=\"${this.handleToggleEnabled}\"\n                    title=\"Disable element\"\n                  >\n                    ${DISABLED_SVG}\n                  </button>\n                `\n              : html`\n                  <button\n                    class=\"enable-button\"\n                    @click=\"${this.handleToggleEnabled}\"\n                    title=\"Enable element\"\n                  >\n                    ${ENABLE_SVG}\n                  </button>\n                `}\n            <button\n              class=\"unregister-button\"\n              @click=\"${this.handleUnregister}\"\n              title=\"Unregister element\"\n            >\n              ${UNREGISTER_SVG}\n            </button>\n          </div>\n          <div slot=\"details\">${this.formatElementDetails()}</div>\n        </expandable-item>\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"single-element\": SingleElement\n  }\n}\n","import { css, html, LitElement } from \"lit\"\nimport { customElement, state } from \"lit/decorators.js\"\nimport { repeat } from \"lit/directives/repeat.js\"\n\nimport type {\n  CallbackHits,\n  CallbackInvokedEvent,\n  ElementRegisteredEvent,\n  ElementUnregisteredEvent,\n} from \"js.foresight\"\nimport { ForesightManager, type ForesightElement, type ForesightElementState } from \"js.foresight\"\n\ntype ElementListEntry = { element: ForesightElement; state: ForesightElementState }\nimport { DOCUMENT_SVG, INSERTION_SVG, VISIBILITY_SVG } from \"../../../svg/svg-icons\"\nimport type { SortElementList } from \"../../../types/types\"\nimport { ForesightDevtools } from \"../../foresight-devtools\"\nimport \"../base-tab/chip\"\nimport \"../base-tab/tab-content\"\nimport \"../base-tab/tab-header\"\nimport \"../dropdown/single-select-dropdown\"\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\nimport \"../element-tab/single-element\"\nimport \"./reactivate-countdown\"\n\n@customElement(\"element-tab\")\nexport class ElementTab extends LitElement {\n  static styles = css`\n    :host {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n    }\n\n    .chips-container {\n      display: flex;\n      gap: 8px;\n    }\n\n    .element-section {\n      margin-bottom: 16px;\n    }\n\n    .element-section:last-child {\n      margin-bottom: 0;\n    }\n\n    .section-header {\n      margin: 4px 0 4px 0;\n      font-size: 12px;\n      font-weight: 600;\n      cursor: pointer;\n      user-select: none;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n    }\n\n    .section-header:hover {\n      opacity: 0.8;\n    }\n\n    .section-header::before {\n      content: \"▼\";\n      display: inline-block;\n      transition: transform 0.15s ease;\n      font-size: 10px;\n    }\n\n    .section-header.collapsed::before {\n      transform: rotate(-90deg);\n    }\n\n    .section-header.active {\n      color: #e8e8e8;\n    }\n\n    .section-header.inactive {\n      color: #999;\n    }\n  `\n\n  private get hitCount(): CallbackHits {\n    return ForesightManager.instance.getManagerData.globalCallbackHits\n  }\n\n  @state() private sortDropdown: DropdownOption[]\n  @state() private sortOrder: SortElementList\n  @state() private elementListItems: Map<ForesightElement, ForesightElementState> = new Map()\n  @state() private noContentMessage: string = \"No Elements Registered To The Foresight Manager\"\n  @state() private expandedElementIds: Set<string> = new Set()\n  @state() private activeSectionCollapsed = false\n  @state() private inactiveSectionCollapsed = false\n  private _abortController: AbortController | null = null\n  private _elementSubscriptions: Map<ForesightElement, () => void> = new Map()\n  private _pendingElementUpdates: Map<ForesightElement, ForesightElementState> = new Map()\n  private _updateDebounceId: ReturnType<typeof setTimeout> | null = null\n  // Cached sorted element order; states are looked up at render time so the\n  // cache never holds stale state objects.\n  private _cachedActiveElements: ForesightElement[] = []\n  private _cachedInactiveElements: ForesightElement[] = []\n  private _elementsCacheDirty = true\n\n  constructor() {\n    super()\n    this.sortOrder = ForesightDevtools.instance.devtoolsSettings.sortElementList\n    this.sortDropdown = [\n      {\n        value: \"visibility\",\n        label: \"Visibility\",\n        title: \"Sort by Visibility\",\n        icon: VISIBILITY_SVG,\n      },\n      {\n        value: \"documentOrder\",\n        label: \"Document Order\",\n        title: \"Sort by Document Order\",\n        icon: DOCUMENT_SVG,\n      },\n      {\n        value: \"insertionOrder\",\n        label: \"Insertion Order\",\n        title: \"Sort by Insertion Order\",\n        icon: INSERTION_SVG,\n      },\n    ]\n  }\n\n  private handleSortChange = (value: string): void => {\n    this.sortOrder = value as SortElementList\n    this._elementsCacheDirty = true\n  }\n\n  private handleElementToggle = (elementId: string): void => {\n    const newExpandedElementIds = new Set(this.expandedElementIds)\n    if (newExpandedElementIds.has(elementId)) {\n      newExpandedElementIds.delete(elementId)\n    } else {\n      newExpandedElementIds.add(elementId)\n    }\n\n    this.expandedElementIds = newExpandedElementIds\n  }\n\n  private _generateHitsChipTitle(hitCounts: CallbackHits): string {\n    const lines: string[] = []\n\n    // Header with total\n    lines.push(`Total Callback Hits: ${hitCounts.total}`)\n    lines.push(\"\")\n\n    // Desktop Strategy Section\n    const mouseTotal = hitCounts.mouse.trajectory + hitCounts.mouse.hover\n    const scrollTotal =\n      hitCounts.scroll.up + hitCounts.scroll.down + hitCounts.scroll.left + hitCounts.scroll.right\n    const tabTotal = hitCounts.tab.forwards + hitCounts.tab.reverse\n\n    lines.push(\"Desktop Strategy\")\n    if (mouseTotal > 0) {\n      lines.push(\n        `   Mouse (${mouseTotal}): ${hitCounts.mouse.trajectory} trajectory, ${hitCounts.mouse.hover} hover`\n      )\n    } else {\n      lines.push(\"   Mouse: No hits\")\n    }\n\n    if (scrollTotal > 0) {\n      lines.push(\n        `   Scroll (${scrollTotal}): Up ${hitCounts.scroll.up}, Down ${hitCounts.scroll.down}, Left ${hitCounts.scroll.left}, Right ${hitCounts.scroll.right}`\n      )\n    } else {\n      lines.push(\"   Scroll: No hits\")\n    }\n\n    if (tabTotal > 0) {\n      lines.push(\n        `   Tab (${tabTotal}): ${hitCounts.tab.forwards} forward, ${hitCounts.tab.reverse} reverse`\n      )\n    } else {\n      lines.push(\"   Tab: No hits\")\n    }\n\n    lines.push(\"\")\n\n    // Touch Strategy Section\n    const touchStrategyTotal = hitCounts.touch + hitCounts.viewport\n    lines.push(\"Touch Strategy\")\n    if (hitCounts.touch > 0) {\n      lines.push(`   Touch Start: ${hitCounts.touch}`)\n    } else {\n      lines.push(\"   Touch Start: No hits\")\n    }\n\n    if (hitCounts.viewport > 0) {\n      lines.push(`   Viewport Enter: ${hitCounts.viewport}`)\n    } else {\n      lines.push(\"   Viewport Enter: No hits\")\n    }\n\n    if (touchStrategyTotal === 0 && mouseTotal + scrollTotal + tabTotal === 0) {\n      lines.push(\"\")\n      lines.push(\"Interact with registered elements to see callback statistics\")\n    }\n\n    return lines.join(\"\\n\")\n  }\n\n  private _subscribeToElement(element: ForesightElement): void {\n    if (this._elementSubscriptions.has(element)) {\n      return\n    }\n\n    const unsubscribe = ForesightManager.instance.subscribeToElement(element, () => {\n      const state = ForesightManager.instance.registeredElements.get(element)\n      if (!state || !state.isRegistered) {\n        return\n      }\n\n      this._pendingElementUpdates.set(element, state)\n      this._scheduleDebouncedUpdate()\n    })\n\n    if (unsubscribe) {\n      this._elementSubscriptions.set(element, unsubscribe)\n    }\n  }\n\n  private _unsubscribeFromElement(element: ForesightElement): void {\n    this._elementSubscriptions.get(element)?.()\n    this._elementSubscriptions.delete(element)\n  }\n\n  connectedCallback() {\n    super.connectedCallback()\n    this._abortController = new AbortController()\n    const { signal } = this._abortController\n    this.updateElementListFromManager()\n\n    for (const element of this.elementListItems.keys()) {\n      this._subscribeToElement(element)\n    }\n\n    ForesightManager.instance.addEventListener(\n      \"elementRegistered\",\n      (e: ElementRegisteredEvent) => {\n        this.elementListItems.set(e.element, e.state)\n        this._subscribeToElement(e.element)\n        this._elementsCacheDirty = true\n        this.requestUpdate()\n      },\n      { signal }\n    )\n\n    ForesightManager.instance.addEventListener(\n      \"elementUnregistered\",\n      (e: ElementUnregisteredEvent) => {\n        this._unsubscribeFromElement(e.element)\n        this.elementListItems.delete(e.element)\n        // Drop any queued update so a later debounce flush can't re-add it.\n        this._pendingElementUpdates.delete(e.element)\n        if (!this.elementListItems.size) {\n          this.noContentMessage = \"No Elements Registered To The Foresight Manager\"\n        }\n\n        this._elementsCacheDirty = true\n        this.requestUpdate()\n      },\n      { signal }\n    )\n\n    ForesightManager.instance.addEventListener(\n      \"callbackInvoked\",\n      (e: CallbackInvokedEvent) => {\n        this._pendingElementUpdates.set(e.element, e.state)\n        this._scheduleDebouncedUpdate()\n      },\n      { signal }\n    )\n\n    // The manager has already updated its global hit counters; just re-render.\n    ForesightManager.instance.addEventListener(\n      \"callbackCompleted\",\n      () => {\n        this.requestUpdate()\n      },\n      { signal }\n    )\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    this._abortController?.abort()\n    this._abortController = null\n\n    for (const unsub of this._elementSubscriptions.values()) {\n      unsub()\n    }\n    this._elementSubscriptions.clear()\n\n    if (this._updateDebounceId !== null) {\n      clearTimeout(this._updateDebounceId)\n      this._updateDebounceId = null\n    }\n\n    this._pendingElementUpdates.clear()\n  }\n\n  private _scheduleDebouncedUpdate(): void {\n    // Already scheduled, let the pending timeout handle it\n    if (this._updateDebounceId !== null) {\n      return\n    }\n\n    // Debounce updates to ~60fps (16ms) to batch rapid updates\n    this._updateDebounceId = setTimeout(() => {\n      this._updateDebounceId = null\n      this._flushPendingUpdates()\n    }, 16)\n  }\n\n  private _flushPendingUpdates(): void {\n    if (this._pendingElementUpdates.size === 0) {\n      return\n    }\n\n    // Apply all pending updates in one batch; the sort order only depends on\n    // membership, isActive and isIntersectingWithViewport.\n    for (const [element, state] of this._pendingElementUpdates) {\n      const previous = this.elementListItems.get(element)\n      if (\n        !previous ||\n        previous.isActive !== state.isActive ||\n        previous.isIntersectingWithViewport !== state.isIntersectingWithViewport\n      ) {\n        this._elementsCacheDirty = true\n      }\n\n      this.elementListItems.set(element, state)\n    }\n    this._pendingElementUpdates.clear()\n    this.requestUpdate()\n  }\n\n  private updateElementListFromManager() {\n    this.elementListItems = new Map(ForesightManager.instance.registeredElements)\n    this._elementsCacheDirty = true\n  }\n\n  private getSortedElements(): ElementListEntry[] {\n    const entries: ElementListEntry[] = Array.from(this.elementListItems, ([element, state]) => ({\n      element,\n      state,\n    }))\n\n    switch (this.sortOrder) {\n      case \"insertionOrder\":\n        return entries\n      case \"documentOrder\":\n        return entries.sort(this.sortByDocumentPosition)\n      case \"visibility\":\n        return entries.sort((a, b) => {\n          if (a.state.isIntersectingWithViewport !== b.state.isIntersectingWithViewport) {\n            return a.state.isIntersectingWithViewport ? -1 : 1\n          }\n\n          return this.sortByDocumentPosition(a, b)\n        })\n      default:\n        this.sortOrder satisfies never\n\n        return entries\n    }\n  }\n\n  private _recomputeElementsCache(): void {\n    if (!this._elementsCacheDirty) {\n      return\n    }\n\n    const active: ForesightElement[] = []\n    const inactive: ForesightElement[] = []\n    for (const entry of this.getSortedElements()) {\n      // Disabled elements are inactive too; their reason is shown as a badge on the\n      // row rather than a separate section.\n      if (entry.state.isActive) {\n        active.push(entry.element)\n      } else {\n        inactive.push(entry.element)\n      }\n    }\n    this._cachedActiveElements = active\n    this._cachedInactiveElements = inactive\n    this._elementsCacheDirty = false\n  }\n\n  private get activeElements(): ForesightElement[] {\n    this._recomputeElementsCache()\n\n    return this._cachedActiveElements\n  }\n\n  private get inactiveElements(): ForesightElement[] {\n    this._recomputeElementsCache()\n\n    return this._cachedInactiveElements\n  }\n\n  private sortByDocumentPosition = (a: ElementListEntry, b: ElementListEntry) => {\n    const position = a.element.compareDocumentPosition(b.element)\n    if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n      return -1\n    }\n\n    if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n      return 1\n    }\n\n    return 0\n  }\n\n  private renderElementSection(\n    label: string,\n    modifierClass: string,\n    elements: ForesightElement[],\n    collapsed: boolean,\n    toggleCollapsed: () => void\n  ) {\n    if (elements.length === 0) {\n      return \"\"\n    }\n\n    return html`\n      <div class=\"element-section\">\n        <h3\n          class=\"section-header ${modifierClass} ${collapsed ? \"collapsed\" : \"\"}\"\n          @click=${toggleCollapsed}\n        >\n          ${label} (${elements.length})\n        </h3>\n        ${!collapsed\n          ? repeat(\n              elements,\n              element => this.elementListItems.get(element)?.id ?? \"\",\n              element => {\n                const state = this.elementListItems.get(element)\n                if (!state) {\n                  return \"\"\n                }\n\n                return html`\n                  <single-element\n                    .element=${element}\n                    .state=${state}\n                    .isExpanded=${this.expandedElementIds.has(state.id)}\n                    .onToggle=${this.handleElementToggle}\n                  >\n                  </single-element>\n                `\n              }\n            )\n          : \"\"}\n      </div>\n    `\n  }\n\n  render() {\n    return html`\n      <tab-header>\n        <div slot=\"chips\" class=\"chips-container\">\n          <chip-element title=\"${this._generateHitsChipTitle(this.hitCount)}\">\n            ${this.hitCount.total} hits\n          </chip-element>\n        </div>\n        <div slot=\"actions\">\n          <single-select-dropdown\n            .dropdownOptions=\"${this.sortDropdown}\"\n            .selectedOptionValue=\"${this.sortOrder}\"\n            .onSelectionChange=\"${this.handleSortChange}\"\n          ></single-select-dropdown>\n        </div>\n      </tab-header>\n      <tab-content\n        .noContentMessage=${this.noContentMessage}\n        .hasContent=${!!this.elementListItems.size}\n      >\n        ${this.renderElementSection(\n          \"Active Elements\",\n          \"active\",\n          this.activeElements,\n          this.activeSectionCollapsed,\n          () => {\n            this.activeSectionCollapsed = !this.activeSectionCollapsed\n          }\n        )}\n        ${this.renderElementSection(\n          \"Inactive Elements\",\n          \"inactive\",\n          this.inactiveElements,\n          this.inactiveSectionCollapsed,\n          () => {\n            this.inactiveSectionCollapsed = !this.inactiveSectionCollapsed\n          }\n        )}\n      </tab-content>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"element-tab\": ElementTab\n  }\n}\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 { 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\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 type {\n  CallbackHits,\n  CallbackHitType,\n  ForesightElementState,\n  ForesightEvent,\n  ForesightEventMap,\n  ForesightManagerData,\n  ForesightManagerSettings,\n  HitSlop,\n  ForesightPoint,\n  ScrollDirection,\n  UpdatedManagerSetting,\n} from \"js.foresight\"\n\ntype SerializedEventType = ForesightEvent | \"serializationError\" | \"managerDataPayload\"\n\nexport type ControlPanelLogEntry = {\n  eventData: SerializedEventData\n}\n\ninterface PayloadBase {\n  type: SerializedEventType\n  localizedTimestamp: string\n  summary: string // The text / data you see as preview on the right of the event (keep this short)\n  logId: string\n}\n\ninterface ElementRegisteredPayload extends PayloadBase {\n  type: \"elementRegistered\"\n  name: string\n  id: string\n  state: ForesightElementState\n  hitslop: HitSlop\n  meta: Record<string, unknown>\n}\n\ninterface ElementUnregisteredEvent extends PayloadBase {\n  type: \"elementUnregistered\"\n  name: string\n  id: string\n  state: ForesightElementState\n  meta: Record<string, unknown>\n  wasLastRegisteredElement: boolean\n}\n\ninterface CallbackInvokedPayload extends PayloadBase {\n  type: \"callbackInvoked\"\n  name: string\n  hitType: CallbackHitType\n  state: ForesightElementState\n  meta: Record<string, unknown>\n}\n\ninterface CallbackCompletedPayload extends PayloadBase {\n  type: \"callbackCompleted\"\n  elapsed: string\n  name: string\n  hitType: CallbackHitType\n  status: \"success\" | \"error\" | undefined\n  errorMessage: string | undefined | null\n  state: ForesightElementState\n  wasLastActiveElement: boolean\n  meta: Record<string, unknown>\n}\n\ninterface MouseTrajectoryUpdatePayload extends PayloadBase {\n  type: \"mouseTrajectoryUpdate\"\n  currentPoint: ForesightPoint\n  predictedPoint: ForesightPoint\n  positionCount: number\n  mousePredictionEnabled: boolean\n}\n\ninterface ScrollTrajectoryUpdatePayload extends PayloadBase {\n  type: \"scrollTrajectoryUpdate\"\n  currentPoint: ForesightPoint\n  predictedPoint: ForesightPoint\n  scrollDirection: ScrollDirection\n}\n\ninterface ManagerSettingsChangedPayload extends PayloadBase {\n  type: \"managerSettingsChanged\"\n  globalSettings: ForesightManagerSettings\n  settingsChanged: UpdatedManagerSetting[]\n}\n\ninterface DeviceStrategyChangedPayload extends PayloadBase {\n  type: \"deviceStrategyChanged\"\n  oldStrategy: string\n  newStrategy: string\n}\n\ninterface SerializationErrorPayload extends PayloadBase {\n  type: \"serializationError\"\n  error: \"Failed to serialize event data\"\n  errorMessage: string\n}\n\ninterface ManagerDataPayload extends PayloadBase {\n  type: \"managerDataPayload\"\n  warning: string\n  globalCallbackHits: CallbackHits\n  eventListenerCount: Record<string, number>\n  managerSettings: ForesightManagerSettings\n  registeredElements: Array<ForesightElementState & { elementInfo: string }>\n  loadedModules: ForesightManagerData[\"loadedModules\"]\n}\n\nexport type SerializedEventData =\n  | ElementRegisteredPayload\n  | ElementUnregisteredEvent\n  | CallbackInvokedPayload\n  | CallbackCompletedPayload\n  | MouseTrajectoryUpdatePayload\n  | ScrollTrajectoryUpdatePayload\n  | ManagerSettingsChangedPayload\n  | DeviceStrategyChangedPayload\n  | ManagerDataPayload\n  | SerializationErrorPayload\n\nexport const safeSerializeManagerData = (\n  data: ForesightManagerData,\n  logId: string\n): ManagerDataPayload => {\n  const eventListeners: Record<string, number> = {}\n  data.eventListeners.forEach((listeners, eventType) => {\n    eventListeners[eventType] = listeners.size\n  })\n  const registeredElements: Array<ForesightElementState & { elementInfo: string }> = []\n  data.registeredElements.forEach((state, element) => {\n    registeredElements.push({\n      ...state,\n      elementInfo: `${element.id ? `#${element.id}` : \"\"}${\n        element.className ? `.${element.className.replace(/\\s+/g, \".\")}` : \"\"\n      }`,\n    })\n  })\n\n  return {\n    type: \"managerDataPayload\",\n    warning: \"this is a lot easier to view in the console\",\n    logId: logId,\n    globalCallbackHits: data.globalCallbackHits,\n    localizedTimestamp: new Date().toLocaleTimeString(),\n    eventListenerCount: eventListeners,\n    managerSettings: data.globalSettings,\n    registeredElements: registeredElements,\n    loadedModules: data.loadedModules,\n    summary: `${registeredElements.length} elements, ${\n      Object.values(eventListeners).flat().length\n    } listeners,\n  ${data.globalCallbackHits.total} hits`,\n  }\n}\n\n/**\n * Safely serializes ForesightJS event data into a JSON-serializable format\n * for logging and debugging purposes.\n *\n * @param event - The ForesightJS event to serialize\n * @returns Serialized event data or error object if serialization fails\n */\nexport const safeSerializeEventData = <K extends keyof ForesightEventMap>(\n  event: ForesightEventMap[K],\n  logId: string\n): SerializedEventData => {\n  try {\n    // For different event types, extract only the relevant serializable data\n    switch (event.type) {\n      case \"elementRegistered\":\n        return {\n          type: \"elementRegistered\",\n          name: event.state.name,\n          id: event.element.id || \"\",\n          state: event.state,\n          hitslop: event.state.hitSlop,\n          localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\n          meta: event.state.meta,\n          logId: logId,\n          summary:\n            event.state.registerCount > 1\n              ? `${event.state.name} - ${getOrdinalSuffix(event.state.registerCount)} time`\n              : event.state.name,\n        }\n      case \"elementUnregistered\":\n        return {\n          type: \"elementUnregistered\",\n          name: event.state.name,\n          id: event.element.id || \"\",\n          meta: event.state.meta,\n          state: event.state,\n          wasLastRegisteredElement: event.wasLastRegisteredElement,\n          localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\n          logId: logId,\n          summary: `${event.state.name} - ${event.unregisterReason}`,\n        }\n      case \"callbackInvoked\":\n        return {\n          type: \"callbackInvoked\",\n          name: event.state.name,\n          hitType: event.hitType,\n          state: event.state,\n          meta: event.state.meta,\n          localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\n          logId: logId,\n          summary: `${event.state.name} - ${event.hitType.kind}`,\n        }\n      case \"callbackCompleted\": {\n        const elapsed = formatElapsed(event.state.durationMs || 0)\n\n        return {\n          type: \"callbackCompleted\",\n          name: event.state.name,\n          hitType: event.hitType,\n          state: event.state,\n          meta: event.state.meta,\n          wasLastActiveElement: event.wasLastActiveElement,\n          elapsed: elapsed,\n          localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\n          logId: logId,\n          status: event.state.status,\n          errorMessage: event.state.error,\n          summary: `${event.state.name} - ${elapsed}`,\n        }\n      }\n      case \"mouseTrajectoryUpdate\":\n        return {\n          type: \"mouseTrajectoryUpdate\",\n          currentPoint: event.trajectoryPositions?.currentPoint,\n          predictedPoint: event.trajectoryPositions?.predictedPoint,\n          positionCount: event.trajectoryPositions?.positions?.length || 0,\n          mousePredictionEnabled: event.predictionEnabled,\n          localizedTimestamp: new Date().toLocaleTimeString(),\n          logId: logId,\n          summary: \"\",\n        }\n      case \"scrollTrajectoryUpdate\":\n        return {\n          type: \"scrollTrajectoryUpdate\",\n          currentPoint: event.currentPoint,\n          predictedPoint: event.predictedPoint,\n          scrollDirection: event.scrollDirection,\n          localizedTimestamp: new Date().toLocaleTimeString(),\n          logId: logId,\n          summary: event.scrollDirection,\n        }\n      case \"managerSettingsChanged\":\n        return {\n          type: \"managerSettingsChanged\",\n          globalSettings: event.managerData?.globalSettings || {},\n          settingsChanged: event.updatedSettings,\n          localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\n          logId: logId,\n          summary: event.updatedSettings.map(setting => setting.setting).join(\", \"),\n        }\n      case \"deviceStrategyChanged\":\n        return {\n          type: \"deviceStrategyChanged\",\n          oldStrategy: event.oldStrategy,\n          newStrategy: event.newStrategy,\n          localizedTimestamp: new Date(event.timestamp).toLocaleTimeString(),\n          logId: logId,\n          summary: `${event.oldStrategy} → ${event.newStrategy}`,\n        }\n      default: {\n        const _exhaustiveCheck: never = event\n\n        return {\n          type: \"serializationError\",\n          error: \"Failed to serialize event data\",\n          errorMessage: JSON.stringify(_exhaustiveCheck),\n          localizedTimestamp: new Date().toLocaleTimeString(),\n          logId: logId,\n          summary: \"\",\n        }\n      }\n    }\n  } catch (error) {\n    // Fallback if serialization fails\n    return {\n      type: \"serializationError\",\n      error: \"Failed to serialize event data\",\n      localizedTimestamp: new Date().toLocaleTimeString(),\n      errorMessage: error instanceof Error ? error.message : String(error),\n      logId: logId,\n      summary: \"\",\n    }\n  }\n}\n\n/**\n * Formats a duration in milliseconds into seconds.\n *\n * @param {number} ms  Duration in milliseconds\n * @returns {string}   Duration in seconds, e.g. “0.50 s” or “1.23 s”\n */\nconst formatElapsed = (ms: number): string => {\n  return `${(ms / 1000).toFixed(4)} s`\n}\n\nconst getOrdinalSuffix = (n: number): string => {\n  const lastTwo = n % 100\n  if (lastTwo >= 11 && lastTwo <= 13) {\n    return `${n}th`\n  }\n\n  switch (n % 10) {\n    case 1:\n      return `${n}st`\n    case 2:\n      return `${n}nd`\n    case 3:\n      return `${n}rd`\n    default:\n      return `${n}th`\n  }\n}\n","import { ForesightManager } from \"js.foresight\"\nimport type { ForesightEvent, ForesightEventMap } from \"js.foresight\"\nimport {\n  safeSerializeEventData,\n  safeSerializeManagerData,\n  type SerializedEventData,\n} from \"../../../helpers/safeSerializeEventData\"\nimport type { LogEvents, LoggingLocations } from \"../../../types/types\"\nimport { ForesightDevtools } from \"../../foresight-devtools\"\n\nexport const MAX_LOGS = 100\n\nexport const EVENT_COLORS: Record<ForesightEvent, string> = {\n  elementRegistered: \"#2196f3\",\n  callbackInvoked: \"#00bcd4\",\n  callbackCompleted: \"#4caf50\",\n  elementUnregistered: \"#ff9800\",\n  managerSettingsChanged: \"#f44336\",\n  mouseTrajectoryUpdate: \"#78909c\",\n  scrollTrajectoryUpdate: \"#607d8b\",\n  deviceStrategyChanged: \"#9c27b0\",\n}\n\n/**\n * Collects manager events into a log buffer outside the Lit tree, so logs\n * keep accumulating while the log tab is unmounted (panel minimized or\n * another tab active) and survive remounts.\n */\nexport class EventLogStore {\n  logs: Array<SerializedEventData> = []\n  logLocation: LoggingLocations\n  eventsEnabled: LogEvents\n  private logIdCounter: number = 0\n  private changeListeners: Set<() => void> = new Set()\n  private managerListeners: Map<\n    ForesightEvent,\n    (event: ForesightEventMap[ForesightEvent]) => void\n  > = new Map()\n  private isAttached: boolean = false\n\n  constructor() {\n    const {\n      logging: { logLocation, ...eventFlags },\n    } = ForesightDevtools.instance.devtoolsSettings\n    this.logLocation = logLocation\n    this.eventsEnabled = eventFlags\n  }\n\n  /** Start listening to manager events. Idempotent; called when the control panel mounts. */\n  attach(): void {\n    if (this.isAttached) {\n      return\n    }\n\n    this.isAttached = true\n    for (const [eventType, enabled] of Object.entries(this.eventsEnabled)) {\n      if (enabled) {\n        this.addManagerListener(eventType as ForesightEvent)\n      }\n    }\n  }\n\n  /** Stop listening to manager events; the collected logs are kept. */\n  detach(): void {\n    this.managerListeners.forEach((handler, eventType) => {\n      ForesightManager.instance.removeEventListener(eventType, handler)\n    })\n    this.managerListeners.clear()\n    this.isAttached = false\n  }\n\n  subscribe(listener: () => void): () => void {\n    this.changeListeners.add(listener)\n\n    return () => this.changeListeners.delete(listener)\n  }\n\n  setLogLocation(location: LoggingLocations): void {\n    this.logLocation = location\n    this.notify()\n  }\n\n  setEventEnabled(eventType: ForesightEvent, enabled: boolean): void {\n    this.eventsEnabled = {\n      ...this.eventsEnabled,\n      [eventType]: enabled,\n    }\n    if (this.isAttached) {\n      if (enabled) {\n        this.addManagerListener(eventType)\n      } else {\n        this.removeManagerListener(eventType)\n      }\n    }\n\n    this.notify()\n  }\n\n  clear(): void {\n    this.logs = []\n    this.notify()\n  }\n\n  logManagerData(): void {\n    if (this.logLocation === \"none\") {\n      return\n    }\n\n    if (this.logLocation === \"console\" || this.logLocation === \"both\") {\n      console.log(ForesightManager.instance.getManagerData)\n    }\n\n    if (this.logLocation === \"controlPanel\" || this.logLocation === \"both\") {\n      this.addLog(\n        safeSerializeManagerData(\n          ForesightManager.instance.getManagerData,\n          (++this.logIdCounter).toString()\n        )\n      )\n    }\n  }\n\n  private addManagerListener(eventType: ForesightEvent): void {\n    if (this.managerListeners.has(eventType)) {\n      return\n    }\n\n    const handler = (event: ForesightEventMap[typeof eventType]) => {\n      this.handleEvent(eventType, event)\n    }\n    this.managerListeners.set(eventType, handler)\n    ForesightManager.instance.addEventListener(eventType, handler)\n  }\n\n  private removeManagerListener(eventType: ForesightEvent): void {\n    const handler = this.managerListeners.get(eventType)\n    if (handler) {\n      ForesightManager.instance.removeEventListener(eventType, handler)\n      this.managerListeners.delete(eventType)\n    }\n  }\n\n  private handleEvent<K extends ForesightEvent>(eventType: K, event: ForesightEventMap[K]): void {\n    if (this.logLocation === \"none\") {\n      return\n    }\n\n    if (this.logLocation === \"console\" || this.logLocation === \"both\") {\n      const color = EVENT_COLORS[eventType] || \"#ffffff\"\n      console.log(`%c[ForesightJS] ${eventType}`, `color: ${color}; font-weight: bold;`, event)\n    }\n\n    if (this.logLocation === \"controlPanel\" || this.logLocation === \"both\") {\n      const log = safeSerializeEventData(event, (++this.logIdCounter).toString())\n      if (log.type === \"serializationError\") {\n        console.error(log.error, log.errorMessage)\n\n        return\n      }\n\n      this.addLog(log)\n    }\n  }\n\n  private addLog(log: SerializedEventData): void {\n    this.logs.unshift(log)\n    if (this.logs.length > MAX_LOGS) {\n      this.logs.pop()\n    }\n\n    this.notify()\n  }\n\n  private notify(): void {\n    for (const listener of this.changeListeners) {\n      listener()\n    }\n  }\n}\n\nlet storeInstance: EventLogStore | null = null\n\n/** Lazily created so importing this module doesn't initialize the devtools. */\nexport const getEventLogStore = (): EventLogStore => {\n  return (storeInstance ??= new EventLogStore())\n}\n","import { LitElement, html, css, PropertyValues } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\nimport type { SerializedEventData } from \"../../../helpers/safeSerializeEventData\"\nimport { EVENT_COLORS } from \"./log-store\"\nimport \"../base-tab/expandable-item\"\n\n@customElement(\"single-log\")\nexport class SingleLog extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n        /*\n         * The background color is now driven by a CSS variable.\n         * This allows us to set it from TypeScript without touching the class.\n         */\n        background-color: var(--log-background-color, transparent);\n      }\n\n      .log-time {\n        color: #b8b8b8;\n        font-weight: 500;\n        font-size: 10px;\n        font-family: \"SF Mono\", \"Monaco\", \"Consolas\", \"Liberation Mono\", \"Courier New\", monospace;\n        min-width: 70px;\n        max-width: 70px;\n        text-align: left;\n        letter-spacing: 0.02em;\n        flex-shrink: 0;\n      }\n\n      .log-type-badge {\n        display: inline-flex;\n        align-items: center;\n        font-size: 10px;\n        font-weight: 600;\n        text-transform: uppercase;\n        letter-spacing: 0.02em;\n        /* The color is driven by a CSS variable set in updated() */\n        color: var(--log-color, #b0c4de);\n        min-width: 90px;\n        max-width: 90px;\n        white-space: nowrap;\n        text-align: left;\n        margin-left: 10px;\n        flex-shrink: 0;\n      }\n\n      .log-summary {\n        flex: 1;\n        color: #ccc;\n        font-size: 11px;\n        opacity: 0.9;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        margin-left: 6px;\n        font-weight: 400;\n        min-width: 0;\n      }\n\n      .log-content {\n        display: flex;\n        align-items: center;\n        width: 100%;\n        min-width: 0;\n      }\n\n      /*\n       * The :host(.error-status) selector is no longer needed,\n       * as all styling is now handled by setting CSS variables below.\n       * This makes the component's styling more self-contained.\n       */\n    `,\n  ]\n\n  @property({ attribute: false })\n  log: SerializedEventData\n\n  constructor(log: SerializedEventData) {\n    super()\n    this.log = log\n  }\n\n  @property({ type: Boolean })\n  isExpanded: boolean = false\n\n  @property()\n  onToggle: ((logId: string) => void) | undefined\n\n  protected updated(changedProperties: PropertyValues<this>) {\n    // Only run this logic if the `log` property has changed.\n    if (changedProperties.has(\"log\") && this.log) {\n      const log = this.log\n      const isError = log.type === \"callbackCompleted\" && \"status\" in log && log.status === \"error\"\n\n      // Instead of toggling a class, we now set CSS custom properties\n      // directly on the host element's style. This is an encapsulated\n      // pattern that does not interfere with external classes.\n      const color = isError ? \"#f44336\" : this.getLogTypeColor(log.type)\n      const bgColor = isError ? \"rgba(244, 67, 54, 0.1)\" : \"transparent\"\n\n      this.style.setProperty(\"--log-color\", color)\n      this.style.setProperty(\"--log-background-color\", bgColor)\n    }\n  }\n\n  private serializeLogDataWithoutSummary(log: SerializedEventData): string {\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    const { summary: _, ...rest } = log\n\n    return JSON.stringify(rest, null, 2)\n  }\n\n  private getLogTypeColor(logType: string): string {\n    return (EVENT_COLORS as Record<string, string>)[logType] || \"#555\"\n  }\n\n  private getEventDisplayName(eventType: string): string {\n    const eventNames: Record<string, string> = {\n      elementRegistered: \"Registered\",\n      elementUnregistered: \"Unregistered\",\n      callbackInvoked: \"Invoked\",\n      callbackCompleted: \"Completed\",\n      mouseTrajectoryUpdate: \"Mouse\",\n      scrollTrajectoryUpdate: \"Scroll\",\n      managerSettingsChanged: \"Settings\",\n      managerDataPayload: \"ManagerData\",\n      deviceStrategyChanged: \"Strategy\",\n    }\n\n    return eventNames[eventType] || eventType\n  }\n\n  private truncateLogSummary(summary: string, maxLength: number = 50): string {\n    if (summary.length <= maxLength) {\n      return summary\n    }\n\n    return summary.substring(0, maxLength) + \"...\"\n  }\n\n  render() {\n    const log = this.log\n    const isError = log.type === \"callbackCompleted\" && \"status\" in log && log.status === \"error\"\n\n    // The border color for the child component is still fine to calculate here.\n    const borderColor = isError ? \"#f44336\" : this.getLogTypeColor(log.type)\n\n    return html`\n      <expandable-item\n        .borderColor=${borderColor}\n        .itemId=${log.logId}\n        .isExpanded=${this.isExpanded}\n        .onToggle=${this.onToggle}\n      >\n        <div slot=\"content\">\n          <div class=\"log-content\">\n            <span class=\"log-time\">${log.localizedTimestamp}</span>\n            <span class=\"log-type-badge\">${this.getEventDisplayName(log.type)}</span>\n            <span class=\"log-summary\">${this.truncateLogSummary(log.summary)}</span>\n          </div>\n        </div>\n        <div slot=\"details\">${this.serializeLogDataWithoutSummary(log)}</div>\n      </expandable-item>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"single-log\": SingleLog\n  }\n}\n","import type { ForesightEvent } from \"js.foresight\"\nimport { LitElement, css, html } from \"lit\"\nimport { customElement, property, state } from \"lit/decorators.js\"\nimport { repeat } from \"lit/directives/repeat.js\"\nimport {\n  BOTH_SVG,\n  CLEAR_SVG,\n  CONSOLE_SVG,\n  CONTROL_PANEL_SVG,\n  FILTER_SVG,\n  NONE_SVG,\n  STATE_SVG,\n  WARNING_SVG,\n} from \"../../../svg/svg-icons\"\nimport type { LoggingLocations } from \"../../../types/types\"\nimport \"../base-tab/chip\"\nimport \"../base-tab/tab-content\"\nimport \"../base-tab/tab-header\"\nimport \"../copy-icon/copy-icon\"\nimport \"../dropdown/multi-select-dropdown\"\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\nimport { getEventLogStore, MAX_LOGS } from \"./log-store\"\nimport \"./single-log\"\n\n@customElement(\"log-tab\")\nexport class LogTab extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n      }\n\n      .chips-container {\n        display: flex;\n        gap: 4px;\n      }\n\n      .single-button {\n        background: none;\n        border: none;\n        color: white;\n        cursor: pointer;\n        padding: 6px;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        transition: all 0.2s ease;\n        vertical-align: top;\n      }\n\n      .single-button svg {\n        width: 16px;\n        height: 16px;\n        stroke: white;\n        transition: stroke 0.2s;\n      }\n\n      .single-button:hover {\n        background-color: rgba(176, 196, 222, 0.1);\n      }\n\n      .single-button:hover svg {\n        stroke: #b0c4de;\n      }\n\n      .single-button:disabled {\n        opacity: 0.4;\n        cursor: not-allowed;\n      }\n\n      .single-button:disabled:hover {\n        background: none;\n      }\n\n      .single-button:disabled svg {\n        stroke: #666;\n      }\n\n      .no-items {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        height: 200px;\n        text-align: center;\n        font-family: \"Courier New\", monospace;\n        font-style: italic;\n        padding: 20px;\n        color: #999;\n      }\n\n      .warning-container {\n        background: none;\n        border: none;\n        color: #ffc107;\n        cursor: help;\n        padding: 6px;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        transition: all 0.2s ease;\n        vertical-align: top;\n      }\n\n      .warning-container svg {\n        width: 16px;\n        height: 16px;\n        stroke: #ffc107;\n        fill: none;\n        transition: stroke 0.2s;\n      }\n\n      .warning-container:hover {\n        background-color: rgba(255, 193, 7, 0.1);\n      }\n\n      .warning-container:hover svg {\n        stroke: #ffdc3e;\n      }\n    `,\n  ]\n\n  private store = getEventLogStore()\n  @state() private logDropdown: DropdownOption[]\n  @state() private filterDropdown: DropdownOption[]\n  @state() private expandedLogIds: Set<string> = new Set()\n\n  @property() noContentMessage: string = \"No logs available\"\n  private _unsubscribeStore: (() => void) | null = null\n\n  constructor() {\n    super()\n    this.logDropdown = [\n      {\n        value: \"controlPanel\",\n        label: \"Control Panel\",\n        title: \"Log only to the control panel\",\n        icon: CONTROL_PANEL_SVG,\n      },\n      {\n        value: \"console\",\n        label: \"Console\",\n        title: \"Log only to the console\",\n        icon: CONSOLE_SVG,\n      },\n      {\n        value: \"both\",\n        label: \"Both\",\n        title: \"Log to both the control panel and the console\",\n        icon: BOTH_SVG,\n      },\n      {\n        value: \"none\",\n        label: \"None\",\n        title: \"Dont log anywhere\",\n        icon: NONE_SVG,\n      },\n    ]\n\n    this.filterDropdown = [\n      {\n        value: \"elementRegistered\",\n        label: \"Element Registered\",\n        title: \"Show element registration events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"elementUnregistered\",\n        label: \"Element Unregistered\",\n        title: \"Show element unregistration events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"callbackInvoked\",\n        label: \"Callback Invoked\",\n        title: \"Show callback invoked events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"callbackCompleted\",\n        label: \"Callback Completed\",\n        title: \"Show callback completed events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"mouseTrajectoryUpdate\",\n        label: \"Mouse Trajectory Update\",\n        title: \"Show mouse trajectory update events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"scrollTrajectoryUpdate\",\n        label: \"Scroll Trajectory Update\",\n        title: \"Show scroll trajectory update events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"managerSettingsChanged\",\n        label: \"Manager Settings Changed\",\n        title: \"Show manager settings change events\",\n        icon: FILTER_SVG,\n      },\n      {\n        value: \"deviceStrategyChanged\",\n        label: \"Strategy Changed\",\n        title: \"Show strategy change events\",\n        icon: FILTER_SVG,\n      },\n    ]\n  }\n\n  private handleLogLocationChange = (value: string): void => {\n    this.store.setLogLocation(value as LoggingLocations)\n  }\n\n  private handleFilterChange = (changedEventType: string, isEnabled: boolean): void => {\n    this.store.setEventEnabled(changedEventType as ForesightEvent, isEnabled)\n  }\n\n  private getSelectedEventFilters(): string[] {\n    return Object.entries(this.store.eventsEnabled)\n      .filter(([, enabled]) => enabled)\n      .map(([eventType]) => eventType)\n  }\n\n  //TODO check if devtools is open, but is harder than I thought. Look into later\n  private shouldShowPerformanceWarning(): boolean {\n    const { logLocation, eventsEnabled } = this.store\n    const hasConsoleOutput = logLocation === \"console\" || logLocation === \"both\"\n    const hasFrequentEvents =\n      eventsEnabled.mouseTrajectoryUpdate || eventsEnabled.scrollTrajectoryUpdate\n\n    return hasConsoleOutput && hasFrequentEvents\n  }\n\n  private getNoLogsMessage(): string {\n    const enabledCount = Object.values(this.store.eventsEnabled).filter(Boolean).length\n    if (enabledCount === 0) {\n      return \"Logging for all events is turned off\"\n    }\n\n    if (this.store.logLocation === \"console\") {\n      return \"No logs to display. Logging location is set to console - check browser console for events.\"\n    }\n\n    if (this.store.logLocation === \"none\") {\n      return \"No logs to display. Logging location is set to none\"\n    }\n\n    return \"Interact with Foresight to generate events.\"\n  }\n\n  private handleLogToggle = (logId: string): void => {\n    const newExpandedLogIds = new Set(this.expandedLogIds)\n    if (newExpandedLogIds.has(logId)) {\n      newExpandedLogIds.delete(logId)\n    } else {\n      newExpandedLogIds.add(logId)\n    }\n\n    this.expandedLogIds = newExpandedLogIds\n  }\n\n  private clearLogs(): void {\n    this.store.clear()\n    this.expandedLogIds.clear()\n    this.noContentMessage = \"Logs cleared\"\n  }\n\n  private logManagerData = (): void => {\n    this.store.logManagerData()\n  }\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    this._unsubscribeStore = this.store.subscribe(() => this.requestUpdate())\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n    this._unsubscribeStore?.()\n    this._unsubscribeStore = null\n  }\n\n  render() {\n    const logs = this.store.logs\n\n    return html`\n      <tab-header>\n        <div slot=\"chips\" class=\"chips-container\">\n          <chip-element title=\"Number of logged events (Max ${MAX_LOGS})\">\n            ${logs.length} events\n          </chip-element>\n        </div>\n        <div slot=\"actions\">\n          ${this.shouldShowPerformanceWarning()\n            ? html`\n                <div\n                  class=\"warning-container\"\n                  title=\"Console logging can be slow with frequent trajectory events.\nConsider using 'Control Panel' only for better performance.\"\n                >\n                  ${WARNING_SVG}\n                </div>\n              `\n            : \"\"}\n          <single-select-dropdown\n            .dropdownOptions=\"${this.logDropdown}\"\n            .selectedOptionValue=\"${this.store.logLocation}\"\n            .onSelectionChange=\"${this.handleLogLocationChange}\"\n          ></single-select-dropdown>\n\n          <multi-select-dropdown\n            .dropdownOptions=\"${this.filterDropdown}\"\n            .selectedValues=\"${this.getSelectedEventFilters()}\"\n            .onSelectionChange=\"${this.handleFilterChange}\"\n          ></multi-select-dropdown>\n          <button\n            class=\"single-button\"\n            title=\"Log the state from the manager\"\n            @click=\"${this.logManagerData}\"\n          >\n            ${STATE_SVG}\n          </button>\n          <button\n            class=\"single-button\"\n            title=\"Clear all logs\"\n            ?disabled=\"${logs.length === 0}\"\n            @click=\"${this.clearLogs}\"\n          >\n            ${CLEAR_SVG}\n          </button>\n        </div>\n      </tab-header>\n      <tab-content .noContentMessage=${this.noContentMessage} .hasContent=${!!logs.length}>\n        ${logs.length === 0\n          ? html`<div class=\"no-items\">${this.getNoLogsMessage()}</div>`\n          : repeat(\n              logs,\n              log => log.logId,\n              log => html`\n                <single-log\n                  .log=${log}\n                  .isExpanded=${this.expandedLogIds.has(log.logId)}\n                  .onToggle=${this.handleLogToggle}\n                ></single-log>\n              `\n            )}\n      </tab-content>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"log-tab\": LogTab\n  }\n}\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\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        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 } from \"lit\"\nimport { customElement, property } from \"lit/decorators.js\"\n\nimport \"./setting-item\"\nimport { ForesightManager, type ForesightManagerSettings } from \"js.foresight\"\nimport type { DevtoolsSettings, ShowKey } from \"../../../../types/types\"\n\ntype ShowSettingKey = `show.${ShowKey}`\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:\n    | keyof ForesightManagerSettings\n    | keyof DevtoolsSettings\n    | ShowSettingKey = \"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 (String(this.setting).startsWith(\"show.\")) {\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, 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 type {\n  ForesightManagerSettings,\n  TouchDeviceStrategy,\n  MinimumConnectionType,\n  UpdatedManagerSetting,\n} from \"js.foresight\"\nimport { ForesightManager } from \"js.foresight\"\nimport { css, html, LitElement } from \"lit\"\nimport { customElement, state } from \"lit/decorators.js\"\n\nimport {\n  SHOW_KEYS,\n  type Corner,\n  type DevtoolsSettings,\n  type ShowKey,\n  type ShowSettings,\n} from \"../../../types/types\"\nimport {\n  MAX_POSITION_HISTORY_SIZE,\n  MAX_SCROLL_MARGIN,\n  MAX_TAB_OFFSET,\n  MAX_TRAJECTORY_PREDICTION_TIME,\n  MIN_POSITION_HISTORY_SIZE,\n  MIN_SCROLL_MARGIN,\n  MIN_TAB_OFFSET,\n  MIN_TRAJECTORY_PREDICTION_TIME,\n  POSITION_HISTORY_SIZE_UNIT,\n  SCROLL_MARGIN_UNIT,\n  TAB_OFFSET_UNIT,\n  TRAJECTORY_PREDICTION_TIME_UNIT,\n} from \"../../../constants\"\nimport \"../base-tab/tab-content\"\nimport \"../base-tab/tab-header\"\nimport \"../copy-icon/copy-icon\"\nimport \"./setting-item/setting-item-checkbox\"\nimport \"./setting-item/setting-item-range\"\nimport \"./setting-item/setting-item\"\nimport \"../dropdown/single-select-dropdown\"\nimport type { DropdownOption } from \"../dropdown/single-select-dropdown\"\nimport \"../base-tab/chip\"\nimport { ForesightDevtools } from \"../../foresight-devtools\"\n\n// A helper type to represent a change in a Devtools setting\ntype UpdatedDevtoolsSetting = {\n  [K in ShowKey]: {\n    setting: `show.${K}`\n    newValue: ShowSettings[K]\n    oldValue: ShowSettings[K]\n  }\n}[ShowKey]\n\n@customElement(\"settings-tab\")\nexport class SettingsTab extends LitElement {\n  static styles = css`\n    :host {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n    }\n\n    .settings-content {\n      display: block;\n    }\n\n    .settings-section {\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n    }\n\n    .settings-group {\n      background: rgba(30, 30, 30, 0.6);\n      padding: 16px;\n      border: 1px solid rgba(176, 196, 222, 0.1);\n    }\n\n    .settings-group h4 {\n      margin: 0 0 12px 0;\n      font-size: 14px;\n      font-weight: 600;\n      color: #b0c4de;\n      border-bottom: 1px solid rgba(176, 196, 222, 0.2);\n      padding-bottom: 8px;\n    }\n  `\n\n  @state() private managerSettings: ForesightManagerSettings\n  @state() private initialSettings: Readonly<{\n    manager: ForesightManagerSettings\n    devtools: DevtoolsSettings\n  }>\n  @state() private devtoolsSettings: DevtoolsSettings\n  @state() private changedSettings: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[] = []\n  @state() private currentCorner: Corner = \"bottom-right\"\n  @state() private touchDeviceStrategyOptions: DropdownOption[] = [\n    {\n      value: \"onTouchStart\",\n      label: \"On Touch Start\",\n      title: \"Execute callbacks when user touches registered elements\",\n      icon: html`<span>Touch</span>`,\n    },\n    {\n      value: \"viewport\",\n      label: \"Viewport Entry\",\n      title: \"Execute callbacks when registered elements enter the viewport\",\n      icon: html`<span>Viewport</span>`,\n    },\n    {\n      value: \"none\",\n      label: \"None\",\n      title: \"Disable touch device prediction\",\n      icon: html`<span>None</span>`,\n    },\n  ]\n\n  @state() private minimumConnectionTypeOptions: DropdownOption[] = [\n    {\n      value: \"slow-2g\",\n      label: \"Slow 2G\",\n      title: \"Slow 2G\",\n      icon: html`<span>Slow 2G</span>`,\n    },\n    {\n      value: \"2g\",\n      label: \"2G\",\n      title: \"2G\",\n      icon: html`<span>2G</span>`,\n    },\n    {\n      value: \"3g\",\n      label: \"3G\",\n      title: \"3G\",\n      icon: html`<span>3G</span>`,\n    },\n    {\n      value: \"4g\",\n      label: \"4G\",\n      title: \"4G\",\n      icon: html`<span>4G</span>`,\n    },\n  ]\n\n  @state() private cornerOptions: DropdownOption[] = [\n    {\n      value: \"top-left\",\n      label: \"Top Left\",\n      title: \"Position control panel in top-left corner\",\n      icon: html`<span>↖</span>`,\n    },\n    {\n      value: \"top-right\",\n      label: \"Top Right\",\n      title: \"Position control panel in top-right corner\",\n      icon: html`<span>↗</span>`,\n    },\n    {\n      value: \"bottom-left\",\n      label: \"Bottom Left\",\n      title: \"Position control panel in bottom-left corner\",\n      icon: html`<span>↙</span>`,\n    },\n    {\n      value: \"bottom-right\",\n      label: \"Bottom Right\",\n      title: \"Position control panel in bottom-right corner\",\n      icon: html`<span>↘</span>`,\n    },\n  ]\n\n  private _abortController: AbortController | null = null\n\n  constructor() {\n    super()\n    const currentDevtoolsSettings = ForesightDevtools.instance.devtoolsSettings\n    const currentManagerSettings = ForesightManager.instance.getManagerData.globalSettings\n\n    // Shallow copy is sufficient except for `show`, which we deep-copy so\n    // the live and initial snapshots can diverge as the user toggles flags.\n    this.devtoolsSettings = {\n      ...currentDevtoolsSettings,\n      show: { ...currentDevtoolsSettings.show },\n    }\n    this.managerSettings = Object.assign({}, currentManagerSettings)\n    this.currentCorner = this.getCurrentCorner()\n\n    this.initialSettings = {\n      devtools: {\n        ...currentDevtoolsSettings,\n        show: { ...currentDevtoolsSettings.show },\n      },\n      manager: Object.assign({}, currentManagerSettings),\n    }\n  }\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    this._abortController = new AbortController()\n    const { signal } = this._abortController\n    ForesightManager.instance.addEventListener(\n      \"managerSettingsChanged\",\n      e => {\n        this.managerSettings = e.managerData.globalSettings\n        this._updateChangedSettings()\n      },\n      { signal }\n    )\n\n    this._updateChangedSettings()\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n    this._abortController?.abort()\n    this._abortController = null\n  }\n\n  private _updateChangedSettings(): void {\n    const changes: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[] = []\n    this._checkManagerSettingsChanges(changes)\n    this._checkDevtoolsSettingsChanges(changes)\n    this.changedSettings = changes\n  }\n\n  private _checkManagerSettingsChanges(\n    changes: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[]\n  ): void {\n    const managerKeys: (keyof ForesightManagerSettings)[] = [\n      \"enableMousePrediction\",\n      \"enableTabPrediction\",\n      \"enableScrollPrediction\",\n      \"trajectoryPredictionTime\",\n      \"positionHistorySize\",\n      \"tabOffset\",\n      \"scrollMargin\",\n      \"touchDeviceStrategy\",\n      \"minimumConnectionType\",\n    ]\n\n    for (const key of managerKeys) {\n      const oldValue = this.initialSettings.manager[key]\n      const newValue = this.managerSettings[key]\n      if (oldValue !== newValue) {\n        changes.push({\n          setting: key,\n          oldValue,\n          newValue,\n        } as UpdatedManagerSetting)\n      }\n    }\n  }\n\n  private _checkDevtoolsSettingsChanges(\n    changes: (UpdatedManagerSetting | UpdatedDevtoolsSetting)[]\n  ): void {\n    for (const key of SHOW_KEYS) {\n      const oldValue = this.initialSettings.devtools.show[key]\n      const newValue = this.devtoolsSettings.show[key]\n      if (oldValue !== newValue) {\n        changes.push({\n          setting: `show.${key}`,\n          oldValue,\n          newValue,\n        } as UpdatedDevtoolsSetting)\n      }\n    }\n  }\n\n  private _handleDevtoolsSettingChange(e: CustomEvent<{ setting: string; value: boolean }>): void {\n    const { setting, value } = e.detail\n\n    if (!setting.startsWith(\"show.\")) {\n      return\n    }\n\n    const key = setting.slice(\"show.\".length) as ShowKey\n    if (!SHOW_KEYS.includes(key)) {\n      return\n    }\n\n    this.devtoolsSettings = {\n      ...this.devtoolsSettings,\n      show: { ...this.devtoolsSettings.show, [key]: value },\n    }\n    ForesightDevtools.instance.alterDevtoolsSettings({ show: { [key]: value } })\n    this._updateChangedSettings()\n  }\n\n  private _handleTouchDeviceStrategyChange = (value: string): void => {\n    ForesightManager.instance.alterGlobalSettings({\n      touchDeviceStrategy: value as TouchDeviceStrategy,\n    })\n  }\n\n  private _handleMinimumConnectionTypeChange = (value: string): void => {\n    ForesightManager.instance.alterGlobalSettings({\n      minimumConnectionType: value as MinimumConnectionType,\n    })\n  }\n\n  private _handleCornerChange = (value: Corner): void => {\n    this.currentCorner = value\n    // Dispatch custom event that bubbles up to control panel\n    this.dispatchEvent(\n      new CustomEvent(\"corner-change\", {\n        detail: { corner: value },\n        bubbles: true,\n        composed: true,\n      })\n    )\n  }\n\n  private getCurrentCorner(): Corner {\n    // Get corner from localStorage directly since it's the source of truth\n    try {\n      const stored = localStorage.getItem(\"foresight-devtools-control-panel-corner\")\n      if (stored && [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"].includes(stored)) {\n        return stored as Corner\n      }\n    } catch (error) {\n      console.warn(\"ForesightDevtools: Failed to load corner from localStorage:\", error)\n    }\n\n    return \"bottom-right\"\n  }\n\n  private async handleCopySettings(): Promise<void> {\n    if (!this.managerSettings) {\n      return\n    }\n\n    try {\n      const settingsCode = this.generateSettingsCode(this.managerSettings)\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        await navigator.clipboard.writeText(settingsCode)\n      }\n    } catch (error) {\n      console.error(\"Failed to copy settings code:\", error)\n    }\n  }\n\n  private generateSettingsCode(settings: ForesightManagerSettings): string {\n    const settingsObject = {\n      enableMousePrediction: settings.enableMousePrediction,\n      enableTabPrediction: settings.enableTabPrediction,\n      enableScrollPrediction: settings.enableScrollPrediction,\n      positionHistorySize: settings.positionHistorySize,\n      trajectoryPredictionTime: settings.trajectoryPredictionTime,\n      tabOffset: settings.tabOffset,\n      scrollMargin: settings.scrollMargin,\n      touchDeviceStrategy: settings.touchDeviceStrategy,\n      minimumConnectionType: settings.minimumConnectionType,\n    }\n\n    return `ForesightManager.initialize(${JSON.stringify(settingsObject, null, 2)})`\n  }\n\n  render() {\n    if (!this.managerSettings || !this.devtoolsSettings) {\n      return html`<tab-content\n        .noContentMessage=${\"Loading settings...\"}\n        .hasContent=${false}\n      ></tab-content>`\n    }\n\n    const settings = this.managerSettings\n\n    const chipTitle =\n      this.changedSettings.length > 0\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` +\n          this.changedSettings\n            .map(\n              change =>\n                `${change.setting}: ${JSON.stringify(change.oldValue)} -> ${JSON.stringify(\n                  change.newValue\n                )}`\n            )\n            .join(\"\\n\")\n        : \"No settings changed from initial values\"\n\n    return html`\n      <tab-header>\n        <div slot=\"chips\" class=\"chips-container\">\n          <chip-element .title=${chipTitle}> ${this.changedSettings.length} changed </chip-element>\n        </div>\n        <div slot=\"actions\">\n          <copy-icon\n            title=\"Copy current settings as code\"\n            .onCopy=${() => this.handleCopySettings()}\n          ></copy-icon>\n        </div>\n      </tab-header>\n\n      <tab-content .hasContent=${true}>\n        <div class=\"settings-content\">\n          <div class=\"settings-section\">\n            <div class=\"settings-group\">\n              <h4>Mouse Prediction</h4>\n              <setting-item-checkbox\n                .isChecked=${settings.enableMousePrediction}\n                header=\"Enable Mouse Prediction\"\n                description=\"Execute callbacks when mouse is ${settings.trajectoryPredictionTime}ms away from registered elements in mouse direction\"\n                setting=\"enableMousePrediction\"\n              ></setting-item-checkbox>\n              <setting-item-range\n                .currentValue=${settings.trajectoryPredictionTime}\n                .maxValue=${MAX_TRAJECTORY_PREDICTION_TIME}\n                .minValue=${MIN_TRAJECTORY_PREDICTION_TIME}\n                .unit=${TRAJECTORY_PREDICTION_TIME_UNIT}\n                header=\"Prediction Time\"\n                description=\"How far into the future to calculate mouse trajectory path\"\n                setting=\"trajectoryPredictionTime\"\n              ></setting-item-range>\n              <setting-item-range\n                .currentValue=${settings.positionHistorySize}\n                .maxValue=${MAX_POSITION_HISTORY_SIZE}\n                .minValue=${MIN_POSITION_HISTORY_SIZE}\n                .unit=${POSITION_HISTORY_SIZE_UNIT}\n                header=\"Position History Size\"\n                description=\"How far into the future, in ${POSITION_HISTORY_SIZE_UNIT}, to calculate mouse trajectory path\"\n                setting=\"positionHistorySize\"\n              >\n              </setting-item-range>\n            </div>\n            <div class=\"settings-group\">\n              <h4>Keyboard Navigation</h4>\n              <setting-item-checkbox\n                .isChecked=${settings.enableTabPrediction}\n                header=\"Enable Tab Prediction\"\n                description=\"Execute callbacks when user ${settings.tabOffset} tabbable elements away from registered elements in tab direction\"\n                setting=\"enableTabPrediction\"\n              >\n              </setting-item-checkbox>\n              <setting-item-range\n                .currentValue=${settings.tabOffset}\n                .maxValue=${MAX_TAB_OFFSET}\n                .minValue=${MIN_TAB_OFFSET}\n                .unit=${TAB_OFFSET_UNIT}\n                header=\"Tab Offset\"\n                description=\"Number of tabbable elements to look ahead when predicting navigation\"\n                setting=\"tabOffset\"\n              >\n              </setting-item-range>\n            </div>\n\n            <div class=\"settings-group\">\n              <h4>Scroll Prediction</h4>\n              <setting-item-checkbox\n                .isChecked=${settings.enableScrollPrediction}\n                header=\"Enable Scroll Prediction\"\n                description=\"Execute callbacks when user is ${settings.scrollMargin}px away from registered elements in scroll direction\"\n                setting=\"enableScrollPrediction\"\n              ></setting-item-checkbox>\n              <setting-item-range\n                .currentValue=${settings.scrollMargin}\n                .maxValue=${MAX_SCROLL_MARGIN}\n                .minValue=${MIN_SCROLL_MARGIN}\n                .unit=${SCROLL_MARGIN_UNIT}\n                header=\"Scroll Margin\"\n                description=\"Pixel distance to check from mouse position in scroll direction\"\n                setting=\"scrollMargin\"\n              ></setting-item-range>\n            </div>\n\n            <div class=\"settings-group\">\n              <h4>Touch Device</h4>\n              <setting-item\n                header=\"Touch Device Strategy\"\n                description=\"How to handle prediction on touch devices\"\n              >\n                <single-select-dropdown\n                  slot=\"controls\"\n                  .dropdownOptions=${this.touchDeviceStrategyOptions}\n                  .selectedOptionValue=${settings.touchDeviceStrategy}\n                  .onSelectionChange=${this._handleTouchDeviceStrategyChange}\n                ></single-select-dropdown>\n              </setting-item>\n            </div>\n\n            <div class=\"settings-group\">\n              <h4>Minimum Connection</h4>\n              <setting-item\n                header=\"Minimum Connection Type\"\n                description=\"Minimum connection speed required to register elements\"\n              >\n                <single-select-dropdown\n                  slot=\"controls\"\n                  .dropdownOptions=${this.minimumConnectionTypeOptions}\n                  .selectedOptionValue=${settings.minimumConnectionType}\n                  .onSelectionChange=${this._handleMinimumConnectionTypeChange}\n                ></single-select-dropdown>\n              </setting-item>\n            </div>\n\n            <!-- Developer Tools Group -->\n            <div class=\"settings-group\">\n              <h4>Developer Tools</h4>\n              <setting-item-checkbox\n                .isChecked=${this.devtoolsSettings.show.nameTags}\n                header=\"Show Name Tags\"\n                description=\"Display name tags over each registered element in the debugger\"\n                setting=\"show.nameTags\"\n                @setting-changed=${this._handleDevtoolsSettingChange}\n              ></setting-item-checkbox>\n              <setting-item-checkbox\n                .isChecked=${this.devtoolsSettings.show.elementOverlays}\n                header=\"Show Element Overlays\"\n                description=\"Render hit-slop boundary overlays around registered elements. Note: turning this off also hides name tags.\"\n                setting=\"show.elementOverlays\"\n                @setting-changed=${this._handleDevtoolsSettingChange}\n              ></setting-item-checkbox>\n              <setting-item-checkbox\n                .isChecked=${this.devtoolsSettings.show.mouseTrajectory}\n                header=\"Show Mouse Trajectory\"\n                description=\"Render the predicted mouse trajectory line\"\n                setting=\"show.mouseTrajectory\"\n                @setting-changed=${this._handleDevtoolsSettingChange}\n              ></setting-item-checkbox>\n              <setting-item-checkbox\n                .isChecked=${this.devtoolsSettings.show.scrollTrajectory}\n                header=\"Show Scroll Trajectory\"\n                description=\"Render the predicted scroll trajectory line\"\n                setting=\"show.scrollTrajectory\"\n                @setting-changed=${this._handleDevtoolsSettingChange}\n              ></setting-item-checkbox>\n              <setting-item\n                header=\"Panel Position\"\n                description=\"Choose which corner to position the control panel\"\n              >\n                <single-select-dropdown\n                  slot=\"controls\"\n                  .dropdownOptions=${this.cornerOptions}\n                  .selectedOptionValue=${this.currentCorner}\n                  .onSelectionChange=${this._handleCornerChange}\n                ></single-select-dropdown>\n              </setting-item>\n            </div>\n          </div>\n        </div>\n      </tab-content>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"settings-tab\": SettingsTab\n  }\n}\n","import { LitElement, css, html } from \"lit\"\nimport { customElement, state } from \"lit/decorators.js\"\nimport { ForesightManager } from \"js.foresight\"\n\nimport \"./element-tab/element-tab\"\nimport \"./base-tab/tab-selector\"\nimport \"./log-tab/log-tab\"\nimport \"./settings-tab/settings-tab\"\nimport { getEventLogStore } from \"./log-tab/log-store\"\nimport type { ControllerTabs, Corner } 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      --panel-offset: 10px;\n      padding: 12px;\n      position: fixed;\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:\n        width 0.3s ease,\n        height 0.3s ease;\n      box-sizing: border-box;\n      border-radius: 8px;\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n    }\n\n    .control-wrapper.top-left {\n      top: var(--panel-offset);\n      left: var(--panel-offset);\n    }\n    .control-wrapper.top-right {\n      top: var(--panel-offset);\n      right: var(--panel-offset);\n    }\n    .control-wrapper.bottom-left {\n      bottom: var(--panel-offset);\n      left: var(--panel-offset);\n    }\n    .control-wrapper.bottom-right {\n      bottom: var(--panel-offset);\n      right: var(--panel-offset);\n    }\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-content {\n      flex: 1;\n      position: relative;\n    }\n\n    .tab-content > * {\n      display: flex;\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n    }\n\n    .touch-device-warning {\n      background-color: rgba(255, 193, 7, 0.9);\n      color: #000;\n      padding: 8px 12px;\n      margin: 8px 0;\n      border-radius: 4px;\n      font-size: 12px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 8px;\n    }\n\n    .touch-device-warning.hidden {\n      display: none;\n    }\n\n    .warning-content {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .warning-icon {\n      font-weight: bold;\n      font-size: 14px;\n    }\n\n    .dismiss-button {\n      background: none;\n      border: none;\n      color: #000;\n      font-size: 16px;\n      cursor: pointer;\n      padding: 0;\n      line-height: 1;\n      font-weight: bold;\n    }\n\n    .dismiss-button:hover {\n      opacity: 0.7;\n    }\n  `\n  @state() private activeTab: ControllerTabs\n  @state() private isMinimized: boolean =\n    ForesightDevtools.instance.devtoolsSettings.isControlPanelDefaultMinimized\n  @state() private isTouchDevice: boolean = false\n  @state() private isWarningDismissed: boolean = false\n  @state() private corner: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\" =\n    \"bottom-right\"\n\n  private localStorageSelectedTabKey = \"foresight-devtools-control-panel-tab\"\n  private localStorageCornerKey = \"foresight-devtools-control-panel-corner\"\n  private _abortController: AbortController | null = null\n\n  constructor() {\n    super()\n    this.activeTab = this.getStoredTab()\n    this.corner = this.getStoredCorner()\n    this.isTouchDevice = ForesightManager.instance.getManagerData.currentDeviceStrategy === \"touch\"\n  }\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    this._abortController = new AbortController()\n    const { signal } = this._abortController\n\n    getEventLogStore().attach()\n\n    ForesightManager.instance.addEventListener(\n      \"deviceStrategyChanged\",\n      e => {\n        this.isTouchDevice = e.newStrategy === \"touch\"\n        if (e.newStrategy === \"touch\") {\n          this.isWarningDismissed = false\n        }\n      },\n      { signal }\n    )\n\n    // Listen for corner change events\n    this.addEventListener(\n      \"corner-change\",\n      ((e: CustomEvent) => {\n        this.setCorner(e.detail.corner)\n      }) as EventListener,\n      { signal }\n    )\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n    this._abortController?.abort()\n    this._abortController = null\n    getEventLogStore().detach()\n  }\n\n  private getStoredTab(): ControllerTabs {\n    try {\n      const tab = localStorage.getItem(this.localStorageSelectedTabKey)\n\n      return (tab as ControllerTabs) || \"logs\"\n    } catch (error) {\n      console.error(error)\n\n      return \"logs\"\n    }\n  }\n\n  private getStoredCorner(): Corner {\n    try {\n      const stored = localStorage.getItem(this.localStorageCornerKey)\n      if (stored) {\n        return stored as Corner\n      }\n    } catch (error) {\n      console.error(\"ForesightDevtools: Failed to load corner from localStorage:\", error)\n    }\n\n    return \"bottom-right\"\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      console.warn(\"ForesightDevtools: Failed to save tab preference to localStorage:\", error)\n    }\n  }\n\n  private setStoredCorner(corner: Corner): void {\n    try {\n      localStorage.setItem(this.localStorageCornerKey, corner)\n    } catch (error) {\n      console.warn(\"ForesightDevtools: Failed to save corner to localStorage:\", error)\n    }\n  }\n\n  private dismissWarning(): void {\n    this.isWarningDismissed = true\n  }\n\n  public setCorner(corner: Corner): void {\n    this.corner = corner\n    this.setStoredCorner(this.corner)\n    this.requestUpdate()\n  }\n\n  private handleMinimizeClick(event: Event): void {\n    event.stopPropagation()\n    this.isMinimized = !this.isMinimized\n  }\n\n  private getMinimizeSymbol(): string {\n    return this.isMinimized ? \"+\" : \"−\"\n  }\n\n  /**\n   * Only the active tab is mounted; hidden tabs would otherwise keep their\n   * manager listeners and element subscriptions running invisibly.\n   */\n  private renderActiveTab() {\n    switch (this.activeTab) {\n      case \"elements\":\n        return html`<element-tab></element-tab>`\n      case \"settings\":\n        return html`<settings-tab></settings-tab>`\n      case \"logs\":\n      default:\n        return html`<log-tab></log-tab>`\n    }\n  }\n\n  protected render() {\n    return html`\n      <div class=\"control-wrapper ${this.corner} ${this.isMinimized ? \"minimized\" : \"\"}\">\n        <div class=\"title-wrapper\">\n          <button @click=\"${this.handleMinimizeClick}\" class=\"minimize-button\">\n            ${this.getMinimizeSymbol()}\n          </button>\n          <h1>Foresight DevTools</h1>\n          <div></div>\n        </div>\n\n        <div\n          class=\"touch-device-warning ${this.isMinimized ||\n          !this.isTouchDevice ||\n          this.isWarningDismissed\n            ? \"hidden\"\n            : \"\"}\"\n        >\n          <div class=\"warning-content\">\n            <span class=\"warning-icon\">⚠️</span>\n            <span>Touch device mode: Overlays and visibility sorting not available</span>\n          </div>\n          <button @click=\"${this.dismissWarning}\" class=\"dismiss-button\" title=\"Dismiss warning\">\n            ×\n          </button>\n        </div>\n\n        ${this.isMinimized\n          ? \"\"\n          : html`\n              <div class=\"tab-container\">\n                <tab-selector\n                  .activeTab=\"${this.activeTab}\"\n                  @tab-change=\"${this._handleTabChange}\"\n                ></tab-selector>\n\n                <div class=\"tab-content\">${this.renderActiveTab()}</div>\n              </div>\n            `}\n      </div>\n    `\n  }\n}\n","import { LitElement, html, css, type PropertyValues } from \"lit\"\nimport { customElement, state, query, property } from \"lit/decorators.js\"\nimport {\n  type ForesightElement,\n  type ForesightElementState,\n  type ElementBounds,\n  type CallbackHitType,\n  ForesightManager,\n} from \"js.foresight\"\nimport type {\n  CallbackCompletedEvent,\n  CallbackInvokedEvent,\n  ElementRegisteredEvent,\n  ElementUnregisteredEvent,\n} from \"js.foresight\"\n\ntype HitSlop = ForesightElementState[\"hitSlop\"]\n\ninterface ElementOverlay {\n  nameLabel: HTMLElement\n  slopArea: HTMLElement\n  /** Last applied document-coordinate rect; unchanged means no style writes needed. */\n  lastSlopRect: { left: number; top: number; width: number; height: number } | null\n  /** Size + hit slop the cached border radius was computed for. */\n  lastRadiusKey: string | null\n}\n\ninterface CallbackAnimation {\n  element: ForesightElement\n  timeoutId: ReturnType<typeof setTimeout>\n}\n\n@customElement(\"element-overlays\")\nexport class ElementOverlays extends LitElement {\n  @state() private overlayMap: Map<ForesightElement, ElementOverlay> = new Map()\n  @state() private callbackAnimations: Map<ForesightElement, CallbackAnimation> = new Map()\n  private _elementSubscriptions: Map<ForesightElement, () => void> = new Map()\n  @query(\"#overlays-container\") private containerElement!: HTMLElement\n\n  @property({ type: Boolean }) showNameTags = true\n\n  static styles = [\n    css`\n      /* Anchored to the document origin (initial containing block), not the\n         viewport: overlays are placed in document coordinates so the compositor\n         moves them together with the page content during scroll, instead of\n         JS chasing the scroll position a frame behind. */\n      :host {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 0;\n        height: 0;\n        pointer-events: none;\n        z-index: 9999;\n      }\n\n      :host([hidden]) {\n        display: none;\n      }\n\n      .slop-area {\n        position: absolute;\n        top: 0;\n        left: 0;\n        box-sizing: border-box;\n        border: 1px dashed rgba(100, 116, 139, 0.4);\n        background-color: rgba(100, 116, 139, 0.05);\n        transition:\n          border-color 0.2s ease,\n          background-color 0.2s ease,\n          box-shadow 0.2s ease;\n        pointer-events: none;\n      }\n\n      .slop-area[data-hit=\"mouse\"] {\n        border-color: #3b82f6;\n        background-color: rgba(59, 130, 246, 0.1);\n        animation: glow-mouse 2s ease-in-out infinite;\n      }\n\n      .slop-area[data-hit=\"scroll\"] {\n        border-color: #eab308;\n        background-color: rgba(234, 179, 8, 0.1);\n        animation: glow-scroll 2s ease-in-out infinite;\n      }\n\n      .slop-area[data-hit=\"tab\"] {\n        border-color: #f97316;\n        background-color: rgba(249, 115, 22, 0.1);\n        animation: glow-tab 2s ease-in-out infinite;\n      }\n\n      @keyframes glow-mouse {\n        0% {\n          box-shadow: 0 0 5px 2px rgba(59, 130, 246, 0.3);\n        }\n        50% {\n          box-shadow: 0 0 15px 4px rgba(59, 130, 246, 0.6);\n        }\n        100% {\n          box-shadow: 0 0 5px 2px rgba(59, 130, 246, 0.3);\n        }\n      }\n\n      @keyframes glow-scroll {\n        0% {\n          box-shadow: 0 0 5px 2px rgba(234, 179, 8, 0.3);\n        }\n        50% {\n          box-shadow: 0 0 15px 4px rgba(234, 179, 8, 0.6);\n        }\n        100% {\n          box-shadow: 0 0 5px 2px rgba(234, 179, 8, 0.3);\n        }\n      }\n\n      @keyframes glow-tab {\n        0% {\n          box-shadow: 0 0 5px 2px rgba(249, 115, 22, 0.3);\n        }\n        50% {\n          box-shadow: 0 0 15px 4px rgba(249, 115, 22, 0.6);\n        }\n        100% {\n          box-shadow: 0 0 5px 2px rgba(249, 115, 22, 0.3);\n        }\n      }\n\n      .name-label {\n        position: absolute;\n        top: 0;\n        left: 0;\n        background-color: rgba(27, 31, 35, 0.95);\n        color: white;\n        padding: 4px 8px;\n        font-size: 11px;\n        font-family:\n          -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif,\n          \"Apple Color Emoji\", \"Segoe UI Emoji\";\n        z-index: 10001;\n        white-space: nowrap;\n        pointer-events: none;\n      }\n    `,\n  ]\n\n  private _abortController: AbortController | null = null\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    this._abortController = new AbortController()\n    const { signal } = this._abortController\n    ForesightManager.instance.addEventListener(\n      \"elementRegistered\",\n      (e: ElementRegisteredEvent) => {\n        this._subscribeToElement(e.element)\n        if (e.state.isIntersectingWithViewport) {\n          this.createOrUpdateElementOverlay(e.element, e.state)\n        }\n      },\n      { signal }\n    )\n    ForesightManager.instance.addEventListener(\n      \"elementUnregistered\",\n      (e: ElementUnregisteredEvent) => {\n        this._unsubscribeFromElement(e.element)\n        this.removeElementOverlay(e.element)\n      },\n      { signal }\n    )\n\n    // Subscribe to already-registered elements\n    for (const [element, state] of ForesightManager.instance.registeredElements) {\n      this._subscribeToElement(element)\n      if (state.isIntersectingWithViewport && state.isActive) {\n        this.createOrUpdateElementOverlay(element, state)\n      }\n    }\n    ForesightManager.instance.addEventListener(\n      \"callbackInvoked\",\n      (e: CallbackInvokedEvent) => {\n        this.highlightElementCallback(e.element, e.hitType)\n      },\n      { signal }\n    )\n    ForesightManager.instance.addEventListener(\n      \"callbackCompleted\",\n      (e: CallbackCompletedEvent) => {\n        this.unhighlightElementCallback(e.element)\n        this.removeElementOverlay(e.element)\n      },\n      { signal }\n    )\n  }\n\n  protected willUpdate(changed: PropertyValues<this>): void {\n    if (changed.has(\"showNameTags\")) {\n      this.updateNameTagVisibility(this.showNameTags)\n    }\n  }\n\n  private _subscribeToElement(element: ForesightElement): void {\n    if (this._elementSubscriptions.has(element)) {\n      return\n    }\n\n    const update = () => {\n      const state = ForesightManager.instance.registeredElements.get(element)\n      if (!state || !state.isIntersectingWithViewport || !state.isActive) {\n        this.removeElementOverlay(element)\n\n        return\n      }\n\n      this.createOrUpdateElementOverlay(element, state)\n    }\n\n    // State and geometry are published on separate channels: logical changes\n    // (active/intersecting/name) come through subscribeToElement, rect changes\n    // during scroll/resize through subscribeToElementBounds.\n    const unsubscribeState = ForesightManager.instance.subscribeToElement(element, update)\n    const unsubscribeBounds = ForesightManager.instance.subscribeToElementBounds(element, update)\n\n    if (unsubscribeState || unsubscribeBounds) {\n      this._elementSubscriptions.set(element, () => {\n        unsubscribeState?.()\n        unsubscribeBounds?.()\n      })\n    }\n  }\n\n  private _unsubscribeFromElement(element: ForesightElement): void {\n    this._elementSubscriptions.get(element)?.()\n    this._elementSubscriptions.delete(element)\n  }\n\n  private createOverlay(element: ForesightElement): ElementOverlay {\n    const slopArea = document.createElement(\"div\")\n    slopArea.className = \"slop-area\"\n    const nameLabel = document.createElement(\"div\")\n    nameLabel.className = \"name-label\"\n    this.containerElement.appendChild(slopArea)\n    this.containerElement.appendChild(nameLabel)\n    const overlay = { nameLabel, slopArea, lastSlopRect: null, lastRadiusKey: null }\n    this.overlayMap.set(element, overlay)\n\n    return overlay\n  }\n\n  /**\n   * The slop area is the element's own shape offset outward by the hit slop:\n   * every corner keeps the element's border radius, grown by the slop on each\n   * axis. Sharp corners stay sharp, since offsetting a rectangle outward does\n   * not round its corners.\n   */\n  private expandedBorderRadius(element: ForesightElement, hitSlop: HitSlop): string {\n    const style = getComputedStyle(element as HTMLElement)\n    const rect = (element as HTMLElement).getBoundingClientRect()\n\n    const corner = (value: string, slopX: number, slopY: number): [number, number] => {\n      const [xRaw, yRaw = xRaw] = value.split(\" \")\n      const parse = (raw: string, base: number) => {\n        const parsed = parseFloat(raw) || 0\n\n        return raw.endsWith(\"%\") ? (parsed / 100) * base : parsed\n      }\n      const x = parse(xRaw, rect.width)\n      const y = parse(yRaw, rect.height)\n\n      return [x === 0 ? 0 : x + slopX, y === 0 ? 0 : y + slopY]\n    }\n\n    const tl = corner(style.borderTopLeftRadius, hitSlop.left, hitSlop.top)\n    const tr = corner(style.borderTopRightRadius, hitSlop.right, hitSlop.top)\n    const br = corner(style.borderBottomRightRadius, hitSlop.right, hitSlop.bottom)\n    const bl = corner(style.borderBottomLeftRadius, hitSlop.left, hitSlop.bottom)\n\n    return `${tl[0]}px ${tr[0]}px ${br[0]}px ${bl[0]}px / ${tl[1]}px ${tr[1]}px ${br[1]}px ${bl[1]}px`\n  }\n\n  private updateSlopArea(\n    overlay: ElementOverlay,\n    element: ForesightElement,\n    hitSlop: HitSlop,\n    bounds: ElementBounds\n  ): void {\n    const { expandedRect } = bounds\n    // The manager reports viewport-relative rects; convert to document\n    // coordinates, which stay constant during scroll.\n    const left = expandedRect.left + window.scrollX\n    const top = expandedRect.top + window.scrollY\n    const width = expandedRect.right - expandedRect.left\n    const height = expandedRect.bottom - expandedRect.top\n\n    const last = overlay.lastSlopRect\n    if (\n      last &&\n      last.left === left &&\n      last.top === top &&\n      last.width === width &&\n      last.height === height\n    ) {\n      return\n    }\n\n    overlay.lastSlopRect = { left, top, width, height }\n\n    const { style } = overlay.slopArea\n    style.transform = `translate3d(${left}px, ${top}px, 0)`\n    style.width = `${width}px`\n    style.height = `${height}px`\n\n    const radiusKey = `${width}|${height}|${hitSlop.top}|${hitSlop.right}|${hitSlop.bottom}|${hitSlop.left}`\n    if (overlay.lastRadiusKey !== radiusKey) {\n      overlay.lastRadiusKey = radiusKey\n      style.borderRadius = this.expandedBorderRadius(element, hitSlop)\n    }\n  }\n\n  private updateNameLabel(\n    overlay: ElementOverlay,\n    state: ForesightElementState,\n    bounds: ElementBounds\n  ): void {\n    const { nameLabel } = overlay\n    const { expandedRect } = bounds\n\n    if (!this.showNameTags || state.name === \"unnamed\") {\n      nameLabel.style.display = \"none\"\n    } else {\n      nameLabel.textContent = state.name\n      nameLabel.style.display = \"block\"\n      nameLabel.style.transform = `translate3d(${expandedRect.left + window.scrollX}px, ${\n        expandedRect.top - 25 + window.scrollY\n      }px, 0)`\n    }\n  }\n\n  private createOrUpdateElementOverlay(element: ForesightElement, state: ForesightElementState) {\n    const bounds = ForesightManager.instance.getElementBounds(element)\n    if (!bounds) {\n      return\n    }\n\n    let overlay = this.overlayMap.get(element)\n    if (!overlay) {\n      overlay = this.createOverlay(element)\n    }\n\n    this.updateSlopArea(overlay, element, state.hitSlop, bounds)\n    this.updateNameLabel(overlay, state, bounds)\n  }\n\n  private removeElementOverlay(element: ForesightElement) {\n    const overlay = this.overlayMap.get(element)\n    if (overlay) {\n      overlay.nameLabel.remove()\n      overlay.slopArea.remove()\n      this.overlayMap.delete(element)\n    }\n\n    this.clearCallbackAnimationTimeout(element)\n  }\n\n  private clearCallbackAnimationTimeout(element: ForesightElement) {\n    const existingAnimation = this.callbackAnimations.get(element)\n    if (existingAnimation) {\n      clearTimeout(existingAnimation.timeoutId)\n      this.callbackAnimations.delete(element)\n    }\n  }\n\n  private highlightElementCallback(element: ForesightElement, hitType: CallbackHitType) {\n    this.clearCallbackAnimationTimeout(element)\n\n    const overlay = this.overlayMap.get(element)\n    if (!overlay) {\n      return\n    }\n\n    switch (hitType.kind) {\n      case \"mouse\":\n      case \"scroll\":\n      case \"tab\":\n        overlay.slopArea.dataset.hit = hitType.kind\n        break\n      case \"touch\":\n        break\n      case \"viewport\":\n        break\n      default:\n        hitType satisfies never\n    }\n  }\n\n  private unhighlightElementCallback(element: ForesightElement) {\n    const animationDelay = setTimeout(() => {\n      const overlay = this.overlayMap.get(element)\n      if (overlay) {\n        delete overlay.slopArea.dataset.hit\n      }\n\n      this.callbackAnimations.delete(element)\n    }, 400)\n\n    this.callbackAnimations.set(element, {\n      element,\n      timeoutId: animationDelay,\n    })\n  }\n\n  public updateNameTagVisibility(showNameTags: boolean) {\n    this.overlayMap.forEach(overlay => {\n      const nameLabel = overlay.nameLabel\n      if (!showNameTags) {\n        nameLabel.style.display = \"none\"\n      } else {\n        nameLabel.style.display = \"block\"\n      }\n    })\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n\n    for (const unsub of this._elementSubscriptions.values()) {\n      unsub()\n    }\n    this._elementSubscriptions.clear()\n\n    this.callbackAnimations.forEach(animation => {\n      clearTimeout(animation.timeoutId)\n    })\n    this.callbackAnimations.clear()\n\n    for (const overlay of this.overlayMap.values()) {\n      overlay.nameLabel.remove()\n      overlay.slopArea.remove()\n    }\n    this.overlayMap.clear()\n    this._abortController?.abort()\n    this._abortController = null\n  }\n\n  render() {\n    return html` <div id=\"overlays-container\"></div> `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"element-overlays\": ElementOverlays\n  }\n}\n","import { LitElement, html, css } from \"lit\"\nimport { customElement } from \"lit/decorators.js\"\nimport {\n  ForesightManager,\n  type MouseTrajectoryUpdateEvent,\n  type ManagerSettingsChangedEvent,\n} from \"js.foresight\"\nimport type { ElementUnregisteredEvent } from \"js.foresight\"\nimport type { CallbackCompletedEvent } from \"js.foresight\"\n\nexport type Point = {\n  x: number\n  y: number\n}\n@customElement(\"mouse-trajectory\")\nexport class MouseTrajectory extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n      }\n\n      :host([hidden]) {\n        display: none;\n      }\n\n      .trajectory-line {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        will-change: transform, width;\n        transform-origin: left center;\n        height: 4px;\n        background: linear-gradient(90deg, #3b82f6, rgba(59, 130, 246, 0.4));\n        z-index: 9999;\n        border-radius: 2px;\n        box-shadow: 0 0 12px rgba(59, 130, 246, 0.4);\n      }\n\n      .trajectory-line::after {\n        content: \"\";\n        position: absolute;\n        right: -6px;\n        top: 50%;\n        transform: translateY(-50%);\n        width: 0;\n        height: 0;\n        border-left: 8px solid #3b82f6;\n        border-top: 4px solid transparent;\n        border-bottom: 4px solid transparent;\n        filter: drop-shadow(0 0 6px rgba(59, 130, 246, 0.6));\n      }\n    `,\n  ]\n\n  private _abortController = new AbortController()\n  private _lineEl: HTMLElement | null = null\n  private _mousePredictionIsEnabled =\n    ForesightManager.instance.getManagerData.globalSettings.enableMousePrediction\n  private _isVisible = false\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    const { signal } = this._abortController\n\n    ForesightManager.instance.addEventListener(\"callbackCompleted\", this.handleTrajectoryReset, {\n      signal,\n    })\n\n    ForesightManager.instance.addEventListener(\"elementUnregistered\", this.handleTrajectoryReset, {\n      signal,\n    })\n\n    ForesightManager.instance.addEventListener(\n      \"mouseTrajectoryUpdate\",\n      this.handleTrajectoryUpdate,\n      { signal }\n    )\n\n    ForesightManager.instance.addEventListener(\n      \"scrollTrajectoryUpdate\",\n      () => {\n        this._setVisible(false)\n      },\n      { signal }\n    )\n\n    ForesightManager.instance.addEventListener(\n      \"managerSettingsChanged\",\n      this.handleSettingsChange,\n      { signal }\n    )\n  }\n\n  protected firstUpdated(): void {\n    this._lineEl = this.shadowRoot!.querySelector<HTMLElement>(\".trajectory-line\")\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n    this._abortController.abort()\n  }\n\n  private _setVisible(visible: boolean): void {\n    if (this._isVisible === visible) {\n      return\n    }\n\n    this._isVisible = visible\n    if (this._lineEl) {\n      this._lineEl.style.display = visible ? \"block\" : \"none\"\n    }\n  }\n\n  private handleTrajectoryReset = (e: CallbackCompletedEvent | ElementUnregisteredEvent) => {\n    const shouldReset =\n      (\"wasLastActiveElement\" in e && e.wasLastActiveElement) ||\n      (\"wasLastRegisteredElement\" in e && e.wasLastRegisteredElement)\n\n    if (shouldReset) {\n      this._setVisible(false)\n      if (this._lineEl) {\n        this._lineEl.style.transform = \"translate3d(0px, 0px, 0) rotate(0deg)\"\n        this._lineEl.style.width = \"0px\"\n      }\n    }\n  }\n\n  private handleSettingsChange = (e: ManagerSettingsChangedEvent) => {\n    const isEnabled = e.managerData.globalSettings.enableMousePrediction\n    this._mousePredictionIsEnabled = isEnabled\n    if (!isEnabled) {\n      this._setVisible(false)\n    }\n  }\n\n  private handleTrajectoryUpdate = (e: MouseTrajectoryUpdateEvent) => {\n    if (!this._mousePredictionIsEnabled) {\n      return\n    }\n\n    this._setVisible(true)\n\n    const { currentPoint, predictedPoint } = e.trajectoryPositions\n    const dx = predictedPoint.x - currentPoint.x\n    const dy = predictedPoint.y - currentPoint.y\n    const length = Math.sqrt(dx * dx + dy * dy)\n    const angle = Math.atan2(dy, dx) * 57.29577951308232 // Pre-calculate rad to deg\n\n    if (this._lineEl) {\n      this._lineEl.style.transform = `translate3d(${currentPoint.x}px, ${currentPoint.y}px, 0) rotate(${angle}deg)`\n      this._lineEl.style.width = `${length}px`\n    }\n  }\n\n  render() {\n    return html`<div class=\"trajectory-line\"></div>`\n  }\n}\n","import { LitElement, html, css } from \"lit\"\nimport { customElement } from \"lit/decorators.js\"\nimport type {\n  ScrollTrajectoryUpdateEvent,\n  ManagerSettingsChangedEvent,\n  ElementUnregisteredEvent,\n  CallbackCompletedEvent,\n} from \"js.foresight\"\nimport { ForesightManager } from \"js.foresight\"\nimport type { Point } from \"./mouse-trajectory\"\n\n@customElement(\"scroll-trajectory\")\nexport class ScrollTrajectory extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n      }\n\n      :host([hidden]) {\n        display: none;\n      }\n\n      .scroll-trajectory-line {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        will-change: transform, width;\n        transform-origin: left center;\n        height: 4px;\n        background: repeating-linear-gradient(\n          90deg,\n          #eab308 0px,\n          #eab308 8px,\n          transparent 8px,\n          transparent 16px\n        );\n        z-index: 9999;\n        border-radius: 2px;\n        animation: scroll-dash-flow 1.5s linear infinite;\n        box-shadow: 0 0 12px rgba(234, 179, 8, 0.4);\n      }\n\n      .scroll-trajectory-line::after {\n        content: \"\";\n        position: absolute;\n        right: -6px;\n        top: 50%;\n        transform: translateY(-50%);\n        width: 0;\n        height: 0;\n        border-left: 8px solid #eab308;\n        border-top: 4px solid transparent;\n        border-bottom: 4px solid transparent;\n        filter: drop-shadow(0 0 6px rgba(234, 179, 8, 0.6));\n        animation: scroll-arrow-pulse 1.5s ease-in-out infinite;\n      }\n\n      @keyframes scroll-dash-flow {\n        0% {\n          background-position: 0px 0px;\n        }\n        100% {\n          background-position: 16px 0px;\n        }\n      }\n\n      @keyframes scroll-arrow-pulse {\n        0%,\n        100% {\n          transform: translateY(-50%) scale(1);\n          filter: drop-shadow(0 0 6px rgba(234, 179, 8, 0.6));\n        }\n        50% {\n          transform: translateY(-50%) scale(1.2);\n          filter: drop-shadow(0 0 12px rgba(234, 179, 8, 0.8));\n        }\n      }\n    `,\n  ]\n\n  private _abortController = new AbortController()\n  private _lineEl: HTMLElement | null = null\n  private _scrollPredictionIsEnabled =\n    ForesightManager.instance.getManagerData.globalSettings.enableScrollPrediction\n  private _scrollMargin = ForesightManager.instance.getManagerData.globalSettings.scrollMargin\n  private _isVisible = false\n  private _latestCurrentPoint: Point | null = null\n  private _latestPredictedPoint: Point | null = null\n  private _isUpdateScheduled = false\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    const { signal } = this._abortController\n\n    ForesightManager.instance.addEventListener(\"scrollTrajectoryUpdate\", this.handleScrollUpdate, {\n      signal,\n    })\n\n    ForesightManager.instance.addEventListener(\n      \"mouseTrajectoryUpdate\",\n      () => {\n        this._setVisible(false)\n      },\n      { signal }\n    )\n\n    ForesightManager.instance.addEventListener(\"callbackCompleted\", this.handleTrajectoryReset, {\n      signal,\n    })\n\n    ForesightManager.instance.addEventListener(\"elementUnregistered\", this.handleTrajectoryReset, {\n      signal,\n    })\n\n    ForesightManager.instance.addEventListener(\n      \"managerSettingsChanged\",\n      this.handleSettingsChange,\n      { signal }\n    )\n  }\n\n  protected firstUpdated(): void {\n    this._lineEl = this.shadowRoot!.querySelector<HTMLElement>(\".scroll-trajectory-line\")\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n    this._abortController.abort()\n  }\n\n  private _setVisible(visible: boolean): void {\n    if (this._isVisible === visible) {\n      return\n    }\n\n    this._isVisible = visible\n    if (this._lineEl) {\n      this._lineEl.style.display = visible ? \"block\" : \"none\"\n    }\n  }\n\n  private handleTrajectoryReset = (e: CallbackCompletedEvent | ElementUnregisteredEvent) => {\n    const shouldReset =\n      (\"wasLastActiveElement\" in e && e.wasLastActiveElement) ||\n      (\"wasLastRegisteredElement\" in e && e.wasLastRegisteredElement)\n\n    if (shouldReset) {\n      this._setVisible(false)\n      if (this._lineEl) {\n        this._lineEl.style.transform = \"translate(0px, 0px) rotate(0deg)\"\n      }\n    }\n  }\n\n  private handleSettingsChange = (e: ManagerSettingsChangedEvent) => {\n    const isEnabled = e.managerData.globalSettings.enableScrollPrediction\n    this._scrollPredictionIsEnabled = isEnabled\n    if (!isEnabled) {\n      this._setVisible(false)\n    }\n\n    const scrollMarginUpdate = e.updatedSettings.find(update => update.setting === \"scrollMargin\")\n    if (scrollMarginUpdate) {\n      this._scrollMargin = scrollMarginUpdate.newValue\n      if (this._lineEl) {\n        this._lineEl.style.width = `${this._scrollMargin}px`\n      }\n    }\n  }\n\n  private handleScrollUpdate = (e: ScrollTrajectoryUpdateEvent) => {\n    if (!this._scrollPredictionIsEnabled) {\n      return\n    }\n\n    this._setVisible(true)\n    this._latestCurrentPoint = e.currentPoint\n    this._latestPredictedPoint = e.predictedPoint\n\n    if (!this._isUpdateScheduled) {\n      this._isUpdateScheduled = true\n      this.applyScrollTransform()\n    }\n  }\n\n  private applyScrollTransform = () => {\n    if (!this._latestCurrentPoint || !this._latestPredictedPoint) {\n      this._isUpdateScheduled = false\n\n      return\n    }\n\n    const dx = this._latestPredictedPoint.x - this._latestCurrentPoint.x\n    const dy = this._latestPredictedPoint.y - this._latestCurrentPoint.y\n    const angle = (Math.atan2(dy, dx) * 180) / Math.PI\n\n    if (this._lineEl) {\n      this._lineEl.style.transform = `translate(${this._latestCurrentPoint.x}px, ${this._latestCurrentPoint.y}px) rotate(${angle}deg)`\n    }\n\n    this._isUpdateScheduled = false\n  }\n\n  render() {\n    return html`<div class=\"scroll-trajectory-line\" style=\"width: ${this._scrollMargin}px\"></div>`\n  }\n}\n","import { LitElement, css, html } from \"lit\"\nimport { customElement, property, state } from \"lit/decorators.js\"\nimport \"./element-overlays\"\nimport \"./mouse-trajectory\"\nimport \"./scroll-trajectory\"\nimport { ForesightManager } from \"js.foresight\"\nimport type { DeviceStrategyChangedEvent } from \"js.foresight\"\n\n@customElement(\"debug-overlay\")\nexport class DebugOverlay extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n      }\n      #overlay-container {\n        position: fixed;\n        top: 0;\n        left: 0;\n        pointer-events: none;\n        z-index: 9999;\n      }\n    `,\n  ]\n\n  private _abortController: AbortController | null = null\n  @state()\n  private _strategy: \"mouse\" | \"touch\" | \"pen\" =\n    ForesightManager.instance.getManagerData.currentDeviceStrategy\n\n  @property({ type: Boolean }) showElementOverlays = true\n  @property({ type: Boolean }) showMouseTrajectory = true\n  @property({ type: Boolean }) showScrollTrajectory = true\n  @property({ type: Boolean }) showNameTags = true\n\n  connectedCallback(): void {\n    super.connectedCallback()\n    this._abortController = new AbortController()\n    const { signal } = this._abortController\n\n    ForesightManager.instance.addEventListener(\n      \"deviceStrategyChanged\",\n      this.handleDeviceStrategyChange,\n      { signal }\n    )\n  }\n\n  private handleDeviceStrategyChange = (event: DeviceStrategyChangedEvent) =>\n    (this._strategy = event.newStrategy)\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback()\n    this._abortController?.abort()\n  }\n\n  render() {\n    return html`\n      <div id=\"overlay-container\">\n        ${this._strategy === \"mouse\"\n          ? html`\n              <mouse-trajectory ?hidden=${!this.showMouseTrajectory}></mouse-trajectory>\n              <scroll-trajectory ?hidden=${!this.showScrollTrajectory}></scroll-trajectory>\n            `\n          : \"\"}\n      </div>\n      <!-- element-overlays positions itself in document coordinates and must stay\n           outside #overlay-container: the fixed container would become its\n           containing block and pin it back to the viewport. -->\n      ${this._strategy === \"mouse\"\n        ? html`\n            <element-overlays\n              ?hidden=${!this.showElementOverlays}\n              .showNameTags=${this.showNameTags}\n            ></element-overlays>\n          `\n        : \"\"}\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"debug-overlay\": DebugOverlay\n  }\n}\n","import { LitElement, css, html } from \"lit\"\nimport { customElement, state } from \"lit/decorators.js\"\nimport {\n  SHOW_KEYS,\n  type DeepPartial,\n  type DevtoolsSettings,\n  type LogEvents,\n  type ShowKey,\n  type ShowSettings,\n} from \"../types/types\"\n\nimport \"./control-panel/control-panel\"\nimport \"./debug-overlay/debug-overlay\"\n\n@customElement(\"foresight-devtools\")\nexport class ForesightDevtools extends LitElement {\n  static styles = [\n    css`\n      :host {\n        display: block;\n      }\n    `,\n  ]\n\n  @state() private isInitialized = false\n\n  private static _instance: ForesightDevtools | null = null\n\n  public devtoolsSettings: Required<DevtoolsSettings> = {\n    show: {\n      controlPanel: true,\n      nameTags: true,\n      elementOverlays: true,\n      mouseTrajectory: true,\n      scrollTrajectory: true,\n    },\n    isControlPanelDefaultMinimized: false,\n    sortElementList: \"visibility\",\n    logging: {\n      logLocation: \"controlPanel\",\n      callbackCompleted: true,\n      callbackInvoked: true,\n      elementRegistered: false,\n      elementUnregistered: false,\n      managerSettingsChanged: true,\n      mouseTrajectoryUpdate: false,\n      scrollTrajectoryUpdate: false,\n      deviceStrategyChanged: true,\n    },\n  }\n\n  private constructor() {\n    super()\n  }\n\n  private static createAndAppendInstance(): void {\n    if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n      return\n    }\n\n    ForesightDevtools._instance = document.createElement(\"foresight-devtools\") as ForesightDevtools\n    document.body.appendChild(ForesightDevtools._instance)\n  }\n\n  public static initialize(props?: DeepPartial<DevtoolsSettings>): ForesightDevtools {\n    if (!ForesightDevtools._instance) {\n      ForesightDevtools.createAndAppendInstance()\n    }\n\n    if (!ForesightDevtools._instance) {\n      return ForesightDevtools._instance!\n    }\n\n    const devtools = ForesightDevtools._instance\n    devtools.isInitialized = true\n    devtools.alterDevtoolsSettings(props)\n\n    return devtools\n  }\n\n  public static get instance(): ForesightDevtools {\n    if (!ForesightDevtools._instance) {\n      return ForesightDevtools.initialize()\n    }\n\n    return ForesightDevtools._instance!\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    this.cleanup()\n  }\n\n  private shouldUpdateSetting<T>(newValue: T | undefined, currentValue: T): newValue is T {\n    return newValue !== undefined && newValue !== currentValue\n  }\n\n  private updateLoggingSetting<K extends keyof LogEvents>(\n    key: K,\n    newValue: LogEvents[K] | undefined\n  ): void {\n    if (this.shouldUpdateSetting(newValue, this.devtoolsSettings.logging[key])) {\n      this.devtoolsSettings.logging[key] = newValue!\n    }\n  }\n\n  private updateShowSetting<K extends ShowKey>(\n    key: K,\n    newValue: ShowSettings[K] | undefined\n  ): boolean {\n    if (this.shouldUpdateSetting(newValue, this.devtoolsSettings.show[key])) {\n      this.devtoolsSettings.show[key] = newValue!\n\n      return true\n    }\n\n    return false\n  }\n\n  /**\n   * Set every flag inside `show` to the same value. Useful for \"turn the\n   * entire devtools UI off\" without listing each key.\n   */\n  public setAllShow(value: boolean) {\n    const show = Object.fromEntries(SHOW_KEYS.map(k => [k, value])) as ShowSettings\n    this.alterDevtoolsSettings({ show })\n  }\n\n  public alterDevtoolsSettings(props?: DeepPartial<DevtoolsSettings>) {\n    if (props === undefined) {\n      return\n    }\n\n    if (props.show) {\n      let needsUpdate = false\n      for (const key of SHOW_KEYS) {\n        if (this.updateShowSetting(key, props.show[key])) {\n          needsUpdate = true\n        }\n      }\n      if (needsUpdate) {\n        this.requestUpdate()\n      }\n    }\n\n    if (\n      this.shouldUpdateSetting(\n        props.isControlPanelDefaultMinimized,\n        this.devtoolsSettings.isControlPanelDefaultMinimized\n      )\n    ) {\n      this.devtoolsSettings.isControlPanelDefaultMinimized = props.isControlPanelDefaultMinimized!\n    }\n\n    if (this.shouldUpdateSetting(props.sortElementList, this.devtoolsSettings.sortElementList)) {\n      this.devtoolsSettings.sortElementList = props.sortElementList!\n    }\n\n    // Handle logging settings\n    if (props.logging) {\n      if (\n        this.shouldUpdateSetting(\n          props.logging.logLocation,\n          this.devtoolsSettings.logging.logLocation\n        )\n      ) {\n        this.devtoolsSettings.logging.logLocation = props.logging.logLocation\n      }\n\n      this.updateLoggingSetting(\"callbackCompleted\", props.logging.callbackCompleted)\n      this.updateLoggingSetting(\"callbackInvoked\", props.logging.callbackInvoked)\n      this.updateLoggingSetting(\"elementRegistered\", props.logging.elementRegistered)\n      this.updateLoggingSetting(\"elementUnregistered\", props.logging.elementUnregistered)\n      this.updateLoggingSetting(\"managerSettingsChanged\", props.logging.managerSettingsChanged)\n      this.updateLoggingSetting(\"mouseTrajectoryUpdate\", props.logging.mouseTrajectoryUpdate)\n      this.updateLoggingSetting(\"scrollTrajectoryUpdate\", props.logging.scrollTrajectoryUpdate)\n      this.updateLoggingSetting(\"deviceStrategyChanged\", props.logging.deviceStrategyChanged)\n    }\n  }\n\n  private cleanup() {\n    // Just trigger a re-render to hide the components\n    this.requestUpdate()\n  }\n\n  render() {\n    if (!this.isInitialized) {\n      return html``\n    }\n\n    const { show } = this.devtoolsSettings\n\n    return html`\n      ${show.controlPanel ? html`<control-panel></control-panel>` : \"\"}\n      <debug-overlay\n        .showElementOverlays=${show.elementOverlays}\n        .showMouseTrajectory=${show.mouseTrajectory}\n        .showScrollTrajectory=${show.scrollTrajectory}\n        .showNameTags=${show.nameTags}\n      ></debug-overlay>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"foresight-devtools\": ForesightDevtools\n  }\n}\n"],"mappings":"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"}