@react-three/fiber 8.16.8 → 8.17.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @react-three/fiber
2
2
 
3
+ ## 8.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3c22194d: feat: flushSync, native EventTarget
8
+
3
9
  ## 8.16.8
4
10
 
5
11
  ### Patch Changes
@@ -4,10 +4,10 @@ var THREE = require('three');
4
4
  var React = require('react');
5
5
  var constants = require('react-reconciler/constants');
6
6
  var create = require('zustand');
7
- var Reconciler = require('react-reconciler');
8
- var scheduler = require('scheduler');
9
7
  var suspendReact = require('suspend-react');
10
8
  var jsxRuntime = require('react/jsx-runtime');
9
+ var Reconciler = require('react-reconciler');
10
+ var scheduler = require('scheduler');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
13
13
 
@@ -2268,6 +2268,17 @@ function Portal({
2268
2268
  }), usePortalStore, null)
2269
2269
  });
2270
2270
  }
2271
+
2272
+ /**
2273
+ * Force React to flush any updates inside the provided callback synchronously and immediately.
2274
+ * All the same caveats documented for react-dom's `flushSync` apply here (see https://react.dev/reference/react-dom/flushSync).
2275
+ * Nevertheless, sometimes one needs to render synchronously, for example to keep DOM and 3D changes in lock-step without
2276
+ * having to revert to a non-React solution.
2277
+ */
2278
+ function flushSync(fn) {
2279
+ // `flushSync` implementation only takes one argument. I don't know what's up with the type declaration for it.
2280
+ return reconciler.flushSync(fn, undefined);
2281
+ }
2271
2282
  reconciler.injectIntoDevTools({
2272
2283
  bundleType: 0 ,
2273
2284
  rendererPackageName: '@react-three/fiber',
@@ -2275,6 +2286,90 @@ reconciler.injectIntoDevTools({
2275
2286
  });
2276
2287
  const act = React__namespace.unstable_act;
2277
2288
 
2289
+ const DOM_EVENTS = {
2290
+ onClick: ['click', false],
2291
+ onContextMenu: ['contextmenu', false],
2292
+ onDoubleClick: ['dblclick', false],
2293
+ onWheel: ['wheel', true],
2294
+ onPointerDown: ['pointerdown', true],
2295
+ onPointerUp: ['pointerup', true],
2296
+ onPointerLeave: ['pointerleave', true],
2297
+ onPointerMove: ['pointermove', true],
2298
+ onPointerCancel: ['pointercancel', true],
2299
+ onLostPointerCapture: ['lostpointercapture', true]
2300
+ };
2301
+
2302
+ /** Default R3F event manager for web */
2303
+ function createPointerEvents(store) {
2304
+ const {
2305
+ handlePointer
2306
+ } = createEvents(store);
2307
+ return {
2308
+ priority: 1,
2309
+ enabled: true,
2310
+ compute(event, state, previous) {
2311
+ // https://github.com/pmndrs/react-three-fiber/pull/782
2312
+ // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
2313
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
2314
+ state.raycaster.setFromCamera(state.pointer, state.camera);
2315
+ },
2316
+ connected: undefined,
2317
+ handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
2318
+ ...acc,
2319
+ [key]: handlePointer(key)
2320
+ }), {}),
2321
+ update: () => {
2322
+ var _internal$lastEvent;
2323
+ const {
2324
+ events,
2325
+ internal
2326
+ } = store.getState();
2327
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
2328
+ },
2329
+ connect: target => {
2330
+ var _events$handlers;
2331
+ const {
2332
+ set,
2333
+ events
2334
+ } = store.getState();
2335
+ events.disconnect == null ? void 0 : events.disconnect();
2336
+ set(state => ({
2337
+ events: {
2338
+ ...state.events,
2339
+ connected: target
2340
+ }
2341
+ }));
2342
+ Object.entries((_events$handlers = events.handlers) != null ? _events$handlers : []).forEach(([name, event]) => {
2343
+ const [eventName, passive] = DOM_EVENTS[name];
2344
+ target.addEventListener(eventName, event, {
2345
+ passive
2346
+ });
2347
+ });
2348
+ },
2349
+ disconnect: () => {
2350
+ const {
2351
+ set,
2352
+ events
2353
+ } = store.getState();
2354
+ if (events.connected) {
2355
+ var _events$handlers2;
2356
+ Object.entries((_events$handlers2 = events.handlers) != null ? _events$handlers2 : []).forEach(([name, event]) => {
2357
+ if (events && events.connected instanceof HTMLElement) {
2358
+ const [eventName] = DOM_EVENTS[name];
2359
+ events.connected.removeEventListener(eventName, event);
2360
+ }
2361
+ });
2362
+ set(state => ({
2363
+ events: {
2364
+ ...state.events,
2365
+ connected: undefined
2366
+ }
2367
+ }));
2368
+ }
2369
+ }
2370
+ };
2371
+ }
2372
+
2278
2373
  exports.Block = Block;
