HUD mode wears the window glass too - #90363
Merged
Merged
Conversation
…p uses The HUD asked for vibrancy directly and always with the 'hud' material — one of the two rungs the macOS census rejected, because it collapses into under-window on blur and so changed the frost the moment another app took focus. It also ignored the translucency setting entirely: Glass off still frosted, and Windows got nothing at all. hudFrostFor is the mapping for a transparent window, beside vibrancyFor in the shared module both processes read. Two gates give it its answer: the renderer's report that the band actually covers the window, and the user's Glass setting. Off resolves to no material rather than a resting one, since a transparent window has no opaque page to hide an unwanted frost behind. Windows 11 rides setBackgroundMaterial through the same call, so the HUD follows the frost ladder on both platforms. Main self-diffs and keys the latch to the window, so a Settings change re-frosts a live HUD, a tint drag touches nothing native, and a HUD respawned on another profile is not mistaken for the window that already carried the material.
…lass The band wore its own card tint at a hardcoded 80/92%, so a HUD beside the docked window read as a lookalike rather than the same surface, and the Tint slider moved one and not the other. It now paints --ui-bg-chrome at --translucency-glass-keep: one painter, one token, one lever. That needed the setting and the surface rewrite to stop being one flag. data-hermes-glass means "this window's field surfaces may be rewritten" and is deliberately false in the HUD, which owns its own backgrounds; the new data-hermes-glass-on means "the user's Glass setting is live" and is published everywhere, along with the tint number the band reads. The 0.5rem side inset drops to zero while glass is on. It exists to keep an opaque sheet clear of the bar's corner controls, but the frost is the whole window — an inset sheet left a hairline of bare untinted material down both sides. An open completion drawer now drops the frost along with the band it belongs to. The drawer takes the band to 25% and blurs it while the native material stayed at full strength, which is the same bare slab in a different disguise. It mounts without a focus change, so it is observed rather than passed in, coalesced to a frame because the shell mutates with every streamed token.
૮ >ﻌ< ა ci reviewran on 6f46744 — feat(desktop): move the HUD's way out onto the bar and drop
|
Dictation, spoken replies, the wake word and start-conversation were four separate icon buttons in a Spotlight bar a few hundred pixels wide — most of the row spent on toggles that are set once and rarely touched. In the HUD they collapse into a single menu; the docked composer has the width and keeps them inline, same controls and same state. The trigger is not a static glyph. It reports the loudest live voice state — recording, transcribing, listening for the wake word, speaking replies — and lights while any is on, because a folded menu that looked idle with the mic open would be a worse trade than the space it saves. The three toggles are checkbox rows that hold the menu open on select, so the state you just changed is the state you can see. The shared control class names move to a module of their own so the row and the menus it renders can wear them without importing each other, and the pressed-toggle tint stops being written out at each of its four sites.
… above it The exit chip floated over the composer in a 26px transparent strip reserved for it (--hud-chip-strip), hidden until you hovered the bar. Under glass that strip is bare untinted material across the top of the HUD — a band of chrome above the surface, present in every state, holding a control you cannot see. It rides the composer's controls row now, next to send. That costs no reserved space and takes about 120 lines of CSS with it: the chip needed its own placement, hover reveal, leave-hold, and an opaque card to stay legible over an unknown desktop. None of that applies to a button on the bar, which is already our surface — the problem was the placement, not the control. Trade-off worth naming: the way out is now always visible in the HUD rather than revealed on hover. It is one more permanent glyph on a Spotlight bar, in exchange for an escape hatch that no longer depends on discovering it.
OutThisLife
force-pushed
the
bb/hud-glass
branch
from
August 19, 2026 23:59
5d99164 to
6f46744
Compare
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.
Summary
Window translucency shipped for chat windows in #88744 and #89837, but HUD mode was left out of it: the band asked for vibrancy directly, always with the
hudmaterial, and ignored the setting entirely. This puts the HUD on the same lever as the rest of the app — the band paints the app's thread surface over the same platform material, on macOS and Windows 11 alike, and follows the Tint slider and the frost ladder like the docked window does.Two things had to move for it to look right. The band was inset 8px from the window edge, which is correct for an opaque sheet clearing the bar's corner controls but leaves a hairline of bare untinted material down both sides once the frost is the window; it goes to zero while glass is on. Above the bar sat a 26px transparent strip reserved for the exit chip, which under frost reads as a slab of bare material across the top of the HUD — the chip moves onto the composer's controls row, where it needs no reserved space and no substrate of its own.
While in that row: the HUD's four voice controls fold into one menu. A Spotlight bar a few hundred pixels wide was spending most of its width on toggles that get set once. The docked composer keeps them inline.
Two bugs fixed on the way through. An open completion drawer drops the band to 25% and blurs it, while the native material stayed at full strength behind it — the same bare slab in a different disguise. And the
hudmaterial is one of the two rungs the macOS census in #88744 rejected, because it collapses intounder-windowon blur, so HUD frost quietly changed appearance whenever another app took focus.Clear mode already reached the HUD and is untouched.
Test plan
hudFrostForcontract table inelectron/translucency.test.ts, including the tint-drag churn guard — 1→100 moves zero native properties, matching the chat-window contractstore/translucency.test.ts: the HUD gets the live setting and the tint, never the surface rewritecomposer/controls.test.tsx