Skip to content

feat: redesign TUI into themed, settings-driven productivity app#7

Merged
aksOps merged 4 commits into
mainfrom
worktree-tui-redesign
Jul 2, 2026
Merged

feat: redesign TUI into themed, settings-driven productivity app#7
aksOps merged 4 commits into
mainfrom
worktree-tui-redesign

Conversation

@aksOps

@aksOps aksOps commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

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.md for the phase-by-phase plan and status.

What changed

Architecturelib.rs no longer contains a giant render function: it holds state + logic only. Rendering lives in src/ui/ (chrome, board, modals, stories, settings_ui, help, confirm, markdown) with a shared modal shell, all styled through a centralized src/theme.rs palette (#0B1117 bg, #7C5CFF accent, semantic success/warning/error/info).

Settings (Ctrl+,) — tabbed modal (GitLab / AI / Appearance / Advanced) persisting to settings.json in 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.

Keyshjkl + arrows, / search, e edit, n new, g stories, s/r sync, c connect, b block, ? help, Ctrl+K palette, Ctrl+, settings, q quit; context-aware footer everywhere; q can't quit while typing in search.

Generate Stories — Edit / Preview / Generated tabs (Ctrl+P preview), 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

  • 262 tests pass (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 settings
  • cargo fmt --check clean
  • cargo clippy --all-targets: 5 warnings, all pre-existing on main in untouched code (sanitize.rs, jobs.rs)
  • Not manually driven in a live terminal (headless environment); render coverage is via ratatui TestBackend full-frame assertions across every overlay

🤖 Generated with Claude Code

https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj

aksOps and others added 4 commits July 2, 2026 17:23
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
@aksOps aksOps marked this pull request as ready for review July 2, 2026 18:13
@sonarqubecloud

sonarqubecloud Bot commented Jul 2, 2026

Copy link
Copy Markdown

@aksOps aksOps merged commit f8676eb into main Jul 2, 2026
8 checks passed
@aksOps aksOps mentioned this pull request Jul 2, 2026
@aksOps aksOps deleted the worktree-tui-redesign branch July 4, 2026 15:23
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