Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file removed src/cli.rs
Empty file.
6 changes: 3 additions & 3 deletions src/tui/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ impl LayoutEngine {

let status_id = self.create_pane(PaneType::StatusBar);
let chat_id = self.create_pane(PaneType::Chat);
let garden_id = self.create_pane(PaneType::GardenHealth);
let garden_id = self.create_pane(PaneType::GardenView);
let tools_id = self.create_pane(PaneType::ActiveTools);
let logs_id = self.create_pane(PaneType::Logs);

Expand Down Expand Up @@ -769,7 +769,7 @@ mod tests {
let mut engine = LayoutEngine::new();
engine.apply_preset(LayoutPreset::Dashboard);
assert_eq!(engine.current_preset(), LayoutPreset::Dashboard);
// Dashboard has: StatusBar, Chat, GardenHealth, ActiveTools, Logs = 5 panes
// Dashboard has: StatusBar, Chat, GardenView, ActiveTools, Logs = 5 panes
assert_eq!(engine.pane_ids().len(), 5);
}

Expand All @@ -787,7 +787,7 @@ mod tests {

assert!(pane_types.contains(&PaneType::StatusBar));
assert!(pane_types.contains(&PaneType::Chat));
assert!(pane_types.contains(&PaneType::GardenHealth));
assert!(pane_types.contains(&PaneType::GardenView));
assert!(pane_types.contains(&PaneType::ActiveTools));
assert!(pane_types.contains(&PaneType::Logs));
}
Expand Down
44 changes: 28 additions & 16 deletions src/tui/markdown.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

// Feature-gated module - dead_code lint disabled at crate level

use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag};
use pulldown_cmark::{CodeBlockKind, Event, HeadingLevel, Options, Parser, Tag, TagEnd};
use ratatui::{
style::{Color, Modifier, Style},
text::{Line, Span, Text},
Expand All @@ -16,6 +16,18 @@ use syntect::parsing::SyntaxSet;

use super::TuiPalette;

/// Convert HeadingLevel to usize for repeat operations
fn heading_level_to_usize(level: HeadingLevel) -> usize {
match level {
HeadingLevel::H1 => 1,
HeadingLevel::H2 => 2,
HeadingLevel::H3 => 3,
HeadingLevel::H4 => 4,
HeadingLevel::H5 => 5,
HeadingLevel::H6 => 6,
}
}

/// Markdown renderer with streaming support
pub struct MarkdownRenderer {
/// Syntax highlighting set
Expand Down Expand Up @@ -321,7 +333,7 @@ impl<'a> RenderState<'a> {
fn process_event(&mut self, event: Event) {
match event {
Event::Start(tag) => self.start_tag(tag.clone()),
Event::End(tag) => self.end_tag(tag),
Event::End(tag_end) => self.end_tag(tag_end),
Event::Text(text) => self.add_text(&text),
Event::Code(code) => self.add_inline_code(&code),
Event::SoftBreak | Event::HardBreak => self.line_break(),
Expand All @@ -332,9 +344,9 @@ impl<'a> RenderState<'a> {

fn start_tag(&mut self, tag: Tag) {
match tag {
Tag::Heading(level, _, _) => {
Tag::Heading { level, .. } => {
self.flush_line();
let prefix = "#".repeat(level as usize);
let prefix = "#".repeat(heading_level_to_usize(level));
self.current_line.push(Span::styled(
format!("{} ", prefix),
Style::default()
Expand Down Expand Up @@ -367,51 +379,51 @@ impl<'a> RenderState<'a> {
Tag::Strong => {
self.strong = true;
}
Tag::BlockQuote => {
Tag::BlockQuote(_) => {
self.flush_line();
self.current_line
.push(Span::styled("▌ ", Style::default().fg(TuiPalette::SAGE)));
}
Tag::Link(_, _, _) => {
Tag::Link { .. } => {
// Links will be styled differently
}
_ => {}
}
}

fn end_tag(&mut self, tag: Tag) {
match tag {
Tag::Heading(_, _, _) => {
fn end_tag(&mut self, tag_end: TagEnd) {
match tag_end {
TagEnd::Heading(_) => {
self.flush_line();
self.lines.push(Line::default()); // Add blank line after heading
}
Tag::CodeBlock(_) => {
TagEnd::CodeBlock => {
if self.in_code_block {
self.render_code_block();
self.in_code_block = false;
self.code_content.clear();
}
}
Tag::List(_) => {
TagEnd::List(_) => {
self.list_depth = self.list_depth.saturating_sub(1);
if self.list_depth == 0 {
self.flush_line();
}
}
Tag::Item => {
TagEnd::Item => {
self.flush_line();
}
Tag::Emphasis => {
TagEnd::Emphasis => {
self.emphasis = false;
}
Tag::Strong => {
TagEnd::Strong => {
self.strong = false;
}
Tag::Paragraph => {
TagEnd::Paragraph => {
self.flush_line();
self.lines.push(Line::default()); // Blank line after paragraph
}
Tag::BlockQuote => {
TagEnd::BlockQuote(_) => {
self.flush_line();
}
_ => {}
Expand Down
10 changes: 5 additions & 5 deletions src/tui/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -426,10 +426,10 @@ where
/// - Logs panel at bottom
///
/// Keyboard shortcuts:
/// - q / Ctrl+C / Ctrl+D: Quit
/// - q / Ctrl+C: Quit
/// - ?: Toggle help overlay
/// - d: Toggle dashboard/focus mode
/// - g: Toggle garden view zoom
/// - Ctrl+D: Toggle dashboard/focus mode
/// - Ctrl+G: Toggle garden view zoom
/// - l: Toggle logs view zoom
/// - Tab: Cycle focus between panes
/// - z: Toggle zoom on focused pane
Expand Down Expand Up @@ -541,7 +541,7 @@ pub fn run_tui_dashboard(model: &str) -> Result<Vec<String>> {
// Find garden pane and focus/zoom it
for pane_id in layout_engine.pane_ids() {
if let Some(pane) = layout_engine.get_pane(pane_id) {
if pane.pane_type == PaneType::GardenHealth {
if pane.pane_type == PaneType::GardenView {
layout_engine.set_focus(pane_id);
layout_engine.toggle_zoom();
dashboard_state.log(LogLevel::Info, "Toggled garden view");
Expand Down Expand Up @@ -808,7 +808,7 @@ pub fn run_tui_dashboard_with_events(
KeyCode::Char('g') if key.modifiers == KeyModifiers::CONTROL => {
for pane_id in layout_engine.pane_ids() {
if let Some(pane) = layout_engine.get_pane(pane_id) {
if pane.pane_type == PaneType::GardenHealth {
if pane.pane_type == PaneType::GardenView {
layout_engine.set_focus(pane_id);
layout_engine.toggle_zoom();
shared_state
Expand Down
Loading