use ratatui::layout::Rect;
use ratatui::style::{Color, Modifier, Style};
use ratatui::Frame;
use ratatui_sci_fi::themes::{Palette, Theme};
use ratatui_sci_fi::widgets::{Panel, PanelShape};
pub const PANEL_SHAPE: PanelShape = PanelShape::Rounded;
const PALETTE: Palette = Theme::Cyberpunk.palette();
pub fn bg() -> Style {
Style::default().bg(PALETTE.bg.color())
}
pub fn panel() -> Style {
Style::default().bg(PALETTE.panel.color())
}
pub fn fg() -> Style {
Style::default().fg(PALETTE.fg.color())
}
pub fn border() -> Style {
Style::default().fg(PALETTE.accent2.color())
}
pub fn title_style() -> Style {
Style::default()
.fg(PALETTE.accent.color())
.add_modifier(Modifier::BOLD)
}
pub fn selected() -> Style {
Style::default()
.fg(PALETTE.accent.color())
.add_modifier(Modifier::BOLD)
}
pub fn muted() -> Style {
Style::default().fg(PALETTE.muted.color())
}
pub fn error() -> Style {
Style::default().fg(PALETTE.alert.color())
}
pub fn accent() -> Style {
Style::default().fg(PALETTE.ok.color())
}
pub fn accent2() -> Style {
Style::default().fg(PALETTE.accent2.color())
}
pub mod colors {
use super::*;
pub fn accent() -> Color {
PALETTE.accent.color()
}
pub fn accent2() -> Color {
PALETTE.accent2.color()
}
pub fn ok() -> Color {
PALETTE.ok.color()
}
pub fn fg() -> Color {
PALETTE.fg.color()
}
pub fn muted() -> Color {
PALETTE.muted.color()
}
pub fn alert() -> Color {
PALETTE.alert.color()
}
pub fn panel() -> Color {
PALETTE.panel.color()
}
}
pub fn selected_bar() -> Style {
Style::default()
.bg(PALETTE.panel.color())
.fg(PALETTE.accent.color())
.add_modifier(Modifier::BOLD)
}
pub fn bar() -> Style {
Style::default()
.bg(PALETTE.panel.color())
.fg(PALETTE.fg.color())
}
pub fn block(t: &str) -> ratatui::widgets::Block<'_> {
use ratatui::widgets::{Block, BorderType, Borders};
Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Rounded)
.border_style(border())
.title(t)
.title_style(title_style())
.style(Style::default().fg(PALETTE.fg.color()))
}
pub fn panel_frame(frame: &mut Frame, area: Rect, title: Option<&str>) -> Rect {
let mut panel = Panel::new().theme(Theme::Cyberpunk).shape(PANEL_SHAPE);
if let Some(t) = title {
panel = panel.title(format!(" {t} "));
}
let inner = panel.inner(area);
frame.render_widget(panel, area);
inner
}