@zenfg/inspector 0.1.0-beta.1 → 0.1.0-beta.2
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/README.md +81 -53
- package/dist/panelCytoscapeGraphRenderer.d.ts.map +1 -1
- package/dist/panelCytoscapeGraphRenderer.js +1 -0
- package/dist/panelCytoscapeGraphRenderer.js.map +1 -1
- package/dist/panelIcons.d.ts +1 -1
- package/dist/panelIcons.d.ts.map +1 -1
- package/dist/panelIcons.js +1 -0
- package/dist/panelIcons.js.map +1 -1
- package/dist/panelWorkbenchView.d.ts.map +1 -1
- package/dist/panelWorkbenchView.js +2 -1
- package/dist/panelWorkbenchView.js.map +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +4 -0
- package/dist/styles.js.map +1 -1
- package/package.json +2 -2
- package/src/panelCytoscapeGraphRenderer.ts +1 -0
- package/src/panelIcons.ts +2 -0
- package/src/panelWorkbenchView.ts +2 -1
- package/src/styles.ts +4 -0
package/README.md
CHANGED
|
@@ -6,69 +6,97 @@
|
|
|
6
6
|
[](https://github.com/uinosoft/zenfg/blob/main/LICENSE)
|
|
7
7
|
|
|
8
8
|
`@zenfg/inspector` is an embeddable, renderer-independent DOM workbench for
|
|
9
|
-
ZenFG Snapshot data. It depends on `@zenfg/snapshot`, Cytoscape, and ELK
|
|
9
|
+
ZenFG Snapshot data. It depends on `@zenfg/snapshot`, Cytoscape, and ELK, but has
|
|
10
10
|
no WebGPU, wgpu, engine, or host-UI dependency.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
For package selection, the capture data flow, version boundaries, and links to
|
|
16
|
-
complete producer recipes, see the
|
|
17
|
-
[ZenFG quick reference](https://github.com/uinosoft/zenfg/blob/main/docs/quick-reference.md).
|
|
12
|
+
The package owns Snapshot validation, migration, visualization, and workbench
|
|
13
|
+
state. The host owns layout around the workbench, live-capture policy, file
|
|
14
|
+
retention, and the renderer that produces Snapshot data.
|
|
18
15
|
|
|
19
16
|
## Installation
|
|
20
17
|
|
|
21
18
|
```sh
|
|
22
|
-
npm install @zenfg/inspector@0.1.0-beta.
|
|
19
|
+
npm install @zenfg/inspector@0.1.0-beta.2
|
|
23
20
|
```
|
|
24
21
|
|
|
25
|
-
##
|
|
22
|
+
## Quick start
|
|
23
|
+
|
|
24
|
+
Mount one Inspector into a host element and provide an optional live-capture
|
|
25
|
+
callback:
|
|
26
26
|
|
|
27
27
|
```ts
|
|
28
28
|
import { mountFrameGraphInspector } from '@zenfg/inspector';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
inspector
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
29
|
+
import type { FrameGraphSnapshot } from '@zenfg/snapshot';
|
|
30
|
+
|
|
31
|
+
export function mountInspector(
|
|
32
|
+
host: HTMLElement,
|
|
33
|
+
capture: () => FrameGraphSnapshot | Promise<FrameGraphSnapshot>,
|
|
34
|
+
): () => void {
|
|
35
|
+
const inspector = mountFrameGraphInspector(host, {
|
|
36
|
+
captureSnapshot: capture,
|
|
37
|
+
branding: 'ZenFG Inspector',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return () => inspector.destroy();
|
|
41
|
+
}
|
|
40
42
|
```
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
so the same workbench can be a
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
44
|
+
The host must have non-zero width and height. `FrameGraphInspector` fills that
|
|
45
|
+
host, so the same workbench can be embedded in a tool panel or mounted as a
|
|
46
|
+
full-page application.
|
|
47
|
+
|
|
48
|
+
## Common tasks
|
|
49
|
+
|
|
50
|
+
| Task | Public API |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| Mount into an existing element | `mountFrameGraphInspector()` |
|
|
53
|
+
| Construct without appending | `new FrameGraphInspector()` and its `dom` property |
|
|
54
|
+
| Request live data from the host | `captureSnapshot` option |
|
|
55
|
+
| Replace the current capture | `setSnapshot()` |
|
|
56
|
+
| Read the current canonical capture | `getSnapshot()` |
|
|
57
|
+
| Import and migrate a file | `importSnapshot()` |
|
|
58
|
+
| Download canonical Snapshot JSON | `downloadSnapshot()` |
|
|
59
|
+
| Copy canonical Snapshot JSON | `copySnapshotJson()` |
|
|
60
|
+
| Set visible product branding | `branding` option |
|
|
61
|
+
| Limit imported file size | `maxImportBytes` option |
|
|
62
|
+
| Limit automatic graph layout | `maxGraphElements` option |
|
|
63
|
+
| Release DOM, workers, and listeners | `destroy()` |
|
|
64
|
+
|
|
65
|
+
Exact options, defaults, return types, and lifecycle behavior are documented by
|
|
66
|
+
the TSDoc preserved in the packaged source and declarations.
|
|
67
|
+
|
|
68
|
+
## Workbench behavior
|
|
69
|
+
|
|
70
|
+
The workbench provides Overview, Graph, Passes, Resources, Memory, and
|
|
71
|
+
Diagnostics views plus a selection Inspector. It supports live capture, direct
|
|
72
|
+
Snapshot replacement, file import, supported legacy migration, canonical
|
|
73
|
+
download, clipboard copy, filtering, sorting, group expansion, and graph
|
|
74
|
+
navigation.
|
|
75
|
+
|
|
76
|
+
Capture, import, and direct replacement share a revision counter so stale async
|
|
77
|
+
results cannot replace newer data. Failed or oversized imports leave the
|
|
78
|
+
current valid capture and UI state intact. Graph layout is lazy and is disabled
|
|
79
|
+
with an explanation when a capture exceeds `maxGraphElements`; the tabular and
|
|
80
|
+
raw views remain available.
|
|
81
|
+
|
|
82
|
+
Snapshot labels, URLs, extensions, and diagnostics are assigned through text
|
|
83
|
+
DOM APIs and are never executed as markup or code. The standalone application
|
|
84
|
+
in `apps/inspector` mounts this same package without adding duplicate controls.
|
|
85
|
+
|
|
86
|
+
## Common mistakes
|
|
87
|
+
|
|
88
|
+
| Symptom | Fix |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| The Inspector is mounted but invisible | Give the host element a non-zero width and height. |
|
|
91
|
+
| Live capture never becomes available | Provide `captureSnapshot`, or call `setSnapshot()` with canonical data. |
|
|
92
|
+
| A large capture has no graph layout | Raise `maxGraphElements` deliberately or use the tabular/raw views. |
|
|
93
|
+
| A failed import appears to do nothing | Inspect the visible validation feedback; the previous valid capture is intentionally preserved. |
|
|
94
|
+
| Old capture results replace new ones in host code | Let the Inspector own capture sequencing instead of applying asynchronous results separately. |
|
|
95
|
+
| DOM or worker resources remain after unmount | Call `destroy()` when the host tool is released. |
|
|
96
|
+
|
|
97
|
+
## Further reading
|
|
98
|
+
|
|
99
|
+
- [Hosted Inspector](https://uinosoft.github.io/zenfg/inspector/)
|
|
100
|
+
- [`@zenfg/snapshot`](https://github.com/uinosoft/zenfg/blob/main/packages/snapshot/README.md)
|
|
101
|
+
- [ZenFG Core concepts](https://github.com/uinosoft/zenfg/blob/main/docs/core-concepts.md)
|
|
102
|
+
- [ZenFG documentation index](https://github.com/uinosoft/zenfg/blob/main/docs/README.md)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelCytoscapeGraphRenderer.d.ts","sourceRoot":"","sources":["../src/panelCytoscapeGraphRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAIH,KAAK,iBAAiB,EAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEH,KAAK,UAAU,EAIlB,MAAM,sBAAsB,CAAC;AAa9B,KAAK,oBAAoB,GAAG;IACxB,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,gBAAgB,KAAK,SAAS,CAAC,IAAI,CAAC;IAC7E,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,UAAU,IAAI,IAAI,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,uBAAuB,CAAC;CACpG,CAAC;AAEF,qBAAa,sBAAuB,YAAW,aAAa;IAyBpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAzBhC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IACzE,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,sBAAsB,CAAqB;IACnD,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAA2D;gBAGrD,IAAI,EAAE,WAAW,EACjB,WAAW,GAAE,wBAA0D;IAuB5F,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAqCzC,MAAM,IAAI,IAAI;IAId,GAAG,IAAI,IAAI;IAUX,QAAQ,IAAI,IAAI;IAYhB,OAAO,IAAI,IAAI;IAkBf,OAAO,CAAC,kBAAkB;YAYZ,eAAe;YAoGf,aAAa;YASb,WAAW;
|
|
1
|
+
{"version":3,"file":"panelCytoscapeGraphRenderer.d.ts","sourceRoot":"","sources":["../src/panelCytoscapeGraphRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAIH,KAAK,iBAAiB,EAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEH,KAAK,UAAU,EAIlB,MAAM,sBAAsB,CAAC;AAa9B,KAAK,oBAAoB,GAAG;IACxB,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,gBAAgB,KAAK,SAAS,CAAC,IAAI,CAAC;IAC7E,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,UAAU,IAAI,IAAI,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,uBAAuB,CAAC;CACpG,CAAC;AAEF,qBAAa,sBAAuB,YAAW,aAAa;IAyBpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAzBhC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IACzE,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,sBAAsB,CAAqB;IACnD,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAA2D;gBAGrD,IAAI,EAAE,WAAW,EACjB,WAAW,GAAE,wBAA0D;IAuB5F,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAqCzC,MAAM,IAAI,IAAI;IAId,GAAG,IAAI,IAAI;IAUX,QAAQ,IAAI,IAAI;IAYhB,OAAO,IAAI,IAAI;IAkBf,OAAO,CAAC,kBAAkB;YAYZ,eAAe;YAoGf,aAAa;YASb,WAAW;IAoBzB,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,qBAAqB;CAYhC;AAkDD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAW/E;AA0ED,OAAO,EACH,4BAA4B,EAC5B,oBAAoB,EACpB,gBAAgB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACR,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,aAAa,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelCytoscapeGraphRenderer.js","sourceRoot":"","sources":["../src/panelCytoscapeGraphRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type cytoscape from 'cytoscape';\nimport type { ELK } from 'elkjs/lib/elk-api';\n\nimport type { GraphRenderer, GraphRenderRequest } from './panelGraphRenderer.ts';\nimport {\n applyGraphLayout,\n layoutGraphScene,\n syncExpandedGroupLabelGeometry,\n type GraphLayoutResult,\n type GraphPosition,\n} from './panelGraphLayout.ts';\nimport {\n selectionKey,\n type GraphScene,\n type GraphSceneEdge,\n type GraphSceneElementId,\n type GraphSceneNode,\n} from './panelGraphScene.ts';\nimport {\n createGraphStyles,\n expandedGroupLabelMaxWidth,\n GRAPH_GEOMETRY,\n graphEdgeDisplayLabel,\n graphLayoutGeometryKey,\n isOverviewGraphScale,\n nodeDimensions,\n} from './panelGraphVisuals.ts';\n\ntype Viewport = { readonly pan: GraphPosition; readonly zoom: number };\n\ntype GraphRendererRuntime = {\n readonly createCore: (options: cytoscape.CytoscapeOptions) => cytoscape.Core;\n readonly elk: ELK;\n};\n\nexport type GraphResizeSubscription = { disconnect(): void };\n\nexport type GraphRendererEnvironment = {\n readonly createElement: (tagName: string) => HTMLElement;\n readonly loadRuntime: () => Promise<GraphRendererRuntime>;\n readonly layoutScene: (elk: ELK, scene: GraphScene) => Promise<GraphLayoutResult>;\n readonly observeResize?: (element: HTMLElement, onResize: () => void) => GraphResizeSubscription;\n};\n\nexport class CytoscapeGraphRenderer implements GraphRenderer {\n private readonly canvasHost: HTMLElement;\n private readonly tooltip: HTMLElement;\n private readonly status: HTMLElement;\n private readonly statusMessage: HTMLElement;\n private readonly retryButton: HTMLButtonElement;\n private readonly resizeSubscription: GraphResizeSubscription | undefined;\n private core: cytoscape.Core | undefined;\n private elk: ELK | undefined;\n private loading: Promise<void> | undefined;\n private processing: Promise<void> | undefined;\n private latestRequest: GraphRenderRequest | undefined;\n private appliedScene: GraphScene | undefined;\n private requestVersion = 0;\n private processedVersion = 0;\n private destroyed = false;\n private fitTargetContentKey: string | undefined;\n private forceRelayout = false;\n private anchorElementId: GraphSceneElementId | undefined;\n private anchorTargetContentKey: string | undefined;\n private failedSceneContentKey: string | undefined;\n private overview = false;\n private lastTap: { readonly id: string; readonly at: number } | undefined;\n\n constructor(\n private readonly host: HTMLElement,\n private readonly environment: GraphRendererEnvironment = browserGraphRendererEnvironment,\n ) {\n this.canvasHost = environment.createElement('div');\n this.canvasHost.className = 'zenfg-inspector-graph-canvas';\n this.tooltip = environment.createElement('div');\n this.tooltip.className = 'zenfg-inspector-graph-tooltip';\n this.tooltip.hidden = true;\n this.status = environment.createElement('div');\n this.status.className = 'zenfg-inspector-graph-status';\n this.status.hidden = true;\n this.status.setAttribute('role', 'status');\n this.status.setAttribute('aria-live', 'polite');\n this.statusMessage = environment.createElement('span');\n this.retryButton = environment.createElement('button') as HTMLButtonElement;\n this.retryButton.type = 'button';\n this.retryButton.textContent = 'Retry';\n this.retryButton.hidden = true;\n this.retryButton.addEventListener('click', () => this.relayout());\n this.status.append(this.statusMessage, this.retryButton);\n this.host.replaceChildren(this.canvasHost, this.status, this.tooltip);\n this.resizeSubscription = environment.observeResize?.(host, () => this.core?.resize());\n }\n\n render(request: GraphRenderRequest): void {\n if (this.destroyed) return;\n this.latestRequest = request;\n if (request.fit) {\n this.fitTargetContentKey = request.scene.contentKey;\n } else if (this.fitTargetContentKey !== request.scene.contentKey) {\n this.fitTargetContentKey = undefined;\n }\n if (request.anchorElementId !== undefined) {\n this.anchorElementId = request.anchorElementId;\n this.anchorTargetContentKey = request.scene.contentKey;\n } else if (this.anchorTargetContentKey !== request.scene.contentKey) {\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n }\n if (this.failedSceneContentKey && this.failedSceneContentKey !== request.scene.contentKey) {\n this.failedSceneContentKey = undefined;\n this.hideStatus();\n }\n\n const version = ++this.requestVersion;\n if (this.failedSceneContentKey === request.scene.contentKey) {\n this.syncInteraction(request);\n this.processedVersion = version;\n return;\n }\n if (!this.processing && this.core && this.appliedScene?.contentKey === request.scene.contentKey && !this.forceRelayout) {\n this.appliedScene = request.scene;\n this.syncInteraction(request);\n this.consumeFitIfCurrentTarget();\n this.consumeAnchorIfCurrentTarget();\n this.processedVersion = version;\n return;\n }\n this.scheduleProcessing();\n }\n\n resize(): void {\n this.core?.resize();\n }\n\n fit(): void {\n const targetContentKey = this.latestRequest?.scene.contentKey;\n if (targetContentKey) this.fitTargetContentKey = targetContentKey;\n if (!this.core || !this.appliedScene) return;\n this.core.resize();\n this.core.fit(undefined, GRAPH_GEOMETRY.fitPadding);\n this.updateSemanticZoom();\n if (!this.targetNeedsApply()) this.fitTargetContentKey = undefined;\n }\n\n relayout(): void {\n if (!this.latestRequest || this.destroyed) return;\n this.failedSceneContentKey = undefined;\n this.forceRelayout = true;\n this.fitTargetContentKey = this.latestRequest.scene.contentKey;\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n this.hideTooltip();\n ++this.requestVersion;\n this.scheduleProcessing();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.requestVersion++;\n this.resizeSubscription?.disconnect();\n this.hideTooltip();\n this.core?.destroy();\n this.core = undefined;\n this.elk = undefined;\n this.loading = undefined;\n this.latestRequest = undefined;\n this.appliedScene = undefined;\n this.fitTargetContentKey = undefined;\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n this.host.replaceChildren();\n }\n\n private scheduleProcessing(): void {\n if (this.processing || this.destroyed) return;\n this.processing = this.processRequests().finally(() => {\n this.processing = undefined;\n if (!this.destroyed\n && !this.failedSceneContentKey\n && this.processedVersion !== this.requestVersion) {\n this.scheduleProcessing();\n }\n });\n }\n\n private async processRequests(): Promise<void> {\n while (!this.destroyed && this.processedVersion !== this.requestVersion) {\n let version = this.requestVersion;\n let request = this.latestRequest;\n if (!request) return;\n\n if (request.scene.nodes.length === 0) {\n this.hideTooltip();\n if (this.core) replaceElements(this.core, request.scene);\n this.appliedScene = request.scene;\n this.forceRelayout = false;\n if (this.fitTargetContentKey === request.scene.contentKey) this.fitTargetContentKey = undefined;\n this.consumeAnchorIfCurrentTarget();\n this.syncInteraction(request);\n this.showStatus('empty', 'No graph elements in this view.');\n this.processedVersion = version;\n continue;\n }\n\n try {\n if (!this.core) this.showStatus('loading', 'Loading graph runtime…');\n await this.ensureRuntime();\n const runtimeRequest = this.resolveCurrentRequest(version, request.scene.contentKey);\n if (!runtimeRequest) continue;\n ({ version, request } = runtimeRequest);\n const core = this.core!;\n if (this.appliedScene?.contentKey === request.scene.contentKey && !this.forceRelayout) {\n this.appliedScene = request.scene;\n this.syncInteraction(request);\n this.consumeFitIfCurrentTarget();\n this.consumeAnchorIfCurrentTarget();\n this.hideStatus();\n this.processedVersion = version;\n continue;\n }\n\n this.hideTooltip();\n const previousViewport = viewport(core);\n const anchorElementId = this.anchorTargetContentKey === request.scene.contentKey\n ? this.anchorElementId\n : undefined;\n const anchorBefore = anchorElementId === undefined\n ? undefined\n : renderedPosition(core, anchorElementId);\n const topologyChanged = this.appliedScene?.topologyKey !== request.scene.topologyKey;\n const geometryChanged = !this.appliedScene\n || graphLayoutGeometryKey(this.appliedScene) !== graphLayoutGeometryKey(request.scene);\n let laidOut = false;\n\n if (geometryChanged || this.forceRelayout) {\n this.showStatus('layout', 'Laying out graph…');\n const result = await this.environment.layoutScene(this.elk!, request.scene);\n const layoutRequest = this.resolveCurrentRequest(version, request.scene.contentKey);\n if (!layoutRequest) continue;\n ({ version, request } = layoutRequest);\n if (topologyChanged || !this.appliedScene) replaceElements(core, request.scene);\n else updateElementData(core, request.scene);\n applyGraphLayout(core, request.scene, result);\n laidOut = true;\n } else {\n updateElementData(core, request.scene);\n }\n\n syncExpandedGroupLabelGeometry(core);\n this.appliedScene = request.scene;\n this.forceRelayout = false;\n this.failedSceneContentKey = undefined;\n this.syncInteraction(request);\n core.resize();\n if (this.fitTargetContentKey === request.scene.contentKey) {\n core.fit(undefined, GRAPH_GEOMETRY.fitPadding);\n this.fitTargetContentKey = undefined;\n } else if (laidOut && anchorBefore && anchorElementId) {\n restoreViewport(core, previousViewport);\n const anchorAfter = renderedPosition(core, anchorElementId);\n if (anchorAfter) core.panBy({ x: anchorBefore.x - anchorAfter.x, y: anchorBefore.y - anchorAfter.y });\n } else {\n restoreViewport(core, previousViewport);\n }\n this.consumeAnchorIfCurrentTarget();\n this.updateSemanticZoom(true);\n this.hideStatus();\n this.processedVersion = version;\n } catch (error) {\n const failedRequest = this.resolveCurrentRequest(version, request.scene.contentKey);\n if (!failedRequest) continue;\n ({ version, request } = failedRequest);\n this.forceRelayout = false;\n this.failedSceneContentKey = request.scene.contentKey;\n this.processedVersion = version;\n this.showStatus(\n 'error',\n `Failed to render graph: ${error instanceof Error ? error.message : String(error)}`,\n true,\n );\n return;\n }\n }\n }\n\n private async ensureRuntime(): Promise<void> {\n if (this.core || this.destroyed) return;\n this.loading ??= this.loadRuntime().catch((error) => {\n this.loading = undefined;\n throw error;\n });\n await this.loading;\n }\n\n private async loadRuntime(): Promise<void> {\n const runtime = await this.environment.loadRuntime();\n if (this.destroyed) return;\n this.canvasHost.textContent = '';\n this.elk = runtime.elk;\n this.core = runtime.createCore({\n container: this.canvasHost,\n elements: [],\n style: createGraphStyles(),\n layout: { name: 'preset' },\n minZoom: 0.03,\n maxZoom: 4,\n boxSelectionEnabled: false,\n autoungrabify: true,\n autounselectify: true,\n });\n this.bindEvents(this.core);\n }\n\n private bindEvents(core: cytoscape.Core): void {\n const selectElement = (event: cytoscape.EventObject) => {\n const request = this.interactiveRequest();\n if (!request) return;\n const id = event.target.id() as GraphSceneElementId;\n const selection = request.scene.interaction.selectionByElementId.get(id);\n if (selection) request.onSelect(selection);\n const now = performance.now();\n if (this.lastTap?.id === id && now - this.lastTap.at <= 350 && selection?.kind === 'group') {\n request.onToggleGroup(selection.pathKey);\n this.lastTap = undefined;\n } else {\n this.lastTap = { id, at: now };\n }\n };\n core.on('tap', 'node', selectElement);\n core.on('tap', 'edge', selectElement);\n core.on('tap', (event) => {\n if (event.target === core) this.lastTap = undefined;\n });\n const hoverElement = (event: cytoscape.EventObject) => {\n const request = this.interactiveRequest();\n if (!request) return;\n const id = event.target.id() as GraphSceneElementId;\n const selection = request.scene.interaction.selectionByElementId.get(id);\n if (selection) request.onHover(selection);\n const title = event.target.data('tooltip') as string | undefined;\n if (title) {\n this.tooltip.textContent = title;\n this.tooltip.hidden = false;\n this.positionTooltip(event.renderedPosition);\n }\n };\n core.on('mouseover', 'node', hoverElement);\n core.on('mouseover', 'edge', hoverElement);\n const moveTooltip = (event: cytoscape.EventObject) => this.positionTooltip(event.renderedPosition);\n core.on('mousemove', 'node', moveTooltip);\n core.on('mousemove', 'edge', moveTooltip);\n const clearHover = () => {\n this.hideTooltip();\n this.latestRequest?.onHover(undefined);\n };\n core.on('mouseout', 'node', clearHover);\n core.on('mouseout', 'edge', clearHover);\n core.on('zoom', () => this.updateSemanticZoom());\n }\n\n private interactiveRequest(): GraphRenderRequest | undefined {\n const request = this.latestRequest;\n return request && this.appliedScene?.contentKey === request.scene.contentKey ? request : undefined;\n }\n\n private syncInteraction(request: GraphRenderRequest): void {\n const core = this.core;\n if (!core || this.appliedScene?.topologyKey !== request.scene.topologyKey) return;\n core.batch(() => {\n core.elements().removeClass('semantic-selected semantic-hover');\n if (request.hovered) {\n for (const id of request.scene.interaction.relatedElementIdsBySelection.get(selectionKey(request.hovered)) ?? []) {\n core.getElementById(id).addClass('semantic-hover');\n }\n }\n if (request.selected) {\n for (const id of request.scene.interaction.primaryElementIdsBySelection.get(selectionKey(request.selected)) ?? []) {\n core.getElementById(id).addClass('semantic-selected');\n }\n }\n });\n }\n\n private consumeFitIfCurrentTarget(): void {\n const targetContentKey = this.latestRequest?.scene.contentKey;\n if (!targetContentKey\n || this.fitTargetContentKey !== targetContentKey\n || !this.core\n || this.targetNeedsApply()) return;\n this.core.resize();\n this.core.fit(undefined, GRAPH_GEOMETRY.fitPadding);\n this.fitTargetContentKey = undefined;\n this.updateSemanticZoom();\n }\n\n private consumeAnchorIfCurrentTarget(): void {\n const targetContentKey = this.latestRequest?.scene.contentKey;\n if (!targetContentKey || this.anchorTargetContentKey !== targetContentKey) return;\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n }\n\n private targetNeedsApply(): boolean {\n const target = this.latestRequest?.scene;\n if (!target || !this.appliedScene) return target !== undefined;\n return this.forceRelayout || this.appliedScene.contentKey !== target.contentKey;\n }\n\n private updateSemanticZoom(force = false): void {\n const core = this.core;\n if (!core) return;\n const overview = isOverviewGraphScale(core.zoom());\n if (!force && overview === this.overview) return;\n this.overview = overview;\n core.batch(() => {\n for (const node of core.nodes()) {\n node.data('displayLabel', overview ? node.data('overviewLabel') : node.data('detailLabel'));\n }\n for (const edge of core.edges()) {\n edge.data('displayLabel', overview ? '' : edge.data('detailLabel'));\n }\n });\n }\n\n private positionTooltip(position: GraphPosition): void {\n const maxX = Math.max(8, this.host.clientWidth - this.tooltip.offsetWidth - 8);\n const maxY = Math.max(8, this.host.clientHeight - this.tooltip.offsetHeight - 8);\n this.tooltip.style.left = `${Math.max(8, Math.min(maxX, position.x + 12))}px`;\n this.tooltip.style.top = `${Math.max(8, Math.min(maxY, position.y + 12))}px`;\n }\n\n private hideTooltip(): void {\n this.tooltip.hidden = true;\n this.tooltip.textContent = '';\n this.lastTap = undefined;\n }\n\n private showStatus(kind: 'loading' | 'layout' | 'empty' | 'error', message: string, retry = false): void {\n this.status.dataset.state = kind;\n this.statusMessage.textContent = message;\n this.retryButton.hidden = !retry;\n this.status.hidden = false;\n this.host.setAttribute('aria-busy', kind === 'loading' || kind === 'layout' ? 'true' : 'false');\n }\n\n private hideStatus(): void {\n this.status.hidden = true;\n this.retryButton.hidden = true;\n this.host.setAttribute('aria-busy', 'false');\n }\n\n private resolveCurrentRequest(\n version: number,\n contentKey: string,\n ): { readonly version: number; readonly request: GraphRenderRequest } | undefined {\n if (this.destroyed) return undefined;\n const request = this.latestRequest;\n if (!request) return undefined;\n if (version === this.requestVersion || request.scene.contentKey === contentKey) {\n return { version: this.requestVersion, request };\n }\n return undefined;\n }\n}\n\nconst browserGraphRendererEnvironment: GraphRendererEnvironment = {\n createElement: (tagName) => document.createElement(tagName),\n loadRuntime: async () => {\n const [cytoscapeModule, elkModule] = await Promise.all([\n import('cytoscape'),\n import('elkjs/lib/elk.bundled.js'),\n ]);\n return {\n createCore: cytoscapeModule.default,\n elk: new elkModule.default(),\n };\n },\n layoutScene: layoutGraphScene,\n observeResize: (element, onResize) => {\n if (typeof ResizeObserver === 'undefined') return { disconnect: () => undefined };\n const view = element.ownerDocument.defaultView;\n let animationFrame: number | undefined;\n const observer = new ResizeObserver(() => {\n if (!view || animationFrame !== undefined) return;\n animationFrame = view.requestAnimationFrame(() => {\n animationFrame = undefined;\n onResize();\n });\n });\n observer.observe(element);\n return {\n disconnect: () => {\n observer.disconnect();\n if (animationFrame !== undefined) {\n view?.cancelAnimationFrame(animationFrame);\n animationFrame = undefined;\n }\n },\n };\n },\n};\n\nfunction replaceElements(core: cytoscape.Core, scene: GraphScene): void {\n const definitions: cytoscape.ElementDefinition[] = [\n ...scene.nodes.map(nodeDefinition),\n ...scene.edges.map(edgeDefinition),\n ];\n core.startBatch();\n core.elements().remove();\n core.add(definitions);\n core.endBatch();\n}\n\nexport function updateElementData(core: cytoscape.Core, scene: GraphScene): void {\n core.batch(() => {\n for (const node of scene.nodes) {\n const element = core.getElementById(node.id);\n if (element.nonempty()) element.data(nodeRenderableData(node));\n }\n for (const edge of scene.edges) {\n const element = core.getElementById(edge.id);\n if (element.nonempty()) element.data(edgeRenderableData(edge));\n }\n });\n}\n\nfunction nodeDefinition(node: GraphSceneNode): cytoscape.ElementDefinition {\n return {\n group: 'nodes',\n data: {\n id: node.id,\n parent: node.parentId,\n ...nodeRenderableData(node),\n },\n };\n}\n\nfunction nodeRenderableData(node: GraphSceneNode): Record<string, unknown> {\n const dimensions = nodeDimensions(node);\n const labelMaxWidth = node.kind === 'group' && node.collapsed\n ? expandedGroupLabelMaxWidth(dimensions.width)\n : 160;\n return {\n kind: node.kind,\n passKind: node.kind === 'pass' || node.kind === 'culled-pass' ? node.passKind : undefined,\n resourceKind: node.kind === 'resource' ? node.resourceKind : undefined,\n collapsed: node.kind === 'group' && node.collapsed ? 1 : 0,\n hasCulled: node.kind === 'group' && node.culledNodeCount > 0 ? 1 : 0,\n depthBand: node.kind === 'group' ? node.depthBand : undefined,\n detailLabel: node.label,\n overviewLabel: node.overviewLabel,\n displayLabel: node.label,\n tooltip: node.title,\n labelMaxWidth,\n width: dimensions.width,\n height: dimensions.height,\n };\n}\n\nfunction edgeDefinition(edge: GraphSceneEdge): cytoscape.ElementDefinition {\n return {\n group: 'edges',\n data: {\n id: edge.id,\n source: edge.from,\n target: edge.to,\n ...edgeRenderableData(edge),\n },\n };\n}\n\nfunction edgeRenderableData(edge: GraphSceneEdge): Record<string, unknown> {\n const detailLabel = graphEdgeDisplayLabel(edge);\n return {\n kind: edge.kind,\n dependencyKind: edge.kind === 'dependency' ? edge.dependencyKind : undefined,\n accessMode: edge.kind === 'access' ? edge.accessMode : undefined,\n dashed: edge.kind === 'access' && edge.dashed ? 1 : 0,\n detailLabel,\n displayLabel: detailLabel,\n tooltip: edge.title,\n };\n}\n\nfunction viewport(core: cytoscape.Core): Viewport {\n return { pan: { ...core.pan() }, zoom: core.zoom() };\n}\n\nfunction restoreViewport(core: cytoscape.Core, state: Viewport): void {\n core.zoom(state.zoom);\n core.pan(state.pan);\n}\n\nfunction renderedPosition(core: cytoscape.Core, id: GraphSceneElementId): GraphPosition | undefined {\n const element = core.getElementById(id);\n return element.nonempty() && element.isNode() ? { ...element.renderedPosition() } : undefined;\n}\n\nexport {\n createCytoscapeEdgeRouteData,\n createElkLayoutGraph,\n layoutGraphScene,\n} from './panelGraphLayout.ts';\nexport type {\n CytoscapeEdgeRouteData,\n GraphEdgeRoute,\n GraphLayoutResult,\n GraphPosition,\n} from './panelGraphLayout.ts';\nexport {\n createGraphStyles,\n expandedGroupLabelMaxWidth,\n graphEdgeDisplayLabel,\n graphLayoutGeometryKey,\n isOverviewGraphScale,\n} from './panelGraphVisuals.ts';\n"]}
|
|
1
|
+
{"version":3,"file":"panelCytoscapeGraphRenderer.js","sourceRoot":"","sources":["../src/panelCytoscapeGraphRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type cytoscape from 'cytoscape';\nimport type { ELK } from 'elkjs/lib/elk-api';\n\nimport type { GraphRenderer, GraphRenderRequest } from './panelGraphRenderer.ts';\nimport {\n applyGraphLayout,\n layoutGraphScene,\n syncExpandedGroupLabelGeometry,\n type GraphLayoutResult,\n type GraphPosition,\n} from './panelGraphLayout.ts';\nimport {\n selectionKey,\n type GraphScene,\n type GraphSceneEdge,\n type GraphSceneElementId,\n type GraphSceneNode,\n} from './panelGraphScene.ts';\nimport {\n createGraphStyles,\n expandedGroupLabelMaxWidth,\n GRAPH_GEOMETRY,\n graphEdgeDisplayLabel,\n graphLayoutGeometryKey,\n isOverviewGraphScale,\n nodeDimensions,\n} from './panelGraphVisuals.ts';\n\ntype Viewport = { readonly pan: GraphPosition; readonly zoom: number };\n\ntype GraphRendererRuntime = {\n readonly createCore: (options: cytoscape.CytoscapeOptions) => cytoscape.Core;\n readonly elk: ELK;\n};\n\nexport type GraphResizeSubscription = { disconnect(): void };\n\nexport type GraphRendererEnvironment = {\n readonly createElement: (tagName: string) => HTMLElement;\n readonly loadRuntime: () => Promise<GraphRendererRuntime>;\n readonly layoutScene: (elk: ELK, scene: GraphScene) => Promise<GraphLayoutResult>;\n readonly observeResize?: (element: HTMLElement, onResize: () => void) => GraphResizeSubscription;\n};\n\nexport class CytoscapeGraphRenderer implements GraphRenderer {\n private readonly canvasHost: HTMLElement;\n private readonly tooltip: HTMLElement;\n private readonly status: HTMLElement;\n private readonly statusMessage: HTMLElement;\n private readonly retryButton: HTMLButtonElement;\n private readonly resizeSubscription: GraphResizeSubscription | undefined;\n private core: cytoscape.Core | undefined;\n private elk: ELK | undefined;\n private loading: Promise<void> | undefined;\n private processing: Promise<void> | undefined;\n private latestRequest: GraphRenderRequest | undefined;\n private appliedScene: GraphScene | undefined;\n private requestVersion = 0;\n private processedVersion = 0;\n private destroyed = false;\n private fitTargetContentKey: string | undefined;\n private forceRelayout = false;\n private anchorElementId: GraphSceneElementId | undefined;\n private anchorTargetContentKey: string | undefined;\n private failedSceneContentKey: string | undefined;\n private overview = false;\n private lastTap: { readonly id: string; readonly at: number } | undefined;\n\n constructor(\n private readonly host: HTMLElement,\n private readonly environment: GraphRendererEnvironment = browserGraphRendererEnvironment,\n ) {\n this.canvasHost = environment.createElement('div');\n this.canvasHost.className = 'zenfg-inspector-graph-canvas';\n this.tooltip = environment.createElement('div');\n this.tooltip.className = 'zenfg-inspector-graph-tooltip';\n this.tooltip.hidden = true;\n this.status = environment.createElement('div');\n this.status.className = 'zenfg-inspector-graph-status';\n this.status.hidden = true;\n this.status.setAttribute('role', 'status');\n this.status.setAttribute('aria-live', 'polite');\n this.statusMessage = environment.createElement('span');\n this.retryButton = environment.createElement('button') as HTMLButtonElement;\n this.retryButton.type = 'button';\n this.retryButton.textContent = 'Retry';\n this.retryButton.hidden = true;\n this.retryButton.addEventListener('click', () => this.relayout());\n this.status.append(this.statusMessage, this.retryButton);\n this.host.replaceChildren(this.canvasHost, this.status, this.tooltip);\n this.resizeSubscription = environment.observeResize?.(host, () => this.core?.resize());\n }\n\n render(request: GraphRenderRequest): void {\n if (this.destroyed) return;\n this.latestRequest = request;\n if (request.fit) {\n this.fitTargetContentKey = request.scene.contentKey;\n } else if (this.fitTargetContentKey !== request.scene.contentKey) {\n this.fitTargetContentKey = undefined;\n }\n if (request.anchorElementId !== undefined) {\n this.anchorElementId = request.anchorElementId;\n this.anchorTargetContentKey = request.scene.contentKey;\n } else if (this.anchorTargetContentKey !== request.scene.contentKey) {\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n }\n if (this.failedSceneContentKey && this.failedSceneContentKey !== request.scene.contentKey) {\n this.failedSceneContentKey = undefined;\n this.hideStatus();\n }\n\n const version = ++this.requestVersion;\n if (this.failedSceneContentKey === request.scene.contentKey) {\n this.syncInteraction(request);\n this.processedVersion = version;\n return;\n }\n if (!this.processing && this.core && this.appliedScene?.contentKey === request.scene.contentKey && !this.forceRelayout) {\n this.appliedScene = request.scene;\n this.syncInteraction(request);\n this.consumeFitIfCurrentTarget();\n this.consumeAnchorIfCurrentTarget();\n this.processedVersion = version;\n return;\n }\n this.scheduleProcessing();\n }\n\n resize(): void {\n this.core?.resize();\n }\n\n fit(): void {\n const targetContentKey = this.latestRequest?.scene.contentKey;\n if (targetContentKey) this.fitTargetContentKey = targetContentKey;\n if (!this.core || !this.appliedScene) return;\n this.core.resize();\n this.core.fit(undefined, GRAPH_GEOMETRY.fitPadding);\n this.updateSemanticZoom();\n if (!this.targetNeedsApply()) this.fitTargetContentKey = undefined;\n }\n\n relayout(): void {\n if (!this.latestRequest || this.destroyed) return;\n this.failedSceneContentKey = undefined;\n this.forceRelayout = true;\n this.fitTargetContentKey = this.latestRequest.scene.contentKey;\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n this.hideTooltip();\n ++this.requestVersion;\n this.scheduleProcessing();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.requestVersion++;\n this.resizeSubscription?.disconnect();\n this.hideTooltip();\n this.core?.destroy();\n this.core = undefined;\n this.elk = undefined;\n this.loading = undefined;\n this.latestRequest = undefined;\n this.appliedScene = undefined;\n this.fitTargetContentKey = undefined;\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n this.host.replaceChildren();\n }\n\n private scheduleProcessing(): void {\n if (this.processing || this.destroyed) return;\n this.processing = this.processRequests().finally(() => {\n this.processing = undefined;\n if (!this.destroyed\n && !this.failedSceneContentKey\n && this.processedVersion !== this.requestVersion) {\n this.scheduleProcessing();\n }\n });\n }\n\n private async processRequests(): Promise<void> {\n while (!this.destroyed && this.processedVersion !== this.requestVersion) {\n let version = this.requestVersion;\n let request = this.latestRequest;\n if (!request) return;\n\n if (request.scene.nodes.length === 0) {\n this.hideTooltip();\n if (this.core) replaceElements(this.core, request.scene);\n this.appliedScene = request.scene;\n this.forceRelayout = false;\n if (this.fitTargetContentKey === request.scene.contentKey) this.fitTargetContentKey = undefined;\n this.consumeAnchorIfCurrentTarget();\n this.syncInteraction(request);\n this.showStatus('empty', 'No graph elements in this view.');\n this.processedVersion = version;\n continue;\n }\n\n try {\n if (!this.core) this.showStatus('loading', 'Loading graph runtime…');\n await this.ensureRuntime();\n const runtimeRequest = this.resolveCurrentRequest(version, request.scene.contentKey);\n if (!runtimeRequest) continue;\n ({ version, request } = runtimeRequest);\n const core = this.core!;\n if (this.appliedScene?.contentKey === request.scene.contentKey && !this.forceRelayout) {\n this.appliedScene = request.scene;\n this.syncInteraction(request);\n this.consumeFitIfCurrentTarget();\n this.consumeAnchorIfCurrentTarget();\n this.hideStatus();\n this.processedVersion = version;\n continue;\n }\n\n this.hideTooltip();\n const previousViewport = viewport(core);\n const anchorElementId = this.anchorTargetContentKey === request.scene.contentKey\n ? this.anchorElementId\n : undefined;\n const anchorBefore = anchorElementId === undefined\n ? undefined\n : renderedPosition(core, anchorElementId);\n const topologyChanged = this.appliedScene?.topologyKey !== request.scene.topologyKey;\n const geometryChanged = !this.appliedScene\n || graphLayoutGeometryKey(this.appliedScene) !== graphLayoutGeometryKey(request.scene);\n let laidOut = false;\n\n if (geometryChanged || this.forceRelayout) {\n this.showStatus('layout', 'Laying out graph…');\n const result = await this.environment.layoutScene(this.elk!, request.scene);\n const layoutRequest = this.resolveCurrentRequest(version, request.scene.contentKey);\n if (!layoutRequest) continue;\n ({ version, request } = layoutRequest);\n if (topologyChanged || !this.appliedScene) replaceElements(core, request.scene);\n else updateElementData(core, request.scene);\n applyGraphLayout(core, request.scene, result);\n laidOut = true;\n } else {\n updateElementData(core, request.scene);\n }\n\n syncExpandedGroupLabelGeometry(core);\n this.appliedScene = request.scene;\n this.forceRelayout = false;\n this.failedSceneContentKey = undefined;\n this.syncInteraction(request);\n core.resize();\n if (this.fitTargetContentKey === request.scene.contentKey) {\n core.fit(undefined, GRAPH_GEOMETRY.fitPadding);\n this.fitTargetContentKey = undefined;\n } else if (laidOut && anchorBefore && anchorElementId) {\n restoreViewport(core, previousViewport);\n const anchorAfter = renderedPosition(core, anchorElementId);\n if (anchorAfter) core.panBy({ x: anchorBefore.x - anchorAfter.x, y: anchorBefore.y - anchorAfter.y });\n } else {\n restoreViewport(core, previousViewport);\n }\n this.consumeAnchorIfCurrentTarget();\n this.updateSemanticZoom(true);\n this.hideStatus();\n this.processedVersion = version;\n } catch (error) {\n const failedRequest = this.resolveCurrentRequest(version, request.scene.contentKey);\n if (!failedRequest) continue;\n ({ version, request } = failedRequest);\n this.forceRelayout = false;\n this.failedSceneContentKey = request.scene.contentKey;\n this.processedVersion = version;\n this.showStatus(\n 'error',\n `Failed to render graph: ${error instanceof Error ? error.message : String(error)}`,\n true,\n );\n return;\n }\n }\n }\n\n private async ensureRuntime(): Promise<void> {\n if (this.core || this.destroyed) return;\n this.loading ??= this.loadRuntime().catch((error) => {\n this.loading = undefined;\n throw error;\n });\n await this.loading;\n }\n\n private async loadRuntime(): Promise<void> {\n const runtime = await this.environment.loadRuntime();\n if (this.destroyed) return;\n this.canvasHost.textContent = '';\n this.elk = runtime.elk;\n this.core = runtime.createCore({\n container: this.canvasHost,\n elements: [],\n style: createGraphStyles(),\n layout: { name: 'preset' },\n minZoom: 0.03,\n maxZoom: 4,\n wheelSensitivity: 1.3,\n boxSelectionEnabled: false,\n autoungrabify: true,\n autounselectify: true,\n });\n this.bindEvents(this.core);\n }\n\n private bindEvents(core: cytoscape.Core): void {\n const selectElement = (event: cytoscape.EventObject) => {\n const request = this.interactiveRequest();\n if (!request) return;\n const id = event.target.id() as GraphSceneElementId;\n const selection = request.scene.interaction.selectionByElementId.get(id);\n if (selection) request.onSelect(selection);\n const now = performance.now();\n if (this.lastTap?.id === id && now - this.lastTap.at <= 350 && selection?.kind === 'group') {\n request.onToggleGroup(selection.pathKey);\n this.lastTap = undefined;\n } else {\n this.lastTap = { id, at: now };\n }\n };\n core.on('tap', 'node', selectElement);\n core.on('tap', 'edge', selectElement);\n core.on('tap', (event) => {\n if (event.target === core) this.lastTap = undefined;\n });\n const hoverElement = (event: cytoscape.EventObject) => {\n const request = this.interactiveRequest();\n if (!request) return;\n const id = event.target.id() as GraphSceneElementId;\n const selection = request.scene.interaction.selectionByElementId.get(id);\n if (selection) request.onHover(selection);\n const title = event.target.data('tooltip') as string | undefined;\n if (title) {\n this.tooltip.textContent = title;\n this.tooltip.hidden = false;\n this.positionTooltip(event.renderedPosition);\n }\n };\n core.on('mouseover', 'node', hoverElement);\n core.on('mouseover', 'edge', hoverElement);\n const moveTooltip = (event: cytoscape.EventObject) => this.positionTooltip(event.renderedPosition);\n core.on('mousemove', 'node', moveTooltip);\n core.on('mousemove', 'edge', moveTooltip);\n const clearHover = () => {\n this.hideTooltip();\n this.latestRequest?.onHover(undefined);\n };\n core.on('mouseout', 'node', clearHover);\n core.on('mouseout', 'edge', clearHover);\n core.on('zoom', () => this.updateSemanticZoom());\n }\n\n private interactiveRequest(): GraphRenderRequest | undefined {\n const request = this.latestRequest;\n return request && this.appliedScene?.contentKey === request.scene.contentKey ? request : undefined;\n }\n\n private syncInteraction(request: GraphRenderRequest): void {\n const core = this.core;\n if (!core || this.appliedScene?.topologyKey !== request.scene.topologyKey) return;\n core.batch(() => {\n core.elements().removeClass('semantic-selected semantic-hover');\n if (request.hovered) {\n for (const id of request.scene.interaction.relatedElementIdsBySelection.get(selectionKey(request.hovered)) ?? []) {\n core.getElementById(id).addClass('semantic-hover');\n }\n }\n if (request.selected) {\n for (const id of request.scene.interaction.primaryElementIdsBySelection.get(selectionKey(request.selected)) ?? []) {\n core.getElementById(id).addClass('semantic-selected');\n }\n }\n });\n }\n\n private consumeFitIfCurrentTarget(): void {\n const targetContentKey = this.latestRequest?.scene.contentKey;\n if (!targetContentKey\n || this.fitTargetContentKey !== targetContentKey\n || !this.core\n || this.targetNeedsApply()) return;\n this.core.resize();\n this.core.fit(undefined, GRAPH_GEOMETRY.fitPadding);\n this.fitTargetContentKey = undefined;\n this.updateSemanticZoom();\n }\n\n private consumeAnchorIfCurrentTarget(): void {\n const targetContentKey = this.latestRequest?.scene.contentKey;\n if (!targetContentKey || this.anchorTargetContentKey !== targetContentKey) return;\n this.anchorElementId = undefined;\n this.anchorTargetContentKey = undefined;\n }\n\n private targetNeedsApply(): boolean {\n const target = this.latestRequest?.scene;\n if (!target || !this.appliedScene) return target !== undefined;\n return this.forceRelayout || this.appliedScene.contentKey !== target.contentKey;\n }\n\n private updateSemanticZoom(force = false): void {\n const core = this.core;\n if (!core) return;\n const overview = isOverviewGraphScale(core.zoom());\n if (!force && overview === this.overview) return;\n this.overview = overview;\n core.batch(() => {\n for (const node of core.nodes()) {\n node.data('displayLabel', overview ? node.data('overviewLabel') : node.data('detailLabel'));\n }\n for (const edge of core.edges()) {\n edge.data('displayLabel', overview ? '' : edge.data('detailLabel'));\n }\n });\n }\n\n private positionTooltip(position: GraphPosition): void {\n const maxX = Math.max(8, this.host.clientWidth - this.tooltip.offsetWidth - 8);\n const maxY = Math.max(8, this.host.clientHeight - this.tooltip.offsetHeight - 8);\n this.tooltip.style.left = `${Math.max(8, Math.min(maxX, position.x + 12))}px`;\n this.tooltip.style.top = `${Math.max(8, Math.min(maxY, position.y + 12))}px`;\n }\n\n private hideTooltip(): void {\n this.tooltip.hidden = true;\n this.tooltip.textContent = '';\n this.lastTap = undefined;\n }\n\n private showStatus(kind: 'loading' | 'layout' | 'empty' | 'error', message: string, retry = false): void {\n this.status.dataset.state = kind;\n this.statusMessage.textContent = message;\n this.retryButton.hidden = !retry;\n this.status.hidden = false;\n this.host.setAttribute('aria-busy', kind === 'loading' || kind === 'layout' ? 'true' : 'false');\n }\n\n private hideStatus(): void {\n this.status.hidden = true;\n this.retryButton.hidden = true;\n this.host.setAttribute('aria-busy', 'false');\n }\n\n private resolveCurrentRequest(\n version: number,\n contentKey: string,\n ): { readonly version: number; readonly request: GraphRenderRequest } | undefined {\n if (this.destroyed) return undefined;\n const request = this.latestRequest;\n if (!request) return undefined;\n if (version === this.requestVersion || request.scene.contentKey === contentKey) {\n return { version: this.requestVersion, request };\n }\n return undefined;\n }\n}\n\nconst browserGraphRendererEnvironment: GraphRendererEnvironment = {\n createElement: (tagName) => document.createElement(tagName),\n loadRuntime: async () => {\n const [cytoscapeModule, elkModule] = await Promise.all([\n import('cytoscape'),\n import('elkjs/lib/elk.bundled.js'),\n ]);\n return {\n createCore: cytoscapeModule.default,\n elk: new elkModule.default(),\n };\n },\n layoutScene: layoutGraphScene,\n observeResize: (element, onResize) => {\n if (typeof ResizeObserver === 'undefined') return { disconnect: () => undefined };\n const view = element.ownerDocument.defaultView;\n let animationFrame: number | undefined;\n const observer = new ResizeObserver(() => {\n if (!view || animationFrame !== undefined) return;\n animationFrame = view.requestAnimationFrame(() => {\n animationFrame = undefined;\n onResize();\n });\n });\n observer.observe(element);\n return {\n disconnect: () => {\n observer.disconnect();\n if (animationFrame !== undefined) {\n view?.cancelAnimationFrame(animationFrame);\n animationFrame = undefined;\n }\n },\n };\n },\n};\n\nfunction replaceElements(core: cytoscape.Core, scene: GraphScene): void {\n const definitions: cytoscape.ElementDefinition[] = [\n ...scene.nodes.map(nodeDefinition),\n ...scene.edges.map(edgeDefinition),\n ];\n core.startBatch();\n core.elements().remove();\n core.add(definitions);\n core.endBatch();\n}\n\nexport function updateElementData(core: cytoscape.Core, scene: GraphScene): void {\n core.batch(() => {\n for (const node of scene.nodes) {\n const element = core.getElementById(node.id);\n if (element.nonempty()) element.data(nodeRenderableData(node));\n }\n for (const edge of scene.edges) {\n const element = core.getElementById(edge.id);\n if (element.nonempty()) element.data(edgeRenderableData(edge));\n }\n });\n}\n\nfunction nodeDefinition(node: GraphSceneNode): cytoscape.ElementDefinition {\n return {\n group: 'nodes',\n data: {\n id: node.id,\n parent: node.parentId,\n ...nodeRenderableData(node),\n },\n };\n}\n\nfunction nodeRenderableData(node: GraphSceneNode): Record<string, unknown> {\n const dimensions = nodeDimensions(node);\n const labelMaxWidth = node.kind === 'group' && node.collapsed\n ? expandedGroupLabelMaxWidth(dimensions.width)\n : 160;\n return {\n kind: node.kind,\n passKind: node.kind === 'pass' || node.kind === 'culled-pass' ? node.passKind : undefined,\n resourceKind: node.kind === 'resource' ? node.resourceKind : undefined,\n collapsed: node.kind === 'group' && node.collapsed ? 1 : 0,\n hasCulled: node.kind === 'group' && node.culledNodeCount > 0 ? 1 : 0,\n depthBand: node.kind === 'group' ? node.depthBand : undefined,\n detailLabel: node.label,\n overviewLabel: node.overviewLabel,\n displayLabel: node.label,\n tooltip: node.title,\n labelMaxWidth,\n width: dimensions.width,\n height: dimensions.height,\n };\n}\n\nfunction edgeDefinition(edge: GraphSceneEdge): cytoscape.ElementDefinition {\n return {\n group: 'edges',\n data: {\n id: edge.id,\n source: edge.from,\n target: edge.to,\n ...edgeRenderableData(edge),\n },\n };\n}\n\nfunction edgeRenderableData(edge: GraphSceneEdge): Record<string, unknown> {\n const detailLabel = graphEdgeDisplayLabel(edge);\n return {\n kind: edge.kind,\n dependencyKind: edge.kind === 'dependency' ? edge.dependencyKind : undefined,\n accessMode: edge.kind === 'access' ? edge.accessMode : undefined,\n dashed: edge.kind === 'access' && edge.dashed ? 1 : 0,\n detailLabel,\n displayLabel: detailLabel,\n tooltip: edge.title,\n };\n}\n\nfunction viewport(core: cytoscape.Core): Viewport {\n return { pan: { ...core.pan() }, zoom: core.zoom() };\n}\n\nfunction restoreViewport(core: cytoscape.Core, state: Viewport): void {\n core.zoom(state.zoom);\n core.pan(state.pan);\n}\n\nfunction renderedPosition(core: cytoscape.Core, id: GraphSceneElementId): GraphPosition | undefined {\n const element = core.getElementById(id);\n return element.nonempty() && element.isNode() ? { ...element.renderedPosition() } : undefined;\n}\n\nexport {\n createCytoscapeEdgeRouteData,\n createElkLayoutGraph,\n layoutGraphScene,\n} from './panelGraphLayout.ts';\nexport type {\n CytoscapeEdgeRouteData,\n GraphEdgeRoute,\n GraphLayoutResult,\n GraphPosition,\n} from './panelGraphLayout.ts';\nexport {\n createGraphStyles,\n expandedGroupLabelMaxWidth,\n graphEdgeDisplayLabel,\n graphLayoutGeometryKey,\n isOverviewGraphScale,\n} from './panelGraphVisuals.ts';\n"]}
|
package/dist/panelIcons.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type PanelIconName = 'capture' | 'check' | 'close' | 'copy' | 'empty' | 'error' | 'fit' | 'inspector' | 'spinner' | 'waiting';
|
|
1
|
+
export type PanelIconName = 'capture' | 'check' | 'close' | 'copy' | 'download' | 'empty' | 'error' | 'fit' | 'inspector' | 'spinner' | 'waiting';
|
|
2
2
|
export declare function createPanelIcon(name: PanelIconName): SVGSVGElement;
|
|
3
3
|
export declare function setPanelButtonContent(button: HTMLButtonElement, icon: PanelIconName, label: string): void;
|
|
4
4
|
//# sourceMappingURL=panelIcons.d.ts.map
|
package/dist/panelIcons.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelIcons.d.ts","sourceRoot":"","sources":["../src/panelIcons.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACtB,SAAS,GACT,OAAO,GACP,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,KAAK,GACL,WAAW,GACX,SAAS,GACT,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"panelIcons.d.ts","sourceRoot":"","sources":["../src/panelIcons.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACtB,SAAS,GACT,OAAO,GACP,OAAO,GACP,MAAM,GACN,UAAU,GACV,OAAO,GACP,OAAO,GACP,KAAK,GACL,WAAW,GACX,SAAS,GACT,SAAS,CAAC;AAsBb,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAoBlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzG"}
|
package/dist/panelIcons.js
CHANGED
|
@@ -9,6 +9,7 @@ const ICON_PATHS = {
|
|
|
9
9
|
check: ['M3 8.2 6.3 11.5 13 4.8'],
|
|
10
10
|
close: ['M4 4l8 8', 'M12 4l-8 8'],
|
|
11
11
|
copy: ['M5.5 4h7.5v9H5.5z', 'M3 11V2.5h7.5'],
|
|
12
|
+
download: ['M8 2.5v7', 'M5.5 7.5 8 10l2.5-2.5', 'M3 12.5h10'],
|
|
12
13
|
empty: ['M3 3h10v10H3z', 'M5.5 8h5'],
|
|
13
14
|
error: ['M8 2.5l5.5 10H2.5z', 'M8 6v3', 'M8 11.2v.1'],
|
|
14
15
|
fit: ['M6 2.5H2.5V6', 'M10 2.5h3.5V6', 'M6 13.5H2.5V10', 'M10 13.5h3.5V10'],
|
package/dist/panelIcons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelIcons.js","sourceRoot":"","sources":["../src/panelIcons.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panelIcons.js","sourceRoot":"","sources":["../src/panelIcons.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,GAA6C;IAC5D,OAAO,EAAE;QACR,cAAc;QACd,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,qDAAqD;KACrD;IACD,KAAK,EAAE,CAAC,wBAAwB,CAAC;IACjC,KAAK,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;IACjC,IAAI,EAAE,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC5C,QAAQ,EAAE,CAAC,UAAU,EAAE,uBAAuB,EAAE,YAAY,CAAC;IAC7D,KAAK,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC;IACpC,KAAK,EAAE,CAAC,oBAAoB,EAAE,QAAQ,EAAE,YAAY,CAAC;IACrD,GAAG,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;IAC3E,SAAS,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC;IAC7C,OAAO,EAAE,CAAC,qBAAqB,CAAC;IAChC,OAAO,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAmB;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IAC1E,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAClD,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjC,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACzC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAyB,EAAE,IAAmB,EAAE,KAAa;IAClG,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/E,CAAC","sourcesContent":["export type PanelIconName =\n\t| 'capture'\n\t| 'check'\n\t| 'close'\n\t| 'copy'\n\t| 'download'\n\t| 'empty'\n\t| 'error'\n\t| 'fit'\n\t| 'inspector'\n\t| 'spinner'\n\t| 'waiting';\n\nconst ICON_PATHS: Record<PanelIconName, readonly string[]> = {\n\tcapture: [\n\t\t'M6 2.5H2.5V6',\n\t\t'M10 2.5h3.5V6',\n\t\t'M6 13.5H2.5V10',\n\t\t'M10 13.5h3.5V10',\n\t\t'M8 6.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5',\n\t],\n\tcheck: ['M3 8.2 6.3 11.5 13 4.8'],\n\tclose: ['M4 4l8 8', 'M12 4l-8 8'],\n\tcopy: ['M5.5 4h7.5v9H5.5z', 'M3 11V2.5h7.5'],\n\tdownload: ['M8 2.5v7', 'M5.5 7.5 8 10l2.5-2.5', 'M3 12.5h10'],\n\tempty: ['M3 3h10v10H3z', 'M5.5 8h5'],\n\terror: ['M8 2.5l5.5 10H2.5z', 'M8 6v3', 'M8 11.2v.1'],\n\tfit: ['M6 2.5H2.5V6', 'M10 2.5h3.5V6', 'M6 13.5H2.5V10', 'M10 13.5h3.5V10'],\n\tinspector: ['M2.5 3h11v10h-11z', 'M9.5 3v10'],\n\tspinner: ['M13 8a5 5 0 1 1-2-4'],\n\twaiting: ['M5.5 5v6', 'M10.5 5v6'],\n};\n\nexport function createPanelIcon(name: PanelIconName): SVGSVGElement {\n\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\tsvg.classList.add('zenfg-inspector-control-icon');\n\tsvg.dataset.icon = name;\n\tsvg.setAttribute('viewBox', '0 0 16 16');\n\tsvg.setAttribute('width', '14');\n\tsvg.setAttribute('height', '14');\n\tsvg.setAttribute('aria-hidden', 'true');\n\tsvg.setAttribute('focusable', 'false');\n\tfor (const data of ICON_PATHS[name]) {\n\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\tpath.setAttribute('d', data);\n\t\tpath.setAttribute('fill', 'none');\n\t\tpath.setAttribute('stroke', 'currentColor');\n\t\tpath.setAttribute('stroke-linecap', 'round');\n\t\tpath.setAttribute('stroke-linejoin', 'round');\n\t\tpath.setAttribute('stroke-width', '1.4');\n\t\tsvg.appendChild(path);\n\t}\n\treturn svg;\n}\n\nexport function setPanelButtonContent(button: HTMLButtonElement, icon: PanelIconName, label: string): void {\n\tbutton.replaceChildren(createPanelIcon(icon), document.createTextNode(label));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelWorkbenchView.d.ts","sourceRoot":"","sources":["../src/panelWorkbenchView.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"panelWorkbenchView.d.ts","sourceRoot":"","sources":["../src/panelWorkbenchView.ts"],"names":[],"mappings":"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"}
|
|
@@ -138,7 +138,8 @@ export class FrameGraphDebugWorkbench {
|
|
|
138
138
|
this.exportMenu.setAttribute('role', 'menu');
|
|
139
139
|
this.exportMenu.hidden = true;
|
|
140
140
|
this.downloadButton.type = 'button';
|
|
141
|
-
this.downloadButton.
|
|
141
|
+
this.downloadButton.className = 'zenfg-inspector-download-action';
|
|
142
|
+
setPanelButtonContent(this.downloadButton, 'download', 'Download JSON');
|
|
142
143
|
this.downloadButton.setAttribute('role', 'menuitem');
|
|
143
144
|
this.downloadButton.addEventListener('click', () => {
|
|
144
145
|
this.setExportMenuOpen(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelWorkbenchView.js","sourceRoot":"","sources":["../src/panelWorkbenchView.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';\nimport {\n\tformatBytes,\n\tformatGpuFrameDuration,\n\tformatPoolHitRate,\n\tlabelNode,\n} from './panelDomHelpers.ts';\nimport { createPanelIcon, setPanelButtonContent } from './panelIcons.ts';\nimport { DiagnosticsView } from './panelDiagnosticsView.ts';\nimport { InspectorView } from './panelInspectorView.ts';\nimport { MemoryView } from './panelMemoryView.ts';\nimport { PassesView } from './panelPassesView.ts';\nimport { ResourcesView } from './panelResourcesView.ts';\nimport { renderGraphView, resizeGraph } from './panelGraphView.ts';\nimport type { GraphViewState, Selection, WorkbenchTab } from './panelTypes.ts';\nimport { formatEstimatedBytes, type WorkbenchCallbacks } from './panelWorkbenchHelpers.ts';\n\nexport type FrameGraphDebugWorkbenchActions = {\n\tonCapture(): void;\n\tonImport(file: File): void;\n\tonDownload(): void;\n\tonCopyJson(): void;\n};\nexport type FrameGraphDebugWorkbenchOptions = {\n\tbranding: string | false;\n\tidPrefix: string;\n};\nexport type FrameGraphDebugEmptyStateKind = 'waiting' | 'capturing' | 'empty' | 'error';\n\n\nexport type FrameGraphDebugSnapshotActionState = {\n\tproviderAvailable: boolean;\n\thasCapture: boolean;\n\tcapturing: boolean;\n\timporting: boolean;\n\tcopying: boolean;\n\tcopied: boolean;\n\tmessage?: string;\n\tmessageTone?: 'neutral' | 'error';\n};\n\nexport class FrameGraphDebugWorkbench {\n\treadonly root = document.createElement('div');\n\tprivate readonly summary = document.createElement('div');\n\tprivate readonly commandBar = document.createElement('div');\n\tprivate readonly brand = document.createElement('div');\n\tprivate readonly tabList = document.createElement('div');\n\tprivate readonly commandActions = document.createElement('div');\n\tprivate readonly commandStatus = document.createElement('span');\n\tprivate readonly workspace = document.createElement('div');\n\tprivate readonly main = document.createElement('main');\n\tprivate readonly emptyHost = document.createElement('div');\n\tprivate readonly overviewRoot = document.createElement('section');\n\tprivate readonly graphRoot = document.createElement('section');\n\tprivate readonly passes: PassesView;\n\tprivate readonly resources: ResourcesView;\n\tprivate readonly memory: MemoryView;\n\tprivate readonly diagnostics: DiagnosticsView;\n\tprivate readonly inspector: InspectorView;\n\tprivate readonly inspectorOpenButton = document.createElement('button');\n\tprivate readonly captureButton = document.createElement('button');\n\tprivate readonly importButton = document.createElement('button');\n\tprivate readonly importInput = document.createElement('input');\n\tprivate readonly exportButton = document.createElement('button');\n\tprivate readonly exportMenu = document.createElement('div');\n\tprivate readonly downloadButton = document.createElement('button');\n\tprivate readonly copyButton = document.createElement('button');\n\tprivate readonly tabButtons = new Map<WorkbenchTab, HTMLButtonElement>();\n\tprivate readonly views = new Map<WorkbenchTab, HTMLElement>();\n\tprivate activeTab: WorkbenchTab = 'graph';\n\tprivate hasSnapshot = false;\n\tprivate snapshot: FrameGraphDebugViewModel | undefined;\n\tprivate selected: Selection | undefined;\n\tprivate hovered: Selection | undefined;\n\n\tconstructor(\n\t\tprivate readonly graphView: GraphViewState,\n\t\tprivate readonly callbacks: WorkbenchCallbacks,\n\t\tactions: FrameGraphDebugWorkbenchActions,\n\t\toptions: FrameGraphDebugWorkbenchOptions,\n\t) {\n\t\tthis.root.className = 'zenfg-inspector-workbench';\n\t\tthis.summary.className = 'zenfg-inspector-capture-summary';\n\t\tthis.commandBar.className = 'zenfg-inspector-workbench-command-bar';\n\t\tthis.brand.className = 'zenfg-inspector-brand';\n\t\tif (options.branding === false) this.commandBar.classList.add('branding-hidden');\n\t\telse this.brand.textContent = options.branding;\n\t\tthis.tabList.className = 'zenfg-inspector-workbench-tabs';\n\t\tthis.tabList.setAttribute('role', 'tablist');\n\t\tthis.tabList.setAttribute('aria-label', 'FrameGraph debug views');\n\t\tthis.commandActions.className = 'zenfg-inspector-workbench-actions';\n\t\tthis.commandActions.setAttribute('role', 'toolbar');\n\t\tthis.commandActions.setAttribute('aria-label', 'FrameGraph commands');\n\t\tthis.commandStatus.className = 'zenfg-inspector-command-status';\n\t\tthis.commandStatus.setAttribute('role', 'status');\n\t\tthis.commandStatus.setAttribute('aria-live', 'polite');\n\t\tthis.workspace.className = 'zenfg-inspector-workspace inspector-open';\n\t\tthis.main.className = 'zenfg-inspector-main';\n\t\tthis.emptyHost.className = 'zenfg-inspector-workbench-empty';\n\t\tthis.emptyHost.setAttribute('role', 'status');\n\t\tthis.emptyHost.setAttribute('aria-live', 'polite');\n\n\t\tthis.overviewRoot.className = 'zenfg-inspector-view zenfg-inspector-overview-view';\n\t\tthis.overviewRoot.id = `${options.idPrefix}-view-overview`;\n\t\tthis.overviewRoot.setAttribute('role', 'tabpanel');\n\t\tthis.overviewRoot.append(this.summary);\n\t\tthis.graphRoot.className = 'zenfg-inspector-view zenfg-inspector-graph-view';\n\t\tthis.graphRoot.id = `${options.idPrefix}-view-graph`;\n\t\tthis.graphRoot.setAttribute('role', 'tabpanel');\n\t\tthis.graphRoot.append(this.graphView.toolbar, this.graphView.host);\n\t\tthis.passes = new PassesView(callbacks, options.idPrefix);\n\t\tthis.resources = new ResourcesView(callbacks, options.idPrefix);\n\t\tthis.memory = new MemoryView(callbacks, options.idPrefix);\n\t\tthis.diagnostics = new DiagnosticsView(callbacks, options.idPrefix);\n\t\tthis.inspector = new InspectorView(callbacks, (open) => this.handleInspectorOpenChange(open), options.idPrefix);\n\n\t\tthis.views.set('overview', this.overviewRoot);\n\t\tthis.views.set('graph', this.graphRoot);\n\t\tthis.views.set('passes', this.passes.root);\n\t\tthis.views.set('resources', this.resources.root);\n\t\tthis.views.set('memory', this.memory.root);\n\t\tthis.views.set('diagnostics', this.diagnostics.root);\n\t\tfor (const [tab, label] of [\n\t\t\t['overview', 'Overview'],\n\t\t\t['graph', 'Graph'],\n\t\t\t['passes', 'Passes'],\n\t\t\t['resources', 'Resources'],\n\t\t\t['memory', 'Memory'],\n\t\t\t['diagnostics', 'Diagnostics'],\n\t\t] as const) {\n\t\t\tconst button = document.createElement('button');\n\t\t\tbutton.type = 'button';\n\t\t\tbutton.id = `${options.idPrefix}-tab-${tab}`;\n\t\t\tbutton.textContent = label;\n\t\t\tbutton.setAttribute('role', 'tab');\n\t\t\tbutton.setAttribute('aria-controls', `${options.idPrefix}-view-${tab}`);\n\t\t\tbutton.addEventListener('click', () => this.setActiveTab(tab));\n\t\t\tthis.tabButtons.set(tab, button);\n\t\t\tthis.tabList.appendChild(button);\n\t\t}\n\n\t\tthis.inspectorOpenButton.type = 'button';\n\t\tthis.inspectorOpenButton.hidden = true;\n\t\tthis.inspectorOpenButton.className = 'zenfg-inspector-open-inspector';\n\t\tsetPanelButtonContent(this.inspectorOpenButton, 'inspector', 'Inspector');\n\t\tthis.inspectorOpenButton.title = 'Open selection inspector';\n\t\tthis.inspectorOpenButton.addEventListener('click', () => this.inspector.setOpen(true));\n\n\t\tthis.captureButton.type = 'button';\n\t\tthis.captureButton.className = 'zenfg-inspector-capture-action';\n\t\tthis.captureButton.addEventListener('click', actions.onCapture);\n\t\tthis.importButton.type = 'button';\n\t\tthis.importButton.textContent = 'Import';\n\t\tthis.importButton.addEventListener('click', () => this.importInput.click());\n\t\tthis.importInput.type = 'file';\n\t\tthis.importInput.accept = '.fgsnapshot.json,.json,application/json';\n\t\tthis.importInput.hidden = true;\n\t\tthis.importInput.addEventListener('change', () => {\n\t\t\tconst file = this.importInput.files?.[0];\n\t\t\tthis.importInput.value = '';\n\t\t\tif (file) actions.onImport(file);\n\t\t});\n\t\tthis.exportButton.type = 'button';\n\t\tthis.exportButton.textContent = 'Export';\n\t\tthis.exportButton.setAttribute('aria-haspopup', 'menu');\n\t\tthis.exportButton.setAttribute('aria-expanded', 'false');\n\t\tthis.exportButton.setAttribute('aria-controls', `${options.idPrefix}-export-menu`);\n\t\tthis.exportButton.addEventListener('click', () => {\n\t\t\tthis.setExportMenuOpen(this.exportMenu.hidden !== false);\n\t\t});\n\t\tthis.exportMenu.className = 'zenfg-inspector-export-menu';\n\t\tthis.exportMenu.id = `${options.idPrefix}-export-menu`;\n\t\tthis.exportMenu.setAttribute('role', 'menu');\n\t\tthis.exportMenu.hidden = true;\n\t\tthis.downloadButton.type = 'button';\n\t\tthis.downloadButton.textContent = 'Download JSON';\n\t\tthis.downloadButton.setAttribute('role', 'menuitem');\n\t\tthis.downloadButton.addEventListener('click', () => {\n\t\t\tthis.setExportMenuOpen(false);\n\t\t\tactions.onDownload();\n\t\t});\n\t\tthis.copyButton.type = 'button';\n\t\tthis.copyButton.className = 'zenfg-inspector-copy-action';\n\t\tthis.copyButton.textContent = 'Copy JSON';\n\t\tthis.copyButton.setAttribute('role', 'menuitem');\n\t\tthis.copyButton.addEventListener('click', () => {\n\t\t\tthis.setExportMenuOpen(false);\n\t\t\tactions.onCopyJson();\n\t\t});\n\t\tthis.exportMenu.append(this.downloadButton, this.copyButton);\n\n\t\tthis.commandActions.append(\n\t\t\tthis.commandStatus,\n\t\t\tthis.inspectorOpenButton,\n\t\t\tthis.captureButton,\n\t\t\tthis.importButton,\n\t\t\tthis.exportButton,\n\t\t\tthis.importInput,\n\t\t);\n\t\tif (options.branding === false) this.commandBar.append(this.tabList, this.commandActions, this.exportMenu);\n\t\telse this.commandBar.append(this.brand, this.tabList, this.commandActions, this.exportMenu);\n\t\tthis.root.addEventListener('click', (event) => {\n\t\t\tconst target = event.target;\n\t\t\tif (!target || typeof (target as Node).nodeType !== 'number' || this.exportMenu.hidden) return;\n\t\t\tconst targetNode = target as Node;\n\t\t\tif (!this.exportButton.contains(targetNode) && !this.exportMenu.contains(targetNode)) this.setExportMenuOpen(false);\n\t\t});\n\t\tthis.root.addEventListener('keydown', (event) => {\n\t\t\tif (event.key !== 'Escape' || this.exportMenu.hidden) return;\n\t\t\tthis.setExportMenuOpen(false);\n\t\t\tthis.exportButton.focus();\n\t\t});\n\t\tthis.main.append(this.emptyHost, ...this.views.values());\n\t\tthis.workspace.append(this.main, this.inspector.root);\n\t\tthis.root.append(this.commandBar, this.workspace);\n\t\tthis.showEmptyState('empty', 'Drop a ZenFG Snapshot here or choose Import.', 'Files are processed locally in your browser.');\n\t\tthis.setSnapshotActionState({\n\t\t\tproviderAvailable: false,\n\t\t\thasCapture: false,\n\t\t\tcapturing: false,\n\t\t\timporting: false,\n\t\t\tcopying: false,\n\t\t\tcopied: false,\n\t\t});\n\t}\n\n\tsetSnapshot(snapshot: FrameGraphDebugViewModel, selected: Selection | undefined): void {\n\t\tthis.hasSnapshot = true;\n\t\tthis.snapshot = snapshot;\n\t\tthis.selected = selected;\n\t\tthis.hovered = undefined;\n\t\tthis.renderSummary(snapshot);\n\t\tthis.passes.setSnapshot(snapshot);\n\t\tthis.resources.setSnapshot(snapshot);\n\t\tthis.memory.setSnapshot(snapshot);\n\t\tthis.diagnostics.setSnapshot(snapshot);\n\t\tthis.inspector.setSnapshot(snapshot);\n\t\tthis.passes.setSelection(selected);\n\t\tthis.resources.setSelection(selected);\n\t\tthis.memory.setSelection(selected);\n\t\tthis.diagnostics.setSelection(selected);\n\t\tthis.inspector.setSelection(selected, false);\n\t\tthis.emptyHost.hidden = true;\n\t\tthis.updateActiveTab();\n\t\tthis.updateWorkspaceState();\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tshowEmptyState(kind: FrameGraphDebugEmptyStateKind, message: string, detail?: string): void {\n\t\tthis.hasSnapshot = false;\n\t\tthis.snapshot = undefined;\n\t\tthis.selected = undefined;\n\t\tthis.hovered = undefined;\n\t\tthis.emptyHost.hidden = false;\n\t\tthis.emptyHost.dataset.state = kind;\n\t\tconst icon = createPanelIcon(kind === 'capturing' ? 'spinner' : kind === 'error' ? 'error' : kind === 'waiting' ? 'waiting' : 'empty');\n\t\tconst label = document.createElement('span');\n\t\tlabel.className = 'zenfg-inspector-empty-message';\n\t\tlabel.textContent = message;\n\t\tconst detailLabel = document.createElement('span');\n\t\tdetailLabel.className = 'zenfg-inspector-empty-detail';\n\t\tdetailLabel.textContent = detail ?? '';\n\t\tthis.emptyHost.replaceChildren(icon, label, ...(detail ? [detailLabel] : []));\n\t\tthis.updateActiveTab();\n\t\tthis.updateWorkspaceState();\n\t}\n\n\tsetSnapshotActionState(state: FrameGraphDebugSnapshotActionState): void {\n\t\tconst captureLabel = state.capturing ? 'Capturing…' : 'Capture';\n\t\tsetPanelButtonContent(this.captureButton, state.capturing ? 'spinner' : 'capture', captureLabel);\n\t\tthis.captureButton.disabled = state.capturing || !state.providerAvailable;\n\t\tthis.captureButton.hidden = !state.providerAvailable;\n\t\tthis.captureButton.classList.toggle('active', state.capturing);\n\t\tthis.captureButton.setAttribute('aria-busy', state.capturing ? 'true' : 'false');\n\t\tthis.captureButton.dataset.tone = state.capturing ? 'pending' : 'accent';\n\t\tthis.captureButton.title = !state.providerAvailable\n\t\t\t? 'Waiting for a FrameGraph capture source.'\n\t\t\t: state.capturing\n\t\t\t\t? 'Capturing the next rendered frame.'\n\t\t\t\t: 'Capture and display the next rendered frame.';\n\n\t\tthis.importButton.textContent = state.importing ? 'Importing…' : 'Import';\n\t\tthis.importButton.disabled = state.importing;\n\t\tthis.importButton.setAttribute('aria-busy', state.importing ? 'true' : 'false');\n\t\tthis.exportButton.disabled = !state.hasCapture;\n\t\tthis.downloadButton.disabled = !state.hasCapture;\n\t\tif (!state.hasCapture) this.setExportMenuOpen(false);\n\n\t\tconst copyLabel = state.copying ? 'Copying…' : state.copied ? 'Copied' : 'Copy JSON';\n\t\tconst copyIcon = state.copying ? 'spinner' : state.copied ? 'check' : 'copy';\n\t\tsetPanelButtonContent(this.copyButton, copyIcon, copyLabel);\n\t\tthis.copyButton.disabled = !state.hasCapture || state.copying;\n\t\tthis.copyButton.classList.toggle('active', state.copying || state.copied);\n\t\tthis.copyButton.setAttribute('aria-busy', state.copying ? 'true' : 'false');\n\t\tthis.copyButton.dataset.tone = state.copied ? 'success' : state.copying ? 'pending' : 'neutral';\n\t\tthis.copyButton.title = state.hasCapture\n\t\t\t? 'Copy the current canonical FrameGraph Snapshot JSON.'\n\t\t\t: 'Load a snapshot before exporting.';\n\n\t\tthis.commandStatus.textContent = state.message ?? '';\n\t\tthis.commandStatus.hidden = !state.message;\n\t\tthis.commandStatus.dataset.tone = state.message ? state.messageTone ?? 'error' : 'neutral';\n\t\tif (state.message) this.commandStatus.title = state.message;\n\t\telse this.commandStatus.removeAttribute('title');\n\t}\r\n\n\tsetSelection(selected: Selection | undefined): void {\n\t\tthis.selected = selected;\n\t\tthis.passes.setSelection(selected);\n\t\tthis.resources.setSelection(selected);\n\t\tthis.memory.setSelection(selected);\n\t\tthis.diagnostics.setSelection(selected);\n\t\tthis.inspector.setSelection(selected);\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tsetHovered(hovered: Selection | undefined): void {\n\t\tthis.hovered = hovered;\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tsetActiveTab(tab: WorkbenchTab): void {\n\t\tif (this.activeTab === tab) return;\n\t\tthis.activeTab = tab;\n\t\tthis.updateActiveTab();\n\t\tif (tab === 'graph') {\n\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\tresizeGraph(this.graphView);\n\t\t\t\tthis.renderGraph();\n\t\t\t});\n\t\t}\n\t}\n\n\trefreshGraphStructure(): void {\n\t\tif (!this.snapshot) return;\n\t\tthis.passes.setSnapshot(this.snapshot);\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tresizeGraph(fit = false): void {\n\t\tif (fit) this.graphView.fitOnNextRender = true;\n\t\twindow.requestAnimationFrame(() => {\n\t\t\tresizeGraph(this.graphView);\n\t\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t\t});\n\t}\n\n\tprivate updateActiveTab(): void {\n\t\tfor (const [tab, button] of this.tabButtons) {\n\t\t\tconst active = tab === this.activeTab;\n\t\t\tbutton.disabled = !this.hasSnapshot;\n\t\t\tbutton.classList.toggle('active', active);\n\t\t\tbutton.setAttribute('aria-selected', active ? 'true' : 'false');\n\t\t\tconst view = this.views.get(tab)!;\n\t\t\tview.hidden = !this.hasSnapshot || !active;\n\t\t\tview.setAttribute('aria-labelledby', button.id);\n\t\t}\n\t}\n\n\tprivate renderGraph(): void {\n\t\tif (!this.snapshot) return;\n\t\trenderGraphView(\n\t\t\tthis.graphView,\n\t\t\tthis.snapshot,\n\t\t\tthis.selected,\n\t\t\tthis.hovered,\n\t\t\tthis.callbacks.onSelect,\n\t\t\tthis.callbacks.onHover,\n\t\t\tthis.callbacks.onGroupToggle,\n\t\t);\n\t}\n\n\tprivate renderSummary(snapshot: FrameGraphDebugViewModel): void {\n\t\tconst frameGraphSegments = snapshot.executionSegments.filter((segment) => segment.kind === 'frame-graph').length;\n\t\tconst opaqueIntervals = snapshot.executionSegments.length - frameGraphSegments;\n\t\tconst metrics = snapshot.metrics;\n\t\tconst coverage = metrics.timingEligibleNodeCount === 0\n\t\t\t? 'No eligible passes'\n\t\t\t: `${metrics.timedNodeCount}/${metrics.timingEligibleNodeCount} timed`;\n\t\tconst slowest = metrics.slowestNode\n\t\t\t? `${labelNode(metrics.slowestNode)} · ${(metrics.slowestNode.gpuDurationMicros! / 1000).toFixed(3)} ms`\n\t\t\t: 'Unknown';\n\t\tconst protocol = snapshot.protocol;\n\t\tconst runtime = protocol.producer.runtime;\n\t\tconst producer = [\n\t\t\tprotocol.producer.name,\n\t\t\tprotocol.producer.version,\n\t\t\tprotocol.producer.language,\n\t\t].filter(Boolean).join(' · ');\n\t\tconst runtimeLabel = runtime\n\t\t\t? [runtime.implementation, runtime.graphicsApi, runtime.backend].filter(Boolean).join(' · ') || 'Unknown'\n\t\t\t: 'Unknown';\n\t\tconst poolRetained = snapshot.resourcePool.status === 'available'\n\t\t\t? `${snapshot.resourcePool.estimatedRetainedBytes === undefined ? 'Unknown' : formatBytes(snapshot.resourcePool.estimatedRetainedBytes)} · ${snapshot.resourcePool.retainedCount} allocations`\n\t\t\t: 'Unavailable';\n\t\tthis.summary.replaceChildren(\n\t\t\tthis.createSummaryGroup('Capture', [\n\t\t\t\t['Source', snapshot.source.label],\n\t\t\t\t['Schema', `${protocol.format} v${protocol.version.major}.${protocol.version.minor}`],\n\t\t\t\t['Producer', producer],\n\t\t\t\t['Runtime', runtimeLabel],\n\t\t\t\t['Frame', String(snapshot.frameIndex)],\n\t\t\t\t...(snapshot.source.migratedFromLegacy ? [['Migration', 'Legacy V0 → V1'] as const] : []),\n\t\t\t\t['Timing', snapshot.profiling.status === 'available' ? 'Available' : snapshot.profiling.reason],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('GPU', [\n\t\t\t\t['GPU Span', snapshot.profiling.status === 'available' ? `${formatGpuFrameDuration(snapshot)} ms` : 'Unknown'],\n\t\t\t\t['Coverage', coverage],\n\t\t\t\t['Slowest', slowest],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('Work', [\n\t\t\t\t['Nodes', `${snapshot.nodes.length} retained · ${snapshot.culledNodes.length} culled`],\n\t\t\t\t['Segments', `${frameGraphSegments} FG · ${opaqueIntervals} opaque`],\n\t\t\t\t['Groups', snapshot.availability.groups ? String(snapshot.debugGroups.length) : 'Unknown'],\n\t\t\t\t['Recording order', snapshot.availability.recordingOrder ? 'Available' : 'Unknown'],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('Resources', [\n\t\t\t\t['Logical / physical', `${snapshot.resources.length} / ${snapshot.physicalAllocations.length}`],\n\t\t\t\t['Texture views', snapshot.availability.textureViews ? String(snapshot.textureViewById.size) : 'Unknown'],\n\t\t\t\t['Access regions', snapshot.availability.accessRegions ? 'Available' : 'Unknown'],\n\t\t\t\t['Transient estimate', formatEstimatedBytes(metrics.transientEstimatedByteSize)],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('Pool', [\n\t\t\t\t['Retained', poolRetained],\n\t\t\t\t['Reuse', formatPoolHitRate(snapshot)],\n\t\t\t]),\n\t\t);\n\t}\n\n\tprivate createSummaryGroup(title: string, rows: readonly (readonly [string, string])[]): HTMLElement {\n\t\tconst group = document.createElement('section');\n\t\tconst heading = document.createElement('h2');\n\t\theading.textContent = title;\n\t\tgroup.appendChild(heading);\n\t\tfor (const [label, value] of rows) {\n\t\t\tconst row = document.createElement('div');\n\t\t\tconst term = document.createElement('span');\n\t\t\tterm.textContent = label;\n\t\t\tconst description = document.createElement('strong');\n\t\t\tdescription.textContent = value;\n\t\t\tdescription.title = value;\n\t\t\trow.append(term, description);\n\t\t\tgroup.appendChild(row);\n\t\t}\n\t\treturn group;\n\t}\n\n\tprivate setExportMenuOpen(open: boolean): void {\n\t\tthis.exportMenu.hidden = !open;\n\t\tthis.exportButton.setAttribute('aria-expanded', open ? 'true' : 'false');\n\t}\n\n\tprivate handleInspectorOpenChange(_open: boolean): void {\n\t\tthis.updateWorkspaceState();\n\t\tif (this.activeTab === 'graph') this.resizeGraph(false);\n\t}\n\n\tprivate updateWorkspaceState(): void {\n\t\tconst inspectorOpen = this.hasSnapshot && this.inspector.isOpen;\n\t\tthis.workspace.classList.toggle('has-capture', this.hasSnapshot);\n\t\tthis.workspace.classList.toggle('inspector-open', inspectorOpen);\n\t\tthis.inspector.root.classList.toggle('unavailable', !this.hasSnapshot);\n\t\tthis.inspectorOpenButton.hidden = !this.hasSnapshot || inspectorOpen;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"panelWorkbenchView.js","sourceRoot":"","sources":["../src/panelWorkbenchView.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';\nimport {\n\tformatBytes,\n\tformatGpuFrameDuration,\n\tformatPoolHitRate,\n\tlabelNode,\n} from './panelDomHelpers.ts';\nimport { createPanelIcon, setPanelButtonContent } from './panelIcons.ts';\nimport { DiagnosticsView } from './panelDiagnosticsView.ts';\nimport { InspectorView } from './panelInspectorView.ts';\nimport { MemoryView } from './panelMemoryView.ts';\nimport { PassesView } from './panelPassesView.ts';\nimport { ResourcesView } from './panelResourcesView.ts';\nimport { renderGraphView, resizeGraph } from './panelGraphView.ts';\nimport type { GraphViewState, Selection, WorkbenchTab } from './panelTypes.ts';\nimport { formatEstimatedBytes, type WorkbenchCallbacks } from './panelWorkbenchHelpers.ts';\n\nexport type FrameGraphDebugWorkbenchActions = {\n\tonCapture(): void;\n\tonImport(file: File): void;\n\tonDownload(): void;\n\tonCopyJson(): void;\n};\nexport type FrameGraphDebugWorkbenchOptions = {\n\tbranding: string | false;\n\tidPrefix: string;\n};\nexport type FrameGraphDebugEmptyStateKind = 'waiting' | 'capturing' | 'empty' | 'error';\n\n\nexport type FrameGraphDebugSnapshotActionState = {\n\tproviderAvailable: boolean;\n\thasCapture: boolean;\n\tcapturing: boolean;\n\timporting: boolean;\n\tcopying: boolean;\n\tcopied: boolean;\n\tmessage?: string;\n\tmessageTone?: 'neutral' | 'error';\n};\n\nexport class FrameGraphDebugWorkbench {\n\treadonly root = document.createElement('div');\n\tprivate readonly summary = document.createElement('div');\n\tprivate readonly commandBar = document.createElement('div');\n\tprivate readonly brand = document.createElement('div');\n\tprivate readonly tabList = document.createElement('div');\n\tprivate readonly commandActions = document.createElement('div');\n\tprivate readonly commandStatus = document.createElement('span');\n\tprivate readonly workspace = document.createElement('div');\n\tprivate readonly main = document.createElement('main');\n\tprivate readonly emptyHost = document.createElement('div');\n\tprivate readonly overviewRoot = document.createElement('section');\n\tprivate readonly graphRoot = document.createElement('section');\n\tprivate readonly passes: PassesView;\n\tprivate readonly resources: ResourcesView;\n\tprivate readonly memory: MemoryView;\n\tprivate readonly diagnostics: DiagnosticsView;\n\tprivate readonly inspector: InspectorView;\n\tprivate readonly inspectorOpenButton = document.createElement('button');\n\tprivate readonly captureButton = document.createElement('button');\n\tprivate readonly importButton = document.createElement('button');\n\tprivate readonly importInput = document.createElement('input');\n\tprivate readonly exportButton = document.createElement('button');\n\tprivate readonly exportMenu = document.createElement('div');\n\tprivate readonly downloadButton = document.createElement('button');\n\tprivate readonly copyButton = document.createElement('button');\n\tprivate readonly tabButtons = new Map<WorkbenchTab, HTMLButtonElement>();\n\tprivate readonly views = new Map<WorkbenchTab, HTMLElement>();\n\tprivate activeTab: WorkbenchTab = 'graph';\n\tprivate hasSnapshot = false;\n\tprivate snapshot: FrameGraphDebugViewModel | undefined;\n\tprivate selected: Selection | undefined;\n\tprivate hovered: Selection | undefined;\n\n\tconstructor(\n\t\tprivate readonly graphView: GraphViewState,\n\t\tprivate readonly callbacks: WorkbenchCallbacks,\n\t\tactions: FrameGraphDebugWorkbenchActions,\n\t\toptions: FrameGraphDebugWorkbenchOptions,\n\t) {\n\t\tthis.root.className = 'zenfg-inspector-workbench';\n\t\tthis.summary.className = 'zenfg-inspector-capture-summary';\n\t\tthis.commandBar.className = 'zenfg-inspector-workbench-command-bar';\n\t\tthis.brand.className = 'zenfg-inspector-brand';\n\t\tif (options.branding === false) this.commandBar.classList.add('branding-hidden');\n\t\telse this.brand.textContent = options.branding;\n\t\tthis.tabList.className = 'zenfg-inspector-workbench-tabs';\n\t\tthis.tabList.setAttribute('role', 'tablist');\n\t\tthis.tabList.setAttribute('aria-label', 'FrameGraph debug views');\n\t\tthis.commandActions.className = 'zenfg-inspector-workbench-actions';\n\t\tthis.commandActions.setAttribute('role', 'toolbar');\n\t\tthis.commandActions.setAttribute('aria-label', 'FrameGraph commands');\n\t\tthis.commandStatus.className = 'zenfg-inspector-command-status';\n\t\tthis.commandStatus.setAttribute('role', 'status');\n\t\tthis.commandStatus.setAttribute('aria-live', 'polite');\n\t\tthis.workspace.className = 'zenfg-inspector-workspace inspector-open';\n\t\tthis.main.className = 'zenfg-inspector-main';\n\t\tthis.emptyHost.className = 'zenfg-inspector-workbench-empty';\n\t\tthis.emptyHost.setAttribute('role', 'status');\n\t\tthis.emptyHost.setAttribute('aria-live', 'polite');\n\n\t\tthis.overviewRoot.className = 'zenfg-inspector-view zenfg-inspector-overview-view';\n\t\tthis.overviewRoot.id = `${options.idPrefix}-view-overview`;\n\t\tthis.overviewRoot.setAttribute('role', 'tabpanel');\n\t\tthis.overviewRoot.append(this.summary);\n\t\tthis.graphRoot.className = 'zenfg-inspector-view zenfg-inspector-graph-view';\n\t\tthis.graphRoot.id = `${options.idPrefix}-view-graph`;\n\t\tthis.graphRoot.setAttribute('role', 'tabpanel');\n\t\tthis.graphRoot.append(this.graphView.toolbar, this.graphView.host);\n\t\tthis.passes = new PassesView(callbacks, options.idPrefix);\n\t\tthis.resources = new ResourcesView(callbacks, options.idPrefix);\n\t\tthis.memory = new MemoryView(callbacks, options.idPrefix);\n\t\tthis.diagnostics = new DiagnosticsView(callbacks, options.idPrefix);\n\t\tthis.inspector = new InspectorView(callbacks, (open) => this.handleInspectorOpenChange(open), options.idPrefix);\n\n\t\tthis.views.set('overview', this.overviewRoot);\n\t\tthis.views.set('graph', this.graphRoot);\n\t\tthis.views.set('passes', this.passes.root);\n\t\tthis.views.set('resources', this.resources.root);\n\t\tthis.views.set('memory', this.memory.root);\n\t\tthis.views.set('diagnostics', this.diagnostics.root);\n\t\tfor (const [tab, label] of [\n\t\t\t['overview', 'Overview'],\n\t\t\t['graph', 'Graph'],\n\t\t\t['passes', 'Passes'],\n\t\t\t['resources', 'Resources'],\n\t\t\t['memory', 'Memory'],\n\t\t\t['diagnostics', 'Diagnostics'],\n\t\t] as const) {\n\t\t\tconst button = document.createElement('button');\n\t\t\tbutton.type = 'button';\n\t\t\tbutton.id = `${options.idPrefix}-tab-${tab}`;\n\t\t\tbutton.textContent = label;\n\t\t\tbutton.setAttribute('role', 'tab');\n\t\t\tbutton.setAttribute('aria-controls', `${options.idPrefix}-view-${tab}`);\n\t\t\tbutton.addEventListener('click', () => this.setActiveTab(tab));\n\t\t\tthis.tabButtons.set(tab, button);\n\t\t\tthis.tabList.appendChild(button);\n\t\t}\n\n\t\tthis.inspectorOpenButton.type = 'button';\n\t\tthis.inspectorOpenButton.hidden = true;\n\t\tthis.inspectorOpenButton.className = 'zenfg-inspector-open-inspector';\n\t\tsetPanelButtonContent(this.inspectorOpenButton, 'inspector', 'Inspector');\n\t\tthis.inspectorOpenButton.title = 'Open selection inspector';\n\t\tthis.inspectorOpenButton.addEventListener('click', () => this.inspector.setOpen(true));\n\n\t\tthis.captureButton.type = 'button';\n\t\tthis.captureButton.className = 'zenfg-inspector-capture-action';\n\t\tthis.captureButton.addEventListener('click', actions.onCapture);\n\t\tthis.importButton.type = 'button';\n\t\tthis.importButton.textContent = 'Import';\n\t\tthis.importButton.addEventListener('click', () => this.importInput.click());\n\t\tthis.importInput.type = 'file';\n\t\tthis.importInput.accept = '.fgsnapshot.json,.json,application/json';\n\t\tthis.importInput.hidden = true;\n\t\tthis.importInput.addEventListener('change', () => {\n\t\t\tconst file = this.importInput.files?.[0];\n\t\t\tthis.importInput.value = '';\n\t\t\tif (file) actions.onImport(file);\n\t\t});\n\t\tthis.exportButton.type = 'button';\n\t\tthis.exportButton.textContent = 'Export';\n\t\tthis.exportButton.setAttribute('aria-haspopup', 'menu');\n\t\tthis.exportButton.setAttribute('aria-expanded', 'false');\n\t\tthis.exportButton.setAttribute('aria-controls', `${options.idPrefix}-export-menu`);\n\t\tthis.exportButton.addEventListener('click', () => {\n\t\t\tthis.setExportMenuOpen(this.exportMenu.hidden !== false);\n\t\t});\n\t\tthis.exportMenu.className = 'zenfg-inspector-export-menu';\n\t\tthis.exportMenu.id = `${options.idPrefix}-export-menu`;\n\t\tthis.exportMenu.setAttribute('role', 'menu');\n\t\tthis.exportMenu.hidden = true;\n\t\tthis.downloadButton.type = 'button';\n\t\tthis.downloadButton.className = 'zenfg-inspector-download-action';\n\t\tsetPanelButtonContent(this.downloadButton, 'download', 'Download JSON');\n\t\tthis.downloadButton.setAttribute('role', 'menuitem');\n\t\tthis.downloadButton.addEventListener('click', () => {\n\t\t\tthis.setExportMenuOpen(false);\n\t\t\tactions.onDownload();\n\t\t});\n\t\tthis.copyButton.type = 'button';\n\t\tthis.copyButton.className = 'zenfg-inspector-copy-action';\n\t\tthis.copyButton.textContent = 'Copy JSON';\n\t\tthis.copyButton.setAttribute('role', 'menuitem');\n\t\tthis.copyButton.addEventListener('click', () => {\n\t\t\tthis.setExportMenuOpen(false);\n\t\t\tactions.onCopyJson();\n\t\t});\n\t\tthis.exportMenu.append(this.downloadButton, this.copyButton);\n\n\t\tthis.commandActions.append(\n\t\t\tthis.commandStatus,\n\t\t\tthis.inspectorOpenButton,\n\t\t\tthis.captureButton,\n\t\t\tthis.importButton,\n\t\t\tthis.exportButton,\n\t\t\tthis.importInput,\n\t\t);\n\t\tif (options.branding === false) this.commandBar.append(this.tabList, this.commandActions, this.exportMenu);\n\t\telse this.commandBar.append(this.brand, this.tabList, this.commandActions, this.exportMenu);\n\t\tthis.root.addEventListener('click', (event) => {\n\t\t\tconst target = event.target;\n\t\t\tif (!target || typeof (target as Node).nodeType !== 'number' || this.exportMenu.hidden) return;\n\t\t\tconst targetNode = target as Node;\n\t\t\tif (!this.exportButton.contains(targetNode) && !this.exportMenu.contains(targetNode)) this.setExportMenuOpen(false);\n\t\t});\n\t\tthis.root.addEventListener('keydown', (event) => {\n\t\t\tif (event.key !== 'Escape' || this.exportMenu.hidden) return;\n\t\t\tthis.setExportMenuOpen(false);\n\t\t\tthis.exportButton.focus();\n\t\t});\n\t\tthis.main.append(this.emptyHost, ...this.views.values());\n\t\tthis.workspace.append(this.main, this.inspector.root);\n\t\tthis.root.append(this.commandBar, this.workspace);\n\t\tthis.showEmptyState('empty', 'Drop a ZenFG Snapshot here or choose Import.', 'Files are processed locally in your browser.');\n\t\tthis.setSnapshotActionState({\n\t\t\tproviderAvailable: false,\n\t\t\thasCapture: false,\n\t\t\tcapturing: false,\n\t\t\timporting: false,\n\t\t\tcopying: false,\n\t\t\tcopied: false,\n\t\t});\n\t}\n\n\tsetSnapshot(snapshot: FrameGraphDebugViewModel, selected: Selection | undefined): void {\n\t\tthis.hasSnapshot = true;\n\t\tthis.snapshot = snapshot;\n\t\tthis.selected = selected;\n\t\tthis.hovered = undefined;\n\t\tthis.renderSummary(snapshot);\n\t\tthis.passes.setSnapshot(snapshot);\n\t\tthis.resources.setSnapshot(snapshot);\n\t\tthis.memory.setSnapshot(snapshot);\n\t\tthis.diagnostics.setSnapshot(snapshot);\n\t\tthis.inspector.setSnapshot(snapshot);\n\t\tthis.passes.setSelection(selected);\n\t\tthis.resources.setSelection(selected);\n\t\tthis.memory.setSelection(selected);\n\t\tthis.diagnostics.setSelection(selected);\n\t\tthis.inspector.setSelection(selected, false);\n\t\tthis.emptyHost.hidden = true;\n\t\tthis.updateActiveTab();\n\t\tthis.updateWorkspaceState();\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tshowEmptyState(kind: FrameGraphDebugEmptyStateKind, message: string, detail?: string): void {\n\t\tthis.hasSnapshot = false;\n\t\tthis.snapshot = undefined;\n\t\tthis.selected = undefined;\n\t\tthis.hovered = undefined;\n\t\tthis.emptyHost.hidden = false;\n\t\tthis.emptyHost.dataset.state = kind;\n\t\tconst icon = createPanelIcon(kind === 'capturing' ? 'spinner' : kind === 'error' ? 'error' : kind === 'waiting' ? 'waiting' : 'empty');\n\t\tconst label = document.createElement('span');\n\t\tlabel.className = 'zenfg-inspector-empty-message';\n\t\tlabel.textContent = message;\n\t\tconst detailLabel = document.createElement('span');\n\t\tdetailLabel.className = 'zenfg-inspector-empty-detail';\n\t\tdetailLabel.textContent = detail ?? '';\n\t\tthis.emptyHost.replaceChildren(icon, label, ...(detail ? [detailLabel] : []));\n\t\tthis.updateActiveTab();\n\t\tthis.updateWorkspaceState();\n\t}\n\n\tsetSnapshotActionState(state: FrameGraphDebugSnapshotActionState): void {\n\t\tconst captureLabel = state.capturing ? 'Capturing…' : 'Capture';\n\t\tsetPanelButtonContent(this.captureButton, state.capturing ? 'spinner' : 'capture', captureLabel);\n\t\tthis.captureButton.disabled = state.capturing || !state.providerAvailable;\n\t\tthis.captureButton.hidden = !state.providerAvailable;\n\t\tthis.captureButton.classList.toggle('active', state.capturing);\n\t\tthis.captureButton.setAttribute('aria-busy', state.capturing ? 'true' : 'false');\n\t\tthis.captureButton.dataset.tone = state.capturing ? 'pending' : 'accent';\n\t\tthis.captureButton.title = !state.providerAvailable\n\t\t\t? 'Waiting for a FrameGraph capture source.'\n\t\t\t: state.capturing\n\t\t\t\t? 'Capturing the next rendered frame.'\n\t\t\t\t: 'Capture and display the next rendered frame.';\n\n\t\tthis.importButton.textContent = state.importing ? 'Importing…' : 'Import';\n\t\tthis.importButton.disabled = state.importing;\n\t\tthis.importButton.setAttribute('aria-busy', state.importing ? 'true' : 'false');\n\t\tthis.exportButton.disabled = !state.hasCapture;\n\t\tthis.downloadButton.disabled = !state.hasCapture;\n\t\tif (!state.hasCapture) this.setExportMenuOpen(false);\n\n\t\tconst copyLabel = state.copying ? 'Copying…' : state.copied ? 'Copied' : 'Copy JSON';\n\t\tconst copyIcon = state.copying ? 'spinner' : state.copied ? 'check' : 'copy';\n\t\tsetPanelButtonContent(this.copyButton, copyIcon, copyLabel);\n\t\tthis.copyButton.disabled = !state.hasCapture || state.copying;\n\t\tthis.copyButton.classList.toggle('active', state.copying || state.copied);\n\t\tthis.copyButton.setAttribute('aria-busy', state.copying ? 'true' : 'false');\n\t\tthis.copyButton.dataset.tone = state.copied ? 'success' : state.copying ? 'pending' : 'neutral';\n\t\tthis.copyButton.title = state.hasCapture\n\t\t\t? 'Copy the current canonical FrameGraph Snapshot JSON.'\n\t\t\t: 'Load a snapshot before exporting.';\n\n\t\tthis.commandStatus.textContent = state.message ?? '';\n\t\tthis.commandStatus.hidden = !state.message;\n\t\tthis.commandStatus.dataset.tone = state.message ? state.messageTone ?? 'error' : 'neutral';\n\t\tif (state.message) this.commandStatus.title = state.message;\n\t\telse this.commandStatus.removeAttribute('title');\n\t}\r\n\n\tsetSelection(selected: Selection | undefined): void {\n\t\tthis.selected = selected;\n\t\tthis.passes.setSelection(selected);\n\t\tthis.resources.setSelection(selected);\n\t\tthis.memory.setSelection(selected);\n\t\tthis.diagnostics.setSelection(selected);\n\t\tthis.inspector.setSelection(selected);\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tsetHovered(hovered: Selection | undefined): void {\n\t\tthis.hovered = hovered;\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tsetActiveTab(tab: WorkbenchTab): void {\n\t\tif (this.activeTab === tab) return;\n\t\tthis.activeTab = tab;\n\t\tthis.updateActiveTab();\n\t\tif (tab === 'graph') {\n\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\tresizeGraph(this.graphView);\n\t\t\t\tthis.renderGraph();\n\t\t\t});\n\t\t}\n\t}\n\n\trefreshGraphStructure(): void {\n\t\tif (!this.snapshot) return;\n\t\tthis.passes.setSnapshot(this.snapshot);\n\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t}\n\n\tresizeGraph(fit = false): void {\n\t\tif (fit) this.graphView.fitOnNextRender = true;\n\t\twindow.requestAnimationFrame(() => {\n\t\t\tresizeGraph(this.graphView);\n\t\t\tif (this.activeTab === 'graph') this.renderGraph();\n\t\t});\n\t}\n\n\tprivate updateActiveTab(): void {\n\t\tfor (const [tab, button] of this.tabButtons) {\n\t\t\tconst active = tab === this.activeTab;\n\t\t\tbutton.disabled = !this.hasSnapshot;\n\t\t\tbutton.classList.toggle('active', active);\n\t\t\tbutton.setAttribute('aria-selected', active ? 'true' : 'false');\n\t\t\tconst view = this.views.get(tab)!;\n\t\t\tview.hidden = !this.hasSnapshot || !active;\n\t\t\tview.setAttribute('aria-labelledby', button.id);\n\t\t}\n\t}\n\n\tprivate renderGraph(): void {\n\t\tif (!this.snapshot) return;\n\t\trenderGraphView(\n\t\t\tthis.graphView,\n\t\t\tthis.snapshot,\n\t\t\tthis.selected,\n\t\t\tthis.hovered,\n\t\t\tthis.callbacks.onSelect,\n\t\t\tthis.callbacks.onHover,\n\t\t\tthis.callbacks.onGroupToggle,\n\t\t);\n\t}\n\n\tprivate renderSummary(snapshot: FrameGraphDebugViewModel): void {\n\t\tconst frameGraphSegments = snapshot.executionSegments.filter((segment) => segment.kind === 'frame-graph').length;\n\t\tconst opaqueIntervals = snapshot.executionSegments.length - frameGraphSegments;\n\t\tconst metrics = snapshot.metrics;\n\t\tconst coverage = metrics.timingEligibleNodeCount === 0\n\t\t\t? 'No eligible passes'\n\t\t\t: `${metrics.timedNodeCount}/${metrics.timingEligibleNodeCount} timed`;\n\t\tconst slowest = metrics.slowestNode\n\t\t\t? `${labelNode(metrics.slowestNode)} · ${(metrics.slowestNode.gpuDurationMicros! / 1000).toFixed(3)} ms`\n\t\t\t: 'Unknown';\n\t\tconst protocol = snapshot.protocol;\n\t\tconst runtime = protocol.producer.runtime;\n\t\tconst producer = [\n\t\t\tprotocol.producer.name,\n\t\t\tprotocol.producer.version,\n\t\t\tprotocol.producer.language,\n\t\t].filter(Boolean).join(' · ');\n\t\tconst runtimeLabel = runtime\n\t\t\t? [runtime.implementation, runtime.graphicsApi, runtime.backend].filter(Boolean).join(' · ') || 'Unknown'\n\t\t\t: 'Unknown';\n\t\tconst poolRetained = snapshot.resourcePool.status === 'available'\n\t\t\t? `${snapshot.resourcePool.estimatedRetainedBytes === undefined ? 'Unknown' : formatBytes(snapshot.resourcePool.estimatedRetainedBytes)} · ${snapshot.resourcePool.retainedCount} allocations`\n\t\t\t: 'Unavailable';\n\t\tthis.summary.replaceChildren(\n\t\t\tthis.createSummaryGroup('Capture', [\n\t\t\t\t['Source', snapshot.source.label],\n\t\t\t\t['Schema', `${protocol.format} v${protocol.version.major}.${protocol.version.minor}`],\n\t\t\t\t['Producer', producer],\n\t\t\t\t['Runtime', runtimeLabel],\n\t\t\t\t['Frame', String(snapshot.frameIndex)],\n\t\t\t\t...(snapshot.source.migratedFromLegacy ? [['Migration', 'Legacy V0 → V1'] as const] : []),\n\t\t\t\t['Timing', snapshot.profiling.status === 'available' ? 'Available' : snapshot.profiling.reason],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('GPU', [\n\t\t\t\t['GPU Span', snapshot.profiling.status === 'available' ? `${formatGpuFrameDuration(snapshot)} ms` : 'Unknown'],\n\t\t\t\t['Coverage', coverage],\n\t\t\t\t['Slowest', slowest],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('Work', [\n\t\t\t\t['Nodes', `${snapshot.nodes.length} retained · ${snapshot.culledNodes.length} culled`],\n\t\t\t\t['Segments', `${frameGraphSegments} FG · ${opaqueIntervals} opaque`],\n\t\t\t\t['Groups', snapshot.availability.groups ? String(snapshot.debugGroups.length) : 'Unknown'],\n\t\t\t\t['Recording order', snapshot.availability.recordingOrder ? 'Available' : 'Unknown'],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('Resources', [\n\t\t\t\t['Logical / physical', `${snapshot.resources.length} / ${snapshot.physicalAllocations.length}`],\n\t\t\t\t['Texture views', snapshot.availability.textureViews ? String(snapshot.textureViewById.size) : 'Unknown'],\n\t\t\t\t['Access regions', snapshot.availability.accessRegions ? 'Available' : 'Unknown'],\n\t\t\t\t['Transient estimate', formatEstimatedBytes(metrics.transientEstimatedByteSize)],\n\t\t\t]),\n\t\t\tthis.createSummaryGroup('Pool', [\n\t\t\t\t['Retained', poolRetained],\n\t\t\t\t['Reuse', formatPoolHitRate(snapshot)],\n\t\t\t]),\n\t\t);\n\t}\n\n\tprivate createSummaryGroup(title: string, rows: readonly (readonly [string, string])[]): HTMLElement {\n\t\tconst group = document.createElement('section');\n\t\tconst heading = document.createElement('h2');\n\t\theading.textContent = title;\n\t\tgroup.appendChild(heading);\n\t\tfor (const [label, value] of rows) {\n\t\t\tconst row = document.createElement('div');\n\t\t\tconst term = document.createElement('span');\n\t\t\tterm.textContent = label;\n\t\t\tconst description = document.createElement('strong');\n\t\t\tdescription.textContent = value;\n\t\t\tdescription.title = value;\n\t\t\trow.append(term, description);\n\t\t\tgroup.appendChild(row);\n\t\t}\n\t\treturn group;\n\t}\n\n\tprivate setExportMenuOpen(open: boolean): void {\n\t\tthis.exportMenu.hidden = !open;\n\t\tthis.exportButton.setAttribute('aria-expanded', open ? 'true' : 'false');\n\t}\n\n\tprivate handleInspectorOpenChange(_open: boolean): void {\n\t\tthis.updateWorkspaceState();\n\t\tif (this.activeTab === 'graph') this.resizeGraph(false);\n\t}\n\n\tprivate updateWorkspaceState(): void {\n\t\tconst inspectorOpen = this.hasSnapshot && this.inspector.isOpen;\n\t\tthis.workspace.classList.toggle('has-capture', this.hasSnapshot);\n\t\tthis.workspace.classList.toggle('inspector-open', inspectorOpen);\n\t\tthis.inspector.root.classList.toggle('unavailable', !this.hasSnapshot);\n\t\tthis.inspectorOpenButton.hidden = !this.hasSnapshot || inspectorOpen;\n\t}\n}\n"]}
|
package/dist/styles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAwiCA;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAStD"}
|
package/dist/styles.js
CHANGED
|
@@ -279,6 +279,9 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
|
|
|
279
279
|
}
|
|
280
280
|
.zenfg-inspector-export-menu[hidden] { display: none; }
|
|
281
281
|
.zenfg-inspector-export-menu > button {
|
|
282
|
+
display: flex;
|
|
283
|
+
align-items: center;
|
|
284
|
+
gap: 7px;
|
|
282
285
|
padding: 7px 9px;
|
|
283
286
|
border: 0;
|
|
284
287
|
border-radius: 4px;
|
|
@@ -286,6 +289,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
|
|
|
286
289
|
background: transparent;
|
|
287
290
|
font: 600 11px/1.2 var(--fgd-font-ui);
|
|
288
291
|
text-align: left;
|
|
292
|
+
white-space: nowrap;
|
|
289
293
|
cursor: pointer;
|
|
290
294
|
}
|
|
291
295
|
.zenfg-inspector-export-menu > button:hover:not(:disabled) {
|
package/dist/styles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"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","sourcesContent":["import { FRAME_GRAPH_DEBUG_VISUAL_THEME, GRAPH_VISUAL_THEME } from './panelVisualTheme.ts';\n\nconst STYLE_ELEMENT_ID = 'zenfg-inspector-panel-styles';\nconst theme = FRAME_GRAPH_DEBUG_VISUAL_THEME;\n\nconst FRAME_GRAPH_DEBUG_PANEL_CSS = `\n/* Tokens and workbench root */\n.zenfg-inspector {\n\t--fgd-canvas: ${theme.canvas};\n\t--fgd-panel: var(--zenfg-inspector-background, ${theme.panel});\n\t--fgd-surface: var(--zenfg-inspector-surface, ${theme.surface});\n\t--fgd-surface-raised: var(--zenfg-inspector-surface-raised, ${theme.surfaceRaised});\n\t--fgd-surface-hover: var(--zenfg-inspector-surface-hover, ${theme.surfaceHover});\n\t--fgd-border: var(--zenfg-inspector-border, ${theme.border});\n\t--fgd-border-subtle: var(--zenfg-inspector-border-subtle, rgba(180, 190, 202, 0.11));\n\t--fgd-border-strong: var(--zenfg-inspector-border-strong, rgba(180, 190, 202, 0.28));\n\t--fgd-text: var(--zenfg-inspector-text, ${theme.text});\n\t--fgd-text-secondary: var(--zenfg-inspector-text-secondary, ${theme.textSecondary});\n\t--fgd-muted: var(--zenfg-inspector-muted, ${theme.muted});\n\t--fgd-accent: var(--zenfg-inspector-accent, ${theme.accent});\n\t--fgd-accent-soft: var(--zenfg-inspector-accent-soft, rgba(56, 189, 248, 0.12));\n\t--fgd-accent-hover: var(--zenfg-inspector-accent-hover, rgba(56, 189, 248, 0.18));\n\t--fgd-success: var(--zenfg-inspector-success, ${theme.success});\n\t--fgd-warning: var(--zenfg-inspector-warning, ${theme.warning});\n\t--fgd-danger: var(--zenfg-inspector-danger, ${theme.danger});\n\t--fgd-font-ui: var(--zenfg-inspector-font-ui, ${theme.fontUi});\n\t--fgd-font-mono: var(--zenfg-inspector-font-mono, ${theme.fontMono});\n\tposition: relative;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-canvas);\n\tfont-family: var(--fgd-font-ui);\n\tfont-size: 12px;\n\tline-height: 1.45;\n\tcolor-scheme: dark;\n\tcontainer-name: zenfg-inspector;\n\tcontainer-type: inline-size;\n}\n\n.zenfg-inspector,\n.zenfg-inspector * { box-sizing: border-box; }\n\n.zenfg-inspector-body {\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\tpadding: 10px;\n\toverflow: hidden;\n\tborder: 0;\n\tborder-radius: 0;\n\tbackground: var(--zenfg-inspector-background, var(--fgd-panel));\n}\n\n.zenfg-inspector-content {\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.zenfg-inspector-drop-overlay {\n\tposition: absolute;\n\tz-index: 40;\n\tinset: 10px;\n\tdisplay: grid;\n\tplace-content: center;\n\tgap: 6px;\n\tborder: 2px dashed var(--fgd-accent);\n\tborder-radius: var(--zenfg-inspector-radius-md, 6px);\n\tcolor: #bae6fd;\n\tbackground: color-mix(in srgb, var(--fgd-canvas) 90%, transparent);\n\tfont: 600 13px/1.4 var(--fgd-font-ui);\n\ttext-align: center;\n\tpointer-events: none;\n}\n.zenfg-inspector-drop-overlay[hidden] { display: none; }\n.zenfg-inspector-drop-overlay > span { color: var(--fgd-muted); font-size: 11px; }\n\n.zenfg-inspector-capture-summary[hidden],\n.zenfg-inspector-command-status[hidden],\n.zenfg-inspector-capture-action[hidden],\n.zenfg-inspector-workbench-empty[hidden],\n.zenfg-inspector-open-inspector[hidden],\n.zenfg-inspector-inspector.unavailable,\n.zenfg-inspector-view[hidden],\n.zenfg-inspector-graph-status[hidden] { display: none !important; }\n\n.zenfg-inspector-muted {\n\tmargin: 0;\n\tcolor: var(--fgd-muted);\n\tfont: 11px/1.5 var(--fgd-font-ui);\n}\n\n.zenfg-inspector-control-icon {\n\tdisplay: block;\n\tflex: 0 0 auto;\n\twidth: 14px;\n\theight: 14px;\n}\n\n.zenfg-inspector-table-scroller,\n.zenfg-inspector-memory-scroller,\n.zenfg-inspector-diagnostics-scroller,\n.zenfg-inspector-inspector-content,\n.zenfg-inspector-workbench-tabs,\n.zenfg-inspector-graph-legend {\n\tscrollbar-width: thin;\n\tscrollbar-color: rgba(180, 190, 202, 0.25) transparent;\n}\n\n/* Workbench and summary */\n.zenfg-inspector-workbench {\n\tdisplay: grid;\n\tgrid-template-rows: auto minmax(0, 1fr);\n\tgap: 8px;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n\tfont-family: var(--fgd-font-ui);\n}\n\n.zenfg-inspector-capture-summary {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(min(230px, 100%), 1fr));\n\talign-content: start;\n\tgap: 8px;\n\tmin-width: 0;\n\tbackground: transparent;\n}\n\n.zenfg-inspector-capture-summary > section {\n\tmin-width: 0;\n\tpadding: 12px;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface);\n}\n\n.zenfg-inspector-capture-summary h2 {\n\tmargin: 0 0 5px;\n\tcolor: var(--fgd-text-secondary);\n\tfont-size: 10px;\n\tfont-weight: 700;\n\tletter-spacing: 0.075em;\n\tline-height: 1.2;\n\ttext-transform: uppercase;\n}\n\n.zenfg-inspector-capture-summary section > div {\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr);\n\tgap: 8px;\n\tmin-width: 0;\n\tfont-size: 11px;\n\tline-height: 1.5;\n}\n\n.zenfg-inspector-capture-summary span { color: var(--fgd-muted); white-space: nowrap; }\n.zenfg-inspector-capture-summary strong {\n\tmin-width: 0;\n\toverflow: hidden;\n\tcolor: var(--fgd-text);\n\tfont: 600 11px/1.5 var(--fgd-font-mono);\n\ttext-align: right;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n/* Command bar, tabs, and controls */\n.zenfg-inspector-workbench-command-bar {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\talign-items: center;\n\tmin-width: 0;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n}\n.zenfg-inspector-workbench-command-bar.branding-hidden {\n\tgrid-template-columns: minmax(0, 1fr) auto;\n}\n\n.zenfg-inspector-brand {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tmin-width: 0;\n\tmin-height: 32px;\n\tpadding: 0 12px 0 4px;\n\toverflow: hidden;\n\tcolor: var(--fgd-text);\n\tfont: 700 12px/1 var(--fgd-font-ui);\n\tletter-spacing: 0.015em;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-brand::after {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 0;\n\twidth: 1px;\n\theight: 16px;\n\tbackground: var(--fgd-border);\n\tcontent: '';\n\ttransform: translateY(-50%);\n}\n\n.zenfg-inspector-workbench-tabs,\n.zenfg-inspector-subtabs,\n.zenfg-inspector-inspector-tabs {\n\tdisplay: flex;\n\talign-items: end;\n\tmin-width: 0;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n}\n\n.zenfg-inspector-workbench-tabs {\n\toverflow-x: auto;\n\tborder-bottom: 0;\n}\n\n.zenfg-inspector-workbench-tabs > button,\n.zenfg-inspector-subtabs > button,\n.zenfg-inspector-inspector-tabs > button {\n\tmin-height: 32px;\n\tpadding: 6px 10px;\n\tborder: 0;\n\tborder-bottom: 2px solid transparent;\n\tcolor: var(--fgd-muted);\n\tbackground: transparent;\n\tfont: 600 12px/1 var(--fgd-font-ui);\n\twhite-space: nowrap;\n\tcursor: pointer;\n\ttransition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;\n}\n\n.zenfg-inspector-workbench-tabs > button:hover:not(:disabled),\n.zenfg-inspector-subtabs > button:hover:not(:disabled),\n.zenfg-inspector-inspector-tabs > button:hover:not(:disabled) {\n\tcolor: var(--fgd-text-secondary);\n\tbackground: rgba(180, 190, 202, 0.055);\n}\n\n.zenfg-inspector-workbench-tabs > button.active,\n.zenfg-inspector-subtabs > button.active,\n.zenfg-inspector-inspector-tabs > button.active {\n\tborder-bottom-color: var(--fgd-accent);\n\tcolor: var(--fgd-text);\n\tbackground: linear-gradient(to top, var(--fgd-accent-soft), transparent 55%);\n}\n\n.zenfg-inspector-workbench-tabs > button:disabled,\n.zenfg-inspector-subtabs > button:disabled,\n.zenfg-inspector-inspector-tabs > button:disabled { cursor: default; opacity: 0.42; }\n\n.zenfg-inspector-workbench-actions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding-left: 8px;\n\toverflow-x: auto;\n\tscrollbar-width: thin;\n}\n\n.zenfg-inspector-export-menu {\n\tposition: absolute;\n\tz-index: 30;\n\ttop: calc(100% + 4px);\n\tright: 0;\n\tdisplay: grid;\n\tmin-width: 142px;\n\tpadding: 4px;\n\tborder: 1px solid var(--fgd-border-strong);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface-raised);\n\tbox-shadow: 0 10px 24px rgba(0, 0, 0, 0.34);\n}\n.zenfg-inspector-export-menu[hidden] { display: none; }\n.zenfg-inspector-export-menu > button {\n\tpadding: 7px 9px;\n\tborder: 0;\n\tborder-radius: 4px;\n\tcolor: var(--fgd-text-secondary);\n\tbackground: transparent;\n\tfont: 600 11px/1.2 var(--fgd-font-ui);\n\ttext-align: left;\n\tcursor: pointer;\n}\n.zenfg-inspector-export-menu > button:hover:not(:disabled) {\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-surface-hover);\n}\n.zenfg-inspector-export-menu > button:disabled { cursor: default; opacity: 0.46; }\n\n.zenfg-inspector-workbench-actions > button,\n.zenfg-inspector-graph-toolbar button,\n.zenfg-inspector-group-toggle,\n.zenfg-inspector-inspector-close {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 6px;\n\theight: 28px;\n\tmin-height: 28px;\n\tpadding: 0 9px;\n\tborder: 1px solid var(--fgd-border);\n\tborder-radius: 5px;\n\tcolor: var(--fgd-text-secondary);\n\tbackground: var(--fgd-surface);\n\tfont: 600 11px/1 var(--fgd-font-ui);\n\twhite-space: nowrap;\n\tcursor: pointer;\n\ttransition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;\n}\n\n.zenfg-inspector-workbench-actions > button:hover:not(:disabled),\n.zenfg-inspector-graph-toolbar button:hover:not(:disabled),\n.zenfg-inspector-group-toggle:hover:not(:disabled),\n.zenfg-inspector-inspector-close:hover:not(:disabled) {\n\tborder-color: var(--fgd-border-strong);\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-surface-hover);\n}\n\n.zenfg-inspector-workbench-actions > button[data-tone='accent'] {\n\tborder-color: rgba(56, 189, 248, 0.5);\n\tcolor: #bae6fd;\n\tbackground: var(--fgd-accent-soft);\n}\n.zenfg-inspector-workbench-actions > button[data-tone='accent']:hover:not(:disabled) {\n\tborder-color: var(--fgd-accent);\n\tbackground: var(--fgd-accent-hover);\n}\n.zenfg-inspector-workbench-actions > button[data-tone='pending'] {\n\tborder-color: rgba(56, 189, 248, 0.42);\n\tcolor: var(--fgd-text-secondary);\n\tbackground: var(--fgd-accent-soft);\n}\n.zenfg-inspector-workbench-actions > button[data-tone='success'] {\n\tborder-color: rgba(52, 211, 153, 0.46);\n\tcolor: var(--fgd-success);\n\tbackground: rgba(52, 211, 153, 0.1);\n}\n.zenfg-inspector-workbench-actions > button:disabled { cursor: default; opacity: 0.46; }\n.zenfg-inspector-workbench-actions > button[aria-busy='true']:disabled { opacity: 0.72; }\n\n.zenfg-inspector-command-status {\n\tmax-width: 220px;\n\toverflow: hidden;\n\tcolor: var(--fgd-muted);\n\tfont: 11px/1.35 var(--fgd-font-ui);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-command-status[data-tone='error'] { color: var(--fgd-danger); }\n\n.zenfg-inspector-control-icon[data-icon='spinner'],\nbutton[aria-busy='true'] > .zenfg-inspector-control-icon {\n\tanimation: zenfg-inspector-spin 800ms linear infinite;\n}\n@keyframes zenfg-inspector-spin { to { transform: rotate(360deg); } }\n\n.zenfg-inspector-workbench-tabs > button:focus-visible,\n.zenfg-inspector-subtabs > button:focus-visible,\n.zenfg-inspector-inspector-tabs > button:focus-visible,\n.zenfg-inspector-workbench-actions > button:focus-visible,\n.zenfg-inspector-graph-toolbar button:focus-visible,\n.zenfg-inspector-group-toggle:focus-visible,\n.zenfg-inspector-inspector-close:focus-visible,\n.zenfg-inspector-relation-button:focus-visible,\n.zenfg-inspector-view-toolbar input:focus-visible,\n.zenfg-inspector-view-toolbar select:focus-visible {\n\toutline: 2px solid var(--fgd-accent);\n\toutline-offset: 1px;\n}\n\n/* Workspace and empty states */\n.zenfg-inspector-overview-view {\n\tpadding: 12px;\n\toverflow: auto;\n\tbackground: var(--fgd-canvas);\n}\n\n.zenfg-inspector-workspace {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1fr);\n\tgap: 8px;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n}\n.zenfg-inspector-workspace.inspector-open {\n\tgrid-template-columns: minmax(0, 1fr) minmax(360px, 28vw);\n}\n\n.zenfg-inspector-main {\n\tdisplay: grid;\n\tgrid-template: minmax(0, 1fr) / minmax(0, 1fr);\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n}\n\n.zenfg-inspector-workbench-empty {\n\tgrid-area: 1 / 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 8px;\n\tmin-width: 0;\n\tmin-height: 0;\n\tpadding: 24px;\n\tcolor: var(--fgd-muted);\n\tfont: 12px/1.5 var(--fgd-font-ui);\n\ttext-align: center;\n}\n.zenfg-inspector-workbench-empty > .zenfg-inspector-control-icon {\n\twidth: 22px;\n\theight: 22px;\n\tcolor: var(--fgd-text-secondary);\n}\n.zenfg-inspector-workbench-empty[data-state='error'] > .zenfg-inspector-control-icon { color: var(--fgd-danger); }\n.zenfg-inspector-workbench-empty[data-state='capturing'] > .zenfg-inspector-control-icon { color: var(--fgd-accent); }\n.zenfg-inspector-empty-message { max-width: 520px; }\n.zenfg-inspector-empty-detail { color: color-mix(in srgb, var(--fgd-muted) 78%, transparent); font-size: 11px; }\n\n.zenfg-inspector-view {\n\tgrid-area: 1 / 1;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-canvas);\n}\n\n.zenfg-inspector-view-toolbar {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 6px 8px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n\n.zenfg-inspector-view-toolbar input,\n.zenfg-inspector-view-toolbar select {\n\tmin-width: 0;\n\theight: 28px;\n\tpadding: 4px 8px;\n\tborder: 1px solid var(--fgd-border);\n\tborder-radius: 5px;\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-panel);\n\tfont: 11px/1 var(--fgd-font-ui);\n}\n.zenfg-inspector-view-toolbar input { flex: 1 1 210px; }\n.zenfg-inspector-view-toolbar input::placeholder { color: var(--fgd-muted); opacity: 0.86; }\n.zenfg-inspector-view-toolbar select { flex: 0 1 auto; color-scheme: dark; }\n\n.zenfg-inspector-passes-view,\n.zenfg-inspector-resources-view { display: flex; flex-direction: column; }\n.zenfg-inspector-subtabs,\n.zenfg-inspector-inspector-tabs {\n\tflex: 0 0 auto;\n\tpadding: 0 4px;\n\tbackground: var(--fgd-panel);\n}\n.zenfg-inspector-subview { flex: 1 1 auto; min-height: 0; overflow: hidden; }\n\n/* Tables and relations */\n.zenfg-inspector-table-scroller {\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\toverflow: auto;\n}\n.zenfg-inspector-workbench-table {\n\twidth: 100%;\n\tmin-width: 720px;\n\tborder-collapse: collapse;\n\tfont: 11px/1.45 var(--fgd-font-mono);\n}\n.zenfg-inspector-workbench-table th,\n.zenfg-inspector-workbench-table td {\n\theight: 30px;\n\tmax-width: 360px;\n\tpadding: 6px 10px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\toverflow: hidden;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-workbench-table th {\n\tposition: sticky;\n\tz-index: 2;\n\ttop: 0;\n\tcolor: var(--fgd-muted);\n\tbackground: var(--fgd-panel);\n\tfont: 650 10px/1.3 var(--fgd-font-ui);\n\tletter-spacing: 0.025em;\n}\n.zenfg-inspector-workbench-table [data-column='numeric'] {\n\tfont-variant-numeric: tabular-nums;\n\ttext-align: right;\n}\n.zenfg-inspector-workbench-table [data-column='code'] { font-family: var(--fgd-font-mono); }\n.zenfg-inspector-workbench-table tbody tr:hover td { background: rgba(180, 190, 202, 0.045); }\n\n.zenfg-inspector-workbench-table tr.selected td,\n.zenfg-inspector-diagnostic-list .selected,\n.zenfg-inspector-memory-allocation.selected,\n.zenfg-inspector-memory-resource.selected { background: var(--fgd-accent-soft); }\n.zenfg-inspector-workbench-table tr.selected td:first-child { box-shadow: inset 2px 0 var(--fgd-accent); }\n\n.zenfg-inspector-workbench-table td small {\n\tdisplay: block;\n\tmargin-top: 2px;\n\toverflow: hidden;\n\tcolor: var(--fgd-muted);\n\tfont: 10px/1.4 var(--fgd-font-ui);\n\ttext-overflow: ellipsis;\n}\n\n.zenfg-inspector-kind-label {\n\t--fgd-kind-color: var(--fgd-muted);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmax-width: 100%;\n\toverflow: hidden;\n\tcolor: var(--fgd-text-secondary);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-kind-label::before {\n\twidth: 6px;\n\theight: 6px;\n\tflex: 0 0 auto;\n\tborder: 1px solid color-mix(in srgb, var(--fgd-kind-color) 78%, white);\n\tborder-radius: 50%;\n\tbackground: color-mix(in srgb, var(--fgd-kind-color) 72%, transparent);\n\tcontent: '';\n}\n.zenfg-inspector-kind-label[data-kind='render'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.render.stroke}; }\n.zenfg-inspector-kind-label[data-kind='compute'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.compute.stroke}; }\n.zenfg-inspector-kind-label[data-kind='copy'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.copy.stroke}; }\n.zenfg-inspector-kind-label[data-kind='clear-buffer'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.clear.stroke}; }\n.zenfg-inspector-kind-label[data-kind='command'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.command.stroke}; }\n.zenfg-inspector-kind-label[data-kind='external-submission'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.external.stroke}; }\n.zenfg-inspector-kind-label[data-kind='opaque'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.external.stroke}; }\n.zenfg-inspector-kind-label[data-kind='texture'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.texture.stroke}; }\n.zenfg-inspector-kind-label[data-kind='buffer'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.buffer.stroke}; }\n.zenfg-inspector-kind-label[data-kind='frame-graph'] { --fgd-kind-color: var(--fgd-accent); }\n.zenfg-inspector-kind-label[data-kind='timed'] { --fgd-kind-color: var(--fgd-success); }\n.zenfg-inspector-kind-label[data-kind='not-timed'] { --fgd-kind-color: var(--fgd-muted); }\n\n.zenfg-inspector-relation-button {\n\tmax-width: 100%;\n\tpadding: 0;\n\tborder: 0;\n\tcolor: #a5def6;\n\tbackground: transparent;\n\tfont: inherit;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.zenfg-inspector-relation-button:hover {\n\tcolor: #d5f3ff;\n\ttext-decoration: underline;\n\ttext-underline-offset: 2px;\n}\n.zenfg-inspector-group-toggle { width: 28px; padding: 0; color: var(--fgd-text-secondary); }\n.zenfg-inspector-empty-row {\n\theight: 60px !important;\n\tcolor: var(--fgd-muted);\n\tfont-family: var(--fgd-font-ui);\n\ttext-align: center !important;\n}\n\n/* Graph */\n.zenfg-inspector-graph-view { display: flex; flex-direction: column; }\n.zenfg-inspector-graph-toolbar {\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\talign-items: center;\n\tgap: 10px;\n\tmin-width: 0;\n\tmin-height: 38px;\n\tpadding: 5px 6px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-graph-mode-controls,\n.zenfg-inspector-graph-action-controls { display: flex; align-items: center; min-width: 0; }\n.zenfg-inspector-graph-action-controls { gap: 4px; }\n.zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button {\n\tmargin-right: -1px;\n\tborder-radius: 0;\n}\n.zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button:first-child { border-radius: 5px 0 0 5px; }\n.zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button:last-child {\n\tmargin-right: 0;\n\tborder-radius: 0 5px 5px 0;\n}\n.zenfg-inspector-graph-toolbar button.active,\n.zenfg-inspector-graph-toolbar button[aria-pressed='true'] {\n\tz-index: 1;\n\tborder-color: rgba(56, 189, 248, 0.6);\n\tcolor: var(--fgd-accent);\n\tbackground: var(--fgd-accent-soft);\n}\n.zenfg-inspector-graph-toolbar button:disabled { cursor: default; opacity: 0.42; }\n.zenfg-inspector-graph-toolbar .zenfg-inspector-icon-button { width: 28px; padding: 0; }\n\n.zenfg-inspector-graph-legend {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tmin-width: 0;\n\tpadding: 2px 0;\n\toverflow-x: auto;\n\tcolor: var(--fgd-muted);\n\tfont: 10px/1 var(--fgd-font-ui);\n\twhite-space: nowrap;\n}\n.zenfg-inspector-legend-item { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; }\n.zenfg-inspector-legend-swatch {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 8px;\n\tborder: 1px solid var(--zenfg-inspector-legend-color);\n\tborder-radius: 2px;\n\tbackground: color-mix(in srgb, var(--zenfg-inspector-legend-color) 20%, var(--fgd-canvas));\n}\n.zenfg-inspector-legend-swatch[data-shape='ellipse'] { border-radius: 50%; }\n.zenfg-inspector-legend-swatch[data-shape='group'] { border-style: double; background: transparent; }\n.zenfg-inspector-legend-swatch[data-shape='line'] {\n\twidth: 16px;\n\theight: 0;\n\tborder: 0;\n\tborder-top: 1px solid var(--zenfg-inspector-legend-color);\n\tborder-radius: 0;\n\tbackground: transparent;\n}\n.zenfg-inspector-legend-swatch[data-shape='line'][data-line-style='dotted'] { border-top-style: dotted; }\n.zenfg-inspector-legend-swatch[data-shape='line'][data-line-style='dashed'] { border-top-style: dashed; }\n.zenfg-inspector-legend-swatch:not([data-shape='line'])[data-line-style='dashed'] { border-style: dashed; }\n.zenfg-inspector-legend-swatch[data-shape='line']::after {\n\tposition: absolute;\n\ttop: -2px;\n\tright: -1px;\n\twidth: 5px;\n\theight: 4px;\n\tbackground: var(--zenfg-inspector-legend-color);\n\tclip-path: polygon(0 0, 100% 50%, 0 100%);\n\tcontent: '';\n}\n.zenfg-inspector-legend-swatch[data-shape='line'][data-hollow-arrow='true']::after {\n\ttop: -3px;\n\twidth: 4px;\n\theight: 4px;\n\tborder-top: 1px solid var(--zenfg-inspector-legend-color);\n\tborder-right: 1px solid var(--zenfg-inspector-legend-color);\n\tbackground: transparent;\n\tclip-path: none;\n\ttransform: rotate(45deg);\n}\n\n.zenfg-inspector-graph-view .zenfg-inspector-graph {\n\tflex: 1 1 auto;\n\twidth: 100%;\n\theight: auto;\n\tmin-height: 0;\n\tborder: 0;\n}\n.zenfg-inspector-graph {\n\tposition: relative;\n\twidth: 100%;\n\theight: 260px;\n\tmin-height: 220px;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-canvas);\n\tcolor: var(--fgd-muted);\n\tfont-size: 11px;\n}\n.zenfg-inspector-graph-canvas {\n\twidth: 100%;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n\toutline: none;\n}\n.zenfg-inspector-graph-status {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 2;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 8px;\n\tpadding: 16px;\n\tcolor: var(--fgd-muted);\n\tbackground: rgba(11, 15, 20, 0.82);\n\tfont: 12px/1.45 var(--fgd-font-ui);\n\ttext-align: center;\n\tpointer-events: none;\n}\n.zenfg-inspector-graph-status[data-state='layout'] { background: rgba(11, 15, 20, 0.5); }\n.zenfg-inspector-graph-status[data-state='error'] {\n\tcolor: var(--fgd-text);\n\tbackground: rgba(11, 15, 20, 0.94);\n}\n.zenfg-inspector-graph-status > span { max-width: min(560px, 80%); }\n.zenfg-inspector-graph-status button {\n\theight: 28px;\n\tpadding: 0 9px;\n\tborder: 1px solid rgba(56, 189, 248, 0.55);\n\tborder-radius: 5px;\n\tcolor: var(--fgd-accent);\n\tbackground: var(--fgd-accent-soft);\n\tfont: 600 11px/1 var(--fgd-font-ui);\n\tcursor: pointer;\n\tpointer-events: auto;\n}\n.zenfg-inspector-graph-tooltip {\n\tposition: absolute;\n\tz-index: 3;\n\tmax-width: min(380px, calc(100% - 16px));\n\tpadding: 8px 10px;\n\tborder: 1px solid var(--fgd-border-strong);\n\tborder-radius: 6px;\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-surface-raised);\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.42);\n\tfont: 11px/1.5 var(--fgd-font-mono);\n\twhite-space: pre-wrap;\n\tpointer-events: none;\n}\n\n/* Inspector */\n.zenfg-inspector-inspector {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface-raised);\n\tbox-shadow: -8px 0 28px rgba(0, 0, 0, 0.2);\n}\n.zenfg-inspector-inspector[hidden] { display: none; }\n.zenfg-inspector-inspector > header {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmin-height: 36px;\n\tpadding: 0 8px 0 10px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-inspector > header strong {\n\tmin-width: 0;\n\toverflow: hidden;\n\tfont: 600 11px/1.3 var(--fgd-font-mono);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-inspector-close {\n\twidth: 28px;\n\tpadding: 0;\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n.zenfg-inspector-inspector-content {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n\tpadding: 10px;\n\toverflow: auto;\n}\n.zenfg-inspector-inspector-summary {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(96px, auto) minmax(0, 1fr);\n\tgap: 3px 12px;\n\tmargin: 0;\n\tfont-size: 11px;\n\tline-height: 1.6;\n}\n.zenfg-inspector-inspector-summary dt { color: var(--fgd-muted); font-family: var(--fgd-font-ui); }\n.zenfg-inspector-inspector-summary dd {\n\tmin-width: 0;\n\tmargin: 0;\n\tcolor: var(--fgd-text);\n\tfont-family: var(--fgd-font-mono);\n\toverflow-wrap: anywhere;\n}\n.zenfg-inspector-inspector-relations { display: grid; gap: 8px; }\n.zenfg-inspector-inspector-relations section {\n\tdisplay: grid;\n\tgap: 6px;\n\tpadding: 8px;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 5px;\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-inspector-relations h3 {\n\tmargin: 0 0 2px;\n\tcolor: var(--fgd-muted);\n\tfont: 700 10px/1.3 var(--fgd-font-ui);\n\tletter-spacing: 0.055em;\n\ttext-transform: uppercase;\n}\n.zenfg-inspector-inspector-relations .zenfg-inspector-relation-button {\n\tfont: 11px/1.5 var(--fgd-font-mono);\n\toverflow-wrap: anywhere;\n\twhite-space: normal;\n}\n.zenfg-inspector-inspector .zenfg-inspector-raw-detail {\n\tmin-width: 100%;\n\tmargin: 0;\n\toverflow: auto;\n\tcolor: var(--fgd-text-secondary);\n\tfont: 11px/1.55 var(--fgd-font-mono);\n\twhite-space: pre;\n}\n\n/* Memory */\n.zenfg-inspector-memory-view {\n\tdisplay: grid;\n\tgrid-template-rows: auto minmax(0, 1fr);\n}\n.zenfg-inspector-memory-summary {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, minmax(0, 1fr));\n\tgap: 6px;\n\tpadding: 6px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-panel);\n}\n.zenfg-inspector-memory-summary > div {\n\tdisplay: grid;\n\tgap: 3px;\n\tmin-width: 0;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 5px;\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-memory-summary span { color: var(--fgd-muted); font: 10px/1.3 var(--fgd-font-ui); }\n.zenfg-inspector-memory-summary strong {\n\toverflow: hidden;\n\tfont: 600 11px/1.35 var(--fgd-font-mono);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-memory-scroller { min-height: 0; overflow: auto; }\n.zenfg-inspector-memory-timeline {\n\tdisplay: grid;\n\tmin-width: 760px;\n\tpadding: 8px;\n\tfont: 11px/1.4 var(--fgd-font-mono);\n}\n.zenfg-inspector-memory-axis,\n.zenfg-inspector-memory-resource {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(150px, 0.9fr) 72px minmax(320px, 2.4fr) 82px;\n\tgap: 10px;\n\talign-items: center;\n\tmin-height: 30px;\n}\n.zenfg-inspector-memory-axis {\n\tposition: sticky;\n\tz-index: 2;\n\ttop: 0;\n\tpadding: 0 8px 6px;\n\tcolor: var(--fgd-muted);\n\tbackground: var(--fgd-canvas);\n\tfont: 10px/1.3 var(--fgd-font-ui);\n}\n.zenfg-inspector-memory-axis-track,\n.zenfg-inspector-memory-track { position: relative; height: 16px; }\n.zenfg-inspector-memory-axis-track { border-bottom: 1px solid var(--fgd-border-strong); }\n.zenfg-inspector-memory-axis-track > span {\n\tposition: absolute;\n\tbottom: -1px;\n\tpadding-bottom: 5px;\n\tborder-left: 1px solid var(--fgd-border-strong);\n\tfont: 10px/1 var(--fgd-font-mono);\n\ttransform: translateX(-1px);\n}\n.zenfg-inspector-memory-allocation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tmargin-top: 6px;\n\tpadding: 7px 8px;\n\tborder-top: 1px solid var(--fgd-border-subtle);\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-memory-allocation > span { color: var(--fgd-muted); font: 10px/1.35 var(--fgd-font-mono); }\n.zenfg-inspector-memory-allocation.muted { color: var(--fgd-muted); font-family: var(--fgd-font-ui); }\n.zenfg-inspector-memory-resource { padding: 0 8px; border-bottom: 1px solid var(--fgd-border-subtle); }\n.zenfg-inspector-memory-resource.selected,\n.zenfg-inspector-memory-allocation.selected { box-shadow: inset 2px 0 var(--fgd-accent); }\n.zenfg-inspector-memory-bar {\n\tposition: absolute;\n\ttop: 4px;\n\theight: 8px;\n\tmin-width: 2px;\n\tborder-radius: 4px;\n\tbackground: color-mix(in srgb, ${GRAPH_VISUAL_THEME.texture.stroke} 76%, transparent);\n\tbox-shadow: 0 0 0 1px color-mix(in srgb, ${GRAPH_VISUAL_THEME.texture.stroke} 36%, transparent);\n}\n.zenfg-inspector-memory-bar.buffer {\n\tbackground: color-mix(in srgb, ${GRAPH_VISUAL_THEME.buffer.stroke} 72%, transparent);\n\tbox-shadow: 0 0 0 1px color-mix(in srgb, ${GRAPH_VISUAL_THEME.buffer.stroke} 34%, transparent);\n}\n.zenfg-inspector-memory-bar.empty { display: none; }\n\n/* Diagnostics */\n.zenfg-inspector-diagnostics-scroller { width: 100%; height: 100%; overflow: auto; }\n.zenfg-inspector-diagnostics-grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: 8px;\n\tpadding: 8px;\n}\n.zenfg-inspector-diagnostic-card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 0;\n\tmin-height: 164px;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-diagnostic-card > h2 {\n\tmargin: 0;\n\tpadding: 9px 10px 3px;\n\tcolor: var(--fgd-text-secondary);\n\tfont: 650 12px/1.35 var(--fgd-font-ui);\n}\n.zenfg-inspector-diagnostic-card > p {\n\tmargin: 0;\n\tpadding: 0 10px 8px;\n\tcolor: var(--fgd-muted);\n\tfont: 11px/1.5 var(--fgd-font-ui);\n}\n.zenfg-inspector-diagnostic-card .zenfg-inspector-table-scroller { flex: 1 1 auto; max-height: 280px; }\n.zenfg-inspector-diagnostic-card .zenfg-inspector-workbench-table { min-width: 100%; table-layout: fixed; }\n.zenfg-inspector-diagnostic-card .zenfg-inspector-workbench-table td {\n\toverflow-wrap: anywhere;\n\twhite-space: normal;\n}\n.zenfg-inspector-diagnostic-list { display: grid; gap: 2px; padding: 6px; overflow: auto; }\n.zenfg-inspector-diagnostic-list .zenfg-inspector-relation-button {\n\tpadding: 6px 8px;\n\tborder-radius: 4px;\n\tcolor: var(--fgd-text-secondary);\n\tfont: 11px/1.45 var(--fgd-font-mono);\n}\n.zenfg-inspector-diagnostic-list .zenfg-inspector-relation-button:hover {\n\tbackground: rgba(180, 190, 202, 0.05);\n\ttext-decoration: none;\n}\n.zenfg-inspector-diagnostic-list .selected { box-shadow: inset 2px 0 var(--fgd-accent); }\n\n/* Responsive */\n@container zenfg-inspector (max-width: 960px) {\n\t.zenfg-inspector-workspace.inspector-open { grid-template-columns: minmax(0, 1fr); }\n\t.zenfg-inspector-workspace.inspector-open::after {\n\t\tposition: absolute;\n\t\tz-index: 10;\n\t\tinset: 0;\n\t\tbackground: rgba(3, 7, 12, 0.38);\n\t\tcontent: '';\n\t\tpointer-events: none;\n\t}\n\t.zenfg-inspector-inspector {\n\t\tposition: absolute;\n\t\tz-index: 20;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\twidth: min(380px, calc(100% - 24px));\n\t\tbox-shadow: -18px 0 42px rgba(0, 0, 0, 0.42);\n\t}\n\t.zenfg-inspector-graph-toolbar {\n\t\tgrid-template-columns: minmax(0, 1fr) auto;\n\t\tgap: 6px 8px;\n\t}\n\t.zenfg-inspector-graph-legend {\n\t\tgrid-column: 1 / -1;\n\t\tgrid-row: 2;\n\t\tpadding-top: 6px;\n\t\tborder-top: 1px solid var(--fgd-border-subtle);\n\t}\n\t.zenfg-inspector-graph-action-controls { justify-self: end; }\n}\n\n@container zenfg-inspector (max-width: 840px) {\n\t.zenfg-inspector-workbench-command-bar {\n\t\tgrid-template-columns: minmax(0, 1fr) auto;\n\t}\n\t.zenfg-inspector-brand { grid-column: 1; grid-row: 1; min-height: 36px; display: flex; align-items: center; }\n\t.zenfg-inspector-brand::after { display: none; }\n\t.zenfg-inspector-workbench-actions { grid-column: 2; grid-row: 1; }\n\t.zenfg-inspector-workbench-tabs { grid-column: 1 / -1; grid-row: 2; }\n\t.zenfg-inspector-workbench-command-bar.branding-hidden .zenfg-inspector-workbench-tabs {\n\t\tgrid-column: 1;\n\t\tgrid-row: 1;\n\t}\n\t.zenfg-inspector-diagnostics-grid { grid-template-columns: minmax(0, 1fr); }\n}\n\n@container zenfg-inspector (max-width: 720px) {\n\t.zenfg-inspector-body { padding: 8px; }\n\t.zenfg-inspector-overview-view { padding: 8px; }\n\t.zenfg-inspector-capture-summary > section { padding: 10px; }\n\t.zenfg-inspector-workbench-actions { padding-left: 6px; }\n\t.zenfg-inspector-command-status { max-width: 104px; }\n\t.zenfg-inspector-workbench-tabs > button { flex: 0 0 auto; padding-inline: 8px; }\n\t.zenfg-inspector-memory-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n\t.zenfg-inspector-view-toolbar input { flex-basis: 100%; }\n\t.zenfg-inspector-graph-toolbar { display: flex; flex-wrap: wrap; }\n\t.zenfg-inspector-graph-legend { order: 3; flex-basis: 100%; }\n\t.zenfg-inspector-graph-action-controls { margin-left: auto; }\n\t.zenfg-inspector-graph-view .zenfg-inspector-graph { height: auto; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.zenfg-inspector *,\n\t.zenfg-inspector *::before,\n\t.zenfg-inspector *::after {\n\t\tscroll-behavior: auto !important;\n\t\ttransition-duration: 0.01ms !important;\n\t\tanimation-duration: 0.01ms !important;\n\t\tanimation-iteration-count: 1 !important;\n\t}\n}\n`;\n\n/**\n * Installs the inspector's shared stylesheet in the current document once.\n *\n * @remarks This is safe to call repeatedly and is a no-op during server-side\n * rendering. `FrameGraphInspector` calls it automatically.\n */\nexport function ensureFrameGraphInspectorStyles(): void {\n\tif (typeof document === 'undefined' || document.getElementById(STYLE_ELEMENT_ID)) {\n\t\treturn;\n\t}\n\n\tconst style = document.createElement('style');\n\tstyle.id = STYLE_ELEMENT_ID;\n\tstyle.textContent = FRAME_GRAPH_DEBUG_PANEL_CSS;\n\tdocument.head.appendChild(style);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3F,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,MAAM,KAAK,GAAG,8BAA8B,CAAC;AAE7C,MAAM,2BAA2B,GAAG;;;iBAGnB,KAAK,CAAC,MAAM;kDACqB,KAAK,CAAC,KAAK;iDACZ,KAAK,CAAC,OAAO;+DACC,KAAK,CAAC,aAAa;6DACrB,KAAK,CAAC,YAAY;+CAChC,KAAK,CAAC,MAAM;;;2CAGhB,KAAK,CAAC,IAAI;+DACU,KAAK,CAAC,aAAa;6CACrC,KAAK,CAAC,KAAK;+CACT,KAAK,CAAC,MAAM;;;iDAGV,KAAK,CAAC,OAAO;iDACb,KAAK,CAAC,OAAO;+CACf,KAAK,CAAC,MAAM;iDACV,KAAK,CAAC,MAAM;qDACR,KAAK,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAmhBG,kBAAkB,CAAC,MAAM,CAAC,MAAM;uEAC/B,kBAAkB,CAAC,OAAO,CAAC,MAAM;oEACpC,kBAAkB,CAAC,IAAI,CAAC,MAAM;4EACtB,kBAAkB,CAAC,KAAK,CAAC,MAAM;uEACpC,kBAAkB,CAAC,OAAO,CAAC,MAAM;mFACrB,kBAAkB,CAAC,QAAQ,CAAC,MAAM;sEAC/C,kBAAkB,CAAC,QAAQ,CAAC,MAAM;uEACjC,kBAAkB,CAAC,OAAO,CAAC,MAAM;sEAClC,kBAAkB,CAAC,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA8WpE,kBAAkB,CAAC,OAAO,CAAC,MAAM;4CACvB,kBAAkB,CAAC,OAAO,CAAC,MAAM;;;kCAG3C,kBAAkB,CAAC,MAAM,CAAC,MAAM;4CACtB,kBAAkB,CAAC,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8H3E,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B;IAC9C,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClF,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,gBAAgB,CAAC;IAC5B,KAAK,CAAC,WAAW,GAAG,2BAA2B,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC","sourcesContent":["import { FRAME_GRAPH_DEBUG_VISUAL_THEME, GRAPH_VISUAL_THEME } from './panelVisualTheme.ts';\n\nconst STYLE_ELEMENT_ID = 'zenfg-inspector-panel-styles';\nconst theme = FRAME_GRAPH_DEBUG_VISUAL_THEME;\n\nconst FRAME_GRAPH_DEBUG_PANEL_CSS = `\n/* Tokens and workbench root */\n.zenfg-inspector {\n\t--fgd-canvas: ${theme.canvas};\n\t--fgd-panel: var(--zenfg-inspector-background, ${theme.panel});\n\t--fgd-surface: var(--zenfg-inspector-surface, ${theme.surface});\n\t--fgd-surface-raised: var(--zenfg-inspector-surface-raised, ${theme.surfaceRaised});\n\t--fgd-surface-hover: var(--zenfg-inspector-surface-hover, ${theme.surfaceHover});\n\t--fgd-border: var(--zenfg-inspector-border, ${theme.border});\n\t--fgd-border-subtle: var(--zenfg-inspector-border-subtle, rgba(180, 190, 202, 0.11));\n\t--fgd-border-strong: var(--zenfg-inspector-border-strong, rgba(180, 190, 202, 0.28));\n\t--fgd-text: var(--zenfg-inspector-text, ${theme.text});\n\t--fgd-text-secondary: var(--zenfg-inspector-text-secondary, ${theme.textSecondary});\n\t--fgd-muted: var(--zenfg-inspector-muted, ${theme.muted});\n\t--fgd-accent: var(--zenfg-inspector-accent, ${theme.accent});\n\t--fgd-accent-soft: var(--zenfg-inspector-accent-soft, rgba(56, 189, 248, 0.12));\n\t--fgd-accent-hover: var(--zenfg-inspector-accent-hover, rgba(56, 189, 248, 0.18));\n\t--fgd-success: var(--zenfg-inspector-success, ${theme.success});\n\t--fgd-warning: var(--zenfg-inspector-warning, ${theme.warning});\n\t--fgd-danger: var(--zenfg-inspector-danger, ${theme.danger});\n\t--fgd-font-ui: var(--zenfg-inspector-font-ui, ${theme.fontUi});\n\t--fgd-font-mono: var(--zenfg-inspector-font-mono, ${theme.fontMono});\n\tposition: relative;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-canvas);\n\tfont-family: var(--fgd-font-ui);\n\tfont-size: 12px;\n\tline-height: 1.45;\n\tcolor-scheme: dark;\n\tcontainer-name: zenfg-inspector;\n\tcontainer-type: inline-size;\n}\n\n.zenfg-inspector,\n.zenfg-inspector * { box-sizing: border-box; }\n\n.zenfg-inspector-body {\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\tpadding: 10px;\n\toverflow: hidden;\n\tborder: 0;\n\tborder-radius: 0;\n\tbackground: var(--zenfg-inspector-background, var(--fgd-panel));\n}\n\n.zenfg-inspector-content {\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.zenfg-inspector-drop-overlay {\n\tposition: absolute;\n\tz-index: 40;\n\tinset: 10px;\n\tdisplay: grid;\n\tplace-content: center;\n\tgap: 6px;\n\tborder: 2px dashed var(--fgd-accent);\n\tborder-radius: var(--zenfg-inspector-radius-md, 6px);\n\tcolor: #bae6fd;\n\tbackground: color-mix(in srgb, var(--fgd-canvas) 90%, transparent);\n\tfont: 600 13px/1.4 var(--fgd-font-ui);\n\ttext-align: center;\n\tpointer-events: none;\n}\n.zenfg-inspector-drop-overlay[hidden] { display: none; }\n.zenfg-inspector-drop-overlay > span { color: var(--fgd-muted); font-size: 11px; }\n\n.zenfg-inspector-capture-summary[hidden],\n.zenfg-inspector-command-status[hidden],\n.zenfg-inspector-capture-action[hidden],\n.zenfg-inspector-workbench-empty[hidden],\n.zenfg-inspector-open-inspector[hidden],\n.zenfg-inspector-inspector.unavailable,\n.zenfg-inspector-view[hidden],\n.zenfg-inspector-graph-status[hidden] { display: none !important; }\n\n.zenfg-inspector-muted {\n\tmargin: 0;\n\tcolor: var(--fgd-muted);\n\tfont: 11px/1.5 var(--fgd-font-ui);\n}\n\n.zenfg-inspector-control-icon {\n\tdisplay: block;\n\tflex: 0 0 auto;\n\twidth: 14px;\n\theight: 14px;\n}\n\n.zenfg-inspector-table-scroller,\n.zenfg-inspector-memory-scroller,\n.zenfg-inspector-diagnostics-scroller,\n.zenfg-inspector-inspector-content,\n.zenfg-inspector-workbench-tabs,\n.zenfg-inspector-graph-legend {\n\tscrollbar-width: thin;\n\tscrollbar-color: rgba(180, 190, 202, 0.25) transparent;\n}\n\n/* Workbench and summary */\n.zenfg-inspector-workbench {\n\tdisplay: grid;\n\tgrid-template-rows: auto minmax(0, 1fr);\n\tgap: 8px;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n\tfont-family: var(--fgd-font-ui);\n}\n\n.zenfg-inspector-capture-summary {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(min(230px, 100%), 1fr));\n\talign-content: start;\n\tgap: 8px;\n\tmin-width: 0;\n\tbackground: transparent;\n}\n\n.zenfg-inspector-capture-summary > section {\n\tmin-width: 0;\n\tpadding: 12px;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface);\n}\n\n.zenfg-inspector-capture-summary h2 {\n\tmargin: 0 0 5px;\n\tcolor: var(--fgd-text-secondary);\n\tfont-size: 10px;\n\tfont-weight: 700;\n\tletter-spacing: 0.075em;\n\tline-height: 1.2;\n\ttext-transform: uppercase;\n}\n\n.zenfg-inspector-capture-summary section > div {\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr);\n\tgap: 8px;\n\tmin-width: 0;\n\tfont-size: 11px;\n\tline-height: 1.5;\n}\n\n.zenfg-inspector-capture-summary span { color: var(--fgd-muted); white-space: nowrap; }\n.zenfg-inspector-capture-summary strong {\n\tmin-width: 0;\n\toverflow: hidden;\n\tcolor: var(--fgd-text);\n\tfont: 600 11px/1.5 var(--fgd-font-mono);\n\ttext-align: right;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n/* Command bar, tabs, and controls */\n.zenfg-inspector-workbench-command-bar {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\talign-items: center;\n\tmin-width: 0;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n}\n.zenfg-inspector-workbench-command-bar.branding-hidden {\n\tgrid-template-columns: minmax(0, 1fr) auto;\n}\n\n.zenfg-inspector-brand {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tmin-width: 0;\n\tmin-height: 32px;\n\tpadding: 0 12px 0 4px;\n\toverflow: hidden;\n\tcolor: var(--fgd-text);\n\tfont: 700 12px/1 var(--fgd-font-ui);\n\tletter-spacing: 0.015em;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-brand::after {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 0;\n\twidth: 1px;\n\theight: 16px;\n\tbackground: var(--fgd-border);\n\tcontent: '';\n\ttransform: translateY(-50%);\n}\n\n.zenfg-inspector-workbench-tabs,\n.zenfg-inspector-subtabs,\n.zenfg-inspector-inspector-tabs {\n\tdisplay: flex;\n\talign-items: end;\n\tmin-width: 0;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n}\n\n.zenfg-inspector-workbench-tabs {\n\toverflow-x: auto;\n\tborder-bottom: 0;\n}\n\n.zenfg-inspector-workbench-tabs > button,\n.zenfg-inspector-subtabs > button,\n.zenfg-inspector-inspector-tabs > button {\n\tmin-height: 32px;\n\tpadding: 6px 10px;\n\tborder: 0;\n\tborder-bottom: 2px solid transparent;\n\tcolor: var(--fgd-muted);\n\tbackground: transparent;\n\tfont: 600 12px/1 var(--fgd-font-ui);\n\twhite-space: nowrap;\n\tcursor: pointer;\n\ttransition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;\n}\n\n.zenfg-inspector-workbench-tabs > button:hover:not(:disabled),\n.zenfg-inspector-subtabs > button:hover:not(:disabled),\n.zenfg-inspector-inspector-tabs > button:hover:not(:disabled) {\n\tcolor: var(--fgd-text-secondary);\n\tbackground: rgba(180, 190, 202, 0.055);\n}\n\n.zenfg-inspector-workbench-tabs > button.active,\n.zenfg-inspector-subtabs > button.active,\n.zenfg-inspector-inspector-tabs > button.active {\n\tborder-bottom-color: var(--fgd-accent);\n\tcolor: var(--fgd-text);\n\tbackground: linear-gradient(to top, var(--fgd-accent-soft), transparent 55%);\n}\n\n.zenfg-inspector-workbench-tabs > button:disabled,\n.zenfg-inspector-subtabs > button:disabled,\n.zenfg-inspector-inspector-tabs > button:disabled { cursor: default; opacity: 0.42; }\n\n.zenfg-inspector-workbench-actions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding-left: 8px;\n\toverflow-x: auto;\n\tscrollbar-width: thin;\n}\n\n.zenfg-inspector-export-menu {\n\tposition: absolute;\n\tz-index: 30;\n\ttop: calc(100% + 4px);\n\tright: 0;\n\tdisplay: grid;\n\tmin-width: 142px;\n\tpadding: 4px;\n\tborder: 1px solid var(--fgd-border-strong);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface-raised);\n\tbox-shadow: 0 10px 24px rgba(0, 0, 0, 0.34);\n}\n.zenfg-inspector-export-menu[hidden] { display: none; }\n.zenfg-inspector-export-menu > button {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 7px;\n\tpadding: 7px 9px;\n\tborder: 0;\n\tborder-radius: 4px;\n\tcolor: var(--fgd-text-secondary);\n\tbackground: transparent;\n\tfont: 600 11px/1.2 var(--fgd-font-ui);\n\ttext-align: left;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.zenfg-inspector-export-menu > button:hover:not(:disabled) {\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-surface-hover);\n}\n.zenfg-inspector-export-menu > button:disabled { cursor: default; opacity: 0.46; }\n\n.zenfg-inspector-workbench-actions > button,\n.zenfg-inspector-graph-toolbar button,\n.zenfg-inspector-group-toggle,\n.zenfg-inspector-inspector-close {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 6px;\n\theight: 28px;\n\tmin-height: 28px;\n\tpadding: 0 9px;\n\tborder: 1px solid var(--fgd-border);\n\tborder-radius: 5px;\n\tcolor: var(--fgd-text-secondary);\n\tbackground: var(--fgd-surface);\n\tfont: 600 11px/1 var(--fgd-font-ui);\n\twhite-space: nowrap;\n\tcursor: pointer;\n\ttransition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;\n}\n\n.zenfg-inspector-workbench-actions > button:hover:not(:disabled),\n.zenfg-inspector-graph-toolbar button:hover:not(:disabled),\n.zenfg-inspector-group-toggle:hover:not(:disabled),\n.zenfg-inspector-inspector-close:hover:not(:disabled) {\n\tborder-color: var(--fgd-border-strong);\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-surface-hover);\n}\n\n.zenfg-inspector-workbench-actions > button[data-tone='accent'] {\n\tborder-color: rgba(56, 189, 248, 0.5);\n\tcolor: #bae6fd;\n\tbackground: var(--fgd-accent-soft);\n}\n.zenfg-inspector-workbench-actions > button[data-tone='accent']:hover:not(:disabled) {\n\tborder-color: var(--fgd-accent);\n\tbackground: var(--fgd-accent-hover);\n}\n.zenfg-inspector-workbench-actions > button[data-tone='pending'] {\n\tborder-color: rgba(56, 189, 248, 0.42);\n\tcolor: var(--fgd-text-secondary);\n\tbackground: var(--fgd-accent-soft);\n}\n.zenfg-inspector-workbench-actions > button[data-tone='success'] {\n\tborder-color: rgba(52, 211, 153, 0.46);\n\tcolor: var(--fgd-success);\n\tbackground: rgba(52, 211, 153, 0.1);\n}\n.zenfg-inspector-workbench-actions > button:disabled { cursor: default; opacity: 0.46; }\n.zenfg-inspector-workbench-actions > button[aria-busy='true']:disabled { opacity: 0.72; }\n\n.zenfg-inspector-command-status {\n\tmax-width: 220px;\n\toverflow: hidden;\n\tcolor: var(--fgd-muted);\n\tfont: 11px/1.35 var(--fgd-font-ui);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-command-status[data-tone='error'] { color: var(--fgd-danger); }\n\n.zenfg-inspector-control-icon[data-icon='spinner'],\nbutton[aria-busy='true'] > .zenfg-inspector-control-icon {\n\tanimation: zenfg-inspector-spin 800ms linear infinite;\n}\n@keyframes zenfg-inspector-spin { to { transform: rotate(360deg); } }\n\n.zenfg-inspector-workbench-tabs > button:focus-visible,\n.zenfg-inspector-subtabs > button:focus-visible,\n.zenfg-inspector-inspector-tabs > button:focus-visible,\n.zenfg-inspector-workbench-actions > button:focus-visible,\n.zenfg-inspector-graph-toolbar button:focus-visible,\n.zenfg-inspector-group-toggle:focus-visible,\n.zenfg-inspector-inspector-close:focus-visible,\n.zenfg-inspector-relation-button:focus-visible,\n.zenfg-inspector-view-toolbar input:focus-visible,\n.zenfg-inspector-view-toolbar select:focus-visible {\n\toutline: 2px solid var(--fgd-accent);\n\toutline-offset: 1px;\n}\n\n/* Workspace and empty states */\n.zenfg-inspector-overview-view {\n\tpadding: 12px;\n\toverflow: auto;\n\tbackground: var(--fgd-canvas);\n}\n\n.zenfg-inspector-workspace {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1fr);\n\tgap: 8px;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n}\n.zenfg-inspector-workspace.inspector-open {\n\tgrid-template-columns: minmax(0, 1fr) minmax(360px, 28vw);\n}\n\n.zenfg-inspector-main {\n\tdisplay: grid;\n\tgrid-template: minmax(0, 1fr) / minmax(0, 1fr);\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n}\n\n.zenfg-inspector-workbench-empty {\n\tgrid-area: 1 / 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 8px;\n\tmin-width: 0;\n\tmin-height: 0;\n\tpadding: 24px;\n\tcolor: var(--fgd-muted);\n\tfont: 12px/1.5 var(--fgd-font-ui);\n\ttext-align: center;\n}\n.zenfg-inspector-workbench-empty > .zenfg-inspector-control-icon {\n\twidth: 22px;\n\theight: 22px;\n\tcolor: var(--fgd-text-secondary);\n}\n.zenfg-inspector-workbench-empty[data-state='error'] > .zenfg-inspector-control-icon { color: var(--fgd-danger); }\n.zenfg-inspector-workbench-empty[data-state='capturing'] > .zenfg-inspector-control-icon { color: var(--fgd-accent); }\n.zenfg-inspector-empty-message { max-width: 520px; }\n.zenfg-inspector-empty-detail { color: color-mix(in srgb, var(--fgd-muted) 78%, transparent); font-size: 11px; }\n\n.zenfg-inspector-view {\n\tgrid-area: 1 / 1;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-canvas);\n}\n\n.zenfg-inspector-view-toolbar {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 6px 8px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n\n.zenfg-inspector-view-toolbar input,\n.zenfg-inspector-view-toolbar select {\n\tmin-width: 0;\n\theight: 28px;\n\tpadding: 4px 8px;\n\tborder: 1px solid var(--fgd-border);\n\tborder-radius: 5px;\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-panel);\n\tfont: 11px/1 var(--fgd-font-ui);\n}\n.zenfg-inspector-view-toolbar input { flex: 1 1 210px; }\n.zenfg-inspector-view-toolbar input::placeholder { color: var(--fgd-muted); opacity: 0.86; }\n.zenfg-inspector-view-toolbar select { flex: 0 1 auto; color-scheme: dark; }\n\n.zenfg-inspector-passes-view,\n.zenfg-inspector-resources-view { display: flex; flex-direction: column; }\n.zenfg-inspector-subtabs,\n.zenfg-inspector-inspector-tabs {\n\tflex: 0 0 auto;\n\tpadding: 0 4px;\n\tbackground: var(--fgd-panel);\n}\n.zenfg-inspector-subview { flex: 1 1 auto; min-height: 0; overflow: hidden; }\n\n/* Tables and relations */\n.zenfg-inspector-table-scroller {\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\toverflow: auto;\n}\n.zenfg-inspector-workbench-table {\n\twidth: 100%;\n\tmin-width: 720px;\n\tborder-collapse: collapse;\n\tfont: 11px/1.45 var(--fgd-font-mono);\n}\n.zenfg-inspector-workbench-table th,\n.zenfg-inspector-workbench-table td {\n\theight: 30px;\n\tmax-width: 360px;\n\tpadding: 6px 10px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\toverflow: hidden;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-workbench-table th {\n\tposition: sticky;\n\tz-index: 2;\n\ttop: 0;\n\tcolor: var(--fgd-muted);\n\tbackground: var(--fgd-panel);\n\tfont: 650 10px/1.3 var(--fgd-font-ui);\n\tletter-spacing: 0.025em;\n}\n.zenfg-inspector-workbench-table [data-column='numeric'] {\n\tfont-variant-numeric: tabular-nums;\n\ttext-align: right;\n}\n.zenfg-inspector-workbench-table [data-column='code'] { font-family: var(--fgd-font-mono); }\n.zenfg-inspector-workbench-table tbody tr:hover td { background: rgba(180, 190, 202, 0.045); }\n\n.zenfg-inspector-workbench-table tr.selected td,\n.zenfg-inspector-diagnostic-list .selected,\n.zenfg-inspector-memory-allocation.selected,\n.zenfg-inspector-memory-resource.selected { background: var(--fgd-accent-soft); }\n.zenfg-inspector-workbench-table tr.selected td:first-child { box-shadow: inset 2px 0 var(--fgd-accent); }\n\n.zenfg-inspector-workbench-table td small {\n\tdisplay: block;\n\tmargin-top: 2px;\n\toverflow: hidden;\n\tcolor: var(--fgd-muted);\n\tfont: 10px/1.4 var(--fgd-font-ui);\n\ttext-overflow: ellipsis;\n}\n\n.zenfg-inspector-kind-label {\n\t--fgd-kind-color: var(--fgd-muted);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmax-width: 100%;\n\toverflow: hidden;\n\tcolor: var(--fgd-text-secondary);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-kind-label::before {\n\twidth: 6px;\n\theight: 6px;\n\tflex: 0 0 auto;\n\tborder: 1px solid color-mix(in srgb, var(--fgd-kind-color) 78%, white);\n\tborder-radius: 50%;\n\tbackground: color-mix(in srgb, var(--fgd-kind-color) 72%, transparent);\n\tcontent: '';\n}\n.zenfg-inspector-kind-label[data-kind='render'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.render.stroke}; }\n.zenfg-inspector-kind-label[data-kind='compute'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.compute.stroke}; }\n.zenfg-inspector-kind-label[data-kind='copy'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.copy.stroke}; }\n.zenfg-inspector-kind-label[data-kind='clear-buffer'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.clear.stroke}; }\n.zenfg-inspector-kind-label[data-kind='command'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.command.stroke}; }\n.zenfg-inspector-kind-label[data-kind='external-submission'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.external.stroke}; }\n.zenfg-inspector-kind-label[data-kind='opaque'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.external.stroke}; }\n.zenfg-inspector-kind-label[data-kind='texture'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.texture.stroke}; }\n.zenfg-inspector-kind-label[data-kind='buffer'] { --fgd-kind-color: ${GRAPH_VISUAL_THEME.buffer.stroke}; }\n.zenfg-inspector-kind-label[data-kind='frame-graph'] { --fgd-kind-color: var(--fgd-accent); }\n.zenfg-inspector-kind-label[data-kind='timed'] { --fgd-kind-color: var(--fgd-success); }\n.zenfg-inspector-kind-label[data-kind='not-timed'] { --fgd-kind-color: var(--fgd-muted); }\n\n.zenfg-inspector-relation-button {\n\tmax-width: 100%;\n\tpadding: 0;\n\tborder: 0;\n\tcolor: #a5def6;\n\tbackground: transparent;\n\tfont: inherit;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.zenfg-inspector-relation-button:hover {\n\tcolor: #d5f3ff;\n\ttext-decoration: underline;\n\ttext-underline-offset: 2px;\n}\n.zenfg-inspector-group-toggle { width: 28px; padding: 0; color: var(--fgd-text-secondary); }\n.zenfg-inspector-empty-row {\n\theight: 60px !important;\n\tcolor: var(--fgd-muted);\n\tfont-family: var(--fgd-font-ui);\n\ttext-align: center !important;\n}\n\n/* Graph */\n.zenfg-inspector-graph-view { display: flex; flex-direction: column; }\n.zenfg-inspector-graph-toolbar {\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\talign-items: center;\n\tgap: 10px;\n\tmin-width: 0;\n\tmin-height: 38px;\n\tpadding: 5px 6px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-graph-mode-controls,\n.zenfg-inspector-graph-action-controls { display: flex; align-items: center; min-width: 0; }\n.zenfg-inspector-graph-action-controls { gap: 4px; }\n.zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button {\n\tmargin-right: -1px;\n\tborder-radius: 0;\n}\n.zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button:first-child { border-radius: 5px 0 0 5px; }\n.zenfg-inspector-graph-toolbar .zenfg-inspector-mode-button:last-child {\n\tmargin-right: 0;\n\tborder-radius: 0 5px 5px 0;\n}\n.zenfg-inspector-graph-toolbar button.active,\n.zenfg-inspector-graph-toolbar button[aria-pressed='true'] {\n\tz-index: 1;\n\tborder-color: rgba(56, 189, 248, 0.6);\n\tcolor: var(--fgd-accent);\n\tbackground: var(--fgd-accent-soft);\n}\n.zenfg-inspector-graph-toolbar button:disabled { cursor: default; opacity: 0.42; }\n.zenfg-inspector-graph-toolbar .zenfg-inspector-icon-button { width: 28px; padding: 0; }\n\n.zenfg-inspector-graph-legend {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tmin-width: 0;\n\tpadding: 2px 0;\n\toverflow-x: auto;\n\tcolor: var(--fgd-muted);\n\tfont: 10px/1 var(--fgd-font-ui);\n\twhite-space: nowrap;\n}\n.zenfg-inspector-legend-item { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; }\n.zenfg-inspector-legend-swatch {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 8px;\n\tborder: 1px solid var(--zenfg-inspector-legend-color);\n\tborder-radius: 2px;\n\tbackground: color-mix(in srgb, var(--zenfg-inspector-legend-color) 20%, var(--fgd-canvas));\n}\n.zenfg-inspector-legend-swatch[data-shape='ellipse'] { border-radius: 50%; }\n.zenfg-inspector-legend-swatch[data-shape='group'] { border-style: double; background: transparent; }\n.zenfg-inspector-legend-swatch[data-shape='line'] {\n\twidth: 16px;\n\theight: 0;\n\tborder: 0;\n\tborder-top: 1px solid var(--zenfg-inspector-legend-color);\n\tborder-radius: 0;\n\tbackground: transparent;\n}\n.zenfg-inspector-legend-swatch[data-shape='line'][data-line-style='dotted'] { border-top-style: dotted; }\n.zenfg-inspector-legend-swatch[data-shape='line'][data-line-style='dashed'] { border-top-style: dashed; }\n.zenfg-inspector-legend-swatch:not([data-shape='line'])[data-line-style='dashed'] { border-style: dashed; }\n.zenfg-inspector-legend-swatch[data-shape='line']::after {\n\tposition: absolute;\n\ttop: -2px;\n\tright: -1px;\n\twidth: 5px;\n\theight: 4px;\n\tbackground: var(--zenfg-inspector-legend-color);\n\tclip-path: polygon(0 0, 100% 50%, 0 100%);\n\tcontent: '';\n}\n.zenfg-inspector-legend-swatch[data-shape='line'][data-hollow-arrow='true']::after {\n\ttop: -3px;\n\twidth: 4px;\n\theight: 4px;\n\tborder-top: 1px solid var(--zenfg-inspector-legend-color);\n\tborder-right: 1px solid var(--zenfg-inspector-legend-color);\n\tbackground: transparent;\n\tclip-path: none;\n\ttransform: rotate(45deg);\n}\n\n.zenfg-inspector-graph-view .zenfg-inspector-graph {\n\tflex: 1 1 auto;\n\twidth: 100%;\n\theight: auto;\n\tmin-height: 0;\n\tborder: 0;\n}\n.zenfg-inspector-graph {\n\tposition: relative;\n\twidth: 100%;\n\theight: 260px;\n\tmin-height: 220px;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-canvas);\n\tcolor: var(--fgd-muted);\n\tfont-size: 11px;\n}\n.zenfg-inspector-graph-canvas {\n\twidth: 100%;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n\toutline: none;\n}\n.zenfg-inspector-graph-status {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 2;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: 8px;\n\tpadding: 16px;\n\tcolor: var(--fgd-muted);\n\tbackground: rgba(11, 15, 20, 0.82);\n\tfont: 12px/1.45 var(--fgd-font-ui);\n\ttext-align: center;\n\tpointer-events: none;\n}\n.zenfg-inspector-graph-status[data-state='layout'] { background: rgba(11, 15, 20, 0.5); }\n.zenfg-inspector-graph-status[data-state='error'] {\n\tcolor: var(--fgd-text);\n\tbackground: rgba(11, 15, 20, 0.94);\n}\n.zenfg-inspector-graph-status > span { max-width: min(560px, 80%); }\n.zenfg-inspector-graph-status button {\n\theight: 28px;\n\tpadding: 0 9px;\n\tborder: 1px solid rgba(56, 189, 248, 0.55);\n\tborder-radius: 5px;\n\tcolor: var(--fgd-accent);\n\tbackground: var(--fgd-accent-soft);\n\tfont: 600 11px/1 var(--fgd-font-ui);\n\tcursor: pointer;\n\tpointer-events: auto;\n}\n.zenfg-inspector-graph-tooltip {\n\tposition: absolute;\n\tz-index: 3;\n\tmax-width: min(380px, calc(100% - 16px));\n\tpadding: 8px 10px;\n\tborder: 1px solid var(--fgd-border-strong);\n\tborder-radius: 6px;\n\tcolor: var(--fgd-text);\n\tbackground: var(--fgd-surface-raised);\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.42);\n\tfont: 11px/1.5 var(--fgd-font-mono);\n\twhite-space: pre-wrap;\n\tpointer-events: none;\n}\n\n/* Inspector */\n.zenfg-inspector-inspector {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface-raised);\n\tbox-shadow: -8px 0 28px rgba(0, 0, 0, 0.2);\n}\n.zenfg-inspector-inspector[hidden] { display: none; }\n.zenfg-inspector-inspector > header {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmin-height: 36px;\n\tpadding: 0 8px 0 10px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-inspector > header strong {\n\tmin-width: 0;\n\toverflow: hidden;\n\tfont: 600 11px/1.3 var(--fgd-font-mono);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-inspector-close {\n\twidth: 28px;\n\tpadding: 0;\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n.zenfg-inspector-inspector-content {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n\tpadding: 10px;\n\toverflow: auto;\n}\n.zenfg-inspector-inspector-summary {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(96px, auto) minmax(0, 1fr);\n\tgap: 3px 12px;\n\tmargin: 0;\n\tfont-size: 11px;\n\tline-height: 1.6;\n}\n.zenfg-inspector-inspector-summary dt { color: var(--fgd-muted); font-family: var(--fgd-font-ui); }\n.zenfg-inspector-inspector-summary dd {\n\tmin-width: 0;\n\tmargin: 0;\n\tcolor: var(--fgd-text);\n\tfont-family: var(--fgd-font-mono);\n\toverflow-wrap: anywhere;\n}\n.zenfg-inspector-inspector-relations { display: grid; gap: 8px; }\n.zenfg-inspector-inspector-relations section {\n\tdisplay: grid;\n\tgap: 6px;\n\tpadding: 8px;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 5px;\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-inspector-relations h3 {\n\tmargin: 0 0 2px;\n\tcolor: var(--fgd-muted);\n\tfont: 700 10px/1.3 var(--fgd-font-ui);\n\tletter-spacing: 0.055em;\n\ttext-transform: uppercase;\n}\n.zenfg-inspector-inspector-relations .zenfg-inspector-relation-button {\n\tfont: 11px/1.5 var(--fgd-font-mono);\n\toverflow-wrap: anywhere;\n\twhite-space: normal;\n}\n.zenfg-inspector-inspector .zenfg-inspector-raw-detail {\n\tmin-width: 100%;\n\tmargin: 0;\n\toverflow: auto;\n\tcolor: var(--fgd-text-secondary);\n\tfont: 11px/1.55 var(--fgd-font-mono);\n\twhite-space: pre;\n}\n\n/* Memory */\n.zenfg-inspector-memory-view {\n\tdisplay: grid;\n\tgrid-template-rows: auto minmax(0, 1fr);\n}\n.zenfg-inspector-memory-summary {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, minmax(0, 1fr));\n\tgap: 6px;\n\tpadding: 6px;\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-panel);\n}\n.zenfg-inspector-memory-summary > div {\n\tdisplay: grid;\n\tgap: 3px;\n\tmin-width: 0;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 5px;\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-memory-summary span { color: var(--fgd-muted); font: 10px/1.3 var(--fgd-font-ui); }\n.zenfg-inspector-memory-summary strong {\n\toverflow: hidden;\n\tfont: 600 11px/1.35 var(--fgd-font-mono);\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.zenfg-inspector-memory-scroller { min-height: 0; overflow: auto; }\n.zenfg-inspector-memory-timeline {\n\tdisplay: grid;\n\tmin-width: 760px;\n\tpadding: 8px;\n\tfont: 11px/1.4 var(--fgd-font-mono);\n}\n.zenfg-inspector-memory-axis,\n.zenfg-inspector-memory-resource {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(150px, 0.9fr) 72px minmax(320px, 2.4fr) 82px;\n\tgap: 10px;\n\talign-items: center;\n\tmin-height: 30px;\n}\n.zenfg-inspector-memory-axis {\n\tposition: sticky;\n\tz-index: 2;\n\ttop: 0;\n\tpadding: 0 8px 6px;\n\tcolor: var(--fgd-muted);\n\tbackground: var(--fgd-canvas);\n\tfont: 10px/1.3 var(--fgd-font-ui);\n}\n.zenfg-inspector-memory-axis-track,\n.zenfg-inspector-memory-track { position: relative; height: 16px; }\n.zenfg-inspector-memory-axis-track { border-bottom: 1px solid var(--fgd-border-strong); }\n.zenfg-inspector-memory-axis-track > span {\n\tposition: absolute;\n\tbottom: -1px;\n\tpadding-bottom: 5px;\n\tborder-left: 1px solid var(--fgd-border-strong);\n\tfont: 10px/1 var(--fgd-font-mono);\n\ttransform: translateX(-1px);\n}\n.zenfg-inspector-memory-allocation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tmargin-top: 6px;\n\tpadding: 7px 8px;\n\tborder-top: 1px solid var(--fgd-border-subtle);\n\tborder-bottom: 1px solid var(--fgd-border-subtle);\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-memory-allocation > span { color: var(--fgd-muted); font: 10px/1.35 var(--fgd-font-mono); }\n.zenfg-inspector-memory-allocation.muted { color: var(--fgd-muted); font-family: var(--fgd-font-ui); }\n.zenfg-inspector-memory-resource { padding: 0 8px; border-bottom: 1px solid var(--fgd-border-subtle); }\n.zenfg-inspector-memory-resource.selected,\n.zenfg-inspector-memory-allocation.selected { box-shadow: inset 2px 0 var(--fgd-accent); }\n.zenfg-inspector-memory-bar {\n\tposition: absolute;\n\ttop: 4px;\n\theight: 8px;\n\tmin-width: 2px;\n\tborder-radius: 4px;\n\tbackground: color-mix(in srgb, ${GRAPH_VISUAL_THEME.texture.stroke} 76%, transparent);\n\tbox-shadow: 0 0 0 1px color-mix(in srgb, ${GRAPH_VISUAL_THEME.texture.stroke} 36%, transparent);\n}\n.zenfg-inspector-memory-bar.buffer {\n\tbackground: color-mix(in srgb, ${GRAPH_VISUAL_THEME.buffer.stroke} 72%, transparent);\n\tbox-shadow: 0 0 0 1px color-mix(in srgb, ${GRAPH_VISUAL_THEME.buffer.stroke} 34%, transparent);\n}\n.zenfg-inspector-memory-bar.empty { display: none; }\n\n/* Diagnostics */\n.zenfg-inspector-diagnostics-scroller { width: 100%; height: 100%; overflow: auto; }\n.zenfg-inspector-diagnostics-grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: 8px;\n\tpadding: 8px;\n}\n.zenfg-inspector-diagnostic-card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 0;\n\tmin-height: 164px;\n\toverflow: hidden;\n\tborder: 1px solid var(--fgd-border-subtle);\n\tborder-radius: 6px;\n\tbackground: var(--fgd-surface);\n}\n.zenfg-inspector-diagnostic-card > h2 {\n\tmargin: 0;\n\tpadding: 9px 10px 3px;\n\tcolor: var(--fgd-text-secondary);\n\tfont: 650 12px/1.35 var(--fgd-font-ui);\n}\n.zenfg-inspector-diagnostic-card > p {\n\tmargin: 0;\n\tpadding: 0 10px 8px;\n\tcolor: var(--fgd-muted);\n\tfont: 11px/1.5 var(--fgd-font-ui);\n}\n.zenfg-inspector-diagnostic-card .zenfg-inspector-table-scroller { flex: 1 1 auto; max-height: 280px; }\n.zenfg-inspector-diagnostic-card .zenfg-inspector-workbench-table { min-width: 100%; table-layout: fixed; }\n.zenfg-inspector-diagnostic-card .zenfg-inspector-workbench-table td {\n\toverflow-wrap: anywhere;\n\twhite-space: normal;\n}\n.zenfg-inspector-diagnostic-list { display: grid; gap: 2px; padding: 6px; overflow: auto; }\n.zenfg-inspector-diagnostic-list .zenfg-inspector-relation-button {\n\tpadding: 6px 8px;\n\tborder-radius: 4px;\n\tcolor: var(--fgd-text-secondary);\n\tfont: 11px/1.45 var(--fgd-font-mono);\n}\n.zenfg-inspector-diagnostic-list .zenfg-inspector-relation-button:hover {\n\tbackground: rgba(180, 190, 202, 0.05);\n\ttext-decoration: none;\n}\n.zenfg-inspector-diagnostic-list .selected { box-shadow: inset 2px 0 var(--fgd-accent); }\n\n/* Responsive */\n@container zenfg-inspector (max-width: 960px) {\n\t.zenfg-inspector-workspace.inspector-open { grid-template-columns: minmax(0, 1fr); }\n\t.zenfg-inspector-workspace.inspector-open::after {\n\t\tposition: absolute;\n\t\tz-index: 10;\n\t\tinset: 0;\n\t\tbackground: rgba(3, 7, 12, 0.38);\n\t\tcontent: '';\n\t\tpointer-events: none;\n\t}\n\t.zenfg-inspector-inspector {\n\t\tposition: absolute;\n\t\tz-index: 20;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\twidth: min(380px, calc(100% - 24px));\n\t\tbox-shadow: -18px 0 42px rgba(0, 0, 0, 0.42);\n\t}\n\t.zenfg-inspector-graph-toolbar {\n\t\tgrid-template-columns: minmax(0, 1fr) auto;\n\t\tgap: 6px 8px;\n\t}\n\t.zenfg-inspector-graph-legend {\n\t\tgrid-column: 1 / -1;\n\t\tgrid-row: 2;\n\t\tpadding-top: 6px;\n\t\tborder-top: 1px solid var(--fgd-border-subtle);\n\t}\n\t.zenfg-inspector-graph-action-controls { justify-self: end; }\n}\n\n@container zenfg-inspector (max-width: 840px) {\n\t.zenfg-inspector-workbench-command-bar {\n\t\tgrid-template-columns: minmax(0, 1fr) auto;\n\t}\n\t.zenfg-inspector-brand { grid-column: 1; grid-row: 1; min-height: 36px; display: flex; align-items: center; }\n\t.zenfg-inspector-brand::after { display: none; }\n\t.zenfg-inspector-workbench-actions { grid-column: 2; grid-row: 1; }\n\t.zenfg-inspector-workbench-tabs { grid-column: 1 / -1; grid-row: 2; }\n\t.zenfg-inspector-workbench-command-bar.branding-hidden .zenfg-inspector-workbench-tabs {\n\t\tgrid-column: 1;\n\t\tgrid-row: 1;\n\t}\n\t.zenfg-inspector-diagnostics-grid { grid-template-columns: minmax(0, 1fr); }\n}\n\n@container zenfg-inspector (max-width: 720px) {\n\t.zenfg-inspector-body { padding: 8px; }\n\t.zenfg-inspector-overview-view { padding: 8px; }\n\t.zenfg-inspector-capture-summary > section { padding: 10px; }\n\t.zenfg-inspector-workbench-actions { padding-left: 6px; }\n\t.zenfg-inspector-command-status { max-width: 104px; }\n\t.zenfg-inspector-workbench-tabs > button { flex: 0 0 auto; padding-inline: 8px; }\n\t.zenfg-inspector-memory-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n\t.zenfg-inspector-view-toolbar input { flex-basis: 100%; }\n\t.zenfg-inspector-graph-toolbar { display: flex; flex-wrap: wrap; }\n\t.zenfg-inspector-graph-legend { order: 3; flex-basis: 100%; }\n\t.zenfg-inspector-graph-action-controls { margin-left: auto; }\n\t.zenfg-inspector-graph-view .zenfg-inspector-graph { height: auto; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.zenfg-inspector *,\n\t.zenfg-inspector *::before,\n\t.zenfg-inspector *::after {\n\t\tscroll-behavior: auto !important;\n\t\ttransition-duration: 0.01ms !important;\n\t\tanimation-duration: 0.01ms !important;\n\t\tanimation-iteration-count: 1 !important;\n\t}\n}\n`;\n\n/**\n * Installs the inspector's shared stylesheet in the current document once.\n *\n * @remarks This is safe to call repeatedly and is a no-op during server-side\n * rendering. `FrameGraphInspector` calls it automatically.\n */\nexport function ensureFrameGraphInspectorStyles(): void {\n\tif (typeof document === 'undefined' || document.getElementById(STYLE_ELEMENT_ID)) {\n\t\treturn;\n\t}\n\n\tconst style = document.createElement('style');\n\tstyle.id = STYLE_ELEMENT_ID;\n\tstyle.textContent = FRAME_GRAPH_DEBUG_PANEL_CSS;\n\tdocument.head.appendChild(style);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenfg/inspector",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.2",
|
|
4
4
|
"description": "Embeddable Inspector for ZenFG Snapshot files and live captures",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"files": ["dist", "src", "README.md", "LICENSE"],
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@zenfg/snapshot": "0.1.0-beta.
|
|
11
|
+
"@zenfg/snapshot": "0.1.0-beta.2",
|
|
12
12
|
"cytoscape": "^3.34.1",
|
|
13
13
|
"elkjs": "^0.12.0"
|
|
14
14
|
},
|
package/src/panelIcons.ts
CHANGED
|
@@ -3,6 +3,7 @@ export type PanelIconName =
|
|
|
3
3
|
| 'check'
|
|
4
4
|
| 'close'
|
|
5
5
|
| 'copy'
|
|
6
|
+
| 'download'
|
|
6
7
|
| 'empty'
|
|
7
8
|
| 'error'
|
|
8
9
|
| 'fit'
|
|
@@ -21,6 +22,7 @@ const ICON_PATHS: Record<PanelIconName, readonly string[]> = {
|
|
|
21
22
|
check: ['M3 8.2 6.3 11.5 13 4.8'],
|
|
22
23
|
close: ['M4 4l8 8', 'M12 4l-8 8'],
|
|
23
24
|
copy: ['M5.5 4h7.5v9H5.5z', 'M3 11V2.5h7.5'],
|
|
25
|
+
download: ['M8 2.5v7', 'M5.5 7.5 8 10l2.5-2.5', 'M3 12.5h10'],
|
|
24
26
|
empty: ['M3 3h10v10H3z', 'M5.5 8h5'],
|
|
25
27
|
error: ['M8 2.5l5.5 10H2.5z', 'M8 6v3', 'M8 11.2v.1'],
|
|
26
28
|
fit: ['M6 2.5H2.5V6', 'M10 2.5h3.5V6', 'M6 13.5H2.5V10', 'M10 13.5h3.5V10'],
|
|
@@ -173,7 +173,8 @@ export class FrameGraphDebugWorkbench {
|
|
|
173
173
|
this.exportMenu.setAttribute('role', 'menu');
|
|
174
174
|
this.exportMenu.hidden = true;
|
|
175
175
|
this.downloadButton.type = 'button';
|
|
176
|
-
this.downloadButton.
|
|
176
|
+
this.downloadButton.className = 'zenfg-inspector-download-action';
|
|
177
|
+
setPanelButtonContent(this.downloadButton, 'download', 'Download JSON');
|
|
177
178
|
this.downloadButton.setAttribute('role', 'menuitem');
|
|
178
179
|
this.downloadButton.addEventListener('click', () => {
|
|
179
180
|
this.setExportMenuOpen(false);
|
package/src/styles.ts
CHANGED
|
@@ -281,6 +281,9 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
|
|
|
281
281
|
}
|
|
282
282
|
.zenfg-inspector-export-menu[hidden] { display: none; }
|
|
283
283
|
.zenfg-inspector-export-menu > button {
|
|
284
|
+
display: flex;
|
|
285
|
+
align-items: center;
|
|
286
|
+
gap: 7px;
|
|
284
287
|
padding: 7px 9px;
|
|
285
288
|
border: 0;
|
|
286
289
|
border-radius: 4px;
|
|
@@ -288,6 +291,7 @@ const FRAME_GRAPH_DEBUG_PANEL_CSS = `
|
|
|
288
291
|
background: transparent;
|
|
289
292
|
font: 600 11px/1.2 var(--fgd-font-ui);
|
|
290
293
|
text-align: left;
|
|
294
|
+
white-space: nowrap;
|
|
291
295
|
cursor: pointer;
|
|
292
296
|
}
|
|
293
297
|
.zenfg-inspector-export-menu > button:hover:not(:disabled) {
|