use sparcli::prelude::*;
use sparcli::{
Columns, Confirm, Date, DatePicker, NumberInput, Panel, PasswordInput,
Select, TextInput, Textarea,
};
fn main() -> Result<()> {
println!();
let board = dashboard();
hero(board.width() as u16)?;
println!();
board.print()?;
Ok(())
}
fn blank() -> Rendered {
Rendered::new(vec![Line::default()])
}
fn hero(width: u16) -> Result<()> {
let theme = theme();
let body = Text::new(vec![
Line::raw("Interactive prompts - confirm · select · text · password ·"),
Line::raw("number · textarea · fuzzy · date."),
]);
Panel::new(body)
.border(BorderType::Rounded)
.border_style(Style::new().fg(theme.accent))
.title(
Title::new(" sparcli · input widgets ")
.align(Align::Center)
.style(theme.title),
)
.content_align(Align::Center)
.width(width)
.print()
}
fn dashboard() -> Rendered {
Columns::new()
.add_rendered(left_column())
.add_rendered(middle_column())
.add_rendered(calendar_column())
.gap(3)
.separator(BorderType::Single)
.render(0)
}
fn left_column() -> Rendered {
vstack(
&[
Confirm::new("Deploy to production?").default_yes().frame(),
blank(),
TextInput::new("Service").initial("api-gateway").frame(),
PasswordInput::new("Password").initial("hunter2").frame(),
NumberInput::new("Replicas")
.initial(3.0)
.range(1.0, 10.0)
.frame(),
TextInput::new("Email")
.placeholder("you@example.com")
.frame(),
TextInput::new("Region")
.initial("eu-")
.suggestions(["eu-central-1"])
.frame(),
blank(),
Textarea::new("Notes")
.initial("first line\nsecond line\nthird line")
.frame(),
],
0,
)
}
fn middle_column() -> Rendered {
vstack(
&[
Select::new("Environment")
.options(["staging", "production", "local"])
.cursor(1)
.frame(),
blank(),
Select::new("Targets")
.multi()
.options(["web", "api", "worker", "db"])
.checked([0, 2])
.frame(),
],
0,
)
}
fn calendar_column() -> Rendered {
let date = DatePicker::new("Release date")
.initial(Date::new(2026, 5, 15))
.frame();
vstack(&[date, blank(), fuzzy_block()], 0)
}
fn fuzzy_block() -> Rendered {
let theme = theme();
Rendered::new(vec![
Line::new(vec![
Span::styled("Language ".to_string(), theme.title),
Span::raw("ru"),
Span::styled(" ".to_string(), theme.cursor),
]),
Line::new(vec![
Span::styled("‣ ".to_string(), theme.selection),
Span::styled("Rust".to_string(), theme.selection),
]),
])
}