geonodes-web-render 0.3.20 → 0.3.21

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 (3) hide show
  1. package/README.md +4 -0
  2. package/dist/embed.js +57 -56
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,7 +1,11 @@
1
1
  # geonodes-web-render
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/geonodes-web-render)](https://www.npmjs.com/package/geonodes-web-render?activeTab=readme)
4
+
3
5
  A browser-based viewer for Blender node trees exported via the [Tree Clipper](https://extensions.blender.org/add-ons/tree-clipper/) add-on. It renders the exported JSON as a read-only, Blender-styled node graph using React Flow.
4
6
 
7
+ 📦 **npm:** [geonodes-web-render](https://www.npmjs.com/package/geonodes-web-render?activeTab=readme)
8
+
5
9
  ## What it does
6
10
 
7
11
  Paste or load a Tree Clipper JSON export and the app displays the node graph with accurate socket colors, node header colors, reroute nodes, float curves, and simulation zones.
package/dist/embed.js CHANGED
@@ -257,16 +257,16 @@ function re(e) {
257
257
  //#endregion
258
258
  //#region node_modules/d3-selection/src/selection/selectChild.js
259
259
  var ie = Array.prototype.find;
260
- function G(e) {
260
+ function ae(e) {
261
261
  return function() {
262
262
  return ie.call(this.children, e);
263
263
  };
264
264
  }
265
- function ae() {
265
+ function G() {
266
266
  return this.firstElementChild;
267
267
  }
268
268
  function oe(e) {
269
- return this.select(e == null ? ae : G(typeof e == "function" ? e : re(e)));
269
+ return this.select(e == null ? G : ae(typeof e == "function" ? e : re(e)));
270
270
  }
271
271
  //#endregion
272
272
  //#region node_modules/d3-selection/src/selection/selectChildren.js
@@ -6312,9 +6312,9 @@ function Hu({ id: e, edgesFocusable: t, edgesReconnectable: n, elementsSelectabl
6312
6312
  }), N.current?.blur()) : n([e])), i && i(t, T);
6313
6313
  }, ie = o ? (e) => {
6314
6314
  o(e, { ...T });
6315
- } : void 0, G = s ? (e) => {
6315
+ } : void 0, ae = s ? (e) => {
6316
6316
  s(e, { ...T });
6317
- } : void 0, ae = c ? (e) => {
6317
+ } : void 0, G = c ? (e) => {
6318
6318
  c(e, { ...T });
6319
6319
  } : void 0, oe = l ? (e) => {
6320
6320
  l(e, { ...T });
@@ -6339,8 +6339,8 @@ function Hu({ id: e, edgesFocusable: t, edgesReconnectable: n, elementsSelectabl
6339
6339
  ]),
6340
6340
  onClick: re,
6341
6341
  onDoubleClick: ie,
6342
- onContextMenu: G,
6343
- onMouseEnter: ae,
6342
+ onContextMenu: ae,
6343
+ onMouseEnter: G,
6344
6344
  onMouseMove: oe,
6345
6345
  onMouseLeave: se,
6346
6346
  onKeyDown: A ? (t) => {
@@ -6582,7 +6582,7 @@ function od() {
6582
6582
  }
6583
6583
  }, []);
6584
6584
  }
6585
- function sd({ nodeTypes: e, edgeTypes: t, onInit: n, onNodeClick: r, onEdgeClick: i, onNodeDoubleClick: a, onEdgeDoubleClick: o, onNodeMouseEnter: s, onNodeMouseMove: c, onNodeMouseLeave: l, onNodeContextMenu: u, onSelectionContextMenu: d, onSelectionStart: f, onSelectionEnd: p, connectionLineType: m, connectionLineStyle: h, connectionLineComponent: v, connectionLineContainerStyle: y, selectionKeyCode: b, selectionOnDrag: x, selectionMode: S, multiSelectionKeyCode: C, panActivationKeyCode: w, zoomActivationKeyCode: T, deleteKeyCode: E, onlyRenderVisibleElements: D, elementsSelectable: O, defaultViewport: k, translateExtent: A, minZoom: j, maxZoom: M, preventScrolling: N, defaultMarkerColor: P, zoomOnScroll: F, zoomOnPinch: I, panOnScroll: L, panOnScrollSpeed: R, panOnScrollMode: ee, zoomOnDoubleClick: z, panOnDrag: B, autoPanOnSelection: V, onPaneClick: H, onPaneMouseEnter: U, onPaneMouseMove: W, onPaneMouseLeave: te, onPaneScroll: ne, onPaneContextMenu: re, paneClickDistance: ie, nodeClickDistance: G, onEdgeContextMenu: ae, onEdgeMouseEnter: oe, onEdgeMouseMove: se, onEdgeMouseLeave: ce, reconnectRadius: le, onReconnect: ue, onReconnectStart: de, onReconnectEnd: fe, noDragClassName: pe, noWheelClassName: me, noPanClassName: he, disableKeyboardA11y: ge, nodeExtent: _e, rfId: ve, viewport: ye, onViewportChange: be }) {
6585
+ function sd({ nodeTypes: e, edgeTypes: t, onInit: n, onNodeClick: r, onEdgeClick: i, onNodeDoubleClick: a, onEdgeDoubleClick: o, onNodeMouseEnter: s, onNodeMouseMove: c, onNodeMouseLeave: l, onNodeContextMenu: u, onSelectionContextMenu: d, onSelectionStart: f, onSelectionEnd: p, connectionLineType: m, connectionLineStyle: h, connectionLineComponent: v, connectionLineContainerStyle: y, selectionKeyCode: b, selectionOnDrag: x, selectionMode: S, multiSelectionKeyCode: C, panActivationKeyCode: w, zoomActivationKeyCode: T, deleteKeyCode: E, onlyRenderVisibleElements: D, elementsSelectable: O, defaultViewport: k, translateExtent: A, minZoom: j, maxZoom: M, preventScrolling: N, defaultMarkerColor: P, zoomOnScroll: F, zoomOnPinch: I, panOnScroll: L, panOnScrollSpeed: R, panOnScrollMode: ee, zoomOnDoubleClick: z, panOnDrag: B, autoPanOnSelection: V, onPaneClick: H, onPaneMouseEnter: U, onPaneMouseMove: W, onPaneMouseLeave: te, onPaneScroll: ne, onPaneContextMenu: re, paneClickDistance: ie, nodeClickDistance: ae, onEdgeContextMenu: G, onEdgeMouseEnter: oe, onEdgeMouseMove: se, onEdgeMouseLeave: ce, reconnectRadius: le, onReconnect: ue, onReconnectStart: de, onReconnectEnd: fe, noDragClassName: pe, noWheelClassName: me, noPanClassName: he, disableKeyboardA11y: ge, nodeExtent: _e, rfId: ve, viewport: ye, onViewportChange: be }) {
6586
6586
  return ad(e), ad(t), od(), Yu(n), Zu(ye), g(Xl, {
6587
6587
  onPaneClick: H,
6588
6588
  onPaneMouseEnter: U,
@@ -6630,7 +6630,7 @@ function sd({ nodeTypes: e, edgeTypes: t, onInit: n, onNodeClick: r, onEdgeClick
6630
6630
  onReconnectStart: de,
6631
6631
  onReconnectEnd: fe,
6632
6632
  onlyRenderVisibleElements: D,
6633
- onEdgeContextMenu: ae,
6633
+ onEdgeContextMenu: G,
6634
6634
  onEdgeMouseEnter: oe,
6635
6635
  onEdgeMouseMove: se,
6636
6636
  onEdgeMouseLeave: ce,
@@ -6655,7 +6655,7 @@ function sd({ nodeTypes: e, edgeTypes: t, onInit: n, onNodeClick: r, onEdgeClick
6655
6655
  onNodeMouseMove: c,
6656
6656
  onNodeMouseLeave: l,
6657
6657
  onNodeContextMenu: u,
6658
- nodeClickDistance: G,
6658
+ nodeClickDistance: ae,
6659
6659
  onlyRenderVisibleElements: D,
6660
6660
  noPanClassName: he,
6661
6661
  noDragClassName: pe,
@@ -7004,7 +7004,7 @@ var md = {
7004
7004
  position: "relative",
7005
7005
  zIndex: 0
7006
7006
  };
7007
- function hd({ nodes: e, edges: t, defaultNodes: n, defaultEdges: r, className: i, nodeTypes: o, edgeTypes: s, onNodeClick: c, onEdgeClick: l, onInit: u, onMove: d, onMoveStart: f, onMoveEnd: p, onConnect: m, onConnectStart: h, onConnectEnd: v, onClickConnectStart: y, onClickConnectEnd: b, onNodeMouseEnter: x, onNodeMouseMove: S, onNodeMouseLeave: C, onNodeContextMenu: w, onNodeDoubleClick: T, onNodeDragStart: E, onNodeDrag: O, onNodeDragStop: k, onNodesDelete: A, onEdgesDelete: j, onDelete: M, onSelectionChange: N, onSelectionDragStart: P, onSelectionDrag: F, onSelectionDragStop: I, onSelectionContextMenu: L, onSelectionStart: R, onSelectionEnd: ee, onBeforeDelete: z, connectionMode: B, connectionLineType: V = Ta.Bezier, connectionLineStyle: H, connectionLineComponent: U, connectionLineContainerStyle: W, deleteKeyCode: te = "Backspace", selectionKeyCode: ne = "Shift", selectionOnDrag: re = !1, selectionMode: ie = Ca.Full, panActivationKeyCode: G = "Space", multiSelectionKeyCode: ae = lo() ? "Meta" : "Control", zoomActivationKeyCode: oe = lo() ? "Meta" : "Control", snapToGrid: se, snapGrid: ce, onlyRenderVisibleElements: le = !1, selectNodesOnDrag: ue, nodesDraggable: de, autoPanOnNodeFocus: fe, nodesConnectable: pe, nodesFocusable: me, nodeOrigin: he = Fc, edgesFocusable: ge, edgesReconnectable: _e, elementsSelectable: ve = !0, defaultViewport: ye = Ic, minZoom: be = .5, maxZoom: xe = 2, translateExtent: Se = va, preventScrolling: Ce = !0, nodeExtent: we, defaultMarkerColor: Te = "#b1b1b7", zoomOnScroll: Ee = !0, zoomOnPinch: De = !0, panOnScroll: Oe = !1, panOnScrollSpeed: ke = .5, panOnScrollMode: Ae = Sa.Free, zoomOnDoubleClick: je = !0, panOnDrag: Me = !0, onPaneClick: Ne, onPaneMouseEnter: Pe, onPaneMouseMove: Fe, onPaneMouseLeave: Ie, onPaneScroll: Le, onPaneContextMenu: Re, paneClickDistance: ze = 1, nodeClickDistance: Be = 0, children: Ve, onReconnect: He, onReconnectStart: Ue, onReconnectEnd: We, onEdgeContextMenu: Ge, onEdgeDoubleClick: Ke, onEdgeMouseEnter: qe, onEdgeMouseMove: Je, onEdgeMouseLeave: Ye, reconnectRadius: Xe = 10, onNodesChange: Ze, onEdgesChange: Qe, noDragClassName: $e = "nodrag", noWheelClassName: et = "nowheel", noPanClassName: tt = "nopan", fitView: nt, fitViewOptions: rt, connectOnClick: it, attributionPosition: at, proOptions: ot, defaultEdgeOptions: st, elevateNodesOnSelect: ct = !0, elevateEdgesOnSelect: lt = !1, disableKeyboardA11y: ut = !1, autoPanOnConnect: dt, autoPanOnNodeDrag: ft, autoPanOnSelection: pt = !0, autoPanSpeed: mt, connectionRadius: ht, isValidConnection: gt, onError: _t, style: vt, id: yt, nodeDragThreshold: bt, connectionDragThreshold: xt, viewport: St, onViewportChange: Ct, width: wt, height: Tt, colorMode: Et = "light", debug: Dt, onScroll: Ot, ariaLabelConfig: kt, zIndexMode: At = "basic", ...jt }, Mt) {
7007
+ function hd({ nodes: e, edges: t, defaultNodes: n, defaultEdges: r, className: i, nodeTypes: o, edgeTypes: s, onNodeClick: c, onEdgeClick: l, onInit: u, onMove: d, onMoveStart: f, onMoveEnd: p, onConnect: m, onConnectStart: h, onConnectEnd: v, onClickConnectStart: y, onClickConnectEnd: b, onNodeMouseEnter: x, onNodeMouseMove: S, onNodeMouseLeave: C, onNodeContextMenu: w, onNodeDoubleClick: T, onNodeDragStart: E, onNodeDrag: O, onNodeDragStop: k, onNodesDelete: A, onEdgesDelete: j, onDelete: M, onSelectionChange: N, onSelectionDragStart: P, onSelectionDrag: F, onSelectionDragStop: I, onSelectionContextMenu: L, onSelectionStart: R, onSelectionEnd: ee, onBeforeDelete: z, connectionMode: B, connectionLineType: V = Ta.Bezier, connectionLineStyle: H, connectionLineComponent: U, connectionLineContainerStyle: W, deleteKeyCode: te = "Backspace", selectionKeyCode: ne = "Shift", selectionOnDrag: re = !1, selectionMode: ie = Ca.Full, panActivationKeyCode: ae = "Space", multiSelectionKeyCode: G = lo() ? "Meta" : "Control", zoomActivationKeyCode: oe = lo() ? "Meta" : "Control", snapToGrid: se, snapGrid: ce, onlyRenderVisibleElements: le = !1, selectNodesOnDrag: ue, nodesDraggable: de, autoPanOnNodeFocus: fe, nodesConnectable: pe, nodesFocusable: me, nodeOrigin: he = Fc, edgesFocusable: ge, edgesReconnectable: _e, elementsSelectable: ve = !0, defaultViewport: ye = Ic, minZoom: be = .5, maxZoom: xe = 2, translateExtent: Se = va, preventScrolling: Ce = !0, nodeExtent: we, defaultMarkerColor: Te = "#b1b1b7", zoomOnScroll: Ee = !0, zoomOnPinch: De = !0, panOnScroll: Oe = !1, panOnScrollSpeed: ke = .5, panOnScrollMode: Ae = Sa.Free, zoomOnDoubleClick: je = !0, panOnDrag: Me = !0, onPaneClick: Ne, onPaneMouseEnter: Pe, onPaneMouseMove: Fe, onPaneMouseLeave: Ie, onPaneScroll: Le, onPaneContextMenu: Re, paneClickDistance: ze = 1, nodeClickDistance: Be = 0, children: Ve, onReconnect: He, onReconnectStart: Ue, onReconnectEnd: We, onEdgeContextMenu: Ge, onEdgeDoubleClick: Ke, onEdgeMouseEnter: qe, onEdgeMouseMove: Je, onEdgeMouseLeave: Ye, reconnectRadius: Xe = 10, onNodesChange: Ze, onEdgesChange: Qe, noDragClassName: $e = "nodrag", noWheelClassName: et = "nowheel", noPanClassName: tt = "nopan", fitView: nt, fitViewOptions: rt, connectOnClick: it, attributionPosition: at, proOptions: ot, defaultEdgeOptions: st, elevateNodesOnSelect: ct = !0, elevateEdgesOnSelect: lt = !1, disableKeyboardA11y: ut = !1, autoPanOnConnect: dt, autoPanOnNodeDrag: ft, autoPanOnSelection: pt = !0, autoPanSpeed: mt, connectionRadius: ht, isValidConnection: gt, onError: _t, style: vt, id: yt, nodeDragThreshold: bt, connectionDragThreshold: xt, viewport: St, onViewportChange: Ct, width: wt, height: Tt, colorMode: Et = "light", debug: Dt, onScroll: Ot, ariaLabelConfig: kt, zIndexMode: At = "basic", ...jt }, Mt) {
7008
7008
  let Nt = yt || "1", Pt = Hc(Et), Ft = a((e) => {
7009
7009
  e.currentTarget.scrollTo({
7010
7010
  top: 0,
@@ -7121,8 +7121,8 @@ function hd({ nodes: e, edges: t, defaultNodes: n, defaultEdges: r, className: i
7121
7121
  selectionOnDrag: re,
7122
7122
  selectionMode: ie,
7123
7123
  deleteKeyCode: te,
7124
- multiSelectionKeyCode: ae,
7125
- panActivationKeyCode: G,
7124
+ multiSelectionKeyCode: G,
7125
+ panActivationKeyCode: ae,
7126
7126
  zoomActivationKeyCode: oe,
7127
7127
  onlyRenderVisibleElements: le,
7128
7128
  defaultViewport: ye,
@@ -7486,18 +7486,18 @@ var Ud = i(Hd), Wd = i(Vd), Gd = 200, Kd = 150, qd = (e) => !e.hidden, Jd = (e)
7486
7486
  };
7487
7487
  }, Yd = "react-flow__minimap-desc";
7488
7488
  function Xd({ style: e, className: t, nodeStrokeColor: n, nodeColor: r, nodeClassName: i = "", nodeBorderRadius: o = 5, nodeStrokeWidth: s, nodeComponent: l, bgColor: u, maskColor: f, maskStrokeColor: p, maskStrokeWidth: m, position: h = "bottom-right", onClick: v, onNodeClick: y, pannable: b = !1, zoomable: x = !1, ariaLabel: S, inversePan: C, zoomStep: w = 1, offsetScale: T = 5 }) {
7489
- let E = Q(), O = d(null), { boundingRect: k, viewBB: A, rfId: j, panZoom: M, translateExtent: N, flowWidth: P, flowHeight: F, ariaLabelConfig: I } = Z(Jd, X), L = e?.width ?? Gd, R = e?.height ?? Kd, ee = k.width / L, z = k.height / R, B = Math.max(ee, z), V = B * L, H = B * R, U = T * B, W = k.x - (V - k.width) / 2 - U, te = k.y - (H - k.height) / 2 - U, ne = V + U * 2, re = H + U * 2, ie = `${Yd}-${j}`, G = d(0), ae = d();
7490
- G.current = B, c(() => {
7491
- if (O.current && M) return ae.current = As({
7489
+ let E = Q(), O = d(null), { boundingRect: k, viewBB: A, rfId: j, panZoom: M, translateExtent: N, flowWidth: P, flowHeight: F, ariaLabelConfig: I } = Z(Jd, X), L = e?.width ?? Gd, R = e?.height ?? Kd, ee = k.width / L, z = k.height / R, B = Math.max(ee, z), V = B * L, H = B * R, U = T * B, W = k.x - (V - k.width) / 2 - U, te = k.y - (H - k.height) / 2 - U, ne = V + U * 2, re = H + U * 2, ie = `${Yd}-${j}`, ae = d(0), G = d();
7490
+ ae.current = B, c(() => {
7491
+ if (O.current && M) return G.current = As({
7492
7492
  domNode: O.current,
7493
7493
  panZoom: M,
7494
7494
  getTransform: () => E.getState().transform,
7495
- getViewScale: () => G.current
7495
+ getViewScale: () => ae.current
7496
7496
  }), () => {
7497
- ae.current?.destroy();
7497
+ G.current?.destroy();
7498
7498
  };
7499
7499
  }, [M]), c(() => {
7500
- ae.current?.update({
7500
+ G.current?.update({
7501
7501
  translateExtent: N,
7502
7502
  width: P,
7503
7503
  height: F,
@@ -7516,7 +7516,7 @@ function Xd({ style: e, className: t, nodeStrokeColor: n, nodeColor: r, nodeClas
7516
7516
  F
7517
7517
  ]);
7518
7518
  let oe = v ? (e) => {
7519
- let [t, n] = ae.current?.pointer(e) || [0, 0];
7519
+ let [t, n] = G.current?.pointer(e) || [0, 0];
7520
7520
  v(e, {
7521
7521
  x: t,
7522
7522
  y: n
@@ -8893,26 +8893,26 @@ var gp = {
8893
8893
  nodeFrame: hp
8894
8894
  }, _p = { padding: .08 };
8895
8895
  function vp(e) {
8896
- let { nodes: t, edges: n, jsonText: r, breadcrumbs: i, onNavigate: o, onSelectionIds: s, onCopiedMagicString: l, interaction: u = "always" } = e, { fitView: p, getNodes: m, getNodesBounds: h } = ml(), v = bd(), y = d(null), b = d(!1), x = d([]), [S, C] = f(null), [w, D] = f(!1), [O, k] = f(!1), A = d(null), [j, M] = f("mouse"), [N, P] = f(!1), [F, I] = f(!1), L = d([]), [R, ee, z] = _d(t), [B, V, H] = vd(n), [U, W] = f(void 0);
8896
+ let { nodes: t, edges: n, jsonText: r, breadcrumbs: i, onNavigate: o, onSelectionIds: s, onCopiedMagicString: l, interaction: u = "always" } = e, { fitView: p, getNodes: m, getNodesBounds: h } = ml(), v = bd(), y = d(null), b = d(!1), x = d([]), [S, C] = f(null), [w, D] = f(!1), [O, k] = f(!1), A = d(null), [j, M] = f("mouse"), N = d(-Infinity), [P, F] = f(!1), [I, L] = f(!1), R = d([]), [ee, z, B] = _d(t), [V, H, U] = vd(n), [W, te] = f(void 0);
8897
8897
  c(() => {
8898
8898
  if (!v) return;
8899
8899
  let e = h(m());
8900
- W([[e.x, e.y], [e.x + e.width, e.y + e.height]]);
8900
+ te([[e.x, e.y], [e.x + e.width, e.y + e.height]]);
8901
8901
  }, [
8902
8902
  v,
8903
8903
  t,
8904
8904
  m,
8905
8905
  h
8906
8906
  ]), c(() => {
8907
- ee(t), s?.([]), b.current = !1, p(_p);
8907
+ z(t), s?.([]), b.current = !1, p(_p);
8908
8908
  }, [
8909
8909
  t,
8910
- ee,
8910
+ z,
8911
8911
  s,
8912
8912
  p
8913
8913
  ]), c(() => {
8914
- V(n);
8915
- }, [n, V]), c(() => {
8914
+ H(n);
8915
+ }, [n, H]), c(() => {
8916
8916
  let e = y.current;
8917
8917
  if (!e) return;
8918
8918
  let t = new ResizeObserver(() => {
@@ -8920,19 +8920,19 @@ function vp(e) {
8920
8920
  });
8921
8921
  return t.observe(e), () => t.disconnect();
8922
8922
  }, [p]);
8923
- let te = a((e) => {
8923
+ let ne = a((e) => {
8924
8924
  e && (b.current = !0);
8925
- }, []), ne = a(({ nodes: e }) => {
8925
+ }, []), re = a(({ nodes: e }) => {
8926
8926
  let t = e.map((e) => e.id);
8927
8927
  x.current = t, s?.(t);
8928
- }, [s]), re = a((e) => {
8928
+ }, [s]), ie = a((e) => {
8929
8929
  e.preventDefault();
8930
8930
  let t = y.current?.getBoundingClientRect();
8931
8931
  C({
8932
8932
  x: e.clientX - (t?.left ?? 0),
8933
8933
  y: e.clientY - (t?.top ?? 0)
8934
8934
  });
8935
- }, []), ie = a(async () => {
8935
+ }, []), ae = a(async () => {
8936
8936
  C(null);
8937
8937
  try {
8938
8938
  let e = JSON.parse(r), t = new Set(x.current.map(Number).filter(Number.isFinite)), n = t.size > 0 ? E(e, t) : e, i = await T(JSON.stringify(n));
@@ -8940,23 +8940,24 @@ function vp(e) {
8940
8940
  l();
8941
8941
  return;
8942
8942
  }
8943
- L.current.forEach(clearTimeout), I(!1), P(!0), L.current = [setTimeout(() => I(!0), 2500), setTimeout(() => {
8944
- P(!1), I(!1);
8943
+ R.current.forEach(clearTimeout), L(!1), F(!0), R.current = [setTimeout(() => L(!0), 2500), setTimeout(() => {
8944
+ F(!1), L(!1);
8945
8945
  }, 3e3)];
8946
8946
  } catch {}
8947
8947
  }, [r, l]);
8948
- c(() => () => L.current.forEach(clearTimeout), []), c(() => () => {
8948
+ c(() => () => R.current.forEach(clearTimeout), []), c(() => () => {
8949
8949
  A.current && clearTimeout(A.current);
8950
8950
  }, []);
8951
- let G = u === "hybrid", ae = u === "always" || G && w, oe = ae && j === "mouse", se = ae && j === "trackpad", ce = [1], le = a((e) => {
8951
+ let G = u === "hybrid", oe = u === "always" || G && w, se = oe && j === "mouse", ce = oe && j === "trackpad", le = [1], ue = a((e) => {
8952
8952
  if (!e.ctrlKey) {
8953
- let t = e.deltaMode === 0 && (e.deltaX !== 0 || !Number.isInteger(e.deltaY) || Math.abs(e.deltaY) < 40) ? "trackpad" : "mouse";
8953
+ e.deltaX !== 0 && (N.current = e.timeStamp);
8954
+ let t = e.timeStamp - N.current < 400 ? "trackpad" : "mouse";
8954
8955
  M((e) => e === t ? e : t);
8955
8956
  }
8956
8957
  G && !w && !e.ctrlKey && (k(!0), A.current && clearTimeout(A.current), A.current = setTimeout(() => k(!1), 1600));
8957
- }, [G, w]), ue = a((e) => {
8958
+ }, [G, w]), de = a((e) => {
8958
8959
  G && e.button === 0 && (D(!0), k(!1));
8959
- }, [G]), de = a(() => {
8960
+ }, [G]), fe = a(() => {
8960
8961
  G && D(!1);
8961
8962
  }, [G]);
8962
8963
  return c(() => {
@@ -8975,23 +8976,23 @@ function vp(e) {
8975
8976
  height: "100%",
8976
8977
  position: "relative"
8977
8978
  },
8978
- onContextMenu: re,
8979
- onPointerDown: ue,
8980
- onPointerLeave: de,
8981
- onWheel: le,
8979
+ onContextMenu: ie,
8980
+ onPointerDown: de,
8981
+ onPointerLeave: fe,
8982
+ onWheel: ue,
8982
8983
  children: [
8983
8984
  /* @__PURE__ */ _(gd, {
8984
- nodes: R,
8985
- edges: B,
8986
- onNodesChange: z,
8987
- onEdgesChange: H,
8988
- onSelectionChange: ne,
8989
- onMoveStart: te,
8985
+ nodes: ee,
8986
+ edges: V,
8987
+ onNodesChange: B,
8988
+ onEdgesChange: U,
8989
+ onSelectionChange: re,
8990
+ onMoveStart: ne,
8990
8991
  nodeTypes: gp,
8991
8992
  fitView: !0,
8992
8993
  fitViewOptions: _p,
8993
8994
  minZoom: .2,
8994
- translateExtent: U,
8995
+ translateExtent: W,
8995
8996
  nodesDraggable: !1,
8996
8997
  nodesConnectable: !1,
8997
8998
  elementsSelectable: !0,
@@ -9001,10 +9002,10 @@ function vp(e) {
9001
9002
  selectionOnDrag: !0,
9002
9003
  selectionMode: Ca.Partial,
9003
9004
  connectOnClick: !1,
9004
- panOnDrag: ce,
9005
- zoomOnScroll: oe,
9006
- panOnScroll: se,
9007
- preventScrolling: ae,
9005
+ panOnDrag: le,
9006
+ zoomOnScroll: se,
9007
+ panOnScroll: ce,
9008
+ preventScrolling: oe,
9008
9009
  zoomOnDoubleClick: !1,
9009
9010
  children: [
9010
9011
  /* @__PURE__ */ g(Dd, {
@@ -9027,7 +9028,7 @@ function vp(e) {
9027
9028
  className: "gn-top-left",
9028
9029
  children: [/* @__PURE__ */ _("span", {
9029
9030
  className: "gn-version-badge",
9030
- children: ["node-web-render v", "0.3.20"]
9031
+ children: ["node-web-render v", "0.3.21"]
9031
9032
  }), i.length > 1 ? /* @__PURE__ */ g("nav", {
9032
9033
  className: "gn-breadcrumbs",
9033
9034
  "aria-label": "Node group path",
@@ -9068,12 +9069,12 @@ function vp(e) {
9068
9069
  type: "button",
9069
9070
  className: "gn-context-menu__item",
9070
9071
  role: "menuitem",
9071
- onClick: ie,
9072
+ onClick: ae,
9072
9073
  children: "Copy selected nodes to Tree Clipper magic string"
9073
9074
  })
9074
9075
  }) : null,
9075
- N || F ? /* @__PURE__ */ g("div", {
9076
- className: `gn-context-toast${F ? " gnwr-leaving" : ""}`,
9076
+ P || I ? /* @__PURE__ */ g("div", {
9077
+ className: `gn-context-toast${I ? " gnwr-leaving" : ""}`,
9077
9078
  role: "status",
9078
9079
  children: "Copied Tree Clipper magic string"
9079
9080
  }) : null
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geonodes-web-render",
3
- "version": "0.3.20",
3
+ "version": "0.3.21",
4
4
  "description": "Browser-based viewer for Blender Geometry Nodes exported via Tree Clipper. Renders node trees as a read-only, Blender-styled graph.",
5
5
  "type": "module",
6
6
  "exports": {