|
4 | 4 | //! real TUI palette instead of a second, drifting copy of it. |
5 | 5 |
|
6 | 6 | use cortex_core::style::{ |
7 | | - BORDER, BORDER_FOCUS, CYAN_PRIMARY, SKY_BLUE, SUCCESS, SURFACE_0, TEXT, TEXT_DIM, TEXT_MUTED, |
8 | | - VOID, |
| 7 | + BORDER, BORDER_FOCUS, CYAN_PRIMARY, SKY_BLUE, SUCCESS, TEXT, TEXT_DIM, TEXT_MUTED, VOID, |
9 | 8 | }; |
| 9 | +use cortex_tui_components::welcome_card::{InfoCard, InfoCardPair, ToLines, WelcomeCard}; |
10 | 10 | use ratatui::Frame; |
11 | 11 | use ratatui::layout::{Constraint, Layout, Rect}; |
12 | 12 | use ratatui::style::{Modifier, Style}; |
@@ -47,56 +47,46 @@ pub fn draw_scene(frame: &mut Frame, scene: &Scene) { |
47 | 47 | draw_hints(frame, hints_area, scene); |
48 | 48 | } |
49 | 49 |
|
| 50 | +/// Empty-session frame: the same `WelcomeCard` + info cards the live TUI paints |
| 51 | +/// via `generate_welcome_lines`, including `MASCOT_MINIMAL_LINES`. |
50 | 52 | fn draw_welcome(frame: &mut Frame, area: Rect, scene: &Scene) { |
51 | | - let card_width = area.width.min(82); |
52 | | - let card_height = 11.min(area.height); |
53 | | - let card = Rect { |
54 | | - x: area.x, |
55 | | - y: area.y + area.height.saturating_sub(card_height) / 2, |
56 | | - width: card_width, |
57 | | - height: card_height, |
58 | | - }; |
59 | | - |
60 | | - let block = Block::default() |
61 | | - .borders(Borders::ALL) |
62 | | - .border_type(BorderType::Rounded) |
63 | | - .border_style(Style::default().fg(BORDER)) |
64 | | - .style(Style::default().bg(SURFACE_0)) |
65 | | - .padding(Padding::new(2, 2, 1, 0)) |
66 | | - .title(Span::styled( |
67 | | - " Cortex Code ", |
68 | | - Style::default() |
69 | | - .fg(CYAN_PRIMARY) |
70 | | - .add_modifier(Modifier::BOLD), |
71 | | - )); |
72 | | - |
73 | | - let lines = vec![ |
74 | | - Line::from(Span::styled( |
75 | | - "A coding agent that reads, edits, runs and tests your project.", |
76 | | - Style::default().fg(TEXT), |
77 | | - )), |
78 | | - Line::default(), |
79 | | - field_line("workspace", &scene.workspace), |
80 | | - field_line("endpoint", &scene.endpoint), |
81 | | - field_line( |
82 | | - "mode", |
83 | | - &format!("{} · {} autonomy", scene.mode, scene.autonomy), |
84 | | - ), |
85 | | - Line::default(), |
86 | | - Line::from(Span::styled( |
87 | | - "Describe a change and Cortex Code works through it, tool call by tool call.", |
88 | | - Style::default().fg(TEXT_MUTED), |
89 | | - )), |
90 | | - ]; |
91 | | - |
92 | | - frame.render_widget(Paragraph::new(lines).block(block), card); |
93 | | -} |
| 53 | + let welcome_card = WelcomeCard::new() |
| 54 | + .subtitle("Your AI-powered coding assistant.") |
| 55 | + .version(env!("CARGO_PKG_VERSION")) |
| 56 | + .tips(&[ |
| 57 | + "Send /help for available commands.", |
| 58 | + "Use Tab for autocomplete. Press Esc to cancel.", |
| 59 | + ]) |
| 60 | + .accent_color(CYAN_PRIMARY) |
| 61 | + .text_color(TEXT) |
| 62 | + .dim_color(TEXT_DIM) |
| 63 | + .border_color(CYAN_PRIMARY); |
| 64 | + |
| 65 | + let mut lines = welcome_card.to_lines(area.width); |
| 66 | + lines.push(Line::default()); |
| 67 | + |
| 68 | + let left_card = InfoCard::new() |
| 69 | + .add("Directory", &scene.workspace) |
| 70 | + .add("Endpoint", &scene.endpoint) |
| 71 | + .dim_color(TEXT_DIM) |
| 72 | + .text_color(TEXT) |
| 73 | + .border_color(CYAN_PRIMARY); |
| 74 | + |
| 75 | + let right_card = InfoCard::new() |
| 76 | + .add("Mode", &scene.mode) |
| 77 | + .add("Autonomy", &scene.autonomy) |
| 78 | + .dim_color(TEXT_DIM) |
| 79 | + .text_color(TEXT) |
| 80 | + .border_color(CYAN_PRIMARY); |
| 81 | + |
| 82 | + lines.extend( |
| 83 | + InfoCardPair::new(left_card, right_card) |
| 84 | + .gap(2) |
| 85 | + .right_width(25) |
| 86 | + .to_lines(area.width), |
| 87 | + ); |
94 | 88 |
|
95 | | -fn field_line(label: &str, value: &str) -> Line<'static> { |
96 | | - Line::from(vec![ |
97 | | - Span::styled(format!("{label:<11}"), Style::default().fg(TEXT_MUTED)), |
98 | | - Span::styled(value.to_string(), Style::default().fg(TEXT_DIM)), |
99 | | - ]) |
| 89 | + frame.render_widget(Paragraph::new(lines).style(Style::default().bg(VOID)), area); |
100 | 90 | } |
101 | 91 |
|
102 | 92 | fn draw_timeline(frame: &mut Frame, area: Rect, scene: &Scene) { |
|
0 commit comments