From 605a9a1c786c0403416f7ca08bbbfd61d6add8b0 Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 6 Sep 2026 16:05:23 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BB=D0=B5=D0=BD=D0=B8=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=B0=D1=80=D1=82=20=D0=BC=D0=B5=D0=B1=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=20=E2=80=94=20ARCHITECTURE,=20FURNITURE,=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BE=D0=BA=20=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D1=88=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue: #474 User-Visible: no --- demo/smoke_furniture_lazy_art.mjs | 4 ++-- docs/ARCHITECTURE.md | 9 +++++++++ docs/FURNITURE.md | 13 +++++++++++-- docs/images/screenshots.json | 22 +++++++++++----------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/demo/smoke_furniture_lazy_art.mjs b/demo/smoke_furniture_lazy_art.mjs index fb69b9c5..b4f24216 100755 --- a/demo/smoke_furniture_lazy_art.mjs +++ b/demo/smoke_furniture_lazy_art.mjs @@ -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) => { diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 26562eb2..540759e8 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -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` diff --git a/docs/FURNITURE.md b/docs/FURNITURE.md index 3a5b828f..22680ebb 100644 --- a/docs/FURNITURE.md +++ b/docs/FURNITURE.md @@ -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`. diff --git a/docs/images/screenshots.json b/docs/images/screenshots.json index 0b51c7b4..c3a28665 100644 --- a/docs/images/screenshots.json +++ b/docs/images/screenshots.json @@ -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" } },