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 |
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
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
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
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
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
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
There was a problem hiding this comment.
Two ownership/geometry issues in the new panel-animation plumbing.
Posted via Macroscope — UI Consistency
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
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
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
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
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
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.
## 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
…icons, file tree diff, panel animations, vite-plus 0.3.0) Brings the fork up to upstream/main 5b8445b. Highlights: customizable project icons (pingdotgg#9137), file tree in diff/PR tab (pingdotgg#9330), opt-in panel animations (pingdotgg#8830), browser profiles for preview (pingdotgg#7254), unified file/media previews (pingdotgg#9253), vite-plus 0.3.0 (pingdotgg#9327) + tailwind/lightningcss dedupe (pingdotgg#9331), environment machine icons (pingdotgg#9299/pingdotgg#9365). Conflict resolutions: keep-both for pnpm-workspace (upstream dedupe + fork allowBuilds); pnpm-lock regenerated via pnpm install --lockfile-only (node@24) to union upstream upgrades with fork infra/mt-teams workspace; strip stray '<' prefixes the merge left on 7 fork lines (Migrations 041, RpcAuthorization stacks, AssetAccess/CursorProvider imports, Cursor --force test, GitHub CLI detail). Fork guard script OK.
Merges 137 upstream commits (`d937e3075..36c4e9c`) into the fork, following the `fork-upstream-merge` skill. Landed as a merge commit; conflicts resolved by the inventory's cached verdicts. ## Merge shape 816 files landed (`git diff --stat HEAD^1 HEAD`) against 811 in the upstream range; fork delta 650 files. The gap of five is all in landed and not the range: two fork-owned files touched during resolution (`sandboxControl.placement.test.tsx` test-prop fixup, `useSandboxCommandsBanner.tsx` reformat) plus the three fork docs this merge writes (`inventory.json`, `gaps.md`, `upstream-merge-log.md`). No upstream work was dropped. ## Conflicts Resolved by inventory verdict — `AGENTS.md` (kept the fork's slimmed shape, added Antigravity to the provider list), `contracts/rpc.ts` and `environment.ts`, the ChatView/MessagesTimeline thread-fork + message-origin convergence, the preview cluster (`addBrowserSurface` `profileId` beside the fork's `url`, `rightPanelStore` `openAttachment` beside `retargetFile`), the settings gates, and the two upstream pingdotgg#9364 test deletions. Two latent fork bugs surfaced and were fixed: `PreviewView`'s hosted annotation handler called an unexported helper, now routed through the exported `capturePreviewAnnotationScreenshot` wrapper (matching the sibling native handler); and `ChatView` passed a `configuredUrls` prop the fork's hosted `PreviewPanel` does not accept. ## Unsupported methods `unsupported-methods.mjs` reported ADD 10; recomputed to 0 by adding `UnsupportedMethodError` to the shared `ProviderSetupRpcError` union (nine `provider.auth.*` / `provider.install.*` methods) and to `server.refreshUsageRates`. `gaps.md` grown with a _Provider setup_ bullet and a `refreshUsageRates` clause on _Usage summary_. The three DROP entries (`scripts.run`, `subtasks.list`, `threads.getShell`) are the documented keep-anyway exceptions — `apps/server` still refuses them. ## Feature classification **Usable as-is** (UI only, no backend dependency): mod+w tab close (pingdotgg#9363), PageUp/PageDown chat nav (pingdotgg#9315), diff/PR file tree (pingdotgg#9330), diff-header copy path (pingdotgg#2403), error-report copy (pingdotgg#9166), opt-in context-window indicator (pingdotgg#9190), opt-in panel animations (pingdotgg#8830), proactive panels (pingdotgg#9276), button press feedback (pingdotgg#9349), provider-editor redesign chrome (pingdotgg#8508). **Unsupported in Moatless** (resolve to a refusal): Antigravity provider auth/install and all `provider.*` setup (pingdotgg#9348, pingdotgg#8508), `server.refreshUsageRates`. Desktop-only and already capability- or desktop-gated, so no new fork work: preview browser profiles (pingdotgg#7254), open-links-in-app (pingdotgg#9339), ssh-host suggestions (pingdotgg#9171), environment-as-machine (pingdotgg#9299), continue-threads-across-restart (pingdotgg#9167, rides the new `serverUpdateThreadContinuation` capability). **Backend behavior to reproduce** if Moatless wants it: project icons (pingdotgg#9137, migration 047), auto-pull clean default branches (pingdotgg#9277, migration 045), inline citations (pingdotgg#9146, needs the backend to emit them), the usage page. Migration 046 (RepairAutomaticSettlementTimestamps) is upstream-server-only. Net-zero: context compaction (pingdotgg#8808) landed and was reverted (pingdotgg#9284). ## Verification `fmt:check`, `lint`, `typecheck`, `tripwires` and `inventory-check` green. Full test suite green — one web test failed initially (`addBrowserSurface.test.ts` did not expect the converged default `profileId`), fixed and re-run. Two `verify.mjs` checks exit non-zero and are the caveated machine failures: `unsupported-methods` on the three documented DROP exceptions above, and `duplicate-adds` on three confirmed false positives (`openPreview` in a `ChatView` object literal vs its deps array; three distinct `it()` blocks in `addBrowserSurface.test.ts`). Written by Claude Opus 5 in Claude Code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- Moatless task: https://moatless.soaplabstest.com/tasks/4e881239-73d1-4a93-9563-6a926e920b42

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.