@neo4j-nvl/base 2.0.0-c8e499dc → 2.0.0-ec6fdba7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/base.mjs +1062 -1058
  3. package/dist/types/index.d.ts +382 -385
  4. package/dist/types/layouts/animatedlayout/AnimatedLayout.d.ts +23 -23
  5. package/dist/types/layouts/animatedlayout/animationUtils.d.ts +3 -3
  6. package/dist/types/layouts/circularLayout/CircularLayout.d.ts +14 -14
  7. package/dist/types/layouts/d3forcelayout/circularLayout.d.ts +4 -4
  8. package/dist/types/layouts/d3forcelayout/constants.d.ts +3 -3
  9. package/dist/types/layouts/d3forcelayout/d3ForceLayout.d.ts +31 -31
  10. package/dist/types/layouts/d3forcelayout/types.d.ts +7 -7
  11. package/dist/types/layouts/forcedirectedlayout/PhysLayout.d.ts +261 -261
  12. package/dist/types/layouts/forcedirectedlayout/clustering/ClusterByMerger.d.ts +52 -52
  13. package/dist/types/layouts/forcedirectedlayout/clustering/SolarMerger.d.ts +49 -49
  14. package/dist/types/layouts/forcedirectedlayout/clustering/clustering-utils.d.ts +35 -35
  15. package/dist/types/layouts/forcedirectedlayout/clustering/types.d.ts +39 -39
  16. package/dist/types/layouts/forcedirectedlayout/glwrapper.d.ts +3 -3
  17. package/dist/types/layouts/forcedirectedlayout/shaders/multilevel-fragment.d.ts +1 -1
  18. package/dist/types/layouts/forcedirectedlayout/shaders/multilevel-repulsive-fragment.d.ts +1 -1
  19. package/dist/types/layouts/forcedirectedlayout/shaders/multilevel-update-fragment.d.ts +1 -1
  20. package/dist/types/layouts/forcedirectedlayout/shaders/sim-vertex.d.ts +1 -1
  21. package/dist/types/layouts/freeLayout/FreeLayout.d.ts +23 -23
  22. package/dist/types/layouts/gridLayout/GridLayout.d.ts +26 -26
  23. package/dist/types/layouts/hierarchicallayout/HierarchicalLayout.d.ts +28 -28
  24. package/dist/types/layouts/hierarchicallayout/constants.d.ts +2 -2
  25. package/dist/types/modules/CallbackHelper.d.ts +23 -23
  26. package/dist/types/modules/ExternalCallbackHandler.d.ts +33 -33
  27. package/dist/types/modules/NvlController.d.ts +212 -209
  28. package/dist/types/modules/Shader.d.ts +17 -17
  29. package/dist/types/modules/ZoomTransitionHandler.d.ts +24 -24
  30. package/dist/types/modules/dataset.d.ts +24 -24
  31. package/dist/types/modules/logging.d.ts +4 -4
  32. package/dist/types/modules/state/constants.d.ts +2 -2
  33. package/dist/types/modules/state/state.d.ts +2 -2
  34. package/dist/types/modules/state/types.d.ts +296 -288
  35. package/dist/types/modules/state/utils.d.ts +36 -36
  36. package/dist/types/renderers/ClusterOverlay.d.ts +67 -67
  37. package/dist/types/renderers/domrenderer/BaseRenderer.d.ts +69 -69
  38. package/dist/types/renderers/domrenderer/canvasrenderer/Animation.d.ts +57 -57
  39. package/dist/types/renderers/domrenderer/canvasrenderer/AnimationHandler.d.ts +65 -65
  40. package/dist/types/renderers/domrenderer/canvasrenderer/CanvasRenderer.d.ts +84 -85
  41. package/dist/types/renderers/domrenderer/canvasrenderer/arrowDrawing.d.ts +31 -31
  42. package/dist/types/renderers/domrenderer/canvasrenderer/nodeDrawing.d.ts +32 -32
  43. package/dist/types/renderers/domrenderer/shared/ImageCache.d.ts +16 -16
  44. package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundle.d.ts +89 -89
  45. package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundler.d.ts +42 -42
  46. package/dist/types/renderers/domrenderer/shared/arrows/arrows.d.ts +49 -49
  47. package/dist/types/renderers/domrenderer/shared/arrows/constants.d.ts +4 -4
  48. package/dist/types/renderers/domrenderer/shared/nodes/nodes.d.ts +21 -21
  49. package/dist/types/renderers/domrenderer/shared/types.d.ts +29 -29
  50. package/dist/types/renderers/domrenderer/shared/util.d.ts +4 -4
  51. package/dist/types/renderers/domrenderer/shared/vectorUtils.d.ts +10 -10
  52. package/dist/types/renderers/domrenderer/shared/wordwrap.d.ts +10 -10
  53. package/dist/types/renderers/domrenderer/svgrenderer/SvgRenderer.d.ts +18 -19
  54. package/dist/types/renderers/domrenderer/svgrenderer/arrowDrawing.d.ts +15 -15
  55. package/dist/types/renderers/domrenderer/svgrenderer/nodeDrawing.d.ts +4 -4
  56. package/dist/types/renderers/domrenderer/svgrenderer/svgUtils.d.ts +21 -21
  57. package/dist/types/renderers/webglrenderer/Controller.d.ts +83 -82
  58. package/dist/types/renderers/webglrenderer/IconLayerRegistry.d.ts +8 -8
  59. package/dist/types/renderers/webglrenderer/Renderer.d.ts +89 -89
  60. package/dist/types/renderers/webglrenderer/node-animation-fragment.d.ts +1 -1
  61. package/dist/types/renderers/webglrenderer/node-animation-vertex.d.ts +1 -1
  62. package/dist/types/renderers/webglrenderer/node-fragment-point.d.ts +1 -1
  63. package/dist/types/renderers/webglrenderer/node-vertex-point.d.ts +1 -1
  64. package/dist/types/renderers/webglrenderer/rel-fragment-line.d.ts +1 -1
  65. package/dist/types/renderers/webglrenderer/rel-glsl-utils.d.ts +1 -1
  66. package/dist/types/renderers/webglrenderer/rel-vertex-arrow.d.ts +1 -1
  67. package/dist/types/renderers/webglrenderer/rel-vertex-line.d.ts +1 -1
  68. package/dist/types/renderers/webglrenderer/viewport-box-fragment.d.ts +1 -1
  69. package/dist/types/renderers/webglrenderer/viewport-box-vertex.d.ts +1 -1
  70. package/dist/types/types/graph-element.d.ts +103 -103
  71. package/dist/types/types/nvl-window-functions.d.ts +12 -13
  72. package/dist/types/types/utils.d.ts +1 -1
  73. package/dist/types/utils/ariaUtils.d.ts +2 -2
  74. package/dist/types/utils/canvasManagement.d.ts +1 -1
  75. package/dist/types/utils/circularUtils.d.ts +2 -2
  76. package/dist/types/utils/clusterGeometry.d.ts +3 -3
  77. package/dist/types/utils/clusterHitRegions.d.ts +12 -12
  78. package/dist/types/utils/colorUtils.d.ts +2 -2
  79. package/dist/types/utils/constants.d.ts +6 -6
  80. package/dist/types/utils/errors.d.ts +6 -6
  81. package/dist/types/utils/geometry.d.ts +48 -48
  82. package/dist/types/utils/graphObjectUtils.d.ts +9 -9
  83. package/dist/types/utils/hitTest.d.ts +47 -47
  84. package/dist/types/utils/jsDriverResultTransformer.d.ts +16 -16
  85. package/dist/types/utils/layoutSeeding.d.ts +2 -2
  86. package/dist/types/utils/mouseUtils.d.ts +5 -5
  87. package/dist/types/utils/segmentAnalytics.d.ts +42 -42
  88. package/dist/types/utils/webWorkerUtils.d.ts +1 -1
  89. package/dist/types/utils/zoomFunctions.d.ts +16 -15
  90. package/package.json +12 -10
  91. package/skills/neo4j-nvl-skill/SKILL.md +238 -398
  92. package/skills/neo4j-nvl-skill/references/api/base/classes/NVL.md +977 -0
  93. package/skills/neo4j-nvl-skill/references/api/base/functions/getZoomTargetForNodePositions.md +37 -0
  94. package/skills/neo4j-nvl-skill/references/api/base/index.md +71 -0
  95. package/skills/neo4j-nvl-skill/references/api/base/interfaces/CircularOptions.md +11 -0
  96. package/skills/neo4j-nvl-skill/references/api/base/interfaces/ClusteringOptions.md +14 -0
  97. package/skills/neo4j-nvl-skill/references/api/base/interfaces/ExternalCallbacks.md +18 -0
  98. package/skills/neo4j-nvl-skill/references/api/base/interfaces/ForceDirectedOptions.md +12 -0
  99. package/skills/neo4j-nvl-skill/references/api/base/interfaces/HierarchicalOptions.md +13 -0
  100. package/skills/neo4j-nvl-skill/references/api/base/interfaces/HitTargetCluster.md +13 -0
  101. package/skills/neo4j-nvl-skill/references/api/base/interfaces/HitTargetNode.md +16 -0
  102. package/skills/neo4j-nvl-skill/references/api/base/interfaces/HitTargetRelationship.md +15 -0
  103. package/skills/neo4j-nvl-skill/references/api/base/interfaces/Node.md +32 -0
  104. package/skills/neo4j-nvl-skill/references/api/base/interfaces/NvlMouseEvent.md +16 -0
  105. package/skills/neo4j-nvl-skill/references/api/base/interfaces/NvlOptions.md +38 -0
  106. package/skills/neo4j-nvl-skill/references/api/base/interfaces/Point.md +12 -0
  107. package/skills/neo4j-nvl-skill/references/api/base/interfaces/Relationship.md +32 -0
  108. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/CanvasRendererType.md +14 -0
  109. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/Cluster.md +20 -0
  110. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/ClusterByFn.md +20 -0
  111. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/ClusterId.md +10 -0
  112. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/HitTargets.md +22 -0
  113. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/HitTestTarget.md +7 -0
  114. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/Layout.md +15 -0
  115. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/LayoutOptions.md +12 -0
  116. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/NodeWithClientPosition.md +18 -0
  117. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/PartialNode.md +17 -0
  118. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/PartialRelationship.md +17 -0
  119. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/Renderer.md +9 -0
  120. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/StyledCaption.md +21 -0
  121. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/WebGLRendererType.md +14 -0
  122. package/skills/neo4j-nvl-skill/references/api/base/type-aliases/ZoomOptions.md +25 -0
  123. package/skills/neo4j-nvl-skill/references/api/base/variables/CircularLayoutType.md +11 -0
  124. package/skills/neo4j-nvl-skill/references/api/base/variables/ForceDirectedLayoutType.md +9 -0
  125. package/skills/neo4j-nvl-skill/references/api/base/variables/FreeLayoutType.md +9 -0
  126. package/skills/neo4j-nvl-skill/references/api/base/variables/GridLayoutType.md +9 -0
  127. package/skills/neo4j-nvl-skill/references/api/base/variables/HierarchicalLayoutType.md +9 -0
  128. package/skills/neo4j-nvl-skill/references/api/base/variables/d3ForceLayoutType.md +9 -0
  129. package/skills/neo4j-nvl-skill/references/api/base/variables/nvlResultTransformer.md +38 -0
  130. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/BoxSelectInteraction.md +163 -0
  131. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/ClickInteraction.md +163 -0
  132. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/DragNodeInteraction.md +164 -0
  133. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/HoverInteraction.md +160 -0
  134. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/KeyboardInteraction.md +185 -0
  135. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/LassoInteraction.md +163 -0
  136. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/PanInteraction.md +196 -0
  137. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/ZoomInteraction.md +164 -0
  138. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/index.md +37 -0
  139. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/BoxSelectInteractionCallbacks.md +19 -0
  140. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/BoxSelectInteractionOptions.md +17 -0
  141. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ClickInteractionCallbacks.md +39 -0
  142. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ClickInteractionOptions.md +17 -0
  143. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/DragNodeInteractionCallbacks.md +21 -0
  144. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/DrawInteractionOptions.md +22 -0
  145. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/HoverInteractionCallbacks.md +17 -0
  146. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/HoverInteractionOptions.md +17 -0
  147. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/KeyboardInteractionCallbacks.md +35 -0
  148. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/KeyboardInteractionOptions.md +55 -0
  149. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/LassoInteractionCallbacks.md +19 -0
  150. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/LassoInteractionOptions.md +17 -0
  151. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/PanInteractionCallbacks.md +17 -0
  152. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/PanInteractionOptions.md +19 -0
  153. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ZoomInteractionCallbacks.md +17 -0
  154. package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ZoomInteractionOptions.md +17 -0
  155. package/skills/neo4j-nvl-skill/references/api/react/functions/StaticPictureWrapper.md +35 -0
  156. package/skills/neo4j-nvl-skill/references/api/react/index.md +34 -0
  157. package/skills/neo4j-nvl-skill/references/api/react/interfaces/BasicReactWrapperProps.md +24 -0
  158. package/skills/neo4j-nvl-skill/references/api/react/interfaces/InteractiveNvlWrapperProps.md +27 -0
  159. package/skills/neo4j-nvl-skill/references/api/react/type-aliases/InteractionOptions.md +10 -0
  160. package/skills/neo4j-nvl-skill/references/api/react/type-aliases/KeyboardEvent.md +7 -0
  161. package/skills/neo4j-nvl-skill/references/api/react/type-aliases/KeyboardEventCallbacks.md +10 -0
  162. package/skills/neo4j-nvl-skill/references/api/react/type-aliases/MouseEvent.md +10 -0
  163. package/skills/neo4j-nvl-skill/references/api/react/type-aliases/MouseEventCallbacks.md +10 -0
  164. package/skills/neo4j-nvl-skill/references/api/react/type-aliases/StaticPictureWrapperProps.md +27 -0
  165. package/skills/neo4j-nvl-skill/references/api/react/variables/BasicNvlWrapper.md +50 -0
  166. package/skills/neo4j-nvl-skill/references/api/react/variables/InteractiveNvlWrapper.md +17 -0
  167. package/skills/neo4j-nvl-skill/references/clustering.md +87 -0
  168. package/skills/neo4j-nvl-skill/references/data-from-neo4j.md +67 -0
  169. package/skills/neo4j-nvl-skill/references/labels-and-overlays.md +76 -0
  170. package/skills/neo4j-nvl-skill/references/layouts-and-positions.md +65 -0
  171. package/skills/neo4j-nvl-skill/references/lifecycle-and-updates.md +65 -0
  172. package/skills/neo4j-nvl-skill/references/migrating-1x-to-2.md +50 -0
  173. package/skills/neo4j-nvl-skill/references/react-wrappers.md +88 -0
  174. package/skills/neo4j-nvl-skill/references/verifying-nvl-apps.md +52 -0
  175. package/skills/neo4j-nvl-skill/references/vite-and-bundlers.md +62 -0
  176. package/dist/types/layouts/animatedlayout/AnimatedLayout.test.d.ts +0 -1
  177. package/dist/types/layouts/animatedlayout/animationUtils.test.d.ts +0 -1
  178. package/dist/types/layouts/d3forcelayout/__mocks__/d3ForceLayout.d.ts +0 -10
  179. package/dist/types/layouts/d3forcelayout/circularLayout.test.d.ts +0 -1
  180. package/dist/types/layouts/d3forcelayout/d3ForceLayout.test.d.ts +0 -1
  181. package/dist/types/layouts/forcedirectedlayout/PhysLayout.test.d.ts +0 -1
  182. package/dist/types/layouts/forcedirectedlayout/clustering/ClusterByMerger.test.d.ts +0 -1
  183. package/dist/types/layouts/forcedirectedlayout/clustering/SolarMerger.bench.d.ts +0 -1
  184. package/dist/types/layouts/forcedirectedlayout/clustering/SolarMerger.test.d.ts +0 -1
  185. package/dist/types/layouts/forcedirectedlayout/clustering/clustering-utils.test.d.ts +0 -1
  186. package/dist/types/modules/NvlController.test.d.ts +0 -1
  187. package/dist/types/modules/ZoomTransitionHandler.test.d.ts +0 -1
  188. package/dist/types/modules/dataset.test.d.ts +0 -1
  189. package/dist/types/modules/state/state.test.d.ts +0 -1
  190. package/dist/types/modules/state/utils.test.d.ts +0 -1
  191. package/dist/types/renderers/ClusterOverlay.test.d.ts +0 -1
  192. package/dist/types/renderers/domrenderer/BaseRenderer.test.d.ts +0 -1
  193. package/dist/types/renderers/domrenderer/canvasrenderer/Animation.test.d.ts +0 -1
  194. package/dist/types/renderers/domrenderer/canvasrenderer/CanvasRenderer.test.d.ts +0 -1
  195. package/dist/types/renderers/domrenderer/canvasrenderer/arrowDrawing.test.d.ts +0 -1
  196. package/dist/types/renderers/domrenderer/canvasrenderer/nodeDrawing.test.d.ts +0 -1
  197. package/dist/types/renderers/domrenderer/shared/ImageCache.test.d.ts +0 -1
  198. package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundle.test.d.ts +0 -1
  199. package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundler.test.d.ts +0 -1
  200. package/dist/types/renderers/domrenderer/shared/arrows/arrows.test.d.ts +0 -1
  201. package/dist/types/renderers/domrenderer/shared/nodes/nodes.test.d.ts +0 -1
  202. package/dist/types/renderers/domrenderer/shared/util.test.d.ts +0 -1
  203. package/dist/types/renderers/domrenderer/shared/wordwrap.test.d.ts +0 -1
  204. package/dist/types/renderers/domrenderer/svgrenderer/SvgRenderer.test.d.ts +0 -1
  205. package/dist/types/renderers/domrenderer/svgrenderer/arrowDrawing.test.d.ts +0 -1
  206. package/dist/types/renderers/domrenderer/svgrenderer/nodeDrawing.test.d.ts +0 -1
  207. package/dist/types/renderers/domrenderer/svgrenderer/svgUtils.test.d.ts +0 -1
  208. package/dist/types/renderers/webglrenderer/Controller.test.d.ts +0 -1
  209. package/dist/types/renderers/webglrenderer/IconLayerRegistry.test.d.ts +0 -1
  210. package/dist/types/renderers/webglrenderer/Renderer.test.d.ts +0 -1
  211. package/dist/types/utils/ariaUtils.test.d.ts +0 -1
  212. package/dist/types/utils/canvasManagement.test.d.ts +0 -1
  213. package/dist/types/utils/circularUtils.test.d.ts +0 -1
  214. package/dist/types/utils/clusterGeometry.test.d.ts +0 -1
  215. package/dist/types/utils/clusterHitRegions.test.d.ts +0 -1
  216. package/dist/types/utils/colorUtils.test.d.ts +0 -1
  217. package/dist/types/utils/errors.test.d.ts +0 -1
  218. package/dist/types/utils/geometry.test.d.ts +0 -1
  219. package/dist/types/utils/graphObjectUtils.test.d.ts +0 -1
  220. package/dist/types/utils/hitTest.test.d.ts +0 -1
  221. package/dist/types/utils/jsDriverResultTransformer.test.d.ts +0 -1
  222. package/dist/types/utils/layoutSeeding.test.d.ts +0 -1
  223. package/dist/types/utils/mouseUtils.test.d.ts +0 -1
  224. package/dist/types/utils/webWorkerUtils.test.d.ts +0 -1
  225. package/dist/types/utils/zoomFunctions.test.d.ts +0 -1
  226. package/skills/neo4j-nvl-skill/references/api-surface.md +0 -596
  227. package/skills/neo4j-nvl-skill/references/troubleshooting.md +0 -317
