Windows: single-sash mode + external roller shutter layer — closes #73, #74 - #75
Merged
Conversation
…closes #74) - sash: "single" draws one full-width casement sash hinged at a jamb (Hinge picks which), instead of forcing the two-leaf look — users were faking windows with doors. Default "double" is byte-identical to today. - shutterEntity: a cover for the external roller shutter sharing the window's wall gap. The roll curtain (extracted from the #45 glyph into a shared rollCurtain helper) layers over the sash with its own state, so an open window behind a shut shutter renders both truthfully. Watched entities include the shutter; the dev harness emulator grows a slider per shutter. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nicosandller
added a commit
that referenced
this pull request
Jul 26, 2026
One conflict, in render.test.ts: both sides appended suites at the end of the file. Union — this branch's attribute/stateColor suites plus main's windowSash/shutter/watched-entity suites. The conflict region cut mid- block, so the "ours" side's closing braces had to be restored (the shared trailing context only closed one side); typecheck caught it. Verified no duplicate definitions after the auto-merge and that the merged features compose: one climate item renders 21.5 · 45 while a temperature label steps white -> red across thresholds, on a plan whose single-sash window carries a 30%-open external shutter. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two window asks in one PR — same subsystem, same glyphs.
#73 — single-sash windows
Swing windows always drew two casement leaves; single-sash windows had no honest representation (the reporter fakes them with doors). New Sashes dropdown on swing windows: Double (default — byte-identical to today) or Single — one full-width sash with its swing arc, hinged at either jamb via the Hinge field (which now appears for single-sash windows, not just doors).
#74 — window + external roller shutter in one gap
New Shutter field on windows (
shutterEntity, cover-filtered): the roll curtain from #45 layers over the sash in the same wall gap, driven by its own entity with its own accent state. The window'sentitykeeps driving the sash — so an open window behind a shut shutter draws both truthfully (verified: leaves swung open under a full-height curtain). Fail-closed like every other entity binding: anunavailableshutter draws shut.Implementation notes: the curtain body was extracted into a shared
rollCurtain()used by both the roll-up opening and the shutter layer;shutterAmount/shutterActiveare pure and mirrorresolveOpeningAmount/openingIsActivesemantics; shutter colors pass through #65'scssColorOr;collectWatchedEntitiesincludes shutters so state changes re-render; the dev-harness opening emulator grows a position slider per shutter.Verification
tscclean, 366/366 tests (single/double glyph structure, hinge mirroring, shutter layering/independence,shutterAmount/shutterActivematrix incl. outage fail-closed, watched-entity coverage, form field visibility + patches). Harness: single-sash window renders one leaf + one arc; shutter at position 40 →scaleY(0.6)curtain; shutter to 0 → full curtain while the open window's leaves stay swung underneath.Backwards compatibility
No stored value reinterpreted; absent
sash/shutterEntityrender exactly as today.Closes #73. Closes #74.
🤖 Generated with Claude Code