mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-25 10:37:11 -06:00
The catalog Store on the web is an in-memory mirror (apps/lightcraft-web/src/files.rs) loaded from browser storage at start-up and flushed in the background in modification order (so a snapshot always lands before the log reset that follows it). Storage is OPFS when writable from the main thread (createWritable), else IndexedDB (?store=idb forces it); ?reset clears it. Imported originals are stored as originals/<content hash> and referenced as web/<hash>/<name>; the main thread keeps a bounded memory cache and loads misses (and the active photo) asynchronously. view.json and ui.json are saved every second when changed. Engine: Session::open_library_in(LibraryStores) opens a library from any Store (presets, view and prefs go through it too); Session::save_view; Copy imports into a non-disk library add. JS automation API: lightcraft.command(id, paramsJson) (+ web.stats). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
1.8 KiB
HTML
42 lines
1.8 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>LightCraft</title>
|
|
<link rel="icon" href="data:,">
|
|
<meta name="description" content="LightCraft: open-source photo library and raw developer, running in your browser (WASM).">
|
|
<style>
|
|
:root { color-scheme: dark; }
|
|
html, body { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; background: #1c1c1c; }
|
|
canvas#lightcraft_canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
|
|
#lightcraft_loading {
|
|
position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
|
|
color: #b8b8b8; font: 15px/1.4 system-ui, -apple-system, "Segoe UI", sans-serif; pointer-events: none;
|
|
}
|
|
#lightcraft_status { position: absolute; left: 0; bottom: 0; width: 1px; height: 1px; overflow: hidden; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<canvas id="lightcraft_canvas"></canvas>
|
|
<div id="lightcraft_loading">Loading LightCraft…</div>
|
|
<div id="lightcraft_status" aria-live="polite"></div>
|
|
<script type="module">
|
|
import init, { start, command } from "./lightcraft_web.js";
|
|
(async () => {
|
|
// Compile once; the render workers (worker.js) instantiate the same compiled module.
|
|
const module = await WebAssembly.compileStreaming(fetch("./lightcraft_web_bg.wasm"));
|
|
globalThis.lightcraftModule = module;
|
|
await init({ module_or_path: module });
|
|
// automation: `await lightcraft.command("library.info", "{}")` → JSON text
|
|
globalThis.lightcraft = { command };
|
|
start();
|
|
})().catch((e) => {
|
|
console.error(e);
|
|
const el = document.getElementById("lightcraft_loading");
|
|
if (el) el.textContent = "LightCraft failed to load: " + e;
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|