--- title: Hero Wall Visual Elevation - Plan type: feat date: 2026-10-12 topic: hero-wall-visual-elevation artifact_contract: ce-unified-plan/v1 product_contract_source: ce-brainstorm execution: code ---
Hero Wall Visual Elevation - Plan
Goal Capsule
Objective: A wall owner can compose and share a wall that looks clearly more premium and cohesive than today's flat/pixel default — warm directional light, textured room shell, and a curated set of matching items — without needing custom asset tools.
Means: Ship one first-party hearth hero room material plus a matching hero catalog set in a hybrid visual language, extending the existing material/lighting/catalog pipeline (KTD1–KTD5).
Product authority: This plan owns first-party wall and catalog-item visual elevation only. User creation/generation at that fidelity, full-catalog redraw, and alternate identity directions (Moonroom, Garden Terminal as hero) are surrounding work, not active scope.
Open blockers: None.
Execution profile: Smoke-first for visual units (browser/e2e class assertions + side-by-side visual check); unit/API validation for material enum; keep existing atmosphere e2e green.
Who finishes: Implementer lands units U1–U6; ship via PR when Verification Contract and Definition of Done pass.
Product Contract
Product Contract preservation: Product Contract unchanged (IDs and meaning preserved; planning sections added below).
Summary
Ship a first-party hero composition: one elevated room (wall, floor, window, directional light) and a curated hero catalog set (~8–12 items) that share one light direction and soft grounding shadows. The look is hybrid — clearly above current flat/pixel fidelity, short of full painterly remaster — so a visit-mode wall using only this set looks show-proudly good.
Problem Frame
Digital Walls already lets owners place catalog objects on materials with lighting presets, but the room and items still read as flat stickers. Shared and visit-mode walls underdeliver against the warmer, lit, textured target owners want. Without a first-party visual standard, later creation tools have nothing concrete to aim at.
Key Decisions
- First-party elevation before user creation tools
(session-settled: user-directed — chosen over user-creation tools or bundling both: creation needs a visual standard first). Governs R1–R8; excludes user-gen from active Requirements. - Hero room + hero catalog set as the v1 slice
(session-settled: user-approved — chosen over room-only or wider full-catalog elevation: smallest show-proudly slice). Governs R1–R6. - Hybrid visual language
(session-settled: user-directed — chosen over stay-pure-8-bit or jump-full-painterly: elevate from current state toward the warm reference without a hard rebrand). Governs R2, R4, R5. - Hearth-warm direction for this slice — warm light, collected objects, wood/paper texture language; Moonroom and Garden Terminal stay deferred as alternate identities. Governs R1, R2.
- Mixed old/new assets OK for this slice — existing walls that keep legacy items may look uneven next to the hero set; no migration requirement in v1. Governs R8.
How This Work Fits Together
<!-- ce-section: work-relationships -->
This plan covers first-party hero wall + catalog visual elevation. Broader breakdown below is current understanding, not a committed roadmap.
- User creation / generation at elevated fidelity
- Depends on this plan’s visual standard and hero set as the quality bar
- Can proceed independently of full-catalog redraw once the hero language is locked
- Full catalog + all materials/light presets elevation
- Shares the hybrid language established here
- Can proceed independently after the hero slice proves the look
- Promptable / selectable outside window scenes
- Shares the hero window treatment as a quality bar
- Still to decide relative timing vs this slice
Actors
- A1. Wall owner — edits the wall, picks material/light, adds items from the catalog, and judges whether the wall is showable.
- A2. Visitor — opens a shared/public wall in visit mode and experiences the composed room without edit chrome.
Key Flows
- F1. Compose a hero wall
- Trigger: Owner opens edit mode on a wall.
- Steps: Chooses the hero room treatment (or default that presents it); adds items only from the hero catalog set; arranges them; switches to visit mode.
- Outcome: Visit mode shows a cohesive lit room with grounded items (per R1–R6).
- Covers R1, R3, R4, R5, R6.
- F2. Discover hero items in catalog
- Trigger: Owner opens the catalog while elevating a wall.
- Steps: Finds the hero set as a clear grouping or equivalent affordance; adds items to the wall.
- Outcome: Owner can build the intended composition without hunting across unrelated legacy variants.
- Covers R4, R7.
Requirements
Hero room
- R1. The product exposes one first-party hero room treatment with elevated wall surface, wood floor with visible grain, and a window that shows a richer exterior than today’s flat CSS skyline.
- R2. The hero room uses one directional light mood (warm morning or golden) so light and soft shadow read on wall and floor together.
- R3. In visit mode, when the hero room is active, edit grid/chrome is quieted so the room reads as intentional atmosphere.
Hero catalog set
- R4. The catalog includes a curated hero set of roughly 8–12 items spanning at least: shelf vignette, framed art, cork/photo cluster, plant or vine, lamp or sconce, bag or camera, music object (turntable or stereo), and one or two signs — all in the hybrid visual language.
- R5. Hero items share the hero room’s light direction and cast soft consistent grounding shadows so they read as part of the room, not floating stickers.
- R6. A wall composed only from the hero room + hero set looks clearly more premium in a side-by-side against today’s default flat/pixel presentation.
Catalog presentation & compatibility
- R7. Hero items are discoverable as a coherent set in the catalog (dedicated grouping or equally clear equivalent).
- R8. Existing walls and legacy catalog items continue to work; this slice does not require migrating or redrawing the full catalog.
Acceptance Examples
- AE1. Hero visit composition
- When: An owner applies the hero room, places only hero-set items, and opens visit mode.
- Then: Directional light and soft shadows are visible on wall/floor/items; the composition reads warmer and more grounded than the pre-elevation default.
- Covers R1, R2, R3, R5, R6.
- AE2. Catalog discovery
- When: An owner opens the catalog looking for the elevated set.
- Then: The hero set is findable as a group without opening every legacy category first.
- Covers R4, R7.
- AE3. Legacy wall still loads
- When: An owner opens a wall that still uses pre-elevation materials and items.
- Then: The wall loads and remains editable; no forced migration.
- Covers R8.
Success Criteria
- Side-by-side (before/after or legacy vs hero) shows an obvious quality jump for a hero-only composition.
- A non-designer wall owner can assemble a showable hero wall using only catalog affordances in one sitting.
- Hybrid look is consistent across the hero room and every hero item (no one item that still looks like today’s flat default).
Scope Boundaries
In scope
- One hero room shell (wall, floor, window, one directional light mood)
- Curated hero catalog set (~8–12) with cohesive lighting/shadow treatment
- Visit-mode presentation of that composition
- Catalog discoverability for the hero set
Deferred for later
- User creation / generation tools at elevated fidelity
- Full catalog redraw and elevation of every material/light preset
- Promptable or selectable outside window scenes beyond the hero window treatment
- Moonroom and Garden Terminal as first-class hero identity directions
- Forced migration or dual-tier “classic vs elevated” product model beyond what catalog grouping needs
Outside this product’s identity for this slice
- Becoming a general illustration or AI art studio
- Replacing the personal wall metaphor with a freeform 3D room builder
Dependencies / Assumptions
- Assumed primary beneficiaries are wall owners who share or revisit walls, and visitors who see those walls.
- Assumed evidence of need is the desire to match a warmer, lit reference look; no separate user-research artifact was required for this slice.
- Assumed today’s workaround is living with flat materials/items or avoiding sharing underwhelming walls.
- Assumed mixed legacy + hero items on one wall is acceptable for v1 (no migration).
- Existing materials, lighting presets, catalog types, and sprite pipeline remain the substrate; this slice elevates a curated path rather than replacing the editor architecture.
- Visual reference for target quality: owner-supplied evolution image (bottom-frame quality bar) and
docs/VISUAL_IDENTITY_MOODBOARDS.mdHearth Pixel direction.
Outstanding Questions
Deferred to implementation
- Final pixel/vector art production pipeline for hero PNGs/SVGs (hand-authored vs AI-assisted then curated) — quality bar is R6, not a specific tool.
- Exact hero window exterior subject (coastal vs city vs park) within Hearth-warm palette.
Planning Contract
Key Technical Decisions
- KTD1. New `hearth` material via composable room layers — add a first-class material that elevates CSS wall/floor (
plaster/woodlineage) plus.wall-architectureand a richer.window-view, instead of a greenhouse-style full-room PNG that hides the shell/window and pulls Garden Terminal identity. Legacy materials stay untouched (R8). Governs R1. Cites product Key Decision “Hero room + hero catalog set”. - KTD2. Pair `hearth` with `golden` as the recommended hero light — keep existing lighting enum; UI default when selecting Hearth is
golden(warm directional overlays). Visit mode keeps grid quiet for hearth (existing--grid-alpha: 0). Governs R2, R3. - KTD3. Hero set as sprite assets with dedicated catalog section — ship hero objects as
assets/objects/hero-*.svg(or PNG if fidelity needs it) listed under a top “Hero set” catalog section, reusing the sprite item type; extend label helpers to resolve hero keys. Governs R4, R7. - KTD4. Hybrid render path for hero room + hero assets —
.wall.material-hearthand hero sprites use smooth (image-rendering: auto); soft directional drop-shadows under hearth; legacy materials/sprites stay pixelated. Governs R1, R5, R6. - KTD5. Ambient motion limited to plant + lamp hero sprites — add hero-sprite-specific sway/glow CSS (legacy plant/lamp selectors do not apply to sprites); no full day-cycle system in this slice.
High-Level Technical Design
flowchart LR
subgraph room [Hero room]
M[material-hearth class]
A[wall-architecture + floor]
W[richer window-view]
L[light-golden overlays]
M --> A
M --> W
M --> L
end
subgraph items [Hero catalog]
C[Hero set section]
S[hero-* sprite assets]
C --> S
end
subgraph cohesion [Cohesion layer]
SH[directional soft shadows]
V[visit-mode chrome quiet]
end
room --> cohesion
items --> cohesion
cohesion --> VM[Visit composition AE1]
Layering: composable wall/floor/architecture + richer window; CSS light overlays add directional warmth; hero sprites sit above with shared shadow treatment; visit mode removes edit grid noise.
Assumptions
Recorded because scoping confirmation was skipped (overnight proceed):
- Hero item slate (10): shelf vignette, framed landscape, cork/photo cluster, trailing vine, wall sconce, film camera or bag, turntable, “Collect Moments” sign, book stack, hanging plant — covers R4 categories.
- Hero room exterior inside the window is a warm coastal or sunlit town vignette (Hearth-warm), not Moonroom cool.
dist/mirrors are updated only if the deploy path serves them; source of truth is rootapp.js,styles.css,index.html,assets/, andserver/validation.js.- Side-by-side success proof is a Playwright screenshot artifact plus manual review against the owner reference image — no automated pixel-diff gate required for v1.
- Catalog copy can still say “8-bit” for legacy sections; Hero set section copy should not claim pure 8-bit.
Implementation Constraints
- Material and lighting enums are validated server-side in
server/validation.js; any new material must be added there or saves fail. - Wall geometry remains 1200×800; hero assets must compose inside that canvas.
- Prefer plaster/wood +
.wall-architecture/.window-viewpatterns; greenhouse full-room PNG is an anti-pattern for Hearth (hides shell, wrong identity). - Do not break e2e “wall setup changes the room atmosphere” for existing materials.
Sequencing
U1 → U2 → U3 → U4 → U5 → U6. U3 asset production can start in parallel with U1/U2 once hero slate is locked from Assumptions. U6 can begin stubs after U1 validation enum lands.
Research Summary
- Substrate:
.wall { image-rendering: pixelated }; materialslight|greenhouse|brick|concrete|gallery|plaster|wood; lightingmorning|golden|night|spotlight; catalog groups inapp.jsrenderCatalog; sprites via./assets/objects/${assetKey}.svg; partial vine/grow-lamp animation; greenhouse hides CSS window architecture in favor of PNG. - Sprite production helper:
scripts/generate-object-assets.mjs(procedural SVG + shared palette) — preferred path for hero asset bootstrap before hand polish. - Production static surface (Dockerfile) serves root
app.js/styles.css/index.html/assets/— notdist/. - Moodboards: Hearth Pixel is the sticky warm direction for this slice (
docs/VISUAL_IDENTITY_MOODBOARDS.md). - No
docs/solutions/directory / learnings found for this topic at plan time. - Room pattern chosen after repo research: composable CSS shell + richer window (not greenhouse full-PNG). Greenhouse remains the wrong identity precedent for Hearth.
- Grounding dossier: prior brainstorm research under compound-engineering scratch
ce-brainstorm/visual-elevation/grounding.md.
Implementation Units
U1. Hearth material + room shell
Goal: Owners can select a Hearth room that shows an elevated wall/floor/window shell.
Requirements: R1, R8
Dependencies: None
Files:
styles.css(modify —.wall.material-hearthwarm wall/floor; keep.wall-architecture/.window-viewvisible; elevate.window-viewexterior)index.html(modify — material select option; window-view markup only if needed for richer exterior)assets/(optional — window exterior image or textures underassets/backgrounds/orassets/windows/, not a full-room greenhouse swap)app.js(modify — defaults/labels if needed)server/validation.js(modify — allowhearth)docs/DATA_MODEL.md(modify — document material if it lists enums)
Approach: 1. Add material-hearth from the plaster/wood + architecture pattern (not greenhouse PNG hide). 2. Enrich .window-view (image or layered CSS) so the exterior reads richer than today’s flat skyline. 3. Use image-rendering: auto on hearth surfaces that carry smooth textures. 4. Wire material select “Hearth room”; extend validation; keep existing materials valid. 5. Align docs/DATA_MODEL.md material list with validation.js (include light and hearth).
Patterns to follow: .wall.material-plaster / .material-wood, .wall-architecture, .window-view in styles.css / index.html; choice(c.material, …) in server/validation.js. Do not follow greenhouse’s “hide architecture + full-room PNG” path.
Test scenarios:
- Selecting Hearth applies
material-hearthon#wallCanvasand persists across reload. - On hearth,
.wall-architectureand.window-viewremain visible (not display:none as on greenhouse). - Saving a wall with
material: "hearth"succeeds via API validation. - Selecting Brick still applies
material-brick(regression).
Verification: npm run check; targeted backend validation test or e2e atmosphere test extended for hearth.
---
U2. Directional light + visit quieting for Hearth
Goal: Hearth + golden (or morning) reads as one directional light mood; visit mode quiets grid.
Requirements: R2, R3
Dependencies: U1
Files:
styles.css(modify — hearth-specific light beam/floor wash; visit-mode grid already toggles--grid-alpha)app.js/index.html(modify — when user picks Hearth, suggest or default lighting togolden)
Approach: 1. Strengthen .wall.material-hearth.light-golden (and optionally morning) overlays so wall and floor show directional warmth. 2. Ensure visit mode continues to zero grid alpha; add hearth-specific chrome quieting only if needed. 3. Do not add new lighting enum values.
Patterns to follow: .wall.light-golden::after, .wall.light-morning::after, .app.visit-mode .wall.
Test scenarios:
- Covers AE1 (partial). With hearth + golden + visit mode, wall has light overlay classes and grid is not visible.
- Changing lighting to night on hearth still applies
light-night(enum still works).
Verification: Playwright class/visibility assertions; visual smoke screenshot optional.
Execution note: Smoke-first — prefer screenshot/class checks over unit tests for overlays.
---
U3. Hero asset set production
Goal: Produce ~10 hybrid hero sprites covering R4 categories.
Requirements: R4
Dependencies: U2 preferred for light-vector lock (shadow direction matches hearth + golden); may bootstrap shapes earlier but polish after U2 smoke.
Files:
assets/objects/hero-shelf.svg(or.png) and siblings for the slate in Assumptionsscripts/generate-object-assets.mjs(modify only if adding generator shapes for bootstrap)
Approach: 1. Treat the generator as partial bootstrap only — most hero categories need hand/vector polish for hybrid quality. 2. Name with hero- prefix; keep file sizes reasonable for the wall canvas. 3. Prefer SVG with soft shading; use PNG only when SVG cannot support later R6 composition. 4. Match shadow/light direction to the U2 hearth + golden vector before calling assets final.
Patterns to follow: Existing assets/objects/*.svg and scripts/generate-object-assets.mjs palette (bootstrap only).
Test scenarios:
- Test expectation: none -- asset binary production; category checklist against R4; composition proof in U5/U6.
Verification: All hero files load 200 from static server; R4 category coverage checklist complete.
---
U4. Catalog Hero set wiring
Goal: Owners discover and place hero items from a dedicated hero catalog section.
Requirements: R4, R7, R8
Dependencies: U3
Files:
app.js(modify —HERO_ASSETSor merged map;renderCatalogsection first;spriteLabel/ inspector defaults)index.html(modify — catalogaria-label/ header so Hero set is not branded purely “8-bit”)
Approach: 1. Register hero asset keys; keep legacy sprite list intact. 2. Render a “Hero set” section at the top of the catalog. 3. Extend spriteLabel (and related helpers) to resolve hero keys, not only SPRITE_ASSETS. 4. Adding a hero card creates a sprite item with the corresponding assetKey and hero-appropriate meaning/copy.
Patterns to follow: SPRITE_ASSETS, renderCatalog, spriteAssetUrl, spriteLabel in app.js.
Test scenarios:
- Covers AE2. Catalog shows a Hero set section with the expected count of hero cards.
- Adding a hero card places a
.item-spritewith the hero asset image on the wall; inspector title is not generic “Sprite”. - Legacy sprite section still lists pre-existing objects (R8).
Verification: Playwright catalog flow or unit-level catalog render test if available; otherwise e2e.
---
U5. Shadow cohesion for hero items on Hearth
Goal: Hero items on a Hearth wall share soft directional grounding shadows.
Requirements: R5, R6
Dependencies: U1, U2, U4
Files:
styles.css(modify — hearth +variant-hero-*soft shadow;image-rendering: autofor hero sprites)app.js(modify — only if addingdata-hero/.heroclass beyondvariant-${assetKey})
Approach: 1. Target hero sprites via variant-hero-* (existing variant-${assetKey} pattern) or an explicit data-hero marker. 2. Apply soft drop-shadow aligned to hearth + golden light vector; avoid harsh pixel offsets used by legacy stickers. 3. Add sprite-specific sway/glow for plant/lamp hero keys (KTD5) — do not assume .item-plant / .item-lamp selectors apply.
Patterns to follow: .item-sprite img filters; animation keyframes from vine/grow-lamp as reference only.
Test scenarios:
- Covers AE1. Hero sprite on hearth + golden has cohesion styling and does not use pixelated rendering.
- Legacy sprite on brick wall still uses pixelated rendering.
Verification: Playwright CSS assertions (image-rendering, class presence) + visual smoke.
---
U6. Persistence, regression, and proof
Goal: Hearth + hero composition persists; legacy paths stay green; proof artifacts exist for R6.
Requirements: R6, R8; AE1–AE3
Dependencies: U1–U5
Files:
tests/e2e/digital-sanctuary.spec.ts(modify) or newtests/e2e/hero-elevation.spec.ts(create)- Backend validation tests under
tests/backend/if material enum is covered there
Approach: 1. Extend atmosphere e2e for hearth + golden persistence. 2. Add catalog Hero set discovery + place flow. 3. Capture a visit-mode screenshot artifact for manual R6 side-by-side review (moodboard at docs/visual-reference/hearth-pixel-moodboard.png if owner frame unavailable). 4. Add backend validateState coverage for material: "hearth" accept and unknown material reject. 5. Covers AE3 via existing board reload with non-hearth material.
Test scenarios:
- Covers AE1. Hearth + golden + hero items + visit mode: classes present; screenshot saved.
- Covers AE2. Catalog Hero set visible; add places item.
- Covers AE3. Brick + night wall still persists after reload.
validateStateacceptshearth; rejects unknown material string.
Verification: npm run check; npm test; npm run test:e2e (or targeted Playwright file).
Verification Contract
npm run check— syntax gate on touched JS.npm test— backend/integration including validation ofhearthmaterial.npm run test:e2e— atmosphere persistence, catalog hero discovery, legacy regression.- Manual: side-by-side visual review of hero visit composition vs current greenhouse/light default against owner reference (bottom-frame quality bar) and Hearth Pixel moodboard.
Definition of Done
- All U1–U6 goals met; R1–R8 satisfied for the hero path; AE1–AE3 covered by automated or recorded proof.
- No abandoned experimental assets left unreferenced in the catalog.
- Legacy materials, lighting, and non-hero catalog items still work (R8).
- Plan assumptions that proved wrong are corrected in a follow-up note or PR description; product scope unchanged without explicit decision.
- Abandoned-attempt code/assets from rejected looks removed from the diff before merge.
Appendix
Origin
- Requirements dialogue and Product Contract authored via
ce-brainstormin this file. - Visual target: owner evolution reference (bottom frame).
docs/VISUAL_IDENTITY_MOODBOARDS.mddocs/PRODUCT_REQUIREMENTS.md,docs/MVP_IMPLEMENTATION_CHECKLIST.md