Skip to content

feat: enhance tab management with fuzzy search, multi-window grouping and i18n support#20

Open
jacky-ch93 wants to merge 39 commits into
zarazhangrui:mainfrom
jacky-ch93:main
Open

feat: enhance tab management with fuzzy search, multi-window grouping and i18n support#20
jacky-ch93 wants to merge 39 commits into
zarazhangrui:mainfrom
jacky-ch93:main

Conversation

@jacky-ch93

Copy link
Copy Markdown

New in this fork:

  • Fuzzy search — search bar at the top, filters tabs by title / URL / domain name in real time
  • Multi-window grouping — tabs split by window with section headers
  • Window actions — switch to another window or close all tabs in a window in one click
  • Staleness indicators — colored bar per group: green (active) / amber (cooling) / red (abandoned), with last-accessed time
  • i18n support — UI follows browser language automatically; supports Simplified Chinese, Traditional Chinese, Japanese, Korean, English
  • Dark mode — automatically follows the system color scheme, no manual toggle needed
  • Hover preview — hovering a tab shows a floating card with the full title, last accessed time, and tab count for that domain

jacky-ch93 and others added 30 commits April 16, 2026 09:36
Remove chrome_url_overrides so Tab Out no longer hijacks the new tab page.
Add chrome.action.onClicked listener to open Tab Out when the toolbar icon
is clicked; focuses existing Tab Out tab if one is already open.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Chrome extensions disallow inline event handlers by default CSP policy.
Remove the onerror attribute from config.local.js script tag — a missing
file fails silently and app.js already handles the absent config gracefully.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a search input below the header that filters domain cards and tab
chips in real-time. Uses character-sequence fuzzy matching against tab
titles and URLs. Matching the domain name shows all tabs in that group.
Overflow chips are expanded during search so all tabs are searchable.
Clear button (×) restores the full dashboard view.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When tabs span multiple Chrome windows, render a section header for each
window. Current window is labeled "This window"; others show "Window N"
with two action buttons: "Switch here" (focuses the window) and "Close
window" (closes all tabs in that window with animation). Single-window
users see no change. Domain groups spanning windows are split per-window
with unique stableIds to keep close-domain-tabs working correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use chrome.tabs lastAccessed timestamp to classify each domain group:
- active (< 30 min): green top bar
- cooling (30 min–4 hr): amber top bar
- abandoned (> 4 hr): red top bar

Also shows a colored "X ago" badge next to the tab count in each card
header. Duplicate-tab groups keep amber bar as before (higher priority).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Compute a global URL count map across all real tabs before rendering,
and pass it into renderDomainCard. Cards now show (Nx) badges and the
close-duplicates button even when copies of the same URL live in
different windows.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace openTabs.length with getRealTabs().length in all stat update
calls. Previously the count included chrome://, about:blank and
extension pages which are filtered out of the dashboard view.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Show the "Close window" button on all window section headers including
"This window", not just other windows.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Show "Tab Out · forked from Zara's original" with links pointing to
jacky-ch93's fork and the upstream zarazhangrui/tab-out repo.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds extension/i18n.js with translations for all UI strings across
five locales, with automatic browser language detection and en fallback.
Updates index.html to load i18n.js and adds element IDs for static text.
Replaces all hardcoded strings in app.js with t() calls.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- README.md: full Chinese rewrite with new features documented
  (fuzzy search, multi-window, staleness indicators, i18n, personal config)
- README_EN.md: new English version with same content
- Updated install links to jacky-ch93 fork
- Updated attribution to credit both Zara and jacky-h.c

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add docs/screenshot.svg (English mockup) and docs/screenshot_zh.svg (Chinese mockup)
  showing multi-window grouping, staleness indicators, and duplicate detection
- Add "Why Tab Out" / "为什么需要 Tab Out" pain points section to both READMEs
- Reference screenshots at top of both README files

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Store favIconUrl from chrome.tabs.query() in openTabs
- Add getTabFavicon() helper: prefers Chrome's cached favicon (most
  accurate), falls back to Google Favicon API for uncached sites
- Pass favIconUrl via data-tab-favicon attribute on save buttons
- Persist favIconUrl in deferred items so saved-for-later list shows
  correct icons without extra network requests
- renderDeferredItem uses stored favIconUrl before falling back to API

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Adapt Tab Out UI to follow browser's system color scheme using
prefers-color-scheme media query. Users with auto dark/light mode
schedules will now see Tab Out match their system theme.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Shows a floating card on 300ms hover with:
- Favicon + domain header
- Full title (no truncation)
- Last accessed time (via existing timeAgo())
- Same-domain tab count across all windows

Card is a fixed-position singleton; positions right of chip
with left-side fallback when near viewport edge. Supports
dark mode via existing CSS variable system.

Also update README and README_EN with the new feature.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Dashboard now listens to chrome.tabs events (onCreated, onRemoved,
onUpdated, onActivated, onMoved, onAttached, onDetached) and
re-renders automatically with a 500ms debounce when tabs change
elsewhere. A manual refresh button is added to the top-right of the
header with a spin animation on click.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add top shortcuts bar with website icons (Google, GitHub, Hugging Face by default)
- Left-click to open URL in new tab
- Right-click to open edit panel for add/delete/modify shortcuts
- Shortcuts stored in chrome.storage.local
- Adjust layout: move "Tab Management" section above search bar
- Remove header bottom border separator
- Update README and README_EN with new feature

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate existing shortcuts from chrome.storage.local to chrome.storage.sync
on first load to ensure users don't lose their shortcuts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When clicking a shortcut, after the page loads, automatically
fetch the tab's favicon and update the shortcut for persistent display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Long-press and drag shortcut icons to rearrange their positions.
The new order is saved to chrome.storage.sync and synced across devices.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dragging a shortcut now moves other shortcuts in real-time as you
drag across them, creating a smoother reordering experience.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
jacky-ch93 and others added 9 commits April 19, 2026 23:11
- Add shortcuts features: auto-favicon, drag-to-reorder, sync
- Update version for new release

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prefer focusing an existing shortcut tab before creating a new one, with prefix-aware matching that falls back to exact matches when multiple similar pages are open. Normalize trailing slashes so equivalent shortcut URLs resolve consistently.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Place the open tabs section inside the shared dashboard columns container so the saved-for-later panel renders beside it again. Update the left column flex sizing so the layout stays stable while preserving the existing narrow-screen stack behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Keep the first successfully captured shortcut favicon instead of overwriting it with the remote fallback on later edits. Continue allowing future opens to refresh the stored icon when a newer favicon is available.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevent drag reordering from stacking listeners or accidentally opening shortcuts, improve the shortcut form defaults, and reuse the favicon guard when refreshing shortcut icons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update the English and Chinese SVG mockups so they reflect the current Tab Out UI, including shortcuts, the right-side saved-for-later panel, and the corrected section ordering around search.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the midpoint-incompatible hit-testing and HTML5 drag handler
with Pointer Events + transform-based following and FLIP animation on
siblings, so reordering feels responsive and lands where the cursor is.

Co-Authored-By: Claude Opus 4.6 <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