@zenfg/inspector 0.1.0-beta.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/GUIDE.md +182 -0
- package/README.md +61 -89
- package/THEMING.md +124 -0
- package/dist/FrameGraphInspector.d.ts +23 -4
- package/dist/FrameGraphInspector.d.ts.map +1 -1
- package/dist/FrameGraphInspector.js +137 -29
- package/dist/FrameGraphInspector.js.map +1 -1
- package/dist/capture.d.ts +5 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +2 -0
- package/dist/capture.js.map +1 -0
- package/dist/debugCaptureModel.d.ts +19 -0
- package/dist/debugCaptureModel.d.ts.map +1 -1
- package/dist/debugCaptureModel.js +36 -2
- package/dist/debugCaptureModel.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/panelAliasAnalysis.d.ts +1 -0
- package/dist/panelAliasAnalysis.d.ts.map +1 -1
- package/dist/panelAliasAnalysis.js +23 -54
- package/dist/panelAliasAnalysis.js.map +1 -1
- package/dist/panelCytoscapeGraphRenderer.d.ts +15 -2
- package/dist/panelCytoscapeGraphRenderer.d.ts.map +1 -1
- package/dist/panelCytoscapeGraphRenderer.js +145 -23
- package/dist/panelCytoscapeGraphRenderer.js.map +1 -1
- package/dist/panelDetailLayout.d.ts +27 -0
- package/dist/panelDetailLayout.d.ts.map +1 -0
- package/dist/panelDetailLayout.js +174 -0
- package/dist/panelDetailLayout.js.map +1 -0
- package/dist/panelDetailStyles.d.ts +2 -0
- package/dist/panelDetailStyles.d.ts.map +1 -0
- package/dist/panelDetailStyles.js +57 -0
- package/dist/panelDetailStyles.js.map +1 -0
- package/dist/panelDiagnosticsView.d.ts +10 -1
- package/dist/panelDiagnosticsView.d.ts.map +1 -1
- package/dist/panelDiagnosticsView.js +166 -57
- package/dist/panelDiagnosticsView.js.map +1 -1
- package/dist/panelDomHelpers.d.ts.map +1 -1
- package/dist/panelDomHelpers.js +6 -5
- package/dist/panelDomHelpers.js.map +1 -1
- package/dist/panelGraphLayout.d.ts +3 -2
- package/dist/panelGraphLayout.d.ts.map +1 -1
- package/dist/panelGraphLayout.js +6 -5
- package/dist/panelGraphLayout.js.map +1 -1
- package/dist/panelGraphRenderer.d.ts +10 -0
- package/dist/panelGraphRenderer.d.ts.map +1 -1
- package/dist/panelGraphRenderer.js.map +1 -1
- package/dist/panelGraphScene.d.ts +1 -0
- package/dist/panelGraphScene.d.ts.map +1 -1
- package/dist/panelGraphScene.js +69 -32
- package/dist/panelGraphScene.js.map +1 -1
- package/dist/panelGraphSearch.d.ts +16 -0
- package/dist/panelGraphSearch.d.ts.map +1 -0
- package/dist/panelGraphSearch.js +93 -0
- package/dist/panelGraphSearch.js.map +1 -0
- package/dist/panelGraphView.d.ts +82 -0
- package/dist/panelGraphView.d.ts.map +1 -1
- package/dist/panelGraphView.js +15 -4
- package/dist/panelGraphView.js.map +1 -1
- package/dist/panelGraphVisuals.d.ts +14 -6
- package/dist/panelGraphVisuals.d.ts.map +1 -1
- package/dist/panelGraphVisuals.js +126 -51
- package/dist/panelGraphVisuals.js.map +1 -1
- package/dist/panelInspectorView.d.ts +8 -0
- package/dist/panelInspectorView.d.ts.map +1 -1
- package/dist/panelInspectorView.js +242 -48
- package/dist/panelInspectorView.js.map +1 -1
- package/dist/panelListStyles.d.ts +3 -0
- package/dist/panelListStyles.d.ts.map +1 -0
- package/dist/panelListStyles.js +155 -0
- package/dist/panelListStyles.js.map +1 -0
- package/dist/panelMemoryStyles.d.ts +3 -0
- package/dist/panelMemoryStyles.d.ts.map +1 -0
- package/dist/panelMemoryStyles.js +42 -0
- package/dist/panelMemoryStyles.js.map +1 -0
- package/dist/panelMemoryView.d.ts +13 -1
- package/dist/panelMemoryView.d.ts.map +1 -1
- package/dist/panelMemoryView.js +161 -41
- package/dist/panelMemoryView.js.map +1 -1
- package/dist/panelPassesView.d.ts +15 -0
- package/dist/panelPassesView.d.ts.map +1 -1
- package/dist/panelPassesView.js +202 -72
- package/dist/panelPassesView.js.map +1 -1
- package/dist/panelRawView.d.ts +15 -0
- package/dist/panelRawView.d.ts.map +1 -0
- package/dist/panelRawView.js +105 -0
- package/dist/panelRawView.js.map +1 -0
- package/dist/panelResourcesView.d.ts +8 -0
- package/dist/panelResourcesView.d.ts.map +1 -1
- package/dist/panelResourcesView.js +62 -31
- package/dist/panelResourcesView.js.map +1 -1
- package/dist/panelSelection.d.ts +9 -1
- package/dist/panelSelection.d.ts.map +1 -1
- package/dist/panelSelection.js +34 -4
- package/dist/panelSelection.js.map +1 -1
- package/dist/panelTheme.d.ts +13 -0
- package/dist/panelTheme.d.ts.map +1 -0
- package/dist/panelTheme.js +104 -0
- package/dist/panelTheme.js.map +1 -0
- package/dist/panelTypes.d.ts +10 -1
- package/dist/panelTypes.d.ts.map +1 -1
- package/dist/panelTypes.js.map +1 -1
- package/dist/panelVisualTheme.d.ts +147 -50
- package/dist/panelVisualTheme.d.ts.map +1 -1
- package/dist/panelVisualTheme.js +34 -44
- package/dist/panelVisualTheme.js.map +1 -1
- package/dist/panelWorkbenchHelpers.d.ts +12 -1
- package/dist/panelWorkbenchHelpers.d.ts.map +1 -1
- package/dist/panelWorkbenchHelpers.js +62 -1
- package/dist/panelWorkbenchHelpers.js.map +1 -1
- package/dist/panelWorkbenchStyles.d.ts +2 -0
- package/dist/panelWorkbenchStyles.d.ts.map +1 -0
- package/dist/panelWorkbenchStyles.js +101 -0
- package/dist/panelWorkbenchStyles.js.map +1 -0
- package/dist/panelWorkbenchView.d.ts +16 -0
- package/dist/panelWorkbenchView.d.ts.map +1 -1
- package/dist/panelWorkbenchView.js +228 -50
- package/dist/panelWorkbenchView.js.map +1 -1
- package/dist/query.js.map +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +147 -195
- package/dist/styles.js.map +1 -1
- package/dist/theme.d.ts +22 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +10 -0
- package/dist/theme.js.map +1 -0
- package/dist/themeDefinitions.d.ts +251 -0
- package/dist/themeDefinitions.d.ts.map +1 -0
- package/dist/themeDefinitions.js +96 -0
- package/dist/themeDefinitions.js.map +1 -0
- package/dist/themePalette.d.ts +66 -0
- package/dist/themePalette.d.ts.map +1 -0
- package/dist/themePalette.js +37 -0
- package/dist/themePalette.js.map +1 -0
- package/dist/themes.css +165 -0
- package/package.json +44 -10
- package/src/FrameGraphInspector.ts +130 -31
- package/src/capture.ts +4 -0
- package/src/debugCaptureModel.ts +53 -2
- package/src/index.ts +6 -2
- package/src/panelAliasAnalysis.ts +24 -70
- package/src/panelCytoscapeGraphRenderer.ts +140 -23
- package/src/panelDetailLayout.ts +155 -0
- package/src/panelDetailStyles.ts +56 -0
- package/src/panelDiagnosticsView.ts +166 -85
- package/src/panelDomHelpers.ts +4 -5
- package/src/panelGraphLayout.ts +6 -5
- package/src/panelGraphRenderer.ts +7 -0
- package/src/panelGraphScene.ts +68 -30
- package/src/panelGraphSearch.ts +96 -0
- package/src/panelGraphView.ts +14 -4
- package/src/panelGraphVisuals.ts +122 -52
- package/src/panelInspectorView.ts +227 -48
- package/src/panelListStyles.ts +154 -0
- package/src/panelMemoryStyles.ts +41 -0
- package/src/panelMemoryView.ts +178 -53
- package/src/panelPassesView.ts +190 -137
- package/src/panelRawView.ts +99 -0
- package/src/panelResourcesView.ts +69 -56
- package/src/panelSelection.ts +37 -5
- package/src/panelTheme.ts +85 -0
- package/src/panelTypes.ts +7 -1
- package/src/panelVisualTheme.ts +38 -49
- package/src/panelWorkbenchHelpers.ts +60 -2
- package/src/panelWorkbenchStyles.ts +100 -0
- package/src/panelWorkbenchView.ts +201 -52
- package/src/query.ts +11 -11
- package/src/styles.ts +148 -195
- package/src/theme.ts +24 -0
- package/src/themeDefinitions.ts +103 -0
- package/src/themePalette.ts +44 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelGraphScene.js","sourceRoot":"","sources":["../src/panelGraphScene.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n FrameGraphDebugAccessEdge,\n FrameGraphDebugEdge,\n FrameGraphDebugGroup,\n FrameGraphDebugNode,\n FrameGraphDebugResource,\n FrameGraphDebugViewModel,\n} from './debugCaptureModel.ts';\nimport { formatGpuDuration, labelNode, labelResource } from './panelDomHelpers.ts';\nimport { declarationEntrances } from './debugCaptureModel.ts';\nimport type { GraphFlowRelation, Selection } from './panelTypes.ts';\n\nexport type GraphSceneElementId = string;\n\ntype GraphSceneNodeBase = {\n readonly id: GraphSceneElementId;\n readonly label: string;\n readonly overviewLabel: string;\n readonly title: string;\n readonly parentId?: GraphSceneElementId;\n};\n\nexport type PassSceneNode = GraphSceneNodeBase & {\n readonly kind: 'pass';\n readonly nodeId: string;\n readonly passKind: FrameGraphDebugNode['kind'];\n readonly executionSegmentIndex?: number;\n readonly gpuDurationMicros?: number;\n};\n\nexport type GroupSceneNode = GraphSceneNodeBase & {\n readonly kind: 'group';\n readonly groupId: string;\n readonly groupPathKey: string;\n readonly collapsed: boolean;\n readonly depthBand: 0 | 1;\n readonly childNodeIds: readonly GraphSceneElementId[];\n readonly representedNodeIds: readonly string[];\n readonly retainedNodeCount: number;\n readonly culledNodeCount: number;\n readonly gpuWorkDurationMicros: number;\n readonly timedNodeCount: number;\n readonly timingEligibleNodeCount: number;\n};\n\nexport type ResourceSceneNode = GraphSceneNodeBase & {\n readonly kind: 'resource';\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\n\nexport type RootSceneNode = GraphSceneNodeBase & {\n readonly kind: 'root';\n readonly rootKey: string;\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\nexport type GraphSceneNode = PassSceneNode | GroupSceneNode | ResourceSceneNode | RootSceneNode;\n\ntype GraphSceneEdgeBase = {\n readonly id: GraphSceneElementId;\n readonly from: GraphSceneElementId;\n readonly to: GraphSceneElementId;\n readonly title: string;\n readonly resourceId: string;\n};\n\nexport type GraphSceneEdge = GraphSceneEdgeBase & {\n readonly kind: 'flow' | 'ordering';\n readonly relations: readonly GraphFlowRelation[];\n readonly underlyingDependencies: readonly FrameGraphDebugEdge[];\n readonly underlyingDependencyCount: number;\n};\n\nexport type GraphSemanticReferences = {\n readonly nodeIds: readonly string[];\n readonly groupPathKeys: readonly string[];\n readonly resourceIds: readonly string[];\n readonly accessIds: readonly string[];\n readonly dependencies: readonly FrameGraphDebugEdge[];\n};\n\nexport type GraphSceneInteractionIndex = {\n readonly selectionByElementId: ReadonlyMap<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly hoverElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly resourceElementIdsByResourceId: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: ReadonlyMap<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport type GraphScene = {\n readonly nodes: readonly GraphSceneNode[];\n readonly edges: readonly GraphSceneEdge[];\n readonly topologyKey: string;\n readonly contentKey: string;\n readonly interaction: GraphSceneInteractionIndex;\n};\n\nexport type CreateGraphSceneOptions = {\n readonly groupsEnabled: boolean;\n readonly expandedGroupPaths: ReadonlySet<string>;\n};\n\ntype MutableInteractionIndex = {\n readonly selectionByElementId: Map<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly hoverElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly resourceElementIdsByResourceId: Map<string, GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: Map<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport function createGraphScene(\n snapshot: FrameGraphDebugViewModel,\n options: CreateGraphSceneOptions,\n): GraphScene {\n return createFrameFlowScene(snapshot, options.groupsEnabled, options.expandedGroupPaths);\n}\n\nexport function graphGroupElementId(pathKey: string): GraphSceneElementId {\n return `group:${pathKey}`;\n}\n\nexport function selectionKey(selection: Selection): string {\n switch (selection.kind) {\n case 'node':\n return `node:${selection.id}`;\n case 'group':\n return `group:${selection.pathKey}`;\n case 'resource':\n return `resource:${selection.id}`;\n case 'allocation':\n return `allocation:${selection.id}`;\n case 'root':\n return `root:${selection.key}`;\n case 'culled':\n return `culled:${selection.index}`;\n case 'segment':\n return `segment:${selection.index}`;\n }\n}\n\nfunction createFrameFlowScene(\n snapshot: FrameGraphDebugViewModel,\n groupsEnabled: boolean,\n expandedGroupPaths: ReadonlySet<string>,\n): GraphScene {\n const interaction = createMutableInteractionIndex();\n const segmentByNodeId = executionSegmentByNodeId(snapshot);\n const groupsById = new Map(snapshot.debugGroups.map((group) => [group.id, group]));\n const useGroups = groupsEnabled && snapshot.debugGroups.length > 0;\n const isExpanded = (group: FrameGraphDebugGroup) => expandedGroupPaths.has(group.pathKey);\n const hasVisibleAncestors = (group: FrameGraphDebugGroup) => group.ancestorIds\n .slice(0, -1)\n .every((id) => isExpanded(groupsById.get(id)!));\n const retainedIds = new Set(snapshot.nodes.map((node) => node.id));\n const usedResourceIds = new Set([\n ...snapshot.accessEdges.filter((access) => retainedIds.has(access.nodeId)).map((access) => access.resource.id),\n ...snapshot.roots.flatMap((root) => root.resource ? [root.resource.id] : []),\n ]);\n const resources = snapshot.resources.filter((resource) => usedResourceIds.has(resource.id));\n const populatedGroupIds = new Set<string>();\n for (const item of [...snapshot.nodes, ...resources]) {\n for (const id of groupsById.get(item.debugGroupId ?? '')?.ancestorIds ?? []) populatedGroupIds.add(id);\n }\n const visibleResources = resources.filter((resource) => !useGroups || resource.debugGroupId === undefined\n || groupsById.get(resource.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!)));\n const includedGroups = useGroups\n ? snapshot.debugGroups.filter((group) => populatedGroupIds.has(group.id) && hasVisibleAncestors(group))\n : [];\n const includedGroupIds = new Set(includedGroups.map((group) => group.id));\n const representedNodeIdsByGroupId = new Map<string, string[]>();\n for (const node of snapshot.nodes) {\n const group = node.debugGroupId === undefined ? undefined : groupsById.get(node.debugGroupId);\n for (const groupId of group?.ancestorIds ?? []) {\n const represented = representedNodeIdsByGroupId.get(groupId) ?? [];\n represented.push(node.id);\n representedNodeIdsByGroupId.set(groupId, represented);\n }\n }\n const visiblePasses = snapshot.nodes.filter((node) => {\n if (!useGroups || node.debugGroupId === undefined) return true;\n return groupsById.get(node.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!));\n });\n const visiblePassIds = new Set(visiblePasses.map((node) => node.id));\n const includedGroupsByParentId = indexByOptionalId(includedGroups, (group) => group.parentId);\n const visiblePassesByGroupId = indexByOptionalId(visiblePasses, (node) => node.debugGroupId);\n\n const groupNodes: GroupSceneNode[] = includedGroups.map((group) => {\n const id = graphGroupElementId(group.pathKey);\n const collapsed = !isExpanded(group);\n const representedNodeIds = representedNodeIdsByGroupId.get(group.id) ?? [];\n const childNodeIds = collapsed ? [] : [\n ...(includedGroupsByParentId.get(group.id) ?? [])\n .map((child) => graphGroupElementId(child.pathKey)),\n ...(visiblePassesByGroupId.get(group.id) ?? [])\n .map((node) => passElementId(node.id)),\n ...visibleResources.filter((resource) => resource.debugGroupId === group.id).map((resource) => resourceElementId(resource.id)),\n ];\n const node: GroupSceneNode = {\n id,\n kind: 'group',\n groupId: group.id,\n groupPathKey: group.pathKey,\n label: createGroupLabel(group, collapsed),\n overviewLabel: `${collapsed ? '▸' : '▾'} ${group.label}`,\n title: createGroupTitle(group),\n parentId: group.parentId !== undefined && includedGroupIds.has(group.parentId)\n ? graphGroupElementId(groupsById.get(group.parentId)!.pathKey)\n : undefined,\n collapsed,\n depthBand: group.ancestorIds.length % 2 as 0 | 1,\n childNodeIds,\n representedNodeIds,\n retainedNodeCount: group.summary.retainedNodeCount,\n culledNodeCount: group.summary.culledNodeCount,\n gpuWorkDurationMicros: group.summary.gpuWorkDurationMicros,\n timedNodeCount: group.summary.timedNodeCount,\n timingEligibleNodeCount: group.summary.timingEligibleNodeCount,\n };\n const selection: Selection = { kind: 'group', pathKey: group.pathKey };\n registerElement(interaction, node.id, selection, {\n nodeIds: representedNodeIds,\n groupPathKeys: [group.pathKey],\n resourceIds: [\n ...group.summary.inputResources.map((resource) => resource.id),\n ...group.summary.outputResources.map((resource) => resource.id),\n ],\n accessIds: [],\n dependencies: [],\n });\n return node;\n });\n\n const passNodes: PassSceneNode[] = visiblePasses.map((node) => {\n const segment = segmentByNodeId.get(node.id);\n const sceneNode: PassSceneNode = {\n id: passElementId(node.id),\n kind: 'pass',\n nodeId: node.id,\n passKind: node.kind,\n executionSegmentIndex: segment?.index,\n gpuDurationMicros: node.gpuDurationMicros,\n label: formatGraphNodeLabel(`${segmentLabel(segment)} ${labelNode(node)}`),\n overviewLabel: shortGraphLabel(labelNode(node)),\n title: createNodeTitle(node, segment, snapshot),\n parentId: useGroups && node.debugGroupId !== undefined\n ? graphGroupElementId(groupsById.get(node.debugGroupId)!.pathKey)\n : undefined,\n };\n const selection: Selection = { kind: 'node', id: node.id };\n registerElement(interaction, sceneNode.id, selection, emptyReferences({ nodeIds: [node.id] }));\n return sceneNode;\n });\n\n const representativeByNodeId = new Map<string, GraphSceneElementId>();\n for (const node of snapshot.nodes) {\n if (visiblePassIds.has(node.id)) {\n representativeByNodeId.set(node.id, passElementId(node.id));\n continue;\n }\n const group = groupsById.get(node.debugGroupId!)!;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n representativeByNodeId.set(node.id, graphGroupElementId(groupsById.get(collapsedAncestorId!)!.pathKey));\n }\n\n for (const node of snapshot.nodes) {\n const representative = representativeByNodeId.get(node.id)!;\n setSelectionElements(interaction, { kind: 'node', id: node.id }, [representative]);\n }\n if (useGroups) {\n for (const group of snapshot.debugGroups) {\n if (includedGroupIds.has(group.id)) continue;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n if (collapsedAncestorId !== undefined) {\n const representative = graphGroupElementId(groupsById.get(collapsedAncestorId)!.pathKey);\n setSelectionElements(interaction, { kind: 'group', pathKey: group.pathKey }, [representative]);\n }\n }\n }\n\n const representativeByResourceId = new Map<string, string>();\n for (const resource of resources) {\n const collapsed = useGroups ? groupsById.get(resource.debugGroupId ?? '')?.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!)) : undefined;\n const representative = collapsed ? graphGroupElementId(groupsById.get(collapsed)!.pathKey) : resourceElementId(resource.id);\n representativeByResourceId.set(resource.id, representative);\n }\n const resourceNodes: ResourceSceneNode[] = visibleResources.map((resource) => {\n const origin = resource.origin === 'transient' ? 'Created' : resource.origin === 'imported' ? 'Imported' : 'Surface';\n const node: ResourceSceneNode = {\n id: resourceElementId(resource.id), kind: 'resource', resourceId: resource.id, resourceKind: resource.kind,\n label: origin + ' · ' + (resource.kind === 'buffer' ? 'Buffer' : 'Texture') + '\\n' + formatGraphResourceLabel(labelResource(resource)),\n overviewLabel: origin + '\\n' + formatGraphResourceLabel(shortGraphLabel(labelResource(resource))),\n title: createResourceTitle(resource, snapshot, snapshot.accessesByResourceId.get(resource.id) ?? [])\n + '\\nDeclaration entrance, not a complete initial-content provenance graph.',\n parentId: useGroups && resource.debugGroupId ? graphGroupElementId(groupsById.get(resource.debugGroupId)!.pathKey) : undefined,\n };\n registerElement(interaction, node.id, { kind: 'resource', id: resource.id }, emptyReferences({ resourceIds: [resource.id] }));\n interaction.resourceElementIdsByResourceId.set(resource.id, [node.id]);\n return node;\n });\n const rootNodes: RootSceneNode[] = [];\n const aggregates = new Map<string, { from: string; to: string; resourceId: string; relations: GraphFlowRelation[] }>();\n const addRelation = (from: string, to: string, resourceId: string, relation: GraphFlowRelation) => {\n if (from === to) return;\n const key = JSON.stringify([from, to, resourceId]);\n const entry = aggregates.get(key) ?? { from, to, resourceId, relations: [] };\n entry.relations.push(relation);\n aggregates.set(key, entry);\n };\n for (const dependency of snapshot.edges) {\n addRelation(representativeByNodeId.get(dependency.fromNodeId)!, representativeByNodeId.get(dependency.toNodeId)!, dependency.resource.id,\n { role: dependency.kind, nodeIds: [dependency.fromNodeId, dependency.toNodeId], dependency });\n }\n for (const access of declarationEntrances(snapshot.nodes, snapshot.accessEdges, snapshot.edges)) {\n addRelation(representativeByResourceId.get(access.resource.id)!, representativeByNodeId.get(access.nodeId)!, access.resource.id,\n { role: 'declaration', nodeIds: [access.nodeId] });\n }\n const rootOccurrences = new Map<string, number>();\n const rangesByRootFamily = new Map<string, Set<string>>();\n for (const root of snapshot.roots) {\n if (!root.resource) continue;\n const family = JSON.stringify([root.resource.id, root.reason]);\n const ranges = rangesByRootFamily.get(family) ?? new Set<string>();\n ranges.add(root.key);\n rangesByRootFamily.set(family, ranges);\n }\n for (const root of snapshot.roots) {\n if (!root.resource) {\n if (root.nodeId) {\n const representative = representativeByNodeId.get(root.nodeId)!;\n setSelectionElements(interaction, { kind: 'root', key: root.key }, [representative]);\n }\n continue;\n }\n const occurrence = rootOccurrences.get(root.key) ?? 0;\n rootOccurrences.set(root.key, occurrence + 1);\n const id = 'root:' + root.key + (occurrence ? ':' + occurrence : '');\n const resource = snapshot.resourceById.get(root.resource.id)!;\n const rangeLabel = root.range?.kind === 'buffer' ? `bytes ${root.range.offset}–${root.range.offset + root.range.size}`\n : root.range ? root.range.regions.map((r) => `mip ${r.baseMipLevel}+${r.mipLevelCount} · ${r.baseDepthSlice !== undefined ? 'D' + r.baseDepthSlice + '+' + r.depthSliceCount : 'L' + r.baseArrayLayer + '+' + r.arrayLayerCount} · ${r.aspect}`).join('; ') : 'Range unavailable';\n const rangeSummary = root.range?.kind === 'texture'\n ? root.range.regions.map((r) => `m${r.baseMipLevel}+${r.mipLevelCount} ${r.baseDepthSlice !== undefined ? 'D' + r.baseDepthSlice + '+' + r.depthSliceCount : 'L' + r.baseArrayLayer + '+' + r.arrayLayerCount} ${r.aspect === 'depth-only' ? 'depth' : r.aspect === 'stencil-only' ? 'stencil' : 'all'}`).join('; ')\n : rangeLabel;\n const reasonLabel = root.reason.split('-').map((word) => word[0]!.toUpperCase() + word.slice(1)).join(' ');\n const disambiguate = rangesByRootFamily.get(JSON.stringify([resource.id, root.reason]))!.size > 1;\n rootNodes.push({\n id, kind: 'root', rootKey: root.key, resourceId: resource.id, resourceKind: resource.kind,\n label: reasonLabel + '\\n' + formatGraphResourceLabel(labelResource(resource))\n + (disambiguate ? '\\n' + formatGraphResourceLabel(rangeSummary) : ''),\n overviewLabel: reasonLabel + '\\n' + formatGraphResourceLabel(shortGraphLabel(labelResource(resource))),\n title: labelResource(resource) + '\\n' + root.reason + '\\n' + rangeLabel\n + (root.resolution ? '\\nProducers: ' + (root.resolution.producerNodeIds.join(', ') || 'none') + '\\nInitial contents: ' + root.resolution.usesInitialContents : '\\nOutput sources unavailable in Legacy capture.'),\n });\n registerElement(interaction, id, { kind: 'root', key: root.key },\n emptyReferences({ resourceIds: [resource.id], nodeIds: root.resolution?.producerNodeIds ?? [] }));\n for (const nodeId of root.resolution?.producerNodeIds ?? []) {\n addRelation(representativeByNodeId.get(nodeId)!, id, resource.id, { role: 'output-producer', nodeIds: [nodeId], rootKey: root.key });\n }\n if (root.resolution?.usesInitialContents) addRelation(representativeByResourceId.get(resource.id)!, id, resource.id,\n { role: 'output-initial', nodeIds: [], rootKey: root.key });\n }\n const edges: GraphSceneEdge[] = [...aggregates.entries()].map(([key, entry]) => {\n const underlyingDependencies = entry.relations.flatMap((relation) => relation.dependency ? [relation.dependency] : []);\n const edge: GraphSceneEdge = {\n id: 'flow:' + key, ...entry,\n kind: entry.relations.every((relation) => relation.role === 'ordering') ? 'ordering' : 'flow',\n title: labelResource(snapshot.resourceById.get(entry.resourceId)!) + '\\n'\n + unique(entry.relations.map((relation) => relation.role)).join(' · '),\n underlyingDependencies, underlyingDependencyCount: underlyingDependencies.length,\n };\n const selection: Selection = { kind: 'resource', id: entry.resourceId };\n registerElement(interaction, edge.id, selection, emptyReferences({\n nodeIds: unique(entry.relations.flatMap((relation) => relation.nodeIds)), resourceIds: [entry.resourceId], dependencies: underlyingDependencies,\n }));\n const resourceElements = interaction.resourceElementIdsByResourceId.get(entry.resourceId) ?? [];\n resourceElements.push(edge.id);\n interaction.resourceElementIdsByResourceId.set(entry.resourceId, resourceElements);\n return edge;\n });\n for (const [resourceId, elements] of interaction.resourceElementIdsByResourceId) {\n const selection: Selection = { kind: 'resource', id: resourceId };\n setSelectionElements(interaction, selection, elements);\n interaction.hoverElementIdsBySelection.set(selectionKey(selection), [...elements]);\n }\n return finalizeScene([...groupNodes, ...passNodes, ...resourceNodes, ...rootNodes], edges, interaction);\n}\n\nfunction finalizeScene(\n nodes: readonly GraphSceneNode[],\n edges: readonly GraphSceneEdge[],\n interaction: MutableInteractionIndex,\n): GraphScene {\n const topologyKey = JSON.stringify({\n nodes: nodes.map((node) => [node.id, node.kind, node.parentId, node.kind === 'group' ? node.collapsed : undefined]),\n edges: edges.map((edge) => [edge.id, edge.kind, edge.from, edge.to]),\n });\n const contentKey = JSON.stringify({\n nodes: nodes.map((node) => [\n node.id,\n node.kind,\n node.parentId,\n node.label,\n node.overviewLabel,\n node.title,\n node.kind === 'pass' ? node.passKind : undefined,\n (node.kind === 'resource' || node.kind === 'root') ? node.resourceKind : undefined,\n node.kind === 'group' ? node.collapsed : undefined,\n node.kind === 'group' ? node.depthBand : undefined,\n node.kind === 'group' ? node.culledNodeCount > 0 : undefined,\n ]),\n edges: edges.map((edge) => [\n edge.id,\n edge.kind,\n edge.from,\n edge.to,\n edge.title,\n edge.relations,\n ]),\n });\n return {\n nodes,\n edges,\n topologyKey,\n contentKey,\n interaction,\n };\n}\n\nfunction createMutableInteractionIndex(): MutableInteractionIndex {\n return {\n selectionByElementId: new Map(),\n primaryElementIdsBySelection: new Map(),\n hoverElementIdsBySelection: new Map(),\n resourceElementIdsByResourceId: new Map(),\n semanticReferencesByElementId: new Map(),\n };\n}\n\nfunction registerElement(\n interaction: MutableInteractionIndex,\n elementId: GraphSceneElementId,\n selection: Selection,\n references: GraphSemanticReferences,\n): void {\n interaction.selectionByElementId.set(elementId, selection);\n setSelectionElements(interaction, selection, [elementId]);\n interaction.hoverElementIdsBySelection.set(selectionKey(selection), [elementId]);\n interaction.semanticReferencesByElementId.set(elementId, references);\n}\n\nfunction setSelectionElements(\n interaction: MutableInteractionIndex,\n selection: Selection,\n primary: readonly GraphSceneElementId[],\n): void {\n interaction.primaryElementIdsBySelection.set(selectionKey(selection), [...primary]);\n}\n\nfunction emptyReferences(overrides: Partial<GraphSemanticReferences>): GraphSemanticReferences {\n return {\n nodeIds: [],\n groupPathKeys: [],\n resourceIds: [],\n accessIds: [],\n dependencies: [],\n ...overrides,\n };\n}\n\nfunction passElementId(nodeId: string): GraphSceneElementId {\n return `pass:${nodeId}`;\n}\n\nfunction resourceElementId(resourceId: string): GraphSceneElementId {\n return `resource:${resourceId}`;\n}\n\nfunction formatGraphNodeLabel(label: string): string {\n return formatGraphLabel(label, 20, 3);\n}\n\nfunction formatGraphResourceLabel(label: string): string {\n const singleLine = label.replace(/\\s+/g, ' ').trim();\n // Reserve conservative monospace cells for CJK/emoji fallback glyphs as well.\n const glyphs = [...singleLine];\n const cells = (glyph: string) => /\\p{Mark}/u.test(glyph) ? 0 : glyph.codePointAt(0)! > 255 ? 2 : 1;\n if (glyphs.reduce((sum, glyph) => sum + cells(glyph), 0) <= 18) return singleLine;\n let result = '';\n let width = 0;\n for (const glyph of glyphs) {\n if (width + cells(glyph) > 17) break;\n result += glyph;\n width += cells(glyph);\n }\n return result + '…';\n}\n\nfunction formatGraphLabel(label: string, maxLineLength: number, maxLines: number): string {\n if (label.length <= maxLineLength) return label;\n const chunks = label.match(/[^.]+\\.?/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n let truncated = false;\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n continue;\n }\n if (!current && chunk.length > maxLineLength) {\n const wrapped = splitLongGraphLabelChunk(chunk, maxLineLength);\n for (const line of wrapped) {\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n lines.push(line);\n }\n current = '';\n if (truncated) break;\n continue;\n }\n current = next;\n }\n if (current && lines.length < maxLines) lines.push(current);\n else if (current) truncated = true;\n if (lines.length > maxLines) {\n lines.length = maxLines;\n truncated = true;\n }\n if (truncated && lines.length > 0) {\n const line = lines[lines.length - 1]!;\n lines[lines.length - 1] = line.length < maxLineLength\n ? `${line}…`\n : `${line.slice(0, Math.max(1, maxLineLength - 1))}…`;\n }\n return lines.join('\\n');\n}\n\nfunction splitLongGraphLabelChunk(label: string, maxLineLength: number): string[] {\n const chunks = label.match(/[^\\s_\\-/]+[\\s_\\-/]*/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n } else if (!current && chunk.length > maxLineLength) {\n for (let index = 0; index < chunk.length; index += maxLineLength) {\n lines.push(chunk.slice(index, index + maxLineLength));\n }\n } else {\n current = next;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nfunction shortGraphLabel(label: string): string {\n const parts = label.split(/[./]/).filter(Boolean);\n const last = parts[parts.length - 1] ?? label;\n const short = parts.length > 1 && (/^\\d+$/.test(last) || /^view#\\d+$/.test(last))\n ? `${parts[parts.length - 2]}.${last}`\n : last;\n return short.length <= 18 ? short : `${short.slice(0, 17)}…`;\n}\n\nfunction createGroupLabel(group: FrameGraphDebugGroup, collapsed: boolean): string {\n const summary = group.summary;\n const gpu = summary.timingEligibleNodeCount === 0\n ? 'no timed passes'\n : `Σ ${(summary.gpuWorkDurationMicros / 1000).toFixed(3)} ms ${summary.timedNodeCount}/${summary.timingEligibleNodeCount}`;\n return `${collapsed ? '▸' : '▾'} ${group.label} · ${summary.retainedNodeCount} retained · ${summary.culledNodeCount} culled · ${gpu}`;\n}\n\nfunction createNodeTitle(\n node: FrameGraphDebugNode,\n segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined,\n snapshot: FrameGraphDebugViewModel,\n): string {\n return [\n labelNode(node),\n `kind: ${node.kind}`,\n `group: ${debugGroupPathForId(node.debugGroupId, snapshot)}`,\n `segment: ${segment ? `${segment.index}:${segment.kind}` : '-'}`,\n `gpu: ${node.kind === 'external-submission' ? 'opaque' : `${formatGpuDuration(node)} ms`}`,\n `reads: ${node.reads.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n `writes: ${node.writes.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n ].join('\\n');\n}\n\nfunction createGroupTitle(group: FrameGraphDebugGroup): string {\n const summary = group.summary;\n return [\n group.path.join(' / '),\n `retained: ${summary.retainedNodeCount}`,\n `culled: ${summary.culledNodeCount}`,\n `inputs: ${summary.inputResources.map(labelResource).join(', ') || '-'}`,\n `outputs: ${summary.outputResources.map(labelResource).join(', ') || '-'}`,\n `transient registered/accessed: ${summary.registeredTransientResourceCount}/${summary.accessedTransientResourceCount}`,\n `physical allocations: ${summary.physicalAllocationCount}`,\n `segments: ${summary.executionSegmentCount}`,\n `opaque: ${summary.externalSubmissionCount}`,\n `Σ GPU work: ${(summary.gpuWorkDurationMicros / 1000).toFixed(3)} ms (${summary.timedNodeCount}/${summary.timingEligibleNodeCount})`,\n ].join('\\n');\n}\n\nfunction createResourceTitle(\n resource: FrameGraphDebugResource,\n snapshot: FrameGraphDebugViewModel,\n accesses: readonly FrameGraphDebugAccessEdge[],\n): string {\n return [\n labelResource(resource),\n `kind: ${resource.kind}`,\n `origin: ${resource.origin}`,\n `registered in: ${debugGroupPathForId(resource.debugGroupId, snapshot)}`,\n `lifetime: ${resource.lifetime ? `${resource.lifetime.firstUse}-${resource.lifetime.lastUse}` : '-'}`,\n `physical: ${resource.physicalResourceId ?? '-'}`,\n `reads: ${accesses.filter((access) => access.mode === 'read').length}`,\n `writes: ${accesses.filter((access) => access.mode === 'write').length}`,\n ].join('\\n');\n}\n\nfunction debugGroupPathForId(groupId: string | undefined, snapshot: FrameGraphDebugViewModel): string {\n if (groupId === undefined) return '-';\n return snapshot.debugGroups.find((group) => group.id === groupId)?.path.join(' / ') ?? `#${groupId}`;\n}\n\nfunction executionSegmentByNodeId(snapshot: FrameGraphDebugViewModel) {\n return new Map(snapshot.executionSegments.flatMap((segment) => segment.nodeIds.map((nodeId) => [nodeId, segment] as const)));\n}\n\nfunction segmentLabel(segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined): string {\n return segment ? `[S${segment.index}]` : '[S-]';\n}\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction indexByOptionalId<T>(\n values: readonly T[],\n getId: (value: T) => string | undefined,\n): ReadonlyMap<string | undefined, readonly T[]> {\n const result = new Map<string | undefined, T[]>();\n for (const value of values) {\n const id = getId(value);\n const indexed = result.get(id) ?? [];\n indexed.push(value);\n result.set(id, indexed);\n }\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"panelGraphScene.js","sourceRoot":"","sources":["../src/panelGraphScene.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n FrameGraphDebugAccessEdge,\n FrameGraphDebugEdge,\n FrameGraphDebugGroup,\n FrameGraphDebugNode,\n FrameGraphDebugResource,\n FrameGraphDebugViewModel,\n} from './debugCaptureModel.ts';\nimport { formatGpuDuration, labelNode, labelResource } from './panelDomHelpers.ts';\nimport { declarationEntrances } from './debugCaptureModel.ts';\nimport type { GraphFlowRelation, Selection } from './panelTypes.ts';\nimport { formatMeasuredGpuWork } from './panelWorkbenchHelpers.ts';\n\nexport type GraphSceneElementId = string;\n\ntype GraphSceneNodeBase = {\n readonly id: GraphSceneElementId;\n readonly label: string;\n readonly overviewLabel: string;\n readonly title: string;\n readonly parentId?: GraphSceneElementId;\n};\n\nexport type PassSceneNode = GraphSceneNodeBase & {\n readonly kind: 'pass';\n readonly nodeId: string;\n readonly passKind: FrameGraphDebugNode['kind'];\n readonly executionSegmentIndex?: number;\n readonly gpuDurationMicros?: number;\n};\n\nexport type GroupSceneNode = GraphSceneNodeBase & {\n readonly kind: 'group';\n readonly groupId: string;\n readonly groupPathKey: string;\n readonly collapsed: boolean;\n readonly depthBand: 0 | 1;\n readonly childNodeIds: readonly GraphSceneElementId[];\n readonly representedNodeIds: readonly string[];\n readonly retainedNodeCount: number;\n readonly culledNodeCount: number;\n readonly gpuWorkDurationMicros: number;\n readonly timedNodeCount: number;\n readonly timingEligibleNodeCount: number;\n};\n\nexport type ResourceSceneNode = GraphSceneNodeBase & {\n readonly kind: 'resource';\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\n\nexport type RootSceneNode = GraphSceneNodeBase & {\n readonly kind: 'root';\n readonly rootKey: string;\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\nexport type GraphSceneNode = PassSceneNode | GroupSceneNode | ResourceSceneNode | RootSceneNode;\n\ntype GraphSceneEdgeBase = {\n readonly id: GraphSceneElementId;\n readonly from: GraphSceneElementId;\n readonly to: GraphSceneElementId;\n readonly title: string;\n readonly resourceId: string;\n};\n\nexport type GraphSceneEdge = GraphSceneEdgeBase & {\n readonly kind: 'flow' | 'ordering';\n readonly relations: readonly GraphFlowRelation[];\n readonly underlyingDependencies: readonly FrameGraphDebugEdge[];\n readonly underlyingDependencyCount: number;\n};\n\nexport type GraphSemanticReferences = {\n readonly nodeIds: readonly string[];\n readonly groupPathKeys: readonly string[];\n readonly resourceIds: readonly string[];\n readonly accessIds: readonly string[];\n readonly dependencies: readonly FrameGraphDebugEdge[];\n};\n\nexport type GraphSceneInteractionIndex = {\n readonly selectionByElementId: ReadonlyMap<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly hoverElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly resourceElementIdsByResourceId: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: ReadonlyMap<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport type GraphScene = {\n readonly nodes: readonly GraphSceneNode[];\n readonly edges: readonly GraphSceneEdge[];\n readonly topologyKey: string;\n readonly contentKey: string;\n readonly interaction: GraphSceneInteractionIndex;\n};\n\nexport type CreateGraphSceneOptions = {\n readonly groupsEnabled: boolean;\n readonly showResourceDeclarations?: boolean;\n readonly expandedGroupPaths: ReadonlySet<string>;\n};\n\ntype MutableInteractionIndex = {\n readonly selectionByElementId: Map<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly hoverElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly resourceElementIdsByResourceId: Map<string, GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: Map<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport function createGraphScene(\n snapshot: FrameGraphDebugViewModel,\n options: CreateGraphSceneOptions,\n): GraphScene {\n return createFrameFlowScene(snapshot, options.groupsEnabled, options.expandedGroupPaths, options.showResourceDeclarations ?? true);\n}\n\nexport function graphGroupElementId(pathKey: string): GraphSceneElementId {\n return `group:${pathKey}`;\n}\n\nexport function selectionKey(selection: Selection): string {\n switch (selection.kind) {\n case 'node':\n return `node:${selection.id}`;\n case 'group':\n return `group:${selection.pathKey}`;\n case 'resource':\n return `resource:${selection.id}`;\n case 'allocation':\n return `allocation:${selection.id}`;\n case 'root':\n return `root:${selection.key}`;\n case 'culled':\n return `culled:${selection.id}`;\n case 'segment':\n return `segment:${selection.index}`;\n }\n}\n\nfunction createFrameFlowScene(\n snapshot: FrameGraphDebugViewModel,\n groupsEnabled: boolean,\n expandedGroupPaths: ReadonlySet<string>,\n showResourceDeclarations: boolean,\n): GraphScene {\n const interaction = createMutableInteractionIndex();\n const segmentByNodeId = executionSegmentByNodeId(snapshot);\n const groupsById = new Map(snapshot.debugGroups.map((group) => [group.id, group]));\n const useGroups = groupsEnabled && snapshot.debugGroups.length > 0;\n const isExpanded = (group: FrameGraphDebugGroup) => expandedGroupPaths.has(group.pathKey);\n const hasVisibleAncestors = (group: FrameGraphDebugGroup) => group.ancestorIds\n .slice(0, -1)\n .every((id) => isExpanded(groupsById.get(id)!));\n const retainedIds = new Set(snapshot.nodes.map((node) => node.id));\n const usedResourceIds = new Set([\n ...snapshot.accessEdges.filter((access) => retainedIds.has(access.nodeId)).map((access) => access.resource.id),\n ...snapshot.roots.flatMap((root) => root.resource ? [root.resource.id] : []),\n ]);\n const resources = showResourceDeclarations ? snapshot.resources.filter((resource) => usedResourceIds.has(resource.id)) : [];\n const populatedGroupIds = new Set<string>();\n for (const item of [...snapshot.nodes, ...resources]) {\n for (const id of groupsById.get(item.debugGroupId ?? '')?.ancestorIds ?? []) populatedGroupIds.add(id);\n }\n const visibleResources = resources.filter((resource) => !useGroups || resource.debugGroupId === undefined\n || groupsById.get(resource.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!)));\n const includedGroups = useGroups\n ? snapshot.debugGroups.filter((group) => populatedGroupIds.has(group.id) && hasVisibleAncestors(group))\n : [];\n const includedGroupIds = new Set(includedGroups.map((group) => group.id));\n const representedNodeIdsByGroupId = new Map<string, string[]>();\n for (const node of snapshot.nodes) {\n const group = node.debugGroupId === undefined ? undefined : groupsById.get(node.debugGroupId);\n for (const groupId of group?.ancestorIds ?? []) {\n const represented = representedNodeIdsByGroupId.get(groupId) ?? [];\n represented.push(node.id);\n representedNodeIdsByGroupId.set(groupId, represented);\n }\n }\n const visiblePasses = snapshot.nodes.filter((node) => {\n if (!useGroups || node.debugGroupId === undefined) return true;\n return groupsById.get(node.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!));\n });\n const visiblePassIds = new Set(visiblePasses.map((node) => node.id));\n const includedGroupsByParentId = indexByOptionalId(includedGroups, (group) => group.parentId);\n const visiblePassesByGroupId = indexByOptionalId(visiblePasses, (node) => node.debugGroupId);\n\n const groupNodes: GroupSceneNode[] = includedGroups.map((group) => {\n const id = graphGroupElementId(group.pathKey);\n const collapsed = !isExpanded(group);\n const representedNodeIds = representedNodeIdsByGroupId.get(group.id) ?? [];\n const childNodeIds = collapsed ? [] : [\n ...(includedGroupsByParentId.get(group.id) ?? [])\n .map((child) => graphGroupElementId(child.pathKey)),\n ...(visiblePassesByGroupId.get(group.id) ?? [])\n .map((node) => passElementId(node.id)),\n ...visibleResources.filter((resource) => resource.debugGroupId === group.id).map((resource) => resourceElementId(resource.id)),\n ];\n const node: GroupSceneNode = {\n id,\n kind: 'group',\n groupId: group.id,\n groupPathKey: group.pathKey,\n label: createGroupLabel(group, collapsed),\n overviewLabel: `${collapsed ? '▸' : '▾'} ${group.label.replace(/\\s+/g, ' ').trim()}`,\n title: createGroupTitle(group, snapshot),\n parentId: group.parentId !== undefined && includedGroupIds.has(group.parentId)\n ? graphGroupElementId(groupsById.get(group.parentId)!.pathKey)\n : undefined,\n collapsed,\n depthBand: group.ancestorIds.length % 2 as 0 | 1,\n childNodeIds,\n representedNodeIds,\n retainedNodeCount: group.summary.retainedNodeCount,\n culledNodeCount: group.summary.culledNodeCount,\n gpuWorkDurationMicros: group.summary.gpuWorkDurationMicros,\n timedNodeCount: group.summary.timedNodeCount,\n timingEligibleNodeCount: group.summary.timingEligibleNodeCount,\n };\n const selection: Selection = { kind: 'group', pathKey: group.pathKey };\n registerElement(interaction, node.id, selection, {\n nodeIds: representedNodeIds,\n groupPathKeys: [group.pathKey],\n resourceIds: [\n ...group.summary.inputResources.map((resource) => resource.id),\n ...group.summary.outputResources.map((resource) => resource.id),\n ],\n accessIds: [],\n dependencies: [],\n });\n return node;\n });\n\n const passNodes: PassSceneNode[] = visiblePasses.map((node) => {\n const segment = segmentByNodeId.get(node.id);\n const sceneNode: PassSceneNode = {\n id: passElementId(node.id),\n kind: 'pass',\n nodeId: node.id,\n passKind: node.kind,\n executionSegmentIndex: segment?.index,\n gpuDurationMicros: node.gpuDurationMicros,\n label: formatGraphNodeLabel(`${segmentLabel(segment)} ${labelNode(node)}`),\n overviewLabel: shortGraphLabel(labelNode(node)),\n title: createNodeTitle(node, segment, snapshot),\n parentId: useGroups && node.debugGroupId !== undefined\n ? graphGroupElementId(groupsById.get(node.debugGroupId)!.pathKey)\n : undefined,\n };\n const selection: Selection = { kind: 'node', id: node.id };\n registerElement(interaction, sceneNode.id, selection, emptyReferences({ nodeIds: [node.id] }));\n return sceneNode;\n });\n\n const representativeByNodeId = new Map<string, GraphSceneElementId>();\n for (const node of snapshot.nodes) {\n if (visiblePassIds.has(node.id)) {\n representativeByNodeId.set(node.id, passElementId(node.id));\n continue;\n }\n const group = groupsById.get(node.debugGroupId!)!;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n representativeByNodeId.set(node.id, graphGroupElementId(groupsById.get(collapsedAncestorId!)!.pathKey));\n }\n\n for (const node of snapshot.nodes) {\n const representative = representativeByNodeId.get(node.id)!;\n setSelectionElements(interaction, { kind: 'node', id: node.id }, [representative]);\n }\n if (useGroups) {\n for (const group of snapshot.debugGroups) {\n if (includedGroupIds.has(group.id) || !populatedGroupIds.has(group.id)) continue;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n if (collapsedAncestorId !== undefined) {\n const representative = graphGroupElementId(groupsById.get(collapsedAncestorId)!.pathKey);\n setSelectionElements(interaction, { kind: 'group', pathKey: group.pathKey }, [representative]);\n }\n }\n }\n\n const representativeByResourceId = new Map<string, string>();\n for (const resource of resources) {\n const collapsed = useGroups ? groupsById.get(resource.debugGroupId ?? '')?.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!)) : undefined;\n const representative = collapsed ? graphGroupElementId(groupsById.get(collapsed)!.pathKey) : resourceElementId(resource.id);\n representativeByResourceId.set(resource.id, representative);\n }\n const resourceNodes: ResourceSceneNode[] = visibleResources.map((resource) => {\n const origin = resource.origin === 'transient' ? 'Created' : resource.origin === 'imported' ? 'Imported' : 'Surface';\n const node: ResourceSceneNode = {\n id: resourceElementId(resource.id), kind: 'resource', resourceId: resource.id, resourceKind: resource.kind,\n label: origin + ' · ' + (resource.kind === 'buffer' ? 'Buffer' : 'Texture') + '\\n' + formatGraphResourceLabel(labelResource(resource)),\n overviewLabel: origin + '\\n' + formatGraphResourceLabel(shortGraphLabel(labelResource(resource)), 1),\n title: createResourceTitle(resource, snapshot, snapshot.accessesByResourceId.get(resource.id) ?? [])\n + '\\nDeclaration entrance, not a complete initial-content provenance graph.',\n parentId: useGroups && resource.debugGroupId ? graphGroupElementId(groupsById.get(resource.debugGroupId)!.pathKey) : undefined,\n };\n registerElement(interaction, node.id, { kind: 'resource', id: resource.id }, emptyReferences({ resourceIds: [resource.id] }));\n interaction.resourceElementIdsByResourceId.set(resource.id, [node.id]);\n return node;\n });\n const rootNodes: RootSceneNode[] = [];\n const aggregates = new Map<string, { from: string; to: string; resourceId: string; relations: GraphFlowRelation[] }>();\n const addRelation = (from: string, to: string, resourceId: string, relation: GraphFlowRelation) => {\n if (from === to) return;\n const key = JSON.stringify([from, to, resourceId]);\n const entry = aggregates.get(key) ?? { from, to, resourceId, relations: [] };\n entry.relations.push(relation);\n aggregates.set(key, entry);\n };\n for (const dependency of snapshot.edges) {\n addRelation(representativeByNodeId.get(dependency.fromNodeId)!, representativeByNodeId.get(dependency.toNodeId)!, dependency.resource.id,\n { role: dependency.kind, nodeIds: [dependency.fromNodeId, dependency.toNodeId], dependency });\n }\n for (const access of showResourceDeclarations ? declarationEntrances(snapshot.nodes, snapshot.accessEdges, snapshot.edges) : []) {\n addRelation(representativeByResourceId.get(access.resource.id)!, representativeByNodeId.get(access.nodeId)!, access.resource.id,\n { role: 'declaration', nodeIds: [access.nodeId] });\n }\n const rootOccurrences = new Map<string, number>();\n const rangesByRootFamily = new Map<string, Set<string>>();\n for (const root of snapshot.roots) {\n if (!root.resource) continue;\n const family = JSON.stringify([root.resource.id, root.reason]);\n const ranges = rangesByRootFamily.get(family) ?? new Set<string>();\n ranges.add(root.key);\n rangesByRootFamily.set(family, ranges);\n }\n for (const root of snapshot.roots) {\n if (!root.resource) {\n if (root.nodeId) {\n const representative = representativeByNodeId.get(root.nodeId)!;\n setSelectionElements(interaction, { kind: 'root', key: root.key }, [representative]);\n }\n continue;\n }\n const occurrence = rootOccurrences.get(root.key) ?? 0;\n rootOccurrences.set(root.key, occurrence + 1);\n const id = 'root:' + root.key + (occurrence ? ':' + occurrence : '');\n const resource = snapshot.resourceById.get(root.resource.id)!;\n const rangeLabel = root.range?.kind === 'buffer' ? `bytes ${root.range.offset}–${root.range.offset + root.range.size}`\n : root.range ? root.range.regions.map((r) => `mip ${r.baseMipLevel}+${r.mipLevelCount} · ${r.baseDepthSlice !== undefined ? 'D' + r.baseDepthSlice + '+' + r.depthSliceCount : 'L' + r.baseArrayLayer + '+' + r.arrayLayerCount} · ${r.aspect}`).join('; ') : 'Range unavailable';\n const rangeSummary = root.range?.kind === 'texture'\n ? root.range.regions.map((r) => `m${r.baseMipLevel}+${r.mipLevelCount} ${r.baseDepthSlice !== undefined ? 'D' + r.baseDepthSlice + '+' + r.depthSliceCount : 'L' + r.baseArrayLayer + '+' + r.arrayLayerCount} ${r.aspect === 'depth-only' ? 'depth' : r.aspect === 'stencil-only' ? 'stencil' : 'all'}`).join('; ')\n : rangeLabel;\n const reasonLabel = root.reason.split('-').map((word) => word[0]!.toUpperCase() + word.slice(1)).join(' ');\n const disambiguate = rangesByRootFamily.get(JSON.stringify([resource.id, root.reason]))!.size > 1;\n const initialLabel = !showResourceDeclarations && root.resolution?.usesInitialContents\n ? '\\n' + (root.resolution.producerNodeIds.length ? 'With initial contents' : 'Initial contents only') : '';\n rootNodes.push({\n id, kind: 'root', rootKey: root.key, resourceId: resource.id, resourceKind: resource.kind,\n label: reasonLabel + '\\n' + formatGraphResourceLabel(labelResource(resource))\n + (disambiguate ? '\\n' + formatGraphResourceLabel(rangeSummary, 1) : '') + initialLabel,\n overviewLabel: reasonLabel + '\\n' + formatGraphResourceLabel(shortGraphLabel(labelResource(resource)), 1) + initialLabel,\n title: labelResource(resource) + '\\n' + root.reason + '\\n' + rangeLabel\n + (root.resolution ? '\\nProducers: ' + (root.resolution.producerNodeIds.join(', ') || 'none') + '\\nInitial contents: ' + root.resolution.usesInitialContents : '\\nOutput sources unavailable in Legacy capture.'),\n });\n registerElement(interaction, id, { kind: 'root', key: root.key },\n emptyReferences({ resourceIds: [resource.id], nodeIds: root.resolution?.producerNodeIds ?? [] }));\n for (const nodeId of root.resolution?.producerNodeIds ?? []) {\n addRelation(representativeByNodeId.get(nodeId)!, id, resource.id, { role: 'output-producer', nodeIds: [nodeId], rootKey: root.key });\n }\n if (showResourceDeclarations && root.resolution?.usesInitialContents) addRelation(representativeByResourceId.get(resource.id)!, id, resource.id,\n { role: 'output-initial', nodeIds: [], rootKey: root.key });\n }\n const edges: GraphSceneEdge[] = [...aggregates.entries()].map(([key, entry]) => {\n const underlyingDependencies = entry.relations.flatMap((relation) => relation.dependency ? [relation.dependency] : []);\n const edge: GraphSceneEdge = {\n id: 'flow:' + key, ...entry,\n kind: entry.relations.every((relation) => relation.role === 'ordering') ? 'ordering' : 'flow',\n title: labelResource(snapshot.resourceById.get(entry.resourceId)!) + '\\n'\n + unique(entry.relations.map((relation) => relation.role)).join(' · '),\n underlyingDependencies, underlyingDependencyCount: underlyingDependencies.length,\n };\n const selection: Selection = { kind: 'resource', id: entry.resourceId };\n registerElement(interaction, edge.id, selection, emptyReferences({\n nodeIds: unique(entry.relations.flatMap((relation) => relation.nodeIds)), resourceIds: [entry.resourceId], dependencies: underlyingDependencies,\n }));\n const resourceElements = interaction.resourceElementIdsByResourceId.get(entry.resourceId) ?? [];\n resourceElements.push(edge.id);\n interaction.resourceElementIdsByResourceId.set(entry.resourceId, resourceElements);\n return edge;\n });\n for (const [resourceId, elements] of interaction.resourceElementIdsByResourceId) {\n const selection: Selection = { kind: 'resource', id: resourceId };\n setSelectionElements(interaction, selection, elements);\n interaction.hoverElementIdsBySelection.set(selectionKey(selection), [...elements]);\n }\n return finalizeScene([...groupNodes, ...passNodes, ...resourceNodes, ...rootNodes], edges, interaction);\n}\n\nfunction finalizeScene(\n nodes: readonly GraphSceneNode[],\n edges: readonly GraphSceneEdge[],\n interaction: MutableInteractionIndex,\n): GraphScene {\n const topologyKey = JSON.stringify({\n nodes: nodes.map((node) => [node.id, node.kind, node.parentId, node.kind === 'group' ? node.collapsed : undefined]),\n edges: edges.map((edge) => [edge.id, edge.kind, edge.from, edge.to]),\n });\n const contentKey = JSON.stringify({\n nodes: nodes.map((node) => [\n node.id,\n node.kind,\n node.parentId,\n node.label,\n node.overviewLabel,\n node.title,\n node.kind === 'pass' ? node.passKind : undefined,\n (node.kind === 'resource' || node.kind === 'root') ? node.resourceKind : undefined,\n node.kind === 'group' ? node.collapsed : undefined,\n node.kind === 'group' ? node.depthBand : undefined,\n node.kind === 'group' ? node.culledNodeCount > 0 : undefined,\n ]),\n edges: edges.map((edge) => [\n edge.id,\n edge.kind,\n edge.from,\n edge.to,\n edge.title,\n edge.relations,\n ]),\n });\n return {\n nodes,\n edges,\n topologyKey,\n contentKey,\n interaction,\n };\n}\n\nfunction createMutableInteractionIndex(): MutableInteractionIndex {\n return {\n selectionByElementId: new Map(),\n primaryElementIdsBySelection: new Map(),\n hoverElementIdsBySelection: new Map(),\n resourceElementIdsByResourceId: new Map(),\n semanticReferencesByElementId: new Map(),\n };\n}\n\nfunction registerElement(\n interaction: MutableInteractionIndex,\n elementId: GraphSceneElementId,\n selection: Selection,\n references: GraphSemanticReferences,\n): void {\n interaction.selectionByElementId.set(elementId, selection);\n setSelectionElements(interaction, selection, [elementId]);\n interaction.hoverElementIdsBySelection.set(selectionKey(selection), [elementId]);\n interaction.semanticReferencesByElementId.set(elementId, references);\n}\n\nfunction setSelectionElements(\n interaction: MutableInteractionIndex,\n selection: Selection,\n primary: readonly GraphSceneElementId[],\n): void {\n interaction.primaryElementIdsBySelection.set(selectionKey(selection), [...primary]);\n}\n\nfunction emptyReferences(overrides: Partial<GraphSemanticReferences>): GraphSemanticReferences {\n return {\n nodeIds: [],\n groupPathKeys: [],\n resourceIds: [],\n accessIds: [],\n dependencies: [],\n ...overrides,\n };\n}\n\nfunction passElementId(nodeId: string): GraphSceneElementId {\n return `pass:${nodeId}`;\n}\n\nfunction resourceElementId(resourceId: string): GraphSceneElementId {\n return `resource:${resourceId}`;\n}\n\nfunction formatGraphNodeLabel(label: string): string {\n return formatGraphLabel(label, 20, 3);\n}\n\nfunction formatGraphResourceLabel(label: string, maxLines = 2): string {\n let remaining = [...label.replace(/\\s+/g, ' ').trim()];\n // Reserve conservative monospace cells for CJK/emoji fallback glyphs as well.\n const cells = (glyph: string) => /\\p{Mark}/u.test(glyph) ? 0 : glyph.codePointAt(0)! > 255 ? 2 : 1;\n const take = (limit: number) => {\n let width = 0;\n let count = 0;\n for (const glyph of remaining) {\n if (width + cells(glyph) > limit) break;\n width += cells(glyph);\n count++;\n }\n return count;\n };\n const lines: string[] = [];\n while (remaining.length) {\n let count = take(18);\n if (count === remaining.length) {\n lines.push(remaining.join(''));\n break;\n }\n if (lines.length === maxLines - 1) {\n lines.push(remaining.slice(0, take(17)).join('').trimEnd() + '…');\n break;\n }\n // Prefer a readable namespace/path boundary over splitting a word.\n let boundary = 0;\n for (const separators of [/[./]/u, /[_\\-\\s]/u]) {\n for (let index = count - 1; index > 0; index--) {\n if (separators.test(remaining[index]!)) {\n boundary = index + 1;\n break;\n }\n }\n if (boundary) break;\n }\n if (boundary) count = boundary;\n lines.push(remaining.slice(0, count).join('').trimEnd());\n remaining = remaining.slice(count);\n }\n return lines.join('\\n');\n}\n\nfunction formatGraphLabel(label: string, maxLineLength: number, maxLines: number): string {\n if (label.length <= maxLineLength) return label;\n const chunks = label.match(/[^.]+\\.?/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n let truncated = false;\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n continue;\n }\n if (!current && chunk.length > maxLineLength) {\n const wrapped = splitLongGraphLabelChunk(chunk, maxLineLength);\n for (const line of wrapped) {\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n lines.push(line);\n }\n current = '';\n if (truncated) break;\n continue;\n }\n current = next;\n }\n if (current && lines.length < maxLines) lines.push(current);\n else if (current) truncated = true;\n if (lines.length > maxLines) {\n lines.length = maxLines;\n truncated = true;\n }\n if (truncated && lines.length > 0) {\n const line = lines[lines.length - 1]!;\n lines[lines.length - 1] = line.length < maxLineLength\n ? `${line}…`\n : `${line.slice(0, Math.max(1, maxLineLength - 1))}…`;\n }\n return lines.join('\\n');\n}\n\nfunction splitLongGraphLabelChunk(label: string, maxLineLength: number): string[] {\n const chunks = label.match(/[^\\s_\\-/]+[\\s_\\-/]*/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n } else if (!current && chunk.length > maxLineLength) {\n for (let index = 0; index < chunk.length; index += maxLineLength) {\n lines.push(chunk.slice(index, index + maxLineLength));\n }\n } else {\n current = next;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nfunction shortGraphLabel(label: string): string {\n const parts = label.split(/[./]/).filter(Boolean);\n const last = parts[parts.length - 1] ?? label;\n const short = parts.length > 1 && (/^\\d+$/.test(last) || /^view#\\d+$/.test(last))\n ? `${parts[parts.length - 2]}.${last}`\n : last;\n return short.length <= 18 ? short : `${short.slice(0, 17)}…`;\n}\n\nfunction createGroupLabel(group: FrameGraphDebugGroup, collapsed: boolean): string {\n const summary = group.summary;\n const parts = [\n `${collapsed ? '▸' : '▾'} ${group.label.replace(/\\s+/g, ' ').trim()}`,\n `${summary.retainedNodeCount} nodes` + (summary.culledNodeCount ? ` · ${summary.culledNodeCount} culled` : ''),\n ];\n return parts.join(collapsed ? '\\n' : ' · ');\n}\n\nfunction createNodeTitle(\n node: FrameGraphDebugNode,\n segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined,\n snapshot: FrameGraphDebugViewModel,\n): string {\n const gpu = node.kind === 'external-submission' ? 'Opaque'\n : node.kind !== 'render' && node.kind !== 'compute' ? 'Not applicable'\n : node.gpuDurationMicros === undefined ? 'Not collected' : `${formatGpuDuration(node)} ms`;\n return [\n labelNode(node),\n `kind: ${node.kind}`,\n `group: ${debugGroupPathForId(node.debugGroupId, snapshot)}`,\n `segment: ${segment ? `${segment.index}:${segment.kind}` : '-'}`,\n `CPU duration: ${node.cpuDurationMicros === undefined ? 'Not collected' : (node.cpuDurationMicros / 1000).toFixed(3) + ' ms'}`,\n `GPU duration: ${gpu}`,\n `reads: ${node.reads.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n `writes: ${node.writes.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n ].join('\\n');\n}\n\nfunction createGroupTitle(group: FrameGraphDebugGroup, snapshot: FrameGraphDebugViewModel): string {\n const summary = group.summary;\n return [\n group.path.join(' / '),\n `retained: ${summary.retainedNodeCount}`,\n `culled: ${summary.culledNodeCount}`,\n `inputs: ${summary.inputResources.map(labelResource).join(', ') || '-'}`,\n `outputs: ${summary.outputResources.map(labelResource).join(', ') || '-'}`,\n `transient registered/accessed: ${summary.registeredTransientResourceCount}/${summary.accessedTransientResourceCount}`,\n `physical allocations: ${snapshot.protocol.memory.allocationReport.status === 'available' ? summary.physicalAllocationCount : 'Not collected'}`,\n `segments: ${summary.executionSegmentCount}`,\n `opaque: ${summary.externalSubmissionCount}`,\n `CPU pass sum: ${summary.cpuTimedNodeCount ? (summary.cpuWorkDurationMicros / 1000).toFixed(3) + ' ms' : 'Not collected'} (${summary.cpuTimedNodeCount}/${summary.retainedNodeCount})`,\n `GPU pass sum: ${formatMeasuredGpuWork(summary.gpuWorkDurationMicros, summary.timedNodeCount, summary.timingEligibleNodeCount)}`,\n ].join('\\n');\n}\n\nfunction createResourceTitle(\n resource: FrameGraphDebugResource,\n snapshot: FrameGraphDebugViewModel,\n accesses: readonly FrameGraphDebugAccessEdge[],\n): string {\n return [\n labelResource(resource),\n `kind: ${resource.kind}`,\n `origin: ${resource.origin}`,\n `registered in: ${debugGroupPathForId(resource.debugGroupId, snapshot)}`,\n `lifetime: ${resource.lifetime ? `${resource.lifetime.firstUse}-${resource.lifetime.lastUse}` : '-'}`,\n `physical: ${resource.physicalResourceId ?? '-'}`,\n `reads: ${accesses.filter((access) => access.mode === 'read').length}`,\n `writes: ${accesses.filter((access) => access.mode === 'write').length}`,\n ].join('\\n');\n}\n\nfunction debugGroupPathForId(groupId: string | undefined, snapshot: FrameGraphDebugViewModel): string {\n if (groupId === undefined) return '-';\n return snapshot.debugGroups.find((group) => group.id === groupId)?.path.join(' / ') ?? `#${groupId}`;\n}\n\nfunction executionSegmentByNodeId(snapshot: FrameGraphDebugViewModel) {\n return new Map(snapshot.executionSegments.flatMap((segment) => segment.nodeIds.map((nodeId) => [nodeId, segment] as const)));\n}\n\nfunction segmentLabel(segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined): string {\n return segment ? `[S${segment.index}]` : '[S-]';\n}\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction indexByOptionalId<T>(\n values: readonly T[],\n getId: (value: T) => string | undefined,\n): ReadonlyMap<string | undefined, readonly T[]> {\n const result = new Map<string | undefined, T[]>();\n for (const value of values) {\n const id = getId(value);\n const indexed = result.get(id) ?? [];\n indexed.push(value);\n result.set(id, indexed);\n }\n return result;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';
|
|
2
|
+
import type { Selection } from './panelTypes.ts';
|
|
3
|
+
export declare class GraphSearch {
|
|
4
|
+
private readonly onReveal;
|
|
5
|
+
readonly root: HTMLDivElement;
|
|
6
|
+
private readonly toggle;
|
|
7
|
+
private readonly popover;
|
|
8
|
+
private readonly input;
|
|
9
|
+
private readonly results;
|
|
10
|
+
private entries;
|
|
11
|
+
constructor(onReveal: (selection: Selection) => void, id: string);
|
|
12
|
+
private setOpen;
|
|
13
|
+
setSnapshot(snapshot: FrameGraphDebugViewModel): void;
|
|
14
|
+
private render;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=panelGraphSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelGraphSearch.d.ts","sourceRoot":"","sources":["../src/panelGraphSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,qBAAa,WAAW;IAQX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAPrC,QAAQ,CAAC,IAAI,iBAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,OAAO,CAAqB;gBAEP,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,EAAE,EAAE,EAAE,MAAM;IA+BjF,OAAO,CAAC,OAAO;IAWf,WAAW,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAiBrD,OAAO,CAAC,MAAM;CAsBd"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { labelNode, labelResource } from "./panelDomHelpers.js";
|
|
2
|
+
export class GraphSearch {
|
|
3
|
+
onReveal;
|
|
4
|
+
root = document.createElement('div');
|
|
5
|
+
toggle = document.createElement('button');
|
|
6
|
+
popover = document.createElement('div');
|
|
7
|
+
input = document.createElement('input');
|
|
8
|
+
results = document.createElement('div');
|
|
9
|
+
entries = [];
|
|
10
|
+
constructor(onReveal, id) {
|
|
11
|
+
this.onReveal = onReveal;
|
|
12
|
+
this.root.className = 'zenfg-inspector-graph-search';
|
|
13
|
+
this.toggle.type = 'button';
|
|
14
|
+
this.toggle.textContent = 'Search';
|
|
15
|
+
this.toggle.setAttribute('aria-expanded', 'false');
|
|
16
|
+
this.toggle.setAttribute('aria-controls', id);
|
|
17
|
+
this.toggle.addEventListener('click', () => this.setOpen(this.popover.hidden !== false));
|
|
18
|
+
this.popover.className = 'zenfg-inspector-graph-search-popover';
|
|
19
|
+
this.popover.id = id;
|
|
20
|
+
this.popover.hidden = true;
|
|
21
|
+
this.input.type = 'search';
|
|
22
|
+
this.input.placeholder = 'Find pass, resource, group or output';
|
|
23
|
+
this.input.setAttribute('aria-label', 'Find in graph');
|
|
24
|
+
this.results.className = 'zenfg-inspector-graph-search-results';
|
|
25
|
+
this.results.setAttribute('aria-label', 'Graph search results');
|
|
26
|
+
this.results.hidden = true;
|
|
27
|
+
this.input.addEventListener('input', () => this.render());
|
|
28
|
+
this.root.addEventListener('keydown', (event) => {
|
|
29
|
+
if (event.key === 'Escape' && !this.popover.hidden) {
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
event.stopPropagation();
|
|
32
|
+
this.setOpen(false);
|
|
33
|
+
}
|
|
34
|
+
else if (event.key === 'ArrowDown' && event.target === this.input) {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
this.results.querySelector('button')?.focus();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
this.popover.append(this.input, this.results);
|
|
40
|
+
this.root.append(this.toggle, this.popover);
|
|
41
|
+
}
|
|
42
|
+
setOpen(open) {
|
|
43
|
+
this.popover.hidden = !open;
|
|
44
|
+
this.toggle.setAttribute('aria-expanded', String(open));
|
|
45
|
+
if (open)
|
|
46
|
+
this.input.focus();
|
|
47
|
+
else {
|
|
48
|
+
this.input.value = '';
|
|
49
|
+
this.results.hidden = true;
|
|
50
|
+
this.toggle.focus();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
setSnapshot(snapshot) {
|
|
54
|
+
this.entries = [
|
|
55
|
+
...snapshot.nodes.map((node) => ({ label: labelNode(node), kind: 'Pass',
|
|
56
|
+
text: `${node.id} ${labelNode(node)} ${node.debugGroupId ? snapshot.groupById.get(node.debugGroupId)?.path.join(' / ') : ''}`,
|
|
57
|
+
selection: { kind: 'node', id: node.id } })),
|
|
58
|
+
...snapshot.resources.map((resource) => ({ label: labelResource(resource), kind: 'Resource',
|
|
59
|
+
text: `${resource.id} ${labelResource(resource)}`, selection: { kind: 'resource', id: resource.id } })),
|
|
60
|
+
...snapshot.debugGroups.map((group) => ({ label: group.path.join(' / '), kind: 'Group',
|
|
61
|
+
text: `${group.id} ${group.path.join(' / ')}`, selection: { kind: 'group', pathKey: group.pathKey } })),
|
|
62
|
+
...snapshot.roots.filter((root) => root.reason !== 'side-effect').map((root) => ({
|
|
63
|
+
label: `${root.reason} · ${root.resource ? labelResource(root.resource) : root.key}`, kind: 'Output',
|
|
64
|
+
text: `${root.reason} ${root.resource?.id} ${root.resource?.label}`, selection: { kind: 'root', key: root.key },
|
|
65
|
+
})),
|
|
66
|
+
];
|
|
67
|
+
this.render();
|
|
68
|
+
}
|
|
69
|
+
render() {
|
|
70
|
+
const query = this.input.value.trim().toLocaleLowerCase();
|
|
71
|
+
this.results.replaceChildren();
|
|
72
|
+
this.results.hidden = !query;
|
|
73
|
+
if (!query)
|
|
74
|
+
return;
|
|
75
|
+
const matches = this.entries.filter((entry) => entry.text.toLocaleLowerCase().includes(query));
|
|
76
|
+
const count = document.createElement('p');
|
|
77
|
+
count.setAttribute('role', 'status');
|
|
78
|
+
count.textContent = matches.length > 50 ? `Showing 50 of ${matches.length} results. Refine your search.` : `${matches.length} results`;
|
|
79
|
+
this.results.append(count);
|
|
80
|
+
for (const entry of matches.slice(0, 50)) {
|
|
81
|
+
const button = document.createElement('button');
|
|
82
|
+
button.type = 'button';
|
|
83
|
+
button.textContent = `${entry.kind} · ${entry.label}`;
|
|
84
|
+
button.title = `Show in Graph · ${entry.label}`;
|
|
85
|
+
button.addEventListener('click', () => {
|
|
86
|
+
this.setOpen(false);
|
|
87
|
+
this.onReveal(entry.selection);
|
|
88
|
+
});
|
|
89
|
+
this.results.append(button);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=panelGraphSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelGraphSearch.js","sourceRoot":"","sources":["../src/panelGraphSearch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';\nimport { labelNode, labelResource } from './panelDomHelpers.ts';\nimport type { Selection } from './panelTypes.ts';\n\ntype SearchEntry = { readonly label: string; readonly kind: string; readonly text: string; readonly selection: Selection };\n\nexport class GraphSearch {\n\treadonly root = document.createElement('div');\n\tprivate readonly toggle = document.createElement('button');\n\tprivate readonly popover = document.createElement('div');\n\tprivate readonly input = document.createElement('input');\n\tprivate readonly results = document.createElement('div');\n\tprivate entries: SearchEntry[] = [];\n\n\tconstructor(private readonly onReveal: (selection: Selection) => void, id: string) {\n\t\tthis.root.className = 'zenfg-inspector-graph-search';\n\t\tthis.toggle.type = 'button';\n\t\tthis.toggle.textContent = 'Search';\n\t\tthis.toggle.setAttribute('aria-expanded', 'false');\n\t\tthis.toggle.setAttribute('aria-controls', id);\n\t\tthis.toggle.addEventListener('click', () => this.setOpen(this.popover.hidden !== false));\n\t\tthis.popover.className = 'zenfg-inspector-graph-search-popover';\n\t\tthis.popover.id = id;\n\t\tthis.popover.hidden = true;\n\t\tthis.input.type = 'search';\n\t\tthis.input.placeholder = 'Find pass, resource, group or output';\n\t\tthis.input.setAttribute('aria-label', 'Find in graph');\n\t\tthis.results.className = 'zenfg-inspector-graph-search-results';\n\t\tthis.results.setAttribute('aria-label', 'Graph search results');\n\t\tthis.results.hidden = true;\n\t\tthis.input.addEventListener('input', () => this.render());\n\t\tthis.root.addEventListener('keydown', (event) => {\n\t\t\tif (event.key === 'Escape' && !this.popover.hidden) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis.setOpen(false);\n\t\t\t} else if (event.key === 'ArrowDown' && event.target === this.input) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.results.querySelector('button')?.focus();\n\t\t\t}\n\t\t});\n\t\tthis.popover.append(this.input, this.results);\n\t\tthis.root.append(this.toggle, this.popover);\n\t}\n\n\tprivate setOpen(open: boolean): void {\n\t\tthis.popover.hidden = !open;\n\t\tthis.toggle.setAttribute('aria-expanded', String(open));\n\t\tif (open) this.input.focus();\n\t\telse {\n\t\t\tthis.input.value = '';\n\t\t\tthis.results.hidden = true;\n\t\t\tthis.toggle.focus();\n\t\t}\n\t}\n\n\tsetSnapshot(snapshot: FrameGraphDebugViewModel): void {\n\t\tthis.entries = [\n\t\t\t...snapshot.nodes.map((node): SearchEntry => ({ label: labelNode(node), kind: 'Pass',\n\t\t\t\ttext: `${node.id} ${labelNode(node)} ${node.debugGroupId ? snapshot.groupById.get(node.debugGroupId)?.path.join(' / ') : ''}`,\n\t\t\t\tselection: { kind: 'node', id: node.id } })),\n\t\t\t...snapshot.resources.map((resource): SearchEntry => ({ label: labelResource(resource), kind: 'Resource',\n\t\t\t\ttext: `${resource.id} ${labelResource(resource)}`, selection: { kind: 'resource', id: resource.id } })),\n\t\t\t...snapshot.debugGroups.map((group): SearchEntry => ({ label: group.path.join(' / '), kind: 'Group',\n\t\t\t\ttext: `${group.id} ${group.path.join(' / ')}`, selection: { kind: 'group', pathKey: group.pathKey } })),\n\t\t\t...snapshot.roots.filter((root) => root.reason !== 'side-effect').map((root): SearchEntry => ({\n\t\t\t\tlabel: `${root.reason} · ${root.resource ? labelResource(root.resource) : root.key}`, kind: 'Output',\n\t\t\t\ttext: `${root.reason} ${root.resource?.id} ${root.resource?.label}`, selection: { kind: 'root', key: root.key },\n\t\t\t})),\n\t\t];\n\t\tthis.render();\n\t}\n\n\tprivate render(): void {\n\t\tconst query = this.input.value.trim().toLocaleLowerCase();\n\t\tthis.results.replaceChildren();\n\t\tthis.results.hidden = !query;\n\t\tif (!query) return;\n\t\tconst matches = this.entries.filter((entry) => entry.text.toLocaleLowerCase().includes(query));\n\t\tconst count = document.createElement('p');\n\t\tcount.setAttribute('role', 'status');\n\t\tcount.textContent = matches.length > 50 ? `Showing 50 of ${matches.length} results. Refine your search.` : `${matches.length} results`;\n\t\tthis.results.append(count);\n\t\tfor (const entry of matches.slice(0, 50)) {\n\t\t\tconst button = document.createElement('button');\n\t\t\tbutton.type = 'button';\n\t\t\tbutton.textContent = `${entry.kind} · ${entry.label}`;\n\t\t\tbutton.title = `Show in Graph · ${entry.label}`;\n\t\t\tbutton.addEventListener('click', () => {\n\t\t\t\tthis.setOpen(false);\n\t\t\t\tthis.onReveal(entry.selection);\n\t\t\t});\n\t\t\tthis.results.append(button);\n\t\t}\n\t}\n}\n"]}
|
package/dist/panelGraphView.d.ts
CHANGED
|
@@ -6,4 +6,86 @@ export declare function resolveGraphScene(graphView: GraphViewState, snapshot: F
|
|
|
6
6
|
export declare function fitGraph(graphView: GraphViewState): void;
|
|
7
7
|
export declare function resizeGraph(graphView: GraphViewState): void;
|
|
8
8
|
export declare function destroyGraph(graphView: GraphViewState): void;
|
|
9
|
+
export declare function renderGraphLegend(host: HTMLElement | undefined, snapshot: FrameGraphDebugViewModel, theme?: {
|
|
10
|
+
canvas: string;
|
|
11
|
+
surface: string;
|
|
12
|
+
surfaceRaised: string;
|
|
13
|
+
text: string;
|
|
14
|
+
muted: string;
|
|
15
|
+
render: {
|
|
16
|
+
stroke: string;
|
|
17
|
+
fill: string;
|
|
18
|
+
};
|
|
19
|
+
compute: {
|
|
20
|
+
stroke: string;
|
|
21
|
+
fill: string;
|
|
22
|
+
};
|
|
23
|
+
copy: {
|
|
24
|
+
stroke: string;
|
|
25
|
+
fill: string;
|
|
26
|
+
};
|
|
27
|
+
clear: {
|
|
28
|
+
stroke: string;
|
|
29
|
+
fill: string;
|
|
30
|
+
};
|
|
31
|
+
command: {
|
|
32
|
+
stroke: string;
|
|
33
|
+
fill: string;
|
|
34
|
+
};
|
|
35
|
+
external: {
|
|
36
|
+
stroke: string;
|
|
37
|
+
fill: string;
|
|
38
|
+
};
|
|
39
|
+
declaration: {
|
|
40
|
+
stroke: string;
|
|
41
|
+
fill: string;
|
|
42
|
+
};
|
|
43
|
+
output: {
|
|
44
|
+
stroke: string;
|
|
45
|
+
fill: string;
|
|
46
|
+
};
|
|
47
|
+
texture: {
|
|
48
|
+
stroke: string;
|
|
49
|
+
fill: string;
|
|
50
|
+
};
|
|
51
|
+
buffer: {
|
|
52
|
+
stroke: string;
|
|
53
|
+
fill: string;
|
|
54
|
+
};
|
|
55
|
+
group: {
|
|
56
|
+
stroke: string;
|
|
57
|
+
fill: string;
|
|
58
|
+
alternateFill: string;
|
|
59
|
+
};
|
|
60
|
+
dependency: {
|
|
61
|
+
value: string;
|
|
62
|
+
ordering: string;
|
|
63
|
+
};
|
|
64
|
+
access: {
|
|
65
|
+
read: string;
|
|
66
|
+
write: string;
|
|
67
|
+
};
|
|
68
|
+
selected: string;
|
|
69
|
+
hover: string;
|
|
70
|
+
activeBackground: {
|
|
71
|
+
color: string;
|
|
72
|
+
opacity: number;
|
|
73
|
+
size: number;
|
|
74
|
+
};
|
|
75
|
+
culled: {
|
|
76
|
+
stroke: string;
|
|
77
|
+
fill: string;
|
|
78
|
+
};
|
|
79
|
+
fontFamily: string;
|
|
80
|
+
fontSize: number;
|
|
81
|
+
nodeBorderWidth: number;
|
|
82
|
+
groupBorderWidth: number;
|
|
83
|
+
edgeWidth: number;
|
|
84
|
+
edgeOpacity: number;
|
|
85
|
+
orderingOpacity: number;
|
|
86
|
+
groupOpacity: number;
|
|
87
|
+
arrowScale: number;
|
|
88
|
+
hoverWidth: number;
|
|
89
|
+
selectedWidth: number;
|
|
90
|
+
}, showResourceDeclarations?: boolean): void;
|
|
9
91
|
//# sourceMappingURL=panelGraphView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panelGraphView.d.ts","sourceRoot":"","sources":["../src/panelGraphView.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panelGraphView.d.ts","sourceRoot":"","sources":["../src/panelGraphView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAUjE,wBAAgB,eAAe,CAC3B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,wBAAwB,EAClC,QAAQ,EAAE,SAAS,GAAG,SAAS,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,EAC9B,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,EACxC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,EACnD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACzC,IAAI,CAmCN;AAED,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,wBAAwB,GACnC,UAAU,CAeZ;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAExD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAG3D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI5D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqB,EAAE,wBAAwB,UAAO,GAAG,IAAI,CA4CtK"}
|
package/dist/panelGraphView.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { GRAPH_VISUAL_THEME } from "./panelVisualTheme.js";
|
|
1
2
|
import { CytoscapeGraphRenderer } from "./panelCytoscapeGraphRenderer.js";
|
|
2
3
|
import { createGraphScene } from "./panelGraphScene.js";
|
|
3
4
|
import { createGraphLegend } from "./panelGraphVisuals.js";
|
|
4
5
|
const graphSceneCache = new WeakMap();
|
|
5
6
|
export function renderGraphView(graphView, snapshot, selected, hovered, onSelect, onHover, onToggleGroup) {
|
|
6
7
|
const scene = resolveGraphScene(graphView, snapshot);
|
|
7
|
-
|
|
8
|
+
if (!graphView.theme)
|
|
9
|
+
graphView.refreshTheme?.();
|
|
10
|
+
renderGraphLegend(graphView.legend, snapshot, graphView.theme, graphView.showResourceDeclarations);
|
|
8
11
|
const elementCount = scene.nodes.length + scene.edges.length;
|
|
9
12
|
const layoutElementBudget = graphView.layoutElementBudget ?? Number.MAX_SAFE_INTEGER;
|
|
10
13
|
if (elementCount > layoutElementBudget) {
|
|
@@ -21,20 +24,26 @@ export function renderGraphView(graphView, snapshot, selected, hovered, onSelect
|
|
|
21
24
|
graphView.renderer ??= new CytoscapeGraphRenderer(graphView.host);
|
|
22
25
|
graphView.renderer.render({
|
|
23
26
|
scene,
|
|
27
|
+
theme: graphView.theme,
|
|
28
|
+
onVisible: graphView.refreshTheme,
|
|
24
29
|
selected,
|
|
25
30
|
hovered,
|
|
26
31
|
fit: graphView.fitOnNextRender,
|
|
27
32
|
anchorElementId: graphView.anchorElementIdOnNextRender,
|
|
33
|
+
reveal: graphView.revealOnNextRender,
|
|
34
|
+
captureRevision: graphView.captureRevision,
|
|
28
35
|
onSelect,
|
|
29
36
|
onHover,
|
|
30
37
|
onToggleGroup,
|
|
31
38
|
});
|
|
32
39
|
graphView.fitOnNextRender = false;
|
|
33
40
|
graphView.anchorElementIdOnNextRender = undefined;
|
|
41
|
+
graphView.revealOnNextRender = undefined;
|
|
34
42
|
}
|
|
35
43
|
export function resolveGraphScene(graphView, snapshot) {
|
|
36
44
|
const optionsKey = JSON.stringify([
|
|
37
45
|
graphView.groupsEnabled,
|
|
46
|
+
graphView.showResourceDeclarations ?? true,
|
|
38
47
|
[...graphView.expandedGroupPaths].sort(),
|
|
39
48
|
]);
|
|
40
49
|
const cached = graphSceneCache.get(graphView);
|
|
@@ -42,6 +51,7 @@ export function resolveGraphScene(graphView, snapshot) {
|
|
|
42
51
|
return cached.scene;
|
|
43
52
|
const scene = createGraphScene(snapshot, {
|
|
44
53
|
groupsEnabled: graphView.groupsEnabled,
|
|
54
|
+
showResourceDeclarations: graphView.showResourceDeclarations,
|
|
45
55
|
expandedGroupPaths: graphView.expandedGroupPaths,
|
|
46
56
|
});
|
|
47
57
|
graphSceneCache.set(graphView, { snapshot, optionsKey, scene });
|
|
@@ -51,6 +61,7 @@ export function fitGraph(graphView) {
|
|
|
51
61
|
graphView.renderer?.fit();
|
|
52
62
|
}
|
|
53
63
|
export function resizeGraph(graphView) {
|
|
64
|
+
graphView.refreshTheme?.();
|
|
54
65
|
graphView.renderer?.resize();
|
|
55
66
|
}
|
|
56
67
|
export function destroyGraph(graphView) {
|
|
@@ -58,10 +69,10 @@ export function destroyGraph(graphView) {
|
|
|
58
69
|
graphView.renderer = undefined;
|
|
59
70
|
graphSceneCache.delete(graphView);
|
|
60
71
|
}
|
|
61
|
-
function renderGraphLegend(host, snapshot) {
|
|
72
|
+
export function renderGraphLegend(host, snapshot, theme = GRAPH_VISUAL_THEME, showResourceDeclarations = true) {
|
|
62
73
|
if (!host)
|
|
63
74
|
return;
|
|
64
|
-
const entries = createGraphLegend(snapshot);
|
|
75
|
+
const entries = createGraphLegend(snapshot, theme, showResourceDeclarations);
|
|
65
76
|
const key = JSON.stringify(entries);
|
|
66
77
|
if (host.dataset.legendKey === key)
|
|
67
78
|
return;
|
|
@@ -96,7 +107,7 @@ function renderGraphLegend(host, snapshot) {
|
|
|
96
107
|
svg.setAttribute('aria-hidden', 'true');
|
|
97
108
|
const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
|
|
98
109
|
polygon.setAttribute('points', entry.shape === 'tag'
|
|
99
|
-
? '1,1
|
|
110
|
+
? '1,1 16,1 19,7 16,13 1,13'
|
|
100
111
|
: '4,1 16,1 19,4 19,10 16,13 4,13 1,10 1,4');
|
|
101
112
|
svg.appendChild(polygon);
|
|
102
113
|
swatch.appendChild(svg);
|