Skip to content

Lay out the Follow-ups banner like bb's Queue card - #20

Merged
matthewdias merged 1 commit into
mainfrom
follow-up-banner-queue-style
Oct 5, 2026
Merged

matthewdias merged 1 commit into
mainfrom
follow-up-banner-queue-style

Conversation

@matthewdias

Copy link
Copy Markdown
Owner

The Follow-ups banner sits right above bb's own Queue card, and the two read differently. Each follow-up row carried six hover icons, and the header was a sentence with a leading disclosure triangle. This lays the banner out like its sibling.

What changed

  • Header: a "Follow-ups N" label and count, then the reason rollup, the in-progress count and the panel arrow. The collapse chevron now sits on the right, as on the Queue card. The small plugin glyph before the label is gone.

  • One inline action per row, the rest behind ⋯. mainActionFor (in lib/followups.ts) guesses the next step from the row's reason:

    • out-of-scope leads with Hand off;
    • everything else leads with Put in composer;
    • cleanup will lead with a Queue action once one exists. For now it gets Put in composer.

    The menu holds whichever of those two isn't inline, then Edit, Describe in more detail (only on rows without detail), Open in the panel, and below a divider, Mark done and Dismiss. Stop describing stays on the row while a helper runs.

  • Editing in place, as in the Queue card. The text becomes a field. Enter or blur saves through followups_amend, and Escape puts the text back. A refusal (a duplicate, or wording dismissed earlier) shows its reason in a toast. Detail, file and reason are still edited in the panel ("Open in the panel").

  • The menu bundles nothing. It uses @radix-ui/react-dropdown-menu, which bb shims at runtime. It's a type-only devDependency pinned to the host's version by bb plugin types, the same way sonner is. The plugin's lockfile adds only that dev-only tree; no existing entry changed.

  • Docs: README and PLUGIN_OVERVIEW.md describe the new row layout. There's no version bump, because Publish follow-up progress live, and let Thread Badges draw any plugin's complications #17 bumps Follow Up's version, and the two PRs touch different README sections.

Verification

  • npm run check passes on top of main (55bdbd2, after rebasing over Reset pinned tabs on close, and add a recent-order close setting #19). Follow Up has 187 node --test tests and 54 vitest tests.

  • New tests: 11 in tests/ui/banner-actions.test.tsx, plus 1 unit test for mainActionFor. They cover:

    • which action each reason gets;
    • what the menu offers;
    • Enter saving, Escape cancelling, and unchanged text saving nothing;
    • a refused edit's toast;
    • the header;
    • no detail tooltip while a row is being edited.
  • Existing tests: the pill-removal tests now pick Done and Dismiss from the row menu. The menu items keep the old accessible names.

  • Deliberate breaks: nine of them, each failing at least one test:

    • cleanup leading with Hand off;
    • nothing leading with Hand off;
    • the menu dropping Put in composer;
    • the menu dropping Hand off;
    • unchanged text still saving;
    • Escape saving;
    • a refusal not reported;
    • the header label changing;
    • the tooltip allowed while editing.
  • Checked in bb 0.45, linked from the branch and driven by a headless browser:

    • the header and a hovered row;
    • the ⋯ menu on an out-of-scope row (Hand off inline, the menu as listed above);
    • the inline editor, opened and cancelled with Escape, saving nothing.

    That pass found the detail tooltip opening over the edit field, which is fixed and tested.

Choices this made

  • The header lost the plugin glyph, and the chevron moved right, to match the Queue card.
  • Cleanup leads with Put in composer until a Queue action exists. The rule is one line in mainActionFor.
  • Inline edit covers the text only. The detail stays in the panel.

🤖 Generated with Claude Code

The banner stacks right above bb's own Queue card, and the two read
differently: each follow-up row carried six hover icons, and the header
was a sentence with a leading disclosure triangle. It now matches its
sibling. The header is a "Follow-ups N" label and count, with the
collapse chevron on the right. Each row shows one action and keeps the
rest in a ⋯ menu.

The inline action is a guess from the row's reason (mainActionFor):
out-of-scope work leads with Hand off, everything else with Put in
composer. Cleanup will lead with a Queue action once one exists. The
menu holds whichever of those two is not inline, plus Edit, Describe
(rows without detail), Open in the panel, Mark done and Dismiss.
Stopping a running describe stays on the row.

Edit now happens in place, as in the Queue card: the text becomes a
field, Enter or blur saves through followups_amend, Escape restores it,
and a refusal (duplicate, dismissed wording) is reported in a toast.
Detail, file and reason are still edited in the panel.

The menu uses @radix-ui/react-dropdown-menu, which bb shims at runtime,
so it is a type-only devDependency pinned by `bb plugin types` and
bundles nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@matthewdias
matthewdias merged commit 6f44fc5 into main Oct 5, 2026
1 check passed
@matthewdias
matthewdias deleted the follow-up-banner-queue-style branch October 5, 2026 02:29
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