use super::NodeKind;
use ratatui::style::Color;
pub mod solarized {
use ratatui::style::Color;
pub const BASE03: Color = Color::Rgb(0, 43, 54); pub const BASE02: Color = Color::Rgb(7, 54, 66); pub const BASE01: Color = Color::Rgb(88, 110, 117); pub const BASE00: Color = Color::Rgb(101, 123, 131); pub const BASE0: Color = Color::Rgb(131, 148, 150); pub const BASE1: Color = Color::Rgb(147, 161, 161); pub const BASE2: Color = Color::Rgb(238, 232, 213); pub const BASE3: Color = Color::Rgb(253, 246, 227);
pub const YELLOW: Color = Color::Rgb(181, 137, 0); pub const ORANGE: Color = Color::Rgb(203, 75, 22); pub const RED: Color = Color::Rgb(220, 50, 47); pub const MAGENTA: Color = Color::Rgb(211, 54, 130); pub const VIOLET: Color = Color::Rgb(108, 113, 196); pub const BLUE: Color = Color::Rgb(38, 139, 210); pub const CYAN: Color = Color::Rgb(42, 161, 152); pub const GREEN: Color = Color::Rgb(133, 153, 0); }
#[derive(Debug, Clone)]
pub struct TreeColors {
pub bg: Color,
pub fg: Color,
pub selected_bg: Color,
pub selected_fg: Color,
pub directory: Color,
pub file: Color,
pub hidden: Color,
pub ecosystem: Color,
pub ecosystem_glow: Color,
pub git_modified: Color,
pub git_added: Color,
pub git_deleted: Color,
pub git_untracked: Color,
pub indent_guide: Color,
pub branch_lines: Color,
pub dimmed: Color,
}
impl Default for TreeColors {
fn default() -> Self {
Self::solarized_dark()
}
}
impl TreeColors {
pub fn solarized_dark() -> Self {
Self {
bg: solarized::BASE03,
fg: solarized::BASE0,
selected_bg: solarized::BASE02,
selected_fg: solarized::BASE1,
directory: solarized::BLUE,
file: solarized::BASE0,
hidden: solarized::BASE01,
ecosystem: solarized::YELLOW,
ecosystem_glow: solarized::ORANGE,
git_modified: solarized::YELLOW,
git_added: solarized::GREEN,
git_deleted: solarized::RED,
git_untracked: solarized::CYAN,
indent_guide: solarized::BASE01,
branch_lines: solarized::BASE01,
dimmed: solarized::BASE01, }
}
pub fn solarized_light() -> Self {
Self {
bg: solarized::BASE3,
fg: solarized::BASE00,
selected_bg: solarized::BASE2,
selected_fg: solarized::BASE01,
directory: solarized::BLUE,
file: solarized::BASE00,
hidden: solarized::BASE1,
ecosystem: solarized::YELLOW,
ecosystem_glow: solarized::ORANGE,
git_modified: solarized::YELLOW,
git_added: solarized::GREEN,
git_deleted: solarized::RED,
git_untracked: solarized::CYAN,
indent_guide: solarized::BASE1,
branch_lines: solarized::BASE1,
dimmed: solarized::BASE1, }
}
pub fn node_color(&self, kind: NodeKind, is_hidden: bool) -> Color {
if is_hidden {
return self.hidden;
}
match kind {
NodeKind::NikaWorkflow
| NodeKind::NikaFolder
| NodeKind::SonAgent
| NodeKind::SkillFile
| NodeKind::WorkflowsFolder
| NodeKind::AgentsFolder
| NodeKind::SkillsFolder => self.ecosystem,
NodeKind::NovanetFolder
| NodeKind::BrainFolder
| NodeKind::ModelsFolder
| NodeKind::SeedFolder => solarized::MAGENTA,
NodeKind::ClaudeFolder | NodeKind::ClaudeMd => solarized::VIOLET,
NodeKind::Directory
| NodeKind::SrcFolder
| NodeKind::TestsFolder
| NodeKind::DocsFolder
| NodeKind::ExamplesFolder
| NodeKind::BenchesFolder => self.dimmed,
NodeKind::Readme | NodeKind::Changelog | NodeKind::Roadmap => self.dimmed,
NodeKind::CargoToml | NodeKind::PackageJson | NodeKind::Toml | NodeKind::Json => {
self.dimmed
}
NodeKind::Rust | NodeKind::TypeScript | NodeKind::JavaScript => self.dimmed,
NodeKind::Markdown | NodeKind::Yaml => self.dimmed,
NodeKind::GitFolder | NodeKind::NodeModules | NodeKind::TargetFolder => self.hidden,
NodeKind::File => self.dimmed,
}
}
pub fn icon_color(&self, kind: NodeKind) -> Color {
match kind {
NodeKind::NikaWorkflow
| NodeKind::SonAgent
| NodeKind::SkillFile
| NodeKind::ClaudeMd => self.ecosystem_glow,
_ => self.node_color(kind, false),
}
}
pub fn has_glow(&self, kind: NodeKind) -> bool {
matches!(
kind,
NodeKind::NikaWorkflow
| NodeKind::NikaFolder
| NodeKind::SonAgent
| NodeKind::SkillFile
| NodeKind::NovanetFolder
| NodeKind::ClaudeFolder
| NodeKind::ClaudeMd
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_solarized_dark_colors() {
let colors = TreeColors::solarized_dark();
assert_eq!(colors.bg, solarized::BASE03);
assert_eq!(colors.ecosystem, solarized::YELLOW);
}
#[test]
fn test_solarized_light_colors() {
let colors = TreeColors::solarized_light();
assert_eq!(colors.bg, solarized::BASE3);
assert_eq!(colors.ecosystem, solarized::YELLOW);
}
#[test]
fn test_ecosystem_node_color() {
let colors = TreeColors::solarized_dark();
assert_eq!(
colors.node_color(NodeKind::NikaWorkflow, false),
solarized::YELLOW
);
assert_eq!(
colors.node_color(NodeKind::SonAgent, false),
solarized::YELLOW
);
}
#[test]
fn test_hidden_node_color() {
let colors = TreeColors::solarized_dark();
assert_eq!(
colors.node_color(NodeKind::NikaWorkflow, true),
colors.hidden
);
assert_eq!(colors.node_color(NodeKind::File, true), colors.hidden);
}
#[test]
fn test_novanet_node_color() {
let colors = TreeColors::solarized_dark();
assert_eq!(
colors.node_color(NodeKind::NovanetFolder, false),
solarized::MAGENTA
);
assert_eq!(
colors.node_color(NodeKind::BrainFolder, false),
solarized::MAGENTA
);
}
#[test]
fn test_claude_node_color() {
let colors = TreeColors::solarized_dark();
assert_eq!(
colors.node_color(NodeKind::ClaudeFolder, false),
solarized::VIOLET
);
assert_eq!(
colors.node_color(NodeKind::ClaudeMd, false),
solarized::VIOLET
);
}
#[test]
fn test_has_glow() {
let colors = TreeColors::solarized_dark();
assert!(colors.has_glow(NodeKind::NikaWorkflow));
assert!(colors.has_glow(NodeKind::NovanetFolder));
assert!(colors.has_glow(NodeKind::ClaudeMd));
assert!(!colors.has_glow(NodeKind::File));
assert!(!colors.has_glow(NodeKind::Directory));
}
#[test]
fn test_icon_color_glow() {
let colors = TreeColors::solarized_dark();
assert_eq!(
colors.icon_color(NodeKind::NikaWorkflow),
colors.ecosystem_glow
);
assert_eq!(colors.icon_color(NodeKind::File), colors.dimmed);
}
}