@oddsquad/vite-plugin-lit 0.2.2 → 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.
- package/CHANGELOG.md +64 -0
- package/LICENSE +28 -0
- package/README.md +153 -0
- package/bin.mjs +154 -0
- package/client.d.ts +61 -0
- package/dist/client/assets/browser-agent-rpc-BXhoSh1z-BvWe4sTJ.js +69 -0
- package/dist/client/assets/browser-agent-rpc-BXhoSh1z-BvWe4sTJ.js.map +1 -0
- package/dist/client/assets/index-CFrVgNfS.js +9740 -0
- package/dist/client/assets/index-CFrVgNfS.js.map +1 -0
- package/{panel → dist/client}/index.html +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +2 -2
- package/index.js.map +1 -1
- package/lib/color-scheme.d.ts.map +1 -1
- package/lib/color-scheme.js +17 -21
- package/lib/color-scheme.js.map +1 -1
- package/lib/devframe/definition.d.ts +45 -0
- package/lib/devframe/definition.d.ts.map +1 -0
- package/lib/devframe/definition.js +547 -0
- package/lib/devframe/definition.js.map +1 -0
- package/lib/devframe/icon.d.ts +8 -0
- package/lib/devframe/icon.d.ts.map +1 -0
- package/lib/devframe/icon.js +21 -0
- package/lib/devframe/icon.js.map +1 -0
- package/lib/devframe/paths.d.ts +12 -0
- package/lib/devframe/paths.d.ts.map +1 -0
- package/lib/devframe/paths.js +38 -0
- package/lib/devframe/paths.js.map +1 -0
- package/lib/devframe/protocol.d.ts +218 -0
- package/lib/devframe/protocol.d.ts.map +1 -0
- package/lib/devframe/protocol.js +76 -0
- package/lib/devframe/protocol.js.map +1 -0
- package/lib/devframe/source.d.ts +49 -0
- package/lib/devframe/source.d.ts.map +1 -0
- package/lib/devframe/source.js +23 -0
- package/lib/devframe/source.js.map +1 -0
- package/lib/devframe/vite.d.ts +116 -0
- package/lib/devframe/vite.d.ts.map +1 -0
- package/lib/devframe/vite.js +291 -0
- package/lib/devframe/vite.js.map +1 -0
- package/lib/http.d.ts +29 -0
- package/lib/http.d.ts.map +1 -0
- package/lib/http.js +35 -0
- package/lib/http.js.map +1 -0
- package/lib/icons.d.ts +2 -0
- package/lib/icons.d.ts.map +1 -1
- package/lib/icons.js +10 -4
- package/lib/icons.js.map +1 -1
- package/lib/plugin.d.ts +15 -4
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +640 -574
- package/lib/plugin.js.map +1 -1
- package/lib/runtime/css.d.ts +2 -16
- package/lib/runtime/css.d.ts.map +1 -1
- package/lib/runtime/css.js +43 -36
- package/lib/runtime/css.js.map +1 -1
- package/lib/runtime/edge-panel.d.ts.map +1 -1
- package/lib/runtime/edge-panel.js +82 -91
- package/lib/runtime/edge-panel.js.map +1 -1
- package/lib/runtime/fonts.d.ts.map +1 -1
- package/lib/runtime/fonts.js +1 -1
- package/lib/runtime/fonts.js.map +1 -1
- package/lib/runtime/indicator.d.ts.map +1 -1
- package/lib/runtime/indicator.js +71 -74
- package/lib/runtime/indicator.js.map +1 -1
- package/lib/runtime/inspector/collect.d.ts.map +1 -1
- package/lib/runtime/inspector/collect.js +83 -90
- package/lib/runtime/inspector/collect.js.map +1 -1
- package/lib/runtime/inspector/highlight.d.ts +16 -0
- package/lib/runtime/inspector/highlight.d.ts.map +1 -0
- package/lib/runtime/inspector/highlight.js +66 -0
- package/lib/runtime/inspector/highlight.js.map +1 -0
- package/lib/runtime/inspector/install.d.ts.map +1 -1
- package/lib/runtime/inspector/install.js +180 -205
- package/lib/runtime/inspector/install.js.map +1 -1
- package/lib/runtime/inspector/serialize.d.ts.map +1 -1
- package/lib/runtime/inspector/serialize.js +86 -107
- package/lib/runtime/inspector/serialize.js.map +1 -1
- package/lib/runtime/intern.d.ts.map +1 -1
- package/lib/runtime/intern.js +31 -29
- package/lib/runtime/intern.js.map +1 -1
- package/lib/runtime/overrides.d.ts.map +1 -1
- package/lib/runtime/overrides.js +14 -13
- package/lib/runtime/overrides.js.map +1 -1
- package/lib/runtime/patch.d.ts +8 -0
- package/lib/runtime/patch.d.ts.map +1 -1
- package/lib/runtime/patch.js +321 -282
- package/lib/runtime/patch.js.map +1 -1
- package/lib/runtime/source-meta.d.ts.map +1 -1
- package/lib/runtime/source-meta.js +1 -1
- package/lib/runtime/source-meta.js.map +1 -1
- package/lib/runtime/source-overlay/editors.d.ts.map +1 -1
- package/lib/runtime/source-overlay/editors.js +27 -27
- package/lib/runtime/source-overlay/editors.js.map +1 -1
- package/lib/runtime/source-overlay/mask-path.d.ts.map +1 -1
- package/lib/runtime/source-overlay/mask-path.js +15 -15
- package/lib/runtime/source-overlay/mask-path.js.map +1 -1
- package/lib/runtime/source-overlay/overlay-element.d.ts.map +1 -1
- package/lib/runtime/source-overlay/overlay-element.js +347 -356
- package/lib/runtime/source-overlay/overlay-element.js.map +1 -1
- package/lib/runtime/source-overlay/source-host.d.ts.map +1 -1
- package/lib/runtime/source-overlay/source-host.js +64 -71
- package/lib/runtime/source-overlay/source-host.js.map +1 -1
- package/lib/runtime/source-overlay/template.d.ts.map +1 -1
- package/lib/runtime/source-overlay/template.js +3 -3
- package/lib/runtime/source-overlay/template.js.map +1 -1
- package/lib/runtime/source-overlay.d.ts.map +1 -1
- package/lib/runtime/source-overlay.js +5 -2
- package/lib/runtime/source-overlay.js.map +1 -1
- package/lib/runtime/timeline/clock.d.ts.map +1 -1
- package/lib/runtime/timeline/clock.js +2 -2
- package/lib/runtime/timeline/clock.js.map +1 -1
- package/lib/runtime/timeline/flash.d.ts +39 -0
- package/lib/runtime/timeline/flash.d.ts.map +1 -0
- package/lib/runtime/timeline/flash.js +169 -0
- package/lib/runtime/timeline/flash.js.map +1 -0
- package/lib/runtime/timeline/identity.d.ts.map +1 -1
- package/lib/runtime/timeline/identity.js +27 -27
- package/lib/runtime/timeline/identity.js.map +1 -1
- package/lib/runtime/timeline/input.d.ts.map +1 -1
- package/lib/runtime/timeline/input.js +54 -67
- package/lib/runtime/timeline/input.js.map +1 -1
- package/lib/runtime/timeline/install.d.ts.map +1 -1
- package/lib/runtime/timeline/install.js +38 -29
- package/lib/runtime/timeline/install.js.map +1 -1
- package/lib/runtime/timeline/lifecycle.d.ts +8 -0
- package/lib/runtime/timeline/lifecycle.d.ts.map +1 -1
- package/lib/runtime/timeline/lifecycle.js +149 -133
- package/lib/runtime/timeline/lifecycle.js.map +1 -1
- package/lib/runtime/timeline/public-api.d.ts.map +1 -1
- package/lib/runtime/timeline/public-api.js +9 -9
- package/lib/runtime/timeline/public-api.js.map +1 -1
- package/lib/runtime/timeline/render.d.ts.map +1 -1
- package/lib/runtime/timeline/render.js +70 -75
- package/lib/runtime/timeline/render.js.map +1 -1
- package/lib/runtime/timeline/transport.d.ts.map +1 -1
- package/lib/runtime/timeline/transport.js +39 -43
- package/lib/runtime/timeline/transport.js.map +1 -1
- package/lib/segmented-tabs.d.ts +3 -1
- package/lib/segmented-tabs.d.ts.map +1 -1
- package/lib/segmented-tabs.js +136 -107
- package/lib/segmented-tabs.js.map +1 -1
- package/lib/snapshot.d.ts +28 -0
- package/lib/snapshot.d.ts.map +1 -0
- package/lib/snapshot.js +57 -0
- package/lib/snapshot.js.map +1 -0
- package/lib/source-meta.d.ts.map +1 -1
- package/lib/source-meta.js +176 -162
- package/lib/source-meta.js.map +1 -1
- package/lib/timeline/derive.d.ts +152 -0
- package/lib/timeline/derive.d.ts.map +1 -0
- package/lib/timeline/derive.js +242 -0
- package/lib/timeline/derive.js.map +1 -0
- package/lib/timeline-plugin.d.ts.map +1 -1
- package/lib/timeline-plugin.js +304 -321
- package/lib/timeline-plugin.js.map +1 -1
- package/lib/tokens.d.ts.map +1 -1
- package/lib/tokens.js +17 -18
- package/lib/tokens.js.map +1 -1
- package/lib/transform.d.ts.map +1 -1
- package/lib/transform.js +62 -57
- package/lib/transform.js.map +1 -1
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +1 -1
- package/lib/types.js.map +1 -1
- package/lib/wrap-table.d.ts.map +1 -1
- package/lib/wrap-table.js +19 -17
- package/lib/wrap-table.js.map +1 -1
- package/package.json +77 -13
- package/types/hmr-incompatibility.d.ts +59 -0
- package/types/hmr-incompatibility.d.ts.map +1 -0
- package/types/hmr-incompatibility.js +30 -0
- package/types/hmr-incompatibility.js.map +1 -0
- package/types/in-page.d.ts +49 -0
- package/types/in-page.d.ts.map +1 -0
- package/types/in-page.js +33 -0
- package/types/in-page.js.map +1 -0
- package/types/inspector.d.ts.map +1 -1
- package/types/inspector.js.map +1 -1
- package/types/snapshot.d.ts +44 -0
- package/types/snapshot.d.ts.map +1 -0
- package/types/snapshot.js +7 -0
- package/types/snapshot.js.map +1 -0
- package/types/timeline.d.ts +11 -0
- package/types/timeline.d.ts.map +1 -1
- package/types/timeline.js.map +1 -1
- package/panel/components-view.d.ts +0 -60
- package/panel/components-view.d.ts.map +0 -1
- package/panel/components-view.js +0 -587
- package/panel/components-view.js.map +0 -1
- package/panel/devtools-settings.d.ts +0 -41
- package/panel/devtools-settings.d.ts.map +0 -1
- package/panel/devtools-settings.js +0 -463
- package/panel/devtools-settings.js.map +0 -1
- package/panel/lit-devtools-panel.d.ts +0 -37
- package/panel/lit-devtools-panel.d.ts.map +0 -1
- package/panel/lit-devtools-panel.js +0 -185
- package/panel/lit-devtools-panel.js.map +0 -1
- package/panel/timeline-event-list.d.ts +0 -43
- package/panel/timeline-event-list.d.ts.map +0 -1
- package/panel/timeline-event-list.js +0 -416
- package/panel/timeline-event-list.js.map +0 -1
- package/panel/timeline-layers.d.ts +0 -25
- package/panel/timeline-layers.d.ts.map +0 -1
- package/panel/timeline-layers.js +0 -96
- package/panel/timeline-layers.js.map +0 -1
- package/panel/timeline-view.d.ts +0 -38
- package/panel/timeline-view.d.ts.map +0 -1
- package/panel/timeline-view.js +0 -234
- package/panel/timeline-view.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oddsquad/vite-plugin-lit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Vite plugin providing true HMR for Lit components, plus CSS helpers and a DevTools panel",
|
|
5
5
|
"license": "BSD-3-Clause",
|
|
6
6
|
"author": "Oddsquad (based on @lit-labs/vite-hmr by Google LLC)",
|
|
@@ -8,11 +8,17 @@
|
|
|
8
8
|
"main": "index.js",
|
|
9
9
|
"module": "index.js",
|
|
10
10
|
"files": [
|
|
11
|
+
"/CHANGELOG.md",
|
|
11
12
|
"/lib/",
|
|
13
|
+
"/dist/client/",
|
|
12
14
|
"/types/",
|
|
13
|
-
"/
|
|
14
|
-
"/
|
|
15
|
+
"/index.{d.ts,d.ts.map,js,js.map}",
|
|
16
|
+
"/client.d.ts",
|
|
17
|
+
"/bin.mjs"
|
|
15
18
|
],
|
|
19
|
+
"bin": {
|
|
20
|
+
"lit-devtools": "./bin.mjs"
|
|
21
|
+
},
|
|
16
22
|
"exports": {
|
|
17
23
|
".": {
|
|
18
24
|
"types": "./index.d.ts",
|
|
@@ -21,34 +27,92 @@
|
|
|
21
27
|
"./css.js": {
|
|
22
28
|
"types": "./lib/runtime/css.d.ts",
|
|
23
29
|
"default": "./lib/runtime/css.js"
|
|
30
|
+
},
|
|
31
|
+
"./client": {
|
|
32
|
+
"types": "./client.d.ts"
|
|
24
33
|
}
|
|
25
34
|
},
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/oddcelot/vite-plugin-lit.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/oddcelot/vite-plugin-lit/issues"
|
|
29
41
|
},
|
|
30
42
|
"dependencies": {
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
43
|
+
"devframe": "1.0.0",
|
|
44
|
+
"es-module-lexer": "^3.0.2",
|
|
45
|
+
"launch-editor": "^2.14.1",
|
|
46
|
+
"magic-string": "^1.4.1"
|
|
34
47
|
},
|
|
35
48
|
"peerDependencies": {
|
|
49
|
+
"@devframes/agentic": "1.0.0",
|
|
50
|
+
"@vitejs/devtools-kit": "^0.7.5",
|
|
51
|
+
"cac": "^7.0.0",
|
|
36
52
|
"lightningcss": "^1.30.0",
|
|
37
53
|
"lit": "^3.0.0",
|
|
38
54
|
"vite": "^7.0.0 || ^8.0.0"
|
|
39
55
|
},
|
|
40
56
|
"peerDependenciesMeta": {
|
|
57
|
+
"@devframes/agentic": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"@vitejs/devtools-kit": {
|
|
61
|
+
"optional": true
|
|
62
|
+
},
|
|
63
|
+
"cac": {
|
|
64
|
+
"optional": true
|
|
65
|
+
},
|
|
41
66
|
"lightningcss": {
|
|
42
67
|
"optional": true
|
|
43
68
|
}
|
|
44
69
|
},
|
|
45
70
|
"devDependencies": {
|
|
46
|
-
"
|
|
71
|
+
"@devframes/agentic": "1.0.0",
|
|
72
|
+
"@devframes/service-open": "1.0.0",
|
|
73
|
+
"@lit-labs/signals": "^0.3.0",
|
|
74
|
+
"@lit-labs/virtualizer": "^2.1.1",
|
|
75
|
+
"@lit/context": "^1.1.6",
|
|
76
|
+
"@lit/task": "^1.0.3",
|
|
77
|
+
"@types/node": "^26.6.1",
|
|
78
|
+
"@vitejs/devtools-kit": "0.7.5",
|
|
79
|
+
"cac": "7.0.0",
|
|
80
|
+
"lightningcss": "^1.33.0",
|
|
81
|
+
"lit": "^3.3.3",
|
|
82
|
+
"playwright-core": "^1.63.0",
|
|
83
|
+
"typescript": "^7.0.2",
|
|
84
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@0.3.2",
|
|
85
|
+
"vite-plus": "0.3.2"
|
|
86
|
+
},
|
|
87
|
+
"engines": {
|
|
88
|
+
"node": ">=20"
|
|
89
|
+
},
|
|
90
|
+
"devEngines": {
|
|
91
|
+
"runtime": {
|
|
92
|
+
"name": "node",
|
|
93
|
+
"version": ">=26"
|
|
94
|
+
},
|
|
95
|
+
"packageManager": {
|
|
96
|
+
"name": "pnpm",
|
|
97
|
+
"version": ">=12"
|
|
98
|
+
}
|
|
47
99
|
},
|
|
48
100
|
"publishConfig": {
|
|
49
101
|
"access": "public"
|
|
50
102
|
},
|
|
51
|
-
"
|
|
52
|
-
"
|
|
103
|
+
"scripts": {
|
|
104
|
+
"build": "tsc --pretty && pnpm run build:panel && node scripts/format-build-output.mjs",
|
|
105
|
+
"build:lit-canary": "node scripts/build-lit-canary.mjs",
|
|
106
|
+
"dev": "pnpm run build && vp dev playground",
|
|
107
|
+
"test": "pnpm run test:unit && pnpm run test:e2e",
|
|
108
|
+
"test:unit": "node scripts/check-client-types.mjs && vp test run --project unit",
|
|
109
|
+
"test:e2e": "pnpm run build && vp test run --project e2e",
|
|
110
|
+
"bench": "node bench/run.mjs",
|
|
111
|
+
"bench:serve": "node bench/run.mjs --serve",
|
|
112
|
+
"docs:dev": "pnpm --filter ./docs dev",
|
|
113
|
+
"docs:build": "pnpm --filter ./docs build",
|
|
114
|
+
"format": "vp fmt \"**/*.{cjs,html,js,json,md,mdx,ts,yaml}\"",
|
|
115
|
+
"format:check": "vp fmt \"**/*.{cjs,html,js,json,md,mdx,ts,yaml}\" --check",
|
|
116
|
+
"build:panel": "vp build src/panel"
|
|
53
117
|
}
|
|
54
|
-
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Shared types and channel constant for HMR-incompatibility reporting.
|
|
8
|
+
*
|
|
9
|
+
* When the browser runtime can't hot-patch a component in place it logs one
|
|
10
|
+
* line to the console and, by default, full-reloads the page — which clears
|
|
11
|
+
* the console before anyone reads it. These types carry the same reason, in
|
|
12
|
+
* structured form, from the page runtime to the node side over the HMR
|
|
13
|
+
* {@link HMR_INCOMPATIBLE_CHANNEL}, where it is cached so the DevTools panel
|
|
14
|
+
* and an agent-facing query RPC can both read it back after the reload.
|
|
15
|
+
*
|
|
16
|
+
* The three reasons mirror the "Cannot be patched in place" cases documented
|
|
17
|
+
* in `docs/src/content/docs/reference/limitations.mdx`; adding a fourth means
|
|
18
|
+
* extending {@link HmrIncompatibilityReason} and {@link describeHmrReason}
|
|
19
|
+
* together, plus the docs page.
|
|
20
|
+
*/
|
|
21
|
+
/** Why a component couldn't be hot-patched in place, or a related silent case. */
|
|
22
|
+
export type HmrIncompatibilityReason = {
|
|
23
|
+
code: 'accessor-decorators';
|
|
24
|
+
} | {
|
|
25
|
+
code: 'patch-failed';
|
|
26
|
+
detail: string;
|
|
27
|
+
} | {
|
|
28
|
+
code: 'observed-attributes-changed';
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* One HMR-incompatibility notice from the page runtime. `action` reflects
|
|
32
|
+
* what actually happened for *this* event, not just the configured default:
|
|
33
|
+
* 'reload' / 'warn' come from `hmr.onIncompatible`; 'none' is the
|
|
34
|
+
* `observed-attributes-changed` case, which never reloads regardless of that
|
|
35
|
+
* setting (the patch already succeeded).
|
|
36
|
+
*/
|
|
37
|
+
export interface HmrIncompatibilityEvent {
|
|
38
|
+
tagName: string;
|
|
39
|
+
/** `Date.now()` in the browser — there is no shared clock with the timeline's `performance.now()`. */
|
|
40
|
+
time: number;
|
|
41
|
+
reason: HmrIncompatibilityReason;
|
|
42
|
+
action: 'reload' | 'warn' | 'none';
|
|
43
|
+
}
|
|
44
|
+
/** HMR channel the page runtime uses to report an {@link HmrIncompatibilityEvent}. */
|
|
45
|
+
export declare const HMR_INCOMPATIBLE_CHANNEL = "lit:hmr:incompatible";
|
|
46
|
+
/**
|
|
47
|
+
* How many events the node-side cache keeps, and the panel mirrors. A dev
|
|
48
|
+
* session with many failing edits must not grow either without bound; the
|
|
49
|
+
* newest are the ones worth keeping.
|
|
50
|
+
*/
|
|
51
|
+
export declare const MAX_HMR_INCOMPATIBILITIES = 50;
|
|
52
|
+
/**
|
|
53
|
+
* Human-readable text for a reason, shared by the browser console message in
|
|
54
|
+
* `src/lib/runtime/patch.ts` and the DevTools panel's banner so the two can't
|
|
55
|
+
* drift apart. The wording of the first two cases is asserted verbatim by
|
|
56
|
+
* `src/test/unit/patch_test.ts` — it is part of the console output contract.
|
|
57
|
+
*/
|
|
58
|
+
export declare const describeHmrReason: (reason: HmrIncompatibilityReason) => string;
|
|
59
|
+
//# sourceMappingURL=hmr-incompatibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-incompatibility.d.ts","sourceRoot":"","sources":["../src/types/hmr-incompatibility.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,kFAAkF;AAClF,MAAM,MAAM,wBAAwB,GAChC;IAAC,IAAI,EAAE,qBAAqB,CAAA;CAAC,GAC7B;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GACtC;IAAC,IAAI,EAAE,6BAA6B,CAAA;CAAC,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;CACpC;AAED,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,WAAY,wBAAwB,KAAG,MASpE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
*/
|
|
6
|
+
/** HMR channel the page runtime uses to report an {@link HmrIncompatibilityEvent}. */
|
|
7
|
+
export const HMR_INCOMPATIBLE_CHANNEL = 'lit:hmr:incompatible';
|
|
8
|
+
/**
|
|
9
|
+
* How many events the node-side cache keeps, and the panel mirrors. A dev
|
|
10
|
+
* session with many failing edits must not grow either without bound; the
|
|
11
|
+
* newest are the ones worth keeping.
|
|
12
|
+
*/
|
|
13
|
+
export const MAX_HMR_INCOMPATIBILITIES = 50;
|
|
14
|
+
/**
|
|
15
|
+
* Human-readable text for a reason, shared by the browser console message in
|
|
16
|
+
* `src/lib/runtime/patch.ts` and the DevTools panel's banner so the two can't
|
|
17
|
+
* drift apart. The wording of the first two cases is asserted verbatim by
|
|
18
|
+
* `src/test/unit/patch_test.ts` — it is part of the console output contract.
|
|
19
|
+
*/
|
|
20
|
+
export const describeHmrReason = (reason) => {
|
|
21
|
+
switch (reason.code) {
|
|
22
|
+
case 'accessor-decorators':
|
|
23
|
+
return 'standard accessor decorators';
|
|
24
|
+
case 'patch-failed':
|
|
25
|
+
return `patching failed: ${reason.detail}`;
|
|
26
|
+
case 'observed-attributes-changed':
|
|
27
|
+
return "observedAttributes changed; the platform registry can't pick this up";
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=hmr-incompatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-incompatibility.js","sourceRoot":"","sources":["../src/types/hmr-incompatibility.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH,sFAAsF;AACtF,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAgC,EAAU,EAAE;IAC5E,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,qBAAqB;YACxB,OAAO,8BAA8B,CAAC;QACxC,KAAK,cAAc;YACjB,OAAO,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7C,KAAK,6BAA6B;YAChC,OAAO,sEAAsE,CAAC;IAClF,CAAC;AACH,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * Shared types and channel constant for HMR-incompatibility reporting.\n *\n * When the browser runtime can't hot-patch a component in place it logs one\n * line to the console and, by default, full-reloads the page — which clears\n * the console before anyone reads it. These types carry the same reason, in\n * structured form, from the page runtime to the node side over the HMR\n * {@link HMR_INCOMPATIBLE_CHANNEL}, where it is cached so the DevTools panel\n * and an agent-facing query RPC can both read it back after the reload.\n *\n * The three reasons mirror the \"Cannot be patched in place\" cases documented\n * in `docs/src/content/docs/reference/limitations.mdx`; adding a fourth means\n * extending {@link HmrIncompatibilityReason} and {@link describeHmrReason}\n * together, plus the docs page.\n */\n\n/** Why a component couldn't be hot-patched in place, or a related silent case. */\nexport type HmrIncompatibilityReason =\n | {code: 'accessor-decorators'}\n | {code: 'patch-failed'; detail: string}\n | {code: 'observed-attributes-changed'};\n\n/**\n * One HMR-incompatibility notice from the page runtime. `action` reflects\n * what actually happened for *this* event, not just the configured default:\n * 'reload' / 'warn' come from `hmr.onIncompatible`; 'none' is the\n * `observed-attributes-changed` case, which never reloads regardless of that\n * setting (the patch already succeeded).\n */\nexport interface HmrIncompatibilityEvent {\n tagName: string;\n /** `Date.now()` in the browser — there is no shared clock with the timeline's `performance.now()`. */\n time: number;\n reason: HmrIncompatibilityReason;\n action: 'reload' | 'warn' | 'none';\n}\n\n/** HMR channel the page runtime uses to report an {@link HmrIncompatibilityEvent}. */\nexport const HMR_INCOMPATIBLE_CHANNEL = 'lit:hmr:incompatible';\n\n/**\n * How many events the node-side cache keeps, and the panel mirrors. A dev\n * session with many failing edits must not grow either without bound; the\n * newest are the ones worth keeping.\n */\nexport const MAX_HMR_INCOMPATIBILITIES = 50;\n\n/**\n * Human-readable text for a reason, shared by the browser console message in\n * `src/lib/runtime/patch.ts` and the DevTools panel's banner so the two can't\n * drift apart. The wording of the first two cases is asserted verbatim by\n * `src/test/unit/patch_test.ts` — it is part of the console output contract.\n */\nexport const describeHmrReason = (reason: HmrIncompatibilityReason): string => {\n switch (reason.code) {\n case 'accessor-decorators':\n return 'standard accessor decorators';\n case 'patch-failed':\n return `patching failed: ${reason.detail}`;\n case 'observed-attributes-changed':\n return \"observedAttributes changed; the platform registry can't pick this up\";\n }\n};\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* The direct page ↔ panel channel, for interactions that never need the node
|
|
8
|
+
* side.
|
|
9
|
+
*
|
|
10
|
+
* Everything else the Components tab does goes panel → node → page over RPC
|
|
11
|
+
* and Vite's HMR channel, and should keep going that way: the node side caches
|
|
12
|
+
* the tree and the last details so a panel that connects late has something to
|
|
13
|
+
* render, and so the MCP tools can answer without a panel open. None of that
|
|
14
|
+
* is true of the hover outline — it is pure page-local drawing, it is issued
|
|
15
|
+
* on every `mouseenter` in the tree, and nothing but the page itself ever
|
|
16
|
+
* wants to know about it.
|
|
17
|
+
*
|
|
18
|
+
* Devframe's in-page channel connects a page script to a panel iframe over a
|
|
19
|
+
* `MessageChannel` with no server in the path (same-origin, handshake by
|
|
20
|
+
* posting to the ancestor chain). Two consequences:
|
|
21
|
+
*
|
|
22
|
+
* - The outline stops paying a full round trip through node on every pointer
|
|
23
|
+
* move.
|
|
24
|
+
* - It keeps working where there is no node side at all, which is what a
|
|
25
|
+
* static snapshot of the panel needs to be more than a screenshot.
|
|
26
|
+
*
|
|
27
|
+
* The channel is best-effort by construction. A panel opened as its own tab
|
|
28
|
+
* has no ancestor page script to handshake with, so both sides must treat
|
|
29
|
+
* "not connected" as normal and fall back to the RPC path.
|
|
30
|
+
*/
|
|
31
|
+
/** Channel name, shared by both endpoints. */
|
|
32
|
+
export declare const LIT_IN_PAGE_CHANNEL = "lit:in-page";
|
|
33
|
+
/**
|
|
34
|
+
* Contract for {@link LIT_IN_PAGE_CHANNEL}.
|
|
35
|
+
*
|
|
36
|
+
* `highlight` is an event, not a query: the panel does not want an answer, and
|
|
37
|
+
* a fire-and-forget emit is what keeps a hover cheap. `id` is the same stable
|
|
38
|
+
* numeric element id used everywhere else (the timeline's `idOf()` WeakMap),
|
|
39
|
+
* so a tree node, a details payload, and an outline all agree on identity.
|
|
40
|
+
* `null` clears the outline.
|
|
41
|
+
*/
|
|
42
|
+
export interface LitInPageProtocol {
|
|
43
|
+
events: {
|
|
44
|
+
pageScript: {
|
|
45
|
+
highlight: (id: number | null) => void;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=in-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-page.d.ts","sourceRoot":"","sources":["../src/types/in-page.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE;QACN,UAAU,EAAE;YACV,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;SACxC,CAAC;KACH,CAAC;CACH"}
|
package/types/in-page.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* The direct page ↔ panel channel, for interactions that never need the node
|
|
8
|
+
* side.
|
|
9
|
+
*
|
|
10
|
+
* Everything else the Components tab does goes panel → node → page over RPC
|
|
11
|
+
* and Vite's HMR channel, and should keep going that way: the node side caches
|
|
12
|
+
* the tree and the last details so a panel that connects late has something to
|
|
13
|
+
* render, and so the MCP tools can answer without a panel open. None of that
|
|
14
|
+
* is true of the hover outline — it is pure page-local drawing, it is issued
|
|
15
|
+
* on every `mouseenter` in the tree, and nothing but the page itself ever
|
|
16
|
+
* wants to know about it.
|
|
17
|
+
*
|
|
18
|
+
* Devframe's in-page channel connects a page script to a panel iframe over a
|
|
19
|
+
* `MessageChannel` with no server in the path (same-origin, handshake by
|
|
20
|
+
* posting to the ancestor chain). Two consequences:
|
|
21
|
+
*
|
|
22
|
+
* - The outline stops paying a full round trip through node on every pointer
|
|
23
|
+
* move.
|
|
24
|
+
* - It keeps working where there is no node side at all, which is what a
|
|
25
|
+
* static snapshot of the panel needs to be more than a screenshot.
|
|
26
|
+
*
|
|
27
|
+
* The channel is best-effort by construction. A panel opened as its own tab
|
|
28
|
+
* has no ancestor page script to handshake with, so both sides must treat
|
|
29
|
+
* "not connected" as normal and fall back to the RPC path.
|
|
30
|
+
*/
|
|
31
|
+
/** Channel name, shared by both endpoints. */
|
|
32
|
+
export const LIT_IN_PAGE_CHANNEL = 'lit:in-page';
|
|
33
|
+
//# sourceMappingURL=in-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-page.js","sourceRoot":"","sources":["../src/types/in-page.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * The direct page ↔ panel channel, for interactions that never need the node\n * side.\n *\n * Everything else the Components tab does goes panel → node → page over RPC\n * and Vite's HMR channel, and should keep going that way: the node side caches\n * the tree and the last details so a panel that connects late has something to\n * render, and so the MCP tools can answer without a panel open. None of that\n * is true of the hover outline — it is pure page-local drawing, it is issued\n * on every `mouseenter` in the tree, and nothing but the page itself ever\n * wants to know about it.\n *\n * Devframe's in-page channel connects a page script to a panel iframe over a\n * `MessageChannel` with no server in the path (same-origin, handshake by\n * posting to the ancestor chain). Two consequences:\n *\n * - The outline stops paying a full round trip through node on every pointer\n * move.\n * - It keeps working where there is no node side at all, which is what a\n * static snapshot of the panel needs to be more than a screenshot.\n *\n * The channel is best-effort by construction. A panel opened as its own tab\n * has no ancestor page script to handshake with, so both sides must treat\n * \"not connected\" as normal and fall back to the RPC path.\n */\n\n/** Channel name, shared by both endpoints. */\nexport const LIT_IN_PAGE_CHANNEL = 'lit:in-page';\n\n/**\n * Contract for {@link LIT_IN_PAGE_CHANNEL}.\n *\n * `highlight` is an event, not a query: the panel does not want an answer, and\n * a fire-and-forget emit is what keeps a hover cheap. `id` is the same stable\n * numeric element id used everywhere else (the timeline's `idOf()` WeakMap),\n * so a tree node, a details payload, and an outline all agree on identity.\n * `null` clears the outline.\n */\nexport interface LitInPageProtocol {\n events: {\n pageScript: {\n highlight: (id: number | null) => void;\n };\n };\n}\n"]}
|
package/types/inspector.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../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"}
|
package/types/inspector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"inspector.js","sourceRoot":"","sources":["../src/types/inspector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8FH,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,8BAA8B,GAAG,6BAA6B,CAAC;AAE5E,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAEtD,mFAAmF;AACnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * Shared types and channel/path constants for the Components inspector.\n *\n * The inspector lets the DevTools panel show a hierarchical tree of the Lit\n * components on the page plus a detail view (reactive properties, internal\n * state, attributes, source) of a selected element. The panel can't touch the\n * page DOM directly (separate iframe document), so everything flows over the\n * existing transport: panel → server (POST {@link INSPECT_PATH}) → app runtime\n * (HMR {@link INSPECT_CMD_CHANNEL}); app → server (HMR\n * {@link INSPECT_DATA_CHANNEL}) → panel (SSE `event: {@link INSPECT_SSE_EVENT}`).\n *\n * Elements are referenced across the boundary by the stable numeric id from the\n * timeline's `idOf()` WeakMap, so a tree node, a details payload, and an\n * inspector pick all agree on identity.\n */\n\nexport interface ElementSource {\n file: string;\n line: number;\n}\n\n/** A node in the component render tree (one inspectable Lit element). */\nexport interface InspectorTreeNode {\n id: number;\n tagName: string;\n componentName?: string;\n source?: ElementSource;\n children: InspectorTreeNode[];\n}\n\n/** One reactive property (or internal `@state`) of an inspected element. */\nexport interface InspectorProp {\n name: string;\n /** Serialized, depth-limited preview of the current value. */\n value: string;\n /** A short type tag (`string`, `number`, `Array(3)`, `MyClass`, …). */\n type: string;\n /** The reflected attribute name, or `false` when `attribute: false`. */\n attribute: string | false;\n /** Whether the property reflects to its attribute. */\n reflects: boolean;\n /** Whether it's an internal `@state()` (no public attribute). */\n state: boolean;\n}\n\n/** Full detail snapshot for a single inspected element. */\nexport interface InspectorDetails {\n id: number;\n tagName: string;\n componentName?: string;\n source?: ElementSource;\n attributes: Array<{name: string; value: string}>;\n properties: InspectorProp[];\n flags: {\n hasUpdated: boolean;\n isUpdatePending: boolean;\n hasShadowRoot: boolean;\n };\n}\n\n/** App runtime → panel messages, carried on SSE `event: inspect`. */\nexport type InspectorMessage =\n /** The runtime came online; the panel should (re)request the tree. */\n | {type: 'ready'}\n | {type: 'tree'; roots: InspectorTreeNode[]}\n | {type: 'details'; details: InspectorDetails}\n /** The requested element id couldn't be resolved (removed / GC'd). */\n | {type: 'gone'; id: number}\n /** An inspect-mode overlay pick — select this element in the panel. */\n | {type: 'pick'; id: number};\n\n/** Panel → app runtime commands, POSTed to {@link INSPECT_PATH}. */\nexport type InspectorCommand =\n | {type: 'tree'}\n | {type: 'details'; id: number}\n /** Keep pushing fresh details for `id` as it updates; `null` stops. */\n | {type: 'watch'; id: number | null}\n /** Outline element `id` in the page on tree hover; `null` clears it. */\n | {type: 'highlight'; id: number | null}\n /**\n * Opt-in live tree: when enabled, the runtime watches the DOM and pushes a\n * fresh `tree` message whenever the component hierarchy changes. Off by\n * default (the panel otherwise refreshes on demand / on pick).\n */\n | {type: 'observe'; enabled: boolean}\n /**\n * Start the overlay's inspect-mode picker (the panel's \"Pick\" button). Handled\n * by the server (it broadcasts {@link INSPECT_OVERLAY_TOGGLE_CHANNEL}), not the\n * app runtime, so it never reaches the runtime's command handler.\n */\n | {type: 'pick'};\n\n/** HMR channel the server uses to forward a panel command to the app runtime. */\nexport const INSPECT_CMD_CHANNEL = 'lit:inspect:cmd';\n\n/** HMR channel the app runtime uses to push an {@link InspectorMessage}. */\nexport const INSPECT_DATA_CHANNEL = 'lit:inspect:data';\n\n/** Vite HMR channel the DevTools \"inspect element\" command broadcasts on. */\nexport const INSPECT_OVERLAY_TOGGLE_CHANNEL = 'lit-devtools:toggle-inspect';\n\n/** POST endpoint the panel uses to send an {@link InspectorCommand}. */\nexport const INSPECT_PATH = '/__lit-devtools-inspect';\n\n/** Named SSE event the server relays {@link InspectorMessage}s to the panel on. */\nexport const INSPECT_SSE_EVENT = 'inspect';\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* A recorded DevTools session, frozen so someone else can open it.
|
|
8
|
+
*
|
|
9
|
+
* The point is not "a static copy of the panel". It is a bug report a
|
|
10
|
+
* maintainer can actually act on: the timeline of what happened, the component
|
|
11
|
+
* tree as it stood, the details of the components that were inspected, and any
|
|
12
|
+
* HMR incompatibilities that fired — opened in a browser with no checkout of
|
|
13
|
+
* the reporter's app and no reproduction steps.
|
|
14
|
+
*
|
|
15
|
+
* Everything here is already in the node side's hands during a live session
|
|
16
|
+
* (see `lib/devframe/definition.ts`, which caches exactly these four things),
|
|
17
|
+
* which is why capture needs no new transport: the dev server exports its own
|
|
18
|
+
* state.
|
|
19
|
+
*/
|
|
20
|
+
import type { HmrIncompatibilityEvent } from './hmr-incompatibility.js';
|
|
21
|
+
import type { InspectorDetails, InspectorTreeNode } from './inspector.js';
|
|
22
|
+
import type { TimelineEvent, TimelineLayer } from './timeline.js';
|
|
23
|
+
/** Everything a frozen panel needs to render a past session. */
|
|
24
|
+
export interface SessionSnapshot {
|
|
25
|
+
/** ISO timestamp of the export, shown by the frozen panel. */
|
|
26
|
+
capturedAt: string;
|
|
27
|
+
/** Plugin version the session was recorded on. */
|
|
28
|
+
version: string;
|
|
29
|
+
/** Custom layers registered by the app, so recorded events keep their labels. */
|
|
30
|
+
customLayers: TimelineLayer[];
|
|
31
|
+
/** The component tree as it stood at export time. */
|
|
32
|
+
roots: InspectorTreeNode[];
|
|
33
|
+
/**
|
|
34
|
+
* Details for every component whose details were fetched during the
|
|
35
|
+
* session. Only these ids can be baked — details are collected from live
|
|
36
|
+
* DOM, so a component nobody opened has none to freeze.
|
|
37
|
+
*/
|
|
38
|
+
details: InspectorDetails[];
|
|
39
|
+
/** The recorded timeline, up to the node side's ring-buffer cap. */
|
|
40
|
+
events: TimelineEvent[];
|
|
41
|
+
/** HMR incompatibilities reported during the session. */
|
|
42
|
+
hmrIncompatibilities: HmrIncompatibilityEvent[];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/types/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAEhE,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,qDAAqD;IACrD,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B;;;;OAIG;IACH,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,oEAAoE;IACpE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,yDAAyD;IACzD,oBAAoB,EAAE,uBAAuB,EAAE,CAAC;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/types/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * A recorded DevTools session, frozen so someone else can open it.\n *\n * The point is not \"a static copy of the panel\". It is a bug report a\n * maintainer can actually act on: the timeline of what happened, the component\n * tree as it stood, the details of the components that were inspected, and any\n * HMR incompatibilities that fired — opened in a browser with no checkout of\n * the reporter's app and no reproduction steps.\n *\n * Everything here is already in the node side's hands during a live session\n * (see `lib/devframe/definition.ts`, which caches exactly these four things),\n * which is why capture needs no new transport: the dev server exports its own\n * state.\n */\n\nimport type {HmrIncompatibilityEvent} from './hmr-incompatibility.js';\nimport type {InspectorDetails, InspectorTreeNode} from './inspector.js';\nimport type {TimelineEvent, TimelineLayer} from './timeline.js';\n\n/** Everything a frozen panel needs to render a past session. */\nexport interface SessionSnapshot {\n /** ISO timestamp of the export, shown by the frozen panel. */\n capturedAt: string;\n /** Plugin version the session was recorded on. */\n version: string;\n /** Custom layers registered by the app, so recorded events keep their labels. */\n customLayers: TimelineLayer[];\n /** The component tree as it stood at export time. */\n roots: InspectorTreeNode[];\n /**\n * Details for every component whose details were fetched during the\n * session. Only these ids can be baked — details are collected from live\n * DOM, so a component nobody opened has none to freeze.\n */\n details: InspectorDetails[];\n /** The recorded timeline, up to the node side's ring-buffer cap. */\n events: TimelineEvent[];\n /** HMR incompatibilities reported during the session. */\n hmrIncompatibilities: HmrIncompatibilityEvent[];\n}\n"]}
|
package/types/timeline.d.ts
CHANGED
|
@@ -77,6 +77,17 @@ export interface SettingsOverride {
|
|
|
77
77
|
hmrIndicatorCount?: boolean;
|
|
78
78
|
/** Built-in editor key for the source overlay's open-in-editor target. */
|
|
79
79
|
sourceOverlayEditor?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Flash a short outline over every Lit element that completes an update.
|
|
82
|
+
* Pure preference (no config-time baseline), so `undefined` reads as off.
|
|
83
|
+
*/
|
|
84
|
+
flashUpdates?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Colour the flash by how often the element updated in the last second,
|
|
87
|
+
* calm to hot, instead of one flat colour. Only meaningful with
|
|
88
|
+
* {@link SettingsOverride.flashUpdates}.
|
|
89
|
+
*/
|
|
90
|
+
flashUpdatesRamp?: boolean;
|
|
80
91
|
}
|
|
81
92
|
/**
|
|
82
93
|
* Built-in editors the source overlay can open files in. Keep in sync with
|
package/types/timeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/types/timeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1C,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAC;KACvC,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAKnD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,mBAMlC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QACH,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC;QAClC,gBAAgB,EAAE,OAAO,CAAC;QAC1B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,oEAAoE;QACpE,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACtC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAEjE,6EAA6E;AAC7E,eAAO,MAAM,yBAAyB,mCAAmC,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,6BAA6B,uCACJ,CAAC"}
|
package/types/timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/types/timeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiCH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAC;IAC9D,EAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAC;IACxD,EAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAC;IAC9C,EAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAC;CACrD,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,cAAc,EAAE,KAAK;IACrB,mBAAmB,EAAE,IAAI;IACzB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,KAAK;IACxB,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAyDF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAG9B;IACH,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAC;IACnC,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC;IAClC,EAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAC;IAC5B,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAC;IAClC,EAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAC;CACvC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAEjE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,gCAAgC,CAAC;AAE1E;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GACxC,oCAAoC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nexport interface TimelineLayer {\n id: string;\n label: string;\n color: number; // 0xRRGGBB\n}\n\nexport interface TimelineEvent<TData = unknown> {\n layerId: string;\n /** `performance.now()` timestamp in the browser. */\n time: number;\n data: TData;\n title?: string;\n subtitle?: string;\n /** Pairs a start event with its matching end event in the same update group. */\n groupId?: number | string;\n logType?: 'default' | 'warning' | 'error';\n meta?: {\n elementId?: number;\n tagName?: string;\n source?: {file: string; line: number};\n };\n}\n\nexport interface TimelineLayersState {\n recordingState: boolean;\n litLifecycleEnabled: boolean;\n litRenderEnabled: boolean;\n mouseEventEnabled: boolean;\n keyboardEventEnabled: boolean;\n}\n\nexport const TIMELINE_LAYERS: readonly TimelineLayer[] = [\n {id: 'lit-lifecycle', label: 'Lit Lifecycle', color: 0x4d63ff},\n {id: 'lit-render', label: 'Lit Render', color: 0x325cff},\n {id: 'mouse', label: 'Mouse', color: 0xa451af},\n {id: 'keyboard', label: 'Keyboard', color: 0x8151af},\n];\n\nexport const DEFAULT_LAYERS_STATE: TimelineLayersState = {\n recordingState: false,\n litLifecycleEnabled: true,\n litRenderEnabled: true,\n mouseEventEnabled: false,\n keyboardEventEnabled: false,\n};\n\n/**\n * Snapshot of the plugin's resolved feature settings, surfaced in the panel's\n * Settings tab. The plugin produces this at config time (explicit options >\n * LIT_PLUGIN_* env > defaults) and serves it from the panel server. It's the\n * baseline the panel shows; some HMR settings can then be overridden live (see\n * {@link SettingsOverride}).\n */\nexport interface FeatureSettings {\n hmr: {\n enabled: boolean;\n reconnect: boolean;\n onIncompatible: 'reload' | 'warn';\n indicatorEnabled: boolean;\n indicatorCount: boolean;\n };\n sourceOverlay: {\n enabled: boolean;\n /** Hotkey letter combined with Ctrl+Shift to toggle the overlay. */\n key: string;\n editor: string;\n throttleMs: number;\n };\n timeline: boolean;\n}\n\n/**\n * Runtime overrides the panel applies on top of the resolved env config, for\n * settings whose runtime is already injected (so they can change live). A\n * feature disabled at config time has no runtime, so it can't be enabled here\n * — only the behaviour of already-enabled features is overridable.\n *\n * Persisted under {@link SETTINGS_OVERRIDE_LS_KEY} (the panel and app share an\n * origin) so overrides survive reloads, and pushed live over\n * {@link SETTINGS_OVERRIDE_CHANNEL} via Vite HMR for immediate effect.\n */\nexport interface SettingsOverride {\n hmrReconnect?: boolean;\n hmrOnIncompatible?: 'reload' | 'warn';\n hmrIndicatorVisible?: boolean;\n hmrIndicatorCount?: boolean;\n /** Built-in editor key for the source overlay's open-in-editor target. */\n sourceOverlayEditor?: string;\n /**\n * Flash a short outline over every Lit element that completes an update.\n * Pure preference (no config-time baseline), so `undefined` reads as off.\n */\n flashUpdates?: boolean;\n /**\n * Colour the flash by how often the element updated in the last second,\n * calm to hot, instead of one flat colour. Only meaningful with\n * {@link SettingsOverride.flashUpdates}.\n */\n flashUpdatesRamp?: boolean;\n}\n\n/**\n * Built-in editors the source overlay can open files in. Keep in sync with\n * BUILTIN_EDITORS in lib/runtime/source-overlay/editors.ts.\n */\nexport const SOURCE_OVERLAY_EDITORS: ReadonlyArray<{\n value: string;\n label: string;\n}> = [\n {value: 'vscode', label: 'VS Code'},\n {value: 'cursor', label: 'Cursor'},\n {value: 'zed', label: 'Zed'},\n {value: 'idea', label: 'IntelliJ'},\n {value: 'windsurf', label: 'Windsurf'},\n];\n\n/** localStorage key holding the {@link SettingsOverride}. */\nexport const SETTINGS_OVERRIDE_LS_KEY = 'lit-devtools-overrides';\n\n/** Vite HMR channel the server uses to push overrides to the app runtime. */\nexport const SETTINGS_OVERRIDE_CHANNEL = 'lit-devtools:settings-override';\n\n/**\n * Vite HMR channel the DevTools \"toggle source overlay\" command uses to tell\n * the app runtime to toggle the overlay (the command handler runs server-side).\n */\nexport const SOURCE_OVERLAY_TOGGLE_CHANNEL =\n 'lit-devtools:toggle-source-overlay';\n"]}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2026 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
-
*/
|
|
6
|
-
import { LitElement, type TemplateResult } from 'lit';
|
|
7
|
-
/**
|
|
8
|
-
* The Components view: a hierarchical tree of the page's Lit elements (left)
|
|
9
|
-
* and a details pane for the selected one (right). A tab of the DevTools panel
|
|
10
|
-
* shell (\`lit-devtools-panel\`).
|
|
11
|
-
*
|
|
12
|
-
* It can't touch the page DOM directly (separate iframe), so it drives the
|
|
13
|
-
* page's inspector runtime over the transport: it POSTs {@link InspectorCommand}s
|
|
14
|
-
* to {@link INSPECT_PATH} and receives {@link InspectorMessage}s on the shared
|
|
15
|
-
* SSE stream's `inspect` event. An overlay inspect-pick arrives as a `pick`
|
|
16
|
-
* message; the view selects that node and asks its host to switch to this tab.
|
|
17
|
-
*/
|
|
18
|
-
export declare class ComponentsView extends LitElement {
|
|
19
|
-
static styles: import("lit").CSSResult[];
|
|
20
|
-
private _roots;
|
|
21
|
-
private _selectedId;
|
|
22
|
-
private _details;
|
|
23
|
-
/** True when the selected element is no longer in the page (removed / GC'd). */
|
|
24
|
-
private _gone;
|
|
25
|
-
private _expanded;
|
|
26
|
-
private _picking;
|
|
27
|
-
/** Opt-in live tree (MutationObserver in the page); persisted, default off. */
|
|
28
|
-
private _live;
|
|
29
|
-
private _es;
|
|
30
|
-
connectedCallback(): void;
|
|
31
|
-
disconnectedCallback(): void;
|
|
32
|
-
/** Refresh the tree (and re-arm watch / live mode) once the SSE connects. */
|
|
33
|
-
private _onOpen;
|
|
34
|
-
private _post;
|
|
35
|
-
private _onMessage;
|
|
36
|
-
/**
|
|
37
|
-
* Select an element by id from outside (e.g. a timeline event's "inspect"
|
|
38
|
-
* link). Same as a tree click; the host is responsible for switching tabs.
|
|
39
|
-
*/
|
|
40
|
-
selectById(id: number): void;
|
|
41
|
-
private _select;
|
|
42
|
-
/** Expand every ancestor of `id` so the selected node is visible. */
|
|
43
|
-
private _revealAncestors;
|
|
44
|
-
private _toggleExpand;
|
|
45
|
-
private _refresh;
|
|
46
|
-
private _togglePick;
|
|
47
|
-
private _toggleLive;
|
|
48
|
-
private _highlight;
|
|
49
|
-
private _openSource;
|
|
50
|
-
private _renderNode;
|
|
51
|
-
private _renderPropTable;
|
|
52
|
-
private _renderDetails;
|
|
53
|
-
render(): TemplateResult<1>;
|
|
54
|
-
}
|
|
55
|
-
declare global {
|
|
56
|
-
interface HTMLElementTagNameMap {
|
|
57
|
-
'components-view': ComponentsView;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=components-view.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"components-view.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/panel/components-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,UAAU,EAAsB,KAAK,cAAc,EAAC,MAAM,KAAK,CAAC;AAexE;;;;;;;;;;GAUG;AACH,qBACa,cAAe,SAAQ,UAAU;IAC5C,OAAgB,MAAM,4BAoLpB;IAEO,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAiC;IAC1D,gFAAgF;IACvE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAS;IAClC,+EAA+E;IACtE,OAAO,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,GAAG,CAA4B;IAE9B,iBAAiB;IAUjB,oBAAoB;IAU7B,6EAA6E;IAC7E,OAAO,CAAC,OAAO,CAMb;IAMF,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,UAAU,CA6ChB;IAMF;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,OAAO;IAcf,qEAAqE;IACrE,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,cAAc;IA8Db,MAAM;CAgChB;AAuBD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,cAAc,CAAC;KACnC;CACF"}
|