Skip to content

fix(web): shed session toolbar icons by keep rank instead of overlapping - #2040

Open
heavygee wants to merge 16 commits into
tiann:mainfrom
heavygee:fix/2039-session-toolbar-crowd
Open

heavygee wants to merge 16 commits into
tiann:mainfrom
heavygee:fix/2039-session-toolbar-crowd

Conversation

@heavygee

@heavygee heavygee commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Fixes #2039. Narrow session-list headers were painting the search clear over neighboring controls, then later fixes either wrapped onto a second row or hid every icon behind More and left an empty gap.

This keeps one nowrap row. Controls that do not fit move into a More menu one priority band at a time, not all at once. Rank is which control survives, not its left-to-right position.

Keep order (1 stays the longest)

Search is not in this list. It never moves into More.

Keep Control Why
4 New Used constantly
5 Unread lens Everyday filter
6 Settings Fine to live in More
7 Mark all read Bulk clear from #1773. Still there, behind the filters, not beside New
8 Browse Workspace browser. Sheds before Settings

The machine filter is a separate row (desktop chips / the mobile machine menu). It is not part of this ladder.

More is the same width as one icon, so the row sheds at least two icons before More saves any space. If everything fits, there is no More and no gap.

Test plan

  • bun run test:web -- src/components/sessionToolbarShed.test.ts src/components/SessionList.directory-action.test.tsx src/components/SessionList.machine-filter.test.tsx
  • ~320–400px sidebar, empty search: New and the unread lens stay on the row
  • Same width with a query chip: clear does not overlap the icons that remain
  • Wide sidebar: Settings and Browse stay inline when they fit

