Zoom: one number for both ways of reading a session - #61
Merged
Conversation
The bottom bar puts the terminal/reader switch next to the zoom because they are the same kind of setting — how you are looking at everything. But the zoom only moved the terminal: `conversation.css` was written in absolute px, so a reader pane ignored it entirely, and the mode switch quietly changed how big your session was. So the grammar gets ONE base size — `--cx-base`, 13px by default — and every type size in it becomes an em of that. The terminal spends the zoom on its font size, the reader on `--cx-base` (set on `.pane-reader`), and 13px at 100% either way means switching modes no longer resizes the conversation. The reader scales as one surface: bar, turns, tool output, reply line, footer. A 10.5px toolbar left behind at 150% would be the part you could not read in the first place — the remote pane already treats its log, composer and status line as one size for the same reason. Four things the px-to-em pass had to be careful about: - **The Overview card shares this grammar and must not move.** That is why the base is a `var(--cx-base, 13px)` default rather than something inherited: the card resolves to exactly the sizes it had. - **The answer's markdown needed its own heading sizes.** The shared `.markdown` rules are absolute px, so an answer's `h1` would have stayed 22px while the prose around it grew. Same proportions, in em, and this file loads after styles.css. - **Spacing does not scale, but glyph columns must.** The prompt's `❯` gutter, the step rail's ▸/✓ column and the body inset under it, and the tool-field label column (was `4.5rem`) are all em now. At 200% the chevron was running into the first word of the prompt. - **`.cs-pre`'s scroll cap is really "about twenty lines".** In rem it showed ten at 200%; in em it stays nineteen at every zoom. Two deliberate visible changes beyond that. The phone keyboard field keeps its fixed 16px — that guard is what stops iOS zoom-on-focus, and the new rule is later in the cascade, so styles.css's version is restated here. And `.cxv-top` (#59's "earlier messages" line) says the size it means: `font: inherit` sheds the button's UA font but also resets the size the element gets from `.cxv-msg`, so it had been landing on the app's inherited 16px in a column of 11px messages. Verified in Chromium against a fixture built from the real ConversationView / Exchange / ToolCall DOM, comparing computed sizes with the pre-change stylesheet: nothing moves at 100% except `.cxv-top`, every element in the reader scales exactly 0.5x/2x at 50%/200%, the Overview card is untouched at all three, and nothing overflows the pane sideways at 200%. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
thomwolf
force-pushed
the
reader/zoom-follows-render-mode
branch
from
August 13, 2026 00:23
d8dcf48 to
0637538
Compare
lvwerra
pushed a commit
that referenced
this pull request
Aug 13, 2026
Rebased onto main after #59 and #61, which cover ground this branch also touched. Theirs wins in both places: #61 made zoom ONE number for both ways of reading a session (`--cx-base` on `.pane-reader`), so the branch's second path — a `zoom` prop and `zoom: var(--cx-zoom)` on `.cxv-body` — is gone rather than reintroduced; and #59 comes back to where you had got to, over a tail window that already opens on the end, so the branch's own open-on-the-newest-turn landing (reader and trace viewer both) is gone too. TracePane keeps main's version entirely. What is left is what main does not have: - **The prompt band spans the pane.** Reaching into the left gutter but stopping at the text column on the right made it read as a card floating over the answer rather than as the head of it. Full bleed both sides; the meta row sits tight under the band it belongs to, and one exchange ends well before the next begins. - **Nothing of the terminal's may paint over the reader.** Its covers — `restoring last view…`, `starting claude…`, `stopped · output preserved` — sit at `z-index: 4` and were drawn straight over the conversation, so a reconnect turned the reader into a terminal screen with a reader toolbar on top. They are gated off while reading, and the overlay now outranks anything the terminal can raise. - **One `Composer` for the card and the reader.** A composer accretes features — paste-to-attach, history recall, a slash-command menu — and duplicated markup is how one surface quietly gets them and the other does not. `onPasteFiles` and `above` are the seam an attachment strip plugs into. The echo is now optimistic in both: the prompt appears before the POST returns, and a failed send withdraws it and puts the text back in the box. - **The reader switch is the same height as the zoom keys** (22px, like the layout picker beside it). Verified against a running instance with a fixture transcript: the reader renders, the band bleeds to the right edge, an injected `.term-boot` cover paints behind the overlay, the bottom bar is one height, a sent prompt echoes before the POST returns, and main's zoom still scales the reader through `--cx-base` with no second path in play. Server, web and UI suites green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lvwerra
added a commit
that referenced
this pull request
Aug 13, 2026
Rebased onto main after #59 and #61, which cover ground this branch also touched. Theirs wins in both places: #61 made zoom ONE number for both ways of reading a session (`--cx-base` on `.pane-reader`), so the branch's second path — a `zoom` prop and `zoom: var(--cx-zoom)` on `.cxv-body` — is gone rather than reintroduced; and #59 comes back to where you had got to, over a tail window that already opens on the end, so the branch's own open-on-the-newest-turn landing (reader and trace viewer both) is gone too. TracePane keeps main's version entirely. What is left is what main does not have: - **The prompt band spans the pane.** Reaching into the left gutter but stopping at the text column on the right made it read as a card floating over the answer rather than as the head of it. Full bleed both sides; the meta row sits tight under the band it belongs to, and one exchange ends well before the next begins. - **Nothing of the terminal's may paint over the reader.** Its covers — `restoring last view…`, `starting claude…`, `stopped · output preserved` — sit at `z-index: 4` and were drawn straight over the conversation, so a reconnect turned the reader into a terminal screen with a reader toolbar on top. They are gated off while reading, and the overlay now outranks anything the terminal can raise. - **One `Composer` for the card and the reader.** A composer accretes features — paste-to-attach, history recall, a slash-command menu — and duplicated markup is how one surface quietly gets them and the other does not. `onPasteFiles` and `above` are the seam an attachment strip plugs into. The echo is now optimistic in both: the prompt appears before the POST returns, and a failed send withdraws it and puts the text back in the box. - **The reader switch is the same height as the zoom keys** (22px, like the layout picker beside it). Verified against a running instance with a fixture transcript: the reader renders, the band bleeds to the right edge, an injected `.term-boot` cover paints behind the overlay, the bottom bar is one height, a sent prompt echoes before the POST returns, and main's zoom still scales the reader through `--cx-base` with no second path in play. Server, web and UI suites green. Co-authored-by: Agent Manager <agents@agent-manager.local> Co-authored-by: Claude Opus 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.
The zoom in the bottom bar sits next to the terminal/reader switch because they are the same kind of setting — how you are looking at everything. But it only moved the terminal:
conversation.cssis written in absolute px, so a reader pane ignored it, and flipping modes quietly changed how big your session was.What this does
The conversation grammar gets one base size —
--cx-base, 13px by default — and every type size in it becomes anemof that. The terminal spends the zoom on its xterm font size, the reader spends the same number on--cx-base(set on.pane-reader), so 13px at 100% either way and switching modes no longer resizes anything.The reader scales as one surface — bar, turns, tool output, reply line, footer. A 10.5px toolbar left behind at 150% is the part you could not read in the first place; the remote pane already treats its log, composer and status line as one size for the same reason.
Things the px→em pass had to be careful about
var(--cx-base, 13px)default rather than an inherited size: the card resolves to exactly the sizes it had..markdownrules are absolute px, so anh1would have stayed 22px while the prose around it grew.❯gutter, the step rail's ▸/✓ column and the body inset under it, the tool-field label column (was4.5rem). At 200% the chevron ran into the first word of the prompt..cs-pre's scroll cap is really "about twenty lines" — inremit showed ten at 200%; inemit stays nineteen at every zoom.Two deliberate visible changes
.cxv-top(Reader: come back to where you were reading #59's "earlier messages" line) now says the size it means.font: inheritsheds the button's UA font but also resets the size the element gets from its own.cxv-msgclass, so it had been landing on the app's inherited 16px in a column of 11px messages. It is 0.85em now, like its siblings.Verification
tsc --noEmitclean;web/test/exchanges|overviewSort|sessionTitlepass.Measured in Chromium against a fixture built from the real ConversationView / Exchange / ToolCall DOM, comparing computed sizes with the pre-change stylesheet:
.cxv-top(16 → 11.05px, above), and the two container elements that now carry the base and hold no direct text;Deployed to the
thomwolf/agent-managertest Space for a look in the real app.🤖 Generated with Claude Code