@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.
- package/dist/{chunk-IASTQMU5.js → chunk-3PHPWRB2.js} +146 -11
- package/dist/chunk-3PHPWRB2.js.map +1 -0
- package/dist/{chunk-DXU3RZZS.js → chunk-7LZAXQAO.js} +649 -261
- package/dist/chunk-7LZAXQAO.js.map +1 -0
- package/dist/{chunk-5SJYHQI4.js → chunk-ENMRSITH.js} +38 -11
- package/dist/chunk-ENMRSITH.js.map +1 -0
- package/dist/devtools.js +1 -1
- package/dist/dom.js +16 -2
- package/dist/ground.js +1 -1
- package/dist/index.js +17 -1
- package/dist/r3f.js +9 -3
- package/dist/r3f.js.map +1 -1
- package/dist/react.js +5 -3
- package/dist/types/packages/core/src/catalog/camera-derived.d.ts +26 -2
- package/dist/types/packages/core/src/catalog/gesture.d.ts +1 -1
- package/dist/types/packages/core/src/catalog/pointer.d.ts +11 -0
- package/dist/types/packages/core/src/catalog/selection-presence.d.ts +10 -0
- package/dist/types/packages/core/src/doc/autosave.d.ts +34 -0
- package/dist/types/packages/core/src/doc/rename-sweep.d.ts +3 -0
- package/dist/types/packages/core/src/doc/rename.d.ts +7 -0
- package/dist/types/packages/core/src/doc/version-gate.d.ts +14 -1
- package/dist/types/packages/core/src/engine/engine.d.ts +11 -0
- package/dist/types/packages/core/src/engine/frame-control.d.ts +71 -0
- package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +9 -0
- package/dist/types/packages/core/src/index.d.ts +3 -1
- package/dist/types/packages/core/src/input/queue.d.ts +9 -0
- package/dist/types/packages/core/src/interaction/gesture-status.d.ts +13 -0
- package/dist/types/packages/core/src/schema/meta.d.ts +12 -0
- package/dist/types/packages/core/src/widget/define-widget.d.ts +61 -0
- package/dist/types/packages/dom/src/index.d.ts +2 -0
- package/dist/types/packages/dom/src/input-ownership.d.ts +52 -0
- package/dist/types/packages/dom/src/loop.d.ts +11 -0
- package/dist/types/packages/dom/src/pointer-adapter.d.ts +16 -3
- package/dist/types/packages/dom/src/widget-focus.d.ts +58 -0
- package/dist/types/packages/react/src/engine-context.d.ts +13 -0
- package/dist/types/packages/react/src/index.d.ts +1 -1
- package/dist/types/packages/react/src/infinite-canvas.d.ts +20 -2
- package/dist/types/packages/react/src/keymap.d.ts +23 -4
- package/package.json +4 -4
- package/dist/chunk-5SJYHQI4.js.map +0 -1
- package/dist/chunk-DXU3RZZS.js.map +0 -1
- 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
|
|
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:
|
|
606
|
-
var Opacity = defineComponent("Opacity", { a:
|
|
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
|
|
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:
|
|
620
|
-
index:
|
|
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:
|
|
625
|
-
y:
|
|
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:
|
|
629
|
-
var Provides = defineComponent("Provides", { list:
|
|
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
|
|
818
|
+
import { enumOf as enumOf3, field as field5 } from "@vibecook/strata-ecs";
|
|
640
819
|
var Pointer = defineComponent("Pointer", {
|
|
641
820
|
id: "string",
|
|
642
|
-
device:
|
|
643
|
-
owner:
|
|
821
|
+
device: enumOf3(["mouse", "touch", "pen"]),
|
|
822
|
+
owner: field5("string", { default: "" })
|
|
644
823
|
});
|
|
645
824
|
var PointerScreen = defineComponent("PointerScreen", {
|
|
646
|
-
x:
|
|
647
|
-
y:
|
|
825
|
+
x: field5("f32", { default: 0 }),
|
|
826
|
+
y: field5("f32", { default: 0 })
|
|
648
827
|
});
|
|
649
828
|
var PointerButtons = defineComponent("PointerButtons", {
|
|
650
|
-
buttons:
|
|
651
|
-
downX:
|
|
652
|
-
downY:
|
|
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:
|
|
833
|
+
downMs: field5("f64", { default: 0 })
|
|
655
834
|
});
|
|
656
835
|
var PointerMods = defineComponent("PointerMods", {
|
|
657
|
-
shift:
|
|
658
|
-
ctrl:
|
|
659
|
-
alt:
|
|
660
|
-
meta:
|
|
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:
|
|
664
|
-
dy:
|
|
665
|
-
pinch:
|
|
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:
|
|
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:
|
|
676
|
-
y:
|
|
855
|
+
x: field5("f64", { default: 0 }),
|
|
856
|
+
y: field5("f64", { default: 0 })
|
|
677
857
|
});
|
|
678
858
|
var Keyboard = defineResource("Keyboard", {
|
|
679
|
-
shift:
|
|
680
|
-
ctrl:
|
|
681
|
-
alt:
|
|
682
|
-
meta:
|
|
683
|
-
space:
|
|
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:
|
|
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
|
|
916
|
+
import { field as field6 } from "@vibecook/strata-ecs";
|
|
737
917
|
var Drag = defineComponent("Drag", {
|
|
738
|
-
startX:
|
|
739
|
-
startY:
|
|
740
|
-
totalX:
|
|
741
|
-
totalY:
|
|
742
|
-
velX:
|
|
743
|
-
velY:
|
|
744
|
-
zoomAtClaim:
|
|
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:
|
|
748
|
-
count:
|
|
927
|
+
downAt: field6("f64", { default: 0 }),
|
|
928
|
+
count: field6("u32", { default: 0 })
|
|
749
929
|
});
|
|
750
930
|
var LongPress = defineComponent("LongPress", {
|
|
751
|
-
downAt:
|
|
752
|
-
startX:
|
|
753
|
-
startY:
|
|
754
|
-
curX:
|
|
755
|
-
curY:
|
|
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:
|
|
759
|
-
startZoom:
|
|
760
|
-
cx:
|
|
761
|
-
cy:
|
|
762
|
-
zoomAtClaim:
|
|
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:
|
|
766
|
-
dy:
|
|
767
|
-
anchorX:
|
|
768
|
-
anchorY:
|
|
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:
|
|
772
|
-
anchorX:
|
|
773
|
-
anchorY:
|
|
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:
|
|
802
|
-
windowMs:
|
|
803
|
-
slopPx:
|
|
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:
|
|
826
|
-
dy:
|
|
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:
|
|
1017
|
+
elapsedMs: field6("f32", { default: 0 })
|
|
838
1018
|
});
|
|
839
1019
|
|
|
840
1020
|
// ../core/src/catalog/insert.ts
|
|
841
|
-
import { field as
|
|
1021
|
+
import { field as field7 } from "@vibecook/strata-ecs";
|
|
842
1022
|
var InsertGhost = defineComponent("InsertGhost", {
|
|
843
1023
|
type: "string",
|
|
844
|
-
props:
|
|
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
|
|
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
|
-
|
|
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
|
|
930
|
-
|
|
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
|
|
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
|
|
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 ((
|
|
5597
|
+
if ((rawPacks[id] ?? 0) < v) rawPacks[id] = v;
|
|
5389
5598
|
}
|
|
5390
5599
|
}
|
|
5391
|
-
const localPacks =
|
|
5392
|
-
|
|
5393
|
-
|
|
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
|
-
|
|
5407
|
-
|
|
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)
|
|
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
|
|
5630
|
+
import { defineQuery as defineQuery26 } from "@vibecook/strata-ecs";
|
|
5436
5631
|
var PACK_PREFIX2 = "engine.pack.";
|
|
5437
|
-
var allDurableQ =
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
5884
|
-
var unequippedQ =
|
|
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
|
|
5979
|
-
var widgetQ =
|
|
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 =
|
|
6063
|
-
const culledWidgetsQ =
|
|
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 = () =>
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
7844
|
+
Any as Any6,
|
|
7465
7845
|
Not as Not7,
|
|
7466
7846
|
Related as Related2,
|
|
7467
7847
|
createWorld as createWorld2,
|
|
7468
|
-
defineQuery as
|
|
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
|
-
|
|
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
|
-
|
|
8112
|
+
Any6 as Any,
|
|
7725
8113
|
Not7 as Not,
|
|
7726
8114
|
Related2 as Related,
|
|
7727
8115
|
createWorld2 as createWorld,
|
|
7728
|
-
|
|
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-
|
|
8124
|
+
//# sourceMappingURL=chunk-7LZAXQAO.js.map
|