Skip to content

Settings memory, Escape, adjustable frost, hover-peek panes, identity marks - #235

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

Settings memory, Escape, adjustable frost, hover-peek panes, identity marks#235
ghostpyy wants to merge 3 commits into
zeronsh:mainfrom
ghostpyy:feat/ui-polish-pr

Conversation

@ghostpyy

@ghostpyy ghostpyy commented Aug 30, 2026

Copy link
Copy Markdown

Five things, all device-local. No schema, no edge, no migration.

Settings reopens where you left it. Cmd-, and the user menu landed on Devices every time. The section is persisted in ui-settings.json and rides the shell's own settings copy, since schedule_save replaces the whole file and would otherwise undo a write that skipped it.

Escape layers. It was a per-dialog key-down comparison in three places and absent everywhere else. Now dialog_card carries a Dismissible key context, owners say what dismissal means through popover::dismissible, and gpui's depth ordering does the rest — the innermost float wins, and the route only exits once nothing is left to dismiss. Confirmations own no input, so they take focus via popover::focus_card; without it their context never reaches the dispatch path.

Not bound globally on purpose: the terminal reads keys through on_key_down and binds no escape action, and bindings resolve before key-down bubbles — a root-level escape would swallow it from vim.

Frost is adjustable. Light / Regular / Heavy in Appearance, a multiplier on each surface's reference sigma rather than an absolute value, so the menu-44 / composer-16 / sticky-header ratios hold. Read at paint time, so changing it repaints without rebuilding the palette. The row stays visible on opaque themes and says why it is inert.

Collapsed panes peek on hover. Either sidebar opens as a frosted float over the content and retracts when the pointer leaves. It never touches sidebar_collapsed, so the collapse survives the peek, and it overlays instead of reflowing the conversation.

Projects and accounts carry a picture. Both already drew a monogram tile derived from their id; that stays as the fallback. A chosen image is copied into the profile under a content-addressed name, so re-picking the same file rewrites one entry instead of growing the store, and clearing collects the file only when no other key still points at it. Set from the project menu, or from a new row at the top of Accounts for the signed-in user. Device-local — the registry doc has no picture field — and the Accounts row says so rather than leaving it to be found on a second machine.

Happy to split any of these out or drop one. The frost multiplier and the peek are the two most opinionated.

cargo test -p zeron-ui -p zeron-theme: 605 passed, 0 failed. No new warnings (35 before and after).

Four small things that came up in daily use:

Settings always reopened on Devices, and the only way out was the Back
row. The section now rides `ui-settings.json` with the rest, and Escape
is bound inside a "Settings" key context so leaving the route never
competes with the terminal's escape or the composer's mention dismissal.

Frost was one fixed sigma. `FrostStrength` scales whatever reference blur
a surface passes to `frosted()`, so menus at 44 and the composer pill at
16 keep their ratio at any depth. It resolves at paint time and touches
no color role, so changing it repaints without rebuilding the palette.

A collapsed sidebar or Changes pane now floats back in while the pointer
rests on its 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.

Eren Saglam
Every project carried the same folder glyph, so the project filter and
the spaces menu were a column of identical icons you had to read to tell
apart. Accounts and the sidebar identity were a flat circle with a letter.

`identity` derives a stable hue from a row's own id — FNV-1a, no storage,
no sync — and pairs it with the label's first meaningful character. The
same project is the same color on every device and after a reinstall, and
two logins to one provider stop looking alike. Fill and glyph come from
the resolved theme, so imported palettes are not overridden and light and
dark both hold contrast.

One derivation, two shapes: rounded-rect for a place, circle for a person.

Eren Saglam
@ghostpyy
ghostpyy marked this pull request as draft August 30, 2026 06:04
Escape used to be a per-dialog key-down comparison in three places and
nothing at all in the rest, so the settings binding added in the previous
commit would close the route out from under an open dialog.

One mechanism now: dialog_card carries a Dismissible key context, owners
declare what dismissal means via popover::dismissible, and gpui's own
depth ordering does the layering — the innermost float wins, and the route
only exits once nothing is left to dismiss. Confirmations own no input, so
they take focus through popover::focus_card; without that their context
never reaches the dispatch path.

Deliberately not a global binding: the terminal reads keys through
on_key_down and binds no escape action, and bindings resolve before
key-down bubbles, so a root-level escape would swallow it from vim.

Pictures ride the monogram tiles already there — a chosen image if one is
set, the derived mark otherwise. Files are copied into the profile under a
content-addressed name, so re-picking the same image rewrites one entry
and clearing collects it only when no other key still points at it.
Device-local by design: the registry doc has no picture field, and the
Accounts row says so rather than leaving it to be discovered on a second
machine.

Eren Saglam
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