Repository navigation
Finish tabs: Orbit's own row menus, blank windows, the tab switcher, tab sleep, Spaces' toasts and themes, and the import guard (TB, SP, PR, FD) - #31
Merged
Conversation
…s colours (TB-14) The tab, pinned, Favorite, folder, multi-selection and split row menus are Orbit's own now, drawn in the overlay that SP-16 tints. Main builds the items as before and keeps what they do; the overlay draws them and sends back the item chosen. - Keys: arrows round the ends, Home/End, type-ahead, submenus with the arrows or hover, Enter or Space chooses, Esc closes a level then the menu, and a click outside closes it. - KS-18: each item shows its key from the live keymap. - KS-19: the menu takes the keys first; a key bound to an Orbit action only closes it (Cmd+W closes the menu, not the tab). - KS-16: the keyboard then goes back where it was. Rename for a tab or a split hands the sidebar the keyboard. - FL-21: a keyboard-opened menu sits under the row's slot, and the row stays drawn while its menu is open. - PK-13: while a Peek is open the row menu stays the system's, so the Peek stays open. - Tests use a new hook, rowMenu/chooseRowMenu, in place of lastMenu/clickMenu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow; Space-tinted toasts; Cmd+Z after the theme picker SB-13, SP-02, SP-16, NV-08, NV-03, FL-22: - While the sidebar is hidden, toasts go to a small view of their own over the bottom centre of the page card (or the pane in use in a split, following focus), sized to the stack. With the sidebar shown they stay at its foot. - New Space while hidden says so with Show (shows the sidebar). Tabs opened in the background (Cmd/middle-click, Open Link in New Tab, Cmd-click Back/Forward/Reload) toast with Show (goes to the tab). A toast with a button is clickable as a whole. - Toasts take the Space's surface, text and accent colours, in the sidebar and over the page. SP-14, TB-18: Cmd+Z after the theme picker closes puts back the theme (and light/dark, if changed there) as it was when it opened; Cmd+Shift+Z re-applies; from the sidebar or a page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hive periods apply at once SB-24, SP-15: over macOS vibrancy or Windows 11 22H2+ Mica the window is see-through and the neutral theme's frame lets the material through under a light veil; coloured themes stay solid, and a blend is partly see-through. Linux and older Windows have no material in Electron and keep the solid grey. Test runs may name a material (ORBIT_E2E + ORBIT_MATERIAL) to check the rest. TD-03: a change to a profile's archive period (or the default one) archives the Today tabs it now covers at once, not at the next minute's pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KS-05, TB-18: "Undo Sidebar Change" (Cmd+Z, Ctrl+Z) and a new "Redo Sidebar Change" (Cmd+Shift+Z, Ctrl+Shift+Z) carry their keys in the keymap, so Settings > Shortcuts can change them. Their keys are still handled where they are pressed (the sidebar, a page, the Library, the Space-delete note, Peek's reopen), each reading the live keymap: a key that edits text stays a text field's own undo inside one (KS-16); any other key acts everywhere. The key router and the UI fallback leave them alone, so nothing runs twice. Notes that say how to undo name the key as it is now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y land (TB-09, NV-08) TB-09: a sidebar row dragged over the page drops its URL where the page takes links (a text field or editable area in sight, in any pane) instead of making a split. The pages are asked once at lift, as drawn before the split preview makes room, so the zone is decided at each move without a question to the page (FL-18 holds); a page that doesn't answer in 150 ms gets the split preview. The page gets dragenter/over/leave/drop with the link and may take it itself; otherwise it is typed into the field, which gets the keyboard, and its pane becomes the focused one. NV-08: a link or text dragged from a page onto the sidebar opens as a tab where it is dropped, as a row dragged there would (TB-02): rows make room, a closed folder takes it in, Favorites open a place, a Space icon takes it there. The new row lands whole in the room it opened, in the same render. The older sidebar drop tests now drop at the top of Today. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New Blank Window (the command bar; ⌃⌘N and the File menu on macOS) opens a window with a sidebar of its own that starts empty, cascaded, with the command bar open; a Today tab dragged out of the sidebar moves into one (⌘Z puts it back), a pinned tab, Favorite or split pane goes as a copy. - A blank window shows a Space of its own (`blank: true`), kept out of the Space order, in the profile of the window it came from. No other window lists, shows or finds its tabs, and it finds only its own. - It has no Spaces, pinned tabs, Favorites or folders: their actions do nothing there and its row menus leave them out. - Open at quit, it comes back after a relaunch (TB-22 keeps it when it is the last window); closed, its Space goes and its tabs go to the Archive. - A profile a blank window uses can't be deleted until it closes. - Redo of a drag-out whose blank window has since closed puts the tab in the first Space, not a Space that's gone. Tests: sturdier new-window waits in tabs-review (the TB-17 flake), and the FL-21 300-tab test waits out the reveal's 450 ms settle, which pulled the list back under the drag (feel lane's test). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(D46) FL-04's sweep, FL-06's new row, FL-07's ⌘D/⌘Z travel, FL-09's close of the second row and FL-10's drag measured once against a time, so one slow frame on a loaded machine failed them (FL-09's gap closed in 263 ms at load 13.7). Each now measures up to three rounds that undo what they did (reopen, close, ⌘Z, Escape) and judges its budgets on the best one. What must hold every time still holds on every round: the next row selected before the closed one leaves, the new row selected in its first frame, hover never moving a row, the row never gone or drawn twice, gaps without flicker. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: - src/main/split/index.ts: both. Main's split.addMenu, and the split row's menu keeps finish-tabs' `at` (TB-14's overlay menu) beside main's Change Icon… item. - src/main/commandbar/search.ts: both. A Mini Window's bar offers no tabs, archive, Spaces, folders or actions (CB-23), and a blank window finds only its own tabs and no Spaces or folders (TB-17). - docs/feature-status.json: TB-14 finish-tabs' (yes), TB-15 main's (screen-share indicator). - FEATURES.md: regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow menus open (TB-14)
The split row's right-click menu opens in Orbit's overlay since TB-14, so
the test that muted one pane from it waited for a native popup that never
came ("Received: []" at media.spec.ts:1638). It now reads and chooses the
overlay's row menu through the tabs hooks, as the other row-menu tests do.
The menu and the per-pane mute are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…et go (TB-05, FL-26) Holding ⌃, Tab shows the five most recently used tabs of the window's sidebar in the middle of the window, in the Space's colours, over a page that is not dimmed: the tab shown first, the second highlighted. Each has its favicon or emoji, its title, its camera/microphone or screen-share indicator and its sound state (MD-11). Tab moves on, ⇧Tab and ⌃` move back, W closes the highlighted tab, and letting go of ⌃ switches to it. A quick tap goes straight to the previous tab and draws nothing. Esc, a click beside the list, any other action or the window losing focus ends it with no switch; a click on a tab switches to it. FL-26: the list is drawn in a frame at the second Tab, or after a 150 ms hold, and fades in over 90 ms with no slide. The page changes only on the release; main then shows the page and hides the overlay's layer in the same task. - The engine drops a view's key-ups after Orbit takes a key from it, until another key goes down there, so the release of ⌃ never came from the page. The panel now opens, undrawn, at the first Tab and has the keyboard; main runs the switcher's keys there without taking them, and the overlay takes them so they act once. Esc is handled in main, in step with the release. - The list is this window's sidebar tabs that it may show: a private or blank window's own, never a tab an unfinished import keeps out of sight (D65). - Activation moves from each Tab to the release: the keys lane's KS-06 tests follow the spec's release, and finish-tabs' FL-26 test replaces the feel lane's live-switch one in feel-rows. A page's ⌃ key-up no longer settles from the sidebar; main settles it. - tabs-more's ⌃Tab test now sends its keys to whatever has the keyboard, as the keyboard does (keys sent over CDP never reach main). docs/FEEL.md has FL-26's numbers. TB-05 and SP-16 are marked yes; the MD-11 and KS-06 notes lose their "no switcher list" parts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r>" in the command bar (FD-09); TB-13 and PR-09 checked - SP-11: any change of the Space order alone is recorded as "Reorder Spaces" on the sidebar's undo stack (src/main/spaces/order-undo.ts), so ⌘Z puts the Spaces back and ⌘⇧Z reorders them again; the Space on screen stays. A Space added since keeps its place after them; one deleted is left out. Without it: unit space-order-undo :36 and :52 fail. SP-11 stays partial: the Library overview's reorder is SP-13's. - FD-09: the command bar finds a folder by "Open" and its name as well as by its name alone (commandbar/rank.ts). Without it: unit commandbar :742 fails. - TB-13: an e2e test for the selection's menu (pin, unpin, move to a Space, a new pinned folder, a split of two to four). PR-09: an e2e test for renaming in Settings (Default too) showing at once in the Space menu, the badge and the switcher's tooltip. Both pass as built. - Statuses: TB-13, FD-09 and PR-09 yes; SP-11 partial with ⌘Z. FEATURES.md regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: - src/main/tabs/runtime.ts: both. Main's letGo hook (NV-24), and finish-tabs' recentSwitch with cancel and the onControlUp comment (TB-05). - src/shared/rpc.ts: both. finish-tabs' toasts view (SB-13, SP-02) and main's dialog, screen, print and swipe views. - tests/e2e/keys.spec.ts: both imports (FOCUS_IS_EDITABLE, switcherOf). - tests/unit/keymap-defaults.test.ts: the comment drops both built features (blank window; save page and full screen keys). - docs/feature-status.json: per key, the side that changed it; KS-19 is main's (yes, with full screen and the print dialog) plus finish-tabs' row menus (TB-14). - FEATURES.md: regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…profile's folder goes (PR-08); pages fix check 2 follow-ups
- TB-15: a Favorite playing sound shows two small notes rising over its tile in turn; muted, the
still dot; reduced motion, still notes. Without the reduced rule: feel-reduced :410 fails.
- PR-08: deleting a profile removes its partition folder (session.storagePath, only ever a folder
right inside userData/Partitions) at once, and again at the next launch, since its session may
write there until Orbit quits (src/main/spaces/erase.ts, orbit-erase.json). The confirmation
names logins too. Without the removal at delete: finish-tabs PR-08 :1794 and unit
profile-erase :21 fail; without the one at launch: finish-tabs :1800 fails.
- Pages follow-ups (fix check 2):
1. isActivation and NON_ACTIVATING_KEYS removed from tabs/runtime.ts: nothing calls them.
2. A pop-up window's own opens read its gestures from pages/gestures.ts, as a tab's do, so a
click in a frame from another site there can open a tab. Without it: pages-gestures :217
fails. The /opener fixture takes the window's name (`as`), since a frame naming the pop-up's
own `popup` loads the page in the pop-up.
3. Wording: a shortcut that goes to the page first counts as a gesture; one Orbit takes first
doesn't (⌘W unless set to go to websites first): gestures.ts, ARCHITECTURE.md, the unit
test's title and NV-24's note.
4. NV-24's note and ARCHITECTURE.md: ⌘W's 1 s limit on a busy page holds only while no DevTools
client is attached.
- Statuses: TB-15 and PR-08 yes; NV-09's note names the pop-up window's own opens.
FEATURES.md regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… open versions cross-fading (FD-07) Without an icon of its own, a folder shows a folder glyph filled in the Space's accent, its front a lighter tone. Closed, the front covers it; open, the front tips forward. The two fronts cross-fade as the folder opens or closes (FL-12, --motion-quick), a fade that reduced motion keeps. FEEL.md gets the FL-12 row for the icon (three runs). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Data and capture scripts only. docs/feature-status.json merged per feature: no feature changed on both sides; the 74 "feel": true marks are kept. FEATURES.md regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he battery saver make tabs sleep sooner (TB-16) - A tab in the background whose process keeps half a core busy for 30 s is frozen with the engine's page freezing (Page.setWebLifecycleState) and carries on when shown or navigating. Never one on screen, playing or recording, or a page that would warn before it goes, nor any tab sharing a process with one of those or with a page that isn't a tab. - Under 10 % of memory available (1 GB at most), tabs idle 5 minutes in the background sleep at once, whatever the timer. - Below 20 % on battery power, as the window's page reads it, the battery saver: a toast says so, tabs sleep after a quarter of the timer (5 minutes at least) and CPU-heavy ones freeze after 10 s. It lifts above 20 % or on charge. - Measured: a sleeping tab costs 1.0 MB over all processes, its sidebar row included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…command bar (SP-22) Next Space and Previous Space are found by those names too. SP-22's note now says what the bar offers; Manage Spaces / View Spaces wait for the Spaces overview (SP-13), so it stays partial. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w may reopen (chrome fix check B, F2) `tabs.recentlyClosed` returned every closed tab, private windows' too; its one caller (the archive's menus) filtered them itself. The list now goes through Reopen Closed Tab's own rule (`mayReopenIn`) for the calling window, so the next caller can't forget. Called with no window (the macOS app menu, made for every window), it holds what a normal window may reopen. Without the filter, unit tabs-recently-closed :31 and :48 fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the frame they show (AR-11, sign-off 2) Restore Data put a folder and its tabs back in one store update, but the sidebar drew the tabs at once (the folder's list mounts with it, without an enter animation) while the folder's own row grew in from nothing: for several frames the tabs showed in the pinned section with no folder above them, then shifted down under it. A folder that arrives open with its tabs (Restore Data, an undo, a new folder made from tabs) now draws its row whole from its first frame. An empty new folder still grows in. Test: finish-tabs.spec.ts "[AR-11][FD-01] a folder that comes back..." samples every pinned row in each frame. Without the fix it fails: 10 tab rows drawn without their folder row (frames 3-7, the folder row 1-19 px high at opacity 0). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…own (D66 (1)); restore undo/redo test (N1); IM-14 crash note (N3) Import fix check 3's follow-ups, given to this lane by D66. N2 / D66 (1): a tab an unfinished import made out of sight, that no section holds, isn't there for a window. `ops.hiddenByImport` says which; switching to it (`ops.activate`), a split view by either side (`ops.splitWith`), its own window (`ops.toNewWindow`), a copy (`tabs.duplicate`), its row menu (`tabs.contextMenu`), a close or delete to the Archive and a selection (`tabs.close`, `tabs.delete`, `tabs.setSelection`) refuse it. Moves, pins and Favorites already went nowhere for a tab no section holds. One the user placed anyway stays theirs (D65 (2)): its test turns the guard off with a test hook, standing for a route main doesn't guard. N1: import-unplaced's restore test also undoes and redoes the restore, each while an import adds: each stops the import, none of its pages go to the Archive and none of its tabs are left. N3: IM-14's note says a hidden tab the user placed survives a crash, as D65 (2) allows; it also names D66 (1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (D77 (4)) A close the pages lane hands to the engine first (a page with a user gesture and a leave listener) waited for the engine's answer, up to its 1 s limit on a busy page, before the next tab showed. The window now shows the next tab as the close starts (FL-09) and the page is hidden; a page that warns shows again to ask (the pages lane's reveal), and Cancel keeps it there. ⌘Z after the close still shows the tab where it showed (AR-09). A split pane keeps its split on screen, so it is left as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t Peek Each bullet is met by Peek (PK-01 to PK-04, PK-07 to PK-09, PK-12). New tests name PN-05: the decision for pinned tabs and Favorites with each setting, Shift-click under its own setting included, and a Favorite end to end (same site stays, another site previews, ⌘O makes a Today tab, previews off opens a Today tab, Shift-click still previews). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ight profile Each bullet in the base has a test: import into a chosen profile and several profiles at once (IM-06), the Library per profile (AR-03, AR-10, DL-10), and two new ones: Settings opened from a Work Space clears the Work profile's data (from another Space, Default's), and picture-in-picture Back to tab returns to a tab in another profile's Space. Passwords and site settings pages don't exist yet (ST-13, ST-20), so PR-10 stays partial. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rlay (TB-14)
Since TB-14 the split row's and the split Favorite tile's right-click menus
are Orbit's own, in the overlay, so the three finish-views tests that
recorded the system menu saw none ("received []"). They now read and choose
the row menu with the tabs hook (menuFor, chooseRowMenu), as the other specs
do since TB-14, and close it after finding an item that can't be chosen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t, with the reorder spring (SV-26) When two rows or more of one list become a split row there, the split row is drawn whole where the lowest of them was, that row goes at once, and the ones above fade as their room closes up into it with the reorder spring (TB-08). On separate, the first pane's row is drawn in the split row's place and the others slide out from under it with the same spring. A single row joining a pane still pending, and reduced motion, keep the motion they had. SV-26 is built: the haptic tick on macOS is left as a platform limit (Electron has no haptic API). Without it: the split row is 20 px of 32 in its first frame after the merge (finish-tabs.spec.ts:2205), and the first row 25 px on separate (:2229). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ff (N2) Since N2, main refuses to put a tab an unfinished import hasn't shown in a split view (D66 (1)), so import-file's quit test, which places one to check that the quit takes it back too (D65 (2)), got no split (gate r1: import-file.spec.ts:451, received []). It now turns the guard off for that step through the tabs test hook, as import-unplaced's D65 (2) test does. 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: 9f34dd0d-419a-4543-b7e4-9231a1e7e2d4) |
feature-status.json keeps this lane's built and note fields and takes all 41 of PR #29's "feel" marks; FEATURES.md is regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- D66 (1): split.create, split.addTab, split.openUrl (and its target) and mini.fromTab refuse a tab the import hasn't shown; one guard, hiddenByImport in import/unplaced.ts, serves them and TabOps. - TB-16: an open Peek's page counts as displayed, so it is never frozen or put to sleep. - TB-14/KS-19: a row menu gives the keyboard back from close() itself, before the chosen item runs, however the menu closes. - TB-09: a row passing over a page lists the link's types with empty values in dragenter/dragover; only the drop carries the address. - D87: one check (sidebarDropUrl) for every sidebar drop: a web address only; other text a search on the list or in a folder, nothing on the Favorites; any other scheme nothing. - TB-17: a blank Space whose window is missing at load goes, and its tabs go to the Archive (F7). D88: a blank window's new-window links open a new blank window of its profile. - Tests: tabs.recentlyClosed from a normal window and from no window; FL-26's budgets are the spec's frame; FD-07 takes the best of three. - FEEL.md: FL-22's two ended exceptions removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… ways together - TB-16, TB-14, TB-09, TB-02, NV-08, TB-17 and IM-14 notes say what the fix round changed (D87, D88, D66 (1)); no feel mark touched. - The row menu test records where the keyboard went for Enter, a click and a bound key, and judges them together, so a check without the fix shows all three. 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: 4d9d343e-485b-4439-beca-2c294252e670) |
- split.focusPane takes only a pane of a split, so a tab an unfinished import hasn't shown, which is in none, isn't shown by it (D66 (1)). N2's test sends it. - A split row's Change Icon… gives the sidebar the keyboard before the picker opens, as Rename… does, though the page had it (TB-14). - A dropped file that can't be read falls back to its drag's text, judged where it lands: on the Favorites, words open nothing (D87 (3)). - FEEL.md: FL-22's second exception, as its note says: with the sidebar shown, toasts still show at its foot. - Notes: IM-13, IM-14, TB-14. 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: 377bf970-3a3f-40a9-a562-fdbdca7f0bf4) |
siyabendoezdemir
added a commit
that referenced
this pull request
Oct 11, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
siyabendoezdemir
added a commit
that referenced
this pull request
Oct 11, 2026
Conflicts, each keeping both sides: - src/main/tabs/commands.ts imports: the Tweak menu items and keys, and registerBlankWindows / registerLinkDrop. - src/shared/rpc.ts imports: TweakCommands, TweakEvents and WindowMaterial. - docs/ARCHITECTURE.md: main's paragraph on scripts in pages (shortcuts that count as gestures, DevTools) with this lane's sentence on the Hide picker's world 1040 (D89). - FEATURES.md: regenerated (472 features). docs/feature-status.json merged without conflict: no row changed on both sides; 385 keys, no duplicates, 115 feel marks. The tab's menu is now finish-tabs' row menu in the overlay (TB-14), so the Tweak tests read and choose it through rowMenu / chooseRowMenu, and check the key hint the overlay draws beside "Tweak this Site…". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
siyabendoezdemir
added a commit
that referenced
this pull request
Oct 11, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The finish-tabs lane finishes tabs, Today, folders, Favorites, Spaces and profiles. Most of their gaps waited on chrome's sidebar, the Settings window and the Library, which are on
mainnow.It's built from
lanes/finish-tabs.md. Since then it has merged feel (PR #25), finish-views (PR #26), pages (PR #27), the sign-off marks (PR #28) and sign-offs 2 to 4 (PR #29);mainis9a30d3d. Againstmainit changes 118 files (+8538/−1000). The lane stopped near D30's 9k lines, and the review's two fix rounds added about 680 more.The builder's report is
reviews/lane-finish-tabs-report.mdin the project's context folder.What it builds
Orbit's own row menus (TB-14, P0). The tab, pinned, Favorite, folder, multi-selection and split row menus open in Orbit's overlay, in the Space's colours.
Spaces and toasts (P0):
TD-03: the per-profile archive timing, checked and tested. Archive periods apply at once.
Drops (TB-09, NV-08):
Blank windows (TB-17, which completes NV-10): KS-05's ⌃⌘N on macOS, and the command bar elsewhere.
The recent-tab switcher (TB-05, FL-26). With ⌃Tab, the list shows at the second Tab or after 150 ms, with MD-11's sound and recording indicators. It switches when ⌃ is let go.
Tab sleep (TB-16):
A sleeping tab costs 1.0 MB, against the spec's target of under 5 MB.
Also:
SV-26's sidebar part: two rows merge into one split row in place, and split back out, with the reorder spring.
AR-11 (sign-off 2's gap 3, D82): a folder that comes back with its tabs draws its row in the same frame as them.
Hardening:
Built:
Left (D30): SP-13, large-state saves (PERF.md's open item), and the P2s TB-19, TB-21, FV-09, TD-07, FD-11 and SP-25. TD-08 and SP-26 are out of scope (D41).
Decisions where the spec was unclear
http(s)address only, as the split drop already rules. Other text makes a search on the tab list or in a folder, and nothing on the Favorites. Every other scheme opens nothing.Partitions.Edits in other lanes' files
peek/index.ts: the undo key;miniwindow/index.ts:newBlank;split/index.ts: the menu hook;commandbar/: rank, search and sources;SplitRow.tsxandSplitFavoriteTile.tsx:menuAt.import/unplaced.ts, which now holdshiddenByImport, andrenderer/import/sidebar.ts;split/index.tsandminiwindow/index.ts: the D66 guard's calls only;nav/new-window.ts(D88),persist.ts, andshared/link-drop.ts,Sidebar.tsxanddrag.ts(D87).split/index.ts:split.focusPane's guard, and Change Icon… focusing the sidebar first;renderer/import/sidebar.tsandimport-file.spec.ts: where a dropped file's fallback text lands (F4);docs/FEEL.md: FL-22's line.pages/gestures.ts: a comment only;ARCHITECTURE.md: the wording, and the DevTools limit;pages-gestures.spec.ts: a test for a pop-up window's own opens;pages-support.ts:/openertakesas;pages-gestures.test.ts;context,index,material(new),menu,nav,persistandwindows, and the shell preload;useTabDrop,global.css, the theme and shortcuts;actions,blank,commands,private,rpc,state,themeandtoast;docs/FEEL.md.finish-views.spec.ts's three split-row menu tests read the overlay now (1cd4832);feel-rows.spec.ts's budgets are judged on the best of three rounds (e4ff9d7, D46);Merge gate (D42, local)
Gate r4 ran on this exact head,
dce14c5, on the VPS (Linux, under Xvfb), from 21:47 to 22:32 UTC. The lead ran it with the gate script:24fde53(fix round 1's head): 812 passed, 2 skipped, 0 failed (45.1 min).fb3297b(the head the review read): 805 passed, 2 skipped, 0 failed (44.4 min).dbca55d: 803 passed, 2 failed, 2 skipped.downloads.spec.ts:577(DL-03) passed when rerun alone. As a new row arrives, the old row is still fading out, and the test's strict locator finds both. The finish-downloads lane fixes that test.import-file.spec.ts:397was real: the N2 guard refused the test's own step that places a hidden import tab.fb3297bturns the guard off for that step through its test hook, asimport-unplaced.spec.tsalready does.Review
Review: REQUEST CHANGES, 5 must-fix (an independent reviewer,
reviews/lane-finish-tabs.md), each reproduced:split.create,split.addTab,split.openUrlandmini.fromTabstill showed a tab an unfinished import hadn't shown (D66 (1)).tabs.recentlyClosedcommand (D18).Fix round 1 (
860426c,24fde53;reviews/lane-finish-tabs-fix1-report.md) fixes all five. Each fix has a test that failed with it taken out. It also takes these follow-ups:Routed to other lanes:
A side effect of must-fix 2: an open Peek's page counts as on screen, so the media tray doesn't list it while the Peek shows.
Fix check: APPROVE WITH FIXES, 1 must-fix (
reviews/lane-finish-tabs-fixcheck.md). All five must-fixes held, and each round-1 test failed with its fix cut.split.focusPanestill showed a tab an unfinished import hadn't shown (D66 (1)). Every other command in its sweep ofsrc/mainrefuses one.src/main/media/.effectAllowedasnone. Left as is.Fix round 2 (
dce14c5;reviews/lane-finish-tabs-fix2-report.md):split.focusPaneaccepts only a pane of a split, and N2's test now sends it a hidden tab;Each code fix's test failed with its fix taken out.
Fix check 2: APPROVE, no must-fix (
reviews/lane-finish-tabs-fixcheck2.md).split.focusPanerefuses a hidden import tab, and any tab outside a split; every sender passes a pane, and Focus Pane and the pane drop still work.🤖 Generated with Claude Code
Note
Medium Risk
Wide changes to tab lifecycle, persistence, command bar, and import visibility affect core browsing flows, though the lane reports extensive unit/e2e coverage rather than security-critical paths.
Overview
This PR marks a large batch of finish-tabs work: the generated FEATURES.md checklist moves many P0/P1 items from partial to built, with matching behavior notes across sidebar, tabs, Spaces, profiles, and import.
Tabs and chrome: Sidebar rows get Orbit-themed overlay context menus (with keymap hints and keyboard handling). Blank windows use a profile-scoped hidden Space (not in the switcher), ⌃⌘N / command-bar entry, cascade + command bar on open, and archive-on-close persistence rules. The ⌃Tab recent-tab switcher shows a themed overlay list and switches on ⌃ release. Tab sleep adds engine page freezing for busy background tabs, plus low-memory and battery-saver paths. Drag-and-drop extends to split creation, dropping URLs into link-capable fields, and opening http(s) links dragged onto the sidebar.
Spaces, profiles, and polish: Neutral theme can show macOS vibrancy / Windows Mica via new
windowMaterial(). Theme picker edits support ⌘Z undo; toasts are Space-tinted and, when the sidebar is hidden, appear over the page card with optional Show actions (new tabs, new Spaces). Profile delete clears session data and removes partition folders (with a relaunch cleanup list). Space reorder is undoable; command bar gains “Open <folder>” matching and blank-window tab/Space filtering.Guards and docs: Unfinished import tabs are hidden from activation paths via
hiddenByImport. Small updates to page gesture rules (website-first shortcuts count as gestures; ⌘W busy-close behavior documented). docs/ARCHITECTURE.md and docs/FEEL.md reflect switcher and toast motion measurements.Reviewed by Cursor Bugbot for commit dce14c5. Bugbot is set up for automated code reviews on this repo. Configure here.