@react-three/fiber 10.0.0-canary.6d6e5ab → 10.0.0-canary.7b7cecd

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
@@ -1106,6 +1106,41 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
1106
1106
  captureData.target.releasePointerCapture(pointerId);
1107
1107
  }
1108
1108
  }
1109
+ function swapInteractivity(store, object, newObject) {
1110
+ const { internal } = store.getState();
1111
+ for (let i = 0; i < internal.interaction.length; i++) {
1112
+ if (internal.interaction[i] === object) internal.interaction[i] = newObject;
1113
+ }
1114
+ for (const pointerState of internal.pointerMap.values()) {
1115
+ for (let i = 0; i < pointerState.initialHits.length; i++) {
1116
+ if (pointerState.initialHits[i] === object) pointerState.initialHits[i] = newObject;
1117
+ }
1118
+ pointerState.hovered.forEach((value, key) => {
1119
+ if (value.eventObject === object || value.object === object) {
1120
+ pointerState.hovered.delete(key);
1121
+ const next = {
1122
+ ...value,
1123
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
1124
+ object: value.object === object ? newObject : value.object
1125
+ };
1126
+ pointerState.hovered.set(makeId(next), next);
1127
+ }
1128
+ });
1129
+ const captureData = pointerState.captured.get(object);
1130
+ if (captureData) {
1131
+ pointerState.captured.delete(object);
1132
+ pointerState.captured.set(newObject, {
1133
+ ...captureData,
1134
+ intersection: {
1135
+ ...captureData.intersection,
1136
+ object: captureData.intersection.object === object ? newObject : captureData.intersection.object,
1137
+ eventObject: captureData.intersection.eventObject === object ? newObject : captureData.intersection.eventObject
1138
+ }
1139
+ });
1140
+ }
1141
+ }
1142
+ unregisterVisibility(store, object);
1143
+ }
1109
1144
  function removeInteractivity(store, object) {
1110
1145
  const { internal } = store.getState();
1111
1146
  internal.interaction = internal.interaction.filter((o) => o !== object);
@@ -13885,7 +13920,9 @@ function swapReconstructedInstances() {
13885
13920
  }
13886
13921
  }
13887
13922
  if (instance.isHidden) unhideInstance(instance);
13888
- if (isObject3D(instance.object)) removeInteractivity(findInitialRoot(instance), instance.object);
13923
+ if (isObject3D(instance.object) && !instance.parent) {
13924
+ removeInteractivity(findInitialRoot(instance), instance.object);
13925
+ }
13889
13926
  if (instance.object.__r3f) delete instance.object.__r3f;
13890
13927
  if (instance.type !== "primitive") disposeOnIdle(instance.object);
13891
13928
  }
