@vectojs/core 1.35.1 → 1.35.3

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;
@@ -5649,6 +5723,8 @@ var Scene = (_class15 = class _Scene {
5649
5723
  el.style.padding = "0";
5650
5724
  el.style.outline = "none";
5651
5725
  el.style.cursor = node.a11yFullViewport ? "default" : "pointer";
5726
+ el.style.userSelect = "none";
5727
+ el.style.webkitUserSelect = "none";
5652
5728
  if (this.debugA11y) {
5653
5729
  el.style.backgroundColor = "rgba(56, 189, 248, 0.05)";
5654
5730
  el.style.border = "1px dashed rgba(56, 189, 248, 0.4)";
@@ -5658,20 +5734,20 @@ var Scene = (_class15 = class _Scene {
5658
5734
  el.style.background = "transparent";
5659
5735
  }
5660
5736
  el.addEventListener("click", (e) => {
5661
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("click", node, e));
5737
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("click", node, e));
5662
5738
  });
5663
5739
  el.addEventListener("dblclick", (e) => {
5664
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("dblclick", node, e));
5740
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("dblclick", node, e));
5665
5741
  });
5666
5742
  el.addEventListener("mouseenter", (e) => {
5667
5743
  if (this.debugA11y) el.style.backgroundColor = "rgba(56, 189, 248, 0.2)";
5668
5744
  this.hoveredA11yElements.add(el);
5669
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("hover", node, e, false));
5745
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("hover", node, e, false));
5670
5746
  });
5671
5747
  el.addEventListener("mouseleave", (e) => {
5672
5748
  if (this.debugA11y) el.style.backgroundColor = "rgba(56, 189, 248, 0.05)";
5673
5749
  this.hoveredA11yElements.delete(el);
5674
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerleave", node, e, false));
5750
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerleave", node, e, false));
5675
5751
  });
5676
5752
  const capEl = el;
5677
5753
  const releasePointer = (event) => {
@@ -5687,24 +5763,24 @@ var Scene = (_class15 = class _Scene {
5687
5763
  };
5688
5764
  el.addEventListener("pointerdown", (e) => {
5689
5765
  if (typeof capEl.setPointerCapture === "function") capEl.setPointerCapture(e.pointerId);
5690
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerdown", node, e));
5766
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerdown", node, e));
5691
5767
  });
5692
5768
  el.addEventListener("pointerup", (e) => {
5693
5769
  releasePointer(e);
5694
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointerup", node, e));
5770
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointerup", node, e));
5695
5771
  });
5696
5772
  el.addEventListener("pointercancel", (e) => {
5697
5773
  releasePointer(e);
5698
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointercancel", node, e));
5774
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointercancel", node, e));
5699
5775
  });
5700
5776
  el.addEventListener(
5701
5777
  "pointermove",
5702
- (e) => node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("pointermove", node, e))
5778
+ (e) => node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("pointermove", node, e))
5703
5779
  );
5704
5780
  el.addEventListener(
5705
5781
  "wheel",
5706
5782
  (e) => {
5707
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("wheel", node, e));
5783
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("wheel", node, e));
5708
5784
  },
5709
5785
  { passive: false }
5710
5786
  );
@@ -5729,10 +5805,10 @@ var Scene = (_class15 = class _Scene {
5729
5805
  );
5730
5806
  emitInitialScroll = emitScroll;
5731
5807
  el.addEventListener("keydown", (e) => {
5732
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("keydown", node, e));
5808
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("keydown", node, e));
5733
5809
  });
5734
5810
  el.addEventListener("keyup", (e) => {
5735
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("keyup", node, e));
5811
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("keyup", node, e));
5736
5812
  });
5737
5813
  if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
5738
5814
  const input = el;
@@ -5798,7 +5874,7 @@ var Scene = (_class15 = class _Scene {
5798
5874
  el.addEventListener("keydown", (e) => {
5799
5875
  if (e.key === "Enter" || e.key === " ") {
5800
5876
  e.preventDefault();
5801
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("click", node, e));
5877
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("click", node, e));
5802
5878
  }
5803
5879
  });
5804
5880
  }
@@ -5836,7 +5912,7 @@ var Scene = (_class15 = class _Scene {
5836
5912
  this.syncOptionalAttribute(
5837
5913
  el,
5838
5914
  "href",
5839
- attrs.href === void 0 ? void 0 : _chunkM73XB4ZKjs.sanitizeUrl.call(void 0, attrs.href)
5915
+ attrs.href === void 0 ? void 0 : _chunkMO24PVGTjs.sanitizeUrl.call(void 0, attrs.href)
5840
5916
  );
5841
5917
  this.syncOptionalAttribute(el, "target", attrs.target);
5842
5918
  }
@@ -6235,7 +6311,7 @@ var Scene = (_class15 = class _Scene {
6235
6311
  el.addEventListener(
6236
6312
  "wheel",
6237
6313
  (e2) => {
6238
- node.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)("wheel", node, e2));
6314
+ node.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)("wheel", node, e2));
6239
6315
  },
6240
6316
  { passive: false }
6241
6317
  );
