@three-flatland/devtools 0.1.0-alpha.3 → 1.0.0-alpha.6

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 (172) hide show
  1. package/README.md +1 -1
  2. package/dist/buffers-modal.d.ts +16 -52
  3. package/dist/buffers-modal.d.ts.map +1 -0
  4. package/dist/buffers-modal.js +459 -464
  5. package/dist/buffers-modal.js.map +1 -1
  6. package/dist/buffers-view.d.ts +22 -34
  7. package/dist/buffers-view.d.ts.map +1 -0
  8. package/dist/buffers-view.js +252 -240
  9. package/dist/buffers-view.js.map +1 -1
  10. package/dist/create-pane.d.ts +38 -37
  11. package/dist/create-pane.d.ts.map +1 -0
  12. package/dist/create-pane.js +197 -166
  13. package/dist/create-pane.js.map +1 -1
  14. package/dist/dashboard/app.tsx +2 -0
  15. package/dist/dashboard/export.ts +1 -3
  16. package/dist/dashboard/frame-cursor.ts +81 -0
  17. package/dist/dashboard/hooks.ts +10 -2
  18. package/dist/dashboard/index.html +61 -0
  19. package/dist/dashboard/panels/batches.tsx +5 -18
  20. package/dist/dashboard/panels/buffers.tsx +52 -26
  21. package/dist/dashboard/panels/env.tsx +5 -6
  22. package/dist/dashboard/panels/protocol-log.tsx +146 -58
  23. package/dist/dashboard/panels/registry.tsx +55 -69
  24. package/dist/dashboard/panels/scrubber.tsx +100 -0
  25. package/dist/dashboard/panels/stats.tsx +60 -32
  26. package/dist/dashboard/protocol-store.ts +25 -8
  27. package/dist/dashboard/vendor/hooks.module.d.ts +146 -0
  28. package/dist/dashboard/vendor/jsx-runtime.d.ts +55 -0
  29. package/dist/dashboard/vendor/jsx.d.ts +3123 -0
  30. package/dist/dashboard/vendor/preact.module.d.ts +397 -0
  31. package/dist/devtools-client.d.ts +312 -300
  32. package/dist/devtools-client.d.ts.map +1 -0
  33. package/dist/devtools-client.js +866 -838
  34. package/dist/devtools-client.js.map +1 -1
  35. package/dist/index.d.ts +6 -8
  36. package/dist/index.js +5 -12
  37. package/dist/perf-trace.d.ts +6 -4
  38. package/dist/perf-trace.d.ts.map +1 -0
  39. package/dist/perf-trace.js +80 -66
  40. package/dist/perf-trace.js.map +1 -1
  41. package/dist/plugins.d.ts +6 -6
  42. package/dist/plugins.d.ts.map +1 -0
  43. package/dist/plugins.js +5 -5
  44. package/dist/plugins.js.map +1 -1
  45. package/dist/provider-switcher.d.ts +8 -15
  46. package/dist/provider-switcher.d.ts.map +1 -0
  47. package/dist/provider-switcher.js +68 -68
  48. package/dist/provider-switcher.js.map +1 -1
  49. package/dist/react/devtools-provider.d.ts +11 -10
  50. package/dist/react/devtools-provider.d.ts.map +1 -0
  51. package/dist/react/devtools-provider.js +60 -32
  52. package/dist/react/devtools-provider.js.map +1 -1
  53. package/dist/react/use-fps-graph.d.ts +7 -7
  54. package/dist/react/use-fps-graph.d.ts.map +1 -0
  55. package/dist/react/use-fps-graph.js +27 -21
  56. package/dist/react/use-fps-graph.js.map +1 -1
  57. package/dist/react/use-pane-button.d.ts +4 -4
  58. package/dist/react/use-pane-button.d.ts.map +1 -0
  59. package/dist/react/use-pane-button.js +35 -30
  60. package/dist/react/use-pane-button.js.map +1 -1
  61. package/dist/react/use-pane-folder.d.ts +5 -4
  62. package/dist/react/use-pane-folder.d.ts.map +1 -0
  63. package/dist/react/use-pane-folder.js +33 -20
  64. package/dist/react/use-pane-folder.js.map +1 -1
  65. package/dist/react/use-pane-input.d.ts +31 -30
  66. package/dist/react/use-pane-input.d.ts.map +1 -0
  67. package/dist/react/use-pane-input.js +46 -42
  68. package/dist/react/use-pane-input.js.map +1 -1
  69. package/dist/react/use-pane-radio-grid.d.ts +20 -20
  70. package/dist/react/use-pane-radio-grid.d.ts.map +1 -0
  71. package/dist/react/use-pane-radio-grid.js +72 -50
  72. package/dist/react/use-pane-radio-grid.js.map +1 -1
  73. package/dist/react/use-pane.d.ts +4 -4
  74. package/dist/react/use-pane.d.ts.map +1 -0
  75. package/dist/react/use-pane.js +52 -17
  76. package/dist/react/use-pane.js.map +1 -1
  77. package/dist/react.d.ts +10 -12
  78. package/dist/react.js +2 -12
  79. package/dist/registry-view.d.ts +8 -21
  80. package/dist/registry-view.d.ts.map +1 -0
  81. package/dist/registry-view.js +357 -338
  82. package/dist/registry-view.js.map +1 -1
  83. package/dist/relay.d.ts +16 -0
  84. package/dist/relay.d.ts.map +1 -0
  85. package/dist/relay.js +189 -0
  86. package/dist/relay.js.map +1 -0
  87. package/dist/remote.d.ts +10 -0
  88. package/dist/remote.d.ts.map +1 -0
  89. package/dist/remote.js +28 -0
  90. package/dist/remote.js.map +1 -0
  91. package/dist/stats-graph.d.ts +23 -31
  92. package/dist/stats-graph.d.ts.map +1 -0
  93. package/dist/stats-graph.js +323 -264
  94. package/dist/stats-graph.js.map +1 -1
  95. package/dist/stats-row.d.ts +8 -21
  96. package/dist/stats-row.d.ts.map +1 -0
  97. package/dist/stats-row.js +99 -101
  98. package/dist/stats-row.js.map +1 -1
  99. package/dist/theme.d.ts +3 -1
  100. package/dist/theme.d.ts.map +1 -0
  101. package/dist/theme.js +43 -54
  102. package/dist/theme.js.map +1 -1
  103. package/dist/vite-plugin.d.ts +7 -6
  104. package/dist/vite-plugin.d.ts.map +1 -0
  105. package/dist/vite-plugin.js +87 -78
  106. package/dist/vite-plugin.js.map +1 -1
  107. package/package.json +33 -29
  108. package/dist/buffers-modal.cjs +0 -491
  109. package/dist/buffers-modal.cjs.map +0 -1
  110. package/dist/buffers-modal.d.cts +0 -62
  111. package/dist/buffers-view.cjs +0 -269
  112. package/dist/buffers-view.cjs.map +0 -1
  113. package/dist/buffers-view.d.cts +0 -39
  114. package/dist/create-pane.cjs +0 -203
  115. package/dist/create-pane.cjs.map +0 -1
  116. package/dist/create-pane.d.cts +0 -66
  117. package/dist/devtools-client.cjs +0 -870
  118. package/dist/devtools-client.cjs.map +0 -1
  119. package/dist/devtools-client.d.cts +0 -362
  120. package/dist/index.cjs +0 -42
  121. package/dist/index.cjs.map +0 -1
  122. package/dist/index.d.cts +0 -8
  123. package/dist/index.js.map +0 -1
  124. package/dist/perf-trace.cjs +0 -103
  125. package/dist/perf-trace.cjs.map +0 -1
  126. package/dist/perf-trace.d.cts +0 -27
  127. package/dist/plugins.cjs +0 -44
  128. package/dist/plugins.cjs.map +0 -1
  129. package/dist/plugins.d.cts +0 -7
  130. package/dist/provider-switcher.cjs +0 -95
  131. package/dist/provider-switcher.cjs.map +0 -1
  132. package/dist/provider-switcher.d.cts +0 -18
  133. package/dist/react/devtools-provider.cjs +0 -59
  134. package/dist/react/devtools-provider.cjs.map +0 -1
  135. package/dist/react/devtools-provider.d.cts +0 -39
  136. package/dist/react/use-fps-graph.cjs +0 -49
  137. package/dist/react/use-fps-graph.cjs.map +0 -1
  138. package/dist/react/use-fps-graph.d.cts +0 -15
  139. package/dist/react/use-pane-button.cjs +0 -58
  140. package/dist/react/use-pane-button.cjs.map +0 -1
  141. package/dist/react/use-pane-button.d.cts +0 -10
  142. package/dist/react/use-pane-folder.cjs +0 -48
  143. package/dist/react/use-pane-folder.cjs.map +0 -1
  144. package/dist/react/use-pane-folder.d.cts +0 -15
  145. package/dist/react/use-pane-input.cjs +0 -70
  146. package/dist/react/use-pane-input.cjs.map +0 -1
  147. package/dist/react/use-pane-input.d.cts +0 -44
  148. package/dist/react/use-pane-radio-grid.cjs +0 -78
  149. package/dist/react/use-pane-radio-grid.cjs.map +0 -1
  150. package/dist/react/use-pane-radio-grid.d.cts +0 -35
  151. package/dist/react/use-pane.cjs +0 -45
  152. package/dist/react/use-pane.cjs.map +0 -1
  153. package/dist/react/use-pane.d.cts +0 -40
  154. package/dist/react.cjs +0 -50
  155. package/dist/react.cjs.map +0 -1
  156. package/dist/react.d.cts +0 -12
  157. package/dist/react.js.map +0 -1
  158. package/dist/registry-view.cjs +0 -371
  159. package/dist/registry-view.cjs.map +0 -1
  160. package/dist/registry-view.d.cts +0 -24
  161. package/dist/stats-graph.cjs +0 -297
  162. package/dist/stats-graph.cjs.map +0 -1
  163. package/dist/stats-graph.d.cts +0 -40
  164. package/dist/stats-row.cjs +0 -153
  165. package/dist/stats-row.cjs.map +0 -1
  166. package/dist/stats-row.d.cts +0 -24
  167. package/dist/theme.cjs +0 -260
  168. package/dist/theme.cjs.map +0 -1
  169. package/dist/theme.d.cts +0 -10
  170. package/dist/vite-plugin.cjs +0 -113
  171. package/dist/vite-plugin.cjs.map +0 -1
  172. package/dist/vite-plugin.d.cts +0 -9
