@react-three/fiber 8.0.0-beta-03 → 8.0.0-beta-04

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.
@@ -57,6 +57,7 @@ export interface PointerCaptureTarget {
57
57
  intersection: Intersection;
58
58
  target: Element;
59
59
  }
60
+ export declare function getEventPriority(): any;
60
61
  export declare function removeInteractivity(store: UseStore<RootState>, object: THREE.Object3D): void;
61
62
  export declare function createEvents(store: UseStore<RootState>): {
62
63
  handlePointer: (name: string) => (event: DomEvent) => void;
@@ -6,8 +6,7 @@ import { dispose } from '../core/utils';
6
6
  import { Renderer, StoreProps, context, RootState, Size } from '../core/store';
7
7
  import { extend, Root } from '../core/renderer';
8
8
  import { addEffect, addAfterEffect, addTail } from '../core/loop';
9
- import { createPointerEvents as events } from './events';
10
- import { EventManager } from '../core/events';
9
+ import { EventManager } from './events';
11
10
  declare const roots: Map<Element, Root>;
12
11
  declare const invalidate: (state?: RootState | undefined) => void, advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState | undefined) => void;
13
12
  declare const reconciler: import("react-reconciler").Reconciler<unknown, unknown, unknown, unknown, unknown>, applyProps: typeof import("../core/utils").applyProps;
