@cocorof/graphier 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2231,6 +2231,14 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2231
2231
  renderer.toneMappingExposure = 1.2;
2232
2232
  const canvas = renderer.domElement;
2233
2233
  canvas.style.setProperty("display", "block", "important");
2234
+ canvas.draggable = false;
2235
+ canvas.style.userSelect = "none";
2236
+ canvas.style.setProperty("-webkit-user-drag", "none");
2237
+ canvas.style.touchAction = "none";
2238
+ const onDragStart = (e) => e.preventDefault();
2239
+ canvas.addEventListener("dragstart", onDragStart);
2240
+ const onSelectStart = (e) => e.preventDefault();
2241
+ canvas.addEventListener("selectstart", onSelectStart);
2234
2242
  container.appendChild(canvas);
2235
2243
  const controls = new OrbitControls(camera, canvas);
2236
2244
  controls.enableDamping = true;
@@ -2239,6 +2247,7 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2239
2247
  controls.zoomSpeed = 1.2;
2240
2248
  controls.minDistance = 10;
2241
2249
  controls.maxDistance = 3e4;
2250
+ controls.screenSpacePanning = true;
2242
2251
  scene.add(new THREE__namespace.AmbientLight(16777215, 0.8));
2243
2252
  const stars = createStarField(4e3, 8e3);
2244
2253
  stars.visible = style.starField;
@@ -2252,23 +2261,35 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2252
2261
  controls.enableZoom = false;
2253
2262
  const flags = {
2254
2263
  is2D: false,
2255
- keyboardMode3D: cameraMode
2264
+ keyboardMode3D: cameraMode,
2265
+ rotateButton: null
2256
2266
  };
2257
- const _wheelDir = new THREE__namespace.Vector3();
2267
+ const _wheelOffset = new THREE__namespace.Vector3();
2258
2268
  const onWheel = (e) => {
2259
2269
  if (flags.is2D) return;
2260
2270
  e.preventDefault();
2261
2271
  let delta = -e.deltaY;
2262
2272
  if (e.deltaMode === 1) delta *= 40;
2263
2273
  if (e.deltaMode === 2) delta *= 800;
2264
- camera.getWorldDirection(_wheelDir);
2265
- const dist = camera.position.distanceTo(controls.target);
2274
+ const target = controls.target;
2275
+ _wheelOffset.copy(camera.position).sub(target);
2276
+ const dist = _wheelOffset.length();
2266
2277
  const moveAmount = delta * 2e-3 * Math.max(dist * 0.1, 1);
2267
- camera.position.addScaledVector(_wheelDir, moveAmount);
2268
- controls.target.addScaledVector(_wheelDir, moveAmount);
2278
+ const newDist = Math.min(
2279
+ Math.max(dist - moveAmount, controls.minDistance),
2280
+ controls.maxDistance
2281
+ );
2282
+ _wheelOffset.setLength(newDist);
2283
+ camera.position.copy(target).add(_wheelOffset);
2269
2284
  };
2270
2285
  canvas.addEventListener("wheel", onWheel, { passive: false });
2271
- const scrollCleanup = () => canvas.removeEventListener("wheel", onWheel);
2286
+ const trackballCleanup = setupTrackballRotation(canvas, camera, controls, flags);
2287
+ const scrollCleanup = () => {
2288
+ canvas.removeEventListener("wheel", onWheel);
2289
+ canvas.removeEventListener("dragstart", onDragStart);
2290
+ canvas.removeEventListener("selectstart", onSelectStart);
2291
+ trackballCleanup();
2292
+ };
2272
2293
  return {
2273
2294
  scene,
2274
2295
  camera,
@@ -2284,24 +2305,80 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2284
2305
  flags
2285
2306
  };
2286
2307
  }
