Skip to content

fix(workspace): keep a starred or pinned chat's title beside its glyph in the tab overflow menu (#3737) - #3742

Merged
vybe merged 1 commit into
devfrom
feature/3737-overflow-starred-row
Oct 14, 2026
Merged

vybe merged 1 commit into
devfrom
feature/3737-overflow-starred-row

Conversation

@vybe

@vybe vybe commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

Fixes #3737 — first of two Workspace composer/tab fixes in chain-3737 (epic #3471). Base is dev. Draft until the chain is in: #3738's PR stacks on this branch and the two merge together in order on the operator's call.

What

  • src/frontend/src/components/OverflowTabs.vue — the dropdown menu-row button only (+13/−4, one hunk): justify-between dropped; the bookmark glyph, the star glyph and the label now sit in one leading group (<span data-menu-lead class="flex min-w-0 flex-1 items-center">), so a starred or pinned chat in the "N more" menu reads glyph → title at the left edge like every other row. The Draft mark, the count badge and the activity dot follow as direct children in their existing order, so they stay at the right edge. The inline tab row and the hidden mirror row have no hunk.
  • src/frontend/tests/unit/overflowTabsMenuRow.mount.spec.js — new jsdom mount spec, 8 tests: overflow forced by width stubs, starred and pinned rows last in a 6+ list (cannot pass on an empty menu), the lead-group structure, the bug(workspace): attachments are dropped when a 1:1 chat is escalated into a room via @mention #2794 trailing chain order, fixedWidth truncation + title, inline/mirror rows unchanged, the ent#841 × still a sibling.

Rulings carried (orchestrator, on the operator's behalf — plan file)

  • TD1 — drop justify-between rather than keep it: once the lead group is flex-1 the class does nothing and would mislead.
  • TD2 — rows with both a Draft mark and a count badge now cluster both at the right edge instead of floating the Draft mark mid-row; the issue's AC lists the Draft mark among the trailing items, and it was the same defect.
  • TD3 — a new spec file beside the three existing overflowTabs*.mount.spec.js, one feature per file.

Review + security

/review (Fable, report-only): MERGEABLE — 0 critical, 0 informational; rider checks hold: menu row is the only hunk, #2794 chain order and direct-child placement intact, fixedWidth clamp inside min-w-0, close × still a sibling with CLOSE_PAD, one literal class string changed with no colour, no raw colours, spec cannot pass on an empty menu. Mutation checks: fix reverted → 7/8 red; justify-between restored → 5 red; DraftMark moved between the chain arms → 2 red. /cso --diff: no new surface, label still text-interpolated, zero findings.

Tests

  • 4 overflowTabs* specs: 29 passed. 3 ratchet specs (loading gate, raw colour, source text): 28 passed. 11 other specs referencing the component: 344 passed.
  • Not run here: the full npm run test:unit island and Playwright e2e — CI's (frontend-e2e is required since src/frontend changed).

Before merge

Handoffs

🤖 Generated with Claude Code

…h in the tab overflow menu (#3737)

The OverflowTabs "N more" menu row was `flex justify-between`, and the
pinned/starred glyphs were its first flex children. Free space was spread
between the glyph and the label, so a shorter title drifted further right.
The same rule floated the Draft mark to mid-row.

The glyphs and the label now sit in one `[data-menu-lead]` group
(`flex min-w-0 flex-1 items-center`), and `justify-between` is dropped.
Trailing items (Draft, badge or dot) cluster at the right edge, and the #2794
v-if/v-else-if chain is unchanged. The inline row and the measuring mirror
row are untouched.

New mount spec overflowTabsMenuRow.mount.spec.js: 7 of 8 tests were red on
the unfixed template; the scope guard is green both ways. Each mutation was
restored from a scratch copy:
(a) wrapper removed -> 7 red; (b) justify-between restored -> 5 red
(starred/pinned/plain/closable/fixedWidth); (c) label moved out of the
group -> 7 red; (d) DraftMark moved between badge and signal -> 2 red
(trailing order, #2794 chain).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@trinity-ability trinity-ability left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

PR Validation Report — /validate-pr (Lane B, frontend only)

Tip: 3c843907b · Base: dev · Files: 2 (+194/−4) · Fixes #3737 (P2 · type-bug · theme-ui-ux)

Category Status Notes
Commit message ✅ fix(workspace): … conventional, describes the change
Base branch / size ✅ dev; 2 files
Status auto-promotion ✅ Fixes #3737 (same repo)
Requirements / Architecture / Feature flows ➖ bug fix, layout-only; no behaviour or API change
Security (§4.1–4.10) ✅ no keys, emails or host paths, no mode or symlink change. The one IP-shaped hit (48.05.67.65) is SVG path data inside the existing star glyph
Build / config packaging ➖ no backend paths
Design system ✅ one literal class string changed (justify-between dropped), plus a new flex min-w-0 flex-1 items-center span. No colour classes; raw-colour, loading-gate and source-text ratchets pass
Scope ✅ only the menu-row button changed. Inline-row and mirror-row markup have no hunk, and a spec test checks they are unchanged
Structural review ✅ /review MERGEABLE (0 findings) and /cso --diff clean, both recorded in the PR body
Merge gate (Tier 1) ✅ every check on the tip is green, including regression diff, pytest (head), build, e2e, journey-smoke, schema-parity, verify-non-root and both Analyze runs. dev-last-green.sh resolves to the dev tip e4e739f7e, and no dev-ci red issue is open

Execution coverage (§5.4)

changed symbol / test executed by live consumer verdict
menu-row button markup ([data-menu-lead] group) overflowTabsMenuRow.mount.spec.js, 8 tests. It is a real jsdom mount with an overflow forced by stubs, and the trigger click opens the menu. It has no source-text reads OverflowTabs.vue dropdown, rendered wherever the component is used (Workspace tab strip) ✅

Fix-PR mutation (run here, in an isolated worktree): with OverflowTabs.vue reverted to the parent commit, the new spec goes 7 of 8 red. The one test that stays green is the inline/mirror scope guard, which is correct, because those rows did not change. With the fix restored, the 4 overflowTabs* specs and the 3 ratchet specs give 57/57 passing.

Notes (non-blocking)

  • ⚠️ The PR is still a draft by design: #3738's PR stacks on this branch. It merges first, on the operator's call.
  • jsdom has no layout, so the assertions check structure: the lead group holds the glyphs and the label, and the trailing items are direct children. With justify-between gone and the lead group set to flex-1, that structure produces the visual fix. The e2e run is green.

Recommendation

APPROVE. The change is minimal and inside its stated scope. The test mounts the component and goes red when the fix is reverted, the security scan is clean and Tier 1 is green.

@vybe
vybe marked this pull request as ready for review October 14, 2026 21:36
@vybe
vybe merged commit f8ae878 into dev Oct 14, 2026
24 of 26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ui PR touches the frontend UI — triggers Playwright e2e tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants