Add browser-only editor export and 2.5D runtime presentation

This commit is contained in:
emil28092005
2026-09-12 00:05:19 +03:00
parent a25ed40805
commit 1a0bf725fa
16 changed files with 883 additions and 53 deletions
+35
View File
@@ -0,0 +1,35 @@
import { type Project, clone, validateProject } from '../engine/schema.ts';
import { defaultProject } from '../engine/templates.ts';
import { loadDraft } from './persistence.ts';
export interface EditorStartupOptions { initialProject?: Project; browserOnly?: boolean; }
export async function loadEditorProject(
options: EditorStartupOptions = {},
dependencies: { request: typeof fetch; draft: () => Promise<Project | null> } = { request: fetch, draft: loadDraft },
) {
if (!options.browserOnly) {
try {
const response = await dependencies.request('/api/status', { signal: AbortSignal.timeout(1800) });
if (response.ok) {
const status = await response.json();
if (status.forma) {
const response = await dependencies.request('/api/project');
if (!response.ok) throw Error('Project unavailable');
const { project } = await response.json();
validateProject(project);
return { project: project as Project, status, restored: false };
}
}
} catch {}
}
try {
const project = await dependencies.draft();
if (project) {
validateProject(project);
return { project, status: null, restored: true };
}
} catch {}
const project = clone(options.initialProject || defaultProject());
validateProject(project);
return { project, status: null, restored: false };
}