Thatâs the browserâs native contextmenu event â the Hotspots sample just suppresses it on the canvas. Add this in your componentâs awake():
this.context.domElement.addEventListener("contextmenu", e => e.preventDefault());
context.domElement is the canvas, so the menu wonât pop over your scene. If you only want it blocked while youâre actually dragging, gate it on your drag flag instead of blocking always.
Iâm not fully certain whether current Needle versions expose a built-in toggle for this, so the listener is the safe, version âŠ
Worth knowing why it behaves: your component exposes isCameraController, so the engine leaves the camera alone and doesnât attach its own controls. Thatâs why the held-button rotation and the click-to-select hotspot coexist.
Two small things you may want later:
Pointer speed: context.input.pointerMovementSensitivity scales getPointerPositionDelta, so users can tune it without touching your numbers.
Mobile: pointerdown on the canvas plus pointerup on window covers touch too, but add touch-action: none to the canvas or the browser may scroll or zoom while you drag.
If you later want OrbitControls-style zoom on a wheel or pinch, thatâs a separate handler â say the word and Iâll add it.