@gnsx/react-three-fiber 10.0.3 → 10.0.5

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
@@ -449,7 +449,7 @@ function Environment(props) {
449
449
  var __defProp$2 = Object.defineProperty;
450
450
  var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
451
451
  var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
452
- const act = React__namespace["act"];
452
+ const act = React__namespace.act;
453
453
  const useIsomorphicLayoutEffect = /* @__PURE__ */ (() => typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"))() ? React__namespace.useLayoutEffect : React__namespace.useEffect;
454
454
  function useMutableCallback(fn) {
455
455
  const ref = React__namespace.useRef(fn);
@@ -3453,7 +3453,7 @@ function advance(timestamp) {
3453
3453
  getScheduler().step(timestamp);
3454
3454
  }
3455
3455
 
3456
- const version = "10.0.3";
3456
+ const version = "10.0.5";
3457
3457
  const packageData = {
3458
3458
  version: version};
3459
3459
 
@@ -15210,6 +15210,7 @@ function createRoot(canvas) {
15210
15210
  let pending = null;
15211
15211
  return {
15212
15212
  async configure(props = {}) {
15213
+ if (pending) await pending;
15213
15214
  let resolve;
15214
15215
  pending = new Promise((_resolve) => resolve = _resolve);
15215
15216
  const {
@@ -15506,8 +15507,10 @@ function createRoot(canvas) {
15506
15507
  const unregisterCanvasTarget = scheduler.register(
15507
15508
  () => {
15508
15509
  const state2 = store.getState();
15510
+ if (!state2.internal.active) return;
15509
15511
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15510
15512
  const renderer2 = state2.internal.actualRenderer;
15513
+ if (!renderer2) return;
15511
15514
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15512
15515
  }
15513
15516
  },
@@ -15560,7 +15563,9 @@ function createRoot(canvas) {
15560
15563
  const unregisterRender = scheduler.register(
15561
15564
  () => {
15562
15565
  const state2 = store.getState();
15566
+ if (!state2.internal.active) return;
15563
15567
  const renderer2 = state2.internal.actualRenderer;
15568
+ if (!renderer2) return;
15564
15569
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15565
15570
  if (userHandlesRender || state2.internal.priority) return;
15566
15571
  try {
@@ -15635,23 +15640,62 @@ function Provider({
15635
15640
  }, []);
15636
15641
  return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: store, children });
15637
15642
  }
15643
+ function releaseSceneR3fLinks(scene, options) {
15644
+ if (!scene) return null;
15645
+ scene.traverse((obj) => {
15646
+ delete obj.__r3f;
15647
+ });
15648
+ delete scene.__r3f;
15649
+ {
15650
+ scene.clear();
15651
+ }
15652
+ return scene;
15653
+ }
15654
+ function releaseRendererRefsFromRootState(state) {
15655
+ const { internal } = state;
15656
+ const renderer = internal.actualRenderer ?? null;
15657
+ internal.actualRenderer = null;
15658
+ internal.canvasTarget = null;
15659
+ internal.pointerMap?.clear();
15660
+ internal.pointerDirty?.clear();
15661
+ return renderer;
15662
+ }
15663
+ function detachRootSceneFromRootState(state) {
15664
+ const scene = releaseSceneR3fLinks(state.scene);
15665
+ state.set((prev) => ({
15666
+ scene: null,
15667
+ rootScene: null,
15668
+ internal: { ...prev.internal, container: null }
15669
+ }));
15670
+ return scene;
15671
+ }
15638
15672
  function unmountComponentAtNode(canvas, callback) {
15639
15673
  const root = _roots.get(canvas);
15640
15674
  const fiber = root?.fiber;
15641
15675
  if (fiber) {
15642
15676
  const state = root?.store.getState();
15643
- if (state) state.internal.active = false;
15677
+ let rendererForCleanup = null;
15678
+ let canvasTargetForCleanup;
15679
+ let sceneForCleanup = null;
15680
+ if (state) {
15681
+ state.internal.active = false;
15682
+ canvasTargetForCleanup = state.internal.canvasTarget;
15683
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15684
+ const unregisterRoot = state.internal.unregisterRoot;
15685
+ if (unregisterRoot) {
15686
+ unregisterRoot();
15687
+ state.internal.unregisterRoot = void 0;
15688
+ }
15689
+ }
15644
15690
  reconciler.updateContainer(null, fiber, null, () => {
15645
15691
  if (state) {
15692
+ sceneForCleanup = detachRootSceneFromRootState(state);
15646
15693
  setTimeout(() => {
15647
15694
  try {
15648
- const renderer = state.internal.actualRenderer;
15649
- const unregisterRoot = state.internal.unregisterRoot;
15650
- if (unregisterRoot) unregisterRoot();
15695
+ const renderer = rendererForCleanup;
15651
15696
  const unregisterPrimary = state.internal.unregisterPrimary;
15652
15697
  if (unregisterPrimary) unregisterPrimary();
15653
- const canvasTarget = state.internal.canvasTarget;
15654
- if (canvasTarget?.dispose) canvasTarget.dispose();
15698
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15655
15699
  state.events.disconnect?.();
15656
15700
  cleanupHelperGroup(root.store);
15657
15701
  if (state.isLegacy && renderer) {
@@ -15662,7 +15706,7 @@ function unmountComponentAtNode(canvas, callback) {
15662
15706
  if (!state.internal.isSecondary) {
15663
15707
  if (renderer?.xr) state.xr.disconnect();
15664
15708
  }
15665
- dispose(state.scene);
15709
+ if (sceneForCleanup) dispose(sceneForCleanup);
15666
15710
  _roots.delete(canvas);
15667
15711
  if (callback) callback(canvas);
15668
15712
  } catch {
package/dist/index.mjs CHANGED
@@ -428,7 +428,7 @@ function Environment(props) {
428
428
  var __defProp$2 = Object.defineProperty;
429
429
  var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
430
430
  var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
431
- const act = React["act"];
431
+ const act = React.act;
432
432
  const useIsomorphicLayoutEffect = /* @__PURE__ */ (() => typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"))() ? React.useLayoutEffect : React.useEffect;
433
433
  function useMutableCallback(fn) {
434
434
  const ref = React.useRef(fn);
@@ -3432,7 +3432,7 @@ function advance(timestamp) {
3432
3432
  getScheduler().step(timestamp);
3433
3433
  }
3434
3434
 
3435
- const version = "10.0.3";
3435
+ const version = "10.0.5";
3436
3436
  const packageData = {
3437
3437
  version: version};
3438
3438
 
@@ -15189,6 +15189,7 @@ function createRoot(canvas) {
15189
15189
  let pending = null;
15190
15190
  return {
15191
15191
  async configure(props = {}) {
15192
+ if (pending) await pending;
15192
15193
  let resolve;
15193
15194
  pending = new Promise((_resolve) => resolve = _resolve);
15194
15195
  const {
@@ -15485,8 +15486,10 @@ function createRoot(canvas) {
15485
15486
  const unregisterCanvasTarget = scheduler.register(
15486
15487
  () => {
15487
15488
  const state2 = store.getState();
15489
+ if (!state2.internal.active) return;
15488
15490
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15489
15491
  const renderer2 = state2.internal.actualRenderer;
15492
+ if (!renderer2) return;
15490
15493
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15491
15494
  }
15492
15495
  },
@@ -15539,7 +15542,9 @@ function createRoot(canvas) {
15539
15542
  const unregisterRender = scheduler.register(
15540
15543
  () => {
15541
15544
  const state2 = store.getState();
15545
+ if (!state2.internal.active) return;
15542
15546
  const renderer2 = state2.internal.actualRenderer;
15547
+ if (!renderer2) return;
15543
15548
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15544
15549
  if (userHandlesRender || state2.internal.priority) return;
15545
15550
  try {
@@ -15614,23 +15619,62 @@ function Provider({
15614
15619
  }, []);
15615
15620
  return /* @__PURE__ */ jsx(context.Provider, { value: store, children });
15616
15621
  }
15622
+ function releaseSceneR3fLinks(scene, options) {
15623
+ if (!scene) return null;
15624
+ scene.traverse((obj) => {
15625
+ delete obj.__r3f;
15626
+ });
15627
+ delete scene.__r3f;
15628
+ {
15629
+ scene.clear();
15630
+ }
15631
+ return scene;
15632
+ }
15633
+ function releaseRendererRefsFromRootState(state) {
15634
+ const { internal } = state;
15635
+ const renderer = internal.actualRenderer ?? null;
15636
+ internal.actualRenderer = null;
15637
+ internal.canvasTarget = null;
15638
+ internal.pointerMap?.clear();
15639
+ internal.pointerDirty?.clear();
15640
+ return renderer;
15641
+ }
15642
+ function detachRootSceneFromRootState(state) {
15643
+ const scene = releaseSceneR3fLinks(state.scene);
15644
+ state.set((prev) => ({
15645
+ scene: null,
15646
+ rootScene: null,
15647
+ internal: { ...prev.internal, container: null }
15648
+ }));
15649
+ return scene;
15650
+ }
15617
15651
  function unmountComponentAtNode(canvas, callback) {
15618
15652
  const root = _roots.get(canvas);
15619
15653
  const fiber = root?.fiber;
15620
15654
  if (fiber) {
15621
15655
  const state = root?.store.getState();
15622
- if (state) state.internal.active = false;
15656
+ let rendererForCleanup = null;
15657
+ let canvasTargetForCleanup;
15658
+ let sceneForCleanup = null;
15659
+ if (state) {
15660
+ state.internal.active = false;
15661
+ canvasTargetForCleanup = state.internal.canvasTarget;
15662
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15663
+ const unregisterRoot = state.internal.unregisterRoot;
15664
+ if (unregisterRoot) {
15665
+ unregisterRoot();
15666
+ state.internal.unregisterRoot = void 0;
15667
+ }
15668
+ }
15623
15669
  reconciler.updateContainer(null, fiber, null, () => {
15624
15670
  if (state) {
15671
+ sceneForCleanup = detachRootSceneFromRootState(state);
15625
15672
  setTimeout(() => {
15626
15673
  try {
15627
- const renderer = state.internal.actualRenderer;
15628
- const unregisterRoot = state.internal.unregisterRoot;
15629
- if (unregisterRoot) unregisterRoot();
15674
+ const renderer = rendererForCleanup;
15630
15675
  const unregisterPrimary = state.internal.unregisterPrimary;
15631
15676
  if (unregisterPrimary) unregisterPrimary();
15632
- const canvasTarget = state.internal.canvasTarget;
15633
- if (canvasTarget?.dispose) canvasTarget.dispose();
15677
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15634
15678
  state.events.disconnect?.();
15635
15679
  cleanupHelperGroup(root.store);
15636
15680
  if (state.isLegacy && renderer) {
@@ -15641,7 +15685,7 @@ function unmountComponentAtNode(canvas, callback) {
15641
15685
  if (!state.internal.isSecondary) {
15642
15686
  if (renderer?.xr) state.xr.disconnect();
15643
15687
  }
15644
- dispose(state.scene);
15688
+ if (sceneForCleanup) dispose(sceneForCleanup);
15645
15689
  _roots.delete(canvas);
15646
15690
  if (callback) callback(canvas);
15647
15691
  } catch {
package/dist/legacy.cjs CHANGED
@@ -458,7 +458,7 @@ function Environment(props) {
458
458
  var __defProp$2 = Object.defineProperty;
459
459
  var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
460
460
  var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
461
- const act = React__namespace["act"];
461
+ const act = React__namespace.act;
462
462
  const useIsomorphicLayoutEffect = /* @__PURE__ */ (() => typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"))() ? React__namespace.useLayoutEffect : React__namespace.useEffect;
463
463
  function useMutableCallback(fn) {
464
464
  const ref = React__namespace.useRef(fn);
@@ -3460,7 +3460,7 @@ function advance(timestamp) {
3460
3460
  getScheduler().step(timestamp);
3461
3461
  }
3462
3462
 
3463
- const version = "10.0.3";
3463
+ const version = "10.0.5";
3464
3464
  const packageData = {
3465
3465
  version: version};
3466
3466
 
@@ -15217,6 +15217,7 @@ function createRoot(canvas) {
15217
15217
  let pending = null;
15218
15218
  return {
15219
15219
  async configure(props = {}) {
15220
+ if (pending) await pending;
15220
15221
  let resolve;
15221
15222
  pending = new Promise((_resolve) => resolve = _resolve);
15222
15223
  const {
@@ -15466,8 +15467,10 @@ function createRoot(canvas) {
15466
15467
  const unregisterCanvasTarget = scheduler.register(
15467
15468
  () => {
15468
15469
  const state2 = store.getState();
15470
+ if (!state2.internal.active) return;
15469
15471
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15470
15472
  const renderer2 = state2.internal.actualRenderer;
15473
+ if (!renderer2) return;
15471
15474
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15472
15475
  }
15473
15476
  },
@@ -15520,7 +15523,9 @@ function createRoot(canvas) {
15520
15523
  const unregisterRender = scheduler.register(
15521
15524
  () => {
15522
15525
  const state2 = store.getState();
15526
+ if (!state2.internal.active) return;
15523
15527
  const renderer2 = state2.internal.actualRenderer;
15528
+ if (!renderer2) return;
15524
15529
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15525
15530
  if (userHandlesRender || state2.internal.priority) return;
15526
15531
  try {
@@ -15595,23 +15600,62 @@ function Provider({
15595
15600
  }, []);
15596
15601
  return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: store, children });
15597
15602
  }
15603
+ function releaseSceneR3fLinks(scene, options) {
15604
+ if (!scene) return null;
15605
+ scene.traverse((obj) => {
15606
+ delete obj.__r3f;
15607
+ });
15608
+ delete scene.__r3f;
15609
+ {
15610
+ scene.clear();
15611
+ }
15612
+ return scene;
15613
+ }
15614
+ function releaseRendererRefsFromRootState(state) {
15615
+ const { internal } = state;
15616
+ const renderer = internal.actualRenderer ?? null;
15617
+ internal.actualRenderer = null;
15618
+ internal.canvasTarget = null;
15619
+ internal.pointerMap?.clear();
15620
+ internal.pointerDirty?.clear();
15621
+ return renderer;
15622
+ }
15623
+ function detachRootSceneFromRootState(state) {
15624
+ const scene = releaseSceneR3fLinks(state.scene);
15625
+ state.set((prev) => ({
15626
+ scene: null,
15627
+ rootScene: null,
15628
+ internal: { ...prev.internal, container: null }
15629
+ }));
15630
+ return scene;
15631
+ }
15598
15632
  function unmountComponentAtNode(canvas, callback) {
15599
15633
  const root = _roots.get(canvas);
15600
15634
  const fiber = root?.fiber;
15601
15635
  if (fiber) {
15602
15636
  const state = root?.store.getState();
15603
- if (state) state.internal.active = false;
15637
+ let rendererForCleanup = null;
15638
+ let canvasTargetForCleanup;
15639
+ let sceneForCleanup = null;
15640
+ if (state) {
15641
+ state.internal.active = false;
15642
+ canvasTargetForCleanup = state.internal.canvasTarget;
15643
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15644
+ const unregisterRoot = state.internal.unregisterRoot;
15645
+ if (unregisterRoot) {
15646
+ unregisterRoot();
15647
+ state.internal.unregisterRoot = void 0;
15648
+ }
15649
+ }
15604
15650
  reconciler.updateContainer(null, fiber, null, () => {
15605
15651
  if (state) {
15652
+ sceneForCleanup = detachRootSceneFromRootState(state);
15606
15653
  setTimeout(() => {
15607
15654
  try {
15608
- const renderer = state.internal.actualRenderer;
15609
- const unregisterRoot = state.internal.unregisterRoot;
15610
- if (unregisterRoot) unregisterRoot();
15655
+ const renderer = rendererForCleanup;
15611
15656
  const unregisterPrimary = state.internal.unregisterPrimary;
15612
15657
  if (unregisterPrimary) unregisterPrimary();
15613
- const canvasTarget = state.internal.canvasTarget;
15614
- if (canvasTarget?.dispose) canvasTarget.dispose();
15658
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15615
15659
  state.events.disconnect?.();
15616
15660
  cleanupHelperGroup(root.store);
15617
15661
  if (state.isLegacy && renderer) {
@@ -15622,7 +15666,7 @@ function unmountComponentAtNode(canvas, callback) {
15622
15666
  if (!state.internal.isSecondary) {
15623
15667
  if (renderer?.xr) state.xr.disconnect();
15624
15668
  }
15625
- dispose(state.scene);
15669
+ if (sceneForCleanup) dispose(sceneForCleanup);
15626
15670
  _roots.delete(canvas);
15627
15671
  if (callback) callback(canvas);
15628
15672
  } catch {
package/dist/legacy.mjs CHANGED
@@ -437,7 +437,7 @@ function Environment(props) {
437
437
  var __defProp$2 = Object.defineProperty;
438
438
  var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
439
439
  var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
440
- const act = React["act"];
440
+ const act = React.act;
441
441
  const useIsomorphicLayoutEffect = /* @__PURE__ */ (() => typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"))() ? React.useLayoutEffect : React.useEffect;
442
442
  function useMutableCallback(fn) {
443
443
  const ref = React.useRef(fn);
@@ -3439,7 +3439,7 @@ function advance(timestamp) {
3439
3439
  getScheduler().step(timestamp);
3440
3440
  }
3441
3441
 
3442
- const version = "10.0.3";
3442
+ const version = "10.0.5";
3443
3443
  const packageData = {
3444
3444
  version: version};
3445
3445
 
@@ -15196,6 +15196,7 @@ function createRoot(canvas) {
15196
15196
  let pending = null;
15197
15197
  return {
15198
15198
  async configure(props = {}) {
15199
+ if (pending) await pending;
15199
15200
  let resolve;
15200
15201
  pending = new Promise((_resolve) => resolve = _resolve);
15201
15202
  const {
@@ -15445,8 +15446,10 @@ function createRoot(canvas) {
15445
15446
  const unregisterCanvasTarget = scheduler.register(
15446
15447
  () => {
15447
15448
  const state2 = store.getState();
15449
+ if (!state2.internal.active) return;
15448
15450
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15449
15451
  const renderer2 = state2.internal.actualRenderer;
15452
+ if (!renderer2) return;
15450
15453
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15451
15454
  }
15452
15455
  },
@@ -15499,7 +15502,9 @@ function createRoot(canvas) {
15499
15502
  const unregisterRender = scheduler.register(
15500
15503
  () => {
15501
15504
  const state2 = store.getState();
15505
+ if (!state2.internal.active) return;
15502
15506
  const renderer2 = state2.internal.actualRenderer;
15507
+ if (!renderer2) return;
15503
15508
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15504
15509
  if (userHandlesRender || state2.internal.priority) return;
15505
15510
  try {
@@ -15574,23 +15579,62 @@ function Provider({
15574
15579
  }, []);
15575
15580
  return /* @__PURE__ */ jsx(context.Provider, { value: store, children });
15576
15581
  }
15582
+ function releaseSceneR3fLinks(scene, options) {
15583
+ if (!scene) return null;
15584
+ scene.traverse((obj) => {
15585
+ delete obj.__r3f;
15586
+ });
15587
+ delete scene.__r3f;
15588
+ {
15589
+ scene.clear();
15590
+ }
15591
+ return scene;
15592
+ }
15593
+ function releaseRendererRefsFromRootState(state) {
15594
+ const { internal } = state;
15595
+ const renderer = internal.actualRenderer ?? null;
15596
+ internal.actualRenderer = null;
15597
+ internal.canvasTarget = null;
15598
+ internal.pointerMap?.clear();
15599
+ internal.pointerDirty?.clear();
15600
+ return renderer;
15601
+ }
15602
+ function detachRootSceneFromRootState(state) {
15603
+ const scene = releaseSceneR3fLinks(state.scene);
15604
+ state.set((prev) => ({
15605
+ scene: null,
15606
+ rootScene: null,
15607
+ internal: { ...prev.internal, container: null }
15608
+ }));
15609
+ return scene;
15610
+ }
15577
15611
  function unmountComponentAtNode(canvas, callback) {
15578
15612
  const root = _roots.get(canvas);
15579
15613
  const fiber = root?.fiber;
15580
15614
  if (fiber) {
15581
15615
  const state = root?.store.getState();
15582
- if (state) state.internal.active = false;
15616
+ let rendererForCleanup = null;
15617
+ let canvasTargetForCleanup;
15618
+ let sceneForCleanup = null;
15619
+ if (state) {
15620
+ state.internal.active = false;
15621
+ canvasTargetForCleanup = state.internal.canvasTarget;
15622
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15623
+ const unregisterRoot = state.internal.unregisterRoot;
15624
+ if (unregisterRoot) {
15625
+ unregisterRoot();
15626
+ state.internal.unregisterRoot = void 0;
15627
+ }
15628
+ }
15583
15629
  reconciler.updateContainer(null, fiber, null, () => {
15584
15630
  if (state) {
15631
+ sceneForCleanup = detachRootSceneFromRootState(state);
15585
15632
  setTimeout(() => {
15586
15633
  try {
15587
- const renderer = state.internal.actualRenderer;
15588
- const unregisterRoot = state.internal.unregisterRoot;
15589
- if (unregisterRoot) unregisterRoot();
15634
+ const renderer = rendererForCleanup;
15590
15635
  const unregisterPrimary = state.internal.unregisterPrimary;
15591
15636
  if (unregisterPrimary) unregisterPrimary();
15592
- const canvasTarget = state.internal.canvasTarget;
15593
- if (canvasTarget?.dispose) canvasTarget.dispose();
15637
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15594
15638
  state.events.disconnect?.();
15595
15639
  cleanupHelperGroup(root.store);
15596
15640
  if (state.isLegacy && renderer) {
@@ -15601,7 +15645,7 @@ function unmountComponentAtNode(canvas, callback) {
15601
15645
  if (!state.internal.isSecondary) {
15602
15646
  if (renderer?.xr) state.xr.disconnect();
15603
15647
  }
15604
- dispose(state.scene);
15648
+ if (sceneForCleanup) dispose(sceneForCleanup);
15605
15649
  _roots.delete(canvas);
15606
15650
  if (callback) callback(canvas);
15607
15651
  } catch {
@@ -459,7 +459,7 @@ function Environment(props) {
459
459
  var __defProp$3 = Object.defineProperty;
460
460
  var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
461
461
  var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
462
- const act = React__namespace["act"];
462
+ const act = React__namespace.act;
463
463
  const useIsomorphicLayoutEffect = /* @__PURE__ */ (() => typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"))() ? React__namespace.useLayoutEffect : React__namespace.useEffect;
464
464
  function useMutableCallback(fn) {
465
465
  const ref = React__namespace.useRef(fn);
@@ -3461,7 +3461,7 @@ function advance(timestamp) {
3461
3461
  getScheduler().step(timestamp);
3462
3462
  }
3463
3463
 
3464
- const version = "10.0.3";
3464
+ const version = "10.0.5";
3465
3465
  const packageData = {
3466
3466
  version: version};
3467
3467
 
@@ -15218,6 +15218,7 @@ function createRoot(canvas) {
15218
15218
  let pending = null;
15219
15219
  return {
15220
15220
  async configure(props = {}) {
15221
+ if (pending) await pending;
15221
15222
  let resolve;
15222
15223
  pending = new Promise((_resolve) => resolve = _resolve);
15223
15224
  const {
@@ -15496,8 +15497,10 @@ function createRoot(canvas) {
15496
15497
  const unregisterCanvasTarget = scheduler.register(
15497
15498
  () => {
15498
15499
  const state2 = store.getState();
15500
+ if (!state2.internal.active) return;
15499
15501
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15500
15502
  const renderer2 = state2.internal.actualRenderer;
15503
+ if (!renderer2) return;
15501
15504
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15502
15505
  }
15503
15506
  },
@@ -15550,7 +15553,9 @@ function createRoot(canvas) {
15550
15553
  const unregisterRender = scheduler.register(
15551
15554
  () => {
15552
15555
  const state2 = store.getState();
15556
+ if (!state2.internal.active) return;
15553
15557
  const renderer2 = state2.internal.actualRenderer;
15558
+ if (!renderer2) return;
15554
15559
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15555
15560
  if (userHandlesRender || state2.internal.priority) return;
15556
15561
  try {
@@ -15625,23 +15630,62 @@ function Provider({
15625
15630
  }, []);
15626
15631
  return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: store, children });
15627
15632
  }
15633
+ function releaseSceneR3fLinks(scene, options) {
15634
+ if (!scene) return null;
15635
+ scene.traverse((obj) => {
15636
+ delete obj.__r3f;
15637
+ });
15638
+ delete scene.__r3f;
15639
+ {
15640
+ scene.clear();
15641
+ }
15642
+ return scene;
15643
+ }
15644
+ function releaseRendererRefsFromRootState(state) {
15645
+ const { internal } = state;
15646
+ const renderer = internal.actualRenderer ?? null;
15647
+ internal.actualRenderer = null;
15648
+ internal.canvasTarget = null;
15649
+ internal.pointerMap?.clear();
15650
+ internal.pointerDirty?.clear();
15651
+ return renderer;
15652
+ }
15653
+ function detachRootSceneFromRootState(state) {
15654
+ const scene = releaseSceneR3fLinks(state.scene);
15655
+ state.set((prev) => ({
15656
+ scene: null,
15657
+ rootScene: null,
15658
+ internal: { ...prev.internal, container: null }
15659
+ }));
15660
+ return scene;
15661
+ }
15628
15662
  function unmountComponentAtNode(canvas, callback) {
15629
15663
  const root = _roots.get(canvas);
15630
15664
  const fiber = root?.fiber;
15631
15665
  if (fiber) {
15632
15666
  const state = root?.store.getState();
15633
- if (state) state.internal.active = false;
15667
+ let rendererForCleanup = null;
15668
+ let canvasTargetForCleanup;
15669
+ let sceneForCleanup = null;
15670
+ if (state) {
15671
+ state.internal.active = false;
15672
+ canvasTargetForCleanup = state.internal.canvasTarget;
15673
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15674
+ const unregisterRoot = state.internal.unregisterRoot;
15675
+ if (unregisterRoot) {
15676
+ unregisterRoot();
15677
+ state.internal.unregisterRoot = void 0;
15678
+ }
15679
+ }
15634
15680
  reconciler.updateContainer(null, fiber, null, () => {
15635
15681
  if (state) {
15682
+ sceneForCleanup = detachRootSceneFromRootState(state);
15636
15683
  setTimeout(() => {
15637
15684
  try {
15638
- const renderer = state.internal.actualRenderer;
15639
- const unregisterRoot = state.internal.unregisterRoot;
15640
- if (unregisterRoot) unregisterRoot();
15685
+ const renderer = rendererForCleanup;
15641
15686
  const unregisterPrimary = state.internal.unregisterPrimary;
15642
15687
  if (unregisterPrimary) unregisterPrimary();
15643
- const canvasTarget = state.internal.canvasTarget;
15644
- if (canvasTarget?.dispose) canvasTarget.dispose();
15688
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15645
15689
  state.events.disconnect?.();
15646
15690
  cleanupHelperGroup(root.store);
15647
15691
  if (state.isLegacy && renderer) {
@@ -15652,7 +15696,7 @@ function unmountComponentAtNode(canvas, callback) {
15652
15696
  if (!state.internal.isSecondary) {
15653
15697
  if (renderer?.xr) state.xr.disconnect();
15654
15698
  }
15655
- dispose(state.scene);
15699
+ if (sceneForCleanup) dispose(sceneForCleanup);
15656
15700
  _roots.delete(canvas);
15657
15701
  if (callback) callback(canvas);
15658
15702
  } catch {
@@ -438,7 +438,7 @@ function Environment(props) {
438
438
  var __defProp$3 = Object.defineProperty;
439
439
  var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
440
440
  var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
441
- const act = React["act"];
441
+ const act = React.act;
442
442
  const useIsomorphicLayoutEffect = /* @__PURE__ */ (() => typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"))() ? React.useLayoutEffect : React.useEffect;
443
443
  function useMutableCallback(fn) {
444
444
  const ref = React.useRef(fn);
@@ -3440,7 +3440,7 @@ function advance(timestamp) {
3440
3440
  getScheduler().step(timestamp);
3441
3441
  }
3442
3442
 
3443
- const version = "10.0.3";
3443
+ const version = "10.0.5";
3444
3444
  const packageData = {
3445
3445
  version: version};
3446
3446
 
@@ -15197,6 +15197,7 @@ function createRoot(canvas) {
15197
15197
  let pending = null;
15198
15198
  return {
15199
15199
  async configure(props = {}) {
15200
+ if (pending) await pending;
15200
15201
  let resolve;
15201
15202
  pending = new Promise((_resolve) => resolve = _resolve);
15202
15203
  const {
@@ -15475,8 +15476,10 @@ function createRoot(canvas) {
15475
15476
  const unregisterCanvasTarget = scheduler.register(
15476
15477
  () => {
15477
15478
  const state2 = store.getState();
15479
+ if (!state2.internal.active) return;
15478
15480
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15479
15481
  const renderer2 = state2.internal.actualRenderer;
15482
+ if (!renderer2) return;
15480
15483
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15481
15484
  }
15482
15485
  },
@@ -15529,7 +15532,9 @@ function createRoot(canvas) {
15529
15532
  const unregisterRender = scheduler.register(
15530
15533
  () => {
15531
15534
  const state2 = store.getState();
15535
+ if (!state2.internal.active) return;
15532
15536
  const renderer2 = state2.internal.actualRenderer;
15537
+ if (!renderer2) return;
15533
15538
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15534
15539
  if (userHandlesRender || state2.internal.priority) return;
15535
15540
  try {
@@ -15604,23 +15609,62 @@ function Provider({
15604
15609
  }, []);
15605
15610
  return /* @__PURE__ */ jsx(context.Provider, { value: store, children });
15606
15611
  }
15612
+ function releaseSceneR3fLinks(scene, options) {
15613
+ if (!scene) return null;
15614
+ scene.traverse((obj) => {
15615
+ delete obj.__r3f;
15616
+ });
15617
+ delete scene.__r3f;
15618
+ {
15619
+ scene.clear();
15620
+ }
15621
+ return scene;
15622
+ }
15623
+ function releaseRendererRefsFromRootState(state) {
15624
+ const { internal } = state;
15625
+ const renderer = internal.actualRenderer ?? null;
15626
+ internal.actualRenderer = null;
15627
+ internal.canvasTarget = null;
15628
+ internal.pointerMap?.clear();
15629
+ internal.pointerDirty?.clear();
15630
+ return renderer;
15631
+ }
15632
+ function detachRootSceneFromRootState(state) {
15633
+ const scene = releaseSceneR3fLinks(state.scene);
15634
+ state.set((prev) => ({
15635
+ scene: null,
15636
+ rootScene: null,
15637
+ internal: { ...prev.internal, container: null }
15638
+ }));
15639
+ return scene;
15640
+ }
15607
15641
  function unmountComponentAtNode(canvas, callback) {
15608
15642
  const root = _roots.get(canvas);
15609
15643
  const fiber = root?.fiber;
15610
15644
  if (fiber) {
15611
15645
  const state = root?.store.getState();
15612
- if (state) state.internal.active = false;
15646
+ let rendererForCleanup = null;
15647
+ let canvasTargetForCleanup;
15648
+ let sceneForCleanup = null;
15649
+ if (state) {
15650
+ state.internal.active = false;
15651
+ canvasTargetForCleanup = state.internal.canvasTarget;
15652
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15653
+ const unregisterRoot = state.internal.unregisterRoot;
15654
+ if (unregisterRoot) {
15655
+ unregisterRoot();
15656
+ state.internal.unregisterRoot = void 0;
15657
+ }
15658
+ }
15613
15659
  reconciler.updateContainer(null, fiber, null, () => {
15614
15660
  if (state) {
15661
+ sceneForCleanup = detachRootSceneFromRootState(state);
15615
15662
  setTimeout(() => {
15616
15663
  try {
15617
- const renderer = state.internal.actualRenderer;
15618
- const unregisterRoot = state.internal.unregisterRoot;
15619
- if (unregisterRoot) unregisterRoot();
15664
+ const renderer = rendererForCleanup;
15620
15665
  const unregisterPrimary = state.internal.unregisterPrimary;
15621
15666
  if (unregisterPrimary) unregisterPrimary();
15622
- const canvasTarget = state.internal.canvasTarget;
15623
- if (canvasTarget?.dispose) canvasTarget.dispose();
15667
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15624
15668
  state.events.disconnect?.();
15625
15669
  cleanupHelperGroup(root.store);
15626
15670
  if (state.isLegacy && renderer) {
@@ -15631,7 +15675,7 @@ function unmountComponentAtNode(canvas, callback) {
15631
15675
  if (!state.internal.isSecondary) {
15632
15676
  if (renderer?.xr) state.xr.disconnect();
15633
15677
  }
15634
- dispose(state.scene);
15678
+ if (sceneForCleanup) dispose(sceneForCleanup);
15635
15679
  _roots.delete(canvas);
15636
15680
  if (callback) callback(canvas);
15637
15681
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gnsx/react-three-fiber",
3
- "version": "10.0.3",
3
+ "version": "10.0.5",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",