@@ -1,456 +1,296 @@
1
1
  ---
2
2
  name: neo4j-nvl-skill
3
+ metadata:
4
+ package: '@neo4j-nvl/base'
5
+ version: '2.0.0-ec6fdba7'
3
6
  description: Neo4j Visualization Library (NVL) — framework-agnostic graph rendering for the browser.
4
7
  Covers @neo4j-nvl/base (NVL class, nodes/relationships, Canvas vs WebGL renderer),
5
- @neo4j-nvl/interaction-handlers (ZoomInteraction, PanInteraction, DragNodeInteraction, ClickInteraction,
6
- HoverInteraction, BoxSelectInteraction, LassoInteraction, KeyboardInteraction), and @neo4j-nvl/react
7
- (InteractiveNvlWrapper, BasicNvlWrapper, StaticPictureWrapper). Use when rendering a Neo4j graph in
8
- a browser, feeding driver results through nvlResultTransformer, choosing Canvas vs WebGL,
9
- wiring node/relationship click/hover/drag handlers, or embedding NVL in React, Vite,
10
- or vanilla JS apps.
11
- Does NOT handle Cypher query authoring — use neo4j-cypher-skill.
12
- Does NOT handle driver lifecycle, sessions, or executeQuery setup — use neo4j-driver-javascript-skill.
13
- Does NOT handle GraphVisualization/Needle default embed — use @neo4j-ndl/react.
14
- compatibility: "@neo4j-nvl packages 2.0.x; React 19 for @neo4j-nvl/react; modern browsers with Canvas2D + WebGL2"
15
- version: 2.0.0
8
+ @neo4j-nvl/interaction-handlers (zoom, pan, drag, click, hover, box/lasso select, keyboard) and
9
+ @neo4j-nvl/react (InteractiveNvlWrapper, BasicNvlWrapper, StaticPictureWrapper). Use when rendering
10
+ a Neo4j graph in a browser, feeding driver results through nvlResultTransformer, choosing Canvas vs
11
+ WebGL, clustering or laying out nodes, wiring node/relationship/cluster interactions, or embedding
12
+ NVL in React, Vite or vanilla JS apps.
13
+ Does NOT handle Cypher authoring — use neo4j-cypher-skill.
14
+ Does NOT handle driver lifecycle, sessions or executeQuery setup — use neo4j-driver-javascript-skill.
15
+ Does NOT handle the pre-styled GraphVisualization embed — use @neo4j-ndl/react.
16
+ compatibility: '@neo4j-nvl packages 2.x; React 19 for @neo4j-nvl/react; browsers with Canvas2D and WebGL2'
16
17
  ---
