@vectojs/core 1.35.1 → 1.35.2

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.js CHANGED
@@ -12,14 +12,14 @@
12
12
 
13
13
 
14
14
 
15
- var _chunkM73XB4ZKjs = require('./chunk-M73XB4ZK.js');
15
+ var _chunkMO24PVGTjs = require('./chunk-MO24PVGT.js');
16
16
 
17
17
 
18
18
 
19
19
 
20
20
 
21
21
 
22
- var _chunkXXU56ZNAjs = require('./chunk-XXU56ZNA.js');
22
+ var _chunkXHPUCU5Pjs = require('./chunk-XHPUCU5P.js');
23
23
 
24
24
  // src/tree/ComputeParticleEntity.ts
25
25
  var PARTICLE_STRIDE_FLOATS = 8;
@@ -31,7 +31,7 @@ var PARTICLE_OFFSET_ORIGIN_X = 4;
31
31
  var PARTICLE_OFFSET_ORIGIN_Y = 5;
32
32
  var PARTICLE_OFFSET_SIZE = 6;
33
33
  var PARTICLE_OFFSET_LIFE = 7;
34
- var ComputeParticleEntity = (_class = class extends _chunkXXU56ZNAjs.Entity {
34
+ var ComputeParticleEntity = (_class = class extends _chunkXHPUCU5Pjs.Entity {
35
35
 
36
36
 
37
37
 
@@ -317,6 +317,7 @@ var ComputeParticleEntity = (_class = class extends _chunkXXU56ZNAjs.Entity {
317
317
  stepWithBackend(backend, dt, mouseX, mouseY, width, height) {
318
318
  const count = this.maxParticles;
319
319
  backend.ensure(count);
320
+ backend.revalidateViews();
320
321
  backend.gather(this.particleData, count, true);
321
322
  const pending = backend.step(count, {
322
323
  dt,
@@ -1326,6 +1327,7 @@ var DriverTicker = (_class5 = class {
1326
1327
  tP.length = tweenCount;
1327
1328
  tD.length = tweenCount;
1328
1329
  backend.ensure(springCount, tweenCount);
1330
+ backend.revalidateViews();
1329
1331
  if (springCount > 0) {
1330
1332
  const sv = backend.springView();
1331
1333
  for (let i = 0; i < springCount; i++) {
@@ -1594,6 +1596,7 @@ var HitTester = (_class6 = class {
1594
1596
  gathered = gatherHitAABBs(this.root, frame);
1595
1597
  }
1596
1598
  backend.ensure(gathered.count, width, height, 64);
1599
+ backend.revalidateViews();
1597
1600
  const view = backend.inputView();
1598
1601
  view.minx.set(gathered.minx.subarray(0, gathered.count));
1599
1602
  view.miny.set(gathered.miny.subarray(0, gathered.count));
@@ -2124,10 +2127,15 @@ var ContentProjectionManager = (_class7 = class {
2124
2127
  }
2125
2128
  if (this.phases.enabled) this.phases.record("calibScan", performance.now() - scanStart);
2126
2129
  if (measurements.length === 0) {
2127
- el.dataset.vectoGridCalibration = calibrationKey;
2128
- el.dataset.vectoGridReady = "true";
2129
2130
  el.dataset.vectoGridCalibrationSamples = "0";
2130
2131
  delete el.dataset.vectoGridCalibrationPending;
2132
+ const readyFrame = requestAnimationFrame(() => {
2133
+ this.calibrationFrameHandles.delete(entityId);
2134
+ if (!el.isConnected) return;
2135
+ el.dataset.vectoGridCalibration = calibrationKey;
2136
+ el.dataset.vectoGridReady = "true";
2137
+ });
2138
+ this.calibrationFrameHandles.set(entityId, readyFrame);
2131
2139
  return;
2132
2140
  }
2133
2141
  const appendStart = this.phases.enabled ? performance.now() : 0;
@@ -2370,8 +2378,15 @@ var WASM_STATUS = {
2370
2378
  /** A kernel ran before `init`. */
2371
2379
  UNINITIALIZED: 2,
2372
2380
  /** A sibling run addressed a slot or parent outside the store. */
2373
- BAD_RUN: 3
2381
+ BAD_RUN: 3,
2382
+ /** A requested capacity's size arithmetic overflowed; the previous store
2383
+ * was left untouched. */
2384
+ OVERFLOW: 4
2374
2385
  };
2386
+ function viewsStale(cap, probe, memory) {
2387
+ if (cap === 0) return false;
2388
+ return probe.byteLength === 0 || probe.buffer !== memory.buffer;
2389
+ }
2375
2390
  var PAD2 = 8;
2376
2391
  var WasmTransformBackend = (_class9 = class {
2377
2392
  __init40() {this.available = true}
@@ -2561,9 +2576,15 @@ var WasmTransformBackend = (_class9 = class {
2561
2576
  }
2562
2577
  ensure(count, runCount) {
2563
2578
  if (count + PAD2 <= this.cap && runCount <= this.runCap) return;
2564
- this.cap = count + PAD2;
2565
- this.runCap = Math.max(runCount, count, 1);
2566
- this.ex.init(count, this.runCap);
2579
+ const cap = count + PAD2;
2580
+ const runCap = Math.max(runCount, count, 1);
2581
+ const status = this.ex.init(count, runCap);
2582
+ if (status !== WASM_STATUS.OK) {
2583
+ this.lastStatus = status;
2584
+ return;
2585
+ }
2586
+ this.cap = cap;
2587
+ this.runCap = runCap;
2567
2588
  this.refreshViews();
2568
2589
  }
2569
2590
  /** Rebuild typed-array views after an init() (which may have grown, and thus
@@ -2631,11 +2652,26 @@ var AnimBackend = (_class10 = class {
2631
2652
  */
2632
2653
  ensure(springCount, tweenCount) {
2633
2654
  if (springCount + PAD3 <= this.springCap && tweenCount + PAD3 <= this.tweenCap) return;
2634
- this.springCap = springCount + PAD3;
2635
- this.tweenCap = tweenCount + PAD3;
2636
- this.ex.anim_init(this.springCap, this.tweenCap);
2655
+ const springCap = springCount + PAD3;
2656
+ const tweenCap = tweenCount + PAD3;
2657
+ const status = this.ex.anim_init(springCap, tweenCap);
2658
+ if (status !== WASM_STATUS.OK) {
2659
+ this.lastStatus = status;
2660
+ return;
2661
+ }
2662
+ this.springCap = springCap;
2663
+ this.tweenCap = tweenCap;
2637
2664
  this.refreshViews();
2638
2665
  }
2666
+ /**
2667
+ * Re-create the typed-array views if another backend's allocation grew the
2668
+ * shared linear memory and detached them (see {@link viewsStale}). Call after
2669
+ * {@link ensure} and before writing into {@link springView}/{@link tweenView}.
2670
+ */
2671
+ revalidateViews() {
2672
+ if (this.springCap === 0) return;
2673
+ if (viewsStale(this.springCap, this.sv.val, this.ex.memory)) this.refreshViews();
2674
+ }
2639
2675
  /**
2640
2676
  * Advance `count` springs (from index 0) by `dtMs` milliseconds, in place.
2641
2677
  * Returns `true` when the kernel ran. `false` means it rejected the call
@@ -2729,15 +2765,26 @@ var HitTestBackend = (_class11 = class {
2729
2765
  this.gridH = gh;
2730
2766
  this.cellSize = cellSize;
2731
2767
  }
2768
+ /**
2769
+ * Re-create the typed-array views if another backend's allocation grew the
2770
+ * shared linear memory and detached them (see {@link viewsStale}). Call after
2771
+ * {@link ensure} and before writing into {@link inputView}.
2772
+ */
2773
+ revalidateViews() {
2774
+ if (this.entityCap === 0) return;
2775
+ if (viewsStale(this.entityCap, this.vminx, this.ex.memory)) this.refreshViews();
2776
+ }
2732
2777
  /**
2733
2778
  * Run the kernel's bucketing over whatever is currently resident in
2734
2779
  * {@link inputView} (write the AABBs there, and call {@link ensure} first).
2735
- * Returns `false` if the build overflowed its item budget the caller must
2736
- * not trust {@link candidatesAt} results for this build and should fall back
2737
- * to the JS walk instead (never return a wrong hit).
2780
+ * Returns `false` if the build was rejected (no `hit_init` yet) or overflowed
2781
+ * its item budget — the caller must not trust {@link candidatesAt} results
2782
+ * for this build and should fall back to the JS walk instead (never return a
2783
+ * wrong hit).
2738
2784
  */
2739
2785
  runBuild(count, vw, vh, cellSize) {
2740
- this.ex.hit_build(count, vw, vh, cellSize);
2786
+ const status = this.ex.hit_build(count, vw, vh, cellSize);
2787
+ if (status !== WASM_STATUS.OK) return false;
2741
2788
  return this.ex.hit_overflow() === 0;
2742
2789
  }
2743
2790
  /**
@@ -2763,10 +2810,16 @@ var HitTestBackend = (_class11 = class {
2763
2810
  if (count + PAD4 <= this.entityCap && cellCount <= this.cellCap && itemCount <= this.itemCap) {
2764
2811
  return;
2765
2812
  }
2766
- this.entityCap = count + PAD4;
2767
- this.cellCap = Math.max(cellCount, 1);
2768
- this.itemCap = Math.max(itemCount, count, 1);
2769
- this.ex.hit_init(count, this.cellCap, this.itemCap);
2813
+ const entityCap = count + PAD4;
2814
+ const cellCap = Math.max(cellCount, 1);
2815
+ const itemCap = Math.max(itemCount, count, 1);
2816
+ const status = this.ex.hit_init(count, cellCap, itemCap);
2817
+ if (status !== WASM_STATUS.OK) {
2818
+ return;
2819
+ }
2820
+ this.entityCap = entityCap;
2821
+ this.cellCap = cellCap;
2822
+ this.itemCap = itemCap;
2770
2823
  this.refreshViews();
2771
2824
  }
2772
2825
  /** Rebuild typed-array views after a growing `hit_init` (which detaches the
@@ -2805,10 +2858,24 @@ var ParticleBackend = (_class12 = class {
2805
2858
  */
2806
2859
  ensure(count) {
2807
2860
  if (count + PAD5 <= this.cap) return;
2808
- this.cap = count + PAD5;
2809
- this.ex.particle_init(this.cap);
2861
+ const cap = count + PAD5;
2862
+ const status = this.ex.particle_init(cap);
2863
+ if (status !== WASM_STATUS.OK) {
2864
+ this.lastStatus = status;
2865
+ return;
2866
+ }
2867
+ this.cap = cap;
2810
2868
  this.refreshViews();
2811
2869
  }
2870
+ /**
2871
+ * Re-create the typed-array views if another backend's allocation grew the
2872
+ * shared linear memory and detached them (see {@link viewsStale}). Call after
2873
+ * {@link ensure} and before {@link gather}/{@link scatter}.
2874
+ */
2875
+ revalidateViews() {
2876
+ if (this.cap === 0) return;
2877
+ if (viewsStale(this.cap, this.view.px, this.ex.memory)) this.refreshViews();
2878
+ }
2812
2879
  /**
2813
2880
  * Advance `count` particles one step in place. Returns `true` when at least
2814
2881
  * one live particle is still moving or off-origin beyond epsilon (the fused
@@ -3075,9 +3142,17 @@ var WasmBackendFacade = (_class14 = class {
3075
3142
  * main render walk onto it; passing `null` reverts to the JS path.
3076
3143
  */
3077
3144
  setTransform(backend) {
3145
+ const backendChanged = backend !== this._transform && this._transform !== null;
3078
3146
  this._transform = backend;
3079
3147
  this._mode = backend ? "wasm" : "js";
3080
3148
  this._uploadRejections = 0;
3149
+ if (backendChanged) {
3150
+ this._treeStore = null;
3151
+ this._storeStructureVersion = -1;
3152
+ this._inputs = null;
3153
+ this._world = null;
3154
+ this._aabbsFresh = false;
3155
+ }
3081
3156
  }
3082
3157
  // ── The shared runtime ──────────────────────────────────────────────────────
3083
3158
  /**
@@ -3245,6 +3320,7 @@ var WasmBackendFacade = (_class14 = class {
3245
3320
  }
3246
3321
  if (!backend.uploadRuns(built.store)) {
3247
3322
  this.transformReason = "rejected";
3323
+ this._aabbsFresh = false;
3248
3324
  this._uploadRejections++;
3249
3325
  if (this._uploadRejections >= WASM_UPLOAD_REJECT_LIMIT) {
3250
3326
  this._mode = "js";
@@ -3284,6 +3360,7 @@ var WasmBackendFacade = (_class14 = class {
3284
3360
  }
3285
3361
  if (backend.runKernel("simd") !== WASM_STATUS.OK) {
3286
3362
  this.transformReason = "rejected";
3363
+ this._aabbsFresh = false;
3287
3364
  return null;
3288
3365
  }
3289
3366
  this._aabbsFresh = false;
@@ -4469,23 +4546,23 @@ var Scene = (_class15 = class _Scene {
4469
4546
  }
4470
4547
  /**
4471
4548
  * Drop `entity` and its whole subtree from the batched-driver candidate set.
4472
- * Called by {@link remove}/{@link hideOverlay} on detach: without this a
4473
- * removed-but-still-animating entity stays pinned in the Set (a leak) and its
4474
- * drivers keep ticking every frame even though it is off-tree. If it is later
4475
- * re-added, {@link registerActiveDriverSubtree} re-registers any node that
4476
- * still has live drivers, so the motion resumes.
4549
+ * Called by `Entity.remove` on detach (which `remove`/`hideOverlay` route
4550
+ * through): without this a removed-but-still-animating entity stays pinned in
4551
+ * the Set (a leak) and its drivers keep ticking every frame even though it is
4552
+ * off-tree. If it is later re-added, {@link _registerActiveDriverSubtree}
4553
+ * re-registers any node that still has live drivers, so the motion resumes.
4477
4554
  */
4478
- unregisterActiveDriverSubtree(entity) {
4555
+ _unregisterActiveDriverSubtree(entity) {
4479
4556
  this._driverTicker.unregisterSubtree(entity);
4480
4557
  }
4481
4558
  /**
4482
4559
  * Re-register every node in `entity`'s subtree that still has live property
4483
- * drivers. Called by {@link add}/{@link showOverlay} so re-attaching a subtree
4484
- * that was removed mid-animation resumes its batched drivers (they were
4485
- * dropped from the candidate set on removal, but the driver state still lives
4486
- * on each entity).
4560
+ * drivers. Called by `Entity._addOne` so re-attaching a subtree that was
4561
+ * removed mid-animation resumes its batched drivers (they were dropped from
4562
+ * the candidate set on removal, but the driver state still lives on each
4563
+ * entity).
4487
4564
  */
4488
- registerActiveDriverSubtree(entity) {
4565
+ _registerActiveDriverSubtree(entity) {
4489
4566
  this._driverTicker.registerSubtree(entity);
4490
4567
  }
4491
4568
  // --- domain: render-scheduler — batched driver tick (extraction 6), reads the anim backend ---
@@ -4611,7 +4688,7 @@ var Scene = (_class15 = class _Scene {
4611
4688
  }
4612
4689
  static set devMode(active) {
4613
4690
  _Scene._devMode = active;
4614
- _chunkM73XB4ZKjs.setRendererDevMode.call(void 0, active);
4691
+ _chunkMO24PVGTjs.setRendererDevMode.call(void 0, active);
4615
4692
  }
4616
4693
  static _devModeDetected() {
4617
4694
  if (_Scene._devMode) return true;
@@ -4728,7 +4805,7 @@ var Scene = (_class15 = class _Scene {
4728
4805
  this.readingDirection = _nullishCoalesce(options.readingDirection, () => ( "ltr"));
4729
4806
  this.renderMode = _nullishCoalesce(options.renderMode, () => ( "always"));
4730
4807
  this._devActive = _Scene._devModeDetected();
4731
- _chunkM73XB4ZKjs.setRendererDevMode.call(void 0, this._devActive);
4808
+ _chunkMO24PVGTjs.setRendererDevMode.call(void 0, this._devActive);
4732
4809
  this._warnUnknownOptions(options);
4733
4810
  this.reducedMotionQuery = typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia("(prefers-reduced-motion: reduce)") : null;
4734
4811
  if (typeof window !== "undefined" && typeof window.matchMedia === "function") {
@@ -4736,7 +4813,7 @@ var Scene = (_class15 = class _Scene {
4736
4813
  this.forcedColorsChangeHandler = () => this.markDirty();
4737
4814
  _optionalChain([this, 'access', _118 => _118.forcedColorsQuery, 'access', _119 => _119.addEventListener, 'optionalCall', _120 => _120("change", this.forcedColorsChangeHandler)]);
4738
4815
  }
4739
- this.root = new class RootEntity extends _chunkXXU56ZNAjs.Entity {
4816
+ this.root = new class RootEntity extends _chunkXHPUCU5Pjs.Entity {
4740
4817
  isPointInside() {
4741
4818
  return false;
4742
4819
  }
@@ -4746,7 +4823,7 @@ var Scene = (_class15 = class _Scene {
4746
4823
  }("root");
4747
4824
  this.root._scene = this;
4748
4825
  this._wasmBackend = new WasmBackendFacade(this.root);
4749
- this.overlayRoot = new class OverlayRoot extends _chunkXXU56ZNAjs.Entity {
4826
+ this.overlayRoot = new class OverlayRoot extends _chunkXHPUCU5Pjs.Entity {
4750
4827
  isPointInside() {
4751
4828
  return false;
4752
4829
  }
@@ -4759,7 +4836,7 @@ var Scene = (_class15 = class _Scene {
4759
4836
  if (options.renderer) {
4760
4837
  this.renderer = options.renderer;
4761
4838
  } else {
4762
- this.renderer = new (0, _chunkM73XB4ZKjs.CanvasRenderer)(
4839
+ this.renderer = new (0, _chunkMO24PVGTjs.CanvasRenderer)(
4763
4840
  canvas,
4764
4841
  this.disableWindowResize ? { width: this.width, height: this.height } : void 0,
4765
4842
  this.maxDPR
@@ -5022,7 +5099,6 @@ var Scene = (_class15 = class _Scene {
5022
5099
  */
5023
5100
  add(entity) {
5024
5101
  this.root.add(entity);
5025
- this.registerActiveDriverSubtree(entity);
5026
5102
  return this;
5027
5103
  }
5028
5104
  // --- domain: a11y-projection — subtree pruning, focus preservation on removal ---
@@ -5067,7 +5143,7 @@ var Scene = (_class15 = class _Scene {
5067
5143
  }
5068
5144
  if (this.hoveredA11yElements.has(el)) {
5069
5145
  this.hoveredA11yElements.delete(el);
5070
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerleave", node, void 0, false));
5146
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerleave", node, void 0, false));
5071
5147
  }
5072
5148
  this.preserveFocusOnRemoval(el);
5073
5149
  el.remove();
@@ -5101,7 +5177,6 @@ var Scene = (_class15 = class _Scene {
5101
5177
  remove(entity) {
5102
5178
  this.root.remove(entity);
5103
5179
  this.removeA11yRecursively(entity);
5104
- this.unregisterActiveDriverSubtree(entity);
5105
5180
  return this;
5106
5181
  }
5107
5182
  /**
@@ -5133,7 +5208,6 @@ var Scene = (_class15 = class _Scene {
5133
5208
  */
5134
5209
  showOverlay(overlay) {
5135
5210
  this.overlayRoot.add(overlay);
5136
- this.registerActiveDriverSubtree(overlay);
5137
5211
  this.markDirty();
5138
5212
  }
5139
5213
  /**
@@ -5142,7 +5216,6 @@ var Scene = (_class15 = class _Scene {
5142
5216
  hideOverlay(overlay) {
5143
5217
  this.overlayRoot.remove(overlay);
5144
5218
  this.removeA11yRecursively(overlay);
5145
- this.unregisterActiveDriverSubtree(overlay);
5146
5219
  this.markDirty();
5147
5220
  }
5148
5221
  destroyEntitySubtree(entity) {
@@ -5386,8 +5459,9 @@ var Scene = (_class15 = class _Scene {
5386
5459
  * workload rendered ~1.0 frames per content change. To measure anything about
5387
5460
  * scheduling, use {@link start} and let `requestAnimationFrame` drive.
5388
5461
  *
5389
- * @param dt Seconds to advance. Not clamped by `MAX_FRAME_DT` the caller
5390
- * chooses the step, since determinism is the point.
5462
+ * @param dt Milliseconds to advance (same unit as the rAF timestamps `loop`
5463
+ * feeds `render`). Not clamped by `MAX_FRAME_DT` the caller chooses the
5464
+ * step, since determinism is the point.
5391
5465
  */
5392
5466
  step(dt) {
5393
5467
  const time = this.lastTime + dt;
@@ -5658,20 +5732,20 @@ var Scene = (_class15 = class _Scene {
5658
5732
  el.style.background = "transparent";
5659
5733
  }
5660
5734
  el.addEventListener("click", (e) => {
5661
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("click", node, e));
5735
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("click", node, e));
5662
5736
  });
5663
5737
  el.addEventListener("dblclick", (e) => {
5664
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("dblclick", node, e));
5738
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("dblclick", node, e));
5665
5739
  });
5666
5740
  el.addEventListener("mouseenter", (e) => {
5667
5741
  if (this.debugA11y) el.style.backgroundColor = "rgba(56, 189, 248, 0.2)";
5668
5742
  this.hoveredA11yElements.add(el);
5669
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("hover", node, e, false));
5743
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("hover", node, e, false));
5670
5744
  });
5671
5745
  el.addEventListener("mouseleave", (e) => {
5672
5746
  if (this.debugA11y) el.style.backgroundColor = "rgba(56, 189, 248, 0.05)";
5673
5747
  this.hoveredA11yElements.delete(el);
5674
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerleave", node, e, false));
5748
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerleave", node, e, false));
5675
5749
  });
5676
5750
  const capEl = el;
5677
5751
  const releasePointer = (event) => {
@@ -5687,24 +5761,24 @@ var Scene = (_class15 = class _Scene {
5687
5761
  };
5688
5762
  el.addEventListener("pointerdown", (e) => {
5689
5763
  if (typeof capEl.setPointerCapture === "function") capEl.setPointerCapture(e.pointerId);
5690
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerdown", node, e));
5764
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerdown", node, e));
5691
5765
  });
5692
5766
  el.addEventListener("pointerup", (e) => {
5693
5767
  releasePointer(e);
5694
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerup", node, e));
5768
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerup", node, e));
5695
5769
  });
5696
5770
  el.addEventListener("pointercancel", (e) => {
5697
5771
  releasePointer(e);
5698
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointercancel", node, e));
5772
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointercancel", node, e));
5699
5773
  });
5700
5774
  el.addEventListener(
5701
5775
  "pointermove",
5702
- (e) => node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointermove", node, e))
5776
+ (e) => node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointermove", node, e))
5703
5777
  );
5704
5778
  el.addEventListener(
5705
5779
  "wheel",
5706
5780
  (e) => {
5707
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("wheel", node, e));
5781
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("wheel", node, e));
5708
5782
  },
5709
5783
  { passive: false }
5710
5784
  );
@@ -5729,10 +5803,10 @@ var Scene = (_class15 = class _Scene {
5729
5803
  );
5730
5804
  emitInitialScroll = emitScroll;
5731
5805
  el.addEventListener("keydown", (e) => {
5732
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("keydown", node, e));
5806
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("keydown", node, e));
5733
5807
  });
5734
5808
  el.addEventListener("keyup", (e) => {
5735
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("keyup", node, e));
5809
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("keyup", node, e));
5736
5810
  });
5737
5811
  if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
5738
5812
  const input = el;
@@ -5798,7 +5872,7 @@ var Scene = (_class15 = class _Scene {
5798
5872
  el.addEventListener("keydown", (e) => {
5799
5873
  if (e.key === "Enter" || e.key === " ") {
5800
5874
  e.preventDefault();
5801
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("click", node, e));
5875
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("click", node, e));
5802
5876
  }
5803
5877
  });
5804
5878
  }
@@ -5836,7 +5910,7 @@ var Scene = (_class15 = class _Scene {
5836
5910
  this.syncOptionalAttribute(
5837
5911
  el,
5838
5912
  "href",
5839
- attrs.href === void 0 ? void 0 : _chunkM73XB4ZKjs.sanitizeUrl.call(void 0, attrs.href)
5913
+ attrs.href === void 0 ? void 0 : _chunkMO24PVGTjs.sanitizeUrl.call(void 0, attrs.href)
5840
5914
  );
5841
5915
  this.syncOptionalAttribute(el, "target", attrs.target);
5842
5916
  }
@@ -6235,7 +6309,7 @@ var Scene = (_class15 = class _Scene {
6235
6309
  el.addEventListener(
6236
6310
  "wheel",
6237
6311
  (e2) => {
6238
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("wheel", node, e2));
6312
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("wheel", node, e2));
6239
6313
  },
6240
6314
  { passive: false }
6241
6315
  );
@@ -6702,7 +6776,7 @@ var Scene = (_class15 = class _Scene {
6702
6776
  const hasInteractive = this.frameHadInteractive;
6703
6777
  const wantsContentSync = this.contentProjectionEnabled;
6704
6778
  const shouldSyncInterval = this.a11ySyncInterval <= 0 || time - this.lastA11ySync >= this.a11ySyncInterval;
6705
- if ((hasInteractive || this.a11yElements.size > 0 || wantsContentSync) && (shouldSyncInterval || this.a11yPendingSyncAfterAnimation)) {
6779
+ if ((hasInteractive || this.a11yElements.size > 0 || wantsContentSync) && (shouldSyncInterval || !hasActiveAnimation && this.a11yPendingSyncAfterAnimation)) {
6706
6780
  this.lastA11ySync = time;
6707
6781
  if (hasInteractive || wantsContentSync) {
6708
6782
  const userTiming = this.phases.userTiming ? beginVectoUserTiming(VECTO_USER_TIMING.scene.a11ySync) : null;
@@ -6904,7 +6978,7 @@ var Scene = (_class15 = class _Scene {
6904
6978
  let walkHadAnimation = false;
6905
6979
  let walkHadInteractive = false;
6906
6980
  const runUpdate = (node) => {
6907
- const overridesUpdate = node.update !== _chunkXXU56ZNAjs.Entity.prototype.update;
6981
+ const overridesUpdate = node.update !== _chunkXHPUCU5Pjs.Entity.prototype.update;
6908
6982
  let pending = node.hasPendingAnimations();
6909
6983
  if (pending || overridesUpdate) {
6910
6984
  node.update(dt, time);
@@ -6913,7 +6987,7 @@ var Scene = (_class15 = class _Scene {
6913
6987
  if (pending) walkHadAnimation = true;
6914
6988
  if (!walkHadInteractive && node.interactive) walkHadInteractive = true;
6915
6989
  if (this._devActive && this._devFrameCount % 120 === 0) {
6916
- if (overridesUpdate && node.hasPendingAnimations === _chunkXXU56ZNAjs.Entity.prototype.hasPendingAnimations) {
6990
+ if (overridesUpdate && node.hasPendingAnimations === _chunkXHPUCU5Pjs.Entity.prototype.hasPendingAnimations) {
6917
6991
  this._devWarn(
6918
6992
  `Entity "${node.id}" overrides update() but not hasPendingAnimations(). Custom motion in update() without overriding hasPendingAnimations() causes the idle throttle to drop the animation to ~2fps. Override hasPendingAnimations() to return true while motion is in flight.`
6919
6993
  );
@@ -7126,7 +7200,7 @@ var Scene = (_class15 = class _Scene {
7126
7200
  * Export the current scene state to a lightweight, flat SVG XML string.
7127
7201
  */
7128
7202
  toSVG() {
7129
- const renderer = new (0, _chunkM73XB4ZKjs.SVGRenderer)(this.width, this.height);
7203
+ const renderer = new (0, _chunkMO24PVGTjs.SVGRenderer)(this.width, this.height);
7130
7204
  this.render(renderer, 0, 0);
7131
7205
  return renderer.toXMLString();
7132
7206
  }
@@ -7339,7 +7413,7 @@ function defaultMeasurer() {
7339
7413
  sharedMeasurer ??= _layout.resolveGlyphMeasurer.call(void 0, "sans-serif");
7340
7414
  return sharedMeasurer;
7341
7415
  }
7342
- var TextEntity = (_class16 = class extends _chunkXXU56ZNAjs.Entity {
7416
+ var TextEntity = (_class16 = class extends _chunkXHPUCU5Pjs.Entity {
7343
7417
 
7344
7418
 
7345
7419
 
@@ -7543,7 +7617,7 @@ var TextEntity = (_class16 = class extends _chunkXXU56ZNAjs.Entity {
7543
7617
  }, _class16);
7544
7618
 
7545
7619
  // src/components/GridTextEntity.ts
7546
- var GridTextEntity = (_class17 = class extends _chunkXXU56ZNAjs.Entity {
7620
+ var GridTextEntity = (_class17 = class extends _chunkXHPUCU5Pjs.Entity {
7547
7621
 
7548
7622
  __init184() {this.fillStyle = "#ffffff"}
7549
7623
  __init185() {this.grid = []}
@@ -7562,7 +7636,7 @@ var GridTextEntity = (_class17 = class extends _chunkXXU56ZNAjs.Entity {
7562
7636
  updateGrid(ascii) {
7563
7637
  this.grid = ascii;
7564
7638
  this.rows = ascii.length;
7565
- this.cols = _optionalChain([ascii, 'access', _187 => _187[0], 'optionalAccess', _188 => _188.length]) || 0;
7639
+ this.cols = ascii.reduce((widest, row) => Math.max(widest, _nullishCoalesce(_optionalChain([row, 'optionalAccess', _187 => _187.length]), () => ( 0))), 0);
7566
7640
  }
7567
7641
  isPointInside(_globalX, _globalY) {
7568
7642
  return false;
@@ -7637,7 +7711,7 @@ function distSqToSegment(px, py, x1, y1, x2, y2) {
7637
7711
  const ey = py - cy;
7638
7712
  return ex * ex + ey * ey;
7639
7713
  }
7640
- var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7714
+ var SplineEntity = (_class18 = class extends _chunkXHPUCU5Pjs.Entity {
7641
7715
 
7642
7716
 
7643
7717
 
@@ -7650,6 +7724,12 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7650
7724
  /** Logical (CSS-pixel) size of the baked bitmap — the blit destination size. */
7651
7725
  __init190() {this.bakedWidth = 0}
7652
7726
  __init191() {this.bakedHeight = 0}
7727
+ /**
7728
+ * Device-pixel ratio the bitmap was rasterized at. Tracked so a DPR change
7729
+ * (browser zoom, a monitor move, a renderer whose clamp changed) re-bakes
7730
+ * instead of blitting a bitmap at the wrong device density forever.
7731
+ */
7732
+ __init192() {this.bakedDPR = 0}
7653
7733
  /**
7654
7734
  * Gradient strokes can't be baked to a solid-color bitmap; they render
7655
7735
  * per-frame. Derived from `_doc`, so it is NOT readonly — assigning a new
@@ -7657,7 +7737,7 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7657
7737
  */
7658
7738
 
7659
7739
  /** Lazily-flattened polylines (one Float32Array of [x,y,...] per segment) for hit-testing. */
7660
- __init192() {this.polylines = null}
7740
+ __init193() {this.polylines = null}
7661
7741
  /**
7662
7742
  * The spline document to render. Assigning a new document invalidates all
7663
7743
  * caches (baked canvas, flattened polylines, bounds).
@@ -7691,9 +7771,9 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7691
7771
  * local bounds after painting the curves. Useful for drag feedback and
7692
7772
  * debugging hit areas. Defaults to `false`.
7693
7773
  */
7694
- __init193() {this.showBounds = false}
7774
+ __init194() {this.showBounds = false}
7695
7775
  constructor(doc, opts = {}) {
7696
- super();_class18.prototype.__init188.call(this);_class18.prototype.__init189.call(this);_class18.prototype.__init190.call(this);_class18.prototype.__init191.call(this);_class18.prototype.__init192.call(this);_class18.prototype.__init193.call(this);;
7776
+ super();_class18.prototype.__init188.call(this);_class18.prototype.__init189.call(this);_class18.prototype.__init190.call(this);_class18.prototype.__init191.call(this);_class18.prototype.__init192.call(this);_class18.prototype.__init193.call(this);_class18.prototype.__init194.call(this);;
7697
7777
  this._doc = doc;
7698
7778
  this._lineWidth = _nullishCoalesce(opts.lineWidth, () => ( 2));
7699
7779
  this.cache = _nullishCoalesce(opts.cache, () => ( true));
@@ -7713,7 +7793,7 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7713
7793
  */
7714
7794
  computeContainsGradient() {
7715
7795
  const isGradient = (c) => c !== null && !Array.isArray(c);
7716
- return (_nullishCoalesce(_optionalChain([this, 'access', _189 => _189._doc, 'access', _190 => _190.equations, 'optionalAccess', _191 => _191.some, 'call', _192 => _192((eq) => isGradient(eq.color_rgb))]), () => ( false))) || (_nullishCoalesce(_optionalChain([this, 'access', _193 => _193._doc, 'access', _194 => _194.paths, 'optionalAccess', _195 => _195.some, 'call', _196 => _196((p) => isGradient(p.color_rgb))]), () => ( false)));
7796
+ return (_nullishCoalesce(_optionalChain([this, 'access', _188 => _188._doc, 'access', _189 => _189.equations, 'optionalAccess', _190 => _190.some, 'call', _191 => _191((eq) => isGradient(eq.color_rgb))]), () => ( false))) || (_nullishCoalesce(_optionalChain([this, 'access', _192 => _192._doc, 'access', _193 => _193.paths, 'optionalAccess', _194 => _194.some, 'call', _195 => _195((p) => isGradient(p.color_rgb))]), () => ( false)));
7717
7797
  }
7718
7798
  /** Clear cached baked canvas and hit-test polylines. */
7719
7799
  invalidateCache() {
@@ -7873,14 +7953,14 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7873
7953
  }
7874
7954
  }
7875
7955
  /** Bake all equations into an OffscreenCanvas once (when available). */
7876
- bake() {
7956
+ bake(dpr) {
7877
7957
  this.baked = true;
7878
7958
  const pad = this.lineWidth + 2;
7879
7959
  const w = Math.max(1, Math.ceil(this.bounds.width) + pad * 2);
7880
7960
  const h = Math.max(1, Math.ceil(this.bounds.height) + pad * 2);
7881
7961
  this.bakedWidth = w;
7882
7962
  this.bakedHeight = h;
7883
- const dpr = typeof window !== "undefined" && typeof window.devicePixelRatio === "number" ? window.devicePixelRatio || 1 : 1;
7963
+ this.bakedDPR = dpr;
7884
7964
  let canvas;
7885
7965
  if (typeof OffscreenCanvas !== "undefined") {
7886
7966
  canvas = new OffscreenCanvas(w * dpr, h * dpr);
@@ -7928,7 +8008,8 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7928
8008
  render(r) {
7929
8009
  let rendered = false;
7930
8010
  if (this.cache && !this.containsGradient) {
7931
- if (!this.baked) this.bake();
8011
+ const dpr = typeof r.pixelRatio === "number" && r.pixelRatio > 0 ? r.pixelRatio : typeof window !== "undefined" && typeof window.devicePixelRatio === "number" ? window.devicePixelRatio || 1 : 1;
8012
+ if (!this.baked || this.bakedDPR !== dpr) this.bake(dpr);
7932
8013
  if (this.offscreen) {
7933
8014
  const pad = this.lineWidth + 2;
7934
8015
  r.drawImage(
@@ -7958,7 +8039,7 @@ async function loadSpline(url) {
7958
8039
  }
7959
8040
 
7960
8041
  // src/components/Rect.ts
7961
- var Rect = class extends _chunkXXU56ZNAjs.Entity {
8042
+ var Rect = class extends _chunkXHPUCU5Pjs.Entity {
7962
8043
 
7963
8044
 
7964
8045
 
@@ -8014,7 +8095,7 @@ var Rect = class extends _chunkXXU56ZNAjs.Entity {
8014
8095
  };
8015
8096
 
8016
8097
  // src/components/Circle.ts
8017
- var Circle = class extends _chunkXXU56ZNAjs.Entity {
8098
+ var Circle = class extends _chunkXHPUCU5Pjs.Entity {
8018
8099
 
8019
8100
 
8020
8101
 
@@ -8078,7 +8159,7 @@ var Circle = class extends _chunkXXU56ZNAjs.Entity {
8078
8159
  };
8079
8160
 
8080
8161
  // src/components/Group.ts
8081
- var Group = class extends _chunkXXU56ZNAjs.Entity {
8162
+ var Group = class extends _chunkXHPUCU5Pjs.Entity {
8082
8163
  constructor(...children) {
8083
8164
  super();
8084
8165
  if (children.length > 0) this.add(...children);
@@ -8097,21 +8178,21 @@ var _math = require('@vectojs/math'); _createStarExport(_math);
8097
8178
 
8098
8179
 
8099
8180
  // src/tree/DOMPortalEntity.ts
8100
- var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8181
+ var DOMPortalEntity = (_class19 = class extends _chunkXHPUCU5Pjs.Entity {
8101
8182
 
8102
- __init194() {this.isDOMPortal = true}
8103
- __init195() {this.domListeners = []}
8104
- __init196() {this.resizeObserver = null}
8105
- __init197() {this.domBound = false}
8106
- __init198() {this.cachedWidth = 100}
8107
- __init199() {this.cachedHeight = 100}
8108
- __init200() {this.lastWidth = ""}
8109
- __init201() {this.lastHeight = ""}
8110
- __init202() {this.lastTransform = ""}
8111
- __init203() {this.lastZIndex = ""}
8112
- __init204() {this.lastOpacity = ""}
8183
+ __init195() {this.isDOMPortal = true}
8184
+ __init196() {this.domListeners = []}
8185
+ __init197() {this.resizeObserver = null}
8186
+ __init198() {this.domBound = false}
8187
+ __init199() {this.cachedWidth = 100}
8188
+ __init200() {this.cachedHeight = 100}
8189
+ __init201() {this.lastWidth = ""}
8190
+ __init202() {this.lastHeight = ""}
8191
+ __init203() {this.lastTransform = ""}
8192
+ __init204() {this.lastZIndex = ""}
8193
+ __init205() {this.lastOpacity = ""}
8113
8194
  constructor(domElement, width, height, id) {
8114
- super(id);_class19.prototype.__init194.call(this);_class19.prototype.__init195.call(this);_class19.prototype.__init196.call(this);_class19.prototype.__init197.call(this);_class19.prototype.__init198.call(this);_class19.prototype.__init199.call(this);_class19.prototype.__init200.call(this);_class19.prototype.__init201.call(this);_class19.prototype.__init202.call(this);_class19.prototype.__init203.call(this);_class19.prototype.__init204.call(this);;
8195
+ super(id);_class19.prototype.__init195.call(this);_class19.prototype.__init196.call(this);_class19.prototype.__init197.call(this);_class19.prototype.__init198.call(this);_class19.prototype.__init199.call(this);_class19.prototype.__init200.call(this);_class19.prototype.__init201.call(this);_class19.prototype.__init202.call(this);_class19.prototype.__init203.call(this);_class19.prototype.__init204.call(this);_class19.prototype.__init205.call(this);;
8115
8196
  this.domElement = domElement;
8116
8197
  this.width = _nullishCoalesce(width, () => ( 0));
8117
8198
  this.height = _nullishCoalesce(height, () => ( 0));
@@ -8153,7 +8234,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8153
8234
  ];
8154
8235
  for (const type of events) {
8155
8236
  const handler = (e) => {
8156
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(type, this, e));
8237
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(type, this, e));
8157
8238
  };
8158
8239
  this.domElement.addEventListener(type, handler);
8159
8240
  this.domListeners.push({ type, handler, capture: false });
@@ -8164,7 +8245,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8164
8245
  ];
8165
8246
  for (const { native, vecto } of hoverEvents) {
8166
8247
  const handler = (e) => {
8167
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(vecto, this, e, false));
8248
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(vecto, this, e, false));
8168
8249
  };
8169
8250
  this.domElement.addEventListener(native, handler);
8170
8251
  this.domListeners.push({ type: native, handler, capture: false });
@@ -8172,7 +8253,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8172
8253
  const focusEvents = ["focus", "blur"];
8173
8254
  for (const type of focusEvents) {
8174
8255
  const handler = (e) => {
8175
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(type, this, e, true));
8256
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(type, this, e, true));
8176
8257
  };
8177
8258
  this.domElement.addEventListener(type, handler, true);
8178
8259
  this.domListeners.push({ type, handler, capture: true });
@@ -8223,8 +8304,8 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8223
8304
  }, _class19);
8224
8305
 
8225
8306
  // src/index.ts
8226
- Scene.registerWebGLPointRendererCreator(_chunkM73XB4ZKjs.createWebGLPointRenderer);
8227
- Scene.registerWebGPUParticleSystemManager(_chunkM73XB4ZKjs.WebGPUParticleSystemManager);
8307
+ Scene.registerWebGLPointRendererCreator(_chunkMO24PVGTjs.createWebGLPointRenderer);
8308
+ Scene.registerWebGPUParticleSystemManager(_chunkMO24PVGTjs.WebGPUParticleSystemManager);
8228
8309
 
8229
8310
 
8230
8311
 
@@ -8270,4 +8351,4 @@ Scene.registerWebGPUParticleSystemManager(_chunkM73XB4ZKjs.WebGPUParticleSystemM
8270
8351
 
8271
8352
 
8272
8353
 
8273
- exports.CanvasRenderer = _chunkM73XB4ZKjs.CanvasRenderer; exports.Circle = Circle; exports.ComputeParticleEntity = ComputeParticleEntity; exports.DEFAULT_CONTENT_SEMANTIC_BUDGET = DEFAULT_CONTENT_SEMANTIC_BUDGET; exports.DOMPortalEntity = DOMPortalEntity; exports.Entity = _chunkXXU56ZNAjs.Entity; exports.GlyphRasterAtlas = _chunkM73XB4ZKjs.GlyphRasterAtlas; exports.GridTextEntity = GridTextEntity; exports.Group = Group; exports.MSDFTextEntity = _chunkXXU56ZNAjs.MSDFTextEntity; exports.PARTICLE_OFFSET_LIFE = PARTICLE_OFFSET_LIFE; exports.PARTICLE_OFFSET_ORIGIN_X = PARTICLE_OFFSET_ORIGIN_X; exports.PARTICLE_OFFSET_ORIGIN_Y = PARTICLE_OFFSET_ORIGIN_Y; exports.PARTICLE_OFFSET_POSITION_X = PARTICLE_OFFSET_POSITION_X; exports.PARTICLE_OFFSET_POSITION_Y = PARTICLE_OFFSET_POSITION_Y; exports.PARTICLE_OFFSET_SIZE = PARTICLE_OFFSET_SIZE; exports.PARTICLE_OFFSET_VELOCITY_X = PARTICLE_OFFSET_VELOCITY_X; exports.PARTICLE_OFFSET_VELOCITY_Y = PARTICLE_OFFSET_VELOCITY_Y; exports.PARTICLE_STRIDE_FLOATS = PARTICLE_STRIDE_FLOATS; exports.REDUCED_MOTION_FPS = REDUCED_MOTION_FPS; exports.Rect = Rect; exports.SCENE_OPTION_KEYS = SCENE_OPTION_KEYS; exports.SVGEntity = _chunkXXU56ZNAjs.SVGEntity; exports.SVGRenderer = _chunkM73XB4ZKjs.SVGRenderer; exports.Scene = Scene; exports.SplineEntity = SplineEntity; exports.TextEntity = TextEntity; exports.TextRasterCache = _chunkM73XB4ZKjs.TextRasterCache; exports.VECTO_USER_TIMING = VECTO_USER_TIMING; exports.VectoJSEvent = _chunkXXU56ZNAjs.VectoJSEvent; exports.WebGPUParticleSystemManager = _chunkM73XB4ZKjs.WebGPUParticleSystemManager; exports.beginVectoUserTiming = beginVectoUserTiming; exports.contentLineInHint = _chunkXXU56ZNAjs.contentLineInHint; exports.createWebGLPointRenderer = _chunkM73XB4ZKjs.createWebGLPointRenderer; exports.endVectoUserTiming = endVectoUserTiming; exports.installRendererDevTraps = _chunkM73XB4ZKjs.installRendererDevTraps; exports.isRendererDevMode = _chunkM73XB4ZKjs.isRendererDevMode; exports.isSafeUrl = _chunkM73XB4ZKjs.isSafeUrl; exports.loadSpline = loadSpline; exports.measureVectoUserTiming = measureVectoUserTiming; exports.parseColorToRGBA = _chunkM73XB4ZKjs.parseColorToRGBA; exports.polySegmentToBezier = polySegmentToBezier; exports.sanitizeUrl = _chunkM73XB4ZKjs.sanitizeUrl; exports.setRendererDevMode = _chunkM73XB4ZKjs.setRendererDevMode;
8354
+ exports.CanvasRenderer = _chunkMO24PVGTjs.CanvasRenderer; exports.Circle = Circle; exports.ComputeParticleEntity = ComputeParticleEntity; exports.DEFAULT_CONTENT_SEMANTIC_BUDGET = DEFAULT_CONTENT_SEMANTIC_BUDGET; exports.DOMPortalEntity = DOMPortalEntity; exports.Entity = _chunkXHPUCU5Pjs.Entity; exports.GlyphRasterAtlas = _chunkMO24PVGTjs.GlyphRasterAtlas; exports.GridTextEntity = GridTextEntity; exports.Group = Group; exports.MSDFTextEntity = _chunkXHPUCU5Pjs.MSDFTextEntity; exports.PARTICLE_OFFSET_LIFE = PARTICLE_OFFSET_LIFE; exports.PARTICLE_OFFSET_ORIGIN_X = PARTICLE_OFFSET_ORIGIN_X; exports.PARTICLE_OFFSET_ORIGIN_Y = PARTICLE_OFFSET_ORIGIN_Y; exports.PARTICLE_OFFSET_POSITION_X = PARTICLE_OFFSET_POSITION_X; exports.PARTICLE_OFFSET_POSITION_Y = PARTICLE_OFFSET_POSITION_Y; exports.PARTICLE_OFFSET_SIZE = PARTICLE_OFFSET_SIZE; exports.PARTICLE_OFFSET_VELOCITY_X = PARTICLE_OFFSET_VELOCITY_X; exports.PARTICLE_OFFSET_VELOCITY_Y = PARTICLE_OFFSET_VELOCITY_Y; exports.PARTICLE_STRIDE_FLOATS = PARTICLE_STRIDE_FLOATS; exports.REDUCED_MOTION_FPS = REDUCED_MOTION_FPS; exports.Rect = Rect; exports.SCENE_OPTION_KEYS = SCENE_OPTION_KEYS; exports.SVGEntity = _chunkXHPUCU5Pjs.SVGEntity; exports.SVGRenderer = _chunkMO24PVGTjs.SVGRenderer; exports.Scene = Scene; exports.SplineEntity = SplineEntity; exports.TextEntity = TextEntity; exports.TextRasterCache = _chunkMO24PVGTjs.TextRasterCache; exports.VECTO_USER_TIMING = VECTO_USER_TIMING; exports.VectoJSEvent = _chunkXHPUCU5Pjs.VectoJSEvent; exports.WebGPUParticleSystemManager = _chunkMO24PVGTjs.WebGPUParticleSystemManager; exports.beginVectoUserTiming = beginVectoUserTiming; exports.contentLineInHint = _chunkXHPUCU5Pjs.contentLineInHint; exports.createWebGLPointRenderer = _chunkMO24PVGTjs.createWebGLPointRenderer; exports.endVectoUserTiming = endVectoUserTiming; exports.installRendererDevTraps = _chunkMO24PVGTjs.installRendererDevTraps; exports.isRendererDevMode = _chunkMO24PVGTjs.isRendererDevMode; exports.isSafeUrl = _chunkMO24PVGTjs.isSafeUrl; exports.loadSpline = loadSpline; exports.measureVectoUserTiming = measureVectoUserTiming; exports.parseColorToRGBA = _chunkMO24PVGTjs.parseColorToRGBA; exports.polySegmentToBezier = polySegmentToBezier; exports.sanitizeUrl = _chunkMO24PVGTjs.sanitizeUrl; exports.setRendererDevMode = _chunkMO24PVGTjs.setRendererDevMode;