2279
2374
  exports.ErrorBoundary = ErrorBoundary;
2280
2375
  exports.act = act;
@@ -2286,11 +2381,13 @@ exports.applyProps = applyProps;
2286
2381
  exports.buildGraph = buildGraph;
2287
2382
  exports.context = context;
2288
2383
  exports.createEvents = createEvents;
2384
+ exports.createPointerEvents = createPointerEvents;
2289
2385
  exports.createPortal = createPortal;
2290
2386
  exports.createRoot = createRoot;
2291
2387
  exports.dispose = dispose;
2292
2388
  exports.extend = extend;
2293
2389
  exports.flushGlobalEffects = flushGlobalEffects;
2390
+ exports.flushSync = flushSync;
2294
2391
  exports.getRootState = getRootState;
2295
2392
  exports.invalidate = invalidate;
2296
2393
  exports.isRef = isRef;
@@ -2,10 +2,10 @@ import * as THREE from 'three';
2
2
  import * as React from 'react';
3
3
  import { DefaultEventPriority, ContinuousEventPriority, DiscreteEventPriority, ConcurrentRoot } from 'react-reconciler/constants';
4
4
  import create from 'zustand';
5
- import Reconciler from 'react-reconciler';
6
- import { unstable_scheduleCallback, unstable_IdlePriority } from 'scheduler';
7
5
  import { suspend, preload, clear } from 'suspend-react';
8
6
  import { jsx, Fragment } from 'react/jsx-runtime';
7
+ import Reconciler from 'react-reconciler';
8
+ import { unstable_scheduleCallback, unstable_IdlePriority } from 'scheduler';
9
9
 
10
10
  var threeTypes = /*#__PURE__*/Object.freeze({
11
11
  __proto__: null
@@ -2241,6 +2241,17 @@ function Portal({
2241
2241
  }), usePortalStore, null)
2242
2242
  });
2243
2243
  }
