Settings memory, Escape, adjustable frost, hover-peek panes, identity marks - #235
Draft
ghostpyy wants to merge 3 commits into
Draft
Settings memory, Escape, adjustable frost, hover-peek panes, identity marks#235ghostpyy wants to merge 3 commits into
ghostpyy wants to merge 3 commits into
Conversation
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
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
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.
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 inui-settings.jsonand rides the shell's own settings copy, sinceschedule_savereplaces 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_cardcarries aDismissiblekey context, owners say what dismissal means throughpopover::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 viapopover::focus_card; without it their context never reaches the dispatch path.Not bound globally on purpose: the terminal reads keys through
on_key_downand 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).