diff --git a/docs/plans/2026-02-22-frame-bubbletea-design.md b/docs/plans/completed/2026-02-22-frame-bubbletea-design-original.md similarity index 100% rename from docs/plans/2026-02-22-frame-bubbletea-design.md rename to docs/plans/completed/2026-02-22-frame-bubbletea-design-original.md diff --git a/docs/plans/2026-02-22-frame-bubbletea-plan.md b/docs/plans/completed/2026-02-22-frame-bubbletea-plan-original.md similarity index 100% rename from docs/plans/2026-02-22-frame-bubbletea-plan.md rename to docs/plans/completed/2026-02-22-frame-bubbletea-plan-original.md diff --git a/docs/plans/completed/frame-bubbletea.md b/docs/plans/completed/frame-bubbletea.md new file mode 100644 index 00000000..9a0d09f2 --- /dev/null +++ b/docs/plans/completed/frame-bubbletea.md @@ -0,0 +1,39 @@ +# Frame Bubbletea Upgrade — Completion Summary + +**Completed:** 22 February 2026 +**Module:** `forge.lthn.ai/core/cli` +**Status:** Complete — Frame implements tea.Model with full bubbletea lifecycle + +## What Was Built + +Upgraded the Frame layout system from a static HLCRF renderer to a full +bubbletea `tea.Model` with lifecycle management, keyboard handling, and +panel navigation. + +### Key changes + +- **Frame implements `tea.Model`** — `Init()`, `Update()`, `View()` lifecycle +- **`KeyMap`** — configurable keybindings with default set (quit, navigate, + help, focus cycling) +- **`Navigate(name)` / `Back()`** — panel switching with history stack +- **Focus management** — Tab/Shift-Tab cycles focus between visible models +- **lipgloss layout** — HLCRF regions (Header, Left, Content, Right, Footer) + rendered with lipgloss instead of raw ANSI +- **`FrameModel` interface** — models register with `Frame.Header()`, + `.Content()`, `.Footer()` etc., receiving focus/blur/resize messages + +### Tests + +Navigate/Back stack tests, focus cycling, key dispatch, resize propagation. +All passing with `-race`. + +### Dependencies + +- `github.com/charmbracelet/bubbletea` +- `github.com/charmbracelet/lipgloss` + +### Consumer + +`go-blockchain/cmd/chain/` is the first consumer — TUI dashboard uses +Frame with StatusModel (header), ExplorerModel (content), KeyHintsModel +(footer).