@@ -6702,7 +6778,7 @@ var Scene = (_class15 = class _Scene {
6702
6778
  const hasInteractive = this.frameHadInteractive;
6703
6779
  const wantsContentSync = this.contentProjectionEnabled;
6704
6780
  const shouldSyncInterval = this.a11ySyncInterval <= 0 || time - this.lastA11ySync >= this.a11ySyncInterval;
6705
- if ((hasInteractive || this.a11yElements.size > 0 || wantsContentSync) && (shouldSyncInterval || this.a11yPendingSyncAfterAnimation)) {
6781
+ if ((hasInteractive || this.a11yElements.size > 0 || wantsContentSync) && (shouldSyncInterval || !hasActiveAnimation && this.a11yPendingSyncAfterAnimation)) {
6706
6782
  this.lastA11ySync = time;
6707
6783
  if (hasInteractive || wantsContentSync) {
6708
6784
  const userTiming = this.phases.userTiming ? beginVectoUserTiming(VECTO_USER_TIMING.scene.a11ySync) : null;
@@ -6904,7 +6980,7 @@ var Scene = (_class15 = class _Scene {
6904
6980
  let walkHadAnimation = false;
6905
6981
  let walkHadInteractive = false;
6906
6982
  const runUpdate = (node) => {
6907
- const overridesUpdate = node.update !== _chunkXXU56ZNAjs.Entity.prototype.update;
6983
+ const overridesUpdate = node.update !== _chunkXHPUCU5Pjs.Entity.prototype.update;
6908
6984
  let pending = node.hasPendingAnimations();
6909
6985
  if (pending || overridesUpdate) {
6910
6986
  node.update(dt, time);
@@ -6913,7 +6989,7 @@ var Scene = (_class15 = class _Scene {
6913
6989
  if (pending) walkHadAnimation = true;
6914
6990
  if (!walkHadInteractive && node.interactive) walkHadInteractive = true;
6915
6991
  if (this._devActive && this._devFrameCount % 120 === 0) {
6916
- if (overridesUpdate && node.hasPendingAnimations === _chunkXXU56ZNAjs.Entity.prototype.hasPendingAnimations) {
6992
+ if (overridesUpdate && node.hasPendingAnimations === _chunkXHPUCU5Pjs.Entity.prototype.hasPendingAnimations) {
6917
6993
  this._devWarn(
6918
6994
  `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
6995
  );
@@ -7126,7 +7202,7 @@ var Scene = (_class15 = class _Scene {
7126
7202
  * Export the current scene state to a lightweight, flat SVG XML string.
7127
7203
  */
7128
7204
  toSVG() {
7129
- const renderer = new (0, _chunkM73XB4ZKjs.SVGRenderer)(this.width, this.height);
7205
+ const renderer = new (0, _chunkMO24PVGTjs.SVGRenderer)(this.width, this.height);
7130
7206
  this.render(renderer, 0, 0);
7131
7207
  return renderer.toXMLString();
7132
7208
  }
@@ -7339,7 +7415,7 @@ function defaultMeasurer() {
7339
7415
  sharedMeasurer ??= _layout.resolveGlyphMeasurer.call(void 0, "sans-serif");
7340
7416
  return sharedMeasurer;
7341
7417
  }
7342
- var TextEntity = (_class16 = class extends _chunkXXU56ZNAjs.Entity {
7418
+ var TextEntity = (_class16 = class extends _chunkXHPUCU5Pjs.Entity {
7343
7419
 
7344
7420
 
7345
7421
 
@@ -7543,7 +7619,7 @@ var TextEntity = (_class16 = class extends _chunkXXU56ZNAjs.Entity {
7543
7619
  }, _class16);
7544
7620
 
7545
7621
  // src/components/GridTextEntity.ts
7546
- var GridTextEntity = (_class17 = class extends _chunkXXU56ZNAjs.Entity {
7622
+ var GridTextEntity = (_class17 = class extends _chunkXHPUCU5Pjs.Entity {
7547
7623
 
7548
7624
  __init184() {this.fillStyle = "#ffffff"}
7549
7625
  __init185() {this.grid = []}
@@ -7562,7 +7638,7 @@ var GridTextEntity = (_class17 = class extends _chunkXXU56ZNAjs.Entity {
7562
7638
  updateGrid(ascii) {
7563
7639
  this.grid = ascii;
7564
7640
  this.rows = ascii.length;
7565
- this.cols = _optionalChain([ascii, 'access', _187 => _187[0], 'optionalAccess', _188 => _188.length]) || 0;
7641
+ this.cols = ascii.reduce((widest, row) => Math.max(widest, _nullishCoalesce(_optionalChain([row, 'optionalAccess', _187 => _187.length]), () => ( 0))), 0);
7566
7642
  }
7567
7643
  isPointInside(_globalX, _globalY) {
7568
7644
  return false;
@@ -7637,7 +7713,7 @@ function distSqToSegment(px, py, x1, y1, x2, y2) {
7637
7713
  const ey = py - cy;
7638
7714
  return ex * ex + ey * ey;
7639
7715
  }
7640
- var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7716
+ var SplineEntity = (_class18 = class extends _chunkXHPUCU5Pjs.Entity {
7641
7717
 
7642
7718
 
7643
7719
 
@@ -7650,6 +7726,12 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7650
7726
  /** Logical (CSS-pixel) size of the baked bitmap — the blit destination size. */
7651
7727
  __init190() {this.bakedWidth = 0}
7652
7728
  __init191() {this.bakedHeight = 0}
7729
+ /**
7730
+ * Device-pixel ratio the bitmap was rasterized at. Tracked so a DPR change
7731
+ * (browser zoom, a monitor move, a renderer whose clamp changed) re-bakes
7732
+ * instead of blitting a bitmap at the wrong device density forever.
7733
+ */
7734
+ __init192() {this.bakedDPR = 0}
7653
7735
  /**
7654
7736
  * Gradient strokes can't be baked to a solid-color bitmap; they render
7655
7737
  * per-frame. Derived from `_doc`, so it is NOT readonly — assigning a new
@@ -7657,7 +7739,7 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7657
7739
  */
7658
7740
 
7659
7741
  /** Lazily-flattened polylines (one Float32Array of [x,y,...] per segment) for hit-testing. */
7660
- __init192() {this.polylines = null}
7742
+ __init193() {this.polylines = null}
7661
7743
  /**
7662
7744
  * The spline document to render. Assigning a new document invalidates all
7663
7745
  * caches (baked canvas, flattened polylines, bounds).
@@ -7691,9 +7773,9 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7691
7773
  * local bounds after painting the curves. Useful for drag feedback and
7692
7774
  * debugging hit areas. Defaults to `false`.
7693
7775
  */
7694
- __init193() {this.showBounds = false}
7776
+ __init194() {this.showBounds = false}
7695
7777
  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);;
7778
+ 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
7779
  this._doc = doc;
7698
7780
  this._lineWidth = _nullishCoalesce(opts.lineWidth, () => ( 2));
7699
7781
  this.cache = _nullishCoalesce(opts.cache, () => ( true));
@@ -7713,7 +7795,7 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7713
7795
  */
7714
7796
  computeContainsGradient() {
7715
7797
  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)));
7798
+ 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
7799
  }
7718
7800
  /** Clear cached baked canvas and hit-test polylines. */
7719
7801
  invalidateCache() {
@@ -7873,14 +7955,14 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7873
7955
  }
7874
7956
  }
7875
7957
  /** Bake all equations into an OffscreenCanvas once (when available). */
7876
- bake() {
7958
+ bake(dpr) {
7877
7959
  this.baked = true;
7878
7960
  const pad = this.lineWidth + 2;
7879
7961
  const w = Math.max(1, Math.ceil(this.bounds.width) + pad * 2);
7880
7962
  const h = Math.max(1, Math.ceil(this.bounds.height) + pad * 2);
7881
7963
  this.bakedWidth = w;
7882
7964
  this.bakedHeight = h;
7883
- const dpr = typeof window !== "undefined" && typeof window.devicePixelRatio === "number" ? window.devicePixelRatio || 1 : 1;
7965
+ this.bakedDPR = dpr;
7884
7966
  let canvas;
7885
7967
  if (typeof OffscreenCanvas !== "undefined") {
7886
7968
  canvas = new OffscreenCanvas(w * dpr, h * dpr);
@@ -7928,7 +8010,8 @@ var SplineEntity = (_class18 = class extends _chunkXXU56ZNAjs.Entity {
7928
8010
  render(r) {
7929
8011
  let rendered = false;
7930
8012
  if (this.cache && !this.containsGradient) {
7931
- if (!this.baked) this.bake();
8013
+ const dpr = typeof r.pixelRatio === "number" && r.pixelRatio > 0 ? r.pixelRatio : typeof window !== "undefined" && typeof window.devicePixelRatio === "number" ? window.devicePixelRatio || 1 : 1;
8014
+ if (!this.baked || this.bakedDPR !== dpr) this.bake(dpr);
7932
8015
  if (this.offscreen) {
7933
8016
  const pad = this.lineWidth + 2;
7934
8017
  r.drawImage(
@@ -7958,7 +8041,7 @@ async function loadSpline(url) {
7958
8041
  }
7959
8042
 
7960
8043
  // src/components/Rect.ts
7961
- var Rect = class extends _chunkXXU56ZNAjs.Entity {
8044
+ var Rect = class extends _chunkXHPUCU5Pjs.Entity {
7962
8045
 
7963
8046
 
7964
8047
 
@@ -8014,7 +8097,7 @@ var Rect = class extends _chunkXXU56ZNAjs.Entity {
8014
8097
  };
8015
8098
 
8016
8099
  // src/components/Circle.ts
8017
- var Circle = class extends _chunkXXU56ZNAjs.Entity {
8100
+ var Circle = class extends _chunkXHPUCU5Pjs.Entity {
8018
8101
 
8019
8102
 
8020
8103
 
@@ -8078,7 +8161,7 @@ var Circle = class extends _chunkXXU56ZNAjs.Entity {
8078
8161
  };
8079
8162
 
8080
8163
  // src/components/Group.ts
8081
- var Group = class extends _chunkXXU56ZNAjs.Entity {
8164
+ var Group = class extends _chunkXHPUCU5Pjs.Entity {
8082
8165
  constructor(...children) {
8083
8166
  super();
8084
8167
  if (children.length > 0) this.add(...children);
@@ -8097,21 +8180,21 @@ var _math = require('@vectojs/math'); _createStarExport(_math);
8097
8180
 
8098
8181
 
8099
8182
  // src/tree/DOMPortalEntity.ts
8100
- var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8183
+ var DOMPortalEntity = (_class19 = class extends _chunkXHPUCU5Pjs.Entity {
8101
8184
 
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 = ""}
8185
+ __init195() {this.isDOMPortal = true}
8186
+ __init196() {this.domListeners = []}
8187
+ __init197() {this.resizeObserver = null}
8188
+ __init198() {this.domBound = false}
8189
+ __init199() {this.cachedWidth = 100}
8190
+ __init200() {this.cachedHeight = 100}
8191
+ __init201() {this.lastWidth = ""}
8192
+ __init202() {this.lastHeight = ""}
8193
+ __init203() {this.lastTransform = ""}
8194
+ __init204() {this.lastZIndex = ""}
8195
+ __init205() {this.lastOpacity = ""}
8113
8196
  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);;
8197
+ 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
8198
  this.domElement = domElement;
8116
8199
  this.width = _nullishCoalesce(width, () => ( 0));
8117
8200
  this.height = _nullishCoalesce(height, () => ( 0));
@@ -8153,7 +8236,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8153
8236
  ];
8154
8237
  for (const type of events) {
8155
8238
  const handler = (e) => {
8156
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(type, this, e));
8239
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(type, this, e));
8157
8240
  };
8158
8241
  this.domElement.addEventListener(type, handler);
8159
8242
  this.domListeners.push({ type, handler, capture: false });
@@ -8164,7 +8247,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8164
8247
  ];
8165
8248
  for (const { native, vecto } of hoverEvents) {
8166
8249
  const handler = (e) => {
8167
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(vecto, this, e, false));
8250
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(vecto, this, e, false));
8168
8251
  };
8169
8252
  this.domElement.addEventListener(native, handler);
8170
8253
  this.domListeners.push({ type: native, handler, capture: false });
@@ -8172,7 +8255,7 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8172
8255
  const focusEvents = ["focus", "blur"];
8173
8256
  for (const type of focusEvents) {
8174
8257
  const handler = (e) => {
8175
- this.dispatchEvent(new (0, _chunkXXU56ZNAjs.VectoJSEvent)(type, this, e, true));
8258
+ this.dispatchEvent(new (0, _chunkXHPUCU5Pjs.VectoJSEvent)(type, this, e, true));
8176
8259
  };
8177
8260
  this.domElement.addEventListener(type, handler, true);
8178
8261
  this.domListeners.push({ type, handler, capture: true });
@@ -8223,8 +8306,8 @@ var DOMPortalEntity = (_class19 = class extends _chunkXXU56ZNAjs.Entity {
8223
8306
  }, _class19);
8224
8307
 
8225
8308
  // src/index.ts
8226
- Scene.registerWebGLPointRendererCreator(_chunkM73XB4ZKjs.createWebGLPointRenderer);
8227
- Scene.registerWebGPUParticleSystemManager(_chunkM73XB4ZKjs.WebGPUParticleSystemManager);
8309
+ Scene.registerWebGLPointRendererCreator(_chunkMO24PVGTjs.createWebGLPointRenderer);
8310
+ Scene.registerWebGPUParticleSystemManager(_chunkMO24PVGTjs.WebGPUParticleSystemManager);
8228
8311
 
8229
8312
 
8230
8313
 
@@ -8270,4 +8353,4 @@ Scene.registerWebGPUParticleSystemManager(_chunkM73XB4ZKjs.WebGPUParticleSystemM
8270
8353
 
8271
8354
 
8272
8355
 
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;
8356
+ 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;