@@ -1,467 +1,462 @@
1
+ //#region src/buffers-modal.ts
2
+ /**
3
+ * Build a fullscreen modal anchored to `document.body`. Returns an
4
+ * imperative handle — the in-pane thumbnail's expand button calls
5
+ * `open(activeName)` to surface it.
6
+ */
1
7
  function createBuffersModal(client, options = {}) {
2
- const root = document.createElement("div");
3
- root.style.cssText = [
4
- "position:fixed",
5
- "inset:0",
6
- "z-index:99999",
7
- "background:rgba(0,2,28,0.92)",
8
- "color:var(--tp-label-foreground-color, #f0edd8)",
9
- "font-family:var(--tp-base-font-family, ui-monospace, monospace)",
10
- "font-size:12px",
11
- "display:none",
12
- "flex-direction:column"
13
- ].join(";");
14
- const header = document.createElement("div");
15
- header.style.cssText = [
16
- "display:flex",
17
- "align-items:center",
18
- "gap:12px",
19
- "padding:8px 12px",
20
- "border-bottom:1px solid rgba(240,237,216,0.08)",
21
- "flex:0 0 auto"
22
- ].join(";");
23
- const sidebarToggle = document.createElement("span");
24
- sidebarToggle.textContent = "\u25C0";
25
- sidebarToggle.style.cssText = "cursor:pointer;padding:2px 6px;opacity:0.8;user-select:none";
26
- sidebarToggle.title = "Toggle sidebar";
27
- const titleEl = document.createElement("span");
28
- titleEl.style.cssText = "flex:1;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap";
29
- const dimsEl = document.createElement("span");
30
- dimsEl.style.cssText = "opacity:0.7;font-variant-numeric:tabular-nums";
31
- const closeBtn = document.createElement("span");
32
- closeBtn.textContent = "\xD7";
33
- closeBtn.style.cssText = "cursor:pointer;padding:2px 10px;font-size:18px;line-height:1;opacity:0.8;user-select:none";
34
- closeBtn.title = "Close";
35
- header.appendChild(sidebarToggle);
36
- header.appendChild(titleEl);
37
- header.appendChild(dimsEl);
38
- header.appendChild(closeBtn);
39
- const body = document.createElement("div");
40
- body.style.cssText = "display:flex;flex:1;min-height:0";
41
- const sidebar = document.createElement("div");
42
- sidebar.style.cssText = [
43
- "display:flex",
44
- "flex-direction:column",
45
- "width:240px",
46
- "border-right:1px solid rgba(240,237,216,0.08)",
47
- "overflow-y:auto",
48
- "padding:8px 0",
49
- "flex:0 0 auto"
50
- ].join(";");
51
- const main = document.createElement("div");
52
- main.style.cssText = "flex:1;display:flex;align-items:center;justify-content:center;padding:16px;min-width:0;min-height:0;overflow:hidden;position:relative";
53
- const canvas = document.createElement("canvas");
54
- canvas.style.cssText = "display:block;background:rgba(0,2,28,0.6);image-rendering:pixelated;max-width:100%;max-height:100%";
55
- const ctx = canvas.getContext("2d");
56
- const offscreen = document.createElement("canvas");
57
- offscreen.width = 1;
58
- offscreen.height = 1;
59
- const zoomBar = document.createElement("div");
60
- zoomBar.style.cssText = [
61
- "position:absolute",
62
- "top:8px",
63
- "left:8px",
64
- "display:flex",
65
- "gap:6px",
66
- "align-items:center",
67
- "z-index:1"
68
- ].join(";");
69
- const zoomInfo = document.createElement("span");
70
- zoomInfo.style.cssText = [
71
- "padding:3px 8px",
72
- "border-radius:4px",
73
- "background:rgba(0,0,0,0.6)",
74
- "color:#aaa",
75
- "font:11px/1.4 monospace",
76
- "pointer-events:none",
77
- "user-select:none"
78
- ].join(";");
79
- zoomInfo.textContent = "1.0\xD7";
80
- const resetBtn = document.createElement("span");
81
- resetBtn.style.cssText = [
82
- "padding:3px 8px",
83
- "border-radius:4px",
84
- "background:rgba(0,0,0,0.6)",
85
- "color:#aaa",
86
- "font:11px/1.4 monospace",
87
- "cursor:pointer",
88
- "user-select:none"
89
- ].join(";");
90
- resetBtn.textContent = "\u27F2 Reset";
91
- resetBtn.title = "Reset zoom & pan (double-click also resets)";
92
- zoomBar.appendChild(zoomInfo);
93
- zoomBar.appendChild(resetBtn);
94
- main.appendChild(canvas);
95
- main.appendChild(zoomBar);
96
- body.appendChild(sidebar);
97
- body.appendChild(main);
98
- root.appendChild(header);
99
- root.appendChild(body);
100
- document.body.appendChild(root);
101
- let isOpen = false;
102
- let activeName = null;
103
- let lastRenderedVersion = -1;
104
- let sidebarCollapsed = false;
105
- const MIN_ZOOM = 0.25;
106
- const MAX_ZOOM = 64;
107
- let zoom = 1;
108
- let panX = 0;
109
- let panY = 0;
110
- let isDragging = false;
111
- let dragStartX = 0;
112
- let dragStartY = 0;
113
- let panStartX = 0;
114
- let panStartY = 0;
115
- function updateZoomInfo() {
116
- const z = zoom < 10 ? zoom.toFixed(1) : Math.round(zoom).toString();
117
- zoomInfo.textContent = zoom === 1 ? "1.0\xD7" : `${z}\xD7 \xB7 (${Math.round(panX)}, ${Math.round(panY)})`;
118
- const atIdentity = zoom === 1 && panX === 0 && panY === 0;
119
- resetBtn.style.display = atIdentity ? "none" : "inline";
120
- }
121
- function applyTransform() {
122
- canvas.style.transform = `translate(${panX}px, ${panY}px) scale(${zoom})`;
123
- canvas.style.transformOrigin = "center center";
124
- updateZoomInfo();
125
- }
126
- function resetTransform() {
127
- zoom = 1;
128
- panX = 0;
129
- panY = 0;
130
- applyTransform();
131
- }
132
- main.addEventListener("wheel", (e) => {
133
- e.preventDefault();
134
- e.stopPropagation();
135
- const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;
136
- const newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom * factor));
137
- if (newZoom === zoom) return;
138
- const rect = main.getBoundingClientRect();
139
- const mx = e.clientX - rect.left - rect.width / 2;
140
- const my = e.clientY - rect.top - rect.height / 2;
141
- const ratio = 1 - newZoom / zoom;
142
- panX += (mx - panX) * ratio;
143
- panY += (my - panY) * ratio;
144
- zoom = newZoom;
145
- applyTransform();
146
- }, { passive: false });
147
- main.addEventListener("mousedown", (e) => {
148
- if (e.button !== 0) return;
149
- isDragging = true;
150
- dragStartX = e.clientX;
151
- dragStartY = e.clientY;
152
- panStartX = panX;
153
- panStartY = panY;
154
- main.style.cursor = "grabbing";
155
- e.preventDefault();
156
- });
157
- const onMouseMove = (e) => {
158
- if (!isDragging) return;
159
- panX = panStartX + (e.clientX - dragStartX);
160
- panY = panStartY + (e.clientY - dragStartY);
161
- applyTransform();
162
- };
163
- const onMouseUp = () => {
164
- if (!isDragging) return;
165
- isDragging = false;
166
- main.style.cursor = "grab";
167
- };
168
- window.addEventListener("mousemove", onMouseMove);
169
- window.addEventListener("mouseup", onMouseUp);
170
- main.addEventListener("dblclick", () => resetTransform());
171
- resetBtn.addEventListener("click", () => resetTransform());
172
- main.style.cursor = "grab";
173
- const rowEls = /* @__PURE__ */ new Map();
174
- const groupContainers = /* @__PURE__ */ new Map();
175
- function ensureGroup(group) {
176
- let el = groupContainers.get(group);
177
- if (el !== void 0) return el;
178
- el = document.createElement("div");
179
- el.style.cssText = "margin:6px 0";
180
- const head = document.createElement("div");
181
- head.textContent = group;
182
- head.style.cssText = "padding:4px 12px;opacity:0.6;font-size:11px;text-transform:uppercase;letter-spacing:0.05em;user-select:none";
183
- el.appendChild(head);
184
- sidebar.appendChild(el);
185
- groupContainers.set(group, el);
186
- return el;
187
- }
188
- function ensureRow(group, name, shortName) {
189
- let row = rowEls.get(name);
190
- if (row !== void 0) return row;
191
- const groupEl = ensureGroup(group);
192
- row = document.createElement("div");
193
- row.textContent = shortName;
194
- row.dataset["name"] = name;
195
- row.style.cssText = "padding:4px 12px 4px 22px;cursor:pointer;user-select:none;border-left:2px solid transparent";
196
- row.addEventListener("click", () => setActive(name));
197
- groupEl.appendChild(row);
198
- rowEls.set(name, row);
199
- return row;
200
- }
201
- function destroyRow(name) {
202
- const row = rowEls.get(name);
203
- if (row === void 0) return;
204
- row.remove();
205
- rowEls.delete(name);
206
- }
207
- function highlightActive() {
208
- for (const [name, row] of rowEls) {
209
- const on = name === activeName;
210
- row.style.background = on ? "rgba(71,204,169,0.15)" : "transparent";
211
- row.style.borderLeftColor = on ? "var(--tp-button-foreground-color-active, #47cca9)" : "transparent";
212
- row.style.color = on ? "var(--tp-label-foreground-color, #f0edd8)" : "rgba(240,237,216,0.7)";
213
- }
214
- }
215
- function paint(snap) {
216
- if (ctx === null) return;
217
- const { width, height, pixels } = snap;
218
- if (width === 0 || height === 0 || pixels === null) {
219
- canvas.width = 1;
220
- canvas.height = 1;
221
- return;
222
- }
223
- if (offscreen.width !== width || offscreen.height !== height) {
224
- offscreen.width = width;
225
- offscreen.height = height;
226
- }
227
- const offCtx = offscreen.getContext("2d");
228
- if (offCtx === null) return;
229
- const imgData = offCtx.createImageData(width, height);
230
- const out = imgData.data;
231
- if (pixels instanceof Uint8Array) {
232
- out.set(pixels.subarray(0, out.length));
233
- } else {
234
- const count = width * height;
235
- for (let i = 0; i < count; i++) {
236
- const o = i * 4;
237
- out[o] = Math.round(Math.max(0, Math.min(1, pixels[i * 4] ?? 0)) * 255);
238
- out[o + 1] = Math.round(Math.max(0, Math.min(1, pixels[i * 4 + 1] ?? 0)) * 255);
239
- out[o + 2] = Math.round(Math.max(0, Math.min(1, pixels[i * 4 + 2] ?? 0)) * 255);
240
- out[o + 3] = Math.round(Math.max(0, Math.min(1, pixels[i * 4 + 3] ?? 1)) * 255);
241
- }
242
- }
243
- offCtx.putImageData(imgData, 0, 0);
244
- if (canvas.width !== width || canvas.height !== height) {
245
- canvas.width = width;
246
- canvas.height = height;
247
- }
248
- const fitW = snap.srcWidth > 0 ? snap.srcWidth : width;
249
- const fitH = snap.srcHeight > 0 ? snap.srcHeight : height;
250
- canvasSrcW = fitW;
251
- canvasSrcH = fitH;
252
- fitCanvas(fitW, fitH);
253
- ctx.imageSmoothingEnabled = false;
254
- ctx.drawImage(offscreen, 0, 0);
255
- }
256
- function refresh() {
257
- if (!isOpen) return;
258
- const state = client.state;
259
- const present = /* @__PURE__ */ new Set();
260
- for (const [name] of state.buffers) {
261
- present.add(name);
262
- const dot = name.indexOf(".");
263
- const group = dot === -1 ? "ungrouped" : name.slice(0, dot);
264
- const short = dot === -1 ? name : name.slice(dot + 1);
265
- ensureRow(group, name, short);
266
- }
267
- for (const name of rowEls.keys()) {
268
- if (!present.has(name)) destroyRow(name);
269
- }
270
- if (activeName !== null && !state.buffers.has(activeName)) {
271
- const first = state.buffers.keys().next().value;
272
- activeName = first ?? null;
273
- if (activeName !== null) client.setBuffers({ [activeName]: { mode: "stream" } });
274
- else client.setBuffers({});
275
- }
276
- highlightActive();
277
- if (activeName === null) {
278
- titleEl.textContent = "\u2014";
279
- dimsEl.textContent = "";
280
- return;
281
- }
282
- const snap = state.buffers.get(activeName);
283
- if (snap === void 0) return;
284
- titleEl.textContent = snap.label !== void 0 ? `${activeName} \u2014 ${snap.label}` : activeName;
285
- dimsEl.textContent = `${snap.width}\xD7${snap.height} \xB7 ${snap.pixelType} \xB7 ${snap.display}`;
286
- if (decoder === null && snap.version !== lastRenderedVersion) {
287
- lastRenderedVersion = snap.version;
288
- paint(snap);
289
- }
290
- }
291
- function setActive(name) {
292
- if (activeName === name) return;
293
- activeName = name;
294
- lastRenderedVersion = -1;
295
- resetTransform();
296
- stopDecoder();
297
- decoderWidth = 0;
298
- decoderHeight = 0;
299
- client.setBuffers({ [name]: { mode: "stream" } });
300
- options.onActiveChange?.(name);
301
- highlightActive();
302
- refresh();
303
- }
304
- const unsubscribe = client.addListener(() => refresh());
305
- closeBtn.addEventListener("click", () => close());
306
- sidebarToggle.addEventListener("click", () => {
307
- sidebarCollapsed = !sidebarCollapsed;
308
- sidebar.style.display = sidebarCollapsed ? "none" : "flex";
309
- sidebarToggle.textContent = sidebarCollapsed ? "\u25B6" : "\u25C0";
310
- refresh();
311
- });
312
- const onKeydown = (e) => {
313
- if (!isOpen) return;
314
- if (e.key === "Escape") close();
315
- };
316
- document.addEventListener("keydown", onKeydown);
317
- function fitCanvas(srcW, srcH) {
318
- if (srcW <= 0 || srcH <= 0) return;
319
- const mainRect = main.getBoundingClientRect();
320
- const maxW = Math.max(1, mainRect.width - 32);
321
- const maxH = Math.max(1, mainRect.height - 32);
322
- const srcAspect = srcW / srcH;
323
- const boxAspect = maxW / maxH;
324
- let cssW;
325
- let cssH;
326
- if (srcAspect > boxAspect) {
327
- cssW = maxW;
328
- cssH = Math.max(1, Math.round(maxW / srcAspect));
329
- } else {
330
- cssH = maxH;
331
- cssW = Math.max(1, Math.round(maxH * srcAspect));
332
- }
333
- canvas.style.width = `${cssW}px`;
334
- canvas.style.height = `${cssH}px`;
335
- }
336
- let canvasSrcW = 0;
337
- let canvasSrcH = 0;
338
- const onResize = () => {
339
- if (!isOpen || activeName === null) return;
340
- const snap = client.state.buffers.get(activeName);
341
- if (snap !== void 0) paint(snap);
342
- };
343
- window.addEventListener("resize", onResize);
344
- const mainResizeObserver = new ResizeObserver(() => {
345
- if (!isOpen) return;
346
- if (canvasSrcW > 0 && canvasSrcH > 0) fitCanvas(canvasSrcW, canvasSrcH);
347
- });
348
- mainResizeObserver.observe(main);
349
- const codecAvailable = typeof VideoDecoder !== "undefined";
350
- let decoder = null;
351
- let unsubChunks = null;
352
- let waitingForKeyFrame = true;
353
- function startDecoder(width, height) {
354
- stopDecoder();
355
- if (!codecAvailable) return;
356
- waitingForKeyFrame = true;
357
- decoder = new VideoDecoder({
358
- output: (frame) => {
359
- if (ctx === null) {
360
- frame.close();
361
- return;
362
- }
363
- if (canvas.width !== frame.codedWidth || canvas.height !== frame.codedHeight) {
364
- canvas.width = frame.codedWidth;
365
- canvas.height = frame.codedHeight;
366
- }
367
- canvasSrcW = frame.codedWidth;
368
- canvasSrcH = frame.codedHeight;
369
- fitCanvas(frame.codedWidth, frame.codedHeight);
370
- ctx.drawImage(frame, 0, 0);
371
- frame.close();
372
- },
373
- error: () => {
374
- stopDecoder();
375
- }
376
- });
377
- decoder.configure({
378
- codec: "vp09.00.10.08",
379
- codedWidth: width,
380
- codedHeight: height
381
- });
382
- }
383
- function stopDecoder() {
384
- if (decoder !== null && decoder.state !== "closed") {
385
- try {
386
- decoder.close();
387
- } catch {
388
- }
389
- }
390
- decoder = null;
391
- waitingForKeyFrame = true;
392
- }
393
- let decoderWidth = 0;
394
- let decoderHeight = 0;
395
- function onChunk(chunk) {
396
- if (!isOpen) return;
397
- if (chunk.name !== activeName) return;
398
- if (decoder === null || chunk.width !== decoderWidth || chunk.height !== decoderHeight) {
399
- decoderWidth = chunk.width;
400
- decoderHeight = chunk.height;
401
- startDecoder(chunk.width, chunk.height);
402
- }
403
- if (decoder === null) return;
404
- if (waitingForKeyFrame && !chunk.keyFrame) return;
405
- if (chunk.keyFrame) waitingForKeyFrame = false;
406
- try {
407
- const encoded = new EncodedVideoChunk({
408
- type: chunk.keyFrame ? "key" : "delta",
409
- timestamp: chunk.capturedAt * 1e3,
410
- data: chunk.data
411
- });
412
- decoder.decode(encoded);
413
- } catch {
414
- stopDecoder();
415
- }
416
- }
417
- function open(name) {
418
- if (isOpen && activeName === name) return;
419
- isOpen = true;
420
- root.style.display = "flex";
421
- options.onOpen?.();
422
- setActive(name);
423
- client.setBuffers({ [name]: { mode: "stream" } });
424
- if (codecAvailable && unsubChunks === null) {
425
- unsubChunks = client.addChunkListener(onChunk);
426
- }
427
- }
428
- function close() {
429
- if (!isOpen) return;
430
- isOpen = false;
431
- root.style.display = "none";
432
- stopDecoder();
433
- if (unsubChunks !== null) {
434
- unsubChunks();
435
- unsubChunks = null;
436
- }
437
- client.setBuffers({});
438
- options.onClose?.();
439
- }
440
- return {
441
- get isOpen() {
442
- return isOpen;
443
- },
444
- open,
445
- close,
446
- dispose() {
447
- stopDecoder();
448
- if (unsubChunks !== null) {
449
- unsubChunks();
450
- unsubChunks = null;
451
- }
452
- unsubscribe();
453
- mainResizeObserver.disconnect();
454
- document.removeEventListener("keydown", onKeydown);
455
- window.removeEventListener("resize", onResize);
456
- window.removeEventListener("mousemove", onMouseMove);
457
- window.removeEventListener("mouseup", onMouseUp);
458
- root.remove();
459
- rowEls.clear();
460
- groupContainers.clear();
461
- }
462
- };
8
+ const root = document.createElement("div");
9
+ root.style.cssText = [
10
+ "position:fixed",
11
+ "inset:0",
12
+ "z-index:99999",
13
+ "background:rgba(0,2,28,0.92)",
14
+ "color:var(--tp-label-foreground-color, #f0edd8)",
15
+ "font-family:var(--tp-base-font-family, ui-monospace, monospace)",
16
+ "font-size:12px",
17
+ "display:none",
18
+ "flex-direction:column"
19
+ ].join(";");
20
+ const header = document.createElement("div");
21
+ header.style.cssText = [
22
+ "display:flex",
23
+ "align-items:center",
24
+ "gap:12px",
25
+ "padding:8px 12px",
26
+ "border-bottom:1px solid rgba(240,237,216,0.08)",
27
+ "flex:0 0 auto"
28
+ ].join(";");
29
+ const sidebarToggle = document.createElement("span");
30
+ sidebarToggle.textContent = "";
31
+ sidebarToggle.style.cssText = "cursor:pointer;padding:2px 6px;opacity:0.8;user-select:none";
32
+ sidebarToggle.title = "Toggle sidebar";
33
+ const titleEl = document.createElement("span");
34
+ titleEl.style.cssText = "flex:1;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap";
35
+ const dimsEl = document.createElement("span");
36
+ dimsEl.style.cssText = "opacity:0.7;font-variant-numeric:tabular-nums";
37
+ const closeBtn = document.createElement("span");
38
+ closeBtn.textContent = "×";
39
+ closeBtn.style.cssText = "cursor:pointer;padding:2px 10px;font-size:18px;line-height:1;opacity:0.8;user-select:none";
40
+ closeBtn.title = "Close";
41
+ header.appendChild(sidebarToggle);
42
+ header.appendChild(titleEl);
43
+ header.appendChild(dimsEl);
44
+ header.appendChild(closeBtn);
45
+ const body = document.createElement("div");
46
+ body.style.cssText = "display:flex;flex:1;min-height:0";
47
+ const sidebar = document.createElement("div");
48
+ sidebar.style.cssText = [
49
+ "display:flex",
50
+ "flex-direction:column",
51
+ "width:240px",
52
+ "border-right:1px solid rgba(240,237,216,0.08)",
53
+ "overflow-y:auto",
54
+ "padding:8px 0",
55
+ "flex:0 0 auto"
56
+ ].join(";");
57
+ const main = document.createElement("div");
58
+ main.style.cssText = "flex:1;display:flex;align-items:center;justify-content:center;padding:16px;min-width:0;min-height:0;overflow:hidden;position:relative";
59
+ const canvas = document.createElement("canvas");
60
+ canvas.style.cssText = "display:block;background:rgba(0,2,28,0.6);image-rendering:pixelated;max-width:100%;max-height:100%";
61
+ const ctx = canvas.getContext("2d");
62
+ const offscreen = document.createElement("canvas");
63
+ offscreen.width = 1;
64
+ offscreen.height = 1;
65
+ const zoomBar = document.createElement("div");
66
+ zoomBar.style.cssText = [
67
+ "position:absolute",
68
+ "top:8px",
69
+ "left:8px",
70
+ "display:flex",
71
+ "gap:6px",
72
+ "align-items:center",
73
+ "z-index:1"
74
+ ].join(";");
75
+ const zoomInfo = document.createElement("span");
76
+ zoomInfo.style.cssText = [
77
+ "padding:3px 8px",
78
+ "border-radius:4px",
79
+ "background:rgba(0,0,0,0.6)",
80
+ "color:#aaa",
81
+ "font:11px/1.4 monospace",
82
+ "pointer-events:none",
83
+ "user-select:none"
84
+ ].join(";");
85
+ zoomInfo.textContent = "1.0×";
86
+ const resetBtn = document.createElement("span");
87
+ resetBtn.style.cssText = [
88
+ "padding:3px 8px",
89
+ "border-radius:4px",
90
+ "background:rgba(0,0,0,0.6)",
91
+ "color:#aaa",
92
+ "font:11px/1.4 monospace",
93
+ "cursor:pointer",
94
+ "user-select:none"
95
+ ].join(";");
96
+ resetBtn.textContent = " Reset";
97
+ resetBtn.title = "Reset zoom & pan (double-click also resets)";
98
+ zoomBar.appendChild(zoomInfo);
99
+ zoomBar.appendChild(resetBtn);
100
+ main.appendChild(canvas);
101
+ main.appendChild(zoomBar);
102
+ body.appendChild(sidebar);
103
+ body.appendChild(main);
104
+ root.appendChild(header);
105
+ root.appendChild(body);
106
+ document.body.appendChild(root);
107
+ let isOpen = false;
108
+ let activeName = null;
109
+ let lastRenderedVersion = -1;
110
+ let sidebarCollapsed = false;
111
+ const MIN_ZOOM = .25;
112
+ const MAX_ZOOM = 64;
113
+ let zoom = 1;
114
+ let panX = 0;
115
+ let panY = 0;
116
+ let isDragging = false;
117
+ let dragStartX = 0;
118
+ let dragStartY = 0;
119
+ let panStartX = 0;
120
+ let panStartY = 0;
121
+ function updateZoomInfo() {
122
+ const z = zoom < 10 ? zoom.toFixed(1) : Math.round(zoom).toString();
123
+ zoomInfo.textContent = zoom === 1 ? "1.0×" : `${z}× · (${Math.round(panX)}, ${Math.round(panY)})`;
124
+ const atIdentity = zoom === 1 && panX === 0 && panY === 0;
125
+ resetBtn.style.display = atIdentity ? "none" : "inline";
126
+ }
127
+ function applyTransform() {
128
+ canvas.style.transform = `translate(${panX}px, ${panY}px) scale(${zoom})`;
129
+ canvas.style.transformOrigin = "center center";
130
+ updateZoomInfo();
131
+ }
132
+ function resetTransform() {
133
+ zoom = 1;
134
+ panX = 0;
135
+ panY = 0;
136
+ applyTransform();
137
+ }
138
+ main.addEventListener("wheel", (e) => {
139
+ e.preventDefault();
140
+ e.stopPropagation();
141
+ const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;
142
+ const newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom * factor));
143
+ if (newZoom === zoom) return;
144
+ const rect = main.getBoundingClientRect();
145
+ const mx = e.clientX - rect.left - rect.width / 2;
146
+ const my = e.clientY - rect.top - rect.height / 2;
147
+ const ratio = 1 - newZoom / zoom;
148
+ panX += (mx - panX) * ratio;
149
+ panY += (my - panY) * ratio;
150
+ zoom = newZoom;
151
+ applyTransform();
152
+ }, { passive: false });
153
+ main.addEventListener("mousedown", (e) => {
154
+ if (e.button !== 0) return;
155
+ isDragging = true;
156
+ dragStartX = e.clientX;
157
+ dragStartY = e.clientY;
158
+ panStartX = panX;
159
+ panStartY = panY;
160
+ main.style.cursor = "grabbing";
161
+ e.preventDefault();
162
+ });
163
+ const onMouseMove = (e) => {
164
+ if (!isDragging) return;
165
+ panX = panStartX + (e.clientX - dragStartX);
166
+ panY = panStartY + (e.clientY - dragStartY);
167
+ applyTransform();
168
+ };
169
+ const onMouseUp = () => {
170
+ if (!isDragging) return;
171
+ isDragging = false;
172
+ main.style.cursor = "grab";
173
+ };
174
+ window.addEventListener("mousemove", onMouseMove);
175
+ window.addEventListener("mouseup", onMouseUp);
176
+ main.addEventListener("dblclick", () => resetTransform());
177
+ resetBtn.addEventListener("click", () => resetTransform());
178
+ main.style.cursor = "grab";
179
+ const rowEls = /* @__PURE__ */ new Map();
180
+ const groupContainers = /* @__PURE__ */ new Map();
181
+ function ensureGroup(group) {
182
+ let el = groupContainers.get(group);
183
+ if (el !== void 0) return el;
184
+ el = document.createElement("div");
185
+ el.style.cssText = "margin:6px 0";
186
+ const head = document.createElement("div");
187
+ head.textContent = group;
188
+ head.style.cssText = "padding:4px 12px;opacity:0.6;font-size:11px;text-transform:uppercase;letter-spacing:0.05em;user-select:none";
189
+ el.appendChild(head);
190
+ sidebar.appendChild(el);
191
+ groupContainers.set(group, el);
192
+ return el;
193
+ }
194
+ function ensureRow(group, name, shortName) {
195
+ let row = rowEls.get(name);
196
+ if (row !== void 0) return row;
197
+ const groupEl = ensureGroup(group);
198
+ row = document.createElement("div");
199
+ row.textContent = shortName;
200
+ row.dataset["name"] = name;
201
+ row.style.cssText = "padding:4px 12px 4px 22px;cursor:pointer;user-select:none;border-left:2px solid transparent";
202
+ row.addEventListener("click", () => setActive(name));
203
+ groupEl.appendChild(row);
204
+ rowEls.set(name, row);
205
+ return row;
206
+ }
207
+ function destroyRow(name) {
208
+ const row = rowEls.get(name);
209
+ if (row === void 0) return;
210
+ row.remove();
211
+ rowEls.delete(name);
212
+ }
213
+ function highlightActive() {
214
+ for (const [name, row] of rowEls) {
215
+ const on = name === activeName;
216
+ row.style.background = on ? "rgba(71,204,169,0.15)" : "transparent";
217
+ row.style.borderLeftColor = on ? "var(--tp-button-foreground-color-active, #47cca9)" : "transparent";
218
+ row.style.color = on ? "var(--tp-label-foreground-color, #f0edd8)" : "rgba(240,237,216,0.7)";
219
+ }
220
+ }
221
+ function paint(snap) {
222
+ if (ctx === null) return;
223
+ const { width, height, pixels } = snap;
224
+ if (width === 0 || height === 0 || pixels === null) {
225
+ canvas.width = 1;
226
+ canvas.height = 1;
227
+ return;
228
+ }
229
+ if (offscreen.width !== width || offscreen.height !== height) {
230
+ offscreen.width = width;
231
+ offscreen.height = height;
232
+ }
233
+ const offCtx = offscreen.getContext("2d");
234
+ if (offCtx === null) return;
235
+ const imgData = offCtx.createImageData(width, height);
236
+ const out = imgData.data;
237
+ if (pixels instanceof Uint8Array) out.set(pixels.subarray(0, out.length));
238
+ else {
239
+ const count = width * height;
240
+ for (let i = 0; i < count; i++) {
241
+ const o = i * 4;
242
+ out[o] = Math.round(Math.max(0, Math.min(1, pixels[i * 4] ?? 0)) * 255);
243
+ out[o + 1] = Math.round(Math.max(0, Math.min(1, pixels[i * 4 + 1] ?? 0)) * 255);
244
+ out[o + 2] = Math.round(Math.max(0, Math.min(1, pixels[i * 4 + 2] ?? 0)) * 255);
245
+ out[o + 3] = Math.round(Math.max(0, Math.min(1, pixels[i * 4 + 3] ?? 1)) * 255);
246
+ }
247
+ }
248
+ offCtx.putImageData(imgData, 0, 0);
249
+ if (canvas.width !== width || canvas.height !== height) {
250
+ canvas.width = width;
251
+ canvas.height = height;
252
+ }
253
+ const fitW = snap.srcWidth > 0 ? snap.srcWidth : width;
254
+ const fitH = snap.srcHeight > 0 ? snap.srcHeight : height;
255
+ canvasSrcW = fitW;
256
+ canvasSrcH = fitH;
257
+ fitCanvas(fitW, fitH);
258
+ ctx.imageSmoothingEnabled = false;
259
+ ctx.drawImage(offscreen, 0, 0);
260
+ }
261
+ function refresh() {
262
+ if (!isOpen) return;
263
+ const state = client.state;
264
+ const present = /* @__PURE__ */ new Set();
265
+ for (const [name] of state.buffers) {
266
+ present.add(name);
267
+ const dot = name.indexOf(".");
268
+ ensureRow(dot === -1 ? "ungrouped" : name.slice(0, dot), name, dot === -1 ? name : name.slice(dot + 1));
269
+ }
270
+ for (const name of rowEls.keys()) if (!present.has(name)) destroyRow(name);
271
+ if (activeName !== null && !state.buffers.has(activeName)) {
272
+ activeName = state.buffers.keys().next().value ?? null;
273
+ if (activeName !== null) client.setBuffers({ [activeName]: { mode: "stream" } });
274
+ else client.setBuffers({});
275
+ }
276
+ highlightActive();
277
+ if (activeName === null) {
278
+ titleEl.textContent = "—";
279
+ dimsEl.textContent = "";
280
+ return;
281
+ }
282
+ const snap = state.buffers.get(activeName);
283
+ if (snap === void 0) return;
284
+ titleEl.textContent = snap.label !== void 0 ? `${activeName} — ${snap.label}` : activeName;
285
+ dimsEl.textContent = `${snap.width}×${snap.height} · ${snap.pixelType} · ${snap.display}`;
286
+ if (decoder === null && snap.version !== lastRenderedVersion) {
287
+ lastRenderedVersion = snap.version;
288
+ paint(snap);
289
+ }
290
+ }
291
+ function setActive(name) {
292
+ if (activeName === name) return;
293
+ activeName = name;
294
+ lastRenderedVersion = -1;
295
+ resetTransform();
296
+ stopDecoder();
297
+ decoderWidth = 0;
298
+ decoderHeight = 0;
299
+ client.setBuffers({ [name]: { mode: "stream" } });
300
+ options.onActiveChange?.(name);
301
+ highlightActive();
302
+ refresh();
303
+ }
304
+ const unsubscribe = client.addListener(() => refresh());
305
+ closeBtn.addEventListener("click", () => close());
306
+ sidebarToggle.addEventListener("click", () => {
307
+ sidebarCollapsed = !sidebarCollapsed;
308
+ sidebar.style.display = sidebarCollapsed ? "none" : "flex";
309
+ sidebarToggle.textContent = sidebarCollapsed ? "▶" : "◀";
310
+ refresh();
311
+ });
312
+ const onKeydown = (e) => {
313
+ if (!isOpen) return;
314
+ if (e.key === "Escape") close();
315
+ };
316
+ document.addEventListener("keydown", onKeydown);
317
+ function fitCanvas(srcW, srcH) {
318
+ if (srcW <= 0 || srcH <= 0) return;
319
+ const mainRect = main.getBoundingClientRect();
320
+ const maxW = Math.max(1, mainRect.width - 32);
321
+ const maxH = Math.max(1, mainRect.height - 32);
322
+ const srcAspect = srcW / srcH;
323
+ const boxAspect = maxW / maxH;
324
+ let cssW;
325
+ let cssH;
326
+ if (srcAspect > boxAspect) {
327
+ cssW = maxW;
328
+ cssH = Math.max(1, Math.round(maxW / srcAspect));
329
+ } else {
330
+ cssH = maxH;
331
+ cssW = Math.max(1, Math.round(maxH * srcAspect));
332
+ }
333
+ canvas.style.width = `${cssW}px`;
334
+ canvas.style.height = `${cssH}px`;
335
+ }
336
+ let canvasSrcW = 0;
337
+ let canvasSrcH = 0;
338
+ const onResize = () => {
339
+ if (!isOpen || activeName === null) return;
340
+ const snap = client.state.buffers.get(activeName);
341
+ if (snap !== void 0) paint(snap);
342
+ };
343
+ window.addEventListener("resize", onResize);
344
+ const mainResizeObserver = new ResizeObserver(() => {
345
+ if (!isOpen) return;
346
+ if (canvasSrcW > 0 && canvasSrcH > 0) fitCanvas(canvasSrcW, canvasSrcH);
347
+ });
348
+ mainResizeObserver.observe(main);
349
+ const codecAvailable = typeof VideoDecoder !== "undefined";
350
+ let decoder = null;
351
+ let unsubChunks = null;
352
+ let waitingForKeyFrame = true;
353
+ function startDecoder(width, height) {
354
+ stopDecoder();
355
+ if (!codecAvailable) return;
356
+ waitingForKeyFrame = true;
357
+ decoder = new VideoDecoder({
358
+ output: (frame) => {
359
+ if (ctx === null) {
360
+ frame.close();
361
+ return;
362
+ }
363
+ if (canvas.width !== frame.codedWidth || canvas.height !== frame.codedHeight) {
364
+ canvas.width = frame.codedWidth;
365
+ canvas.height = frame.codedHeight;
366
+ }
367
+ canvasSrcW = frame.codedWidth;
368
+ canvasSrcH = frame.codedHeight;
369
+ fitCanvas(frame.codedWidth, frame.codedHeight);
370
+ ctx.drawImage(frame, 0, 0);
371
+ frame.close();
372
+ },
373
+ error: () => {
374
+ stopDecoder();
375
+ }
376
+ });
377
+ decoder.configure({
378
+ codec: "vp09.00.10.08",
379
+ codedWidth: width,
380
+ codedHeight: height
381
+ });
382
+ }
383
+ function stopDecoder() {
384
+ if (decoder !== null && decoder.state !== "closed") try {
385
+ decoder.close();
386
+ } catch {}
387
+ decoder = null;
388
+ waitingForKeyFrame = true;
389
+ }
390
+ let decoderWidth = 0;
391
+ let decoderHeight = 0;
392
+ function onChunk(chunk) {
393
+ if (!isOpen) return;
394
+ if (chunk.name !== activeName) return;
395
+ if (decoder === null || chunk.width !== decoderWidth || chunk.height !== decoderHeight) {
396
+ decoderWidth = chunk.width;
397
+ decoderHeight = chunk.height;
398
+ startDecoder(chunk.width, chunk.height);
399
+ }
400
+ if (decoder === null) return;
401
+ if (waitingForKeyFrame && !chunk.keyFrame) return;
402
+ if (chunk.keyFrame) waitingForKeyFrame = false;
403
+ try {
404
+ const encoded = new EncodedVideoChunk({
405
+ type: chunk.keyFrame ? "key" : "delta",
406
+ timestamp: chunk.capturedAt * 1e3,
407
+ data: chunk.data
408
+ });
409
+ decoder.decode(encoded);
410
+ } catch {
411
+ stopDecoder();
412
+ }
413
+ }
414
+ function open(name) {
415
+ if (isOpen && activeName === name) return;
416
+ isOpen = true;
417
+ root.style.display = "flex";
418
+ options.onOpen?.();
419
+ setActive(name);
420
+ client.setBuffers({ [name]: { mode: "stream" } });
421
+ if (codecAvailable && unsubChunks === null) unsubChunks = client.addChunkListener(onChunk);
422
+ }
423
+ function close() {
424
+ if (!isOpen) return;
425
+ isOpen = false;
426
+ root.style.display = "none";
427
+ stopDecoder();
428
+ if (unsubChunks !== null) {
429
+ unsubChunks();
430
+ unsubChunks = null;
431
+ }
432
+ client.setBuffers({});
433
+ options.onClose?.();
434
+ }
435
+ return {
436
+ get isOpen() {
437
+ return isOpen;
438
+ },
439
+ open,
440
+ close,
441
+ dispose() {
442
+ stopDecoder();
443
+ if (unsubChunks !== null) {
444
+ unsubChunks();
445
+ unsubChunks = null;
446
+ }
447
+ unsubscribe();
448
+ mainResizeObserver.disconnect();
449
+ document.removeEventListener("keydown", onKeydown);
450
+ window.removeEventListener("resize", onResize);
451
+ window.removeEventListener("mousemove", onMouseMove);
452
+ window.removeEventListener("mouseup", onMouseUp);
453
+ root.remove();
454
+ rowEls.clear();
455
+ groupContainers.clear();
456
+ }
457
+ };
463
458
  }
464
- export {
465
- createBuffersModal
466
- };
459
+ //#endregion
460
+ export { createBuffersModal };
461
+
467
462
  //# sourceMappingURL=buffers-modal.js.map