mirror of
https://github.com/storytold/lightcraft.git
synced 2026-11-03 15:11:15 -06:00
- brand.toml is the only place the product name lives; every crate and app
reads it through dac-brand (env vars with legacy fallback, settings folder
with copy-only migration, default library, preset extensions, i18n {app})
- cargo xtask brand check|test, run|install|package, docs, rename-crates,
deny and immich; packaging files are templates rendered from brand.toml
- icons regenerated from brand/icon.svg; upstream branding removed
- MIT licence (segment and fetch stay Apache-2.0); cargo deny licence policy
- clean-room rules in AGENTS.md/CLAUDE.md; docs/upstream-merge.md
- plan/ rebuilt and committed; parity tracker reopens Classic rows, adds
PLAN.md section 2 rows and the IMM Immich section; plan/immich.md and a
pinned Immich test server
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
50 lines
2.2 KiB
HTML
50 lines
2.2 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Loading…</title>
|
|
<link rel="icon" href="data:,">
|
|
<meta name="description" content="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#app_canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
|
|
#app_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;
|
|
}
|
|
#app_status { position: absolute; left: 0; bottom: 0; width: 1px; height: 1px; overflow: hidden; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<canvas id="app_canvas"></canvas>
|
|
<div id="app_loading">Loading…</div>
|
|
<div id="app_status" aria-live="polite"></div>
|
|
<script type="module">
|
|
import init, { start, command } from "./dac_web.js";
|
|
(async () => {
|
|
// The Chinese font is a separate file: embedding it would exceed the host's WASM size limit.
|
|
// Font-free development builds can still run, with the same missing-glyph warning as before.
|
|
const chineseFont = fetch("./app_zh_hans.otf")
|
|
.then(async response => response.ok ? new Uint8Array(await response.arrayBuffer()) : new Uint8Array())
|
|
.catch(() => new Uint8Array());
|
|
// Compile once; the render workers (worker.js) instantiate the same compiled module.
|
|
const [module, font] = await Promise.all([
|
|
WebAssembly.compileStreaming(fetch("./dac_web_bg.wasm")),
|
|
chineseFont,
|
|
]);
|
|
globalThis.appModule = module;
|
|
await init({ module_or_path: module });
|
|
// automation: `await app.command("library.info", "{}")` → JSON text
|
|
globalThis.app = { command };
|
|
start(font);
|
|
})().catch((e) => {
|
|
console.error(e);
|
|
const el = document.getElementById("app_loading");
|
|
if (el) el.textContent = "Failed to load: " + e;
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|