Uh oh!
There was an error while loading. Please reload this page.
feat(web): add opt-in panel animations - #8830
Conversation
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Team Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Warning Your free Security trial is over. An organization admin can activate Security or dismiss this notice. Comment |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Reviewed the panel-animation opt-in for shared-primitive and CSS-ownership consistency. Two findings: a clipped resize handle in PreviewPanelShell when animations are enabled, and header transition ownership moving from the owning module into a global rule. The @starting-style block is appropriate to keep in index.css.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
UI Consistency review
Three findings, one of which is a concrete regression risk in the new opt-in close animation.
apps/web/src/components/preview/PreviewPanelShell.tsx— the collapse animates the width of the box that owns the panel content, so panel children reflow through every intermediate width. For the terminal surface this reaches the server: the tiny grid computed on the last animation frames is flushed to the PTY when the panel unmounts.apps/web/src/index.css/apps/web/src/components/WorkspacePageHeader.tsx— a one-ownerpadding-lefttransition moved out of the owning component into unlayered global CSS, taking cascade ownership away from the call site. The repo'sin-data-*variant expresses the same ancestor condition at the owner.apps/web/src/panelAnimations.ts—usePanelPresenceis new timer/state logic that decides when panel content unmounts, andPreviewPanelShell/Sidebar/SheetPopupgainedanimated/opendefaulting; a focused test would lock that contract.
Settings row, search entry, contract default, and the sheet/sidebar animated gating otherwise look consistent with the surrounding patterns.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This XL change introduces configurable panel animation and presence-management behavior across the sidebar, chat, pull-request, terminal, sheet, and responsive header surfaces. It also changes existing default transitions to snap at the new 0 ms default, so the cross-cutting runtime and default-experience impact merits human review. You can add or adjust custom eligibility rules. Learn more. |
There was a problem hiding this comment.
Reviewed the panel-animation opt-in against the shared panel/sidebar primitives. Two findings in apps/web/src, both on the inline right panel host: an always-on width transition that now fights the resize drag, and the new global @starting-style override that belongs to PreviewPanelShell. The prior findings on this PR (content reflow during close, header transition ownership, missing usePanelPresence coverage) look addressed.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
UI consistency review of the panel-animation changes. The earlier findings (resize-drag easing, global index.css ownership, missing usePanelPresence coverage) look addressed. One regression remains, in ChatView's sheet-mode branch: the titlebar control cluster is now rendered twice.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the panel-animation presence wiring in ChatView: the titlebar control cluster is withheld from the header for the whole sheet exit, so it is missing from the UI for ~200ms in sheet mode.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the shared Sidebar primitive: the new animationDurationMs prop does not reach the desktop transitions, which read an ancestor-provided CSS variable instead. Details inline.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Two ownership/geometry issues in the new panel-animation plumbing.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
UI consistency review found one behavioral regression in the right-panel presence wiring and one settings-panel consistency gap.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the new panel-animation plumbing: the inline panel's transition duration is the only part of this feature that isn't threaded explicitly.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding: the titlebar-cluster reserve in the chat header (and the equivalent spacer in the pull-requests route) is now keyed to panel presence, which releases it a full animation ahead of the panel actually covering the cluster, so the floating controls overlap the header actions for the whole open transition.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the header reserve change in _chat.pull-requests.tsx: the spacer is now always mounted, so its flex gap-3 contribution survives even when it collapses to w-0.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding: the mobile sidebar drawer now loses its sheet motion by default because Sidebar forwards the panel-animation setting into the shared SheetPopup.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Both findings are inline. The rest of the revision looks consistent: the resize handle is no longer clipped, --panel-animation-duration is now owned by PreviewPanelShell/Sidebar themselves, the tab strip and body unmount together through one retained value, and the terminal drawer's grid collapse clips a fixed-height <aside> rather than reflowing the Ghostty grid.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c3c5b7f. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
## What's Changed * feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254 * refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272 * feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830 * feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277 * fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112 * feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808 * feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276 * fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281 * fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279 * Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284 * fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280 * fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283 * fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285 * fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188 * fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180 * fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254 * fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287 * feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292 * chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262

Panel motion was inconsistent across the sidebar, right panel, and terminal drawer. This adds one Appearance setting for all three, with a 0–400 ms duration slider that defaults to 0 ms.
The implementation shares one duration and one small presence hook across the panel surfaces. Reduced-motion mode stays instant, and the existing mobile sidebar sheet keeps its default behavior.
Evidence
Before:
After, dark mode:
After, light mode:
Settings preview at 400 ms:
Right-panel motion at 400 ms:
1280 × 800 MP4
Verified with 99 focused tests, web/contracts/desktop typechecks, a production web build, and direct browser checks at 0 ms and 400 ms.
Built with
gpt-5.6-solthrough the Codex harness.Note
Add opt-in panel animations across web UI panels
PanelAnimationDurationMs(0-400ms) inClientSettingsSchemawith UI controls in theAppearanceSettingsPanel.usePanelPresenceandobserveResponsiveBreakpointFadeutilities to handle animation and retain panel content during close transitions.SheetPopup,PreviewPanelShell,ChatView,PullRequestsRouteView, and other components to consume the animation settings and transition widths, margins, and opacity.PreviewPanelShellwidth-transition effect forces a temporary 0ms transition during width changes, and panels now stay mounted longer viausePanelPresencewhile closing, which requires careful cleanup to avoid lingering references.Macroscope summarized 68a55c6.