@vibecook/ice 0.2.0 → 0.4.0

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.
Files changed (42) hide show
  1. package/dist/{chunk-IASTQMU5.js → chunk-3PHPWRB2.js} +146 -11
  2. package/dist/chunk-3PHPWRB2.js.map +1 -0
  3. package/dist/{chunk-DXU3RZZS.js → chunk-7LZAXQAO.js} +649 -261
  4. package/dist/chunk-7LZAXQAO.js.map +1 -0
  5. package/dist/{chunk-5SJYHQI4.js → chunk-ENMRSITH.js} +38 -11
  6. package/dist/chunk-ENMRSITH.js.map +1 -0
  7. package/dist/devtools.js +1 -1
  8. package/dist/dom.js +16 -2
  9. package/dist/ground.js +1 -1
  10. package/dist/index.js +17 -1
  11. package/dist/r3f.js +9 -3
  12. package/dist/r3f.js.map +1 -1
  13. package/dist/react.js +5 -3
  14. package/dist/types/packages/core/src/catalog/camera-derived.d.ts +26 -2
  15. package/dist/types/packages/core/src/catalog/gesture.d.ts +1 -1
  16. package/dist/types/packages/core/src/catalog/pointer.d.ts +11 -0
  17. package/dist/types/packages/core/src/catalog/selection-presence.d.ts +10 -0
  18. package/dist/types/packages/core/src/doc/autosave.d.ts +34 -0
  19. package/dist/types/packages/core/src/doc/rename-sweep.d.ts +3 -0
  20. package/dist/types/packages/core/src/doc/rename.d.ts +7 -0
  21. package/dist/types/packages/core/src/doc/version-gate.d.ts +14 -1
  22. package/dist/types/packages/core/src/engine/engine.d.ts +11 -0
  23. package/dist/types/packages/core/src/engine/frame-control.d.ts +71 -0
  24. package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +9 -0
  25. package/dist/types/packages/core/src/index.d.ts +3 -1
  26. package/dist/types/packages/core/src/input/queue.d.ts +9 -0
  27. package/dist/types/packages/core/src/interaction/gesture-status.d.ts +13 -0
  28. package/dist/types/packages/core/src/schema/meta.d.ts +12 -0
  29. package/dist/types/packages/core/src/widget/define-widget.d.ts +61 -0
  30. package/dist/types/packages/dom/src/index.d.ts +2 -0
  31. package/dist/types/packages/dom/src/input-ownership.d.ts +52 -0
  32. package/dist/types/packages/dom/src/loop.d.ts +11 -0
  33. package/dist/types/packages/dom/src/pointer-adapter.d.ts +16 -3
  34. package/dist/types/packages/dom/src/widget-focus.d.ts +58 -0
  35. package/dist/types/packages/react/src/engine-context.d.ts +13 -0
  36. package/dist/types/packages/react/src/index.d.ts +1 -1
  37. package/dist/types/packages/react/src/infinite-canvas.d.ts +20 -2
  38. package/dist/types/packages/react/src/keymap.d.ts +23 -4
  39. package/package.json +4 -4
  40. package/dist/chunk-5SJYHQI4.js.map +0 -1
  41. package/dist/chunk-DXU3RZZS.js.map +0 -1
  42. package/dist/chunk-IASTQMU5.js.map +0 -1
@@ -43,6 +43,7 @@ import {
43
43
  defineTag as strataDefineTag
44
44
  } from "@vibecook/strata-ecs";
45
45
  var componentMeta = /* @__PURE__ */ new Map();
46
+ var componentsByIceName = /* @__PURE__ */ new Map();
46
47
  var tagNames = /* @__PURE__ */ new Map();
47
48
  var relationMeta = /* @__PURE__ */ new Map();
48
49
  var resourceMeta = /* @__PURE__ */ new Map();
@@ -62,8 +63,18 @@ function defineComponent(name, schema) {
62
63
  eidFields: fields.filter(([, f]) => isEidField(f)).map(([k]) => k),
63
64
  requiredFields: fields.filter(([, f]) => !hasDefault(f)).map(([k]) => k)
64
65
  });
66
+ componentsByIceName.set(name, c);
65
67
  return c;
66
68
  }
69
+ function ensureComponent(name, schema) {
70
+ const existing = componentsByIceName.get(name);
71
+ if (existing === void 0) return defineComponent(name, schema);
72
+ const recorded = componentMeta.get(existing);
73
+ if (recorded === void 0 || JSON.stringify(recorded.schema) !== JSON.stringify(schema)) {
74
+ throw new Error(`ice: ensureComponent("${name}") \u2014 a component with this name exists with a DIFFERENT shape.`);
75
+ }
76
+ return existing;
77
+ }
67
78
  function defineTag(name) {
68
79
  const t = strataDefineTag(name);
69
80
  tagNames.set(t, name);
@@ -396,6 +407,181 @@ function createReflectorRegistry(world, opts) {
396
407
  };
397
408
  }
398
409
 
410
+ // ../core/src/catalog/camera-derived.ts
411
+ import { enumOf, field as field2 } from "@vibecook/strata-ecs";
412
+ var Camera = defineResource("Camera", {
413
+ x: field2("f64", { default: 0 }),
414
+ y: field2("f64", { default: 0 }),
415
+ zoom: field2("f32", { default: 1 }),
416
+ gesturing: field2("bool", { default: false })
417
+ });
418
+ var Viewport = defineResource("Viewport", {
419
+ w: field2("f32", { default: 0 }),
420
+ h: field2("f32", { default: 0 }),
421
+ dpr: field2("f32", { default: 1 })
422
+ });
423
+ var ActiveTool = defineResource("ActiveTool", { id: field2("string", { default: "select" }) });
424
+ var StageMode = defineResource("StageMode", {
425
+ backgroundHolds: field2("u32", { default: 0 })
426
+ });
427
+ var FrameMode = defineResource("FrameMode", {
428
+ freezeHolds: field2("u32", { default: 0 })
429
+ });
430
+ var SnapConfig = defineResource("SnapConfig", {
431
+ enabled: field2("bool", { default: SNAP_DEFAULTS.enabled }),
432
+ thresholdPx: field2("f32", { default: SNAP_DEFAULTS.thresholdPx })
433
+ });
434
+ var ContainerCamera = defineComponent("ContainerCamera", {
435
+ x: field2("f64", { default: 0 }),
436
+ y: field2("f64", { default: 0 }),
437
+ zoom: field2("f32", { default: 1 })
438
+ });
439
+ var Active = defineTag("Active");
440
+ var Visible = defineTag("Visible");
441
+ var Culled = defineTag("Culled");
442
+ var WidgetBreakpoint = defineComponent("WidgetBreakpoint", {
443
+ tier: field2(enumOf(["micro", "compact", "normal", "expanded", "detailed"]), { default: "normal" }),
444
+ w: field2("u16", { default: 0 }),
445
+ h: field2("u16", { default: 0 })
446
+ });
447
+ var MeasuredSize = defineComponent("MeasuredSize", {
448
+ w: field2("f32", { default: 0 }),
449
+ h: field2("f32", { default: 0 })
450
+ });
451
+ var SelectionBox = defineComponent("SelectionBox", {
452
+ x: field2("f64", { default: 0 }),
453
+ y: field2("f64", { default: 0 }),
454
+ w: field2("f32", { default: 0 }),
455
+ h: field2("f32", { default: 0 })
456
+ });
457
+ var HandleSpec = defineComponent("HandleSpec", {
458
+ anchor: enumOf(["nw", "n", "ne", "e", "se", "s", "sw", "w"])
459
+ });
460
+ var GuideLine = defineComponent("GuideLine", {
461
+ axis: enumOf(["x", "y"]),
462
+ at: field2("f64", { default: 0 }),
463
+ from: field2("f64", { default: 0 }),
464
+ to: field2("f64", { default: 0 })
465
+ });
466
+ var SpacingBar = defineComponent("SpacingBar", {
467
+ axis: enumOf(["x", "y"]),
468
+ from: field2("f64", { default: 0 }),
469
+ to: field2("f64", { default: 0 }),
470
+ perp: field2("f64", { default: 0 }),
471
+ gap: field2("f32", { default: 0 })
472
+ });
473
+ var MarqueeBox = defineComponent("MarqueeBox", {
474
+ x: field2("f64", { default: 0 }),
475
+ y: field2("f64", { default: 0 }),
476
+ w: field2("f32", { default: 0 }),
477
+ h: field2("f32", { default: 0 })
478
+ });
479
+ var CursorVisual = defineComponent("CursorVisual", {
480
+ kind: enumOf(["local", "remote"]),
481
+ pressed: field2("bool", { default: false })
482
+ });
483
+ var Follows = defineRelation("Follows", { arity: "one" });
484
+ var VisualOf = defineRelation("VisualOf", { arity: "one" });
485
+ var NavDepth = defineComponent("NavDepth", { d: field2("u8", { default: 0 }) });
486
+ var NavCamera = defineComponent("NavCamera", {
487
+ x: field2("f64", { default: 0 }),
488
+ y: field2("f64", { default: 0 }),
489
+ zoom: field2("f32", { default: 1 })
490
+ });
491
+ var NavFrame = defineRelation("NavFrame", { arity: "one" });
492
+ var CanvasSurface = defineTag("CanvasSurface");
493
+
494
+ // ../core/src/guards/dev.ts
495
+ var enabled = true;
496
+ function setDevGuards(on) {
497
+ enabled = on;
498
+ }
499
+ function devGuardsEnabled() {
500
+ return enabled;
501
+ }
502
+
503
+ // ../core/src/engine/frame-control.ts
504
+ var SETTLE_CAP = 120;
505
+ function createFrameControl(world) {
506
+ const freezes = /* @__PURE__ */ new Map();
507
+ const reporters = /* @__PURE__ */ new Map();
508
+ const listeners = /* @__PURE__ */ new Set();
509
+ let settleLeft = 0;
510
+ let parked = false;
511
+ const sync = () => {
512
+ world.setResource(FrameMode, { freezeHolds: freezes.size });
513
+ };
514
+ const announce = () => {
515
+ for (const fn of [...listeners]) fn();
516
+ };
517
+ const busyNames = () => {
518
+ const names = [];
519
+ for (const r of reporters.values()) if (r.busy()) names.push(r.name);
520
+ return names;
521
+ };
522
+ return {
523
+ freeze(name) {
524
+ const token = Symbol(name);
525
+ const first = freezes.size === 0;
526
+ freezes.set(token, name);
527
+ if (first) {
528
+ settleLeft = SETTLE_CAP;
529
+ parked = false;
530
+ }
531
+ sync();
532
+ announce();
533
+ let released = false;
534
+ return () => {
535
+ if (released) return;
536
+ released = true;
537
+ freezes.delete(token);
538
+ if (freezes.size === 0) {
539
+ settleLeft = 0;
540
+ parked = false;
541
+ }
542
+ sync();
543
+ announce();
544
+ };
545
+ },
546
+ isFrozen: () => freezes.size > 0,
547
+ isParked: () => parked,
548
+ holds: () => [...freezes.values()],
549
+ settleWhile(name, busy) {
550
+ const token = Symbol(name);
551
+ reporters.set(token, { name, busy });
552
+ let released = false;
553
+ return () => {
554
+ if (released) return;
555
+ released = true;
556
+ reporters.delete(token);
557
+ };
558
+ },
559
+ settling: () => busyNames(),
560
+ claimStep() {
561
+ if (freezes.size === 0) return true;
562
+ if (parked) return false;
563
+ if (settleLeft <= 0) {
564
+ parked = true;
565
+ if (devGuardsEnabled()) {
566
+ console.warn(
567
+ `ice: frame.freeze \u2014 settle cap (${SETTLE_CAP} frames) reached with reporters still busy: ${busyNames().join(", ")}. Parking on a possibly unsettled frame.`
568
+ );
569
+ }
570
+ return false;
571
+ }
572
+ settleLeft -= 1;
573
+ if (busyNames().length === 0) parked = true;
574
+ return true;
575
+ },
576
+ onChange(fn) {
577
+ listeners.add(fn);
578
+ return () => {
579
+ listeners.delete(fn);
580
+ };
581
+ }
582
+ };
583
+ }
584
+
399
585
  // ../core/src/engine/engine.ts
