sync: unify chat topbar tint and fold tool calls inline - #123
Merged
Conversation
Chat topbar no longer paints a surface of its own. It was filled with --color-bg-container while the pane underneath uses --color-bg-chat, so a lighter band ran across the top of every conversation: measured rgb(255,255,255) against rgb(253,253,252) in light mode and rgb(21,27,35) against rgb(17,23,32) in dark mode. The bar is now transparent and inherits whatever the pane below paints, which keeps it matched on chat and non-chat pages in both themes. The vestigial backdrop blur goes with it: the bar sits in flow and no content scrolls beneath it, so the filter only risked bleeding the sidebar colour along the left edge. The desktop titlebar gets the same treatment from the other side. Instead of hardcoding a background token it samples the computed background of the sidebar and main pane directly below it and mirrors them into CSS variables, so it follows theme switches and page changes on its own. Hidden tool calls now expand in place rather than pushing their cards into a side rail, sharing one overflow-fade hook across the tool views.
The desktop titlebar test asserts the bar never renders the brand name
(no logo, no product name — the tab shows the current page instead), written
as !block.contains(">{brand::NAME}<"). Seeding the tab with a literal product
name only passed upstream because the two strings happened to differ there;
once the derivation aligns the brand they are equal and the assertion trips,
which is what turned the desktop Rust tests red on this branch.
The placeholder is now the same fallback the script already uses for an
unknown page, so the block carries no brand literal at all and the first
frame shows a page label rather than a product name.
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.
Derived from the full source tree with
scripts/build_ce.py; all release gates (brand scan, binary allowlist, LICENSE, overlay split assertions) passed.Chat topbar matches the surface below it
The chat topbar painted itself with
--color-bg-containerwhile the pane underneath uses--color-bg-chat, so a lighter band ran across the top of every conversation. Measured against the shipped bundle in a headless browser:rgb(255,255,255)rgb(253,253,252)rgb(253,253,252)rgb(21,27,35)rgb(17,23,32)rgb(17,23,32)The bar is now transparent and inherits whatever the pane paints, so it stays matched on chat and non-chat pages in both themes without tracking a second token. The backdrop blur is dropped along with it — the bar sits in flow and no content scrolls beneath it, so the filter did nothing except risk bleeding the sidebar colour along the left edge.
Desktop titlebar follows the surface underneath
The injected desktop titlebar hardcoded a background token, which drifted from the app the moment either side changed. It now samples the computed background of the sidebar and main pane directly below it and mirrors those into CSS variables, so theme switches and page changes are picked up automatically. Writes are short-circuited when the value is unchanged, which also stops a per-frame sync loop that the previous unconditional
setPropertykept alive.Tool calls fold in place
Hidden tool calls expand inline instead of pushing their cards into a side rail, and the tool views now share a single overflow-fade hook. The standalone timeline and thinking-detail panels that only existed for the side rail are removed.