@@ -13894,9 +13931,13 @@ function swapReconstructedInstances() {
13894
13931
  const parent = instance.parent;
13895
13932
  if (parent) {
13896
13933
  const target = catalogue[toPascalCase(instance.type)];
13934
+ const prevObject = instance.object;
13897
13935
  instance.object = instance.props.object ?? new target(...instance.props.args ?? []);
13898
13936
  instance.object.__r3f = instance;
13899
13937
  setFiberRef(fiber, instance.object);
13938
+ if (isObject3D(prevObject) && isObject3D(instance.object)) {
13939
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
13940
+ }
13900
13941
  delete instance.appliedOnce;
13901
13942
  instance.eventCount = 0;
13902
13943
  instance.handlers = {};
@@ -15264,6 +15305,7 @@ exports.reconciler = reconciler;
15264
15305
  exports.registerPrimary = registerPrimary;
15265
15306
  exports.removeInteractivity = removeInteractivity;
15266
15307
  exports.resolve = resolve;
15308
+ exports.swapInteractivity = swapInteractivity;
15267
15309
  exports.unmountComponentAtNode = unmountComponentAtNode;
15268
15310
  exports.unregisterPrimary = unregisterPrimary;
15269
15311
  exports.updateCamera = updateCamera;
package/dist/index.d.cts CHANGED
@@ -1821,6 +1821,24 @@ declare module '@react-three/fiber' {
1821
1821
  */
1822
1822
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1823
1823
 
1824
+ /**
1825
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1826
+ *
1827
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1828
+ * instance. Removing the old object from the interaction state and registering the new one from
1829
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1830
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1831
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1832
+ * swap the user never asked to see (#3744).
1833
+ *
1834
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1835
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1836
+ *
1837
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1838
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1839
+ * cannot outlive the object it described.
1840
+ */
1841
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1824
1842
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1825
1843
  declare function createEvents(store: RootStore): {
1826
1844
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -3729,5 +3747,5 @@ declare function isOnce(value: unknown): value is {
3729
3747
  */
3730
3748
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
3731
3749
 
3732
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3750
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3733
3751
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DisposeOptions, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootState, RootStore, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureInput, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/index.d.mts CHANGED
@@ -1821,6 +1821,24 @@ declare module '@react-three/fiber' {
1821
1821
  */
1822
1822
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1823
1823
 
1824
+ /**
1825
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1826
+ *
1827
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1828
+ * instance. Removing the old object from the interaction state and registering the new one from
1829
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1830
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1831
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1832
+ * swap the user never asked to see (#3744).
1833
+ *
1834
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1835
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1836
+ *
1837
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1838
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1839
+ * cannot outlive the object it described.
1840
+ */
1841
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1824
1842
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1825
1843
  declare function createEvents(store: RootStore): {
1826
1844
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -3729,5 +3747,5 @@ declare function isOnce(value: unknown): value is {
3729
3747
  */
3730
3748
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
3731
3749
 
3732
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3750
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3733
3751
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DisposeOptions, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootState, RootStore, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureInput, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/index.d.ts CHANGED
@@ -1821,6 +1821,24 @@ declare module '@react-three/fiber' {
1821
1821
  */
1822
1822
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1823
1823
 
1824
+ /**
1825
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1826
+ *
1827
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1828
+ * instance. Removing the old object from the interaction state and registering the new one from
1829
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1830
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1831
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1832
+ * swap the user never asked to see (#3744).
1833
+ *
1834
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1835
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1836
+ *
1837
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1838
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1839
+ * cannot outlive the object it described.
1840
+ */
1841
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1824
1842
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1825
1843
  declare function createEvents(store: RootStore): {
1826
1844
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -3729,5 +3747,5 @@ declare function isOnce(value: unknown): value is {
3729
3747
  */
3730
3748
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
3731
3749
 
3732
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3750
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3733
3751
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DisposeOptions, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootState, RootStore, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureInput, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/index.mjs CHANGED
@@ -1086,6 +1086,41 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
1086
1086
  captureData.target.releasePointerCapture(pointerId);
1087
1087
  }
1088
1088
  }
1089
+ function swapInteractivity(store, object, newObject) {
1090
+ const { internal } = store.getState();
1091
+ for (let i = 0; i < internal.interaction.length; i++) {
1092
+ if (internal.interaction[i] === object) internal.interaction[i] = newObject;
1093
+ }
1094
+ for (const pointerState of internal.pointerMap.values()) {
1095
+ for (let i = 0; i < pointerState.initialHits.length; i++) {
1096
+ if (pointerState.initialHits[i] === object) pointerState.initialHits[i] = newObject;
1097
+ }
1098
+ pointerState.hovered.forEach((value, key) => {
1099
+ if (value.eventObject === object || value.object === object) {
1100
+ pointerState.hovered.delete(key);
1101
+ const next = {
1102
+ ...value,
1103
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
1104
+ object: value.object === object ? newObject : value.object
1105
+ };
1106
+ pointerState.hovered.set(makeId(next), next);
1107
+ }
1108
+ });
1109
+ const captureData = pointerState.captured.get(object);
1110
+ if (captureData) {
1111
+ pointerState.captured.delete(object);
1112
+ pointerState.captured.set(newObject, {
1113
+ ...captureData,
1114
+ intersection: {
1115
+ ...captureData.intersection,
1116
+ object: captureData.intersection.object === object ? newObject : captureData.intersection.object,
1117
+ eventObject: captureData.intersection.eventObject === object ? newObject : captureData.intersection.eventObject
1118
+ }
1119
+ });
1120
+ }
1121
+ }
1122
+ unregisterVisibility(store, object);
1123
+ }
1089
1124
  function removeInteractivity(store, object) {
1090
1125
  const { internal } = store.getState();
1091
1126
  internal.interaction = internal.interaction.filter((o) => o !== object);
@@ -13865,7 +13900,9 @@ function swapReconstructedInstances() {
13865
13900
  }
13866
13901
  }
13867
13902
  if (instance.isHidden) unhideInstance(instance);
13868
- if (isObject3D(instance.object)) removeInteractivity(findInitialRoot(instance), instance.object);
13903
+ if (isObject3D(instance.object) && !instance.parent) {
13904
+ removeInteractivity(findInitialRoot(instance), instance.object);
13905
+ }
13869
13906
  if (instance.object.__r3f) delete instance.object.__r3f;
13870
13907
  if (instance.type !== "primitive") disposeOnIdle(instance.object);
13871
13908
  }
@@ -13874,9 +13911,13 @@ function swapReconstructedInstances() {
13874
13911
  const parent = instance.parent;
13875
13912
  if (parent) {
13876
13913
  const target = catalogue[toPascalCase(instance.type)];
13914
+ const prevObject = instance.object;
13877
13915
  instance.object = instance.props.object ?? new target(...instance.props.args ?? []);
13878
13916
  instance.object.__r3f = instance;
13879
13917
  setFiberRef(fiber, instance.object);
13918
+ if (isObject3D(prevObject) && isObject3D(instance.object)) {
13919
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
13920
+ }
13880
13921
  delete instance.appliedOnce;
13881
13922
  instance.eventCount = 0;
13882
13923
  instance.handlers = {};
@@ -15176,4 +15217,4 @@ function Canvas(props) {
15176
15217
 
15177
15218
  extend(THREE);
15178
15219
 
15179
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
15220
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
package/dist/legacy.cjs CHANGED
@@ -1115,6 +1115,41 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
1115
1115
  captureData.target.releasePointerCapture(pointerId);
1116
1116
  }
1117
1117
  }
1118
+ function swapInteractivity(store, object, newObject) {
1119
+ const { internal } = store.getState();
1120
+ for (let i = 0; i < internal.interaction.length; i++) {
1121
+ if (internal.interaction[i] === object) internal.interaction[i] = newObject;
1122
+ }
1123
+ for (const pointerState of internal.pointerMap.values()) {
1124
+ for (let i = 0; i < pointerState.initialHits.length; i++) {
1125
+ if (pointerState.initialHits[i] === object) pointerState.initialHits[i] = newObject;
1126
+ }
1127
+ pointerState.hovered.forEach((value, key) => {
1128
+ if (value.eventObject === object || value.object === object) {
1129
+ pointerState.hovered.delete(key);
1130
+ const next = {
1131
+ ...value,
1132
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
1133
+ object: value.object === object ? newObject : value.object
1134
+ };
1135
+ pointerState.hovered.set(makeId(next), next);
1136
+ }
1137
+ });
1138
+ const captureData = pointerState.captured.get(object);
1139
+ if (captureData) {
1140
+ pointerState.captured.delete(object);
1141
+ pointerState.captured.set(newObject, {
1142
+ ...captureData,
1143
+ intersection: {
1144
+ ...captureData.intersection,
1145
+ object: captureData.intersection.object === object ? newObject : captureData.intersection.object,
1146
+ eventObject: captureData.intersection.eventObject === object ? newObject : captureData.intersection.eventObject
1147
+ }
1148
+ });
1149
+ }
1150
+ }
1151
+ unregisterVisibility(store, object);
1152
+ }
1118
1153
  function removeInteractivity(store, object) {
1119
1154
  const { internal } = store.getState();
1120
1155
  internal.interaction = internal.interaction.filter((o) => o !== object);
@@ -13892,7 +13927,9 @@ function swapReconstructedInstances() {
13892
13927
  }
13893
13928
  }
13894
13929
  if (instance.isHidden) unhideInstance(instance);
13895
- if (isObject3D(instance.object)) removeInteractivity(findInitialRoot(instance), instance.object);
13930
+ if (isObject3D(instance.object) && !instance.parent) {
13931
+ removeInteractivity(findInitialRoot(instance), instance.object);
13932
+ }
13896
13933
  if (instance.object.__r3f) delete instance.object.__r3f;
13897
13934
  if (instance.type !== "primitive") disposeOnIdle(instance.object);
13898
13935
  }
@@ -13901,9 +13938,13 @@ function swapReconstructedInstances() {
13901
13938
  const parent = instance.parent;
13902
13939
  if (parent) {
13903
13940
  const target = catalogue[toPascalCase(instance.type)];
13941
+ const prevObject = instance.object;
13904
13942
  instance.object = instance.props.object ?? new target(...instance.props.args ?? []);
13905
13943
  instance.object.__r3f = instance;
13906
13944
  setFiberRef(fiber, instance.object);
13945
+ if (isObject3D(prevObject) && isObject3D(instance.object)) {
13946
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
13947
+ }
13907
13948
  delete instance.appliedOnce;
13908
13949
  instance.eventCount = 0;
13909
13950
  instance.handlers = {};
@@ -15224,6 +15265,7 @@ exports.reconciler = reconciler;
15224
15265
  exports.registerPrimary = registerPrimary;
15225
15266
  exports.removeInteractivity = removeInteractivity;
15226
15267
  exports.resolve = resolve;
15268
+ exports.swapInteractivity = swapInteractivity;
15227
15269
  exports.unmountComponentAtNode = unmountComponentAtNode;
15228
15270
  exports.unregisterPrimary = unregisterPrimary;
15229
15271
  exports.updateCamera = updateCamera;
package/dist/legacy.d.cts CHANGED
@@ -1821,6 +1821,24 @@ declare module '@react-three/fiber' {
1821
1821
  */
1822
1822
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1823
1823
 
1824
+ /**
1825
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1826
+ *
1827
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1828
+ * instance. Removing the old object from the interaction state and registering the new one from
1829
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1830
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1831
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1832
+ * swap the user never asked to see (#3744).
1833
+ *
1834
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1835
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1836
+ *
1837
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1838
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1839
+ * cannot outlive the object it described.
1840
+ */
1841
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1824
1842
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1825
1843
  declare function createEvents(store: RootStore): {
1826
1844
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -3729,5 +3747,5 @@ declare function isOnce(value: unknown): value is {
3729
3747
  */
3730
3748
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
3731
3749
 
3732
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3750
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3733
3751
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DisposeOptions, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, LegacyRootState as RootState, RootStore, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureInput, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/legacy.d.mts CHANGED
@@ -1821,6 +1821,24 @@ declare module '@react-three/fiber' {
1821
1821
  */
1822
1822
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1823
1823
 
1824
+ /**
1825
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1826
+ *
1827
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1828
+ * instance. Removing the old object from the interaction state and registering the new one from
1829
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1830
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1831
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1832
+ * swap the user never asked to see (#3744).
1833
+ *
1834
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1835
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1836
+ *
1837
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1838
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1839
+ * cannot outlive the object it described.
1840
+ */
1841
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1824
1842
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1825
1843
  declare function createEvents(store: RootStore): {
1826
1844
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -3729,5 +3747,5 @@ declare function isOnce(value: unknown): value is {
3729
3747
  */
3730
3748
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
3731
3749
 
3732
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3750
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3733
3751
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DisposeOptions, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, LegacyRootState as RootState, RootStore, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureInput, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/legacy.d.ts CHANGED
@@ -1821,6 +1821,24 @@ declare module '@react-three/fiber' {
1821
1821
  */
1822
1822
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1823
1823
 
1824
+ /**
1825
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1826
+ *
1827
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1828
+ * instance. Removing the old object from the interaction state and registering the new one from
1829
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1830
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1831
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1832
+ * swap the user never asked to see (#3744).
1833
+ *
1834
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1835
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1836
+ *
1837
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1838
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1839
+ * cannot outlive the object it described.
1840
+ */
1841
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1824
1842
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1825
1843
  declare function createEvents(store: RootStore): {
1826
1844
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -3729,5 +3747,5 @@ declare function isOnce(value: unknown): value is {
3729
3747
  */
3730
3748
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
3731
3749
 
3732
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3750
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
3733
3751
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DisposeOptions, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, LegacyRootState as RootState, RootStore, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureInput, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/legacy.mjs CHANGED
@@ -1095,6 +1095,41 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
1095
1095
  captureData.target.releasePointerCapture(pointerId);
1096
1096
  }
1097
1097
  }
1098
+ function swapInteractivity(store, object, newObject) {
1099
+ const { internal } = store.getState();
1100
+ for (let i = 0; i < internal.interaction.length; i++) {
1101
+ if (internal.interaction[i] === object) internal.interaction[i] = newObject;
1102
+ }
1103
+ for (const pointerState of internal.pointerMap.values()) {
1104
+ for (let i = 0; i < pointerState.initialHits.length; i++) {
1105
+ if (pointerState.initialHits[i] === object) pointerState.initialHits[i] = newObject;
1106
+ }
1107
+ pointerState.hovered.forEach((value, key) => {
1108
+ if (value.eventObject === object || value.object === object) {
1109
+ pointerState.hovered.delete(key);
1110
+ const next = {
1111
+ ...value,
1112
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
1113
+ object: value.object === object ? newObject : value.object
1114
+ };
1115
+ pointerState.hovered.set(makeId(next), next);
1116
+ }
1117
+ });
1118
+ const captureData = pointerState.captured.get(object);
1119
+ if (captureData) {
1120
+ pointerState.captured.delete(object);
1121
+ pointerState.captured.set(newObject, {
1122
+ ...captureData,
1123
+ intersection: {
1124
+ ...captureData.intersection,
1125
+ object: captureData.intersection.object === object ? newObject : captureData.intersection.object,
1126
+ eventObject: captureData.intersection.eventObject === object ? newObject : captureData.intersection.eventObject
1127
+ }
1128
+ });
1129
+ }
1130
+ }
1131
+ unregisterVisibility(store, object);
1132
+ }
1098
1133
  function removeInteractivity(store, object) {
1099
1134
  const { internal } = store.getState();
1100
1135
  internal.interaction = internal.interaction.filter((o) => o !== object);
@@ -13872,7 +13907,9 @@ function swapReconstructedInstances() {
13872
13907
  }
13873
13908
  }
13874
13909
  if (instance.isHidden) unhideInstance(instance);
13875
- if (isObject3D(instance.object)) removeInteractivity(findInitialRoot(instance), instance.object);
13910
+ if (isObject3D(instance.object) && !instance.parent) {
13911
+ removeInteractivity(findInitialRoot(instance), instance.object);
13912
+ }
13876
13913
  if (instance.object.__r3f) delete instance.object.__r3f;
13877
13914
  if (instance.type !== "primitive") disposeOnIdle(instance.object);
13878
13915
  }
@@ -13881,9 +13918,13 @@ function swapReconstructedInstances() {
13881
13918
  const parent = instance.parent;
13882
13919
  if (parent) {
13883
13920
  const target = catalogue[toPascalCase(instance.type)];
13921
+ const prevObject = instance.object;
13884
13922
  instance.object = instance.props.object ?? new target(...instance.props.args ?? []);
13885
13923
  instance.object.__r3f = instance;
13886
13924
  setFiberRef(fiber, instance.object);
13925
+ if (isObject3D(prevObject) && isObject3D(instance.object)) {
13926
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
13927
+ }
13887
13928
  delete instance.appliedOnce;
13888
13929
  instance.eventCount = 0;
13889
13930
  instance.handlers = {};
@@ -15136,4 +15177,4 @@ function Canvas(props) {
15136
15177
 
15137
15178
  extend(THREE);
15138
15179
 
15139
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
15180
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
@@ -1116,6 +1116,41 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
1116
1116
  captureData.target.releasePointerCapture(pointerId);
1117
1117
  }
1118
1118
  }
1119
+ function swapInteractivity(store, object, newObject) {
1120
+ const { internal } = store.getState();
1121
+ for (let i = 0; i < internal.interaction.length; i++) {
1122
+ if (internal.interaction[i] === object) internal.interaction[i] = newObject;
1123
+ }
1124
+ for (const pointerState of internal.pointerMap.values()) {
1125
+ for (let i = 0; i < pointerState.initialHits.length; i++) {
1126
+ if (pointerState.initialHits[i] === object) pointerState.initialHits[i] = newObject;
1127
+ }
1128
+ pointerState.hovered.forEach((value, key) => {
1129
+ if (value.eventObject === object || value.object === object) {
1130
+ pointerState.hovered.delete(key);
1131
+ const next = {
1132
+ ...value,
1133
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
1134
+ object: value.object === object ? newObject : value.object
1135
+ };
1136
+ pointerState.hovered.set(makeId(next), next);
1137
+ }
1138
+ });
1139
+ const captureData = pointerState.captured.get(object);
1140
+ if (captureData) {
1141
+ pointerState.captured.delete(object);
1142
+ pointerState.captured.set(newObject, {
1143
+ ...captureData,
1144
+ intersection: {
1145
+ ...captureData.intersection,
1146
+ object: captureData.intersection.object === object ? newObject : captureData.intersection.object,
1147
+ eventObject: captureData.intersection.eventObject === object ? newObject : captureData.intersection.eventObject
1148
+ }
1149
+ });
1150
+ }
1151
+ }
1152
+ unregisterVisibility(store, object);
1153
+ }
1119
1154
  function removeInteractivity(store, object) {
1120
1155
  const { internal } = store.getState();
1121
1156
  internal.interaction = internal.interaction.filter((o) => o !== object);
@@ -13893,7 +13928,9 @@ function swapReconstructedInstances() {
13893
13928
  }
13894
13929
  }
13895
13930
  if (instance.isHidden) unhideInstance(instance);
13896
- if (isObject3D(instance.object)) removeInteractivity(findInitialRoot(instance), instance.object);
13931
+ if (isObject3D(instance.object) && !instance.parent) {
13932
+ removeInteractivity(findInitialRoot(instance), instance.object);
13933
+ }
13897
13934
  if (instance.object.__r3f) delete instance.object.__r3f;
13898
13935
  if (instance.type !== "primitive") disposeOnIdle(instance.object);
13899
13936
  }
@@ -13902,9 +13939,13 @@ function swapReconstructedInstances() {
13902
13939
  const parent = instance.parent;
13903
13940
  if (parent) {
13904
13941
  const target = catalogue[toPascalCase(instance.type)];
13942
+ const prevObject = instance.object;
13905
13943
  instance.object = instance.props.object ?? new target(...instance.props.args ?? []);
13906
13944
  instance.object.__r3f = instance;
13907
13945
  setFiberRef(fiber, instance.object);
13946
+ if (isObject3D(prevObject) && isObject3D(instance.object)) {
13947
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
13948
+ }
13908
13949
  delete instance.appliedOnce;
13909
13950
  instance.eventCount = 0;
13910
13951
  instance.handlers = {};
@@ -16111,6 +16152,7 @@ exports.removeInteractivity = removeInteractivity;
16111
16152
  exports.removeNodes = removeNodes;
16112
16153
  exports.removeUniforms = removeUniforms;
16113
16154
  exports.resolve = resolve;
16155
+ exports.swapInteractivity = swapInteractivity;
16114
16156
  exports.unmountComponentAtNode = unmountComponentAtNode;
16115
16157
  exports.unregisterPrimary = unregisterPrimary;
16116
16158
  exports.updateCamera = updateCamera;
@@ -1824,6 +1824,24 @@ declare module '@react-three/fiber' {
1824
1824
  */
1825
1825
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1826
1826
 
1827
+ /**
1828
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1829
+ *
1830
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1831
+ * instance. Removing the old object from the interaction state and registering the new one from
1832
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1833
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1834
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1835
+ * swap the user never asked to see (#3744).
1836
+ *
1837
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1838
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1839
+ *
1840
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1841
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1842
+ * cannot outlive the object it described.
1843
+ */
1844
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1827
1845
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1828
1846
  declare function createEvents(store: RootStore): {
1829
1847
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -4146,5 +4164,5 @@ interface WebGPURootState extends Omit<RootState, 'renderer' | 'gl' | 'internal'
4146
4164
  internal: WebGPUInternalState
4147
4165
  }
4148
4166
 
4149
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
4167
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
4150
4168
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferCreator, BufferLike, BufferRecord, BufferStore, BuffersWithUtils, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, ClearBuffersFn, ClearNodesFn, ClearStorageFn, ClearUniformsFn, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, CreatorState, DefaultGLProps, DefaultRendererProps, Disposable, DisposeBuffersFn, DisposeOptions, DisposeStorageFn, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, WebGPUInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, LocalNodeCreator, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeCreator, NodeProps, NodeRecord, NodesWithUtils, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, WebGPUR3FRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, RebuildBuffersFn, RebuildNodesFn, RebuildStorageFn, RebuildUniformsFn, ReconcilerRoot, RemoveBuffersFn, RemoveNodesFn, RemoveStorageFn, RemoveUniformsFn, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, WebGPURootState as RootState, RootStore, ScopedStoreType, SetBlock, Size, StorageCreator, StorageLike, StorageRecord, StorageStore, StorageWithUtils, Subscription, TSLNode, TSLNodeInput, TextureEntry, TextureInput, TextureNode, TextureOperations, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UniformCreator, UniformValue, UniformsWithUtils, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, WebGPUDefaultProps, WebGPUProps, WebGPUShadowConfig, XRManager, XRPointerConfig };
@@ -1824,6 +1824,24 @@ declare module '@react-three/fiber' {
1824
1824
  */
1825
1825
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1826
1826
 
1827
+ /**
1828
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1829
+ *
1830
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1831
+ * instance. Removing the old object from the interaction state and registering the new one from
1832
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1833
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1834
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1835
+ * swap the user never asked to see (#3744).
1836
+ *
1837
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1838
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1839
+ *
1840
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1841
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1842
+ * cannot outlive the object it described.
1843
+ */
1844
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1827
1845
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1828
1846
  declare function createEvents(store: RootStore): {
1829
1847
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -4146,5 +4164,5 @@ interface WebGPURootState extends Omit<RootState, 'renderer' | 'gl' | 'internal'
4146
4164
  internal: WebGPUInternalState
4147
4165
  }
4148
4166
 
4149
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
4167
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
4150
4168
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferCreator, BufferLike, BufferRecord, BufferStore, BuffersWithUtils, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, ClearBuffersFn, ClearNodesFn, ClearStorageFn, ClearUniformsFn, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, CreatorState, DefaultGLProps, DefaultRendererProps, Disposable, DisposeBuffersFn, DisposeOptions, DisposeStorageFn, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, WebGPUInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, LocalNodeCreator, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeCreator, NodeProps, NodeRecord, NodesWithUtils, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, WebGPUR3FRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, RebuildBuffersFn, RebuildNodesFn, RebuildStorageFn, RebuildUniformsFn, ReconcilerRoot, RemoveBuffersFn, RemoveNodesFn, RemoveStorageFn, RemoveUniformsFn, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, WebGPURootState as RootState, RootStore, ScopedStoreType, SetBlock, Size, StorageCreator, StorageLike, StorageRecord, StorageStore, StorageWithUtils, Subscription, TSLNode, TSLNodeInput, TextureEntry, TextureInput, TextureNode, TextureOperations, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UniformCreator, UniformValue, UniformsWithUtils, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, WebGPUDefaultProps, WebGPUProps, WebGPUShadowConfig, XRManager, XRPointerConfig };
@@ -1824,6 +1824,24 @@ declare module '@react-three/fiber' {
1824
1824
  */
1825
1825
  declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Element;
1826
1826
 
1827
+ /**
1828
+ * Moves every trace of interactivity from one object to its replacement, for reconstruction.
1829
+ *
1830
+ * When `args` or a `primitive`'s `object` changes, R3F builds a new three object and keeps the same
1831
+ * instance. Removing the old object from the interaction state and registering the new one from
1832
+ * scratch makes events *work* again (#3778), but it forgets what was in flight: a pointer resting on
1833
+ * the object fires a second `onPointerEnter` without ever having left, and an active pointer capture
1834
+ * is dropped mid-drag. Rewriting the references instead keeps the interaction continuous across a
1835
+ * swap the user never asked to see (#3744).
1836
+ *
1837
+ * Captures are re-keyed rather than released, so the DOM-level capture on `captureData.target` is
1838
+ * left alone — releasing and re-acquiring it is precisely the glitch being avoided.
1839
+ *
1840
+ * Visibility handlers are deliberately not transferred: that registry is keyed by `object.uuid`, so
1841
+ * the replacement re-registers itself through `applyProps`. The old entry is dropped here so it
1842
+ * cannot outlive the object it described.
1843
+ */
1844
+ declare function swapInteractivity(store: RootStore, object: Object3D, newObject: Object3D): void;
1827
1845
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
1828
1846
  declare function createEvents(store: RootStore): {
1829
1847
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -4146,5 +4164,5 @@ interface WebGPURootState extends Omit<RootState, 'renderer' | 'gl' | 'internal'
4146
4164
  internal: WebGPUInternalState
4147
4165
  }
4148
4166
 
4149
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
4167
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
4150
4168
  export type { Act, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferCreator, BufferLike, BufferRecord, BufferStore, BuffersWithUtils, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, ClearBuffersFn, ClearNodesFn, ClearStorageFn, ClearUniformsFn, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, CreatorState, DefaultGLProps, DefaultRendererProps, Disposable, DisposeBuffersFn, DisposeOptions, DisposeStorageFn, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameNextCallback, FrameNextState, FrameState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, WebGPUInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, LocalNodeCreator, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeCreator, NodeProps, NodeRecord, NodesWithUtils, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, WebGPUR3FRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, RebuildBuffersFn, RebuildNodesFn, RebuildStorageFn, RebuildUniformsFn, ReconcilerRoot, RemoveBuffersFn, RemoveNodesFn, RemoveStorageFn, RemoveUniformsFn, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, WebGPURootState as RootState, RootStore, ScopedStoreType, SetBlock, Size, StorageCreator, StorageLike, StorageRecord, StorageStore, StorageWithUtils, Subscription, TSLNode, TSLNodeInput, TextureEntry, TextureInput, TextureNode, TextureOperations, TextureResult, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UniformCreator, UniformValue, UniformsWithUtils, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, WebGPUDefaultProps, WebGPUProps, WebGPUShadowConfig, XRManager, XRPointerConfig };
@@ -1096,6 +1096,41 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
1096
1096
  captureData.target.releasePointerCapture(pointerId);
1097
1097
  }
1098
1098
  }
1099
+ function swapInteractivity(store, object, newObject) {
1100
+ const { internal } = store.getState();
1101
+ for (let i = 0; i < internal.interaction.length; i++) {
1102
+ if (internal.interaction[i] === object) internal.interaction[i] = newObject;
1103
+ }
1104
+ for (const pointerState of internal.pointerMap.values()) {
1105
+ for (let i = 0; i < pointerState.initialHits.length; i++) {
1106
+ if (pointerState.initialHits[i] === object) pointerState.initialHits[i] = newObject;
1107
+ }
1108
+ pointerState.hovered.forEach((value, key) => {
1109
+ if (value.eventObject === object || value.object === object) {
1110
+ pointerState.hovered.delete(key);
1111
+ const next = {
1112
+ ...value,
1113
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
1114
+ object: value.object === object ? newObject : value.object
1115
+ };
1116
+ pointerState.hovered.set(makeId(next), next);
1117
+ }
1118
+ });
1119
+ const captureData = pointerState.captured.get(object);
1120
+ if (captureData) {
1121
+ pointerState.captured.delete(object);
1122
+ pointerState.captured.set(newObject, {
1123
+ ...captureData,
1124
+ intersection: {
1125
+ ...captureData.intersection,
1126
+ object: captureData.intersection.object === object ? newObject : captureData.intersection.object,
1127
+ eventObject: captureData.intersection.eventObject === object ? newObject : captureData.intersection.eventObject
1128
+ }
1129
+ });
1130
+ }
1131
+ }
1132
+ unregisterVisibility(store, object);
1133
+ }
1099
1134
  function removeInteractivity(store, object) {
1100
1135
  const { internal } = store.getState();
1101
1136
  internal.interaction = internal.interaction.filter((o) => o !== object);
@@ -13873,7 +13908,9 @@ function swapReconstructedInstances() {
13873
13908
  }
13874
13909
  }
13875
13910
  if (instance.isHidden) unhideInstance(instance);
13876
- if (isObject3D(instance.object)) removeInteractivity(findInitialRoot(instance), instance.object);
13911
+ if (isObject3D(instance.object) && !instance.parent) {
13912
+ removeInteractivity(findInitialRoot(instance), instance.object);
13913
+ }
13877
13914
  if (instance.object.__r3f) delete instance.object.__r3f;
13878
13915
  if (instance.type !== "primitive") disposeOnIdle(instance.object);
13879
13916
  }
@@ -13882,9 +13919,13 @@ function swapReconstructedInstances() {
13882
13919
  const parent = instance.parent;
13883
13920
  if (parent) {
13884
13921
  const target = catalogue[toPascalCase(instance.type)];
13922
+ const prevObject = instance.object;
13885
13923
  instance.object = instance.props.object ?? new target(...instance.props.args ?? []);
13886
13924
  instance.object.__r3f = instance;
13887
13925
  setFiberRef(fiber, instance.object);
13926
+ if (isObject3D(prevObject) && isObject3D(instance.object)) {
13927
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
13928
+ }
13888
13929
  delete instance.appliedOnce;
13889
13930
  instance.eventCount = 0;
13890
13931
  instance.handlers = {};
@@ -16011,4 +16052,4 @@ function useRenderPipeline(mainCB, setupCB) {
16011
16052
 
16012
16053
  extend(THREE);
16013
16054
 
16014
- export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
16055
+ export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "10.0.0-canary.6d6e5ab",
3
+ "version": "10.0.0-canary.7b7cecd",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",