400
586
  function createEngine(world, opts) {
401
587
  const pipeline = createPipelineRegistry();
@@ -404,11 +590,13 @@ function createEngine(world, opts) {
404
590
  opts?.onReflectorFault ? { onFault: opts.onReflectorFault } : void 0
405
591
  );
406
592
  const publishHooks = [];
593
+ const frame2 = createFrameControl(world);
407
594
  let telemetryArmed = false;
408
595
  let last;
409
596
  let building = null;
410
597
  return {
411
598
  world,
599
+ frame: frame2,
412
600
  addSystems(group, ...systems) {
413
601
  return pipeline.add(group, ...systems);
414
602
  },
@@ -467,15 +655,6 @@ function createEngine(world, opts) {
467
655
  };
468
656
  }
469
657
 
470
- // ../core/src/guards/dev.ts
471
- var enabled = true;
472
- function setDevGuards(on) {
473
- enabled = on;
474
- }
475
- function devGuardsEnabled() {
476
- return enabled;
477
- }
478
-
479
658
  // ../core/src/guards/live-writer.ts
480
659
  function createLiveWriter(world, opts) {
481
660
  return {
@@ -599,34 +778,34 @@ function writeRuntimeResource(world, res, v) {
599
778
  }
600
779
 
601
780
  // ../core/src/catalog/scene.ts
602
- import { field as field2 } from "@vibecook/strata-ecs";
781
+ import { field as field3 } from "@vibecook/strata-ecs";
603
782
  var Position = defineComponent("Position", { x: "f64", y: "f64" });
604
783
  var Size = defineComponent("Size", { w: "f32", h: "f32" });
605
- var Rotation = defineComponent("Rotation", { r: field2("f32", { default: 0 }) });
606
- var Opacity = defineComponent("Opacity", { a: field2("f32", { default: 1 }) });
784
+ var Rotation = defineComponent("Rotation", { r: field3("f32", { default: 0 }) });
785
+ var Opacity = defineComponent("Opacity", { a: field3("f32", { default: 1 }) });
607
786
  var StackZ = defineComponent("StackZ", { z: "f64" });
608
787
  var ChildOf = defineRelation("ChildOf", { arity: "one", ordered: true });
609
788
  var BoardRoot = defineResource("BoardRoot", { root: "eid" });
610
789
 
611
790
  // ../core/src/catalog/graph.ts
612
- import { enumOf, field as field3 } from "@vibecook/strata-ecs";
791
+ import { enumOf as enumOf2, field as field4 } from "@vibecook/strata-ecs";
613
792
  var Wire = defineTag("Wire");
614
793
  var WireFrom = defineRelation("WireFrom", { arity: "one" });
615
794
  var WireTo = defineRelation("WireTo", { arity: "one" });
616
795
  var WirePorts = defineComponent("WirePorts", { from: "string", to: "string" });
617
796
  var Port = defineComponent("Port", {
618
797
  id: "string",
619
- side: enumOf(["n", "e", "s", "w"]),
620
- index: field3("u8", { default: 0 })
798
+ side: enumOf2(["n", "e", "s", "w"]),
799
+ index: field4("u8", { default: 0 })
621
800
  });
622
801
  var PortOf = defineRelation("PortOf", { arity: "one" });
623
802
  var PortAnchor = defineComponent("PortAnchor", {
624
- x: field3("f64", { default: 0 }),
625
- y: field3("f64", { default: 0 })
803
+ x: field4("f64", { default: 0 }),
804
+ y: field4("f64", { default: 0 })
626
805
  });
627
806
  var Container = defineTag("Container");
628
- var Accepts = defineComponent("Accepts", { list: field3("string", { default: "[]" }) });
629
- var Provides = defineComponent("Provides", { list: field3("string", { default: "[]" }) });
807
+ var Accepts = defineComponent("Accepts", { list: field4("string", { default: "[]" }) });
808
+ var Provides = defineComponent("Provides", { list: field4("string", { default: "[]" }) });
630
809
  var WirePrefab = definePrefab("wire", {
631
810
  store: "durable",
632
811
  version: 1,
@@ -636,54 +815,55 @@ var WirePrefab = definePrefab("wire", {
636
815
  });
637
816
 
638
817
  // ../core/src/catalog/pointer.ts
639
- import { enumOf as enumOf2, field as field4 } from "@vibecook/strata-ecs";
818
+ import { enumOf as enumOf3, field as field5 } from "@vibecook/strata-ecs";
640
819
  var Pointer = defineComponent("Pointer", {
641
820
  id: "string",
642
- device: enumOf2(["mouse", "touch", "pen"]),
643
- owner: field4("string", { default: "" })
821
+ device: enumOf3(["mouse", "touch", "pen"]),
822
+ owner: field5("string", { default: "" })
644
823
  });
645
824
  var PointerScreen = defineComponent("PointerScreen", {
646
- x: field4("f32", { default: 0 }),
647
- y: field4("f32", { default: 0 })
825
+ x: field5("f32", { default: 0 }),
826
+ y: field5("f32", { default: 0 })
648
827
  });
649
828
  var PointerButtons = defineComponent("PointerButtons", {
650
- buttons: field4("u8", { default: 0 }),
651
- downX: field4("f32", { default: 0 }),
652
- downY: field4("f32", { default: 0 }),
829
+ buttons: field5("u8", { default: 0 }),
830
+ downX: field5("f32", { default: 0 }),
831
+ downY: field5("f32", { default: 0 }),
653
832
  /** The down EVENT's timestamp (0 = unknown ⇒ consumers fall back to frame now). */
654
- downMs: field4("f64", { default: 0 })
833
+ downMs: field5("f64", { default: 0 })
655
834
  });
656
835
  var PointerMods = defineComponent("PointerMods", {
657
- shift: field4("bool", { default: false }),
658
- ctrl: field4("bool", { default: false }),
659
- alt: field4("bool", { default: false }),
660
- meta: field4("bool", { default: false })
836
+ shift: field5("bool", { default: false }),
837
+ ctrl: field5("bool", { default: false }),
838
+ alt: field5("bool", { default: false }),
839
+ meta: field5("bool", { default: false })
661
840
  });
662
841
  var PointerWheel = defineComponent("PointerWheel", {
663
- dx: field4("f32", { default: 0 }),
664
- dy: field4("f32", { default: 0 }),
665
- pinch: field4("f32", { default: 0 })
842
+ dx: field5("f32", { default: 0 }),
843
+ dy: field5("f32", { default: 0 }),
844
+ pinch: field5("f32", { default: 0 })
666
845
  });
667
- var PointerRadius = defineComponent("PointerRadius", { r: field4("f32", { default: 0 }) });
846
+ var PointerRadius = defineComponent("PointerRadius", { r: field5("f32", { default: 0 }) });
668
847
  var WentDown = defineTag("WentDown");
669
848
  var WentUp = defineTag("WentUp");
670
849
  var WentCancelled = defineTag("WentCancelled");
671
850
  var HandledByWidget = defineTag("HandledByWidget");
851
+ var WheelHandled = defineTag("WheelHandled");
672
852
  var OverInteractive = defineTag("OverInteractive");
673
853
  var LocalPointer = defineTag("LocalPointer");
674
854
  var PointerWorld = defineComponent("PointerWorld", {
675
- x: field4("f64", { default: 0 }),
676
- y: field4("f64", { default: 0 })
855
+ x: field5("f64", { default: 0 }),
856
+ y: field5("f64", { default: 0 })
677
857
  });
678
858
  var Keyboard = defineResource("Keyboard", {
679
- shift: field4("bool", { default: false }),
680
- ctrl: field4("bool", { default: false }),
681
- alt: field4("bool", { default: false }),
682
- meta: field4("bool", { default: false }),
683
- space: field4("bool", { default: false })
859
+ shift: field5("bool", { default: false }),
860
+ ctrl: field5("bool", { default: false }),
861
+ alt: field5("bool", { default: false }),
862
+ meta: field5("bool", { default: false }),
863
+ space: field5("bool", { default: false })
684
864
  });
685
865
  var CancelRequest = defineResource("CancelRequest", {
686
- active: field4("bool", { default: false })
866
+ active: field5("bool", { default: false })
687
867
  });
688
868
  var Targets = defineRelation("Targets", { arity: "one" });
689
869
  var TouchesExact = defineRelation("TouchesExact", { arity: "one" });
@@ -733,44 +913,44 @@ function definePhaseSet(name, phases) {
733
913
  }
734
914
 
735
915
  // ../core/src/catalog/gesture.ts
736
- import { field as field5 } from "@vibecook/strata-ecs";
916
+ import { field as field6 } from "@vibecook/strata-ecs";
737
917
  var Drag = defineComponent("Drag", {
738
- startX: field5("f64", { default: 0 }),
739
- startY: field5("f64", { default: 0 }),
740
- totalX: field5("f32", { default: 0 }),
741
- totalY: field5("f32", { default: 0 }),
742
- velX: field5("f32", { default: 0 }),
743
- velY: field5("f32", { default: 0 }),
744
- zoomAtClaim: field5("f32", { default: 1 })
918
+ startX: field6("f64", { default: 0 }),
919
+ startY: field6("f64", { default: 0 }),
920
+ totalX: field6("f32", { default: 0 }),
921
+ totalY: field6("f32", { default: 0 }),
922
+ velX: field6("f32", { default: 0 }),
923
+ velY: field6("f32", { default: 0 }),
924
+ zoomAtClaim: field6("f32", { default: 1 })
745
925
  });
746
926
  var Tap = defineComponent("Tap", {
747
- downAt: field5("f64", { default: 0 }),
748
- count: field5("u32", { default: 0 })
927
+ downAt: field6("f64", { default: 0 }),
928
+ count: field6("u32", { default: 0 })
749
929
  });
750
930
  var LongPress = defineComponent("LongPress", {
751
- downAt: field5("f64", { default: 0 }),
752
- startX: field5("f64", { default: 0 }),
753
- startY: field5("f64", { default: 0 }),
754
- curX: field5("f64", { default: 0 }),
755
- curY: field5("f64", { default: 0 })
931
+ downAt: field6("f64", { default: 0 }),
932
+ startX: field6("f64", { default: 0 }),
933
+ startY: field6("f64", { default: 0 }),
934
+ curX: field6("f64", { default: 0 }),
935
+ curY: field6("f64", { default: 0 })
756
936
  });
757
937
  var Pinch = defineComponent("Pinch", {
758
- startDist: field5("f32", { default: 0 }),
759
- startZoom: field5("f32", { default: 1 }),
760
- cx: field5("f64", { default: 0 }),
761
- cy: field5("f64", { default: 0 }),
762
- zoomAtClaim: field5("f32", { default: 1 })
938
+ startDist: field6("f32", { default: 0 }),
939
+ startZoom: field6("f32", { default: 1 }),
940
+ cx: field6("f64", { default: 0 }),
941
+ cy: field6("f64", { default: 0 }),
942
+ zoomAtClaim: field6("f32", { default: 1 })
763
943
  });
764
944
  var WheelPan = defineComponent("WheelPan", {
765
- dx: field5("f32", { default: 0 }),
766
- dy: field5("f32", { default: 0 }),
767
- anchorX: field5("f32", { default: 0 }),
768
- anchorY: field5("f32", { default: 0 })
945
+ dx: field6("f32", { default: 0 }),
946
+ dy: field6("f32", { default: 0 }),
947
+ anchorX: field6("f32", { default: 0 }),
948
+ anchorY: field6("f32", { default: 0 })
769
949
  });
770
950
  var WheelZoom = defineComponent("WheelZoom", {
771
- pinch: field5("f32", { default: 0 }),
772
- anchorX: field5("f32", { default: 0 }),
773
- anchorY: field5("f32", { default: 0 })
951
+ pinch: field6("f32", { default: 0 }),
952
+ anchorX: field6("f32", { default: 0 }),
953
+ anchorY: field6("f32", { default: 0 })
774
954
  });
775
955
  var GesturePhases = definePhaseSet("Gesture", [
776
956
  "Possible",
@@ -798,9 +978,9 @@ var RoutedMarquee = defineTag("RoutedMarquee");
798
978
  var RoutedPan = defineTag("RoutedPan");
799
979
  var RoutedDraw = defineTag("RoutedDraw");
800
980
  var MultiTap = defineComponent("MultiTap", {
801
- max: field5("u32", { default: 2 }),
802
- windowMs: field5("f32", { default: GESTURE_DEFAULTS.multiTapWindowMs }),
803
- slopPx: field5("f32", { default: GESTURE_DEFAULTS.multiTapSlopPx })
981
+ max: field6("u32", { default: 2 }),
982
+ windowMs: field6("f32", { default: GESTURE_DEFAULTS.multiTapWindowMs }),
983
+ slopPx: field6("f32", { default: GESTURE_DEFAULTS.multiTapSlopPx })
804
984
  });
805
985
  var Watches = defineRelation("Watches", { arity: "many" });
806
986
  var Sequence = defineRelation("Sequence", { arity: "one" });
@@ -822,8 +1002,8 @@ var Grab = defineComponent("Grab", {
822
1002
  ord: "f64"
823
1003
  });
824
1004
  var SnapState = defineComponent("SnapState", {
825
- dx: field5("f32", { default: 0 }),
826
- dy: field5("f32", { default: 0 })
1005
+ dx: field6("f32", { default: 0 }),
1006
+ dy: field6("f32", { default: 0 })
827
1007
  });
828
1008
  var Down = defineComponent("Down", { x: "f64", y: "f64", ms: "f64" });
829
1009
  var OverlapCandidate = defineTag("OverlapCandidate");
@@ -834,14 +1014,14 @@ var TransformTween = defineComponent("TransformTween", {
834
1014
  toX: "f64",
835
1015
  toY: "f64",
836
1016
  durationMs: "f32",
837
- elapsedMs: field5("f32", { default: 0 })
1017
+ elapsedMs: field6("f32", { default: 0 })
838
1018
  });
839
1019
 
840
1020
  // ../core/src/catalog/insert.ts
841
- import { field as field6 } from "@vibecook/strata-ecs";
1021
+ import { field as field7 } from "@vibecook/strata-ecs";
842
1022
  var InsertGhost = defineComponent("InsertGhost", {
843
1023
  type: "string",
844
- props: field6("string", { default: "{}" }),
1024
+ props: field7("string", { default: "{}" }),
845
1025
  screenX: "f32",
846
1026
  screenY: "f32"
847
1027
  });
@@ -849,7 +1029,7 @@ var GhostCommitted = defineTag("GhostCommitted");
849
1029
  var GhostRetiring = defineTag("GhostRetiring");
850
1030
 
851
1031
  // ../core/src/catalog/selection-presence.ts
852
- import { enumOf as enumOf4, field as field7 } from "@vibecook/strata-ecs";
1032
+ import { enumOf as enumOf5, field as field8 } from "@vibecook/strata-ecs";
853
1033
  var Selected = defineTag("Selected");
854
1034
  var Selectable = defineTag("Selectable");
855
1035
  var Movable = defineTag("Movable");
@@ -857,102 +1037,22 @@ var Resizable = defineTag("Resizable");
857
1037
  var SnapSource = defineTag("SnapSource");
858
1038
  var SnapTarget = defineTag("SnapTarget");
859
1039
  var SweepsContained = defineTag("SweepsContained");
1040
+ var KeyboardExclusive = defineTag("KeyboardExclusive");
860
1041
  var PresencePeer = defineTag("PresencePeer");
861
1042
  var PresenceInfo = defineComponent("PresenceInfo", { name: "string", color: "string" });
862
1043
  var PresenceCursor = defineComponent("PresenceCursor", {
863
- x: field7("f64", { default: 0 }),
864
- y: field7("f64", { default: 0 }),
865
- device: enumOf4(["mouse", "touch", "pen"])
866
- });
867
- var SelectionSummary = defineComponent("SelectionSummary", {
868
- count: field7("u16", { default: 0 }),
869
- x: field7("f64", { default: 0 }),
870
- y: field7("f64", { default: 0 }),
871
- w: field7("f32", { default: 0 }),
872
- h: field7("f32", { default: 0 }),
873
- keys: field7("string", { default: "[]" })
874
- });
875
-
876
- // ../core/src/catalog/camera-derived.ts
877
- import { enumOf as enumOf5, field as field8 } from "@vibecook/strata-ecs";
878
- var Camera = defineResource("Camera", {
879
- x: field8("f64", { default: 0 }),
880
- y: field8("f64", { default: 0 }),
881
- zoom: field8("f32", { default: 1 }),
882
- gesturing: field8("bool", { default: false })
883
- });
884
- var Viewport = defineResource("Viewport", {
885
- w: field8("f32", { default: 0 }),
886
- h: field8("f32", { default: 0 }),
887
- dpr: field8("f32", { default: 1 })
888
- });
889
- var ActiveTool = defineResource("ActiveTool", { id: field8("string", { default: "select" }) });
890
- var StageMode = defineResource("StageMode", {
891
- backgroundHolds: field8("u32", { default: 0 })
892
- });
893
- var SnapConfig = defineResource("SnapConfig", {
894
- enabled: field8("bool", { default: SNAP_DEFAULTS.enabled }),
895
- thresholdPx: field8("f32", { default: SNAP_DEFAULTS.thresholdPx })
896
- });
897
- var ContainerCamera = defineComponent("ContainerCamera", {
898
- x: field8("f64", { default: 0 }),
899
- y: field8("f64", { default: 0 }),
900
- zoom: field8("f32", { default: 1 })
901
- });
902
- var Active = defineTag("Active");
903
- var Visible = defineTag("Visible");
904
- var Culled = defineTag("Culled");
905
- var WidgetBreakpoint = defineComponent("WidgetBreakpoint", {
906
- tier: field8(enumOf5(["micro", "compact", "normal", "expanded", "detailed"]), { default: "normal" }),
907
- w: field8("u16", { default: 0 }),
908
- h: field8("u16", { default: 0 })
909
- });
910
- var MeasuredSize = defineComponent("MeasuredSize", {
911
- w: field8("f32", { default: 0 }),
912
- h: field8("f32", { default: 0 })
913
- });
914
- var SelectionBox = defineComponent("SelectionBox", {
915
1044
  x: field8("f64", { default: 0 }),
916
1045
  y: field8("f64", { default: 0 }),
917
- w: field8("f32", { default: 0 }),
918
- h: field8("f32", { default: 0 })
919
- });
920
- var HandleSpec = defineComponent("HandleSpec", {
921
- anchor: enumOf5(["nw", "n", "ne", "e", "se", "s", "sw", "w"])
922
- });
923
- var GuideLine = defineComponent("GuideLine", {
924
- axis: enumOf5(["x", "y"]),
925
- at: field8("f64", { default: 0 }),
926
- from: field8("f64", { default: 0 }),
927
- to: field8("f64", { default: 0 })
1046
+ device: enumOf5(["mouse", "touch", "pen"])
928
1047
  });
929
- var SpacingBar = defineComponent("SpacingBar", {
930
- axis: enumOf5(["x", "y"]),
931
- from: field8("f64", { default: 0 }),
932
- to: field8("f64", { default: 0 }),
933
- perp: field8("f64", { default: 0 }),
934
- gap: field8("f32", { default: 0 })
935
- });
936
- var MarqueeBox = defineComponent("MarqueeBox", {
1048
+ var SelectionSummary = defineComponent("SelectionSummary", {
1049
+ count: field8("u16", { default: 0 }),
937
1050
  x: field8("f64", { default: 0 }),
938
1051
  y: field8("f64", { default: 0 }),
939
1052
  w: field8("f32", { default: 0 }),
940
- h: field8("f32", { default: 0 })
941
- });
942
- var CursorVisual = defineComponent("CursorVisual", {
943
- kind: enumOf5(["local", "remote"]),
944
- pressed: field8("bool", { default: false })
945
- });
946
- var Follows = defineRelation("Follows", { arity: "one" });
947
- var VisualOf = defineRelation("VisualOf", { arity: "one" });
948
- var NavDepth = defineComponent("NavDepth", { d: field8("u8", { default: 0 }) });
949
- var NavCamera = defineComponent("NavCamera", {
950
- x: field8("f64", { default: 0 }),
951
- y: field8("f64", { default: 0 }),
952
- zoom: field8("f32", { default: 1 })
1053
+ h: field8("f32", { default: 0 }),
1054
+ keys: field8("string", { default: "[]" })
953
1055
  });
954
- var NavFrame = defineRelation("NavFrame", { arity: "one" });
955
- var CanvasSurface = defineTag("CanvasSurface");
956
1056
 
957
1057
  // ../core/src/catalog/settings-resources.ts
958
1058
  import { field as field9 } from "@vibecook/strata-ecs";
@@ -1019,6 +1119,7 @@ function makeVersionGuard(world, resources) {
1019
1119
  import { field as field10, enumOf as enumOf6 } from "@vibecook/strata-ecs";
1020
1120
  var WidgetEquipped = defineTag("WidgetEquipped");
1021
1121
  var registry2 = /* @__PURE__ */ new Map();
1122
+ var renameRegistry = /* @__PURE__ */ new Map();
1022
1123
  var widgets = {
1023
1124
  get(type) {
1024
1125
  return registry2.get(type);
@@ -1027,6 +1128,14 @@ var widgets = {
1027
1128
  return [...registry2.values()];
1028
1129
  }
1029
1130
  };
1131
+ var renames = {
1132
+ get(oldType) {
1133
+ return renameRegistry.get(oldType);
1134
+ },
1135
+ all() {
1136
+ return [...renameRegistry.values()];
1137
+ }
1138
+ };
1030
1139
  function normalizeProps(props) {
1031
1140
  if (props === void 0) return {};
1032
1141
  if ("kind" in props && props.kind === "object") {
@@ -1117,11 +1226,35 @@ function defineWidget(def) {
1117
1226
  fields[name] = spec;
1118
1227
  }
1119
1228
  const groups = [];
1229
+ const rawByGroup = /* @__PURE__ */ new Map();
1120
1230
  for (const [g, fields] of byGroup) {
1121
1231
  const raw = {};
1122
1232
  for (const [name, spec] of Object.entries(fields)) raw[name] = strataFieldOf(name, spec);
1233
+ rawByGroup.set(g, raw);
1123
1234
  groups.push({ name: g, component: defineComponent(`${def.type}:${g}`, raw), fields });
1124
1235
  }
1236
+ const renameDecls = def.renamedFrom ?? [];
1237
+ const legacyByOld = /* @__PURE__ */ new Map();
1238
+ for (const decl of renameDecls) {
1239
+ if (decl.type === def.type) {
1240
+ throw new Error(`ice: widget "${def.type}" lists itself in renamedFrom.`);
1241
+ }
1242
+ if (registry2.has(decl.type)) {
1243
+ throw new Error(`ice: widget "${def.type}" renamedFrom "${decl.type}" \u2014 that type is still a registered widget.`);
1244
+ }
1245
+ const holder = renameRegistry.get(decl.type);
1246
+ if (holder !== void 0 && holder.widget.type !== def.type) {
1247
+ throw new Error(`ice: widget "${def.type}" renamedFrom "${decl.type}" \u2014 already claimed by "${holder.widget.type}".`);
1248
+ }
1249
+ if (legacyByOld.has(decl.type)) {
1250
+ throw new Error(`ice: widget "${def.type}" lists renamedFrom "${decl.type}" twice.`);
1251
+ }
1252
+ const legacy = [];
1253
+ for (const g of groups) {
1254
+ legacy.push(ensureComponent(`${decl.type}:${g.name}`, rawByGroup.get(g.name)));
1255
+ }
1256
+ legacyByOld.set(decl.type, legacy);
1257
+ }
1125
1258
  const defaultSize = def.defaultSize ?? { w: 240, h: 160 };
1126
1259
  const essential = [
1127
1260
  init(Position, { x: 0, y: 0 }),
@@ -1175,6 +1308,7 @@ function defineWidget(def) {
1175
1308
  if (interaction.solid === true) capabilityTags.push(Solid);
1176
1309
  if (interaction.dragOn === "longPress") capabilityTags.push(LongPressDrag);
1177
1310
  if (interaction.sweepContained === true) capabilityTags.push(SweepsContained);
1311
+ if (interaction.keyboard === "exclusive") capabilityTags.push(KeyboardExclusive);
1178
1312
  const snap = interaction.snap ?? "target";
1179
1313
  if (snap === "source" || snap === "both") capabilityTags.push(SnapSource);
1180
1314
  if (snap === "target" || snap === "both") capabilityTags.push(SnapTarget);
@@ -1194,11 +1328,21 @@ function defineWidget(def) {
1194
1328
  animated: def.animated === true,
1195
1329
  ports: def.ports ?? [],
1196
1330
  capabilityTags,
1331
+ keyboard: interaction.keyboard ?? "shared",
1332
+ keyboardEscape: interaction.keyboardEscape ?? "release",
1197
1333
  migrate: def.migrate ?? {},
1198
1334
  previewComponent: previewDecl.component,
1199
1335
  ...previewDecl.props !== void 0 ? { previewProps: previewDecl.props } : {}
1200
1336
  };
1201
1337
  registry2.set(def.type, widget);
1338
+ for (const decl of renameDecls) {
1339
+ renameRegistry.set(decl.type, {
1340
+ widget,
1341
+ oldType: decl.type,
1342
+ atVersion: decl.atVersion ?? 1,
1343
+ legacyGroups: legacyByOld.get(decl.type)
1344
+ });
1345
+ }
1202
1346
  return widget;
1203
1347
  }
1204
1348
 
@@ -2389,7 +2533,7 @@ var DEFAULT_SPAWN_PROFILES = {
2389
2533
  var anyKindQ = defineQuery7([Any(Tap, LongPress, Drag, Pinch, WheelPan, WheelZoom)]);
2390
2534
  var downQ = defineQuery7([Pointer, WentDown, Not(HandledByWidget), LocalPointer]);
2391
2535
  var heldTouchQ = defineQuery7([Pointer, PointerButtons, LocalPointer]);
2392
- var wheelSourceQ = defineQuery7([Pointer, PointerWheel, LocalPointer]);
2536
+ var wheelSourceQ = defineQuery7([Pointer, PointerWheel, LocalPointer, Not(WheelHandled)]);
2393
2537
  var tapQ = defineQuery7([Tap, Not(GestureSuspended)]);
2394
2538
  var longPressQ = defineQuery7([LongPress, Not(GestureSuspended)]);
2395
2539
  var dragQ = defineQuery7([Drag, Not(GestureSuspended)]);
@@ -2823,7 +2967,8 @@ function createL2Systems({ world, profiles = DEFAULT_SPAWN_PROFILES }) {
2823
2967
  const screen = ctx.read(pointer, PointerScreen);
2824
2968
  const down = ctx.read(e, Down);
2825
2969
  const isZoom = ctx.has(e, WheelZoom);
2826
- const active = isZoom ? wheel.pinch !== 0 : wheel.dx !== 0 || wheel.dy !== 0;
2970
+ const ceded = ctx.hasTag(pointer, WheelHandled);
2971
+ const active = !ceded && (isZoom ? wheel.pinch !== 0 : wheel.dx !== 0 || wheel.dy !== 0);
2827
2972
  if (active) {
2828
2973
  if (isZoom) {
2829
2974
  ctx.edit(e).set(WheelZoom, { pinch: wheel.pinch, anchorX: screen.x, anchorY: screen.y });
@@ -3776,6 +3921,7 @@ function createCleanupSystems(world) {
3776
3921
  if (ctx.hasTag(e, WentUp)) ctx.removeTag(e, WentUp);
3777
3922
  if (ctx.hasTag(e, WentCancelled)) ctx.removeTag(e, WentCancelled);
3778
3923
  if (ctx.hasTag(e, HandledByWidget)) ctx.removeTag(e, HandledByWidget);
3924
+ if (ctx.hasTag(e, WheelHandled)) ctx.removeTag(e, WheelHandled);
3779
3925
  const w = ctx.read(e, PointerWheel);
3780
3926
  if (w.dx !== 0 || w.dy !== 0 || w.pinch !== 0) {
3781
3927
  ctx.edit(e).set(PointerWheel, { dx: 0, dy: 0, pinch: 0 });
@@ -3869,7 +4015,8 @@ function createL0Systems(world, queue) {
3869
4015
  wheelDx: 0,
3870
4016
  wheelDy: 0,
3871
4017
  wheelPinch: 0,
3872
- hasWheel: false
4018
+ hasWheel: false,
4019
+ wheelHandled: false
3873
4020
  };
3874
4021
  samples.set(ev.pointerId, s);
3875
4022
  }
@@ -3891,6 +4038,7 @@ function createL0Systems(world, queue) {
3891
4038
  s.wheelDy += ev.wheel.dy;
3892
4039
  s.wheelPinch += ev.wheel.pinch;
3893
4040
  s.hasWheel = true;
4041
+ if (ev.wheelHandled === true) s.wheelHandled = true;
3894
4042
  }
3895
4043
  if (ev.surfaceHandled === true) s.handled = true;
3896
4044
  if (ev.overInteractive !== void 0) s.overInteractive = ev.overInteractive;
@@ -3915,6 +4063,7 @@ function createL0Systems(world, queue) {
3915
4063
  if (s.wentUp) ctx.addTag(spawned, WentUp);
3916
4064
  if (s.wentCancelled) ctx.addTag(spawned, WentCancelled);
3917
4065
  if (s.handled) ctx.addTag(spawned, HandledByWidget);
4066
+ if (s.wheelHandled) ctx.addTag(spawned, WheelHandled);
3918
4067
  if (s.overInteractive === true) ctx.addTag(spawned, OverInteractive);
3919
4068
  byId.set(id, spawned);
3920
4069
  continue;
@@ -3940,6 +4089,7 @@ function createL0Systems(world, queue) {
3940
4089
  if (s.wentUp) ctx.addTag(existing, WentUp);
3941
4090
  if (s.wentCancelled) ctx.addTag(existing, WentCancelled);
3942
4091
  if (s.handled) ctx.addTag(existing, HandledByWidget);
4092
+ if (s.wheelHandled) ctx.addTag(existing, WheelHandled);
3943
4093
  if (s.overInteractive !== void 0 && s.overInteractive !== ctx.hasTag(existing, OverInteractive)) {
3944
4094
  if (s.overInteractive) ctx.addTag(existing, OverInteractive);
3945
4095
  else ctx.removeTag(existing, OverInteractive);
@@ -5300,6 +5450,28 @@ function installInteractionStack(engine, opts = {}) {
5300
5450
  };
5301
5451
  }
5302
5452
 
5453
+ // ../core/src/interaction/gesture-status.ts
5454
+ import { Any as Any4, defineQuery as defineQuery25 } from "@vibecook/strata-ecs";
5455
+ var gestureQ = defineQuery25([Any4(Tap, LongPress, Drag, Pinch, WheelPan, WheelZoom)]);
5456
+ var P13 = GesturePhases;
5457
+ function anyGestureNonTerminal(world) {
5458
+ let active = false;
5459
+ world.query(gestureQ).each((b) => {
5460
+ for (const r of b) {
5461
+ const e = b.entity(r);
5462
+ const terminal = world.hasTag(e, P13.tags.Failed) || world.hasTag(e, P13.tags.Cancelled) || world.hasTag(e, P13.tags.Ended) || world.hasTag(e, P13.tags.Recognized) && world.has(e, Tap);
5463
+ if (!terminal) {
5464
+ active = true;
5465
+ return;
5466
+ }
5467
+ }
5468
+ });
5469
+ return active;
5470
+ }
5471
+ function isMidGesture(world) {
5472
+ return world.getResource(Camera)?.gesturing === true || anyGestureNonTerminal(world);
5473
+ }
5474
+
5303
5475
  // ../core/src/doc/envelope.ts
5304
5476
  var ENVELOPE_MAGIC = "ICE1";
5305
5477
  var ENVELOPE_VERSION = 1;
@@ -5358,6 +5530,7 @@ function decodeEnvelope(bytes) {
5358
5530
  // ../core/src/doc/version-gate.ts
5359
5531
  var SCHEMA_PREFIX = "engine.schema.";
5360
5532
  var PACK_PREFIX = "engine.pack.";
5533
+ var RENAMED_PREFIX = "engine.renamed.";
5361
5534
  function stampEngineMeta(store) {
5362
5535
  store.metaTransaction((meta) => {
5363
5536
  const stamp = (key) => {
@@ -5370,14 +5543,50 @@ function stampEngineMeta(store) {
5370
5543
  }
5371
5544
  });
5372
5545
  }
5546
+ function foldRenames(rawPacks, tombstoned) {
5547
+ const docPacks = {};
5548
+ const renamedInDoc = {};
5549
+ for (const [id, v] of Object.entries(rawPacks)) {
5550
+ if (tombstoned.has(id)) continue;
5551
+ const rename = renames.get(id);
5552
+ if (rename !== void 0) {
5553
+ renamedInDoc[id] = Math.max(renamedInDoc[id] ?? 0, v);
5554
+ const target = rename.widget.type;
5555
+ docPacks[target] = Math.max(docPacks[target] ?? 0, v);
5556
+ continue;
5557
+ }
5558
+ docPacks[id] = Math.max(docPacks[id] ?? 0, v);
5559
+ }
5560
+ return { docPacks, renamedInDoc };
5561
+ }
5562
+ function compare(docPacks, localPacks) {
5563
+ const newerInDoc = [];
5564
+ const olderInDoc = [];
5565
+ for (const [id, v] of Object.entries(docPacks)) {
5566
+ const local = localPacks[id];
5567
+ if (local === void 0 || v > local) newerInDoc.push(id);
5568
+ else if (v < local) olderInDoc.push(id);
5569
+ }
5570
+ return { newerInDoc, olderInDoc };
5571
+ }
5572
+ function localPackVersions() {
5573
+ const localPacks = {};
5574
+ for (const p2 of prefabs.all()) {
5575
+ if (p2.store === "durable") localPacks[p2.id] = p2.version ?? 1;
5576
+ }
5577
+ return localPacks;
5578
+ }
5373
5579
  function readDocVersionReport(doc) {
5374
5580
  const meta = doc.getMap("meta");
5375
5581
  let docSchema = 0;
5376
- const docPacks = {};
5582
+ const rawPacks = {};
5583
+ const tombstoned = /* @__PURE__ */ new Set();
5377
5584
  for (const key of meta.keys()) {
5378
5585
  if (key.startsWith(SCHEMA_PREFIX)) {
5379
5586
  const n = Number(key.slice(SCHEMA_PREFIX.length));
5380
5587
  if (Number.isInteger(n) && n > docSchema) docSchema = n;
5588
+ } else if (key.startsWith(RENAMED_PREFIX)) {
5589
+ tombstoned.add(key.slice(RENAMED_PREFIX.length));
5381
5590
  } else if (key.startsWith(PACK_PREFIX)) {
5382
5591
  const rest = key.slice(PACK_PREFIX.length);
5383
5592
  const dot = rest.lastIndexOf(".");
@@ -5385,56 +5594,42 @@ function readDocVersionReport(doc) {
5385
5594
  const id = rest.slice(0, dot);
5386
5595
  const v = Number(rest.slice(dot + 1));
5387
5596
  if (!Number.isInteger(v)) continue;
5388
- if ((docPacks[id] ?? 0) < v) docPacks[id] = v;
5597
+ if ((rawPacks[id] ?? 0) < v) rawPacks[id] = v;
5389
5598
  }
5390
5599
  }
5391
- const localPacks = {};
5392
- for (const p2 of prefabs.all()) {
5393
- if (p2.store === "durable") localPacks[p2.id] = p2.version ?? 1;
5394
- }
5395
- const newerInDoc = [];
5396
- const olderInDoc = [];
5397
- for (const [id, v] of Object.entries(docPacks)) {
5398
- const local = localPacks[id];
5399
- if (local === void 0 || v > local) newerInDoc.push(id);
5400
- else if (v < local) olderInDoc.push(id);
5401
- }
5402
- return { docSchema, localSchema: ENGINE_SCHEMA_VERSION, docPacks, localPacks, newerInDoc, olderInDoc };
5600
+ const localPacks = localPackVersions();
5601
+ const { docPacks, renamedInDoc } = foldRenames(rawPacks, tombstoned);
5602
+ const { newerInDoc, olderInDoc } = compare(docPacks, localPacks);
5603
+ return { docSchema, localSchema: ENGINE_SCHEMA_VERSION, docPacks, localPacks, newerInDoc, olderInDoc, renamedInDoc };
5403
5604
  }
5404
5605
  function readEnvelopeVersionReport(header) {
5405
- const localPacks = {};
5406
- for (const p2 of prefabs.all()) {
5407
- if (p2.store === "durable") localPacks[p2.id] = p2.version ?? 1;
5408
- }
5409
- const docPacks = { ...header.prefabVersions };
5410
- const newerInDoc = [];
5411
- const olderInDoc = [];
5412
- for (const [id, version] of Object.entries(docPacks)) {
5413
- const local = localPacks[id];
5414
- if (local === void 0 || version > local) newerInDoc.push(id);
5415
- else if (version < local) olderInDoc.push(id);
5416
- }
5606
+ const localPacks = localPackVersions();
5607
+ const { docPacks, renamedInDoc } = foldRenames(header.prefabVersions, /* @__PURE__ */ new Set());
5608
+ const { newerInDoc, olderInDoc } = compare(docPacks, localPacks);
5417
5609
  return {
5418
5610
  docSchema: header.engineSchema,
5419
5611
  localSchema: ENGINE_SCHEMA_VERSION,
5420
5612
  docPacks,
5421
5613
  localPacks,
5422
5614
  newerInDoc,
5423
- olderInDoc
5615
+ olderInDoc,
5616
+ renamedInDoc
5424
5617
  };
5425
5618
  }
5426
5619
  function gateVerdict(report) {
5427
5620
  if (report.docSchema === 0) return "reject";
5428
5621
  if (report.docSchema > report.localSchema) return "readOnly";
5429
5622
  if (report.newerInDoc.length > 0) return "readOnly";
5430
- if (report.docSchema < report.localSchema || report.olderInDoc.length > 0) return "migrate";
5623
+ if (report.docSchema < report.localSchema || report.olderInDoc.length > 0 || Object.keys(report.renamedInDoc).length > 0) {
5624
+ return "migrate";
5625
+ }
5431
5626
  return "ok";
5432
5627
  }
5433
5628
 
5434
5629
  // ../core/src/doc/migrate.ts
5435
- import { defineQuery as defineQuery25 } from "@vibecook/strata-ecs";
5630
+ import { defineQuery as defineQuery26 } from "@vibecook/strata-ecs";
5436
5631
  var PACK_PREFIX2 = "engine.pack.";
5437
- var allDurableQ = defineQuery25([PrefabId]);
5632
+ var allDurableQ = defineQuery26([PrefabId]);
5438
5633
  function runMigrations(ctx, report) {
5439
5634
  const { store, world } = ctx;
5440
5635
  const migrated = [];
@@ -5511,11 +5706,200 @@ function runMigrations(ctx, report) {
5511
5706
  import { LoroDoc } from "loro-crdt";
5512
5707
  import { attachDurable, createDurableStore } from "@vibecook/strata-ecs/durable";
5513
5708
 
5709
+ // ../core/src/doc/rename.ts
5710
+ import { defineQuery as defineQuery27 } from "@vibecook/strata-ecs";
5711
+ var PACK_PREFIX3 = "engine.pack.";
5712
+ var RENAMED_PREFIX2 = "engine.renamed.";
5713
+ var allDurableQ2 = defineQuery27([PrefabId]);
5714
+ function runRenames(ctx, report) {
5715
+ const { store, world } = ctx;
5716
+ const renamed = [];
5717
+ for (const [oldId, docOldV] of Object.entries(report.renamedInDoc)) {
5718
+ const entry = renames.get(oldId);
5719
+ if (entry === void 0) continue;
5720
+ const { widget, legacyGroups } = entry;
5721
+ const plans = [];
5722
+ world.query(allDurableQ2).each((batch) => {
5723
+ for (const row of batch) {
5724
+ const e = batch.entity(row);
5725
+ if (world.read(e, PrefabId).id !== oldId) continue;
5726
+ const legacyValues = [];
5727
+ const newPresent = [];
5728
+ for (let i = 0; i < widget.groups.length; i++) {
5729
+ const legacy = world.get(e, legacyGroups[i]);
5730
+ legacyValues.push(legacy);
5731
+ newPresent.push(world.get(e, widget.groups[i].component) !== void 0);
5732
+ }
5733
+ plans.push({ e, legacyValues, newPresent });
5734
+ }
5735
+ });
5736
+ if (plans.length > 0) {
5737
+ store.transaction(
5738
+ (tx) => {
5739
+ for (const { e, legacyValues, newPresent } of plans) {
5740
+ tx.edit(e).set(PrefabId, { id: widget.type });
5741
+ for (let i = 0; i < widget.groups.length; i++) {
5742
+ const value = legacyValues[i];
5743
+ if (value === void 0) continue;
5744
+ if (!newPresent[i]) {
5745
+ tx.addComponent(e, widget.groups[i].component, value);
5746
+ }
5747
+ tx.removeComponent(e, legacyGroups[i]);
5748
+ }
5749
+ }
5750
+ },
5751
+ { undoable: false }
5752
+ );
5753
+ }
5754
+ store.metaTransaction((meta) => {
5755
+ const tomb = `${RENAMED_PREFIX2}${oldId}`;
5756
+ if (meta.get(tomb) === void 0) meta.set(tomb, widget.type);
5757
+ const pack = `${PACK_PREFIX3}${widget.type}.${docOldV}`;
5758
+ if (meta.get(pack) === void 0) meta.set(pack, true);
5759
+ });
5760
+ renamed.push(oldId);
5761
+ }
5762
+ return { renamed };
5763
+ }
5764
+
5765
+ // ../core/src/doc/rename-sweep.ts
5766
+ import { Any as Any5, defineQuery as defineQuery28 } from "@vibecook/strata-ecs";
5767
+ var RENAMED_PREFIX3 = "engine.renamed.";
5768
+ var prefabQ = defineQuery28([PrefabId]);
5769
+ var legacyQByEntry = /* @__PURE__ */ new WeakMap();
5770
+ function legacyQueryOf(entry) {
5771
+ if (entry.legacyGroups.length === 0) return void 0;
5772
+ let q = legacyQByEntry.get(entry);
5773
+ if (q === void 0) {
5774
+ q = entry.legacyGroups.length === 1 ? defineQuery28([entry.legacyGroups[0]]) : defineQuery28([Any5(...entry.legacyGroups)]);
5775
+ legacyQByEntry.set(entry, q);
5776
+ }
5777
+ return q;
5778
+ }
5779
+ function chainCovered(entry) {
5780
+ for (let v = entry.atVersion; v < entry.widget.version; v++) {
5781
+ if (typeof entry.widget.migrate[v] !== "function") return false;
5782
+ }
5783
+ return true;
5784
+ }
5785
+ function armRenameSweep(world, store) {
5786
+ const entries = renames.all();
5787
+ if (entries.length === 0) return () => {
5788
+ };
5789
+ let pending = false;
5790
+ let disposed = false;
5791
+ const warnedGap = /* @__PURE__ */ new Set();
5792
+ const sweep = () => {
5793
+ for (const entry of entries) {
5794
+ const { widget, legacyGroups, oldType } = entry;
5795
+ const covered = chainCovered(entry);
5796
+ const seen = /* @__PURE__ */ new Set();
5797
+ const plans = [];
5798
+ const consider = (e) => {
5799
+ if (seen.has(e)) return;
5800
+ seen.add(e);
5801
+ const id = world.get(e, PrefabId)?.id;
5802
+ const rewriteId = id === oldType;
5803
+ let anyLegacy = false;
5804
+ const flat = {};
5805
+ const removeLegacy = [];
5806
+ for (let i = 0; i < widget.groups.length; i++) {
5807
+ const legacy = world.get(e, legacyGroups[i]);
5808
+ if (legacy === void 0) continue;
5809
+ anyLegacy = true;
5810
+ Object.assign(flat, legacy);
5811
+ removeLegacy.push(legacyGroups[i]);
5812
+ }
5813
+ if (!rewriteId && !anyLegacy) return;
5814
+ if (!rewriteId && anyLegacy && id !== widget.type) return;
5815
+ if (anyLegacy && !covered) {
5816
+ if (!warnedGap.has(oldType)) {
5817
+ warnedGap.add(oldType);
5818
+ console.warn(
5819
+ `ice: rename sweep \u2014 "${oldType}" values are at pack v${entry.atVersion} but "${widget.type}"'s migrate chain has a gap; leaving legacy cells in place (design-008 \xA76.3).`
5820
+ );
5821
+ }
5822
+ return;
5823
+ }
5824
+ let folded = flat;
5825
+ for (let v = entry.atVersion; v < widget.version; v++) {
5826
+ const step = widget.migrate[v];
5827
+ if (typeof step === "function") folded = step(folded);
5828
+ }
5829
+ const writeGroups = [];
5830
+ if (anyLegacy) {
5831
+ for (let i = 0; i < widget.groups.length; i++) {
5832
+ const present = world.get(e, widget.groups[i].component) !== void 0;
5833
+ if (!present) writeGroups.push(i);
5834
+ }
5835
+ }
5836
+ plans.push({ e, rewriteId, folded, writeGroups, removeLegacy });
5837
+ };
5838
+ if (legacyGroups.length === 0) {
5839
+ world.query(prefabQ).each((batch) => {
5840
+ for (const row of batch) {
5841
+ const e = batch.entity(row);
5842
+ if (world.read(e, PrefabId).id === oldType) consider(e);
5843
+ }
5844
+ });
5845
+ }
5846
+ const legacyQ = legacyQueryOf(entry);
5847
+ if (legacyQ !== void 0) {
5848
+ world.query(legacyQ).each((batch) => {
5849
+ for (const row of batch) consider(batch.entity(row));
5850
+ });
5851
+ }
5852
+ if (plans.length === 0) continue;
5853
+ store.transaction(
5854
+ (tx) => {
5855
+ for (const plan of plans) {
5856
+ if (plan.rewriteId) tx.edit(plan.e).set(PrefabId, { id: widget.type });
5857
+ for (const i of plan.writeGroups) {
5858
+ tx.addComponent(plan.e, widget.groups[i].component, plan.folded);
5859
+ }
5860
+ for (const legacy of plan.removeLegacy) tx.removeComponent(plan.e, legacy);
5861
+ }
5862
+ },
5863
+ { undoable: false }
5864
+ );
5865
+ store.metaTransaction((meta) => {
5866
+ const tomb = `${RENAMED_PREFIX3}${oldType}`;
5867
+ if (meta.get(tomb) === void 0) meta.set(tomb, widget.type);
5868
+ });
5869
+ }
5870
+ };
5871
+ const schedule = () => {
5872
+ if (pending || disposed) return;
5873
+ pending = true;
5874
+ queueMicrotask(() => {
5875
+ pending = false;
5876
+ if (!disposed) sweep();
5877
+ });
5878
+ };
5879
+ const watchers = [];
5880
+ let anyZeroProp = false;
5881
+ for (const entry of entries) {
5882
+ const q = legacyQueryOf(entry);
5883
+ if (q !== void 0) {
5884
+ watchers.push(world.reactive.observeQuery(q, schedule, { cols: [...entry.legacyGroups] }));
5885
+ } else {
5886
+ anyZeroProp = true;
5887
+ }
5888
+ }
5889
+ if (anyZeroProp) {
5890
+ watchers.push(world.reactive.observeQuery(prefabQ, schedule, { cols: [PrefabId] }));
5891
+ }
5892
+ return () => {
5893
+ disposed = true;
5894
+ for (const u of watchers) u();
5895
+ };
5896
+ }
5897
+
5514
5898
  // ../core/src/doc/schema-migrate.ts
5515
- import { defineQuery as defineQuery26 } from "@vibecook/strata-ecs";
5899
+ import { defineQuery as defineQuery29 } from "@vibecook/strata-ecs";
5516
5900
  var SCHEMA_PREFIX2 = "engine.schema.";
5517
5901
  var BOARD_ROOT_META = "engine.boardRoot";
5518
- var allDurableQ2 = defineQuery26([PrefabId]);
5902
+ var allDurableQ3 = defineQuery29([PrefabId]);
5519
5903
  function ensureBoardRoot(world, store) {
5520
5904
  let recorded;
5521
5905
  store.metaTransaction((meta) => {
@@ -5553,7 +5937,7 @@ function migrateToOrderedRelations(ctx) {
5553
5937
  const { store, world } = ctx;
5554
5938
  const root = ensureBoardRoot(world, store);
5555
5939
  const groups = /* @__PURE__ */ new Map();
5556
- world.query(allDurableQ2).each((batch) => {
5940
+ world.query(allDurableQ3).each((batch) => {
5557
5941
  for (const row of batch) {
5558
5942
  const e = batch.entity(row);
5559
5943
  if (e === root) continue;
@@ -5627,6 +6011,7 @@ function makeSession(world, doc, store, attachment, readOnly, report) {
5627
6011
  mayDiverge: makeDefaultMayDiverge(world),
5628
6012
  cellInDoc: (e, c) => store.getComponent(e, c) !== void 0
5629
6013
  });
6014
+ const disarmRenameSweep = readOnly ? void 0 : armRenameSweep(world, store);
5630
6015
  let closed = false;
5631
6016
  const remoteSubs = /* @__PURE__ */ new Set();
5632
6017
  return {
@@ -5658,6 +6043,7 @@ function makeSession(world, doc, store, attachment, readOnly, report) {
5658
6043
  close() {
5659
6044
  if (closed) return;
5660
6045
  closed = true;
6046
+ disarmRenameSweep?.();
5661
6047
  cancelActiveGestures(world);
5662
6048
  store.setHistoryHooks(null);
5663
6049
  remoteSubs.clear();
@@ -5726,6 +6112,8 @@ function openDocSession(world, bytes, opts = {}) {
5726
6112
  if (verdict === "migrate" && (opts.migrate ?? true)) {
5727
6113
  try {
5728
6114
  runSchemaMigrations({ store, world }, report);
6115
+ const renamed = runRenames({ store, world }, report);
6116
+ if (renamed.renamed.length > 0) world.sync();
5729
6117
  runMigrations({ store, world }, readDocVersionReport(doc));
5730
6118
  effectiveReport = readDocVersionReport(doc);
5731
6119
  readOnly = gateVerdict(effectiveReport) !== "ok";
@@ -5880,8 +6268,8 @@ var p = {
5880
6268
  };
5881
6269
 
5882
6270
  // ../core/src/widget/equip.ts
5883
- import { Not as Not4, defineQuery as defineQuery27, defineSystem as defineSystem17 } from "@vibecook/strata-ecs";
5884
- var unequippedQ = defineQuery27([PrefabId, Not4(WidgetEquipped)]);
6271
+ import { Not as Not4, defineQuery as defineQuery30, defineSystem as defineSystem17 } from "@vibecook/strata-ecs";
6272
+ var unequippedQ = defineQuery30([PrefabId, Not4(WidgetEquipped)]);
5885
6273
  function createWidgetEquipSystem() {
5886
6274
  return defineSystem17(
5887
6275
  unequippedQ,
@@ -5975,8 +6363,8 @@ function createMeasureIngest(world, queue) {
5975
6363
  }
5976
6364
 
5977
6365
  // ../core/src/widget/mount-store.ts
5978
- import { Not as Not5, defineQuery as defineQuery29, defineTickSystem as defineTickSystem13 } from "@vibecook/strata-ecs";
5979
- var widgetQ = defineQuery29([Position, Size, WidgetEquipped, Active]);
6366
+ import { Not as Not5, defineQuery as defineQuery32, defineTickSystem as defineTickSystem13 } from "@vibecook/strata-ecs";
6367
+ var widgetQ = defineQuery32([Position, Size, WidgetEquipped, Active]);
5980
6368
  function createWidgetRuntime(world, opts = {}) {
5981
6369
  const budget = opts.keepMounted ?? RUNTIME_BUDGETS.keepMountedWidgets;
5982
6370
  let lastWin = null;
@@ -6059,8 +6447,8 @@ function createWidgetRuntime(world, opts = {}) {
6059
6447
  let snapshot = [];
6060
6448
  let dirty = false;
6061
6449
  const listeners = /* @__PURE__ */ new Set();
6062
- const visibleWidgetsQ = defineQuery29([Position, Size, WidgetEquipped, Active, Visible]);
6063
- const culledWidgetsQ = defineQuery29([Position, Size, WidgetEquipped, Not5(Visible)]);
6450
+ const visibleWidgetsQ = defineQuery32([Position, Size, WidgetEquipped, Active, Visible]);
6451
+ const culledWidgetsQ = defineQuery32([Position, Size, WidgetEquipped, Not5(Visible)]);
6064
6452
  const mountGuard = makeChurnGuard(world, { tags: [Visible, Culled], coarse: false });
6065
6453
  const mountSystem = defineTickSystem13(
6066
6454
  (ctx) => {
@@ -6204,23 +6592,6 @@ var DEFAULT_SNAP_GUIDES_CONFIG = {
6204
6592
  };
6205
6593
 
6206
6594
  // ../core/src/doc/autosave.ts
6207
- import { Any as Any4, defineQuery as defineQuery30 } from "@vibecook/strata-ecs";
6208
- var gestureQ = defineQuery30([Any4(Tap, LongPress, Drag, Pinch, WheelPan, WheelZoom)]);
6209
- var P13 = GesturePhases;
6210
- function anyGestureNonTerminal(world) {
6211
- let active = false;
6212
- world.query(gestureQ).each((b) => {
6213
- for (const r of b) {
6214
- const e = b.entity(r);
6215
- const terminal = world.hasTag(e, P13.tags.Failed) || world.hasTag(e, P13.tags.Cancelled) || world.hasTag(e, P13.tags.Ended) || world.hasTag(e, P13.tags.Recognized) && world.has(e, Tap);
6216
- if (!terminal) {
6217
- active = true;
6218
- return;
6219
- }
6220
- }
6221
- });
6222
- return active;
6223
- }
6224
6595
  function defaultSchedule(fn, ms) {
6225
6596
  const id = setTimeout(fn, ms);
6226
6597
  return () => clearTimeout(id);
@@ -6251,7 +6622,7 @@ function startAutosave(session, opts) {
6251
6622
  let pendingUpdates = [];
6252
6623
  let writing = false;
6253
6624
  let writeInFlight = Promise.resolve();
6254
- const deferred = () => world.getResource(Camera)?.gesturing === true || anyGestureNonTerminal(world);
6625
+ const deferred = () => isMidGesture(world);
6255
6626
  const clearTimer = () => {
6256
6627
  if (cancelTimer !== void 0) {
6257
6628
  cancelTimer();
@@ -6553,10 +6924,10 @@ function attachPresence(world, opts) {
6553
6924
  }
6554
6925
 
6555
6926
  // ../core/src/presence/publish.ts
6556
- import { defineQuery as defineQuery31 } from "@vibecook/strata-ecs";
6927
+ import { defineQuery as defineQuery33 } from "@vibecook/strata-ecs";
6557
6928
  var SELECTION_KEY_CAP = 32;
6558
6929
  var COUNT_MAX = 65535;
6559
- var localMouseQ = defineQuery31([Pointer, LocalPointer, PointerWorld]);
6930
+ var localMouseQ = defineQuery33([Pointer, LocalPointer, PointerWorld]);
6560
6931
  function createPresencePublish(world, session, opts = {}) {
6561
6932
  const { eph } = session;
6562
6933
  const keyOf = opts.keyOf;
@@ -6650,9 +7021,9 @@ function summaryEquals(a, b) {
6650
7021
  }
6651
7022
 
6652
7023
  // ../core/src/presence/remote-cursors.ts
6653
- import { Not as Not6, defineQuery as defineQuery32, defineTickSystem as defineTickSystem14 } from "@vibecook/strata-ecs";
7024
+ import { Not as Not6, defineQuery as defineQuery34, defineTickSystem as defineTickSystem14 } from "@vibecook/strata-ecs";
6654
7025
  import { Local } from "@vibecook/strata-ecs";
6655
- var remotePeerCursorsQ = defineQuery32([PresenceCursor, PresencePeer, Not6(Local)]);
7026
+ var remotePeerCursorsQ = defineQuery34([PresenceCursor, PresencePeer, Not6(Local)]);
6656
7027
  function createRemoteCursorsSystem(_world) {
6657
7028
  const pool = /* @__PURE__ */ new Map();
6658
7029
  return defineTickSystem14(
@@ -7036,7 +7407,7 @@ function webSocketByteChannel(ws) {
7036
7407
  }
7037
7408
 
7038
7409
  // ../core/src/facade/create-canvas-engine.ts
7039
- import { createWorld, defineQuery as defineQuery33 } from "@vibecook/strata-ecs";
7410
+ import { createWorld, defineQuery as defineQuery35 } from "@vibecook/strata-ecs";
7040
7411
 
7041
7412
  // ../core/src/ops/insert.ts
7042
7413
  var IDENTITY_CAM5 = { x: 0, y: 0, zoom: 1 };
@@ -7092,7 +7463,7 @@ function createForwardingSink() {
7092
7463
  }
7093
7464
  };
7094
7465
  }
7095
- var selectableWidgetsQ = defineQuery33([Position, Size, Selectable, Active, WidgetEquipped]);
7466
+ var selectableWidgetsQ = defineQuery35([Position, Size, Selectable, Active, WidgetEquipped]);
7096
7467
  function createCanvasEngine(opts = {}) {
7097
7468
  registerBuiltinTools();
7098
7469
  for (const w of opts.widgets ?? []) {
@@ -7439,6 +7810,14 @@ function createCanvasEngine(opts = {}) {
7439
7810
  isBackgrounded: () => stageHolds.size > 0,
7440
7811
  holds: () => [...stageHolds.values()]
7441
7812
  };
7813
+ engine.frame.settleWhile("gestures", () => isMidGesture(world));
7814
+ engine.frame.onChange(() => {
7815
+ if (engine.frame.isFrozen()) {
7816
+ cancelActiveGestures(world);
7817
+ return;
7818
+ }
7819
+ stack.queue.drain();
7820
+ });
7442
7821
  return {
7443
7822
  world,
7444
7823
  engine,
@@ -7448,6 +7827,7 @@ function createCanvasEngine(opts = {}) {
7448
7827
  ops,
7449
7828
  docs,
7450
7829
  stage,
7830
+ frame: engine.frame,
7451
7831
  budgets,
7452
7832
  step: (now) => engine.step(now),
7453
7833
  dispose() {
@@ -7461,11 +7841,11 @@ function createCanvasEngine(opts = {}) {
7461
7841
  // ../core/src/index.ts
7462
7842
  import {
7463
7843
  All,
7464
- Any as Any5,
7844
+ Any as Any6,
7465
7845
  Not as Not7,
7466
7846
  Related as Related2,
7467
7847
  createWorld as createWorld2,
7468
- defineQuery as defineQuery34,
7848
+ defineQuery as defineQuery36,
7469
7849
  defineSystem as defineSystem19,
7470
7850
  defineTickSystem as defineTickSystem15,
7471
7851
  enumOf as enumOf8,
@@ -7502,9 +7882,35 @@ export {
7502
7882
  PHASE_GROUPS,
7503
7883
  createPipelineRegistry,
7504
7884
  createReflectorRegistry,
7505
- createEngine,
7885
+ Camera,
7886
+ Viewport,
7887
+ ActiveTool,
7888
+ StageMode,
7889
+ FrameMode,
7890
+ SnapConfig,
7891
+ ContainerCamera,
7892
+ Active,
7893
+ Visible,
7894
+ Culled,
7895
+ WidgetBreakpoint,
7896
+ MeasuredSize,
7897
+ SelectionBox,
7898
+ HandleSpec,
7899
+ GuideLine,
7900
+ SpacingBar,
7901
+ MarqueeBox,
7902
+ CursorVisual,
7903
+ Follows,
7904
+ VisualOf,
7905
+ NavDepth,
7906
+ NavCamera,
7907
+ NavFrame,
7908
+ CanvasSurface,
7506
7909
  setDevGuards,
7507
7910
  devGuardsEnabled,
7911
+ SETTLE_CAP,
7912
+ createFrameControl,
7913
+ createEngine,
7508
7914
  createLiveWriter,
7509
7915
  guardedTransaction,
7510
7916
  writeRuntimeResource,
@@ -7536,6 +7942,7 @@ export {
7536
7942
  WentUp,
7537
7943
  WentCancelled,
7538
7944
  HandledByWidget,
7945
+ WheelHandled,
7539
7946
  OverInteractive,
7540
7947
  LocalPointer,
7541
7948
  PointerWorld,
@@ -7596,33 +8003,11 @@ export {
7596
8003
  SnapSource,
7597
8004
  SnapTarget,
7598
8005
  SweepsContained,
8006
+ KeyboardExclusive,
7599
8007
  PresencePeer,
7600
8008
  PresenceInfo,
7601
8009
  PresenceCursor,
7602
8010
  SelectionSummary,
7603
- Camera,
7604
- Viewport,
7605
- ActiveTool,
7606
- StageMode,
7607
- SnapConfig,
7608
- ContainerCamera,
7609
- Active,
7610
- Visible,
7611
- Culled,
7612
- WidgetBreakpoint,
7613
- MeasuredSize,
7614
- SelectionBox,
7615
- HandleSpec,
7616
- GuideLine,
7617
- SpacingBar,
7618
- MarqueeBox,
7619
- CursorVisual,
7620
- Follows,
7621
- VisualOf,
7622
- NavDepth,
7623
- NavCamera,
7624
- NavFrame,
7625
- CanvasSurface,
7626
8011
  ChromeSettings,
7627
8012
  GestureSettings,
7628
8013
  PointerSettings,
@@ -7635,6 +8020,7 @@ export {
7635
8020
  makeVersionGuard,
7636
8021
  WidgetEquipped,
7637
8022
  widgets,
8023
+ renames,
7638
8024
  defineWidget,
7639
8025
  selectedEntities,
7640
8026
  setSelection,
@@ -7684,6 +8070,8 @@ export {
7684
8070
  ensureCanvasSurface,
7685
8071
  installInteractionCore,
7686
8072
  installInteractionStack,
8073
+ anyGestureNonTerminal,
8074
+ isMidGesture,
7687
8075
  ENVELOPE_MAGIC,
7688
8076
  ENVELOPE_VERSION,
7689
8077
  ENGINE_SCHEMA_VERSION,
@@ -7721,11 +8109,11 @@ export {
7721
8109
  createCanvasEngine,
7722
8110
  CORE_VERSION,
7723
8111
  All,
7724
- Any5 as Any,
8112
+ Any6 as Any,
7725
8113
  Not7 as Not,
7726
8114
  Related2 as Related,
7727
8115
  createWorld2 as createWorld,
7728
- defineQuery34 as defineQuery,
8116
+ defineQuery36 as defineQuery,
7729
8117
  defineSystem19 as defineSystem,
7730
8118
  defineTickSystem15 as defineTickSystem,
7731
8119
  enumOf8 as enumOf,
@@ -7733,4 +8121,4 @@ export {
7733
8121
  Local2 as Local,
7734
8122
  DurableUndoStatus
7735
8123
  };
7736
- //# sourceMappingURL=chunk-DXU3RZZS.js.map
8124
+ //# sourceMappingURL=chunk-7LZAXQAO.js.map