@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.
- package/CHANGELOG.md +23 -0
- package/dist/base.mjs +1062 -1058
- package/dist/types/index.d.ts +382 -385
- package/dist/types/layouts/animatedlayout/AnimatedLayout.d.ts +23 -23
- package/dist/types/layouts/animatedlayout/animationUtils.d.ts +3 -3
- package/dist/types/layouts/circularLayout/CircularLayout.d.ts +14 -14
- package/dist/types/layouts/d3forcelayout/circularLayout.d.ts +4 -4
- package/dist/types/layouts/d3forcelayout/constants.d.ts +3 -3
- package/dist/types/layouts/d3forcelayout/d3ForceLayout.d.ts +31 -31
- package/dist/types/layouts/d3forcelayout/types.d.ts +7 -7
- package/dist/types/layouts/forcedirectedlayout/PhysLayout.d.ts +261 -261
- package/dist/types/layouts/forcedirectedlayout/clustering/ClusterByMerger.d.ts +52 -52
- package/dist/types/layouts/forcedirectedlayout/clustering/SolarMerger.d.ts +49 -49
- package/dist/types/layouts/forcedirectedlayout/clustering/clustering-utils.d.ts +35 -35
- package/dist/types/layouts/forcedirectedlayout/clustering/types.d.ts +39 -39
- package/dist/types/layouts/forcedirectedlayout/glwrapper.d.ts +3 -3
- package/dist/types/layouts/forcedirectedlayout/shaders/multilevel-fragment.d.ts +1 -1
- package/dist/types/layouts/forcedirectedlayout/shaders/multilevel-repulsive-fragment.d.ts +1 -1
- package/dist/types/layouts/forcedirectedlayout/shaders/multilevel-update-fragment.d.ts +1 -1
- package/dist/types/layouts/forcedirectedlayout/shaders/sim-vertex.d.ts +1 -1
- package/dist/types/layouts/freeLayout/FreeLayout.d.ts +23 -23
- package/dist/types/layouts/gridLayout/GridLayout.d.ts +26 -26
- package/dist/types/layouts/hierarchicallayout/HierarchicalLayout.d.ts +28 -28
- package/dist/types/layouts/hierarchicallayout/constants.d.ts +2 -2
- package/dist/types/modules/CallbackHelper.d.ts +23 -23
- package/dist/types/modules/ExternalCallbackHandler.d.ts +33 -33
- package/dist/types/modules/NvlController.d.ts +212 -209
- package/dist/types/modules/Shader.d.ts +17 -17
- package/dist/types/modules/ZoomTransitionHandler.d.ts +24 -24
- package/dist/types/modules/dataset.d.ts +24 -24
- package/dist/types/modules/logging.d.ts +4 -4
- package/dist/types/modules/state/constants.d.ts +2 -2
- package/dist/types/modules/state/state.d.ts +2 -2
- package/dist/types/modules/state/types.d.ts +296 -288
- package/dist/types/modules/state/utils.d.ts +36 -36
- package/dist/types/renderers/ClusterOverlay.d.ts +67 -67
- package/dist/types/renderers/domrenderer/BaseRenderer.d.ts +69 -69
- package/dist/types/renderers/domrenderer/canvasrenderer/Animation.d.ts +57 -57
- package/dist/types/renderers/domrenderer/canvasrenderer/AnimationHandler.d.ts +65 -65
- package/dist/types/renderers/domrenderer/canvasrenderer/CanvasRenderer.d.ts +84 -85
- package/dist/types/renderers/domrenderer/canvasrenderer/arrowDrawing.d.ts +31 -31
- package/dist/types/renderers/domrenderer/canvasrenderer/nodeDrawing.d.ts +32 -32
- package/dist/types/renderers/domrenderer/shared/ImageCache.d.ts +16 -16
- package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundle.d.ts +89 -89
- package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundler.d.ts +42 -42
- package/dist/types/renderers/domrenderer/shared/arrows/arrows.d.ts +49 -49
- package/dist/types/renderers/domrenderer/shared/arrows/constants.d.ts +4 -4
- package/dist/types/renderers/domrenderer/shared/nodes/nodes.d.ts +21 -21
- package/dist/types/renderers/domrenderer/shared/types.d.ts +29 -29
- package/dist/types/renderers/domrenderer/shared/util.d.ts +4 -4
- package/dist/types/renderers/domrenderer/shared/vectorUtils.d.ts +10 -10
- package/dist/types/renderers/domrenderer/shared/wordwrap.d.ts +10 -10
- package/dist/types/renderers/domrenderer/svgrenderer/SvgRenderer.d.ts +18 -19
- package/dist/types/renderers/domrenderer/svgrenderer/arrowDrawing.d.ts +15 -15
- package/dist/types/renderers/domrenderer/svgrenderer/nodeDrawing.d.ts +4 -4
- package/dist/types/renderers/domrenderer/svgrenderer/svgUtils.d.ts +21 -21
- package/dist/types/renderers/webglrenderer/Controller.d.ts +83 -82
- package/dist/types/renderers/webglrenderer/IconLayerRegistry.d.ts +8 -8
- package/dist/types/renderers/webglrenderer/Renderer.d.ts +89 -89
- package/dist/types/renderers/webglrenderer/node-animation-fragment.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/node-animation-vertex.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/node-fragment-point.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/node-vertex-point.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/rel-fragment-line.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/rel-glsl-utils.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/rel-vertex-arrow.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/rel-vertex-line.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/viewport-box-fragment.d.ts +1 -1
- package/dist/types/renderers/webglrenderer/viewport-box-vertex.d.ts +1 -1
- package/dist/types/types/graph-element.d.ts +103 -103
- package/dist/types/types/nvl-window-functions.d.ts +12 -13
- package/dist/types/types/utils.d.ts +1 -1
- package/dist/types/utils/ariaUtils.d.ts +2 -2
- package/dist/types/utils/canvasManagement.d.ts +1 -1
- package/dist/types/utils/circularUtils.d.ts +2 -2
- package/dist/types/utils/clusterGeometry.d.ts +3 -3
- package/dist/types/utils/clusterHitRegions.d.ts +12 -12
- package/dist/types/utils/colorUtils.d.ts +2 -2
- package/dist/types/utils/constants.d.ts +6 -6
- package/dist/types/utils/errors.d.ts +6 -6
- package/dist/types/utils/geometry.d.ts +48 -48
- package/dist/types/utils/graphObjectUtils.d.ts +9 -9
- package/dist/types/utils/hitTest.d.ts +47 -47
- package/dist/types/utils/jsDriverResultTransformer.d.ts +16 -16
- package/dist/types/utils/layoutSeeding.d.ts +2 -2
- package/dist/types/utils/mouseUtils.d.ts +5 -5
- package/dist/types/utils/segmentAnalytics.d.ts +42 -42
- package/dist/types/utils/webWorkerUtils.d.ts +1 -1
- package/dist/types/utils/zoomFunctions.d.ts +16 -15
- package/package.json +12 -10
- package/skills/neo4j-nvl-skill/SKILL.md +238 -398
- package/skills/neo4j-nvl-skill/references/api/base/classes/NVL.md +977 -0
- package/skills/neo4j-nvl-skill/references/api/base/functions/getZoomTargetForNodePositions.md +37 -0
- package/skills/neo4j-nvl-skill/references/api/base/index.md +71 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/CircularOptions.md +11 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/ClusteringOptions.md +14 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/ExternalCallbacks.md +18 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/ForceDirectedOptions.md +12 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/HierarchicalOptions.md +13 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/HitTargetCluster.md +13 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/HitTargetNode.md +16 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/HitTargetRelationship.md +15 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/Node.md +32 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/NvlMouseEvent.md +16 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/NvlOptions.md +38 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/Point.md +12 -0
- package/skills/neo4j-nvl-skill/references/api/base/interfaces/Relationship.md +32 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/CanvasRendererType.md +14 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/Cluster.md +20 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/ClusterByFn.md +20 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/ClusterId.md +10 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/HitTargets.md +22 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/HitTestTarget.md +7 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/Layout.md +15 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/LayoutOptions.md +12 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/NodeWithClientPosition.md +18 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/PartialNode.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/PartialRelationship.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/Renderer.md +9 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/StyledCaption.md +21 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/WebGLRendererType.md +14 -0
- package/skills/neo4j-nvl-skill/references/api/base/type-aliases/ZoomOptions.md +25 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/CircularLayoutType.md +11 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/ForceDirectedLayoutType.md +9 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/FreeLayoutType.md +9 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/GridLayoutType.md +9 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/HierarchicalLayoutType.md +9 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/d3ForceLayoutType.md +9 -0
- package/skills/neo4j-nvl-skill/references/api/base/variables/nvlResultTransformer.md +38 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/BoxSelectInteraction.md +163 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/ClickInteraction.md +163 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/DragNodeInteraction.md +164 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/HoverInteraction.md +160 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/KeyboardInteraction.md +185 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/LassoInteraction.md +163 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/PanInteraction.md +196 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/classes/ZoomInteraction.md +164 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/index.md +37 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/BoxSelectInteractionCallbacks.md +19 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/BoxSelectInteractionOptions.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ClickInteractionCallbacks.md +39 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ClickInteractionOptions.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/DragNodeInteractionCallbacks.md +21 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/DrawInteractionOptions.md +22 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/HoverInteractionCallbacks.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/HoverInteractionOptions.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/KeyboardInteractionCallbacks.md +35 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/KeyboardInteractionOptions.md +55 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/LassoInteractionCallbacks.md +19 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/LassoInteractionOptions.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/PanInteractionCallbacks.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/PanInteractionOptions.md +19 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ZoomInteractionCallbacks.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/interaction-handlers/type-aliases/ZoomInteractionOptions.md +17 -0
- package/skills/neo4j-nvl-skill/references/api/react/functions/StaticPictureWrapper.md +35 -0
- package/skills/neo4j-nvl-skill/references/api/react/index.md +34 -0
- package/skills/neo4j-nvl-skill/references/api/react/interfaces/BasicReactWrapperProps.md +24 -0
- package/skills/neo4j-nvl-skill/references/api/react/interfaces/InteractiveNvlWrapperProps.md +27 -0
- package/skills/neo4j-nvl-skill/references/api/react/type-aliases/InteractionOptions.md +10 -0
- package/skills/neo4j-nvl-skill/references/api/react/type-aliases/KeyboardEvent.md +7 -0
- package/skills/neo4j-nvl-skill/references/api/react/type-aliases/KeyboardEventCallbacks.md +10 -0
- package/skills/neo4j-nvl-skill/references/api/react/type-aliases/MouseEvent.md +10 -0
- package/skills/neo4j-nvl-skill/references/api/react/type-aliases/MouseEventCallbacks.md +10 -0
- package/skills/neo4j-nvl-skill/references/api/react/type-aliases/StaticPictureWrapperProps.md +27 -0
- package/skills/neo4j-nvl-skill/references/api/react/variables/BasicNvlWrapper.md +50 -0
- package/skills/neo4j-nvl-skill/references/api/react/variables/InteractiveNvlWrapper.md +17 -0
- package/skills/neo4j-nvl-skill/references/clustering.md +87 -0
- package/skills/neo4j-nvl-skill/references/data-from-neo4j.md +67 -0
- package/skills/neo4j-nvl-skill/references/labels-and-overlays.md +76 -0
- package/skills/neo4j-nvl-skill/references/layouts-and-positions.md +65 -0
- package/skills/neo4j-nvl-skill/references/lifecycle-and-updates.md +65 -0
- package/skills/neo4j-nvl-skill/references/migrating-1x-to-2.md +50 -0
- package/skills/neo4j-nvl-skill/references/react-wrappers.md +88 -0
- package/skills/neo4j-nvl-skill/references/verifying-nvl-apps.md +52 -0
- package/skills/neo4j-nvl-skill/references/vite-and-bundlers.md +62 -0
- package/dist/types/layouts/animatedlayout/AnimatedLayout.test.d.ts +0 -1
- package/dist/types/layouts/animatedlayout/animationUtils.test.d.ts +0 -1
- package/dist/types/layouts/d3forcelayout/__mocks__/d3ForceLayout.d.ts +0 -10
- package/dist/types/layouts/d3forcelayout/circularLayout.test.d.ts +0 -1
- package/dist/types/layouts/d3forcelayout/d3ForceLayout.test.d.ts +0 -1
- package/dist/types/layouts/forcedirectedlayout/PhysLayout.test.d.ts +0 -1
- package/dist/types/layouts/forcedirectedlayout/clustering/ClusterByMerger.test.d.ts +0 -1
- package/dist/types/layouts/forcedirectedlayout/clustering/SolarMerger.bench.d.ts +0 -1
- package/dist/types/layouts/forcedirectedlayout/clustering/SolarMerger.test.d.ts +0 -1
- package/dist/types/layouts/forcedirectedlayout/clustering/clustering-utils.test.d.ts +0 -1
- package/dist/types/modules/NvlController.test.d.ts +0 -1
- package/dist/types/modules/ZoomTransitionHandler.test.d.ts +0 -1
- package/dist/types/modules/dataset.test.d.ts +0 -1
- package/dist/types/modules/state/state.test.d.ts +0 -1
- package/dist/types/modules/state/utils.test.d.ts +0 -1
- package/dist/types/renderers/ClusterOverlay.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/BaseRenderer.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/canvasrenderer/Animation.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/canvasrenderer/CanvasRenderer.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/canvasrenderer/arrowDrawing.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/canvasrenderer/nodeDrawing.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/ImageCache.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundle.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/arrows/ArrowBundler.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/arrows/arrows.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/nodes/nodes.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/util.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/shared/wordwrap.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/svgrenderer/SvgRenderer.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/svgrenderer/arrowDrawing.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/svgrenderer/nodeDrawing.test.d.ts +0 -1
- package/dist/types/renderers/domrenderer/svgrenderer/svgUtils.test.d.ts +0 -1
- package/dist/types/renderers/webglrenderer/Controller.test.d.ts +0 -1
- package/dist/types/renderers/webglrenderer/IconLayerRegistry.test.d.ts +0 -1
- package/dist/types/renderers/webglrenderer/Renderer.test.d.ts +0 -1
- package/dist/types/utils/ariaUtils.test.d.ts +0 -1
- package/dist/types/utils/canvasManagement.test.d.ts +0 -1
- package/dist/types/utils/circularUtils.test.d.ts +0 -1
- package/dist/types/utils/clusterGeometry.test.d.ts +0 -1
- package/dist/types/utils/clusterHitRegions.test.d.ts +0 -1
- package/dist/types/utils/colorUtils.test.d.ts +0 -1
- package/dist/types/utils/errors.test.d.ts +0 -1
- package/dist/types/utils/geometry.test.d.ts +0 -1
- package/dist/types/utils/graphObjectUtils.test.d.ts +0 -1
- package/dist/types/utils/hitTest.test.d.ts +0 -1
- package/dist/types/utils/jsDriverResultTransformer.test.d.ts +0 -1
- package/dist/types/utils/layoutSeeding.test.d.ts +0 -1
- package/dist/types/utils/mouseUtils.test.d.ts +0 -1
- package/dist/types/utils/webWorkerUtils.test.d.ts +0 -1
- package/dist/types/utils/zoomFunctions.test.d.ts +0 -1
- package/skills/neo4j-nvl-skill/references/api-surface.md +0 -596
- package/skills/neo4j-nvl-skill/references/troubleshooting.md +0 -317
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# React wrappers
|
|
2
|
+
|
|
3
|
+
When you need this: you use `<InteractiveNvlWrapper>` or `<BasicNvlWrapper>` from `@neo4j-nvl/react` and something does not react to a prop change, a callback sees stale state, or an interaction does not start.
|
|
4
|
+
|
|
5
|
+
Verification tags: **source** = `packages/react/src` in the NVL repository, **types** = shipped `.d.ts`, **runtime** = observed in a running app.
|
|
6
|
+
|
|
7
|
+
## Which wrapper
|
|
8
|
+
|
|
9
|
+
- `<InteractiveNvlWrapper>`: `<BasicNvlWrapper>` plus every interaction handler, toggled through `mouseEventCallbacks` and `keyboardEventCallbacks`.
|
|
10
|
+
- `<BasicNvlWrapper>`: NVL only. Use it when you wire interactions yourself through the `ref`.
|
|
11
|
+
|
|
12
|
+
Both forward a `ref` to the `NVL` instance (`useRef<NVL>(null)`) and pass unknown props to the container `<div>`. The container is `height: 100%`, so the **parent** needs an explicit height. *source*
|
|
13
|
+
|
|
14
|
+
## `mouseEventCallbacks` → handler
|
|
15
|
+
|
|
16
|
+
A key set to a function enables the handler and registers the callback; `true` enables the handler with no callback; `false` destroys the handler; omitted means off. *source*
|
|
17
|
+
|
|
18
|
+
| Handler | Keys |
|
|
19
|
+
|---|---|
|
|
20
|
+
| Hover | `onHover` |
|
|
21
|
+
| Click | `onNodeClick`, `onRelationshipClick`, `onCanvasClick`, `onClusterClick`, and the `...DoubleClick` / `...RightClick` variants |
|
|
22
|
+
| Pan | `onPan` |
|
|
23
|
+
| Zoom (wheel) | `onZoomAndPan` |
|
|
24
|
+
| Drag nodes | `onDrag`, `onDragStart`, `onDragEnd` |
|
|
25
|
+
| Draw | `onHoverNodeMargin`, `onDrawStarted`, `onDrawEnded` |
|
|
26
|
+
| Box select | `onBoxStarted`, `onBoxSelect` |
|
|
27
|
+
| Lasso | `onLassoStarted`, `onLassoSelect` |
|
|
28
|
+
| Keyboard (`keyboardEventCallbacks`) | `onKeyDown`, `onKeyUp`, `onNodeFocus`, `onNodeBlur` |
|
|
29
|
+
|
|
30
|
+
There is no `onZoom` key. `{ onZoom: true }` is ignored and wheel zoom stays off. *source*
|
|
31
|
+
|
|
32
|
+
Interaction callbacks are re-registered whenever the function identity changes, so they are **not** subject to the stale-closure problem below. *source*
|
|
33
|
+
|
|
34
|
+
## `nvlCallbacks` are captured once
|
|
35
|
+
|
|
36
|
+
`BasicNvlWrapper` passes `nvlCallbacks` to the `NVL` constructor and never updates them. A callback that closes over state sees the state from the first render. *source*
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
const selectedRef = useRef(selected)
|
|
40
|
+
selectedRef.current = selected
|
|
41
|
+
|
|
42
|
+
const nvlCallbacks = useMemo(() => ({
|
|
43
|
+
onLayoutDone: () => console.log('layout done, selected:', selectedRef.current)
|
|
44
|
+
}), [])
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Which `nvlOptions` update after creation
|
|
48
|
+
|
|
49
|
+
Only these are watched by effects: `layout` (`setLayout`), `layoutOptions` (deep-compared, `setLayoutOptions`), `renderer` (`setRenderer`), `disableWebGL` (`setDisableWebGL`). Everything else (`styling`, `minZoom`, `initialZoom`, `disableTelemetry`, `disableWebWorkers`, ...) is read at construction. *source*
|
|
50
|
+
|
|
51
|
+
Separate props with live effects: `positions` (`setNodePositions`), `zoom` and `pan` (`setZoom` / `setPan` / `setZoomAndPan`). *source*
|
|
52
|
+
|
|
53
|
+
To change a creation-time option, call `nvlRef.current.restart(newOptions, true)` or remount the wrapper with a `key`.
|
|
54
|
+
|
|
55
|
+
## `nodes` / `rels` diffing
|
|
56
|
+
|
|
57
|
+
On every render the wrapper diffs the new arrays against the previous ones by `id`, then calls `addAndUpdateElementsInGraph` for added and changed elements and `removeNodesWithIds` / `removeRelationshipsWithIds` for removed ones. *source*
|
|
58
|
+
|
|
59
|
+
- Only keys whose value changed are sent, so updates are partial. A key set to `undefined` is sent (and clears the attribute); a key that is omitted is not. *source*
|
|
60
|
+
- Changing `x` / `y` on an existing node does **not** move it; positions are only read on insert. Use the `positions` prop or `setNodePositions`. *source*
|
|
61
|
+
- `pinned` does apply through the diff. *runtime*
|
|
62
|
+
- Keep the arrays referentially stable between renders (`useMemo`) or the diff runs on every render.
|
|
63
|
+
|
|
64
|
+
## `minimapContainer` must exist first
|
|
65
|
+
|
|
66
|
+
If `nvlOptions.minimapContainer` is present, NVL is not created until it is non-null. With a plain `useRef` the element is `null` on the first render and NVL never starts; hold the element in state via a callback ref. *source*
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
const [minimapEl, setMinimapEl] = useState<HTMLDivElement | null>(null)
|
|
70
|
+
const nvlOptions = useMemo(() => ({ minimapContainer: minimapEl }), [minimapEl])
|
|
71
|
+
|
|
72
|
+
<div ref={setMinimapEl} style={{ width: 200, height: 150 }} />
|
|
73
|
+
<InteractiveNvlWrapper nvlOptions={nvlOptions} ... />
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## `interactionOptions` replaces the defaults
|
|
77
|
+
|
|
78
|
+
The default is `{ selectOnClick: false, drawShadowOnHover: true, selectOnRelease: false, excludeNodeMargin: true }`. Passing the prop replaces this object, so `interactionOptions={{ selectOnClick: true }}` turns the hover shadow off. Pass every option you want. *source*
|
|
79
|
+
|
|
80
|
+
Keep the object stable (`useMemo`); a new object each render re-runs every interaction effect.
|
|
81
|
+
|
|
82
|
+
## Selection toggles twice / handlers duplicated
|
|
83
|
+
|
|
84
|
+
Flipping `selectOnClick` or other `interactionOptions` across renders, or registering your own `container.addEventListener('click')` next to the wrapper's `ClickInteraction`, produces double handling. Set the options once and use the wrapper's callbacks.
|
|
85
|
+
|
|
86
|
+
## Teardown
|
|
87
|
+
|
|
88
|
+
The wrappers call `nvl.destroy()` on unmount and destroy their handlers. Only manual `new NVL(...)` in a `useEffect` needs an explicit `return () => nvl.destroy()`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Verifying NVL apps
|
|
2
|
+
|
|
3
|
+
When you need this: you want to check from a test, a script or a headless browser that the graph rendered, the layout finished, or nodes are where you expect.
|
|
4
|
+
|
|
5
|
+
Verification tags: **source**, **types**, **runtime** (see `SKILL.md`).
|
|
6
|
+
|
|
7
|
+
## Window hooks
|
|
8
|
+
|
|
9
|
+
Every NVL instance registers these on `window` (declared in `nvl-window-functions.d.ts`). They are read-only test hooks; `instanceId` is the `nvlOptions.instanceId` you gave (default `'default'`). With several instances and no id, the most recently created one answers. *source*
|
|
10
|
+
|
|
11
|
+
| Hook | Returns |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `__Nvl_dumpNodes(instanceId?)` | `NodeWithClientPosition[]`: every node with `x`, `y` and `clientPosition` |
|
|
14
|
+
| `__Nvl_dumpRelationships(instanceId?)` | `Relationship[]` |
|
|
15
|
+
| `__Nvl_getNodesOnScreen(instanceId?)` | `{ nodes, rels }` currently inside the viewport |
|
|
16
|
+
| `__Nvl_getZoomLevel(instanceId?)` | current zoom |
|
|
17
|
+
| `__Nvl_registerDoneCallback(cb, instanceId)` | registers `cb` for `onLayoutDone`; note the argument order |
|
|
18
|
+
|
|
19
|
+
Playwright example (the pattern used by this repository's build-tool tests): *source*
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
await expect.poll(() => page.evaluate('window.__Nvl_dumpNodes !== undefined')).toBeTruthy()
|
|
23
|
+
await expect.poll(() => page.evaluate(() => window.__Nvl_dumpNodes().length)).toBe(42)
|
|
24
|
+
await page.evaluate(() => new Promise<void>((resolve) => window.__Nvl_registerDoneCallback(resolve, 'default')))
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Detecting a settled layout
|
|
28
|
+
|
|
29
|
+
- Preferred: `onLayoutDone` (or `__Nvl_registerDoneCallback`).
|
|
30
|
+
- Alternative: poll `__Nvl_dumpNodes()` and compare positions between two polls.
|
|
31
|
+
- `onLayoutComputing(false)` fires when a computation ends; the force-directed layout may compute again after interactions.
|
|
32
|
+
|
|
33
|
+
## What a screenshot can and cannot show
|
|
34
|
+
|
|
35
|
+
- The WebGL canvas is not inspectable through the DOM; pixels are the only evidence. Captions are absent with WebGL (see [labels-and-overlays](labels-and-overlays.md)), so a text-based check needs the Canvas renderer or `html` overlays.
|
|
36
|
+
- `getImageDataUrl()` returns the main canvas as PNG for in-process comparisons. *types*
|
|
37
|
+
|
|
38
|
+
## Headless Chrome and WebGL2
|
|
39
|
+
|
|
40
|
+
Headless Chrome uses software GL by default. The force-directed GPU simulation then runs so slowly that it looks hung. Launch with hardware GL: *runtime*
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
--use-angle=gl --use-gl=angle --enable-gpu --ignore-gpu-blocklist --disable-gpu-sandbox
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Playwright: pass them in `launchOptions.args`. Allow long timeouts for the first layout. If no GPU is available, set `disableWebGL: true` in the test build so NVL uses the Canvas renderer and CPU layouts.
|
|
47
|
+
|
|
48
|
+
## Checklist
|
|
49
|
+
|
|
50
|
+
- Wait for `__Nvl_dumpNodes` to exist, then for the expected node count, then for `onLayoutDone`.
|
|
51
|
+
- Set `instanceId` when a page has more than one graph.
|
|
52
|
+
- Set `disableTelemetry: true` in test builds.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Vite and other bundlers
|
|
2
|
+
|
|
3
|
+
When you need this: a layout never finishes in development, the console mentions a worker script, or you set up a new project.
|
|
4
|
+
|
|
5
|
+
Verification tags: **source**, **types**, **runtime** (see `SKILL.md`).
|
|
6
|
+
|
|
7
|
+
## What runs in a worker
|
|
8
|
+
|
|
9
|
+
Only the **hierarchical** layout uses a worker: a `SharedWorker` (`type: 'module'`, name `HierarchicalLayout`) created by `@neo4j-nvl/layout-workers` with `new URL('./HierarchicalLayout.worker.js', import.meta.url)`. The worker imports the CommonJS package `bin-pack`. Force-directed, circular, grid, free and d3Force run on the main thread or the GPU. *source*
|
|
10
|
+
|
|
11
|
+
If the worker constructor throws, NVL logs a warning and falls back to the synchronous implementation automatically. A worker that is created but fails to **load** does not throw, so there is no fallback and the layout never completes. *source*
|
|
12
|
+
|
|
13
|
+
## Vite dev server
|
|
14
|
+
|
|
15
|
+
With Vite 7.3 the hierarchical layout works in `vite` dev without configuration: Vite discovers `bin-pack` from the worker graph and pre-bundles it. *runtime*
|
|
16
|
+
|
|
17
|
+
**Symptom (reported with older Vite versions and npm-installed packages, not reproduced in this repository):** switching to `hierarchical` fires `onLayoutComputing(true)` and nothing else. The page console is clean; the worker's console (DevTools → Sources → Threads, or `chrome://inspect/#workers`) shows "Failed to fetch a worker script" or a CJS resolution error. `vite build` + `vite preview` works.
|
|
18
|
+
|
|
19
|
+
**Cause:** Vite pre-bundles CommonJS dependencies found from the main module graph. If the worker graph is not scanned, `bin-pack` reaches the worker un-bundled.
|
|
20
|
+
|
|
21
|
+
**Fix:**
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// vite.config.ts
|
|
25
|
+
import { defineConfig } from 'vite'
|
|
26
|
+
|
|
27
|
+
export default defineConfig({
|
|
28
|
+
optimizeDeps: { include: ['bin-pack'] }
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Restart `vite` after editing `optimizeDeps`; delete `node_modules/.vite` if the change does not take.
|
|
33
|
+
|
|
34
|
+
With pnpm or other strict hoisting, `bin-pack` is a transitive dependency and not resolvable from the app root. Use Vite's nested syntax (documented by Vite, not exercised in this repository):
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
optimizeDeps: {
|
|
38
|
+
include: ['@neo4j-nvl/base > @neo4j-nvl/layout-workers > bin-pack']
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Webpack
|
|
43
|
+
|
|
44
|
+
Webpack 5 handles `new SharedWorker(new URL(..., import.meta.url))` natively; no configuration is needed. The repository's build-tool tests cover webpack and Vite production builds. *source*
|
|
45
|
+
|
|
46
|
+
## Other bundlers
|
|
47
|
+
|
|
48
|
+
Not tested in this repository. Check that the bundler supports `new URL(..., import.meta.url)` in `SharedWorker` constructors and bundles CJS dependencies into worker chunks. If it does not, use `disableWebWorkers`.
|
|
49
|
+
|
|
50
|
+
## `disableWebWorkers`
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
new NVL(container, nodes, rels, { disableWebWorkers: true })
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Runs the hierarchical layout synchronously on the main thread: same result, blocks the UI for large graphs. Use it when workers are blocked (CSP `worker-src 'none'`, sandboxed iframes) or a bundler cannot be configured. For the Vite dev case prefer `optimizeDeps`. *types, source*
|
|
57
|
+
|
|
58
|
+
## Telling a worker failure from a slow layout
|
|
59
|
+
|
|
60
|
+
- `onLayoutComputing(true)` followed by nothing for more than a few seconds on a small graph is a failure, not slowness.
|
|
61
|
+
- `window.__Nvl_registerDoneCallback(cb)` never fires (see [verifying-nvl-apps](verifying-nvl-apps.md)).
|
|
62
|
+
- Switch to `disableWebWorkers: true`: if the layout now completes, the worker is the problem.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|