Repository navigation
mac: the stage is a panel on the window ground - #299
Merged
Merged
Conversation
§3: the stage is a `surface` panel inset 8, radius 12, with a 0.5pt hairline shadow -- "No other cards." The lab's #stage gives the values. The pane was flush with the window and split from the sidebar by a 1pt rule; now the ground shows through an 8pt inset on all four sides and the panel's own edge is the separation, so that rule is gone. The drop is .raised (radius 1.5, y 1), not .floating (14, y 10): the composer floats, the stage sits. No ConchElevation case carries a ring, so it is drawn explicitly, as the composer already does. The first build had the right shape and the wrong fill -- the transcript, the pane body, the 52pt header and every deliverable surface painted the window ground over the panel's surface, which in light is #F2F1EF over #FFFFFF: a panel-shaped hole. Caught by photographing it. Swept: ConversationStackView, ConversationPane, sessionBar, and all 13 ground references in ReviewView, which renders only inside the stage since #284 removed the full-window overlay -- including the cover that hides WKWebView's white flash, which as ground would be a visible rectangle against the panel. Three ground fills remain, all outside: the window, the title strip, and the ledger, which is what the panel sits on. The invariant is asserted structurally rather than as a count. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SfEX6bfwCGXtThk1JRNmsE
stupart
added a commit
that referenced
this pull request
Sep 16, 2026
`--shRaised` IS defined in the lab — line 17, and line 20 for dark. The grep behind the claim that it wasn't looked for the variable at the start of a line, and the lab's `:root` is minified onto one. So #300 shipped the selected segment flat AND added a guard asserting it stay that way. Both are corrected here; the guard is inverted rather than deleted, so the mistake cannot return quietly. Reading the whole table turned up the second divergence, which #299 introduced: the stage panel borrowed `.raised`, and `ElevationModifier` doubled every shadow on dark. The lab's `--shPanel` keeps its ring and drops its shadow outright on dark — something no blanket rule can express. Each level now carries the lab's own pair, and `panel` becomes its own level: light dark --shPanel r1.5 y1 .04 ring only, no drop --shRaised r1 y1 .14 r1 y1 .4 --shFloat r14 y10 .24 r14 y10 .7 --shOver r32 y24 .32 r32 y24 .75 CSS blur is twice SwiftUI's shadow radius. Two more were wrong on the way past: `.overlay` sat at r24/y18/.26 against the lab's r32/y24/.32, and `.floating` computed .44 on dark where the lab asks .7. Elevation had no test coverage whatsoever. It has seven tests now, including a pixel test of the modifier itself — every value test still passes with the doubling rule in place, so the values alone could never catch its return. The segment's hover fill is recorded as the app's own: the lab gives `.seg button` no `:hover` rule at all. Gated: bun test 2309/0, tsc clean, swift test 138/0, Mac and iOS both build (CI builds neither). Twelve mutations across the tokens, the modifier and the source guards; twelve killed. Claude-Session: https://claude.ai/code/session_01SfEX6bfwCGXtThk1JRNmsE Co-authored-by: Claude Opus 5 (1M context) <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.
§3: "the stage is a
surfacepanel inset 8 from the window, radius 12 (ConchRadius.medium), with a 0.5 pt hairline shadow. No other cards." The lab's#stagegives it in values:The pane was flush with the window and divided from the sidebar by a 1 pt rule. Now it is a panel: inset 8 on all four sides so the ground shows through,
surface, radius 12, a 0.5 hairline ring, and a very quiet drop. The sidebar's rule is gone —#stagehas no left border, and the panel's own edge is the separation.The drop comes from
.conchElevation(.raised)(radius 1.5, y 1), not.floating(14, y 10). The composer floats; the stage merely sits. NoConchElevationcase carries a ring, so it's drawn explicitly — the same way the composer does it, rather than inventing a token for one use.Right shape, wrong fill
The first build had the panel's geometry and the window ground inside it — because the transcript, the pane body, the 52 pt header and every deliverable surface painted
ConchPalette.bgover the panel'ssurface. In light that's#F2F1EFover#FFFFFF: a panel-shaped hole. I only caught it by photographing it.So the sweep:
ConversationStackView's scroll ground,ConversationPane's body,sessionBar, and all 13 ground references inReviewView— which renders only inside the stage since #284 deleted the full-window overlay. That includes the cover which hidesWKWebView's white flash: left as ground, it would itself be a visible rectangle against the panel.Three ground fills remain, all outside the panel: the window, the title strip, and the ledger — which is what the panel sits on.
Guards
The "nothing inside the pane paints the ground" invariant is asserted structurally, not as a count, so it survives a refactor that moves a fill around.
Gate
bun test2304/0 exit 0 ·tsc --noEmitexit 0 · MacxcodebuildBUILD SUCCEEDED · iOSxcodebuildBUILD SUCCEEDED · photographed on the real window, twice — once to find the wrong fill, once to confirm it.Not here
The lab has no 🐚 wordmark strip: §5 drops it, with traffic lights over the sidebar and the panel starting 8 from the window top. That's the header slice (breadcrumb, state text, terminal and details buttons) and it's next.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SfEX6bfwCGXtThk1JRNmsE