New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@threlte/core

Package Overview
Dependencies
Maintainers
1
Versions
114
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@threlte/core - npm Package Compare versions

Comparing version 4.1.1 to 4.1.2

8

dist/CHANGELOG.md
# @threlte/core
## 4.1.2
### Patch Changes
- cd07968: Validate click events to make sure the last pointerdown event hit the same instance as the click
event did. This heuristic more closely resembles how the DOM works, and prevents accidental clicks
while e.g. using OrbitControls or otherwise dragging on the canvas.
## 4.1.1

@@ -4,0 +12,0 @@

1

dist/lib/interactivity.d.ts

@@ -11,2 +11,3 @@ import type { ThrelteContext, ThrelteRenderContext, ThrelteRootContext } from '../types/types';

* ```
*
* @param ctx

@@ -13,0 +14,0 @@ * @param rootCtx

@@ -31,2 +31,3 @@ import { onDestroy } from 'svelte';

* ```
*
* @param ctx

@@ -44,16 +45,33 @@ * @param rootCtx

onDestroy(unsubscribePointer);
// to validate the click event, the click
// event must intersect the same object as
// the preceding pointerdown event
let pointerDownOn;
const onEvent = (e) => {
e.preventDefault();
const eventType = e.type;
ctx.pointerOverCanvas.set(true);
renderCtx.pointerInvalidated = true;
setPointerFromEvent(ctx, e);
if (rootCtx.interactiveObjects.size === 0 || rootCtx.raycastableObjects.size === 0)
// maybe get an intersection with an object
const intersection = getFirstIntersection(rootCtx, pointer, camera);
if (eventType === 'pointerdown') {
// Remember which object was pressed in order to validate the next click event
pointerDownOn = intersection
? { object: intersection.object, instanceId: intersection.instanceId }
: null;
}
if (eventType === 'click') {
if (!isValidClickEvent(intersection, pointerDownOn)) {
pointerDownOn = null;
return;
}
pointerDownOn = null;
}
if (!intersection)
return;
const intersects = runRaycaster(rootCtx, pointer, camera, Array.from(rootCtx.raycastableObjects));
if (intersects.length > 0 && rootCtx.interactiveObjects.has(intersects[0].object)) {
getThrelteUserData(intersects[0].object).eventDispatcher?.(e.type, {
...intersects[0],
event: e
});
}
getThrelteUserData(intersection.object).eventDispatcher?.(eventType, {
...intersection,
event: e
});
};

@@ -68,3 +86,23 @@ return {

};
function getFirstIntersection(rootCtx, pointer, camera) {
if (rootCtx.interactiveObjects.size === 0 || rootCtx.raycastableObjects.size === 0)
return null;
const intersects = runRaycaster(rootCtx, pointer, camera, Array.from(rootCtx.raycastableObjects));
if (intersects.length === 0 || !rootCtx.interactiveObjects.has(intersects[0].object))
return null;
return intersects[0];
}
/**
* Validates a click event to make sure the last pointerdown event
* hit the same instance as the click event did. This heuristic
* resembles how the DOM works and prevents accidental clicks while e.g.
* using OrbitControls.
*/
function isValidClickEvent(intersection, pointerDownOn) {
if (!intersection || !pointerDownOn)
return false;
return (intersection.object.uuid === pointerDownOn.object.uuid &&
intersection.instanceId === pointerDownOn.instanceId);
}
/**
* Some events can't be captured on Mouse- or PointerEvents.

@@ -71,0 +109,0 @@ * Specifically pointerleave and pointerenter are hard to capture

2

package.json
{
"name": "@threlte/core",
"version": "4.1.1",
"version": "4.1.2",
"author": "Grischa Erbe <hello@legrisch.com> (https://legrisch.com)",

@@ -5,0 +5,0 @@ "license": "MIT",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc