@vectojs/core 0.2.4 → 0.2.6

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
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkIKLYTHALjs = require('./chunk-IKLYTHAL.js');
6
+ var _chunkBWLNEJJWjs = require('./chunk-BWLNEJJW.js');
7
7
 
8
8
 
9
9
 
@@ -12,7 +12,7 @@ var _chunkIKLYTHALjs = require('./chunk-IKLYTHAL.js');
12
12
 
13
13
 
14
14
 
15
- var _chunkTPNADFNNjs = require('./chunk-TPNADFNN.js');
15
+ var _chunkGADBN53Zjs = require('./chunk-GADBN53Z.js');
16
16
 
17
17
 
18
18
 
@@ -24,12 +24,12 @@ var _chunkTPNADFNNjs = require('./chunk-TPNADFNN.js');
24
24
 
25
25
 
26
26
 
27
- var _chunkTQ4H357Qjs = require('./chunk-TQ4H357Q.js');
27
+ var _chunk4BO5XBJLjs = require('./chunk-4BO5XBJL.js');
28
28
 
29
29
 
30
30
 
31
31
 
32
- var _chunk76NMTLYLjs = require('./chunk-76NMTLYL.js');
32
+ var _chunkCTZQOM5Zjs = require('./chunk-CTZQOM5Z.js');
33
33
 
34
34
  // src/tree/ComputeParticleEntity.ts
35
35
  var PARTICLE_STRIDE_FLOATS = 8;
@@ -41,7 +41,7 @@ var PARTICLE_OFFSET_ORIGIN_X = 4;
41
41
  var PARTICLE_OFFSET_ORIGIN_Y = 5;
42
42
  var PARTICLE_OFFSET_SIZE = 6;
43
43
  var PARTICLE_OFFSET_LIFE = 7;