2244
+
2245
+ /**
2246
+ * Force React to flush any updates inside the provided callback synchronously and immediately.
2247
+ * All the same caveats documented for react-dom's `flushSync` apply here (see https://react.dev/reference/react-dom/flushSync).
2248
+ * Nevertheless, sometimes one needs to render synchronously, for example to keep DOM and 3D changes in lock-step without
2249
+ * having to revert to a non-React solution.
2250
+ */
2251
+ function flushSync(fn) {
2252
+ // `flushSync` implementation only takes one argument. I don't know what's up with the type declaration for it.
2253
+ return reconciler.flushSync(fn, undefined);
2254
+ }
2244
2255
  reconciler.injectIntoDevTools({
2245
2256
  bundleType: process.env.NODE_ENV === 'production' ? 0 : 1,
2246
2257
  rendererPackageName: '@react-three/fiber',
@@ -2248,4 +2259,88 @@ reconciler.injectIntoDevTools({
2248
2259
  });
2249
2260
  const act = React.unstable_act;
2250
2261
 
2251
- export { useThree as A, Block as B, useFrame as C, useGraph as D, ErrorBoundary as E, useLoader as F, useIsomorphicLayoutEffect as a, createRoot as b, createEvents as c, unmountComponentAtNode as d, extend as e, context as f, createPortal as g, reconciler as h, isRef as i, applyProps as j, dispose as k, invalidate as l, advance as m, addEffect as n, addAfterEffect as o, addTail as p, flushGlobalEffects as q, render as r, getRootState as s, threeTypes as t, useMutableCallback as u, act as v, buildGraph as w, roots as x, useInstanceHandle as y, useStore as z };
2262
+ const DOM_EVENTS = {
2263
+ onClick: ['click', false],
2264
+ onContextMenu: ['contextmenu', false],
2265
+ onDoubleClick: ['dblclick', false],
2266
+ onWheel: ['wheel', true],
2267
+ onPointerDown: ['pointerdown', true],
2268
+ onPointerUp: ['pointerup', true],
2269
+ onPointerLeave: ['pointerleave', true],
2270
+ onPointerMove: ['pointermove', true],
2271
+ onPointerCancel: ['pointercancel', true],
2272
+ onLostPointerCapture: ['lostpointercapture', true]
2273
+ };
2274
+
2275
+ /** Default R3F event manager for web */
2276
+ function createPointerEvents(store) {
2277
+ const {
2278
+ handlePointer
2279
+ } = createEvents(store);
2280
+ return {
2281
+ priority: 1,
2282
+ enabled: true,
2283
+ compute(event, state, previous) {
2284
+ // https://github.com/pmndrs/react-three-fiber/pull/782
2285
+ // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
2286
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
2287
+ state.raycaster.setFromCamera(state.pointer, state.camera);
2288
+ },
2289
+ connected: undefined,
2290
+ handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
2291
+ ...acc,
2292
+ [key]: handlePointer(key)
2293
+ }), {}),
2294
+ update: () => {
2295
+ var _internal$lastEvent;
2296
+ const {
2297
+ events,
2298
+ internal
2299
+ } = store.getState();
2300
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
2301
+ },
2302
+ connect: target => {
2303
+ var _events$handlers;
2304
+ const {
2305
+ set,
2306
+ events
2307
+ } = store.getState();
2308
+ events.disconnect == null ? void 0 : events.disconnect();
2309
+ set(state => ({
2310
+ events: {
2311
+ ...state.events,
2312
+ connected: target
2313
+ }
2314
+ }));
2315
+ Object.entries((_events$handlers = events.handlers) != null ? _events$handlers : []).forEach(([name, event]) => {
2316
+ const [eventName, passive] = DOM_EVENTS[name];
2317
+ target.addEventListener(eventName, event, {
2318
+ passive
2319
+ });
2320
+ });
2321
+ },
2322
+ disconnect: () => {
2323
+ const {
2324
+ set,
2325
+ events
2326
+ } = store.getState();
2327
+ if (events.connected) {
2328
+ var _events$handlers2;
2329
+ Object.entries((_events$handlers2 = events.handlers) != null ? _events$handlers2 : []).forEach(([name, event]) => {
2330
+ if (events && events.connected instanceof HTMLElement) {
2331
+ const [eventName] = DOM_EVENTS[name];
2332
+ events.connected.removeEventListener(eventName, event);
2333
+ }
2334
+ });
2335
+ set(state => ({
2336
+ events: {
2337
+ ...state.events,
2338
+ connected: undefined
2339
+ }
2340
+ }));
2341
+ }
2342
+ }
2343
+ };
2344
+ }
2345
+
2346
+ export { useInstanceHandle as A, Block as B, useStore as C, useThree as D, ErrorBoundary as E, useFrame as F, useGraph as G, useLoader as H, useIsomorphicLayoutEffect as a, createRoot as b, createPointerEvents as c, unmountComponentAtNode as d, extend as e, createEvents as f, context as g, createPortal as h, isRef as i, reconciler as j, applyProps as k, dispose as l, invalidate as m, advance as n, addEffect as o, addAfterEffect as p, addTail as q, render as r, flushGlobalEffects as s, threeTypes as t, useMutableCallback as u, flushSync as v, getRootState as w, act as x, buildGraph as y, roots as z };
@@ -4,10 +4,10 @@ var THREE = require('three');
4
4
  var React = require('react');
5
5
  var constants = require('react-reconciler/constants');
6
6
  var create = require('zustand');
7
- var Reconciler = require('react-reconciler');
8
- var scheduler = require('scheduler');
9
7
  var suspendReact = require('suspend-react');
10
8
  var jsxRuntime = require('react/jsx-runtime');
9
+ var Reconciler = require('react-reconciler');
10
+ var scheduler = require('scheduler');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
13
13
 
@@ -2268,6 +2268,17 @@ function Portal({
2268
2268
  }), usePortalStore, null)
2269
2269
  });
2270
2270
  }
