@aura3d/editor-runtime 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +20 -0
  2. package/dist/Command.d.ts +11 -0
  3. package/dist/Command.d.ts.map +1 -0
  4. package/dist/Command.js +2 -0
  5. package/dist/Command.js.map +1 -0
  6. package/dist/CommandHistory.d.ts +20 -0
  7. package/dist/CommandHistory.d.ts.map +1 -0
  8. package/dist/CommandHistory.js +124 -0
  9. package/dist/CommandHistory.js.map +1 -0
  10. package/dist/DiagnosticsOverlayModel.d.ts +30 -0
  11. package/dist/DiagnosticsOverlayModel.d.ts.map +1 -0
  12. package/dist/DiagnosticsOverlayModel.js +57 -0
  13. package/dist/DiagnosticsOverlayModel.js.map +1 -0
  14. package/dist/EditorPluginHost.d.ts +46 -0
  15. package/dist/EditorPluginHost.d.ts.map +1 -0
  16. package/dist/EditorPluginHost.js +57 -0
  17. package/dist/EditorPluginHost.js.map +1 -0
  18. package/dist/EditorRuntime.d.ts +95 -0
  19. package/dist/EditorRuntime.d.ts.map +1 -0
  20. package/dist/EditorRuntime.js +277 -0
  21. package/dist/EditorRuntime.js.map +1 -0
  22. package/dist/EditorStateModel.d.ts +93 -0
  23. package/dist/EditorStateModel.d.ts.map +1 -0
  24. package/dist/EditorStateModel.js +251 -0
  25. package/dist/EditorStateModel.js.map +1 -0
  26. package/dist/Gizmo.d.ts +43 -0
  27. package/dist/Gizmo.d.ts.map +1 -0
  28. package/dist/Gizmo.js +60 -0
  29. package/dist/Gizmo.js.map +1 -0
  30. package/dist/HierarchyModel.d.ts +21 -0
  31. package/dist/HierarchyModel.d.ts.map +1 -0
  32. package/dist/HierarchyModel.js +32 -0
  33. package/dist/HierarchyModel.js.map +1 -0
  34. package/dist/InspectorModel.d.ts +16 -0
  35. package/dist/InspectorModel.d.ts.map +1 -0
  36. package/dist/InspectorModel.js +53 -0
  37. package/dist/InspectorModel.js.map +1 -0
  38. package/dist/LocalizationAccessibilityFixtures.d.ts +70 -0
  39. package/dist/LocalizationAccessibilityFixtures.d.ts.map +1 -0
  40. package/dist/LocalizationAccessibilityFixtures.js +275 -0
  41. package/dist/LocalizationAccessibilityFixtures.js.map +1 -0
  42. package/dist/MaterialVariantWorkflow.d.ts +19 -0
  43. package/dist/MaterialVariantWorkflow.d.ts.map +1 -0
  44. package/dist/MaterialVariantWorkflow.js +82 -0
  45. package/dist/MaterialVariantWorkflow.js.map +1 -0
  46. package/dist/PickingService.d.ts +58 -0
  47. package/dist/PickingService.d.ts.map +1 -0
  48. package/dist/PickingService.js +119 -0
  49. package/dist/PickingService.js.map +1 -0
  50. package/dist/PlayModeBridge.d.ts +14 -0
  51. package/dist/PlayModeBridge.d.ts.map +1 -0
  52. package/dist/PlayModeBridge.js +23 -0
  53. package/dist/PlayModeBridge.js.map +1 -0
  54. package/dist/PrefabRegistry.d.ts +41 -0
  55. package/dist/PrefabRegistry.d.ts.map +1 -0
  56. package/dist/PrefabRegistry.js +119 -0
  57. package/dist/PrefabRegistry.js.map +1 -0
  58. package/dist/ProjectSerializer.d.ts +82 -0
  59. package/dist/ProjectSerializer.d.ts.map +1 -0
  60. package/dist/ProjectSerializer.js +131 -0
  61. package/dist/ProjectSerializer.js.map +1 -0
  62. package/dist/RotateGizmo.d.ts +5 -0
  63. package/dist/RotateGizmo.d.ts.map +1 -0
  64. package/dist/RotateGizmo.js +37 -0
  65. package/dist/RotateGizmo.js.map +1 -0
  66. package/dist/ScaleGizmo.d.ts +5 -0
  67. package/dist/ScaleGizmo.d.ts.map +1 -0
  68. package/dist/ScaleGizmo.js +42 -0
  69. package/dist/ScaleGizmo.js.map +1 -0
  70. package/dist/Selection.d.ts +20 -0
  71. package/dist/Selection.d.ts.map +1 -0
  72. package/dist/Selection.js +46 -0
  73. package/dist/Selection.js.map +1 -0
  74. package/dist/ShaderGraphModel.d.ts +69 -0
  75. package/dist/ShaderGraphModel.d.ts.map +1 -0
  76. package/dist/ShaderGraphModel.js +172 -0
  77. package/dist/ShaderGraphModel.js.map +1 -0
  78. package/dist/StaticExportRuntime.d.ts +13 -0
  79. package/dist/StaticExportRuntime.d.ts.map +1 -0
  80. package/dist/StaticExportRuntime.js +307 -0
  81. package/dist/StaticExportRuntime.js.map +1 -0
  82. package/dist/TimelineModel.d.ts +175 -0
  83. package/dist/TimelineModel.d.ts.map +1 -0
  84. package/dist/TimelineModel.js +335 -0
  85. package/dist/TimelineModel.js.map +1 -0
  86. package/dist/TimelineRuntimeBridge.d.ts +98 -0
  87. package/dist/TimelineRuntimeBridge.d.ts.map +1 -0
  88. package/dist/TimelineRuntimeBridge.js +186 -0
  89. package/dist/TimelineRuntimeBridge.js.map +1 -0
  90. package/dist/TranslateGizmo.d.ts +5 -0
  91. package/dist/TranslateGizmo.d.ts.map +1 -0
  92. package/dist/TranslateGizmo.js +41 -0
  93. package/dist/TranslateGizmo.js.map +1 -0
  94. package/dist/commands/CreateNodeCommand.d.ts +14 -0
  95. package/dist/commands/CreateNodeCommand.d.ts.map +1 -0
  96. package/dist/commands/CreateNodeCommand.js +16 -0
  97. package/dist/commands/CreateNodeCommand.js.map +1 -0
  98. package/dist/commands/DeleteNodeCommand.d.ts +13 -0
  99. package/dist/commands/DeleteNodeCommand.d.ts.map +1 -0
  100. package/dist/commands/DeleteNodeCommand.js +55 -0
  101. package/dist/commands/DeleteNodeCommand.js.map +1 -0
  102. package/dist/commands/ReparentNodeCommand.d.ts +24 -0
  103. package/dist/commands/ReparentNodeCommand.d.ts.map +1 -0
  104. package/dist/commands/ReparentNodeCommand.js +39 -0
  105. package/dist/commands/ReparentNodeCommand.js.map +1 -0
  106. package/dist/commands/SetPropertyCommand.d.ts +14 -0
  107. package/dist/commands/SetPropertyCommand.d.ts.map +1 -0
  108. package/dist/commands/SetPropertyCommand.js +43 -0
  109. package/dist/commands/SetPropertyCommand.js.map +1 -0
  110. package/dist/commands/TransformCommand.d.ts +42 -0
  111. package/dist/commands/TransformCommand.d.ts.map +1 -0
  112. package/dist/commands/TransformCommand.js +72 -0
  113. package/dist/commands/TransformCommand.js.map +1 -0
  114. package/dist/index.d.ts +49 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +29 -0
  117. package/dist/index.js.map +1 -0
  118. package/package.json +17 -0
  119. package/src/Command.ts +11 -0
  120. package/src/CommandHistory.ts +136 -0
  121. package/src/DiagnosticsOverlayModel.ts +85 -0
  122. package/src/EditorPluginHost.ts +106 -0
  123. package/src/EditorRuntime.ts +349 -0
  124. package/src/EditorStateModel.ts +336 -0
  125. package/src/Gizmo.ts +101 -0
  126. package/src/HierarchyModel.ts +57 -0
  127. package/src/InspectorModel.ts +71 -0
  128. package/src/LocalizationAccessibilityFixtures.ts +368 -0
  129. package/src/MaterialVariantWorkflow.ts +101 -0
  130. package/src/PickingService.ts +174 -0
  131. package/src/PlayModeBridge.ts +27 -0
  132. package/src/PrefabRegistry.ts +164 -0
  133. package/src/ProjectSerializer.ts +200 -0
  134. package/src/RotateGizmo.ts +35 -0
  135. package/src/ScaleGizmo.ts +40 -0
  136. package/src/Selection.ts +63 -0
  137. package/src/ShaderGraphModel.ts +254 -0
  138. package/src/StaticExportRuntime.ts +322 -0
  139. package/src/TimelineModel.ts +466 -0
  140. package/src/TimelineRuntimeBridge.ts +280 -0
  141. package/src/TranslateGizmo.ts +39 -0
  142. package/src/commands/CreateNodeCommand.ts +23 -0
  143. package/src/commands/DeleteNodeCommand.ts +74 -0
  144. package/src/commands/ReparentNodeCommand.ts +55 -0
  145. package/src/commands/SetPropertyCommand.ts +47 -0
  146. package/src/commands/TransformCommand.ts +107 -0
  147. package/src/index.ts +85 -0
  148. package/tests/editor-runtime.test.ts +597 -0
  149. package/tsconfig.json +7 -0
