Repository navigation
feat(ui): unify desktop notices - #1305
Conversation
…ToastCard Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… dialogs, lint ratchet Every banner, toast, and dialog in the desktop renderer now goes through shared primitives with one look: - Banners: Banner (docked / floating / inline) + useAppBanner registry and AppBannerHost under the top bar on every surface. Account, update, background-service, project, integration and prompt banners migrated; ~40 in-tab banners render through the inline layout. Dead "Last AI job failed" and mock-provider banners removed. - Toasts: one ToastCard via showToast in a single ToastViewport. PR, auto- link, idle-session, Linear batch, storage and welcome-undo cards migrated; the CTO voice HUD and toasts no longer overlap. - Dialogs: ui/dialog Dialog shell + confirmDialog/promptDialog; every window.confirm/prompt/alert replaced; 24 hand-rolled modals migrated; HeaderSheet is the top-bar sheet shell; Z_LAYERS stacking scale. - Enforcement: ade-ui ESLint rules (warnings) with a per-file ratchet in CI (lint:ci + lint-baseline.json), docs/design/notices.md, AGENTS.md and context/quality/finalize skill guidance. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Dialog stops Escape after closing, so a confirm inside a sheet no longer closes the sheet too; toast/banner clicks don't dismiss an open dialog - Toast cap evicts timed toasts before sticky ones - Toasts stack above dialogs; CTO HUD above top-bar sheets; named Z_LAYERS for popovers, context menus and the capture notice - InlineDialogs removed (confirmDialog everywhere); one Dialog footer; the last hand-rolled modals and prompt moved onto Dialog/promptDialog - Legacy toast action API removed; idle-CLI toast extracted from AppShell - Banner: wraps long text, error line, testId, aria-expanded actions - Lint ratchet counts eslint-disabled violations and resolves its entry script through symlinks; baseline lowered Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…s the arriving toast, keyboard-safe goal clear, scrim-safe web menu Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
|
Important Review skippedToo many files! This PR contains 203 files, which is 103 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: Repository: arul28/ADE/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (13)
📒 Files selected for processing (203)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Devin Review found 2 potential issues.
1 flag not posted on this PR by your GitHub settings — view it in Devin Review. (Configure)
| return ( | ||
| action.label === other.label && | ||
| action.variant === other.variant && | ||
| action.href === other.href && | ||
| Boolean(action.onClick) === Boolean(other.onClick) && | ||
| Object.is(action.icon, other.icon) && | ||
| Boolean(action.disabled) === Boolean(other.disabled) && | ||
| Boolean(action.busy) === Boolean(other.busy) && | ||
| action.title === other.title && | ||
| action.expanded === other.expanded | ||
| ); |
There was a problem hiding this comment.
🟡 Banner action icons remain stale
When only an action icon changes, sameActions treats the banner as unchanged. useAppBanners skips notifying the host, leaving the old icon visible.
| return ( | |
| action.label === other.label && | |
| action.variant === other.variant && | |
| action.href === other.href && | |
| Boolean(action.onClick) === Boolean(other.onClick) && | |
| Object.is(action.icon, other.icon) && | |
| Boolean(action.disabled) === Boolean(other.disabled) && | |
| Boolean(action.busy) === Boolean(other.busy) && | |
| action.title === other.title && | |
| action.expanded === other.expanded | |
| ); | |
| return ( | |
| action.label === other.label && | |
| action.variant === other.variant && | |
| action.href === other.href && | |
| Boolean(action.onClick) === Boolean(other.onClick) && | |
| Object.is(action.icon, other.icon) && | |
| Boolean(action.disabled) === Boolean(other.disabled) && | |
| Boolean(action.busy) === Boolean(other.busy) && | |
| action.title === other.title && | |
| action.expanded === other.expanded | |
| ); |
Was this helpful? React with 👍 or 👎 to provide feedback.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Take main's sidebar and Lanes redesign (#1304) and unified notices (#1305): - The Mac Desktop hover peek moves into the new lane sidebar row. - The reconnect sign-in link rides in the shared Banner's detail. - The Apple strip takes main's Banner; the Mac Desktop strip moves to the same Banner, and the now-unused shared ToolStatusStrip shell is removed. - The backdrop keeps main's field slicing (no header-only constants) plus this lane's render scale and idle freeze. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>



Problem
ADE desktop notices had several independently styled banner, toast, and dialog implementations. Their placement, dismissal, keyboard behavior, and future extension points were inconsistent.
Cause
Notice UI grew feature by feature without one shared renderer, host, or enforcement rule.
Change and boundary
docs/design/notices.mdand the agent skills.Update vX.Y.Z is ready to installbanner withRestart and install. It calls the same install action as the flashing top-right update control.HeaderSheet, CursorCloudFleetModal closes on Escape, and Linear panes stay open when a confirm opens inside them.N LANESbadge; some rebase hover text now uses native title tooltips. The “Updated to vX” dialog no longer includes its screen-reader-only description line.Verification
Desktop typecheck passed.
Targeted changed renderer tests: 48 files, 1,349 tests passed.
Lint tooling: 77/77 tests passed.
lint:ci: 3,089 files, 0 errors, 528 existing warnings, no ratchet growth.Docs validation passed for 273 files.
CLI parity checks passed: typecheck and 196 test files / 4,921 passed / 19 skipped. No CLI or TUI behavior changed.
Update prompt visually checked in dark and light themes; before/after screenshots are attached in a PR comment.
Follow-up proof on
261e7c6064800103cf7df744da6dcd46fe75974e: targeted Vitest passed (3 files / 63 tests), desktop typecheck passed, andlint:cipassed with no ratchet growth.Final CI passed on
261e7c6064800103cf7df744da6dcd46fe75974e: all eight desktop shards, iOS, Windows foundation, CLI/SDK, typechecks, lint, runtime binary builds, docs, and theci-passgate.🤖 Generated with Claude Code