2271
+
2272
+ /**
2273
+ * Force React to flush any updates inside the provided callback synchronously and immediately.
2274
+ * All the same caveats documented for react-dom's `flushSync` apply here (see https://react.dev/reference/react-dom/flushSync).
2275
+ * Nevertheless, sometimes one needs to render synchronously, for example to keep DOM and 3D changes in lock-step without
2276
+ * having to revert to a non-React solution.
2277
+ */
2278
+ function flushSync(fn) {
2279
+ // `flushSync` implementation only takes one argument. I don't know what's up with the type declaration for it.
2280
+ return reconciler.flushSync(fn, undefined);
2281
+ }
2271
2282
  reconciler.injectIntoDevTools({
2272
2283
  bundleType: process.env.NODE_ENV === 'production' ? 0 : 1,
2273
2284
  rendererPackageName: '@react-three/fiber',
@@ -2275,6 +2286,90 @@ reconciler.injectIntoDevTools({
2275
2286
  });
2276
2287
  const act = React__namespace.unstable_act;
2277
2288
 
2289
+ const DOM_EVENTS = {
2290
+ onClick: ['click', false],
2291
+ onContextMenu: ['contextmenu', false],
2292
+ onDoubleClick: ['dblclick', false],
2293
+ onWheel: ['wheel', true],
2294
+ onPointerDown: ['pointerdown', true],
2295
+ onPointerUp: ['pointerup', true],
2296
+ onPointerLeave: ['pointerleave', true],
2297
+ onPointerMove: ['pointermove', true],
2298
+ onPointerCancel: ['pointercancel', true],
2299
+ onLostPointerCapture: ['lostpointercapture', true]
2300
+ };
2301
+
2302
+ /** Default R3F event manager for web */
2303
+ function createPointerEvents(store) {
2304
+ const {
2305
+ handlePointer
2306
+ } = createEvents(store);
2307
+ return {
2308
+ priority: 1,
2309
+ enabled: true,
2310
+ compute(event, state, previous) {
2311
+ // https://github.com/pmndrs/react-three-fiber/pull/782
2312
+ // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
2313
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
2314
+ state.raycaster.setFromCamera(state.pointer, state.camera);
2315
+ },
2316
+ connected: undefined,
2317
+ handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
2318
+ ...acc,
2319
+ [key]: handlePointer(key)
2320
+ }), {}),
2321
+ update: () => {
2322
+ var _internal$lastEvent;
2323
+ const {
2324
+ events,
2325
+ internal
2326
+ } = store.getState();
2327
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
2328
+ },
2329
+ connect: target => {
2330
+ var _events$handlers;
2331
+ const {
2332
+ set,
2333
+ events
2334
+ } = store.getState();
2335
+ events.disconnect == null ? void 0 : events.disconnect();
2336
+ set(state => ({
2337
+ events: {
2338
+ ...state.events,
2339
+ connected: target
2340
+ }
2341
+ }));
2342
+ Object.entries((_events$handlers = events.handlers) != null ? _events$handlers : []).forEach(([name, event]) => {
2343
+ const [eventName, passive] = DOM_EVENTS[name];
2344
+ target.addEventListener(eventName, event, {
2345
+ passive
2346
+ });
2347
+ });
2348
+ },
2349
+ disconnect: () => {
2350
+ const {
2351
+ set,
2352
+ events
2353
+ } = store.getState();
2354
+ if (events.connected) {
2355
+ var _events$handlers2;
2356
+ Object.entries((_events$handlers2 = events.handlers) != null ? _events$handlers2 : []).forEach(([name, event]) => {
2357
+ if (events && events.connected instanceof HTMLElement) {
2358
+ const [eventName] = DOM_EVENTS[name];
2359
+ events.connected.removeEventListener(eventName, event);
2360
+ }
2361
+ });
2362
+ set(state => ({
2363
+ events: {
2364
+ ...state.events,
2365
+ connected: undefined
2366
+ }
2367
+ }));
2368
+ }
2369
+ }
2370
+ };
2371
+ }
2372
+
2278
2373
  exports.Block = Block;
2279
2374
  exports.ErrorBoundary = ErrorBoundary;
2280
2375
  exports.act = act;
@@ -2286,11 +2381,13 @@ exports.applyProps = applyProps;
2286
2381
  exports.buildGraph = buildGraph;
2287
2382
  exports.context = context;
2288
2383
  exports.createEvents = createEvents;
2384
+ exports.createPointerEvents = createPointerEvents;
2289
2385
  exports.createPortal = createPortal;
2290
2386
  exports.createRoot = createRoot;
2291
2387
  exports.dispose = dispose;
2292
2388
  exports.extend = extend;
2293
2389
  exports.flushGlobalEffects = flushGlobalEffects;
2390
+ exports.flushSync = flushSync;
2294
2391
  exports.getRootState = getRootState;
2295
2392
  exports.invalidate = invalidate;
2296
2393
  exports.isRef = isRef;