@@ -0,0 +1,307 @@
1
+ const defaultGlobalName = "__AURA3D_EXPORTED_PROJECT__";
2
+ const defaultCanvasSelector = "#aura3d-export";
3
+ const defaultStatusSelector = "#aura3d-export-status";
4
+ const defaultProjectPath = "./project.json";
5
+ export function createStaticExportRuntime(options = {}) {
6
+ const globalName = options.globalName ?? defaultGlobalName;
7
+ const canvasSelector = options.canvasSelector ?? defaultCanvasSelector;
8
+ const statusSelector = options.statusSelector ?? defaultStatusSelector;
9
+ const projectPath = options.projectPath ?? defaultProjectPath;
10
+ return `const status = document.querySelector(${JSON.stringify(statusSelector)});
11
+ const canvas = document.querySelector(${JSON.stringify(canvasSelector)});
12
+ const context = canvas.getContext("2d");
13
+ const project = await fetch(${JSON.stringify(projectPath)}).then((response) => response.json());
14
+ const provenanceOperations = project.metadata.provenance?.operations?.map((operation) => operation.id) ?? [];
15
+ const startedAt = performance.now();
16
+ let selectedIndex = 0;
17
+ let interactions = 0;
18
+ let scriptTickCount = 0;
19
+ function nodePosition(node, index) {
20
+ const elapsed = (performance.now() - startedAt) / 1000;
21
+ const scriptedBounce = node.script?.enabled && /bounce/i.test(node.script.behavior ?? "") ? Math.sin(elapsed * 3.2) * 16 : 0;
22
+ return {
23
+ x: canvas.width / 2 + node.transform.position[0] * 120 + index * 22,
24
+ y: canvas.height / 2 - node.transform.position[1] * 90 + index * 18 + scriptedBounce
25
+ };
26
+ }
27
+ function featureEvidence() {
28
+ return {
29
+ importedAssetNames: project.assets.map((asset) => asset.name),
30
+ importedAssetUris: project.assets.map((asset) => asset.uri),
31
+ editedMaterials: project.scene.nodes.map((node) => ({
32
+ node: node.name,
33
+ name: node.material?.name ?? "",
34
+ baseColor: node.material?.baseColor ?? "",
35
+ metallic: node.material?.metallic ?? 0,
36
+ roughness: node.material?.roughness ?? 0,
37
+ textureSlots: node.material?.textureSlots ?? {}
38
+ })),
39
+ lights: project.scene.nodes.filter((node) => node.light?.kind && node.light.kind !== "none").map((node) => ({ node: node.name, kind: node.light.kind, intensity: node.light.intensity })),
40
+ cameras: project.scene.nodes.filter((node) => node.camera?.enabled).map((node) => ({ node: node.name, fov: node.camera.fov })),
41
+ physicsBodies: project.scene.nodes.filter((node) => node.physics?.body && node.physics.body !== "none").map((node) => ({ node: node.name, body: node.physics.body, collider: node.physics.collider })),
42
+ configuredBehaviors: project.scene.nodes.filter((node) => node.script?.enabled && node.script.behavior).map((node) => ({ node: node.name, behavior: node.script.behavior })),
43
+ particleEmitters: project.scene.nodes.filter((node) => node.particleEmitter?.enabled).map((node) => ({ node: node.name, preset: node.particleEmitter.preset, emissionRate: node.particleEmitter.emissionRate })),
44
+ playBehavior: project.scene.nodes.some((node) => node.script?.enabled || node.animation?.enabled || node.particleEmitter?.enabled),
45
+ usesEditorCode: false,
46
+ exportProvenance: provenanceOperations.includes("static-export") && provenanceOperations.includes("static-export-runtime")
47
+ };
48
+ }
49
+ function publish() {
50
+ const evidence = featureEvidence();
51
+ window[${JSON.stringify(globalName)}] = {
52
+ id: "external-editor-authored-app",
53
+ status: "ready",
54
+ renderer: "canvas2d-static-export",
55
+ visualClaim: "Browser-first local authoring and static export workflow for the shown ExternalParity app.",
56
+ knownLimits: [
57
+ "This exported app proves a browser editor author/export workflow, not a Unity or Unreal replacement.",
58
+ "The static export visualizes project-authored model metadata with canvas2D shapes; it does not load the editor shell.",
59
+ "Imported glTF asset references, material edits, lights, cameras, physics, scripts, and play behavior are preserved in project data and runtime evidence."
60
+ ],
61
+ claimBoundary: {
62
+ allowed: "browser-first local authoring workflow for the shown ExternalParity app",
63
+ blocked: ["Unity replacement", "Unreal replacement", "broad Unity/Unreal for the web"]
64
+ },
65
+ errors: [],
66
+ diagnostics: {
67
+ drawCalls: project.scene.nodes.length,
68
+ lastError: null,
69
+ frameTimeMs: Number((performance.now() - startedAt).toFixed(2)),
70
+ scriptTickCount
71
+ },
72
+ screenshotPath: "tests/reports/external-parity-example-screenshots/editor-authoring-external-parity-export.png",
73
+ nodeCount: project.scene.nodes.length,
74
+ assetCount: project.assets.length,
75
+ projectName: project.metadata.name,
76
+ provenanceHash: project.metadata.provenance?.evidenceHash ?? null,
77
+ importedAssetNames: evidence.importedAssetNames,
78
+ editedMaterials: evidence.editedMaterials,
79
+ configuredBehaviors: evidence.configuredBehaviors,
80
+ usesPlayExportPath: evidence.exportProvenance,
81
+ physicsOrScripting: evidence.physicsBodies.length > 0 || evidence.configuredBehaviors.length > 0,
82
+ playBehaviorActive: evidence.playBehavior,
83
+ featureEvidence: evidence,
84
+ selectedNodeName: project.scene.nodes[selectedIndex]?.name ?? null,
85
+ interactions,
86
+ interactive: true
87
+ };
88
+ }
89
+ function draw() {
90
+ scriptTickCount += 1;
91
+ const gradient = context.createLinearGradient(0, 0, 0, canvas.height);
92
+ gradient.addColorStop(0, "#101827");
93
+ gradient.addColorStop(0.62, "#151f2e");
94
+ gradient.addColorStop(1, "#0f1722");
95
+ context.fillStyle = gradient;
96
+ context.fillRect(0, 0, canvas.width, canvas.height);
97
+ context.fillStyle = "#1e293b";
98
+ context.fillRect(0, canvas.height - 150, canvas.width, 150);
99
+ context.strokeStyle = "#263244";
100
+ context.lineWidth = 1;
101
+ for (let x = 40; x < canvas.width; x += 40) {
102
+ context.beginPath();
103
+ context.moveTo(x, 0);
104
+ context.lineTo(x, canvas.height);
105
+ context.stroke();
106
+ }
107
+ for (let y = 40; y < canvas.height; y += 40) {
108
+ context.beginPath();
109
+ context.moveTo(0, y);
110
+ context.lineTo(canvas.width, y);
111
+ context.stroke();
112
+ }
113
+ context.fillStyle = "rgba(15, 23, 42, 0.72)";
114
+ context.fillRect(24, 24, 300, 112);
115
+ context.fillStyle = "#e5edf8";
116
+ context.font = "700 20px ui-sans-serif, system-ui, sans-serif";
117
+ context.fillText(project.metadata.name, 42, 58);
118
+ context.font = "14px ui-sans-serif, system-ui, sans-serif";
119
+ context.fillStyle = "#a7b8cc";
120
+ context.fillText(\`\${project.assets.length} imported assets | \${project.scene.nodes.length} authored nodes\`, 42, 84);
121
+ context.fillText("Static export runtime: editor code absent", 42, 110);
122
+ for (const [index, node] of project.scene.nodes.entries()) {
123
+ const selected = index === selectedIndex;
124
+ const color = node.material?.baseColor ?? "#38d99f";
125
+ const { x, y } = nodePosition(node, index);
126
+ if (node.light?.kind !== "none") {
127
+ context.fillStyle = "rgba(250, 204, 21, 0.2)";
128
+ context.beginPath();
129
+ context.arc(x, y, Math.max(36, node.light.intensity * 54), 0, Math.PI * 2);
130
+ context.fill();
131
+ }
132
+ if (node.mesh?.primitive === "imported" || node.mesh?.assetId) {
133
+ drawImportedModelNode(node, x, y, color);
134
+ } else if (node.camera?.enabled) {
135
+ drawCameraNode(x, y, color);
136
+ } else {
137
+ context.fillStyle = color;
138
+ context.fillRect(x - 42, y - 42, 84, 84);
139
+ }
140
+ context.strokeStyle = selected ? "#facc15" : "#edf2f7";
141
+ context.lineWidth = selected ? 5 : 3;
142
+ context.strokeRect(x - 56, y - 50, 112, 100);
143
+ if (node.physics?.collider && node.physics.collider !== "none") {
144
+ context.setLineDash([7, 5]);
145
+ context.strokeStyle = "#fb7185";
146
+ context.lineWidth = 2;
147
+ context.strokeRect(x - 66, y - 60, 132, 120);
148
+ context.setLineDash([]);
149
+ }
150
+ if (node.camera?.enabled) {
151
+ context.strokeStyle = "#67e8f9";
152
+ context.lineWidth = 2;
153
+ context.beginPath();
154
+ context.moveTo(x + 60, y - 28);
155
+ context.lineTo(x + 112, y - 56);
156
+ context.lineTo(x + 112, y + 56);
157
+ context.lineTo(x + 60, y + 28);
158
+ context.closePath();
159
+ context.stroke();
160
+ }
161
+ if (node.particleEmitter?.enabled) {
162
+ context.fillStyle = "rgba(125, 211, 252, 0.78)";
163
+ for (let particle = 0; particle < 10; particle += 1) {
164
+ const angle = particle * 0.9 + scriptTickCount * 0.04;
165
+ context.beginPath();
166
+ context.arc(x + Math.cos(angle) * (22 + particle * 2), y - 52 - particle * 5, 3, 0, Math.PI * 2);
167
+ context.fill();
168
+ }
169
+ }
170
+ context.fillStyle = selected ? "#facc15" : "#edf2f7";
171
+ context.font = "15px ui-sans-serif, system-ui, sans-serif";
172
+ context.fillText(node.name, x - 56, y + 76);
173
+ }
174
+ status.textContent = \`Loaded \${project.metadata.name}: \${project.scene.nodes.length} nodes | selected \${project.scene.nodes[selectedIndex]?.name ?? "none"} | interactions \${interactions}\`;
175
+ publish();
176
+ }
177
+ function drawImportedModelNode(node, x, y, color) {
178
+ context.save();
179
+ context.translate(x, y);
180
+ context.fillStyle = "rgba(0,0,0,0.28)";
181
+ context.beginPath();
182
+ context.ellipse(0, 54, 58, 14, 0, 0, Math.PI * 2);
183
+ context.fill();
184
+ context.fillStyle = color;
185
+ context.beginPath();
186
+ context.ellipse(-8, 0, 46, 28, -0.12, 0, Math.PI * 2);
187
+ context.fill();
188
+ context.beginPath();
189
+ context.arc(38, -18, 22, 0, Math.PI * 2);
190
+ context.fill();
191
+ context.beginPath();
192
+ context.moveTo(26, -36);
193
+ context.lineTo(36, -64);
194
+ context.lineTo(48, -36);
195
+ context.fill();
196
+ context.beginPath();
197
+ context.moveTo(46, -34);
198
+ context.lineTo(58, -58);
199
+ context.lineTo(64, -26);
200
+ context.fill();
201
+ context.strokeStyle = "#fed7aa";
202
+ context.lineWidth = 8;
203
+ context.beginPath();
204
+ context.moveTo(-48, -2);
205
+ context.quadraticCurveTo(-86, -44, -118, -12);
206
+ context.stroke();
207
+ context.strokeStyle = "#111827";
208
+ context.lineWidth = 6;
209
+ for (const legX of [-30, -10, 12, 28]) {
210
+ context.beginPath();
211
+ context.moveTo(legX, 22);
212
+ context.lineTo(legX - 8, 54);
213
+ context.stroke();
214
+ }
215
+ context.fillStyle = "#111827";
216
+ context.beginPath();
217
+ context.arc(47, -24, 3, 0, Math.PI * 2);
218
+ context.fill();
219
+ context.restore();
220
+ }
221
+ function drawCameraNode(x, y, color) {
222
+ context.fillStyle = color;
223
+ context.fillRect(x - 40, y - 26, 70, 52);
224
+ context.beginPath();
225
+ context.moveTo(x + 30, y - 20);
226
+ context.lineTo(x + 68, y - 40);
227
+ context.lineTo(x + 68, y + 40);
228
+ context.lineTo(x + 30, y + 20);
229
+ context.closePath();
230
+ context.fill();
231
+ }
232
+ canvas.tabIndex = 0;
233
+ canvas.addEventListener("click", (event) => {
234
+ const bounds = canvas.getBoundingClientRect();
235
+ const scaleX = canvas.width / Math.max(1, bounds.width);
236
+ const scaleY = canvas.height / Math.max(1, bounds.height);
237
+ const x = (event.clientX - bounds.left) * scaleX;
238
+ const y = (event.clientY - bounds.top) * scaleY;
239
+ const hitIndex = project.scene.nodes.findIndex((node, index) => {
240
+ const position = nodePosition(node, index);
241
+ return Math.abs(x - position.x) <= 48 && Math.abs(y - position.y) <= 48;
242
+ });
243
+ selectedIndex = hitIndex >= 0 ? hitIndex : (selectedIndex + 1) % Math.max(1, project.scene.nodes.length);
244
+ interactions += 1;
245
+ canvas.focus();
246
+ draw();
247
+ });
248
+ canvas.addEventListener("keydown", (event) => {
249
+ if (event.key !== "ArrowRight" && event.key !== "ArrowLeft") return;
250
+ const direction = event.key === "ArrowRight" ? 1 : -1;
251
+ selectedIndex = (selectedIndex + direction + project.scene.nodes.length) % Math.max(1, project.scene.nodes.length);
252
+ interactions += 1;
253
+ event.preventDefault();
254
+ draw();
255
+ });
256
+ function frame() {
257
+ draw();
258
+ requestAnimationFrame(frame);
259
+ }
260
+ frame();
261
+ `;
262
+ }
263
+ export function createStaticExportHtml(options) {
264
+ const runtimePath = options.runtimePath ?? "./runtime.js";
265
+ return `<!doctype html>
266
+ <html lang="en">
267
+ <head>
268
+ <meta charset="utf-8">
269
+ <meta name="viewport" content="width=device-width, initial-scale=1">
270
+ <title>${escapeHtml(options.title)}</title>
271
+ <style>
272
+ html, body { margin: 0; min-height: 100%; background: #10151f; color: #edf2f7; font-family: Inter, ui-sans-serif, system-ui, sans-serif; }
273
+ main { display: grid; min-height: 100vh; place-items: center; padding: 24px; }
274
+ canvas { width: min(920px, 100%); height: 520px; border: 1px solid #334155; background: #121a26; }
275
+ .hud { position: fixed; left: 20px; top: 16px; padding: 10px 12px; background: rgba(15, 23, 42, 0.86); border: 1px solid #334155; border-radius: 6px; }
276
+ </style>
277
+ </head>
278
+ <body>
279
+ <main>
280
+ <canvas id="aura3d-export" width="920" height="520"></canvas>
281
+ <div class="hud" id="aura3d-export-status">Loading export...</div>
282
+ </main>
283
+ <script type="module" src="${escapeAttribute(runtimePath)}"></script>
284
+ </body>
285
+ </html>
286
+ `;
287
+ }
288
+ function escapeHtml(value) {
289
+ return value.replace(/[&<>"']/g, (character) => {
290
+ switch (character) {
291
+ case "&":
292
+ return "&amp;";
293
+ case "<":
294
+ return "&lt;";
295
+ case ">":
296
+ return "&gt;";
297
+ case '"':
298
+ return "&quot;";
299
+ default:
300
+ return "&#39;";
301
+ }
302
+ });
303
+ }
304
+ function escapeAttribute(value) {
305
+ return escapeHtml(value);
306
+ }
307
+ //# sourceMappingURL=StaticExportRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticExportRuntime.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/StaticExportRuntime.ts"],"names":[],"mappings":"AAYA,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AACxD,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAC/C,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AACtD,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,MAAM,UAAU,yBAAyB,CAAC,UAAsC,EAAE;IAChF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAC3D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC;IACvE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC9D,OAAO,yCAAyC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;wCACxC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;8BAExC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAsC9C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkNpC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,cAAc,CAAC;IAC1D,OAAO;;;;;aAKI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;iCAaL,eAAe,CAAC,WAAW,CAAC;;;CAG5D,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;QAC7C,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,GAAG;gBACN,OAAO,OAAO,CAAC;YACjB,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,GAAG;gBACN,OAAO,QAAQ,CAAC;YAClB;gBACE,OAAO,OAAO,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,175 @@
1
+ export type TimelineLoopMode = "none" | "loop" | "pingpong";
2
+ export type TimelineClipBlendMode = "replace" | "additive" | "multiply" | "mix";
3
+ export type TimelineEasingName = "linear" | "ease-in" | "ease-out" | "ease-in-out";
4
+ export interface TimelineClipConfig {
5
+ readonly id?: string;
6
+ readonly name: string;
7
+ readonly startTime: number;
8
+ readonly duration: number;
9
+ readonly assetId?: string;
10
+ readonly clipName?: string;
11
+ readonly easeInDuration?: number;
12
+ readonly easeOutDuration?: number;
13
+ readonly easeIn?: TimelineEasingName;
14
+ readonly easeOut?: TimelineEasingName;
15
+ readonly speedMultiplier?: number;
16
+ readonly blendMode?: TimelineClipBlendMode;
17
+ readonly weight?: number;
18
+ readonly clipInOffset?: number;
19
+ readonly properties?: Record<string, string | number | boolean>;
20
+ }
21
+ export interface TimelineTrackConfig {
22
+ readonly id?: string;
23
+ readonly name: string;
24
+ readonly type: "animation" | "selection" | "signal" | "audio" | "camera" | "generic";
25
+ readonly muted?: boolean;
26
+ readonly locked?: boolean;
27
+ readonly weight?: number;
28
+ readonly clips?: readonly TimelineClipConfig[];
29
+ readonly properties?: Record<string, string | number | boolean>;
30
+ }
31
+ export interface TimelineModelConfig {
32
+ readonly id?: string;
33
+ readonly name?: string;
34
+ readonly duration?: number;
35
+ readonly loopMode?: TimelineLoopMode;
36
+ readonly speed?: number;
37
+ readonly frameRate?: number;
38
+ readonly tracks?: readonly TimelineTrackConfig[];
39
+ }
40
+ export interface TimelineActiveClipSnapshot {
41
+ readonly trackId: string;
42
+ readonly trackName: string;
43
+ readonly trackType: TimelineTrackConfig["type"];
44
+ readonly clipId: string;
45
+ readonly clipName: string;
46
+ readonly assetId?: string;
47
+ readonly assetClipName?: string;
48
+ readonly runtimeTargetId?: string;
49
+ readonly localTime: number;
50
+ readonly assetTime: number;
51
+ readonly normalizedTime: number;
52
+ readonly blendWeight: number;
53
+ readonly blendMode: TimelineClipBlendMode;
54
+ readonly properties: Record<string, string | number | boolean>;
55
+ }
56
+ export interface TimelineSignalEventSnapshot {
57
+ readonly trackId: string;
58
+ readonly trackName: string;
59
+ readonly clipId: string;
60
+ readonly clipName: string;
61
+ readonly event: string;
62
+ readonly time: number;
63
+ readonly localTime: number;
64
+ readonly properties: Record<string, string | number | boolean>;
65
+ }
66
+ export interface TimelineTrackSnapshot {
67
+ readonly id: string;
68
+ readonly name: string;
69
+ readonly type: TimelineTrackConfig["type"];
70
+ readonly muted: boolean;
71
+ readonly locked: boolean;
72
+ readonly weight: number;
73
+ readonly clipCount: number;
74
+ }
75
+ export interface TimelineSnapshot {
76
+ readonly id: string;
77
+ readonly name: string;
78
+ readonly playback: "playing" | "paused";
79
+ readonly time: number;
80
+ readonly normalizedTime: number;
81
+ readonly duration: number;
82
+ readonly loopMode: TimelineLoopMode;
83
+ readonly speed: number;
84
+ readonly frameRate: number;
85
+ readonly direction: 1 | -1;
86
+ readonly trackCount: number;
87
+ readonly clipCount: number;
88
+ readonly activeClipCount: number;
89
+ readonly activeClips: readonly TimelineActiveClipSnapshot[];
90
+ readonly tracks: readonly TimelineTrackSnapshot[];
91
+ readonly signalEvents: readonly string[];
92
+ readonly signalEventDetails: readonly TimelineSignalEventSnapshot[];
93
+ readonly evidence: {
94
+ readonly oldCodebasePort: true;
95
+ readonly boundedTimelineAuthoring: true;
96
+ readonly clipEasing: boolean;
97
+ readonly clipBlending: boolean;
98
+ readonly muteLockState: boolean;
99
+ readonly loopPlayback: boolean;
100
+ readonly signalMarkers: boolean;
101
+ };
102
+ }
103
+ export declare class TimelineClip {
104
+ readonly id: string;
105
+ name: string;
106
+ startTime: number;
107
+ duration: number;
108
+ assetId?: string;
109
+ clipName?: string;
110
+ easeInDuration: number;
111
+ easeOutDuration: number;
112
+ easeIn: TimelineEasingName;
113
+ easeOut: TimelineEasingName;
114
+ speedMultiplier: number;
115
+ blendMode: TimelineClipBlendMode;
116
+ weight: number;
117
+ clipInOffset: number;
118
+ readonly properties: Record<string, string | number | boolean>;
119
+ enabled: boolean;
120
+ constructor(config: TimelineClipConfig);
121
+ get endTime(): number;
122
+ contains(time: number): boolean;
123
+ localTime(time: number): number;
124
+ assetTime(time: number): number;
125
+ normalizedTime(time: number): number;
126
+ blendWeight(time: number): number;
127
+ toConfig(): TimelineClipConfig;
128
+ }
129
+ export declare class TimelineTrack {
130
+ readonly id: string;
131
+ name: string;
132
+ readonly type: TimelineTrackConfig["type"];
133
+ muted: boolean;
134
+ locked: boolean;
135
+ weight: number;
136
+ readonly properties: Record<string, string | number | boolean>;
137
+ private readonly clipsInternal;
138
+ constructor(config: TimelineTrackConfig);
139
+ get clips(): readonly TimelineClip[];
140
+ addClip(clip: TimelineClip, options?: {
141
+ readonly ignoreLock?: boolean;
142
+ }): TimelineClip;
143
+ activeClips(time: number): readonly TimelineClip[];
144
+ snapshot(): TimelineTrackSnapshot;
145
+ toConfig(): TimelineTrackConfig;
146
+ }
147
+ export declare class TimelineModel {
148
+ readonly id: string;
149
+ name: string;
150
+ duration: number;
151
+ loopMode: TimelineLoopMode;
152
+ speed: number;
153
+ frameRate: number;
154
+ private readonly tracksInternal;
155
+ private playing;
156
+ private timeInternal;
157
+ private directionInternal;
158
+ private readonly emittedSignals;
159
+ constructor(config?: TimelineModelConfig);
160
+ get tracks(): readonly TimelineTrack[];
161
+ get currentTime(): number;
162
+ get isPlaying(): boolean;
163
+ addTrack(track: TimelineTrack): TimelineTrack;
164
+ clearTracks(): void;
165
+ play(): void;
166
+ pause(): void;
167
+ stop(): void;
168
+ seek(time: number): void;
169
+ setNormalizedTime(value: number): void;
170
+ tick(deltaSeconds: number): void;
171
+ snapshot(): TimelineSnapshot;
172
+ toConfig(): TimelineModelConfig;
173
+ private wrapTime;
174
+ }
175
+ //# sourceMappingURL=TimelineModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineModel.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/TimelineModel.ts"],"names":[],"mappings":"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"}