@pixi-ui-editor/runtime-pixi 0.1.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/assets/fonts.d.ts +5 -0
- package/dist/assets/fonts.d.ts.map +1 -0
- package/dist/assets/fonts.js +50 -0
- package/dist/assets/fonts.js.map +1 -0
- package/dist/assets/sounds.d.ts +14 -0
- package/dist/assets/sounds.d.ts.map +1 -0
- package/dist/assets/sounds.js +156 -0
- package/dist/assets/sounds.js.map +1 -0
- package/dist/assets/spine.d.ts +18 -0
- package/dist/assets/spine.d.ts.map +1 -0
- package/dist/assets/spine.js +82 -0
- package/dist/assets/spine.js.map +1 -0
- package/dist/assets/textures.d.ts +15 -0
- package/dist/assets/textures.d.ts.map +1 -0
- package/dist/assets/textures.js +86 -0
- package/dist/assets/textures.js.map +1 -0
- package/dist/controls.d.ts +19 -0
- package/dist/controls.d.ts.map +1 -0
- package/dist/controls.js +55 -0
- package/dist/controls.js.map +1 -0
- package/dist/document.d.ts +8 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +22 -0
- package/dist/document.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +315 -0
- package/dist/index.test.js.map +1 -0
- package/dist/layout.d.ts +32 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +43 -0
- package/dist/layout.js.map +1 -0
- package/dist/layoutGroups.d.ts +31 -0
- package/dist/layoutGroups.d.ts.map +1 -0
- package/dist/layoutGroups.js +139 -0
- package/dist/layoutGroups.js.map +1 -0
- package/dist/particles.d.ts +139 -0
- package/dist/particles.d.ts.map +1 -0
- package/dist/particles.js +275 -0
- package/dist/particles.js.map +1 -0
- package/dist/particles.test.d.ts +2 -0
- package/dist/particles.test.d.ts.map +1 -0
- package/dist/particles.test.js +210 -0
- package/dist/particles.test.js.map +1 -0
- package/dist/scene.d.ts +41 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +147 -0
- package/dist/scene.js.map +1 -0
- package/dist/scrollView.d.ts +28 -0
- package/dist/scrollView.d.ts.map +1 -0
- package/dist/scrollView.js +38 -0
- package/dist/scrollView.js.map +1 -0
- package/dist/test.setup.d.ts +2 -0
- package/dist/test.setup.d.ts.map +1 -0
- package/dist/test.setup.js +6 -0
- package/dist/test.setup.js.map +1 -0
- package/dist/views/ButtonNodeView.d.ts +36 -0
- package/dist/views/ButtonNodeView.d.ts.map +1 -0
- package/dist/views/ButtonNodeView.js +104 -0
- package/dist/views/ButtonNodeView.js.map +1 -0
- package/dist/views/InputNodeView.d.ts +36 -0
- package/dist/views/InputNodeView.d.ts.map +1 -0
- package/dist/views/InputNodeView.js +170 -0
- package/dist/views/InputNodeView.js.map +1 -0
- package/dist/views/NodeView.d.ts +53 -0
- package/dist/views/NodeView.d.ts.map +1 -0
- package/dist/views/NodeView.js +86 -0
- package/dist/views/NodeView.js.map +1 -0
- package/dist/views/ParticleEmitterNodeView.d.ts +26 -0
- package/dist/views/ParticleEmitterNodeView.d.ts.map +1 -0
- package/dist/views/ParticleEmitterNodeView.js +101 -0
- package/dist/views/ParticleEmitterNodeView.js.map +1 -0
- package/dist/views/ParticleEmitterNodeView.test.d.ts +2 -0
- package/dist/views/ParticleEmitterNodeView.test.d.ts.map +1 -0
- package/dist/views/ParticleEmitterNodeView.test.js +148 -0
- package/dist/views/ParticleEmitterNodeView.test.js.map +1 -0
- package/dist/views/ScrollViewNodeView.d.ts +29 -0
- package/dist/views/ScrollViewNodeView.d.ts.map +1 -0
- package/dist/views/ScrollViewNodeView.js +67 -0
- package/dist/views/ScrollViewNodeView.js.map +1 -0
- package/dist/views/SpineNodeView.d.ts +8 -0
- package/dist/views/SpineNodeView.d.ts.map +1 -0
- package/dist/views/SpineNodeView.js +30 -0
- package/dist/views/SpineNodeView.js.map +1 -0
- package/dist/views/ValueControlNodeViews.d.ts +37 -0
- package/dist/views/ValueControlNodeViews.d.ts.map +1 -0
- package/dist/views/ValueControlNodeViews.js +179 -0
- package/dist/views/ValueControlNodeViews.js.map +1 -0
- package/dist/views/basic.d.ts +29 -0
- package/dist/views/basic.d.ts.map +1 -0
- package/dist/views/basic.js +92 -0
- package/dist/views/basic.js.map +1 -0
- package/dist/views/createNodeView.d.ts +13 -0
- package/dist/views/createNodeView.d.ts.map +1 -0
- package/dist/views/createNodeView.js +89 -0
- package/dist/views/createNodeView.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ParticlePool, ParticleSimulator } from "./particles.js";
|
|
3
|
+
function definition(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
id: "effect-1", name: "Effect", type: "particles", maxParticles: 8, seed: 42,
|
|
6
|
+
emission: { delay: 0, duration: 10, loop: true, rate: 0, bursts: [] },
|
|
7
|
+
particle: {
|
|
8
|
+
lifetime: { min: 0.5, max: 0.5 },
|
|
9
|
+
spawnShape: { type: "point" },
|
|
10
|
+
movement: { speed: { min: 0, max: 0 }, directionDegrees: 0, spreadDegrees: 0, accelerationX: 0, accelerationY: 0, drag: 0 },
|
|
11
|
+
visual: {
|
|
12
|
+
source: { type: "single", assetId: "asset-1" },
|
|
13
|
+
alpha: { start: 1, end: 0 },
|
|
14
|
+
scale: { start: { min: 1, max: 1 }, end: { min: 1, max: 1 } },
|
|
15
|
+
tint: { start: "#FFFFFF", end: "#FFFFFF" },
|
|
16
|
+
rotation: { initialDegrees: { min: 0, max: 0 }, angularVelocityDegrees: { min: 0, max: 0 } },
|
|
17
|
+
blendMode: "normal",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
...overrides,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function makeHooks() {
|
|
24
|
+
const created = [];
|
|
25
|
+
const destroyed = [];
|
|
26
|
+
const hooks = {
|
|
27
|
+
createRender: () => { const render = { visible: false }; created.push(render); return render; },
|
|
28
|
+
hideRender: (render) => { render.visible = false; },
|
|
29
|
+
destroyRender: (render) => { destroyed.push(render); },
|
|
30
|
+
getWorldTransform: () => ({ a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 }),
|
|
31
|
+
};
|
|
32
|
+
return { hooks, created, destroyed };
|
|
33
|
+
}
|
|
34
|
+
const area = { width: 100, height: 100, space: "local" };
|
|
35
|
+
describe("ParticlePool", () => {
|
|
36
|
+
it("prewarms exactly capacity slots, never calls the factory on acquire/release, and reuses released identity", () => {
|
|
37
|
+
let created = 0;
|
|
38
|
+
const pool = new ParticlePool(() => ({ id: created++ }), 3);
|
|
39
|
+
expect(created).toBe(3);
|
|
40
|
+
const a = pool.acquire();
|
|
41
|
+
pool.acquire();
|
|
42
|
+
expect(created).toBe(3);
|
|
43
|
+
pool.release(a);
|
|
44
|
+
expect(pool.acquire()).toBe(a);
|
|
45
|
+
expect(created).toBe(3);
|
|
46
|
+
});
|
|
47
|
+
it("increments dropped and never exceeds capacity on exhaustion", () => {
|
|
48
|
+
const pool = new ParticlePool(() => ({}), 1);
|
|
49
|
+
pool.acquire();
|
|
50
|
+
expect(pool.acquire()).toBeUndefined();
|
|
51
|
+
expect(pool.dropped).toBe(1);
|
|
52
|
+
});
|
|
53
|
+
it("creates only the delta on growth and drains active slots beyond a shrunk capacity without recycling them", () => {
|
|
54
|
+
const destroyed = [];
|
|
55
|
+
let created = 0;
|
|
56
|
+
const pool = new ParticlePool(() => created++, 2, (value) => destroyed.push(value));
|
|
57
|
+
const a = pool.acquire(), b = pool.acquire();
|
|
58
|
+
pool.resize(4);
|
|
59
|
+
expect(created).toBe(4);
|
|
60
|
+
pool.resize(1);
|
|
61
|
+
expect(destroyed).toHaveLength(2); // the two idle free slots are destroyed immediately
|
|
62
|
+
pool.release(a); // still over the new capacity: destroyed instead of recycled
|
|
63
|
+
expect(destroyed).toHaveLength(3);
|
|
64
|
+
pool.release(b); // back at capacity: recycled normally
|
|
65
|
+
expect(destroyed).toHaveLength(3);
|
|
66
|
+
expect(pool.acquire()).toBe(b);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("ParticleSimulator determinism", () => {
|
|
70
|
+
it("gives the same active-slot state at fixed-step boundaries regardless of how render delta is split", () => {
|
|
71
|
+
const def = definition({ emission: { delay: 0, duration: 10, loop: true, rate: 30, bursts: [] } });
|
|
72
|
+
const simA = new ParticleSimulator(def, makeHooks().hooks);
|
|
73
|
+
const simB = new ParticleSimulator(def, makeHooks().hooks);
|
|
74
|
+
simA.play();
|
|
75
|
+
simB.play();
|
|
76
|
+
// Total stays comfortably under the 8-step catch-up cap for both splits, so the cap itself
|
|
77
|
+
// never becomes the variable under test — only the splitting is.
|
|
78
|
+
simA.update(0.1, area);
|
|
79
|
+
for (const chunk of [0.03, 0.02, 0.05])
|
|
80
|
+
simB.update(chunk, area);
|
|
81
|
+
const snapshot = (sim) => [...sim.activeSlots]
|
|
82
|
+
.map((slot) => ({ age: Math.round(slot.age * 1e6), x: Math.round(slot.x * 1e6), y: Math.round(slot.y * 1e6) }))
|
|
83
|
+
.sort((p, q) => p.age - q.age);
|
|
84
|
+
expect(snapshot(simA)).toEqual(snapshot(simB));
|
|
85
|
+
expect(simA.getDiagnostics()).toEqual(simB.getDiagnostics());
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe("ParticleSimulator burst scheduling", () => {
|
|
89
|
+
it("fires a burst with time 0 on the very first fixed step after start", () => {
|
|
90
|
+
const def = definition({ emission: { delay: 0, duration: 0.2, loop: true, rate: 0, bursts: [{ time: 0, count: 3 }] } });
|
|
91
|
+
def.particle.lifetime = { min: 100, max: 100 };
|
|
92
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
93
|
+
sim.play();
|
|
94
|
+
sim.step(area);
|
|
95
|
+
expect(sim.activeSlots.size).toBe(3);
|
|
96
|
+
});
|
|
97
|
+
it("fires a non-loop burst exactly once even when stepped well past its trigger and duration", () => {
|
|
98
|
+
const def = definition({ emission: { delay: 0, duration: 0.5, loop: false, rate: 0, bursts: [{ time: 0.1, count: 2 }] } });
|
|
99
|
+
def.particle.lifetime = { min: 100, max: 100 };
|
|
100
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
101
|
+
sim.play();
|
|
102
|
+
for (let i = 0; i < 4; i++)
|
|
103
|
+
sim.step(area); // well before the 0.1s trigger
|
|
104
|
+
expect(sim.activeSlots.size).toBe(0);
|
|
105
|
+
for (let i = 0; i < 4; i++)
|
|
106
|
+
sim.step(area); // now solidly past the trigger (8/60 ≈ 0.133s)
|
|
107
|
+
expect(sim.activeSlots.size).toBe(2);
|
|
108
|
+
for (let i = 0; i < 60; i++)
|
|
109
|
+
sim.step(area); // well past duration and beyond
|
|
110
|
+
expect(sim.activeSlots.size).toBe(2);
|
|
111
|
+
});
|
|
112
|
+
it("fires a loop burst again on the next cycle, including across the cycle boundary", () => {
|
|
113
|
+
const def = definition({ emission: { delay: 0, duration: 0.1, loop: true, rate: 0, bursts: [{ time: 0, count: 1 }] } });
|
|
114
|
+
def.particle.lifetime = { min: 100, max: 100 };
|
|
115
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
116
|
+
sim.play();
|
|
117
|
+
sim.step(area); // first fixed step: elapsed ≈ 1/60, burst fires
|
|
118
|
+
expect(sim.activeSlots.size).toBe(1);
|
|
119
|
+
for (let i = 0; i < 3; i++)
|
|
120
|
+
sim.step(area); // elapsed ≈ 4/60, still inside the first cycle
|
|
121
|
+
expect(sim.activeSlots.size).toBe(1);
|
|
122
|
+
for (let i = 0; i < 3; i++)
|
|
123
|
+
sim.step(area); // elapsed ≈ 7/60, solidly past the 0.1s cycle boundary
|
|
124
|
+
expect(sim.activeSlots.size).toBe(2);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("ParticleSimulator lifecycle", () => {
|
|
128
|
+
it("stop() blocks new spawns while already-emitted particles drain to active === 0", () => {
|
|
129
|
+
const def = definition({ emission: { delay: 0, duration: 10, loop: true, rate: 0, bursts: [{ time: 0, count: 4 }] } });
|
|
130
|
+
def.particle.lifetime = { min: 2 / 60, max: 2 / 60 };
|
|
131
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
132
|
+
sim.play();
|
|
133
|
+
sim.step(area);
|
|
134
|
+
expect(sim.activeSlots.size).toBe(4);
|
|
135
|
+
sim.stop();
|
|
136
|
+
expect(sim.getDiagnostics()).toMatchObject({ playing: false, stopped: true });
|
|
137
|
+
sim.step(area); // still simulating: ages toward death but hasn't reached lifetime yet
|
|
138
|
+
expect(sim.activeSlots.size).toBe(4);
|
|
139
|
+
sim.step(area); // lifetime reached; particles die and are not replaced because spawning is blocked
|
|
140
|
+
expect(sim.activeSlots.size).toBe(0);
|
|
141
|
+
});
|
|
142
|
+
it("dispose() immediately clears every slot, is idempotent, and excludes the simulator from further updates", () => {
|
|
143
|
+
const { hooks, created, destroyed } = makeHooks();
|
|
144
|
+
const def = definition({ maxParticles: 5, emission: { delay: 0, duration: 10, loop: true, rate: 0, bursts: [{ time: 0, count: 2 }] } });
|
|
145
|
+
const sim = new ParticleSimulator(def, hooks);
|
|
146
|
+
sim.play();
|
|
147
|
+
sim.step(area);
|
|
148
|
+
expect(sim.activeSlots.size).toBe(2);
|
|
149
|
+
sim.dispose();
|
|
150
|
+
expect(sim.activeSlots.size).toBe(0);
|
|
151
|
+
expect(destroyed).toHaveLength(created.length);
|
|
152
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 0, disposed: true });
|
|
153
|
+
sim.dispose(); // idempotent
|
|
154
|
+
sim.play();
|
|
155
|
+
sim.step(area);
|
|
156
|
+
sim.restart();
|
|
157
|
+
expect(sim.activeSlots.size).toBe(0);
|
|
158
|
+
expect(sim.getDiagnostics().disposed).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
it("pause() freezes state, step() advances one fixed step regardless, and restart() replays the initial sequence and resets dropped", () => {
|
|
161
|
+
const def = definition({ maxParticles: 2, emission: { delay: 0, duration: 10, loop: true, rate: 0, bursts: [{ time: 0, count: 3 }] } });
|
|
162
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
163
|
+
sim.play();
|
|
164
|
+
sim.step(area); // burst of 3 into a pool of 2: one dropped
|
|
165
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 2, dropped: 1 });
|
|
166
|
+
sim.pause();
|
|
167
|
+
sim.update(1, area); // paused: no time passes, no state changes
|
|
168
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 2, dropped: 1, playing: false, stopped: false }); // paused is distinct from stopped
|
|
169
|
+
sim.step(area); // step still advances one fixed tick even while paused
|
|
170
|
+
expect(sim.getDiagnostics().playing).toBe(false); // ...without leaving pause
|
|
171
|
+
sim.restart();
|
|
172
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 0, dropped: 0, playing: true });
|
|
173
|
+
sim.step(area);
|
|
174
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 2, dropped: 1 });
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe("ParticleSimulator incremental sync", () => {
|
|
178
|
+
it("never restarts on an unrelated clone or a seed edit", () => {
|
|
179
|
+
const def = definition({ maxParticles: 3, seed: 7, emission: { delay: 0, duration: 10, loop: true, rate: 0, bursts: [{ time: 0, count: 2 }] } });
|
|
180
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
181
|
+
sim.play();
|
|
182
|
+
sim.step(area);
|
|
183
|
+
expect(sim.activeSlots.size).toBe(2);
|
|
184
|
+
const renamed = structuredClone(def);
|
|
185
|
+
renamed.name = "Renamed";
|
|
186
|
+
sim.syncEffect(renamed);
|
|
187
|
+
expect(sim.activeSlots.size).toBe(2);
|
|
188
|
+
const reseeded = structuredClone(renamed);
|
|
189
|
+
reseeded.seed = 999;
|
|
190
|
+
sim.syncEffect(reseeded);
|
|
191
|
+
expect(sim.activeSlots.size).toBe(2); // seed only applies at the next explicit restart()
|
|
192
|
+
});
|
|
193
|
+
it("resizes the pool live on a maxParticles change without disturbing existing particles", () => {
|
|
194
|
+
const def = definition({ maxParticles: 2, emission: { delay: 0, duration: 10, loop: true, rate: 60, bursts: [] } });
|
|
195
|
+
const sim = new ParticleSimulator(def, makeHooks().hooks);
|
|
196
|
+
sim.play();
|
|
197
|
+
sim.step(area);
|
|
198
|
+
sim.step(area);
|
|
199
|
+
sim.step(area); // 3 spawns attempted at 1/tick, pool holds 2, 1 dropped
|
|
200
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 2, dropped: 1 });
|
|
201
|
+
const grown = structuredClone(def);
|
|
202
|
+
grown.maxParticles = 4;
|
|
203
|
+
sim.syncEffect(grown);
|
|
204
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 2, dropped: 1 }); // sync itself changes nothing
|
|
205
|
+
sim.step(area);
|
|
206
|
+
sim.step(area); // 2 more spawns now fit in the grown pool
|
|
207
|
+
expect(sim.getDiagnostics()).toMatchObject({ active: 4, dropped: 1 });
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=particles.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"particles.test.js","sourceRoot":"","sources":["../src/particles.test.ts"],"names":[],"mappings":"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"}
|
package/dist/scene.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type SkeletonData } from "@esotericsoftware/spine-pixi-v8";
|
|
2
|
+
import { type EffectDefinition, type LayoutProfileId, type ProjectDocument, type Scene, type UINode } from "@pixi-ui-editor/schema";
|
|
3
|
+
import { Container, Texture } from "pixi.js";
|
|
4
|
+
import { type FileUrlResolver } from "./assets/textures.js";
|
|
5
|
+
import { type LayoutSize } from "./layout.js";
|
|
6
|
+
import { type SceneInteractionMode } from "./views/NodeView.js";
|
|
7
|
+
import type { Sound } from "@pixi/sound";
|
|
8
|
+
export type BuildSceneViewOptions = {
|
|
9
|
+
/** Explicit: an editor canvas must pass "authoring", Preview and the consuming app "runtime". */
|
|
10
|
+
interaction: SceneInteractionMode;
|
|
11
|
+
textures?: ReadonlyMap<string, Texture>;
|
|
12
|
+
spines?: ReadonlyMap<string, SkeletonData>;
|
|
13
|
+
fonts?: ReadonlyMap<string, string>;
|
|
14
|
+
sounds?: ReadonlyMap<string, Sound>;
|
|
15
|
+
/** Called after Yoga changes a managed rectangle; authoring hosts use it to refresh overlays. */
|
|
16
|
+
onLayout?: () => void;
|
|
17
|
+
};
|
|
18
|
+
/** Builds a PixiJS display tree for a scene without depending on DOM or editor state. */
|
|
19
|
+
export declare function buildSceneView(document: ProjectDocument, sceneId: string, profile: LayoutProfileId, options: BuildSceneViewOptions): {
|
|
20
|
+
root: Container;
|
|
21
|
+
nodeViews: Map<string, Container>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Applies a node's resolved transform, visibility, and content to an existing display object,
|
|
25
|
+
* so editors can update views in place without rebuilding the scene tree.
|
|
26
|
+
*/
|
|
27
|
+
export declare function updateNodeView(view: Container, node: UINode, profile: LayoutProfileId, parentSize?: LayoutSize, parentNode?: UINode, effect?: EffectDefinition): void;
|
|
28
|
+
/** Previews a resolved editor rectangle without consulting content bounds or rebuilding the view. */
|
|
29
|
+
export declare function previewNodeView(view: Container, node: UINode, profile: LayoutProfileId, transform: UINode["transform"]): void;
|
|
30
|
+
/** Hosts call this from their own Application ticker; runtime never subscribes to Ticker.shared. */
|
|
31
|
+
export declare function updateParticleEmitters(root: Container, deltaSeconds: number): void;
|
|
32
|
+
/** Lists the nodes a scene renders, including nodes of prefab definitions its prefab instances expand to. */
|
|
33
|
+
export declare function collectRenderedNodes(document: ProjectDocument, scene: Scene): UINode[];
|
|
34
|
+
/** Loads a scene's textures and Spine data, then builds its display tree in one call. */
|
|
35
|
+
export declare function loadSceneView(document: ProjectDocument, sceneId: string, profile: LayoutProfileId, resolveFileUrl: FileUrlResolver, options: {
|
|
36
|
+
interaction: SceneInteractionMode;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
root: Container;
|
|
39
|
+
nodeViews: Map<string, Container>;
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAmC,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrK,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAqD,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAM1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAAG;IAClC,iGAAiG;IACjG,WAAW,EAAE,oBAAoB,CAAC;IAClC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,yFAAyF;AACzF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,qBAAqB,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,CA2ExD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAYrK;AAED,qGAAqG;AACrG,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAG7H;AAED,oGAAoG;AACpG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAGlF;AAED,6GAA6G;AAC7G,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAgBtF;AAED,yFAAyF;AACzF,wBAAsB,aAAa,CACjC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,eAAe,EAC/B,OAAO,EAAE;IAAE,WAAW,EAAE,oBAAoB,CAAA;CAAE,GAC7C,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,CAAC,CAOjE"}
|
package/dist/scene.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { isLayoutGroup, isParticleEffect } from "@pixi-ui-editor/schema";
|
|
2
|
+
import { Container } from "pixi.js";
|
|
3
|
+
import { loadSceneSpines } from "./assets/spine.js";
|
|
4
|
+
import { loadSceneTextures } from "./assets/textures.js";
|
|
5
|
+
import { loadSceneFonts } from "./assets/fonts.js";
|
|
6
|
+
import { resolveAnchoredTransform, resolveProfileTransform } from "./layout.js";
|
|
7
|
+
import { NodeView } from "./views/NodeView.js";
|
|
8
|
+
import { createNodeView } from "./views/createNodeView.js";
|
|
9
|
+
import { applyLayoutGroup, applyLayoutItem, createGridLineBreak, initializePixiLayout, LayoutItemContainer } from "./layoutGroups.js";
|
|
10
|
+
import { LayoutGroupNodeView } from "./views/basic.js";
|
|
11
|
+
import { ScrollItemContainer } from "./scrollView.js";
|
|
12
|
+
import { ScrollViewNodeView } from "./views/ScrollViewNodeView.js";
|
|
13
|
+
/** Builds a PixiJS display tree for a scene without depending on DOM or editor state. */
|
|
14
|
+
export function buildSceneView(document, sceneId, profile, options) {
|
|
15
|
+
initializePixiLayout();
|
|
16
|
+
const { interaction, textures, spines, fonts, sounds, onLayout } = options;
|
|
17
|
+
const scene = document.scenes.find((candidate) => candidate.id === sceneId);
|
|
18
|
+
if (scene === undefined) {
|
|
19
|
+
throw new Error(`Scene '${sceneId}' does not exist in the project document.`);
|
|
20
|
+
}
|
|
21
|
+
const nodeViews = new Map();
|
|
22
|
+
// Views раскрытых prefab-определений не регистрируются в nodeViews: инстанс редактируется как единое целое.
|
|
23
|
+
const buildOwner = (owner, registerViews, expandingPrefabIds, rootSize) => {
|
|
24
|
+
const nodesById = new Map(owner.nodes.map((node) => [node.id, node]));
|
|
25
|
+
const buildNode = (nodeId, parentSize) => {
|
|
26
|
+
const node = nodesById.get(nodeId);
|
|
27
|
+
if (node === undefined) {
|
|
28
|
+
throw new Error(`Scene '${sceneId}' references missing node '${nodeId}'.`);
|
|
29
|
+
}
|
|
30
|
+
const resolved = resolveProfileTransform(node, profile);
|
|
31
|
+
const transform = resolveAnchoredTransform(resolved.transform, parentSize);
|
|
32
|
+
const view = createNodeView(node, interaction, textures, spines, (prefabId) => {
|
|
33
|
+
const prefab = document.prefabs.find((candidate) => candidate.id === prefabId);
|
|
34
|
+
if (prefab === undefined || expandingPrefabIds.has(prefabId))
|
|
35
|
+
return undefined;
|
|
36
|
+
return buildOwner(prefab, false, new Set([...expandingPrefabIds, prefabId]), { width: transform.width, height: transform.height });
|
|
37
|
+
}, fonts, sounds, node.type === "particle-emitter" ? document.effects.find((effect) => effect.id === node.effectId && isParticleEffect(effect)) : undefined);
|
|
38
|
+
if (isLayoutGroup(node))
|
|
39
|
+
applyLayoutGroup(view, node, profile, parentSize);
|
|
40
|
+
// Yoga owns only the group's inner layoutContent; the outer NodeView keeps authored transform.
|
|
41
|
+
view.update(node, profile, parentSize);
|
|
42
|
+
if (registerViews)
|
|
43
|
+
nodeViews.set(node.id, view);
|
|
44
|
+
const childSize = owner === scene && node.parentId === null
|
|
45
|
+
? rootSize
|
|
46
|
+
: { width: transform.width, height: transform.height };
|
|
47
|
+
for (const [childIndex, childId] of node.children.entries()) {
|
|
48
|
+
const childNode = nodesById.get(childId);
|
|
49
|
+
const childView = buildNode(childId, childSize);
|
|
50
|
+
if (isLayoutGroup(node) && childNode !== undefined && view instanceof LayoutGroupNodeView) {
|
|
51
|
+
const layoutItem = new LayoutItemContainer(childView, onLayout);
|
|
52
|
+
applyLayoutItem(layoutItem, childNode, node, profile);
|
|
53
|
+
view.addLayoutChild(layoutItem);
|
|
54
|
+
}
|
|
55
|
+
else if (node.type === "scroll-view" && childNode !== undefined && view instanceof ScrollViewNodeView) {
|
|
56
|
+
const scrollItem = new ScrollItemContainer(childView, onLayout);
|
|
57
|
+
// Как и у layout-item: собственный (не растянутый якорями) размер ребёнка — List не
|
|
58
|
+
// предоставляет per-item override размера, в отличие от Yoga flexGrow/cellSize.
|
|
59
|
+
const own = resolveProfileTransform(childNode, profile).transform;
|
|
60
|
+
scrollItem.sync(childNode, profile, { width: own.width, height: own.height });
|
|
61
|
+
view.addScrollItem(scrollItem);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
view.addChild(childView);
|
|
65
|
+
}
|
|
66
|
+
if (node.type === "grid-layout") {
|
|
67
|
+
const settings = node.layoutGroup.overrides?.[profile] === undefined ? node.layoutGroup.base : { ...node.layoutGroup.base, ...node.layoutGroup.overrides[profile] };
|
|
68
|
+
if (settings.constraint !== "flexible" && settings.constraintCount !== undefined && (childIndex + 1) % settings.constraintCount === 0 && childIndex + 1 < node.children.length) {
|
|
69
|
+
const lineBreak = createGridLineBreak(node, profile);
|
|
70
|
+
if (lineBreak !== undefined && view instanceof LayoutGroupNodeView)
|
|
71
|
+
view.addLayoutChild(lineBreak);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return view;
|
|
76
|
+
};
|
|
77
|
+
const ownerRoot = new Container();
|
|
78
|
+
for (const rootNodeId of owner.rootNodeIds) {
|
|
79
|
+
ownerRoot.addChild(buildNode(rootNodeId, rootSize));
|
|
80
|
+
}
|
|
81
|
+
return ownerRoot;
|
|
82
|
+
};
|
|
83
|
+
return { root: buildOwner(scene, true, new Set(), scene.layout.referenceViewports[profile]), nodeViews };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Applies a node's resolved transform, visibility, and content to an existing display object,
|
|
87
|
+
* so editors can update views in place without rebuilding the scene tree.
|
|
88
|
+
*/
|
|
89
|
+
export function updateNodeView(view, node, profile, parentSize, parentNode, effect) {
|
|
90
|
+
if (isLayoutGroup(node))
|
|
91
|
+
applyLayoutGroup(view, node, profile, parentSize);
|
|
92
|
+
if (!(view instanceof NodeView))
|
|
93
|
+
return;
|
|
94
|
+
if (node.type === "particle-emitter" && effect !== undefined && isParticleEffect(effect) && "syncEffect" in view && typeof view.syncEffect === "function")
|
|
95
|
+
view.syncEffect(effect);
|
|
96
|
+
if (parentNode !== undefined && isLayoutGroup(parentNode) && view.parent instanceof LayoutItemContainer) {
|
|
97
|
+
applyLayoutItem(view.parent, node, parentNode, profile);
|
|
98
|
+
}
|
|
99
|
+
else if (parentNode !== undefined && parentNode.type === "scroll-view" && view.parent instanceof ScrollItemContainer) {
|
|
100
|
+
const own = resolveProfileTransform(node, profile).transform;
|
|
101
|
+
view.parent.sync(node, profile, { width: own.width, height: own.height });
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
view.update(node, profile, parentSize);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Previews a resolved editor rectangle without consulting content bounds or rebuilding the view. */
|
|
108
|
+
export function previewNodeView(view, node, profile, transform) {
|
|
109
|
+
if (isLayoutGroup(node))
|
|
110
|
+
applyLayoutGroup(view, node, profile, undefined, { width: transform.width, height: transform.height });
|
|
111
|
+
if (view instanceof NodeView)
|
|
112
|
+
view.preview(node, transform, resolveProfileTransform(node, profile).visible);
|
|
113
|
+
}
|
|
114
|
+
/** Hosts call this from their own Application ticker; runtime never subscribes to Ticker.shared. */
|
|
115
|
+
export function updateParticleEmitters(root, deltaSeconds) {
|
|
116
|
+
const visit = (view) => { if ("updateParticles" in view && typeof view.updateParticles === "function")
|
|
117
|
+
view.updateParticles(deltaSeconds); view.children.forEach(visit); };
|
|
118
|
+
visit(root);
|
|
119
|
+
}
|
|
120
|
+
/** Lists the nodes a scene renders, including nodes of prefab definitions its prefab instances expand to. */
|
|
121
|
+
export function collectRenderedNodes(document, scene) {
|
|
122
|
+
const nodes = [];
|
|
123
|
+
const expandedPrefabIds = new Set();
|
|
124
|
+
const visit = (list) => {
|
|
125
|
+
for (const node of list) {
|
|
126
|
+
nodes.push(node);
|
|
127
|
+
if (node.type !== "prefab-instance" || expandedPrefabIds.has(node.prefabId))
|
|
128
|
+
continue;
|
|
129
|
+
expandedPrefabIds.add(node.prefabId);
|
|
130
|
+
const prefab = document.prefabs.find((candidate) => candidate.id === node.prefabId);
|
|
131
|
+
if (prefab !== undefined)
|
|
132
|
+
visit(prefab.nodes);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
visit(scene.nodes);
|
|
136
|
+
return nodes;
|
|
137
|
+
}
|
|
138
|
+
/** Loads a scene's textures and Spine data, then builds its display tree in one call. */
|
|
139
|
+
export async function loadSceneView(document, sceneId, profile, resolveFileUrl, options) {
|
|
140
|
+
const [textures, spines, fonts] = await Promise.all([
|
|
141
|
+
loadSceneTextures(document, sceneId, (asset) => (asset.type === "image" ? resolveFileUrl(asset.source.uri) : undefined), resolveFileUrl),
|
|
142
|
+
loadSceneSpines(document, sceneId, resolveFileUrl),
|
|
143
|
+
loadSceneFonts(document, sceneId, resolveFileUrl),
|
|
144
|
+
]);
|
|
145
|
+
return buildSceneView(document, sceneId, profile, { interaction: options.interaction, textures, spines, fonts });
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAA8F,MAAM,wBAAwB,CAAC;AACrK,OAAO,EAAE,SAAS,EAAW,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAwB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAmB,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,QAAQ,EAA6B,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACtI,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAcnE,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAC5B,QAAyB,EACzB,OAAe,EACf,OAAwB,EACxB,OAA8B;IAE9B,oBAAoB,EAAE,CAAC;IACvB,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAE5E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,2CAA2C,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE/C,4GAA4G;IAC5G,MAAM,UAAU,GAAG,CAAC,KAAiD,EAAE,aAAsB,EAAE,kBAAuC,EAAE,QAAoB,EAAa,EAAE;QACzK,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,UAAsB,EAAY,EAAE;YACrE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,8BAA8B,MAAM,IAAI,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;gBAC/E,IAAI,MAAM,KAAK,SAAS,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAC/E,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YACrI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC7J,IAAI,aAAa,CAAC,IAAI,CAAC;gBAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YAC3E,+FAA+F;YAC/F,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YACvC,IAAI,aAAa;gBAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEhD,MAAM,SAAS,GAAG,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;gBACzD,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;YACzD,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAChD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,YAAY,mBAAmB,EAAE,CAAC;oBAC1F,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAChE,eAAe,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBACtD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,YAAY,kBAAkB,EAAE,CAAC;oBACxG,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAChE,oFAAoF;oBACpF,gFAAgF;oBAChF,MAAM,GAAG,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC;oBAClE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC9E,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC3B,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpK,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;wBAC/K,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBACrD,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,YAAY,mBAAmB;4BAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBACrG,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;AAC3G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,IAAY,EAAE,OAAwB,EAAE,UAAuB,EAAE,UAAmB,EAAE,MAAyB;IAC7J,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAAE,OAAO;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,KAAK,SAAS,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,YAAY,IAAI,IAAI,IAAI,OAAQ,IAAiC,CAAC,UAAU,KAAK,UAAU;QAAG,IAAgG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9S,IAAI,UAAU,KAAK,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,YAAY,mBAAmB,EAAE,CAAC;QACxG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,YAAY,mBAAmB,EAAE,CAAC;QACvH,MAAM,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,eAAe,CAAC,IAAe,EAAE,IAAY,EAAE,OAAwB,EAAE,SAA8B;IACrH,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAChI,IAAI,IAAI,YAAY,QAAQ;QAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;AAC9G,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,sBAAsB,CAAC,IAAe,EAAE,YAAoB;IAC1E,MAAM,KAAK,GAAG,CAAC,IAAe,EAAQ,EAAE,GAAG,IAAI,iBAAiB,IAAI,IAAI,IAAI,OAAQ,IAAsC,CAAC,eAAe,KAAK,UAAU;QAAG,IAAiD,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7Q,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,oBAAoB,CAAC,QAAyB,EAAE,KAAY;IAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,MAAM,KAAK,GAAG,CAAC,IAAc,EAAQ,EAAE;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACtF,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAyB,EACzB,OAAe,EACf,OAAwB,EACxB,cAA+B,EAC/B,OAA8C;IAE9C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;QACxI,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC;QAClD,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC;KAClD,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACnH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type LayoutProfileId, type ScrollViewNode, type UINode } from "@pixi-ui-editor/schema";
|
|
2
|
+
import type { ListType } from "@pixi/ui";
|
|
3
|
+
import { Container } from "pixi.js";
|
|
4
|
+
import type { LayoutSize } from "./layout.js";
|
|
5
|
+
import { NodeView } from "./views/NodeView.js";
|
|
6
|
+
/** `@pixi/ui`'s `List` only knows "vertical" | "horizontal" | "bidirectional". */
|
|
7
|
+
export declare const SCROLL_DIRECTION_TO_LIST_TYPE: Record<ScrollViewNode["scrollView"]["direction"], ListType>;
|
|
8
|
+
/**
|
|
9
|
+
* Runtime-only position owner for one direct scroll-view child. `@pixi/ui`'s `List` arranges items
|
|
10
|
+
* by reading `Container.width`/`height` and writing `x`/`y` directly; a bare `NodeView` reports 0 for
|
|
11
|
+
* both when it renders nothing (same issue the base grab-rectangle works around for hit testing), so
|
|
12
|
+
* this wrapper reports the child's own logical rectangle instead. `List` owns only this wrapper's
|
|
13
|
+
* position — the wrapped `NodeView` keeps its own pivot/rotation/scale/visibility contract via
|
|
14
|
+
* `updateManaged`, exactly like a layout group's `LayoutItemContainer`.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ScrollItemContainer extends Container {
|
|
17
|
+
readonly nodeView: NodeView;
|
|
18
|
+
private readonly onResized?;
|
|
19
|
+
private itemWidth;
|
|
20
|
+
private itemHeight;
|
|
21
|
+
constructor(nodeView: NodeView, onResized?: (() => void) | undefined);
|
|
22
|
+
get width(): number;
|
|
23
|
+
set width(value: number);
|
|
24
|
+
get height(): number;
|
|
25
|
+
set height(value: number);
|
|
26
|
+
sync(node: UINode, profile: LayoutProfileId, size: LayoutSize): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=scrollView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollView.d.ts","sourceRoot":"","sources":["../src/scrollView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,kFAAkF;AAClF,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,CAIrG,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAIpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAHpE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;gBAEF,QAAQ,EAAE,QAAQ,EAAmB,SAAS,CAAC,GAAE,MAAM,IAAI,aAAA;IAKhF,IAAa,KAAK,IAAI,MAAM,CAA2B;IACvD,IAAa,KAAK,CAAC,KAAK,EAAE,MAAM,EAA6B;IAC7D,IAAa,MAAM,IAAI,MAAM,CAA4B;IACzD,IAAa,MAAM,CAAC,KAAK,EAAE,MAAM,EAA8B;IAE/D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;CAMrE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Container } from "pixi.js";
|
|
2
|
+
/** `@pixi/ui`'s `List` only knows "vertical" | "horizontal" | "bidirectional". */
|
|
3
|
+
export const SCROLL_DIRECTION_TO_LIST_TYPE = {
|
|
4
|
+
vertical: "vertical",
|
|
5
|
+
horizontal: "horizontal",
|
|
6
|
+
both: "bidirectional",
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Runtime-only position owner for one direct scroll-view child. `@pixi/ui`'s `List` arranges items
|
|
10
|
+
* by reading `Container.width`/`height` and writing `x`/`y` directly; a bare `NodeView` reports 0 for
|
|
11
|
+
* both when it renders nothing (same issue the base grab-rectangle works around for hit testing), so
|
|
12
|
+
* this wrapper reports the child's own logical rectangle instead. `List` owns only this wrapper's
|
|
13
|
+
* position — the wrapped `NodeView` keeps its own pivot/rotation/scale/visibility contract via
|
|
14
|
+
* `updateManaged`, exactly like a layout group's `LayoutItemContainer`.
|
|
15
|
+
*/
|
|
16
|
+
export class ScrollItemContainer extends Container {
|
|
17
|
+
nodeView;
|
|
18
|
+
onResized;
|
|
19
|
+
itemWidth = 0;
|
|
20
|
+
itemHeight = 0;
|
|
21
|
+
constructor(nodeView, onResized) {
|
|
22
|
+
super();
|
|
23
|
+
this.nodeView = nodeView;
|
|
24
|
+
this.onResized = onResized;
|
|
25
|
+
super.addChild(nodeView);
|
|
26
|
+
}
|
|
27
|
+
get width() { return this.itemWidth; }
|
|
28
|
+
set width(value) { this.itemWidth = value; }
|
|
29
|
+
get height() { return this.itemHeight; }
|
|
30
|
+
set height(value) { this.itemHeight = value; }
|
|
31
|
+
sync(node, profile, size) {
|
|
32
|
+
this.itemWidth = size.width;
|
|
33
|
+
this.itemHeight = size.height;
|
|
34
|
+
this.nodeView.updateManaged(node, profile, size);
|
|
35
|
+
this.onResized?.();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=scrollView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollView.js","sourceRoot":"","sources":["../src/scrollView.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC,kFAAkF;AAClF,MAAM,CAAC,MAAM,6BAA6B,GAAgE;IACxG,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,eAAe;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAI3B;IAAqC;IAHlD,SAAS,GAAG,CAAC,CAAC;IACd,UAAU,GAAG,CAAC,CAAC;IAEvB,YAAqB,QAAkB,EAAmB,SAAsB;QAC9E,KAAK,EAAE,CAAC;QADW,aAAQ,GAAR,QAAQ,CAAU;QAAmB,cAAS,GAAT,SAAS,CAAa;QAE9E,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,IAAa,KAAK,KAAa,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACvD,IAAa,KAAK,CAAC,KAAa,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAa,MAAM,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,IAAa,MAAM,CAAC,KAAa,IAAI,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,CAAC,IAAY,EAAE,OAAwB,EAAE,IAAgB;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.setup.d.ts","sourceRoot":"","sources":["../src/test.setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.setup.js","sourceRoot":"","sources":["../src/test.setup.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE;IAC7C,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;CAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type ButtonStateKey, type UINode } from "@pixi-ui-editor/schema";
|
|
2
|
+
import { FancyButton } from "@pixi/ui";
|
|
3
|
+
import type { Sound } from "@pixi/sound";
|
|
4
|
+
import { Texture } from "pixi.js";
|
|
5
|
+
import { NodeView, type SceneInteractionMode } from "./NodeView.js";
|
|
6
|
+
export type ButtonNode = Extract<UINode, {
|
|
7
|
+
type: "button";
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Adapts a button node to `@pixi/ui`'s `FancyButton`, which owns the pointer state machine —
|
|
11
|
+
* this class never reimplements it. Optional states fall back to the normal image, and runtime
|
|
12
|
+
* changes to `enabled` or the current state stay in the view: they never touch the document.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ButtonNodeView extends NodeView {
|
|
15
|
+
private readonly button;
|
|
16
|
+
private readonly stateViews;
|
|
17
|
+
private readonly interaction;
|
|
18
|
+
private readonly sounds;
|
|
19
|
+
private soundAssetIds;
|
|
20
|
+
private enabledState;
|
|
21
|
+
constructor(node: ButtonNode, textures: ReadonlyMap<string, Texture> | undefined, interaction: SceneInteractionMode, sounds?: ReadonlyMap<string, Sound>);
|
|
22
|
+
/** In authoring mode `enabled` may only drive the visuals: `FancyButton` couples it to `eventMode`. */
|
|
23
|
+
private applyEnabled;
|
|
24
|
+
protected syncContent(node: UINode, transform: UINode["transform"]): void;
|
|
25
|
+
get enabled(): boolean;
|
|
26
|
+
set enabled(value: boolean);
|
|
27
|
+
get state(): ButtonStateKey;
|
|
28
|
+
/** Forces a visual state without changing `enabled`, so a disabled button still emits no press. */
|
|
29
|
+
setState(state: ButtonStateKey): void;
|
|
30
|
+
get onPress(): FancyButton["onPress"];
|
|
31
|
+
get onDown(): FancyButton["onDown"];
|
|
32
|
+
get onUp(): FancyButton["onUp"];
|
|
33
|
+
get onHover(): FancyButton["onHover"];
|
|
34
|
+
get onOut(): FancyButton["onOut"];
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ButtonNodeView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonNodeView.d.ts","sourceRoot":"","sources":["../../src/views/ButtonNodeView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAA+B,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC;AAK7D;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,YAAY,CAAU;gBAElB,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;IAiCxJ,uGAAuG;IACvG,OAAO,CAAC,YAAY;IAMpB,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI;IAsBzE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAEzB;IAED,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,mGAAmG;IACnG,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIrC,IAAI,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,CAAgC;IACrE,IAAI,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,CAA+B;IAClE,IAAI,IAAI,IAAI,WAAW,CAAC,MAAM,CAAC,CAA6B;IAC5D,IAAI,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,CAAgC;IACrE,IAAI,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAA8B;CAChE"}
|