Graph

{nodes.length} nodes · {links.length} edges{graph?.truncated ? ' · truncated' : ''} · {Math.round(view.k * 100)}%
{#if allNodeTypes.length}
Nodes {#each allNodeTypes as type} {/each}
{/if} {#if allRelTypes.length}
Edges {#each allRelTypes as type} {/each}
{/if}
{#if loading && !nodes.length} {:else}
{#each allRelTypes as type} {/each} {#each links as link} {@const s = endpoint(link.source)} {@const t = endpoint(link.target)} {#if s?.x != null && t?.x != null && s?.y != null && t?.y != null && activeRelTypes.has(link.type) && visibleNodeIds.has(s.id) && visibleNodeIds.has(t.id)} {@const vs = linkVisualState(link)} {@const dx = t.x - s.x} {@const dy = t.y - s.y} {@const len = Math.max(Math.hypot(dx, dy), 1)} {@const tr = nodeRadius(t) + 3} {@const ex = t.x - (dx / len) * tr} {@const ey = t.y - (dy / len) * tr} {link.type} {#if vs.emphasized && view.k >= 0.7} {link.type} {/if} {/if} {/each} {#each nodes as node (node.id)} {#if node.x != null && node.y != null && visibleNodeIds.has(node.id)} {@const r = nodeRadius(node)} {@const op = nodeOpacity(node)} {@const isFocus = hoveredId === node.id || selected?.id === node.id} {@const isMatch = matchedIds !== null && matchedIds.has(node.id)} onNodePointerDown(e, node)} onpointerenter={() => (hoveredId = node.id)} onpointerleave={() => (hoveredId = null)} onkeydown={(e) => e.key === 'Enter' && selectNode(node)} ondblclick={() => rerootTo(node)} > {#if isFocus || isMatch} {/if} {#if view.k >= 0.8 || isFocus || isMatch || op === 1 && focusIds !== null} {node.slug} {/if} {/if} {/each}
scroll to zoom · drag background to pan · drag nodes · click to inspect · double-click to re-root
{/if}
{ if (!open) selected = null }}> {#if selected} {selected.slug} {selected.type}{selected.state ? ` — ${selected.state}` : ''}

Attributes

{JSON.stringify(selected.attributes, null, 2)}

Relationships

{#each links.filter((l) => endpointId(l.source) === selected!.id || endpointId(l.target) === selected!.id) as link} {@const sId = endpointId(link.source)} {@const other = endpoint(sId === selected!.id ? link.target : link.source)}
{sId === selected!.id ? '→' : '←'} {link.type} {other?.slug ?? '—'}
{:else}

No relationships in this view.

{/each}

Blast radius ({blastRadius.length})

{#each blastRadius as item (item.entity.id)}
{item.entity.slug} depth {item.depth}
{:else}

No downstream dependents.

{/each}
{/if}