MultitabPane: keepAlive mode and tab strip polish

Adds keepAlive: when true, all entry bodies stay mounted via
IndexedStack so switching tabs doesn't tear down their state.
Hosts that own PTY-backed sessions or any long-lived widget
state opt in; callers that want fresh state on each switch use
the default single-body mode.

Polishes the tab strip itself for production use:
- bottom divider so the strip visually anchors to the body below
- Column.crossAxisAlignment.stretch so the strip fills the pane
  width instead of sizing to its content
- close button: replace the text × glyph with the CloseIcon
  painter (clean cross strokes, font-independent)
- two-column tab layout — Expanded title on the left, fixed
  16x16 close button on the right; uniform 12px left padding,
  6px right padding to match the 6px top/bottom breathing room
  around the close button

Two new widget tests cover keepAlive (state preserved across
switches) and default mode (inactive bodies disposed).

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-05-06 15:20:57 +02:00
co-authored by Claude
parent aa742eed79
commit 96c6cfc6c5
3 changed files with 159 additions and 27 deletions
+20 -11
View File
@@ -1,5 +1,5 @@
{
"exported_at": "2026-05-06T12:17:16Z",
"exported_at": "2026-05-06T13:20:57Z",
"decisions": [
{
"id": "D-1",
@@ -2073,11 +2073,11 @@
"type": "task",
"parent_id": "T-3",
"title": "secondary Claude pane UI wiring",
"status": "ready",
"status": "in_progress",
"priority": "medium",
"decision_ref": "D-41",
"created_at": "2026-04-22 14:08:40",
"updated_at": "2026-05-03 20:36:31"
"updated_at": "2026-05-06 12:20:58"
},
{
"id": "T-25",
@@ -2687,18 +2687,13 @@
"id": "T-84",
"type": "task",
"title": "MultitabPane: drag-to-reorder gesture wiring",
"status": "in_progress",
"status": "done",
"priority": "medium",
"created_at": "2026-05-06 10:16:02",
"updated_at": "2026-05-06 10:17:57"
}
],
"ticket_deps": [
{
"blocker_id": "T-84",
"blocked_id": "T-24"
"updated_at": "2026-05-06 12:17:27"
}
],
"ticket_deps": null,
"ticket_labels": null,
"history": [
{
@@ -4056,6 +4051,20 @@
"old_value": "backlog",
"new_value": "in_progress",
"changed_at": "2026-05-06 10:17:57"
},
{
"ticket_id": "T-84",
"field": "status",
"old_value": "in_progress",
"new_value": "done",
"changed_at": "2026-05-06 12:17:27"
},
{
"ticket_id": "T-24",
"field": "status",
"old_value": "ready",
"new_value": "in_progress",
"changed_at": "2026-05-06 12:20:58"
}
]
}