@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.js CHANGED
@@ -2213,6 +2213,14 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2213
2213
  renderer.toneMappingExposure = 1.2;
2214
2214
  const canvas = renderer.domElement;
2215
2215
  canvas.style.setProperty("display", "block", "important");
2216
+ canvas.draggable = false;
2217
+ canvas.style.userSelect = "none";
2218
+ canvas.style.setProperty("-webkit-user-drag", "none");
2219
+ canvas.style.touchAction = "none";
2220
+ const onDragStart = (e) => e.preventDefault();
2221
+ canvas.addEventListener("dragstart", onDragStart);
2222
+ const onSelectStart = (e) => e.preventDefault();
2223
+ canvas.addEventListener("selectstart", onSelectStart);
2216
2224
  container.appendChild(canvas);
2217
2225
  const controls = new OrbitControls(camera, canvas);
2218
2226
  controls.enableDamping = true;
@@ -2221,6 +2229,7 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2221
2229
  controls.zoomSpeed = 1.2;
2222
2230
  controls.minDistance = 10;
2223
2231
  controls.maxDistance = 3e4;
2232
+ controls.screenSpacePanning = true;
2224
2233
  scene.add(new THREE.AmbientLight(16777215, 0.8));
2225
2234
  const stars = createStarField(4e3, 8e3);
2226
2235
  stars.visible = style.starField;
@@ -2234,23 +2243,35 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2234
2243
  controls.enableZoom = false;
2235
2244
  const flags = {
2236
2245
  is2D: false,
2237
- keyboardMode3D: cameraMode
2246
+ keyboardMode3D: cameraMode,
2247
+ rotateButton: null
2238
2248
  };
2239
- const _wheelDir = new THREE.Vector3();
2249
+ const _wheelOffset = new THREE.Vector3();
2240
2250
  const onWheel = (e) => {
2241
2251
  if (flags.is2D) return;
2242
2252
  e.preventDefault();
2243
2253
  let delta = -e.deltaY;
2244
2254
  if (e.deltaMode === 1) delta *= 40;
2245
2255
  if (e.deltaMode === 2) delta *= 800;
2246
- camera.getWorldDirection(_wheelDir);
2247
- const dist = camera.position.distanceTo(controls.target);
2256
+ const target = controls.target;
2257
+ _wheelOffset.copy(camera.position).sub(target);
2258
+ const dist = _wheelOffset.length();
2248
2259
  const moveAmount = delta * 2e-3 * Math.max(dist * 0.1, 1);
2249
- camera.position.addScaledVector(_wheelDir, moveAmount);
2250
- controls.target.addScaledVector(_wheelDir, moveAmount);
2260
+ const newDist = Math.min(
2261
+ Math.max(dist - moveAmount, controls.minDistance),
2262
+ controls.maxDistance
2263
+ );
2264
+ _wheelOffset.setLength(newDist);
2265
+ camera.position.copy(target).add(_wheelOffset);
2251
2266
  };
2252
2267
  canvas.addEventListener("wheel", onWheel, { passive: false });
2253
- const scrollCleanup = () => canvas.removeEventListener("wheel", onWheel);
2268
+ const trackballCleanup = setupTrackballRotation(canvas, camera, controls, flags);
2269
+ const scrollCleanup = () => {
2270
+ canvas.removeEventListener("wheel", onWheel);
2271
+ canvas.removeEventListener("dragstart", onDragStart);
2272
+ canvas.removeEventListener("selectstart", onSelectStart);
2273
+ trackballCleanup();
2274
+ };
2254
2275
  return {
2255
2276
  scene,
2256
2277
  camera,
@@ -2266,24 +2287,80 @@ function createScene(container, backgroundColor, style, rendererConfig) {
2266
2287
  flags
2267
2288
  };
2268
2289
  }
