Skip to content

feat(ui): unify desktop notices - #1305

Merged
arul28 merged 9 commits into
mainfrom
t3code/shared-banner-system
Sep 24, 2026
Merged

arul28 merged 9 commits into
mainfrom
t3code/shared-banner-system

Conversation

@arul28

@arul28 arul28 commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

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

  • Add shared banner, toast, and dialog primitives. App-wide banners register with one host: durable states dock under the top bar, short prompts float below them, and pane-specific notices use the inline layout.
  • Add one toast card and viewport, shared confirm and prompt dialogs, and lint rules plus a per-file CI ratchet that prevents new ad hoc notice patterns. Guidance is in docs/design/notices.md and the agent skills.
  • When a desktop update finishes downloading, show a floating Update vX.Y.Z is ready to install banner with Restart and install. It calls the same install action as the flashing top-right update control.
  • Keep the change in the desktop renderer; no iOS, CLI/TUI, SDK, or shared IPC contract changes are needed. Phase 5 empty states and other low-priority decoration remain guidance only.
  • PR toasts now deduplicate by PR and kind, share the global cap of five, and pause on hover. Toasts render above dialogs; the CTO call HUD renders above top-bar sheets. The Usage sheet uses HeaderSheet, CursorCloudFleetModal closes on Escape, and Linear panes stay open when a confirm opens inside them.
  • LaneRebaseBanner no longer shows its per-strip N LANES badge; some rebase hover text now uses native title tooltips. The “Updated to vX” dialog no longer includes its screen-reader-only description line.
  • Former all-caps button labels are sentence-cased. The confirms labeled “Keep lane” and “Tracked only” clarify actions that already did not cancel on Cancel. Other existing user-facing messages remain unchanged.

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, and lint:ci passed 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 the ci-pass gate.

🤖 Generated with Claude Code

ADE   Open in ADE  ·  t3code/shared-banner-system branch  ·  PR #1305

arul28 and others added 8 commits September 24, 2026 06:25
…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>
@vercel

vercel Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
ade Ignored Ignored Preview Sep 24, 2026 12:23pm UTC

@coderabbitai

coderabbitai Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too 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 configuration

Configuration used: Repository: arul28/ADE/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 1b100e3f-675f-4dcf-961d-6090b44a4c8e

📥 Commits

Reviewing files that changed from the base of the PR and between aff9fae and 261e7c6.

⛔ Files ignored due to path filters (13)
  • AGENTS.md is excluded by !*.md
  • docs/ARCHITECTURE.md is excluded by !docs/**
  • docs/README.md is excluded by !docs/**
  • docs/design/notices.md is excluded by !docs/**
  • docs/features/chat/README.md is excluded by !docs/**
  • docs/features/chat/composer-and-ui.md is excluded by !docs/**
  • docs/features/lanes/README.md is excluded by !docs/**
  • docs/features/onboarding-and-settings/README.md is excluded by !docs/**
  • docs/features/onboarding-and-settings/desktop-auto-update.md is excluded by !docs/**
  • docs/features/pull-requests/README.md is excluded by !docs/**
  • docs/features/sync-and-multi-device/README.md is excluded by !docs/**
  • docs/features/terminals-and-sessions/README.md is excluded by !docs/**
  • docs/features/web-client/README.md is excluded by !docs/**
📒 Files selected for processing (203)
  • .agents/skills/context/SKILL.md
  • .agents/skills/context/references/doc-map.md
  • .agents/skills/finalize/SKILL.md
  • .agents/skills/quality/SKILL.md
  • .github/workflows/ci.yml
  • apps/desktop/eslint-rules/ade-ui.mjs
  • apps/desktop/eslint-rules/ade-ui.test.mjs
  • apps/desktop/eslint.config.mjs
  • apps/desktop/lint-baseline.json
  • apps/desktop/package.json
  • apps/desktop/scripts/lint-ratchet.mjs
  • apps/desktop/scripts/lint-ratchet.test.mjs
  • apps/desktop/src/renderer/components/account/AccountPage.test.tsx
  • apps/desktop/src/renderer/components/account/AccountSignedOutBanner.test.tsx
  • apps/desktop/src/renderer/components/account/AccountSignedOutBanner.tsx
  • apps/desktop/src/renderer/components/account/YourMacsCard.tsx
  • apps/desktop/src/renderer/components/activity/ActivityPane.test.tsx
  • apps/desktop/src/renderer/components/activity/ActivityPane.tsx
  • apps/desktop/src/renderer/components/activity/HeaderActivityControl.css
  • apps/desktop/src/renderer/components/activity/HeaderActivityControl.tsx
  • apps/desktop/src/renderer/components/app/App.tsx
  • apps/desktop/src/renderer/components/app/AppShell.aiStatus.test.tsx
  • apps/desktop/src/renderer/components/app/AppShell.tsx
  • apps/desktop/src/renderer/components/app/AutoUpdateBanner.test.tsx
  • apps/desktop/src/renderer/components/app/AutoUpdateBanner.tsx
  • apps/desktop/src/renderer/components/app/AutoUpdateControl.test.tsx
  • apps/desktop/src/renderer/components/app/AutoUpdateControl.tsx
  • apps/desktop/src/renderer/components/app/BatchLaunchModal.tsx
  • apps/desktop/src/renderer/components/app/BatchLaunchStatusToast.tsx
  • apps/desktop/src/renderer/components/app/BrainRecoveryNotice.test.ts
  • apps/desktop/src/renderer/components/app/BrainRecoveryNotice.tsx
  • apps/desktop/src/renderer/components/app/ChatLaunchesSlideOut.tsx
  • apps/desktop/src/renderer/components/app/ClipboardDeeplinkBanner.test.tsx
  • apps/desktop/src/renderer/components/app/ClipboardDeeplinkBanner.tsx
  • apps/desktop/src/renderer/components/app/ConnectionsPanel.tsx
  • apps/desktop/src/renderer/components/app/CrossRepoPrBanner.tsx
  • apps/desktop/src/renderer/components/app/CursorCloudFleetModal.tsx
  • apps/desktop/src/renderer/components/app/HeaderSheet.tsx
  • apps/desktop/src/renderer/components/app/InboundDeeplinkModal.tsx
  • apps/desktop/src/renderer/components/app/IntegrationBanners.test.tsx
  • apps/desktop/src/renderer/components/app/IntegrationBanners.tsx
  • apps/desktop/src/renderer/components/app/LinearIssueBrowser.tsx
  • apps/desktop/src/renderer/components/app/LinearPaneModal.tsx
  • apps/desktop/src/renderer/components/app/LinearQuickViewButton.test.tsx
  • apps/desktop/src/renderer/components/app/LinearQuickViewButton.tsx
  • apps/desktop/src/renderer/components/app/ProjectHostRecoveryScreen.tsx
  • apps/desktop/src/renderer/components/app/ProjectTransitionErrorAlert.test.tsx
  • apps/desktop/src/renderer/components/app/ProjectTransitionErrorAlert.tsx
  • apps/desktop/src/renderer/components/app/SettingsPage.tsx
  • apps/desktop/src/renderer/components/app/TopBar.test.tsx
  • apps/desktop/src/renderer/components/app/TopBar.tsx
  • apps/desktop/src/renderer/components/app/WindowsBetaNoticeModal.test.tsx
  • apps/desktop/src/renderer/components/app/WindowsBetaNoticeModal.tsx
  • apps/desktop/src/renderer/components/app/autoUpdateInstallAction.ts
  • apps/desktop/src/renderer/components/app/commandPaletteWork.tsx
  • apps/desktop/src/renderer/components/app/prToastPresentation.test.ts
  • apps/desktop/src/renderer/components/app/prToastPresentation.ts
  • apps/desktop/src/renderer/components/app/toast/ToastStack.test.tsx
  • apps/desktop/src/renderer/components/app/toast/ToastStack.tsx
  • apps/desktop/src/renderer/components/app/toast/ToastViewport.tsx
  • apps/desktop/src/renderer/components/app/toast/toastStore.test.ts
  • apps/desktop/src/renderer/components/app/toast/toastStore.ts
  • apps/desktop/src/renderer/components/app/toast/toastViewportInsets.ts
  • apps/desktop/src/renderer/components/app/toast/useAutoDiagnosticsToast.ts
  • apps/desktop/src/renderer/components/app/toast/useLaneEventToasts.ts
  • apps/desktop/src/renderer/components/app/toast/usePrEventToasts.test.tsx
  • apps/desktop/src/renderer/components/app/toast/usePrEventToasts.tsx
  • apps/desktop/src/renderer/components/app/toast/useStaleCliToast.tsx
  • apps/desktop/src/renderer/components/apple/AppleDevicePane.test.tsx
  • apps/desktop/src/renderer/components/apple/AppleDeviceStatusStrip.test.tsx
  • apps/desktop/src/renderer/components/apple/AppleDeviceStatusStrip.tsx
  • apps/desktop/src/renderer/components/apple/AppleShutdownConfirm.test.tsx
  • apps/desktop/src/renderer/components/apple/AppleShutdownConfirm.tsx
  • apps/desktop/src/renderer/components/automations/AutomationsWorkspace.tsx
  • apps/desktop/src/renderer/components/automations/builder/TriggerCard.tsx
  • apps/desktop/src/renderer/components/automations/list/RuleList.tsx
  • apps/desktop/src/renderer/components/automations/settings/IngressStatusStrip.tsx
  • apps/desktop/src/renderer/components/capture/GlobalCaptureGestureHost.tsx
  • apps/desktop/src/renderer/components/chat/AgentChatPane.test.tsx
  • apps/desktop/src/renderer/components/chat/AgentChatPane.tsx
  • apps/desktop/src/renderer/components/chat/ChatAttachmentPreviewModal.tsx
  • apps/desktop/src/renderer/components/chat/ChatAttachmentTray.test.tsx
  • apps/desktop/src/renderer/components/chat/ChatBuiltInBrowserPanel.test.tsx
  • apps/desktop/src/renderer/components/chat/ChatBuiltInBrowserPanel.tsx
  • apps/desktop/src/renderer/components/chat/ChatComputerUsePanel.test.tsx
  • apps/desktop/src/renderer/components/chat/ChatComputerUsePanel.tsx
  • apps/desktop/src/renderer/components/chat/ChatLifecyclePill.test.tsx
  • apps/desktop/src/renderer/components/chat/ChatLifecyclePill.tsx
  • apps/desktop/src/renderer/components/chat/ChatSubagentTakeoverBanner.tsx
  • apps/desktop/src/renderer/components/chat/CrossMachineHandoffModal.test.tsx
  • apps/desktop/src/renderer/components/chat/CrossMachineHandoffModal.tsx
  • apps/desktop/src/renderer/components/chat/CursorRuntimeNotice.tsx
  • apps/desktop/src/renderer/components/chat/RewindFilesConfirmDialog.tsx
  • apps/desktop/src/renderer/components/chat/codex/CodexGoalBanner.test.tsx
  • apps/desktop/src/renderer/components/chat/codex/CodexGoalBanner.tsx
  • apps/desktop/src/renderer/components/chat/launch/LaneSetupCard.test.tsx
  • apps/desktop/src/renderer/components/chat/launch/LaneSetupCard.tsx
  • apps/desktop/src/renderer/components/chat/launch/chatLaunchDock.ts
  • apps/desktop/src/renderer/components/cto/CtoTalkButton.tsx
  • apps/desktop/src/renderer/components/cto/CtoTalkNoticeLine.tsx
  • apps/desktop/src/renderer/components/cto/CtoVoiceHud.tsx
  • apps/desktop/src/renderer/components/cto/ctoMicrophoneFix.test.tsx
  • apps/desktop/src/renderer/components/cto/ctoUi.test.tsx
  • apps/desktop/src/renderer/components/files/v2/FilesWorkbench.test.tsx
  • apps/desktop/src/renderer/components/files/v2/FilesWorkbench.tsx
  • apps/desktop/src/renderer/components/history/TimelineToolbar.tsx
  • apps/desktop/src/renderer/components/history/historyGitActions.test.ts
  • apps/desktop/src/renderer/components/history/historyGitActions.ts
  • apps/desktop/src/renderer/components/history/historyLaneActions.test.ts
  • apps/desktop/src/renderer/components/history/historyLaneActions.ts
  • apps/desktop/src/renderer/components/lanes/CreateLaneDialog.test.tsx
  • apps/desktop/src/renderer/components/lanes/CreateLaneDialog.tsx
  • apps/desktop/src/renderer/components/lanes/CreateLaneDialogHost.tsx
  • apps/desktop/src/renderer/components/lanes/LaneBranchDrift.tsx
  • apps/desktop/src/renderer/components/lanes/LaneDialogShell.tsx
  • apps/desktop/src/renderer/components/lanes/LaneGitActionsPane.test.tsx
  • apps/desktop/src/renderer/components/lanes/LaneGitActionsPane.tsx
  • apps/desktop/src/renderer/components/lanes/LaneRebaseBanner.test.tsx
  • apps/desktop/src/renderer/components/lanes/LaneRebaseBanner.tsx
  • apps/desktop/src/renderer/components/lanes/ManageLaneDialog.tsx
  • apps/desktop/src/renderer/components/lanes/PushDivergenceDialog.tsx
  • apps/desktop/src/renderer/components/lanes/PushDivergenceGuard.test.tsx
  • apps/desktop/src/renderer/components/projects/ProjectWelcomePage.tsx
  • apps/desktop/src/renderer/components/projects/ProjectWelcomeWebNotices.tsx
  • apps/desktop/src/renderer/components/prs/CreatePrModal.tsx
  • apps/desktop/src/renderer/components/prs/PrRebaseBanner.tsx
  • apps/desktop/src/renderer/components/prs/shared/PrActionsMenu.tsx
  • apps/desktop/src/renderer/components/prs/shared/PrLaneCleanupBanner.test.tsx
  • apps/desktop/src/renderer/components/prs/shared/PrLaneCleanupBanner.tsx
  • apps/desktop/src/renderer/components/prs/shared/PrMergeDialog.tsx
  • apps/desktop/src/renderer/components/prs/shared/prDetailRedesign.test.tsx
  • apps/desktop/src/renderer/components/prs/shared/prMarkdownContext.tsx
  • apps/desktop/src/renderer/components/prs/tabs/GitHubTabView.tsx
  • apps/desktop/src/renderer/components/prs/tabs/IntegrationTab.tsx
  • apps/desktop/src/renderer/components/prs/tabs/RebaseTab.tsx
  • apps/desktop/src/renderer/components/settings/AdeCliSection.tsx
  • apps/desktop/src/renderer/components/settings/GitHubSection.tsx
  • apps/desktop/src/renderer/components/settings/LaneTemplatesSection.tsx
  • apps/desktop/src/renderer/components/settings/OAuthConnectModal.tsx
  • apps/desktop/src/renderer/components/settings/OpenCodeProviderDetailModal.tsx
  • apps/desktop/src/renderer/components/settings/PrChatTranscriptsSection.tsx
  • apps/desktop/src/renderer/components/settings/ProjectSection.tsx
  • apps/desktop/src/renderer/components/settings/RemoteContextBadge.tsx
  • apps/desktop/src/renderer/components/settings/SecretsImportEnvModal.tsx
  • apps/desktop/src/renderer/components/settings/StorageSection.test.tsx
  • apps/desktop/src/renderer/components/settings/StorageSection.tsx
  • apps/desktop/src/renderer/components/settings/SyncDevicesSection.test.tsx
  • apps/desktop/src/renderer/components/settings/SyncDevicesSection.tsx
  • apps/desktop/src/renderer/components/settings/WebScopePill.tsx
  • apps/desktop/src/renderer/components/settings/harnesses/HarnessesPage.tsx
  • apps/desktop/src/renderer/components/settings/providerSectionPrimitives.tsx
  • apps/desktop/src/renderer/components/settings/providers/ProviderSignInModal.tsx
  • apps/desktop/src/renderer/components/settings/providers/accounts/AddProviderAccountSheet.tsx
  • apps/desktop/src/renderer/components/settings/providers/accounts/ProviderAccountsPanel.test.tsx
  • apps/desktop/src/renderer/components/settings/providers/accounts/ProviderAccountsPanel.tsx
  • apps/desktop/src/renderer/components/settings/providers/keys/AddApiKeySheet.tsx
  • apps/desktop/src/renderer/components/settings/providers/keys/OpenCodeCustomProvidersPanel.tsx
  • apps/desktop/src/renderer/components/settings/providers/keys/ProviderApiKeysPanel.tsx
  • apps/desktop/src/renderer/components/settings/providers/providerUi.tsx
  • apps/desktop/src/renderer/components/settings/storage/StorageCleanupDialog.test.tsx
  • apps/desktop/src/renderer/components/settings/storage/StorageCleanupDialog.tsx
  • apps/desktop/src/renderer/components/shared/Banner.tsx
  • apps/desktop/src/renderer/components/shared/InlineDialogs.tsx
  • apps/desktop/src/renderer/components/shared/ModelPicker/ModelPicker.tsx
  • apps/desktop/src/renderer/components/shared/ModelPicker/ReasoningEffortPicker.tsx
  • apps/desktop/src/renderer/components/shared/ModelPicker/providerEmptyState.tsx
  • apps/desktop/src/renderer/components/shared/PermissionModePicker.tsx
  • apps/desktop/src/renderer/components/terminals/AutoHandoffModal.tsx
  • apps/desktop/src/renderer/components/terminals/SessionListPane.tsx
  • apps/desktop/src/renderer/components/terminals/TerminalImagePasteNotice.tsx
  • apps/desktop/src/renderer/components/terminals/TerminalsPage.test.tsx
  • apps/desktop/src/renderer/components/terminals/TerminalsPage.tsx
  • apps/desktop/src/renderer/components/terminals/importSessions/ImportActionBar.tsx
  • apps/desktop/src/renderer/components/terminals/importSessions/ImportSessionBrowser.tsx
  • apps/desktop/src/renderer/components/terminals/importSessions/ImportSessionList.tsx
  • apps/desktop/src/renderer/components/terminals/sessionLifecycleActions.ts
  • apps/desktop/src/renderer/components/terminals/workToolPanels.tsx
  • apps/desktop/src/renderer/components/ui/ViewportOverlayHost.test.tsx
  • apps/desktop/src/renderer/components/ui/ViewportOverlayHost.tsx
  • apps/desktop/src/renderer/components/ui/dialog/Dialog.test.tsx
  • apps/desktop/src/renderer/components/ui/dialog/Dialog.tsx
  • apps/desktop/src/renderer/components/ui/dialog/confirm.tsx
  • apps/desktop/src/renderer/components/ui/dialog/dialog.css
  • apps/desktop/src/renderer/components/ui/dialog/index.ts
  • apps/desktop/src/renderer/components/ui/dialogFocus.ts
  • apps/desktop/src/renderer/components/ui/notice/AppBannerHost.test.tsx
  • apps/desktop/src/renderer/components/ui/notice/AppBannerHost.tsx
  • apps/desktop/src/renderer/components/ui/notice/Banner.tsx
  • apps/desktop/src/renderer/components/ui/notice/NoticeParts.tsx
  • apps/desktop/src/renderer/components/ui/notice/ToastCard.tsx
  • apps/desktop/src/renderer/components/ui/notice/appBannerStore.ts
  • apps/desktop/src/renderer/components/ui/notice/index.ts
  • apps/desktop/src/renderer/components/ui/notice/notice.css
  • apps/desktop/src/renderer/components/ui/notice/noticeTones.ts
  • apps/desktop/src/renderer/components/ui/zLayers.ts
  • apps/desktop/src/renderer/components/usage/HeaderUsageControl.tsx
  • apps/desktop/src/renderer/components/usage/UsageAccountRow.tsx
  • apps/desktop/src/renderer/components/usage/UsageLimitsBand.tsx
  • apps/desktop/src/renderer/components/usage/usage.test.tsx
  • apps/desktop/src/renderer/index.css
  • apps/desktop/src/renderer/lib/githubIntegrationStatus.ts
  • apps/desktop/src/renderer/webclient/workspace/WebConnectionsChip.tsx
  • apps/desktop/src/renderer/webclient/workspace/__tests__/WebConnectionsChip.test.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@arul28

arul28 commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

Isolated Vite preview of the shared AppBannerHost with the ready-update model. Before shows the existing top-bar install action; after adds the floating reminder. Dark and light captures are included.

Before: top-bar install action without the floating update reminder

After: ready-to-install floating banner in dark theme

Ready-to-install floating banner in light theme

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 potential issues.

1 flag not posted on this PR by your GitHub settings — view it in Devin Review. (Configure)

Devin Review

Comment on lines +110 to +120
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
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Suggested change
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
);

Devin Review


Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread apps/desktop/src/renderer/components/ui/dialog/confirm.tsx
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@arul28
arul28 merged commit 615879b into main Sep 24, 2026
40 checks passed
@arul28
arul28 deleted the t3code/shared-banner-system branch September 24, 2026 12:43
arul28 added a commit that referenced this pull request Sep 24, 2026
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>
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