17
18
 
18
- > **Version note:** This skill documents the NVL version in `compatibility`. If the project's installed `@neo4j-nvl/base` is a different version and `node_modules/@neo4j-nvl/base/skills/neo4j-nvl-skill/SKILL.md` exists, read that copy instead.
19
+ [//]: # (This file is auto-generated by scripts/docs/generate-skills.mjs, do not edit it manually)
19
20
 
20
- ## When to Use
21
- - Rendering a Neo4j graph in a browser (vanilla JS, React, Vite) with custom interactions, rendering, or data shapes
22
- - Visualizing `driver.executeQuery` results as an interactive graph
23
- - Wiring zoom, pan, drag, click, hover, lasso, or box-select interactions
24
- - Embedding NVL inside an existing app and synchronizing graph state
25
-
26
- ## When NOT to Use
27
- - **Pre-styled embedded graph view with default behavior, no custom interactions** → `GraphVisualization` from `@neo4j-ndl/react` (Neo4j Needle / NDL design system) — wraps NVL with default Neo4j styling. See [Use NVL or the Needle Component?](#use-nvl-or-the-needle-component) below.
28
- - **Python / Jupyter notebook graph visualization** → `neo4j/python-graph-visualization` (the Python port of NVL)
29
- - **Writing/optimizing Cypher** → `neo4j-cypher-skill`
30
- - **Driver setup / executeQuery / sessions** → `neo4j-driver-javascript-skill`
31
- - **Server-side data fetching with no rendering** → `neo4j-driver-javascript-skill`
32
- - **GDS algorithm execution** → `neo4j-gds-skill` or `neo4j-aura-graph-analytics-skill`
33
- - **GraphQL API** → `neo4j-graphql-skill`
21
+ # Neo4j Visualization Library (@neo4j-nvl/base)
34
22
 
35
- ---
23
+ > Shipped with `@neo4j-nvl/base` v2.0.0-ec6fdba7. Once installed into a project this folder is detached from the
24
+ > package: the installed types in `node_modules/@neo4j-nvl/*` are the source of truth. If the project's
25
+ > `@neo4j-nvl/base` is a different version and `node_modules/@neo4j-nvl/base/skills/neo4j-nvl-skill/SKILL.md`
26
+ > exists, read that copy instead.
36
27
 
37
- ## Use NVL or the Needle Component?
28
+ ## When to use
29
+
30
+ - Rendering a Neo4j graph in the browser with custom interactions, rendering or data shapes
31
+ - Visualizing `driver.executeQuery` results as an interactive graph
32
+ - Zoom, pan, drag, click, hover, lasso or box-select interactions; clustering; custom layouts
33
+
34
+ Not for: a pre-styled graph view with default behaviour (`GraphVisualization` from `@neo4j-ndl/react` wraps
35
+ NVL for that), Python notebooks (`neo4j/python-graph-visualization`), Cypher, driver setup, GDS or GraphQL.
36
+
37
+ ## Rules
38
+
39
+ - **Types win.** Confirm every option, callback and method against this skill or the `.d.ts` files in
40
+ `node_modules/@neo4j-nvl/*` before using it. If they disagree, trust the types and say so.
41
+ - **Never invent options.** NVL options and callbacks are flat, named keys. If a key is not in the API
42
+ reference below or the types, it does not exist.
43
+ - **Do not reverse-engineer from compiled `dist/` or `lib/` output.** Use the types and these docs.
44
+ - **Symptom first.** When something does not work, check the table below before changing code.
45
+
46
+ ## Before you code
47
+
48
+ 1. The container has explicit `width` **and** `height`; otherwise the graph is invisible.
49
+ 2. React wrappers: `layout`, `layoutOptions` and every other option go inside `nvlOptions`.
50
+ 3. Wheel zoom in `<InteractiveNvlWrapper>` is enabled by `mouseEventCallbacks.onZoomAndPan`; there is no `onZoom`.
51
+ 4. `fit()` needs explicit node ids. `fit([])` fits nothing.
52
+ 5. The WebGL renderer draws no captions. Use `'canvas'` when labels matter, or `html` / `icon` overlays.
53
+ 6. If the hierarchical layout never finishes under the Vite dev server, add `optimizeDeps: { include: ['bin-pack'] }`. Vite 7.3 pre-bundles it on its own, so only apply it when the symptom appears.
54
+ 7. `nvlResultTransformer` returns bare `{ id }` elements; labels and properties are in `recordObjectMap`.
55
+ 8. React: `nvlCallbacks` are captured once; use refs or stable functions. `interactionOptions` replaces
56
+ the defaults, so pass every option you need.
57
+ 9. Destroy interaction handlers, then `nvl.destroy()`, on teardown. The React wrappers do this for you.
58
+
59
+ ## Symptom → cause → fix
60
+
61
+ | Symptom | Cause | Fix |
62
+ |---|---|---|
63
+ | Graph invisible / blank | Container has no height | Explicit `width` and `height` on the container |
64
+ | Wheel does not zoom (React) | Zoom handler only wired from `onZoomAndPan` | `mouseEventCallbacks={{ onZoomAndPan: true }}` → [react-wrappers](references/react-wrappers.md) |
65
+ | Hierarchical layout never finishes (Vite dev) | Layout `SharedWorker` imports CJS `bin-pack`; seen on older Vite, not on 7.3 | `optimizeDeps: { include: ['bin-pack'] }` → [vite-and-bundlers](references/vite-and-bundlers.md) |
66
+ | No text on nodes with WebGL | Captions are Canvas-only | `html` / `icon`, own overlay, or `setRenderer('canvas')` → [labels-and-overlays](references/labels-and-overlays.md) |
67
+ | `fit([])` does nothing | Empty array = no nodes | `fit(nvl.getNodes().map((n) => n.id))` |
68
+ | `fit()` stops zoomed in on a huge graph | `minZoom` clamp (default `0.075`) | `fit(ids, { minZoom })` or lower the `minZoom` option |
69
+ | Clicking a cluster selects all its nodes | `selectOnClick` selects `cluster.nodeIds` | `selectOnClick: false` and select in `onNodeClick` → [clustering](references/clustering.md) |
70
+ | No cluster outlines / halos | Not force-directed, or mixed colours (halo) | Force-directed with `layoutOptions.clustering`; one colour per cluster → [clustering](references/clustering.md) |
71
+ | Pinned nodes move when clustering is on | Cluster forces ignore pins | Do not combine → [clustering](references/clustering.md) |
72
+ | Changing circle options does nothing | Layout is not re-run on option change | Bounce via `setLayout('free')` → [layouts-and-positions](references/layouts-and-positions.md) |
73
+ | Un-pinned nodes stay frozen | Settled simulation is not restarted | `setNodePositions(current, true)` → [layouts-and-positions](references/layouts-and-positions.md) |
74
+ | Node `x`/`y` props do not move existing nodes | Positions apply on insert only | `setNodePositions` → [layouts-and-positions](references/layouts-and-positions.md) |
75
+ | Callbacks see stale state (React) | `nvlCallbacks` captured at creation | Refs or stable functions → [react-wrappers](references/react-wrappers.md) |
76
+ | Minimap empty (React) | Container did not exist at creation | Keep the element in state → [react-wrappers](references/react-wrappers.md) |
77
+ | Hover / shadow defaults lost | `interactionOptions` replaces defaults | Pass every option → [react-wrappers](references/react-wrappers.md) |
78
+ | Many icons not drawn | Too many distinct icon images | Fewer distinct icons → [labels-and-overlays](references/labels-and-overlays.md) |
79
+ | Layout looks hung in headless Chrome | Software WebGL | Hardware-GL flags → [verifying-nvl-apps](references/verifying-nvl-apps.md) |
80
+ | Raw `executeQuery` result passed to NVL | Records are not graph elements | `resultTransformer: nvlResultTransformer` → [data-from-neo4j](references/data-from-neo4j.md) |
81
+
82
+ ## Choose
83
+
84
+ **NVL or Needle?** Default Neo4j styling and no custom interaction → `GraphVisualization` from `@neo4j-ndl/react`.
85
+ Anything custom → NVL.
38
86
 
39
87
  | Need | Use |
40
88
  |---|---|
41
- | Embed a graph view with default Neo4j styling, no custom interactions or rendering | `GraphVisualization` from `@neo4j-ndl/react` (Neo4j Needle / NDL design system) — wraps NVL and accepts records shaped `{ id, labels, properties: { key: { stringified, type } } }` (`NeoNode`) |
42
- | Custom interactions, custom rendering, non-standard data shapes, or framework-agnostic embedding | This skill — use NVL directly |
89
+ | React, default interactions | `<InteractiveNvlWrapper>` from `@neo4j-nvl/react` |
90
+ | React, custom interaction logic | `<BasicNvlWrapper>` + `ref` to the `NVL` instance |
91
+ | Vanilla, standard interactions | `NVL` + `@neo4j-nvl/interaction-handlers` |
92
+ | Vanilla, custom events | `NVL` + `container.addEventListener` + `nvl.getHits()` |
93
+ | Static PNG / SVG | `<StaticPictureWrapper>` or `nvl.saveToFile()` / `nvl.saveToSvg()` |
43
94
 
44
- If the answer is the first row, install and use the Needle component instead of NVL — do not duplicate styling work.
95
+ | Renderer | Nodes | Notes |
96
+ |---|---|---|
97
+ | `'canvas'` (default) | up to ~1,000 | Captions, icons, arrows, exact hit-testing |
98
+ | `'webgl'` | 100,000+ | WebGL2 only; no captions; icons and arrowheads supported |
45
99
 
46
- ---
100
+ `disableWebGL: true` forces Canvas rendering and non-GPU layouts.
47
101
 
48
102
  ## Install
49
103
 
50
104
  ```bash
51
- npm install @neo4j-nvl/base # core (required)
52
- npm install @neo4j-nvl/interaction-handlers # standard interactions (optional, vanilla JS)
53
- npm install @neo4j-nvl/react # React wrappers (optional)
105
+ npm install @neo4j-nvl/base # required
106
+ npm install @neo4j-nvl/interaction-handlers # vanilla interactions
107
+ npm install @neo4j-nvl/react # React wrappers (React 19)
54
108
  ```
55
109
 
56
- Peer requirements: **React 19** for `@neo4j-nvl/react`. The published peerDependency range still permits React 18, but mixing major versions is not recommended — target 19. `@neo4j-nvl/layout-workers` is a transitive dependency — never install directly. `neo4j-driver` is a peer of `@neo4j-nvl/base` only when using `nvlResultTransformer`.
57
-
58
- Starter templates: https://github.com/neo4j-devtools/nvl-boilerplates — official per-framework scaffolds; prefer these over hand-rolled setups.
59
-
60
- License: NVL ships under the **Neo4j Visualization Library License** — for use with Neo4j products only. Cannot be used against other graph backends.
61
-
62
- ---
63
-
64
- ## Pick the Right Paradigm
65
-
66
- | Need | Use |
67
- |---|---|
68
- | React app, default interactions | `<InteractiveNvlWrapper>` from `@neo4j-nvl/react` |
69
- | React app, custom interaction wiring | `<BasicNvlWrapper>` + own handlers via `ref` |
70
- | Vanilla JS, standard interactions | `NVL` + `@neo4j-nvl/interaction-handlers` |
71
- | Vanilla JS, fully custom event logic | `NVL` + `container.addEventListener` + `nvl.getHits()` |
72
- | Static PNG/SVG image export | `<StaticPictureWrapper>` or `nvl.saveToFile()` / `nvl.saveToSvg()` |
73
-
74
- ---
75
-
76
- ## Pick the Right Renderer
77
-
78
- | Renderer | Max nodes | Detail | Use case |
79
- |---|---|---|---|
80
- | `'canvas'` (default) | ~1,000 | Captions, icons, arrows, pixel-perfect hit-testing | Detail investigation, small graphs |
81
- | `'webgl'` | 100,000+ | No captions; supports node icons and relationship arrowheads in 2.0 | Large-scale pattern exploration |
82
-
83
- ```javascript
84
- const nvl = new NVL(container, nodes, rels, { renderer: 'webgl' })
85
- nvl.setRenderer('canvas') // swap at runtime
86
- ```
87
-
88
- NVL 2.0 requires **WebGL2** for the GPU renderer and force-directed physics engine. When GPU acceleration is unavailable, NVL can fall back to Canvas rendering and non-GPU layout implementations; use `disableWebGL: true` to explicitly avoid WebGL.
89
-
90
- ---
91
-
92
- ## Container Setup
93
-
94
- The container must have an explicit `width` AND `height`. Missing height → container collapses to `0` → graph invisible. Most-reported NVL bug.
95
-
96
- ```html
97
- <!-- ❌ height defaults to 0; graph invisible -->
98
- <div id="viz"></div>
99
-
100
- <!-- ✅ explicit dimensions -->
101
- <div id="viz" style="width: 100%; height: 600px;"></div>
102
- ```
103
-
104
- ---
105
-
106
- ## Vanilla — Base Library
107
-
108
- ```javascript
109
- import { NVL } from '@neo4j-nvl/base'
110
-
111
- const container = document.getElementById('viz')
112
- const nodes = [{ id: '1' }, { id: '2' }]
113
- const relationships = [{ id: '12', from: '1', to: '2', type: 'KNOWS' }]
110
+ `@neo4j-nvl/layout-workers` is transitive; never install it directly. `neo4j-driver` is only needed for
111
+ `nvlResultTransformer`. License: Neo4j Visualization Library License, for use with Neo4j products.
112
+ Starters: https://github.com/neo4j-devtools/nvl-boilerplates
114
113
 
115
- const nvl = new NVL(container, nodes, relationships)
116
- ```
117
-
118
- With options + callbacks:
114
+ ## Minimal examples
119
115
 
120
116
  ```javascript
121
117
  import { NVL } from '@neo4j-nvl/base'
118
+ import { ClickInteraction, ZoomInteraction, PanInteraction, DragNodeInteraction } from '@neo4j-nvl/interaction-handlers'
122
119
 
123
- const options = {
124
- initialZoom: 1.0,
125
- minZoom: 0.1,
126
- maxZoom: 8,
127
- layout: 'forceDirected',
128
- renderer: 'canvas',
129
- styling: { defaultNodeColor: '#0e86d4', defaultRelationshipColor: '#888' }
130
- }
131
- const callbacks = {
132
- onInitialization: () => console.log('NVL ready'),
133
- onLayoutDone: () => nvl.fit([]),
134
- onError: (err) => console.error('NVL error', err)
135
- }
136
-
137
- const nvl = new NVL(container, nodes, relationships, options, callbacks)
138
-
139
- // On teardown — always:
140
- nvl.destroy()
141
- ```
142
-
143
- `NVL` constructor signature: `new NVL(frame, nvlNodes?, nvlRels?, options?, callbacks?)`. All but `frame` are optional and default to empty.
144
-
145
- ---
146
-
147
- ## Vanilla — Interaction Handlers
148
-
149
- Compose handlers onto an existing `NVL` instance. Each handler registers callbacks via `.updateCallback(name, fn)` and must be torn down with `.destroy()`.
150
-
151
- ```javascript
152
- import { NVL } from '@neo4j-nvl/base'
153
- import {
154
- ZoomInteraction, PanInteraction, DragNodeInteraction,
155
- ClickInteraction, HoverInteraction, BoxSelectInteraction,
156
- LassoInteraction, KeyboardInteraction
157
- } from '@neo4j-nvl/interaction-handlers'
158
-
159
- const nvl = new NVL(container, nodes, relationships)
160
-
161
- const zoom = new ZoomInteraction(nvl)
162
- const pan = new PanInteraction(nvl)
163
- const drag = new DragNodeInteraction(nvl)
164
- const click = new ClickInteraction(nvl, { selectOnClick: true })
165
- const hover = new HoverInteraction(nvl, { drawShadowOnHover: true })
166
-
167
- click.updateCallback('onNodeClick', (node, hits, evt) => console.log('node', node.id))
168
- click.updateCallback('onRelationshipClick', (rel, hits, evt) => console.log('rel', rel.id))
169
- click.updateCallback('onClusterClick', (cluster, hits, evt) => console.log('cluster', cluster.id))
170
- click.updateCallback('onCanvasClick', (evt) => console.log('canvas'))
171
- hover.updateCallback('onHover', (el, hits, evt) => el && console.log('over', el.id))
172
- drag.updateCallback('onDragEnd', (nodes, evt) => savePositions(nodes))
173
- zoom.updateCallback('onZoomAndPan', (level, panX, panY) => console.log(level, panX, panY))
174
-
175
- // Teardown — destroy all handlers, then the NVL instance
176
- function teardown() {
177
- for (const h of [zoom, pan, drag, click, hover]) h.destroy()
178
- nvl.destroy()
179
- }
120
+ const nodes = [{ id: '1', caption: 'A' }, { id: '2', caption: 'B' }]
121
+ const rels = [{ id: '12', from: '1', to: '2', type: 'KNOWS' }]
122
+ const nvl = new NVL(container, nodes, rels, { layout: 'forceDirected' }, {
123
+ onLayoutDone: () => nvl.fit(nodes.map((n) => n.id))
124
+ })
125
+ const handlers = [new ZoomInteraction(nvl), new PanInteraction(nvl), new DragNodeInteraction(nvl),
126
+ new ClickInteraction(nvl, { selectOnClick: true })]
127
+ handlers[3].updateCallback('onNodeClick', (node) => console.log(node.id))
128
+ // teardown: handlers.forEach((h) => h.destroy()); nvl.destroy()
180
129
  ```
181
130
 
182
- Disable an event without removing the handler: `click.removeCallback('onCanvasClick')`. Passing `true` instead of a function enables the event with a no-op (useful for default selection behavior).
183
-
184
- ---
185
-
186
- ## React — InteractiveNvlWrapper
187
-
188
- Pre-wires every interaction handler. Toggle events with `mouseEventCallbacks` (function = on + callback; `true` = on, no-op; `false`/omit = off).
189
-
190
131
  ```tsx
191
132
  import { InteractiveNvlWrapper } from '@neo4j-nvl/react'
192
- import type { MouseEventCallbacks } from '@neo4j-nvl/react'
133
+ import type { NVL } from '@neo4j-nvl/base'
193
134
  import { useRef } from 'react'
194
- import type { NVL, NvlOptions } from '@neo4j-nvl/base'
195
135
 
196
- export function GraphView({ nodes, rels }) {
136
+ export function Graph({ nodes, rels }) {
197
137
  const nvlRef = useRef<NVL>(null)
198
-
199
- const nvlOptions: NvlOptions = { initialZoom: 1, renderer: 'canvas' }
200
-
201
- const mouseEventCallbacks: MouseEventCallbacks = {
202
- onNodeClick: (node, hits, evt) => console.log('node', node.id),
203
- onRelationshipClick: (rel, hits, evt) => console.log('rel', rel.id),
204
- onClusterClick: (cluster, hits, evt) => console.log('cluster', cluster.id),
205
- onCanvasClick: (evt) => console.log('canvas'),
206
- onHover: (el, hits, evt) => {
207
- if (el) console.log('hover', el.id)
208
- if (hits.clusters[0]) console.log('cluster hover', hits.clusters[0].data.id)
209
- },
210
- onDragEnd: (nodes, evt) => persist(nodes),
211
- onZoomAndPan: true, // enable, no callback
212
- onPan: true
213
- }
214
-
215
138
  return (
216
139
  <div style={{ width: '100%', height: 600 }}>
217
140
  <InteractiveNvlWrapper
218
141
  ref={nvlRef}
219
142
  nodes={nodes}
220
143
  rels={rels}
221
- nvlOptions={nvlOptions}
144
+ nvlOptions={{ layout: 'forceDirected', renderer: 'canvas' }}
222
145
  interactionOptions={{ selectOnClick: true, drawShadowOnHover: true }}
223
- mouseEventCallbacks={mouseEventCallbacks}
224
- onInitializationError={(err) => console.error('NVL init', err)}
225
- />
226
- </div>
227
- )
228
- }
229
- ```
230
-
231
- `ref` resolves to the underlying `NVL` instance — call any method on it: `nvlRef.current?.fit([])`, `nvlRef.current?.setRenderer('webgl')`, `nvlRef.current?.saveToFile()`.
232
-
233
- ---
234
-
235
- ## NVL 2.0 — Layout Clustering
236
-
237
- `clusterBy` groups nodes whose callback returns the same string or number. Return `undefined` for independent nodes. Keep the callback reference stable in React with `useCallback`.
238
-
239
- Force-directed clustering nests all clustering settings under `layoutOptions.clustering`:
240
-
241
- ```javascript
242
- const clusterBy = (nodeId) => categoryByNodeId[nodeId]
243
-
244
- const nvl = new NVL(container, nodes, relationships, {
245
- layout: 'forceDirected',
246
- layoutOptions: {
247
- seedingMethod: 'circle',
248
- clustering: {
249
- clusterBy,
250
- drawOutline: true,
251
- drawHalo: true,
252
- crossClusterRelationshipMultiplier: 0.2
253
- }
254
- },
255
- minFps: 3,
256
- maxFps: 30
257
- })
258
- ```
259
-
260
- `crossClusterRelationshipMultiplier` is experimental, capped to `0..1`, and can destabilize highly connected graphs near `1`. It affects cross-cluster spring pull only; intra-cluster edges remain full strength.
261
-
262
- Hierarchical clustering places `clusterBy` directly in `layoutOptions`:
263
-
264
- ```javascript
265
- const nvl = new NVL(container, nodes, relationships, {
266
- layout: 'hierarchical',
267
- layoutOptions: {
268
- direction: 'down',
269
- clusterBy
270
- }
271
- })
272
- ```
273
-
274
- Cluster decorations and cluster hull interactions apply to force-directed `layoutOptions.clustering`. A `Cluster` is not a graph element; it has `{ id: string | number, nodeIds: string[] }`. Cluster callbacks fire only for empty space inside a cluster hull; node and relationship hits retain priority.
275
-
276
- ---
277
-
278
- ## Migrating from NVL 1.x to 2.0
279
-
280
- - Move React wrapper `layout` and `layoutOptions` props into `nvlOptions`:
281
- `<InteractiveNvlWrapper nvlOptions={{ layout, layoutOptions }} />`.
282
- - Replace interaction callback `onZoom` with `onZoomAndPan(zoom, panX, panY, event)`.
283
- - Remove `intelWorkaround` and Cytoscape-related layout settings; they no longer exist.
284
- - Treat WebGL as WebGL2-only and do not expect captions in the WebGL renderer.
285
- - `getNodes()` and `onLayoutStep` return `NodeWithClientPosition[]`: `x`/`y` are layout coordinates and `clientPosition` is relative to the canvas element.
286
- - Use `styling.overlayLineColor`; `styling.minimapViewportBoxColor` is deprecated.
287
-
288
- ---
289
-
290
- ## React — BasicNvlWrapper + Ref
291
-
292
- No interactions wired. The ref exposes every NVL method via `IncludeMethods<NVL>` — use when building custom interaction logic in React.
293
-
294
- ```tsx
295
- import { BasicNvlWrapper } from '@neo4j-nvl/react'
296
- import type { NVL } from '@neo4j-nvl/base'
297
- import { useRef } from 'react'
298
-
299
- export function MiniGraph({ nodes, rels }) {
300
- const nvlRef = useRef<NVL>(null)
301
-
302
- return (
303
- <div style={{ width: '100%', height: 400 }}>
304
- <BasicNvlWrapper
305
- ref={nvlRef}
306
- nodes={nodes}
307
- rels={rels}
308
- nvlOptions={{ initialZoom: 2 }}
309
- nvlCallbacks={{ onLayoutDone: () => nvlRef.current?.fit([]) }}
146
+ mouseEventCallbacks={{
147
+ onNodeClick: (node) => console.log(node.id),
148
+ onZoomAndPan: true,
149
+ onPan: true,
150
+ onDrag: true
151
+ }}
152
+ nvlCallbacks={{ onLayoutDone: () => nvlRef.current?.fit(nodes.map((n) => n.id)) }}
310
153
  />
311
- <button onClick={() => nvlRef.current?.fit(['1', '2'])}>Zoom to 1,2</button>
312
154
  </div>
313
155
  )
314
156
  }
315
157
  ```
316
158
 
317
- ---
159
+ ## Topic guides
160
+
161
+ Read the one that matches the task before writing code.
162
+
163
+ - [references/data-from-neo4j.md](references/data-from-neo4j.md) — `nvlResultTransformer` output, `recordObjectMap`, enriching nodes, Integer and temporal values
164
+ - [references/react-wrappers.md](references/react-wrappers.md) — callback-to-handler mapping, stale callbacks, live vs creation-time options, minimap container
165
+ - [references/clustering.md](references/clustering.md) — `clusterBy` per layout, outlines and halos, cluster click and hover, pins
166
+ - [references/layouts-and-positions.md](references/layouts-and-positions.md) — when layouts re-run, `setNodePositions`, pinning, layout callbacks
167
+ - [references/labels-and-overlays.md](references/labels-and-overlays.md) — captions vs `html` / `icon` / `overlayIcon`, coordinates for custom overlays
168
+ - [references/vite-and-bundlers.md](references/vite-and-bundlers.md) — worker setup per bundler, dev vs production, `disableWebWorkers`
169
+ - [references/verifying-nvl-apps.md](references/verifying-nvl-apps.md) — `window.__Nvl_*` hooks, headless Chrome flags, detecting a settled layout
170
+ - [references/lifecycle-and-updates.md](references/lifecycle-and-updates.md) — add/update/remove methods, `restart`, teardown, context loss, telemetry, `onError`
171
+ - [references/migrating-1x-to-2.md](references/migrating-1x-to-2.md) — removed options and renamed callbacks
172
+
173
+ ## API reference
174
+
175
+ Generated from the installed version's type declarations. Open the page for the symbol you need; do not
176
+ load all of them.
177
+
178
+ ### `@neo4j-nvl/base`
179
+
180
+ NVL class, options, callbacks, graph element types, hit testing, nvlResultTransformer.
181
+
182
+ **Classes**
318
183
 
319
- ## Wiring a Neo4j Driver Result
184
+ - [NVL](references/api/base/classes/NVL.md) — Class for a NVL instance.
185
+
186
+ **Functions**
187
+
188
+ - [getZoomTargetForNodePositions](references/api/base/functions/getZoomTargetForNodePositions.md) — Gets the zoom target to fit the given node positions into the scene.
189
+
190
+ **Interfaces**
320
191
 
321
- `@neo4j-nvl/base` exports a `ResultTransformer` for the JS driver that deduplicates nodes/relationships across any record shape.
192
+ - [CircularOptions](references/api/base/interfaces/CircularOptions.md) — The options for the circular layout.
193
+ - [ClusteringOptions](references/api/base/interfaces/ClusteringOptions.md) — Options that control physical clustering and cluster decorations for the force-directed layout.
194
+ - [ExternalCallbacks](references/api/base/interfaces/ExternalCallbacks.md) — An object specifying the required callback functions for certain actions
195
+ - [ForceDirectedOptions](references/api/base/interfaces/ForceDirectedOptions.md) — The options for the force directed layout
196
+ - [HierarchicalOptions](references/api/base/interfaces/HierarchicalOptions.md) — The options for the hierarchical layout
197
+ - [HitTargetCluster](references/api/base/interfaces/HitTargetCluster.md) — A ClusteringOptions.clusterBy cluster hull that has been hit by a pointer event
198
+ - [HitTargetNode](references/api/base/interfaces/HitTargetNode.md) — A node that has been hit by a pointer event
199
+ - [HitTargetRelationship](references/api/base/interfaces/HitTargetRelationship.md) — A relationship that has been hit by a pointer event
200
+ - [Node](references/api/base/interfaces/Node.md) — A node inside the graph visualization.
201
+ - [NvlMouseEvent](references/api/base/interfaces/NvlMouseEvent.md) — The result of a NVL.getHits call.
202
+ - [NvlOptions](references/api/base/interfaces/NvlOptions.md) — Configurations for a NVL instance
203
+ - [Point](references/api/base/interfaces/Point.md) — An object representing a point in 2D space.
204
+ - [Relationship](references/api/base/interfaces/Relationship.md) — A relationship inside the graph visualization.
322
205
 
323
- ```javascript
324
- import neo4j from 'neo4j-driver'
325
- import { NVL, nvlResultTransformer } from '@neo4j-nvl/base'
206
+ **Types**
326
207
 
327
- const driver = neo4j.driver(process.env.NEO4J_URI,
328
- neo4j.auth.basic(process.env.NEO4J_USERNAME, process.env.NEO4J_PASSWORD))
208
+ - [CanvasRendererType](references/api/base/type-aliases/CanvasRendererType.md) — A renderer using canvas.
209
+ - [Cluster](references/api/base/type-aliases/Cluster.md) — A physical cluster produced by ClusteringOptions.clusterBy.
210
+ - [ClusterByFn](references/api/base/type-aliases/ClusterByFn.md) — Function that maps a node id to a ClusterId for force-directed clustering.
211
+ - [ClusterId](references/api/base/type-aliases/ClusterId.md) — Identifier returned by ClusterByFn to group nodes into physical clusters.
212
+ - [HitTargets](references/api/base/type-aliases/HitTargets.md) — A collection of nodes, relationships and clusters that have been hit by a pointer event
213
+ - [HitTestTarget](references/api/base/type-aliases/HitTestTarget.md)
214
+ - [Layout](references/api/base/type-aliases/Layout.md) — The different types of layouts available
215
+ - [LayoutOptions](references/api/base/type-aliases/LayoutOptions.md) — The options for the layout.
216
+ - [NodeWithClientPosition](references/api/base/type-aliases/NodeWithClientPosition.md) — A node returned by NVL.getNodes with layout coordinates and screen position.
217
+ - [PartialNode](references/api/base/type-aliases/PartialNode.md) — A node with only a subset of its properties.
218
+ - [PartialRelationship](references/api/base/type-aliases/PartialRelationship.md) — A relationship with only a subset of its properties.
219
+ - [Renderer](references/api/base/type-aliases/Renderer.md) — The different types of renderers available
220
+ - [StyledCaption](references/api/base/type-aliases/StyledCaption.md) — The caption text and its text style.
221
+ - [WebGLRendererType](references/api/base/type-aliases/WebGLRendererType.md) — A WebGL2 renderer that uses the GPU for rendering.
222
+ - [ZoomOptions](references/api/base/type-aliases/ZoomOptions.md) — Options that influence how fit-to-zoom should behave
329
223
 
330
- const { nodes, relationships } = await driver.executeQuery(
331
- 'MATCH (a)-[r]-(b) RETURN a, r, b LIMIT 25',
332
- {},
333
- { database: 'neo4j', resultTransformer: nvlResultTransformer }
334
- )
224
+ **Variables**
335
225
 
336
- const nvl = new NVL(document.getElementById('viz'), nodes, relationships)
337
- ```
226
+ - [CircularLayoutType](references/api/base/variables/CircularLayoutType.md) — A basic circular layout.
227
+ - [d3ForceLayoutType](references/api/base/variables/d3ForceLayoutType.md) — The commonly used d3-force layout.
228
+ - [ForceDirectedLayoutType](references/api/base/variables/ForceDirectedLayoutType.md) — NVL's main force directed layout.
229
+ - [FreeLayoutType](references/api/base/variables/FreeLayoutType.md) — A free layout that allows for arbitrary positioning of elements using NVL's setPosition method.
230
+ - [GridLayoutType](references/api/base/variables/GridLayoutType.md) — A basic grid layout.
231
+ - [HierarchicalLayoutType](references/api/base/variables/HierarchicalLayoutType.md) — A hierarchical layout using the dagre algorithm.
232
+ - [nvlResultTransformer](references/api/base/variables/nvlResultTransformer.md) — Result transformer for the Neo4j JavaScript driver results to NVL graph elements.
338
233
 
339
- ```javascript
340
- // ❌ raw EagerResult — records are not Node/Relationship objects
341
- const result = await driver.executeQuery('MATCH (a)-[r]-(b) RETURN a, r, b')
342
- new NVL(container, result.records, []) // breaks
343
-
344
- // ✅ use the transformer
345
- const { nodes, relationships } = await driver.executeQuery(
346
- 'MATCH (a)-[r]-(b) RETURN a, r, b',
347
- {},
348
- { database: 'neo4j', resultTransformer: nvlResultTransformer }
349
- )
350
- new NVL(container, nodes, relationships)
351
- ```
234
+ ### `@neo4j-nvl/interaction-handlers`
352
235
 
353
- For driver lifecycle, session management, Integer handling, and TypeScript types → `neo4j-driver-javascript-skill`.
354
-
355
- ---
236
+ Zoom, pan, drag, click, hover, box/lasso select, keyboard handlers and their callbacks.
356
237
 
357
- ## Updating the Graph
358
-
359
- | Method | Behavior |
360
- |---|---|
361
- | `addAndUpdateElementsInGraph(nodes, rels)` | Insert new; update existing by id (only specified fields) |
362
- | `updateElementsInGraph(nodes, rels)` | Update existing only; ignores unknown ids |
363
- | `addElementsToGraph(nodes, rels)` | Insert only; throws on existing id |
364
- | `removeNodesWithIds(ids)` | Remove nodes; adjacent relationships auto-removed |
365
- | `removeRelationshipsWithIds(ids)` | Remove relationships |
366
- | `setNodePositions(nodes, updateLayout?)` | Override positions; optionally re-run layout |
367
- | `restart(options?, retainPositions?)` | Restart with new options; positions optional |
368
-
369
- Diff updates use `PartialNode` / `PartialRelationship` — only `id` is required:
370
-
371
- ```javascript
372
- nvl.updateElementsInGraph(
373
- [{ id: '1', color: '#f00', selected: true }], // PartialNode
374
- [{ id: '12', width: 4 }] // PartialRelationship
375
- )
376
- ```
377
-
378
- ---
238
+ **Classes**
379
239
 
380
- ## Hit Testing (Manual)
240
+ - [BoxSelectInteraction](references/api/interaction-handlers/classes/BoxSelectInteraction.md) — An interaction handler for multi-selecting nodes and relationships.
241
+ - [ClickInteraction](references/api/interaction-handlers/classes/ClickInteraction.md) — Click interaction handler that handles click, double click and right click events on
242
+ - [DragNodeInteraction](references/api/interaction-handlers/classes/DragNodeInteraction.md) — Interaction handler for dragging nodes,
243
+ - [HoverInteraction](references/api/interaction-handlers/classes/HoverInteraction.md) — Interaction handler for hovering nodes and relationships.
244
+ - [KeyboardInteraction](references/api/interaction-handlers/classes/KeyboardInteraction.md) — Opinionated interaction handler for keyboard-driven focus navigation
245
+ - [LassoInteraction](references/api/interaction-handlers/classes/LassoInteraction.md) — An interaction handler that lets you select nodes and relationships by drawing a lasso around them.
246
+ - [PanInteraction](references/api/interaction-handlers/classes/PanInteraction.md) — Interaction handler for panning the scene, which is achieved by clicking and moving the scene.
247
+ - [ZoomInteraction](references/api/interaction-handlers/classes/ZoomInteraction.md) — Interaction handler for zooming the canvas, which is achieved by:
381
248
 
382
- Use when NOT using the interaction-handlers package. In 2.0, `getHits()` resolves nodes, relationships, and force-directed cluster hulls. Its default targets are `['node', 'relationship', 'cluster']`.
249
+ **Types**
383
250
 
384
- ```javascript
385
- const nvl = new NVL(container, nodes, rels)
386
-
387
- container.addEventListener('click', (evt) => {
388
- const { nvlTargets } = nvl.getHits(evt, ['node', 'relationship', 'cluster'], { hitNodeMarginWidth: 4 })
389
- const hitNode = nvlTargets.nodes[0]
390
- const hitRel = nvlTargets.relationships[0]
391
- const hitCluster = nvlTargets.clusters[0]
392
- if (hitNode) console.log('hit node', hitNode.data.id)
393
- else if (hitRel) console.log('hit rel', hitRel.data.id)
394
- else if (hitCluster) console.log('hit cluster', hitCluster.data.id, hitCluster.data.nodeIds)
395
- else console.log('hit canvas')
396
- })
397
- ```
398
-
399
- `HitTargetNode` / `HitTargetRelationship` carry element hit data. `HitTargetCluster` carries `data`, `pointerCoordinates`, and the fitted convex `hull`. See [references/api-surface.md](references/api-surface.md).
400
-
401
- ---
402
-
403
- ## Common Mistakes
404
-
405
- | Mistake | Fix |
406
- |---|---|
407
- | Container with no `height` → invisible graph | Set explicit `width` and `height` on the container |
408
- | Pass `driver.executeQuery` result directly | Use `nvlResultTransformer` and consume `{ nodes, relationships }` |
409
- | WebGL for small label-rich graphs | Use `'canvas'`; labels are fully supported |
410
- | Canvas for 10k+ nodes | Switch to `'webgl'` via `renderer` option or `setRenderer` |
411
- | New `NVL` per React render | Use `<InteractiveNvlWrapper>` / `<BasicNvlWrapper>` or wrap in `useEffect` + `destroy()` |
412
- | Forgetting `nvl.destroy()` on teardown | Call `destroy()` on unmount; React wrappers handle this automatically |
413
- | Vanilla handlers not torn down | Call `.destroy()` on every interaction before `nvl.destroy()` |
414
- | Worker construction blocked (strict CSP / sandboxed runtime / older bundler) | `nvlOptions: { disableWebWorkers: true }` (NVL has a non-worker fallback) |
415
- | Telemetry enabled in regulated env | `nvlOptions: { disableTelemetry: true }` |
416
- | Layout never settles | Pin anchor nodes with `pinNode(id)`; tune `layoutTimeLimit` |
417
- | `selectOnClick` fires double | Toggle once at mount; don't flip `interactionOptions` per render |
418
- | Hit test misses near node edge | Pass `{ hitNodeMarginWidth: N }` to `getHits` |
419
- | Captions missing on WebGL | Expected in 2.0; captions are Canvas-only, so use `'canvas'` when labels matter |
420
- | React wrapper ignores `layout` / `layoutOptions` | In 2.0 these must be nested in `nvlOptions` |
421
- | `onZoom` never fires | It was removed in 2.0; use `onZoomAndPan` |
422
- | Cluster callback misses clicks on a node | Cluster callbacks target empty cluster-hull space; node hits take priority |
423
-
424
- ---
425
-
426
- ## References
427
-
428
- Load on demand:
429
- - [references/api-surface.md](references/api-surface.md) — complete 2.0 `NVL` method table; clustering, FPS, seeding, `NodeWithClientPosition`, hit target and interaction callback types; React props; named exports; `nvlResultTransformer`
430
- - [references/troubleshooting.md](references/troubleshooting.md) — zero-height container, WebGL2 and Canvas trade-offs, clustering configuration, 1.x migration errors, worker fallback, context loss, telemetry, lifecycle, layout and hit-testing issues
431
-
432
- Canonical web documentation (use `WebFetch` when references above are insufficient):
433
- - https://neo4j.com/docs/nvl/current/ — user guide (installation, base library, interaction handlers, React wrappers)
434
- - https://neo4j.com/docs/api/nvl/current/ — TypeDoc API reference
435
- - https://neo4j.com/docs/api/nvl/current/examples.html — runnable examples
436
- - https://github.com/neo4j-devtools/nvl-boilerplates — official starter templates per supported framework
437
- - https://github.com/neo4j/python-graph-visualization — Python port of NVL (use this skill only for the JavaScript/browser path)
438
-
439
- ---
251
+ - [BoxSelectInteractionCallbacks](references/api/interaction-handlers/type-aliases/BoxSelectInteractionCallbacks.md) — Callbacks for the box select interaction handler.
252
+ - [BoxSelectInteractionOptions](references/api/interaction-handlers/type-aliases/BoxSelectInteractionOptions.md) — Options for the multi-select interaction handler to customize its behavior.
253
+ - [ClickInteractionCallbacks](references/api/interaction-handlers/type-aliases/ClickInteractionCallbacks.md) — Callbacks for the click interaction handler.
254
+ - [ClickInteractionOptions](references/api/interaction-handlers/type-aliases/ClickInteractionOptions.md) — Options for the click interaction handler to customize its behavior.
255
+ - [DragNodeInteractionCallbacks](references/api/interaction-handlers/type-aliases/DragNodeInteractionCallbacks.md) — Callbacks for the drag node interaction handler.
256
+ - [DrawInteractionOptions](references/api/interaction-handlers/type-aliases/DrawInteractionOptions.md) — Options for the draw interaction handler.
257
+ - [HoverInteractionCallbacks](references/api/interaction-handlers/type-aliases/HoverInteractionCallbacks.md) — Callbacks for the hover interaction handler.
258
+ - [HoverInteractionOptions](references/api/interaction-handlers/type-aliases/HoverInteractionOptions.md) — Options for the hover interaction handler to customize its behavior.
259
+ - [KeyboardInteractionCallbacks](references/api/interaction-handlers/type-aliases/KeyboardInteractionCallbacks.md) — Callbacks for the keyboard interaction handler.
260
+ - [KeyboardInteractionOptions](references/api/interaction-handlers/type-aliases/KeyboardInteractionOptions.md) — Options for the keyboard interaction handler.
261
+ - [LassoInteractionCallbacks](references/api/interaction-handlers/type-aliases/LassoInteractionCallbacks.md) — Callbacks for the lasso interaction handler.
262
+ - [LassoInteractionOptions](references/api/interaction-handlers/type-aliases/LassoInteractionOptions.md) — Options for the lasso interaction handler to customize its behavior.
263
+ - [PanInteractionCallbacks](references/api/interaction-handlers/type-aliases/PanInteractionCallbacks.md) — Callbacks for the pan interaction handler.
264
+ - [PanInteractionOptions](references/api/interaction-handlers/type-aliases/PanInteractionOptions.md) — Options for the pan interaction handler to customize its behavior.
265
+ - [ZoomInteractionCallbacks](references/api/interaction-handlers/type-aliases/ZoomInteractionCallbacks.md) — Callbacks for the zoom interaction handler.
266
+ - [ZoomInteractionOptions](references/api/interaction-handlers/type-aliases/ZoomInteractionOptions.md) — Options for the zoom interaction handler to customize its behavior.
267
+
268
+ ### `@neo4j-nvl/react`
269
+
270
+ InteractiveNvlWrapper, BasicNvlWrapper, StaticPictureWrapper and their props.
440
271
 
441
- ## Checklist
442
- - [ ] Container has explicit `width` AND `height` CSS
443
- - [ ] Correct paradigm chosen from the decision table (vanilla / handlers / React)
444
- - [ ] Renderer matches expected node count (Canvas ≲1k / WebGL 100k+)
445
- - [ ] Canvas selected whenever captions are required
446
- - [ ] React `layout` and `layoutOptions` nested inside `nvlOptions`
447
- - [ ] Zoom handlers use `onZoomAndPan`, not removed `onZoom`
448
- - [ ] `clusterBy` is stable in React and placed correctly for the selected layout
449
- - [ ] Driver `executeQuery` results piped through `nvlResultTransformer`
450
- - [ ] `database` specified on every `executeQuery` call (delegate to `neo4j-driver-javascript-skill`)
451
- - [ ] All interaction handlers `.destroy()`-ed before `nvl.destroy()` on teardown
452
- - [ ] `nvl.destroy()` called on React unmount (manual instances only — wrappers handle it)
453
- - [ ] `disableTelemetry: true` set when in regulated / offline environments
454
- - [ ] `disableWebWorkers: true` set when bundler / CSP blocks worker construction
455
- - [ ] Graph updates use `addAndUpdateElementsInGraph` / `updateElementsInGraph` — not `restart`
456
- - [ ] License compatible: target is a Neo4j product
272
+ **Functions**
273
+
274
+ - [StaticPictureWrapper](references/api/react/functions/StaticPictureWrapper.md) — A React component that creates a static picture of a graph using NVL.
275
+
276
+ **Interfaces**
277
+
278
+ - [BasicReactWrapperProps](references/api/react/interfaces/BasicReactWrapperProps.md) — The properties that can be passed to the BasicNvlWrapper component.
279
+ - [InteractiveNvlWrapperProps](references/api/react/interfaces/InteractiveNvlWrapperProps.md) — The properties that can be passed to the InteractiveNvlWrapper component.
280
+
281
+ **Types**
282
+
283
+ - [InteractionOptions](references/api/react/type-aliases/InteractionOptions.md) — Collection of interaction options that can be used with
284
+ - [KeyboardEvent](references/api/react/type-aliases/KeyboardEvent.md)
285
+ - [KeyboardEventCallbacks](references/api/react/type-aliases/KeyboardEventCallbacks.md) — Collection of keyboard event callbacks that can be used with
286
+ - [MouseEvent](references/api/react/type-aliases/MouseEvent.md) — The events that can be passed to the MouseEventCallbacks object
287
+ - [MouseEventCallbacks](references/api/react/type-aliases/MouseEventCallbacks.md) — Collection of mouse event callbacks that can be used with
288
+ - [StaticPictureWrapperProps](references/api/react/type-aliases/StaticPictureWrapperProps.md) — The properties that can be passed to the StaticPictureWrapper component.
289
+
290
+ **Variables**
291
+
292
+ - [BasicNvlWrapper](references/api/react/variables/BasicNvlWrapper.md) — A basic React wrapper that wraps the NVL base library within a React component.
293
+ - [InteractiveNvlWrapper](references/api/react/variables/InteractiveNvlWrapper.md) — The interactive React wrapper component contains a collection of interaction handlers by default
294
+
295
+ Web: user guide https://neo4j.com/docs/nvl/current/ · API https://neo4j.com/docs/api/nvl/current/ ·
296
+ examples https://neo4j.com/docs/api/nvl/current/examples.html