2287
- const MOUSE_ACTION = {
2288
- rotate: THREE__namespace.MOUSE.ROTATE,
2289
- pan: THREE__namespace.MOUSE.PAN
2290
- };
2308
+ const TRACKBALL_SPEED = 4e-3;
2309
+ function setupTrackballRotation(canvas, camera, controls, flags) {
2310
+ let rotating = false;
2311
+ let lastX = 0;
2312
+ let lastY = 0;
2313
+ const _offset2 = new THREE__namespace.Vector3();
2314
+ const _right2 = new THREE__namespace.Vector3();
2315
+ const _upAxis = new THREE__namespace.Vector3();
2316
+ const _q2 = new THREE__namespace.Quaternion();
2317
+ const _qPitch = new THREE__namespace.Quaternion();
2318
+ function onDown(e) {
2319
+ if (flags.rotateButton == null || e.button !== flags.rotateButton) return;
2320
+ rotating = true;
2321
+ lastX = e.clientX;
2322
+ lastY = e.clientY;
2323
+ try {
2324
+ canvas.setPointerCapture(e.pointerId);
2325
+ } catch {
2326
+ }
2327
+ }
2328
+ function onMove(e) {
2329
+ if (!rotating) return;
2330
+ const dx = e.clientX - lastX;
2331
+ const dy = e.clientY - lastY;
2332
+ lastX = e.clientX;
2333
+ lastY = e.clientY;
2334
+ if (!dx && !dy) return;
2335
+ const target = controls.target;
2336
+ _offset2.copy(camera.position).sub(target);
2337
+ _right2.setFromMatrixColumn(camera.matrix, 0);
2338
+ _upAxis.setFromMatrixColumn(camera.matrix, 1);
2339
+ _q2.setFromAxisAngle(_upAxis, -dx * TRACKBALL_SPEED);
2340
+ _qPitch.setFromAxisAngle(_right2, -dy * TRACKBALL_SPEED);
2341
+ _q2.multiply(_qPitch);
2342
+ _offset2.applyQuaternion(_q2);
2343
+ camera.up.applyQuaternion(_q2).normalize();
2344
+ camera.position.copy(target).add(_offset2);
2345
+ camera.lookAt(target);
2346
+ }
2347
+ function onUp(e) {
2348
+ if (!rotating) return;
2349
+ rotating = false;
2350
+ try {
2351
+ canvas.releasePointerCapture(e.pointerId);
2352
+ } catch {
2353
+ }
2354
+ }
2355
+ canvas.addEventListener("pointerdown", onDown);
2356
+ canvas.addEventListener("pointermove", onMove);
2357
+ canvas.addEventListener("pointerup", onUp);
2358
+ canvas.addEventListener("pointercancel", onUp);
2359
+ return () => {
2360
+ canvas.removeEventListener("pointerdown", onDown);
2361
+ canvas.removeEventListener("pointermove", onMove);
2362
+ canvas.removeEventListener("pointerup", onUp);
2363
+ canvas.removeEventListener("pointercancel", onUp);
2364
+ };
2365
+ }
2291
2366
  function applyNavigationMode(state, is2D, nav) {
2292
2367
  const { controls, camera, keyboard } = state;
2293
2368
  state.flags.is2D = is2D;
2294
2369
  const left = (nav == null ? void 0 : nav.leftButton) ?? (is2D ? "pan" : "rotate");
2295
2370
  const right = (nav == null ? void 0 : nav.rightButton) ?? (is2D ? "rotate" : "pan");
2371
+ const NONE = -1;
2296
2372
  controls.mouseButtons = {
2297
- LEFT: MOUSE_ACTION[left],
2373
+ LEFT: left === "pan" ? THREE__namespace.MOUSE.PAN : NONE,
2298
2374
  MIDDLE: THREE__namespace.MOUSE.DOLLY,
2299
- RIGHT: MOUSE_ACTION[right]
2375
+ RIGHT: right === "pan" ? THREE__namespace.MOUSE.PAN : NONE
2300
2376
  };
2301
- controls.enableRotate = left === "rotate" || right === "rotate";
2377
+ controls.enableRotate = false;
2378
+ state.flags.rotateButton = left === "rotate" ? 0 : right === "rotate" ? 2 : null;
2302
2379
  controls.touches = left === "pan" ? { ONE: THREE__namespace.TOUCH.PAN, TWO: THREE__namespace.TOUCH.DOLLY_PAN } : { ONE: THREE__namespace.TOUCH.ROTATE, TWO: THREE__namespace.TOUCH.DOLLY_PAN };
2303
2380
  controls.enableZoom = is2D;
2304
- controls.screenSpacePanning = is2D;
2381
+ controls.screenSpacePanning = true;
2305
2382
  const kb = (nav == null ? void 0 : nav.keyboard) ?? (is2D ? "pan" : state.flags.keyboardMode3D);
2306
2383
  if (kb === "off") {
2307
2384
  keyboard.setEnabled(false);
@@ -2637,6 +2714,7 @@ function animateCamera(camera, controls, targetPos, targetLookAt, duration) {
2637
2714
  function zoomToFitPositions(camera, controls, positions, duration, padding) {
2638
2715
  const count = positions.length / 3;
2639
2716
  if (count === 0) return;
2717
+ camera.up.set(0, 1, 0);
2640
2718
  let cx = 0, cy = 0, cz = 0;
2641
2719
  for (let i = 0; i < count; i++) {
2642
2720
  cx += positions[i * 3];
@@ -2881,8 +2959,8 @@ function setupInteraction(canvas, camera, controls, getNodesMesh, getNodes, call
2881
2959
  }
2882
2960
  }
2883
2961
  function onContextMenu2(e) {
2884
- if (!callbacks.onContextMenu) return;
2885
2962
  e.preventDefault();
2963
+ if (!callbacks.onContextMenu) return;
2886
2964
  const nodesMesh = getNodesMesh();
2887
2965
  if (!nodesMesh) return;
2888
2966
  const rect = canvas.getBoundingClientRect();
@@ -3804,7 +3882,14 @@ function NetworkGraph3DInner(props, ref) {
3804
3882
  {
3805
3883
  ref: containerRef,
3806
3884
  tabIndex: -1,
3807
- style: { width: "100%", height: "100%", outline: "none" }
3885
+ style: {
3886
+ width: "100%",
3887
+ height: "100%",
3888
+ outline: "none",
3889
+ userSelect: "none",
3890
+ WebkitUserSelect: "none"
3891
+ },
3892
+ onDragStart: (e) => e.preventDefault()
3808
3893
  }
3809
3894
  );
3810
3895
  }