migrate group cards onto ClideCollapserCard; retire ClideHolderCard (T-305)

The activity run, edit run, and sub-agent run cards now render through the
shared ClideCollapserCard primitive instead of ClideHolderCard. The
collapsed ticker now leads with the card label, the count sits in a
fixed-width slot, and the status tick is pinned to the right edge.

ClideHolderCard (T-266) is fully superseded — removed along with its test
and golden; the deeper-control-passthrough coverage moved to the
ClideCollapserCard widget test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-10 10:57:01 +02:00
co-authored by Claude Opus 4.8
parent 9ed2475fe1
commit cf36eca4e5
7 changed files with 36 additions and 424 deletions
@@ -96,6 +96,23 @@ void main() {
expect(find.bySemanticsLabel('Edits, 3 edits, expanded'), findsOneWidget);
});
testWidgets('a deeper interactive control inside an item still fires (not swallowed)', (tester) async {
var tapped = false;
await pump(tester, expanded: true, children: [
ClideTappable(
onTap: () => tapped = true,
builder: (_, __, ___) => const Padding(
padding: EdgeInsets.all(8),
child: Text('press me', textDirection: TextDirection.ltr),
),
),
]);
await tester.tap(find.text('press me'));
await tester.pump();
expect(tapped, isTrue); // the item's own control won the hit
expect(find.bySemanticsLabel('Edits, 3 edits, expanded'), findsOneWidget); // collapser unchanged
});
testWidgets('the ticker is keyboard-focusable and toggles on Activate (a11y)', (tester) async {
await pump(tester);
final focusWidget = tester.widget<Focus>(