Repository navigation
Agent: dock the out-of-usage notice in the composer and make status banners neutral - #1510
Merged
Merged
Conversation
…atus banners neutral Running out of usage put a solid coral card with white text into the transcript. widgets::banner painted 13 other errors and warnings the same way; in dark, white on status_error is 2.97:1 and on status_warning 2.14:1, under the 4.5:1 body text needs. - When a task's latest turn ended out of usage, a panel docked inside the composer offers Billing until another turn starts. The transcript keeps a one-line "Out of usage" marker of the turn. - widgets::banner takes a Tone (error, warning, info) and draws a neutral card with the tone's icon on a tinted tile. All 18 call sites move; the Shortcuts reset confirmation's Reset is a secondary pill. - Tokens bg_composer_tray, bg_inverse(_hover), on_inverse and accent_ink, held by the contrast test; widgets::inverse_button; Lucide gauge, triangle-alert, info and arrow-right. - Strings chat-usage-limit-title and chat-usage-limit-body (en, es). USAGE_LIMIT_MESSAGE and stored timeline text are unchanged.
…panel and Reset The out-of-usage panel's Open Billing and the Shortcuts Reset now use widgets::default_button with the bg_default_button tokens, held to 7:1 at rest, hover and press, instead of a second inverted pill (inverse_button, bg_inverse, on_inverse). The Settings regroup adds the same pill, so the two branches share one definition. The out-of-usage test also covers a refusal that arrives live and a history window paged back from the end. docs/brand.md scopes its rule to banners: primary_button and danger_button keep their labels until the buttons' follow-up.
- The composer panel also stays hidden while live rows sit past the loaded window (pages.live_has_more), not only when paged back. - Light accent_ink is Maple 800: the panel's gauge reads 3.83:1 on its coral tile, and the contrast test now holds that pair to 3:1. - Shortcut notices carry their own tone: applied and cancelled are info, rejected keys and navigation hints are warnings, failures are errors, instead of one warning tone for every outcome. - The transcript marker shows the row's own title key, so its text matches its accessible name; Reset, Cancel and the unsaved-work lines are exposed through gpui::text!. - The out-of-usage test covers a labelled refusal arriving live, an active run, a message in flight, live rows past the window and a history page, and checks the marker row stays. - docs/brand.md: the composer panel leaves the field editable, and the light status_warning value matches theme.rs.
matthewrball
added a commit
to matthewrball/Maple
that referenced
this pull request
Nov 8, 2026
matthewrball
added a commit
to matthewrball/Maple
that referenced
this pull request
Nov 8, 2026
matthewrball
marked this pull request as ready for review
November 8, 2026 21:30
Collaborator
Author
|
@doowta this is the one I mentioned in the Design channel. Since you're working on related things, I'd love your eyes on it. |
This was referenced Nov 8, 2026
matthewrball
added a commit
that referenced
this pull request
Nov 10, 2026
matthewrball
force-pushed
the
ux/usage-notice-redesign
branch
from
November 10, 2026 03:16
b113f21 to
ec7eb27
Compare
matthewrball
added a commit
that referenced
this pull request
Nov 10, 2026
marksftw
previously approved these changes
Nov 11, 2026
marksftw
left a comment
Collaborator
There was a problem hiding this comment.
Ready for code review.
Master gained the German catalog (#1529) after this branch was cut, and every shipped catalog must hold the same keys. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
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.
Current review stack
Native stack #1535:
master → #1510 → #1514.Bottom layer: the out-of-usage notice and neutral banners. Base:
master. Independent of the Settings stack (#1534) and the effort slider (#1520).Refreshed onto master
af5c3165, including merged #1508, #1505 (Tools) and #1506 (Web switch), by merging master in; no commits were rewritten. Whichever of this stack and #1534 lands second takes the seven hunks listed under Merge order below; I'll make that update. Local app tests on this head: 577 passed, 0 failed.Current head:
ec7eb275.The original scope and validation are retained below.
Summary
Running out of usage put a solid coral card with white text into the transcript: the loudest surface on screen, with a grey Open Billing pill sitting on the coral.
widgets::bannerpainted 13 other errors and warnings the same way, a solid status color behind white text. In dark, white onstatus_erroris 2.97:1 and white onstatus_warningis 2.14:1, under the 4.5:1 that body text needs. The other 4 banners were already neutral grey.widgets::banner(tone, message)takes aTone(error, warning, info) and draws abg_elevatedcard with a hairline border. The tone shows only as its icon (circle-alert,triangle-alert,info) on a small tile tinted with the status hue, so the message keepstext_primary. All 18 call sites move:default_button, so a coral button no longer sits on an amber banner. Reset and Cancel now have accessible names. Shortcut notices carry their own tone: applied and cancelled are info, rejected keys and navigation hints are warnings, and failures are errors. Before, every outcome got one warning fill.widgets::default_buttonwithbg_default_button/_hover/_activeandtext_on_default_button, held to 7:1 by the contrast test. It is the same definition the Settings regroup (Agent: regroup Settings into Workspace, Connections, and Account & System #1507) adds, so the two PRs share it rather than carrying two pills.bg_composer_tray, andaccent_ink(Maple 800 on light; the panel's gauge is 3.83:1 on its coral tile, held to 3:1). Lucidegauge,triangle-alert,infoandarrow-right.chat-usage-limit-titleandchat-usage-limit-bodyin English and Spanish;translation-revisions/es.txtstamped.USAGE_LIMIT_MESSAGEand stored timeline text do not change.docs/brand.mdgains the token rows,default_buttonin Buttons, and a "Status banners" section: a banner never paints a status color behind its text. It also corrects the lightstatus_warningvalue.Not in this PR:
primary_button(33 call sites) anddanger_button(3) still put white labels on coral (1.98:1) and red (2.97:1). A follow-up PR takes those.Screenshots
Rendered from the app's own views with gpui's offscreen Metal renderer and sample state, then cropped to each banner and the screen around it. Before is master at
e1fcca57; after is this branch at39cbf8da. Dark comes first; light is under each group.Out of usage
Out of usage, light
Chat
Failed reply in the transcript (Error,
ui/chat/transcript.rs). The row a turn leaves when its request fails.Task error under the transcript (Error,
ui/chat/transcript.rs). A problem with the task itself; here the local store is busy.Task error on a new task (Error,
ui/chat/mod.rs). The same error before the first message, under the composer.Unsaved changes (Error,
ui/chat/mod.rs). Saving to the local store failed. Retry saving lines up at the end.Feedback dialog (Error,
ui/chat/feedback.rs). Send pressed with nothing typed.Chat, light
Failed reply in the transcript
Task error under the transcript
Task error on a new task
Unsaved changes
Feedback dialog
Sign-in and plan
Sign-in error (Error,
ui/login.rs). Wrong email or password.Account deletion pending (Warning,
ui/login.rs). Shown when the outcome of an account deletion is unknown.Plan check (Info,
ui/plan_gate.rs). Check again found the account still on the Free plan.Sign-in and plan, light
Sign-in error
Account deletion pending
Plan check
Settings
Keyboard Shortcuts: warnings and notices (Warning, Info,
ui/settings.rs). Saved shortcuts that were rejected, a saved shortcut this build doesn't have, and the notice after recording. That notice now takes its tone from the outcome: applied or cancelled is Info, a key that can't be used is Warning, and a failed save is Error.Keyboard Shortcuts: Reset all (Warning,
ui/settings.rs). Confirmation before resetting changed shortcuts. Reset is the neutral default button.ACP: running from a temporary location (Warning,
ui/settings/acp.rs). Maple was opened from a disk image or another temporary location.Integrations: adding a custom server (Warning,
ui/settings/catalog.rs). Add pressed without a server name and URL.API: the Local API couldn't start (Error,
ui/settings/local_api.rs). The chosen port is already in use.Billing: subscription portal opened (Info,
ui/settings/billing.rs). After Manage subscription opens the browser.API credits: checkout opened (Info,
ui/settings/api_credits.rs). After Pay with card opens the browser.Account: verification email sent (Info,
ui/settings/account.rs). After Resend email on an unverified account.Settings, light
Keyboard Shortcuts: warnings and notices
Keyboard Shortcuts: Reset all
ACP: running from a temporary location
Integrations: adding a custom server
API: the Local API couldn't start
Billing: subscription portal opened
API credits: checkout opened
Account: verification email sent
Validation
out_of_usage_offers_billing_from_the_composer_until_a_later_turnreplacesout_of_usage_banner_opens_billing. When the latest turn ran out of usage, the composer offers Open Billing, pressing it asks once for Settings → Billing, and the transcript keeps the marker row.text_roles_read_on_every_surfacenow also coversbg_composer_tray,default_buttonat 7:1 (rest, hover, press) andaccent_inkonaccent_containerat 3:1, in both palettes.39cbf8da:ci-ok,agent-lint,agent-test,agent-macosandagent-windowspass.just cidid not run on the pinned toolchain. Everything below ran at39cbf8daon rustc 1.96, through the component'sjustenvironment on the shared Agent cache:cargo test -p maple-agent-app --bin maple-agent: 1,341 passed, 0 failed, 3 ignored. That includes the i18n catalog tests (every_source_message_is_used_by_production_code,translations_were_reviewed_against_the_current_english) and the contrast test.-D warningspasses on the workspace (all targets) and onacp,proxy(all targets). On762527c0it also passed onacpand onproxy, and the later commits are UI-only. It allows two lints this rustc raises in code this PR does not touch:unexpected_cfgsfrom theobjcmacros indesktop/native_quit.rsanddesktop/native_window.rs, andclippy::nonminimal_bool.just fmt-checkpasses;just git-metadata-testpassed at762527c0.39cbf8da: the window-budget check, the light gauge contrast, per-outcome shortcut tones, the accessible names, the test cases above and the doc wording.39cbf8da, and each was checked by eye.Notes
USAGE_LIMIT_MESSAGEstays the runtime's fixed message, and rows stored before error labels are still recognized by it.open-billing-<item>button is gone. The composer's button iscomposer-open-billing.Merge order
Whichever of an overlapping pair lands second merges master into its branch with
git merge origin/master, not a rebase, and resolves the hunks below. The choices are the same in either direction. If this PR is last, its own update takes all of them, and the PRs ahead of it need nothing for it.After resolving, run
rg 'widgets::banner\(theme::|shortcut_notice = Some\(UiText' apps/maple-agent/app/srcuntil it prints nothing, thenjust ci. Git merges those lines silently, but they stop compiling against this PR'sToneand(Tone, UiText). Anything that lands first can add more of them. The real check is that one merge after the first two batches land; the trial results below are only a reference.fix(agent): one canvas beside the sidebar, with Settings' Back in the title bar #1508, Agent: pick a new task's folder by the prompt and clear the task top bar #1517, Agent: start projects from scratch #1516, Agent: Settings → Tools, with the python tool off by default #1505, Move the Web switch to Settings → Tools #1506 and Agent: give every task a persistent python scratchpad #1410 merge cleanly with this branch, in either order.
Agent: regroup Settings into Workspace, Connections, and Account & System #1507 (Settings regroup): seven hunks in six files.
assets.rs: keep both icon lists.ui/widgets.rs(two hunks): keep Agent: regroup Settings into Workspace, Connections, and Account & System #1507'sexternal_mark/navigate_markand itsprimary_buttondoc.default_buttonand its tokens are identical in both, sotheme.rsmerges cleanly.ui/settings.rs(Reset all): keep this PR's banner.settings/api_credits.rs: theSomearm from this PR, theNonearm from Agent: regroup Settings into Workspace, Connections, and Account & System #1507.settings/billing.rsandsettings/catalog.rs: keep Agent: regroup Settings into Workspace, Connections, and Account & System #1507's version.Agent: regroup Settings into Workspace, Connections, and Account & System #1507 also adds two MCP notices in
ui/settings.rs(the Apps page and the custom-server form) that callwidgets::banner(theme::status_warning()). They becomewidgets::banner(widgets::Tone::Warning, notice). Merged this way at39cbf8daand Agent: regroup Settings into Workspace, Connections, and Account & System #1507'see416ac4, it builds and the app suite passes: 1,354 passed, 0 failed, 3 ignored.Agent: add purposeful motion across chat, composer, menus and settings #1515 (motion): one hunk each in two files.
ui/chat/composer.rs: keep both sides' new methods; the first needs its own closing brace.ui/chat/mod.rs:widgets::banner(widgets::Tone::Error, error).mt_6().Merged this way at
39cbf8daand Agent: add purposeful motion across chat, composer, menus and settings #1515's12b6cd58, it builds and the app suite passes: 1,377 passed, 0 failed, 3 ignored. Check the composer panel against Agent: add purposeful motion across chat, composer, menus and settings #1515's resize and glide.A rebase would stop more often than this, because it replays commit by commit: 22 of Agent: regroup Settings into Workspace, Connections, and Account & System #1507's 25 commits and 13 of Agent: add purposeful motion across chat, composer, menus and settings #1515's 27 touch these files.
feat(agent): install the maple-agent command from General settings #1436 and Agent: unify hover feedback and transitions #1355 conflict with master in exactly the hunks they conflict in here; this PR adds none.
After this branch takes in a newer master, re-render the after screenshots: Settings looks different once Agent: regroup Settings into Workspace, Connections, and Account & System #1507 is in.
Follow-up: the coral
primary_buttonand reddanger_buttonlabels.