44
- var ComputeParticleEntity = (_class = class extends _chunkTQ4H357Qjs.Entity {
44
+ var ComputeParticleEntity = (_class = class extends _chunk4BO5XBJLjs.Entity {
45
45
 
46
46
 
47
47
 
@@ -386,12 +386,14 @@ var Scene = (_class2 = class _Scene {
386
386
  __init40() {this.initializingWebGPU = false}
387
387
  __init41() {this.gpuCanvas = null}
388
388
  __init42() {this.gpuContext = null}
389
- __init43() {this.mouseX = -9999}
390
- __init44() {this.mouseY = -9999}
391
- __init45() {this.pointerMoveListener = null}
392
- __init46() {this.pointerLeaveListener = null}
393
- __init47() {this.hasWarnedZeroSize = false}
394
- constructor(canvas, options = {}) {;_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);_class2.prototype.__init11.call(this);_class2.prototype.__init12.call(this);_class2.prototype.__init13.call(this);_class2.prototype.__init14.call(this);_class2.prototype.__init15.call(this);_class2.prototype.__init16.call(this);_class2.prototype.__init17.call(this);_class2.prototype.__init18.call(this);_class2.prototype.__init19.call(this);_class2.prototype.__init20.call(this);_class2.prototype.__init21.call(this);_class2.prototype.__init22.call(this);_class2.prototype.__init23.call(this);_class2.prototype.__init24.call(this);_class2.prototype.__init25.call(this);_class2.prototype.__init26.call(this);_class2.prototype.__init27.call(this);_class2.prototype.__init28.call(this);_class2.prototype.__init29.call(this);_class2.prototype.__init30.call(this);_class2.prototype.__init31.call(this);_class2.prototype.__init32.call(this);_class2.prototype.__init33.call(this);_class2.prototype.__init34.call(this);_class2.prototype.__init35.call(this);_class2.prototype.__init36.call(this);_class2.prototype.__init37.call(this);_class2.prototype.__init38.call(this);_class2.prototype.__init39.call(this);_class2.prototype.__init40.call(this);_class2.prototype.__init41.call(this);_class2.prototype.__init42.call(this);_class2.prototype.__init43.call(this);_class2.prototype.__init44.call(this);_class2.prototype.__init45.call(this);_class2.prototype.__init46.call(this);_class2.prototype.__init47.call(this);
389
+ /** True while the GPU canvas holds a presented particle frame (needs clearing when they leave). */
390
+ __init43() {this.gpuHasContent = false}
391
+ __init44() {this.mouseX = -9999}
392
+ __init45() {this.mouseY = -9999}
393
+ __init46() {this.pointerMoveListener = null}
394
+ __init47() {this.pointerLeaveListener = null}
395
+ __init48() {this.hasWarnedZeroSize = false}
396
+ constructor(canvas, options = {}) {;_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);_class2.prototype.__init11.call(this);_class2.prototype.__init12.call(this);_class2.prototype.__init13.call(this);_class2.prototype.__init14.call(this);_class2.prototype.__init15.call(this);_class2.prototype.__init16.call(this);_class2.prototype.__init17.call(this);_class2.prototype.__init18.call(this);_class2.prototype.__init19.call(this);_class2.prototype.__init20.call(this);_class2.prototype.__init21.call(this);_class2.prototype.__init22.call(this);_class2.prototype.__init23.call(this);_class2.prototype.__init24.call(this);_class2.prototype.__init25.call(this);_class2.prototype.__init26.call(this);_class2.prototype.__init27.call(this);_class2.prototype.__init28.call(this);_class2.prototype.__init29.call(this);_class2.prototype.__init30.call(this);_class2.prototype.__init31.call(this);_class2.prototype.__init32.call(this);_class2.prototype.__init33.call(this);_class2.prototype.__init34.call(this);_class2.prototype.__init35.call(this);_class2.prototype.__init36.call(this);_class2.prototype.__init37.call(this);_class2.prototype.__init38.call(this);_class2.prototype.__init39.call(this);_class2.prototype.__init40.call(this);_class2.prototype.__init41.call(this);_class2.prototype.__init42.call(this);_class2.prototype.__init43.call(this);_class2.prototype.__init44.call(this);_class2.prototype.__init45.call(this);_class2.prototype.__init46.call(this);_class2.prototype.__init47.call(this);_class2.prototype.__init48.call(this);
395
397
  this.canvas = canvas;
396
398
  this.debugA11y = _nullishCoalesce(options.debugA11y, () => ( false));
397
399
  this.disableWindowResize = _nullishCoalesce(options.disableWindowResize, () => ( false));
@@ -410,7 +412,7 @@ var Scene = (_class2 = class _Scene {
410
412
  this.particleBackend = _nullishCoalesce(options.particleBackend, () => ( "auto"));
411
413
  this.a11ySyncInterval = _nullishCoalesce(options.a11ySyncInterval, () => ( 0));
412
414
  this.reducedMotionQuery = typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia("(prefers-reduced-motion: reduce)") : null;
413
- this.root = new class RootEntity extends _chunkTQ4H357Qjs.Entity {
415
+ this.root = new class RootEntity extends _chunk4BO5XBJLjs.Entity {
414
416
  isPointInside() {
415
417
  return false;
416
418
  }
@@ -419,7 +421,7 @@ var Scene = (_class2 = class _Scene {
419
421
  }
420
422
  }("root");
421
423
  this.root._scene = this;
422
- this.overlayRoot = new class OverlayRoot extends _chunkTQ4H357Qjs.Entity {
424
+ this.overlayRoot = new class OverlayRoot extends _chunk4BO5XBJLjs.Entity {
423
425
  isPointInside() {
424
426
  return false;
425
427
  }
@@ -430,7 +432,10 @@ var Scene = (_class2 = class _Scene {
430
432
  if (options.renderer) {
431
433
  this.renderer = options.renderer;
432
434
  } else {
433
- this.renderer = new (0, _chunkTPNADFNNjs.CanvasRenderer)(canvas);
435
+ this.renderer = new (0, _chunkGADBN53Zjs.CanvasRenderer)(
436
+ canvas,
437
+ this.disableWindowResize ? { width: this.width, height: this.height } : void 0
438
+ );
434
439
  }
435
440
  if (typeof document !== "undefined") {
436
441
  this.a11yRoot = document.createElement("div");
@@ -619,6 +624,10 @@ var Scene = (_class2 = class _Scene {
619
624
  this.manager.destroy();
620
625
  this.manager = null;
621
626
  }
627
+ if (this.device) {
628
+ _optionalChain([this, 'access', _40 => _40.device, 'access', _41 => _41.destroy, 'optionalCall', _42 => _42()]);
629
+ this.device = null;
630
+ }
622
631
  }
623
632
  setupEvents() {
624
633
  if (typeof window !== "undefined" && !this.disableWindowResize) {
@@ -760,42 +769,42 @@ var Scene = (_class2 = class _Scene {
760
769
  el.style.background = "transparent";
761
770
  }
762
771
  el.addEventListener("click", (e) => {
763
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("click", node, e));
772
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("click", node, e));
764
773
  });
765
774
  el.addEventListener("mouseenter", (e) => {
766
775
  if (this.debugA11y) el.style.backgroundColor = "rgba(56, 189, 248, 0.2)";
767
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("hover", node, e, false));
776
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("hover", node, e, false));
768
777
  });
769
778
  el.addEventListener("mouseleave", (e) => {
770
779
  if (this.debugA11y) el.style.backgroundColor = "rgba(56, 189, 248, 0.05)";
771
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("pointerleave", node, e, false));
780
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("pointerleave", node, e, false));
772
781
  });
773
782
  const capEl = el;
774
783
  el.addEventListener("pointerdown", (e) => {
775
784
  if (typeof capEl.setPointerCapture === "function") capEl.setPointerCapture(e.pointerId);
776
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("pointerdown", node, e));
785
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("pointerdown", node, e));
777
786
  });
778
787
  el.addEventListener("pointerup", (e) => {
779
788
  if (typeof capEl.releasePointerCapture === "function")
780
789
  capEl.releasePointerCapture(e.pointerId);
781
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("pointerup", node, e));
790
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("pointerup", node, e));
782
791
  });
783
792
  el.addEventListener(
784
793
  "pointermove",
785
- (e) => node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("pointermove", node, e))
794
+ (e) => node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("pointermove", node, e))
786
795
  );
787
796
  el.addEventListener(
788
797
  "wheel",
789
798
  (e) => {
790
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("wheel", node, e));
799
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("wheel", node, e));
791
800
  },
792
801
  { passive: false }
793
802
  );
794
803
  el.addEventListener("keydown", (e) => {
795
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("keydown", node, e));
804
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("keydown", node, e));
796
805
  });
797
806
  el.addEventListener("keyup", (e) => {
798
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("keyup", node, e));
807
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("keyup", node, e));
799
808
  });
800
809
  if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
801
810
  const input = el;
@@ -822,7 +831,7 @@ var Scene = (_class2 = class _Scene {
822
831
  });
823
832
  el.addEventListener("compositionupdate", (e) => {
824
833
  const data = _nullishCoalesce(e.data, () => ( ""));
825
- composition = { start: _nullishCoalesce(_optionalChain([composition, 'optionalAccess', _40 => _40.start]), () => ( 0)), length: data.length };
834
+ composition = { start: _nullishCoalesce(_optionalChain([composition, 'optionalAccess', _43 => _43.start]), () => ( 0)), length: data.length };
826
835
  forward();
827
836
  });
828
837
  el.addEventListener("compositionend", () => {
@@ -868,7 +877,7 @@ var Scene = (_class2 = class _Scene {
868
877
  el.addEventListener("keydown", (e) => {
869
878
  if (e.key === "Enter" || e.key === " ") {
870
879
  e.preventDefault();
871
- node.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)("click", node, e));
880
+ node.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)("click", node, e));
872
881
  }
873
882
  });
874
883
  }
@@ -893,7 +902,7 @@ var Scene = (_class2 = class _Scene {
893
902
  if (el.placeholder !== attrs.placeholder) el.placeholder = attrs.placeholder;
894
903
  }
895
904
  if (attrs.href !== void 0 && el instanceof HTMLAnchorElement) {
896
- const safeHref = _chunkTPNADFNNjs.sanitizeUrl.call(void 0, attrs.href);
905
+ const safeHref = _chunkGADBN53Zjs.sanitizeUrl.call(void 0, attrs.href);
897
906
  if (el.getAttribute("href") !== safeHref) el.setAttribute("href", safeHref);
898
907
  }
899
908
  if (el instanceof HTMLImageElement) {
@@ -1026,12 +1035,12 @@ var Scene = (_class2 = class _Scene {
1026
1035
  syncOverlayGeometry() {
1027
1036
  const parent = this.canvas.parentElement;
1028
1037
  if (!parent) return;
1029
- const canvasRect = _optionalChain([this, 'access', _41 => _41.canvas, 'access', _42 => _42.getBoundingClientRect, 'optionalCall', _43 => _43()]);
1030
- const parentRect = _optionalChain([parent, 'access', _44 => _44.getBoundingClientRect, 'optionalCall', _45 => _45()]);
1031
- const cssWidth = _optionalChain([canvasRect, 'optionalAccess', _46 => _46.width]) || this.canvas.clientWidth || this.width;
1032
- const cssHeight = _optionalChain([canvasRect, 'optionalAccess', _47 => _47.height]) || this.canvas.clientHeight || this.height;
1033
- const left = (_nullishCoalesce(_optionalChain([canvasRect, 'optionalAccess', _48 => _48.left]), () => ( 0))) - (_nullishCoalesce(_optionalChain([parentRect, 'optionalAccess', _49 => _49.left]), () => ( 0))) - (parent.clientLeft || 0) + parent.scrollLeft;
1034
- const top = (_nullishCoalesce(_optionalChain([canvasRect, 'optionalAccess', _50 => _50.top]), () => ( 0))) - (_nullishCoalesce(_optionalChain([parentRect, 'optionalAccess', _51 => _51.top]), () => ( 0))) - (parent.clientTop || 0) + parent.scrollTop;
1038
+ const canvasRect = _optionalChain([this, 'access', _44 => _44.canvas, 'access', _45 => _45.getBoundingClientRect, 'optionalCall', _46 => _46()]);
1039
+ const parentRect = _optionalChain([parent, 'access', _47 => _47.getBoundingClientRect, 'optionalCall', _48 => _48()]);
1040
+ const cssWidth = _optionalChain([canvasRect, 'optionalAccess', _49 => _49.width]) || this.canvas.clientWidth || this.width;
1041
+ const cssHeight = _optionalChain([canvasRect, 'optionalAccess', _50 => _50.height]) || this.canvas.clientHeight || this.height;
1042
+ const left = (_nullishCoalesce(_optionalChain([canvasRect, 'optionalAccess', _51 => _51.left]), () => ( 0))) - (_nullishCoalesce(_optionalChain([parentRect, 'optionalAccess', _52 => _52.left]), () => ( 0))) - (parent.clientLeft || 0) + parent.scrollLeft;
1043
+ const top = (_nullishCoalesce(_optionalChain([canvasRect, 'optionalAccess', _53 => _53.top]), () => ( 0))) - (_nullishCoalesce(_optionalChain([parentRect, 'optionalAccess', _54 => _54.top]), () => ( 0))) - (parent.clientTop || 0) + parent.scrollTop;
1035
1044
  const scaleX = this.width > 0 ? cssWidth / this.width : 1;
1036
1045
  const scaleY = this.height > 0 ? cssHeight / this.height : 1;
1037
1046
  for (const root of [this.a11yRoot, this.portalRoot]) {
@@ -1156,7 +1165,7 @@ var Scene = (_class2 = class _Scene {
1156
1165
  * (and {@link respectReducedMotion} is on). `0` means uncapped.
1157
1166
  */
1158
1167
  effectiveMaxFPS() {
1159
- const reduced = this.respectReducedMotion && !!_optionalChain([this, 'access', _52 => _52.reducedMotionQuery, 'optionalAccess', _53 => _53.matches]);
1168
+ const reduced = this.respectReducedMotion && !!_optionalChain([this, 'access', _55 => _55.reducedMotionQuery, 'optionalAccess', _56 => _56.matches]);
1160
1169
  if (reduced)
1161
1170
  return this.maxFPS > 0 ? Math.min(this.maxFPS, REDUCED_MOTION_FPS) : REDUCED_MOTION_FPS;
1162
1171
  return this.maxFPS;
@@ -1164,8 +1173,8 @@ var Scene = (_class2 = class _Scene {
1164
1173
  loop(time) {
1165
1174
  if (!this.isRunning) return;
1166
1175
  let cap = this.effectiveMaxFPS();
1167
- const isStatic = this.autoThrottle && !this.dirty && !this.hasAnyPendingAnimation(this.root) && !this.hasAnyPendingAnimation(this.overlayRoot);
1168
- if (isStatic && this.renderMode === "always" && this.maxFPS > 0) {
1176
+ const isIdle = !this.dirty && !this.hasAnyPendingAnimation(this.root) && !this.hasAnyPendingAnimation(this.overlayRoot);
1177
+ if (isIdle && this.autoThrottle && this.renderMode === "always" && this.maxFPS > 0) {
1169
1178
  cap = Math.min(cap, 2);
1170
1179
  }
1171
1180
  if (cap > 0 && time - this.lastTime < 1e3 / cap - 1) {
@@ -1174,10 +1183,11 @@ var Scene = (_class2 = class _Scene {
1174
1183
  }
1175
1184
  const dt = time - this.lastTime;
1176
1185
  this.lastTime = time;
1177
- if (this.renderMode === "onDemand" && isStatic) {
1186
+ if (this.renderMode === "onDemand" && isIdle) {
1178
1187
  this.scheduleFrame();
1179
1188
  return;
1180
1189
  }
1190
+ this.dirty = false;
1181
1191
  this.render(this.renderer, dt, time);
1182
1192
  const hasActiveAnimation = this.hasAnyPendingAnimation(this.root) || this.hasAnyPendingAnimation(this.overlayRoot);
1183
1193
  const hasInteractive = this.hasAnyInteractive(this.root) || this.hasAnyInteractive(this.overlayRoot);
@@ -1192,7 +1202,6 @@ var Scene = (_class2 = class _Scene {
1192
1202
  } else if (hasActiveAnimation) {
1193
1203
  this.a11yPendingSyncAfterAnimation = true;
1194
1204
  }
1195
- this.dirty = false;
1196
1205
  this.scheduleFrame();
1197
1206
  }
1198
1207
  /**
@@ -1304,6 +1313,7 @@ var Scene = (_class2 = class _Scene {
1304
1313
  renderPass.end();
1305
1314
  }
1306
1315
  this.device.queue.submit([commandEncoder.finish()]);
1316
+ if (this.gpuContext) this.gpuHasContent = true;
1307
1317
  } catch (e) {
1308
1318
  console.error("WebGPU frame execution failed. Falling back.", e);
1309
1319
  this.deviceLost = true;
@@ -1312,13 +1322,27 @@ var Scene = (_class2 = class _Scene {
1312
1322
  }
1313
1323
  } else if (isMainRenderPath) {
1314
1324
  for (const entity of computeEntities) {
1315
- entity.updateCPU(dt / 1e3, this.mouseX, this.mouseY, this.width, this.height);
1325
+ let mx = this.mouseX;
1326
+ let my = this.mouseY;
1327
+ if (mx > -9e3 && my > -9e3) {
1328
+ const local = entity.worldToLocal(mx, my);
1329
+ if (local) {
1330
+ mx = local.x;
1331
+ my = local.y;
1332
+ } else {
1333
+ mx = -9999;
1334
+ my = -9999;
1335
+ }
1336
+ }
1337
+ entity.updateCPU(dt / 1e3, mx, my, this.width, this.height);
1316
1338
  }
1317
1339
  }
1340
+ } else if (isMainRenderer) {
1341
+ this.clearGPUCanvasIfStale();
1318
1342
  }
1319
1343
  renderer.clear();
1320
1344
  if (isMainRenderer) {
1321
- _optionalChain([this, 'access', _54 => _54.pointRenderer, 'optionalAccess', _55 => _55.begin, 'call', _56 => _56()]);
1345
+ _optionalChain([this, 'access', _57 => _57.pointRenderer, 'optionalAccess', _58 => _58.begin, 'call', _59 => _59()]);
1322
1346
  }
1323
1347
  const vw = this.width;
1324
1348
  const vh = this.height;
@@ -1412,7 +1436,19 @@ var Scene = (_class2 = class _Scene {
1412
1436
  if (visible) {
1413
1437
  if (node instanceof ComputeParticleEntity) {
1414
1438
  if (this.deviceLost || this.webgpuDisabled || !this.device || !this.manager) {
1415
- this.renderCPUParticles(renderer, node, worldOpacity);
1439
+ this.renderCPUParticles(
1440
+ renderer,
1441
+ node,
1442
+ worldOpacity,
1443
+ a,
1444
+ b,
1445
+ c,
1446
+ d,
1447
+ te,
1448
+ tf,
1449
+ worldScaleX,
1450
+ isSimilarityTransform
1451
+ );
1416
1452
  }
1417
1453
  } else {
1418
1454
  node.render(renderer);
@@ -1434,14 +1470,15 @@ var Scene = (_class2 = class _Scene {
1434
1470
  if (isMainRenderer) this.reconcilePortals();
1435
1471
  renderer.flush();
1436
1472
  if (isMainRenderer) {
1437
- _optionalChain([this, 'access', _57 => _57.pointRenderer, 'optionalAccess', _58 => _58.flush, 'call', _59 => _59()]);
1473
+ _optionalChain([this, 'access', _60 => _60.pointRenderer, 'optionalAccess', _61 => _61.flush, 'call', _62 => _62()]);
1438
1474
  }
1475
+ _optionalChain([renderer, 'access', _63 => _63.present, 'optionalCall', _64 => _64()]);
1439
1476
  }
1440
1477
  /**
1441
1478
  * Export the current scene state to a lightweight, flat SVG XML string.
1442
1479
  */
1443
1480
  toSVG() {
1444
- const renderer = new (0, _chunkTPNADFNNjs.SVGRenderer)(this.width, this.height);
1481
+ const renderer = new (0, _chunkGADBN53Zjs.SVGRenderer)(this.width, this.height);
1445
1482
  this.render(renderer, 0, 0);
1446
1483
  return renderer.toXMLString();
1447
1484
  }
@@ -1454,7 +1491,11 @@ var Scene = (_class2 = class _Scene {
1454
1491
  if (typeof this.renderer.resize === "function") {
1455
1492
  this.renderer.resize(width, height);
1456
1493
  }
1457
- _optionalChain([this, 'access', _60 => _60.pointRenderer, 'optionalAccess', _61 => _61.resize, 'call', _62 => _62(width, height)]);
1494
+ _optionalChain([this, 'access', _65 => _65.pointRenderer, 'optionalAccess', _66 => _66.resize, 'call', _67 => _67(width, height)]);
1495
+ if (this.gpuCanvas) {
1496
+ this.gpuCanvas.width = width;
1497
+ this.gpuCanvas.height = height;
1498
+ }
1458
1499
  this.markDirty();
1459
1500
  }
1460
1501
  /**
@@ -1477,6 +1518,27 @@ var Scene = (_class2 = class _Scene {
1477
1518
  if (overlayHit) return overlayHit;
1478
1519
  return this.findHitRecursively(this.root, x, y);
1479
1520
  }
1521
+ /** Submit one transparent clear pass when particle content lingers on the GPU canvas. */
1522
+ clearGPUCanvasIfStale() {
1523
+ if (!this.gpuHasContent || !this.device || !this.gpuContext || this.deviceLost) return;
1524
+ try {
1525
+ const encoder = this.device.createCommandEncoder();
1526
+ const pass = encoder.beginRenderPass({
1527
+ colorAttachments: [
1528
+ {
1529
+ view: this.gpuContext.getCurrentTexture().createView(),
1530
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
1531
+ loadOp: "clear",
1532
+ storeOp: "store"
1533
+ }
1534
+ ]
1535
+ });
1536
+ pass.end();
1537
+ this.device.queue.submit([encoder.finish()]);
1538
+ } catch (e2) {
1539
+ }
1540
+ this.gpuHasContent = false;
1541
+ }
1480
1542
  async initWebGPUContext(entities) {
1481
1543
  if (!navigator.gpu) {
1482
1544
  throw new Error("WebGPU not supported on this platform.");
@@ -1569,10 +1631,10 @@ var Scene = (_class2 = class _Scene {
1569
1631
  }).catch(() => this.recreateWebGPUDeviceWithRetry(entities, attempt + 1));
1570
1632
  }, backoff);
1571
1633
  }
1572
- renderCPUParticles(renderer, entity, worldOpacity) {
1634
+ renderCPUParticles(renderer, entity, worldOpacity, a, b, c, d, e, f, worldScale, isSimilarityTransform) {
1573
1635
  const data = entity.particleData;
1574
1636
  const size = entity.maxParticles;
1575
- const isMain = renderer === this.renderer;
1637
+ const useGL = renderer === this.renderer && !!this.pointRenderer && isSimilarityTransform;
1576
1638
  for (let i = 0; i < size; i++) {
1577
1639
  const idx = i * 8;
1578
1640
  const x = data[idx];
@@ -1582,8 +1644,14 @@ var Scene = (_class2 = class _Scene {
1582
1644
  if (life === 0) continue;
1583
1645
  const opacity = life < 0 ? worldOpacity : worldOpacity * Math.min(1, life);
1584
1646
  const scale = life >= 0 ? Math.min(1, life) : 1;
1585
- if (isMain && this.pointRenderer) {
1586
- this.pointRenderer.addCircle(x, y, pSize * scale, entity.baseColor, opacity);
1647
+ if (useGL) {
1648
+ this.pointRenderer.addCircle(
1649
+ a * x + c * y + e,
1650
+ b * x + d * y + f,
1651
+ pSize * scale * worldScale,
1652
+ entity.baseColor,
1653
+ opacity
1654
+ );
1587
1655
  } else {
1588
1656
  renderer.fillCircle(x, y, pSize * scale, entity.baseColor, opacity);
1589
1657
  }
@@ -1604,27 +1672,27 @@ var Scene = (_class2 = class _Scene {
1604
1672
  // src/components/TextEntity.ts
1605
1673
  var sharedMeasurer;
1606
1674
  function defaultMeasurer() {
1607
- if (sharedMeasurer === void 0) sharedMeasurer = _chunkIKLYTHALjs.createCanvasMeasurer.call(void 0, "sans-serif");
1675
+ if (sharedMeasurer === void 0) sharedMeasurer = _chunkBWLNEJJWjs.createCanvasMeasurer.call(void 0, "sans-serif");
1608
1676
  return sharedMeasurer;
1609
1677
  }
1610
- var TextEntity = (_class3 = class extends _chunkTQ4H357Qjs.Entity {
1678
+ var TextEntity = (_class3 = class extends _chunk4BO5XBJLjs.Entity {
1611
1679
 
1612
1680
 
1613
1681
 
1614
1682
 
1615
- __init48() {this.nodes = []}
1683
+ __init49() {this.nodes = []}
1616
1684
 
1617
- __init49() {this.fillStyle = "#94a3b8"}
1618
- __init50() {this.strokeStyle = null}
1619
- __init51() {this.hoveredFillStyle = "#ffffff"}
1620
- __init52() {this.lineWidth = 1}
1621
- __init53() {this.isHovered = false}
1685
+ __init50() {this.fillStyle = "#94a3b8"}
1686
+ __init51() {this.strokeStyle = null}
1687
+ __init52() {this.hoveredFillStyle = "#ffffff"}
1688
+ __init53() {this.lineWidth = 1}
1689
+ __init54() {this.isHovered = false}
1622
1690
  constructor(text, atlas, maxWidth, fontSize = 24) {
1623
- super();_class3.prototype.__init48.call(this);_class3.prototype.__init49.call(this);_class3.prototype.__init50.call(this);_class3.prototype.__init51.call(this);_class3.prototype.__init52.call(this);_class3.prototype.__init53.call(this);;
1691
+ super();_class3.prototype.__init49.call(this);_class3.prototype.__init50.call(this);_class3.prototype.__init51.call(this);_class3.prototype.__init52.call(this);_class3.prototype.__init53.call(this);_class3.prototype.__init54.call(this);;
1624
1692
  this.text = text;
1625
1693
  this.atlas = atlas;
1626
1694
  this.fontSize = fontSize;
1627
- this.layout = new (0, _chunkIKLYTHALjs.LayoutEngine)(maxWidth, 1e4, defaultMeasurer());
1695
+ this.layout = new (0, _chunkBWLNEJJWjs.LayoutEngine)(maxWidth, 1e4, defaultMeasurer());
1628
1696
  this.prepared = this.layout.prepare(this.text, this.atlas, this.fontSize);
1629
1697
  this.applyLayout();
1630
1698
  this.interactive = true;
@@ -1705,17 +1773,17 @@ var TextEntity = (_class3 = class extends _chunkTQ4H357Qjs.Entity {
1705
1773
  }, _class3);
1706
1774
 
1707
1775
  // src/components/GridTextEntity.ts
1708
- var GridTextEntity = (_class4 = class extends _chunkTQ4H357Qjs.Entity {
1776
+ var GridTextEntity = (_class4 = class extends _chunk4BO5XBJLjs.Entity {
1709
1777
 
1710
- __init54() {this.fillStyle = "#ffffff"}
1711
- __init55() {this.grid = []}
1778
+ __init55() {this.fillStyle = "#ffffff"}
1779
+ __init56() {this.grid = []}
1712
1780
  // Array of rows
1713
- __init56() {this.cols = 0}
1714
- __init57() {this.rows = 0}
1781
+ __init57() {this.cols = 0}
1782
+ __init58() {this.rows = 0}
1715
1783
 
1716
1784
 
1717
1785
  constructor(_atlas, fontSize = 10) {
1718
- super();_class4.prototype.__init54.call(this);_class4.prototype.__init55.call(this);_class4.prototype.__init56.call(this);_class4.prototype.__init57.call(this);;
1786
+ super();_class4.prototype.__init55.call(this);_class4.prototype.__init56.call(this);_class4.prototype.__init57.call(this);_class4.prototype.__init58.call(this);;
1719
1787
  this.fontSize = fontSize;
1720
1788
  this.charWidth = fontSize * 1;
1721
1789
  this.charHeight = fontSize * 1.1;
@@ -1724,7 +1792,7 @@ var GridTextEntity = (_class4 = class extends _chunkTQ4H357Qjs.Entity {
1724
1792
  updateGrid(ascii) {
1725
1793
  this.grid = ascii;
1726
1794
  this.rows = ascii.length;
1727
- this.cols = _optionalChain([ascii, 'access', _63 => _63[0], 'optionalAccess', _64 => _64.length]) || 0;
1795
+ this.cols = _optionalChain([ascii, 'access', _68 => _68[0], 'optionalAccess', _69 => _69.length]) || 0;
1728
1796
  }
1729
1797
  isPointInside(_globalX, _globalY) {
1730
1798
  return false;
@@ -1799,26 +1867,31 @@ function distSqToSegment(px, py, x1, y1, x2, y2) {
1799
1867
  const ey = py - cy;
1800
1868
  return ex * ex + ey * ey;
1801
1869
  }
1802
- var SplineEntity = (_class5 = class extends _chunkTQ4H357Qjs.Entity {
1870
+ var SplineEntity = (_class5 = class extends _chunk4BO5XBJLjs.Entity {
1871
+
1803
1872
 
1804
1873
 
1805
1874
 
1806
1875
 
1807
1876
 
1808
1877
 
1878
+ __init59() {this.offscreen = null}
1879
+ __init60() {this.baked = false}
1880
+ /** Logical (CSS-pixel) size of the baked bitmap — the blit destination size. */
1881
+ __init61() {this.bakedWidth = 0}
1882
+ __init62() {this.bakedHeight = 0}
1883
+ /** Gradient strokes can't be baked to a solid-color bitmap; they render per-frame. */
1809
1884
 
1810
- __init58() {this.offscreen = null}
1811
- __init59() {this.baked = false}
1812
1885
  /** Lazily-flattened polylines (one Float32Array of [x,y,...] per segment) for hit-testing. */
1813
- __init60() {this.polylines = null}
1886
+ __init63() {this.polylines = null}
1814
1887
  /**
1815
1888
  * When `true`, the renderer draws a rounded-rect outline of the entity's
1816
1889
  * local bounds after painting the curves. Useful for drag feedback and
1817
1890
  * debugging hit areas. Defaults to `false`.
1818
1891
  */
1819
- __init61() {this.showBounds = false}
1892
+ __init64() {this.showBounds = false}
1820
1893
  constructor(doc, opts = {}) {
1821
- super();_class5.prototype.__init58.call(this);_class5.prototype.__init59.call(this);_class5.prototype.__init60.call(this);_class5.prototype.__init61.call(this);;
1894
+ super();_class5.prototype.__init59.call(this);_class5.prototype.__init60.call(this);_class5.prototype.__init61.call(this);_class5.prototype.__init62.call(this);_class5.prototype.__init63.call(this);_class5.prototype.__init64.call(this);;
1822
1895
  this.doc = doc;
1823
1896
  this.lineWidth = _nullishCoalesce(opts.lineWidth, () => ( 2));
1824
1897
  this.cache = _nullishCoalesce(opts.cache, () => ( true));
@@ -1828,6 +1901,8 @@ var SplineEntity = (_class5 = class extends _chunkTQ4H357Qjs.Entity {
1828
1901
  this.bounds = this.computeBounds();
1829
1902
  this.width = this.bounds.width;
1830
1903
  this.height = this.bounds.height;
1904
+ const isGradient = (c) => c !== null && !Array.isArray(c);
1905
+ this.containsGradient = (_nullishCoalesce(_optionalChain([this, 'access', _70 => _70.doc, 'access', _71 => _71.equations, 'optionalAccess', _72 => _72.some, 'call', _73 => _73((eq) => isGradient(eq.color_rgb))]), () => ( false))) || (_nullishCoalesce(_optionalChain([this, 'access', _74 => _74.doc, 'access', _75 => _75.paths, 'optionalAccess', _76 => _76.some, 'call', _77 => _77((p) => isGradient(p.color_rgb))]), () => ( false)));
1831
1906
  this.interactive = true;
1832
1907
  }
1833
1908
  computeBounds() {
@@ -1987,18 +2062,22 @@ var SplineEntity = (_class5 = class extends _chunkTQ4H357Qjs.Entity {
1987
2062
  const pad = this.lineWidth + 2;
1988
2063
  const w = Math.max(1, Math.ceil(this.bounds.width) + pad * 2);
1989
2064
  const h = Math.max(1, Math.ceil(this.bounds.height) + pad * 2);
2065
+ this.bakedWidth = w;
2066
+ this.bakedHeight = h;
2067
+ const dpr = typeof window !== "undefined" && typeof window.devicePixelRatio === "number" ? window.devicePixelRatio || 1 : 1;
1990
2068
  let canvas;
1991
2069
  if (typeof OffscreenCanvas !== "undefined") {
1992
- canvas = new OffscreenCanvas(w, h);
2070
+ canvas = new OffscreenCanvas(w * dpr, h * dpr);
1993
2071
  } else if (typeof document !== "undefined") {
1994
2072
  canvas = document.createElement("canvas");
1995
- canvas.width = w;
1996
- canvas.height = h;
2073
+ canvas.width = w * dpr;
2074
+ canvas.height = h * dpr;
1997
2075
  } else {
1998
2076
  return;
1999
2077
  }
2000
2078
  const ctx = canvas.getContext("2d");
2001
2079
  if (!ctx) return;
2080
+ ctx.scale(dpr, dpr);
2002
2081
  ctx.translate(pad - this.bounds.x, pad - this.bounds.y);
2003
2082
  ctx.lineWidth = this.lineWidth;
2004
2083
  ctx.lineCap = "round";
@@ -2032,7 +2111,7 @@ var SplineEntity = (_class5 = class extends _chunkTQ4H357Qjs.Entity {
2032
2111
  }
2033
2112
  render(r) {
2034
2113
  let rendered = false;
2035
- if (this.cache) {
2114
+ if (this.cache && !this.containsGradient) {
2036
2115
  if (!this.baked) this.bake();
2037
2116
  if (this.offscreen) {
2038
2117
  const pad = this.lineWidth + 2;
@@ -2040,8 +2119,9 @@ var SplineEntity = (_class5 = class extends _chunkTQ4H357Qjs.Entity {
2040
2119
  this.offscreen,
2041
2120
  this.bounds.x - pad,
2042
2121
  this.bounds.y - pad,
2043
- this.offscreen.width,
2044
- this.offscreen.height
2122
+ // Logical size, not the (DPR-scaled) bitmap size.
2123
+ this.bakedWidth,
2124
+ this.bakedHeight
2045
2125
  );
2046
2126
  rendered = true;
2047
2127
  }
@@ -2064,9 +2144,9 @@ async function loadSpline(url) {
2064
2144
  // src/math/SpatialHashGrid.ts
2065
2145
  var SpatialHashGrid = (_class6 = class {
2066
2146
 
2067
- __init62() {this.grid = /* @__PURE__ */ new Map()}
2068
- __init63() {this.entityCells = /* @__PURE__ */ new Map()}
2069
- constructor(cellSize = 64) {;_class6.prototype.__init62.call(this);_class6.prototype.__init63.call(this);
2147
+ __init65() {this.grid = /* @__PURE__ */ new Map()}
2148
+ __init66() {this.entityCells = /* @__PURE__ */ new Map()}
2149
+ constructor(cellSize = 64) {;_class6.prototype.__init65.call(this);_class6.prototype.__init66.call(this);
2070
2150
  this.cellSize = cellSize;
2071
2151
  }
2072
2152
  hash(cx, cy) {
@@ -2120,7 +2200,7 @@ var SpatialHashGrid = (_class6 = class {
2120
2200
  const keys = this.entityCells.get(id);
2121
2201
  if (!keys) return;
2122
2202
  for (const key of keys) {
2123
- _optionalChain([this, 'access', _65 => _65.grid, 'access', _66 => _66.get, 'call', _67 => _67(key), 'optionalAccess', _68 => _68.delete, 'call', _69 => _69(id)]);
2203
+ _optionalChain([this, 'access', _78 => _78.grid, 'access', _79 => _79.get, 'call', _80 => _80(key), 'optionalAccess', _81 => _81.delete, 'call', _82 => _82(id)]);
2124
2204
  }
2125
2205
  this.entityCells.delete(id);
2126
2206
  }
@@ -2156,20 +2236,20 @@ var SpatialHashGrid = (_class6 = class {
2156
2236
  }, _class6);
2157
2237
 
2158
2238
  // src/tree/DOMPortalEntity.ts
2159
- var DOMPortalEntity = (_class7 = class extends _chunkTQ4H357Qjs.Entity {
2239
+ var DOMPortalEntity = (_class7 = class extends _chunk4BO5XBJLjs.Entity {
2160
2240
 
2161
- __init64() {this.isDOMPortal = true}
2162
- __init65() {this.domListeners = []}
2163
- __init66() {this.resizeObserver = null}
2164
- __init67() {this.cachedWidth = 100}
2165
- __init68() {this.cachedHeight = 100}
2166
- __init69() {this.lastWidth = ""}
2167
- __init70() {this.lastHeight = ""}
2168
- __init71() {this.lastTransform = ""}
2169
- __init72() {this.lastZIndex = ""}
2170
- __init73() {this.lastOpacity = ""}
2241
+ __init67() {this.isDOMPortal = true}
2242
+ __init68() {this.domListeners = []}
2243
+ __init69() {this.resizeObserver = null}
2244
+ __init70() {this.cachedWidth = 100}
2245
+ __init71() {this.cachedHeight = 100}
2246
+ __init72() {this.lastWidth = ""}
2247
+ __init73() {this.lastHeight = ""}
2248
+ __init74() {this.lastTransform = ""}
2249
+ __init75() {this.lastZIndex = ""}
2250
+ __init76() {this.lastOpacity = ""}
2171
2251
  constructor(domElement, width, height, id) {
2172
- super(id);_class7.prototype.__init64.call(this);_class7.prototype.__init65.call(this);_class7.prototype.__init66.call(this);_class7.prototype.__init67.call(this);_class7.prototype.__init68.call(this);_class7.prototype.__init69.call(this);_class7.prototype.__init70.call(this);_class7.prototype.__init71.call(this);_class7.prototype.__init72.call(this);_class7.prototype.__init73.call(this);;
2252
+ super(id);_class7.prototype.__init67.call(this);_class7.prototype.__init68.call(this);_class7.prototype.__init69.call(this);_class7.prototype.__init70.call(this);_class7.prototype.__init71.call(this);_class7.prototype.__init72.call(this);_class7.prototype.__init73.call(this);_class7.prototype.__init74.call(this);_class7.prototype.__init75.call(this);_class7.prototype.__init76.call(this);;
2173
2253
  this.domElement = domElement;
2174
2254
  this.width = _nullishCoalesce(width, () => ( 0));
2175
2255
  this.height = _nullishCoalesce(height, () => ( 0));
@@ -2191,7 +2271,7 @@ var DOMPortalEntity = (_class7 = class extends _chunkTQ4H357Qjs.Entity {
2191
2271
  const events = ["click", "pointerdown", "pointerup", "pointermove", "wheel"];
2192
2272
  for (const type of events) {
2193
2273
  const handler = (e) => {
2194
- this.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)(type, this, e));
2274
+ this.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)(type, this, e));
2195
2275
  };
2196
2276
  this.domElement.addEventListener(type, handler);
2197
2277
  this.domListeners.push({ type, handler, capture: false });
@@ -2202,7 +2282,7 @@ var DOMPortalEntity = (_class7 = class extends _chunkTQ4H357Qjs.Entity {
2202
2282
  ];
2203
2283
  for (const { native, vecto } of hoverEvents) {
2204
2284
  const handler = (e) => {
2205
- this.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)(vecto, this, e, false));
2285
+ this.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)(vecto, this, e, false));
2206
2286
  };
2207
2287
  this.domElement.addEventListener(native, handler);
2208
2288
  this.domListeners.push({ type: native, handler, capture: false });
@@ -2210,7 +2290,7 @@ var DOMPortalEntity = (_class7 = class extends _chunkTQ4H357Qjs.Entity {
2210
2290
  const focusEvents = ["focus", "blur"];
2211
2291
  for (const type of focusEvents) {
2212
2292
  const handler = (e) => {
2213
- this.dispatchEvent(new (0, _chunkTQ4H357Qjs.VectoJSEvent)(type, this, e, true));
2293
+ this.dispatchEvent(new (0, _chunk4BO5XBJLjs.VectoJSEvent)(type, this, e, true));
2214
2294
  };
2215
2295
  this.domElement.addEventListener(type, handler, true);
2216
2296
  this.domListeners.push({ type, handler, capture: true });
@@ -2249,8 +2329,8 @@ var DOMPortalEntity = (_class7 = class extends _chunkTQ4H357Qjs.Entity {
2249
2329
  }, _class7);
2250
2330
 
2251
2331
  // src/index.ts
2252
- Scene.registerWebGLPointRendererCreator(_chunkTPNADFNNjs.createWebGLPointRenderer);
2253
- Scene.registerWebGPUParticleSystemManager(_chunkTPNADFNNjs.WebGPUParticleSystemManager);
2332
+ Scene.registerWebGLPointRendererCreator(_chunkGADBN53Zjs.createWebGLPointRenderer);
2333
+ Scene.registerWebGPUParticleSystemManager(_chunkGADBN53Zjs.WebGPUParticleSystemManager);
2254
2334
 
2255
2335
 
2256
2336
 
@@ -2295,4 +2375,4 @@ Scene.registerWebGPUParticleSystemManager(_chunkTPNADFNNjs.WebGPUParticleSystemM
2295
2375
 
2296
2376
 
2297
2377
 
2298
- exports.ArabicShaper = _chunk76NMTLYLjs.ArabicShaper; exports.BidiResolver = _chunk76NMTLYLjs.BidiResolver; exports.CanvasRenderer = _chunkTPNADFNNjs.CanvasRenderer; exports.ComputeParticleEntity = ComputeParticleEntity; exports.DOMPortalEntity = DOMPortalEntity; exports.Easing = _chunkTQ4H357Qjs.Easing; exports.Entity = _chunkTQ4H357Qjs.Entity; exports.GridTextEntity = GridTextEntity; exports.LayoutEngine = _chunkIKLYTHALjs.LayoutEngine; exports.LayoutResultBuffer = _chunkIKLYTHALjs.LayoutResultBuffer; exports.LayoutWorkerManager = _chunk76NMTLYLjs.LayoutWorkerManager; exports.MSDFFont = _chunkTQ4H357Qjs.MSDFFont; exports.MSDFTextEntity = _chunkTQ4H357Qjs.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.SVGEntity = _chunkTQ4H357Qjs.SVGEntity; exports.SVGRenderer = _chunkTPNADFNNjs.SVGRenderer; exports.Scene = Scene; exports.SpatialHashGrid = SpatialHashGrid; exports.SplineEntity = SplineEntity; exports.SpringDriver = _chunkTQ4H357Qjs.SpringDriver; exports.SpringPhysics = _chunkTQ4H357Qjs.SpringPhysics; exports.TextEntity = TextEntity; exports.TweenDriver = _chunkTQ4H357Qjs.TweenDriver; exports.VectoJSEvent = _chunkTQ4H357Qjs.VectoJSEvent; exports.WebGPUParticleSystemManager = _chunkTPNADFNNjs.WebGPUParticleSystemManager; exports.computeLineSegments = _chunkIKLYTHALjs.computeLineSegments; exports.createCanvasMeasurer = _chunkIKLYTHALjs.createCanvasMeasurer; exports.createWebGLPointRenderer = _chunkTPNADFNNjs.createWebGLPointRenderer; exports.isSafeUrl = _chunkTPNADFNNjs.isSafeUrl; exports.isTweenConfig = _chunkTQ4H357Qjs.isTweenConfig; exports.loadSpline = loadSpline; exports.parseColorToRGBA = _chunkTPNADFNNjs.parseColorToRGBA; exports.polySegmentToBezier = polySegmentToBezier; exports.sanitizeUrl = _chunkTPNADFNNjs.sanitizeUrl;
2378
+ exports.ArabicShaper = _chunkCTZQOM5Zjs.ArabicShaper; exports.BidiResolver = _chunkCTZQOM5Zjs.BidiResolver; exports.CanvasRenderer = _chunkGADBN53Zjs.CanvasRenderer; exports.ComputeParticleEntity = ComputeParticleEntity; exports.DOMPortalEntity = DOMPortalEntity; exports.Easing = _chunk4BO5XBJLjs.Easing; exports.Entity = _chunk4BO5XBJLjs.Entity; exports.GridTextEntity = GridTextEntity; exports.LayoutEngine = _chunkBWLNEJJWjs.LayoutEngine; exports.LayoutResultBuffer = _chunkBWLNEJJWjs.LayoutResultBuffer; exports.LayoutWorkerManager = _chunkCTZQOM5Zjs.LayoutWorkerManager; exports.MSDFFont = _chunk4BO5XBJLjs.MSDFFont; exports.MSDFTextEntity = _chunk4BO5XBJLjs.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.SVGEntity = _chunk4BO5XBJLjs.SVGEntity; exports.SVGRenderer = _chunkGADBN53Zjs.SVGRenderer; exports.Scene = Scene; exports.SpatialHashGrid = SpatialHashGrid; exports.SplineEntity = SplineEntity; exports.SpringDriver = _chunk4BO5XBJLjs.SpringDriver; exports.SpringPhysics = _chunk4BO5XBJLjs.SpringPhysics; exports.TextEntity = TextEntity; exports.TweenDriver = _chunk4BO5XBJLjs.TweenDriver; exports.VectoJSEvent = _chunk4BO5XBJLjs.VectoJSEvent; exports.WebGPUParticleSystemManager = _chunkGADBN53Zjs.WebGPUParticleSystemManager; exports.computeLineSegments = _chunkBWLNEJJWjs.computeLineSegments; exports.createCanvasMeasurer = _chunkBWLNEJJWjs.createCanvasMeasurer; exports.createWebGLPointRenderer = _chunkGADBN53Zjs.createWebGLPointRenderer; exports.isSafeUrl = _chunkGADBN53Zjs.isSafeUrl; exports.isTweenConfig = _chunk4BO5XBJLjs.isTweenConfig; exports.loadSpline = loadSpline; exports.parseColorToRGBA = _chunkGADBN53Zjs.parseColorToRGBA; exports.polySegmentToBezier = polySegmentToBezier; exports.sanitizeUrl = _chunkGADBN53Zjs.sanitizeUrl;