@flexkit/studio 0.2.31 → 0.2.32
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/dist/{chat-page-JS5SJ4OG.js → chat-page-7UB3BMBF.js} +3 -3
- package/dist/{chat-page-JS5SJ4OG.js.map → chat-page-7UB3BMBF.js.map} +1 -1
- package/dist/{chunk-KVYQ3O4F.js → chunk-2NQ2RZ2M.js} +3 -3
- package/dist/{chunk-KVYQ3O4F.js.map → chunk-2NQ2RZ2M.js.map} +1 -1
- package/dist/{chunk-57X5WRMY.js → chunk-5AJXR47U.js} +2 -2
- package/dist/{chunk-57X5WRMY.js.map → chunk-5AJXR47U.js.map} +1 -1
- package/dist/{chunk-SZ3DX7XD.js → chunk-AY2RXJWS.js} +2 -2
- package/dist/{chunk-SZ3DX7XD.js.map → chunk-AY2RXJWS.js.map} +1 -1
- package/dist/{chunk-6GXNHR6H.js → chunk-GSGPULRL.js} +2 -2
- package/dist/{chunk-6GXNHR6H.js.map → chunk-GSGPULRL.js.map} +1 -1
- package/dist/{chunk-XLFAJBPN.js → chunk-HZOD2HOF.js} +3 -3
- package/dist/{chunk-XLFAJBPN.js.map → chunk-HZOD2HOF.js.map} +1 -1
- package/dist/{chunk-LF4B2TQI.js → chunk-JAPZBEBZ.js} +9 -9
- package/dist/chunk-JAPZBEBZ.js.map +1 -0
- package/dist/{chunk-W74OKBZG.js → chunk-JWJJZVP3.js} +2 -2
- package/dist/{chunk-W74OKBZG.js.map → chunk-JWJJZVP3.js.map} +1 -1
- package/dist/{chunk-D76P4TER.js → chunk-KR27GOH6.js} +3 -3
- package/dist/{chunk-D76P4TER.js.map → chunk-KR27GOH6.js.map} +1 -1
- package/dist/{chunk-GQTWNWT7.js → chunk-MRHZN4G4.js} +2 -2
- package/dist/{chunk-GQTWNWT7.js.map → chunk-MRHZN4G4.js.map} +1 -1
- package/dist/{chunk-5NQ47SWN.js → chunk-NNISUDZX.js} +3 -3
- package/dist/{chunk-5NQ47SWN.js.map → chunk-NNISUDZX.js.map} +1 -1
- package/dist/{chunk-T4SEZXGL.js → chunk-ONB3FWK5.js} +2 -2
- package/dist/{chunk-T4SEZXGL.js.map → chunk-ONB3FWK5.js.map} +1 -1
- package/dist/{chunk-OMYDXVWS.js → chunk-R2O4WC3H.js} +3 -3
- package/dist/{chunk-OMYDXVWS.js.map → chunk-R2O4WC3H.js.map} +1 -1
- package/dist/{chunk-GXQSNOGM.js → chunk-XV7U33XQ.js} +3 -3
- package/dist/{chunk-GXQSNOGM.js.map → chunk-XV7U33XQ.js.map} +1 -1
- package/dist/{entry-PFXS633U.js → entry-CA2QAEHN.js} +2 -2
- package/dist/{entry-PFXS633U.js.map → entry-CA2QAEHN.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{list-EWWRLK4I.js → list-Q2KAEJ26.js} +3 -3
- package/dist/{list-EWWRLK4I.js.map → list-Q2KAEJ26.js.map} +1 -1
- package/dist/{list-R7SJFXCX.js → list-UMMVRYVD.js} +2 -2
- package/dist/{list-R7SJFXCX.js.map → list-UMMVRYVD.js.map} +1 -1
- package/dist/pages-KZ66JVNU.js +5 -0
- package/dist/pages-KZ66JVNU.js.map +1 -0
- package/dist/{plugin-pages-X3V2VPAU.js → plugin-pages-SR2WSUKZ.js} +2 -2
- package/dist/{plugin-pages-X3V2VPAU.js.map → plugin-pages-SR2WSUKZ.js.map} +1 -1
- package/dist/record-links-3WZGSVFU.js +2 -0
- package/dist/{record-links-VH2TPCK4.js.map → record-links-3WZGSVFU.js.map} +1 -1
- package/dist/{root-OJ4UFMRX.js → root-2VBLPRG7.js} +2 -2
- package/dist/{root-OJ4UFMRX.js.map → root-2VBLPRG7.js.map} +1 -1
- package/dist/{root-HQQ4TNTR.js → root-6QTQUYK4.js} +2 -2
- package/dist/{root-HQQ4TNTR.js.map → root-6QTQUYK4.js.map} +1 -1
- package/dist/{root-NYAXP66A.js → root-7BUVDOMV.js} +3 -3
- package/dist/{root-NYAXP66A.js.map → root-7BUVDOMV.js.map} +1 -1
- package/dist/{root-7YXE6DEA.js → root-FZLKYL5W.js} +3 -3
- package/dist/{root-7YXE6DEA.js.map → root-FZLKYL5W.js.map} +1 -1
- package/dist/{root-4QRY7KAC.js → root-LFJ5BQSY.js} +3 -3
- package/dist/{root-4QRY7KAC.js.map → root-LFJ5BQSY.js.map} +1 -1
- package/dist/{root-FNXHGVQT.js → root-OXS3QQX6.js} +2 -2
- package/dist/{root-FNXHGVQT.js.map → root-OXS3QQX6.js.map} +1 -1
- package/dist/{search-LSIHN6OI.js → search-AZK3Q2KX.js} +2 -2
- package/dist/{search-LSIHN6OI.js.map → search-AZK3Q2KX.js.map} +1 -1
- package/dist/{skills-pages-W47HECK3.js → skills-pages-7IYBJ4QI.js} +2 -2
- package/dist/{skills-pages-W47HECK3.js.map → skills-pages-7IYBJ4QI.js.map} +1 -1
- package/dist/{source-3N7BQVYO.js → source-4BP5PJ2N.js} +2 -2
- package/dist/{source-3N7BQVYO.js.map → source-4BP5PJ2N.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-LF4B2TQI.js.map +0 -1
- package/dist/pages-UKJWXOMO.js +0 -5
- package/dist/pages-UKJWXOMO.js.map +0 -1
- package/dist/record-links-VH2TPCK4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/graph/layout.ts","../src/apps/graph/canvas.tsx","../src/apps/graph/context-menu.tsx","../src/apps/graph/scene.ts","../src/apps/graph/inspector.tsx","../src/apps/graph/query-editor.tsx","../src/apps/graph/query.ts","../src/apps/graph/use-graphql-schema.ts","../src/apps/graph/query-pane.tsx","../src/apps/graph/sidebar.tsx","../src/apps/graph/toolbar.tsx","../src/apps/graph/use-scene.ts","../src/apps/graph/root.tsx"],"names":["layoutBudget","order","isSettled","mean","max","diagonal","threshold","PLACEMENT_RADIUS","SETTLE_INTERVAL_MS","SETTLE_MIN_MS","SETTLE_QUIET_SAMPLES","nodeSize","degree","ringRadius","count","ringPositions","center","radius","phase","_","index","angle","distance","isPositioned","graph","key","placedExtent","placed","sum","reach","placeNewNodes","added","groups","anchor","neighbour","keys","positions","extent","position","PositionTracker","cursor","_key","attributes","total","free","minX","minY","maxX","maxY","x","y","moved","syncGraph","scene","colors","changed","hadNodes","node","edge","GraphCanvas","theme","apiRef","onSelect","onContextMenu","onExpand","onPin","onLayoutChange","containerRef","useRef","graphRef","rendererRef","layoutRef","layoutTimerRef","dragRef","dragLayoutRef","settleTimerRef","layoutDeadlineRef","heldRef","pinnedRef","hoverRef","callbacksRef","mountAttempt","setMountAttempt","useState","Graph","stopLayout","useCallback","startLayout","budgetMs","hold","inferred","forceAtlas2","layout","FA2LayoutSupervisor","drag","startedAt","tracker","hasMoved","quietSamples","onBudget","movement","applyHover","renderer","previous","nodes","useEffect","container","observer","attempt","isDark","Sigma","DEFAULT_STYLES","_attributes","state","graphState","event","original","holdAllBut","wasRunning","camera","handleCameraUpdate","ratio","isZoomedIn","preventContextMenu","sizeObserver","hidden","pinsChanged","fixed","source","target","jsx","GraphContextMenu","menu","relationships","isPinned","onClose","onExpandAll","onExpandAttribute","onHide","onHideOthers","onTogglePin","onOpenRecord","jsxs","DropdownMenu","open","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","attribute","DropdownMenuSeparator","EMPTY_SCENE","mergeCounts","current","incoming","next","perAttribute","mergeFetched","merged","offset","withoutNodes","dropped","edges","pinned","sceneReducer","action","existing","MAX_NODES","kept","entity","countNodesByEntity","result","countEdgesByAttribute","neighbourKeys","getTextColorOn","hex","r","g","b","channel","GraphInspector","schema","scope","isLoading","getEntity","detailsDocument","useMemo","gql","buildDetailsQuery","countsDocument","buildCountsQuery","details","useQuery","counts","record","countRecord","onCanvas","getRelationshipAttributes","getDetailAttributes","updatedAt","color","getEntityLabel","Button","XIcon","SquareArrowOutUpRightIcon","Tooltip","TooltipTrigger","LoaderCircleIcon","ExpandIcon","TooltipContent","EyeOffIcon","formatDetailValue","formatDistance","relatedEntity","shown","fetched","exhausted","editorChrome","EditorView","QueryEditor","ariaLabel","value","onChange","onRun","parentRef","viewRef","themeCompartmentRef","Compartment","onChangeRef","onRunRef","valueRef","parent","view","EditorState","lineNumbers","highlightActiveLineGutter","highlightSpecialChars","history","foldGutter","drawSelection","dropCursor","indentOnInput","bracketMatching","closeBrackets","highlightActiveLine","Prec","keymap","closeBracketsKeymap","defaultKeymap","historyKeymap","foldKeymap","indentWithTab","graphql","update","placeholderExtension","darkTheme","lightTheme","updateSchema","TABLE_ROW_LIMIT","EXAMPLE_RELATED_LIMIT","EXAMPLE_RELATIONSHIPS","isRecord","collectRecords","entityOfRootField","field","plural","relationshipOfKey","name","relationshipTo","entityOfRecord","fallback","typename","captionFromRecord","caption","captionOf","text","graphFromQueryResult","data","addRecord","nodeKey","label","keyAttribute","keyEntity","relatedRecord","edgeOf","exampleQueries","getGraphEntities","related","getDisplaySelection","display","formatCell","records","item","collectRows","tableFromResult","columns","column","stripTypename","queryStorageKey","projectId","schemaCache","introspect","client","hash","cached","getIntrospectionQuery","USER_QUERY_CONTEXT","buildClientSchema","useGraphQLSchema","schemaHash","useApolloClient","setSchema","cancelled","loaded","QueryPane","isRunning","opened","setOpened","graphqlSchema","examples","query","setQuery","readComposerDraft","seededRef","append","setAppend","tab","setTab","run","setRun","table","json","first","writeComposerDraft","execute","ChevronDownIcon","example","PlayIcon","Tabs","TabsList","TabsTrigger","TabsContent","Checkbox","checked","Label","Table","TableHeader","TableRow","TableHead","TableBody","row","TableCell","SEARCH_DEBOUNCE_MS","SEARCH_HITS_PER_ENTITY","buildSearchRequest","entities","q","trimmed","useTotals","countable","getTotalEntities","document","buildTotalsQuery","pair","GraphSidebar","hiddenEntities","onStart","onHit","onToggleEntity","debouncedQuery","useDebounce","searchable","request","results","useSearch","totals","entityByName","onCanvasEntities","Sidebar","SidebarContent","SidebarGroup","SearchIcon","Input","hit","getDisplayAttribute","SidebarGroupLabel","SidebarMenu","SidebarMenuItem","SidebarMenuButton","id","SidebarRail","ToolbarButton","icon","disabled","onClick","GraphToolbar","hasSelection","hasNodes","onFit","onClear","ScanIcon","Separator","EraserIcon","errorMessage","error","useScene","dispatch","useReducer","pending","setPending","loadsRef","loadRecords","selection","ids","expand","limit","buildRecordsQuery","graphFromRecords","fetchedFromRecords","toast","expandAll","expandAttribute","buildExpandQuery","EXPAND_PAGE","received","runQuery","loadsAtStart","Root","currentProjectId","currentProject","currentProjectSchema","useConfig","trackStudioEvent","auth","useAuth","useAppContext","resolvedTheme","useTheme","location","useLocation","dispatchAction","useDispatch","defaultScope","scopeField","userSpaces","filterEntitiesForSpaces","getEntityColors","canvasApi","setMenu","isLayoutRunning","setIsLayoutRunning","mode","setMode","loadedSearchRef","selectedNode","menuNode","menuEntity","nodeCount","edgeCount","defaultOpen","readSidebarCookieState","select","openRecord","hide","hideOthers","togglePin","pin","entityName","expandAttributeAndClose","params","parseGraphParams","EXPAND_HOP_MAX_RECORDS","SAMPLE_LIMIT","SidebarProvider","SidebarInset","SidebarTrigger"],"mappings":"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","file":"root-4QRY7KAC.js","sourcesContent":["/**\n * Pure layout rules of the canvas: how long the force layout may run, when\n * it counts as settled, and when a graph is too dense for labels everywhere.\n */\n\n/** Above this many nodes, labels show only around the pointer and the selection unless zoomed in. */\nexport const DENSE_NODES = 300;\n\n/** Camera ratio below which a dense graph shows labels again (1 = the whole graph in view). */\nexport const ZOOMED_IN_RATIO = 0.45;\n\n/** The longest the force layout runs after a change: 2 s for a few nodes, 20 s at the cap. */\nexport function layoutBudget(order: number): number {\n return Math.min(20000, 2000 + order * 9);\n}\n\n/** How much the free nodes moved since the last sample, and the graph's extent. */\nexport interface LayoutMovement {\n /** Mean move of the nodes the layout may move. */\n mean: number;\n /** Largest move of any of them: a few new nodes still flying in keep the layout going. */\n max: number;\n /** Bounding-box diagonal of the whole graph. */\n diagonal: number;\n}\n\n/**\n * Whether the layout has settled: the mean move per free node is a sliver\n * of the graph's extent and no node is still travelling, with a floor so a\n * tiny graph settles too.\n */\nexport function isSettled({ mean, max, diagonal }: LayoutMovement): boolean {\n const threshold = Math.max(0.05, diagonal * 0.0015);\n\n return mean < threshold && max < threshold * 20;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { JSX, MutableRefObject } from 'react';\nimport Graph from 'graphology';\nimport type { Attributes } from 'graphology-types';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\nimport FA2LayoutSupervisor from 'graphology-layout-forceatlas2/worker';\nimport Sigma, { DEFAULT_STYLES } from 'sigma';\nimport { DENSE_NODES, isSettled, layoutBudget, ZOOMED_IN_RATIO, type LayoutMovement } from './layout';\nimport type { SceneState } from './scene';\n\ntype NodeAttributes = {\n entity: string;\n label: string;\n color: string;\n size: number;\n x: number;\n y: number;\n fixed?: boolean;\n};\ntype EdgeAttributes = { size: number };\n/** A neighbour of the hovered node, for its label. */\ntype NodeState = { isNeighbour: boolean };\ntype EdgeState = Record<string, never>;\n/** Too many nodes for labels everywhere; zoomed in far enough to show them anyway. */\ntype GraphState = { isDense: boolean; isZoomedIn: boolean };\ntype Renderer = Sigma<NodeAttributes, EdgeAttributes, Attributes, NodeState, EdgeState, GraphState>;\n\nexport interface GraphCanvasApi {\n /** Brings the whole graph into view. */\n fit: () => void;\n}\n\nexport interface GraphCanvasProps {\n scene: SceneState;\n colors: { [entity: string]: string };\n theme: 'light' | 'dark';\n apiRef: MutableRefObject<GraphCanvasApi | null>;\n onSelect: (key: string | null) => void;\n onContextMenu: (key: string, position: { x: number; y: number }) => void;\n onExpand: (key: string) => void;\n onPin: (key: string) => void;\n onLayoutChange: (running: boolean) => void;\n}\n\n/** Spread of new nodes around the node they came from, in graph units. */\nconst PLACEMENT_RADIUS = 40;\n/** How often the layout is checked for movement. */\nconst SETTLE_INTERVAL_MS = 400;\n/** The layout runs at least this long before it may be called settled. */\nconst SETTLE_MIN_MS = 1200;\n/** Two quiet samples in a row, after the worker first moved something, end the layout. */\nconst SETTLE_QUIET_SAMPLES = 2;\n\nfunction nodeSize(degree: number): number {\n return 5 + Math.min(10, Math.sqrt(degree) * 2);\n}\n\ntype Point = { x: number; y: number };\n\n/** The ring new nodes start on: wider the more of them share an anchor, so they do not explode apart. */\nfunction ringRadius(count: number): number {\n return PLACEMENT_RADIUS * (0.8 + Math.sqrt(count) * 0.6);\n}\n\n/**\n * Evenly spaced positions on a ring, with a little jitter so no two coincide\n * and a random phase so a lone newcomer can land on any side of its anchor.\n */\nfunction ringPositions(center: Point, count: number, radius: number): Point[] {\n const phase = Math.random() * Math.PI * 2;\n\n return Array.from({ length: count }, (_, index) => {\n const angle = phase + (index / count) * Math.PI * 2 + Math.random() * 0.3;\n const distance = radius * (0.9 + Math.random() * 0.2);\n\n return { x: center.x + Math.cos(angle) * distance, y: center.y + Math.sin(angle) * distance };\n });\n}\n\nfunction isPositioned(graph: Graph<NodeAttributes, EdgeAttributes>, key: string): boolean {\n return !Number.isNaN(graph.getNodeAttribute(key, 'x'));\n}\n\n/** Centre and reach of the nodes already placed, to put unanchored newcomers beyond them. */\nfunction placedExtent(\n graph: Graph<NodeAttributes, EdgeAttributes>,\n placed: string[]\n): { center: Point; reach: number } {\n if (placed.length === 0) {\n return { center: { x: 0, y: 0 }, reach: 0 };\n }\n\n const center = placed.reduce(\n (sum, key) => ({ x: sum.x + graph.getNodeAttribute(key, 'x'), y: sum.y + graph.getNodeAttribute(key, 'y') }),\n { x: 0, y: 0 }\n );\n center.x /= placed.length;\n center.y /= placed.length;\n const reach = placed.reduce(\n (max, key) =>\n Math.max(\n max,\n Math.hypot(graph.getNodeAttribute(key, 'x') - center.x, graph.getNodeAttribute(key, 'y') - center.y)\n ),\n 0\n );\n\n return { center, reach };\n}\n\n/**\n * Places new nodes: those sharing an anchor already on the canvas go on a\n * ring around it, the rest on a ring beyond everything placed so far.\n */\nfunction placeNewNodes(graph: Graph<NodeAttributes, EdgeAttributes>, added: Set<string>): void {\n const groups = new Map<string | null, string[]>();\n added.forEach((key) => {\n const anchor =\n graph.neighbors(key).find((neighbour) => !added.has(neighbour) && isPositioned(graph, neighbour)) ?? null;\n groups.set(anchor, [...(groups.get(anchor) ?? []), key]);\n });\n groups.forEach((keys, anchor) => {\n let positions: Point[];\n\n if (anchor) {\n const center = { x: graph.getNodeAttribute(anchor, 'x'), y: graph.getNodeAttribute(anchor, 'y') };\n positions = ringPositions(center, keys.length, ringRadius(keys.length));\n } else {\n const placed = graph.nodes().filter((key) => !added.has(key) && isPositioned(graph, key));\n const extent = placedExtent(graph, placed);\n positions = ringPositions(extent.center, keys.length, extent.reach + ringRadius(keys.length));\n }\n\n positions.forEach((position, index) => graph.mergeNodeAttributes(keys[index]!, position));\n });\n}\n\n/**\n * Positions of every node, kept in one typed array the layout's movement is\n * measured against: one pass per sample, no allocation.\n */\nclass PositionTracker {\n private positions: Float64Array;\n\n constructor(private readonly graph: Graph<NodeAttributes, EdgeAttributes>) {\n this.positions = new Float64Array(graph.order * 2);\n let cursor = 0;\n this.graph.forEachNode((_key, attributes) => {\n this.positions[cursor] = attributes.x;\n this.positions[cursor + 1] = attributes.y;\n cursor += 2;\n });\n }\n\n /** Movement since the last call, then remembers the current positions. */\n measure(): LayoutMovement {\n const { graph, positions } = this;\n let total = 0;\n let max = 0;\n let free = 0;\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n let index = 0;\n graph.forEachNode((_key, attributes) => {\n const { x, y } = attributes;\n\n if (index + 1 < positions.length && !attributes.fixed) {\n const moved = Math.hypot(x - positions[index]!, y - positions[index + 1]!);\n total += moved;\n max = Math.max(max, moved);\n free += 1;\n }\n\n positions[index] = x;\n positions[index + 1] = y;\n index += 2;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n });\n\n return {\n mean: free > 0 ? total / free : 0,\n max,\n diagonal: graph.order > 0 ? Math.hypot(maxX - minX, maxY - minY) : 0,\n };\n }\n}\n\n/**\n * Adds the scene's new nodes and edges to the graph, drops the removed ones\n * and places new nodes around what is already on the canvas. Reports what\n * was added and whether anything was placed before.\n */\nfunction syncGraph(\n graph: Graph<NodeAttributes, EdgeAttributes>,\n scene: SceneState,\n colors: { [entity: string]: string }\n): { changed: boolean; added: Set<string>; hadNodes: boolean } {\n let changed = false;\n const added = new Set<string>();\n const hadNodes = graph.order > 0;\n\n graph.forEachNode((key) => {\n if (!scene.nodes[key]) {\n graph.dropNode(key);\n changed = true;\n }\n });\n Object.values(scene.nodes).forEach((node) => {\n if (graph.hasNode(node.key)) {\n // A re-captioned node: sigma redraws on the attribute change, no layout needed.\n if (graph.getNodeAttribute(node.key, 'label') !== node.label) {\n graph.setNodeAttribute(node.key, 'label', node.label);\n }\n\n return;\n }\n\n graph.addNode(node.key, {\n entity: node.entity,\n label: node.label,\n color: colors[node.entity] ?? '#71717a',\n size: 5,\n x: Number.NaN,\n y: Number.NaN,\n });\n added.add(node.key);\n changed = true;\n });\n graph.forEachEdge((key) => {\n if (!scene.edges[key]) {\n graph.dropEdge(key);\n changed = true;\n }\n });\n // A multigraph: two relationships between the same records are two edges.\n Object.values(scene.edges).forEach((edge) => {\n if (!graph.hasEdge(edge.key)) {\n graph.addEdgeWithKey(edge.key, edge.source, edge.target, { size: 1 });\n changed = true;\n }\n });\n\n placeNewNodes(graph, added);\n\n if (changed) {\n graph.forEachNode((key) => {\n graph.setNodeAttribute(key, 'size', nodeSize(graph.degree(key)));\n });\n }\n\n return { changed, added, hadNodes };\n}\n\n/**\n * The WebGL canvas: a graphology graph that lives as long as the component,\n * rendered by sigma and laid out by ForceAtlas2 in a web worker until it\n * settles after every change. Selection, hover, entity visibility and pins\n * are sigma states and node attributes; the scene stays the source of truth.\n */\nexport function GraphCanvas({\n scene,\n colors,\n theme,\n apiRef,\n onSelect,\n onContextMenu,\n onExpand,\n onPin,\n onLayoutChange,\n}: GraphCanvasProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null);\n const graphRef = useRef<Graph<NodeAttributes, EdgeAttributes> | null>(null);\n const rendererRef = useRef<Renderer | null>(null);\n const layoutRef = useRef<FA2LayoutSupervisor | null>(null);\n const layoutTimerRef = useRef<number | null>(null);\n /** The node under the pointer while one is dragged, with the pointer's graph position. */\n const dragRef = useRef<{ node: string; x: number; y: number } | null>(null);\n /** The layout a drag started, so a drop restarts only that one. */\n const dragLayoutRef = useRef<FA2LayoutSupervisor | null>(null);\n const settleTimerRef = useRef<number | null>(null);\n const layoutDeadlineRef = useRef<number | null>(null);\n /** Nodes held still for the running layout so only newcomers move. */\n const heldRef = useRef<Set<string>>(new Set());\n const pinnedRef = useRef<SceneState['pinned']>(scene.pinned);\n pinnedRef.current = scene.pinned;\n /** The hovered node and the neighbours marked around it. */\n const hoverRef = useRef<{ key: string | null; nodes: string[] }>({ key: null, nodes: [] });\n const callbacksRef = useRef({ onSelect, onContextMenu, onExpand, onPin, onLayoutChange });\n const [mountAttempt, setMountAttempt] = useState(0);\n callbacksRef.current = { onSelect, onContextMenu, onExpand, onPin, onLayoutChange };\n\n if (!graphRef.current) {\n graphRef.current = new Graph<NodeAttributes, EdgeAttributes>({ type: 'undirected', multi: true });\n }\n\n const stopLayout = useCallback((): void => {\n if (layoutTimerRef.current !== null) {\n window.clearTimeout(layoutTimerRef.current);\n layoutTimerRef.current = null;\n }\n\n if (settleTimerRef.current !== null) {\n window.clearInterval(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n\n if (layoutRef.current) {\n layoutRef.current.kill();\n layoutRef.current = null;\n layoutDeadlineRef.current = null;\n callbacksRef.current.onLayoutChange(false);\n }\n\n const graph = graphRef.current;\n heldRef.current.forEach((key) => {\n if (graph?.hasNode(key)) {\n graph.setNodeAttribute(key, 'fixed', pinnedRef.current[key] === true);\n }\n });\n heldRef.current = new Set();\n }, []);\n\n // The worker reads `fixed` only when it (re)builds its matrices, so a new\n // supervisor is needed whenever pins change while a layout runs. The\n // layout stops once the nodes stop moving, or at the budget. Nodes in\n // `hold` stay where they are, so adding to a settled canvas moves only\n // the newcomers instead of shaking everything.\n const startLayout = useCallback(\n (budgetMs: number, hold: string[] = []): void => {\n const graph = graphRef.current;\n stopLayout();\n\n if (!graph || graph.order === 0) {\n return;\n }\n\n heldRef.current = new Set(hold.filter((key) => graph.hasNode(key)));\n heldRef.current.forEach((key) => graph.setNodeAttribute(key, 'fixed', true));\n\n // Nothing free to move (say, a dragged node without neighbours): a run would never settle.\n if (!graph.someNode((_key, attributes) => !attributes.fixed)) {\n stopLayout();\n\n return;\n }\n\n const inferred = forceAtlas2.inferSettings(graph);\n const layout = new FA2LayoutSupervisor(graph, {\n // Gentle gravity keeps loose parts near the rest; the extra slowdown keeps the motion calm.\n settings: { ...inferred, adjustSizes: true, gravity: 0.2, slowDown: (inferred.slowDown ?? 1) * 2 },\n // A dragged node stays under the pointer: the worker's positions are\n // overridden for it, and with a reducer set the supervisor reads the\n // graph's positions back into the worker, so the neighbours follow.\n outputReducer: (key: string, attributes: NodeAttributes): NodeAttributes => {\n const drag = dragRef.current;\n\n if (drag && drag.node === key) {\n attributes.x = drag.x;\n attributes.y = drag.y;\n }\n\n return attributes;\n },\n });\n const startedAt = performance.now();\n const tracker = new PositionTracker(graph);\n let hasMoved = false;\n let quietSamples = 0;\n layoutRef.current = layout;\n layoutDeadlineRef.current = startedAt + budgetMs;\n layout.start();\n callbacksRef.current.onLayoutChange(true);\n // While a node is dragged the layout runs on: the budget is extended and settling does not stop it.\n const onBudget = (): void => {\n if (dragRef.current) {\n layoutDeadlineRef.current = performance.now() + budgetMs;\n layoutTimerRef.current = window.setTimeout(onBudget, budgetMs);\n } else {\n stopLayout();\n }\n };\n layoutTimerRef.current = window.setTimeout(onBudget, budgetMs);\n settleTimerRef.current = window.setInterval(() => {\n const movement = tracker.measure();\n\n if (dragRef.current) {\n quietSamples = 0;\n\n return;\n }\n\n // The worker needs a moment to spawn; quiet samples before its first\n // positions arrive say nothing about the layout.\n hasMoved = hasMoved || movement.max > 0;\n quietSamples = hasMoved && isSettled(movement) ? quietSamples + 1 : 0;\n\n if (quietSamples >= SETTLE_QUIET_SAMPLES && performance.now() - startedAt >= SETTLE_MIN_MS) {\n stopLayout();\n }\n }, SETTLE_INTERVAL_MS);\n },\n [stopLayout]\n );\n\n /**\n * Marks the hovered node's neighbours so their labels show, clearing the\n * previous marks first. Re-run after the graph changes so nodes added\n * under the pointer are marked too, and marks of dropped nodes go away.\n */\n const applyHover = useCallback((key: string | null): void => {\n const graph = graphRef.current;\n const renderer = rendererRef.current;\n\n if (!graph || !renderer) {\n return;\n }\n\n const previous = hoverRef.current;\n renderer.setNodesState(\n previous.nodes.filter((node) => graph.hasNode(node)),\n { isNeighbour: false }\n );\n\n if (key && graph.hasNode(key)) {\n const nodes = graph.neighbors(key);\n renderer.setNodesState(nodes, { isNeighbour: true });\n hoverRef.current = { key, nodes };\n } else {\n hoverRef.current = { key: null, nodes: [] };\n }\n }, []);\n\n // The renderer: created per theme (styles are fixed at construction) over\n // the persistent graph.\n useEffect(() => {\n const container = containerRef.current;\n const graph = graphRef.current;\n\n if (!container || !graph) {\n return undefined;\n }\n\n // Sigma throws when the container has no size yet (first paint of a lazy\n // route, hidden app); wait for the box to get one before mounting.\n if (container.clientWidth === 0 || container.clientHeight === 0) {\n const observer = new ResizeObserver(() => {\n if (container.clientWidth > 0 && container.clientHeight > 0) {\n observer.disconnect();\n setMountAttempt((attempt) => attempt + 1);\n }\n });\n observer.observe(container);\n\n return () => observer.disconnect();\n }\n\n const isDark = theme === 'dark';\n const renderer: Renderer = new Sigma<NodeAttributes, EdgeAttributes, Attributes, NodeState, EdgeState, GraphState>(\n graph,\n container,\n {\n customNodeState: { isNeighbour: false },\n customEdgeState: {},\n customGraphState: { isDense: graph.order > DENSE_NODES, isZoomedIn: false },\n settings: {\n // Every render starts with a resize, which would throw while the\n // app is hidden but kept mounted; a hidden canvas renders at 1 px\n // instead and the size observer restores it when it shows again.\n allowInvalidContainer: true,\n itemSizesReference: 'screen',\n enableNodeDrag: true,\n renderEdgeLabels: false,\n labelRenderedSizeThreshold: 7,\n labelDensity: 0.1,\n labelGridCellSize: 80,\n },\n styles: {\n nodes: [\n {\n ...DEFAULT_STYLES.nodes,\n size: {\n whenState: 'isHighlighted',\n then: (attributes: NodeAttributes) => attributes.size + 5,\n else: {\n whenState: 'isHovered',\n then: (attributes: NodeAttributes) => attributes.size + 2,\n else: { attribute: 'size' },\n },\n },\n cursor: 'pointer',\n labelColor: isDark ? '#e4e4e7' : '#18181b',\n labelSize: 12,\n labelFont: 'ui-sans-serif, system-ui, sans-serif',\n // Dense graphs label only the pointer's surroundings and the\n // selection until zoomed in. Neighbours always go through the\n // label grid: a hub's many neighbours would otherwise pile up.\n labelVisibility: (_attributes, state, graphState) => {\n if (state.isHovered || state.isHighlighted) {\n return 'visible';\n }\n\n return graphState.isDense && !graphState.isZoomedIn && !state.isNeighbour ? 'hidden' : 'auto';\n },\n backdropColor: isDark ? '#27272a' : '#ffffff',\n backdropShadowColor: isDark ? 'rgba(0, 0, 0, 0.6)' : 'rgba(0, 0, 0, 0.25)',\n },\n ],\n edges: [\n {\n ...DEFAULT_STYLES.edges,\n color: isDark ? '#3f3f46' : '#d4d4d8',\n size: 1,\n },\n ],\n },\n }\n );\n rendererRef.current = renderer;\n\n renderer.on('clickNode', ({ node }) => {\n callbacksRef.current.onSelect(node);\n });\n renderer.on('clickStage', () => {\n callbacksRef.current.onSelect(null);\n });\n renderer.on('doubleClickNode', ({ node, event }) => {\n event.preventSigmaDefault();\n callbacksRef.current.onExpand(node);\n });\n renderer.on('rightClickNode', ({ node, event }) => {\n event.preventSigmaDefault();\n const original = event.original as MouseEvent;\n original.preventDefault();\n callbacksRef.current.onSelect(node);\n callbacksRef.current.onContextMenu(node, { x: original.clientX, y: original.clientY });\n });\n renderer.on('enterNode', ({ node }) => applyHover(node));\n renderer.on('leaveNode', () => applyHover(null));\n // Dragging a node pulls its neighbours along: the layout runs while the\n // drag lasts with the node held under the pointer, so a cluster can be\n // pulled apart. Everything else is held, so the rest of the canvas\n // stays still, and a canvas without relationships has nothing to pull on.\n const holdAllBut = (node: string): string[] => {\n const free = new Set([node, ...graph.neighbors(node)]);\n\n return graph.nodes().filter((key) => key === node || !free.has(key));\n };\n renderer.on('nodeDragStart', ({ node }) => {\n dragRef.current = { node, x: graph.getNodeAttribute(node, 'x'), y: graph.getNodeAttribute(node, 'y') };\n\n if (graph.size > 0) {\n startLayout(layoutBudget(graph.order), holdAllBut(node));\n dragLayoutRef.current = layoutRef.current;\n } else {\n stopLayout();\n graph.setNodeAttribute(node, 'fixed', true);\n }\n });\n renderer.on('nodeDrag', ({ node }) => {\n if (dragRef.current?.node === node) {\n dragRef.current.x = graph.getNodeAttribute(node, 'x');\n dragRef.current.y = graph.getNodeAttribute(node, 'y');\n }\n });\n renderer.on('nodeDragEnd', ({ node }) => {\n // A scene change during the drag replaced its layout with one settling\n // newcomers; that one keeps running, with the drop pinned by the scene.\n const wasRunning =\n dragRef.current !== null && layoutRef.current !== null && layoutRef.current === dragLayoutRef.current;\n dragRef.current = null;\n dragLayoutRef.current = null;\n callbacksRef.current.onPin(node);\n\n // The node stays where it was dropped while its neighbours settle around it.\n if (wasRunning) {\n startLayout(layoutBudget(graph.order), holdAllBut(node));\n }\n });\n\n const camera = renderer.getCamera();\n const handleCameraUpdate = ({ ratio }: { ratio: number }): void => {\n const isZoomedIn = ratio < ZOOMED_IN_RATIO;\n\n if (renderer.getGraphState().isZoomedIn !== isZoomedIn) {\n renderer.setGraphState({ isZoomedIn });\n }\n };\n camera.on('updated', handleCameraUpdate);\n\n const preventContextMenu = (event: MouseEvent): void => event.preventDefault();\n container.addEventListener('contextmenu', preventContextMenu);\n\n // Sigma only watches the window: the canvases must follow the container\n // when a pane opens beside it, or they keep their size and overflow it.\n const sizeObserver = new ResizeObserver(() => {\n if (container.clientWidth > 0 && container.clientHeight > 0) {\n renderer.resize();\n renderer.scheduleRefresh();\n }\n });\n sizeObserver.observe(container);\n\n apiRef.current = {\n fit: () => {\n void camera.reset({ duration: 300 });\n },\n };\n\n return () => {\n sizeObserver.disconnect();\n camera.off('updated', handleCameraUpdate);\n container.removeEventListener('contextmenu', preventContextMenu);\n apiRef.current = null;\n rendererRef.current = null;\n hoverRef.current = { key: null, nodes: [] };\n renderer.kill();\n };\n }, [theme, mountAttempt, apiRef, startLayout, stopLayout, applyHover]);\n\n // Scene changes: sync the graph, then let the layout settle the new nodes.\n useEffect(() => {\n const graph = graphRef.current;\n\n if (!graph) {\n return;\n }\n\n // The layout's supervisor respawns its worker on every graph change, on\n // a timer that outlives `kill()`: stop it before the graph is touched.\n stopLayout();\n const { changed, added, hadNodes } = syncGraph(graph, scene, colors);\n\n if (!changed) {\n return;\n }\n\n rendererRef.current?.setGraphState({ isDense: graph.order > DENSE_NODES });\n // Nodes added under the pointer get their hover marks; marks of dropped nodes go.\n applyHover(graph.hasNode(hoverRef.current.key ?? '') ? hoverRef.current.key : null);\n\n // Nothing to pull on: a bare sample stays on its ring.\n if (graph.size === 0) {\n stopLayout();\n\n return;\n }\n\n // Adding to a placed canvas: hold what is there, settle the newcomers.\n const hold = hadNodes && added.size > 0 ? graph.nodes().filter((key) => !added.has(key)) : [];\n startLayout(layoutBudget(hold.length > 0 ? added.size : graph.order), hold);\n // Nodes and edges only change with the scene version; colours are applied by their own effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- see above\n }, [scene.version]);\n\n // Theme change: recolour the nodes.\n useEffect(() => {\n const graph = graphRef.current;\n\n if (!graph) {\n return;\n }\n\n graph.forEachNode((key, attributes) => {\n graph.setNodeAttribute(key, 'color', colors[attributes.entity] ?? '#71717a');\n });\n }, [colors]);\n\n // Selection, switched-off entities and pins.\n useEffect(() => {\n const graph = graphRef.current;\n const renderer = rendererRef.current;\n\n if (!graph || !renderer) {\n return;\n }\n\n const hidden = new Set(scene.hiddenEntities);\n let pinsChanged = false;\n graph.forEachNode((key, attributes) => {\n renderer.setNodeState(key, { isHidden: hidden.has(attributes.entity), isHighlighted: key === scene.selected });\n const fixed = scene.pinned[key] === true || heldRef.current.has(key);\n\n if ((attributes.fixed ?? false) !== fixed) {\n graph.setNodeAttribute(key, 'fixed', fixed);\n pinsChanged = true;\n }\n });\n\n // A pin change during a run restarts it with the same hold, so the\n // nodes kept still for it stay still.\n if (pinsChanged && layoutDeadlineRef.current !== null) {\n startLayout(Math.max(500, layoutDeadlineRef.current - performance.now()), [...heldRef.current]);\n }\n graph.forEachEdge((key, _attributes, source, target) => {\n renderer.setEdgeState(key, {\n isHidden:\n hidden.has(graph.getNodeAttribute(source, 'entity')) || hidden.has(graph.getNodeAttribute(target, 'entity')),\n });\n });\n }, [scene.hiddenEntities, scene.selected, scene.pinned, scene.version, mountAttempt, theme, startLayout]);\n\n // Unmount: stop the worker.\n useEffect(() => stopLayout, [stopLayout]);\n\n return <div className=\"fk:h-full fk:w-full fk:min-h-0\" ref={containerRef} />;\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport type { Attribute } from '../../core/types';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '../../ui';\n\nexport interface GraphContextMenuState {\n key: string;\n x: number;\n y: number;\n}\n\nexport interface GraphContextMenuProps {\n menu: GraphContextMenuState | null;\n relationships: Attribute[];\n isPinned: boolean;\n onClose: () => void;\n onExpandAll: (key: string) => void;\n onExpandAttribute: (key: string, attribute: Attribute) => void;\n onHide: (key: string) => void;\n onHideOthers: (key: string) => void;\n onTogglePin: (key: string) => void;\n onOpenRecord: (key: string) => void;\n}\n\n/** The right-click menu of a node, anchored at the pointer. */\nexport function GraphContextMenu({\n menu,\n relationships,\n isPinned,\n onClose,\n onExpandAll,\n onExpandAttribute,\n onHide,\n onHideOthers,\n onTogglePin,\n onOpenRecord,\n}: GraphContextMenuProps): JSX.Element {\n const key = menu?.key ?? '';\n\n return (\n <DropdownMenu\n onOpenChange={(open) => {\n if (!open) {\n onClose();\n }\n }}\n open={menu !== null}\n >\n <DropdownMenuTrigger asChild>\n <span\n aria-hidden=\"true\"\n className=\"fk:fixed fk:size-0\"\n style={{ left: menu?.x ?? 0, top: menu?.y ?? 0 }}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-52\" data-testid=\"graph-context-menu\" side=\"bottom\">\n <DropdownMenuItem onSelect={() => onExpandAll(key)}>Expand all</DropdownMenuItem>\n {relationships.length > 0 ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>Expand</DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"fk:max-h-80 fk:overflow-y-auto\">\n {relationships.map((attribute) => (\n <DropdownMenuItem key={attribute.name} onSelect={() => onExpandAttribute(key, attribute)}>\n {attribute.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={() => onHide(key)}>Hide</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onHideOthers(key)}>Hide others</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onTogglePin(key)}>{isPinned ? 'Unpin position' : 'Pin position'}</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={() => onOpenRecord(key)}>Open record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import { MAX_NODES, type GraphCounts, type GraphData, type GraphEdge, type GraphNode } from './graph';\n\n/**\n * The scene is what the canvas draws: the nodes and edges loaded so far,\n * which entities are switched off, which nodes are pinned, the selection.\n * A pure reducer so every rule is unit-tested; the canvas syncs to it.\n */\n\nexport interface SceneState {\n nodes: { [key: string]: GraphNode };\n edges: { [key: string]: GraphEdge };\n /** Total related records per relationship of a node, when the API told us. */\n counts: GraphCounts;\n /** Related records fetched so far per relationship of a node: the next page's offset. */\n fetched: GraphCounts;\n hiddenEntities: string[];\n pinned: { [key: string]: true };\n selected: string | null;\n /** A message for the status line, such as the node cap being reached. */\n notice: string | null;\n /** Bumped whenever nodes or edges change, so the canvas knows to sync. */\n version: number;\n}\n\nexport type SceneAction =\n | { type: 'merge'; data: GraphData; fetched?: GraphCounts }\n | { type: 'remove'; keys: string[] }\n | { type: 'keepOnly'; keys: string[] }\n | { type: 'clear' }\n | { type: 'toggleEntity'; entity: string }\n | { type: 'select'; key: string | null }\n | { type: 'togglePin'; key: string }\n | { type: 'notice'; message: string | null };\n\nexport const EMPTY_SCENE: SceneState = {\n nodes: {},\n edges: {},\n counts: {},\n fetched: {},\n hiddenEntities: [],\n pinned: {},\n selected: null,\n notice: null,\n version: 0,\n};\n\nfunction mergeCounts(current: GraphCounts, incoming: GraphCounts | undefined): GraphCounts {\n if (!incoming) {\n return current;\n }\n\n const next = { ...current };\n Object.entries(incoming).forEach(([key, perAttribute]) => {\n next[key] = { ...next[key], ...perAttribute };\n });\n\n return next;\n}\n\n/** Fetched offsets only move forward: a fresh first page never rewinds paging. */\nfunction mergeFetched(current: GraphCounts, incoming: GraphCounts | undefined): GraphCounts {\n if (!incoming) {\n return current;\n }\n\n const next = { ...current };\n Object.entries(incoming).forEach(([key, perAttribute]) => {\n const merged = { ...next[key] };\n Object.entries(perAttribute).forEach(([attribute, offset]) => {\n merged[attribute] = Math.max(merged[attribute] ?? 0, offset);\n });\n next[key] = merged;\n });\n\n return next;\n}\n\nfunction withoutNodes(state: SceneState, dropped: Set<string>): SceneState {\n const nodes = Object.fromEntries(Object.entries(state.nodes).filter(([key]) => !dropped.has(key)));\n const edges = Object.fromEntries(\n Object.entries(state.edges).filter(([, edge]) => !dropped.has(edge.source) && !dropped.has(edge.target))\n );\n const pinned = Object.fromEntries(Object.entries(state.pinned).filter(([key]) => !dropped.has(key)));\n\n return {\n ...state,\n nodes,\n edges,\n pinned,\n selected: state.selected && dropped.has(state.selected) ? null : state.selected,\n version: state.version + 1,\n };\n}\n\nexport function sceneReducer(state: SceneState, action: SceneAction): SceneState {\n switch (action.type) {\n case 'merge': {\n const nodes = { ...state.nodes };\n let count = Object.keys(nodes).length;\n let dropped = 0;\n\n action.data.nodes.forEach((node) => {\n const existing = nodes[node.key];\n\n if (existing) {\n // A node first drawn with only its id takes the caption a later load brings.\n if (existing.label === existing.id && node.label !== node.id) {\n nodes[node.key] = { ...existing, label: node.label };\n }\n\n return;\n }\n\n if (count >= MAX_NODES) {\n dropped += 1;\n\n return;\n }\n\n nodes[node.key] = node;\n count += 1;\n });\n\n const edges = { ...state.edges };\n action.data.edges.forEach((edge) => {\n if (nodes[edge.source] && nodes[edge.target]) {\n edges[edge.key] = edge;\n }\n });\n\n return {\n ...state,\n nodes,\n edges,\n counts: mergeCounts(state.counts, action.data.counts),\n fetched: mergeFetched(state.fetched, action.fetched),\n notice:\n dropped > 0\n ? `The canvas holds ${MAX_NODES.toLocaleString()} nodes at most; ${dropped.toLocaleString()} were left out. Hide some nodes to make room.`\n : state.notice,\n version: state.version + 1,\n };\n }\n case 'remove':\n return withoutNodes(state, new Set(action.keys));\n case 'keepOnly': {\n const kept = new Set(action.keys);\n\n return withoutNodes(state, new Set(Object.keys(state.nodes).filter((key) => !kept.has(key))));\n }\n case 'clear':\n return { ...EMPTY_SCENE, hiddenEntities: state.hiddenEntities, version: state.version + 1 };\n case 'toggleEntity':\n return {\n ...state,\n hiddenEntities: state.hiddenEntities.includes(action.entity)\n ? state.hiddenEntities.filter((entity) => entity !== action.entity)\n : [...state.hiddenEntities, action.entity],\n };\n case 'select':\n return state.selected === action.key ? state : { ...state, selected: action.key };\n case 'togglePin': {\n const pinned = { ...state.pinned };\n\n if (pinned[action.key]) {\n delete pinned[action.key];\n } else {\n pinned[action.key] = true;\n }\n\n return { ...state, pinned };\n }\n case 'notice':\n return { ...state, notice: action.message };\n default:\n return state;\n }\n}\n\n/** Nodes on the canvas per entity, for the legend. */\nexport function countNodesByEntity(state: SceneState): { [entity: string]: number } {\n return Object.values(state.nodes).reduce<{ [entity: string]: number }>((result, node) => {\n result[node.entity] = (result[node.entity] ?? 0) + 1;\n\n return result;\n }, {});\n}\n\n/** Related nodes of one node per relationship attribute that are on the canvas. */\nexport function countEdgesByAttribute(state: SceneState, key: string): { [attribute: string]: number } {\n return Object.values(state.edges).reduce<{ [attribute: string]: number }>((result, edge) => {\n if (edge.source === key) {\n result[edge.sourceAttribute] = (result[edge.sourceAttribute] ?? 0) + 1;\n } else if (edge.target === key) {\n result[edge.targetAttribute] = (result[edge.targetAttribute] ?? 0) + 1;\n }\n\n return result;\n }, {});\n}\n\n/** Keys of the nodes joined to one node by an edge. */\nexport function neighbourKeys(state: SceneState, key: string): string[] {\n return Object.values(state.edges).flatMap((edge) => {\n if (edge.source === key) {\n return [edge.target];\n }\n\n if (edge.target === key) {\n return [edge.source];\n }\n\n return [];\n });\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { formatDistance } from 'date-fns';\nimport { EyeOffIcon, ExpandIcon, LoaderCircleIcon, SquareArrowOutUpRightIcon, XIcon } from 'lucide-react';\nimport type { Attribute, Entity } from '../../core/types';\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\nimport {\n buildCountsQuery,\n buildDetailsQuery,\n formatDetailValue,\n getDetailAttributes,\n getEntity,\n getEntityLabel,\n getRelationshipAttributes,\n type GraphNode,\n type GraphRecord,\n} from './graph';\nimport { countEdgesByAttribute, type SceneState } from './scene';\n\nexport interface GraphInspectorProps {\n node: GraphNode;\n schema: Entity[];\n scope: string;\n scene: SceneState;\n colors: { [entity: string]: string };\n isLoading: boolean;\n onClose: () => void;\n onOpenRecord: (key: string) => void;\n onExpandAll: (key: string) => void;\n onExpandAttribute: (key: string, attribute: Attribute) => void;\n onHide: (key: string) => void;\n}\n\ntype ConnectionCount = { aggregate?: { count?: { nodes?: number } } };\n\n/**\n * Black or white, whichever reads better on a palette color (`#rrggbb`): the\n * yellows and greens are too light for white text.\n */\nfunction getTextColorOn(hex: string): string {\n const [r, g, b] = [1, 3, 5].map((offset) => {\n const channel = parseInt(hex.slice(offset, offset + 2), 16) / 255;\n\n return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n });\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n return luminance > 0.3 ? '#0a0a0a' : '#ffffff';\n}\ntype DetailsResult = { [plural: string]: (GraphRecord & { _updatedAt?: string })[] };\n\n/**\n * The selected node: its scalar attributes in the current scope and each\n * relationship with how many related records are on the canvas out of the\n * total, with a button to fetch the next page.\n */\nexport function GraphInspector({\n node,\n schema,\n scope,\n scene,\n colors,\n isLoading,\n onClose,\n onOpenRecord,\n onExpandAll,\n onExpandAttribute,\n onHide,\n}: GraphInspectorProps): JSX.Element {\n const entity = getEntity(schema, node.entity);\n const detailsDocument = useMemo(\n () => gql(entity ? buildDetailsQuery({ entity, scope }) : 'query GraphDetails { __typename }'),\n [entity, scope]\n );\n const countsDocument = useMemo(\n () => gql(entity ? buildCountsQuery({ entity }) : 'query GraphCounts { __typename }'),\n [entity]\n );\n const details = useQuery<DetailsResult>(detailsDocument, { variables: { id: node.id }, skip: !entity });\n const counts = useQuery<{ [plural: string]: { [field: string]: ConnectionCount }[] }>(countsDocument, {\n variables: { id: node.id },\n skip: !entity,\n });\n const record = entity ? details.data?.[entity.plural]?.[0] : undefined;\n const countRecord = entity ? counts.data?.[entity.plural]?.[0] : undefined;\n const onCanvas = useMemo(() => countEdgesByAttribute(scene, node.key), [scene, node.key]);\n const relationships = entity ? getRelationshipAttributes(entity) : [];\n const attributes = entity ? getDetailAttributes(entity) : [];\n const updatedAt = record?._updatedAt ? new Date(record._updatedAt) : null;\n const color = colors[node.entity] ?? '#71717a';\n\n return (\n <aside\n aria-label=\"Selected record\"\n className=\"fk:flex fk:w-72 fk:shrink-0 fk:flex-col fk:gap-5 fk:overflow-y-auto fk:border-l fk:bg-background fk:p-4 fk:text-sm\"\n data-testid=\"graph-inspector\"\n >\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-2\">\n <span\n className=\"fk:inline-flex fk:items-center fk:rounded-full fk:px-2 fk:py-0.5 fk:text-xs fk:font-medium\"\n style={{ backgroundColor: color, color: getTextColorOn(color) }}\n >\n {entity ? getEntityLabel(entity) : node.entity}\n </span>\n <Button aria-label=\"Close\" className=\"fk:size-7\" onClick={onClose} size=\"icon\" variant=\"ghost\">\n <XIcon className=\"fk:size-4\" />\n </Button>\n </div>\n <h2 className=\"fk:text-base fk:font-semibold fk:leading-snug fk:break-words\">{node.label}</h2>\n <div className=\"fk:flex fk:gap-1.5\">\n <Button onClick={() => onOpenRecord(node.key)} size=\"xs\">\n <SquareArrowOutUpRightIcon />\n Open record\n </Button>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label=\"Expand every relationship\"\n disabled={isLoading}\n onClick={() => onExpandAll(node.key)}\n size=\"xs\"\n variant=\"outline\"\n >\n {isLoading ? <LoaderCircleIcon className=\"fk:animate-spin\" /> : <ExpandIcon />}\n Expand\n </Button>\n </TooltipTrigger>\n <TooltipContent>Load the first related records of every relationship</TooltipContent>\n </Tooltip>\n <Button aria-label=\"Hide this node\" onClick={() => onHide(node.key)} size=\"xs\" variant=\"outline\">\n <EyeOffIcon />\n Hide\n </Button>\n </div>\n </div>\n\n <section className=\"fk:flex fk:flex-col fk:gap-2\">\n <h3 className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">Attributes</h3>\n {details.loading && !record ? (\n <span className=\"fk:text-muted-foreground\">Loading…</span>\n ) : (\n <dl className=\"fk:grid fk:grid-cols-[minmax(0,2fr)_minmax(0,3fr)] fk:gap-x-3 fk:gap-y-1.5\">\n {attributes.map((attribute) => (\n <div className=\"fk:contents\" key={attribute.name}>\n <dt className=\"fk:truncate fk:text-muted-foreground\" title={attribute.label}>\n {attribute.label}\n </dt>\n <dd className=\"fk:min-w-0 fk:break-words\">{record ? formatDetailValue(record[attribute.name], scope) || '—' : '—'}</dd>\n </div>\n ))}\n {updatedAt ? (\n <div className=\"fk:contents\">\n <dt className=\"fk:text-muted-foreground\">Updated</dt>\n <dd>{formatDistance(updatedAt, new Date(), { addSuffix: true })}</dd>\n </div>\n ) : null}\n </dl>\n )}\n </section>\n\n {relationships.length > 0 ? (\n <section className=\"fk:flex fk:flex-col fk:gap-1\">\n <h3 className=\"fk:mb-1 fk:text-xs fk:font-medium fk:text-muted-foreground\">Relationships</h3>\n {relationships.map((attribute) => {\n const relatedEntity = getEntity(schema, attribute.relationship?.entity ?? '');\n const total = countRecord?.[`${attribute.name}Connection`]?.aggregate?.count?.nodes;\n const shown = onCanvas[attribute.name] ?? 0;\n const fetched = scene.fetched[node.key]?.[attribute.name] ?? 0;\n const exhausted = typeof total === 'number' && fetched >= total;\n\n return (\n <div className=\"fk:flex fk:h-8 fk:items-center fk:gap-2\" key={attribute.name}>\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[attribute.relationship?.entity ?? ''] ?? '#71717a' }}\n />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate\" title={relatedEntity ? getEntityLabel(relatedEntity) : undefined}>\n {attribute.label}\n </span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {typeof total === 'number' ? `${shown} of ${total.toLocaleString()}` : shown}\n </span>\n {total === 0 || exhausted ? null : (\n <Button\n className=\"fk:h-6 fk:px-2 fk:text-xs\"\n disabled={isLoading}\n onClick={() => onExpandAttribute(node.key, attribute)}\n size=\"xs\"\n variant=\"outline\"\n >\n {fetched > 0 ? 'More' : 'Expand'}\n </Button>\n )}\n </div>\n );\n })}\n </section>\n ) : null}\n </aside>\n );\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { JSX } from 'react';\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { bracketMatching, foldGutter, foldKeymap, indentOnInput } from '@codemirror/language';\nimport { Compartment, EditorState, Prec } from '@codemirror/state';\nimport {\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n highlightSpecialChars,\n keymap,\n lineNumbers,\n placeholder as placeholderExtension,\n} from '@codemirror/view';\nimport { graphql, updateSchema } from 'cm6-graphql';\nimport type { GraphQLSchema } from 'graphql';\nimport { darkTheme, lightTheme } from '../ai/markdown-editor-themes';\n\nexport interface QueryEditorProps {\n ariaLabel: string;\n /** The project's schema, for completion and validation; null until introspected. */\n schema: GraphQLSchema | null;\n theme: 'light' | 'dark';\n value: string;\n onChange: (value: string) => void;\n /** Mod+Enter. */\n onRun: () => void;\n}\n\nconst editorChrome = EditorView.theme({\n '&': { fontSize: '13px', height: '100%', minHeight: '0' },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': { height: '100%', lineHeight: '1.6', minHeight: '0', overflow: 'auto' },\n '.cm-content': { fontSize: '13px', padding: '12px 0' },\n '.cm-gutters': { borderRight: '1px solid transparent' },\n});\n\n/** A GraphQL editor: syntax, completion and linting against the project schema. */\nexport function QueryEditor({ ariaLabel, schema, theme, value, onChange, onRun }: QueryEditorProps): JSX.Element {\n const parentRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const themeCompartmentRef = useRef(new Compartment());\n const onChangeRef = useRef(onChange);\n const onRunRef = useRef(onRun);\n const valueRef = useRef(value);\n onChangeRef.current = onChange;\n onRunRef.current = onRun;\n valueRef.current = value;\n\n useEffect(() => {\n const parent = parentRef.current;\n\n if (!parent) {\n return undefined;\n }\n\n const view = new EditorView({\n parent,\n state: EditorState.create({\n doc: valueRef.current,\n extensions: [\n lineNumbers(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n foldGutter(),\n drawSelection(),\n dropCursor(),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n highlightActiveLine(),\n Prec.highest(\n keymap.of([\n {\n key: 'Mod-Enter',\n run: () => {\n onRunRef.current();\n\n return true;\n },\n },\n ])\n ),\n keymap.of([...closeBracketsKeymap, ...defaultKeymap, ...historyKeymap, ...foldKeymap, indentWithTab]),\n graphql(undefined, { showErrorOnInvalidSchema: false }),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n }),\n EditorView.contentAttributes.of({ 'aria-label': ariaLabel, 'aria-multiline': 'true', role: 'textbox' }),\n placeholderExtension('query {\\n …\\n}'),\n themeCompartmentRef.current.of([theme === 'dark' ? darkTheme : lightTheme, editorChrome]),\n ],\n }),\n });\n viewRef.current = view;\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // Mounted once; the theme, schema and value are applied below.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- see above\n }, []);\n\n useEffect(() => {\n viewRef.current?.dispatch({\n effects: themeCompartmentRef.current.reconfigure([theme === 'dark' ? darkTheme : lightTheme, editorChrome]),\n });\n }, [theme]);\n\n useEffect(() => {\n if (viewRef.current) {\n updateSchema(viewRef.current, schema ?? undefined);\n }\n }, [schema]);\n\n // A value set from outside (an example, the remembered query) replaces the document.\n useEffect(() => {\n const view = viewRef.current;\n\n if (!view || view.state.doc.toString() === value) {\n return;\n }\n\n view.dispatch({ changes: { from: 0, to: view.state.doc.length, insert: value } });\n }, [value]);\n\n return <div className=\"fk:h-full fk:min-h-0 fk:w-full\" data-testid=\"graph-query-editor\" ref={parentRef} />;\n}\n","import type { Attribute, Entity } from '../../core/types';\nimport {\n captionOf,\n edgeOf,\n formatDetailValue,\n getDisplaySelection,\n getEntity,\n getEntityLabel,\n getGraphEntities,\n getRelationshipAttributes,\n nodeKey,\n type GraphData,\n type GraphEdge,\n type GraphNode,\n type GraphRecord,\n} from './graph';\n\n/**\n * Pure helpers of the Query view: turning the result of any GraphQL query\n * into nodes and edges, example queries per entity, and the table view.\n */\n\n/** Rows the table view shows at most. */\nexport const TABLE_ROW_LIMIT = 200;\n/** Related records an example query selects per relationship. */\nconst EXAMPLE_RELATED_LIMIT = 5;\n/** Relationships an example query includes. */\nconst EXAMPLE_RELATIONSHIPS = 3;\nexport type QueryResult = { [field: string]: unknown };\n\n/** What a run of a query produced, for the pane's footer. */\nexport interface QueryRun {\n data: QueryResult | null;\n error: string | null;\n elapsedMs: number;\n /** Nodes and edges the result maps to; the canvas may hold fewer once at its cap. */\n nodes: number;\n edges: number;\n}\n\nexport interface ExampleQuery {\n /** Entity name, unique across the schema. */\n entity: string;\n title: string;\n query: string;\n}\n\nexport interface QueryTable {\n columns: string[];\n rows: { [column: string]: string }[];\n /** Root records in the result, which may exceed the rows shown. */\n total: number;\n}\n\nfunction isRecord(value: unknown): value is GraphRecord {\n return typeof value === 'object' && value !== null && typeof (value as GraphRecord)._id === 'string';\n}\n\n/**\n * The records under a result field: a list, a single object, or a\n * connection (`{ edges: [{ node }] }`).\n */\nexport function collectRecords(value: unknown): GraphRecord[] {\n if (Array.isArray(value)) {\n return value.flatMap(collectRecords);\n }\n\n if (typeof value !== 'object' || value === null) {\n return [];\n }\n\n if (isRecord(value)) {\n return [value];\n }\n\n const { edges } = value as { edges?: unknown };\n\n if (Array.isArray(edges)) {\n return edges.flatMap((edge) => collectRecords((edge as { node?: unknown })?.node));\n }\n\n return [];\n}\n\n/** Entity of a root field: its plural, or its plural with a `Connection` suffix. */\nexport function entityOfRootField(field: string, schema: Entity[]): Entity | undefined {\n const plural = field.endsWith('Connection') ? field.slice(0, -'Connection'.length) : field;\n\n return schema.find((entity) => entity.plural === plural);\n}\n\n/** The relationship attribute a result key selects, with or without the `Connection` suffix. */\nfunction relationshipOfKey(key: string, entity: Entity): Attribute | undefined {\n const name = key.endsWith('Connection') ? key.slice(0, -'Connection'.length) : key;\n\n return getRelationshipAttributes(entity).find((attribute) => attribute.name === name);\n}\n\n/** The one relationship of an entity that leads to another, if exactly one does. */\nfunction relationshipTo(entity: Entity, target: string): Attribute | undefined {\n const attributes = getRelationshipAttributes(entity).filter((attribute) => attribute.relationship?.entity === target);\n\n return attributes.length === 1 ? attributes[0] : undefined;\n}\n\n/** The entity of a record: its `__typename` when the API sent one, else the field it came under, if that names one. */\nexport function entityOfRecord(\n record: GraphRecord,\n fallback: Entity | undefined,\n schema: Entity[]\n): Entity | undefined {\n const typename = record.__typename;\n\n return (typeof typename === 'string' && getEntity(schema, typename)) || fallback;\n}\n\n/**\n * A caption for a record from whatever the query selected: the display\n * attribute when present, else the first string the record carries that is\n * not a system field (`_id`, `_createdAt`, `__typename` and the like).\n */\nexport function captionFromRecord(record: GraphRecord, entity: Entity | undefined, scope: string): string {\n const caption = captionOf(record, entity, scope);\n\n if (caption !== record._id) {\n return caption;\n }\n\n const text = Object.entries(record).find(\n ([key, value]) => !key.startsWith('_') && typeof value === 'string' && value.trim().length > 0\n );\n\n return text ? (text[1] as string) : record._id;\n}\n\n/**\n * Nodes and edges from a query result: every object with an `_id` whose\n * `__typename` names an entity becomes a node, as does one under a root\n * field named after an entity's plural when the typename is missing; every\n * relationship field selected on it, aliased or not, is an edge to the\n * related nodes. A\n * record seen again with a better caption is re-captioned. Fields the schema\n * does not know are ignored.\n */\nexport function graphFromQueryResult({\n data,\n schema,\n scope,\n}: {\n data: QueryResult | null | undefined;\n schema: Entity[];\n scope: string;\n}): GraphData {\n const nodes = new Map<string, GraphNode>();\n const edges = new Map<string, GraphEdge>();\n\n const addRecord = (record: GraphRecord, fallback: Entity | undefined): GraphNode | null => {\n const entity = entityOfRecord(record, fallback, schema);\n\n if (!entity) {\n return null;\n }\n\n const key = nodeKey(entity.name, record._id);\n const label = captionFromRecord(record, entity, scope);\n const existing = nodes.get(key);\n const node: GraphNode = existing ?? { key, entity: entity.name, id: record._id, label };\n\n if (!existing) {\n nodes.set(key, node);\n } else if (existing.label === existing.id && label !== record._id) {\n existing.label = label;\n }\n\n Object.entries(record).forEach(([field, value]) => {\n const keyAttribute = relationshipOfKey(field, entity);\n const keyEntity = keyAttribute ? getEntity(schema, keyAttribute.relationship?.entity ?? '') : undefined;\n\n collectRecords(value).forEach((relatedRecord) => {\n // An aliased relationship (`maker: brand { … }`) is not named by its\n // key: the record's typename finds the entity, and the attribute when\n // only one relationship leads there.\n const target = addRecord(relatedRecord, keyEntity);\n const attribute = keyAttribute ?? (target ? relationshipTo(entity, target.entity) : undefined);\n\n if (target && attribute && target.key !== node.key) {\n const edge = edgeOf(node, target, attribute);\n\n if (!edges.has(edge.key)) {\n edges.set(edge.key, edge);\n }\n }\n });\n });\n\n return node;\n };\n\n Object.entries(data ?? {}).forEach(([field, value]) => {\n const fallback = entityOfRootField(field, schema);\n collectRecords(value).forEach((record) => addRecord(record, fallback));\n });\n\n return { nodes: [...nodes.values()], edges: [...edges.values()], counts: {} };\n}\n\n/** One example query per entity with relationships, with a few related records each. */\nexport function exampleQueries(schema: Entity[], scope: string): ExampleQuery[] {\n return getGraphEntities(schema).map((entity) => {\n const relationships = getRelationshipAttributes(entity)\n .slice(0, EXAMPLE_RELATIONSHIPS)\n .map((attribute) => {\n const related = getEntity(schema, attribute.relationship?.entity ?? '');\n\n return ` ${attribute.name}(limit: ${EXAMPLE_RELATED_LIMIT}) {\\n _id\\n ${getDisplaySelection(related, scope)}\\n }`;\n });\n const display = getDisplaySelection(entity, scope);\n\n return {\n entity: entity.name,\n title: getEntityLabel(entity),\n query: `query {\\n ${entity.plural}(limit: 25) {\\n _id\\n${display ? ` ${display}\\n` : ''}${relationships.join('\\n')}\\n }\\n}`,\n };\n });\n}\n\n/** A table cell: related records as a count, scoped values through the inspector's formatter. */\nfunction formatCell(value: unknown, scope: string): string {\n const records = collectRecords(value);\n\n if (records.length > 0) {\n return `${records.length} ${records.length === 1 ? 'record' : 'records'}`;\n }\n\n if (Array.isArray(value) && !(typeof value[0] === 'object' && value[0] !== null)) {\n return value.map((item) => formatDetailValue(item, scope)).join(', ');\n }\n\n return formatDetailValue(value, scope);\n}\n\n/**\n * The objects under a root field, with or without an `_id`: a list, a single\n * object, or the nodes of a connection's edges.\n */\nfunction collectRows(value: unknown): GraphRecord[] {\n if (Array.isArray(value)) {\n return value.flatMap(collectRows);\n }\n\n if (typeof value !== 'object' || value === null) {\n return [];\n }\n\n const { edges } = value as { edges?: unknown };\n\n if (!isRecord(value) && Array.isArray(edges)) {\n return edges.flatMap((edge) => collectRows((edge as { node?: unknown })?.node));\n }\n\n return [value as GraphRecord];\n}\n\n/** The root objects of a result as a table: one column per field the shown rows select. */\nexport function tableFromResult(data: QueryResult | null | undefined, scope: string): QueryTable {\n const records = Object.values(data ?? {}).flatMap(collectRows);\n const shown = records.slice(0, TABLE_ROW_LIMIT);\n const columns: string[] = [];\n shown.forEach((record) => {\n Object.keys(record).forEach((key) => {\n if (key !== '__typename' && !columns.includes(key)) {\n columns.push(key);\n }\n });\n });\n\n return {\n columns,\n rows: shown.map((record) =>\n Object.fromEntries(columns.map((column) => [column, formatCell(record[column], scope)]))\n ),\n total: records.length,\n };\n}\n\n/** The response without the `__typename` keys the client adds, for the JSON view. */\nexport function stripTypename(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stripTypename);\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value as { [key: string]: unknown })\n .filter(([key]) => key !== '__typename')\n .map(([key, item]) => [key, stripTypename(item)])\n );\n }\n\n return value;\n}\n\n/** Where the last query of a project is remembered. */\nexport function queryStorageKey(projectId: string): string {\n return `flexkit-graph:query:${projectId}`;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { buildClientSchema, getIntrospectionQuery } from 'graphql';\nimport type { GraphQLSchema, IntrospectionQuery } from 'graphql';\nimport { USER_QUERY_CONTEXT } from '../../graphql-client/graphql-context';\n\n/** One introspection per project, keyed by its deployed schema hash so a deployment while the Studio is open refreshes it. */\nconst schemaCache = new Map<string, { hash: string; schema: Promise<GraphQLSchema> }>();\n\nfunction introspect(client: ReturnType<typeof useApolloClient>, projectId: string, hash: string): Promise<GraphQLSchema> {\n const cached = schemaCache.get(projectId);\n\n if (cached && cached.hash === hash) {\n return cached.schema;\n }\n\n // Not cached by Apollo: the introspection tree is large and only this hook reads it.\n const schema = client\n .query<IntrospectionQuery>({\n query: gql(getIntrospectionQuery()),\n fetchPolicy: 'no-cache',\n context: USER_QUERY_CONTEXT,\n })\n .then((result) => {\n if (!result.data) {\n throw new Error('The schema could not be introspected.');\n }\n\n return buildClientSchema(result.data);\n });\n schema.catch(() => {\n if (schemaCache.get(projectId)?.schema === schema) {\n schemaCache.delete(projectId);\n }\n });\n schemaCache.set(projectId, { hash, schema });\n\n return schema;\n}\n\n/**\n * The project's GraphQL schema, for completion and validation in the editor;\n * null until loaded. Re-introspected when the deployed schema hash changes.\n */\nexport function useGraphQLSchema(\n projectId: string | undefined,\n schemaHash: string | null | undefined\n): GraphQLSchema | null {\n const client = useApolloClient();\n const [schema, setSchema] = useState<GraphQLSchema | null>(null);\n\n useEffect(() => {\n if (!projectId) {\n return undefined;\n }\n\n let cancelled = false;\n introspect(client, projectId, schemaHash ?? '')\n .then((loaded) => {\n if (!cancelled) {\n setSchema(loaded);\n }\n })\n .catch(() => {\n // The editor works without completion.\n });\n\n return () => {\n cancelled = true;\n };\n }, [client, projectId, schemaHash]);\n\n return schema;\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { JSX } from 'react';\nimport { ChevronDownIcon, LoaderCircleIcon, PlayIcon } from 'lucide-react';\nimport type { Entity } from '../../core/types';\nimport {\n Button,\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Label,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../../ui';\nimport { readComposerDraft, writeComposerDraft } from '../ai/agent/composer-draft';\nimport { QueryEditor } from './query-editor';\nimport {\n exampleQueries,\n queryStorageKey,\n stripTypename,\n tableFromResult,\n TABLE_ROW_LIMIT,\n type QueryRun,\n} from './query';\nimport { useGraphQLSchema } from './use-graphql-schema';\n\nexport interface QueryPaneProps {\n projectId: string;\n /** The deployed schema's hash; a change re-introspects the schema for the editor. */\n schemaHash: string | null;\n schema: Entity[];\n scope: string;\n theme: 'light' | 'dark';\n isRunning: boolean;\n /** Kept mounted while the Explore view shows, so the last run survives the switch. */\n hidden: boolean;\n onRun: (query: string, options: { append: boolean }) => Promise<QueryRun>;\n}\n\ntype ResultTab = 'graph' | 'table' | 'json';\n\n/**\n * The Query view: a GraphQL editor whose result is drawn on the canvas.\n * Every object with an id becomes a node, every nested selection a\n * relationship; the same result is also shown as a table and as JSON.\n */\nexport function QueryPane({\n projectId,\n schemaHash,\n schema,\n scope,\n theme,\n isRunning,\n hidden,\n onRun,\n}: QueryPaneProps): JSX.Element {\n // The schema is introspected once the view has been opened, not on every Graph visit.\n const [opened, setOpened] = useState(!hidden);\n const graphqlSchema = useGraphQLSchema(opened ? projectId : undefined, schemaHash);\n const examples = useMemo(() => exampleQueries(schema, scope), [schema, scope]);\n const [query, setQuery] = useState(() => readComposerDraft(queryStorageKey(projectId)) || examples[0]?.query || '');\n // The schema may arrive after the pane mounts: the first example fills an\n // editor that started empty, once, so clearing it later is left alone.\n const seededRef = useRef(query !== '');\n const [append, setAppend] = useState(false);\n const [tab, setTab] = useState<ResultTab>('graph');\n const [run, setRun] = useState<QueryRun | null>(null);\n // Built for the open tab only: a large result is not tabulated or pretty-printed unseen.\n const table = useMemo(\n () => (tab === 'table' && run?.data ? tableFromResult(run.data, scope) : null),\n [tab, run, scope]\n );\n const json = useMemo(\n () => (tab === 'json' && run?.data ? JSON.stringify(stripTypename(run.data), null, 2) : null),\n [tab, run]\n );\n\n useEffect(() => {\n if (!hidden) {\n setOpened(true);\n }\n }, [hidden]);\n\n useEffect(() => {\n const [first] = examples;\n\n if (!seededRef.current && first) {\n seededRef.current = true;\n setQuery((current) => current || first.query);\n }\n }, [examples]);\n\n useEffect(() => {\n writeComposerDraft(queryStorageKey(projectId), query);\n }, [projectId, query]);\n\n const execute = async (): Promise<void> => {\n if (!query.trim() || isRunning) {\n return;\n }\n\n setRun(await onRun(query, { append }));\n };\n\n return (\n <section\n aria-label=\"Query\"\n className={`fk:w-[26rem] fk:shrink-0 fk:flex-col fk:border-r fk:bg-background ${hidden ? 'fk:hidden' : 'fk:flex'}`}\n data-testid=\"graph-query-pane\"\n hidden={hidden}\n >\n <div className=\"fk:flex fk:h-12 fk:shrink-0 fk:items-center fk:gap-2 fk:border-b fk:pl-4 fk:pr-3\">\n <span className=\"fk:text-sm fk:font-semibold\">Query</span>\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-1.5\">\n {examples.length > 0 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8\" size=\"sm\" variant=\"outline\">\n Examples\n <ChevronDownIcon className=\"fk:size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:max-h-80 fk:overflow-y-auto\">\n {examples.map((example) => (\n <DropdownMenuItem key={example.entity} onSelect={() => setQuery(example.query)}>\n {example.title}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n <Button className=\"fk:h-8\" disabled={isRunning || !query.trim()} onClick={() => void execute()} size=\"sm\">\n {isRunning ? (\n <LoaderCircleIcon className=\"fk:size-3.5 fk:animate-spin\" />\n ) : (\n <PlayIcon className=\"fk:size-3.5\" />\n )}\n Run\n </Button>\n </div>\n </div>\n <div className=\"fk:min-h-0 fk:flex-1\">\n <QueryEditor\n ariaLabel=\"GraphQL query\"\n onChange={setQuery}\n onRun={() => void execute()}\n schema={graphqlSchema}\n theme={theme}\n value={query}\n />\n </div>\n <Tabs\n className=\"fk:flex fk:max-h-[45%] fk:shrink-0 fk:flex-col fk:gap-0 fk:border-t\"\n onValueChange={(value) => setTab(value as ResultTab)}\n value={tab}\n >\n <div className=\"fk:flex fk:h-11 fk:shrink-0 fk:items-center fk:gap-3 fk:px-3\">\n <TabsList>\n <TabsTrigger value=\"graph\">Graph</TabsTrigger>\n <TabsTrigger value=\"table\">Table</TabsTrigger>\n <TabsTrigger value=\"json\">JSON</TabsTrigger>\n </TabsList>\n <span className=\"fk:ml-auto fk:truncate fk:text-xs fk:text-muted-foreground\" data-testid=\"graph-query-stats\">\n {run && !run.error\n ? `${run.nodes.toLocaleString()} ${run.nodes === 1 ? 'node' : 'nodes'} · ${run.edges.toLocaleString()} ${run.edges === 1 ? 'relationship' : 'relationships'} · ${run.elapsedMs.toLocaleString()} ms`\n : null}\n </span>\n </div>\n {run?.error ? (\n <pre\n className=\"fk:m-3 fk:mt-0 fk:max-h-40 fk:shrink-0 fk:overflow-auto fk:whitespace-pre-wrap fk:rounded-md fk:border fk:border-destructive/40 fk:bg-destructive/5 fk:p-2 fk:text-xs fk:text-destructive\"\n data-testid=\"graph-query-error\"\n >\n {run.error}\n </pre>\n ) : null}\n <div className=\"fk:min-h-0 fk:overflow-auto\">\n <TabsContent\n className=\"fk:flex fk:flex-col fk:gap-3 fk:px-3 fk:pb-3 fk:text-xs fk:text-muted-foreground\"\n value=\"graph\"\n >\n <span>\n Every object with an <code className=\"fk:font-mono\">_id</code> under an entity field becomes a node; a\n nested relationship selection becomes a line between them.\n </span>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Checkbox\n checked={append}\n id=\"graph-query-append\"\n onCheckedChange={(checked) => setAppend(checked === true)}\n />\n <Label className=\"fk:text-xs fk:font-normal\" htmlFor=\"graph-query-append\">\n Add to the current canvas instead of replacing it\n </Label>\n </div>\n </TabsContent>\n <TabsContent className=\"fk:px-3 fk:pb-3\" value=\"table\">\n {table && table.columns.length > 0 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-1\">\n <div className=\"fk:overflow-x-auto fk:rounded-md fk:border\">\n <Table>\n <TableHeader>\n <TableRow>\n {table.columns.map((column) => (\n <TableHead className=\"fk:h-8 fk:text-xs\" key={column}>\n {column}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {table.rows.map((row, index) => (\n <TableRow key={`${row._id ?? ''}-${index}`}>\n {table.columns.map((column) => (\n <TableCell\n className=\"fk:max-w-56 fk:truncate fk:py-1.5 fk:text-xs\"\n key={column}\n title={row[column]}\n >\n {row[column]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {table.total > TABLE_ROW_LIMIT ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n First {TABLE_ROW_LIMIT.toLocaleString()} of {table.total.toLocaleString()} records.\n </span>\n ) : null}\n </div>\n ) : (\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {run?.data ? 'The response has no rows to show.' : 'Run a query to see its records.'}\n </span>\n )}\n </TabsContent>\n <TabsContent className=\"fk:px-3 fk:pb-3\" value=\"json\">\n {json ? (\n <pre className=\"fk:overflow-auto fk:rounded-md fk:border fk:bg-muted/40 fk:p-2 fk:font-mono fk:text-xs\">\n {json}\n </pre>\n ) : (\n <span className=\"fk:text-xs fk:text-muted-foreground\">Run a query to see its response.</span>\n )}\n </TabsContent>\n </div>\n </Tabs>\n </section>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport type { JSX } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { SearchIcon } from 'lucide-react';\nimport { useDebounce } from 'use-debounce';\nimport { getDisplayAttribute } from '../../core/get-display-attribute';\nimport { useSearch } from '../../core/use-search';\nimport type { Entity, SearchRequestProps } from '../../core/types';\nimport {\n Checkbox,\n Input,\n SidebarContent,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarPanel,\n SidebarRail,\n} from '../../ui';\nimport { buildTotalsQuery, getEntityLabel, getTotalEntities } from './graph';\n\nconst SEARCH_DEBOUNCE_MS = 250;\nconst SEARCH_HITS_PER_ENTITY = 5;\n\nexport interface GraphSidebarProps {\n projectId: string;\n entities: Entity[];\n colors: { [entity: string]: string };\n /** Nodes on the canvas per entity. */\n onCanvas: { [entity: string]: number };\n hiddenEntities: string[];\n onStart: (entity: Entity) => void;\n onHit: (entityName: string, id: string) => void;\n onToggleEntity: (entityName: string) => void;\n}\n\nfunction buildSearchRequest(entities: Entity[], q: string): SearchRequestProps | null {\n const trimmed = q.trim();\n\n if (!trimmed || entities.length === 0) {\n return null;\n }\n\n return {\n searchRequests: { searches: entities.map((entity) => ({ collection: entity.plural })) },\n commonParams: { q: trimmed, limit: SEARCH_HITS_PER_ENTITY },\n };\n}\n\n/** Count-store totals per entity for the \"Nodes\" list; absent for space-bound entities. */\nfunction useTotals(entities: Entity[]): { [plural: string]: number } {\n const countable = useMemo(() => getTotalEntities(entities), [entities]);\n const document = useMemo(() => gql(countable.length > 0 ? buildTotalsQuery(countable) : 'query GraphTotals { __typename }'), [countable]);\n const { data } = useQuery<{ [field: string]: number }>(document, { skip: countable.length === 0 });\n\n return useMemo(\n () =>\n Object.fromEntries(\n countable\n .map((entity) => [entity.plural, data?.[`${entity.plural}Total`]] as const)\n .filter((pair): pair is readonly [string, number] => typeof pair[1] === 'number')\n ),\n [countable, data]\n );\n}\n\n/**\n * Search a record to add it to the canvas, start from a whole entity, and the\n * legend of what is on the canvas with a switch per entity.\n */\nexport function GraphSidebar({\n projectId,\n entities,\n colors,\n onCanvas,\n hiddenEntities,\n onStart,\n onHit,\n onToggleEntity,\n}: GraphSidebarProps): JSX.Element {\n const [query, setQuery] = useState('');\n const [debouncedQuery] = useDebounce(query, SEARCH_DEBOUNCE_MS);\n const searchable = useMemo(\n () => entities.filter((entity) => entity.attributes.some((attribute) => attribute.searchable)),\n [entities]\n );\n const request = useMemo(() => buildSearchRequest(searchable, debouncedQuery), [searchable, debouncedQuery]);\n const { results, isLoading } = useSearch(projectId, request);\n const totals = useTotals(entities);\n const entityByName = useMemo(() => new Map(entities.map((entity) => [entity.name, entity])), [entities]);\n const onCanvasEntities = Object.keys(onCanvas).sort();\n\n return (\n <SidebarPanel collapsible=\"icon\" variant=\"inset\">\n <SidebarContent>\n <SidebarGroup className=\"fk:group-data-[collapsible=icon]:hidden\">\n <div className=\"fk:relative\">\n <SearchIcon className=\"fk:pointer-events-none fk:absolute fk:left-2 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground\" />\n <Input\n aria-label=\"Search records to add to the canvas\"\n className=\"fk:h-8 fk:bg-background fk:pl-8 fk:shadow-none\"\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchable.length > 0 ? 'Search records…' : 'No searchable entity'}\n disabled={searchable.length === 0}\n value={query}\n />\n </div>\n {request ? (\n <ul className=\"fk:mt-2 fk:flex fk:flex-col fk:gap-0.5\" data-testid=\"graph-search-results\">\n {results.map((hit) => {\n const entity = entityByName.get(hit._entityName);\n const label = hit[getDisplayAttribute(entity)?.name ?? ''];\n\n return (\n <li key={`${hit._entityName}:${hit._id}`}>\n <button\n className=\"fk:flex fk:w-full fk:items-center fk:gap-2 fk:rounded-md fk:px-2 fk:py-1.5 fk:text-left fk:text-sm fk:hover:bg-sidebar-accent\"\n onClick={() => onHit(hit._entityName, hit._id)}\n type=\"button\"\n >\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2.5 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[hit._entityName] ?? '#71717a' }}\n />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate\">{String(label ?? hit._id)}</span>\n </button>\n </li>\n );\n })}\n {!isLoading && results.length === 0 ? (\n <li className=\"fk:px-2 fk:py-1.5 fk:text-sm fk:text-muted-foreground\">Nothing found</li>\n ) : null}\n </ul>\n ) : null}\n </SidebarGroup>\n\n <SidebarGroup>\n <SidebarGroupLabel>Nodes</SidebarGroupLabel>\n <SidebarMenu>\n {entities.map((entity) => (\n <SidebarMenuItem key={entity.name}>\n <SidebarMenuButton onClick={() => onStart(entity)} tooltip={getEntityLabel(entity)}>\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2.5 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[entity.name] ?? '#71717a' }}\n />\n <span className=\"fk:truncate\">{getEntityLabel(entity)}</span>\n {totals[entity.plural] !== undefined ? (\n <span className=\"fk:ml-auto fk:text-xs fk:text-muted-foreground\">\n {totals[entity.plural]?.toLocaleString()}\n </span>\n ) : null}\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n\n {onCanvasEntities.length > 0 ? (\n <SidebarGroup className=\"fk:group-data-[collapsible=icon]:hidden\">\n <SidebarGroupLabel>On canvas</SidebarGroupLabel>\n <ul className=\"fk:flex fk:flex-col\" data-testid=\"graph-legend\">\n {onCanvasEntities.map((name) => {\n const entity = entityByName.get(name);\n const checked = !hiddenEntities.includes(name);\n const id = `graph-legend-${name}`;\n\n return (\n <li className=\"fk:flex fk:h-8 fk:items-center fk:gap-2 fk:px-2 fk:text-sm\" key={name}>\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2.5 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[name] ?? '#71717a', opacity: checked ? 1 : 0.35 }}\n />\n <label className=\"fk:min-w-0 fk:flex-1 fk:cursor-pointer fk:truncate\" htmlFor={id}>\n {entity ? getEntityLabel(entity) : name}\n </label>\n <span className=\"fk:text-xs fk:text-muted-foreground\">{onCanvas[name]?.toLocaleString()}</span>\n <Checkbox\n aria-label={`Show ${entity ? getEntityLabel(entity) : name}`}\n checked={checked}\n id={id}\n onCheckedChange={() => onToggleEntity(name)}\n />\n </li>\n );\n })}\n </ul>\n </SidebarGroup>\n ) : null}\n </SidebarContent>\n <SidebarRail />\n </SidebarPanel>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { EraserIcon, ExpandIcon, EyeOffIcon, LoaderCircleIcon, ScanIcon } from 'lucide-react';\nimport { Button, Separator, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\n\nexport interface GraphToolbarProps {\n hasSelection: boolean;\n hasNodes: boolean;\n isLoading: boolean;\n onFit: () => void;\n onExpand: () => void;\n onHide: () => void;\n onClear: () => void;\n}\n\nfunction ToolbarButton({\n label,\n icon,\n disabled,\n onClick,\n}: {\n label: string;\n icon: JSX.Element;\n disabled?: boolean;\n onClick: () => void;\n}): JSX.Element {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button className=\"fk:h-8 fk:gap-1.5 fk:px-2.5\" disabled={disabled} onClick={onClick} size=\"sm\" variant=\"ghost\">\n {icon}\n <span className=\"fk:text-xs\">{label}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n/** The floating actions over the canvas. */\nexport function GraphToolbar({\n hasSelection,\n hasNodes,\n isLoading,\n onFit,\n onExpand,\n onHide,\n onClear,\n}: GraphToolbarProps): JSX.Element {\n return (\n <div\n className=\"fk:flex fk:items-center fk:gap-0.5 fk:rounded-lg fk:border fk:bg-background fk:p-1 fk:shadow-xs\"\n data-testid=\"graph-toolbar\"\n >\n <ToolbarButton disabled={!hasNodes} icon={<ScanIcon className=\"fk:size-3.5\" />} label=\"Fit\" onClick={onFit} />\n <Separator className=\"fk:mx-0.5 fk:h-4\" orientation=\"vertical\" />\n <ToolbarButton\n disabled={!hasSelection || isLoading}\n icon={\n isLoading ? (\n <LoaderCircleIcon className=\"fk:size-3.5 fk:animate-spin\" />\n ) : (\n <ExpandIcon className=\"fk:size-3.5\" />\n )\n }\n label=\"Expand\"\n onClick={onExpand}\n />\n <ToolbarButton\n disabled={!hasSelection}\n icon={<EyeOffIcon className=\"fk:size-3.5\" />}\n label=\"Hide\"\n onClick={onHide}\n />\n <Separator className=\"fk:mx-0.5 fk:h-4\" orientation=\"vertical\" />\n <ToolbarButton\n disabled={!hasNodes}\n icon={<EraserIcon className=\"fk:size-3.5\" />}\n label=\"Clear\"\n onClick={onClear}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useReducer, useRef, useState } from 'react';\nimport type { Dispatch } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { USER_QUERY_CONTEXT } from '../../graphql-client/graphql-context';\nimport { toast } from '../../ui';\nimport type { Attribute, Entity } from '../../core/types';\nimport {\n buildExpandQuery,\n buildRecordsQuery,\n EXPAND_PAGE,\n fetchedFromRecords,\n getEntity,\n graphFromRecords,\n nodeKey,\n type GraphRecord,\n} from './graph';\nimport { graphFromQueryResult, type QueryResult, type QueryRun } from './query';\nimport { EMPTY_SCENE, sceneReducer, type SceneAction, type SceneState } from './scene';\n\n/** Which records to load: given ids (with their first hop when `expand`), or a sample. */\nexport type RecordSelection = { ids: string[]; expand: boolean } | { limit: number };\n\nexport interface SceneApi {\n state: SceneState;\n dispatch: Dispatch<SceneAction>;\n isLoading: boolean;\n /** Loads records, with the first page of each relationship when asked; resolves to their node keys. */\n loadRecords: (entity: Entity, selection: RecordSelection) => Promise<string[]>;\n /** Loads the first page of every relationship of a node. */\n expandAll: (key: string) => Promise<void>;\n /** Loads the next page of one relationship of a node. */\n expandAttribute: (key: string, attribute: Attribute) => Promise<void>;\n /** Runs any GraphQL query and draws its result, replacing the canvas unless `append`. */\n runQuery: (query: string, options: { append: boolean }) => Promise<QueryRun>;\n}\n\ntype RecordsResult = { [plural: string]: GraphRecord[] };\n\nfunction errorMessage(error: unknown, fallback = 'The records could not be loaded.'): string {\n return error instanceof Error ? error.message : fallback;\n}\n\n/**\n * The scene plus the loaders that grow it through the project GraphQL API,\n * so the roles and spaces of the signed-in member apply to every node.\n */\nexport function useScene({ schema, scope }: { schema: Entity[]; scope: string }): SceneApi {\n const client = useApolloClient();\n const [state, dispatch] = useReducer(sceneReducer, EMPTY_SCENE);\n const [pending, setPending] = useState(0);\n // Counts the loads that reached the canvas, so a query only replaces a\n // canvas nothing else has added to while it ran.\n const loadsRef = useRef(0);\n\n const loadRecords = useCallback(\n async (entity: Entity, selection: RecordSelection): Promise<string[]> => {\n const ids = 'ids' in selection ? selection.ids : undefined;\n const expand = 'ids' in selection ? selection.expand : false;\n const limit = 'limit' in selection ? selection.limit : ids?.length;\n setPending((count) => count + 1);\n\n try {\n const result = await client.query<RecordsResult>({\n query: gql(buildRecordsQuery({ entity, schema, scope, expand })),\n variables: {\n where: ids ? { _id: { in: ids } } : undefined,\n limit,\n },\n fetchPolicy: 'network-only',\n });\n const records = result.data?.[entity.plural] ?? [];\n loadsRef.current += 1;\n dispatch({\n type: 'merge',\n data: graphFromRecords({ records, entity, schema, scope }),\n fetched: fetchedFromRecords(records, entity),\n });\n\n return records.map((record) => nodeKey(entity.name, record._id));\n } catch (error) {\n toast.error(errorMessage(error));\n\n return [];\n } finally {\n setPending((count) => count - 1);\n }\n },\n [client, schema, scope]\n );\n\n const expandAll = useCallback(\n async (key: string): Promise<void> => {\n const node = state.nodes[key];\n const entity = node ? getEntity(schema, node.entity) : undefined;\n\n if (!node || !entity) {\n return;\n }\n\n await loadRecords(entity, { ids: [node.id], expand: true });\n },\n [loadRecords, schema, state.nodes]\n );\n\n const expandAttribute = useCallback(\n async (key: string, attribute: Attribute): Promise<void> => {\n const node = state.nodes[key];\n const entity = node ? getEntity(schema, node.entity) : undefined;\n\n if (!node || !entity) {\n return;\n }\n\n const offset = state.fetched[key]?.[attribute.name] ?? 0;\n setPending((count) => count + 1);\n\n try {\n const result = await client.query<RecordsResult>({\n query: gql(buildExpandQuery({ entity, schema, scope, attribute })),\n variables: { id: node.id, offset, limit: EXPAND_PAGE },\n fetchPolicy: 'network-only',\n });\n const records = result.data?.[entity.plural] ?? [];\n loadsRef.current += 1;\n const received = records.reduce((sum, record) => {\n const related = record[attribute.name];\n\n return sum + (Array.isArray(related) ? related.length : 0);\n }, 0);\n dispatch({\n type: 'merge',\n data: graphFromRecords({ records, entity, schema, scope }),\n fetched: { [key]: { [attribute.name]: offset + received } },\n });\n } catch (error) {\n toast.error(errorMessage(error));\n } finally {\n setPending((count) => count - 1);\n }\n },\n [client, schema, scope, state.fetched, state.nodes]\n );\n\n const runQuery = useCallback(\n async (query: string, { append }: { append: boolean }): Promise<QueryRun> => {\n const startedAt = performance.now();\n let document;\n\n try {\n document = gql(query);\n } catch (error) {\n return {\n data: null,\n error: errorMessage(error, 'The query could not be parsed.'),\n elapsedMs: 0,\n nodes: 0,\n edges: 0,\n };\n }\n\n const loadsAtStart = loadsRef.current;\n setPending((count) => count + 1);\n\n try {\n // Not cached: a partial result would overwrite the records Desk reads cache-first.\n const result = await client.query<QueryResult>({\n query: document,\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n context: USER_QUERY_CONTEXT,\n });\n const data = result.data ?? null;\n const graph = graphFromQueryResult({ data, schema, scope });\n\n // A failed query, or one that draws nothing, leaves the canvas as it\n // was; partial data beside errors, or a result arriving after other\n // loads reached the canvas, is added to it rather than replacing it.\n if (graph.nodes.length > 0) {\n if (!append && !result.error && loadsRef.current === loadsAtStart) {\n dispatch({ type: 'clear' });\n }\n\n loadsRef.current += 1;\n dispatch({ type: 'merge', data: graph });\n }\n\n return {\n data,\n error: result.error ? result.error.message : null,\n elapsedMs: Math.round(performance.now() - startedAt),\n nodes: graph.nodes.length,\n edges: graph.edges.length,\n };\n } catch (error) {\n return {\n data: null,\n error: errorMessage(error, 'The query failed.'),\n elapsedMs: Math.round(performance.now() - startedAt),\n nodes: 0,\n edges: 0,\n };\n } finally {\n setPending((count) => count - 1);\n }\n },\n [client, schema, scope]\n );\n\n return { state, dispatch, isLoading: pending > 0, loadRecords, expandAll, expandAttribute, runQuery };\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { JSX } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { filterEntitiesForSpaces } from '../../core/spaces';\nimport type { Attribute } from '../../core/types';\nimport { useDispatch } from '../../entities/actions-context';\nimport {\n Button,\n readSidebarCookieState,\n SidebarInset,\n SidebarProvider,\n SidebarTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { useTheme } from '../../ui/theme-context';\nimport { trackStudioEvent } from '../../core/analytics/product-events';\nimport { GraphCanvas, type GraphCanvasApi } from './canvas';\nimport { GraphContextMenu, type GraphContextMenuState } from './context-menu';\nimport {\n EXPAND_HOP_MAX_RECORDS,\n getEntity,\n getEntityColors,\n getGraphEntities,\n getRelationshipAttributes,\n parseGraphParams,\n SAMPLE_LIMIT,\n} from './graph';\nimport { GraphInspector } from './inspector';\nimport { QueryPane } from './query-pane';\nimport { countNodesByEntity, neighbourKeys } from './scene';\nimport { GraphSidebar } from './sidebar';\nimport { GraphToolbar } from './toolbar';\nimport { useScene } from './use-scene';\n\n/**\n * The Graph app: explore records as nodes and relationships. The sidebar\n * adds records, the canvas draws them, the inspector details the selection.\n * Other apps open it with `?entity=<name>&ids=<id,id>` to show those records\n * expanded one hop. The Query view draws the result of any GraphQL query.\n */\nexport function Root(): JSX.Element {\n const { currentProjectId, currentProject, currentProjectSchema } = useConfig();\n\n // Once the project has loaded, so a mistyped or inaccessible URL is not counted.\n useEffect(() => {\n if (currentProjectId && currentProject) {\n trackStudioEvent({ event: 'graph_opened', projectId: currentProjectId });\n }\n }, [currentProjectId, currentProject]);\n const [, auth] = useAuth();\n const { scope } = useAppContext();\n const { resolvedTheme } = useTheme();\n const location = useLocation();\n const dispatchAction = useDispatch();\n const theme = resolvedTheme === 'dark' ? 'dark' : 'light';\n const defaultScope = currentProject?.scopes?.find((item) => item.isDefault)?.name ?? 'default';\n const scopeField = scope || defaultScope;\n // Space-bound entities are hidden from non-members, as in Desk; the API\n // rejects their data either way.\n const userSpaces = auth.user?.spaces;\n const schema = useMemo(\n () => filterEntitiesForSpaces(currentProjectSchema, userSpaces),\n [currentProjectSchema, userSpaces]\n );\n const entities = useMemo(() => getGraphEntities(schema), [schema]);\n const colors = useMemo(() => getEntityColors(schema, theme), [schema, theme]);\n const scene = useScene({ schema, scope: scopeField });\n const { state, dispatch, isLoading, loadRecords, expandAll, expandAttribute, runQuery } = scene;\n const canvasApi = useRef<GraphCanvasApi | null>(null);\n const [menu, setMenu] = useState<GraphContextMenuState | null>(null);\n const [isLayoutRunning, setIsLayoutRunning] = useState(false);\n const [mode, setMode] = useState<'explore' | 'query'>('explore');\n const loadedSearchRef = useRef<string | null>(null);\n const onCanvas = useMemo(() => countNodesByEntity(state), [state]);\n const selectedNode = state.selected ? state.nodes[state.selected] : undefined;\n const menuNode = menu ? state.nodes[menu.key] : undefined;\n const menuEntity = menuNode ? getEntity(schema, menuNode.entity) : undefined;\n const nodeCount = Object.keys(state.nodes).length;\n const edgeCount = Object.keys(state.edges).length;\n const defaultOpen = readSidebarCookieState();\n\n const select = useCallback((key: string | null) => dispatch({ type: 'select', key }), [dispatch]);\n\n const openRecord = useCallback(\n (key: string) => {\n const node = state.nodes[key];\n const entity = node ? getEntity(schema, node.entity) : undefined;\n\n if (node && entity) {\n dispatchAction({ type: 'EditEntity', payload: { entityId: node.id, entityNamePlural: entity.plural } });\n }\n },\n [dispatchAction, schema, state.nodes]\n );\n\n const hide = useCallback((key: string) => dispatch({ type: 'remove', keys: [key] }), [dispatch]);\n\n const hideOthers = useCallback(\n (key: string) => dispatch({ type: 'keepOnly', keys: [key, ...neighbourKeys(state, key)] }),\n [dispatch, state]\n );\n\n const togglePin = useCallback((key: string) => dispatch({ type: 'togglePin', key }), [dispatch]);\n\n const pin = useCallback(\n (key: string) => {\n if (!state.pinned[key]) {\n dispatch({ type: 'togglePin', key });\n }\n },\n [dispatch, state.pinned]\n );\n\n const addRecord = useCallback(\n async (entityName: string, id: string) => {\n const entity = getEntity(schema, entityName);\n\n if (!entity) {\n return;\n }\n\n const [key] = await loadRecords(entity, { ids: [id], expand: true });\n\n if (key) {\n select(key);\n }\n },\n [loadRecords, schema, select]\n );\n\n const expandAttributeAndClose = useCallback(\n (key: string, attribute: Attribute) => {\n setMenu(null);\n void expandAttribute(key, attribute);\n },\n [expandAttribute]\n );\n\n // Records another app asked for: `?entity=product&ids=a,b` loads those\n // records, expanded one hop when they are few, `?entity=product` a sample.\n useEffect(() => {\n const params = parseGraphParams(location.search);\n\n // Keyed on the navigation, not the query string: opening the same\n // records again after a Clear must load them again.\n if (!params || loadedSearchRef.current === location.key) {\n return;\n }\n\n const entity = getEntity(schema, params.entity);\n\n if (!entity || schema.length === 0) {\n return;\n }\n\n loadedSearchRef.current = location.key;\n const selection =\n params.ids.length > 0\n ? { ids: params.ids, expand: params.ids.length <= EXPAND_HOP_MAX_RECORDS }\n : { limit: SAMPLE_LIMIT };\n void loadRecords(entity, selection).then((keys) => {\n if (params.ids.length === 1 && keys[0]) {\n select(keys[0]);\n }\n });\n }, [location.key, location.search, schema, loadRecords, select]);\n\n if (!currentProjectId) {\n return (\n <main className=\"fk:flex fk:h-full fk:flex-1 fk:items-center fk:justify-center fk:p-8 fk:text-sm fk:text-muted-foreground\">\n Select a project to explore its graph.\n </main>\n );\n }\n\n return (\n <SidebarProvider className=\"fk:h-full\" defaultOpen={defaultOpen}>\n <GraphSidebar\n colors={colors}\n entities={entities}\n hiddenEntities={state.hiddenEntities}\n onCanvas={onCanvas}\n onHit={(entityName, id) => void addRecord(entityName, id)}\n onStart={(entity) => void loadRecords(entity, { limit: SAMPLE_LIMIT })}\n onToggleEntity={(entityName) => dispatch({ type: 'toggleEntity', entity: entityName })}\n projectId={currentProjectId}\n />\n <SidebarInset className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0\" data-testid=\"graph-app\">\n <QueryPane\n hidden={mode !== 'query'}\n isRunning={isLoading}\n key={currentProjectId}\n onRun={runQuery}\n projectId={currentProjectId}\n schema={schema}\n schemaHash={currentProject?.schemaHash ?? null}\n scope={scopeField}\n theme={theme}\n />\n <div className=\"fk:relative fk:min-w-0 fk:flex-1 fk:overflow-hidden fk:bg-background\">\n <div className=\"fk:pointer-events-none fk:absolute fk:left-3 fk:right-3 fk:top-3 fk:z-10 fk:flex fk:flex-wrap fk:items-start fk:justify-between fk:gap-2\">\n <div className=\"fk:pointer-events-auto fk:flex fk:items-center fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:h-8 fk:w-8 fk:rounded-lg fk:hover:bg-transparent fk:dark:hover:bg-transparent\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <GraphToolbar\n hasNodes={nodeCount > 0}\n hasSelection={selectedNode !== undefined}\n isLoading={isLoading}\n onClear={() => dispatch({ type: 'clear' })}\n onExpand={() => {\n if (state.selected) {\n void expandAll(state.selected);\n }\n }}\n onFit={() => canvasApi.current?.fit()}\n onHide={() => {\n if (state.selected) {\n hide(state.selected);\n }\n }}\n />\n </div>\n <div\n aria-label=\"View\"\n className=\"fk:pointer-events-auto fk:flex fk:items-center fk:gap-0.5 fk:rounded-lg fk:border fk:bg-background fk:p-0.5 fk:shadow-xs\"\n data-testid=\"graph-mode\"\n role=\"group\"\n >\n <Button\n aria-pressed={mode === 'explore'}\n className=\"fk:h-7 fk:px-3 fk:text-xs\"\n onClick={() => setMode('explore')}\n size=\"sm\"\n variant={mode === 'explore' ? 'default' : 'ghost'}\n >\n Explore\n </Button>\n <Button\n aria-pressed={mode === 'query'}\n className=\"fk:h-7 fk:px-3 fk:text-xs\"\n onClick={() => setMode('query')}\n size=\"sm\"\n variant={mode === 'query' ? 'default' : 'ghost'}\n >\n Query\n </Button>\n </div>\n </div>\n {nodeCount > 0 ? null : (\n <div className=\"fk:pointer-events-none fk:absolute fk:inset-0 fk:flex fk:items-center fk:justify-center fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {isLoading\n ? 'Loading records…'\n : mode === 'query'\n ? 'Run a query to draw its result.'\n : 'Search a record or start from an entity to draw its graph.'}\n </div>\n )}\n <GraphCanvas\n apiRef={canvasApi}\n colors={colors}\n onContextMenu={(key, position) => setMenu({ key, ...position })}\n onExpand={(key) => void expandAll(key)}\n onLayoutChange={setIsLayoutRunning}\n onPin={pin}\n onSelect={select}\n scene={state}\n theme={theme}\n />\n <div\n className=\"fk:absolute fk:bottom-3 fk:left-3 fk:flex fk:max-w-[calc(100%-1.5rem)] fk:items-center fk:gap-2 fk:rounded-lg fk:border fk:bg-background fk:px-2.5 fk:py-1.5 fk:text-xs fk:text-muted-foreground fk:shadow-xs\"\n data-testid=\"graph-status\"\n >\n <span>\n {nodeCount.toLocaleString()} {nodeCount === 1 ? 'node' : 'nodes'} · {edgeCount.toLocaleString()}{' '}\n {edgeCount === 1 ? 'relationship' : 'relationships'}\n </span>\n {isLayoutRunning ? <span>· laying out…</span> : null}\n {state.notice ? <span className=\"fk:truncate fk:text-foreground\">· {state.notice}</span> : null}\n </div>\n <GraphContextMenu\n isPinned={menu ? state.pinned[menu.key] === true : false}\n menu={menu}\n onClose={() => setMenu(null)}\n onExpandAll={(key) => void expandAll(key)}\n onExpandAttribute={expandAttributeAndClose}\n onHide={hide}\n onHideOthers={hideOthers}\n onOpenRecord={openRecord}\n onTogglePin={togglePin}\n relationships={menuEntity ? getRelationshipAttributes(menuEntity) : []}\n />\n </div>\n {selectedNode ? (\n <GraphInspector\n colors={colors}\n isLoading={isLoading}\n node={selectedNode}\n onClose={() => select(null)}\n onExpandAll={(key) => void expandAll(key)}\n onExpandAttribute={(key, attribute) => void expandAttribute(key, attribute)}\n onHide={hide}\n onOpenRecord={openRecord}\n scene={state}\n schema={schema}\n scope={scopeField}\n />\n ) : null}\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/graph/layout.ts","../src/apps/graph/canvas.tsx","../src/apps/graph/context-menu.tsx","../src/apps/graph/scene.ts","../src/apps/graph/inspector.tsx","../src/apps/graph/query-editor.tsx","../src/apps/graph/query.ts","../src/apps/graph/use-graphql-schema.ts","../src/apps/graph/query-pane.tsx","../src/apps/graph/sidebar.tsx","../src/apps/graph/toolbar.tsx","../src/apps/graph/use-scene.ts","../src/apps/graph/root.tsx"],"names":["layoutBudget","order","isSettled","mean","max","diagonal","threshold","PLACEMENT_RADIUS","SETTLE_INTERVAL_MS","SETTLE_MIN_MS","SETTLE_QUIET_SAMPLES","nodeSize","degree","ringRadius","count","ringPositions","center","radius","phase","_","index","angle","distance","isPositioned","graph","key","placedExtent","placed","sum","reach","placeNewNodes","added","groups","anchor","neighbour","keys","positions","extent","position","PositionTracker","cursor","_key","attributes","total","free","minX","minY","maxX","maxY","x","y","moved","syncGraph","scene","colors","changed","hadNodes","node","edge","GraphCanvas","theme","apiRef","onSelect","onContextMenu","onExpand","onPin","onLayoutChange","containerRef","useRef","graphRef","rendererRef","layoutRef","layoutTimerRef","dragRef","dragLayoutRef","settleTimerRef","layoutDeadlineRef","heldRef","pinnedRef","hoverRef","callbacksRef","mountAttempt","setMountAttempt","useState","Graph","stopLayout","useCallback","startLayout","budgetMs","hold","inferred","forceAtlas2","layout","FA2LayoutSupervisor","drag","startedAt","tracker","hasMoved","quietSamples","onBudget","movement","applyHover","renderer","previous","nodes","useEffect","container","observer","attempt","isDark","Sigma","DEFAULT_STYLES","_attributes","state","graphState","event","original","holdAllBut","wasRunning","camera","handleCameraUpdate","ratio","isZoomedIn","preventContextMenu","sizeObserver","hidden","pinsChanged","fixed","source","target","jsx","GraphContextMenu","menu","relationships","isPinned","onClose","onExpandAll","onExpandAttribute","onHide","onHideOthers","onTogglePin","onOpenRecord","jsxs","DropdownMenu","open","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","attribute","DropdownMenuSeparator","EMPTY_SCENE","mergeCounts","current","incoming","next","perAttribute","mergeFetched","merged","offset","withoutNodes","dropped","edges","pinned","sceneReducer","action","existing","MAX_NODES","kept","entity","countNodesByEntity","result","countEdgesByAttribute","neighbourKeys","getTextColorOn","hex","r","g","b","channel","GraphInspector","schema","scope","isLoading","getEntity","detailsDocument","useMemo","gql","buildDetailsQuery","countsDocument","buildCountsQuery","details","useQuery","counts","record","countRecord","onCanvas","getRelationshipAttributes","getDetailAttributes","updatedAt","color","getEntityLabel","Button","XIcon","SquareArrowOutUpRightIcon","Tooltip","TooltipTrigger","LoaderCircleIcon","ExpandIcon","TooltipContent","EyeOffIcon","formatDetailValue","formatDistance","relatedEntity","shown","fetched","exhausted","editorChrome","EditorView","QueryEditor","ariaLabel","value","onChange","onRun","parentRef","viewRef","themeCompartmentRef","Compartment","onChangeRef","onRunRef","valueRef","parent","view","EditorState","lineNumbers","highlightActiveLineGutter","highlightSpecialChars","history","foldGutter","drawSelection","dropCursor","indentOnInput","bracketMatching","closeBrackets","highlightActiveLine","Prec","keymap","closeBracketsKeymap","defaultKeymap","historyKeymap","foldKeymap","indentWithTab","graphql","update","placeholderExtension","darkTheme","lightTheme","updateSchema","TABLE_ROW_LIMIT","EXAMPLE_RELATED_LIMIT","EXAMPLE_RELATIONSHIPS","isRecord","collectRecords","entityOfRootField","field","plural","relationshipOfKey","name","relationshipTo","entityOfRecord","fallback","typename","captionFromRecord","caption","captionOf","text","graphFromQueryResult","data","addRecord","nodeKey","label","keyAttribute","keyEntity","relatedRecord","edgeOf","exampleQueries","getGraphEntities","related","getDisplaySelection","display","formatCell","records","item","collectRows","tableFromResult","columns","column","stripTypename","queryStorageKey","projectId","schemaCache","introspect","client","hash","cached","getIntrospectionQuery","USER_QUERY_CONTEXT","buildClientSchema","useGraphQLSchema","schemaHash","useApolloClient","setSchema","cancelled","loaded","QueryPane","isRunning","opened","setOpened","graphqlSchema","examples","query","setQuery","readComposerDraft","seededRef","append","setAppend","tab","setTab","run","setRun","table","json","first","writeComposerDraft","execute","ChevronDownIcon","example","PlayIcon","Tabs","TabsList","TabsTrigger","TabsContent","Checkbox","checked","Label","Table","TableHeader","TableRow","TableHead","TableBody","row","TableCell","SEARCH_DEBOUNCE_MS","SEARCH_HITS_PER_ENTITY","buildSearchRequest","entities","q","trimmed","useTotals","countable","getTotalEntities","document","buildTotalsQuery","pair","GraphSidebar","hiddenEntities","onStart","onHit","onToggleEntity","debouncedQuery","useDebounce","searchable","request","results","useSearch","totals","entityByName","onCanvasEntities","Sidebar","SidebarContent","SidebarGroup","SearchIcon","Input","hit","getDisplayAttribute","SidebarGroupLabel","SidebarMenu","SidebarMenuItem","SidebarMenuButton","id","SidebarRail","ToolbarButton","icon","disabled","onClick","GraphToolbar","hasSelection","hasNodes","onFit","onClear","ScanIcon","Separator","EraserIcon","errorMessage","error","useScene","dispatch","useReducer","pending","setPending","loadsRef","loadRecords","selection","ids","expand","limit","buildRecordsQuery","graphFromRecords","fetchedFromRecords","toast","expandAll","expandAttribute","buildExpandQuery","EXPAND_PAGE","received","runQuery","loadsAtStart","Root","currentProjectId","currentProject","currentProjectSchema","useConfig","trackStudioEvent","auth","useAuth","useAppContext","resolvedTheme","useTheme","location","useLocation","dispatchAction","useDispatch","defaultScope","scopeField","userSpaces","filterEntitiesForSpaces","getEntityColors","canvasApi","setMenu","isLayoutRunning","setIsLayoutRunning","mode","setMode","loadedSearchRef","selectedNode","menuNode","menuEntity","nodeCount","edgeCount","defaultOpen","readSidebarCookieState","select","openRecord","hide","hideOthers","togglePin","pin","entityName","expandAttributeAndClose","params","parseGraphParams","EXPAND_HOP_MAX_RECORDS","SAMPLE_LIMIT","SidebarProvider","SidebarInset","SidebarTrigger"],"mappings":"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","file":"root-LFJ5BQSY.js","sourcesContent":["/**\n * Pure layout rules of the canvas: how long the force layout may run, when\n * it counts as settled, and when a graph is too dense for labels everywhere.\n */\n\n/** Above this many nodes, labels show only around the pointer and the selection unless zoomed in. */\nexport const DENSE_NODES = 300;\n\n/** Camera ratio below which a dense graph shows labels again (1 = the whole graph in view). */\nexport const ZOOMED_IN_RATIO = 0.45;\n\n/** The longest the force layout runs after a change: 2 s for a few nodes, 20 s at the cap. */\nexport function layoutBudget(order: number): number {\n return Math.min(20000, 2000 + order * 9);\n}\n\n/** How much the free nodes moved since the last sample, and the graph's extent. */\nexport interface LayoutMovement {\n /** Mean move of the nodes the layout may move. */\n mean: number;\n /** Largest move of any of them: a few new nodes still flying in keep the layout going. */\n max: number;\n /** Bounding-box diagonal of the whole graph. */\n diagonal: number;\n}\n\n/**\n * Whether the layout has settled: the mean move per free node is a sliver\n * of the graph's extent and no node is still travelling, with a floor so a\n * tiny graph settles too.\n */\nexport function isSettled({ mean, max, diagonal }: LayoutMovement): boolean {\n const threshold = Math.max(0.05, diagonal * 0.0015);\n\n return mean < threshold && max < threshold * 20;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { JSX, MutableRefObject } from 'react';\nimport Graph from 'graphology';\nimport type { Attributes } from 'graphology-types';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\nimport FA2LayoutSupervisor from 'graphology-layout-forceatlas2/worker';\nimport Sigma, { DEFAULT_STYLES } from 'sigma';\nimport { DENSE_NODES, isSettled, layoutBudget, ZOOMED_IN_RATIO, type LayoutMovement } from './layout';\nimport type { SceneState } from './scene';\n\ntype NodeAttributes = {\n entity: string;\n label: string;\n color: string;\n size: number;\n x: number;\n y: number;\n fixed?: boolean;\n};\ntype EdgeAttributes = { size: number };\n/** A neighbour of the hovered node, for its label. */\ntype NodeState = { isNeighbour: boolean };\ntype EdgeState = Record<string, never>;\n/** Too many nodes for labels everywhere; zoomed in far enough to show them anyway. */\ntype GraphState = { isDense: boolean; isZoomedIn: boolean };\ntype Renderer = Sigma<NodeAttributes, EdgeAttributes, Attributes, NodeState, EdgeState, GraphState>;\n\nexport interface GraphCanvasApi {\n /** Brings the whole graph into view. */\n fit: () => void;\n}\n\nexport interface GraphCanvasProps {\n scene: SceneState;\n colors: { [entity: string]: string };\n theme: 'light' | 'dark';\n apiRef: MutableRefObject<GraphCanvasApi | null>;\n onSelect: (key: string | null) => void;\n onContextMenu: (key: string, position: { x: number; y: number }) => void;\n onExpand: (key: string) => void;\n onPin: (key: string) => void;\n onLayoutChange: (running: boolean) => void;\n}\n\n/** Spread of new nodes around the node they came from, in graph units. */\nconst PLACEMENT_RADIUS = 40;\n/** How often the layout is checked for movement. */\nconst SETTLE_INTERVAL_MS = 400;\n/** The layout runs at least this long before it may be called settled. */\nconst SETTLE_MIN_MS = 1200;\n/** Two quiet samples in a row, after the worker first moved something, end the layout. */\nconst SETTLE_QUIET_SAMPLES = 2;\n\nfunction nodeSize(degree: number): number {\n return 5 + Math.min(10, Math.sqrt(degree) * 2);\n}\n\ntype Point = { x: number; y: number };\n\n/** The ring new nodes start on: wider the more of them share an anchor, so they do not explode apart. */\nfunction ringRadius(count: number): number {\n return PLACEMENT_RADIUS * (0.8 + Math.sqrt(count) * 0.6);\n}\n\n/**\n * Evenly spaced positions on a ring, with a little jitter so no two coincide\n * and a random phase so a lone newcomer can land on any side of its anchor.\n */\nfunction ringPositions(center: Point, count: number, radius: number): Point[] {\n const phase = Math.random() * Math.PI * 2;\n\n return Array.from({ length: count }, (_, index) => {\n const angle = phase + (index / count) * Math.PI * 2 + Math.random() * 0.3;\n const distance = radius * (0.9 + Math.random() * 0.2);\n\n return { x: center.x + Math.cos(angle) * distance, y: center.y + Math.sin(angle) * distance };\n });\n}\n\nfunction isPositioned(graph: Graph<NodeAttributes, EdgeAttributes>, key: string): boolean {\n return !Number.isNaN(graph.getNodeAttribute(key, 'x'));\n}\n\n/** Centre and reach of the nodes already placed, to put unanchored newcomers beyond them. */\nfunction placedExtent(\n graph: Graph<NodeAttributes, EdgeAttributes>,\n placed: string[]\n): { center: Point; reach: number } {\n if (placed.length === 0) {\n return { center: { x: 0, y: 0 }, reach: 0 };\n }\n\n const center = placed.reduce(\n (sum, key) => ({ x: sum.x + graph.getNodeAttribute(key, 'x'), y: sum.y + graph.getNodeAttribute(key, 'y') }),\n { x: 0, y: 0 }\n );\n center.x /= placed.length;\n center.y /= placed.length;\n const reach = placed.reduce(\n (max, key) =>\n Math.max(\n max,\n Math.hypot(graph.getNodeAttribute(key, 'x') - center.x, graph.getNodeAttribute(key, 'y') - center.y)\n ),\n 0\n );\n\n return { center, reach };\n}\n\n/**\n * Places new nodes: those sharing an anchor already on the canvas go on a\n * ring around it, the rest on a ring beyond everything placed so far.\n */\nfunction placeNewNodes(graph: Graph<NodeAttributes, EdgeAttributes>, added: Set<string>): void {\n const groups = new Map<string | null, string[]>();\n added.forEach((key) => {\n const anchor =\n graph.neighbors(key).find((neighbour) => !added.has(neighbour) && isPositioned(graph, neighbour)) ?? null;\n groups.set(anchor, [...(groups.get(anchor) ?? []), key]);\n });\n groups.forEach((keys, anchor) => {\n let positions: Point[];\n\n if (anchor) {\n const center = { x: graph.getNodeAttribute(anchor, 'x'), y: graph.getNodeAttribute(anchor, 'y') };\n positions = ringPositions(center, keys.length, ringRadius(keys.length));\n } else {\n const placed = graph.nodes().filter((key) => !added.has(key) && isPositioned(graph, key));\n const extent = placedExtent(graph, placed);\n positions = ringPositions(extent.center, keys.length, extent.reach + ringRadius(keys.length));\n }\n\n positions.forEach((position, index) => graph.mergeNodeAttributes(keys[index]!, position));\n });\n}\n\n/**\n * Positions of every node, kept in one typed array the layout's movement is\n * measured against: one pass per sample, no allocation.\n */\nclass PositionTracker {\n private positions: Float64Array;\n\n constructor(private readonly graph: Graph<NodeAttributes, EdgeAttributes>) {\n this.positions = new Float64Array(graph.order * 2);\n let cursor = 0;\n this.graph.forEachNode((_key, attributes) => {\n this.positions[cursor] = attributes.x;\n this.positions[cursor + 1] = attributes.y;\n cursor += 2;\n });\n }\n\n /** Movement since the last call, then remembers the current positions. */\n measure(): LayoutMovement {\n const { graph, positions } = this;\n let total = 0;\n let max = 0;\n let free = 0;\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n let index = 0;\n graph.forEachNode((_key, attributes) => {\n const { x, y } = attributes;\n\n if (index + 1 < positions.length && !attributes.fixed) {\n const moved = Math.hypot(x - positions[index]!, y - positions[index + 1]!);\n total += moved;\n max = Math.max(max, moved);\n free += 1;\n }\n\n positions[index] = x;\n positions[index + 1] = y;\n index += 2;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n });\n\n return {\n mean: free > 0 ? total / free : 0,\n max,\n diagonal: graph.order > 0 ? Math.hypot(maxX - minX, maxY - minY) : 0,\n };\n }\n}\n\n/**\n * Adds the scene's new nodes and edges to the graph, drops the removed ones\n * and places new nodes around what is already on the canvas. Reports what\n * was added and whether anything was placed before.\n */\nfunction syncGraph(\n graph: Graph<NodeAttributes, EdgeAttributes>,\n scene: SceneState,\n colors: { [entity: string]: string }\n): { changed: boolean; added: Set<string>; hadNodes: boolean } {\n let changed = false;\n const added = new Set<string>();\n const hadNodes = graph.order > 0;\n\n graph.forEachNode((key) => {\n if (!scene.nodes[key]) {\n graph.dropNode(key);\n changed = true;\n }\n });\n Object.values(scene.nodes).forEach((node) => {\n if (graph.hasNode(node.key)) {\n // A re-captioned node: sigma redraws on the attribute change, no layout needed.\n if (graph.getNodeAttribute(node.key, 'label') !== node.label) {\n graph.setNodeAttribute(node.key, 'label', node.label);\n }\n\n return;\n }\n\n graph.addNode(node.key, {\n entity: node.entity,\n label: node.label,\n color: colors[node.entity] ?? '#71717a',\n size: 5,\n x: Number.NaN,\n y: Number.NaN,\n });\n added.add(node.key);\n changed = true;\n });\n graph.forEachEdge((key) => {\n if (!scene.edges[key]) {\n graph.dropEdge(key);\n changed = true;\n }\n });\n // A multigraph: two relationships between the same records are two edges.\n Object.values(scene.edges).forEach((edge) => {\n if (!graph.hasEdge(edge.key)) {\n graph.addEdgeWithKey(edge.key, edge.source, edge.target, { size: 1 });\n changed = true;\n }\n });\n\n placeNewNodes(graph, added);\n\n if (changed) {\n graph.forEachNode((key) => {\n graph.setNodeAttribute(key, 'size', nodeSize(graph.degree(key)));\n });\n }\n\n return { changed, added, hadNodes };\n}\n\n/**\n * The WebGL canvas: a graphology graph that lives as long as the component,\n * rendered by sigma and laid out by ForceAtlas2 in a web worker until it\n * settles after every change. Selection, hover, entity visibility and pins\n * are sigma states and node attributes; the scene stays the source of truth.\n */\nexport function GraphCanvas({\n scene,\n colors,\n theme,\n apiRef,\n onSelect,\n onContextMenu,\n onExpand,\n onPin,\n onLayoutChange,\n}: GraphCanvasProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null);\n const graphRef = useRef<Graph<NodeAttributes, EdgeAttributes> | null>(null);\n const rendererRef = useRef<Renderer | null>(null);\n const layoutRef = useRef<FA2LayoutSupervisor | null>(null);\n const layoutTimerRef = useRef<number | null>(null);\n /** The node under the pointer while one is dragged, with the pointer's graph position. */\n const dragRef = useRef<{ node: string; x: number; y: number } | null>(null);\n /** The layout a drag started, so a drop restarts only that one. */\n const dragLayoutRef = useRef<FA2LayoutSupervisor | null>(null);\n const settleTimerRef = useRef<number | null>(null);\n const layoutDeadlineRef = useRef<number | null>(null);\n /** Nodes held still for the running layout so only newcomers move. */\n const heldRef = useRef<Set<string>>(new Set());\n const pinnedRef = useRef<SceneState['pinned']>(scene.pinned);\n pinnedRef.current = scene.pinned;\n /** The hovered node and the neighbours marked around it. */\n const hoverRef = useRef<{ key: string | null; nodes: string[] }>({ key: null, nodes: [] });\n const callbacksRef = useRef({ onSelect, onContextMenu, onExpand, onPin, onLayoutChange });\n const [mountAttempt, setMountAttempt] = useState(0);\n callbacksRef.current = { onSelect, onContextMenu, onExpand, onPin, onLayoutChange };\n\n if (!graphRef.current) {\n graphRef.current = new Graph<NodeAttributes, EdgeAttributes>({ type: 'undirected', multi: true });\n }\n\n const stopLayout = useCallback((): void => {\n if (layoutTimerRef.current !== null) {\n window.clearTimeout(layoutTimerRef.current);\n layoutTimerRef.current = null;\n }\n\n if (settleTimerRef.current !== null) {\n window.clearInterval(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n\n if (layoutRef.current) {\n layoutRef.current.kill();\n layoutRef.current = null;\n layoutDeadlineRef.current = null;\n callbacksRef.current.onLayoutChange(false);\n }\n\n const graph = graphRef.current;\n heldRef.current.forEach((key) => {\n if (graph?.hasNode(key)) {\n graph.setNodeAttribute(key, 'fixed', pinnedRef.current[key] === true);\n }\n });\n heldRef.current = new Set();\n }, []);\n\n // The worker reads `fixed` only when it (re)builds its matrices, so a new\n // supervisor is needed whenever pins change while a layout runs. The\n // layout stops once the nodes stop moving, or at the budget. Nodes in\n // `hold` stay where they are, so adding to a settled canvas moves only\n // the newcomers instead of shaking everything.\n const startLayout = useCallback(\n (budgetMs: number, hold: string[] = []): void => {\n const graph = graphRef.current;\n stopLayout();\n\n if (!graph || graph.order === 0) {\n return;\n }\n\n heldRef.current = new Set(hold.filter((key) => graph.hasNode(key)));\n heldRef.current.forEach((key) => graph.setNodeAttribute(key, 'fixed', true));\n\n // Nothing free to move (say, a dragged node without neighbours): a run would never settle.\n if (!graph.someNode((_key, attributes) => !attributes.fixed)) {\n stopLayout();\n\n return;\n }\n\n const inferred = forceAtlas2.inferSettings(graph);\n const layout = new FA2LayoutSupervisor(graph, {\n // Gentle gravity keeps loose parts near the rest; the extra slowdown keeps the motion calm.\n settings: { ...inferred, adjustSizes: true, gravity: 0.2, slowDown: (inferred.slowDown ?? 1) * 2 },\n // A dragged node stays under the pointer: the worker's positions are\n // overridden for it, and with a reducer set the supervisor reads the\n // graph's positions back into the worker, so the neighbours follow.\n outputReducer: (key: string, attributes: NodeAttributes): NodeAttributes => {\n const drag = dragRef.current;\n\n if (drag && drag.node === key) {\n attributes.x = drag.x;\n attributes.y = drag.y;\n }\n\n return attributes;\n },\n });\n const startedAt = performance.now();\n const tracker = new PositionTracker(graph);\n let hasMoved = false;\n let quietSamples = 0;\n layoutRef.current = layout;\n layoutDeadlineRef.current = startedAt + budgetMs;\n layout.start();\n callbacksRef.current.onLayoutChange(true);\n // While a node is dragged the layout runs on: the budget is extended and settling does not stop it.\n const onBudget = (): void => {\n if (dragRef.current) {\n layoutDeadlineRef.current = performance.now() + budgetMs;\n layoutTimerRef.current = window.setTimeout(onBudget, budgetMs);\n } else {\n stopLayout();\n }\n };\n layoutTimerRef.current = window.setTimeout(onBudget, budgetMs);\n settleTimerRef.current = window.setInterval(() => {\n const movement = tracker.measure();\n\n if (dragRef.current) {\n quietSamples = 0;\n\n return;\n }\n\n // The worker needs a moment to spawn; quiet samples before its first\n // positions arrive say nothing about the layout.\n hasMoved = hasMoved || movement.max > 0;\n quietSamples = hasMoved && isSettled(movement) ? quietSamples + 1 : 0;\n\n if (quietSamples >= SETTLE_QUIET_SAMPLES && performance.now() - startedAt >= SETTLE_MIN_MS) {\n stopLayout();\n }\n }, SETTLE_INTERVAL_MS);\n },\n [stopLayout]\n );\n\n /**\n * Marks the hovered node's neighbours so their labels show, clearing the\n * previous marks first. Re-run after the graph changes so nodes added\n * under the pointer are marked too, and marks of dropped nodes go away.\n */\n const applyHover = useCallback((key: string | null): void => {\n const graph = graphRef.current;\n const renderer = rendererRef.current;\n\n if (!graph || !renderer) {\n return;\n }\n\n const previous = hoverRef.current;\n renderer.setNodesState(\n previous.nodes.filter((node) => graph.hasNode(node)),\n { isNeighbour: false }\n );\n\n if (key && graph.hasNode(key)) {\n const nodes = graph.neighbors(key);\n renderer.setNodesState(nodes, { isNeighbour: true });\n hoverRef.current = { key, nodes };\n } else {\n hoverRef.current = { key: null, nodes: [] };\n }\n }, []);\n\n // The renderer: created per theme (styles are fixed at construction) over\n // the persistent graph.\n useEffect(() => {\n const container = containerRef.current;\n const graph = graphRef.current;\n\n if (!container || !graph) {\n return undefined;\n }\n\n // Sigma throws when the container has no size yet (first paint of a lazy\n // route, hidden app); wait for the box to get one before mounting.\n if (container.clientWidth === 0 || container.clientHeight === 0) {\n const observer = new ResizeObserver(() => {\n if (container.clientWidth > 0 && container.clientHeight > 0) {\n observer.disconnect();\n setMountAttempt((attempt) => attempt + 1);\n }\n });\n observer.observe(container);\n\n return () => observer.disconnect();\n }\n\n const isDark = theme === 'dark';\n const renderer: Renderer = new Sigma<NodeAttributes, EdgeAttributes, Attributes, NodeState, EdgeState, GraphState>(\n graph,\n container,\n {\n customNodeState: { isNeighbour: false },\n customEdgeState: {},\n customGraphState: { isDense: graph.order > DENSE_NODES, isZoomedIn: false },\n settings: {\n // Every render starts with a resize, which would throw while the\n // app is hidden but kept mounted; a hidden canvas renders at 1 px\n // instead and the size observer restores it when it shows again.\n allowInvalidContainer: true,\n itemSizesReference: 'screen',\n enableNodeDrag: true,\n renderEdgeLabels: false,\n labelRenderedSizeThreshold: 7,\n labelDensity: 0.1,\n labelGridCellSize: 80,\n },\n styles: {\n nodes: [\n {\n ...DEFAULT_STYLES.nodes,\n size: {\n whenState: 'isHighlighted',\n then: (attributes: NodeAttributes) => attributes.size + 5,\n else: {\n whenState: 'isHovered',\n then: (attributes: NodeAttributes) => attributes.size + 2,\n else: { attribute: 'size' },\n },\n },\n cursor: 'pointer',\n labelColor: isDark ? '#e4e4e7' : '#18181b',\n labelSize: 12,\n labelFont: 'ui-sans-serif, system-ui, sans-serif',\n // Dense graphs label only the pointer's surroundings and the\n // selection until zoomed in. Neighbours always go through the\n // label grid: a hub's many neighbours would otherwise pile up.\n labelVisibility: (_attributes, state, graphState) => {\n if (state.isHovered || state.isHighlighted) {\n return 'visible';\n }\n\n return graphState.isDense && !graphState.isZoomedIn && !state.isNeighbour ? 'hidden' : 'auto';\n },\n backdropColor: isDark ? '#27272a' : '#ffffff',\n backdropShadowColor: isDark ? 'rgba(0, 0, 0, 0.6)' : 'rgba(0, 0, 0, 0.25)',\n },\n ],\n edges: [\n {\n ...DEFAULT_STYLES.edges,\n color: isDark ? '#3f3f46' : '#d4d4d8',\n size: 1,\n },\n ],\n },\n }\n );\n rendererRef.current = renderer;\n\n renderer.on('clickNode', ({ node }) => {\n callbacksRef.current.onSelect(node);\n });\n renderer.on('clickStage', () => {\n callbacksRef.current.onSelect(null);\n });\n renderer.on('doubleClickNode', ({ node, event }) => {\n event.preventSigmaDefault();\n callbacksRef.current.onExpand(node);\n });\n renderer.on('rightClickNode', ({ node, event }) => {\n event.preventSigmaDefault();\n const original = event.original as MouseEvent;\n original.preventDefault();\n callbacksRef.current.onSelect(node);\n callbacksRef.current.onContextMenu(node, { x: original.clientX, y: original.clientY });\n });\n renderer.on('enterNode', ({ node }) => applyHover(node));\n renderer.on('leaveNode', () => applyHover(null));\n // Dragging a node pulls its neighbours along: the layout runs while the\n // drag lasts with the node held under the pointer, so a cluster can be\n // pulled apart. Everything else is held, so the rest of the canvas\n // stays still, and a canvas without relationships has nothing to pull on.\n const holdAllBut = (node: string): string[] => {\n const free = new Set([node, ...graph.neighbors(node)]);\n\n return graph.nodes().filter((key) => key === node || !free.has(key));\n };\n renderer.on('nodeDragStart', ({ node }) => {\n dragRef.current = { node, x: graph.getNodeAttribute(node, 'x'), y: graph.getNodeAttribute(node, 'y') };\n\n if (graph.size > 0) {\n startLayout(layoutBudget(graph.order), holdAllBut(node));\n dragLayoutRef.current = layoutRef.current;\n } else {\n stopLayout();\n graph.setNodeAttribute(node, 'fixed', true);\n }\n });\n renderer.on('nodeDrag', ({ node }) => {\n if (dragRef.current?.node === node) {\n dragRef.current.x = graph.getNodeAttribute(node, 'x');\n dragRef.current.y = graph.getNodeAttribute(node, 'y');\n }\n });\n renderer.on('nodeDragEnd', ({ node }) => {\n // A scene change during the drag replaced its layout with one settling\n // newcomers; that one keeps running, with the drop pinned by the scene.\n const wasRunning =\n dragRef.current !== null && layoutRef.current !== null && layoutRef.current === dragLayoutRef.current;\n dragRef.current = null;\n dragLayoutRef.current = null;\n callbacksRef.current.onPin(node);\n\n // The node stays where it was dropped while its neighbours settle around it.\n if (wasRunning) {\n startLayout(layoutBudget(graph.order), holdAllBut(node));\n }\n });\n\n const camera = renderer.getCamera();\n const handleCameraUpdate = ({ ratio }: { ratio: number }): void => {\n const isZoomedIn = ratio < ZOOMED_IN_RATIO;\n\n if (renderer.getGraphState().isZoomedIn !== isZoomedIn) {\n renderer.setGraphState({ isZoomedIn });\n }\n };\n camera.on('updated', handleCameraUpdate);\n\n const preventContextMenu = (event: MouseEvent): void => event.preventDefault();\n container.addEventListener('contextmenu', preventContextMenu);\n\n // Sigma only watches the window: the canvases must follow the container\n // when a pane opens beside it, or they keep their size and overflow it.\n const sizeObserver = new ResizeObserver(() => {\n if (container.clientWidth > 0 && container.clientHeight > 0) {\n renderer.resize();\n renderer.scheduleRefresh();\n }\n });\n sizeObserver.observe(container);\n\n apiRef.current = {\n fit: () => {\n void camera.reset({ duration: 300 });\n },\n };\n\n return () => {\n sizeObserver.disconnect();\n camera.off('updated', handleCameraUpdate);\n container.removeEventListener('contextmenu', preventContextMenu);\n apiRef.current = null;\n rendererRef.current = null;\n hoverRef.current = { key: null, nodes: [] };\n renderer.kill();\n };\n }, [theme, mountAttempt, apiRef, startLayout, stopLayout, applyHover]);\n\n // Scene changes: sync the graph, then let the layout settle the new nodes.\n useEffect(() => {\n const graph = graphRef.current;\n\n if (!graph) {\n return;\n }\n\n // The layout's supervisor respawns its worker on every graph change, on\n // a timer that outlives `kill()`: stop it before the graph is touched.\n stopLayout();\n const { changed, added, hadNodes } = syncGraph(graph, scene, colors);\n\n if (!changed) {\n return;\n }\n\n rendererRef.current?.setGraphState({ isDense: graph.order > DENSE_NODES });\n // Nodes added under the pointer get their hover marks; marks of dropped nodes go.\n applyHover(graph.hasNode(hoverRef.current.key ?? '') ? hoverRef.current.key : null);\n\n // Nothing to pull on: a bare sample stays on its ring.\n if (graph.size === 0) {\n stopLayout();\n\n return;\n }\n\n // Adding to a placed canvas: hold what is there, settle the newcomers.\n const hold = hadNodes && added.size > 0 ? graph.nodes().filter((key) => !added.has(key)) : [];\n startLayout(layoutBudget(hold.length > 0 ? added.size : graph.order), hold);\n // Nodes and edges only change with the scene version; colours are applied by their own effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- see above\n }, [scene.version]);\n\n // Theme change: recolour the nodes.\n useEffect(() => {\n const graph = graphRef.current;\n\n if (!graph) {\n return;\n }\n\n graph.forEachNode((key, attributes) => {\n graph.setNodeAttribute(key, 'color', colors[attributes.entity] ?? '#71717a');\n });\n }, [colors]);\n\n // Selection, switched-off entities and pins.\n useEffect(() => {\n const graph = graphRef.current;\n const renderer = rendererRef.current;\n\n if (!graph || !renderer) {\n return;\n }\n\n const hidden = new Set(scene.hiddenEntities);\n let pinsChanged = false;\n graph.forEachNode((key, attributes) => {\n renderer.setNodeState(key, { isHidden: hidden.has(attributes.entity), isHighlighted: key === scene.selected });\n const fixed = scene.pinned[key] === true || heldRef.current.has(key);\n\n if ((attributes.fixed ?? false) !== fixed) {\n graph.setNodeAttribute(key, 'fixed', fixed);\n pinsChanged = true;\n }\n });\n\n // A pin change during a run restarts it with the same hold, so the\n // nodes kept still for it stay still.\n if (pinsChanged && layoutDeadlineRef.current !== null) {\n startLayout(Math.max(500, layoutDeadlineRef.current - performance.now()), [...heldRef.current]);\n }\n graph.forEachEdge((key, _attributes, source, target) => {\n renderer.setEdgeState(key, {\n isHidden:\n hidden.has(graph.getNodeAttribute(source, 'entity')) || hidden.has(graph.getNodeAttribute(target, 'entity')),\n });\n });\n }, [scene.hiddenEntities, scene.selected, scene.pinned, scene.version, mountAttempt, theme, startLayout]);\n\n // Unmount: stop the worker.\n useEffect(() => stopLayout, [stopLayout]);\n\n return <div className=\"fk:h-full fk:w-full fk:min-h-0\" ref={containerRef} />;\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport type { Attribute } from '../../core/types';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '../../ui';\n\nexport interface GraphContextMenuState {\n key: string;\n x: number;\n y: number;\n}\n\nexport interface GraphContextMenuProps {\n menu: GraphContextMenuState | null;\n relationships: Attribute[];\n isPinned: boolean;\n onClose: () => void;\n onExpandAll: (key: string) => void;\n onExpandAttribute: (key: string, attribute: Attribute) => void;\n onHide: (key: string) => void;\n onHideOthers: (key: string) => void;\n onTogglePin: (key: string) => void;\n onOpenRecord: (key: string) => void;\n}\n\n/** The right-click menu of a node, anchored at the pointer. */\nexport function GraphContextMenu({\n menu,\n relationships,\n isPinned,\n onClose,\n onExpandAll,\n onExpandAttribute,\n onHide,\n onHideOthers,\n onTogglePin,\n onOpenRecord,\n}: GraphContextMenuProps): JSX.Element {\n const key = menu?.key ?? '';\n\n return (\n <DropdownMenu\n onOpenChange={(open) => {\n if (!open) {\n onClose();\n }\n }}\n open={menu !== null}\n >\n <DropdownMenuTrigger asChild>\n <span\n aria-hidden=\"true\"\n className=\"fk:fixed fk:size-0\"\n style={{ left: menu?.x ?? 0, top: menu?.y ?? 0 }}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-52\" data-testid=\"graph-context-menu\" side=\"bottom\">\n <DropdownMenuItem onSelect={() => onExpandAll(key)}>Expand all</DropdownMenuItem>\n {relationships.length > 0 ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>Expand</DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"fk:max-h-80 fk:overflow-y-auto\">\n {relationships.map((attribute) => (\n <DropdownMenuItem key={attribute.name} onSelect={() => onExpandAttribute(key, attribute)}>\n {attribute.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={() => onHide(key)}>Hide</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onHideOthers(key)}>Hide others</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onTogglePin(key)}>{isPinned ? 'Unpin position' : 'Pin position'}</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={() => onOpenRecord(key)}>Open record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import { MAX_NODES, type GraphCounts, type GraphData, type GraphEdge, type GraphNode } from './graph';\n\n/**\n * The scene is what the canvas draws: the nodes and edges loaded so far,\n * which entities are switched off, which nodes are pinned, the selection.\n * A pure reducer so every rule is unit-tested; the canvas syncs to it.\n */\n\nexport interface SceneState {\n nodes: { [key: string]: GraphNode };\n edges: { [key: string]: GraphEdge };\n /** Total related records per relationship of a node, when the API told us. */\n counts: GraphCounts;\n /** Related records fetched so far per relationship of a node: the next page's offset. */\n fetched: GraphCounts;\n hiddenEntities: string[];\n pinned: { [key: string]: true };\n selected: string | null;\n /** A message for the status line, such as the node cap being reached. */\n notice: string | null;\n /** Bumped whenever nodes or edges change, so the canvas knows to sync. */\n version: number;\n}\n\nexport type SceneAction =\n | { type: 'merge'; data: GraphData; fetched?: GraphCounts }\n | { type: 'remove'; keys: string[] }\n | { type: 'keepOnly'; keys: string[] }\n | { type: 'clear' }\n | { type: 'toggleEntity'; entity: string }\n | { type: 'select'; key: string | null }\n | { type: 'togglePin'; key: string }\n | { type: 'notice'; message: string | null };\n\nexport const EMPTY_SCENE: SceneState = {\n nodes: {},\n edges: {},\n counts: {},\n fetched: {},\n hiddenEntities: [],\n pinned: {},\n selected: null,\n notice: null,\n version: 0,\n};\n\nfunction mergeCounts(current: GraphCounts, incoming: GraphCounts | undefined): GraphCounts {\n if (!incoming) {\n return current;\n }\n\n const next = { ...current };\n Object.entries(incoming).forEach(([key, perAttribute]) => {\n next[key] = { ...next[key], ...perAttribute };\n });\n\n return next;\n}\n\n/** Fetched offsets only move forward: a fresh first page never rewinds paging. */\nfunction mergeFetched(current: GraphCounts, incoming: GraphCounts | undefined): GraphCounts {\n if (!incoming) {\n return current;\n }\n\n const next = { ...current };\n Object.entries(incoming).forEach(([key, perAttribute]) => {\n const merged = { ...next[key] };\n Object.entries(perAttribute).forEach(([attribute, offset]) => {\n merged[attribute] = Math.max(merged[attribute] ?? 0, offset);\n });\n next[key] = merged;\n });\n\n return next;\n}\n\nfunction withoutNodes(state: SceneState, dropped: Set<string>): SceneState {\n const nodes = Object.fromEntries(Object.entries(state.nodes).filter(([key]) => !dropped.has(key)));\n const edges = Object.fromEntries(\n Object.entries(state.edges).filter(([, edge]) => !dropped.has(edge.source) && !dropped.has(edge.target))\n );\n const pinned = Object.fromEntries(Object.entries(state.pinned).filter(([key]) => !dropped.has(key)));\n\n return {\n ...state,\n nodes,\n edges,\n pinned,\n selected: state.selected && dropped.has(state.selected) ? null : state.selected,\n version: state.version + 1,\n };\n}\n\nexport function sceneReducer(state: SceneState, action: SceneAction): SceneState {\n switch (action.type) {\n case 'merge': {\n const nodes = { ...state.nodes };\n let count = Object.keys(nodes).length;\n let dropped = 0;\n\n action.data.nodes.forEach((node) => {\n const existing = nodes[node.key];\n\n if (existing) {\n // A node first drawn with only its id takes the caption a later load brings.\n if (existing.label === existing.id && node.label !== node.id) {\n nodes[node.key] = { ...existing, label: node.label };\n }\n\n return;\n }\n\n if (count >= MAX_NODES) {\n dropped += 1;\n\n return;\n }\n\n nodes[node.key] = node;\n count += 1;\n });\n\n const edges = { ...state.edges };\n action.data.edges.forEach((edge) => {\n if (nodes[edge.source] && nodes[edge.target]) {\n edges[edge.key] = edge;\n }\n });\n\n return {\n ...state,\n nodes,\n edges,\n counts: mergeCounts(state.counts, action.data.counts),\n fetched: mergeFetched(state.fetched, action.fetched),\n notice:\n dropped > 0\n ? `The canvas holds ${MAX_NODES.toLocaleString()} nodes at most; ${dropped.toLocaleString()} were left out. Hide some nodes to make room.`\n : state.notice,\n version: state.version + 1,\n };\n }\n case 'remove':\n return withoutNodes(state, new Set(action.keys));\n case 'keepOnly': {\n const kept = new Set(action.keys);\n\n return withoutNodes(state, new Set(Object.keys(state.nodes).filter((key) => !kept.has(key))));\n }\n case 'clear':\n return { ...EMPTY_SCENE, hiddenEntities: state.hiddenEntities, version: state.version + 1 };\n case 'toggleEntity':\n return {\n ...state,\n hiddenEntities: state.hiddenEntities.includes(action.entity)\n ? state.hiddenEntities.filter((entity) => entity !== action.entity)\n : [...state.hiddenEntities, action.entity],\n };\n case 'select':\n return state.selected === action.key ? state : { ...state, selected: action.key };\n case 'togglePin': {\n const pinned = { ...state.pinned };\n\n if (pinned[action.key]) {\n delete pinned[action.key];\n } else {\n pinned[action.key] = true;\n }\n\n return { ...state, pinned };\n }\n case 'notice':\n return { ...state, notice: action.message };\n default:\n return state;\n }\n}\n\n/** Nodes on the canvas per entity, for the legend. */\nexport function countNodesByEntity(state: SceneState): { [entity: string]: number } {\n return Object.values(state.nodes).reduce<{ [entity: string]: number }>((result, node) => {\n result[node.entity] = (result[node.entity] ?? 0) + 1;\n\n return result;\n }, {});\n}\n\n/** Related nodes of one node per relationship attribute that are on the canvas. */\nexport function countEdgesByAttribute(state: SceneState, key: string): { [attribute: string]: number } {\n return Object.values(state.edges).reduce<{ [attribute: string]: number }>((result, edge) => {\n if (edge.source === key) {\n result[edge.sourceAttribute] = (result[edge.sourceAttribute] ?? 0) + 1;\n } else if (edge.target === key) {\n result[edge.targetAttribute] = (result[edge.targetAttribute] ?? 0) + 1;\n }\n\n return result;\n }, {});\n}\n\n/** Keys of the nodes joined to one node by an edge. */\nexport function neighbourKeys(state: SceneState, key: string): string[] {\n return Object.values(state.edges).flatMap((edge) => {\n if (edge.source === key) {\n return [edge.target];\n }\n\n if (edge.target === key) {\n return [edge.source];\n }\n\n return [];\n });\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { formatDistance } from 'date-fns';\nimport { EyeOffIcon, ExpandIcon, LoaderCircleIcon, SquareArrowOutUpRightIcon, XIcon } from 'lucide-react';\nimport type { Attribute, Entity } from '../../core/types';\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\nimport {\n buildCountsQuery,\n buildDetailsQuery,\n formatDetailValue,\n getDetailAttributes,\n getEntity,\n getEntityLabel,\n getRelationshipAttributes,\n type GraphNode,\n type GraphRecord,\n} from './graph';\nimport { countEdgesByAttribute, type SceneState } from './scene';\n\nexport interface GraphInspectorProps {\n node: GraphNode;\n schema: Entity[];\n scope: string;\n scene: SceneState;\n colors: { [entity: string]: string };\n isLoading: boolean;\n onClose: () => void;\n onOpenRecord: (key: string) => void;\n onExpandAll: (key: string) => void;\n onExpandAttribute: (key: string, attribute: Attribute) => void;\n onHide: (key: string) => void;\n}\n\ntype ConnectionCount = { aggregate?: { count?: { nodes?: number } } };\n\n/**\n * Black or white, whichever reads better on a palette color (`#rrggbb`): the\n * yellows and greens are too light for white text.\n */\nfunction getTextColorOn(hex: string): string {\n const [r, g, b] = [1, 3, 5].map((offset) => {\n const channel = parseInt(hex.slice(offset, offset + 2), 16) / 255;\n\n return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n });\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n return luminance > 0.3 ? '#0a0a0a' : '#ffffff';\n}\ntype DetailsResult = { [plural: string]: (GraphRecord & { _updatedAt?: string })[] };\n\n/**\n * The selected node: its scalar attributes in the current scope and each\n * relationship with how many related records are on the canvas out of the\n * total, with a button to fetch the next page.\n */\nexport function GraphInspector({\n node,\n schema,\n scope,\n scene,\n colors,\n isLoading,\n onClose,\n onOpenRecord,\n onExpandAll,\n onExpandAttribute,\n onHide,\n}: GraphInspectorProps): JSX.Element {\n const entity = getEntity(schema, node.entity);\n const detailsDocument = useMemo(\n () => gql(entity ? buildDetailsQuery({ entity, scope }) : 'query GraphDetails { __typename }'),\n [entity, scope]\n );\n const countsDocument = useMemo(\n () => gql(entity ? buildCountsQuery({ entity }) : 'query GraphCounts { __typename }'),\n [entity]\n );\n const details = useQuery<DetailsResult>(detailsDocument, { variables: { id: node.id }, skip: !entity });\n const counts = useQuery<{ [plural: string]: { [field: string]: ConnectionCount }[] }>(countsDocument, {\n variables: { id: node.id },\n skip: !entity,\n });\n const record = entity ? details.data?.[entity.plural]?.[0] : undefined;\n const countRecord = entity ? counts.data?.[entity.plural]?.[0] : undefined;\n const onCanvas = useMemo(() => countEdgesByAttribute(scene, node.key), [scene, node.key]);\n const relationships = entity ? getRelationshipAttributes(entity) : [];\n const attributes = entity ? getDetailAttributes(entity) : [];\n const updatedAt = record?._updatedAt ? new Date(record._updatedAt) : null;\n const color = colors[node.entity] ?? '#71717a';\n\n return (\n <aside\n aria-label=\"Selected record\"\n className=\"fk:flex fk:w-72 fk:shrink-0 fk:flex-col fk:gap-5 fk:overflow-y-auto fk:border-l fk:bg-background fk:p-4 fk:text-sm\"\n data-testid=\"graph-inspector\"\n >\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-2\">\n <span\n className=\"fk:inline-flex fk:items-center fk:rounded-full fk:px-2 fk:py-0.5 fk:text-xs fk:font-medium\"\n style={{ backgroundColor: color, color: getTextColorOn(color) }}\n >\n {entity ? getEntityLabel(entity) : node.entity}\n </span>\n <Button aria-label=\"Close\" className=\"fk:size-7\" onClick={onClose} size=\"icon\" variant=\"ghost\">\n <XIcon className=\"fk:size-4\" />\n </Button>\n </div>\n <h2 className=\"fk:text-base fk:font-semibold fk:leading-snug fk:break-words\">{node.label}</h2>\n <div className=\"fk:flex fk:gap-1.5\">\n <Button onClick={() => onOpenRecord(node.key)} size=\"xs\">\n <SquareArrowOutUpRightIcon />\n Open record\n </Button>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label=\"Expand every relationship\"\n disabled={isLoading}\n onClick={() => onExpandAll(node.key)}\n size=\"xs\"\n variant=\"outline\"\n >\n {isLoading ? <LoaderCircleIcon className=\"fk:animate-spin\" /> : <ExpandIcon />}\n Expand\n </Button>\n </TooltipTrigger>\n <TooltipContent>Load the first related records of every relationship</TooltipContent>\n </Tooltip>\n <Button aria-label=\"Hide this node\" onClick={() => onHide(node.key)} size=\"xs\" variant=\"outline\">\n <EyeOffIcon />\n Hide\n </Button>\n </div>\n </div>\n\n <section className=\"fk:flex fk:flex-col fk:gap-2\">\n <h3 className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">Attributes</h3>\n {details.loading && !record ? (\n <span className=\"fk:text-muted-foreground\">Loading…</span>\n ) : (\n <dl className=\"fk:grid fk:grid-cols-[minmax(0,2fr)_minmax(0,3fr)] fk:gap-x-3 fk:gap-y-1.5\">\n {attributes.map((attribute) => (\n <div className=\"fk:contents\" key={attribute.name}>\n <dt className=\"fk:truncate fk:text-muted-foreground\" title={attribute.label}>\n {attribute.label}\n </dt>\n <dd className=\"fk:min-w-0 fk:break-words\">{record ? formatDetailValue(record[attribute.name], scope) || '—' : '—'}</dd>\n </div>\n ))}\n {updatedAt ? (\n <div className=\"fk:contents\">\n <dt className=\"fk:text-muted-foreground\">Updated</dt>\n <dd>{formatDistance(updatedAt, new Date(), { addSuffix: true })}</dd>\n </div>\n ) : null}\n </dl>\n )}\n </section>\n\n {relationships.length > 0 ? (\n <section className=\"fk:flex fk:flex-col fk:gap-1\">\n <h3 className=\"fk:mb-1 fk:text-xs fk:font-medium fk:text-muted-foreground\">Relationships</h3>\n {relationships.map((attribute) => {\n const relatedEntity = getEntity(schema, attribute.relationship?.entity ?? '');\n const total = countRecord?.[`${attribute.name}Connection`]?.aggregate?.count?.nodes;\n const shown = onCanvas[attribute.name] ?? 0;\n const fetched = scene.fetched[node.key]?.[attribute.name] ?? 0;\n const exhausted = typeof total === 'number' && fetched >= total;\n\n return (\n <div className=\"fk:flex fk:h-8 fk:items-center fk:gap-2\" key={attribute.name}>\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[attribute.relationship?.entity ?? ''] ?? '#71717a' }}\n />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate\" title={relatedEntity ? getEntityLabel(relatedEntity) : undefined}>\n {attribute.label}\n </span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {typeof total === 'number' ? `${shown} of ${total.toLocaleString()}` : shown}\n </span>\n {total === 0 || exhausted ? null : (\n <Button\n className=\"fk:h-6 fk:px-2 fk:text-xs\"\n disabled={isLoading}\n onClick={() => onExpandAttribute(node.key, attribute)}\n size=\"xs\"\n variant=\"outline\"\n >\n {fetched > 0 ? 'More' : 'Expand'}\n </Button>\n )}\n </div>\n );\n })}\n </section>\n ) : null}\n </aside>\n );\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { JSX } from 'react';\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { bracketMatching, foldGutter, foldKeymap, indentOnInput } from '@codemirror/language';\nimport { Compartment, EditorState, Prec } from '@codemirror/state';\nimport {\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n highlightSpecialChars,\n keymap,\n lineNumbers,\n placeholder as placeholderExtension,\n} from '@codemirror/view';\nimport { graphql, updateSchema } from 'cm6-graphql';\nimport type { GraphQLSchema } from 'graphql';\nimport { darkTheme, lightTheme } from '../ai/markdown-editor-themes';\n\nexport interface QueryEditorProps {\n ariaLabel: string;\n /** The project's schema, for completion and validation; null until introspected. */\n schema: GraphQLSchema | null;\n theme: 'light' | 'dark';\n value: string;\n onChange: (value: string) => void;\n /** Mod+Enter. */\n onRun: () => void;\n}\n\nconst editorChrome = EditorView.theme({\n '&': { fontSize: '13px', height: '100%', minHeight: '0' },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': { height: '100%', lineHeight: '1.6', minHeight: '0', overflow: 'auto' },\n '.cm-content': { fontSize: '13px', padding: '12px 0' },\n '.cm-gutters': { borderRight: '1px solid transparent' },\n});\n\n/** A GraphQL editor: syntax, completion and linting against the project schema. */\nexport function QueryEditor({ ariaLabel, schema, theme, value, onChange, onRun }: QueryEditorProps): JSX.Element {\n const parentRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const themeCompartmentRef = useRef(new Compartment());\n const onChangeRef = useRef(onChange);\n const onRunRef = useRef(onRun);\n const valueRef = useRef(value);\n onChangeRef.current = onChange;\n onRunRef.current = onRun;\n valueRef.current = value;\n\n useEffect(() => {\n const parent = parentRef.current;\n\n if (!parent) {\n return undefined;\n }\n\n const view = new EditorView({\n parent,\n state: EditorState.create({\n doc: valueRef.current,\n extensions: [\n lineNumbers(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n foldGutter(),\n drawSelection(),\n dropCursor(),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n highlightActiveLine(),\n Prec.highest(\n keymap.of([\n {\n key: 'Mod-Enter',\n run: () => {\n onRunRef.current();\n\n return true;\n },\n },\n ])\n ),\n keymap.of([...closeBracketsKeymap, ...defaultKeymap, ...historyKeymap, ...foldKeymap, indentWithTab]),\n graphql(undefined, { showErrorOnInvalidSchema: false }),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n }),\n EditorView.contentAttributes.of({ 'aria-label': ariaLabel, 'aria-multiline': 'true', role: 'textbox' }),\n placeholderExtension('query {\\n …\\n}'),\n themeCompartmentRef.current.of([theme === 'dark' ? darkTheme : lightTheme, editorChrome]),\n ],\n }),\n });\n viewRef.current = view;\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // Mounted once; the theme, schema and value are applied below.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- see above\n }, []);\n\n useEffect(() => {\n viewRef.current?.dispatch({\n effects: themeCompartmentRef.current.reconfigure([theme === 'dark' ? darkTheme : lightTheme, editorChrome]),\n });\n }, [theme]);\n\n useEffect(() => {\n if (viewRef.current) {\n updateSchema(viewRef.current, schema ?? undefined);\n }\n }, [schema]);\n\n // A value set from outside (an example, the remembered query) replaces the document.\n useEffect(() => {\n const view = viewRef.current;\n\n if (!view || view.state.doc.toString() === value) {\n return;\n }\n\n view.dispatch({ changes: { from: 0, to: view.state.doc.length, insert: value } });\n }, [value]);\n\n return <div className=\"fk:h-full fk:min-h-0 fk:w-full\" data-testid=\"graph-query-editor\" ref={parentRef} />;\n}\n","import type { Attribute, Entity } from '../../core/types';\nimport {\n captionOf,\n edgeOf,\n formatDetailValue,\n getDisplaySelection,\n getEntity,\n getEntityLabel,\n getGraphEntities,\n getRelationshipAttributes,\n nodeKey,\n type GraphData,\n type GraphEdge,\n type GraphNode,\n type GraphRecord,\n} from './graph';\n\n/**\n * Pure helpers of the Query view: turning the result of any GraphQL query\n * into nodes and edges, example queries per entity, and the table view.\n */\n\n/** Rows the table view shows at most. */\nexport const TABLE_ROW_LIMIT = 200;\n/** Related records an example query selects per relationship. */\nconst EXAMPLE_RELATED_LIMIT = 5;\n/** Relationships an example query includes. */\nconst EXAMPLE_RELATIONSHIPS = 3;\nexport type QueryResult = { [field: string]: unknown };\n\n/** What a run of a query produced, for the pane's footer. */\nexport interface QueryRun {\n data: QueryResult | null;\n error: string | null;\n elapsedMs: number;\n /** Nodes and edges the result maps to; the canvas may hold fewer once at its cap. */\n nodes: number;\n edges: number;\n}\n\nexport interface ExampleQuery {\n /** Entity name, unique across the schema. */\n entity: string;\n title: string;\n query: string;\n}\n\nexport interface QueryTable {\n columns: string[];\n rows: { [column: string]: string }[];\n /** Root records in the result, which may exceed the rows shown. */\n total: number;\n}\n\nfunction isRecord(value: unknown): value is GraphRecord {\n return typeof value === 'object' && value !== null && typeof (value as GraphRecord)._id === 'string';\n}\n\n/**\n * The records under a result field: a list, a single object, or a\n * connection (`{ edges: [{ node }] }`).\n */\nexport function collectRecords(value: unknown): GraphRecord[] {\n if (Array.isArray(value)) {\n return value.flatMap(collectRecords);\n }\n\n if (typeof value !== 'object' || value === null) {\n return [];\n }\n\n if (isRecord(value)) {\n return [value];\n }\n\n const { edges } = value as { edges?: unknown };\n\n if (Array.isArray(edges)) {\n return edges.flatMap((edge) => collectRecords((edge as { node?: unknown })?.node));\n }\n\n return [];\n}\n\n/** Entity of a root field: its plural, or its plural with a `Connection` suffix. */\nexport function entityOfRootField(field: string, schema: Entity[]): Entity | undefined {\n const plural = field.endsWith('Connection') ? field.slice(0, -'Connection'.length) : field;\n\n return schema.find((entity) => entity.plural === plural);\n}\n\n/** The relationship attribute a result key selects, with or without the `Connection` suffix. */\nfunction relationshipOfKey(key: string, entity: Entity): Attribute | undefined {\n const name = key.endsWith('Connection') ? key.slice(0, -'Connection'.length) : key;\n\n return getRelationshipAttributes(entity).find((attribute) => attribute.name === name);\n}\n\n/** The one relationship of an entity that leads to another, if exactly one does. */\nfunction relationshipTo(entity: Entity, target: string): Attribute | undefined {\n const attributes = getRelationshipAttributes(entity).filter((attribute) => attribute.relationship?.entity === target);\n\n return attributes.length === 1 ? attributes[0] : undefined;\n}\n\n/** The entity of a record: its `__typename` when the API sent one, else the field it came under, if that names one. */\nexport function entityOfRecord(\n record: GraphRecord,\n fallback: Entity | undefined,\n schema: Entity[]\n): Entity | undefined {\n const typename = record.__typename;\n\n return (typeof typename === 'string' && getEntity(schema, typename)) || fallback;\n}\n\n/**\n * A caption for a record from whatever the query selected: the display\n * attribute when present, else the first string the record carries that is\n * not a system field (`_id`, `_createdAt`, `__typename` and the like).\n */\nexport function captionFromRecord(record: GraphRecord, entity: Entity | undefined, scope: string): string {\n const caption = captionOf(record, entity, scope);\n\n if (caption !== record._id) {\n return caption;\n }\n\n const text = Object.entries(record).find(\n ([key, value]) => !key.startsWith('_') && typeof value === 'string' && value.trim().length > 0\n );\n\n return text ? (text[1] as string) : record._id;\n}\n\n/**\n * Nodes and edges from a query result: every object with an `_id` whose\n * `__typename` names an entity becomes a node, as does one under a root\n * field named after an entity's plural when the typename is missing; every\n * relationship field selected on it, aliased or not, is an edge to the\n * related nodes. A\n * record seen again with a better caption is re-captioned. Fields the schema\n * does not know are ignored.\n */\nexport function graphFromQueryResult({\n data,\n schema,\n scope,\n}: {\n data: QueryResult | null | undefined;\n schema: Entity[];\n scope: string;\n}): GraphData {\n const nodes = new Map<string, GraphNode>();\n const edges = new Map<string, GraphEdge>();\n\n const addRecord = (record: GraphRecord, fallback: Entity | undefined): GraphNode | null => {\n const entity = entityOfRecord(record, fallback, schema);\n\n if (!entity) {\n return null;\n }\n\n const key = nodeKey(entity.name, record._id);\n const label = captionFromRecord(record, entity, scope);\n const existing = nodes.get(key);\n const node: GraphNode = existing ?? { key, entity: entity.name, id: record._id, label };\n\n if (!existing) {\n nodes.set(key, node);\n } else if (existing.label === existing.id && label !== record._id) {\n existing.label = label;\n }\n\n Object.entries(record).forEach(([field, value]) => {\n const keyAttribute = relationshipOfKey(field, entity);\n const keyEntity = keyAttribute ? getEntity(schema, keyAttribute.relationship?.entity ?? '') : undefined;\n\n collectRecords(value).forEach((relatedRecord) => {\n // An aliased relationship (`maker: brand { … }`) is not named by its\n // key: the record's typename finds the entity, and the attribute when\n // only one relationship leads there.\n const target = addRecord(relatedRecord, keyEntity);\n const attribute = keyAttribute ?? (target ? relationshipTo(entity, target.entity) : undefined);\n\n if (target && attribute && target.key !== node.key) {\n const edge = edgeOf(node, target, attribute);\n\n if (!edges.has(edge.key)) {\n edges.set(edge.key, edge);\n }\n }\n });\n });\n\n return node;\n };\n\n Object.entries(data ?? {}).forEach(([field, value]) => {\n const fallback = entityOfRootField(field, schema);\n collectRecords(value).forEach((record) => addRecord(record, fallback));\n });\n\n return { nodes: [...nodes.values()], edges: [...edges.values()], counts: {} };\n}\n\n/** One example query per entity with relationships, with a few related records each. */\nexport function exampleQueries(schema: Entity[], scope: string): ExampleQuery[] {\n return getGraphEntities(schema).map((entity) => {\n const relationships = getRelationshipAttributes(entity)\n .slice(0, EXAMPLE_RELATIONSHIPS)\n .map((attribute) => {\n const related = getEntity(schema, attribute.relationship?.entity ?? '');\n\n return ` ${attribute.name}(limit: ${EXAMPLE_RELATED_LIMIT}) {\\n _id\\n ${getDisplaySelection(related, scope)}\\n }`;\n });\n const display = getDisplaySelection(entity, scope);\n\n return {\n entity: entity.name,\n title: getEntityLabel(entity),\n query: `query {\\n ${entity.plural}(limit: 25) {\\n _id\\n${display ? ` ${display}\\n` : ''}${relationships.join('\\n')}\\n }\\n}`,\n };\n });\n}\n\n/** A table cell: related records as a count, scoped values through the inspector's formatter. */\nfunction formatCell(value: unknown, scope: string): string {\n const records = collectRecords(value);\n\n if (records.length > 0) {\n return `${records.length} ${records.length === 1 ? 'record' : 'records'}`;\n }\n\n if (Array.isArray(value) && !(typeof value[0] === 'object' && value[0] !== null)) {\n return value.map((item) => formatDetailValue(item, scope)).join(', ');\n }\n\n return formatDetailValue(value, scope);\n}\n\n/**\n * The objects under a root field, with or without an `_id`: a list, a single\n * object, or the nodes of a connection's edges.\n */\nfunction collectRows(value: unknown): GraphRecord[] {\n if (Array.isArray(value)) {\n return value.flatMap(collectRows);\n }\n\n if (typeof value !== 'object' || value === null) {\n return [];\n }\n\n const { edges } = value as { edges?: unknown };\n\n if (!isRecord(value) && Array.isArray(edges)) {\n return edges.flatMap((edge) => collectRows((edge as { node?: unknown })?.node));\n }\n\n return [value as GraphRecord];\n}\n\n/** The root objects of a result as a table: one column per field the shown rows select. */\nexport function tableFromResult(data: QueryResult | null | undefined, scope: string): QueryTable {\n const records = Object.values(data ?? {}).flatMap(collectRows);\n const shown = records.slice(0, TABLE_ROW_LIMIT);\n const columns: string[] = [];\n shown.forEach((record) => {\n Object.keys(record).forEach((key) => {\n if (key !== '__typename' && !columns.includes(key)) {\n columns.push(key);\n }\n });\n });\n\n return {\n columns,\n rows: shown.map((record) =>\n Object.fromEntries(columns.map((column) => [column, formatCell(record[column], scope)]))\n ),\n total: records.length,\n };\n}\n\n/** The response without the `__typename` keys the client adds, for the JSON view. */\nexport function stripTypename(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stripTypename);\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value as { [key: string]: unknown })\n .filter(([key]) => key !== '__typename')\n .map(([key, item]) => [key, stripTypename(item)])\n );\n }\n\n return value;\n}\n\n/** Where the last query of a project is remembered. */\nexport function queryStorageKey(projectId: string): string {\n return `flexkit-graph:query:${projectId}`;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { buildClientSchema, getIntrospectionQuery } from 'graphql';\nimport type { GraphQLSchema, IntrospectionQuery } from 'graphql';\nimport { USER_QUERY_CONTEXT } from '../../graphql-client/graphql-context';\n\n/** One introspection per project, keyed by its deployed schema hash so a deployment while the Studio is open refreshes it. */\nconst schemaCache = new Map<string, { hash: string; schema: Promise<GraphQLSchema> }>();\n\nfunction introspect(client: ReturnType<typeof useApolloClient>, projectId: string, hash: string): Promise<GraphQLSchema> {\n const cached = schemaCache.get(projectId);\n\n if (cached && cached.hash === hash) {\n return cached.schema;\n }\n\n // Not cached by Apollo: the introspection tree is large and only this hook reads it.\n const schema = client\n .query<IntrospectionQuery>({\n query: gql(getIntrospectionQuery()),\n fetchPolicy: 'no-cache',\n context: USER_QUERY_CONTEXT,\n })\n .then((result) => {\n if (!result.data) {\n throw new Error('The schema could not be introspected.');\n }\n\n return buildClientSchema(result.data);\n });\n schema.catch(() => {\n if (schemaCache.get(projectId)?.schema === schema) {\n schemaCache.delete(projectId);\n }\n });\n schemaCache.set(projectId, { hash, schema });\n\n return schema;\n}\n\n/**\n * The project's GraphQL schema, for completion and validation in the editor;\n * null until loaded. Re-introspected when the deployed schema hash changes.\n */\nexport function useGraphQLSchema(\n projectId: string | undefined,\n schemaHash: string | null | undefined\n): GraphQLSchema | null {\n const client = useApolloClient();\n const [schema, setSchema] = useState<GraphQLSchema | null>(null);\n\n useEffect(() => {\n if (!projectId) {\n return undefined;\n }\n\n let cancelled = false;\n introspect(client, projectId, schemaHash ?? '')\n .then((loaded) => {\n if (!cancelled) {\n setSchema(loaded);\n }\n })\n .catch(() => {\n // The editor works without completion.\n });\n\n return () => {\n cancelled = true;\n };\n }, [client, projectId, schemaHash]);\n\n return schema;\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { JSX } from 'react';\nimport { ChevronDownIcon, LoaderCircleIcon, PlayIcon } from 'lucide-react';\nimport type { Entity } from '../../core/types';\nimport {\n Button,\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Label,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../../ui';\nimport { readComposerDraft, writeComposerDraft } from '../ai/agent/composer-draft';\nimport { QueryEditor } from './query-editor';\nimport {\n exampleQueries,\n queryStorageKey,\n stripTypename,\n tableFromResult,\n TABLE_ROW_LIMIT,\n type QueryRun,\n} from './query';\nimport { useGraphQLSchema } from './use-graphql-schema';\n\nexport interface QueryPaneProps {\n projectId: string;\n /** The deployed schema's hash; a change re-introspects the schema for the editor. */\n schemaHash: string | null;\n schema: Entity[];\n scope: string;\n theme: 'light' | 'dark';\n isRunning: boolean;\n /** Kept mounted while the Explore view shows, so the last run survives the switch. */\n hidden: boolean;\n onRun: (query: string, options: { append: boolean }) => Promise<QueryRun>;\n}\n\ntype ResultTab = 'graph' | 'table' | 'json';\n\n/**\n * The Query view: a GraphQL editor whose result is drawn on the canvas.\n * Every object with an id becomes a node, every nested selection a\n * relationship; the same result is also shown as a table and as JSON.\n */\nexport function QueryPane({\n projectId,\n schemaHash,\n schema,\n scope,\n theme,\n isRunning,\n hidden,\n onRun,\n}: QueryPaneProps): JSX.Element {\n // The schema is introspected once the view has been opened, not on every Graph visit.\n const [opened, setOpened] = useState(!hidden);\n const graphqlSchema = useGraphQLSchema(opened ? projectId : undefined, schemaHash);\n const examples = useMemo(() => exampleQueries(schema, scope), [schema, scope]);\n const [query, setQuery] = useState(() => readComposerDraft(queryStorageKey(projectId)) || examples[0]?.query || '');\n // The schema may arrive after the pane mounts: the first example fills an\n // editor that started empty, once, so clearing it later is left alone.\n const seededRef = useRef(query !== '');\n const [append, setAppend] = useState(false);\n const [tab, setTab] = useState<ResultTab>('graph');\n const [run, setRun] = useState<QueryRun | null>(null);\n // Built for the open tab only: a large result is not tabulated or pretty-printed unseen.\n const table = useMemo(\n () => (tab === 'table' && run?.data ? tableFromResult(run.data, scope) : null),\n [tab, run, scope]\n );\n const json = useMemo(\n () => (tab === 'json' && run?.data ? JSON.stringify(stripTypename(run.data), null, 2) : null),\n [tab, run]\n );\n\n useEffect(() => {\n if (!hidden) {\n setOpened(true);\n }\n }, [hidden]);\n\n useEffect(() => {\n const [first] = examples;\n\n if (!seededRef.current && first) {\n seededRef.current = true;\n setQuery((current) => current || first.query);\n }\n }, [examples]);\n\n useEffect(() => {\n writeComposerDraft(queryStorageKey(projectId), query);\n }, [projectId, query]);\n\n const execute = async (): Promise<void> => {\n if (!query.trim() || isRunning) {\n return;\n }\n\n setRun(await onRun(query, { append }));\n };\n\n return (\n <section\n aria-label=\"Query\"\n className={`fk:w-[26rem] fk:shrink-0 fk:flex-col fk:border-r fk:bg-background ${hidden ? 'fk:hidden' : 'fk:flex'}`}\n data-testid=\"graph-query-pane\"\n hidden={hidden}\n >\n <div className=\"fk:flex fk:h-12 fk:shrink-0 fk:items-center fk:gap-2 fk:border-b fk:pl-4 fk:pr-3\">\n <span className=\"fk:text-sm fk:font-semibold\">Query</span>\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-1.5\">\n {examples.length > 0 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8\" size=\"sm\" variant=\"outline\">\n Examples\n <ChevronDownIcon className=\"fk:size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:max-h-80 fk:overflow-y-auto\">\n {examples.map((example) => (\n <DropdownMenuItem key={example.entity} onSelect={() => setQuery(example.query)}>\n {example.title}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n <Button className=\"fk:h-8\" disabled={isRunning || !query.trim()} onClick={() => void execute()} size=\"sm\">\n {isRunning ? (\n <LoaderCircleIcon className=\"fk:size-3.5 fk:animate-spin\" />\n ) : (\n <PlayIcon className=\"fk:size-3.5\" />\n )}\n Run\n </Button>\n </div>\n </div>\n <div className=\"fk:min-h-0 fk:flex-1\">\n <QueryEditor\n ariaLabel=\"GraphQL query\"\n onChange={setQuery}\n onRun={() => void execute()}\n schema={graphqlSchema}\n theme={theme}\n value={query}\n />\n </div>\n <Tabs\n className=\"fk:flex fk:max-h-[45%] fk:shrink-0 fk:flex-col fk:gap-0 fk:border-t\"\n onValueChange={(value) => setTab(value as ResultTab)}\n value={tab}\n >\n <div className=\"fk:flex fk:h-11 fk:shrink-0 fk:items-center fk:gap-3 fk:px-3\">\n <TabsList>\n <TabsTrigger value=\"graph\">Graph</TabsTrigger>\n <TabsTrigger value=\"table\">Table</TabsTrigger>\n <TabsTrigger value=\"json\">JSON</TabsTrigger>\n </TabsList>\n <span className=\"fk:ml-auto fk:truncate fk:text-xs fk:text-muted-foreground\" data-testid=\"graph-query-stats\">\n {run && !run.error\n ? `${run.nodes.toLocaleString()} ${run.nodes === 1 ? 'node' : 'nodes'} · ${run.edges.toLocaleString()} ${run.edges === 1 ? 'relationship' : 'relationships'} · ${run.elapsedMs.toLocaleString()} ms`\n : null}\n </span>\n </div>\n {run?.error ? (\n <pre\n className=\"fk:m-3 fk:mt-0 fk:max-h-40 fk:shrink-0 fk:overflow-auto fk:whitespace-pre-wrap fk:rounded-md fk:border fk:border-destructive/40 fk:bg-destructive/5 fk:p-2 fk:text-xs fk:text-destructive\"\n data-testid=\"graph-query-error\"\n >\n {run.error}\n </pre>\n ) : null}\n <div className=\"fk:min-h-0 fk:overflow-auto\">\n <TabsContent\n className=\"fk:flex fk:flex-col fk:gap-3 fk:px-3 fk:pb-3 fk:text-xs fk:text-muted-foreground\"\n value=\"graph\"\n >\n <span>\n Every object with an <code className=\"fk:font-mono\">_id</code> under an entity field becomes a node; a\n nested relationship selection becomes a line between them.\n </span>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Checkbox\n checked={append}\n id=\"graph-query-append\"\n onCheckedChange={(checked) => setAppend(checked === true)}\n />\n <Label className=\"fk:text-xs fk:font-normal\" htmlFor=\"graph-query-append\">\n Add to the current canvas instead of replacing it\n </Label>\n </div>\n </TabsContent>\n <TabsContent className=\"fk:px-3 fk:pb-3\" value=\"table\">\n {table && table.columns.length > 0 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-1\">\n <div className=\"fk:overflow-x-auto fk:rounded-md fk:border\">\n <Table>\n <TableHeader>\n <TableRow>\n {table.columns.map((column) => (\n <TableHead className=\"fk:h-8 fk:text-xs\" key={column}>\n {column}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {table.rows.map((row, index) => (\n <TableRow key={`${row._id ?? ''}-${index}`}>\n {table.columns.map((column) => (\n <TableCell\n className=\"fk:max-w-56 fk:truncate fk:py-1.5 fk:text-xs\"\n key={column}\n title={row[column]}\n >\n {row[column]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {table.total > TABLE_ROW_LIMIT ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n First {TABLE_ROW_LIMIT.toLocaleString()} of {table.total.toLocaleString()} records.\n </span>\n ) : null}\n </div>\n ) : (\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {run?.data ? 'The response has no rows to show.' : 'Run a query to see its records.'}\n </span>\n )}\n </TabsContent>\n <TabsContent className=\"fk:px-3 fk:pb-3\" value=\"json\">\n {json ? (\n <pre className=\"fk:overflow-auto fk:rounded-md fk:border fk:bg-muted/40 fk:p-2 fk:font-mono fk:text-xs\">\n {json}\n </pre>\n ) : (\n <span className=\"fk:text-xs fk:text-muted-foreground\">Run a query to see its response.</span>\n )}\n </TabsContent>\n </div>\n </Tabs>\n </section>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport type { JSX } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { SearchIcon } from 'lucide-react';\nimport { useDebounce } from 'use-debounce';\nimport { getDisplayAttribute } from '../../core/get-display-attribute';\nimport { useSearch } from '../../core/use-search';\nimport type { Entity, SearchRequestProps } from '../../core/types';\nimport {\n Checkbox,\n Input,\n SidebarContent,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarPanel,\n SidebarRail,\n} from '../../ui';\nimport { buildTotalsQuery, getEntityLabel, getTotalEntities } from './graph';\n\nconst SEARCH_DEBOUNCE_MS = 250;\nconst SEARCH_HITS_PER_ENTITY = 5;\n\nexport interface GraphSidebarProps {\n projectId: string;\n entities: Entity[];\n colors: { [entity: string]: string };\n /** Nodes on the canvas per entity. */\n onCanvas: { [entity: string]: number };\n hiddenEntities: string[];\n onStart: (entity: Entity) => void;\n onHit: (entityName: string, id: string) => void;\n onToggleEntity: (entityName: string) => void;\n}\n\nfunction buildSearchRequest(entities: Entity[], q: string): SearchRequestProps | null {\n const trimmed = q.trim();\n\n if (!trimmed || entities.length === 0) {\n return null;\n }\n\n return {\n searchRequests: { searches: entities.map((entity) => ({ collection: entity.plural })) },\n commonParams: { q: trimmed, limit: SEARCH_HITS_PER_ENTITY },\n };\n}\n\n/** Count-store totals per entity for the \"Nodes\" list; absent for space-bound entities. */\nfunction useTotals(entities: Entity[]): { [plural: string]: number } {\n const countable = useMemo(() => getTotalEntities(entities), [entities]);\n const document = useMemo(() => gql(countable.length > 0 ? buildTotalsQuery(countable) : 'query GraphTotals { __typename }'), [countable]);\n const { data } = useQuery<{ [field: string]: number }>(document, { skip: countable.length === 0 });\n\n return useMemo(\n () =>\n Object.fromEntries(\n countable\n .map((entity) => [entity.plural, data?.[`${entity.plural}Total`]] as const)\n .filter((pair): pair is readonly [string, number] => typeof pair[1] === 'number')\n ),\n [countable, data]\n );\n}\n\n/**\n * Search a record to add it to the canvas, start from a whole entity, and the\n * legend of what is on the canvas with a switch per entity.\n */\nexport function GraphSidebar({\n projectId,\n entities,\n colors,\n onCanvas,\n hiddenEntities,\n onStart,\n onHit,\n onToggleEntity,\n}: GraphSidebarProps): JSX.Element {\n const [query, setQuery] = useState('');\n const [debouncedQuery] = useDebounce(query, SEARCH_DEBOUNCE_MS);\n const searchable = useMemo(\n () => entities.filter((entity) => entity.attributes.some((attribute) => attribute.searchable)),\n [entities]\n );\n const request = useMemo(() => buildSearchRequest(searchable, debouncedQuery), [searchable, debouncedQuery]);\n const { results, isLoading } = useSearch(projectId, request);\n const totals = useTotals(entities);\n const entityByName = useMemo(() => new Map(entities.map((entity) => [entity.name, entity])), [entities]);\n const onCanvasEntities = Object.keys(onCanvas).sort();\n\n return (\n <SidebarPanel collapsible=\"icon\" variant=\"inset\">\n <SidebarContent>\n <SidebarGroup className=\"fk:group-data-[collapsible=icon]:hidden\">\n <div className=\"fk:relative\">\n <SearchIcon className=\"fk:pointer-events-none fk:absolute fk:left-2 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground\" />\n <Input\n aria-label=\"Search records to add to the canvas\"\n className=\"fk:h-8 fk:bg-background fk:pl-8 fk:shadow-none\"\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchable.length > 0 ? 'Search records…' : 'No searchable entity'}\n disabled={searchable.length === 0}\n value={query}\n />\n </div>\n {request ? (\n <ul className=\"fk:mt-2 fk:flex fk:flex-col fk:gap-0.5\" data-testid=\"graph-search-results\">\n {results.map((hit) => {\n const entity = entityByName.get(hit._entityName);\n const label = hit[getDisplayAttribute(entity)?.name ?? ''];\n\n return (\n <li key={`${hit._entityName}:${hit._id}`}>\n <button\n className=\"fk:flex fk:w-full fk:items-center fk:gap-2 fk:rounded-md fk:px-2 fk:py-1.5 fk:text-left fk:text-sm fk:hover:bg-sidebar-accent\"\n onClick={() => onHit(hit._entityName, hit._id)}\n type=\"button\"\n >\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2.5 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[hit._entityName] ?? '#71717a' }}\n />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate\">{String(label ?? hit._id)}</span>\n </button>\n </li>\n );\n })}\n {!isLoading && results.length === 0 ? (\n <li className=\"fk:px-2 fk:py-1.5 fk:text-sm fk:text-muted-foreground\">Nothing found</li>\n ) : null}\n </ul>\n ) : null}\n </SidebarGroup>\n\n <SidebarGroup>\n <SidebarGroupLabel>Nodes</SidebarGroupLabel>\n <SidebarMenu>\n {entities.map((entity) => (\n <SidebarMenuItem key={entity.name}>\n <SidebarMenuButton onClick={() => onStart(entity)} tooltip={getEntityLabel(entity)}>\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2.5 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[entity.name] ?? '#71717a' }}\n />\n <span className=\"fk:truncate\">{getEntityLabel(entity)}</span>\n {totals[entity.plural] !== undefined ? (\n <span className=\"fk:ml-auto fk:text-xs fk:text-muted-foreground\">\n {totals[entity.plural]?.toLocaleString()}\n </span>\n ) : null}\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n\n {onCanvasEntities.length > 0 ? (\n <SidebarGroup className=\"fk:group-data-[collapsible=icon]:hidden\">\n <SidebarGroupLabel>On canvas</SidebarGroupLabel>\n <ul className=\"fk:flex fk:flex-col\" data-testid=\"graph-legend\">\n {onCanvasEntities.map((name) => {\n const entity = entityByName.get(name);\n const checked = !hiddenEntities.includes(name);\n const id = `graph-legend-${name}`;\n\n return (\n <li className=\"fk:flex fk:h-8 fk:items-center fk:gap-2 fk:px-2 fk:text-sm\" key={name}>\n <span\n aria-hidden=\"true\"\n className=\"fk:size-2.5 fk:shrink-0 fk:rounded-full\"\n style={{ backgroundColor: colors[name] ?? '#71717a', opacity: checked ? 1 : 0.35 }}\n />\n <label className=\"fk:min-w-0 fk:flex-1 fk:cursor-pointer fk:truncate\" htmlFor={id}>\n {entity ? getEntityLabel(entity) : name}\n </label>\n <span className=\"fk:text-xs fk:text-muted-foreground\">{onCanvas[name]?.toLocaleString()}</span>\n <Checkbox\n aria-label={`Show ${entity ? getEntityLabel(entity) : name}`}\n checked={checked}\n id={id}\n onCheckedChange={() => onToggleEntity(name)}\n />\n </li>\n );\n })}\n </ul>\n </SidebarGroup>\n ) : null}\n </SidebarContent>\n <SidebarRail />\n </SidebarPanel>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { EraserIcon, ExpandIcon, EyeOffIcon, LoaderCircleIcon, ScanIcon } from 'lucide-react';\nimport { Button, Separator, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\n\nexport interface GraphToolbarProps {\n hasSelection: boolean;\n hasNodes: boolean;\n isLoading: boolean;\n onFit: () => void;\n onExpand: () => void;\n onHide: () => void;\n onClear: () => void;\n}\n\nfunction ToolbarButton({\n label,\n icon,\n disabled,\n onClick,\n}: {\n label: string;\n icon: JSX.Element;\n disabled?: boolean;\n onClick: () => void;\n}): JSX.Element {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button className=\"fk:h-8 fk:gap-1.5 fk:px-2.5\" disabled={disabled} onClick={onClick} size=\"sm\" variant=\"ghost\">\n {icon}\n <span className=\"fk:text-xs\">{label}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n/** The floating actions over the canvas. */\nexport function GraphToolbar({\n hasSelection,\n hasNodes,\n isLoading,\n onFit,\n onExpand,\n onHide,\n onClear,\n}: GraphToolbarProps): JSX.Element {\n return (\n <div\n className=\"fk:flex fk:items-center fk:gap-0.5 fk:rounded-lg fk:border fk:bg-background fk:p-1 fk:shadow-xs\"\n data-testid=\"graph-toolbar\"\n >\n <ToolbarButton disabled={!hasNodes} icon={<ScanIcon className=\"fk:size-3.5\" />} label=\"Fit\" onClick={onFit} />\n <Separator className=\"fk:mx-0.5 fk:h-4\" orientation=\"vertical\" />\n <ToolbarButton\n disabled={!hasSelection || isLoading}\n icon={\n isLoading ? (\n <LoaderCircleIcon className=\"fk:size-3.5 fk:animate-spin\" />\n ) : (\n <ExpandIcon className=\"fk:size-3.5\" />\n )\n }\n label=\"Expand\"\n onClick={onExpand}\n />\n <ToolbarButton\n disabled={!hasSelection}\n icon={<EyeOffIcon className=\"fk:size-3.5\" />}\n label=\"Hide\"\n onClick={onHide}\n />\n <Separator className=\"fk:mx-0.5 fk:h-4\" orientation=\"vertical\" />\n <ToolbarButton\n disabled={!hasNodes}\n icon={<EraserIcon className=\"fk:size-3.5\" />}\n label=\"Clear\"\n onClick={onClear}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useReducer, useRef, useState } from 'react';\nimport type { Dispatch } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { USER_QUERY_CONTEXT } from '../../graphql-client/graphql-context';\nimport { toast } from '../../ui';\nimport type { Attribute, Entity } from '../../core/types';\nimport {\n buildExpandQuery,\n buildRecordsQuery,\n EXPAND_PAGE,\n fetchedFromRecords,\n getEntity,\n graphFromRecords,\n nodeKey,\n type GraphRecord,\n} from './graph';\nimport { graphFromQueryResult, type QueryResult, type QueryRun } from './query';\nimport { EMPTY_SCENE, sceneReducer, type SceneAction, type SceneState } from './scene';\n\n/** Which records to load: given ids (with their first hop when `expand`), or a sample. */\nexport type RecordSelection = { ids: string[]; expand: boolean } | { limit: number };\n\nexport interface SceneApi {\n state: SceneState;\n dispatch: Dispatch<SceneAction>;\n isLoading: boolean;\n /** Loads records, with the first page of each relationship when asked; resolves to their node keys. */\n loadRecords: (entity: Entity, selection: RecordSelection) => Promise<string[]>;\n /** Loads the first page of every relationship of a node. */\n expandAll: (key: string) => Promise<void>;\n /** Loads the next page of one relationship of a node. */\n expandAttribute: (key: string, attribute: Attribute) => Promise<void>;\n /** Runs any GraphQL query and draws its result, replacing the canvas unless `append`. */\n runQuery: (query: string, options: { append: boolean }) => Promise<QueryRun>;\n}\n\ntype RecordsResult = { [plural: string]: GraphRecord[] };\n\nfunction errorMessage(error: unknown, fallback = 'The records could not be loaded.'): string {\n return error instanceof Error ? error.message : fallback;\n}\n\n/**\n * The scene plus the loaders that grow it through the project GraphQL API,\n * so the roles and spaces of the signed-in member apply to every node.\n */\nexport function useScene({ schema, scope }: { schema: Entity[]; scope: string }): SceneApi {\n const client = useApolloClient();\n const [state, dispatch] = useReducer(sceneReducer, EMPTY_SCENE);\n const [pending, setPending] = useState(0);\n // Counts the loads that reached the canvas, so a query only replaces a\n // canvas nothing else has added to while it ran.\n const loadsRef = useRef(0);\n\n const loadRecords = useCallback(\n async (entity: Entity, selection: RecordSelection): Promise<string[]> => {\n const ids = 'ids' in selection ? selection.ids : undefined;\n const expand = 'ids' in selection ? selection.expand : false;\n const limit = 'limit' in selection ? selection.limit : ids?.length;\n setPending((count) => count + 1);\n\n try {\n const result = await client.query<RecordsResult>({\n query: gql(buildRecordsQuery({ entity, schema, scope, expand })),\n variables: {\n where: ids ? { _id: { in: ids } } : undefined,\n limit,\n },\n fetchPolicy: 'network-only',\n });\n const records = result.data?.[entity.plural] ?? [];\n loadsRef.current += 1;\n dispatch({\n type: 'merge',\n data: graphFromRecords({ records, entity, schema, scope }),\n fetched: fetchedFromRecords(records, entity),\n });\n\n return records.map((record) => nodeKey(entity.name, record._id));\n } catch (error) {\n toast.error(errorMessage(error));\n\n return [];\n } finally {\n setPending((count) => count - 1);\n }\n },\n [client, schema, scope]\n );\n\n const expandAll = useCallback(\n async (key: string): Promise<void> => {\n const node = state.nodes[key];\n const entity = node ? getEntity(schema, node.entity) : undefined;\n\n if (!node || !entity) {\n return;\n }\n\n await loadRecords(entity, { ids: [node.id], expand: true });\n },\n [loadRecords, schema, state.nodes]\n );\n\n const expandAttribute = useCallback(\n async (key: string, attribute: Attribute): Promise<void> => {\n const node = state.nodes[key];\n const entity = node ? getEntity(schema, node.entity) : undefined;\n\n if (!node || !entity) {\n return;\n }\n\n const offset = state.fetched[key]?.[attribute.name] ?? 0;\n setPending((count) => count + 1);\n\n try {\n const result = await client.query<RecordsResult>({\n query: gql(buildExpandQuery({ entity, schema, scope, attribute })),\n variables: { id: node.id, offset, limit: EXPAND_PAGE },\n fetchPolicy: 'network-only',\n });\n const records = result.data?.[entity.plural] ?? [];\n loadsRef.current += 1;\n const received = records.reduce((sum, record) => {\n const related = record[attribute.name];\n\n return sum + (Array.isArray(related) ? related.length : 0);\n }, 0);\n dispatch({\n type: 'merge',\n data: graphFromRecords({ records, entity, schema, scope }),\n fetched: { [key]: { [attribute.name]: offset + received } },\n });\n } catch (error) {\n toast.error(errorMessage(error));\n } finally {\n setPending((count) => count - 1);\n }\n },\n [client, schema, scope, state.fetched, state.nodes]\n );\n\n const runQuery = useCallback(\n async (query: string, { append }: { append: boolean }): Promise<QueryRun> => {\n const startedAt = performance.now();\n let document;\n\n try {\n document = gql(query);\n } catch (error) {\n return {\n data: null,\n error: errorMessage(error, 'The query could not be parsed.'),\n elapsedMs: 0,\n nodes: 0,\n edges: 0,\n };\n }\n\n const loadsAtStart = loadsRef.current;\n setPending((count) => count + 1);\n\n try {\n // Not cached: a partial result would overwrite the records Desk reads cache-first.\n const result = await client.query<QueryResult>({\n query: document,\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n context: USER_QUERY_CONTEXT,\n });\n const data = result.data ?? null;\n const graph = graphFromQueryResult({ data, schema, scope });\n\n // A failed query, or one that draws nothing, leaves the canvas as it\n // was; partial data beside errors, or a result arriving after other\n // loads reached the canvas, is added to it rather than replacing it.\n if (graph.nodes.length > 0) {\n if (!append && !result.error && loadsRef.current === loadsAtStart) {\n dispatch({ type: 'clear' });\n }\n\n loadsRef.current += 1;\n dispatch({ type: 'merge', data: graph });\n }\n\n return {\n data,\n error: result.error ? result.error.message : null,\n elapsedMs: Math.round(performance.now() - startedAt),\n nodes: graph.nodes.length,\n edges: graph.edges.length,\n };\n } catch (error) {\n return {\n data: null,\n error: errorMessage(error, 'The query failed.'),\n elapsedMs: Math.round(performance.now() - startedAt),\n nodes: 0,\n edges: 0,\n };\n } finally {\n setPending((count) => count - 1);\n }\n },\n [client, schema, scope]\n );\n\n return { state, dispatch, isLoading: pending > 0, loadRecords, expandAll, expandAttribute, runQuery };\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { JSX } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { filterEntitiesForSpaces } from '../../core/spaces';\nimport type { Attribute } from '../../core/types';\nimport { useDispatch } from '../../entities/actions-context';\nimport {\n Button,\n readSidebarCookieState,\n SidebarInset,\n SidebarProvider,\n SidebarTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { useTheme } from '../../ui/theme-context';\nimport { trackStudioEvent } from '../../core/analytics/product-events';\nimport { GraphCanvas, type GraphCanvasApi } from './canvas';\nimport { GraphContextMenu, type GraphContextMenuState } from './context-menu';\nimport {\n EXPAND_HOP_MAX_RECORDS,\n getEntity,\n getEntityColors,\n getGraphEntities,\n getRelationshipAttributes,\n parseGraphParams,\n SAMPLE_LIMIT,\n} from './graph';\nimport { GraphInspector } from './inspector';\nimport { QueryPane } from './query-pane';\nimport { countNodesByEntity, neighbourKeys } from './scene';\nimport { GraphSidebar } from './sidebar';\nimport { GraphToolbar } from './toolbar';\nimport { useScene } from './use-scene';\n\n/**\n * The Graph app: explore records as nodes and relationships. The sidebar\n * adds records, the canvas draws them, the inspector details the selection.\n * Other apps open it with `?entity=<name>&ids=<id,id>` to show those records\n * expanded one hop. The Query view draws the result of any GraphQL query.\n */\nexport function Root(): JSX.Element {\n const { currentProjectId, currentProject, currentProjectSchema } = useConfig();\n\n // Once the project has loaded, so a mistyped or inaccessible URL is not counted.\n useEffect(() => {\n if (currentProjectId && currentProject) {\n trackStudioEvent({ event: 'graph_opened', projectId: currentProjectId });\n }\n }, [currentProjectId, currentProject]);\n const [, auth] = useAuth();\n const { scope } = useAppContext();\n const { resolvedTheme } = useTheme();\n const location = useLocation();\n const dispatchAction = useDispatch();\n const theme = resolvedTheme === 'dark' ? 'dark' : 'light';\n const defaultScope = currentProject?.scopes?.find((item) => item.isDefault)?.name ?? 'default';\n const scopeField = scope || defaultScope;\n // Space-bound entities are hidden from non-members, as in Desk; the API\n // rejects their data either way.\n const userSpaces = auth.user?.spaces;\n const schema = useMemo(\n () => filterEntitiesForSpaces(currentProjectSchema, userSpaces),\n [currentProjectSchema, userSpaces]\n );\n const entities = useMemo(() => getGraphEntities(schema), [schema]);\n const colors = useMemo(() => getEntityColors(schema, theme), [schema, theme]);\n const scene = useScene({ schema, scope: scopeField });\n const { state, dispatch, isLoading, loadRecords, expandAll, expandAttribute, runQuery } = scene;\n const canvasApi = useRef<GraphCanvasApi | null>(null);\n const [menu, setMenu] = useState<GraphContextMenuState | null>(null);\n const [isLayoutRunning, setIsLayoutRunning] = useState(false);\n const [mode, setMode] = useState<'explore' | 'query'>('explore');\n const loadedSearchRef = useRef<string | null>(null);\n const onCanvas = useMemo(() => countNodesByEntity(state), [state]);\n const selectedNode = state.selected ? state.nodes[state.selected] : undefined;\n const menuNode = menu ? state.nodes[menu.key] : undefined;\n const menuEntity = menuNode ? getEntity(schema, menuNode.entity) : undefined;\n const nodeCount = Object.keys(state.nodes).length;\n const edgeCount = Object.keys(state.edges).length;\n const defaultOpen = readSidebarCookieState();\n\n const select = useCallback((key: string | null) => dispatch({ type: 'select', key }), [dispatch]);\n\n const openRecord = useCallback(\n (key: string) => {\n const node = state.nodes[key];\n const entity = node ? getEntity(schema, node.entity) : undefined;\n\n if (node && entity) {\n dispatchAction({ type: 'EditEntity', payload: { entityId: node.id, entityNamePlural: entity.plural } });\n }\n },\n [dispatchAction, schema, state.nodes]\n );\n\n const hide = useCallback((key: string) => dispatch({ type: 'remove', keys: [key] }), [dispatch]);\n\n const hideOthers = useCallback(\n (key: string) => dispatch({ type: 'keepOnly', keys: [key, ...neighbourKeys(state, key)] }),\n [dispatch, state]\n );\n\n const togglePin = useCallback((key: string) => dispatch({ type: 'togglePin', key }), [dispatch]);\n\n const pin = useCallback(\n (key: string) => {\n if (!state.pinned[key]) {\n dispatch({ type: 'togglePin', key });\n }\n },\n [dispatch, state.pinned]\n );\n\n const addRecord = useCallback(\n async (entityName: string, id: string) => {\n const entity = getEntity(schema, entityName);\n\n if (!entity) {\n return;\n }\n\n const [key] = await loadRecords(entity, { ids: [id], expand: true });\n\n if (key) {\n select(key);\n }\n },\n [loadRecords, schema, select]\n );\n\n const expandAttributeAndClose = useCallback(\n (key: string, attribute: Attribute) => {\n setMenu(null);\n void expandAttribute(key, attribute);\n },\n [expandAttribute]\n );\n\n // Records another app asked for: `?entity=product&ids=a,b` loads those\n // records, expanded one hop when they are few, `?entity=product` a sample.\n useEffect(() => {\n const params = parseGraphParams(location.search);\n\n // Keyed on the navigation, not the query string: opening the same\n // records again after a Clear must load them again.\n if (!params || loadedSearchRef.current === location.key) {\n return;\n }\n\n const entity = getEntity(schema, params.entity);\n\n if (!entity || schema.length === 0) {\n return;\n }\n\n loadedSearchRef.current = location.key;\n const selection =\n params.ids.length > 0\n ? { ids: params.ids, expand: params.ids.length <= EXPAND_HOP_MAX_RECORDS }\n : { limit: SAMPLE_LIMIT };\n void loadRecords(entity, selection).then((keys) => {\n if (params.ids.length === 1 && keys[0]) {\n select(keys[0]);\n }\n });\n }, [location.key, location.search, schema, loadRecords, select]);\n\n if (!currentProjectId) {\n return (\n <main className=\"fk:flex fk:h-full fk:flex-1 fk:items-center fk:justify-center fk:p-8 fk:text-sm fk:text-muted-foreground\">\n Select a project to explore its graph.\n </main>\n );\n }\n\n return (\n <SidebarProvider className=\"fk:h-full\" defaultOpen={defaultOpen}>\n <GraphSidebar\n colors={colors}\n entities={entities}\n hiddenEntities={state.hiddenEntities}\n onCanvas={onCanvas}\n onHit={(entityName, id) => void addRecord(entityName, id)}\n onStart={(entity) => void loadRecords(entity, { limit: SAMPLE_LIMIT })}\n onToggleEntity={(entityName) => dispatch({ type: 'toggleEntity', entity: entityName })}\n projectId={currentProjectId}\n />\n <SidebarInset className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0\" data-testid=\"graph-app\">\n <QueryPane\n hidden={mode !== 'query'}\n isRunning={isLoading}\n key={currentProjectId}\n onRun={runQuery}\n projectId={currentProjectId}\n schema={schema}\n schemaHash={currentProject?.schemaHash ?? null}\n scope={scopeField}\n theme={theme}\n />\n <div className=\"fk:relative fk:min-w-0 fk:flex-1 fk:overflow-hidden fk:bg-background\">\n <div className=\"fk:pointer-events-none fk:absolute fk:left-3 fk:right-3 fk:top-3 fk:z-10 fk:flex fk:flex-wrap fk:items-start fk:justify-between fk:gap-2\">\n <div className=\"fk:pointer-events-auto fk:flex fk:items-center fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:h-8 fk:w-8 fk:rounded-lg fk:hover:bg-transparent fk:dark:hover:bg-transparent\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <GraphToolbar\n hasNodes={nodeCount > 0}\n hasSelection={selectedNode !== undefined}\n isLoading={isLoading}\n onClear={() => dispatch({ type: 'clear' })}\n onExpand={() => {\n if (state.selected) {\n void expandAll(state.selected);\n }\n }}\n onFit={() => canvasApi.current?.fit()}\n onHide={() => {\n if (state.selected) {\n hide(state.selected);\n }\n }}\n />\n </div>\n <div\n aria-label=\"View\"\n className=\"fk:pointer-events-auto fk:flex fk:items-center fk:gap-0.5 fk:rounded-lg fk:border fk:bg-background fk:p-0.5 fk:shadow-xs\"\n data-testid=\"graph-mode\"\n role=\"group\"\n >\n <Button\n aria-pressed={mode === 'explore'}\n className=\"fk:h-7 fk:px-3 fk:text-xs\"\n onClick={() => setMode('explore')}\n size=\"sm\"\n variant={mode === 'explore' ? 'default' : 'ghost'}\n >\n Explore\n </Button>\n <Button\n aria-pressed={mode === 'query'}\n className=\"fk:h-7 fk:px-3 fk:text-xs\"\n onClick={() => setMode('query')}\n size=\"sm\"\n variant={mode === 'query' ? 'default' : 'ghost'}\n >\n Query\n </Button>\n </div>\n </div>\n {nodeCount > 0 ? null : (\n <div className=\"fk:pointer-events-none fk:absolute fk:inset-0 fk:flex fk:items-center fk:justify-center fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {isLoading\n ? 'Loading records…'\n : mode === 'query'\n ? 'Run a query to draw its result.'\n : 'Search a record or start from an entity to draw its graph.'}\n </div>\n )}\n <GraphCanvas\n apiRef={canvasApi}\n colors={colors}\n onContextMenu={(key, position) => setMenu({ key, ...position })}\n onExpand={(key) => void expandAll(key)}\n onLayoutChange={setIsLayoutRunning}\n onPin={pin}\n onSelect={select}\n scene={state}\n theme={theme}\n />\n <div\n className=\"fk:absolute fk:bottom-3 fk:left-3 fk:flex fk:max-w-[calc(100%-1.5rem)] fk:items-center fk:gap-2 fk:rounded-lg fk:border fk:bg-background fk:px-2.5 fk:py-1.5 fk:text-xs fk:text-muted-foreground fk:shadow-xs\"\n data-testid=\"graph-status\"\n >\n <span>\n {nodeCount.toLocaleString()} {nodeCount === 1 ? 'node' : 'nodes'} · {edgeCount.toLocaleString()}{' '}\n {edgeCount === 1 ? 'relationship' : 'relationships'}\n </span>\n {isLayoutRunning ? <span>· laying out…</span> : null}\n {state.notice ? <span className=\"fk:truncate fk:text-foreground\">· {state.notice}</span> : null}\n </div>\n <GraphContextMenu\n isPinned={menu ? state.pinned[menu.key] === true : false}\n menu={menu}\n onClose={() => setMenu(null)}\n onExpandAll={(key) => void expandAll(key)}\n onExpandAttribute={expandAttributeAndClose}\n onHide={hide}\n onHideOthers={hideOthers}\n onOpenRecord={openRecord}\n onTogglePin={togglePin}\n relationships={menuEntity ? getRelationshipAttributes(menuEntity) : []}\n />\n </div>\n {selectedNode ? (\n <GraphInspector\n colors={colors}\n isLoading={isLoading}\n node={selectedNode}\n onClose={() => select(null)}\n onExpandAll={(key) => void expandAll(key)}\n onExpandAttribute={(key, attribute) => void expandAttribute(key, attribute)}\n onHide={hide}\n onOpenRecord={openRecord}\n scene={state}\n schema={schema}\n scope={scopeField}\n />\n ) : null}\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n"]}
|