Skip to content

Feel-fix 2: the sidebar gaps sign-off 5 held (row glow, icon picker, Favorites across profiles, a window's first visit) - #35

Open
siyabendoezdemir wants to merge 8 commits into
mainfrom
lane/feel-fix-2
Open

siyabendoezdemir wants to merge 8 commits into
mainfrom
lane/feel-fix-2

Conversation

@siyabendoezdemir

@siyabendoezdemir siyabendoezdemir commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

What this does

The feel-fix-2 lane: the four gaps that the lead's sign-off 5 held back in the sidebar (D91). The builder's report is reviews/lane-feel-fix-2-report.md in the project's context folder, and its brief is lanes/feel-fix-2.md.

  1. The row glow (FL-06, FL-05, TB-04, TB-05, TB-08, SB-22; P0). A background tab's row glows once, when it first mounts in the window. It doesn't glow again when the row is selected, left, dragged past or moved. A tab opened selected never glows, and with reduced motion nothing glows. Before, a new row glowed 4 times, older rows glowed again, and the glow played under reduced motion.
  2. The icon picker (TB-12, FD-07; P1). Change Icon… on a tab, folder, split or Favorite opens the Space icon's emoji picker (SP-05) under the row. It has search, categories, skin tones and recents shared with the Space picker, a typed or pasted emoji, and Remove icon. Before, it offered a fixed grid of 48 emoji with no search.
  3. Favorites across profiles (PR-06, SP-10; P0). The Favorites grid is keyed by profile, so between profiles it swaps whole under the switcher's cross-fade. The stand-in page draws split Favorites. Frame sampling went from 180 wrong samples (117 with reduced motion, 85 between grids of different heights) to 0.
  4. A window's first visit to a Space (SP-10, SP-23, SP-24; P0). A Space switch now picks the window's remembered tab unless it's gone or another window shows it. Failing that, it picks the Space's most recent tab no other window shows, and failing that, the empty state. A new window still opens with no tab (SP-24).
    • A behaviour change to review: the switching window no longer keeps its own remembered tab when another window shows it (TB-17's last step). spaces.spec.ts and the TB-17 unit test were changed to match.

New tests: tests/e2e/feel-fix-2.spec.ts (10 tests, sampled every frame) and 3 unit tests in tests/unit/spaces.test.ts. Each fix's test failed without it (the report gives the numbers).

Merge gate (D42)

  • Gate r2 on the lane's head 23081b6 (before the merge of main below):
    $ gate.sh lane-feel-fix-2 gate-feel-fix-2/r2   (build, typecheck, lint, vitest, then playwright --workers 1 under xvfb-run 1440x900)
    build 0
    typecheck 0
    lint 0
    unit 0
     Test Files  117 passed (117)
          Tests  1136 passed (1136)
    e2e: 863 passed, 0 failed, 2 skipped (macOS-only keys), 0 flaky (48.4 min)
    
    Gate r1 on 20e7937 had one real failure, tabs-more.spec.ts:586: a locator that matched two elements once item 4 showed the target Space's tab mid-drag. It's fixed in 23081b6.
  • The lead merged main in (08ba8f2: feel-fix, PR 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, and sign-off 6's marks, PR Sign-off 6: feel marks for feel-fix's rows and Tweaks; PK-07 reopened #34). There were no conflicts, and FEATURES.md regenerates unchanged. Because the merge brings feel-fix's code, gate r3 runs on 08ba8f2, and its result goes here before the merge.
  • git diff --stat cd74157 08ba8f2:
     FEATURES.md                                    |  14 +-
     docs/feature-status.json                       |  12 +-
     src/main/spaces/model.ts                       |   9 +-
     src/main/tabs/model.ts                         |  14 +
     src/renderer/src/shell/sidebar/Favorites.tsx   |   4 +-
     src/renderer/src/shell/sidebar/IconPicker.tsx  | 145 ++----
     src/renderer/src/shell/sidebar/ItemList.tsx    |  53 +-
     src/renderer/src/shell/spaces/EmojiPicker.tsx  |   5 +-
     src/renderer/src/shell/spaces/SpacePreview.tsx |  52 +-
     src/renderer/src/styles/global.css             |  70 +--
     tests/e2e/feel-fix-2.spec.ts                   | 638 +++++++++++++++++++++++++
     tests/e2e/finish-tabs.spec.ts                  |   2 +-
     tests/e2e/finish-views.spec.ts                 |   3 +-
     tests/e2e/frames.ts                            |  40 +-
     tests/e2e/spaces.spec.ts                       |   7 +-
     tests/e2e/tabs-more.spec.ts                    |  10 +-
     tests/unit/spaces.test.ts                      |  64 ++-
     17 files changed, 920 insertions(+), 222 deletions(-)
    
  • macOS: unverified. There is no CI (D42), and frame pacing and window focus need a real compositor.

Review

An independent review comes next (D42), and its result goes here before the merge.

🤖 Generated with Claude Code


Note

Medium Risk
Space-switch tab selection changes multi-window behavior (no longer taking a tab shown in another window), which is user-visible and touches core state in switchSpaceInDraft; the rest is UI/motion with broad e2e coverage.

Overview
Feel-fix 2 closes four sidebar/sign-off gaps: motion, icon picking, cross-profile Favorites, and multi-window Space tab selection.

Background tab row glow (FL-06) moves from a CSS class animation to a one-shot Web Animations API tint on first row mount, with reduced-motion and selection cancelling the effect; feature docs updated accordingly.

Change Icon… (TB-12 / FD-07) drops the small fixed emoji grid and reuses the Space EmojiPicker (search, categories, skin tones, shared recents) under the row; styling is simplified in global.css.

Favorites when switching profiles (PR-06) remounts the favorites LayoutGroup per profile so tiles swap in place with the Space cross-fade; SpacePreview now renders split favorites like the live grid.

Space switch tab pick (SP-10 / SP-23) adds tabOnSwitch so a window keeps its remembered tab only if it still exists and isn’t shown elsewhere; otherwise it picks the Space’s MRU “free” tab or empty state—the switching window no longer steals a tab another window is showing (tests and spaces.spec expectations updated).

New frame-recorder support (animations, nth keys) powers feel-fix-2.spec.ts; existing e2e tests were adjusted for the unified emoji picker.

Reviewed by Cursor Bugbot for commit 08ba8f2. Bugbot is set up for automated code reviews on this repo. Configure here.

siyabendoezdemir and others added 8 commits October 12, 2026 00:31
…(FL-06, FL-05)

The row kept `is-new-background` from its first render, and `row-glow` played on that
class while the row was not selected. So the glow replayed each time the selection left
the row, and whenever a reorder put the row's element back in the document; rows made
in the background at launch kept the class for good.

The glow is now played with the Web Animations API, once, as the row first mounts in
this window: a row that remounts (another section, a folder opening, back near the
visible band) is not a first appearance. A tab made selected never glows, a row
selected while it glows shows its highlight in the same frame, and with reduced motion
(Orbit's switch or the system) no row glows. The tint stays in CSS (`--row-glow`).

feel-fix-2.spec.ts records every row's running animations each frame (frames.ts gains
an `animations` option). Without the fix, the new row glowed 4 times, rows made before
it 1-2 times more each, a row moved to Pinned as it glowed twice, and with reduced
motion the glow played.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, FD-07)

The icon picker for a tab, folder, split or Favorite was a one-off grid of
48 emoji. It now hosts the Space icon's EmojiPicker (SP-05) in its six-column
form, under the row: search, categories, skin tones and the emoji used last,
shared with the Space picker through the same storage; an emoji typed or
pasted is offered as it is; Remove icon (shown when there is one) brings back
the favicon. The open/close motion (FL-25, FL-28), Escape and click-outside
closing and the keys leaving its search at once are kept; it is placed with
its measured height. The picker's search takes the keyboard in a layout
effect, from the frame it first shows.

Tests: feel-fix-2 TB-12 (tab: "sun", a skin tone and a hand, a typed emoji;
folder; Favorite; Escape, click outside; Remove icon; the Space picker sees
the same tone and recents), FL-25/FL-28 open and close; the specs that drove
the old picker now use its search.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in place (PR-06, SP-10)

A profile change made the grid's AnimatePresence see one profile's tiles leave and the
other's arrive. The real page was still hidden when they left, so popLayout measured them
at 0 and left them in the flow: for several frames the grid wrapped into an extra row,
pushed the title row and the lists down, and the new tiles popped in and slid back up.
The grid's LayoutGroup is now keyed by the profile: a profile change swaps the whole grid
at rest, and the switcher's cross-fade alone carries it. Within a profile nothing changes.

The stand-in and neighbour pages drew only tab Favorites, so a profile with a split
Favorite showed fewer, wider tiles until the real page arrived; they now count and draw
split tiles as the grid does.

Tests (feel-fix-2.spec.ts): click and swipe there and back, full and reduced motion, one
and two rows, sampling every frame: title rows stay at their places, no tile below the
grid, each page's tiles drawn as a resting grid. frames.ts gains `nth` for keyed matches
that share a key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tab; a switch never takes another window's tab (SP-10, SP-23)

A window that had nothing remembered for a Space (a window opened with ⌘N, then switched
away and back) showed the empty state although the Space had tabs. As a window switches,
`tabOnSwitch` now picks the tab it last used there, unless that tab has gone or another
window shows it (or a pane of its split view); else the Space's most recently used tab
that no other window shows; else none, the empty state. A switch never takes a tab from
another window: before, the switching window kept its remembered tab and the other
window had to pick again. A new window still opens with no tab selected (SP-24).

Tests: feel-fix-2.spec.ts (⌘N, window 2 to B and back to A shows A's most recent tab
window 1 doesn't show; window 1 keeps its page; a remembered tab window 1 now shows
isn't taken back; a Space whose only tab window 1 shows gives the empty state);
spaces.spec.ts TB-17 and the unit test now expect the switching window to pick another
tab; new unit tests for a first visit, a gone tab and the empty state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feature-status.json: kept both sides per key, main's new "feels right" marks and this lane's notes
(TB-12, FD-07, SP-10, SP-23, PR-06, FL-06, none of which main marked); FEATURES.md regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… B's tab (SP-10)

Gate r1 found it: once a window's first visit to a Space selects that Space's last-used tab,
the window that slides to B mid-drag shows B's tab, and its page's pane carries the same
data-tab-id as the row, so the bare `[data-tab-id]` locator matched two elements. The test
now takes the row and checks the window selected B's tab.

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>
@cursor

cursor Bot commented Oct 12, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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: ecae4459-7c8e-42db-b8cf-fe0783390f87)

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