Collapsed search used min-w-0 and crushed under shrink-0 icons, so clear
painted over filter/BlockedJumpPill on narrow widths. Keep search chrome
shrink-0 and wrap the header actions group instead (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 16, 2026
Wrap session header actions so search clear cannot paint over filter /
BlockedJumpPill on narrow widths. Upstream PR tiann#2040.

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: initial

Requirement — Pass

Preventing overlapping session-toolbar hit targets on narrow panels is a justified usability fix. Existing fixed-size controls can overflow the base layout when search shrinks.

Evidence

  • Issue #2039 describes width-dependent overlap and requires usable controls while retaining large clear targets.
  • Base web/src/components/SessionList.tsx:862 and :1955 combine a shrinkable search group with a non-wrapping toolbar.

Approach — Pass

Preserving search-control widths and allowing trailing actions to wrap is a viable, localized solution. The action group's flex sizing needs correction within this approach.

Evidence

  • Head web/src/components/SessionList.tsx:870 prevents search shrinking; :1964 enables wrapping and :1982 groups trailing actions.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and relevant callers. One flex-sizing defect can retain overlapping controls at supported narrow sidebar widths. Browser rendering was not executed.

  • [Minor] Give the action group a content-based width so it can wrap — web/src/components/SessionList.tsx:1984

Testing

Not run (automation; PR code execution is prohibited).

  • The PR reports 34 passing focused web tests; this was not independently verified because executing PR code is prohibited.
  • The added regression test checks classes and DOM structure without headerActions or a machine filter; it cannot detect the nested action-group overflow.
  • The PR's narrow- and wide-layout visual checks remain unchecked. BlockedJumpPill has no implementation in the fixed-head web source.
  • Observed CI test, integration, and windows-codex-mcp checks were still in progress.

HAPI Bot

Comment thread web/src/components/SessionList.tsx Outdated
@heavygee

Copy link
Copy Markdown
Collaborator Author

Proof (320×800)

Collapsed search with query "me" at 360px viewport. Measured bounding boxes: clear does not overlap filter or BlockedJumpPill. Header flex-wrap + search shrink-0 (kill criterion from #2039).

Soup dogfood: live on :3006 via driver/2039-toolbar-crowd cherry-pick + hapi-driver-build-web (tip 7e907c715). Hard-reload to see it.

#2039 320px wrap — no clear/filter/pill overlap

asset: heavygee/hapi@pr-attach-proof-2040/proof-2026-10-16T10-54-18-proof-2039-toolbar-320.png · delete release after merge if desired

flex-1 min-w-0 kept the action group beside a long search chip in a 280px
sidebar, so Browse/Settings overflowed onto the calendar. Use w-max shrink-0
and keep the router header-action cluster from shrinking (tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping session-toolbar controls at narrow widths is a justified usability fix that preserves the required large clear targets.

Evidence

  • Issue #2039 reports width-dependent overlap and requires usable search, clear, and filter controls.
  • Base web/src/components/SessionList.tsx:867 permits search shrinking while :1955 places controls in a non-wrapping row.

Approach — Pass

Preserving search width and wrapping a content-sized action group addresses the crowding locally. The follow-up corrects the previously reported zero-basis action-group sizing.

Evidence

  • Head web/src/components/SessionList.tsx:870 prevents search shrinking; :1965 enables wrapping; :1985 gives actions content-based width and right alignment.
  • Head web/src/router.tsx:251 prevents the Browse/Settings/New cluster from shrinking.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and surrounding layout. No actionable defects found; the previous finding is addressed. Browser rendering remains unverified.

No reportable code issues found.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • The PR reports 34 passing focused web tests; this was not independently verified.
  • The regression test asserts classes and structure, but omits router-provided actions and machine filtering and does not measure overlap.
  • The reported visual proof uses a separate cherry-picked deployment; it does not establish rendering at the fixed head. BlockedJumpPill has no implementation in the reviewed source.
  • At inspection, fixed-head test, integration, and windows-codex-mcp CI checks were still in progress.

HAPI Bot

max-w-full plus inner flex-wrap let the action group split, so some icons
stayed beside search and the rest dropped underneath. The group is nowrap
and content-sized, so a tight row moves every icon together.

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 16, 2026
Inner flex-wrap split the icon row under search. Match upstream
tiann#2040 fc1a2dc: nowrap content-sized action group.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping session-toolbar controls at narrow widths is a justified usability fix that preserves large clear targets.

Evidence

  • Issue #2039 reports width-dependent overlap and requires usable search, clear, and filter controls at 320px.
  • Base web/src/components/SessionList.tsx:867 permits collapsed-search shrinking; :1955 places controls in a non-wrapping row.

Approach — Pass

Preserving search width and wrapping trailing actions as one content-sized group addresses toolbar crowding through localized layout changes.

Evidence

  • Head web/src/components/SessionList.tsx:870 prevents search shrinking; :1964 enables outer wrapping; :1984 keeps actions together and right-aligned.
  • Head web/src/router.tsx:251 prevents the production Browse/Settings/New group from shrinking.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and surrounding layout. No actionable defects found. Browser rendering remains unverified.

No reportable code issues found.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • The PR description reports 34 passing focused web tests; this was not independently verified.
  • The added regression test checks classes and structure but omits production header actions and machine filtering and does not measure overlap. Browser coverage should verify narrow and wide layouts with those controls present.
  • The reported visual proof uses a separate cherry-picked deployment, so it does not verify this fixed head. BlockedJumpPill has no implementation in the reviewed source.
  • At inspection, fixed-head test, integration, and windows-codex-mcp CI checks were still in progress.

HAPI Bot

Quest was burning a full toolbar line when the icon slab did not fit
beside collapsed search. Keep one nowrap row; hide browse/settings (and
similar headerActions) below a container-query width, with a higher bar
when the query chip is present (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Match upstream tiann#2040 a827924 for soup tip-forward.

Co-authored-by: Cursor <cursoragent@cursor.com>
@heavygee

Copy link
Copy Markdown
Collaborator Author

Follow-up: shed, don't wrap

Operator Quest dogfood: wrapping the whole icon slab under collapsed search burned a full toolbar line (worse than hiding controls).

a827924da keeps a single flex-nowrap @container row. Primary stays (filter / mark-all / unread / new / blocked-on-soup). headerActions (browse/settings/…) live in session-list-header-secondary and only return via container query (@[26rem] / @[32rem] when a query chip is present).

Hard-reload :3006 soup tip to verify.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing toolbar overlap at narrow widths while preserving large search-clear targets is a justified usability fix.

Evidence

  • Issue #2039 requires usable, non-overlapping search, clear, and filter controls at 320px.
  • Base web/src/components/SessionList.tsx:867 allows collapsed-search shrinking; :1955 places neighboring controls in a non-wrapping row.

Approach — Needs changes

The current approach removes navigation to make space. At 320–390px widths, Settings disappears even without a search query, leaving no application navigation to settings. Responsive prioritization should preserve access to displaced actions.

Evidence

  • Head web/src/components/SessionList.tsx:2046–2047 hides all headerActions below 26rem, increasing the threshold to 32rem when a query exists.
  • Head web/src/router.tsx:232–252 places Browse and the only application navigation button to /settings inside headerActions; no overflow menu or alternate settings entry is provided.
  • Issue #2039 proposes priority overflow for secondary icons so toolbar actions remain usable.

Suggestions

  • Move displaced actions into an accessible overflow menu at narrow widths, or retain wrapping. Preserve Settings access without requiring users to resize the viewport or enter a URL.

Code — Not reviewed

Code review stopped because the navigation-hiding approach needs adjustment.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: windows-codex-mcp passed; test failed at bun typecheck, with subsequent test steps skipped; integration remained in progress. Failure logs were unavailable while the workflow was running.
  • The PR description reports 34 passing focused tests. The supplied visual proof describes a separate cherry-picked deployment using the earlier wrapping approach and does not validate this fixed head.

HAPI Bot

CI failed because optional chaining left headerRow possibly null when
reading className. Use getByTestId instead.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping toolbar controls on narrow panels while retaining large search-clear targets is a justified usability fix.

Evidence

  • Issue #2039 describes overlap at 320–390px and requires usable, non-overlapping search-clear and filter controls.
  • Base web/src/components/SessionList.tsx:867 permits collapsed-search shrinking; :1955 places neighboring controls in a single row without an overflow strategy.

Approach — Needs changes

The approach permanently removes Settings navigation at the widths this fix targets. Keeping one toolbar row is reasonable, but displaced actions need an accessible alternative.

Evidence

  • Head web/src/components/SessionList.tsx:2046–2047 hides headerActions below 26rem, or 32rem with a query, without providing an overflow menu.
  • Head web/src/router.tsx:232–252 places the application's only Settings entry inside headerActions. At 320–390px it disappears even with no search query.
  • Issue #2039 proposes priority overflow for secondary controls. The follow-up changes only a test selector; the navigation-hiding mechanism remains unchanged.

Suggestions

  • Move displaced actions into an accessible overflow menu, or retain wrapping. Preserve Settings access without requiring users to resize the panel or enter a URL.

Code — Not reviewed

Code review stopped because the approach still removes Settings access on narrow panels.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head checks test, integration, and windows-codex-mcp were all in progress when inspected.
  • The PR description reports 34 passing focused tests; narrow-width and wide-layout visual checks remain unchecked.
  • The supplied visual proof describes an earlier wrapping implementation on a separate cherry-picked deployment, so it does not validate the current hiding approach.

HAPI Bot

Hiding headerActions on narrow headers removed Settings with no
alternative. Keep one toolbar row, but surface secondary actions in an
accessible ⋯ popover below the container-query threshold (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
@heavygee

Copy link
Copy Markdown
Collaborator Author

Follow-up: overflow ⋯ for shed secondary

Agreed that hiding Settings with no alternative was wrong.

051cbe539 keeps the single nowrap toolbar row, but secondary headerActions now also mount in an accessible More (⋯) popover that is visible only below the container-query threshold (@[26rem] / @[32rem] with a query chip). Wide headers still show browse/settings inline.

heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Match upstream tiann#2040 051cbe5 for soup tip-forward.

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping toolbar controls on narrow panels while preserving large search-clear targets is a justified usability fix.

Evidence

  • Issue #2039 requires usable, non-overlapping controls at 320–390px widths.
  • Base web/src/components/SessionList.tsx:867 allows collapsed-search shrinking; :1955 provides no wrapping or overflow strategy.

Approach — Pass

Protecting search controls and moving secondary actions into a responsive overflow popover is a viable direction. The current head addresses the previous review's concern about removing Settings access.

Evidence

  • Head web/src/components/SessionList.tsx:54–78 implements the More popover; :2089–2112 switches secondary actions between inline and overflow presentation.
  • Head web/src/router.tsx:231–252 keeps New primary and supplies Browse/Settings as secondary actions.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. One remaining sizing defect pushes controls outside narrow viewports. Assessment is based on source inspection without executing PR code.

  • [Major] Non-shrinking groups still push toolbar actions offscreen — web/src/components/SessionList.tsx:920

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: integration passed; test and windows-codex-mcp were still running when inspected.
  • The description reports 34 passing focused tests. Added coverage checks classes and popover mounting, but does not measure narrow-width layout and omits the populated primary-action combination.
  • The supplied visual proof covers an earlier wrapping implementation, not the current fixed head; the description's visual checks remain unchecked.

HAPI Bot

Comment thread web/src/components/SessionList.tsx Outdated
At ~320px the collapsed chip plus unread/filter/New still overflowed past
More/Settings. When searchQuery is non-empty, put primary controls in the
same overflow menu so the row is [chip][⋯] (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Soup carries BlockedJumpPill / filter / kitchen chrome on the same row.
Mirror upstream tiann#2040: with a collapsed query, put primaries in More so
[chip][⋯] fits ~320px (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Crowded-query More fold for tiann#2039/tiann#2040; re-thin after dogfood bump.

Co-authored-by: Cursor <cursoragent@cursor.com>
ml-auto shoved the action slab to the right edge and left a Quest-width
gap between the search icon and BlockedJumpPill (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Drop ml-auto so BlockedJumpPill sits next to the search icon on Quest
(tiann#2039 / tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping session-toolbar controls on narrow screens while preserving large clear targets is a justified usability fix.

Evidence

  • Issue #2039 specifies usable, non-overlapping controls at 320–390px widths.
  • Base web/src/components/SessionList.tsx:862 allows collapsed-search shrinking, while :1955 provides no toolbar overflow strategy.

Approach — Pass

Protecting search chrome and moving controls into an overflow popover is viable. The remaining problems can be fixed within this approach.

Evidence

  • Head web/src/components/SessionList.tsx:54–78 adds the More popover; :920 prevents collapsed-search shrinking; :2100–2123 selects overflow content.
  • Head web/src/router.tsx:221–253 preserves navigation handlers for New, Browse, and Settings.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. Two UI regressions remain; conclusions are based on source inspection without executing PR code.

  • [Major] Adapt the machine dropdown positioning inside More — web/src/components/SessionList.tsx:2103
  • [Minor] Condition primary-action overflow on available width — web/src/components/SessionList.tsx:2043

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: integration and windows-codex-mcp passed; test was still running when inspected.
  • The description reports 34 passing focused tests. Added coverage checks classes and popover contents, but does not measure responsive layout or exercise the machine dropdown inside More.
  • The supplied visual evidence covers an earlier wrapping implementation; current-head narrow and wide visual checks remain unverified.

HAPI Bot

Comment thread web/src/components/SessionList.tsx Outdated
Comment thread web/src/components/SessionList.tsx Outdated
MachineFilterMenu near the left edge (inside More) got a tiny right-only
maxWidth. Clamp to the wider horizontal pocket and left-align when that
side wins. Fold primaries into More only when a query chip is present and
the header is under 32rem (tiann#2039 / tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Match upstream tiann#2040: only fold primaries into More when the header is
under 32rem, so wide dogfood keeps inline actions while searching.

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping toolbar controls on narrow screens while preserving large clear targets is a justified usability fix.

Evidence

  • Issue #2039 requests non-overlapping, usable controls at 320–390px widths.
  • Base web/src/components/SessionList.tsx:862 permits collapsed-search shrinking; :1955 provides no toolbar overflow strategy.

Approach — Pass

Protecting search chrome and moving actions into an accessible overflow popover is viable. The latest changes address both previous findings.

Evidence

  • Head web/src/components/SessionList.tsx:2067–2069 conditions primary-action overflow on header width.
  • Head web/src/components/MachineFilterBar.tsx:177–195 adapts dropdown width and opening direction to available horizontal space.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. One responsive-layout defect remains; conclusions are based on source inspection.

  • [Minor] Allow primary-action overflow when the query is empty — web/src/components/SessionList.tsx:2068

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when inspected.
  • The description reports 34 passing focused tests. Added coverage checks overflow contents, a mocked wide header, and dropdown positioning helpers; it does not measure browser layout at larger font scales.
  • The supplied visual proof covers an earlier wrapping implementation; current-head narrow and wide visual behavior remains unverified.

HAPI Bot

Comment thread web/src/components/SessionList.tsx Outdated
Empty query still forced toolbarCrowded=false, so at 320px / 130% font
with machines+unread the More control went offscreen. Crowd from header
width in both query states (tiann#2039 / tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Match upstream da846ec: empty-query narrow headers also fold primaries
into More so Settings stays reachable at 320px / 130% font (tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping session-toolbar controls on narrow screens while preserving usable clear targets is a justified usability fix.

Evidence

  • Issue #2039 describes overlapping search, clear, and filter controls at 320–390px widths.
  • Base web/src/components/SessionList.tsx:862 allows collapsed-search shrinking while its clear and calendar controls retain minimum sizes; the header at :1955 has no overflow strategy.

Approach — Pass

Protecting search chrome and moving actions into an accessible overflow popover addresses crowding. The latest commit also handles narrow headers with an empty query.

Evidence

  • Head web/src/components/SessionList.tsx:920 prevents collapsed-search shrinking; :2068–2073 selects overflow using measured header width.
  • Head web/src/components/MachineFilterBar.tsx:177–195 adapts dropdown width and alignment to available horizontal space.

Suggestions

  • Update the PR description and visual test plan to describe the final single-row overflow behavior; they still describe wrapping and right-aligned actions.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and surrounding code. No actionable defects identified. Browser layout remains unverified.

No reportable code issues found.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when inspected.
  • Added tests cover overflow contents, mocked narrow and wide header widths, and machine-menu positioning helpers. They do not measure browser geometry or apply actual font scaling.
  • The supplied visual proof covers an earlier wrapping implementation; current-head narrow and wide layouts and nested machine-menu interaction lack browser verification.

HAPI Bot

A flat 32rem crowd gate folded every primary into More on typical Quest
sidebars (~400px), leaving [search][⋯] and a desert of empty space. Empty
query now crowds only below ~22rem (still covers 320px/130% font); query
chip keeps the higher 32rem bar (tiann#2039 / tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>
heavygee added a commit to heavygee/hapi that referenced this pull request Oct 17, 2026
Match upstream: empty-query crowd only below ~22rem so Quest sidebars
keep blocked/New inline; query chip keeps 32rem (tiann#2039 / tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>
Left-packing every action left a dead zone after New while Settings hid
in More. Primaries stay beside search; secondary/More get ml-auto on a
flex-1 actions row so the chrome reads [search][primaries] … [⋯]
(tiann#2039 / tiann#2040).

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing overlapping session-toolbar hit targets on narrow screens while preserving large clear controls is a justified usability fix.

Evidence

  • Issue #2039 describes search-clear and filter overlap at 320–390px widths and requests accessible overflow actions.
  • Base web/src/components/SessionList.tsx:867 permits collapsed-search shrinking, while :903 preserves a non-shrinking clear target; :1955 provides no toolbar overflow strategy.

Approach — Pass

Protecting search chrome and moving crowded actions into a More popover is viable. The current width-dependent behavior preserves inline controls where space permits.

Evidence

  • Head web/src/components/SessionList.tsx:920 prevents collapsed-search shrinking; :2067 selects when primary actions enter overflow, and :2153 controls secondary-action visibility.
  • Head web/src/components/MachineFilterBar.tsx:177 and :189 adapt the nested machine menu's width and alignment to available viewport space.

Suggestions

  • Update the PR title, description, and visual test plan to describe the final single-row overflow behavior; they still describe wrapping.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and relevant surrounding code. No actionable defects identified. Actual browser layout remains unverified.

No reportable code issues found.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when last inspected.
  • Added tests cover mocked narrow/wide header widths, overflow contents, and machine-menu positioning helpers. They do not measure browser geometry or apply actual font scaling.
  • The supplied visual proof covers an earlier wrapping implementation. Current-head narrow/wide layouts, 130% font scaling, and nested machine-menu interaction still lack browser verification.

HAPI Bot

A single width gate either hid the whole row or left a hole before More.
Drop the lowest-priority controls first (browse, mark-all, settings) and
keep search, new, and the unread lens on the row while they fit (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>
@heavygee heavygee changed the title fix(web): session toolbar wraps instead of overlapping search clear fix(web): shed session toolbar icons by keep rank instead of overlapping Oct 17, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing crowded session-toolbar controls while retaining large search-clear targets and access to all actions is a justified usability fix.

Evidence

  • Issue #2039 reports overlapping controls at 320–390px widths and requests priority overflow.
  • Base web/src/components/SessionList.tsx:1955 renders a single toolbar row without an overflow strategy.

Approach — Pass

Keeping search inline and moving actions into More by survival rank is viable. The width-accounting defect below can be fixed within this approach.

Evidence

  • Head web/src/components/sessionToolbarShed.ts:52 selects survivors by keep rank while preserving display order.
  • Head web/src/components/SessionList.tsx:1935 observes header width, and :2184 renders overflow actions in a popover.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. One width-accounting defect leaves supported narrow layouts overflowing; browser rendering was not executed.

  • [Major] Account for all rendered controls before deciding what fits — web/src/components/sessionToolbarShed.ts:36

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test was still in progress when inspected.
  • Added tests cover ranking and mocked header widths, but do not measure browser geometry. The 130% case only writes localStorage; it does not apply font scaling. The supplied visual proof depicts an earlier wrapping implementation.

HAPI Bot

Comment thread web/src/components/sessionToolbarShed.ts Outdated
Active query reserved 200px for a max-w-[9rem] chip and collapsed the
row to search+More. Measure the actions flex box and each control;
keep daily icons until width is known (tiann#2039).

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing crowded toolbar controls on narrow screens while keeping search inline and all actions accessible is a justified usability fix.

Evidence

  • Issue #2039 reports overlapping search-clear and neighboring controls at phone widths and requests priority overflow.
  • Base web/src/components/SessionList.tsx:1955 renders the toolbar without an overflow strategy; the snapshot description specifies one row with ranked shedding.

Approach — Pass

Measuring available space and moving lower-priority actions into More is viable. The remaining defects can be fixed within this approach.

Evidence

  • Head web/src/components/sessionToolbarShed.ts:59 selects survivors by keep rank while preserving display order.
  • Head web/src/components/SessionList.tsx:1938 observes available width, and :2223 renders shed actions in a popover.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. Three layout defects remain; browser rendering was not executed.

  • [Major] Reattach the width observer when search collapses — web/src/components/SessionList.tsx:1954
  • [Major] Subtract the machine menu from the slot budget — web/src/components/SessionList.tsx:2103
  • [Minor] Measure More and gaps at the active font scale — web/src/components/sessionToolbarShed.ts:51

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when last inspected.
  • Added tests cover ranking and mocked widths, but not browser geometry or observer reattachment. The 130% test only writes localStorage and does not apply font scaling.

HAPI Bot

Comment thread web/src/components/SessionList.tsx Outdated
Comment thread web/src/components/SessionList.tsx
Comment thread web/src/components/sessionToolbarShed.ts Outdated
The actions box unmounts while search is expanded, so a one-shot observer
left the next layout on a stale width. Fit math now reattaches on the
new node, subtracts a visible machine menu, and uses the measured More
width and column gap.

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing narrow-toolbar overlap while keeping search inline and all actions accessible is a justified usability fix.

Evidence

  • Issue #2039 reports overlapping search-clear and neighboring controls at phone widths.
  • The snapshot description specifies one nowrap row with ranked overflow; base web/src/components/SessionList.tsx:1955 has no overflow mechanism.

Approach — Pass

Measuring available space and shedding lower-priority actions into More is viable. The remaining layout defect can be fixed within this approach.

Evidence

  • web/src/components/SessionList.tsx:1366 reattaches the width observer, and :1965 measures control widths and gaps.
  • web/src/components/sessionToolbarShed.ts:73 selects survivors by keep rank while preserving display order.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and reassessed the previous findings. Their targeted fixes are present, but one narrow-layout failure remains. Browser rendering was not executed.

  • [Major] Reserve room for More before preventing search from shrinking — web/src/components/SessionList.tsx:936

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration passed; test and windows-codex-mcp were still in progress when last inspected.
  • Added tests cover ranking, measured-metric inputs, and observer reattachment. They do not verify actual narrow-layout geometry; the 130% component test only writes localStorage without applying font scaling.

HAPI Bot

Comment thread web/src/components/SessionList.tsx Outdated
At 320px and 130% type a long chip plus calendar left too little room
for the machine menu and More. An active query now uses min-w-0 on
search and shrink-0 on actions so only the chip text truncates.

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review mode: follow-up after new commits

Requirement — Pass

Preventing narrow-toolbar overlap while retaining search, large clear targets, and access to every action is a justified usability fix.

Evidence

  • Issue #2039 describes overlapping controls at 320–390px and requests priority overflow.
  • Base web/src/components/SessionList.tsx:1955 renders the toolbar without an overflow mechanism.

Approach — Pass

Measuring available space and moving lower-priority controls into More is viable. The remaining measurement defect can be fixed within this approach.

Evidence

  • web/src/components/sessionToolbarShed.ts:73 selects survivors by keep rank while preserving display order.
  • web/src/components/SessionList.tsx:2223 applies measured widths and renders overflowed controls in More.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff and reassessed the previous finding. The latest adjustment introduces a measurement feedback problem that can recreate overlapping controls. Browser rendering was not executed.

  • [Major] Constrain the action budget independently of its current contents — web/src/components/SessionList.tsx:2124

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when last inspected.
  • The new narrow-query regression supplies an artificial 80px observer result and asserts classes and presence. It does not apply 130% font scaling or verify actual geometry.
  • git diff --check passed.

HAPI Bot

// so a long chip cannot push overflow offscreen (#2040).
className={cn(
'relative flex flex-nowrap items-center gap-1',
searchQuery.length > 0 ? 'shrink-0' : 'min-w-0 flex-1'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Major] Constrain the action budget independently of its current contents

With a nonempty query, this changes the observed actions box from flex-1 to shrink-0 with automatic width. ResizeObserver then reports the current icons' intrinsic width, which becomes their budget at lines 2134–2136. On collapsing search at 320px with two machines, unread sessions, Browse, and Settings, the initial 220px fallback admits all five ranked actions; their roughly 224px cluster including the machine menu leaves under 80px for search. Its fixed clear and calendar targets already require at least 92px, so they overlap again instead of more actions shedding. Resizing also cannot reliably update the budget because the observed cluster no longer follows the available row width.

Suggested fix

Derive a finite action budget from the header width while reserving search's minimum chrome width, or constrain a measured flex allocation independently of its contents. Allow query text to shrink within that reservation. Add browser geometry coverage for collapsing and resizing a populated toolbar at 320px.

This branch has not been deployed

No deployments
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.

bug(web): session list header crowds — search/clear overlaps filter and BlockedJumpPill on narrow widths

1 participant