feat: redesign TUI into themed, settings-driven productivity app#7
Merged
Conversation
Restructure the UI layer out of lib.rs into per-surface modules with a centralized dark theme, add persisted settings (no env vars required), async job feedback, search, confirm dialogs, and a help overlay. - theme.rs: single palette (#0B1117 bg, #7C5CFF accent, semantic success/warning/error/info), shared styles, spinner frames - settings.rs: settings.json in the OS config dir with validation and a form model; env vars still win; live reload after save (Ctrl+,) - ui/: chrome (topbar with brand/connection/search, status bar with spinner + colored status), board (column accents, label pills, empty states, appearance options), modals (issue editor, notes, palette), stories (Edit/Preview/Generated tabs), settings, help (?), confirm - lib.rs: state/logic only; StatusKind, busy tracking, search filter with filtered navigation, delete-with-confirm, story preview tabs - main.rs: hjkl navigation, / search routing, e edit, ? help, Ctrl+, settings, s sync, per-job busy labels, settings-file config fallback - jobs.rs: results now carry success/error status kinds - markdown: themed renderer with underlined links, italics, ordered lists; behavior parity with the previous parser 262 tests pass; cargo fmt clean; clippy warnings limited to pre-existing items in untouched code. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj
Fixes from live testing plus mock-fidelity pass: - Settings shortcut: Ctrl+, is untransmittable in legacy terminals, so enable the kitty keyboard protocol when supported and add plain ',' as a universal fallback (footer/help updated) - Issue details now render as a right-hand side panel on wide terminals (>=100 cols) like the design mock, keeping the board visible and clickable; centered modal remains on narrow terminals - Topbar: "● Connected • project @user" status, always-visible search field with placeholder, Settings button - Cards: colored status dot, muted uppercase label subtitle, label pills (fake STATE row removed), taller default cards, "+N more issues" column footer; "● Ready" idle indicator in the status bar - Clipboard: bracketed paste routes into the focused input (editor, notes, story source, search, palette, settings) preserving newlines where supported; Ctrl+C copies the focused field (or selected issue as markdown) via OSC 52 - Editor: vertical scrollbar in modal and panel, Ctrl+T task-checkbox snippet; markdown preview gains h4-h6, horizontal rules, and strikethrough 277 tests pass; fmt clean; clippy unchanged (pre-existing warnings only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj
Restructure the details surface and move rendering onto ratatui widgets
per design-mock feedback:
- Details is now a read-only issue view (side panel on wide terminals,
modal on narrow): title with status dot, state chip, colored label
pills, due date, linked source, rendered markdown description with
acceptance-criteria checkboxes, and Edit / Move / Close actions.
Editing moved to a dedicated EditIssue overlay ('e' or Enter).
- 'm' moves the selected issue one column right (GitLab transition when
connected, local move offline)
- Rounded borders everywhere (ratatui border::ROUNDED); Tabs widget for
Settings sections and story Edit/Preview/Generated tabs; settings text
fields render as bordered input Blocks with focus/error borders and
inline validation in the title; toggles as ☑/☐ rows
- Buttons render as half-block pills instead of colored text
- Board cards: colored status dot, per-label deterministic pill colors,
uppercase label subtitle, "+N more issues" column footer, "+" new-issue
affordance in column headers
- Topbar: "● Connected • project @user", "⟳ Synced Nm ago" after sync,
Help and Settings buttons; "● Ready" idle indicator in the status bar
- Generate Stories: Select All button + Ctrl+A toggle-all
- Help overlay: two-column shortcut layout
- Mouse capture releases automatically inside overlays so terminal-native
text selection/copy works in text areas; board keeps drag & drop
278 tests pass; fmt clean; clippy unchanged (pre-existing warnings only).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj
- Mouse capture stays enabled everywhere again so popup buttons are clickable; terminal-native text selection is available via Shift+drag (documented in Help) - Labels are now editable in the issue editor: Tab cycles Title -> Description -> Labels; comma-separated input parsed and deduplicated on save, synced with AI label suggestions - AI actions (improve/criteria/suggest labels/generate stories) are refused with a warning pointing to Settings -> AI when AI features are disabled; the editor hint reflects the disabled state; flag derives from config (env or settings) at startup and on settings reload 282 tests pass; fmt clean; clippy unchanged (pre-existing warnings only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Summary
Full UX redesign of the Lane TUI per the design mock: dark Linear/Raycast-style productivity theme, settings persisted locally (env vars now optional), async feedback on every job, search, confirm dialogs, and a
?help overlay. Backend (gitlab/llm/jobs/sync/labels/sanitize) is unchanged apart from status-kind annotations on job results.See
REDESIGN_PLAN.mdfor the phase-by-phase plan and status.What changed
Architecture —
lib.rsno longer contains a giant render function: it holds state + logic only. Rendering lives insrc/ui/(chrome, board, modals, stories, settings_ui, help, confirm, markdown) with a shared modal shell, all styled through a centralizedsrc/theme.rspalette (#0B1117 bg, #7C5CFF accent, semantic success/warning/error/info).Settings (
Ctrl+,) — tabbed modal (GitLab / AI / Appearance / Advanced) persisting tosettings.jsonin the OS config dir. Secrets masked, inline validation, save feedback. Env vars still take precedence; missing config guides the user to Settings. Saving reloads config live and reconnects.Async feedback — every job sets a busy label rendered as an animated spinner in the status bar; results color the status line (green success / red error / amber warning) with icons; connecting shows an accent gauge.
Board — column accents (todo blue / doing amber / done green), focus ring on the selected card, label pills, empty states ("No issues / Press n to create", "No matches"), appearance options (compact density, hide labels/IDs),
/search filtering both rendering and keyboard navigation.Keys —
hjkl+ arrows,/search,eedit,nnew,gstories,s/rsync,cconnect,bblock,?help,Ctrl+Kpalette,Ctrl+,settings,qquit; context-aware footer everywhere;qcan't quit while typing in search.Generate Stories — Edit / Preview / Generated tabs (
Ctrl+Ppreview), scrolling multiline source, spinner while generating, review/select/edit-title/create-selected flow.Destructive actions — delete issue (palette) goes through a confirm dialog (toggleable in Advanced settings).
Testing
cargo test): all legacy logic + render tests ported/updated to the new theme, plus new coverage for settings round-trip/validation/env-merge, search navigation, confirm flow, story tabs, busy spinner, status icons, empty states, help overlay, secret masking, appearance settingscargo fmt --checkcleancargo clippy --all-targets: 5 warnings, all pre-existing on main in untouched code (sanitize.rs, jobs.rs)🤖 Generated with Claude Code
https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj