Repository navigation
Feel fixes: split fill, the return from picture-in-picture, the first ⌘T, Peek's layout, split motion, the Mini Window, the page tools and the Library's first open (D80) - #32
Conversation
…that closes the bar (SV-02, SV-03, SV-07, SV-15) The command bar asks the pane session first (a new barChoice hook): the chosen tab moves, is copied or swaps into the pane in the same store update that closes the bar, so no frame selects it outside the split. The shell's pane engine hands the replaced pane's card to the new tab, so it no longer regrows from a sliver. feel-fix.spec.ts samples the page views in main from Enter until the split settles: without the fix the chosen tab covered the split for 12 samples (45 ms); without the engine hand-over its view grew for 250 ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nce it has drawn there (MD-01, MD-07, MD-16) Selecting the video's tab again, or Back to tab, attached the tab's view to its window at once. The view still held the frame it drew in the player, so the page area showed the player layout (black, the video small at its top-left) for 2-3 frames. The window manager can now hold a view that comes back into a window out of sight, at its place under the pages the window showed, until a feature says it is ready (holdArrivals, at most 250 ms). The player asks for it: the page's agent resolves once the page has drawn a frame with its video back in it. The pages shown before stay until then. Tests: media.spec.ts checks every frame of the return in main (the view is never shown before the page drew its own layout) and, where an ffmpeg with x11grab exists, a grab of the screen (no frame of the player layout in the page area, no empty player). MD-16's note says what Back to tab does now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ns (CB-22) A new window's overlay now starts at the window's size, all but one corner pixel outside the window, and opens an invisible, inert bar a few times (mount, focus, entrance, exit) before it hides. A hidden view never got a size before, so the first real open resized the overlay from 0x0 and laid it out again. Main builds the keymap at start-up and looks a ⌘T up again once the overlay has warmed. feel-commandbar's first-open test judges rounds as D46 says, with a fresh launch for each, and checks that no open resizes the overlay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…70, FL-28) The error screen's card shows with no animation, and the swipe arrow's circle fills and fades with no transition and no scale, once Orbit's Reduce Motion is on; both animate with it off. Without the pages' .reduce-motion rules, both fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ll of it (PK-06, FL-19) The page view no longer follows the card frame by frame. It is laid out once, at the card's size, with all but its corner pixel outside the window, and joins the card when the card comes to rest. While the card moves (a drag, a swipe, the close, the expand, the split), it shows a still of the page that main captures while the page sits on the card, and the page view waits out of sight at the size it shows at next. The card and its shadow are laid out once and move by transform and opacity only (FL-01). feel-peek checks, with a main-side sampler of the view, that its size changes at most once in an open or an expand and that it is never in sight mid-motion, and that on Escape it goes at once while the still fades out. peek.spec's PK-06 tests measure the overlay's card and check the view stays out of sight while it is dragged or swiped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…card's still; regenerate FEATURES.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hows in the next frame; panes stop in place (SV-26, FL-18) - Main keeps a still of each pane of a split on screen (taken at rest, again a moment after a load, a scroll or a key), and the shell puts it in the pane's card under the page's view. A closing pane's card fades and collapses with its page on it while the other pane grows; it used to vanish and leave the space empty. - The drop zone renders in the move that finds it (flushSync), and its fade starts a frame along: it shows in the frame after the move (3 frames before), and moves to a new half in that frame (2). - Pane springs stop where they first reach their place when going slowly there: in place in about 280-300 ms, no overshoot (0.5 px only at 467-483 ms, 1.4 px over, before). A value turned around at speed keeps its momentum (FL-01). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the closing card's still and the drop zone in the next frame; regenerate FEATURES.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Window leaves the screen whole (MW-04, MW-15) A window shows first the frame it drew last. The hidden ready window had drawn its blank lookup bar, so a link from another app showed that bar for a frame before its page, and a blank window showed it at full size before the grow. Until it is claimed, the ready window now draws itself empty in the window's colour. Closing, and "Open in…" where the window goes at once, hid the window only after its UI or its page had gone. The window now leaves the screen first. Where it fades out (macOS, Windows), its card shows a still of the page while the page leaves for the main window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d the window that leaves whole; regenerate FEATURES.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ws seconds apart (MW-04) A hidden window can go several seconds without a frame. The recorder now runs until the check stops it, and the wait for the ready window's idle frame allows for the gap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; the Peek closes with its page (PK-06, PK-09, D28) Every place that lays out or shows the Peek's view now checks the view still has a live page (view.webContents reads undefined once it has gone, even before 'destroyed' fires). A page that goes while the Peek is open discards the Peek. Without it, a window layout after the page went threw "Cannot read properties of undefined (reading 'isDestroyed')" in main and the overlay stayed "peek". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… frame first (NV-06, AR-02, DL-10)
A view taken out of the window and put back shows the frame it last drew
until its renderer draws again (Chromium's own behaviour).
Page tools: before their view leaves the window, main tells their page
to draw itself empty; the page says so a frame later (pageTools.drawn)
and the view leaves then, after 250 ms at most. The keyboard still goes
back to the page at once. Put back, the find bar or zoom indicator no
longer shows the old one first (2-3 frames before). The zoom indicator
keeps its element from step to step, so its number changes in place
instead of blinking out and fading in again.
Library: closed, or made ahead of its first open, it draws nothing, and
only the open Library marks its section. The view made while idle
showed a half-drawn Library (the nav alone, opaque) for 3 frames on its
first open, and a first open on Downloads showed a see-through panel
with Archive marked and no rows for 5-6 frames.
feel-fix.spec.ts reads the page tools' frames in their page around each
time main puts their view back (find bar then zoom, a zoom step, zoom
reset), and the Library's frames from a first open on Downloads and a
later open on the Archive. Without the fix: the find bar ("page") and
the zoom indicator (125%) showed first, and the indicator was two
elements across a step; the Library's first frame was "closed on
archive, archive marked, opacity 1.00", and a later open marked archive
and downloads together.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Library drawn empty; regenerate FEATURES.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: e0c96d01-6706-4d0a-8575-daa44b7af7cc) |
…dow's corner, at its pane's size, so no page over it is needed (MD-01) A held view was kept out of sight only under another page its window showed. After ⌘W on the tab over the video's tab, from an empty Space or in a split, there was none, and the player layout showed for 8-9 frames. It now waits at its pane's size with all but its corner pixel outside the window, where its page draws, and moves into its pane when the hold ends. media.spec's two MD-01 tests cover the three new ways back; MD-01's note and player.ts's header say what holds within HOLD_MS and what doesn't. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…misses; CB-22's test logs its frame (D90) Over 12 fresh launches at load 2.0-3.7 the first ⌘T showed the bar within a frame in 7 (4.2-22.9 ms, median 14.6). Neither lead got it to 11 of 12: waiting 1.5 s after the warm-up gave 11, and drawing the warm-up's bars at 1 % opacity gave none. CB-22's note, FL-29's note and FEEL.md say what was measured; feel-commandbar's test logs the first ⌘T's frame and still judges its work and that nothing resizes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rawn: its cover's content and colour, and no bar above it (MW-04, MW-15) The test read the .mini--ready class, so it passed with the cover rule removed (review must-fix 3). It now reads the ::after's computed content and background-color, and hit-tests each bar's centre. With the rule removed it fails: the lookup bar shows first. frames.ts's record() gains two optional target fields, pseudo and top. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w's shell (PK-06) Only the overlay shows a still of the Peek's page; the shell got each data URL too. WindowManager.sendToOverlay sends to the overlay alone. The encode stays where it is; its cost on a 2x display is unmeasured (that is macOS). Without it, peek.spec.ts's new test fails: the shell received orbit:peek:still. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, so its card fades in its own colour (PK-06) The card kept the still from before a crash, or took one of the blank page a failed load leaves. While the tab has an error (a crash, or a main-frame load failure), main takes no still and tells the overlay to drop the one it has; the next load clears the error and stills come again. The overlay shows only the last still it was sent. Without it, peek.spec.ts's new test fails: after the crash the still stays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tself faded out, with a timer as the fallback (AR-02, FL-24) Main hid the view 180 ms after the close whatever the page had drawn: a page late with its fade left the view on a frame from mid-fade, which the next open showed first. As the page tools do (pageTools.drawn), the page now says when its fade's last frame is drawn (library.drawn, two frames after the fade ends), and main hides the view then; after 500 ms it hides it anyway. A crashed page's view hides at once. Without it, feel-fix.spec.ts's new test fails: the view hid 196 ms after the close, on a frame at opacity 0.92. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… warms again at its new size, out of sight (CB-22) After the warm-up, the hidden overlay kept the size it had: the first ⌘T after a resize laid it out again, the work CB-22 removed. 300 ms after the window's last resize, an overlay hidden at another size shows at the new size with all but its corner pixel outside the window, as at start-up; its renderer says when it has drawn there (search.warm) and it hides again. An overlay still playing its exit waits for it. Without it, feel-commandbar.spec.ts's new test fails: the overlay stayed 1238x792 in a window resized to 1118x702. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…_WAIT_MS, even when the capture never ends (MW-15) leaveWithStill awaited capturePage() with no limit, and STILL_WAIT_MS only started once it had: a capture that never settled left mini.leaving set, so "Open in…" never finished and later moves were refused. The capture now races STILL_WAIT_MS; a late one is not waited for and the window goes without a still. No test: the path runs only where windows fade, macOS and Windows (canFade), and never under Linux, where this lane's runs are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… to open (MD-01, PK-13) Once the Peek counts as on screen (finish-tabs' displayedTabs), a Peek whose video plays, replaced by the command bar, left the screen like a tab and the manager asked the player to open for it; only the page's discard, a microtask later, kept the player from showing. left() now returns for a Peek's tab: its page goes with its Peek. The new media.spec.ts test checks that the player is never asked; it can fail without the check only on a head that counts the Peek as shown (after the merge of main). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… MD-01); FL-19's close fade is 160 ms Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: - docs/feature-status.json: SV-26 is built yes (finish-tabs' row merge in the sidebar) with this lane's motion text and finish-tabs' row-merge and haptic text. FEATURES.md regenerated. - src/main/split/index.ts: imports hiddenByImport; selectsInPlace now asks hiddenByImport (D66 (1)) instead of isUnplacedImportTab, as every other split command does. - src/renderer/src/shell/split/useTabDrop.ts: finish-tabs' follow(drag); show(drag, next), with this lane's flushSync around setDrop in show() (FL-18); both imports kept. - src/main/commandbar/search.ts, src/main/context.ts, src/renderer/src/overlay/OverlayApp.tsx: imports only; both kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…abs built it (TB-17); Manage Spaces waits for SP-13's overview The catalogue's unit test checks New Blank Window finds its action first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 90abf890-a578-4ba7-8da5-081452e2430f) |
…corner pixel (MD-01); first ⌘T misses as counts (CB-22); still fade read as 117–167 ms (FL-19) Notes, comments and FEEL.md only (D92): - MD-01's note, player.ts's header and holdArrivals' comment: the player hides first; until the page has drawn, the page area keeps the page it showed or, after ⌘W on the tab over it or from an empty Space (alone or in a split), shows its blank card; no frame of the player layout reaches the page area; the held view's one pixel shows at the window's bottom-right corner meanwhile. The ways-back test comment says the same. - CB-22's note, FEEL.md and feel-commandbar's comment: 13 of 31 launches missed so far, about two in five. - FEEL.md: the Peek's still fade reads 117–167 ms from frames. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: cf91af01-4aad-4bea-bf75-9a2bbebfc453) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 62e8cd32-66d8-45f9-89b0-93424c396ce3) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 1858bd77-b690-42e9-8ad2-6b27cd78f1cd) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No conflicts: docs/feature-status.json, FEATURES.md and global.css merged cleanly (feel-fix's notes and this lane's); FEATURES.md regenerated with no change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-fix-2 No conflicts. FEATURES.md regenerates unchanged from the merged feature-status.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The feel-fix lane fixes the gaps that the "feels right" sign-offs held back (D48, D79, D80), so those rows can be signed:
It's built from
lanes/feel-fix.mdonmainat1f81f83. It has merged PR #29 (9a30d3d), finish-tabs (PR #31,21487aa, inef8351c) and tweaks (PR #30,6988d2a, in95667d9) and sign-off 5's marks (PR #33,c52bee7, the currentmain, ina1085ce). Againstmainit changes 45 files (+3317/−358). The reports are in the project's context folder: the build,reviews/lane-feel-fix-report.md; fix round 1,lane-feel-fix-fix1-report.md; fix round 2,lane-feel-fix-fix2-report.md. The before and after frames are inclips/feel-fix/.The lane marks no row "feels right". The lead checks each row again after the merge (D48).
What it fixes
FEEL.mdgive the counts.feel-commandbar.spec.ts:209logs the first ⌘T's frame, and still asserts its work and no resize. The sign-off holds CB-22 and FL-29.PEEK_CLOSE_MS); frames read 117–167 ms.mini-window.spec.ts:474reads the cover's computed style and hit-tests each bar, and fails withoutmini.css:17.STILL_WAIT_MS, even when the capture never ends (F6). No Linux test reaches that path (D93).Edits in other lanes' files
Each one is small and additive:
windows.ts:rewarmOverlay(CB-22, F5);sendToOverlay(F1);toolsLeaving,TOOLS_LEAVE_MS,hideTools(…, drawn), andtoolsInfo().placed.context.ts:barChoice.src/shared/commands:search.warm,peek.page,mini.stillShown,pageTools.drawnandlibrary.drawn.archive/index.ts:library.drawn(F4).media/manager.ts:left()returns for a Peek's tab (F8).global.css;LibraryApp.tsx, and one rule inlibrary.css;peek-helpers.tsandtests/e2e/frames.ts(two optional fields inrecord());FEEL.md;feature-status.json, and CB-13's note (New Blank Window, TB-17, is found now);tests/unit/commandbar.test.ts.Merge gate (D42, local)
Gate r2 ran on
95667d9, the head beforemain's data-only merge (below), on the VPS (Linux, under Xvfb), from 00:42 to 01:33 UTC, with an ffmpeg that has x11grab (ORBIT_FFMPEG). The lead ran it with the gate script:test.fail()counts as passed. MD-01's screen-grab test ran with the x11grab ffmpeg: on each way back, 0 grabbed frames showed the player layout.mainmerged in after the gate (a1085ce, 01:33). Sign-off 5's marks (PR feel: sign-off 5, 87 rows of the sidebar, Spaces and profiles (D48, D79) #33) merged while gate r2 ran. There were no conflicts, andFEATURES.mdregenerates unchanged. The merge brings only data, so D81's checks ran ona1085ce, the head this PR merges:a1085ce(01:34:08–01:34:37, load 5.5 → 8.5): build, typecheck and lint exit 0; unit 118 files, 1137/1137 passed.1a84e61(the head the review read): 769 passed, 1 failed, 3 skipped (42.6 min). The failure,feel-sidebar.spec.ts:360[FL-21], passed when rerun alone at load 3.1; the review found it predates the lane.mini.stillShown, F6's wait; D93);Review
reviews/lane-feel-fix.md, 22:44 UTC on 10-11): REQUEST CHANGES, 3 must-fix, each reproduced. MD-01's player layout after ⌘W or from an empty Space; CB-22's first ⌘T, still missed in about half of launches while the notes said it was fixed; andmini-window.spec.ts:474passing without its cover. 8 follow-ups. The other 8 items, and FL-21's gate failure, checked out.6c498aa, 23:54): the 3 must-fixes (MD-01's with F2), F1, F3–F6 and F8, and half of F7. Then the merge with finish-tabs: seven conflicts, each resolved with both sides' changes.reviews/lane-feel-fix-fixcheck.md, 00:27 on 10-12): APPROVE WITH FIXES, 1 must-fix, docs only. No frame of the player layout on any of five ways back, and each round-1 fix failed its test on one cut build. But MD-01's note said the page shown before stays, where a blank card shows for 6–9 frames.FEEL.md's fade range change, and F6 gets a unit test. The corner pixel is written down, not hidden.3ded4a1, 00:35): comments, notes andFEEL.mdonly. F6's test was skipped, with a reason.reviews/lane-feel-fix-fixcheck2.md, 00:49): APPROVE, no must-fix. The words match the grabs, CB-22's counts agree in all three places, only comments and docs changed, and the merge with tweaks has an empty remerge diff.mainafter the gate (a1085ce) brings only PR feel: sign-off 5, 87 rows of the sidebar, Spaces and profiles (D48, D79) #33's data, which that PR's own independent review approved (reviews/lead-signoff-5.md). It had no conflicts.🤖 Generated with Claude Code
Note
Medium Risk
Changes span overlay warm-up, PiP/view attachment timing, command-bar close + split state updates, and library/tools view lifecycle—high user visibility with limited data/security impact, but regressions could show flashes, stuck overlays, or wrong tab layout.
Overview
This PR is the feel-fix lane: it tightens motion and first-frame behavior so sign-offs can clear, and it syncs
FEATURES.md,docs/FEEL.md, anddocs/feature-status.jsonwith what shipped.Split view + command bar: Choosing an open tab to fill a new pane now applies in the same store update that closes the command bar (
barChoicehook +search.openpath), so the tab is not shown full-screen alone before the split layout appears.Command bar (CB-22): On startup, the keymap is warmed and the overlay runs a hidden warm-up at window size (
search.warm/overlayWarm) so the first ⌘T avoids resize work; docs note a remaining ~2-in-5 second-frame case.Picture-in-picture (MD-01 / MD-16): Returning video to the tab waits for the page to draw with the video back (
drawnin the media agent +holdArrivals/arrivingon the player) instead of flashing the player layout; Peek tabs no longer auto-float PiP when the peek goes away.Peek / split motion (documented): Page view lays out once with a still on the card; split springs stop without overshoot; pane close uses a page still.
Mini Window (MW-04 / MW-15): Spare/hidden windows draw empty before show; Open in… / fade-out close can show a page still on the card; close hides the window before the page is gone.
Library & page tools (AR-02 / NV-06): Views that would replay their last frame now fade/draw empty before the native view is hidden (
library.drawn,pageTools.drawn, CSSopacity: 0when closed); zoom indicator behavior is documented.Tests: Command-bar catalogue includes New Blank Window.
Reviewed by Cursor Bugbot for commit a1085ce. Bugbot is set up for automated code reviews on this repo. Configure here.