@oddsquad/vite-plugin-lit 0.0.3 → 0.1.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 (175) hide show
  1. package/index.d.ts +3 -2
  2. package/index.d.ts.map +1 -1
  3. package/index.js +1 -1
  4. package/index.js.map +1 -1
  5. package/lib/color-scheme.d.ts +30 -0
  6. package/lib/color-scheme.d.ts.map +1 -0
  7. package/lib/color-scheme.js +41 -0
  8. package/lib/color-scheme.js.map +1 -0
  9. package/lib/icons.d.ts +18 -0
  10. package/lib/icons.d.ts.map +1 -0
  11. package/lib/icons.js +23 -0
  12. package/lib/icons.js.map +1 -0
  13. package/lib/plugin.d.ts +117 -6
  14. package/lib/plugin.d.ts.map +1 -1
  15. package/lib/plugin.js +596 -20
  16. package/lib/plugin.js.map +1 -1
  17. package/lib/runtime/css.d.ts +94 -0
  18. package/lib/runtime/css.d.ts.map +1 -0
  19. package/lib/runtime/css.js +112 -0
  20. package/lib/runtime/css.js.map +1 -0
  21. package/lib/runtime/edge-panel.d.ts +18 -0
  22. package/lib/runtime/edge-panel.d.ts.map +1 -0
  23. package/lib/runtime/edge-panel.js +130 -0
  24. package/lib/runtime/edge-panel.js.map +1 -0
  25. package/lib/runtime/fonts.d.ts +18 -0
  26. package/lib/runtime/fonts.d.ts.map +1 -0
  27. package/lib/runtime/fonts.js +18 -0
  28. package/lib/runtime/fonts.js.map +1 -0
  29. package/lib/runtime/indicator.d.ts +7 -0
  30. package/lib/runtime/indicator.d.ts.map +1 -0
  31. package/lib/runtime/indicator.js +141 -0
  32. package/lib/runtime/indicator.js.map +1 -0
  33. package/lib/runtime/inspector/collect.d.ts +17 -0
  34. package/lib/runtime/inspector/collect.d.ts.map +1 -0
  35. package/lib/runtime/inspector/collect.js +132 -0
  36. package/lib/runtime/inspector/collect.js.map +1 -0
  37. package/lib/runtime/inspector/install.d.ts +7 -0
  38. package/lib/runtime/inspector/install.d.ts.map +1 -0
  39. package/lib/runtime/inspector/install.js +204 -0
  40. package/lib/runtime/inspector/install.js.map +1 -0
  41. package/lib/runtime/inspector/serialize.d.ts +10 -0
  42. package/lib/runtime/inspector/serialize.d.ts.map +1 -0
  43. package/lib/runtime/inspector/serialize.js +133 -0
  44. package/lib/runtime/inspector/serialize.js.map +1 -0
  45. package/lib/runtime/intern.d.ts.map +1 -1
  46. package/lib/runtime/intern.js +1 -1
  47. package/lib/runtime/intern.js.map +1 -1
  48. package/lib/runtime/overrides.d.ts +25 -0
  49. package/lib/runtime/overrides.d.ts.map +1 -0
  50. package/lib/runtime/overrides.js +33 -0
  51. package/lib/runtime/overrides.js.map +1 -0
  52. package/lib/runtime/patch.d.ts +6 -15
  53. package/lib/runtime/patch.d.ts.map +1 -1
  54. package/lib/runtime/patch.js +81 -28
  55. package/lib/runtime/patch.js.map +1 -1
  56. package/lib/runtime/source-meta.d.ts +16 -0
  57. package/lib/runtime/source-meta.d.ts.map +1 -0
  58. package/lib/runtime/source-meta.js +8 -0
  59. package/lib/runtime/source-meta.js.map +1 -0
  60. package/lib/runtime/source-overlay/editors.d.ts +9 -0
  61. package/lib/runtime/source-overlay/editors.d.ts.map +1 -0
  62. package/lib/runtime/source-overlay/editors.js +40 -0
  63. package/lib/runtime/source-overlay/editors.js.map +1 -0
  64. package/lib/runtime/source-overlay/mask-path.d.ts +7 -0
  65. package/lib/runtime/source-overlay/mask-path.d.ts.map +1 -0
  66. package/lib/runtime/source-overlay/mask-path.js +26 -0
  67. package/lib/runtime/source-overlay/mask-path.js.map +1 -0
  68. package/lib/runtime/source-overlay/overlay-element.d.ts +18 -0
  69. package/lib/runtime/source-overlay/overlay-element.d.ts.map +1 -0
  70. package/lib/runtime/source-overlay/overlay-element.js +381 -0
  71. package/lib/runtime/source-overlay/overlay-element.js.map +1 -0
  72. package/lib/runtime/source-overlay/source-host.d.ts +14 -0
  73. package/lib/runtime/source-overlay/source-host.d.ts.map +1 -0
  74. package/lib/runtime/source-overlay/source-host.js +94 -0
  75. package/lib/runtime/source-overlay/source-host.js.map +1 -0
  76. package/lib/runtime/source-overlay/template.d.ts +7 -0
  77. package/lib/runtime/source-overlay/template.d.ts.map +1 -0
  78. package/lib/runtime/source-overlay/template.js +125 -0
  79. package/lib/runtime/source-overlay/template.js.map +1 -0
  80. package/lib/runtime/source-overlay.d.ts +7 -0
  81. package/lib/runtime/source-overlay.d.ts.map +1 -0
  82. package/lib/runtime/source-overlay.js +11 -0
  83. package/lib/runtime/source-overlay.js.map +1 -0
  84. package/lib/runtime/timeline/clock.d.ts +10 -0
  85. package/lib/runtime/timeline/clock.d.ts.map +1 -0
  86. package/lib/runtime/timeline/clock.js +22 -0
  87. package/lib/runtime/timeline/clock.js.map +1 -0
  88. package/lib/runtime/timeline/identity.d.ts +37 -0
  89. package/lib/runtime/timeline/identity.d.ts.map +1 -0
  90. package/lib/runtime/timeline/identity.js +73 -0
  91. package/lib/runtime/timeline/identity.js.map +1 -0
  92. package/lib/runtime/timeline/input.d.ts +16 -0
  93. package/lib/runtime/timeline/input.d.ts.map +1 -0
  94. package/lib/runtime/timeline/input.js +87 -0
  95. package/lib/runtime/timeline/input.js.map +1 -0
  96. package/lib/runtime/timeline/install.d.ts +7 -0
  97. package/lib/runtime/timeline/install.d.ts.map +1 -0
  98. package/lib/runtime/timeline/install.js +69 -0
  99. package/lib/runtime/timeline/install.js.map +1 -0
  100. package/lib/runtime/timeline/lifecycle.d.ts +27 -0
  101. package/lib/runtime/timeline/lifecycle.d.ts.map +1 -0
  102. package/lib/runtime/timeline/lifecycle.js +225 -0
  103. package/lib/runtime/timeline/lifecycle.js.map +1 -0
  104. package/lib/runtime/timeline/public-api.d.ts +28 -0
  105. package/lib/runtime/timeline/public-api.d.ts.map +1 -0
  106. package/lib/runtime/timeline/public-api.js +44 -0
  107. package/lib/runtime/timeline/public-api.js.map +1 -0
  108. package/lib/runtime/timeline/render.d.ts +39 -0
  109. package/lib/runtime/timeline/render.d.ts.map +1 -0
  110. package/lib/runtime/timeline/render.js +109 -0
  111. package/lib/runtime/timeline/render.js.map +1 -0
  112. package/lib/runtime/timeline/transport.d.ts +42 -0
  113. package/lib/runtime/timeline/transport.d.ts.map +1 -0
  114. package/lib/runtime/timeline/transport.js +86 -0
  115. package/lib/runtime/timeline/transport.js.map +1 -0
  116. package/lib/segmented-tabs.d.ts +33 -0
  117. package/lib/segmented-tabs.d.ts.map +1 -0
  118. package/lib/segmented-tabs.js +129 -0
  119. package/lib/segmented-tabs.js.map +1 -0
  120. package/lib/source-meta.d.ts +26 -0
  121. package/lib/source-meta.d.ts.map +1 -0
  122. package/lib/source-meta.js +129 -0
  123. package/lib/source-meta.js.map +1 -0
  124. package/lib/timeline-plugin.d.ts +72 -0
  125. package/lib/timeline-plugin.d.ts.map +1 -0
  126. package/lib/timeline-plugin.js +376 -0
  127. package/lib/timeline-plugin.js.map +1 -0
  128. package/lib/tokens.d.ts +38 -0
  129. package/lib/tokens.d.ts.map +1 -0
  130. package/lib/tokens.js +263 -0
  131. package/lib/tokens.js.map +1 -0
  132. package/lib/transform.d.ts +5 -5
  133. package/lib/transform.d.ts.map +1 -1
  134. package/lib/transform.js +3 -3
  135. package/lib/transform.js.map +1 -1
  136. package/lib/types.d.ts +34 -0
  137. package/lib/types.d.ts.map +1 -0
  138. package/lib/types.js +7 -0
  139. package/lib/types.js.map +1 -0
  140. package/lib/wrap-table.d.ts.map +1 -1
  141. package/lib/wrap-table.js.map +1 -1
  142. package/package.json +18 -4
  143. package/panel/components-view.d.ts +60 -0
  144. package/panel/components-view.d.ts.map +1 -0
  145. package/panel/components-view.js +581 -0
  146. package/panel/components-view.js.map +1 -0
  147. package/panel/devtools-settings.d.ts +41 -0
  148. package/panel/devtools-settings.d.ts.map +1 -0
  149. package/panel/devtools-settings.js +463 -0
  150. package/panel/devtools-settings.js.map +1 -0
  151. package/panel/index.html +29 -0
  152. package/panel/lit-devtools-panel.d.ts +37 -0
  153. package/panel/lit-devtools-panel.d.ts.map +1 -0
  154. package/panel/lit-devtools-panel.js +183 -0
  155. package/panel/lit-devtools-panel.js.map +1 -0
  156. package/panel/timeline-event-list.d.ts +43 -0
  157. package/panel/timeline-event-list.d.ts.map +1 -0
  158. package/panel/timeline-event-list.js +416 -0
  159. package/panel/timeline-event-list.js.map +1 -0
  160. package/panel/timeline-layers.d.ts +25 -0
  161. package/panel/timeline-layers.d.ts.map +1 -0
  162. package/panel/timeline-layers.js +96 -0
  163. package/panel/timeline-layers.js.map +1 -0
  164. package/panel/timeline-view.d.ts +38 -0
  165. package/panel/timeline-view.d.ts.map +1 -0
  166. package/panel/timeline-view.js +234 -0
  167. package/panel/timeline-view.js.map +1 -0
  168. package/types/inspector.d.ts +130 -0
  169. package/types/inspector.d.ts.map +1 -0
  170. package/types/inspector.js +16 -0
  171. package/types/inspector.js.map +1 -0
  172. package/types/timeline.d.ts +98 -0
  173. package/types/timeline.d.ts.map +1 -0
  174. package/types/timeline.js +39 -0
  175. package/types/timeline.js.map +1 -0
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,25 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,96 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,38 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,234 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ */
6
+ /**
7
+ * Shared types and channel/path constants for the Components inspector.
8
+ *
9
+ * The inspector lets the DevTools panel show a hierarchical tree of the Lit
10
+ * components on the page plus a detail view (reactive properties, internal
11
+ * state, attributes, source) of a selected element. The panel can't touch the
12
+ * page DOM directly (separate iframe document), so everything flows over the
13
+ * existing transport: panel → server (POST {@link INSPECT_PATH}) → app runtime
14
+ * (HMR {@link INSPECT_CMD_CHANNEL}); app → server (HMR
15
+ * {@link INSPECT_DATA_CHANNEL}) → panel (SSE `event: {@link INSPECT_SSE_EVENT}`).
16
+ *
17
+ * Elements are referenced across the boundary by the stable numeric id from the
18
+ * timeline's `idOf()` WeakMap, so a tree node, a details payload, and an
19
+ * inspector pick all agree on identity.
20
+ */
21
+ export interface ElementSource {
22
+ file: string;
23
+ line: number;
24
+ }
25
+ /** A node in the component render tree (one inspectable Lit element). */
26
+ export interface InspectorTreeNode {
27
+ id: number;
28
+ tagName: string;
29
+ componentName?: string;
30
+ source?: ElementSource;
31
+ children: InspectorTreeNode[];
32
+ }
33
+ /** One reactive property (or internal `@state`) of an inspected element. */
34
+ export interface InspectorProp {
35
+ name: string;
36
+ /** Serialized, depth-limited preview of the current value. */
37
+ value: string;
38
+ /** A short type tag (`string`, `number`, `Array(3)`, `MyClass`, …). */
39
+ type: string;
40
+ /** The reflected attribute name, or `false` when `attribute: false`. */
41
+ attribute: string | false;
42
+ /** Whether the property reflects to its attribute. */
43
+ reflects: boolean;
44
+ /** Whether it's an internal `@state()` (no public attribute). */
45
+ state: boolean;
46
+ }
47
+ /** Full detail snapshot for a single inspected element. */
48
+ export interface InspectorDetails {
49
+ id: number;
50
+ tagName: string;
51
+ componentName?: string;
52
+ source?: ElementSource;
53
+ attributes: Array<{
54
+ name: string;
55
+ value: string;
56
+ }>;
57
+ properties: InspectorProp[];
58
+ flags: {
59
+ hasUpdated: boolean;
60
+ isUpdatePending: boolean;
61
+ hasShadowRoot: boolean;
62
+ };
63
+ }
64
+ /** App runtime → panel messages, carried on SSE `event: inspect`. */
65
+ export type InspectorMessage =
66
+ /** The runtime came online; the panel should (re)request the tree. */
67
+ {
68
+ type: 'ready';
69
+ } | {
70
+ type: 'tree';
71
+ roots: InspectorTreeNode[];
72
+ } | {
73
+ type: 'details';
74
+ details: InspectorDetails;
75
+ }
76
+ /** The requested element id couldn't be resolved (removed / GC'd). */
77
+ | {
78
+ type: 'gone';
79
+ id: number;
80
+ }
81
+ /** An inspect-mode overlay pick — select this element in the panel. */
82
+ | {
83
+ type: 'pick';
84
+ id: number;
85
+ };
86
+ /** Panel → app runtime commands, POSTed to {@link INSPECT_PATH}. */
87
+ export type InspectorCommand = {
88
+ type: 'tree';
89
+ } | {
90
+ type: 'details';
91
+ id: number;
92
+ }
93
+ /** Keep pushing fresh details for `id` as it updates; `null` stops. */
94
+ | {
95
+ type: 'watch';
96
+ id: number | null;
97
+ }
98
+ /** Outline element `id` in the page on tree hover; `null` clears it. */
99
+ | {
100
+ type: 'highlight';
101
+ id: number | null;
102
+ }
103
+ /**
104
+ * Opt-in live tree: when enabled, the runtime watches the DOM and pushes a
105
+ * fresh `tree` message whenever the component hierarchy changes. Off by
106
+ * default (the panel otherwise refreshes on demand / on pick).
107
+ */
108
+ | {
109
+ type: 'observe';
110
+ enabled: boolean;
111
+ }
112
+ /**
113
+ * Start the overlay's inspect-mode picker (the panel's "Pick" button). Handled
114
+ * by the server (it broadcasts {@link INSPECT_OVERLAY_TOGGLE_CHANNEL}), not the
115
+ * app runtime, so it never reaches the runtime's command handler.
116
+ */
117
+ | {
118
+ type: 'pick';
119
+ };
120
+ /** HMR channel the server uses to forward a panel command to the app runtime. */
121
+ export declare const INSPECT_CMD_CHANNEL = "lit:inspect:cmd";
122
+ /** HMR channel the app runtime uses to push an {@link InspectorMessage}. */
123
+ export declare const INSPECT_DATA_CHANNEL = "lit:inspect:data";
124
+ /** Vite HMR channel the DevTools "inspect element" command broadcasts on. */
125
+ export declare const INSPECT_OVERLAY_TOGGLE_CHANNEL = "lit-devtools:toggle-inspect";
126
+ /** POST endpoint the panel uses to send an {@link InspectorCommand}. */
127
+ export declare const INSPECT_PATH = "/__lit-devtools-inspect";
128
+ /** Named SSE event the server relays {@link InspectorMessage}s to the panel on. */
129
+ export declare const INSPECT_SSE_EVENT = "inspect";
130
+ //# sourceMappingURL=inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/types/inspector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACjD,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE;QACL,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;QACzB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED,qEAAqE;AACrE,MAAM,MAAM,gBAAgB;AAC1B,sEAAsE;AACpE;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAAC,GAC1C;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAC;AAC9C,sEAAsE;GACpE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC;AAC5B,uEAAuE;GACrE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAAC;AAE/B,oEAAoE;AACpE,MAAM,MAAM,gBAAgB,GACxB;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GACd;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC;AAC/B,uEAAuE;GACrE;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAC;AACpC,wEAAwE;GACtE;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAC;AACxC;;;;GAIG;GACD;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAC;AACrC;;;;GAIG;GACD;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAAC;AAEnB,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,6EAA6E;AAC7E,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAE5E,wEAAwE;AACxE,eAAO,MAAM,YAAY,4BAA4B,CAAC;AAEtD,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ */
6
+ /** HMR channel the server uses to forward a panel command to the app runtime. */
7
+ export const INSPECT_CMD_CHANNEL = 'lit:inspect:cmd';
8
+ /** HMR channel the app runtime uses to push an {@link InspectorMessage}. */
9
+ export const INSPECT_DATA_CHANNEL = 'lit:inspect:data';
10
+ /** Vite HMR channel the DevTools "inspect element" command broadcasts on. */
11
+ export const INSPECT_OVERLAY_TOGGLE_CHANNEL = 'lit-devtools:toggle-inspect';
12
+ /** POST endpoint the panel uses to send an {@link InspectorCommand}. */
13
+ export const INSPECT_PATH = '/__lit-devtools-inspect';
14
+ /** Named SSE event the server relays {@link InspectorMessage}s to the panel on. */
15
+ export const INSPECT_SSE_EVENT = 'inspect';
16
+ //# sourceMappingURL=inspector.js.map