Skip to content

v4.1.3: favorite collections, quick tab switcher refinements - #110

Open
gilgold wants to merge 33 commits into
mainfrom
feature/v4.1.3
Open

v4.1.3: favorite collections, quick tab switcher refinements#110
gilgold wants to merge 33 commits into
mainfrom
feature/v4.1.3

Conversation

@gilgold

@gilgold gilgold commented Jun 11, 2026

Copy link
Copy Markdown
Owner

Summary

Favorite collections (new feature)

  • Star toggle on every collection surface: popup list rows, popup grid tiles, full-page cards (hover rail), the shared "More" menu, and the full-page right-click menu
  • New fields isFavorite / favoriteOrder persisted in both collection records and the collections_index (no storage version bump; missing fields read as not-favorite; syncs to Drive automatically)
  • Full page: dedicated "Favorites" sidebar view (star icon, live count) with drag-and-drop reordering that persists favoriteOrder via a single atomic batch write
  • Popup: star filter in the toolbar (next to "Opened") that narrows the list to favorites, wired through the existing filters pipeline and clear-all button
  • Design spec and implementation plans in docs/superpowers/

Quick tab switcher (carried on this branch)

  • TabSwitcher palette with search, context menu, preview pane, MRU sort, and Ctrl/Cmd+Shift+S shortcut
  • Screenshot thumbnails and the optional <all_urls> permission subsequently removed (feat!), shared favicon fallback constant

Test Plan

  • yarn lint clean
  • yarn test — 134 suites, 1011 tests passing (22+ new tests for favorites storage, helpers, toggles, sections, filter, sidebar)
  • yarn prod compiles successfully
  • Manual smoke: star a collection in the popup → appears under the full-page Favorites sidebar view; reorder favorites by drag and confirm order persists; toggle the popup star filter; un-star from inside the Favorites view

🤖 Generated with Claude Code

gilgold and others added 30 commits June 10, 2026 22:30
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lanning

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ntWindows.js

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eview pane

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ect to open

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… and full page

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s> permission

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Also bumps the context-menu z-index selector specificity to (0,3,0) — the
cursor-positioned menu's inline position style is matched by static/index.css
drawer catch-alls at (0,2,1) !important, discovered via the e2e run.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… on grant, capture stagger, current-tab close semantics

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nstant

- min-height: 0 on .tab-switcher-main: in the popup's column layout flexbox's
  default min-height:auto let the list blow past the card, so scrollIntoView
  scrolled the overflow:hidden card itself, dragging the search row out of
  view (fullpage's row layout constrained height via the cross axis, hence
  the popup/fullpage difference despite shared code)
- opt the switcher out of static/index.css's global 200ms background-color
  transition that made selection movement fade sluggishly
- memoize TabSwitcherRow with stable callbacks so an arrow press re-renders
  2 rows instead of 50 (each carrying a ContextMenu), and drop the rAF
  deferral on scrollIntoView (a frame of avoidable lag)
- e2e regression: 25-tab popup, arrow through list, assert the results pane
  scrolls (not the card) and the input stays put, visible, and focused;
  verified to fail with the min-height fix reverted

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sion grant

Granting <all_urls> produced no thumbnails: the only capture trigger after a
grant was the popup sending captureAllWindows AFTER awaiting
permissions.request() — but the native permission dialog steals focus and (on
macOS) closes the popup before that await resumes, so the prime was lost.
Grants made from chrome://extensions never primed at all. The capture
pipeline itself was verified healthy in the real service worker
(OffscreenCanvas/FileReader/downscale all work — probed via crxbox).

- background now listens to permissions.onAdded and primes captureAllWindows
  itself, regardless of where the grant came from
- the switcher also requests a capture refresh on open (no-op without the
  permission), keeping previews fresh and self-healing an already-granted but
  never-primed cache

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rls> permission

captureVisibleTab can only photograph visible tabs, so preview coverage was
too sparse to justify the permission — most rows fell back to the card
anyway. The preview pane now always renders the details card (favicon,
title, URL, window label), synchronously from already-loaded data.

Removed: chrome/thumbnail-capture.js and its background wiring,
optional_host_permissions, the permission-request flow and storage.session
reads in TabPreviewPane, and their tests. The e2e preview test now asserts
the details card.

Rides along: FALLBACK_FAVICON in sharedConstants.js (from the in-progress
favicon consolidation) since TabSwitcher.js now imports it from there.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces eight hardcoded './images/favicon-fallback.png' literals across
TabRow, MoveToCollectionModal, and the fullpage panels with the
FALLBACK_FAVICON constant in sharedConstants (added with the tab switcher),
and drops the now-redundant re-export from tabSwitcherUtils.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ds and index

Adds isFavorite/favoriteOrder to both the full record and the index entry in
saveSingleCollection and batchUpdateCollections, with fallback-to-existing-index
semantics so stale in-memory objects cannot silently un-favorite a collection.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtial saves

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Renders favorited collections (sorted by favoriteOrder) in a dedicated
CollapsableSection above the main list, with its own DndContext so drag
sessions never interact with the main list. Reorder persists via a single
batch updateRemoteData call. Section is hidden during search.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Renders a collapsible, drag-to-reorder Favorites section at the top of the grouped All Collections grid in the full-page view, with collapse state persisted to local storage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…S variable

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… filter

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
gilgold and others added 3 commits June 11, 2026 17:15
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The full-page @media(max-width:900px) .fp-toolbar rules (flex-wrap,
centered rows, leading collapse, hidden pill labels) leaked into the
670px popup, which always matches that breakpoint via the shared
class names. The wrap stayed latent until the favorites star pill
widened the active-filter state past the toolbar width, pushing the
last button group onto a second row that overlapped the list under
the fixed-position wrapper.

Scope the responsive block to html.fullpage-mode and give the popup
its own compact single-row rules (never wraps, icon-only pills,
leading collapsed until a filter is active). Covered by a crxbox e2e
regression spec.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
FPFavoritesSection wrapped its cards in a <section> of its own, which
became a single grid item inside .fp-content-grid — every favorite card
got squeezed into one narrow column. The cards already reuse
FPCollectionCard; only the container differed. Drop the wrapper so the
sortable cards are direct children of the shared .fp-content-grid and
inherit the exact same grid/list layout as All Collections. Covered by
a crxbox e2e spec asserting card-width and row-flow parity between the
two views.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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