feat(notices): notices button in the header - #2668
Open
camielvs wants to merge 2 commits into
Open
Conversation
This was referenced Aug 26, 2026
Collaborator
Author
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
🎩 PreviewA preview build has been created at: |
camielvs
commented
Aug 26, 2026
camielvs
commented
Aug 26, 2026
camielvs
commented
Aug 26, 2026
camielvs
commented
Aug 26, 2026
camielvs
commented
Aug 26, 2026
camielvs
commented
Aug 26, 2026
camielvs
force-pushed
the
banners-04-strip
branch
from
August 26, 2026 23:45
eee6c2b to
91b5f62
Compare
camielvs
force-pushed
the
banners-05-inbox
branch
2 times, most recently
from
August 27, 2026 00:05
9e7df61 to
0769ace
Compare
camielvs
force-pushed
the
banners-04-strip
branch
from
August 27, 2026 00:44
91b5f62 to
45113d5
Compare
camielvs
force-pushed
the
banners-05-inbox
branch
from
August 27, 2026 00:44
0769ace to
af61eb7
Compare
Adds a Megaphone button to the top bar that opens the full list of notices, with an unread count badge. Opening the list marks everything in it as read; notices the host marked dismissible can be removed one at a time from here. The list is also the way back once the strip has been hidden, which until now was a one-way door for the rest of the session. Its toggle mirrors the strip's, and the strip's own controls stay out of the way while the list is open.
The notices button now stays in the header whether or not there is anything to read, and opening it with nothing to show gives a "No notices" empty state. Previously the whole affordance unmounted when the list emptied, which also meant dismissing the last notice pulled the open popover out from under the reader. Cap the unread badge at 9+ so a host-supplied count cannot clip inside the badge; the trigger's label still carries the exact number. The strip toggle follows hasHiddenBanners, so it offers to restore the strip as soon as one notice is hidden rather than only when all of them are. Move the viewport-fit sizing onto the PopoverContent primitive so no caller has to name Radix custom properties, and let the header row use the fill prop rather than a width class. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camielvs
force-pushed
the
banners-05-inbox
branch
from
August 27, 2026 01:18
af61eb7 to
b02bd10
Compare
camielvs
force-pushed
the
banners-04-strip
branch
from
August 27, 2026 01:18
45113d5 to
69c580a
Compare
camielvs
marked this pull request as ready for review
August 28, 2026 00:02
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.

Why
PR 4 left two gaps: hiding a banner was a one-way door for the rest of the session, and there was no way to look back at a notice you'd hidden. Banners are also dashboard-home-only, so every other page — including all of v2, which has no home page — had no notice surface at all.
What
A Megaphone button in the top bar, on every page, with an unread count badge.
Wired into both the v1 and the v2 top bar.
How to Test
Notices come from the host page, not from this app: the UI only reads a source installed on
window, and with nothing installed it shows nothing. The whole contract is insrc/config/NOTICES.md, and installing a source by hand is all you need to exercise the feature.1. Run the app
gh pr checkout 2668 pnpm install && pnpm startPoint
VITE_BACKEND_API_URLat whichever backend you normally develop against — notices don't come from it, so any working setup will do.2. Install a notice source
Paste this into the browser console:
Vary
variant,dismissibleandactionfrom there, and callsetNotices([...])to publish an update the way a real host would.For the reload checks below, put the same block in
index.htmljust before</body>instead, so the source survives a refresh. Don't commit that edit.Two things worth knowing if you'd rather drive it from real data: a host page that fetches notices from a backend and installs them through this same global lives outside this repo, in the deployment that embeds the app — the contract is identical either way, so anything that works here works there. And
src/config/noticeTestSource.tsis the same installer the unit tests use, if you want to script it.3. What to look for
/runs,/components,/settings, the v2 editor — there are no banners and no leftover gap under the top bar. Full-height views (components list, editor sidebar, context panel) still size correctly.9+past nine). Opening the list clears it.dismissible: truegets an X in the list, and dismissing it removes it for good. After a reload, dismissals and hides of dismissible notices persist; hides of the rest come back.id, or with a blank title and body, shouldn't appear at all; duplicate ids collapse to the first; and a relativeaction.urlcosts the notice its button but still renders the notice.setNotices([...])updates the banners and the list immediately, without a reload.Reviewer notes
This is the last PR in the stack; at this point the feature is complete and the tree matches what was proposed in #2661.