canvu-react 0.4.76 → 0.4.77

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/react.js CHANGED
@@ -8544,6 +8544,42 @@ function didReadOnlyActivationMovePastTap(session, pointer, tapPx) {
8544
8544
  return Math.hypot(dx, dy) > tapPx;
8545
8545
  }
8546
8546
 
8547
+ // src/react/render-scheduler.ts
8548
+ var getDefaultAnimationFrameRuntime = () => typeof window === "undefined" ? {} : window;
8549
+ function createAnimationFrameRenderScheduler({
8550
+ render,
8551
+ runtime = getDefaultAnimationFrameRuntime()
8552
+ }) {
8553
+ let frameId = null;
8554
+ const canceledFrameIds = /* @__PURE__ */ new Set();
8555
+ const request = () => {
8556
+ if (frameId != null) return;
8557
+ if (typeof runtime.requestAnimationFrame !== "function") {
8558
+ render();
8559
+ return;
8560
+ }
8561
+ const scheduledFrameId = runtime.requestAnimationFrame(() => {
8562
+ const currentFrameId = scheduledFrameId;
8563
+ if (canceledFrameIds.has(currentFrameId)) {
8564
+ canceledFrameIds.delete(currentFrameId);
8565
+ return;
8566
+ }
8567
+ if (frameId === currentFrameId) {
8568
+ frameId = null;
8569
+ }
8570
+ render();
8571
+ });
8572
+ frameId = scheduledFrameId;
8573
+ };
8574
+ const cancel = () => {
8575
+ if (frameId == null) return;
8576
+ canceledFrameIds.add(frameId);
8577
+ runtime.cancelAnimationFrame?.(frameId);
8578
+ frameId = null;
8579
+ };
8580
+ return { request, cancel };
8581
+ }
8582
+
8547
8583
  // src/react/stable-selection.ts
8548
8584
  function shallowEqualStringArray(a, b) {
8549
8585
  if (a === b) return true;
@@ -9556,6 +9592,9 @@ var VectorViewport = forwardRef(
9556
9592
  reducedMotionRef.current = reducedMotion;
9557
9593
  const [zoomPercent, setZoomPercent] = useState(100);
9558
9594
  const [cameraTick, setCameraTick] = useState(0);
9595
+ const renderFrameSchedulerRef = useRef(
9596
+ null
9597
+ );
9559
9598
  const [placementPreview, setPlacementPreview] = useState(null);
9560
9599
  const [eraserTrail, setEraserTrail] = useState([]);
9561
9600
  const [laserTrail, setLaserTrail] = useState([]);
@@ -9936,7 +9975,7 @@ var VectorViewport = forwardRef(
9936
9975
  renderSceneWithLivePenStroke
9937
9976
  ]
9938
9977
  );
9939
- const renderFrame = useCallback(() => {
9978
+ const renderFrameNow = useCallback(() => {
9940
9979
  const renderer = rendererRef.current;
9941
9980
  const cam = cameraRef.current;
9942
9981
  if (!renderer || !cam) return;
@@ -9949,6 +9988,14 @@ var VectorViewport = forwardRef(
9949
9988
  }
9950
9989
  onCameraChangeRef.current?.();
9951
9990
  }, []);
9991
+ const renderFrame = useCallback(() => {
9992
+ const scheduler = renderFrameSchedulerRef.current;
9993
+ if (!scheduler) {
9994
+ renderFrameNow();
9995
+ return;
9996
+ }
9997
+ scheduler.request();
9998
+ }, [renderFrameNow]);
9952
9999
  useEffect(() => {
9953
10000
  const el = sceneContainerRef.current;
9954
10001
  const interactionEl = interactionRootRef.current;
@@ -9967,6 +10014,9 @@ var VectorViewport = forwardRef(
9967
10014
  rasterImageCanvas: imageCanvasRenderingRef.current
9968
10015
  });
9969
10016
  rendererRef.current = renderer;
10017
+ renderFrameSchedulerRef.current = createAnimationFrameRenderScheduler({
10018
+ render: renderFrameNow
10019
+ });
9970
10020
  renderer.setInteractionState({
9971
10021
  selectedIds: effectiveSelectedIdsRef.current,
9972
10022
  hoveredItemId: hoveredItemIdRef.current
@@ -10001,6 +10051,8 @@ var VectorViewport = forwardRef(
10001
10051
  });
10002
10052
  }
10003
10053
  return () => {
10054
+ renderFrameSchedulerRef.current?.cancel();
10055
+ renderFrameSchedulerRef.current = null;
10004
10056
  detachInput();
10005
10057
  detachPencil?.();
10006
10058
  renderer.destroy();
@@ -10009,7 +10061,7 @@ var VectorViewport = forwardRef(
10009
10061
  cameraRef.current = null;
10010
10062
  setCameraForOverlay(null);
10011
10063
  };
10012
- }, [applePencilNav, renderFrame, resolveReadOnlyActivation]);
10064
+ }, [applePencilNav, renderFrame, renderFrameNow, resolveReadOnlyActivation]);
10013
10065
  useEffect(() => {
10014
10066
  rendererRef.current?.setInteractionState({
10015
10067
  selectedIds: effectiveSelectedIds,
@@ -10137,10 +10189,10 @@ var VectorViewport = forwardRef(
10137
10189
  livePenStrokeItemRef.current = null;
10138
10190
  }
10139
10191
  scene.setItems(resolvedSceneItems);
10140
- renderFrame();
10192
+ renderFrameNow();
10141
10193
  renderer?.renderLiveItem(livePenStrokeItemRef.current);
10142
10194
  }
10143
- }, [resolvedSceneItems, renderFrame]);
10195
+ }, [resolvedSceneItems, renderFrameNow]);
10144
10196
  useEffect(() => {
10145
10197
  const ids = effectiveSelectedIds;
10146
10198
  const valid = ids.filter((id) => items.some((i) => i.id === id));