@oddsquad/vite-plugin-lit 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/LICENSE +28 -0
  3. package/README.md +153 -0
  4. package/bin.mjs +154 -0
  5. package/client.d.ts +61 -0
  6. package/dist/client/assets/browser-agent-rpc-BXhoSh1z-BvWe4sTJ.js +69 -0
  7. package/dist/client/assets/browser-agent-rpc-BXhoSh1z-BvWe4sTJ.js.map +1 -0
  8. package/dist/client/assets/index-CFrVgNfS.js +9740 -0
  9. package/dist/client/assets/index-CFrVgNfS.js.map +1 -0
  10. package/{panel → dist/client}/index.html +1 -0
  11. package/index.d.ts.map +1 -1
  12. package/index.js +2 -2
  13. package/index.js.map +1 -1
  14. package/lib/color-scheme.d.ts.map +1 -1
  15. package/lib/color-scheme.js +17 -21
  16. package/lib/color-scheme.js.map +1 -1
  17. package/lib/devframe/definition.d.ts +45 -0
  18. package/lib/devframe/definition.d.ts.map +1 -0
  19. package/lib/devframe/definition.js +547 -0
  20. package/lib/devframe/definition.js.map +1 -0
  21. package/lib/devframe/icon.d.ts +8 -0
  22. package/lib/devframe/icon.d.ts.map +1 -0
  23. package/lib/devframe/icon.js +21 -0
  24. package/lib/devframe/icon.js.map +1 -0
  25. package/lib/devframe/paths.d.ts +12 -0
  26. package/lib/devframe/paths.d.ts.map +1 -0
  27. package/lib/devframe/paths.js +38 -0
  28. package/lib/devframe/paths.js.map +1 -0
  29. package/lib/devframe/protocol.d.ts +218 -0
  30. package/lib/devframe/protocol.d.ts.map +1 -0
  31. package/lib/devframe/protocol.js +76 -0
  32. package/lib/devframe/protocol.js.map +1 -0
  33. package/lib/devframe/source.d.ts +49 -0
  34. package/lib/devframe/source.d.ts.map +1 -0
  35. package/lib/devframe/source.js +23 -0
  36. package/lib/devframe/source.js.map +1 -0
  37. package/lib/devframe/vite.d.ts +116 -0
  38. package/lib/devframe/vite.d.ts.map +1 -0
  39. package/lib/devframe/vite.js +291 -0
  40. package/lib/devframe/vite.js.map +1 -0
  41. package/lib/http.d.ts +29 -0
  42. package/lib/http.d.ts.map +1 -0
  43. package/lib/http.js +35 -0
  44. package/lib/http.js.map +1 -0
  45. package/lib/icons.d.ts +2 -0
  46. package/lib/icons.d.ts.map +1 -1
  47. package/lib/icons.js +10 -4
  48. package/lib/icons.js.map +1 -1
  49. package/lib/plugin.d.ts +15 -4
  50. package/lib/plugin.d.ts.map +1 -1
  51. package/lib/plugin.js +640 -574
  52. package/lib/plugin.js.map +1 -1
  53. package/lib/runtime/css.d.ts +2 -2
  54. package/lib/runtime/css.d.ts.map +1 -1
  55. package/lib/runtime/css.js +34 -34
  56. package/lib/runtime/css.js.map +1 -1
  57. package/lib/runtime/edge-panel.d.ts.map +1 -1
  58. package/lib/runtime/edge-panel.js +82 -91
  59. package/lib/runtime/edge-panel.js.map +1 -1
  60. package/lib/runtime/fonts.d.ts.map +1 -1
  61. package/lib/runtime/fonts.js +1 -1
  62. package/lib/runtime/fonts.js.map +1 -1
  63. package/lib/runtime/indicator.d.ts.map +1 -1
  64. package/lib/runtime/indicator.js +71 -74
  65. package/lib/runtime/indicator.js.map +1 -1
  66. package/lib/runtime/inspector/collect.d.ts.map +1 -1
  67. package/lib/runtime/inspector/collect.js +83 -90
  68. package/lib/runtime/inspector/collect.js.map +1 -1
  69. package/lib/runtime/inspector/highlight.d.ts +16 -0
  70. package/lib/runtime/inspector/highlight.d.ts.map +1 -0
  71. package/lib/runtime/inspector/highlight.js +66 -0
  72. package/lib/runtime/inspector/highlight.js.map +1 -0
  73. package/lib/runtime/inspector/install.d.ts.map +1 -1
  74. package/lib/runtime/inspector/install.js +180 -205
  75. package/lib/runtime/inspector/install.js.map +1 -1
  76. package/lib/runtime/inspector/serialize.d.ts.map +1 -1
  77. package/lib/runtime/inspector/serialize.js +86 -107
  78. package/lib/runtime/inspector/serialize.js.map +1 -1
  79. package/lib/runtime/intern.d.ts.map +1 -1
  80. package/lib/runtime/intern.js +31 -29
  81. package/lib/runtime/intern.js.map +1 -1
  82. package/lib/runtime/overrides.d.ts.map +1 -1
  83. package/lib/runtime/overrides.js +14 -13
  84. package/lib/runtime/overrides.js.map +1 -1
  85. package/lib/runtime/patch.d.ts +8 -0
  86. package/lib/runtime/patch.d.ts.map +1 -1
  87. package/lib/runtime/patch.js +321 -282
  88. package/lib/runtime/patch.js.map +1 -1
  89. package/lib/runtime/source-meta.d.ts.map +1 -1
  90. package/lib/runtime/source-meta.js +1 -1
  91. package/lib/runtime/source-meta.js.map +1 -1
  92. package/lib/runtime/source-overlay/editors.d.ts.map +1 -1
  93. package/lib/runtime/source-overlay/editors.js +27 -27
  94. package/lib/runtime/source-overlay/editors.js.map +1 -1
  95. package/lib/runtime/source-overlay/mask-path.d.ts.map +1 -1
  96. package/lib/runtime/source-overlay/mask-path.js +15 -15
  97. package/lib/runtime/source-overlay/mask-path.js.map +1 -1
  98. package/lib/runtime/source-overlay/overlay-element.d.ts.map +1 -1
  99. package/lib/runtime/source-overlay/overlay-element.js +347 -356
  100. package/lib/runtime/source-overlay/overlay-element.js.map +1 -1
  101. package/lib/runtime/source-overlay/source-host.d.ts.map +1 -1
  102. package/lib/runtime/source-overlay/source-host.js +64 -71
  103. package/lib/runtime/source-overlay/source-host.js.map +1 -1
  104. package/lib/runtime/source-overlay/template.d.ts.map +1 -1
  105. package/lib/runtime/source-overlay/template.js +3 -3
  106. package/lib/runtime/source-overlay/template.js.map +1 -1
  107. package/lib/runtime/source-overlay.d.ts.map +1 -1
  108. package/lib/runtime/source-overlay.js +5 -2
  109. package/lib/runtime/source-overlay.js.map +1 -1
  110. package/lib/runtime/timeline/clock.d.ts.map +1 -1
  111. package/lib/runtime/timeline/clock.js +2 -2
  112. package/lib/runtime/timeline/clock.js.map +1 -1
  113. package/lib/runtime/timeline/flash.d.ts +39 -0
  114. package/lib/runtime/timeline/flash.d.ts.map +1 -0
  115. package/lib/runtime/timeline/flash.js +169 -0
  116. package/lib/runtime/timeline/flash.js.map +1 -0
  117. package/lib/runtime/timeline/identity.d.ts.map +1 -1
  118. package/lib/runtime/timeline/identity.js +27 -27
  119. package/lib/runtime/timeline/identity.js.map +1 -1
  120. package/lib/runtime/timeline/input.d.ts.map +1 -1
  121. package/lib/runtime/timeline/input.js +54 -67
  122. package/lib/runtime/timeline/input.js.map +1 -1
  123. package/lib/runtime/timeline/install.d.ts.map +1 -1
  124. package/lib/runtime/timeline/install.js +38 -29
  125. package/lib/runtime/timeline/install.js.map +1 -1
  126. package/lib/runtime/timeline/lifecycle.d.ts +8 -0
  127. package/lib/runtime/timeline/lifecycle.d.ts.map +1 -1
  128. package/lib/runtime/timeline/lifecycle.js +149 -133
  129. package/lib/runtime/timeline/lifecycle.js.map +1 -1
  130. package/lib/runtime/timeline/public-api.d.ts.map +1 -1
  131. package/lib/runtime/timeline/public-api.js +9 -9
  132. package/lib/runtime/timeline/public-api.js.map +1 -1
  133. package/lib/runtime/timeline/render.d.ts.map +1 -1
  134. package/lib/runtime/timeline/render.js +70 -75
  135. package/lib/runtime/timeline/render.js.map +1 -1
  136. package/lib/runtime/timeline/transport.d.ts.map +1 -1
  137. package/lib/runtime/timeline/transport.js +39 -43
  138. package/lib/runtime/timeline/transport.js.map +1 -1
  139. package/lib/segmented-tabs.d.ts +3 -1
  140. package/lib/segmented-tabs.d.ts.map +1 -1
  141. package/lib/segmented-tabs.js +136 -107
  142. package/lib/segmented-tabs.js.map +1 -1
  143. package/lib/snapshot.d.ts +28 -0
  144. package/lib/snapshot.d.ts.map +1 -0
  145. package/lib/snapshot.js +57 -0
  146. package/lib/snapshot.js.map +1 -0
  147. package/lib/source-meta.d.ts.map +1 -1
  148. package/lib/source-meta.js +176 -162
  149. package/lib/source-meta.js.map +1 -1
  150. package/lib/timeline/derive.d.ts +152 -0
  151. package/lib/timeline/derive.d.ts.map +1 -0
  152. package/lib/timeline/derive.js +242 -0
  153. package/lib/timeline/derive.js.map +1 -0
  154. package/lib/timeline-plugin.d.ts.map +1 -1
  155. package/lib/timeline-plugin.js +304 -321
  156. package/lib/timeline-plugin.js.map +1 -1
  157. package/lib/tokens.d.ts.map +1 -1
  158. package/lib/tokens.js +17 -18
  159. package/lib/tokens.js.map +1 -1
  160. package/lib/transform.d.ts.map +1 -1
  161. package/lib/transform.js +62 -57
  162. package/lib/transform.js.map +1 -1
  163. package/lib/types.d.ts.map +1 -1
  164. package/lib/types.js +1 -1
  165. package/lib/types.js.map +1 -1
  166. package/lib/wrap-table.d.ts.map +1 -1
  167. package/lib/wrap-table.js +19 -17
  168. package/lib/wrap-table.js.map +1 -1
  169. package/package.json +77 -13
  170. package/types/hmr-incompatibility.d.ts +59 -0
  171. package/types/hmr-incompatibility.d.ts.map +1 -0
  172. package/types/hmr-incompatibility.js +30 -0
  173. package/types/hmr-incompatibility.js.map +1 -0
  174. package/types/in-page.d.ts +49 -0
  175. package/types/in-page.d.ts.map +1 -0
  176. package/types/in-page.js +33 -0
  177. package/types/in-page.js.map +1 -0
  178. package/types/inspector.d.ts.map +1 -1
  179. package/types/inspector.js.map +1 -1
  180. package/types/snapshot.d.ts +44 -0
  181. package/types/snapshot.d.ts.map +1 -0
  182. package/types/snapshot.js +7 -0
  183. package/types/snapshot.js.map +1 -0
  184. package/types/timeline.d.ts +11 -0
  185. package/types/timeline.d.ts.map +1 -1
  186. package/types/timeline.js.map +1 -1
  187. package/panel/components-view.d.ts +0 -60
  188. package/panel/components-view.d.ts.map +0 -1
  189. package/panel/components-view.js +0 -587
  190. package/panel/components-view.js.map +0 -1
  191. package/panel/devtools-settings.d.ts +0 -41
  192. package/panel/devtools-settings.d.ts.map +0 -1
  193. package/panel/devtools-settings.js +0 -463
  194. package/panel/devtools-settings.js.map +0 -1
  195. package/panel/lit-devtools-panel.d.ts +0 -37
  196. package/panel/lit-devtools-panel.d.ts.map +0 -1
  197. package/panel/lit-devtools-panel.js +0 -185
  198. package/panel/lit-devtools-panel.js.map +0 -1
  199. package/panel/timeline-event-list.d.ts +0 -43
  200. package/panel/timeline-event-list.d.ts.map +0 -1
  201. package/panel/timeline-event-list.js +0 -416
  202. package/panel/timeline-event-list.js.map +0 -1
  203. package/panel/timeline-layers.d.ts +0 -25
  204. package/panel/timeline-layers.d.ts.map +0 -1
  205. package/panel/timeline-layers.js +0 -96
  206. package/panel/timeline-layers.js.map +0 -1
  207. package/panel/timeline-view.d.ts +0 -38
  208. package/panel/timeline-view.d.ts.map +0 -1
  209. package/panel/timeline-view.js +0 -234
  210. package/panel/timeline-view.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline-event-list.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/panel/timeline-event-list.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {LitElement, html, css, nothing} from 'lit';\nimport {customElement, property, state} from 'lit/decorators.js';\nimport {ref, createRef} from 'lit/directives/ref.js';\nimport {repeat} from 'lit/directives/repeat.js';\nimport {tokens} from '../lib/tokens.js';\nimport type {TimelineEvent} from '../types/timeline.js';\nimport type {LayerState} from './timeline-layers.js';\n\n/** Scrollable list of recorded timeline events with an inline detail pane. */\n@customElement('timeline-event-list')\nexport class TimelineEventList extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n .filterbar {\n display: flex;\n align-items: center;\n gap: var(--lit-devtools-space-3);\n padding: var(--lit-devtools-space-2) var(--lit-devtools-space-5);\n border-bottom: 1px solid var(--lit-devtools-border);\n font-size: var(--lit-devtools-text-2xs);\n color: var(--lit-devtools-text-muted);\n flex-shrink: 0;\n }\n .filterbar select {\n background: var(--lit-devtools-surface-elevated);\n color: var(--lit-devtools-text);\n border: 1px solid var(--lit-devtools-border-strong);\n border-radius: var(--lit-devtools-radius-sm);\n padding: var(--lit-devtools-space-1) var(--lit-devtools-space-3);\n font-size: var(--lit-devtools-text-2xs);\n font-family: var(--lit-devtools-font-mono);\n }\n .filterbar input.regex {\n background: var(--lit-devtools-surface-elevated);\n color: var(--lit-devtools-text);\n border: 1px solid var(--lit-devtools-border-strong);\n border-radius: var(--lit-devtools-radius-sm);\n padding: var(--lit-devtools-space-1) var(--lit-devtools-space-3);\n font-size: var(--lit-devtools-text-2xs);\n font-family: var(--lit-devtools-font-mono);\n min-width: 140px;\n }\n .filterbar input.regex::placeholder {\n color: var(--lit-devtools-text-muted);\n }\n .filterbar input.regex.invalid {\n border-color: var(--lit-devtools-error);\n }\n .filterbar .count {\n margin-left: auto;\n color: var(--lit-devtools-text-muted);\n }\n .scroll {\n flex: 1;\n overflow-y: auto;\n padding: var(--lit-devtools-space-2) 0;\n }\n .empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: var(--lit-devtools-space-4);\n color: var(--lit-devtools-text-muted);\n font-size: var(--lit-devtools-text-xs);\n }\n .hint {\n font-size: var(--lit-devtools-text-2xs);\n color: var(--lit-devtools-text-muted);\n }\n .row {\n display: flex;\n align-items: baseline;\n gap: var(--lit-devtools-space-4);\n padding: var(--lit-devtools-space-2) var(--lit-devtools-space-5);\n font-size: var(--lit-devtools-text-2xs);\n font-family: var(--lit-devtools-font-mono);\n border-bottom: 1px solid var(--lit-devtools-border);\n cursor: pointer;\n }\n .row:hover {\n background: var(--lit-devtools-surface-hover);\n }\n .row.selected {\n background: var(--lit-devtools-surface-active);\n }\n .time {\n color: var(--lit-devtools-text-muted);\n flex-shrink: 0;\n width: 56px;\n text-align: right;\n }\n .dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 2px;\n }\n .title {\n flex: 1;\n color: var(--lit-devtools-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .subtitle {\n color: var(--lit-devtools-text-muted);\n flex-shrink: 0;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .detail {\n border-top: 1px solid var(--lit-devtools-border);\n background: var(--lit-devtools-surface-low);\n padding: var(--lit-devtools-space-5) var(--lit-devtools-space-5);\n font-size: var(--lit-devtools-text-2xs);\n font-family: var(--lit-devtools-font-mono);\n color: var(--lit-devtools-text-secondary);\n flex-shrink: 0;\n max-height: 130px;\n overflow-y: auto;\n }\n table {\n border-collapse: collapse;\n width: 100%;\n }\n td {\n padding: var(--lit-devtools-space-1) var(--lit-devtools-space-4)\n var(--lit-devtools-space-1) 0;\n vertical-align: top;\n }\n .key {\n color: var(--lit-devtools-text-muted);\n white-space: nowrap;\n }\n .val {\n color: var(--lit-devtools-text);\n word-break: break-all;\n }\n a {\n color: var(--lit-devtools-accent);\n text-decoration: none;\n }\n a:hover {\n text-decoration: underline;\n }\n .filter-link {\n cursor: pointer;\n margin-left: var(--lit-devtools-space-4);\n font-size: var(--lit-devtools-text-2xs);\n }\n `,\n ];\n\n @property({type: Array}) events: TimelineEvent[] = [];\n @property({type: Array}) layers: LayerState[] = [];\n @state() private _selected: TimelineEvent | null = null;\n /** Element id to filter the list to, or null for all elements. */\n @state() private _elementFilter: number | null = null;\n /** Case-insensitive regex (source text) matched against tag/title/subtitle. */\n @state() private _regex = '';\n\n private readonly _scrollRef = createRef<HTMLDivElement>();\n /** Distinct elements seen in `events`, recomputed only when `events` changes\n * (not on every render driven by selection/filter/regex state). */\n private _elementsCache: Array<{id: number; tag: string}> = [];\n\n override willUpdate(changed: Map<string, unknown>) {\n if (changed.has('events')) {\n this._elementsCache = this._computeElements();\n // Drop a stale element filter when its element is no longer in the events\n // (e.g. after Clear), otherwise the list would silently show nothing.\n if (\n this._elementFilter !== null &&\n !this.events.some((ev) => ev.meta?.elementId === this._elementFilter)\n ) {\n this._elementFilter = null;\n }\n }\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('events')) {\n const el = this._scrollRef.value;\n if (el) el.scrollTop = el.scrollHeight;\n }\n }\n\n private _colorOf(layerId: string): string {\n const l = this.layers.find((l) => l.id === layerId);\n if (!l) return '#888';\n return '#' + l.color.toString(16).padStart(6, '0');\n }\n\n private _isVisible(ev: TimelineEvent): boolean {\n const l = this.layers.find((l) => l.id === ev.layerId);\n if (l && !l.enabled) return false;\n if (\n this._elementFilter !== null &&\n ev.meta?.elementId !== this._elementFilter\n ) {\n return false;\n }\n return true;\n }\n\n /** Distinct elements (by stable id) seen across the recorded events. */\n private _computeElements(): Array<{id: number; tag: string}> {\n const seen = new Map<number, string>();\n for (const ev of this.events) {\n const id = ev.meta?.elementId;\n if (id != null && !seen.has(id)) {\n seen.set(id, ev.meta?.tagName ?? 'unknown');\n }\n }\n return [...seen].map(([id, tag]) => ({id, tag}));\n }\n\n private _onFilterChange(e: Event) {\n const v = (e.target as HTMLSelectElement).value;\n this._elementFilter = v === '' ? null : Number(v);\n }\n\n /** Ask the panel shell to open the Components tab on this element. */\n private _inspect(id: number) {\n this.dispatchEvent(\n new CustomEvent('inspect-element', {\n detail: {id},\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _onRegexInput(e: Event) {\n this._regex = (e.target as HTMLInputElement).value;\n }\n\n /** Text searched by the regex filter — element tag, title and subtitle. */\n private _haystack(ev: TimelineEvent): string {\n return `${ev.meta?.tagName ?? ''} ${ev.title ?? ''} ${ev.subtitle ?? ''}`;\n }\n\n override render() {\n const elements = this._elementsCache;\n // Compile the regex once per render; invalid patterns disable the filter\n // (rather than hiding everything) and flag the input.\n let re: RegExp | null = null;\n let regexInvalid = false;\n if (this._regex !== '') {\n try {\n re = new RegExp(this._regex, 'i');\n } catch {\n regexInvalid = true;\n }\n }\n const visible = this.events.filter(\n (ev) =>\n this._isVisible(ev) && (re === null || re.test(this._haystack(ev)))\n );\n return html`\n ${this.events.length > 0\n ? html`\n <div class=\"filterbar\">\n ${elements.length > 0\n ? html`\n <span>Element:</span>\n <select @change=${this._onFilterChange}>\n <option\n value=\"\"\n ?selected=${this._elementFilter === null}\n >\n All elements\n </option>\n ${elements.map(\n (el) => html`\n <option\n value=${el.id}\n ?selected=${this._elementFilter === el.id}\n >\n &lt;${el.tag}&gt; #${el.id}\n </option>\n `\n )}\n </select>\n `\n : nothing}\n <input\n class=\"regex ${regexInvalid ? 'invalid' : ''}\"\n type=\"text\"\n spellcheck=\"false\"\n placeholder=\"filter regex…\"\n title=\"Case-insensitive regex matched against element tag, title and subtitle\"\n .value=${this._regex}\n @input=${this._onRegexInput}\n />\n <span class=\"count\"\n >${visible.length} / ${this.events.length}</span\n >\n </div>\n `\n : nothing}\n <div class=\"scroll\" ${ref(this._scrollRef)}>\n ${visible.length === 0\n ? html`\n <div class=\"empty\">\n <span>No events recorded.</span>\n <span class=\"hint\"\n >Press Record then interact with the page.</span\n >\n </div>\n `\n : repeat(\n visible,\n (ev) => ev,\n (ev) => html`\n <div\n class=\"row ${this._selected === ev ? 'selected' : ''}\"\n @click=${() => {\n this._selected = ev;\n }}\n >\n <span class=\"time\">${ev.time.toFixed(1)}ms</span>\n <span\n class=\"dot\"\n style=${'background:' + this._colorOf(ev.layerId)}\n ></span>\n <span class=\"title\">${ev.title ?? ev.layerId}</span>\n <span class=\"subtitle\">${ev.subtitle ?? nothing}</span>\n </div>\n `\n )}\n </div>\n ${this._selected ? this._renderDetail(this._selected) : nothing}\n `;\n }\n\n private _renderDetail(ev: TimelineEvent) {\n const {meta} = ev;\n const src = meta?.source;\n return html`\n <div class=\"detail\">\n <table>\n <tr>\n <td class=\"key\">layer</td>\n <td class=\"val\">${ev.layerId}</td>\n </tr>\n <tr>\n <td class=\"key\">time</td>\n <td class=\"val\">${ev.time.toFixed(3)} ms</td>\n </tr>\n ${meta?.tagName\n ? html`<tr>\n <td class=\"key\">element</td>\n <td class=\"val\">\n &lt;${meta.tagName}&gt; #${meta.elementId}\n ${meta.elementId != null\n ? html`<a\n class=\"filter-link\"\n @click=${() => {\n this._elementFilter = meta.elementId!;\n }}\n >filter</a\n ><a\n class=\"filter-link\"\n title=\"Open this element in the Components tab\"\n @click=${() => this._inspect(meta.elementId!)}\n >inspect</a\n >`\n : nothing}\n </td>\n </tr>`\n : nothing}\n ${src\n ? html`<tr>\n <td class=\"key\">source</td>\n <td class=\"val\">\n <a\n href=${'/__lit-open-in-editor?file=' +\n encodeURIComponent(src.file) +\n '&line=' +\n src.line}\n target=\"_blank\"\n >${src.file}:${src.line}</a\n >\n </td>\n </tr>`\n : nothing}\n ${ev.data != null\n ? html`<tr>\n <td class=\"key\">data</td>\n <td class=\"val\">${JSON.stringify(ev.data)}</td>\n </tr>`\n : nothing}\n </table>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'timeline-event-list': TimelineEventList;\n }\n}\n"]}
@@ -1,25 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: BSD-3-Clause
5
- */
6
- import { LitElement } from 'lit';
7
- export interface LayerState {
8
- id: string;
9
- label: string;
10
- color: number;
11
- enabled: boolean;
12
- }
13
- /** Strip of colored pill toggles — one per timeline layer. */
14
- export declare class TimelineLayers extends LitElement {
15
- static styles: import("lit").CSSResult[];
16
- layers: LayerState[];
17
- private _toggle;
18
- render(): import("lit-html").TemplateResult<1>;
19
- }
20
- declare global {
21
- interface HTMLElementTagNameMap {
22
- 'timeline-layers': TimelineLayers;
23
- }
24
- }
25
- //# sourceMappingURL=timeline-layers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline-layers.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/panel/timeline-layers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,UAAU,EAAY,MAAM,KAAK,CAAC;AAI1C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8DAA8D;AAC9D,qBACa,cAAe,SAAQ,UAAU;IAC5C,OAAgB,MAAM,4BA4CpB;IAEuB,MAAM,EAAE,UAAU,EAAE,CAAM;IAEnD,OAAO,CAAC,OAAO;IAUN,MAAM;CAiBhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,cAAc,CAAC;KACnC;CACF"}
@@ -1,96 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: BSD-3-Clause
5
- */
6
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
- return c > 3 && r && Object.defineProperty(target, key, r), r;
11
- };
12
- import { LitElement, html, css } from 'lit';
13
- import { customElement, property } from 'lit/decorators.js';
14
- import { tokens } from '../lib/tokens.js';
15
- /** Strip of colored pill toggles — one per timeline layer. */
16
- let TimelineLayers = class TimelineLayers extends LitElement {
17
- constructor() {
18
- super(...arguments);
19
- this.layers = [];
20
- }
21
- static { this.styles = [
22
- tokens,
23
- css `
24
- :host {
25
- display: flex;
26
- gap: var(--lit-devtools-space-2);
27
- padding: var(--lit-devtools-space-3) var(--lit-devtools-space-5);
28
- border-bottom: 1px solid var(--lit-devtools-border);
29
- background: var(--lit-devtools-surface-low);
30
- flex-shrink: 0;
31
- flex-wrap: wrap;
32
- }
33
- button {
34
- display: flex;
35
- align-items: center;
36
- gap: var(--lit-devtools-space-2);
37
- padding: var(--lit-devtools-space-2) var(--lit-devtools-space-4);
38
- border-radius: var(--lit-devtools-radius-pill);
39
- background: var(--lit-devtools-surface-elevated);
40
- border: 1px solid transparent;
41
- color: var(--lit-devtools-text-secondary);
42
- font-size: var(--lit-devtools-text-2xs);
43
- cursor: pointer;
44
- user-select: none;
45
- transition: opacity var(--lit-devtools-dur-fast)
46
- var(--lit-devtools-ease-standard);
47
- }
48
- button.on {
49
- color: var(--lit-devtools-text);
50
- }
51
- button:hover {
52
- background: var(--lit-devtools-surface-hover);
53
- }
54
- .dot {
55
- width: 8px;
56
- height: 8px;
57
- border-radius: 50%;
58
- flex-shrink: 0;
59
- opacity: 0.4;
60
- }
61
- button.on .dot {
62
- opacity: 1;
63
- }
64
- `,
65
- ]; }
66
- _toggle(id) {
67
- this.dispatchEvent(new CustomEvent('layer-toggle', {
68
- detail: { id },
69
- bubbles: true,
70
- composed: true,
71
- }));
72
- }
73
- render() {
74
- return html `${this.layers.map((l) => html `
75
- <button
76
- class=${l.enabled ? 'on' : ''}
77
- title=${l.enabled ? `Hide ${l.label}` : `Show ${l.label}`}
78
- @click=${() => this._toggle(l.id)}
79
- >
80
- <span
81
- class="dot"
82
- style=${'background:#' + l.color.toString(16).padStart(6, '0')}
83
- ></span>
84
- ${l.label}
85
- </button>
86
- `)}`;
87
- }
88
- };
89
- __decorate([
90
- property({ type: Array })
91
- ], TimelineLayers.prototype, "layers", void 0);
92
- TimelineLayers = __decorate([
93
- customElement('timeline-layers')
94
- ], TimelineLayers);
95
- export { TimelineLayers };
96
- //# sourceMappingURL=timeline-layers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline-layers.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/panel/timeline-layers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;;;;;;AAEH,OAAO,EAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAC,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AASxC,8DAA8D;AAEvD,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,UAAU;IAAvC;;QA+CoB,WAAM,GAAiB,EAAE,CAAC;IA6BrD,CAAC;aA3EiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCF;KACF,AA5CqB,CA4CpB;IAIM,OAAO,CAAC,EAAU;QACxB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAe,cAAc,EAAE;YAC5C,MAAM,EAAE,EAAC,EAAE,EAAC;YACZ,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;;kBAEC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;kBACrB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;mBAChD,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;;;;oBAIvB,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;YAE9D,CAAC,CAAC,KAAK;;OAEZ,CACF,EAAE,CAAC;IACN,CAAC;;AA5BwB;IAAxB,QAAQ,CAAC,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC;8CAA2B;AA/CxC,cAAc;IAD1B,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CA4E1B","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {LitElement, html, css} from 'lit';\nimport {customElement, property} from 'lit/decorators.js';\nimport {tokens} from '../lib/tokens.js';\n\nexport interface LayerState {\n id: string;\n label: string;\n color: number;\n enabled: boolean;\n}\n\n/** Strip of colored pill toggles — one per timeline layer. */\n@customElement('timeline-layers')\nexport class TimelineLayers extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: flex;\n gap: var(--lit-devtools-space-2);\n padding: var(--lit-devtools-space-3) var(--lit-devtools-space-5);\n border-bottom: 1px solid var(--lit-devtools-border);\n background: var(--lit-devtools-surface-low);\n flex-shrink: 0;\n flex-wrap: wrap;\n }\n button {\n display: flex;\n align-items: center;\n gap: var(--lit-devtools-space-2);\n padding: var(--lit-devtools-space-2) var(--lit-devtools-space-4);\n border-radius: var(--lit-devtools-radius-pill);\n background: var(--lit-devtools-surface-elevated);\n border: 1px solid transparent;\n color: var(--lit-devtools-text-secondary);\n font-size: var(--lit-devtools-text-2xs);\n cursor: pointer;\n user-select: none;\n transition: opacity var(--lit-devtools-dur-fast)\n var(--lit-devtools-ease-standard);\n }\n button.on {\n color: var(--lit-devtools-text);\n }\n button:hover {\n background: var(--lit-devtools-surface-hover);\n }\n .dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n opacity: 0.4;\n }\n button.on .dot {\n opacity: 1;\n }\n `,\n ];\n\n @property({type: Array}) layers: LayerState[] = [];\n\n private _toggle(id: string) {\n this.dispatchEvent(\n new CustomEvent<{id: string}>('layer-toggle', {\n detail: {id},\n bubbles: true,\n composed: true,\n })\n );\n }\n\n override render() {\n return html`${this.layers.map(\n (l) => html`\n <button\n class=${l.enabled ? 'on' : ''}\n title=${l.enabled ? `Hide ${l.label}` : `Show ${l.label}`}\n @click=${() => this._toggle(l.id)}\n >\n <span\n class=\"dot\"\n style=${'background:#' + l.color.toString(16).padStart(6, '0')}\n ></span>\n ${l.label}\n </button>\n `\n )}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'timeline-layers': TimelineLayers;\n }\n}\n"]}
@@ -1,38 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: BSD-3-Clause
5
- */
6
- import { LitElement } from 'lit';
7
- import './timeline-layers.js';
8
- import './timeline-event-list.js';
9
- /**
10
- * The Timeline view: records and lists Lit lifecycle / render / input events.
11
- * One tab of the DevTools panel shell (\`lit-devtools-panel\`); owns its own event
12
- * stream (SSE), recording state and layer toggles so it keeps recording while
13
- * other tabs are in front.
14
- */
15
- export declare class TimelineView extends LitElement {
16
- static styles: import("lit").CSSResult[];
17
- private _recording;
18
- private _events;
19
- private _layers;
20
- private _es;
21
- connectedCallback(): void;
22
- disconnectedCallback(): void;
23
- private _loadStorage;
24
- private _saveStorage;
25
- private _layersToState;
26
- /** POST layer/recording state to the server control endpoint. */
27
- private _postControl;
28
- private _toggleRecord;
29
- private _clear;
30
- private _onLayerToggle;
31
- render(): import("lit-html").TemplateResult<1>;
32
- }
33
- declare global {
34
- interface HTMLElementTagNameMap {
35
- 'timeline-view': TimelineView;
36
- }
37
- }
38
- //# sourceMappingURL=timeline-view.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline-view.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/panel/timeline-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,UAAU,EAAY,MAAM,KAAK,CAAC;AAM1C,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAYlC;;;;;GAKG;AACH,qBACa,YAAa,SAAQ,UAAU;IAC1C,OAAgB,MAAM,4BA+CpB;IAEO,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAGpB;IAEJ,OAAO,CAAC,GAAG,CAA4B;IAE9B,iBAAiB;IAgCjB,oBAAoB;IAU7B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,cAAc;IAWtB,iEAAiE;IACjE,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,cAAc;IAQb,MAAM;CAsBhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,YAAY,CAAC;KAC/B;CACF"}
@@ -1,234 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: BSD-3-Clause
5
- */
6
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
- return c > 3 && r && Object.defineProperty(target, key, r), r;
11
- };
12
- import { LitElement, html, css } from 'lit';
13
- import { customElement, state } from 'lit/decorators.js';
14
- import { tokens } from '../lib/tokens.js';
15
- import { TIMELINE_LAYERS } from '../types/timeline.js';
16
- import './timeline-layers.js';
17
- import './timeline-event-list.js';
18
- const LS_KEY = 'lit-devtools-timeline-layers';
19
- /**
20
- * Cap on retained timeline events. The stream is unbounded (the mouse/keyboard
21
- * layers can emit at pointer-move rate), so without a cap the buffer — and the
22
- * list that re-renders from it — grows for the whole session. Keep the most
23
- * recent events; older ones scroll off.
24
- */
25
- const MAX_EVENTS = 5000;
26
- /**
27
- * The Timeline view: records and lists Lit lifecycle / render / input events.
28
- * One tab of the DevTools panel shell (\`lit-devtools-panel\`); owns its own event
29
- * stream (SSE), recording state and layer toggles so it keeps recording while
30
- * other tabs are in front.
31
- */
32
- let TimelineView = class TimelineView extends LitElement {
33
- constructor() {
34
- super(...arguments);
35
- this._recording = false;
36
- this._events = [];
37
- this._layers = TIMELINE_LAYERS.map((l) => ({
38
- ...l,
39
- enabled: true,
40
- }));
41
- this._es = null;
42
- }
43
- static { this.styles = [
44
- tokens,
45
- css `
46
- :host {
47
- display: flex;
48
- flex-direction: column;
49
- flex: 1;
50
- overflow: hidden;
51
- }
52
- :host([hidden]) {
53
- display: none;
54
- }
55
- .toolbar {
56
- display: flex;
57
- align-items: center;
58
- gap: var(--lit-devtools-space-4);
59
- padding: var(--lit-devtools-space-3) var(--lit-devtools-space-5);
60
- border-bottom: 1px solid var(--lit-devtools-border);
61
- background: var(--lit-devtools-surface-low);
62
- flex-shrink: 0;
63
- }
64
- .spacer {
65
- flex: 1;
66
- }
67
- button {
68
- padding: var(--lit-devtools-space-2) var(--lit-devtools-space-5);
69
- border-radius: var(--lit-devtools-radius-sm);
70
- border: 1px solid var(--lit-devtools-border);
71
- background: var(--lit-devtools-surface-elevated);
72
- color: var(--lit-devtools-text);
73
- font-size: var(--lit-devtools-text-2xs);
74
- cursor: pointer;
75
- }
76
- button:hover {
77
- background: var(--lit-devtools-surface-hover);
78
- border-color: var(--lit-devtools-border-strong);
79
- }
80
- .record.active {
81
- border-color: var(--lit-devtools-error);
82
- background: var(--lit-devtools-error-soft);
83
- color: var(--lit-devtools-error);
84
- }
85
- timeline-event-list {
86
- flex: 1;
87
- overflow: hidden;
88
- }
89
- `,
90
- ]; }
91
- connectedCallback() {
92
- super.connectedCallback();
93
- this._loadStorage();
94
- this._es = new EventSource('/__lit-devtools-events');
95
- this._es.onmessage = (e) => {
96
- if (!this._recording)
97
- return;
98
- try {
99
- const batch = JSON.parse(e.data);
100
- if (Array.isArray(batch)) {
101
- const next = [...this._events, ...batch];
102
- this._events =
103
- next.length > MAX_EVENTS ? next.slice(-MAX_EVENTS) : next;
104
- }
105
- }
106
- catch {
107
- // ignore malformed data
108
- }
109
- };
110
- // Custom layers pushed from app code via addTimelineLayer().
111
- this._es.addEventListener('layer', (e) => {
112
- try {
113
- const layer = JSON.parse(e.data);
114
- if (layer?.id && !this._layers.some((l) => l.id === layer.id)) {
115
- this._layers = [...this._layers, { ...layer, enabled: true }];
116
- }
117
- }
118
- catch {
119
- // ignore
120
- }
121
- });
122
- }
123
- disconnectedCallback() {
124
- super.disconnectedCallback();
125
- this._es?.close();
126
- this._es = null;
127
- }
128
- // ---------------------------------------------------------------------------
129
- // State persistence
130
- // ---------------------------------------------------------------------------
131
- _loadStorage() {
132
- try {
133
- const raw = localStorage.getItem(LS_KEY);
134
- if (raw !== null) {
135
- const saved = JSON.parse(raw);
136
- this._layers = this._layers.map((l) => ({
137
- ...l,
138
- enabled: saved[l.id] ?? l.enabled,
139
- }));
140
- }
141
- }
142
- catch {
143
- // ignore (private/storage unavailable)
144
- }
145
- }
146
- _saveStorage() {
147
- try {
148
- localStorage.setItem(LS_KEY, JSON.stringify(Object.fromEntries(this._layers.map((l) => [l.id, l.enabled]))));
149
- }
150
- catch {
151
- // ignore
152
- }
153
- }
154
- // ---------------------------------------------------------------------------
155
- // Server sync
156
- // ---------------------------------------------------------------------------
157
- _layersToState() {
158
- const enabled = (id) => this._layers.find((l) => l.id === id)?.enabled ?? true;
159
- return {
160
- litLifecycleEnabled: enabled('lit-lifecycle'),
161
- litRenderEnabled: enabled('lit-render'),
162
- mouseEventEnabled: enabled('mouse'),
163
- keyboardEventEnabled: enabled('keyboard'),
164
- };
165
- }
166
- /** POST layer/recording state to the server control endpoint. */
167
- _postControl(body) {
168
- fetch('/__lit-devtools-control', {
169
- method: 'POST',
170
- headers: { 'Content-Type': 'application/json' },
171
- body: JSON.stringify(body),
172
- }).catch((err) => {
173
- console.warn('[lit-devtools] control POST failed', err);
174
- });
175
- }
176
- // ---------------------------------------------------------------------------
177
- // Actions
178
- // ---------------------------------------------------------------------------
179
- _toggleRecord() {
180
- this._recording = !this._recording;
181
- // On start, push the current layer enablement together with the recording
182
- // flag: the runtime defaults mouse/keyboard capture off, and otherwise only
183
- // hears about layers when one is toggled — so those layers wouldn't record
184
- // on the first session until the user toggled one. Send the full state so
185
- // the runtime matches what the panel shows from the first event.
186
- this._postControl(this._recording
187
- ? { recording: true, ...this._layersToState() }
188
- : { recording: false });
189
- }
190
- _clear() {
191
- this._events = [];
192
- }
193
- _onLayerToggle(e) {
194
- this._layers = this._layers.map((l) => l.id === e.detail.id ? { ...l, enabled: !l.enabled } : l);
195
- this._postControl(this._layersToState());
196
- this._saveStorage();
197
- }
198
- render() {
199
- return html `
200
- <div class="toolbar">
201
- <span class="spacer"></span>
202
- <button @click=${this._clear}>Clear</button>
203
- <button
204
- class="record ${this._recording ? 'active' : ''}"
205
- @click=${this._toggleRecord}
206
- >
207
- ${this._recording ? '⏹ Stop' : '▶ Record'}
208
- </button>
209
- </div>
210
- <timeline-layers
211
- .layers=${this._layers}
212
- @layer-toggle=${this._onLayerToggle}
213
- ></timeline-layers>
214
- <timeline-event-list
215
- .events=${this._events}
216
- .layers=${this._layers}
217
- ></timeline-event-list>
218
- `;
219
- }
220
- };
221
- __decorate([
222
- state()
223
- ], TimelineView.prototype, "_recording", void 0);
224
- __decorate([
225
- state()
226
- ], TimelineView.prototype, "_events", void 0);
227
- __decorate([
228
- state()
229
- ], TimelineView.prototype, "_layers", void 0);
230
- TimelineView = __decorate([
231
- customElement('timeline-view')
232
- ], TimelineView);
233
- export { TimelineView };
234
- //# sourceMappingURL=timeline-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline-view.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/panel/timeline-view.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {LitElement, html, css} from 'lit';\nimport {customElement, state} from 'lit/decorators.js';\nimport {tokens} from '../lib/tokens.js';\nimport type {TimelineEvent, TimelineLayer} from '../types/timeline.js';\nimport {TIMELINE_LAYERS} from '../types/timeline.js';\nimport type {LayerState} from './timeline-layers.js';\nimport './timeline-layers.js';\nimport './timeline-event-list.js';\n\nconst LS_KEY = 'lit-devtools-timeline-layers';\n\n/**\n * Cap on retained timeline events. The stream is unbounded (the mouse/keyboard\n * layers can emit at pointer-move rate), so without a cap the buffer — and the\n * list that re-renders from it — grows for the whole session. Keep the most\n * recent events; older ones scroll off.\n */\nconst MAX_EVENTS = 5000;\n\n/**\n * The Timeline view: records and lists Lit lifecycle / render / input events.\n * One tab of the DevTools panel shell (\\`lit-devtools-panel\\`); owns its own event\n * stream (SSE), recording state and layer toggles so it keeps recording while\n * other tabs are in front.\n */\n@customElement('timeline-view')\nexport class TimelineView extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n :host([hidden]) {\n display: none;\n }\n .toolbar {\n display: flex;\n align-items: center;\n gap: var(--lit-devtools-space-4);\n padding: var(--lit-devtools-space-3) var(--lit-devtools-space-5);\n border-bottom: 1px solid var(--lit-devtools-border);\n background: var(--lit-devtools-surface-low);\n flex-shrink: 0;\n }\n .spacer {\n flex: 1;\n }\n button {\n padding: var(--lit-devtools-space-2) var(--lit-devtools-space-5);\n border-radius: var(--lit-devtools-radius-sm);\n border: 1px solid var(--lit-devtools-border);\n background: var(--lit-devtools-surface-elevated);\n color: var(--lit-devtools-text);\n font-size: var(--lit-devtools-text-2xs);\n cursor: pointer;\n }\n button:hover {\n background: var(--lit-devtools-surface-hover);\n border-color: var(--lit-devtools-border-strong);\n }\n .record.active {\n border-color: var(--lit-devtools-error);\n background: var(--lit-devtools-error-soft);\n color: var(--lit-devtools-error);\n }\n timeline-event-list {\n flex: 1;\n overflow: hidden;\n }\n `,\n ];\n\n @state() private _recording = false;\n @state() private _events: TimelineEvent[] = [];\n @state() private _layers: LayerState[] = TIMELINE_LAYERS.map((l) => ({\n ...l,\n enabled: true,\n }));\n\n private _es: EventSource | null = null;\n\n override connectedCallback() {\n super.connectedCallback();\n this._loadStorage();\n this._es = new EventSource('/__lit-devtools-events');\n this._es.onmessage = (e: MessageEvent<string>) => {\n if (!this._recording) return;\n try {\n const batch = JSON.parse(e.data) as TimelineEvent[];\n if (Array.isArray(batch)) {\n const next = [...this._events, ...batch];\n this._events =\n next.length > MAX_EVENTS ? next.slice(-MAX_EVENTS) : next;\n }\n } catch {\n // ignore malformed data\n }\n };\n // Custom layers pushed from app code via addTimelineLayer().\n this._es.addEventListener('layer', (e: Event) => {\n try {\n const layer = JSON.parse(\n (e as MessageEvent<string>).data\n ) as TimelineLayer;\n if (layer?.id && !this._layers.some((l) => l.id === layer.id)) {\n this._layers = [...this._layers, {...layer, enabled: true}];\n }\n } catch {\n // ignore\n }\n });\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._es?.close();\n this._es = null;\n }\n\n // ---------------------------------------------------------------------------\n // State persistence\n // ---------------------------------------------------------------------------\n\n private _loadStorage(): void {\n try {\n const raw = localStorage.getItem(LS_KEY);\n if (raw !== null) {\n const saved = JSON.parse(raw) as Record<string, boolean>;\n this._layers = this._layers.map((l) => ({\n ...l,\n enabled: saved[l.id] ?? l.enabled,\n }));\n }\n } catch {\n // ignore (private/storage unavailable)\n }\n }\n\n private _saveStorage(): void {\n try {\n localStorage.setItem(\n LS_KEY,\n JSON.stringify(\n Object.fromEntries(this._layers.map((l) => [l.id, l.enabled]))\n )\n );\n } catch {\n // ignore\n }\n }\n\n // ---------------------------------------------------------------------------\n // Server sync\n // ---------------------------------------------------------------------------\n\n private _layersToState(): Record<string, boolean> {\n const enabled = (id: string): boolean =>\n this._layers.find((l) => l.id === id)?.enabled ?? true;\n return {\n litLifecycleEnabled: enabled('lit-lifecycle'),\n litRenderEnabled: enabled('lit-render'),\n mouseEventEnabled: enabled('mouse'),\n keyboardEventEnabled: enabled('keyboard'),\n };\n }\n\n /** POST layer/recording state to the server control endpoint. */\n private _postControl(body: Record<string, unknown>): void {\n fetch('/__lit-devtools-control', {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify(body),\n }).catch((err) => {\n console.warn('[lit-devtools] control POST failed', err);\n });\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private _toggleRecord() {\n this._recording = !this._recording;\n // On start, push the current layer enablement together with the recording\n // flag: the runtime defaults mouse/keyboard capture off, and otherwise only\n // hears about layers when one is toggled — so those layers wouldn't record\n // on the first session until the user toggled one. Send the full state so\n // the runtime matches what the panel shows from the first event.\n this._postControl(\n this._recording\n ? {recording: true, ...this._layersToState()}\n : {recording: false}\n );\n }\n\n private _clear() {\n this._events = [];\n }\n\n private _onLayerToggle(e: CustomEvent<{id: string}>) {\n this._layers = this._layers.map((l) =>\n l.id === e.detail.id ? {...l, enabled: !l.enabled} : l\n );\n this._postControl(this._layersToState());\n this._saveStorage();\n }\n\n override render() {\n return html`\n <div class=\"toolbar\">\n <span class=\"spacer\"></span>\n <button @click=${this._clear}>Clear</button>\n <button\n class=\"record ${this._recording ? 'active' : ''}\"\n @click=${this._toggleRecord}\n >\n ${this._recording ? '⏹ Stop' : '▶ Record'}\n </button>\n </div>\n <timeline-layers\n .layers=${this._layers}\n @layer-toggle=${this._onLayerToggle}\n ></timeline-layers>\n <timeline-event-list\n .events=${this._events}\n .layers=${this._layers}\n ></timeline-event-list>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'timeline-view': TimelineView;\n }\n}\n"]}