@@ -29,5 +28,4 @@ declare function render<TCanvas extends Element>(element: React.ReactNode, canva
29
28
  declare function unmountComponentAtNode<TElement extends Element>(canvas: TElement, callback?: (canvas: TElement) => void): void;
30
29
  declare const act: any;
31
30
  declare function createPortal(children: React.ReactNode, container: THREE.Object3D): React.ReactNode;
32
- export * from '../core/hooks';
33
- export { context, render, createRoot, unmountComponentAtNode, createPortal, events, reconciler, applyProps, dispose, invalidate, advance, extend, addEffect, addAfterEffect, addTail, act, roots as _roots, };
31
+ export { context, render, createRoot, unmountComponentAtNode, createPortal, reconciler, applyProps, dispose, invalidate, advance, extend, addEffect, addAfterEffect, addTail, act, roots as _roots, };
@@ -4,5 +4,7 @@ export { ReactThreeFiber };
4
4
  export type { Intersection, Subscription, Dpr, Size, Viewport, Camera, RenderCallback, Performance, RootState, } from './core/store';
5
5
  export type { ThreeEvent, Events, EventManager } from './core/events';
6
6
  export type { ObjectMap } from './core/utils';
7
+ export * from './core/hooks';
7
8
  export * from './web/Canvas';
8
- export * from './web';
9
+ export { createPointerEvents as events } from './web/events';
10
+ export * from './core';
@@ -1,16 +1,13 @@
1
1
  import * as React from 'react';
2
2
  import { View, ViewProps, ViewStyle } from 'react-native';
3
- import { ExpoWebGLRenderingContext } from 'expo-gl';
4
3
  import { UseStore } from 'zustand';
5
- import { RenderProps } from './index';
4
+ import { RenderProps } from '../core';
6
5
  import { RootState } from '../core/store';
7
6
  import { EventManager } from '../core/events';
8
- export interface Props extends Omit<RenderProps<View>, 'size' | 'events'>, ViewProps {
7
+ export interface Props extends Omit<RenderProps<HTMLCanvasElement>, 'size' | 'events'>, ViewProps {
9
8
  children: React.ReactNode;
10
9
  fallback?: React.ReactNode;
11
10
  style?: ViewStyle;
12
11
  events?: (store: UseStore<RootState>) => EventManager<any>;
13
- nativeRef_EXPERIMENTAL?: React.MutableRefObject<any>;
14
- onContextCreate?: (gl: ExpoWebGLRenderingContext) => Promise<any> | void;
15
12
  }
16
13
  export declare const Canvas: React.ForwardRefExoticComponent<Props & React.RefAttributes<View>>;
@@ -2,5 +2,4 @@ import { UseStore } from 'zustand';
2
2
  import { RootState } from '../core/store';
3
3
  import { EventManager } from '../core/events';
4
4
  import { View } from 'react-native';
5
- export declare function getEventPriority(): any;
6
5
  export declare function createTouchEvents(store: UseStore<RootState>): EventManager<View>;
@@ -4,5 +4,7 @@ export { ReactThreeFiber };
4
4
  export type { Intersection, Subscription, Dpr, Size, Viewport, Camera, RenderCallback, Performance, RootState, } from './core/store';
5
5
  export type { ThreeEvent, Events, EventManager } from './core/events';
6
6
  export type { ObjectMap } from './core/utils';
7
+ export * from './native/hooks';
7
8
  export * from './native/Canvas';
8
- export * from './native/index';
9
+ export { createTouchEvents as events } from './native/events';
10
+ export * from './core';
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import type { Options as ResizeOptions } from 'react-use-measure';
3
3
  import { UseStore } from 'zustand';
4
- import { RenderProps } from './index';
4
+ import { RenderProps } from '../core';
5
5
  import { RootState } from '../core/store';
6
6
  import { EventManager } from '../core/events';
7
7
  export interface Props extends Omit<RenderProps<HTMLCanvasElement>, 'size' | 'events'>, React.HTMLAttributes<HTMLDivElement> {
@@ -1,5 +1,4 @@
1
1
  import { UseStore } from 'zustand';
2
2
  import { RootState } from '../core/store';
3
3
  import { EventManager } from '../core/events';
4
- export declare function getEventPriority(): any;
5
4
  export declare function createPointerEvents(store: UseStore<RootState>): EventManager<HTMLElement>;
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var Reconciler = require('react-reconciler');
4
- var scheduler = require('scheduler');
5
- var constants = require('react-reconciler/constants');
6
- var THREE = require('three');
7
3
  var React = require('react');
8
4
  var suspendReact = require('suspend-react');
5
+ var THREE = require('three');
6
+ var constants = require('react-reconciler/constants');
9
7
  var create = require('zustand');
8
+ var Reconciler = require('react-reconciler');
9
+ var scheduler = require('scheduler');
10
10
 
11
11
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
12
12
 
@@ -30,10 +30,10 @@ function _interopNamespace(e) {
30
30
  return Object.freeze(n);
31
31
  }
32
32
 
33
- var Reconciler__default = /*#__PURE__*/_interopDefault(Reconciler);
34
- var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
35
33
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
34
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
36
35
  var create__default = /*#__PURE__*/_interopDefault(create);
36
+ var Reconciler__default = /*#__PURE__*/_interopDefault(Reconciler);
37
37
 
38
38
  var threeTypes = /*#__PURE__*/Object.freeze({
39
39
  __proto__: null
@@ -241,7 +241,7 @@ function diffProps(instance, {
241
241
  };
242
242
  } // This function applies a set of changes to the instance
243
243
 
244
- function applyProps(instance, data) {
244
+ function applyProps$1(instance, data) {
245
245
  var _instance$__r3f3, _root$getState;
246
246
 
247
247
  // Filter equals, events and reserved props
@@ -351,13 +351,41 @@ function updateInstance(instance) {
351
351
 
352
352
  function makeId(event) {
353
353
  return (event.eventObject || event.object).uuid + '/' + event.index + event.instanceId;
354
+ } // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority
355
+ // Gives React a clue as to how import the current interaction is
356
+
357
+
358
+ function getEventPriority() {
359
+ var _window, _window$event;
360
+
361
+ let name = (_window = window) == null ? void 0 : (_window$event = _window.event) == null ? void 0 : _window$event.type;
362
+
363
+ switch (name) {
364
+ case 'click':
365
+ case 'contextmenu':
366
+ case 'dblclick':
367
+ case 'pointercancel':
368
+ case 'pointerdown':
369
+ case 'pointerup':
370
+ return constants.DiscreteEventPriority;
371
+
372
+ case 'pointermove':
373
+ case 'pointerout':
374
+ case 'pointerover':
375
+ case 'pointerenter':
376
+ case 'pointerleave':
377
+ case 'wheel':
378
+ return constants.ContinuousEventPriority;
379
+
380
+ default:
381
+ return constants.DefaultEventPriority;
382
+ }
354
383
  }
355
384
  /**
356
385
  * Release pointer captures.
357
386
  * This is called by releasePointerCapture in the API, and when an object is removed.
358
387
  */
359
388
 
360
-
361
389
  function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
362
390
  const captureData = captures.get(obj);
363
391
 
@@ -829,7 +857,7 @@ function createRenderer(roots, getEventPriority) {
829
857
  // why it passes "true" here
830
858
 
831
859
 
832
- applyProps(instance, props);
860
+ applyProps$1(instance, props);
833
861
  return instance;
834
862
  }
835
863
 
@@ -1027,7 +1055,7 @@ function createRenderer(roots, getEventPriority) {
1027
1055
  commitUpdate(instance, [reconstruct, diff], type, oldProps, newProps, fiber) {
1028
1056
  // Reconstruct when args or <primitive object={...} have changes
1029
1057
  if (reconstruct) switchInstance(instance, type, newProps, fiber); // Otherwise just overwrite props
1030
- else applyProps(instance, diff);
1058
+ else applyProps$1(instance, diff);
1031
1059
  },
1032
1060
 
1033
1061
  hideInstance(instance) {
@@ -1116,7 +1144,7 @@ function createRenderer(roots, getEventPriority) {
1116
1144
  });
1117
1145
  return {
1118
1146
  reconciler,
1119
- applyProps
1147
+ applyProps: applyProps$1
1120
1148
  };
1121
1149
  }
1122
1150
 
@@ -1418,6 +1446,60 @@ const createStore = (applyProps, invalidate, advance, props) => {
1418
1446
  return rootState;
1419
1447
  };
1420
1448
 
1449
+ function useStore() {
1450
+ const store = React__namespace.useContext(context);
1451
+ if (!store) throw `R3F hooks can only be used within the Canvas component!`;
1452
+ return store;
1453
+ }
1454
+ function useThree(selector = state => state, equalityFn) {
1455
+ return useStore()(selector, equalityFn);
1456
+ }
1457
+ function useFrame(callback, renderPriority = 0) {
1458
+ const subscribe = useStore().getState().internal.subscribe; // Update ref
1459
+
1460
+ const ref = React__namespace.useRef(callback);
1461
+ React__namespace.useLayoutEffect(() => void (ref.current = callback), [callback]); // Subscribe on mount, unsubscribe on unmount
1462
+
1463
+ React__namespace.useLayoutEffect(() => subscribe(ref, renderPriority), [renderPriority, subscribe]);
1464
+ return null;
1465
+ }
1466
+ function useGraph(object) {
1467
+ return React__namespace.useMemo(() => buildGraph(object), [object]);
1468
+ }
1469
+
1470
+ function loadingFn(extensions, onProgress) {
1471
+ return function (Proto, ...input) {
1472
+ // Construct new loader and run extensions
1473
+ const loader = new Proto();
1474
+ if (extensions) extensions(loader); // Go through the urls and load them
1475
+
1476
+ return Promise.all(input.map(input => new Promise((res, reject) => loader.load(input, data => {
1477
+ if (data.scene) Object.assign(data, buildGraph(data.scene));
1478
+ res(data);
1479
+ }, onProgress, error => reject(`Could not load ${input}: ${error.message}`)))));
1480
+ };
1481
+ }
1482
+
1483
+ function useLoader(Proto, input, extensions, onProgress) {
1484
+ // Use suspense to load async assets
1485
+ const keys = Array.isArray(input) ? input : [input];
1486
+ const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
1487
+ equal: is.equ
1488
+ }); // Return the object/s
1489
+
1490
+ return Array.isArray(input) ? results : results[0];
1491
+ }
1492
+
1493
+ useLoader.preload = function (Proto, input, extensions) {
1494
+ const keys = Array.isArray(input) ? input : [input];
1495
+ return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
1496
+ };
1497
+
1498
+ useLoader.clear = function (Proto, input) {
1499
+ const keys = Array.isArray(input) ? input : [input];
1500
+ return suspendReact.clear([Proto, ...keys]);
1501
+ };
1502
+
1421
1503
  function createSubs(callback, subs) {
1422
1504
  const index = subs.length;
1423
1505
  subs.push(callback);
@@ -1436,7 +1518,7 @@ function run(effects, timestamp) {
1436
1518
  for (i = 0; i < effects.length; i++) effects[i](timestamp);
1437
1519
  }
1438
1520
 
1439
- function render(timestamp, state) {
1521
+ function render$1(timestamp, state) {
1440
1522
  // Run local effects
1441
1523
  let delta = state.clock.getDelta(); // In frameloop='never' mode, clock times are updated using the provided timestamp
1442
1524
 
@@ -1472,7 +1554,7 @@ function createLoop(roots) {
1472
1554
  const state = root.store.getState(); // If the frameloop is invalidated, do not run another frame
1473
1555
 
1474
1556
  if (state.internal.active && (state.frameloop === 'always' || state.internal.frames > 0) && !((_state$gl$xr = state.gl.xr) != null && _state$gl$xr.isPresenting)) {
1475
- repeat += render(timestamp, state);
1557
+ repeat += render$1(timestamp, state);
1476
1558
  }
1477
1559
  }); // Run after-effects
1478
1560
 
@@ -1500,7 +1582,7 @@ function createLoop(roots) {
1500
1582
 
1501
1583
  function advance(timestamp, runGlobalEffects = true, state) {
1502
1584
  if (runGlobalEffects) run(globalEffects, timestamp);
1503
- if (!state) roots.forEach(root => render(timestamp, root.store.getState()));else render(timestamp, state);
1585
+ if (!state) roots.forEach(root => render$1(timestamp, root.store.getState()));else render$1(timestamp, state);
1504
1586
  if (runGlobalEffects) run(globalAfterEffects, timestamp);
1505
1587
  }
1506
1588
 
@@ -1511,77 +1593,211 @@ function createLoop(roots) {
1511
1593
  };
1512
1594
  }
1513
1595
 
1514
- function useStore() {
1515
- const store = React__namespace.useContext(context);
1516
- if (!store) throw `R3F hooks can only be used within the Canvas component!`;
1517
- return store;
1518
- }
1519
- function useThree(selector = state => state, equalityFn) {
1520
- return useStore()(selector, equalityFn);
1521
- }
1522
- function useFrame(callback, renderPriority = 0) {
1523
- const subscribe = useStore().getState().internal.subscribe; // Update ref
1596
+ const roots = new Map();
1597
+ const {
1598
+ invalidate,
1599
+ advance
1600
+ } = createLoop(roots);
1601
+ const {
1602
+ reconciler,
1603
+ applyProps
1604
+ } = createRenderer(roots, getEventPriority);
1605
+
1606
+ const createRendererInstance = (gl, canvas) => {
1607
+ const customRenderer = typeof gl === 'function' ? gl(canvas) : gl;
1608
+ if (isRenderer(customRenderer)) return customRenderer;
1609
+ const renderer = new THREE__namespace.WebGLRenderer({
1610
+ powerPreference: 'high-performance',
1611
+ canvas: canvas,
1612
+ antialias: true,
1613
+ alpha: true,
1614
+ ...gl
1615
+ }); // Set color management
1616
+
1617
+ renderer.outputEncoding = THREE__namespace.sRGBEncoding;
1618
+ renderer.toneMapping = THREE__namespace.ACESFilmicToneMapping; // Set gl props
1619
+
1620
+ if (gl) applyProps(renderer, gl);
1621
+ return renderer;
1622
+ };
1524
1623
 
1525
- const ref = React__namespace.useRef(callback);
1526
- React__namespace.useLayoutEffect(() => void (ref.current = callback), [callback]); // Subscribe on mount, unsubscribe on unmount
1624
+ function createRoot(canvas, config) {
1625
+ return {
1626
+ render: element => {
1627
+ var _store;
1628
+
1629
+ let {
1630
+ gl,
1631
+ size,
1632
+ events,
1633
+ onCreated,
1634
+ ...props
1635
+ } = config || {}; // Allow size to take on container bounds initially
1636
+
1637
+ if (!size) {
1638
+ var _canvas$parentElement, _canvas$parentElement2, _canvas$parentElement3, _canvas$parentElement4;
1639
+
1640
+ size = {
1641
+ width: (_canvas$parentElement = (_canvas$parentElement2 = canvas.parentElement) == null ? void 0 : _canvas$parentElement2.clientWidth) != null ? _canvas$parentElement : 0,
1642
+ height: (_canvas$parentElement3 = (_canvas$parentElement4 = canvas.parentElement) == null ? void 0 : _canvas$parentElement4.clientHeight) != null ? _canvas$parentElement3 : 0
1643
+ };
1644
+ }
1527
1645
 
1528
- React__namespace.useLayoutEffect(() => subscribe(ref, renderPriority), [renderPriority, subscribe]);
1529
- return null;
1646
+ let root = roots.get(canvas);
1647
+ let fiber = root == null ? void 0 : root.fiber;
1648
+ let store = root == null ? void 0 : root.store;
1649
+ let state = (_store = store) == null ? void 0 : _store.getState();
1650
+
1651
+ if (fiber && state) {
1652
+ // When a root was found, see if any fundamental props must be changed or exchanged
1653
+ // Check pixelratio
1654
+ if (props.dpr !== undefined && state.viewport.dpr !== calculateDpr(props.dpr)) state.setDpr(props.dpr); // Check size
1655
+
1656
+ if (state.size.width !== size.width || state.size.height !== size.height) state.setSize(size.width, size.height); // Check frameloop
1657
+
1658
+ if (state.frameloop !== props.frameloop) state.setFrameloop(props.frameloop); // For some props we want to reset the entire root
1659
+ // Changes to the color-space
1660
+
1661
+ const linearChanged = props.linear !== state.internal.lastProps.linear;
1662
+
1663
+ if (linearChanged) {
1664
+ unmountComponentAtNode(canvas);
1665
+ fiber = undefined;
1666
+ }
1667
+ }
1668
+
1669
+ if (!fiber) {
1670
+ // If no root has been found, make one
1671
+ // Create gl
1672
+ const glRenderer = createRendererInstance(gl, canvas); // Create store
1673
+
1674
+ store = createStore(applyProps, invalidate, advance, {
1675
+ gl: glRenderer,
1676
+ size,
1677
+ ...props
1678
+ });
1679
+ const state = store.getState(); // Create renderer
1680
+
1681
+ fiber = reconciler.createContainer(store, constants.ConcurrentRoot, false, null); // Map it
1682
+
1683
+ roots.set(canvas, {
1684
+ fiber,
1685
+ store
1686
+ }); // Store events internally
1687
+
1688
+ if (events) state.set({
1689
+ events: events(store)
1690
+ });
1691
+ }
1692
+
1693
+ if (store && fiber) {
1694
+ reconciler.updateContainer( /*#__PURE__*/React__namespace.createElement(Provider, {
1695
+ store: store,
1696
+ element: element,
1697
+ onCreated: onCreated,
1698
+ target: canvas
1699
+ }), fiber, null, () => undefined);
1700
+ return store;
1701
+ } else {
1702
+ throw 'Error creating root!';
1703
+ }
1704
+ },
1705
+ unmount: () => unmountComponentAtNode(canvas)
1706
+ };
1530
1707
  }
1531
- function useGraph(object) {
1532
- return React__namespace.useMemo(() => buildGraph(object), [object]);
1708
+
1709
+ function render(element, canvas, config = {}) {
1710
+ console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!');
1711
+ return createRoot(canvas, config).render(element);
1533
1712
  }
1534
1713
 
1535
- function loadingFn(extensions, onProgress) {
1536
- return function (Proto, ...input) {
1537
- // Construct new loader and run extensions
1538
- const loader = new Proto();
1539
- if (extensions) extensions(loader); // Go through the urls and load them
1714
+ function Provider({
1715
+ store,
1716
+ element,
1717
+ onCreated,
1718
+ target
1719
+ }) {
1720
+ React__namespace.useEffect(() => {
1721
+ const state = store.getState(); // Flag the canvas active, rendering will now begin
1722
+
1723
+ state.set(state => ({
1724
+ internal: { ...state.internal,
1725
+ active: true
1726
+ }
1727
+ })); // Connect events
1540
1728
 
1541
- return Promise.all(input.map(input => new Promise((res, reject) => loader.load(input, data => {
1542
- if (data.scene) Object.assign(data, buildGraph(data.scene));
1543
- res(data);
1544
- }, onProgress, error => reject(`Could not load ${input}: ${error.message}`)))));
1545
- };
1729
+ state.events.connect == null ? void 0 : state.events.connect(target); // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered
1730
+
1731
+ if (onCreated) onCreated(state); // eslint-disable-next-line react-hooks/exhaustive-deps
1732
+ }, []);
1733
+ return /*#__PURE__*/React__namespace.createElement(context.Provider, {
1734
+ value: store
1735
+ }, element);
1546
1736
  }
1547
1737
 
1548
- function useLoader(Proto, input, extensions, onProgress) {
1549
- // Use suspense to load async assets
1550
- const keys = Array.isArray(input) ? input : [input];
1551
- const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
1552
- equal: is.equ
1553
- }); // Return the object/s
1738
+ function unmountComponentAtNode(canvas, callback) {
1739
+ const root = roots.get(canvas);
1740
+ const fiber = root == null ? void 0 : root.fiber;
1554
1741
 
1555
- return Array.isArray(input) ? results : results[0];
1742
+ if (fiber) {
1743
+ const state = root == null ? void 0 : root.store.getState();
1744
+ if (state) state.internal.active = false;
1745
+ reconciler.updateContainer(null, fiber, null, () => {
1746
+ if (state) {
1747
+ setTimeout(() => {
1748
+ try {
1749
+ var _state$gl, _state$gl$renderLists, _state$gl2, _state$gl3;
1750
+
1751
+ state.events.disconnect == null ? void 0 : state.events.disconnect();
1752
+ (_state$gl = state.gl) == null ? void 0 : (_state$gl$renderLists = _state$gl.renderLists) == null ? void 0 : _state$gl$renderLists.dispose == null ? void 0 : _state$gl$renderLists.dispose();
1753
+ (_state$gl2 = state.gl) == null ? void 0 : _state$gl2.forceContextLoss == null ? void 0 : _state$gl2.forceContextLoss();
1754
+ if ((_state$gl3 = state.gl) != null && _state$gl3.xr) state.internal.xr.disconnect();
1755
+ dispose(state);
1756
+ roots.delete(canvas);
1757
+ if (callback) callback(canvas);
1758
+ } catch (e) {
1759
+ /* ... */
1760
+ }
1761
+ }, 500);
1762
+ }
1763
+ });
1764
+ }
1556
1765
  }
1557
1766
 
1558
- useLoader.preload = function (Proto, input, extensions) {
1559
- const keys = Array.isArray(input) ? input : [input];
1560
- return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
1561
- };
1767
+ const act = React__namespace.unstable_act;
1562
1768
 
1563
- useLoader.clear = function (Proto, input) {
1564
- const keys = Array.isArray(input) ? input : [input];
1565
- return suspendReact.clear([Proto, ...keys]);
1566
- };
1769
+ function createPortal(children, container) {
1770
+ return reconciler.createPortal(children, container, null, null);
1771
+ }
1772
+
1773
+ reconciler.injectIntoDevTools({
1774
+ bundleType: 0 ,
1775
+ rendererPackageName: '@react-three/fiber',
1776
+ version: '18.0.0'
1777
+ });
1567
1778
 
1779
+ exports.act = act;
1568
1780
  exports.addAfterEffect = addAfterEffect;
1569
1781
  exports.addEffect = addEffect;
1570
1782
  exports.addTail = addTail;
1783
+ exports.advance = advance;
1784
+ exports.applyProps = applyProps;
1571
1785
  exports.buildGraph = buildGraph;
1572
- exports.calculateDpr = calculateDpr;
1573
1786
  exports.context = context;
1574
1787
  exports.createEvents = createEvents;
1575
- exports.createLoop = createLoop;
1576
- exports.createRenderer = createRenderer;
1577
- exports.createStore = createStore;
1788
+ exports.createPortal = createPortal;
1789
+ exports.createRoot = createRoot;
1578
1790
  exports.dispose = dispose;
1579
1791
  exports.extend = extend;
1792
+ exports.invalidate = invalidate;
1580
1793
  exports.is = is;
1581
- exports.isRenderer = isRenderer;
1582
1794
  exports.omit = omit;
1583
1795
  exports.pick = pick;
1796
+ exports.reconciler = reconciler;
1797
+ exports.render = render;
1798
+ exports.roots = roots;
1584
1799
  exports.threeTypes = threeTypes;
1800
+ exports.unmountComponentAtNode = unmountComponentAtNode;
1585
1801
  exports.useFrame = useFrame;
1586
1802
  exports.useGraph = useGraph;
1587
1803
  exports.useLoader = useLoader;