Skip to content

UI polish: settings memory, frost depth, identity marks, account usage, rewind, hover-peek - #235

Draft
ghostpyy wants to merge 13 commits into
zeronsh:mainfrom
ghostpyy:feat/ui-polish-pr
Draft

ghostpyy wants to merge 13 commits into
zeronsh:mainfrom
ghostpyy:feat/ui-polish-pr

Conversation

@ghostpyy

@ghostpyy ghostpyy commented Aug 30, 2026

Copy link
Copy Markdown

Integration build of six independent PRs, merged onto current main so they can be run together. Review and merge the pieces; this one tracks them and closes when they land.

Dropped from the August version of this branch: the layered-Escape key context. Escape routing now goes through the shell's capture/bubble handlers that landed on main since, and #380 hooks into those instead.

Validation: cargo test -p zeron-ui --lib -- --test-threads=1 — 1022 passed; cargo test -p zeron-theme — 24 passed. No new warnings (134 lib / 149 lib-test before and after).

Eren Saglam

@ghostpyy
ghostpyy marked this pull request as draft August 30, 2026 06:04
Cmd-, and the user menu landed on Devices every time. The section is now
persisted in ui-settings.json and rides the shell's own settings copy,
since schedule_save replaces the whole file from it.

Escape leaves the settings route once nothing nearer wants it: pages with
a dialog (device rename, add-account login, theme import and mapping
review) answer handle_escape in the shell's capture pass first, the same
way the Changes pane already does, so cancelling a dialog never also
closes Settings under it. The theme import card's own Escape arm moves
there so the page has one dismissal path.

Eren Saglam
Frost was one fixed sigma per surface. FrostStrength (Light / Regular /
Heavy) scales the reference blur every frosted() call site passes, so
menus at 44 and the composer pill at 16 keep their ratio at any depth.
It is read at paint time and touches no color role, so changing it
repaints without rebuilding the palette.

The row in Appearance stays visible on opaque themes and says why it is
inert, rather than appearing and vanishing with the Glass row above it.

Eren Saglam
Every project carried the same folder glyph, and accounts were a flat
circle with a letter. identity derives a stable hue from a row's own id
(FNV-1a, nothing stored or synced) and pairs it with the label's first
meaningful character; fill and glyph come from the resolved theme so
light and dark both hold contrast. Rounded-rect for a place, circle for
a person: the sidebar's project filter, the sidebar identity row, and
the account rows in Settings.

A chosen image replaces the mark. It is copied into the profile under a
content-addressed name (re-picking the same file rewrites one entry;
clearing collects the file only when no other key points at it) and
validated through the same staging and decode path as the new-thread
background. Set from the project's context menu or the user menu.
Device-local by design: the registry doc has no picture field.

Eren Saglam
What is left of the plan the open chat spends against was only visible
in Settings → Accounts, the wrong place to notice you are about to run
out mid-session.

A chip in the composer footer shows the brand mark and what is left of
the headline window: Claude's 5-hour "Session", or whatever a
weekly-only plan reports. Its colour keys off the window shown, so the
number and its tint tell one story. Clicking opens a card with every
window and its reset, the other logins one click from being live (the
same ActivateAgentAccount the settings page uses), and a way out to
Settings, which keeps ownership of adding and forgetting.

Percentages say what is left, not what is spent, and the meters drain to
match; Settings → Accounts moves with them.

The accounts snapshot moves onto AppState so the chip and the settings
page read one copy behind the engine's 60s usage cache. The chip refreshes
once per TTL, only while a chat is on screen in a focused window; a
failed probe counts toward the TTL so it cannot retry every frame.

Eren Saglam
Escape twice in a chat opens a list of your earlier prompts, newest
first. Pick one and it returns to the composer to edit and resend.
Arrows move, Enter restores, Escape closes; clicking a row does the same
as Enter.

The pair is timed by hand rather than bound as an "escape escape"
sequence, because a sequence would swallow the first tap until it timed
out. It rides the shell's existing bubble-phase Escape handler, so it
only fires once nothing nearer wanted the key: menus and dialogs resolve
in the capture pass, the composer keeps its mention popup, and the
opt-in agent interrupt still comes first.

Restoring does not truncate the transcript. The harness CLI owns the
conversation and is resumed by session id rather than by replaying the
doc, so dropping entries from our mirror would leave the agent
remembering what the transcript stopped showing. The rewind module says
so where someone would look.

The list takes focus on the frame after it opens: gpui drops a focus on
a handle that is not yet in the dispatch tree, which left the arrows
dead in an open list.

Eren Saglam
# Conflicts:
#	crates/ui/src/settings.rs
# Conflicts:
#	crates/ui/src/settings.rs
@ghostpyy ghostpyy changed the title Settings memory, Escape, adjustable frost, hover-peek panes, identity marks UI polish: settings memory, frost depth, identity marks, account usage, rewind Sep 15, 2026
A collapsed sidebar or right pane floats back in while the pointer rests
on its window edge, blurred over the content, and leaves when the
pointer does. The float is absolutely positioned and rides its own
width tween, so a peek never reflows the conversation column — and it
renders the same element the docked pane does, against a different
width clock, so the two cannot drift. Collapsing stays the persisted
state; a peek is never saved.

The hover strip carries no mouse-down listener, so dragging the seam's
resize handle beneath it still expands the pane for real; a real toggle
or drag drops the float so it cannot stack on the column arriving under
it. Only a settled-collapsed pane floats: mid-tween it stays in the row
so the conversation column keeps reflowing against it.

Eren Saglam
@ghostpyy ghostpyy changed the title UI polish: settings memory, frost depth, identity marks, account usage, rewind UI polish: settings memory, frost depth, identity marks, account usage, rewind, hover-peek Sep 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant