docs: ленивый арт мебели — ARCHITECTURE, FURNITURE, отпечаток скриншотов

Issue: #474
User-Visible: no
This commit is contained in:
Codex
2026-09-06 16:10:53 +03:00
parent 74eca9bdd1
commit 605a9a1c78
4 changed files with 33 additions and 15 deletions
+2 -2
View File
@@ -49,8 +49,8 @@ const demoHtml = (withFurniture, twoCards) => {
const run = async ({ furniture, twoCards = false, chunk = 'serve', delayMs = 0 }) => {
const browser = await chromium.launch({ args: ['--no-sandbox'] });
const page = await (await browser.newContext({ viewport: { width: 820, height: 760 } })).newPage();
watchPage(page);
const ctx = await browser.newContext({ viewport: { width: 820, height: 760 } });
const page = watchPage(await ctx.newPage());
const requests = [];
let artRequests = 0;
await page.route('**/*', async (route) => {
+9
View File
@@ -28,6 +28,7 @@ houseplan-card/
│ ├─ decor-image-editor.ts # lazy Background/Furniture image palette, upload and properties controller
│ ├─ houseplan-onboarding-runtime.ts # first-space/import dialogs, independent of editor
│ ├─ iso-scene-render.ts # hidden alpha-only Stage 3 scene/runtime boundary
│ ├─ furniture-art-runtime.ts # page-scoped lazy designer furniture artwork (ready/pending/fallback)
│ ├─ iso-overlays.ts # pure raised-overlay ownership, collision and nudge
│ ├─ hp-dialog.ts # shared HA/native modal shell, focus and transient-overlay lifecycle
│ ├─ hp-confirm.ts # presentation for shared dangerous-action confirmation
@@ -184,6 +185,14 @@ the same profiler available between stable promotions.
start. Two failed content-hashed attempts settle on English rather than
leaving an inert surface. The bundle manifest classifies this graph as
`lazyLocaleFiles`, separate from editor and onboarding graphs.
Designer furniture artwork follows the same shape (#474): the catalogue
(ids, groups, default sizes) stays eager, the 44 SVG drawings live in
`lazyFurnitureArtFiles` behind `FURNITURE_ART_RUNTIME`. Plan intake starts
the load only when the plan draws a designer piece, the boot veil holds
until the runtime settles (within the veil's hard cap), the editor imports
the drawings statically and hands them over synchronously (`adopt`), and
two failed content-hashed attempts — or a chunk from another build — settle
into `fallback`: pieces render as unknown symbols and one toast is shown.
8. **One four-phase environment resolver.** `resolveDayCycle()` in `src/sun.ts`
atomically chooses a strict real `sun.sun` sample or browser-local clock
fallback and returns only phase/source/light tokens. `src/day-cycle-render.ts`
+11 -2
View File
@@ -35,7 +35,11 @@ npm run furniture:check
The generator validates a deliberately small, inert SVG subset and produces:
- `src/furniture-plan-art.generated.ts` for the initial View graph;
- `src/furniture-plan-catalog.generated.ts` — ids, groups, categories and
default sizes; the only part of the pack in the initial View graph;
- `src/furniture-plan-art.generated.ts` — the 44 top-view drawings, a lazy
chunk (#474) loaded by `src/furniture-art-runtime.ts` when a plan draws a
designer piece and imported statically by the editor;
- `src/furniture-menu-art.generated.ts` for the lazy editor graph only.
Generated files are never edited manually. The 77 drawings were created by
@@ -134,7 +138,12 @@ ids preserve their identity; the remaining old ids remain available. Default
dimensions change only for a newly picked replacement—an already saved
object's `w` and `h` are never rewritten.
Plan artwork is available in View and kiosk. Front-view menu art is imported
Plan artwork is available in View and kiosk: a plan with designer furniture
requests the artwork chunk once per page before its first frame, and the
first-open veil waits for it; a plan without furniture never requests it.
If the chunk cannot be loaded, designer pieces render as unknown symbols —
nothing — until the page reloads, and a toast says so once; the 12 retained
primitive symbols draw regardless. Front-view menu art is imported
only after the editor runtime is requested. Touch View/kiosk support is
blocking; editor ergonomics on touch remain best effort under
`docs/TOUCH-SUPPORT.md`.
+11 -11
View File
@@ -3,7 +3,7 @@
"fixture": "synthetic-only",
"chromium": "151.0.7922.34",
"oxipng": "oxipng 10.2.0",
"sourceFingerprint": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceFingerprint": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"captureScriptSha256": "cadb8e1bcab9f1dcdd7d75b3b90ddcbaaeb2b8c2a098f575a21f39ff70f5c59c",
"command": "npm run build && node demo/docs/capture.mjs",
"scenarios": {
@@ -15,7 +15,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "80a70361dc18dd0461568df332062e6482c633af5d280954f8b675701418a76d"
},
"view-touch": {
@@ -26,7 +26,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "4106cc28847047505f46921ff95765d8abdf5b382d9d17d4c5e4ad129dd8f6be"
},
"space-create": {
@@ -37,7 +37,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "9f0970de09772674c3156b9fc5b2d49de0ceb22be11ecf8b136047d37d100a84"
},
"room-contour-close": {
@@ -48,7 +48,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "1dab6cc3b9d1bf7d8c40f0e5137f8c688683c9b7eabc5167da99d41ecfdd5b79"
},
"plan-context-tray": {
@@ -59,7 +59,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "94ef50762753c0ac6ddc84d2521c4232a3f9ecd89843810d2df61c517592bed7"
},
"device-editor": {
@@ -70,7 +70,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "53bcd3dd041c8ddef7c2d5a9defc7ebfc10b296849dad0c2115603009c715f6b"
},
"device-display-preview": {
@@ -81,7 +81,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "c797362e523e7ea42cab19e9e3dca374bce9e786cb84601993d235264b040d1e"
},
"background-editor": {
@@ -92,7 +92,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "054170fd9ef45762b602b4d5c9c3b9ea9724858be61af137970c246f485c13bb"
},
"room-card": {
@@ -103,7 +103,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "2ae4a58853d98e10d12456b2078ec2f6a0b597722c8310d7b016abd2bc42561e"
},
"device-info": {
@@ -114,7 +114,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "8e63cfc0f990da55e9b9a9f6691503693d3b552dad77ee95a720df3aa16fc297",
"sourceSha256": "3ff112535e9aec7c91d06a8d72af82d81b3b36956610469c572e505947b18b3b",
"imageSha256": "aeeadb860404c3cbd130e858db6dd1d78b7001a6855405034a86959a9bc35669"
}
},