2269
- const MOUSE_ACTION = {
2270
- rotate: THREE.MOUSE.ROTATE,
2271
- pan: THREE.MOUSE.PAN
2272
- };
2290
+ const TRACKBALL_SPEED = 4e-3;
2291
+ function setupTrackballRotation(canvas, camera, controls, flags) {
2292
+ let rotating = false;
2293
+ let lastX = 0;
2294
+ let lastY = 0;
2295
+ const _offset2 = new THREE.Vector3();
2296
+ const _right2 = new THREE.Vector3();
2297
+ const _upAxis = new THREE.Vector3();
2298
+ const _q2 = new THREE.Quaternion();
2299
+ const _qPitch = new THREE.Quaternion();
2300
+ function onDown(e) {
2301
+ if (flags.rotateButton == null || e.button !== flags.rotateButton) return;
2302
+ rotating = true;
2303
+ lastX = e.clientX;
2304
+ lastY = e.clientY;
2305
+ try {
2306
+ canvas.setPointerCapture(e.pointerId);
2307
+ } catch {
2308
+ }
2309
+ }
2310
+ function onMove(e) {
2311
+ if (!rotating) return;
2312
+ const dx = e.clientX - lastX;
2313
+ const dy = e.clientY - lastY;
2314
+ lastX = e.clientX;
2315
+ lastY = e.clientY;
2316
+ if (!dx && !dy) return;
2317
+ const target = controls.target;
2318
+ _offset2.copy(camera.position).sub(target);
2319
+ _right2.setFromMatrixColumn(camera.matrix, 0);
2320
+ _upAxis.setFromMatrixColumn(camera.matrix, 1);
2321
+ _q2.setFromAxisAngle(_upAxis, -dx * TRACKBALL_SPEED);
2322
+ _qPitch.setFromAxisAngle(_right2, -dy * TRACKBALL_SPEED);
2323
+ _q2.multiply(_qPitch);
2324
+ _offset2.applyQuaternion(_q2);
2325
+ camera.up.applyQuaternion(_q2).normalize();
2326
+ camera.position.copy(target).add(_offset2);
2327
+ camera.lookAt(target);
2328
+ }
2329
+ function onUp(e) {
2330
+ if (!rotating) return;
2331
+ rotating = false;
2332
+ try {
2333
+ canvas.releasePointerCapture(e.pointerId);
2334
+ } catch {
2335
+ }
2336
+ }
2337
+ canvas.addEventListener("pointerdown", onDown);
2338
+ canvas.addEventListener("pointermove", onMove);
2339
+ canvas.addEventListener("pointerup", onUp);
2340
+ canvas.addEventListener("pointercancel", onUp);
2341
+ return () => {
2342
+ canvas.removeEventListener("pointerdown", onDown);
2343
+ canvas.removeEventListener("pointermove", onMove);
2344
+ canvas.removeEventListener("pointerup", onUp);
2345
+ canvas.removeEventListener("pointercancel", onUp);
2346
+ };
2347
+ }
2273
2348
  function applyNavigationMode(state, is2D, nav) {
2274
2349
  const { controls, camera, keyboard } = state;
2275
2350
  state.flags.is2D = is2D;
2276
2351
  const left = (nav == null ? void 0 : nav.leftButton) ?? (is2D ? "pan" : "rotate");
2277
2352
  const right = (nav == null ? void 0 : nav.rightButton) ?? (is2D ? "rotate" : "pan");
2353
+ const NONE = -1;
2278
2354
  controls.mouseButtons = {
2279
- LEFT: MOUSE_ACTION[left],
2355
+ LEFT: left === "pan" ? THREE.MOUSE.PAN : NONE,
2280
2356
  MIDDLE: THREE.MOUSE.DOLLY,
2281
- RIGHT: MOUSE_ACTION[right]
2357
+ RIGHT: right === "pan" ? THREE.MOUSE.PAN : NONE
2282
2358
  };
2283
- controls.enableRotate = left === "rotate" || right === "rotate";
2359
+ controls.enableRotate = false;
2360
+ state.flags.rotateButton = left === "rotate" ? 0 : right === "rotate" ? 2 : null;
2284
2361
  controls.touches = left === "pan" ? { ONE: THREE.TOUCH.PAN, TWO: THREE.TOUCH.DOLLY_PAN } : { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };
2285
2362
  controls.enableZoom = is2D;
2286
- controls.screenSpacePanning = is2D;
2363
+ controls.screenSpacePanning = true;
2287
2364
  const kb = (nav == null ? void 0 : nav.keyboard) ?? (is2D ? "pan" : state.flags.keyboardMode3D);
2288
2365
  if (kb === "off") {
2289
2366
  keyboard.setEnabled(false);
@@ -2619,6 +2696,7 @@ function animateCamera(camera, controls, targetPos, targetLookAt, duration) {
2619
2696
  function zoomToFitPositions(camera, controls, positions, duration, padding) {
2620
2697
  const count = positions.length / 3;
2621
2698
  if (count === 0) return;
2699
+ camera.up.set(0, 1, 0);
2622
2700
  let cx = 0, cy = 0, cz = 0;
2623
2701
  for (let i = 0; i < count; i++) {
2624
2702
  cx += positions[i * 3];
@@ -2863,8 +2941,8 @@ function setupInteraction(canvas, camera, controls, getNodesMesh, getNodes, call
2863
2941
  }
2864
2942
  }
2865
2943
  function onContextMenu2(e) {
2866
- if (!callbacks.onContextMenu) return;
2867
2944
  e.preventDefault();
2945
+ if (!callbacks.onContextMenu) return;
2868
2946
  const nodesMesh = getNodesMesh();
2869
2947
  if (!nodesMesh) return;
2870
2948
  const rect = canvas.getBoundingClientRect();
@@ -3786,7 +3864,14 @@ function NetworkGraph3DInner(props, ref) {
3786
3864
  {
3787
3865
  ref: containerRef,
3788
3866
  tabIndex: -1,
3789
- style: { width: "100%", height: "100%", outline: "none" }
3867
+ style: {
3868
+ width: "100%",
3869
+ height: "100%",
3870
+ outline: "none",
3871
+ userSelect: "none",
3872
+ WebkitUserSelect: "none"
3873
+ },
3874
+ onDragStart: (e) => e.preventDefault()
3790
3875
  }
3791
3876
  );
3792
3877
  }