@vectojs/core 1.35.0 → 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
  );
@@ -6330,26 +6404,43 @@ var Scene = (_class15 = class _Scene {
6330
6404
  if (mctx) {
6331
6405
  mctx.font = lineFont;
6332
6406
  const segmenter = new Intl.Segmenter("en", { granularity: "grapheme" });
6333
- const segments = [...segmenter.segment(line.text)];
6334
- let runningX = 0;
6335
- for (let segIdx = 0; segIdx < segments.length; segIdx++) {
6336
- const { segment, index: index2 } = segments[segIdx];
6337
- const nextIndex = segIdx + 1 < segments.length ? segments[segIdx + 1].index : line.text.length;
6338
- const canvasX = mctx.measureText(line.text.slice(0, index2)).width;
6339
- const canvasWidth = mctx.measureText(line.text.slice(0, nextIndex)).width - canvasX;
6340
- const carrierEl = document.createElement("span");
6341
- carrierEl.textContent = segment;
6342
- carrierEl.style.position = "relative";
6343
- carrierEl.style.display = "inline-block";
6344
- carrierEl.style.left = `${canvasX - runningX}px`;
6345
- carrierEl.style.width = `${canvasWidth}px`;
6346
- carrierEl.style.boxSizing = "border-box";
6347
- carrierEl.style.lineHeight = `${lineHeight2}px`;
6348
- carrierEl.style.whiteSpace = "pre";
6349
- carrierEl.style.verticalAlign = "top";
6350
- carrierEl.style.unicodeBidi = "isolate";
6351
- lineElement.appendChild(carrierEl);
6352
- runningX += canvasWidth;
6407
+ if (line.shapedPaint) {
6408
+ const segments = [...segmenter.segment(line.text)];
6409
+ let runningX = 0;
6410
+ for (let segIdx = 0; segIdx < segments.length; segIdx++) {
6411
+ const { segment, index: index2 } = segments[segIdx];
6412
+ const nextIndex = segIdx + 1 < segments.length ? segments[segIdx + 1].index : line.text.length;
6413
+ const canvasX = mctx.measureText(line.text.slice(0, index2)).width;
6414
+ const canvasWidth = mctx.measureText(line.text.slice(0, nextIndex)).width - canvasX;
6415
+ const carrierEl = document.createElement("span");
6416
+ carrierEl.textContent = segment;
6417
+ carrierEl.style.position = "relative";
6418
+ carrierEl.style.display = "inline-block";
6419
+ carrierEl.style.left = `${canvasX - runningX}px`;
6420
+ carrierEl.style.width = `${canvasWidth}px`;
6421
+ carrierEl.style.boxSizing = "border-box";
6422
+ carrierEl.style.lineHeight = `${lineHeight2}px`;
6423
+ carrierEl.style.whiteSpace = "pre";
6424
+ carrierEl.style.verticalAlign = "top";
6425
+ carrierEl.style.unicodeBidi = "isolate";
6426
+ lineElement.appendChild(carrierEl);
6427
+ runningX += canvasWidth;
6428
+ }
6429
+ } else {
6430
+ for (const { segment } of segmenter.segment(line.text)) {
6431
+ const canvasWidth = mctx.measureText(segment).width;
6432
+ const carrierEl = document.createElement("span");
6433
+ carrierEl.textContent = segment;
6434
+ carrierEl.style.position = "relative";
6435
+ carrierEl.style.display = "inline-block";
6436
+ carrierEl.style.width = `${canvasWidth}px`;
6437
+ carrierEl.style.boxSizing = "border-box";
6438
+ carrierEl.style.lineHeight = `${lineHeight2}px`;
6439
+ carrierEl.style.whiteSpace = "pre";
6440
+ carrierEl.style.verticalAlign = "top";
6441
+ carrierEl.style.unicodeBidi = "isolate";
6442
+ lineElement.appendChild(carrierEl);
6443
+ }
6353
6444
  }
6354
6445
  } else {
6355
6446
  lineElement.textContent = line.text;
@@ -6685,7 +6776,7 @@ var Scene = (_class15 = class _Scene {
6685
6776
  const hasInteractive = this.frameHadInteractive;
6686
6777
  const wantsContentSync = this.contentProjectionEnabled;
6687
6778
  const shouldSyncInterval = this.a11ySyncInterval <= 0 || time - this.lastA11ySync >= this.a11ySyncInterval;
6688
- if ((hasInteractive || this.a11yElements.size > 0 || wantsContentSync) && (shouldSyncInterval || this.a11yPendingSyncAfterAnimation)) {
6779
+ if ((hasInteractive || this.a11yElements.size > 0 || wantsContentSync) && (shouldSyncInterval || !hasActiveAnimation && this.a11yPendingSyncAfterAnimation)) {
6689
6780
  this.lastA11ySync = time;
6690
6781
  if (hasInteractive || wantsContentSync) {
6691
6782
  const userTiming = this.phases.userTiming ? beginVectoUserTiming(VECTO_USER_TIMING.scene.a11ySync) : null;
@@ -6887,7 +6978,7 @@ var Scene = (_class15 = class _Scene {
6887
6978
  let walkHadAnimation = false;
6888
6979
  let walkHadInteractive = false;
6889
6980
  const runUpdate = (node) => {
6890
- const overridesUpdate = node.update !== _chunkXXU56ZNAjs.Entity.prototype.update;
6981
+ const overridesUpdate = node.update !== _chunkXHPUCU5Pjs.Entity.prototype.update;
6891
6982
  let pending = node.hasPendingAnimations();
6892
6983
  if (pending || overridesUpdate) {
6893
6984
  node.update(dt, time);
@@ -6896,7 +6987,7 @@ var Scene = (_class15 = class _Scene {
6896
6987
  if (pending) walkHadAnimation = true;
6897
6988
  if (!walkHadInteractive && node.interactive) walkHadInteractive = true;
6898
6989
  if (this._devActive && this._devFrameCount % 120 === 0) {
6899
- if (overridesUpdate && node.hasPendingAnimations === _chunkXXU56ZNAjs.Entity.prototype.hasPendingAnimations) {
6990
+ if (overridesUpdate && node.hasPendingAnimations === _chunkXHPUCU5Pjs.Entity.prototype.hasPendingAnimations) {
6900
6991
  this._devWarn(
6901
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.`
6902
6993
  );
@@ -7109,7 +7200,7 @@ var Scene = (_class15 = class _Scene {
7109
7200
  * Export the current scene state to a lightweight, flat SVG XML string.
7110
7201
  */
7111
7202
  toSVG() {
7112
- const renderer = new (0, _chunkM73XB4ZKjs.SVGRenderer)(this.width, this.height);
7203
+ const renderer = new (0, _chunkMO24PVGTjs.SVGRenderer)(this.width, this.height);
7113
7204
  this.render(renderer, 0, 0);
7114
7205
  return renderer.toXMLString();
7115
7206
  }
@@ -7322,7 +7413,7 @@ function defaultMeasurer() {
7322
7413
  sharedMeasurer ??= _layout.resolveGlyphMeasurer.call(void 0, "sans-serif");
7323
7414
  return sharedMeasurer;
7324
7415
  }
7325
- var TextEntity = (_class16 = class extends _chunkXXU56ZNAjs.Entity {
7416
+ var TextEntity = (_class16 = class extends _chunkXHPUCU5Pjs.Entity {
7326
7417
 
7327
7418
 
7328
7419
 
@@ -7526,7 +7617,7 @@ var TextEntity = (_class16 = class extends _chunkXXU56ZNAjs.Entity {
7526
7617
  }, _class16);
7527
7618
 
7528
7619
  // src/components/GridTextEntity.ts
7529
- var GridTextEntity = (_class17 = class extends _chunkXXU56ZNAjs.Entity {
7620
+ var GridTextEntity = (_class17 = class extends _chunkXHPUCU5Pjs.Entity {
7530
7621
 
7531
7622
  __init184() {this.fillStyle = "#ffffff"}
7532
7623
  __init185() {this.grid = []}
@@ -7545,7 +7636,7 @@ var GridTextEntity = (_class17 = class extends _chunkXXU56ZNAjs.Entity {
7545
7636
  updateGrid(ascii) {
7546
7637
  this.grid = ascii;
7547
7638
  this.rows = ascii.length;
7548
- 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);
7549
7640
  }
7550
7641
  isPointInside(_globalX, _globalY) {
7551
7642
  return false;
@@ -7620,7 +7711,7 @@ function distSqToSegment(px, py, x1, y1, x2, y2) {
7620
7711
  const ey = py - cy;
7621
7712
  return ex * ex + ey * ey;
7622
7713
  }
7623
- var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7714
+ var SplineEntity = (_class18 = class extends _chunkXHPUCU5Pjs.Entity {
7624
7715
 
7625
7716
 
7626
7717
 
@@ -7633,6 +7724,12 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7633
7724
  /** Logical (CSS-pixel) size of the baked bitmap — the blit destination size. */
7634
7725
  __init190() {this.bakedWidth = 0}
7635
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}
7636
7733
  /**
7637
7734
  * Gradient strokes can't be baked to a solid-color bitmap; they render
7638
7735
  * per-frame. Derived from `_doc`, so it is NOT readonly — assigning a new
@@ -7640,7 +7737,7 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7640
7737
  */
7641
7738
 
7642
7739
  /** Lazily-flattened polylines (one Float32Array of [x,y,...] per segment) for hit-testing. */
7643
- __init192() {this.polylines = null}
7740
+ __init193() {this.polylines = null}
7644
7741
  /**
7645
7742
  * The spline document to render. Assigning a new document invalidates all
7646
7743
  * caches (baked canvas, flattened polylines, bounds).
@@ -7674,9 +7771,9 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7674
7771
  * local bounds after painting the curves. Useful for drag feedback and
7675
7772
  * debugging hit areas. Defaults to `false`.
7676
7773
  */
7677
- __init193() {this.showBounds = false}
7774
+ __init194() {this.showBounds = false}
7678
7775
  constructor(doc, opts = {}) {
7679
- 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);;
7680
7777
  this._doc = doc;
7681
7778
  this._lineWidth = _nullishCoalesce(opts.lineWidth, () => ( 2));
7682
7779
  this.cache = _nullishCoalesce(opts.cache, () => ( true));
@@ -7696,7 +7793,7 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7696
7793
  */
7697
7794
  computeContainsGradient() {
7698
7795
  const isGradient = (c) => c !== null && !Array.isArray(c);
7699
- 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)));
7700
7797
  }
7701
7798
  /** Clear cached baked canvas and hit-test polylines. */
7702
7799
  invalidateCache() {
@@ -7856,14 +7953,14 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7856
7953
  }
7857
7954
  }
7858
7955
  /** Bake all equations into an OffscreenCanvas once (when available). */
7859
- bake() {
7956
+ bake(dpr) {
7860
7957
  this.baked = true;
7861
7958
  const pad = this.lineWidth + 2;
7862
7959
  const w = Math.max(1, Math.ceil(this.bounds.width) + pad * 2);
7863
7960
  const h = Math.max(1, Math.ceil(this.bounds.height) + pad * 2);
7864
7961
  this.bakedWidth = w;
7865
7962
  this.bakedHeight = h;
7866
- const dpr = typeof window !== "undefined" && typeof window.devicePixelRatio === "number" ? window.devicePixelRatio || 1 : 1;
7963
+ this.bakedDPR = dpr;
7867
7964
  let canvas;
7868
7965
  if (typeof OffscreenCanvas !== "undefined") {
7869
7966
  canvas = new OffscreenCanvas(w * dpr, h * dpr);
@@ -7911,7 +8008,8 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7911
8008
  render(r) {
7912
8009
  let rendered = false;
7913
8010
  if (this.cache && !this.containsGradient) {
7914
- 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);
7915
8013
  if (this.offscreen) {
7916
8014
  const pad = this.lineWidth + 2;
7917
8015
  r.drawImage(
@@ -7941,7 +8039,7 @@ async function loadSpline(url) {
7941
8039
  }
7942
8040
 
7943
8041
  // src/components/Rect.ts
7944
- var Rect = class extends _chunkXXU56ZNAjs.Entity {
8042
+ var Rect = class extends _chunkXHPUCU5Pjs.Entity {
7945
8043
 
7946
8044
 
7947
8045
 
@@ -7997,7 +8095,7 @@ var Rect = class extends _chunkXXU56ZNAjs.Entity {
7997
8095
  };
7998
8096
 
7999
8097
  // src/components/Circle.ts
8000
- var Circle = class extends _chunkXXU56ZNAjs.Entity {
8098
+ var Circle = class extends _chunkXHPUCU5Pjs.Entity {
8001
8099
 
8002
8100
 
8003
8101
 
@@ -8061,7 +8159,7 @@ var Circle = class extends _chunkXXU56ZNAjs.Entity {
8061
8159
  };
8062
8160
 
8063
8161
  // src/components/Group.ts
8064
- var Group = class extends _chunkXXU56ZNAjs.Entity {
8162
+ var Group = class extends _chunkXHPUCU5Pjs.Entity {
8065
8163
  constructor(...children) {
8066
8164
  super();
8067
8165
  if (children.length > 0) this.add(...children);
@@ -8080,21 +8178,21 @@ var _math = require('@vectojs/math'); _createStarExport(_math);
8080
8178
 
8081
8179
 
8082
8180
  // src/tree/DOMPortalEntity.ts
8083
- var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8181
+ var DOMPortalEntity = (_class19 = class extends _chunkXHPUCU5Pjs.Entity {
8084
8182
 
8085
- __init194() {this.isDOMPortal = true}
8086
- __init195() {this.domListeners = []}
8087
- __init196() {this.resizeObserver = null}
8088
- __init197() {this.domBound = false}
8089
- __init198() {this.cachedWidth = 100}
8090
- __init199() {this.cachedHeight = 100}
8091
- __init200() {this.lastWidth = ""}
8092
- __init201() {this.lastHeight = ""}
8093
- __init202() {this.lastTransform = ""}
8094
- __init203() {this.lastZIndex = ""}
8095
- __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 = ""}
8096
8194
  constructor(domElement, width, height, id) {
8097
- 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);;
8098
8196
  this.domElement = domElement;
8099
8197
  this.width = _nullishCoalesce(width, () => ( 0));
8100
8198
  this.height = _nullishCoalesce(height, () => ( 0));
@@ -8136,7 +8234,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8136
8234
  ];
8137
8235
  for (const type of events) {
8138
8236
  const handler = (e) => {
8139
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(type, this, e));
8237
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(type, this, e));
8140
8238
  };
8141
8239
  this.domElement.addEventListener(type, handler);
8142
8240
  this.domListeners.push({ type, handler, capture: false });
@@ -8147,7 +8245,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8147
8245
  ];
8148
8246
  for (const { native, vecto } of hoverEvents) {
8149
8247
  const handler = (e) => {
8150
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(vecto, this, e, false));
8248
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(vecto, this, e, false));
8151
8249
  };
8152
8250
  this.domElement.addEventListener(native, handler);
8153
8251
  this.domListeners.push({ type: native, handler, capture: false });
@@ -8155,7 +8253,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8155
8253
  const focusEvents = ["focus", "blur"];
8156
8254
  for (const type of focusEvents) {
8157
8255
  const handler = (e) => {
8158
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(type, this, e, true));
8256
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(type, this, e, true));
8159
8257
  };
8160
8258
  this.domElement.addEventListener(type, handler, true);
8161
8259
  this.domListeners.push({ type, handler, capture: true });
@@ -8206,8 +8304,8 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8206
8304
  }, _class19);
8207
8305
 
8208
8306
  // src/index.ts
8209
- Scene.registerWebGLPointRendererCreator(_chunkM73XB4ZKjs.createWebGLPointRenderer);
8210
- Scene.registerWebGPUParticleSystemManager(_chunkM73XB4ZKjs.WebGPUParticleSystemManager);
8307
+ Scene.registerWebGLPointRendererCreator(_chunkMO24PVGTjs.createWebGLPointRenderer);
8308
+ Scene.registerWebGPUParticleSystemManager(_chunkMO24PVGTjs.WebGPUParticleSystemManager);
8211
8309
 
8212
8310
 
8213
8311
 
@@ -8253,4 +8351,4 @@ Scene.registerWebGPUParticleSystemManager(_chunkM73XB4ZKjs.WebGPUParticleSystemM
8253
8351
 
8254
8352
 
8255
8353
 
8256
- 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;