diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b69ebfa..829344a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,9 @@ jobs: - name: Check run: cargo check --verbose + - name: Format + run: cargo fmt --all -- --check + - name: Clippy run: cargo clippy -- -D warnings diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 792d675..9ec362d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -117,7 +117,7 @@ See [docs/architecture.md](docs/architecture.md) for the full layout. Short vers ### Style -- Rust edition 2021, `cargo fmt` before commit (`rustfmt.toml` is committed). +- Rust edition 2021, `cargo fmt` before commit (default rustfmt config; CI enforces `cargo fmt --check`). - Prefer small focused commits with [Conventional Commits](https://www.conventionalcommits.org) prefixes (`feat:`, `fix:`, `docs:`, `refactor:`, `chore:`, `ci:`) so release-please can detect release-worthy changes and bump versions automatically. - Keep platform-specific code behind `#[cfg(target_os = "...")]` so every platform still compiles. - If you touch the public `colony.json` schema, also update [docs/colony-spec.md](docs/colony-spec.md) in the same PR. diff --git a/src/message.rs b/src/message.rs index c7bff7f..6d9781c 100644 --- a/src/message.rs +++ b/src/message.rs @@ -4,10 +4,10 @@ use std::path::PathBuf; use crate::ui::TutorialBounds; +use crate::github::ColonyRepo; use crate::oauth::OAuthSession; use crate::scan::Application; use crate::state::DetailTab; -use crate::github::ColonyRepo; #[derive(Debug, Clone)] pub enum Message { @@ -31,9 +31,9 @@ pub enum Message { GitHubReposFetched(Vec), GitHubError(String), GitHubRefreshRepos, - DownloadRelease(String, String), // (repo_name, platform_key) + DownloadRelease(String, String), // (repo_name, platform_key) #[allow(dead_code)] - DownloadProgress(String, f32), // (filename, progress 0.0..1.0) + DownloadProgress(String, f32), // (filename, progress 0.0..1.0) DownloadCompleted(Result<(PathBuf, String, String), String>), // (path, repo_name, tag) CancelDownload, LaunchColonyApp(PathBuf), @@ -84,7 +84,9 @@ pub enum Message { /// manual check gets an "up to date" toast (an automatic one would toast /// on every boot) and network failures surface as errors instead of the /// check lying that Colony is current. - CheckLauncherUpdate { manual: bool }, + CheckLauncherUpdate { + manual: bool, + }, /// (manual, result of the check). Ok(None) = genuinely up to date; /// Err = the check could not run (network/rate limit/bad tag). LauncherUpdateChecked(bool, Result, String>), diff --git a/src/oauth.rs b/src/oauth.rs index 9dd77f1..7c3149d 100644 --- a/src/oauth.rs +++ b/src/oauth.rs @@ -65,13 +65,14 @@ pub async fn request_device_code() -> Result { let device: DeviceCodeResponse = resp.json().await?; - tracing::info!("Enter code {} at {}", device.user_code, device.verification_uri); + tracing::info!( + "Enter code {} at {}", + device.user_code, + device.verification_uri + ); // Open browser with pre-filled user code - let url = format!( - "{}?user_code={}", - device.verification_uri, device.user_code - ); + let url = format!("{}?user_code={}", device.verification_uri, device.user_code); let _ = open::that(&url); Ok(DeviceCode { @@ -93,8 +94,7 @@ pub async fn poll_for_token(device: DeviceCode) -> Result { .unwrap_or_else(|_| reqwest::Client::new()); let poll_interval = Duration::from_secs(device.interval.max(5)); - let deadline = - std::time::Instant::now() + Duration::from_secs(device.expires_in); + let deadline = std::time::Instant::now() + Duration::from_secs(device.expires_in); let access_token = loop { tokio::time::sleep(poll_interval).await; @@ -188,7 +188,10 @@ fn token_path() -> PathBuf { } Err(_) => { let base = dirs::config_dir().unwrap_or_else(|| PathBuf::from(".")); - base.join("Colony").join("Colony").join("auth").join("github_token.json") + base.join("Colony") + .join("Colony") + .join("auth") + .join("github_token.json") } } } diff --git a/src/persistence.rs b/src/persistence.rs index 3ffd3cd..774429c 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -115,7 +115,9 @@ pub fn save_installed_version(repo_name: &str, tag: &str) -> Result<()> { /// Load the installed version tag for a repo. pub fn load_installed_version(repo_name: &str) -> Option { let path = colony_apps_dir().ok()?.join(repo_name).join(VERSION_FILE); - std::fs::read_to_string(path).ok().map(|s| s.trim().to_string()) + std::fs::read_to_string(path) + .ok() + .map(|s| s.trim().to_string()) } /// Save the resolved asset name for a repo (when using filePattern). @@ -128,7 +130,9 @@ pub fn save_installed_asset(repo_name: &str, filename: &str) -> Result<()> { /// Load the saved resolved asset name for a repo. pub fn load_installed_asset(repo_name: &str) -> Option { let path = colony_apps_dir().ok()?.join(repo_name).join(ASSET_FILE); - std::fs::read_to_string(path).ok().map(|s| s.trim().to_string()) + std::fs::read_to_string(path) + .ok() + .map(|s| s.trim().to_string()) } fn repos_cache_path() -> Result { @@ -285,7 +289,7 @@ pub fn save_scan_cache(apps: &[CachedApp]) -> Result<()> { mod tests { use super::*; -#[test] + #[test] fn colony_apps_dir_returns_path() { let dir = colony_apps_dir(); assert!(dir.is_ok()); diff --git a/src/scan.rs b/src/scan.rs index 01d4804..d09cf37 100644 --- a/src/scan.rs +++ b/src/scan.rs @@ -284,7 +284,10 @@ fn default_colony_dirs() -> Vec { let mut dirs = Vec::new(); if let Ok(home) = std::env::var("HOME") { - dirs.push(PathBuf::from(format!("{}/.local/share/colony/applications", home))); + dirs.push(PathBuf::from(format!( + "{}/.local/share/colony/applications", + home + ))); } dirs @@ -467,48 +470,75 @@ fn categorize_windows_app(name: &str, exec: &str) -> AppCategory { let lower_name = name.to_lowercase(); let lower_exec = exec.to_lowercase(); - if lower_name.contains("code") || lower_name.contains("studio") - || lower_name.contains("developer") || lower_exec.contains("ide") - || lower_name.contains("python") || lower_name.contains("node") - || lower_name.contains("git") || lower_name.contains("terminal") + if lower_name.contains("code") + || lower_name.contains("studio") + || lower_name.contains("developer") + || lower_exec.contains("ide") + || lower_name.contains("python") + || lower_name.contains("node") + || lower_name.contains("git") + || lower_name.contains("terminal") { AppCategory::Development - } else if lower_name.contains("photoshop") || lower_name.contains("gimp") - || lower_name.contains("paint") || lower_name.contains("photo") - || lower_name.contains("image") || lower_name.contains("draw") + } else if lower_name.contains("photoshop") + || lower_name.contains("gimp") + || lower_name.contains("paint") + || lower_name.contains("photo") + || lower_name.contains("image") + || lower_name.contains("draw") { AppCategory::Graphics - } else if lower_name.contains("chrome") || lower_name.contains("firefox") - || lower_name.contains("edge") || lower_name.contains("browser") - || lower_name.contains("mail") || lower_name.contains("outlook") - || lower_name.contains("teams") || lower_name.contains("slack") - || lower_name.contains("discord") || lower_name.contains("zoom") + } else if lower_name.contains("chrome") + || lower_name.contains("firefox") + || lower_name.contains("edge") + || lower_name.contains("browser") + || lower_name.contains("mail") + || lower_name.contains("outlook") + || lower_name.contains("teams") + || lower_name.contains("slack") + || lower_name.contains("discord") + || lower_name.contains("zoom") { AppCategory::Network - } else if lower_name.contains("word") || lower_name.contains("excel") - || lower_name.contains("powerpoint") || lower_name.contains("office") - || lower_name.contains("libre") || lower_name.contains("calc") - || lower_name.contains("writer") || lower_name.contains("document") + } else if lower_name.contains("word") + || lower_name.contains("excel") + || lower_name.contains("powerpoint") + || lower_name.contains("office") + || lower_name.contains("libre") + || lower_name.contains("calc") + || lower_name.contains("writer") + || lower_name.contains("document") { AppCategory::Office - } else if lower_name.contains("spotify") || lower_name.contains("vlc") - || lower_name.contains("media") || lower_name.contains("player") - || lower_name.contains("music") || lower_name.contains("video") + } else if lower_name.contains("spotify") + || lower_name.contains("vlc") + || lower_name.contains("media") + || lower_name.contains("player") + || lower_name.contains("music") + || lower_name.contains("video") || lower_name.contains("audio") { AppCategory::Multimedia - } else if lower_name.contains("settings") || lower_name.contains("control") - || lower_name.contains("system") || lower_name.contains("config") - || lower_name.contains("manager") || lower_name.contains("monitor") + } else if lower_name.contains("settings") + || lower_name.contains("control") + || lower_name.contains("system") + || lower_name.contains("config") + || lower_name.contains("manager") + || lower_name.contains("monitor") { AppCategory::System - } else if lower_name.contains("notepad") || lower_name.contains("calculator") - || lower_name.contains("util") || lower_name.contains("tool") - || lower_name.contains("7-zip") || lower_name.contains("winrar") + } else if lower_name.contains("notepad") + || lower_name.contains("calculator") + || lower_name.contains("util") + || lower_name.contains("tool") + || lower_name.contains("7-zip") + || lower_name.contains("winrar") { AppCategory::Utility - } else if lower_name.contains("game") || lower_name.contains("steam") - || lower_name.contains("epic") || lower_name.contains("play") + } else if lower_name.contains("game") + || lower_name.contains("steam") + || lower_name.contains("epic") + || lower_name.contains("play") || lower_exec.contains("game") { AppCategory::Game @@ -597,17 +627,35 @@ fn categorize_linux_app(categories: &str) -> AppCategory { if cats.iter().any(|c| matches!(*c, "Development" | "IDE")) { AppCategory::Development - } else if cats.iter().any(|c| matches!(*c, "Graphics" | "Photography" | "2DGraphics" | "3DGraphics")) { + } else if cats + .iter() + .any(|c| matches!(*c, "Graphics" | "Photography" | "2DGraphics" | "3DGraphics")) + { AppCategory::Graphics - } else if cats.iter().any(|c| matches!(*c, "Network" | "WebBrowser" | "Email" | "Chat")) { + } else if cats + .iter() + .any(|c| matches!(*c, "Network" | "WebBrowser" | "Email" | "Chat")) + { AppCategory::Network - } else if cats.iter().any(|c| matches!(*c, "Office" | "WordProcessor" | "Spreadsheet")) { + } else if cats + .iter() + .any(|c| matches!(*c, "Office" | "WordProcessor" | "Spreadsheet")) + { AppCategory::Office - } else if cats.iter().any(|c| matches!(*c, "AudioVideo" | "Audio" | "Video" | "Player")) { + } else if cats + .iter() + .any(|c| matches!(*c, "AudioVideo" | "Audio" | "Video" | "Player")) + { AppCategory::Multimedia - } else if cats.iter().any(|c| matches!(*c, "System" | "Settings" | "Monitor")) { + } else if cats + .iter() + .any(|c| matches!(*c, "System" | "Settings" | "Monitor")) + { AppCategory::System - } else if cats.iter().any(|c| matches!(*c, "Utility" | "FileManager" | "Archiving")) { + } else if cats + .iter() + .any(|c| matches!(*c, "Utility" | "FileManager" | "Archiving")) + { AppCategory::Utility } else if cats.iter().any(|c| matches!(*c, "Game")) { AppCategory::Game @@ -679,33 +727,55 @@ fn parse_macos_app(path: &Path) -> Option { #[cfg(target_os = "macos")] fn categorize_macos_app(name: &str) -> AppCategory { let lower = name.to_lowercase(); - if lower.contains("xcode") || lower.contains("terminal") || lower.contains("code") - || lower.contains("developer") || lower.contains("git") + if lower.contains("xcode") + || lower.contains("terminal") + || lower.contains("code") + || lower.contains("developer") + || lower.contains("git") { AppCategory::Development - } else if lower.contains("preview") || lower.contains("photo") - || lower.contains("image") || lower.contains("sketch") || lower.contains("pixelmator") + } else if lower.contains("preview") + || lower.contains("photo") + || lower.contains("image") + || lower.contains("sketch") + || lower.contains("pixelmator") { AppCategory::Graphics - } else if lower.contains("safari") || lower.contains("chrome") || lower.contains("firefox") - || lower.contains("mail") || lower.contains("messages") || lower.contains("slack") - || lower.contains("discord") || lower.contains("zoom") + } else if lower.contains("safari") + || lower.contains("chrome") + || lower.contains("firefox") + || lower.contains("mail") + || lower.contains("messages") + || lower.contains("slack") + || lower.contains("discord") + || lower.contains("zoom") { AppCategory::Network - } else if lower.contains("pages") || lower.contains("numbers") || lower.contains("keynote") - || lower.contains("word") || lower.contains("excel") + } else if lower.contains("pages") + || lower.contains("numbers") + || lower.contains("keynote") + || lower.contains("word") + || lower.contains("excel") { AppCategory::Office - } else if lower.contains("music") || lower.contains("quicktime") || lower.contains("vlc") - || lower.contains("spotify") || lower.contains("garageband") + } else if lower.contains("music") + || lower.contains("quicktime") + || lower.contains("vlc") + || lower.contains("spotify") + || lower.contains("garageband") { AppCategory::Multimedia - } else if lower.contains("system") || lower.contains("settings") || lower.contains("preferences") - || lower.contains("monitor") || lower.contains("disk utility") + } else if lower.contains("system") + || lower.contains("settings") + || lower.contains("preferences") + || lower.contains("monitor") + || lower.contains("disk utility") { AppCategory::System - } else if lower.contains("calculator") || lower.contains("archive") - || lower.contains("utility") || lower.contains("finder") + } else if lower.contains("calculator") + || lower.contains("archive") + || lower.contains("utility") + || lower.contains("finder") { AppCategory::Utility } else if lower.contains("game") || lower.contains("chess") || lower.contains("steam") { @@ -731,19 +801,28 @@ mod tests { #[test] fn expand_env_vars_with_unset_var() { std::env::remove_var("COLONY_UNSET_VAR"); - assert_eq!(expand_env_vars("${COLONY_UNSET_VAR}/bin"), "${COLONY_UNSET_VAR}/bin"); + assert_eq!( + expand_env_vars("${COLONY_UNSET_VAR}/bin"), + "${COLONY_UNSET_VAR}/bin" + ); } #[test] fn expand_env_vars_windows_style() { std::env::set_var("COLONY_TEST_WIN", "C:\\Users"); - assert_eq!(expand_env_vars("%COLONY_TEST_WIN%\\test"), "C:\\Users\\test"); + assert_eq!( + expand_env_vars("%COLONY_TEST_WIN%\\test"), + "C:\\Users\\test" + ); std::env::remove_var("COLONY_TEST_WIN"); } #[test] fn expand_env_vars_no_vars() { - assert_eq!(expand_env_vars("/usr/share/applications"), "/usr/share/applications"); + assert_eq!( + expand_env_vars("/usr/share/applications"), + "/usr/share/applications" + ); } #[test] @@ -770,25 +849,37 @@ mod tests { #[cfg(not(windows))] #[test] fn categorize_development() { - assert_eq!(categorize_linux_app("Development;IDE;"), AppCategory::Development); + assert_eq!( + categorize_linux_app("Development;IDE;"), + AppCategory::Development + ); } #[cfg(not(windows))] #[test] fn categorize_graphics() { - assert_eq!(categorize_linux_app("Graphics;Photography;"), AppCategory::Graphics); + assert_eq!( + categorize_linux_app("Graphics;Photography;"), + AppCategory::Graphics + ); } #[cfg(not(windows))] #[test] fn categorize_network() { - assert_eq!(categorize_linux_app("Network;WebBrowser;"), AppCategory::Network); + assert_eq!( + categorize_linux_app("Network;WebBrowser;"), + AppCategory::Network + ); } #[cfg(not(windows))] #[test] fn categorize_multimedia() { - assert_eq!(categorize_linux_app("AudioVideo;Player;"), AppCategory::Multimedia); + assert_eq!( + categorize_linux_app("AudioVideo;Player;"), + AppCategory::Multimedia + ); } #[cfg(not(windows))] @@ -814,7 +905,10 @@ mod tests { #[cfg(not(windows))] #[test] fn clean_exec_preserves_args() { - assert_eq!(clean_exec("/usr/bin/app --flag value"), "/usr/bin/app --flag value"); + assert_eq!( + clean_exec("/usr/bin/app --flag value"), + "/usr/bin/app --flag value" + ); } #[cfg(not(windows))] diff --git a/src/sections.rs b/src/sections.rs index 3535c17..cce8c4e 100644 --- a/src/sections.rs +++ b/src/sections.rs @@ -117,10 +117,16 @@ fn load_sections_from_source() -> Option> { tracing::info!("Loaded {} sections from {}", sections.len(), path.display()); return Some(sections); } - tracing::warn!("No usable sections in {}; using embedded config.", path.display()); + tracing::warn!( + "No usable sections in {}; using embedded config.", + path.display() + ); } Err(error) => { - tracing::warn!("Failed to read {}: {error}; using embedded config.", path.display()); + tracing::warn!( + "Failed to read {}: {error}; using embedded config.", + path.display() + ); } } } @@ -140,8 +146,10 @@ fn load_sections_from_source() -> Option> { fn parse_sections(contents: &str) -> Option> { match serde_json::from_str::>(contents) { Ok(configs) => { - let sections: Vec
= - configs.into_iter().map(SectionConfig::into_section).collect(); + let sections: Vec
= configs + .into_iter() + .map(SectionConfig::into_section) + .collect(); if sections.is_empty() { None } else { @@ -188,9 +196,7 @@ fn ensure_favorites(mut sections: Vec
) -> Vec
{ fn parse_origin(origin: Option<&str>) -> OriginFilter { match origin.map(|value| value.trim().to_lowercase()) { Some(value) if value == "windows" || value == "windows_only" => OriginFilter::WindowsOnly, - Some(value) if value == "non_windows" || value == "nonwindows" => { - OriginFilter::NonWindows - } + Some(value) if value == "non_windows" || value == "nonwindows" => OriginFilter::NonWindows, Some(value) if value == "linux" || value == "linux_only" => OriginFilter::ExternalOnly, Some(value) if value == "colony" => OriginFilter::ColonyOnly, Some(value) if value == "external" => OriginFilter::ExternalOnly, @@ -345,17 +351,50 @@ mod tests { #[test] fn parse_category_known() { - assert!(matches!(parse_category(Some("development")), Some(AppCategory::Development))); - assert!(matches!(parse_category(Some("graphics")), Some(AppCategory::Graphics))); - assert!(matches!(parse_category(Some("network")), Some(AppCategory::Network))); - assert!(matches!(parse_category(Some("office")), Some(AppCategory::Office))); - assert!(matches!(parse_category(Some("multimedia")), Some(AppCategory::Multimedia))); - assert!(matches!(parse_category(Some("system")), Some(AppCategory::System))); - assert!(matches!(parse_category(Some("utility")), Some(AppCategory::Utility))); - assert!(matches!(parse_category(Some("utilities")), Some(AppCategory::Utility))); - assert!(matches!(parse_category(Some("game")), Some(AppCategory::Game))); - assert!(matches!(parse_category(Some("games")), Some(AppCategory::Game))); - assert!(matches!(parse_category(Some("other")), Some(AppCategory::Other))); + assert!(matches!( + parse_category(Some("development")), + Some(AppCategory::Development) + )); + assert!(matches!( + parse_category(Some("graphics")), + Some(AppCategory::Graphics) + )); + assert!(matches!( + parse_category(Some("network")), + Some(AppCategory::Network) + )); + assert!(matches!( + parse_category(Some("office")), + Some(AppCategory::Office) + )); + assert!(matches!( + parse_category(Some("multimedia")), + Some(AppCategory::Multimedia) + )); + assert!(matches!( + parse_category(Some("system")), + Some(AppCategory::System) + )); + assert!(matches!( + parse_category(Some("utility")), + Some(AppCategory::Utility) + )); + assert!(matches!( + parse_category(Some("utilities")), + Some(AppCategory::Utility) + )); + assert!(matches!( + parse_category(Some("game")), + Some(AppCategory::Game) + )); + assert!(matches!( + parse_category(Some("games")), + Some(AppCategory::Game) + )); + assert!(matches!( + parse_category(Some("other")), + Some(AppCategory::Other) + )); } #[test] @@ -372,8 +411,14 @@ mod tests { #[test] fn parse_origin_known() { - assert!(matches!(parse_origin(Some("windows")), OriginFilter::WindowsOnly)); - assert!(matches!(parse_origin(Some("colony")), OriginFilter::ColonyOnly)); + assert!(matches!( + parse_origin(Some("windows")), + OriginFilter::WindowsOnly + )); + assert!(matches!( + parse_origin(Some("colony")), + OriginFilter::ColonyOnly + )); assert!(matches!(parse_origin(Some("any")), OriginFilter::Any)); assert!(matches!(parse_origin(Some("all")), OriginFilter::Any)); assert!(matches!(parse_origin(None), OriginFilter::Any)); diff --git a/src/ui/app_grid.rs b/src/ui/app_grid.rs index 8dc2631..1da9a94 100644 --- a/src/ui/app_grid.rs +++ b/src/ui/app_grid.rs @@ -1,12 +1,14 @@ use iced::font::Weight; -use iced::widget::{button, column, container, row, scrollable, stack, text, text_input, Column, Row}; +use iced::widget::{ + button, column, container, row, scrollable, stack, text, text_input, Column, Row, +}; use iced::{Color, Element, Fill, Length}; use crate::github::ColonyRepo; +use crate::message::Message; use crate::scan::{AppCategory, Application}; -use crate::ui::theme::{self, Palette}; use crate::state::App; -use crate::message::Message; +use crate::ui::theme::{self, Palette}; /// Filled Material-Design hexagon glyph from the embedded Nerd Font — the /// Colony "cell" that is the app tile, the brand mark, and the status badge. @@ -71,7 +73,11 @@ fn build_card_grid<'a>(cards: Vec>, cols: usize) -> Column< for card in cards { current.push(card); if current.len() == cols { - rows.push(Row::with_children(std::mem::take(&mut current)).spacing(12).into()); + rows.push( + Row::with_children(std::mem::take(&mut current)) + .spacing(12) + .into(), + ); } } if !current.is_empty() { @@ -137,7 +143,12 @@ impl App { /// The 54x54 card tile: the app's real decoded icon when we have one, /// otherwise the tinted category hexagon. Clones a cheap (Arc-backed) handle /// out of state — never decodes in `view()`. - fn icon_tile<'a>(&self, repo_name: &str, tint: Color, glyph: &'static str) -> Element<'a, Message> { + fn icon_tile<'a>( + &self, + repo_name: &str, + tint: Color, + glyph: &'static str, + ) -> Element<'a, Message> { if let Some(handle) = self.app_icons.get(repo_name) { return container( iced::widget::image(handle.clone()) @@ -188,27 +199,49 @@ impl App { let version = crate::github::load_installed_version(&repo.name); if let Some(new_tag) = self.available_updates.get(&repo.name) { let head = row![ - text(HEX_FILLED).size(self.sz(11)).font(self.app_font()).color(Palette::WARNING()), - text(crate::i18n::t("status_update")).size(self.sz(12)).font(self.app_font()).color(Palette::WARNING()), + text(HEX_FILLED) + .size(self.sz(11)) + .font(self.app_font()) + .color(Palette::WARNING()), + text(crate::i18n::t("status_update")) + .size(self.sz(12)) + .font(self.app_font()) + .color(Palette::WARNING()), ] .spacing(6) .align_y(iced::Alignment::Center); - let delta = text(format!("{} → {}", version.as_deref().unwrap_or("?"), new_tag)) - .size(self.sz(11)) - .font(self.app_font()) - .color(Palette::TEXT_DIMMER()); - column![head, delta].spacing(3).align_x(iced::Alignment::End).into() + let delta = text(format!( + "{} → {}", + version.as_deref().unwrap_or("?"), + new_tag + )) + .size(self.sz(11)) + .font(self.app_font()) + .color(Palette::TEXT_DIMMER()); + column![head, delta] + .spacing(3) + .align_x(iced::Alignment::End) + .into() } else { let head = row![ - text(HEX_FILLED).size(self.sz(11)).font(self.app_font()).color(Palette::SUCCESS()), - text(crate::i18n::t("status_installed")).size(self.sz(12)).font(self.app_font()).color(Palette::SUCCESS()), + text(HEX_FILLED) + .size(self.sz(11)) + .font(self.app_font()) + .color(Palette::SUCCESS()), + text(crate::i18n::t("status_installed")) + .size(self.sz(12)) + .font(self.app_font()) + .color(Palette::SUCCESS()), ] .spacing(6) .align_y(iced::Alignment::Center); let mut col = column![head].spacing(3).align_x(iced::Alignment::End); if let Some(v) = version { col = col.push( - text(v).size(self.sz(11)).font(self.app_font()).color(Palette::TEXT_DIMMER()), + text(v) + .size(self.sz(11)) + .font(self.app_font()) + .color(Palette::TEXT_DIMMER()), ); } col.into() @@ -291,18 +324,25 @@ impl App { // Show search result count when query is active let status_text = if !self.search_query.is_empty() { - let filtered_count = self.filtered_applications().len() + self.filtered_colony_repos().len(); - crate::i18n::t_fmt("n_results_found", &[ - ("count", &filtered_count.to_string()), - ("query", &self.search_query), - ]) + let filtered_count = + self.filtered_applications().len() + self.filtered_colony_repos().len(); + crate::i18n::t_fmt( + "n_results_found", + &[ + ("count", &filtered_count.to_string()), + ("query", &self.search_query), + ], + ) } else { self.status_message.clone() }; // Show spinner indicator for async operations let spinner = if self.is_scanning || self.is_checking_updates || self.is_fetching_repos { - text("\u{f110} ").size(self.sz(12)).font(self.app_font()).color(Palette::ACCENT()) + text("\u{f110} ") + .size(self.sz(12)) + .font(self.app_font()) + .color(Palette::ACCENT()) } else { text("").size(self.sz(12)) }; @@ -321,14 +361,10 @@ impl App { .width(Fill) .height(Fill); - let content = column![ - header, - container(text("")).height(16), - app_grid - ] - .spacing(8) - .padding(24) - .width(Fill); + let content = column![header, container(text("")).height(16), app_grid] + .spacing(8) + .padding(24) + .width(Fill); container(content) .style(|_theme| container::Style { @@ -343,9 +379,7 @@ impl App { pub(crate) fn view_app_grid(&self) -> Element<'_, Message> { let selected_section = self.sections.get(self.selected_section); let is_favorites = selected_section.map(|s| s.is_favorites).unwrap_or(false); - let has_category_filter = selected_section - .and_then(|s| s.category()) - .is_some(); + let has_category_filter = selected_section.and_then(|s| s.category()).is_some(); // If a category section is selected (not All/Favorites), show Colony repos for that category if has_category_filter && !is_favorites { @@ -377,7 +411,10 @@ impl App { }; return container( column![ - text("\u{f002}").size(self.sz(32)).font(self.app_font()).color(Palette::TEXT_DIMMEST()), + text("\u{f002}") + .size(self.sz(32)) + .font(self.app_font()) + .color(Palette::TEXT_DIMMEST()), container(text("")).height(12), text(empty_msg) .size(self.sz(16)) @@ -404,7 +441,9 @@ impl App { for app in &filtered { all_cards.push(self.view_app_card(app)); } - scrollable(build_card_grid(all_cards, cols)).height(Fill).into() + scrollable(build_card_grid(all_cards, cols)) + .height(Fill) + .into() }) .into() } @@ -517,6 +556,11 @@ impl App { .align_y(iced::Alignment::Center) .width(Fill); - self.cell_shell(content.into(), Message::LaunchApp(app.exec.clone()), false, tint) + self.cell_shell( + content.into(), + Message::LaunchApp(app.exec.clone()), + false, + tint, + ) } } diff --git a/src/ui/detail.rs b/src/ui/detail.rs index 8cd42be..e9f3679 100644 --- a/src/ui/detail.rs +++ b/src/ui/detail.rs @@ -1,13 +1,11 @@ use iced::font::Weight; -use iced::widget::{ - button, column, container, markdown, rich_text, row, scrollable, text, Row, -}; +use iced::widget::{button, column, container, markdown, rich_text, row, scrollable, text, Row}; use iced::{Element, Fill, Length}; use crate::github::{self, ColonyRepo}; -use crate::ui::theme::Palette; -use crate::state::{App, DetailTab, capitalize_platform}; use crate::message::Message; +use crate::state::{capitalize_platform, App, DetailTab}; +use crate::ui::theme::Palette; /// Custom markdown viewer: same defaults as iced, minus the internal /// horizontal `scrollable` that iced wraps around code blocks. That inner @@ -50,9 +48,13 @@ impl<'a> markdown::Viewer<'a, Message> for ColonyMdViewer { impl App { pub(crate) fn view_colony_detail<'a>(&'a self, repo: &'a ColonyRepo) -> Element<'a, Message> { - let back_button = button(text(crate::i18n::t("back")).size(self.sz(13)).font(self.app_font())) - .on_press(Message::ColonyRepoBack) - .padding([8, 16]); + let back_button = button( + text(crate::i18n::t("back")) + .size(self.sz(13)) + .font(self.app_font()), + ) + .on_press(Message::ColonyRepoBack) + .padding([8, 16]); let title = text(&repo.name) .size(self.sz(24)) @@ -69,27 +71,27 @@ impl App { for (tab_val, label) in tabs { let is_selected = self.detail_tab == tab_val; tab_buttons.push( - button( - text(label) - .size(self.sz(13)) - .font(self.app_font()) - ) - .on_press(Message::DetailTabSelected(tab_val)) - .padding([6, 14]) - .style(move |_theme, status| { - let bg = match status { - _ if is_selected => Palette::ACCENT(), - button::Status::Hovered => Palette::BG_CARD_HOVER(), - _ => iced::Color::TRANSPARENT, - }; - button::Style { - background: Some(bg.into()), - text_color: if is_selected { Palette::TEXT_PRIMARY() } else { Palette::TEXT_MUTED() }, - border: iced::Border::default().rounded(6), - ..Default::default() - } - }) - .into(), + button(text(label).size(self.sz(13)).font(self.app_font())) + .on_press(Message::DetailTabSelected(tab_val)) + .padding([6, 14]) + .style(move |_theme, status| { + let bg = match status { + _ if is_selected => Palette::ACCENT(), + button::Status::Hovered => Palette::BG_CARD_HOVER(), + _ => iced::Color::TRANSPARENT, + }; + button::Style { + background: Some(bg.into()), + text_color: if is_selected { + Palette::TEXT_PRIMARY() + } else { + Palette::TEXT_MUTED() + }, + border: iced::Border::default().rounded(6), + ..Default::default() + } + }) + .into(), ); } let tab_bar = Row::with_children(tab_buttons) @@ -114,24 +116,31 @@ impl App { .color(Palette::TEXT_MUTED()) .into() } else { - crate::ui::markdown_blocks::view( - &self.detail_blocks, - md_settings, - &ColonyMdViewer, - ) + crate::ui::markdown_blocks::view(&self.detail_blocks, md_settings, &ColonyMdViewer) }; - let language = text(crate::i18n::t_fmt("language_label", &[("lang", &repo.language)])) - .size(self.sz(12)) - .font(self.app_font()) - .color(Palette::TEXT_MUTED()); + let language = text(crate::i18n::t_fmt( + "language_label", + &[("lang", &repo.language)], + )) + .size(self.sz(12)) + .font(self.app_font()) + .color(Palette::TEXT_MUTED()); // Favorite button — FontAwesome 6 Free, solid/regular variant for filled/empty. // Same codepoint \u{f005} in both variants; the weight picks the glyph. let is_fav = self.is_favorite(&repo.name); - let fav_color = if is_fav { Palette::WARNING() } else { Palette::TEXT_DIM() }; + let fav_color = if is_fav { + Palette::WARNING() + } else { + Palette::TEXT_DIM() + }; let fav_font = iced::Font { - weight: if is_fav { Weight::Black } else { Weight::Normal }, + weight: if is_fav { + Weight::Black + } else { + Weight::Normal + }, ..iced::Font::with_name(crate::state::FA_FONT_NAME) }; let fav_btn = button( @@ -169,9 +178,8 @@ impl App { }) .collect(); - let mut footer_items: Vec> = vec![ - container(text("")).width(Fill).into(), - ]; + let mut footer_items: Vec> = + vec![container(text("")).width(Fill).into()]; for pt in platform_labels { footer_items.push(pt); } @@ -187,13 +195,20 @@ impl App { let action_row = if let Some(app_path) = installed_path { // App is installed — show Launch + Update buttons, and uninstall trash button - let launch_label = format!("\u{f04b} {}", crate::i18n::t_fmt("launch", &[("name", &repo.manifest.name)])); + let launch_label = format!( + "\u{f04b} {}", + crate::i18n::t_fmt("launch", &[("name", &repo.manifest.name)]) + ); let launch_btn = button( text(launch_label) .size(self.sz(14)) .font(self.app_font_with_weight(Weight::Medium)), ) - .on_press_maybe(if self.is_downloading { None } else { Some(Message::LaunchColonyApp(app_path)) }) + .on_press_maybe(if self.is_downloading { + None + } else { + Some(Message::LaunchColonyApp(app_path)) + }) .padding([12, 24]) .style(|_theme, status| { let bg = match status { @@ -216,7 +231,11 @@ impl App { .size(self.sz(13)) .font(self.app_font()), ) - .on_press_maybe(if self.is_downloading { None } else { Some(Message::DownloadRelease(repo_name, platform_key)) }) + .on_press_maybe(if self.is_downloading { + None + } else { + Some(Message::DownloadRelease(repo_name, platform_key)) + }) .padding([10, 20]) .style(|_theme, status| { let bg = match status { @@ -241,7 +260,12 @@ impl App { .center(), ) .on_press(Message::ConfirmUninstall(uninstall_repo_name)) - .padding(iced::Padding { top: 10.0, right: 14.0, bottom: 10.0, left: 12.0 }) + .padding(iced::Padding { + top: 10.0, + right: 14.0, + bottom: 10.0, + left: 12.0, + }) .style(|_theme, status| { let bg = match status { button::Status::Hovered => Palette::BTN_TRASH_HOVER(), @@ -276,7 +300,11 @@ impl App { .size(self.sz(14)) .font(self.app_font_with_weight(Weight::Medium)), ) - .on_press_maybe(if is_dl { None } else { Some(Message::DownloadRelease(repo_name, platform_key)) }) + .on_press_maybe(if is_dl { + None + } else { + Some(Message::DownloadRelease(repo_name, platform_key)) + }) .padding([12, 24]) .style(|_theme, status| { let bg = match status { @@ -291,7 +319,11 @@ impl App { ..Default::default() } }); - Row::new().push(spacer).push(dl_btn).spacing(12).align_y(iced::Alignment::Center) + Row::new() + .push(spacer) + .push(dl_btn) + .spacing(12) + .align_y(iced::Alignment::Center) } else { let no_release = text(crate::i18n::t("no_release_platform")) .size(self.sz(12)) @@ -314,9 +346,7 @@ impl App { .height(Length::Shrink) .padding([16, 24]); - let body = scrollable(desc_container) - .width(Fill) - .height(Fill); + let body = scrollable(desc_container).width(Fill).height(Fill); let detail = column![ header, diff --git a/src/ui/markdown_blocks.rs b/src/ui/markdown_blocks.rs index dd22067..087c5d3 100644 --- a/src/ui/markdown_blocks.rs +++ b/src/ui/markdown_blocks.rs @@ -13,7 +13,7 @@ //! Everything else flows through iced's `markdown::view_with` using a //! caller-supplied `Viewer`. use iced::font::Weight; -use iced::widget::{column, container, markdown, row, text, table as tbl, Row}; +use iced::widget::{column, container, markdown, row, table as tbl, text, Row}; use iced::{alignment, Color, Element, Length}; use crate::message::Message; @@ -115,10 +115,7 @@ fn is_pipe_separator(line: &str) -> bool { fn split_pipe_row(line: &str) -> Vec { let trimmed = line.trim_start_matches('|').trim_end_matches('|'); - trimmed - .split('|') - .map(|s| s.trim().to_string()) - .collect() + trimmed.split('|').map(|s| s.trim().to_string()).collect() } /// Detect a contiguous block of lines that are each exclusively a @@ -155,30 +152,33 @@ fn try_parse_badges(lines: &[&str]) -> Option<(Vec, usize)> { /// when the image URL is a shields.io `/badge/{label}-{value}-{color}`. fn parse_badge_line(line: &str) -> Option { // Find the `![` of the image. - let (img_start, link): (usize, Option) = if let Some(_stripped) = - line.strip_prefix("[![") - { - // Wrapped form: [![alt](img)](link) - // Locate the closing `)` of the image, then the opening `(` of link. - let after = &line[3..]; // after [![ - // Find the first `](` which ends the alt text. - let alt_end = after.find("](")?; - let rest = &after[alt_end + 2..]; // after ]( - let img_end = find_matching_paren(rest)?; - let img_url = &rest[..img_end]; - let after_img = &rest[img_end + 1..]; // after ) - let after_img = after_img.strip_prefix("](")?; - let link_end = find_matching_paren(after_img)?; - let link = after_img[..link_end].to_string(); - // Compute img_start for the unwrapped-image path (unused here, but keeps symmetry). - let _ = img_start_placeholder(); - return parse_shields_url(img_url) - .map(|(label, value, color)| Badge { label, value, color_hex: color, link: Some(link) }); - } else if line.starts_with("![") { - (0, None) - } else { - return None; - }; + let (img_start, link): (usize, Option) = + if let Some(_stripped) = line.strip_prefix("[![") { + // Wrapped form: [![alt](img)](link) + // Locate the closing `)` of the image, then the opening `(` of link. + let after = &line[3..]; // after [![ + // Find the first `](` which ends the alt text. + let alt_end = after.find("](")?; + let rest = &after[alt_end + 2..]; // after ]( + let img_end = find_matching_paren(rest)?; + let img_url = &rest[..img_end]; + let after_img = &rest[img_end + 1..]; // after ) + let after_img = after_img.strip_prefix("](")?; + let link_end = find_matching_paren(after_img)?; + let link = after_img[..link_end].to_string(); + // Compute img_start for the unwrapped-image path (unused here, but keeps symmetry). + let _ = img_start_placeholder(); + return parse_shields_url(img_url).map(|(label, value, color)| Badge { + label, + value, + color_hex: color, + link: Some(link), + }); + } else if line.starts_with("![") { + (0, None) + } else { + return None; + }; let _ = img_start; // Unwrapped image form: ![alt](img) let after = line.strip_prefix("![")?; @@ -194,7 +194,9 @@ fn parse_badge_line(line: &str) -> Option { }) } -fn img_start_placeholder() -> usize { 0 } +fn img_start_placeholder() -> usize { + 0 +} fn find_matching_paren(s: &str) -> Option { let mut depth = 1i32; @@ -310,14 +312,8 @@ where } fn view_badges(badges: &[Badge]) -> Element<'_, Message> { - let children: Vec> = badges - .iter() - .map(badge_pill) - .collect(); - Row::with_children(children) - .spacing(6) - .wrap() - .into() + let children: Vec> = badges.iter().map(badge_pill).collect(); + Row::with_children(children).spacing(6).wrap().into() } fn badge_pill(b: &Badge) -> Element<'_, Message> { @@ -332,9 +328,7 @@ fn badge_pill(b: &Badge) -> Element<'_, Message> { .style(move |_theme| container::Style { background: Some(Palette::BG_CARD().into()), border: iced::Border { - radius: iced::border::Radius::new(0) - .top_left(4) - .bottom_left(4), + radius: iced::border::Radius::new(0).top_left(4).bottom_left(4), ..Default::default() }, ..Default::default() @@ -344,15 +338,12 @@ fn badge_pill(b: &Badge) -> Element<'_, Message> { .style(move |_theme| container::Style { background: Some(color.into()), border: iced::Border { - radius: iced::border::Radius::new(0) - .top_right(4) - .bottom_right(4), + radius: iced::border::Radius::new(0).top_right(4).bottom_right(4), ..Default::default() }, ..Default::default() }); - let pill: Element<'_, Message> = - row![label_box, value_box].spacing(0).into(); + let pill: Element<'_, Message> = row![label_box, value_box].spacing(0).into(); if let Some(link) = &b.link { let url = link.clone(); @@ -395,10 +386,7 @@ fn view_table(data: &TableData) -> Element<'_, Message> { .color(Palette::TEXT_PRIMARY()), move |row: Vec| -> Element<'_, Message> { let cell = row.get(h_idx).cloned().unwrap_or_default(); - text(cell) - .size(13) - .color(Palette::TEXT_SECONDARY()) - .into() + text(cell).size(13).color(Palette::TEXT_SECONDARY()).into() }, ) .align_x(alignment::Horizontal::Left) @@ -468,7 +456,8 @@ mod tests { #[test] fn parse_shields_url_label_value_color() { let (label, value, color) = - parse_shields_url("https://img.shields.io/badge/build-passing-brightgreen.svg").unwrap(); + parse_shields_url("https://img.shields.io/badge/build-passing-brightgreen.svg") + .unwrap(); assert_eq!(label, "build"); assert_eq!(value, "passing"); assert_eq!(color, [0x4c, 0xc1, 0x40]); diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 1488733..35079c8 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,10 +1,10 @@ -mod sidebar; mod app_grid; mod detail; mod github_panel; pub mod markdown_blocks; mod settings; +mod sidebar; pub mod theme; pub(crate) mod tutorial; -pub(crate) use tutorial::{TUTORIAL_LAST_STEP, TutorialBounds, fetch_bounds_task}; +pub(crate) use tutorial::{fetch_bounds_task, TutorialBounds, TUTORIAL_LAST_STEP}; diff --git a/src/ui/sidebar.rs b/src/ui/sidebar.rs index 4815523..48fe99e 100644 --- a/src/ui/sidebar.rs +++ b/src/ui/sidebar.rs @@ -3,10 +3,10 @@ use iced::widget::{button, column, container, row, scrollable, text, Column}; use iced::{Element, Fill, Length}; +use crate::message::Message; use crate::sections::Section; -use crate::ui::theme::Palette; use crate::state::{App, GitHubState}; -use crate::message::Message; +use crate::ui::theme::Palette; impl App { pub(crate) fn view_sidebar(&self) -> Element<'_, Message> { @@ -17,7 +17,11 @@ impl App { text("\u{f013}") .size(self.sz(14)) .font(self.app_font()) - .color(if self.show_settings { Palette::TEXT_PRIMARY() } else { Palette::TEXT_DIMMER() }), + .color(if self.show_settings { + Palette::TEXT_PRIMARY() + } else { + Palette::TEXT_DIMMER() + }), ] .spacing(10) .align_y(iced::Alignment::Center); @@ -79,8 +83,14 @@ impl App { }; let github_btn_content = row![ - text("\u{f09b}").size(self.sz(18)).font(self.app_font()).color(github_icon_color), - text(github_label).size(self.sz(13)).font(self.app_font()).color(github_icon_color), + text("\u{f09b}") + .size(self.sz(18)) + .font(self.app_font()) + .color(github_icon_color), + text(github_label) + .size(self.sz(13)) + .font(self.app_font()) + .color(github_icon_color), ] .spacing(10) .align_y(iced::Alignment::Center); @@ -90,17 +100,18 @@ impl App { .on_press(Message::ToggleGitHubMenu) .padding([10, 14]) .width(Fill) - .style(move |_theme, _status| { - button::Style { - background: Some(if show_menu { + .style(move |_theme, _status| button::Style { + background: Some( + if show_menu { Palette::BG_SELECTED() } else { iced::Color::TRANSPARENT - }.into()), - text_color: Palette::TEXT_PRIMARY(), - border: iced::Border::default().rounded(6), - ..Default::default() - } + } + .into(), + ), + text_color: Palette::TEXT_PRIMARY(), + border: iced::Border::default().rounded(6), + ..Default::default() }); let rescan_label = if self.is_scanning { @@ -118,19 +129,22 @@ impl App { }; // Launcher update badge - let update_badge: Element<'_, Message> = if let Some(ref update_info) = self.launcher_update_available { - let (label, msg): (String, Message) = if let Some(ref path) = self.launcher_update_staged { - ( - crate::i18n::t("launcher_restart_to_update"), - Message::ApplyLauncherUpdate(path.clone()), - ) - } else { - let tag = &update_info.0; - ( - crate::i18n::t_fmt("launcher_update_available_short", &[("version", tag)]), - Message::DownloadLauncherUpdate, - ) - }; + let update_badge: Element<'_, Message> = if let Some(ref update_info) = + self.launcher_update_available + { + let (label, msg): (String, Message) = + if let Some(ref path) = self.launcher_update_staged { + ( + crate::i18n::t("launcher_restart_to_update"), + Message::ApplyLauncherUpdate(path.clone()), + ) + } else { + let tag = &update_info.0; + ( + crate::i18n::t_fmt("launcher_update_available_short", &[("version", tag)]), + Message::DownloadLauncherUpdate, + ) + }; let is_downloading = self.is_downloading; button( @@ -159,16 +173,10 @@ impl App { container(text("")).height(0).into() }; - let github_group = container( - column![ - github_btn, - container(text("")).height(4), - rescan_btn, - ] - .spacing(0), - ) - .id(crate::ui::tutorial::ID_GITHUB) - .width(Fill); + let github_group = + container(column![github_btn, container(text("")).height(4), rescan_btn,].spacing(0)) + .id(crate::ui::tutorial::ID_GITHUB) + .width(Fill); let sidebar_content = column![ title, @@ -193,7 +201,11 @@ impl App { .into() } - pub(crate) fn view_section_button(&self, index: usize, section: &Section) -> Element<'_, Message> { + pub(crate) fn view_section_button( + &self, + index: usize, + section: &Section, + ) -> Element<'_, Message> { let is_selected = self.selected_section == index && !self.show_github_menu; let text_color = if is_selected { @@ -213,7 +225,10 @@ impl App { 0.0 }; let accent = Palette::ACCENT(); - let indicator_color = iced::Color { a: accent.a * indicator_alpha, ..accent }; + let indicator_color = iced::Color { + a: accent.a * indicator_alpha, + ..accent + }; let indicator = container(text("")) .width(4) diff --git a/src/ui/theme.rs b/src/ui/theme.rs index ed19125..c2ddfeb 100644 --- a/src/ui/theme.rs +++ b/src/ui/theme.rs @@ -73,20 +73,23 @@ pub fn set_active_accent(color: Option) { /// Resolve the effective accent color: user override or theme default. pub fn effective_accent() -> Color { - ACTIVE_ACCENT.read().unwrap().unwrap_or_else(|| active_palette().accent_blue) + ACTIVE_ACCENT + .read() + .unwrap() + .unwrap_or_else(|| active_palette().accent_blue) } /// Convert an accent key to its Color, or None for "auto". pub fn accent_key_to_color(key: &str) -> Option { let hex: u32 = match key { - "red" => 0xE05555, + "red" => 0xE05555, "orange" => 0xE0855A, "yellow" => 0xC8A832, - "green" => 0x55B87A, - "blue" => 0x6B8BD6, + "green" => 0x55B87A, + "blue" => 0x6B8BD6, "indigo" => 0x7B6BD6, "violet" => 0xB06BD6, - "amber" => 0xD4A030, + "amber" => 0xD4A030, _ => return None, }; Some(Color { @@ -108,9 +111,7 @@ pub fn app_tint(name: &str) -> Color { // Classic string hash: h = c + h*31, wrapping. let mut h: i64 = 0; for b in name.bytes() { - h = (b as i64) - .wrapping_add(h.wrapping_shl(5)) - .wrapping_sub(h); + h = (b as i64).wrapping_add(h.wrapping_shl(5)).wrapping_sub(h); } let idx = (h.unsigned_abs() % KEYS.len() as u64) as usize; accent_key_to_color(KEYS[idx]).unwrap_or_else(|| active_palette().accent_blue) @@ -121,9 +122,19 @@ pub fn app_tint(name: &str) -> Color { pub fn contrast_on(bg: Color) -> Color { let yiq = 0.299 * bg.r + 0.587 * bg.g + 0.114 * bg.b; if yiq > 0.6 { - Color { r: 0.08, g: 0.08, b: 0.10, a: 1.0 } + Color { + r: 0.08, + g: 0.08, + b: 0.10, + a: 1.0, + } } else { - Color { r: 0.97, g: 0.98, b: 1.0, a: 1.0 } + Color { + r: 0.97, + g: 0.98, + b: 1.0, + a: 1.0, + } } } @@ -131,87 +142,87 @@ pub fn contrast_on(bg: Color) -> Color { pub fn set_active_theme(theme: &str, variant: &str) { let palette = match (theme, variant) { // Catppuccin - ("catppuccin", "latte") => ThemePalette::CATPPUCCIN_LATTE, - ("catppuccin", "frappe") => ThemePalette::CATPPUCCIN_FRAPPE, - ("catppuccin", "macchiato") => ThemePalette::CATPPUCCIN_MACCHIATO, - ("catppuccin", "mocha") => ThemePalette::CATPPUCCIN_MOCHA, + ("catppuccin", "latte") => ThemePalette::CATPPUCCIN_LATTE, + ("catppuccin", "frappe") => ThemePalette::CATPPUCCIN_FRAPPE, + ("catppuccin", "macchiato") => ThemePalette::CATPPUCCIN_MACCHIATO, + ("catppuccin", "mocha") => ThemePalette::CATPPUCCIN_MOCHA, // Gruvbox - ("gruvbox", "light") => ThemePalette::GRUVBOX_LIGHT, - ("gruvbox", "dark") => ThemePalette::GRUVBOX_DARK, + ("gruvbox", "light") => ThemePalette::GRUVBOX_LIGHT, + ("gruvbox", "dark") => ThemePalette::GRUVBOX_DARK, // Everblush - ("everblush", "light") => ThemePalette::EVERBLUSH_LIGHT, - ("everblush", "dark") => ThemePalette::EVERBLUSH_DARK, + ("everblush", "light") => ThemePalette::EVERBLUSH_LIGHT, + ("everblush", "dark") => ThemePalette::EVERBLUSH_DARK, // Kanagawa - ("kanagawa", "light") => ThemePalette::KANAGAWA_LOTUS, - ("kanagawa", "dark") => ThemePalette::KANAGAWA_WAVE, - ("kanagawa", "journal") => ThemePalette::KANAGAWA_DRAGON, + ("kanagawa", "light") => ThemePalette::KANAGAWA_LOTUS, + ("kanagawa", "dark") => ThemePalette::KANAGAWA_WAVE, + ("kanagawa", "journal") => ThemePalette::KANAGAWA_DRAGON, // Nord - ("nord", "dark") => ThemePalette::NORD_DARK, - ("nord", "light") => ThemePalette::NORD_LIGHT, + ("nord", "dark") => ThemePalette::NORD_DARK, + ("nord", "light") => ThemePalette::NORD_LIGHT, // Dracula - ("dracula", "dark") => ThemePalette::DRACULA_DARK, - ("dracula", "light") => ThemePalette::DRACULA_LIGHT, + ("dracula", "dark") => ThemePalette::DRACULA_DARK, + ("dracula", "light") => ThemePalette::DRACULA_LIGHT, // Solarized - ("solarized", "dark") => ThemePalette::SOLARIZED_DARK, - ("solarized", "light") => ThemePalette::SOLARIZED_LIGHT, + ("solarized", "dark") => ThemePalette::SOLARIZED_DARK, + ("solarized", "light") => ThemePalette::SOLARIZED_LIGHT, // Tokyo Night - ("tokyonight", "night") => ThemePalette::TOKYONIGHT_NIGHT, - ("tokyonight", "day") => ThemePalette::TOKYONIGHT_DAY, + ("tokyonight", "night") => ThemePalette::TOKYONIGHT_NIGHT, + ("tokyonight", "day") => ThemePalette::TOKYONIGHT_DAY, // Rosé Pine - ("rosepine", "main") => ThemePalette::ROSEPINE_MAIN, - ("rosepine", "moon") => ThemePalette::ROSEPINE_MOON, - ("rosepine", "dawn") => ThemePalette::ROSEPINE_DAWN, + ("rosepine", "main") => ThemePalette::ROSEPINE_MAIN, + ("rosepine", "moon") => ThemePalette::ROSEPINE_MOON, + ("rosepine", "dawn") => ThemePalette::ROSEPINE_DAWN, // One Dark - ("onedark", "dark") => ThemePalette::ONEDARK_DARK, - ("onedark", "light") => ThemePalette::ONEDARK_LIGHT, + ("onedark", "dark") => ThemePalette::ONEDARK_DARK, + ("onedark", "light") => ThemePalette::ONEDARK_LIGHT, // Monokai Pro - ("monokai", "pro") => ThemePalette::MONOKAI_PRO, - ("monokai", "classic") => ThemePalette::MONOKAI_CLASSIC, - ("monokai", "spectrum") => ThemePalette::MONOKAI_SPECTRUM, + ("monokai", "pro") => ThemePalette::MONOKAI_PRO, + ("monokai", "classic") => ThemePalette::MONOKAI_CLASSIC, + ("monokai", "spectrum") => ThemePalette::MONOKAI_SPECTRUM, // Ayu - ("ayu", "dark") => ThemePalette::AYU_DARK, - ("ayu", "mirage") => ThemePalette::AYU_MIRAGE, - ("ayu", "light") => ThemePalette::AYU_LIGHT, + ("ayu", "dark") => ThemePalette::AYU_DARK, + ("ayu", "mirage") => ThemePalette::AYU_MIRAGE, + ("ayu", "light") => ThemePalette::AYU_LIGHT, // Everforest - ("everforest", "dark") => ThemePalette::EVERFOREST_DARK, - ("everforest", "light") => ThemePalette::EVERFOREST_LIGHT, + ("everforest", "dark") => ThemePalette::EVERFOREST_DARK, + ("everforest", "light") => ThemePalette::EVERFOREST_LIGHT, // Material - ("material", "oceanic") => ThemePalette::MATERIAL_OCEANIC, - ("material", "palenight") => ThemePalette::MATERIAL_PALENIGHT, - ("material", "deepocean") => ThemePalette::MATERIAL_DEEPOCEAN, + ("material", "oceanic") => ThemePalette::MATERIAL_OCEANIC, + ("material", "palenight") => ThemePalette::MATERIAL_PALENIGHT, + ("material", "deepocean") => ThemePalette::MATERIAL_DEEPOCEAN, // Flexoki - ("flexoki", "dark") => ThemePalette::FLEXOKI_DARK, - ("flexoki", "light") => ThemePalette::FLEXOKI_LIGHT, + ("flexoki", "dark") => ThemePalette::FLEXOKI_DARK, + ("flexoki", "light") => ThemePalette::FLEXOKI_LIGHT, // Nightfox - ("nightfox", "nightfox") => ThemePalette::NIGHTFOX, - ("nightfox", "dawnfox") => ThemePalette::DAWNFOX, + ("nightfox", "nightfox") => ThemePalette::NIGHTFOX, + ("nightfox", "dawnfox") => ThemePalette::DAWNFOX, // Sonokai - ("sonokai", "default") => ThemePalette::SONOKAI_DEFAULT, + ("sonokai", "default") => ThemePalette::SONOKAI_DEFAULT, // Oxocarbon - ("oxocarbon", "dark") => ThemePalette::OXOCARBON_DARK, - ("oxocarbon", "light") => ThemePalette::OXOCARBON_LIGHT, + ("oxocarbon", "dark") => ThemePalette::OXOCARBON_DARK, + ("oxocarbon", "light") => ThemePalette::OXOCARBON_LIGHT, // Night Owl - ("nightowl", "dark") => ThemePalette::NIGHTOWL_DARK, - ("nightowl", "light") => ThemePalette::NIGHTOWL_LIGHT, + ("nightowl", "dark") => ThemePalette::NIGHTOWL_DARK, + ("nightowl", "light") => ThemePalette::NIGHTOWL_LIGHT, // Iceberg - ("iceberg", "dark") => ThemePalette::ICEBERG_DARK, - ("iceberg", "light") => ThemePalette::ICEBERG_LIGHT, + ("iceberg", "dark") => ThemePalette::ICEBERG_DARK, + ("iceberg", "light") => ThemePalette::ICEBERG_LIGHT, // Horizon - ("horizon", "dark") => ThemePalette::HORIZON_DARK, + ("horizon", "dark") => ThemePalette::HORIZON_DARK, // Melange - ("melange", "dark") => ThemePalette::MELANGE_DARK, - ("melange", "light") => ThemePalette::MELANGE_LIGHT, + ("melange", "dark") => ThemePalette::MELANGE_DARK, + ("melange", "light") => ThemePalette::MELANGE_LIGHT, // Synthwave '84 - ("synthwave", "dark") => ThemePalette::SYNTHWAVE_DARK, + ("synthwave", "dark") => ThemePalette::SYNTHWAVE_DARK, // Modus - ("modus", "operandi") => ThemePalette::MODUS_OPERANDI, - ("modus", "vivendi") => ThemePalette::MODUS_VIVENDI, + ("modus", "operandi") => ThemePalette::MODUS_OPERANDI, + ("modus", "vivendi") => ThemePalette::MODUS_VIVENDI, // Stellar Blade (fan-made character set) - ("stellar_blade", "eve") => ThemePalette::STELLAR_EVE, - ("stellar_blade", "tachy") => ThemePalette::STELLAR_TACHY, - ("stellar_blade", "lily") => ThemePalette::STELLAR_LILY, - ("stellar_blade", "enya") => ThemePalette::STELLAR_ENYA, - ("stellar_blade", "kaya") => ThemePalette::STELLAR_KAYA, + ("stellar_blade", "eve") => ThemePalette::STELLAR_EVE, + ("stellar_blade", "tachy") => ThemePalette::STELLAR_TACHY, + ("stellar_blade", "lily") => ThemePalette::STELLAR_LILY, + ("stellar_blade", "enya") => ThemePalette::STELLAR_ENYA, + ("stellar_blade", "kaya") => ThemePalette::STELLAR_KAYA, // Fallback _ => ThemePalette::GRUVBOX_DARK, }; @@ -248,59 +259,135 @@ pub struct Palette; #[allow(non_snake_case, dead_code)] impl Palette { // Backgrounds - pub fn BG_PRIMARY() -> Color { active_palette().bg_primary } - pub fn BG_SIDEBAR() -> Color { active_palette().bg_sidebar } - pub fn BG_CARD() -> Color { active_palette().bg_card } - pub fn BG_CARD_HOVER() -> Color { active_palette().bg_card_hover } - pub fn BG_CARD_PRESSED() -> Color { active_palette().bg_card_pressed } - pub fn BG_SELECTED() -> Color { active_palette().bg_selected } - pub fn BG_INPUT() -> Color { active_palette().bg_input } - pub fn BG_PROGRESS() -> Color { active_palette().bg_progress } + pub fn BG_PRIMARY() -> Color { + active_palette().bg_primary + } + pub fn BG_SIDEBAR() -> Color { + active_palette().bg_sidebar + } + pub fn BG_CARD() -> Color { + active_palette().bg_card + } + pub fn BG_CARD_HOVER() -> Color { + active_palette().bg_card_hover + } + pub fn BG_CARD_PRESSED() -> Color { + active_palette().bg_card_pressed + } + pub fn BG_SELECTED() -> Color { + active_palette().bg_selected + } + pub fn BG_INPUT() -> Color { + active_palette().bg_input + } + pub fn BG_PROGRESS() -> Color { + active_palette().bg_progress + } // Text - pub fn TEXT_PRIMARY() -> Color { active_palette().text_primary } - pub fn TEXT_SECONDARY() -> Color { active_palette().text_secondary } - pub fn TEXT_MUTED() -> Color { active_palette().text_muted } - pub fn TEXT_DIM() -> Color { active_palette().text_dim } - pub fn TEXT_DIMMER() -> Color { active_palette().text_dimmer } - pub fn TEXT_DIMMEST() -> Color { active_palette().text_dimmest } - pub fn TEXT_PLACEHOLDER() -> Color { active_palette().text_placeholder } + pub fn TEXT_PRIMARY() -> Color { + active_palette().text_primary + } + pub fn TEXT_SECONDARY() -> Color { + active_palette().text_secondary + } + pub fn TEXT_MUTED() -> Color { + active_palette().text_muted + } + pub fn TEXT_DIM() -> Color { + active_palette().text_dim + } + pub fn TEXT_DIMMER() -> Color { + active_palette().text_dimmer + } + pub fn TEXT_DIMMEST() -> Color { + active_palette().text_dimmest + } + pub fn TEXT_PLACEHOLDER() -> Color { + active_palette().text_placeholder + } // Accent /// User-selected accent (or theme default if auto). - pub fn ACCENT() -> Color { effective_accent() } - pub fn ACCENT_ICON() -> Color { active_palette().accent_icon } - pub fn ACCENT_PROGRESS() -> Color { active_palette().accent_progress } + pub fn ACCENT() -> Color { + effective_accent() + } + pub fn ACCENT_ICON() -> Color { + active_palette().accent_icon + } + pub fn ACCENT_PROGRESS() -> Color { + active_palette().accent_progress + } // Buttons - pub fn BTN_DEFAULT() -> Color { active_palette().btn_default } - pub fn BTN_HOVER() -> Color { active_palette().btn_hover } - pub fn BTN_PRESSED() -> Color { active_palette().btn_pressed } + pub fn BTN_DEFAULT() -> Color { + active_palette().btn_default + } + pub fn BTN_HOVER() -> Color { + active_palette().btn_hover + } + pub fn BTN_PRESSED() -> Color { + active_palette().btn_pressed + } // Success - pub fn SUCCESS() -> Color { active_palette().success } - pub fn SUCCESS_BG() -> Color { active_palette().success_bg } - pub fn BTN_SUCCESS() -> Color { active_palette().btn_success } - pub fn BTN_SUCCESS_HOVER() -> Color { active_palette().btn_success_hover } - pub fn BTN_SUCCESS_PRESSED()-> Color { active_palette().btn_success_pressed } + pub fn SUCCESS() -> Color { + active_palette().success + } + pub fn SUCCESS_BG() -> Color { + active_palette().success_bg + } + pub fn BTN_SUCCESS() -> Color { + active_palette().btn_success + } + pub fn BTN_SUCCESS_HOVER() -> Color { + active_palette().btn_success_hover + } + pub fn BTN_SUCCESS_PRESSED() -> Color { + active_palette().btn_success_pressed + } // Warning - pub fn WARNING() -> Color { active_palette().warning } - pub fn WARNING_BG() -> Color { active_palette().warning_bg } + pub fn WARNING() -> Color { + active_palette().warning + } + pub fn WARNING_BG() -> Color { + active_palette().warning_bg + } // Error - pub fn ERROR() -> Color { active_palette().error } - pub fn ERROR_LIGHT() -> Color { active_palette().error_light } - pub fn ERROR_BG() -> Color { active_palette().error_bg } - pub fn BTN_DANGER_BG() -> Color { active_palette().btn_danger_bg } - pub fn BTN_DANGER_HOVER() -> Color { active_palette().btn_danger_hover } - pub fn BTN_TRASH_HOVER() -> Color { active_palette().btn_trash_hover } - pub fn BTN_TRASH_PRESSED()-> Color { active_palette().btn_trash_pressed } + pub fn ERROR() -> Color { + active_palette().error + } + pub fn ERROR_LIGHT() -> Color { + active_palette().error_light + } + pub fn ERROR_BG() -> Color { + active_palette().error_bg + } + pub fn BTN_DANGER_BG() -> Color { + active_palette().btn_danger_bg + } + pub fn BTN_DANGER_HOVER() -> Color { + active_palette().btn_danger_hover + } + pub fn BTN_TRASH_HOVER() -> Color { + active_palette().btn_trash_hover + } + pub fn BTN_TRASH_PRESSED() -> Color { + active_palette().btn_trash_pressed + } // Modal - pub fn BG_MODAL_SECTION() -> Color { active_palette().bg_modal_section } - pub fn BORDER_SUBTLE() -> Color { active_palette().border_subtle } - pub fn DIVIDER() -> Color { active_palette().divider } + pub fn BG_MODAL_SECTION() -> Color { + active_palette().bg_modal_section + } + pub fn BORDER_SUBTLE() -> Color { + active_palette().border_subtle + } + pub fn DIVIDER() -> Color { + active_palette().divider + } } // ── Compile-time hex → Color helper ── @@ -336,7 +423,8 @@ impl ThemePalette { } } // Detect light vs dark theme by bg brightness - let bg_luma = self.bg_primary.r * 0.299 + self.bg_primary.g * 0.587 + self.bg_primary.b * 0.114; + let bg_luma = + self.bg_primary.r * 0.299 + self.bg_primary.g * 0.587 + self.bg_primary.b * 0.114; let is_light = bg_luma > 0.5; if is_light { @@ -363,542 +451,542 @@ impl ThemePalette { // ── Catppuccin Latte (light) ── pub const CATPPUCCIN_LATTE: Self = Self { - bg_primary: hex(0xeff1f5), - bg_sidebar: hex(0xe6e9ef), - bg_card: hex(0xe6e9ef), - bg_card_hover: hex(0xdce0e8), - bg_card_pressed: hex(0xccd0da), - bg_selected: hex(0xccd0da), - bg_input: hex(0xdce0e8), - bg_progress: hex(0xe6e9ef), - - text_primary: hex(0x4c4f69), - text_secondary: hex(0x5c5f77), - text_muted: hex(0x6c6f85), - text_dim: hex(0x7c7f93), - text_dimmer: hex(0x8c8fa1), - text_dimmest: hex(0x9ca0b0), + bg_primary: hex(0xeff1f5), + bg_sidebar: hex(0xe6e9ef), + bg_card: hex(0xe6e9ef), + bg_card_hover: hex(0xdce0e8), + bg_card_pressed: hex(0xccd0da), + bg_selected: hex(0xccd0da), + bg_input: hex(0xdce0e8), + bg_progress: hex(0xe6e9ef), + + text_primary: hex(0x4c4f69), + text_secondary: hex(0x5c5f77), + text_muted: hex(0x6c6f85), + text_dim: hex(0x7c7f93), + text_dimmer: hex(0x8c8fa1), + text_dimmest: hex(0x9ca0b0), text_placeholder: hex(0x8c8fa1), - accent_blue: hex(0x1e66f5), - accent_icon: hex(0x7287fd), - accent_progress: hex(0x7287fd), + accent_blue: hex(0x1e66f5), + accent_icon: hex(0x7287fd), + accent_progress: hex(0x7287fd), - btn_default: hex(0xdce0e8), - btn_hover: hex(0xccd0da), - btn_pressed: hex(0xbcc0cc), + btn_default: hex(0xdce0e8), + btn_hover: hex(0xccd0da), + btn_pressed: hex(0xbcc0cc), - success: hex(0x40a02b), - success_bg: hex(0xd5f0cd), - btn_success: hex(0x40a02b), + success: hex(0x40a02b), + success_bg: hex(0xd5f0cd), + btn_success: hex(0x40a02b), btn_success_hover: hex(0x369222), btn_success_pressed: hex(0x2c8219), - warning: hex(0xdf8e1d), - warning_bg: hex(0xf5e6c8), + warning: hex(0xdf8e1d), + warning_bg: hex(0xf5e6c8), - error: hex(0xd20f39), - error_light: hex(0xe64553), - error_bg: hex(0xf5d0d6), - btn_danger_bg: hex(0xf5d0d6), + error: hex(0xd20f39), + error_light: hex(0xe64553), + error_bg: hex(0xf5d0d6), + btn_danger_bg: hex(0xf5d0d6), btn_danger_hover: hex(0xeab0ba), - btn_trash_hover: hex(0xd20f39), + btn_trash_hover: hex(0xd20f39), btn_trash_pressed: hex(0xb00c30), bg_modal_section: hex(0xe6e9ef), - border_subtle: hex(0xccd0da), - divider: hex(0xccd0da), + border_subtle: hex(0xccd0da), + divider: hex(0xccd0da), }; // ── Catppuccin Frappé ── pub const CATPPUCCIN_FRAPPE: Self = Self { - bg_primary: hex(0x303446), - bg_sidebar: hex(0x292c3c), - bg_card: hex(0x292c3c), - bg_card_hover: hex(0x414559), - bg_card_pressed: hex(0x51576d), - bg_selected: hex(0x51576d), - bg_input: hex(0x414559), - bg_progress: hex(0x292c3c), - - text_primary: hex(0xc6d0f5), - text_secondary: hex(0xb5bfe2), - text_muted: hex(0xa5adce), - text_dim: hex(0x949cbb), - text_dimmer: hex(0x838ba7), - text_dimmest: hex(0x737994), + bg_primary: hex(0x303446), + bg_sidebar: hex(0x292c3c), + bg_card: hex(0x292c3c), + bg_card_hover: hex(0x414559), + bg_card_pressed: hex(0x51576d), + bg_selected: hex(0x51576d), + bg_input: hex(0x414559), + bg_progress: hex(0x292c3c), + + text_primary: hex(0xc6d0f5), + text_secondary: hex(0xb5bfe2), + text_muted: hex(0xa5adce), + text_dim: hex(0x949cbb), + text_dimmer: hex(0x838ba7), + text_dimmest: hex(0x737994), text_placeholder: hex(0x838ba7), - accent_blue: hex(0x8caaee), - accent_icon: hex(0xbabbf1), - accent_progress: hex(0xbabbf1), + accent_blue: hex(0x8caaee), + accent_icon: hex(0xbabbf1), + accent_progress: hex(0xbabbf1), - btn_default: hex(0x414559), - btn_hover: hex(0x51576d), - btn_pressed: hex(0x626880), + btn_default: hex(0x414559), + btn_hover: hex(0x51576d), + btn_pressed: hex(0x626880), - success: hex(0xa6d189), - success_bg: hex(0x2a3a28), - btn_success: hex(0x549444), + success: hex(0xa6d189), + success_bg: hex(0x2a3a28), + btn_success: hex(0x549444), btn_success_hover: hex(0x468838), btn_success_pressed: hex(0x387a2c), - warning: hex(0xe5c890), - warning_bg: hex(0x3a3828), + warning: hex(0xe5c890), + warning_bg: hex(0x3a3828), - error: hex(0xe78284), - error_light: hex(0xea999c), - error_bg: hex(0x3a2628), - btn_danger_bg: hex(0x3a2628), + error: hex(0xe78284), + error_light: hex(0xea999c), + error_bg: hex(0x3a2628), + btn_danger_bg: hex(0x3a2628), btn_danger_hover: hex(0x5a3638), - btn_trash_hover: hex(0x9a3234), + btn_trash_hover: hex(0x9a3234), btn_trash_pressed: hex(0x7a2224), bg_modal_section: hex(0x292c3c), - border_subtle: hex(0x414559), - divider: hex(0x414559), + border_subtle: hex(0x414559), + divider: hex(0x414559), }; // ── Catppuccin Macchiato ── pub const CATPPUCCIN_MACCHIATO: Self = Self { - bg_primary: hex(0x24273a), - bg_sidebar: hex(0x1e2030), - bg_card: hex(0x1e2030), - bg_card_hover: hex(0x363a4f), - bg_card_pressed: hex(0x494d64), - bg_selected: hex(0x494d64), - bg_input: hex(0x363a4f), - bg_progress: hex(0x1e2030), - - text_primary: hex(0xcad3f5), - text_secondary: hex(0xb8c0e0), - text_muted: hex(0xa5adcb), - text_dim: hex(0x939ab7), - text_dimmer: hex(0x8087a2), - text_dimmest: hex(0x6e738d), + bg_primary: hex(0x24273a), + bg_sidebar: hex(0x1e2030), + bg_card: hex(0x1e2030), + bg_card_hover: hex(0x363a4f), + bg_card_pressed: hex(0x494d64), + bg_selected: hex(0x494d64), + bg_input: hex(0x363a4f), + bg_progress: hex(0x1e2030), + + text_primary: hex(0xcad3f5), + text_secondary: hex(0xb8c0e0), + text_muted: hex(0xa5adcb), + text_dim: hex(0x939ab7), + text_dimmer: hex(0x8087a2), + text_dimmest: hex(0x6e738d), text_placeholder: hex(0x8087a2), - accent_blue: hex(0x8aadf4), - accent_icon: hex(0xb7bdf8), - accent_progress: hex(0xb7bdf8), + accent_blue: hex(0x8aadf4), + accent_icon: hex(0xb7bdf8), + accent_progress: hex(0xb7bdf8), - btn_default: hex(0x363a4f), - btn_hover: hex(0x494d64), - btn_pressed: hex(0x5b6078), + btn_default: hex(0x363a4f), + btn_hover: hex(0x494d64), + btn_pressed: hex(0x5b6078), - success: hex(0xa6da95), - success_bg: hex(0x243826), - btn_success: hex(0x4e9240), + success: hex(0xa6da95), + success_bg: hex(0x243826), + btn_success: hex(0x4e9240), btn_success_hover: hex(0x408634), btn_success_pressed: hex(0x327a28), - warning: hex(0xeed49f), - warning_bg: hex(0x383428), + warning: hex(0xeed49f), + warning_bg: hex(0x383428), - error: hex(0xed8796), - error_light: hex(0xee99a0), - error_bg: hex(0x382428), - btn_danger_bg: hex(0x382428), + error: hex(0xed8796), + error_light: hex(0xee99a0), + error_bg: hex(0x382428), + btn_danger_bg: hex(0x382428), btn_danger_hover: hex(0x583438), - btn_trash_hover: hex(0x983038), + btn_trash_hover: hex(0x983038), btn_trash_pressed: hex(0x782028), bg_modal_section: hex(0x1e2030), - border_subtle: hex(0x363a4f), - divider: hex(0x363a4f), + border_subtle: hex(0x363a4f), + divider: hex(0x363a4f), }; // ── Catppuccin Mocha ── pub const CATPPUCCIN_MOCHA: Self = Self { - bg_primary: hex(0x1e1e2e), - bg_sidebar: hex(0x181825), - bg_card: hex(0x181825), - bg_card_hover: hex(0x313244), - bg_card_pressed: hex(0x45475a), - bg_selected: hex(0x45475a), - bg_input: hex(0x313244), - bg_progress: hex(0x181825), - - text_primary: hex(0xcdd6f4), - text_secondary: hex(0xbac2de), - text_muted: hex(0xa6adc8), - text_dim: hex(0x9399b2), - text_dimmer: hex(0x7f849c), - text_dimmest: hex(0x6c7086), + bg_primary: hex(0x1e1e2e), + bg_sidebar: hex(0x181825), + bg_card: hex(0x181825), + bg_card_hover: hex(0x313244), + bg_card_pressed: hex(0x45475a), + bg_selected: hex(0x45475a), + bg_input: hex(0x313244), + bg_progress: hex(0x181825), + + text_primary: hex(0xcdd6f4), + text_secondary: hex(0xbac2de), + text_muted: hex(0xa6adc8), + text_dim: hex(0x9399b2), + text_dimmer: hex(0x7f849c), + text_dimmest: hex(0x6c7086), text_placeholder: hex(0x7f849c), - accent_blue: hex(0x89b4fa), - accent_icon: hex(0xb4befe), - accent_progress: hex(0xb4befe), + accent_blue: hex(0x89b4fa), + accent_icon: hex(0xb4befe), + accent_progress: hex(0xb4befe), - btn_default: hex(0x313244), - btn_hover: hex(0x45475a), - btn_pressed: hex(0x585b70), + btn_default: hex(0x313244), + btn_hover: hex(0x45475a), + btn_pressed: hex(0x585b70), - success: hex(0xa6e3a1), - success_bg: hex(0x1e3a1e), - btn_success: hex(0x48904a), + success: hex(0xa6e3a1), + success_bg: hex(0x1e3a1e), + btn_success: hex(0x48904a), btn_success_hover: hex(0x3a843c), btn_success_pressed: hex(0x2c782e), - warning: hex(0xf9e2af), - warning_bg: hex(0x3a3420), + warning: hex(0xf9e2af), + warning_bg: hex(0x3a3420), - error: hex(0xf38ba8), - error_light: hex(0xf5a0b8), - error_bg: hex(0x3a1e28), - btn_danger_bg: hex(0x3a1e28), + error: hex(0xf38ba8), + error_light: hex(0xf5a0b8), + error_bg: hex(0x3a1e28), + btn_danger_bg: hex(0x3a1e28), btn_danger_hover: hex(0x5a2e38), - btn_trash_hover: hex(0x952e3a), + btn_trash_hover: hex(0x952e3a), btn_trash_pressed: hex(0x751e2a), bg_modal_section: hex(0x181825), - border_subtle: hex(0x313244), - divider: hex(0x313244), + border_subtle: hex(0x313244), + divider: hex(0x313244), }; // ── Gruvbox Dark ── pub const GRUVBOX_DARK: Self = Self { - bg_primary: hex(0x282828), - bg_sidebar: hex(0x1d2021), - bg_card: hex(0x3c3836), - bg_card_hover: hex(0x504945), - bg_card_pressed: hex(0x665c54), - bg_selected: hex(0x504945), - bg_input: hex(0x3c3836), - bg_progress: hex(0x32302f), - - text_primary: hex(0xebdbb2), - text_secondary: hex(0xd5c4a1), - text_muted: hex(0xbdae93), - text_dim: hex(0xa89984), - text_dimmer: hex(0x928374), - text_dimmest: hex(0x7c6f64), + bg_primary: hex(0x282828), + bg_sidebar: hex(0x1d2021), + bg_card: hex(0x3c3836), + bg_card_hover: hex(0x504945), + bg_card_pressed: hex(0x665c54), + bg_selected: hex(0x504945), + bg_input: hex(0x3c3836), + bg_progress: hex(0x32302f), + + text_primary: hex(0xebdbb2), + text_secondary: hex(0xd5c4a1), + text_muted: hex(0xbdae93), + text_dim: hex(0xa89984), + text_dimmer: hex(0x928374), + text_dimmest: hex(0x7c6f64), text_placeholder: hex(0x928374), - accent_blue: hex(0x83a598), - accent_icon: hex(0x83a598), - accent_progress: hex(0x83a598), + accent_blue: hex(0x83a598), + accent_icon: hex(0x83a598), + accent_progress: hex(0x83a598), - btn_default: hex(0x3c3836), - btn_hover: hex(0x504945), - btn_pressed: hex(0x665c54), + btn_default: hex(0x3c3836), + btn_hover: hex(0x504945), + btn_pressed: hex(0x665c54), - success: hex(0xb8bb26), - success_bg: hex(0x2a3020), - btn_success: hex(0x689d6a), + success: hex(0xb8bb26), + success_bg: hex(0x2a3020), + btn_success: hex(0x689d6a), btn_success_hover: hex(0x5a8f5c), btn_success_pressed: hex(0x4c814e), - warning: hex(0xfabd2f), - warning_bg: hex(0x3a3420), + warning: hex(0xfabd2f), + warning_bg: hex(0x3a3420), - error: hex(0xfb4934), - error_light: hex(0xfe6050), - error_bg: hex(0x3c1f1f), - btn_danger_bg: hex(0x3c1f1f), + error: hex(0xfb4934), + error_light: hex(0xfe6050), + error_bg: hex(0x3c1f1f), + btn_danger_bg: hex(0x3c1f1f), btn_danger_hover: hex(0x5c2f2f), - btn_trash_hover: hex(0x9d3030), + btn_trash_hover: hex(0x9d3030), btn_trash_pressed: hex(0x7d2020), bg_modal_section: hex(0x282828), - border_subtle: hex(0x3c3836), - divider: hex(0x3c3836), + border_subtle: hex(0x3c3836), + divider: hex(0x3c3836), }; // ── Gruvbox Light ── pub const GRUVBOX_LIGHT: Self = Self { - bg_primary: hex(0xfbf1c7), - bg_sidebar: hex(0xf2e5bc), - bg_card: hex(0xebdbb2), - bg_card_hover: hex(0xd5c4a1), - bg_card_pressed: hex(0xbdae93), - bg_selected: hex(0xd5c4a1), - bg_input: hex(0xebdbb2), - bg_progress: hex(0xf2e5bc), - - text_primary: hex(0x3c3836), - text_secondary: hex(0x504945), - text_muted: hex(0x665c54), - text_dim: hex(0x7c6f64), - text_dimmer: hex(0x928374), - text_dimmest: hex(0xa89984), + bg_primary: hex(0xfbf1c7), + bg_sidebar: hex(0xf2e5bc), + bg_card: hex(0xebdbb2), + bg_card_hover: hex(0xd5c4a1), + bg_card_pressed: hex(0xbdae93), + bg_selected: hex(0xd5c4a1), + bg_input: hex(0xebdbb2), + bg_progress: hex(0xf2e5bc), + + text_primary: hex(0x3c3836), + text_secondary: hex(0x504945), + text_muted: hex(0x665c54), + text_dim: hex(0x7c6f64), + text_dimmer: hex(0x928374), + text_dimmest: hex(0xa89984), text_placeholder: hex(0x928374), - accent_blue: hex(0x458588), - accent_icon: hex(0x458588), - accent_progress: hex(0x458588), + accent_blue: hex(0x458588), + accent_icon: hex(0x458588), + accent_progress: hex(0x458588), - btn_default: hex(0xebdbb2), - btn_hover: hex(0xd5c4a1), - btn_pressed: hex(0xbdae93), + btn_default: hex(0xebdbb2), + btn_hover: hex(0xd5c4a1), + btn_pressed: hex(0xbdae93), - success: hex(0x98971a), - success_bg: hex(0xdde6b0), - btn_success: hex(0x689d6a), + success: hex(0x98971a), + success_bg: hex(0xdde6b0), + btn_success: hex(0x689d6a), btn_success_hover: hex(0x5a8f5c), btn_success_pressed: hex(0x4c814e), - warning: hex(0xd79921), - warning_bg: hex(0xf0e0b0), + warning: hex(0xd79921), + warning_bg: hex(0xf0e0b0), - error: hex(0xcc241d), - error_light: hex(0xd44040), - error_bg: hex(0xf0c8c8), - btn_danger_bg: hex(0xf0c8c8), + error: hex(0xcc241d), + error_light: hex(0xd44040), + error_bg: hex(0xf0c8c8), + btn_danger_bg: hex(0xf0c8c8), btn_danger_hover: hex(0xe0a8a8), - btn_trash_hover: hex(0xcc241d), + btn_trash_hover: hex(0xcc241d), btn_trash_pressed: hex(0xaa1818), bg_modal_section: hex(0xfbf1c7), - border_subtle: hex(0xd5c4a1), - divider: hex(0xd5c4a1), + border_subtle: hex(0xd5c4a1), + divider: hex(0xd5c4a1), }; // ── Everblush Dark ── pub const EVERBLUSH_DARK: Self = Self { - bg_primary: hex(0x141b1e), - bg_sidebar: hex(0x1a2124), - bg_card: hex(0x232a2d), - bg_card_hover: hex(0x2c3538), - bg_card_pressed: hex(0x354043), - bg_selected: hex(0x2c3538), - bg_input: hex(0x232a2d), - bg_progress: hex(0x1a2124), - - text_primary: hex(0xdadada), - text_secondary: hex(0xc4c4c4), - text_muted: hex(0xb3b9b8), - text_dim: hex(0x9aa0a0), - text_dimmer: hex(0x808888), - text_dimmest: hex(0x667070), + bg_primary: hex(0x141b1e), + bg_sidebar: hex(0x1a2124), + bg_card: hex(0x232a2d), + bg_card_hover: hex(0x2c3538), + bg_card_pressed: hex(0x354043), + bg_selected: hex(0x2c3538), + bg_input: hex(0x232a2d), + bg_progress: hex(0x1a2124), + + text_primary: hex(0xdadada), + text_secondary: hex(0xc4c4c4), + text_muted: hex(0xb3b9b8), + text_dim: hex(0x9aa0a0), + text_dimmer: hex(0x808888), + text_dimmest: hex(0x667070), text_placeholder: hex(0x808888), - accent_blue: hex(0x67b0e8), - accent_icon: hex(0x67b0e8), - accent_progress: hex(0x67b0e8), + accent_blue: hex(0x67b0e8), + accent_icon: hex(0x67b0e8), + accent_progress: hex(0x67b0e8), - btn_default: hex(0x232a2d), - btn_hover: hex(0x2c3538), - btn_pressed: hex(0x354043), + btn_default: hex(0x232a2d), + btn_hover: hex(0x2c3538), + btn_pressed: hex(0x354043), - success: hex(0x8ccf7e), - success_bg: hex(0x1a2e1e), - btn_success: hex(0x5aaa50), + success: hex(0x8ccf7e), + success_bg: hex(0x1a2e1e), + btn_success: hex(0x5aaa50), btn_success_hover: hex(0x4c9e44), btn_success_pressed: hex(0x3e9238), - warning: hex(0xe5c76b), - warning_bg: hex(0x2e2a1a), + warning: hex(0xe5c76b), + warning_bg: hex(0x2e2a1a), - error: hex(0xe57474), - error_light: hex(0xf08888), - error_bg: hex(0x2e1a1a), - btn_danger_bg: hex(0x2e1a1a), + error: hex(0xe57474), + error_light: hex(0xf08888), + error_bg: hex(0x2e1a1a), + btn_danger_bg: hex(0x2e1a1a), btn_danger_hover: hex(0x4e2a2a), - btn_trash_hover: hex(0x9a3030), + btn_trash_hover: hex(0x9a3030), btn_trash_pressed: hex(0x7a2020), bg_modal_section: hex(0x232a2d), - border_subtle: hex(0x2c3538), - divider: hex(0x2c3538), + border_subtle: hex(0x2c3538), + divider: hex(0x2c3538), }; // ── Everblush Light ── pub const EVERBLUSH_LIGHT: Self = Self { - bg_primary: hex(0xe8eded), - bg_sidebar: hex(0xdce3e3), - bg_card: hex(0xd0d8d8), - bg_card_hover: hex(0xc4cece), - bg_card_pressed: hex(0xb8c4c4), - bg_selected: hex(0xc4cece), - bg_input: hex(0xd0d8d8), - bg_progress: hex(0xdce3e3), - - text_primary: hex(0x2d3437), - text_secondary: hex(0x3a4448), - text_muted: hex(0x4a5558), - text_dim: hex(0x5a6668), - text_dimmer: hex(0x6a7878), - text_dimmest: hex(0x7a8a8a), + bg_primary: hex(0xe8eded), + bg_sidebar: hex(0xdce3e3), + bg_card: hex(0xd0d8d8), + bg_card_hover: hex(0xc4cece), + bg_card_pressed: hex(0xb8c4c4), + bg_selected: hex(0xc4cece), + bg_input: hex(0xd0d8d8), + bg_progress: hex(0xdce3e3), + + text_primary: hex(0x2d3437), + text_secondary: hex(0x3a4448), + text_muted: hex(0x4a5558), + text_dim: hex(0x5a6668), + text_dimmer: hex(0x6a7878), + text_dimmest: hex(0x7a8a8a), text_placeholder: hex(0x6a7878), - accent_blue: hex(0x3a88c0), - accent_icon: hex(0x3a88c0), - accent_progress: hex(0x3a88c0), + accent_blue: hex(0x3a88c0), + accent_icon: hex(0x3a88c0), + accent_progress: hex(0x3a88c0), - btn_default: hex(0xd0d8d8), - btn_hover: hex(0xc4cece), - btn_pressed: hex(0xb8c4c4), + btn_default: hex(0xd0d8d8), + btn_hover: hex(0xc4cece), + btn_pressed: hex(0xb8c4c4), - success: hex(0x5aaa4e), - success_bg: hex(0xc8e8c4), - btn_success: hex(0x5aaa4e), + success: hex(0x5aaa4e), + success_bg: hex(0xc8e8c4), + btn_success: hex(0x5aaa4e), btn_success_hover: hex(0x4c9e42), btn_success_pressed: hex(0x3e9236), - warning: hex(0xc0a030), - warning_bg: hex(0xe8e0c0), + warning: hex(0xc0a030), + warning_bg: hex(0xe8e0c0), - error: hex(0xc85050), - error_light: hex(0xd86868), - error_bg: hex(0xf0d0d0), - btn_danger_bg: hex(0xf0d0d0), + error: hex(0xc85050), + error_light: hex(0xd86868), + error_bg: hex(0xf0d0d0), + btn_danger_bg: hex(0xf0d0d0), btn_danger_hover: hex(0xe0b0b0), - btn_trash_hover: hex(0xc85050), + btn_trash_hover: hex(0xc85050), btn_trash_pressed: hex(0xa84040), bg_modal_section: hex(0xe8eded), - border_subtle: hex(0xc4cece), - divider: hex(0xc4cece), + border_subtle: hex(0xc4cece), + divider: hex(0xc4cece), }; // ── Kanagawa Wave (dark — default) ── pub const KANAGAWA_WAVE: Self = Self { - bg_primary: hex(0x1F1F28), - bg_sidebar: hex(0x181820), - bg_card: hex(0x2A2A37), - bg_card_hover: hex(0x363646), - bg_card_pressed: hex(0x54546D), - bg_selected: hex(0x363646), - bg_input: hex(0x2A2A37), - bg_progress: hex(0x223249), - - text_primary: hex(0xDCD7BA), - text_secondary: hex(0xC8C093), - text_muted: hex(0x9CABCA), - text_dim: hex(0x938AA9), - text_dimmer: hex(0x727169), - text_dimmest: hex(0x54546D), + bg_primary: hex(0x1F1F28), + bg_sidebar: hex(0x181820), + bg_card: hex(0x2A2A37), + bg_card_hover: hex(0x363646), + bg_card_pressed: hex(0x54546D), + bg_selected: hex(0x363646), + bg_input: hex(0x2A2A37), + bg_progress: hex(0x223249), + + text_primary: hex(0xDCD7BA), + text_secondary: hex(0xC8C093), + text_muted: hex(0x9CABCA), + text_dim: hex(0x938AA9), + text_dimmer: hex(0x727169), + text_dimmest: hex(0x54546D), text_placeholder: hex(0x727169), - accent_blue: hex(0x7E9CD8), - accent_icon: hex(0x7FB4CA), - accent_progress: hex(0x7FB4CA), + accent_blue: hex(0x7E9CD8), + accent_icon: hex(0x7FB4CA), + accent_progress: hex(0x7FB4CA), - btn_default: hex(0x2A2A37), - btn_hover: hex(0x363646), - btn_pressed: hex(0x54546D), + btn_default: hex(0x2A2A37), + btn_hover: hex(0x363646), + btn_pressed: hex(0x54546D), - success: hex(0x98BB6C), - success_bg: hex(0x2B3328), - btn_success: hex(0x76946A), + success: hex(0x98BB6C), + success_bg: hex(0x2B3328), + btn_success: hex(0x76946A), btn_success_hover: hex(0x68885c), btn_success_pressed: hex(0x5a7c4e), - warning: hex(0xE6C384), - warning_bg: hex(0x49443C), + warning: hex(0xE6C384), + warning_bg: hex(0x49443C), - error: hex(0xE46876), - error_light: hex(0xFF5D62), - error_bg: hex(0x43242B), - btn_danger_bg: hex(0x43242B), + error: hex(0xE46876), + error_light: hex(0xFF5D62), + error_bg: hex(0x43242B), + btn_danger_bg: hex(0x43242B), btn_danger_hover: hex(0x63343B), - btn_trash_hover: hex(0xC34043), + btn_trash_hover: hex(0xC34043), btn_trash_pressed: hex(0xA33033), bg_modal_section: hex(0x1F1F28), - border_subtle: hex(0x2A2A37), - divider: hex(0x2A2A37), + border_subtle: hex(0x2A2A37), + divider: hex(0x2A2A37), }; // ── Kanagawa Journal (warm parchment light) ── // Inspired by the Grape "Mode journal" — warm beige/sepia paper tones pub const KANAGAWA_DRAGON: Self = Self { - bg_primary: hex(0xd5cea3), // warm parchment - bg_sidebar: hex(0xc8b98e), // slightly darker sidebar - bg_card: hex(0xc8b98e), - bg_card_hover: hex(0xbdae80), - bg_card_pressed: hex(0xb0a070), - bg_selected: hex(0xbdae80), - bg_input: hex(0xc8b98e), - bg_progress: hex(0xc8b98e), - - text_primary: hex(0x43412e), // dark brown - text_secondary: hex(0x5c5840), - text_muted: hex(0x736e55), - text_dim: hex(0x8a856c), - text_dimmer: hex(0xa09a80), - text_dimmest: hex(0xb5ae94), + bg_primary: hex(0xd5cea3), // warm parchment + bg_sidebar: hex(0xc8b98e), // slightly darker sidebar + bg_card: hex(0xc8b98e), + bg_card_hover: hex(0xbdae80), + bg_card_pressed: hex(0xb0a070), + bg_selected: hex(0xbdae80), + bg_input: hex(0xc8b98e), + bg_progress: hex(0xc8b98e), + + text_primary: hex(0x43412e), // dark brown + text_secondary: hex(0x5c5840), + text_muted: hex(0x736e55), + text_dim: hex(0x8a856c), + text_dimmer: hex(0xa09a80), + text_dimmest: hex(0xb5ae94), text_placeholder: hex(0x8a856c), - accent_blue: hex(0x7a6840), // warm brown accent (matching screenshot) - accent_icon: hex(0x7a6840), - accent_progress: hex(0x7a6840), + accent_blue: hex(0x7a6840), // warm brown accent (matching screenshot) + accent_icon: hex(0x7a6840), + accent_progress: hex(0x7a6840), - btn_default: hex(0xc8b98e), - btn_hover: hex(0xbdae80), - btn_pressed: hex(0xb0a070), + btn_default: hex(0xc8b98e), + btn_hover: hex(0xbdae80), + btn_pressed: hex(0xb0a070), - success: hex(0x6f894e), - success_bg: hex(0xcbd8b8), - btn_success: hex(0x6e915f), + success: hex(0x6f894e), + success_bg: hex(0xcbd8b8), + btn_success: hex(0x6e915f), btn_success_hover: hex(0x608554), btn_success_pressed: hex(0x527949), - warning: hex(0xc49a20), - warning_bg: hex(0xe0d4a0), + warning: hex(0xc49a20), + warning_bg: hex(0xe0d4a0), - error: hex(0xc84053), - error_light: hex(0xd7474b), - error_bg: hex(0xe0bfb0), - btn_danger_bg: hex(0xe0bfb0), + error: hex(0xc84053), + error_light: hex(0xd7474b), + error_bg: hex(0xe0bfb0), + btn_danger_bg: hex(0xe0bfb0), btn_danger_hover: hex(0xd0a898), - btn_trash_hover: hex(0xc84053), + btn_trash_hover: hex(0xc84053), btn_trash_pressed: hex(0xa83043), bg_modal_section: hex(0xd5cea3), - border_subtle: hex(0xb8a878), - divider: hex(0xb8a878), + border_subtle: hex(0xb8a878), + divider: hex(0xb8a878), }; // ── Kanagawa Lotus (light) ── pub const KANAGAWA_LOTUS: Self = Self { - bg_primary: hex(0xf2ecbc), - bg_sidebar: hex(0xe5ddb0), - bg_card: hex(0xe7dba0), - bg_card_hover: hex(0xd5cea3), - bg_card_pressed: hex(0xc8c093), - bg_selected: hex(0xd5cea3), - bg_input: hex(0xe4d794), - bg_progress: hex(0xe5ddb0), - - text_primary: hex(0x545464), - text_secondary: hex(0x43436c), - text_muted: hex(0x716e61), - text_dim: hex(0x8a8980), - text_dimmer: hex(0xa09cac), - text_dimmest: hex(0xb0acb8), + bg_primary: hex(0xf2ecbc), + bg_sidebar: hex(0xe5ddb0), + bg_card: hex(0xe7dba0), + bg_card_hover: hex(0xd5cea3), + bg_card_pressed: hex(0xc8c093), + bg_selected: hex(0xd5cea3), + bg_input: hex(0xe4d794), + bg_progress: hex(0xe5ddb0), + + text_primary: hex(0x545464), + text_secondary: hex(0x43436c), + text_muted: hex(0x716e61), + text_dim: hex(0x8a8980), + text_dimmer: hex(0xa09cac), + text_dimmest: hex(0xb0acb8), text_placeholder: hex(0x8a8980), - accent_blue: hex(0x4d699b), - accent_icon: hex(0x5d57a3), - accent_progress: hex(0x5d57a3), + accent_blue: hex(0x4d699b), + accent_icon: hex(0x5d57a3), + accent_progress: hex(0x5d57a3), - btn_default: hex(0xe7dba0), - btn_hover: hex(0xd5cea3), - btn_pressed: hex(0xc8c093), + btn_default: hex(0xe7dba0), + btn_hover: hex(0xd5cea3), + btn_pressed: hex(0xc8c093), - success: hex(0x6f894e), - success_bg: hex(0xb7d0ae), - btn_success: hex(0x6e915f), + success: hex(0x6f894e), + success_bg: hex(0xb7d0ae), + btn_success: hex(0x6e915f), btn_success_hover: hex(0x608554), btn_success_pressed: hex(0x527949), - warning: hex(0xde9800), - warning_bg: hex(0xf9d791), + warning: hex(0xde9800), + warning_bg: hex(0xf9d791), - error: hex(0xc84053), - error_light: hex(0xd7474b), - error_bg: hex(0xd9a594), - btn_danger_bg: hex(0xd9a594), + error: hex(0xc84053), + error_light: hex(0xd7474b), + error_bg: hex(0xd9a594), + btn_danger_bg: hex(0xd9a594), btn_danger_hover: hex(0xc89484), - btn_trash_hover: hex(0xc84053), + btn_trash_hover: hex(0xc84053), btn_trash_pressed: hex(0xa83043), bg_modal_section: hex(0xf2ecbc), - border_subtle: hex(0xd5cea3), - divider: hex(0xd5cea3), + border_subtle: hex(0xd5cea3), + divider: hex(0xd5cea3), }; } @@ -907,784 +995,1726 @@ impl ThemePalette { // ════════════════════════════════════════════════════════════════════════ impl ThemePalette { - // ── Nord Dark ── pub const NORD_DARK: Self = Self { - bg_primary: hex(0x2E3440), bg_sidebar: hex(0x252B37), bg_card: hex(0x3B4252), - bg_card_hover: hex(0x434C5E), bg_card_pressed: hex(0x4C566A), bg_selected: hex(0x434C5E), - bg_input: hex(0x3B4252), bg_progress: hex(0x252B37), - text_primary: hex(0xD8DEE9), text_secondary: hex(0xC0C8D4), text_muted: hex(0xA0AEC0), - text_dim: hex(0x7E8FA4), text_dimmer: hex(0x616E88), text_dimmest: hex(0x4C566A), + bg_primary: hex(0x2E3440), + bg_sidebar: hex(0x252B37), + bg_card: hex(0x3B4252), + bg_card_hover: hex(0x434C5E), + bg_card_pressed: hex(0x4C566A), + bg_selected: hex(0x434C5E), + bg_input: hex(0x3B4252), + bg_progress: hex(0x252B37), + text_primary: hex(0xD8DEE9), + text_secondary: hex(0xC0C8D4), + text_muted: hex(0xA0AEC0), + text_dim: hex(0x7E8FA4), + text_dimmer: hex(0x616E88), + text_dimmest: hex(0x4C566A), text_placeholder: hex(0x616E88), - accent_blue: hex(0x88C0D0), accent_icon: hex(0x81A1C1), accent_progress: hex(0x81A1C1), - btn_default: hex(0x3B4252), btn_hover: hex(0x434C5E), btn_pressed: hex(0x4C566A), - success: hex(0xA3BE8C), success_bg: hex(0x2A3425), - btn_success: hex(0x809B6C), btn_success_hover: hex(0x728F60), btn_success_pressed: hex(0x648354), - warning: hex(0xEBCB8B), warning_bg: hex(0x3A3828), - error: hex(0xBF616A), error_light: hex(0xD08080), error_bg: hex(0x3C2830), - btn_danger_bg: hex(0x3C2830), btn_danger_hover: hex(0x5C3840), - btn_trash_hover: hex(0xBF616A), btn_trash_pressed: hex(0x9F5158), - bg_modal_section: hex(0x2E3440), border_subtle: hex(0x3B4252), divider: hex(0x3B4252), + accent_blue: hex(0x88C0D0), + accent_icon: hex(0x81A1C1), + accent_progress: hex(0x81A1C1), + btn_default: hex(0x3B4252), + btn_hover: hex(0x434C5E), + btn_pressed: hex(0x4C566A), + success: hex(0xA3BE8C), + success_bg: hex(0x2A3425), + btn_success: hex(0x809B6C), + btn_success_hover: hex(0x728F60), + btn_success_pressed: hex(0x648354), + warning: hex(0xEBCB8B), + warning_bg: hex(0x3A3828), + error: hex(0xBF616A), + error_light: hex(0xD08080), + error_bg: hex(0x3C2830), + btn_danger_bg: hex(0x3C2830), + btn_danger_hover: hex(0x5C3840), + btn_trash_hover: hex(0xBF616A), + btn_trash_pressed: hex(0x9F5158), + bg_modal_section: hex(0x2E3440), + border_subtle: hex(0x3B4252), + divider: hex(0x3B4252), }; // ── Nord Light ── pub const NORD_LIGHT: Self = Self { - bg_primary: hex(0xECEFF4), bg_sidebar: hex(0xE5E9F0), bg_card: hex(0xD8DEE9), - bg_card_hover: hex(0xCCD4DF), bg_card_pressed: hex(0xB8C2D0), bg_selected: hex(0xCCD4DF), - bg_input: hex(0xD8DEE9), bg_progress: hex(0xE5E9F0), - text_primary: hex(0x2E3440), text_secondary: hex(0x3B4252), text_muted: hex(0x4C566A), - text_dim: hex(0x636E80), text_dimmer: hex(0x7E8FA4), text_dimmest: hex(0xA0AAB8), + bg_primary: hex(0xECEFF4), + bg_sidebar: hex(0xE5E9F0), + bg_card: hex(0xD8DEE9), + bg_card_hover: hex(0xCCD4DF), + bg_card_pressed: hex(0xB8C2D0), + bg_selected: hex(0xCCD4DF), + bg_input: hex(0xD8DEE9), + bg_progress: hex(0xE5E9F0), + text_primary: hex(0x2E3440), + text_secondary: hex(0x3B4252), + text_muted: hex(0x4C566A), + text_dim: hex(0x636E80), + text_dimmer: hex(0x7E8FA4), + text_dimmest: hex(0xA0AAB8), text_placeholder: hex(0x7E8FA4), - accent_blue: hex(0x5E81AC), accent_icon: hex(0x81A1C1), accent_progress: hex(0x81A1C1), - btn_default: hex(0xD8DEE9), btn_hover: hex(0xCCD4DF), btn_pressed: hex(0xB8C2D0), - success: hex(0x6B8C56), success_bg: hex(0xD0E0C8), - btn_success: hex(0x6B8C56), btn_success_hover: hex(0x5E8048), btn_success_pressed: hex(0x50743A), - warning: hex(0xB5A050), warning_bg: hex(0xE8DFC0), - error: hex(0xA04048), error_light: hex(0xBF616A), error_bg: hex(0xE8C8C8), - btn_danger_bg: hex(0xE8C8C8), btn_danger_hover: hex(0xD8B0B0), - btn_trash_hover: hex(0xA04048), btn_trash_pressed: hex(0x883438), - bg_modal_section: hex(0xECEFF4), border_subtle: hex(0xCCD4DF), divider: hex(0xCCD4DF), + accent_blue: hex(0x5E81AC), + accent_icon: hex(0x81A1C1), + accent_progress: hex(0x81A1C1), + btn_default: hex(0xD8DEE9), + btn_hover: hex(0xCCD4DF), + btn_pressed: hex(0xB8C2D0), + success: hex(0x6B8C56), + success_bg: hex(0xD0E0C8), + btn_success: hex(0x6B8C56), + btn_success_hover: hex(0x5E8048), + btn_success_pressed: hex(0x50743A), + warning: hex(0xB5A050), + warning_bg: hex(0xE8DFC0), + error: hex(0xA04048), + error_light: hex(0xBF616A), + error_bg: hex(0xE8C8C8), + btn_danger_bg: hex(0xE8C8C8), + btn_danger_hover: hex(0xD8B0B0), + btn_trash_hover: hex(0xA04048), + btn_trash_pressed: hex(0x883438), + bg_modal_section: hex(0xECEFF4), + border_subtle: hex(0xCCD4DF), + divider: hex(0xCCD4DF), }; // ── Dracula Dark ── pub const DRACULA_DARK: Self = Self { - bg_primary: hex(0x282A36), bg_sidebar: hex(0x21222C), bg_card: hex(0x44475A), - bg_card_hover: hex(0x515470), bg_card_pressed: hex(0x606382), bg_selected: hex(0x44475A), - bg_input: hex(0x44475A), bg_progress: hex(0x21222C), - text_primary: hex(0xF8F8F2), text_secondary: hex(0xE8E8E0), text_muted: hex(0xC8C8C0), - text_dim: hex(0x9898A0), text_dimmer: hex(0x6272A4), text_dimmest: hex(0x4C5478), + bg_primary: hex(0x282A36), + bg_sidebar: hex(0x21222C), + bg_card: hex(0x44475A), + bg_card_hover: hex(0x515470), + bg_card_pressed: hex(0x606382), + bg_selected: hex(0x44475A), + bg_input: hex(0x44475A), + bg_progress: hex(0x21222C), + text_primary: hex(0xF8F8F2), + text_secondary: hex(0xE8E8E0), + text_muted: hex(0xC8C8C0), + text_dim: hex(0x9898A0), + text_dimmer: hex(0x6272A4), + text_dimmest: hex(0x4C5478), text_placeholder: hex(0x6272A4), - accent_blue: hex(0xBD93F9), accent_icon: hex(0xFF79C6), accent_progress: hex(0xBD93F9), - btn_default: hex(0x44475A), btn_hover: hex(0x515470), btn_pressed: hex(0x606382), - success: hex(0x50FA7B), success_bg: hex(0x1E3228), - btn_success: hex(0x40C862), btn_success_hover: hex(0x38B858), btn_success_pressed: hex(0x30A84E), - warning: hex(0xF1FA8C), warning_bg: hex(0x3A382A), - error: hex(0xFF5555), error_light: hex(0xFF7777), error_bg: hex(0x3C222A), - btn_danger_bg: hex(0x3C222A), btn_danger_hover: hex(0x5C323A), - btn_trash_hover: hex(0xFF5555), btn_trash_pressed: hex(0xDD4444), - bg_modal_section: hex(0x282A36), border_subtle: hex(0x44475A), divider: hex(0x44475A), + accent_blue: hex(0xBD93F9), + accent_icon: hex(0xFF79C6), + accent_progress: hex(0xBD93F9), + btn_default: hex(0x44475A), + btn_hover: hex(0x515470), + btn_pressed: hex(0x606382), + success: hex(0x50FA7B), + success_bg: hex(0x1E3228), + btn_success: hex(0x40C862), + btn_success_hover: hex(0x38B858), + btn_success_pressed: hex(0x30A84E), + warning: hex(0xF1FA8C), + warning_bg: hex(0x3A382A), + error: hex(0xFF5555), + error_light: hex(0xFF7777), + error_bg: hex(0x3C222A), + btn_danger_bg: hex(0x3C222A), + btn_danger_hover: hex(0x5C323A), + btn_trash_hover: hex(0xFF5555), + btn_trash_pressed: hex(0xDD4444), + bg_modal_section: hex(0x282A36), + border_subtle: hex(0x44475A), + divider: hex(0x44475A), }; // ── Dracula Light ── pub const DRACULA_LIGHT: Self = Self { - bg_primary: hex(0xFFFBEB), bg_sidebar: hex(0xF4EFD8), bg_card: hex(0xE8E4CF), - bg_card_hover: hex(0xDCD8C0), bg_card_pressed: hex(0xD0CCB8), bg_selected: hex(0xDCD8C0), - bg_input: hex(0xE8E4CF), bg_progress: hex(0xF4EFD8), - text_primary: hex(0x1F1F1F), text_secondary: hex(0x333333), text_muted: hex(0x555555), - text_dim: hex(0x777777), text_dimmer: hex(0x7970A9), text_dimmest: hex(0xA09CA0), + bg_primary: hex(0xFFFBEB), + bg_sidebar: hex(0xF4EFD8), + bg_card: hex(0xE8E4CF), + bg_card_hover: hex(0xDCD8C0), + bg_card_pressed: hex(0xD0CCB8), + bg_selected: hex(0xDCD8C0), + bg_input: hex(0xE8E4CF), + bg_progress: hex(0xF4EFD8), + text_primary: hex(0x1F1F1F), + text_secondary: hex(0x333333), + text_muted: hex(0x555555), + text_dim: hex(0x777777), + text_dimmer: hex(0x7970A9), + text_dimmest: hex(0xA09CA0), text_placeholder: hex(0x7970A9), - accent_blue: hex(0x7C5FC2), accent_icon: hex(0xE04886), accent_progress: hex(0x7C5FC2), - btn_default: hex(0xE8E4CF), btn_hover: hex(0xDCD8C0), btn_pressed: hex(0xD0CCB8), - success: hex(0x2BA479), success_bg: hex(0xD0E8D8), - btn_success: hex(0x2BA479), btn_success_hover: hex(0x24966C), btn_success_pressed: hex(0x1D8860), - warning: hex(0xD5A212), warning_bg: hex(0xEDE0C0), - error: hex(0xDE3535), error_light: hex(0xE85858), error_bg: hex(0xEEDCDC), - btn_danger_bg: hex(0xEEDCDC), btn_danger_hover: hex(0xDEC8C8), - btn_trash_hover: hex(0xDE3535), btn_trash_pressed: hex(0xC02828), - bg_modal_section: hex(0xFFFBEB), border_subtle: hex(0xDCD8C0), divider: hex(0xDCD8C0), + accent_blue: hex(0x7C5FC2), + accent_icon: hex(0xE04886), + accent_progress: hex(0x7C5FC2), + btn_default: hex(0xE8E4CF), + btn_hover: hex(0xDCD8C0), + btn_pressed: hex(0xD0CCB8), + success: hex(0x2BA479), + success_bg: hex(0xD0E8D8), + btn_success: hex(0x2BA479), + btn_success_hover: hex(0x24966C), + btn_success_pressed: hex(0x1D8860), + warning: hex(0xD5A212), + warning_bg: hex(0xEDE0C0), + error: hex(0xDE3535), + error_light: hex(0xE85858), + error_bg: hex(0xEEDCDC), + btn_danger_bg: hex(0xEEDCDC), + btn_danger_hover: hex(0xDEC8C8), + btn_trash_hover: hex(0xDE3535), + btn_trash_pressed: hex(0xC02828), + bg_modal_section: hex(0xFFFBEB), + border_subtle: hex(0xDCD8C0), + divider: hex(0xDCD8C0), }; // ── Solarized Dark ── pub const SOLARIZED_DARK: Self = Self { - bg_primary: hex(0x002B36), bg_sidebar: hex(0x00222C), bg_card: hex(0x073642), - bg_card_hover: hex(0x0A4858), bg_card_pressed: hex(0x1A5A6C), bg_selected: hex(0x073642), - bg_input: hex(0x073642), bg_progress: hex(0x00222C), - text_primary: hex(0x839496), text_secondary: hex(0x93A1A1), text_muted: hex(0x738C90), - text_dim: hex(0x657B83), text_dimmer: hex(0x586E75), text_dimmest: hex(0x475860), + bg_primary: hex(0x002B36), + bg_sidebar: hex(0x00222C), + bg_card: hex(0x073642), + bg_card_hover: hex(0x0A4858), + bg_card_pressed: hex(0x1A5A6C), + bg_selected: hex(0x073642), + bg_input: hex(0x073642), + bg_progress: hex(0x00222C), + text_primary: hex(0x839496), + text_secondary: hex(0x93A1A1), + text_muted: hex(0x738C90), + text_dim: hex(0x657B83), + text_dimmer: hex(0x586E75), + text_dimmest: hex(0x475860), text_placeholder: hex(0x586E75), - accent_blue: hex(0x268BD2), accent_icon: hex(0x2AA198), accent_progress: hex(0x268BD2), - btn_default: hex(0x073642), btn_hover: hex(0x0A4858), btn_pressed: hex(0x1A5A6C), - success: hex(0x859900), success_bg: hex(0x0A2A18), - btn_success: hex(0x6A7A00), btn_success_hover: hex(0x5C6C00), btn_success_pressed: hex(0x4E5E00), - warning: hex(0xB58900), warning_bg: hex(0x1A2818), - error: hex(0xDC322F), error_light: hex(0xE8504E), error_bg: hex(0x2A1A1A), - btn_danger_bg: hex(0x2A1A1A), btn_danger_hover: hex(0x3A2A2A), - btn_trash_hover: hex(0xDC322F), btn_trash_pressed: hex(0xBC2220), - bg_modal_section: hex(0x002B36), border_subtle: hex(0x073642), divider: hex(0x073642), + accent_blue: hex(0x268BD2), + accent_icon: hex(0x2AA198), + accent_progress: hex(0x268BD2), + btn_default: hex(0x073642), + btn_hover: hex(0x0A4858), + btn_pressed: hex(0x1A5A6C), + success: hex(0x859900), + success_bg: hex(0x0A2A18), + btn_success: hex(0x6A7A00), + btn_success_hover: hex(0x5C6C00), + btn_success_pressed: hex(0x4E5E00), + warning: hex(0xB58900), + warning_bg: hex(0x1A2818), + error: hex(0xDC322F), + error_light: hex(0xE8504E), + error_bg: hex(0x2A1A1A), + btn_danger_bg: hex(0x2A1A1A), + btn_danger_hover: hex(0x3A2A2A), + btn_trash_hover: hex(0xDC322F), + btn_trash_pressed: hex(0xBC2220), + bg_modal_section: hex(0x002B36), + border_subtle: hex(0x073642), + divider: hex(0x073642), }; // ── Solarized Light ── pub const SOLARIZED_LIGHT: Self = Self { - bg_primary: hex(0xFDF6E3), bg_sidebar: hex(0xEEE8D5), bg_card: hex(0xE6E0CA), - bg_card_hover: hex(0xDCD6C0), bg_card_pressed: hex(0xD0CAB4), bg_selected: hex(0xDCD6C0), - bg_input: hex(0xE6E0CA), bg_progress: hex(0xEEE8D5), - text_primary: hex(0x657B83), text_secondary: hex(0x586E75), text_muted: hex(0x7C8E94), - text_dim: hex(0x93A1A1), text_dimmer: hex(0xA8B4B8), text_dimmest: hex(0xC0C8CA), + bg_primary: hex(0xFDF6E3), + bg_sidebar: hex(0xEEE8D5), + bg_card: hex(0xE6E0CA), + bg_card_hover: hex(0xDCD6C0), + bg_card_pressed: hex(0xD0CAB4), + bg_selected: hex(0xDCD6C0), + bg_input: hex(0xE6E0CA), + bg_progress: hex(0xEEE8D5), + text_primary: hex(0x657B83), + text_secondary: hex(0x586E75), + text_muted: hex(0x7C8E94), + text_dim: hex(0x93A1A1), + text_dimmer: hex(0xA8B4B8), + text_dimmest: hex(0xC0C8CA), text_placeholder: hex(0xA8B4B8), - accent_blue: hex(0x268BD2), accent_icon: hex(0x2AA198), accent_progress: hex(0x268BD2), - btn_default: hex(0xE6E0CA), btn_hover: hex(0xDCD6C0), btn_pressed: hex(0xD0CAB4), - success: hex(0x859900), success_bg: hex(0xDAE8C8), - btn_success: hex(0x6A7A00), btn_success_hover: hex(0x5C6C00), btn_success_pressed: hex(0x4E5E00), - warning: hex(0xB58900), warning_bg: hex(0xECE0C0), - error: hex(0xDC322F), error_light: hex(0xE8504E), error_bg: hex(0xECCCCC), - btn_danger_bg: hex(0xECCCCC), btn_danger_hover: hex(0xDCB8B8), - btn_trash_hover: hex(0xDC322F), btn_trash_pressed: hex(0xBC2220), - bg_modal_section: hex(0xFDF6E3), border_subtle: hex(0xDCD6C0), divider: hex(0xDCD6C0), + accent_blue: hex(0x268BD2), + accent_icon: hex(0x2AA198), + accent_progress: hex(0x268BD2), + btn_default: hex(0xE6E0CA), + btn_hover: hex(0xDCD6C0), + btn_pressed: hex(0xD0CAB4), + success: hex(0x859900), + success_bg: hex(0xDAE8C8), + btn_success: hex(0x6A7A00), + btn_success_hover: hex(0x5C6C00), + btn_success_pressed: hex(0x4E5E00), + warning: hex(0xB58900), + warning_bg: hex(0xECE0C0), + error: hex(0xDC322F), + error_light: hex(0xE8504E), + error_bg: hex(0xECCCCC), + btn_danger_bg: hex(0xECCCCC), + btn_danger_hover: hex(0xDCB8B8), + btn_trash_hover: hex(0xDC322F), + btn_trash_pressed: hex(0xBC2220), + bg_modal_section: hex(0xFDF6E3), + border_subtle: hex(0xDCD6C0), + divider: hex(0xDCD6C0), }; // ── Tokyo Night ── pub const TOKYONIGHT_NIGHT: Self = Self { - bg_primary: hex(0x1A1B26), bg_sidebar: hex(0x16161E), bg_card: hex(0x292E42), - bg_card_hover: hex(0x3B4261), bg_card_pressed: hex(0x414868), bg_selected: hex(0x2D3F76), - bg_input: hex(0x292E42), bg_progress: hex(0x16161E), - text_primary: hex(0xC0CAF5), text_secondary: hex(0xA9B1D6), text_muted: hex(0x8890B0), - text_dim: hex(0x737AA2), text_dimmer: hex(0x565F89), text_dimmest: hex(0x414868), + bg_primary: hex(0x1A1B26), + bg_sidebar: hex(0x16161E), + bg_card: hex(0x292E42), + bg_card_hover: hex(0x3B4261), + bg_card_pressed: hex(0x414868), + bg_selected: hex(0x2D3F76), + bg_input: hex(0x292E42), + bg_progress: hex(0x16161E), + text_primary: hex(0xC0CAF5), + text_secondary: hex(0xA9B1D6), + text_muted: hex(0x8890B0), + text_dim: hex(0x737AA2), + text_dimmer: hex(0x565F89), + text_dimmest: hex(0x414868), text_placeholder: hex(0x565F89), - accent_blue: hex(0x7AA2F7), accent_icon: hex(0x7DCFFF), accent_progress: hex(0x7AA2F7), - btn_default: hex(0x292E42), btn_hover: hex(0x3B4261), btn_pressed: hex(0x414868), - success: hex(0x9ECE6A), success_bg: hex(0x202830), - btn_success: hex(0x7EAA50), btn_success_hover: hex(0x709E44), btn_success_pressed: hex(0x629238), - warning: hex(0xE0AF68), warning_bg: hex(0x302820), - error: hex(0xF7768E), error_light: hex(0xDB4B4B), error_bg: hex(0x302025), - btn_danger_bg: hex(0x302025), btn_danger_hover: hex(0x503035), - btn_trash_hover: hex(0xF7768E), btn_trash_pressed: hex(0xD75E76), - bg_modal_section: hex(0x1A1B26), border_subtle: hex(0x292E42), divider: hex(0x292E42), + accent_blue: hex(0x7AA2F7), + accent_icon: hex(0x7DCFFF), + accent_progress: hex(0x7AA2F7), + btn_default: hex(0x292E42), + btn_hover: hex(0x3B4261), + btn_pressed: hex(0x414868), + success: hex(0x9ECE6A), + success_bg: hex(0x202830), + btn_success: hex(0x7EAA50), + btn_success_hover: hex(0x709E44), + btn_success_pressed: hex(0x629238), + warning: hex(0xE0AF68), + warning_bg: hex(0x302820), + error: hex(0xF7768E), + error_light: hex(0xDB4B4B), + error_bg: hex(0x302025), + btn_danger_bg: hex(0x302025), + btn_danger_hover: hex(0x503035), + btn_trash_hover: hex(0xF7768E), + btn_trash_pressed: hex(0xD75E76), + bg_modal_section: hex(0x1A1B26), + border_subtle: hex(0x292E42), + divider: hex(0x292E42), }; // ── Tokyo Night Day ── pub const TOKYONIGHT_DAY: Self = Self { - bg_primary: hex(0xE1E2E7), bg_sidebar: hex(0xD0D5E3), bg_card: hex(0xC4C8DA), - bg_card_hover: hex(0xB7C1E3), bg_card_pressed: hex(0xA8B4D4), bg_selected: hex(0xB7C1E3), - bg_input: hex(0xC4C8DA), bg_progress: hex(0xD0D5E3), - text_primary: hex(0x3760BF), text_secondary: hex(0x4A6CA8), text_muted: hex(0x6172B0), - text_dim: hex(0x848CB5), text_dimmer: hex(0xA1A6C5), text_dimmest: hex(0xB4B5B9), + bg_primary: hex(0xE1E2E7), + bg_sidebar: hex(0xD0D5E3), + bg_card: hex(0xC4C8DA), + bg_card_hover: hex(0xB7C1E3), + bg_card_pressed: hex(0xA8B4D4), + bg_selected: hex(0xB7C1E3), + bg_input: hex(0xC4C8DA), + bg_progress: hex(0xD0D5E3), + text_primary: hex(0x3760BF), + text_secondary: hex(0x4A6CA8), + text_muted: hex(0x6172B0), + text_dim: hex(0x848CB5), + text_dimmer: hex(0xA1A6C5), + text_dimmest: hex(0xB4B5B9), text_placeholder: hex(0xA1A6C5), - accent_blue: hex(0x2E7DE9), accent_icon: hex(0x007197), accent_progress: hex(0x2E7DE9), - btn_default: hex(0xC4C8DA), btn_hover: hex(0xB7C1E3), btn_pressed: hex(0xA8B4D4), - success: hex(0x587539), success_bg: hex(0xC8DCC0), - btn_success: hex(0x587539), btn_success_hover: hex(0x4C692E), btn_success_pressed: hex(0x405D24), - warning: hex(0x8C6C3E), warning_bg: hex(0xDCD8C0), - error: hex(0xF52A65), error_light: hex(0xC64343), error_bg: hex(0xE8C0C8), - btn_danger_bg: hex(0xE8C0C8), btn_danger_hover: hex(0xD8A8B4), - btn_trash_hover: hex(0xF52A65), btn_trash_pressed: hex(0xD52050), - bg_modal_section: hex(0xE1E2E7), border_subtle: hex(0xC4C8DA), divider: hex(0xC4C8DA), + accent_blue: hex(0x2E7DE9), + accent_icon: hex(0x007197), + accent_progress: hex(0x2E7DE9), + btn_default: hex(0xC4C8DA), + btn_hover: hex(0xB7C1E3), + btn_pressed: hex(0xA8B4D4), + success: hex(0x587539), + success_bg: hex(0xC8DCC0), + btn_success: hex(0x587539), + btn_success_hover: hex(0x4C692E), + btn_success_pressed: hex(0x405D24), + warning: hex(0x8C6C3E), + warning_bg: hex(0xDCD8C0), + error: hex(0xF52A65), + error_light: hex(0xC64343), + error_bg: hex(0xE8C0C8), + btn_danger_bg: hex(0xE8C0C8), + btn_danger_hover: hex(0xD8A8B4), + btn_trash_hover: hex(0xF52A65), + btn_trash_pressed: hex(0xD52050), + bg_modal_section: hex(0xE1E2E7), + border_subtle: hex(0xC4C8DA), + divider: hex(0xC4C8DA), }; // ── Rosé Pine ── pub const ROSEPINE_MAIN: Self = Self { - bg_primary: hex(0x191724), bg_sidebar: hex(0x1F1D2E), bg_card: hex(0x26233A), - bg_card_hover: hex(0x403D52), bg_card_pressed: hex(0x524F67), bg_selected: hex(0x403D52), - bg_input: hex(0x26233A), bg_progress: hex(0x1F1D2E), - text_primary: hex(0xE0DEF4), text_secondary: hex(0xCCCADD), text_muted: hex(0x908CAA), - text_dim: hex(0x7E7A96), text_dimmer: hex(0x6E6A86), text_dimmest: hex(0x555168), + bg_primary: hex(0x191724), + bg_sidebar: hex(0x1F1D2E), + bg_card: hex(0x26233A), + bg_card_hover: hex(0x403D52), + bg_card_pressed: hex(0x524F67), + bg_selected: hex(0x403D52), + bg_input: hex(0x26233A), + bg_progress: hex(0x1F1D2E), + text_primary: hex(0xE0DEF4), + text_secondary: hex(0xCCCADD), + text_muted: hex(0x908CAA), + text_dim: hex(0x7E7A96), + text_dimmer: hex(0x6E6A86), + text_dimmest: hex(0x555168), text_placeholder: hex(0x6E6A86), - accent_blue: hex(0x9CCFD8), accent_icon: hex(0xC4A7E7), accent_progress: hex(0x9CCFD8), - btn_default: hex(0x26233A), btn_hover: hex(0x403D52), btn_pressed: hex(0x524F67), - success: hex(0x31748F), success_bg: hex(0x1E2830), - btn_success: hex(0x2A6478), btn_success_hover: hex(0x24586C), btn_success_pressed: hex(0x1E4C60), - warning: hex(0xF6C177), warning_bg: hex(0x302820), - error: hex(0xEB6F92), error_light: hex(0xF08098), error_bg: hex(0x301828), - btn_danger_bg: hex(0x301828), btn_danger_hover: hex(0x502838), - btn_trash_hover: hex(0xEB6F92), btn_trash_pressed: hex(0xCB5878), - bg_modal_section: hex(0x191724), border_subtle: hex(0x26233A), divider: hex(0x26233A), + accent_blue: hex(0x9CCFD8), + accent_icon: hex(0xC4A7E7), + accent_progress: hex(0x9CCFD8), + btn_default: hex(0x26233A), + btn_hover: hex(0x403D52), + btn_pressed: hex(0x524F67), + success: hex(0x31748F), + success_bg: hex(0x1E2830), + btn_success: hex(0x2A6478), + btn_success_hover: hex(0x24586C), + btn_success_pressed: hex(0x1E4C60), + warning: hex(0xF6C177), + warning_bg: hex(0x302820), + error: hex(0xEB6F92), + error_light: hex(0xF08098), + error_bg: hex(0x301828), + btn_danger_bg: hex(0x301828), + btn_danger_hover: hex(0x502838), + btn_trash_hover: hex(0xEB6F92), + btn_trash_pressed: hex(0xCB5878), + bg_modal_section: hex(0x191724), + border_subtle: hex(0x26233A), + divider: hex(0x26233A), }; // ── Rosé Pine Moon ── pub const ROSEPINE_MOON: Self = Self { - bg_primary: hex(0x232136), bg_sidebar: hex(0x2A273F), bg_card: hex(0x393552), - bg_card_hover: hex(0x44415A), bg_card_pressed: hex(0x56526E), bg_selected: hex(0x44415A), - bg_input: hex(0x393552), bg_progress: hex(0x2A273F), - text_primary: hex(0xE0DEF4), text_secondary: hex(0xCCCADD), text_muted: hex(0x908CAA), - text_dim: hex(0x7E7A96), text_dimmer: hex(0x6E6A86), text_dimmest: hex(0x555168), + bg_primary: hex(0x232136), + bg_sidebar: hex(0x2A273F), + bg_card: hex(0x393552), + bg_card_hover: hex(0x44415A), + bg_card_pressed: hex(0x56526E), + bg_selected: hex(0x44415A), + bg_input: hex(0x393552), + bg_progress: hex(0x2A273F), + text_primary: hex(0xE0DEF4), + text_secondary: hex(0xCCCADD), + text_muted: hex(0x908CAA), + text_dim: hex(0x7E7A96), + text_dimmer: hex(0x6E6A86), + text_dimmest: hex(0x555168), text_placeholder: hex(0x6E6A86), - accent_blue: hex(0x9CCFD8), accent_icon: hex(0xC4A7E7), accent_progress: hex(0x9CCFD8), - btn_default: hex(0x393552), btn_hover: hex(0x44415A), btn_pressed: hex(0x56526E), - success: hex(0x3E8FB0), success_bg: hex(0x202830), - btn_success: hex(0x347A98), btn_success_hover: hex(0x2C6E88), btn_success_pressed: hex(0x246278), - warning: hex(0xF6C177), warning_bg: hex(0x382820), - error: hex(0xEB6F92), error_light: hex(0xF08098), error_bg: hex(0x381828), - btn_danger_bg: hex(0x381828), btn_danger_hover: hex(0x582838), - btn_trash_hover: hex(0xEB6F92), btn_trash_pressed: hex(0xCB5878), - bg_modal_section: hex(0x232136), border_subtle: hex(0x393552), divider: hex(0x393552), + accent_blue: hex(0x9CCFD8), + accent_icon: hex(0xC4A7E7), + accent_progress: hex(0x9CCFD8), + btn_default: hex(0x393552), + btn_hover: hex(0x44415A), + btn_pressed: hex(0x56526E), + success: hex(0x3E8FB0), + success_bg: hex(0x202830), + btn_success: hex(0x347A98), + btn_success_hover: hex(0x2C6E88), + btn_success_pressed: hex(0x246278), + warning: hex(0xF6C177), + warning_bg: hex(0x382820), + error: hex(0xEB6F92), + error_light: hex(0xF08098), + error_bg: hex(0x381828), + btn_danger_bg: hex(0x381828), + btn_danger_hover: hex(0x582838), + btn_trash_hover: hex(0xEB6F92), + btn_trash_pressed: hex(0xCB5878), + bg_modal_section: hex(0x232136), + border_subtle: hex(0x393552), + divider: hex(0x393552), }; // ── Rosé Pine Dawn (light) ── pub const ROSEPINE_DAWN: Self = Self { - bg_primary: hex(0xFAF4ED), bg_sidebar: hex(0xF2E9E1), bg_card: hex(0xF4EDE8), - bg_card_hover: hex(0xDFDAD9), bg_card_pressed: hex(0xCECACD), bg_selected: hex(0xDFDAD9), - bg_input: hex(0xF4EDE8), bg_progress: hex(0xF2E9E1), - text_primary: hex(0x575279), text_secondary: hex(0x6E6A86), text_muted: hex(0x797593), - text_dim: hex(0x9893A5), text_dimmer: hex(0xB0ACC0), text_dimmest: hex(0xC0BCC8), + bg_primary: hex(0xFAF4ED), + bg_sidebar: hex(0xF2E9E1), + bg_card: hex(0xF4EDE8), + bg_card_hover: hex(0xDFDAD9), + bg_card_pressed: hex(0xCECACD), + bg_selected: hex(0xDFDAD9), + bg_input: hex(0xF4EDE8), + bg_progress: hex(0xF2E9E1), + text_primary: hex(0x575279), + text_secondary: hex(0x6E6A86), + text_muted: hex(0x797593), + text_dim: hex(0x9893A5), + text_dimmer: hex(0xB0ACC0), + text_dimmest: hex(0xC0BCC8), text_placeholder: hex(0xB0ACC0), - accent_blue: hex(0x56949F), accent_icon: hex(0x907AA9), accent_progress: hex(0x56949F), - btn_default: hex(0xF4EDE8), btn_hover: hex(0xDFDAD9), btn_pressed: hex(0xCECACD), - success: hex(0x286983), success_bg: hex(0xD0E0D8), - btn_success: hex(0x286983), btn_success_hover: hex(0x205C74), btn_success_pressed: hex(0x184F65), - warning: hex(0xEA9D34), warning_bg: hex(0xECE0C8), - error: hex(0xB4637A), error_light: hex(0xC87890), error_bg: hex(0xE8D0D4), - btn_danger_bg: hex(0xE8D0D4), btn_danger_hover: hex(0xD8BCC4), - btn_trash_hover: hex(0xB4637A), btn_trash_pressed: hex(0x965268), - bg_modal_section: hex(0xFAF4ED), border_subtle: hex(0xDFDAD9), divider: hex(0xDFDAD9), + accent_blue: hex(0x56949F), + accent_icon: hex(0x907AA9), + accent_progress: hex(0x56949F), + btn_default: hex(0xF4EDE8), + btn_hover: hex(0xDFDAD9), + btn_pressed: hex(0xCECACD), + success: hex(0x286983), + success_bg: hex(0xD0E0D8), + btn_success: hex(0x286983), + btn_success_hover: hex(0x205C74), + btn_success_pressed: hex(0x184F65), + warning: hex(0xEA9D34), + warning_bg: hex(0xECE0C8), + error: hex(0xB4637A), + error_light: hex(0xC87890), + error_bg: hex(0xE8D0D4), + btn_danger_bg: hex(0xE8D0D4), + btn_danger_hover: hex(0xD8BCC4), + btn_trash_hover: hex(0xB4637A), + btn_trash_pressed: hex(0x965268), + bg_modal_section: hex(0xFAF4ED), + border_subtle: hex(0xDFDAD9), + divider: hex(0xDFDAD9), }; // ── One Dark ── pub const ONEDARK_DARK: Self = Self { - bg_primary: hex(0x282C34), bg_sidebar: hex(0x21252B), bg_card: hex(0x3E4452), - bg_card_hover: hex(0x4B5162), bg_card_pressed: hex(0x5C6370), bg_selected: hex(0x3E4452), - bg_input: hex(0x3E4452), bg_progress: hex(0x21252B), - text_primary: hex(0xABB2BF), text_secondary: hex(0x9DA4B0), text_muted: hex(0x848B98), - text_dim: hex(0x6B7280), text_dimmer: hex(0x5C6370), text_dimmest: hex(0x4B5162), + bg_primary: hex(0x282C34), + bg_sidebar: hex(0x21252B), + bg_card: hex(0x3E4452), + bg_card_hover: hex(0x4B5162), + bg_card_pressed: hex(0x5C6370), + bg_selected: hex(0x3E4452), + bg_input: hex(0x3E4452), + bg_progress: hex(0x21252B), + text_primary: hex(0xABB2BF), + text_secondary: hex(0x9DA4B0), + text_muted: hex(0x848B98), + text_dim: hex(0x6B7280), + text_dimmer: hex(0x5C6370), + text_dimmest: hex(0x4B5162), text_placeholder: hex(0x5C6370), - accent_blue: hex(0x61AFEF), accent_icon: hex(0x56B6C2), accent_progress: hex(0x61AFEF), - btn_default: hex(0x3E4452), btn_hover: hex(0x4B5162), btn_pressed: hex(0x5C6370), - success: hex(0x98C379), success_bg: hex(0x1E3428), - btn_success: hex(0x78A060), btn_success_hover: hex(0x6C9454), btn_success_pressed: hex(0x608848), - warning: hex(0xE5C07B), warning_bg: hex(0x343020), - error: hex(0xE06C75), error_light: hex(0xE88888), error_bg: hex(0x342028), - btn_danger_bg: hex(0x342028), btn_danger_hover: hex(0x543038), - btn_trash_hover: hex(0xE06C75), btn_trash_pressed: hex(0xC05860), - bg_modal_section: hex(0x282C34), border_subtle: hex(0x3E4452), divider: hex(0x3E4452), + accent_blue: hex(0x61AFEF), + accent_icon: hex(0x56B6C2), + accent_progress: hex(0x61AFEF), + btn_default: hex(0x3E4452), + btn_hover: hex(0x4B5162), + btn_pressed: hex(0x5C6370), + success: hex(0x98C379), + success_bg: hex(0x1E3428), + btn_success: hex(0x78A060), + btn_success_hover: hex(0x6C9454), + btn_success_pressed: hex(0x608848), + warning: hex(0xE5C07B), + warning_bg: hex(0x343020), + error: hex(0xE06C75), + error_light: hex(0xE88888), + error_bg: hex(0x342028), + btn_danger_bg: hex(0x342028), + btn_danger_hover: hex(0x543038), + btn_trash_hover: hex(0xE06C75), + btn_trash_pressed: hex(0xC05860), + bg_modal_section: hex(0x282C34), + border_subtle: hex(0x3E4452), + divider: hex(0x3E4452), }; // ── One Dark Light ── pub const ONEDARK_LIGHT: Self = Self { - bg_primary: hex(0xFAFAFA), bg_sidebar: hex(0xF0F0F0), bg_card: hex(0xE2E2E2), - bg_card_hover: hex(0xD4D4D4), bg_card_pressed: hex(0xC8C8C8), bg_selected: hex(0xD4D4D4), - bg_input: hex(0xE2E2E2), bg_progress: hex(0xF0F0F0), - text_primary: hex(0x383A42), text_secondary: hex(0x4A4C56), text_muted: hex(0x686A76), - text_dim: hex(0x818387), text_dimmer: hex(0xA0A1A7), text_dimmest: hex(0xB8B9BC), + bg_primary: hex(0xFAFAFA), + bg_sidebar: hex(0xF0F0F0), + bg_card: hex(0xE2E2E2), + bg_card_hover: hex(0xD4D4D4), + bg_card_pressed: hex(0xC8C8C8), + bg_selected: hex(0xD4D4D4), + bg_input: hex(0xE2E2E2), + bg_progress: hex(0xF0F0F0), + text_primary: hex(0x383A42), + text_secondary: hex(0x4A4C56), + text_muted: hex(0x686A76), + text_dim: hex(0x818387), + text_dimmer: hex(0xA0A1A7), + text_dimmest: hex(0xB8B9BC), text_placeholder: hex(0xA0A1A7), - accent_blue: hex(0x4078F2), accent_icon: hex(0x0184BC), accent_progress: hex(0x4078F2), - btn_default: hex(0xE2E2E2), btn_hover: hex(0xD4D4D4), btn_pressed: hex(0xC8C8C8), - success: hex(0x50A14F), success_bg: hex(0xD0E8D0), - btn_success: hex(0x50A14F), btn_success_hover: hex(0x449444), btn_success_pressed: hex(0x388838), - warning: hex(0xC18401), warning_bg: hex(0xECE0C0), - error: hex(0xE45649), error_light: hex(0xF06860), error_bg: hex(0xEACCCC), - btn_danger_bg: hex(0xEACCCC), btn_danger_hover: hex(0xDAB8B8), - btn_trash_hover: hex(0xE45649), btn_trash_pressed: hex(0xC44038), - bg_modal_section: hex(0xFAFAFA), border_subtle: hex(0xD4D4D4), divider: hex(0xD4D4D4), + accent_blue: hex(0x4078F2), + accent_icon: hex(0x0184BC), + accent_progress: hex(0x4078F2), + btn_default: hex(0xE2E2E2), + btn_hover: hex(0xD4D4D4), + btn_pressed: hex(0xC8C8C8), + success: hex(0x50A14F), + success_bg: hex(0xD0E8D0), + btn_success: hex(0x50A14F), + btn_success_hover: hex(0x449444), + btn_success_pressed: hex(0x388838), + warning: hex(0xC18401), + warning_bg: hex(0xECE0C0), + error: hex(0xE45649), + error_light: hex(0xF06860), + error_bg: hex(0xEACCCC), + btn_danger_bg: hex(0xEACCCC), + btn_danger_hover: hex(0xDAB8B8), + btn_trash_hover: hex(0xE45649), + btn_trash_pressed: hex(0xC44038), + bg_modal_section: hex(0xFAFAFA), + border_subtle: hex(0xD4D4D4), + divider: hex(0xD4D4D4), }; // ── Monokai Pro ── pub const MONOKAI_PRO: Self = Self { - bg_primary: hex(0x2D2A2E), bg_sidebar: hex(0x221F22), bg_card: hex(0x403E41), - bg_card_hover: hex(0x525052), bg_card_pressed: hex(0x5B595C), bg_selected: hex(0x403E41), - bg_input: hex(0x403E41), bg_progress: hex(0x221F22), - text_primary: hex(0xFCFCFA), text_secondary: hex(0xE0E0DE), text_muted: hex(0xC1C0C0), - text_dim: hex(0x939293), text_dimmer: hex(0x727072), text_dimmest: hex(0x5B595C), + bg_primary: hex(0x2D2A2E), + bg_sidebar: hex(0x221F22), + bg_card: hex(0x403E41), + bg_card_hover: hex(0x525052), + bg_card_pressed: hex(0x5B595C), + bg_selected: hex(0x403E41), + bg_input: hex(0x403E41), + bg_progress: hex(0x221F22), + text_primary: hex(0xFCFCFA), + text_secondary: hex(0xE0E0DE), + text_muted: hex(0xC1C0C0), + text_dim: hex(0x939293), + text_dimmer: hex(0x727072), + text_dimmest: hex(0x5B595C), text_placeholder: hex(0x727072), - accent_blue: hex(0x78DCE8), accent_icon: hex(0xAB9DF2), accent_progress: hex(0x78DCE8), - btn_default: hex(0x403E41), btn_hover: hex(0x525052), btn_pressed: hex(0x5B595C), - success: hex(0xA9DC76), success_bg: hex(0x222820), - btn_success: hex(0x88B860), btn_success_hover: hex(0x7CAC54), btn_success_pressed: hex(0x70A048), - warning: hex(0xFFD866), warning_bg: hex(0x302A20), - error: hex(0xFF6188), error_light: hex(0xFF8098), error_bg: hex(0x341E28), - btn_danger_bg: hex(0x341E28), btn_danger_hover: hex(0x542E38), - btn_trash_hover: hex(0xFF6188), btn_trash_pressed: hex(0xDF5070), - bg_modal_section: hex(0x2D2A2E), border_subtle: hex(0x403E41), divider: hex(0x403E41), + accent_blue: hex(0x78DCE8), + accent_icon: hex(0xAB9DF2), + accent_progress: hex(0x78DCE8), + btn_default: hex(0x403E41), + btn_hover: hex(0x525052), + btn_pressed: hex(0x5B595C), + success: hex(0xA9DC76), + success_bg: hex(0x222820), + btn_success: hex(0x88B860), + btn_success_hover: hex(0x7CAC54), + btn_success_pressed: hex(0x70A048), + warning: hex(0xFFD866), + warning_bg: hex(0x302A20), + error: hex(0xFF6188), + error_light: hex(0xFF8098), + error_bg: hex(0x341E28), + btn_danger_bg: hex(0x341E28), + btn_danger_hover: hex(0x542E38), + btn_trash_hover: hex(0xFF6188), + btn_trash_pressed: hex(0xDF5070), + bg_modal_section: hex(0x2D2A2E), + border_subtle: hex(0x403E41), + divider: hex(0x403E41), }; // ── Monokai Classic ── pub const MONOKAI_CLASSIC: Self = Self { - bg_primary: hex(0x272822), bg_sidebar: hex(0x1A1A18), bg_card: hex(0x49483E), - bg_card_hover: hex(0x5A5950), bg_card_pressed: hex(0x6B6A62), bg_selected: hex(0x49483E), - bg_input: hex(0x49483E), bg_progress: hex(0x1A1A18), - text_primary: hex(0xF8F8F2), text_secondary: hex(0xE0E0D8), text_muted: hex(0xC1C0C0), - text_dim: hex(0x939293), text_dimmer: hex(0x75715E), text_dimmest: hex(0x5B595C), + bg_primary: hex(0x272822), + bg_sidebar: hex(0x1A1A18), + bg_card: hex(0x49483E), + bg_card_hover: hex(0x5A5950), + bg_card_pressed: hex(0x6B6A62), + bg_selected: hex(0x49483E), + bg_input: hex(0x49483E), + bg_progress: hex(0x1A1A18), + text_primary: hex(0xF8F8F2), + text_secondary: hex(0xE0E0D8), + text_muted: hex(0xC1C0C0), + text_dim: hex(0x939293), + text_dimmer: hex(0x75715E), + text_dimmest: hex(0x5B595C), text_placeholder: hex(0x75715E), - accent_blue: hex(0x66D9EF), accent_icon: hex(0xAE81FF), accent_progress: hex(0x66D9EF), - btn_default: hex(0x49483E), btn_hover: hex(0x5A5950), btn_pressed: hex(0x6B6A62), - success: hex(0xA6E22E), success_bg: hex(0x1E2E18), - btn_success: hex(0x86C020), btn_success_hover: hex(0x7AB418), btn_success_pressed: hex(0x6EA810), - warning: hex(0xE6DB74), warning_bg: hex(0x302A18), - error: hex(0xF92672), error_light: hex(0xFF5090), error_bg: hex(0x341828), - btn_danger_bg: hex(0x341828), btn_danger_hover: hex(0x542838), - btn_trash_hover: hex(0xF92672), btn_trash_pressed: hex(0xD91860), - bg_modal_section: hex(0x272822), border_subtle: hex(0x49483E), divider: hex(0x49483E), + accent_blue: hex(0x66D9EF), + accent_icon: hex(0xAE81FF), + accent_progress: hex(0x66D9EF), + btn_default: hex(0x49483E), + btn_hover: hex(0x5A5950), + btn_pressed: hex(0x6B6A62), + success: hex(0xA6E22E), + success_bg: hex(0x1E2E18), + btn_success: hex(0x86C020), + btn_success_hover: hex(0x7AB418), + btn_success_pressed: hex(0x6EA810), + warning: hex(0xE6DB74), + warning_bg: hex(0x302A18), + error: hex(0xF92672), + error_light: hex(0xFF5090), + error_bg: hex(0x341828), + btn_danger_bg: hex(0x341828), + btn_danger_hover: hex(0x542838), + btn_trash_hover: hex(0xF92672), + btn_trash_pressed: hex(0xD91860), + bg_modal_section: hex(0x272822), + border_subtle: hex(0x49483E), + divider: hex(0x49483E), }; // ── Monokai Spectrum ── pub const MONOKAI_SPECTRUM: Self = Self { - bg_primary: hex(0x222222), bg_sidebar: hex(0x191919), bg_card: hex(0x363537), - bg_card_hover: hex(0x484749), bg_card_pressed: hex(0x5A595B), bg_selected: hex(0x363537), - bg_input: hex(0x363537), bg_progress: hex(0x191919), - text_primary: hex(0xF7F1FF), text_secondary: hex(0xE0DAE8), text_muted: hex(0xC0BAC8), - text_dim: hex(0x938EA0), text_dimmer: hex(0x69676C), text_dimmest: hex(0x4A484C), + bg_primary: hex(0x222222), + bg_sidebar: hex(0x191919), + bg_card: hex(0x363537), + bg_card_hover: hex(0x484749), + bg_card_pressed: hex(0x5A595B), + bg_selected: hex(0x363537), + bg_input: hex(0x363537), + bg_progress: hex(0x191919), + text_primary: hex(0xF7F1FF), + text_secondary: hex(0xE0DAE8), + text_muted: hex(0xC0BAC8), + text_dim: hex(0x938EA0), + text_dimmer: hex(0x69676C), + text_dimmest: hex(0x4A484C), text_placeholder: hex(0x69676C), - accent_blue: hex(0x5AD4E6), accent_icon: hex(0x948AE3), accent_progress: hex(0x5AD4E6), - btn_default: hex(0x363537), btn_hover: hex(0x484749), btn_pressed: hex(0x5A595B), - success: hex(0x7BD88F), success_bg: hex(0x1A2820), - btn_success: hex(0x62B074), btn_success_hover: hex(0x58A468), btn_success_pressed: hex(0x4E985C), - warning: hex(0xFCE566), warning_bg: hex(0x2E2A1A), - error: hex(0xFC618D), error_light: hex(0xFF80A0), error_bg: hex(0x2E1A22), - btn_danger_bg: hex(0x2E1A22), btn_danger_hover: hex(0x4E2A32), - btn_trash_hover: hex(0xFC618D), btn_trash_pressed: hex(0xDC5078), - bg_modal_section: hex(0x222222), border_subtle: hex(0x363537), divider: hex(0x363537), + accent_blue: hex(0x5AD4E6), + accent_icon: hex(0x948AE3), + accent_progress: hex(0x5AD4E6), + btn_default: hex(0x363537), + btn_hover: hex(0x484749), + btn_pressed: hex(0x5A595B), + success: hex(0x7BD88F), + success_bg: hex(0x1A2820), + btn_success: hex(0x62B074), + btn_success_hover: hex(0x58A468), + btn_success_pressed: hex(0x4E985C), + warning: hex(0xFCE566), + warning_bg: hex(0x2E2A1A), + error: hex(0xFC618D), + error_light: hex(0xFF80A0), + error_bg: hex(0x2E1A22), + btn_danger_bg: hex(0x2E1A22), + btn_danger_hover: hex(0x4E2A32), + btn_trash_hover: hex(0xFC618D), + btn_trash_pressed: hex(0xDC5078), + bg_modal_section: hex(0x222222), + border_subtle: hex(0x363537), + divider: hex(0x363537), }; // ── Ayu Dark ── pub const AYU_DARK: Self = Self { - bg_primary: hex(0x0B0E14), bg_sidebar: hex(0x070A10), bg_card: hex(0x1B2028), - bg_card_hover: hex(0x252B35), bg_card_pressed: hex(0x303842), bg_selected: hex(0x1B3A4B), - bg_input: hex(0x1B2028), bg_progress: hex(0x070A10), - text_primary: hex(0xBFBDB6), text_secondary: hex(0xA8A6A0), text_muted: hex(0x8A8880), - text_dim: hex(0x7A786E), text_dimmer: hex(0x626A73), text_dimmest: hex(0x4A505A), + bg_primary: hex(0x0B0E14), + bg_sidebar: hex(0x070A10), + bg_card: hex(0x1B2028), + bg_card_hover: hex(0x252B35), + bg_card_pressed: hex(0x303842), + bg_selected: hex(0x1B3A4B), + bg_input: hex(0x1B2028), + bg_progress: hex(0x070A10), + text_primary: hex(0xBFBDB6), + text_secondary: hex(0xA8A6A0), + text_muted: hex(0x8A8880), + text_dim: hex(0x7A786E), + text_dimmer: hex(0x626A73), + text_dimmest: hex(0x4A505A), text_placeholder: hex(0x626A73), - accent_blue: hex(0xE6B450), accent_icon: hex(0x59C2FF), accent_progress: hex(0xE6B450), - btn_default: hex(0x1B2028), btn_hover: hex(0x252B35), btn_pressed: hex(0x303842), - success: hex(0xAAD94C), success_bg: hex(0x0C1A10), - btn_success: hex(0x88B040), btn_success_hover: hex(0x7CA436), btn_success_pressed: hex(0x70982C), - warning: hex(0xFFB454), warning_bg: hex(0x1A1808), - error: hex(0xD95757), error_light: hex(0xE87070), error_bg: hex(0x1A0C0C), - btn_danger_bg: hex(0x1A0C0C), btn_danger_hover: hex(0x2A1C1C), - btn_trash_hover: hex(0xD95757), btn_trash_pressed: hex(0xB94848), - bg_modal_section: hex(0x0B0E14), border_subtle: hex(0x1B2028), divider: hex(0x1B2028), + accent_blue: hex(0xE6B450), + accent_icon: hex(0x59C2FF), + accent_progress: hex(0xE6B450), + btn_default: hex(0x1B2028), + btn_hover: hex(0x252B35), + btn_pressed: hex(0x303842), + success: hex(0xAAD94C), + success_bg: hex(0x0C1A10), + btn_success: hex(0x88B040), + btn_success_hover: hex(0x7CA436), + btn_success_pressed: hex(0x70982C), + warning: hex(0xFFB454), + warning_bg: hex(0x1A1808), + error: hex(0xD95757), + error_light: hex(0xE87070), + error_bg: hex(0x1A0C0C), + btn_danger_bg: hex(0x1A0C0C), + btn_danger_hover: hex(0x2A1C1C), + btn_trash_hover: hex(0xD95757), + btn_trash_pressed: hex(0xB94848), + bg_modal_section: hex(0x0B0E14), + border_subtle: hex(0x1B2028), + divider: hex(0x1B2028), }; // ── Ayu Mirage ── pub const AYU_MIRAGE: Self = Self { - bg_primary: hex(0x1F2430), bg_sidebar: hex(0x1A1F2B), bg_card: hex(0x2A303E), - bg_card_hover: hex(0x33415E), bg_card_pressed: hex(0x3D4A68), bg_selected: hex(0x33415E), - bg_input: hex(0x2A303E), bg_progress: hex(0x1A1F2B), - text_primary: hex(0xCCCAC2), text_secondary: hex(0xB4B2AA), text_muted: hex(0x9A988E), - text_dim: hex(0x858380), text_dimmer: hex(0x707A8C), text_dimmest: hex(0x555D6E), + bg_primary: hex(0x1F2430), + bg_sidebar: hex(0x1A1F2B), + bg_card: hex(0x2A303E), + bg_card_hover: hex(0x33415E), + bg_card_pressed: hex(0x3D4A68), + bg_selected: hex(0x33415E), + bg_input: hex(0x2A303E), + bg_progress: hex(0x1A1F2B), + text_primary: hex(0xCCCAC2), + text_secondary: hex(0xB4B2AA), + text_muted: hex(0x9A988E), + text_dim: hex(0x858380), + text_dimmer: hex(0x707A8C), + text_dimmest: hex(0x555D6E), text_placeholder: hex(0x707A8C), - accent_blue: hex(0xFFCC66), accent_icon: hex(0x73D0FF), accent_progress: hex(0xFFCC66), - btn_default: hex(0x2A303E), btn_hover: hex(0x33415E), btn_pressed: hex(0x3D4A68), - success: hex(0xBAE67E), success_bg: hex(0x1A2A1E), - btn_success: hex(0x98C066), btn_success_hover: hex(0x8CB45A), btn_success_pressed: hex(0x80A84E), - warning: hex(0xFFD580), warning_bg: hex(0x2A2818), - error: hex(0xF28779), error_light: hex(0xFF9E90), error_bg: hex(0x2A1E1E), - btn_danger_bg: hex(0x2A1E1E), btn_danger_hover: hex(0x4A2E2E), - btn_trash_hover: hex(0xF28779), btn_trash_pressed: hex(0xD27060), - bg_modal_section: hex(0x1F2430), border_subtle: hex(0x2A303E), divider: hex(0x2A303E), + accent_blue: hex(0xFFCC66), + accent_icon: hex(0x73D0FF), + accent_progress: hex(0xFFCC66), + btn_default: hex(0x2A303E), + btn_hover: hex(0x33415E), + btn_pressed: hex(0x3D4A68), + success: hex(0xBAE67E), + success_bg: hex(0x1A2A1E), + btn_success: hex(0x98C066), + btn_success_hover: hex(0x8CB45A), + btn_success_pressed: hex(0x80A84E), + warning: hex(0xFFD580), + warning_bg: hex(0x2A2818), + error: hex(0xF28779), + error_light: hex(0xFF9E90), + error_bg: hex(0x2A1E1E), + btn_danger_bg: hex(0x2A1E1E), + btn_danger_hover: hex(0x4A2E2E), + btn_trash_hover: hex(0xF28779), + btn_trash_pressed: hex(0xD27060), + bg_modal_section: hex(0x1F2430), + border_subtle: hex(0x2A303E), + divider: hex(0x2A303E), }; // ── Ayu Light ── pub const AYU_LIGHT: Self = Self { - bg_primary: hex(0xFAFAFA), bg_sidebar: hex(0xF0EEE4), bg_card: hex(0xE8E6DC), - bg_card_hover: hex(0xDCD8CC), bg_card_pressed: hex(0xD0CCC0), bg_selected: hex(0xD1E4F4), - bg_input: hex(0xE8E6DC), bg_progress: hex(0xF0EEE4), - text_primary: hex(0x575F66), text_secondary: hex(0x6B737A), text_muted: hex(0x848C94), - text_dim: hex(0x9CA4AC), text_dimmer: hex(0xABB0B6), text_dimmest: hex(0xC0C4C8), + bg_primary: hex(0xFAFAFA), + bg_sidebar: hex(0xF0EEE4), + bg_card: hex(0xE8E6DC), + bg_card_hover: hex(0xDCD8CC), + bg_card_pressed: hex(0xD0CCC0), + bg_selected: hex(0xD1E4F4), + bg_input: hex(0xE8E6DC), + bg_progress: hex(0xF0EEE4), + text_primary: hex(0x575F66), + text_secondary: hex(0x6B737A), + text_muted: hex(0x848C94), + text_dim: hex(0x9CA4AC), + text_dimmer: hex(0xABB0B6), + text_dimmest: hex(0xC0C4C8), text_placeholder: hex(0xABB0B6), - accent_blue: hex(0xFF9940), accent_icon: hex(0x36A3D9), accent_progress: hex(0xFF9940), - btn_default: hex(0xE8E6DC), btn_hover: hex(0xDCD8CC), btn_pressed: hex(0xD0CCC0), - success: hex(0x86B300), success_bg: hex(0xD8E8C8), - btn_success: hex(0x86B300), btn_success_hover: hex(0x78A400), btn_success_pressed: hex(0x6A9600), - warning: hex(0xF29718), warning_bg: hex(0xEDE0C0), - error: hex(0xF51818), error_light: hex(0xF04040), error_bg: hex(0xEEC8C8), - btn_danger_bg: hex(0xEEC8C8), btn_danger_hover: hex(0xDEB0B0), - btn_trash_hover: hex(0xF51818), btn_trash_pressed: hex(0xD50E0E), - bg_modal_section: hex(0xFAFAFA), border_subtle: hex(0xDCD8CC), divider: hex(0xDCD8CC), + accent_blue: hex(0xFF9940), + accent_icon: hex(0x36A3D9), + accent_progress: hex(0xFF9940), + btn_default: hex(0xE8E6DC), + btn_hover: hex(0xDCD8CC), + btn_pressed: hex(0xD0CCC0), + success: hex(0x86B300), + success_bg: hex(0xD8E8C8), + btn_success: hex(0x86B300), + btn_success_hover: hex(0x78A400), + btn_success_pressed: hex(0x6A9600), + warning: hex(0xF29718), + warning_bg: hex(0xEDE0C0), + error: hex(0xF51818), + error_light: hex(0xF04040), + error_bg: hex(0xEEC8C8), + btn_danger_bg: hex(0xEEC8C8), + btn_danger_hover: hex(0xDEB0B0), + btn_trash_hover: hex(0xF51818), + btn_trash_pressed: hex(0xD50E0E), + bg_modal_section: hex(0xFAFAFA), + border_subtle: hex(0xDCD8CC), + divider: hex(0xDCD8CC), }; // ── Everforest Dark ── pub const EVERFOREST_DARK: Self = Self { - bg_primary: hex(0x2D353B), bg_sidebar: hex(0x232A2E), bg_card: hex(0x343F44), - bg_card_hover: hex(0x3D484D), bg_card_pressed: hex(0x475258), bg_selected: hex(0x543A48), - bg_input: hex(0x343F44), bg_progress: hex(0x232A2E), - text_primary: hex(0xD3C6AA), text_secondary: hex(0xC0B498), text_muted: hex(0xA09880), - text_dim: hex(0x859289), text_dimmer: hex(0x7A8478), text_dimmest: hex(0x5C6A62), + bg_primary: hex(0x2D353B), + bg_sidebar: hex(0x232A2E), + bg_card: hex(0x343F44), + bg_card_hover: hex(0x3D484D), + bg_card_pressed: hex(0x475258), + bg_selected: hex(0x543A48), + bg_input: hex(0x343F44), + bg_progress: hex(0x232A2E), + text_primary: hex(0xD3C6AA), + text_secondary: hex(0xC0B498), + text_muted: hex(0xA09880), + text_dim: hex(0x859289), + text_dimmer: hex(0x7A8478), + text_dimmest: hex(0x5C6A62), text_placeholder: hex(0x7A8478), - accent_blue: hex(0x7FBBB3), accent_icon: hex(0xA7C080), accent_progress: hex(0x7FBBB3), - btn_default: hex(0x343F44), btn_hover: hex(0x3D484D), btn_pressed: hex(0x475258), - success: hex(0xA7C080), success_bg: hex(0x1E2E24), - btn_success: hex(0x86A066), btn_success_hover: hex(0x7A945A), btn_success_pressed: hex(0x6E884E), - warning: hex(0xDBBC7F), warning_bg: hex(0x2E2A1E), - error: hex(0xE67E80), error_light: hex(0xF09090), error_bg: hex(0x2E2020), - btn_danger_bg: hex(0x2E2020), btn_danger_hover: hex(0x4E3030), - btn_trash_hover: hex(0xE67E80), btn_trash_pressed: hex(0xC66868), - bg_modal_section: hex(0x2D353B), border_subtle: hex(0x343F44), divider: hex(0x343F44), + accent_blue: hex(0x7FBBB3), + accent_icon: hex(0xA7C080), + accent_progress: hex(0x7FBBB3), + btn_default: hex(0x343F44), + btn_hover: hex(0x3D484D), + btn_pressed: hex(0x475258), + success: hex(0xA7C080), + success_bg: hex(0x1E2E24), + btn_success: hex(0x86A066), + btn_success_hover: hex(0x7A945A), + btn_success_pressed: hex(0x6E884E), + warning: hex(0xDBBC7F), + warning_bg: hex(0x2E2A1E), + error: hex(0xE67E80), + error_light: hex(0xF09090), + error_bg: hex(0x2E2020), + btn_danger_bg: hex(0x2E2020), + btn_danger_hover: hex(0x4E3030), + btn_trash_hover: hex(0xE67E80), + btn_trash_pressed: hex(0xC66868), + bg_modal_section: hex(0x2D353B), + border_subtle: hex(0x343F44), + divider: hex(0x343F44), }; // ── Everforest Light ── pub const EVERFOREST_LIGHT: Self = Self { - bg_primary: hex(0xFDF6E3), bg_sidebar: hex(0xEFECD4), bg_card: hex(0xF4F0D9), - bg_card_hover: hex(0xE6E2CC), bg_card_pressed: hex(0xE0DCC7), bg_selected: hex(0xEADDC0), - bg_input: hex(0xF4F0D9), bg_progress: hex(0xEFECD4), - text_primary: hex(0x5C6A72), text_secondary: hex(0x6E7A80), text_muted: hex(0x829181), - text_dim: hex(0x939F91), text_dimmer: hex(0xA6B0A0), text_dimmest: hex(0xBCC5B8), + bg_primary: hex(0xFDF6E3), + bg_sidebar: hex(0xEFECD4), + bg_card: hex(0xF4F0D9), + bg_card_hover: hex(0xE6E2CC), + bg_card_pressed: hex(0xE0DCC7), + bg_selected: hex(0xEADDC0), + bg_input: hex(0xF4F0D9), + bg_progress: hex(0xEFECD4), + text_primary: hex(0x5C6A72), + text_secondary: hex(0x6E7A80), + text_muted: hex(0x829181), + text_dim: hex(0x939F91), + text_dimmer: hex(0xA6B0A0), + text_dimmest: hex(0xBCC5B8), text_placeholder: hex(0xA6B0A0), - accent_blue: hex(0x3A94C5), accent_icon: hex(0x8DA101), accent_progress: hex(0x3A94C5), - btn_default: hex(0xF4F0D9), btn_hover: hex(0xE6E2CC), btn_pressed: hex(0xE0DCC7), - success: hex(0x8DA101), success_bg: hex(0xD0E0C4), - btn_success: hex(0x8DA101), btn_success_hover: hex(0x7E9200), btn_success_pressed: hex(0x6F8300), - warning: hex(0xDFA000), warning_bg: hex(0xECE0B8), - error: hex(0xF85552), error_light: hex(0xE86868), error_bg: hex(0xECC8C4), - btn_danger_bg: hex(0xECC8C4), btn_danger_hover: hex(0xDCB0AC), - btn_trash_hover: hex(0xF85552), btn_trash_pressed: hex(0xD84040), - bg_modal_section: hex(0xFDF6E3), border_subtle: hex(0xE6E2CC), divider: hex(0xE6E2CC), + accent_blue: hex(0x3A94C5), + accent_icon: hex(0x8DA101), + accent_progress: hex(0x3A94C5), + btn_default: hex(0xF4F0D9), + btn_hover: hex(0xE6E2CC), + btn_pressed: hex(0xE0DCC7), + success: hex(0x8DA101), + success_bg: hex(0xD0E0C4), + btn_success: hex(0x8DA101), + btn_success_hover: hex(0x7E9200), + btn_success_pressed: hex(0x6F8300), + warning: hex(0xDFA000), + warning_bg: hex(0xECE0B8), + error: hex(0xF85552), + error_light: hex(0xE86868), + error_bg: hex(0xECC8C4), + btn_danger_bg: hex(0xECC8C4), + btn_danger_hover: hex(0xDCB0AC), + btn_trash_hover: hex(0xF85552), + btn_trash_pressed: hex(0xD84040), + bg_modal_section: hex(0xFDF6E3), + border_subtle: hex(0xE6E2CC), + divider: hex(0xE6E2CC), }; // ── Material Oceanic ── pub const MATERIAL_OCEANIC: Self = Self { - bg_primary: hex(0x263238), bg_sidebar: hex(0x1E272C), bg_card: hex(0x2E3C42), - bg_card_hover: hex(0x3A4A52), bg_card_pressed: hex(0x465862), bg_selected: hex(0x546E7A), - bg_input: hex(0x2E3C42), bg_progress: hex(0x1E272C), - text_primary: hex(0xB0BEC5), text_secondary: hex(0x9AAAB2), text_muted: hex(0x849AA4), - text_dim: hex(0x6E8490), text_dimmer: hex(0x546E7A), text_dimmest: hex(0x405A64), + bg_primary: hex(0x263238), + bg_sidebar: hex(0x1E272C), + bg_card: hex(0x2E3C42), + bg_card_hover: hex(0x3A4A52), + bg_card_pressed: hex(0x465862), + bg_selected: hex(0x546E7A), + bg_input: hex(0x2E3C42), + bg_progress: hex(0x1E272C), + text_primary: hex(0xB0BEC5), + text_secondary: hex(0x9AAAB2), + text_muted: hex(0x849AA4), + text_dim: hex(0x6E8490), + text_dimmer: hex(0x546E7A), + text_dimmest: hex(0x405A64), text_placeholder: hex(0x546E7A), - accent_blue: hex(0x89DDFF), accent_icon: hex(0x80CBC4), accent_progress: hex(0x89DDFF), - btn_default: hex(0x2E3C42), btn_hover: hex(0x3A4A52), btn_pressed: hex(0x465862), - success: hex(0xC3E88D), success_bg: hex(0x1A3028), - btn_success: hex(0xA0C070), btn_success_hover: hex(0x94B464), btn_success_pressed: hex(0x88A858), - warning: hex(0xFFCB6B), warning_bg: hex(0x2E2E1E), - error: hex(0xFF5370), error_light: hex(0xFF7088), error_bg: hex(0x2E1E22), - btn_danger_bg: hex(0x2E1E22), btn_danger_hover: hex(0x4E2E32), - btn_trash_hover: hex(0xFF5370), btn_trash_pressed: hex(0xDF4058), - bg_modal_section: hex(0x263238), border_subtle: hex(0x2E3C42), divider: hex(0x2E3C42), + accent_blue: hex(0x89DDFF), + accent_icon: hex(0x80CBC4), + accent_progress: hex(0x89DDFF), + btn_default: hex(0x2E3C42), + btn_hover: hex(0x3A4A52), + btn_pressed: hex(0x465862), + success: hex(0xC3E88D), + success_bg: hex(0x1A3028), + btn_success: hex(0xA0C070), + btn_success_hover: hex(0x94B464), + btn_success_pressed: hex(0x88A858), + warning: hex(0xFFCB6B), + warning_bg: hex(0x2E2E1E), + error: hex(0xFF5370), + error_light: hex(0xFF7088), + error_bg: hex(0x2E1E22), + btn_danger_bg: hex(0x2E1E22), + btn_danger_hover: hex(0x4E2E32), + btn_trash_hover: hex(0xFF5370), + btn_trash_pressed: hex(0xDF4058), + bg_modal_section: hex(0x263238), + border_subtle: hex(0x2E3C42), + divider: hex(0x2E3C42), }; // ── Material Palenight ── pub const MATERIAL_PALENIGHT: Self = Self { - bg_primary: hex(0x292D3E), bg_sidebar: hex(0x232838), bg_card: hex(0x343A4E), - bg_card_hover: hex(0x414662), bg_card_pressed: hex(0x515772), bg_selected: hex(0x717CB4), - bg_input: hex(0x343A4E), bg_progress: hex(0x232838), - text_primary: hex(0xA6ACCD), text_secondary: hex(0x929ABE), text_muted: hex(0x7E86AE), - text_dim: hex(0x717CB4), text_dimmer: hex(0x676E95), text_dimmest: hex(0x515772), + bg_primary: hex(0x292D3E), + bg_sidebar: hex(0x232838), + bg_card: hex(0x343A4E), + bg_card_hover: hex(0x414662), + bg_card_pressed: hex(0x515772), + bg_selected: hex(0x717CB4), + bg_input: hex(0x343A4E), + bg_progress: hex(0x232838), + text_primary: hex(0xA6ACCD), + text_secondary: hex(0x929ABE), + text_muted: hex(0x7E86AE), + text_dim: hex(0x717CB4), + text_dimmer: hex(0x676E95), + text_dimmest: hex(0x515772), text_placeholder: hex(0x676E95), - accent_blue: hex(0xC792EA), accent_icon: hex(0x82AAFF), accent_progress: hex(0xC792EA), - btn_default: hex(0x343A4E), btn_hover: hex(0x414662), btn_pressed: hex(0x515772), - success: hex(0xC3E88D), success_bg: hex(0x202E28), - btn_success: hex(0xA0C070), btn_success_hover: hex(0x94B464), btn_success_pressed: hex(0x88A858), - warning: hex(0xFFCB6B), warning_bg: hex(0x2E2C1E), - error: hex(0xFF5370), error_light: hex(0xFF7088), error_bg: hex(0x2E1E22), - btn_danger_bg: hex(0x2E1E22), btn_danger_hover: hex(0x4E2E32), - btn_trash_hover: hex(0xFF5370), btn_trash_pressed: hex(0xDF4058), - bg_modal_section: hex(0x292D3E), border_subtle: hex(0x343A4E), divider: hex(0x343A4E), + accent_blue: hex(0xC792EA), + accent_icon: hex(0x82AAFF), + accent_progress: hex(0xC792EA), + btn_default: hex(0x343A4E), + btn_hover: hex(0x414662), + btn_pressed: hex(0x515772), + success: hex(0xC3E88D), + success_bg: hex(0x202E28), + btn_success: hex(0xA0C070), + btn_success_hover: hex(0x94B464), + btn_success_pressed: hex(0x88A858), + warning: hex(0xFFCB6B), + warning_bg: hex(0x2E2C1E), + error: hex(0xFF5370), + error_light: hex(0xFF7088), + error_bg: hex(0x2E1E22), + btn_danger_bg: hex(0x2E1E22), + btn_danger_hover: hex(0x4E2E32), + btn_trash_hover: hex(0xFF5370), + btn_trash_pressed: hex(0xDF4058), + bg_modal_section: hex(0x292D3E), + border_subtle: hex(0x343A4E), + divider: hex(0x343A4E), }; // ── Material Deep Ocean ── pub const MATERIAL_DEEPOCEAN: Self = Self { - bg_primary: hex(0x0F111A), bg_sidebar: hex(0x090B10), bg_card: hex(0x1A1C28), - bg_card_hover: hex(0x252836), bg_card_pressed: hex(0x3B3F51), bg_selected: hex(0x44475A), - bg_input: hex(0x1A1C28), bg_progress: hex(0x090B10), - text_primary: hex(0x8F93A2), text_secondary: hex(0xA0A4B4), text_muted: hex(0x7880A0), - text_dim: hex(0x606888), text_dimmer: hex(0x464B5D), text_dimmest: hex(0x3B3F51), + bg_primary: hex(0x0F111A), + bg_sidebar: hex(0x090B10), + bg_card: hex(0x1A1C28), + bg_card_hover: hex(0x252836), + bg_card_pressed: hex(0x3B3F51), + bg_selected: hex(0x44475A), + bg_input: hex(0x1A1C28), + bg_progress: hex(0x090B10), + text_primary: hex(0x8F93A2), + text_secondary: hex(0xA0A4B4), + text_muted: hex(0x7880A0), + text_dim: hex(0x606888), + text_dimmer: hex(0x464B5D), + text_dimmest: hex(0x3B3F51), text_placeholder: hex(0x464B5D), - accent_blue: hex(0x84FFFF), accent_icon: hex(0x82AAFF), accent_progress: hex(0x84FFFF), - btn_default: hex(0x1A1C28), btn_hover: hex(0x252836), btn_pressed: hex(0x3B3F51), - success: hex(0xC3E88D), success_bg: hex(0x0C1A14), - btn_success: hex(0xA0C070), btn_success_hover: hex(0x94B464), btn_success_pressed: hex(0x88A858), - warning: hex(0xFFCB6B), warning_bg: hex(0x1A180C), - error: hex(0xFF5370), error_light: hex(0xFF7088), error_bg: hex(0x1A0C10), - btn_danger_bg: hex(0x1A0C10), btn_danger_hover: hex(0x3A1C20), - btn_trash_hover: hex(0xFF5370), btn_trash_pressed: hex(0xDF4058), - bg_modal_section: hex(0x0F111A), border_subtle: hex(0x1A1C28), divider: hex(0x1A1C28), + accent_blue: hex(0x84FFFF), + accent_icon: hex(0x82AAFF), + accent_progress: hex(0x84FFFF), + btn_default: hex(0x1A1C28), + btn_hover: hex(0x252836), + btn_pressed: hex(0x3B3F51), + success: hex(0xC3E88D), + success_bg: hex(0x0C1A14), + btn_success: hex(0xA0C070), + btn_success_hover: hex(0x94B464), + btn_success_pressed: hex(0x88A858), + warning: hex(0xFFCB6B), + warning_bg: hex(0x1A180C), + error: hex(0xFF5370), + error_light: hex(0xFF7088), + error_bg: hex(0x1A0C10), + btn_danger_bg: hex(0x1A0C10), + btn_danger_hover: hex(0x3A1C20), + btn_trash_hover: hex(0xFF5370), + btn_trash_pressed: hex(0xDF4058), + bg_modal_section: hex(0x0F111A), + border_subtle: hex(0x1A1C28), + divider: hex(0x1A1C28), }; // ── Flexoki Dark ── pub const FLEXOKI_DARK: Self = Self { - bg_primary: hex(0x100F0F), bg_sidebar: hex(0x1C1B1A), bg_card: hex(0x282726), - bg_card_hover: hex(0x343331), bg_card_pressed: hex(0x403E3C), bg_selected: hex(0x403E3C), - bg_input: hex(0x282726), bg_progress: hex(0x1C1B1A), - text_primary: hex(0xCECDC3), text_secondary: hex(0xB7B5AC), text_muted: hex(0x9F9D96), - text_dim: hex(0x878580), text_dimmer: hex(0x6F6E69), text_dimmest: hex(0x575653), + bg_primary: hex(0x100F0F), + bg_sidebar: hex(0x1C1B1A), + bg_card: hex(0x282726), + bg_card_hover: hex(0x343331), + bg_card_pressed: hex(0x403E3C), + bg_selected: hex(0x403E3C), + bg_input: hex(0x282726), + bg_progress: hex(0x1C1B1A), + text_primary: hex(0xCECDC3), + text_secondary: hex(0xB7B5AC), + text_muted: hex(0x9F9D96), + text_dim: hex(0x878580), + text_dimmer: hex(0x6F6E69), + text_dimmest: hex(0x575653), text_placeholder: hex(0x6F6E69), - accent_blue: hex(0x4385BE), accent_icon: hex(0xDA702C), accent_progress: hex(0x4385BE), - btn_default: hex(0x282726), btn_hover: hex(0x343331), btn_pressed: hex(0x403E3C), - success: hex(0x879A39), success_bg: hex(0x141A10), - btn_success: hex(0x6E8030), btn_success_hover: hex(0x627428), btn_success_pressed: hex(0x566820), - warning: hex(0xD0A215), warning_bg: hex(0x1E1A0C), - error: hex(0xD14D41), error_light: hex(0xE06858), error_bg: hex(0x1E100C), - btn_danger_bg: hex(0x1E100C), btn_danger_hover: hex(0x3E201C), - btn_trash_hover: hex(0xD14D41), btn_trash_pressed: hex(0xB13830), - bg_modal_section: hex(0x100F0F), border_subtle: hex(0x282726), divider: hex(0x282726), + accent_blue: hex(0x4385BE), + accent_icon: hex(0xDA702C), + accent_progress: hex(0x4385BE), + btn_default: hex(0x282726), + btn_hover: hex(0x343331), + btn_pressed: hex(0x403E3C), + success: hex(0x879A39), + success_bg: hex(0x141A10), + btn_success: hex(0x6E8030), + btn_success_hover: hex(0x627428), + btn_success_pressed: hex(0x566820), + warning: hex(0xD0A215), + warning_bg: hex(0x1E1A0C), + error: hex(0xD14D41), + error_light: hex(0xE06858), + error_bg: hex(0x1E100C), + btn_danger_bg: hex(0x1E100C), + btn_danger_hover: hex(0x3E201C), + btn_trash_hover: hex(0xD14D41), + btn_trash_pressed: hex(0xB13830), + bg_modal_section: hex(0x100F0F), + border_subtle: hex(0x282726), + divider: hex(0x282726), }; // ── Flexoki Light ── pub const FLEXOKI_LIGHT: Self = Self { - bg_primary: hex(0xFFFCF0), bg_sidebar: hex(0xF2F0E5), bg_card: hex(0xE6E4D9), - bg_card_hover: hex(0xDAD8CE), bg_card_pressed: hex(0xCECDC3), bg_selected: hex(0xE6E4D9), - bg_input: hex(0xE6E4D9), bg_progress: hex(0xF2F0E5), - text_primary: hex(0x403E3C), text_secondary: hex(0x575653), text_muted: hex(0x6F6E69), - text_dim: hex(0x878580), text_dimmer: hex(0x9F9D96), text_dimmest: hex(0xB7B5AC), + bg_primary: hex(0xFFFCF0), + bg_sidebar: hex(0xF2F0E5), + bg_card: hex(0xE6E4D9), + bg_card_hover: hex(0xDAD8CE), + bg_card_pressed: hex(0xCECDC3), + bg_selected: hex(0xE6E4D9), + bg_input: hex(0xE6E4D9), + bg_progress: hex(0xF2F0E5), + text_primary: hex(0x403E3C), + text_secondary: hex(0x575653), + text_muted: hex(0x6F6E69), + text_dim: hex(0x878580), + text_dimmer: hex(0x9F9D96), + text_dimmest: hex(0xB7B5AC), text_placeholder: hex(0x9F9D96), - accent_blue: hex(0x205EA6), accent_icon: hex(0xBC5215), accent_progress: hex(0x205EA6), - btn_default: hex(0xE6E4D9), btn_hover: hex(0xDAD8CE), btn_pressed: hex(0xCECDC3), - success: hex(0x66800B), success_bg: hex(0xD0E0C0), - btn_success: hex(0x66800B), btn_success_hover: hex(0x587208), btn_success_pressed: hex(0x4A6405), - warning: hex(0xAD8301), warning_bg: hex(0xE0DCC0), - error: hex(0xAF3029), error_light: hex(0xD14D41), error_bg: hex(0xE0C8C0), - btn_danger_bg: hex(0xE0C8C0), btn_danger_hover: hex(0xD0B4AC), - btn_trash_hover: hex(0xAF3029), btn_trash_pressed: hex(0x902420), - bg_modal_section: hex(0xFFFCF0), border_subtle: hex(0xDAD8CE), divider: hex(0xDAD8CE), + accent_blue: hex(0x205EA6), + accent_icon: hex(0xBC5215), + accent_progress: hex(0x205EA6), + btn_default: hex(0xE6E4D9), + btn_hover: hex(0xDAD8CE), + btn_pressed: hex(0xCECDC3), + success: hex(0x66800B), + success_bg: hex(0xD0E0C0), + btn_success: hex(0x66800B), + btn_success_hover: hex(0x587208), + btn_success_pressed: hex(0x4A6405), + warning: hex(0xAD8301), + warning_bg: hex(0xE0DCC0), + error: hex(0xAF3029), + error_light: hex(0xD14D41), + error_bg: hex(0xE0C8C0), + btn_danger_bg: hex(0xE0C8C0), + btn_danger_hover: hex(0xD0B4AC), + btn_trash_hover: hex(0xAF3029), + btn_trash_pressed: hex(0x902420), + bg_modal_section: hex(0xFFFCF0), + border_subtle: hex(0xDAD8CE), + divider: hex(0xDAD8CE), }; // ── Nightfox ── pub const NIGHTFOX: Self = Self { - bg_primary: hex(0x192330), bg_sidebar: hex(0x131A24), bg_card: hex(0x2B3B51), - bg_card_hover: hex(0x3C5372), bg_card_pressed: hex(0x39506D), bg_selected: hex(0x2B3B51), - bg_input: hex(0x2B3B51), bg_progress: hex(0x131A24), - text_primary: hex(0xCDCECF), text_secondary: hex(0xAEAFB0), text_muted: hex(0x8E9098), - text_dim: hex(0x738091), text_dimmer: hex(0x5C6A7C), text_dimmest: hex(0x3E4E62), + bg_primary: hex(0x192330), + bg_sidebar: hex(0x131A24), + bg_card: hex(0x2B3B51), + bg_card_hover: hex(0x3C5372), + bg_card_pressed: hex(0x39506D), + bg_selected: hex(0x2B3B51), + bg_input: hex(0x2B3B51), + bg_progress: hex(0x131A24), + text_primary: hex(0xCDCECF), + text_secondary: hex(0xAEAFB0), + text_muted: hex(0x8E9098), + text_dim: hex(0x738091), + text_dimmer: hex(0x5C6A7C), + text_dimmest: hex(0x3E4E62), text_placeholder: hex(0x5C6A7C), - accent_blue: hex(0x719CD6), accent_icon: hex(0x63CDCF), accent_progress: hex(0x719CD6), - btn_default: hex(0x2B3B51), btn_hover: hex(0x3C5372), btn_pressed: hex(0x39506D), - success: hex(0x81B29A), success_bg: hex(0x142820), - btn_success: hex(0x68907E), btn_success_hover: hex(0x5C8472), btn_success_pressed: hex(0x507866), - warning: hex(0xDBC074), warning_bg: hex(0x282418), - error: hex(0xC94F6D), error_light: hex(0xD66880), error_bg: hex(0x281820), - btn_danger_bg: hex(0x281820), btn_danger_hover: hex(0x482830), - btn_trash_hover: hex(0xC94F6D), btn_trash_pressed: hex(0xA9405C), - bg_modal_section: hex(0x192330), border_subtle: hex(0x2B3B51), divider: hex(0x2B3B51), + accent_blue: hex(0x719CD6), + accent_icon: hex(0x63CDCF), + accent_progress: hex(0x719CD6), + btn_default: hex(0x2B3B51), + btn_hover: hex(0x3C5372), + btn_pressed: hex(0x39506D), + success: hex(0x81B29A), + success_bg: hex(0x142820), + btn_success: hex(0x68907E), + btn_success_hover: hex(0x5C8472), + btn_success_pressed: hex(0x507866), + warning: hex(0xDBC074), + warning_bg: hex(0x282418), + error: hex(0xC94F6D), + error_light: hex(0xD66880), + error_bg: hex(0x281820), + btn_danger_bg: hex(0x281820), + btn_danger_hover: hex(0x482830), + btn_trash_hover: hex(0xC94F6D), + btn_trash_pressed: hex(0xA9405C), + bg_modal_section: hex(0x192330), + border_subtle: hex(0x2B3B51), + divider: hex(0x2B3B51), }; // ── Dawnfox (light) ── pub const DAWNFOX: Self = Self { - bg_primary: hex(0xFAF4ED), bg_sidebar: hex(0xEBE5DF), bg_card: hex(0xEBD8CE), - bg_card_hover: hex(0xDACDC3), bg_card_pressed: hex(0xC8BEB4), bg_selected: hex(0xEBD8CE), - bg_input: hex(0xEBD8CE), bg_progress: hex(0xEBE5DF), - text_primary: hex(0x575279), text_secondary: hex(0x625C87), text_muted: hex(0x6E6A86), - text_dim: hex(0x9893A5), text_dimmer: hex(0xAEA8B8), text_dimmest: hex(0xC0BAC8), + bg_primary: hex(0xFAF4ED), + bg_sidebar: hex(0xEBE5DF), + bg_card: hex(0xEBD8CE), + bg_card_hover: hex(0xDACDC3), + bg_card_pressed: hex(0xC8BEB4), + bg_selected: hex(0xEBD8CE), + bg_input: hex(0xEBD8CE), + bg_progress: hex(0xEBE5DF), + text_primary: hex(0x575279), + text_secondary: hex(0x625C87), + text_muted: hex(0x6E6A86), + text_dim: hex(0x9893A5), + text_dimmer: hex(0xAEA8B8), + text_dimmest: hex(0xC0BAC8), text_placeholder: hex(0xAEA8B8), - accent_blue: hex(0x286983), accent_icon: hex(0x907AA9), accent_progress: hex(0x286983), - btn_default: hex(0xEBD8CE), btn_hover: hex(0xDACDC3), btn_pressed: hex(0xC8BEB4), - success: hex(0x618774), success_bg: hex(0xD0E0D4), - btn_success: hex(0x618774), btn_success_hover: hex(0x547A68), btn_success_pressed: hex(0x476D5C), - warning: hex(0xEA9D34), warning_bg: hex(0xECE0C8), - error: hex(0xB4637A), error_light: hex(0xC87890), error_bg: hex(0xE8D0D4), - btn_danger_bg: hex(0xE8D0D4), btn_danger_hover: hex(0xD8BCC4), - btn_trash_hover: hex(0xB4637A), btn_trash_pressed: hex(0x965268), - bg_modal_section: hex(0xFAF4ED), border_subtle: hex(0xDACDC3), divider: hex(0xDACDC3), + accent_blue: hex(0x286983), + accent_icon: hex(0x907AA9), + accent_progress: hex(0x286983), + btn_default: hex(0xEBD8CE), + btn_hover: hex(0xDACDC3), + btn_pressed: hex(0xC8BEB4), + success: hex(0x618774), + success_bg: hex(0xD0E0D4), + btn_success: hex(0x618774), + btn_success_hover: hex(0x547A68), + btn_success_pressed: hex(0x476D5C), + warning: hex(0xEA9D34), + warning_bg: hex(0xECE0C8), + error: hex(0xB4637A), + error_light: hex(0xC87890), + error_bg: hex(0xE8D0D4), + btn_danger_bg: hex(0xE8D0D4), + btn_danger_hover: hex(0xD8BCC4), + btn_trash_hover: hex(0xB4637A), + btn_trash_pressed: hex(0x965268), + bg_modal_section: hex(0xFAF4ED), + border_subtle: hex(0xDACDC3), + divider: hex(0xDACDC3), }; // ── Sonokai ── pub const SONOKAI_DEFAULT: Self = Self { - bg_primary: hex(0x2C2E34), bg_sidebar: hex(0x242529), bg_card: hex(0x33353F), - bg_card_hover: hex(0x3B3E48), bg_card_pressed: hex(0x414550), bg_selected: hex(0x3B3E48), - bg_input: hex(0x33353F), bg_progress: hex(0x242529), - text_primary: hex(0xE2E2E3), text_secondary: hex(0xCCCCD0), text_muted: hex(0xA8A8B0), - text_dim: hex(0x8C8C96), text_dimmer: hex(0x7F8490), text_dimmest: hex(0x585C68), + bg_primary: hex(0x2C2E34), + bg_sidebar: hex(0x242529), + bg_card: hex(0x33353F), + bg_card_hover: hex(0x3B3E48), + bg_card_pressed: hex(0x414550), + bg_selected: hex(0x3B3E48), + bg_input: hex(0x33353F), + bg_progress: hex(0x242529), + text_primary: hex(0xE2E2E3), + text_secondary: hex(0xCCCCD0), + text_muted: hex(0xA8A8B0), + text_dim: hex(0x8C8C96), + text_dimmer: hex(0x7F8490), + text_dimmest: hex(0x585C68), text_placeholder: hex(0x7F8490), - accent_blue: hex(0x76CCE0), accent_icon: hex(0xB39DF3), accent_progress: hex(0x76CCE0), - btn_default: hex(0x33353F), btn_hover: hex(0x3B3E48), btn_pressed: hex(0x414550), - success: hex(0x9ED072), success_bg: hex(0x1E2E22), - btn_success: hex(0x7EAA5A), btn_success_hover: hex(0x729E4E), btn_success_pressed: hex(0x669242), - warning: hex(0xE7C664), warning_bg: hex(0x2E2A1A), - error: hex(0xFC5D7C), error_light: hex(0xFF7890), error_bg: hex(0x2E1A20), - btn_danger_bg: hex(0x2E1A20), btn_danger_hover: hex(0x4E2A30), - btn_trash_hover: hex(0xFC5D7C), btn_trash_pressed: hex(0xDC4C66), - bg_modal_section: hex(0x2C2E34), border_subtle: hex(0x33353F), divider: hex(0x33353F), + accent_blue: hex(0x76CCE0), + accent_icon: hex(0xB39DF3), + accent_progress: hex(0x76CCE0), + btn_default: hex(0x33353F), + btn_hover: hex(0x3B3E48), + btn_pressed: hex(0x414550), + success: hex(0x9ED072), + success_bg: hex(0x1E2E22), + btn_success: hex(0x7EAA5A), + btn_success_hover: hex(0x729E4E), + btn_success_pressed: hex(0x669242), + warning: hex(0xE7C664), + warning_bg: hex(0x2E2A1A), + error: hex(0xFC5D7C), + error_light: hex(0xFF7890), + error_bg: hex(0x2E1A20), + btn_danger_bg: hex(0x2E1A20), + btn_danger_hover: hex(0x4E2A30), + btn_trash_hover: hex(0xFC5D7C), + btn_trash_pressed: hex(0xDC4C66), + bg_modal_section: hex(0x2C2E34), + border_subtle: hex(0x33353F), + divider: hex(0x33353F), }; // ── Oxocarbon Dark ── pub const OXOCARBON_DARK: Self = Self { - bg_primary: hex(0x161616), bg_sidebar: hex(0x0E0E0E), bg_card: hex(0x262626), - bg_card_hover: hex(0x393939), bg_card_pressed: hex(0x525252), bg_selected: hex(0x393939), - bg_input: hex(0x262626), bg_progress: hex(0x0E0E0E), - text_primary: hex(0xF2F4F8), text_secondary: hex(0xDDE1E6), text_muted: hex(0xB0B4BC), - text_dim: hex(0x8A8E96), text_dimmer: hex(0x6E7278), text_dimmest: hex(0x525252), + bg_primary: hex(0x161616), + bg_sidebar: hex(0x0E0E0E), + bg_card: hex(0x262626), + bg_card_hover: hex(0x393939), + bg_card_pressed: hex(0x525252), + bg_selected: hex(0x393939), + bg_input: hex(0x262626), + bg_progress: hex(0x0E0E0E), + text_primary: hex(0xF2F4F8), + text_secondary: hex(0xDDE1E6), + text_muted: hex(0xB0B4BC), + text_dim: hex(0x8A8E96), + text_dimmer: hex(0x6E7278), + text_dimmest: hex(0x525252), text_placeholder: hex(0x6E7278), - accent_blue: hex(0x78A9FF), accent_icon: hex(0xBE95FF), accent_progress: hex(0x78A9FF), - btn_default: hex(0x262626), btn_hover: hex(0x393939), btn_pressed: hex(0x525252), - success: hex(0x42BE65), success_bg: hex(0x0C1C12), - btn_success: hex(0x359E52), btn_success_hover: hex(0x2C9048), btn_success_pressed: hex(0x24823E), - warning: hex(0x08BDBA), warning_bg: hex(0x0C1A1A), - error: hex(0xEE5396), error_light: hex(0xFF7EB6), error_bg: hex(0x1C0C14), - btn_danger_bg: hex(0x1C0C14), btn_danger_hover: hex(0x3C1C24), - btn_trash_hover: hex(0xEE5396), btn_trash_pressed: hex(0xCE4480), - bg_modal_section: hex(0x161616), border_subtle: hex(0x262626), divider: hex(0x262626), + accent_blue: hex(0x78A9FF), + accent_icon: hex(0xBE95FF), + accent_progress: hex(0x78A9FF), + btn_default: hex(0x262626), + btn_hover: hex(0x393939), + btn_pressed: hex(0x525252), + success: hex(0x42BE65), + success_bg: hex(0x0C1C12), + btn_success: hex(0x359E52), + btn_success_hover: hex(0x2C9048), + btn_success_pressed: hex(0x24823E), + warning: hex(0x08BDBA), + warning_bg: hex(0x0C1A1A), + error: hex(0xEE5396), + error_light: hex(0xFF7EB6), + error_bg: hex(0x1C0C14), + btn_danger_bg: hex(0x1C0C14), + btn_danger_hover: hex(0x3C1C24), + btn_trash_hover: hex(0xEE5396), + btn_trash_pressed: hex(0xCE4480), + bg_modal_section: hex(0x161616), + border_subtle: hex(0x262626), + divider: hex(0x262626), }; // ── Oxocarbon Light ── pub const OXOCARBON_LIGHT: Self = Self { - bg_primary: hex(0xFFFFFF), bg_sidebar: hex(0xF2F4F8), bg_card: hex(0xDDE1E6), - bg_card_hover: hex(0xC8CCD2), bg_card_pressed: hex(0xB4B8C0), bg_selected: hex(0xDDE1E6), - bg_input: hex(0xDDE1E6), bg_progress: hex(0xF2F4F8), - text_primary: hex(0x262626), text_secondary: hex(0x393939), text_muted: hex(0x525252), - text_dim: hex(0x6E7278), text_dimmer: hex(0x8A8E96), text_dimmest: hex(0xB0B4BC), + bg_primary: hex(0xFFFFFF), + bg_sidebar: hex(0xF2F4F8), + bg_card: hex(0xDDE1E6), + bg_card_hover: hex(0xC8CCD2), + bg_card_pressed: hex(0xB4B8C0), + bg_selected: hex(0xDDE1E6), + bg_input: hex(0xDDE1E6), + bg_progress: hex(0xF2F4F8), + text_primary: hex(0x262626), + text_secondary: hex(0x393939), + text_muted: hex(0x525252), + text_dim: hex(0x6E7278), + text_dimmer: hex(0x8A8E96), + text_dimmest: hex(0xB0B4BC), text_placeholder: hex(0x8A8E96), - accent_blue: hex(0x0F62FE), accent_icon: hex(0x8A3FFC), accent_progress: hex(0x0F62FE), - btn_default: hex(0xDDE1E6), btn_hover: hex(0xC8CCD2), btn_pressed: hex(0xB4B8C0), - success: hex(0x198038), success_bg: hex(0xD0F0D8), - btn_success: hex(0x198038), btn_success_hover: hex(0x14702E), btn_success_pressed: hex(0x106024), - warning: hex(0x005D5D), warning_bg: hex(0xD0E8E8), - error: hex(0xDA1E28), error_light: hex(0xEE5396), error_bg: hex(0xF0D0D8), - btn_danger_bg: hex(0xF0D0D8), btn_danger_hover: hex(0xE0B8C4), - btn_trash_hover: hex(0xDA1E28), btn_trash_pressed: hex(0xBA1420), - bg_modal_section: hex(0xFFFFFF), border_subtle: hex(0xC8CCD2), divider: hex(0xC8CCD2), + accent_blue: hex(0x0F62FE), + accent_icon: hex(0x8A3FFC), + accent_progress: hex(0x0F62FE), + btn_default: hex(0xDDE1E6), + btn_hover: hex(0xC8CCD2), + btn_pressed: hex(0xB4B8C0), + success: hex(0x198038), + success_bg: hex(0xD0F0D8), + btn_success: hex(0x198038), + btn_success_hover: hex(0x14702E), + btn_success_pressed: hex(0x106024), + warning: hex(0x005D5D), + warning_bg: hex(0xD0E8E8), + error: hex(0xDA1E28), + error_light: hex(0xEE5396), + error_bg: hex(0xF0D0D8), + btn_danger_bg: hex(0xF0D0D8), + btn_danger_hover: hex(0xE0B8C4), + btn_trash_hover: hex(0xDA1E28), + btn_trash_pressed: hex(0xBA1420), + bg_modal_section: hex(0xFFFFFF), + border_subtle: hex(0xC8CCD2), + divider: hex(0xC8CCD2), }; // ── Night Owl Dark ── pub const NIGHTOWL_DARK: Self = Self { - bg_primary: hex(0x011627), bg_sidebar: hex(0x011221), bg_card: hex(0x0B2942), - bg_card_hover: hex(0x1D3B53), bg_card_pressed: hex(0x2A4F6C), bg_selected: hex(0x1D3B53), - bg_input: hex(0x0B2942), bg_progress: hex(0x011221), - text_primary: hex(0xD6DEEB), text_secondary: hex(0xB4C0D0), text_muted: hex(0x8CA0B4), - text_dim: hex(0x7E94A8), text_dimmer: hex(0x637777), text_dimmest: hex(0x4A6060), + bg_primary: hex(0x011627), + bg_sidebar: hex(0x011221), + bg_card: hex(0x0B2942), + bg_card_hover: hex(0x1D3B53), + bg_card_pressed: hex(0x2A4F6C), + bg_selected: hex(0x1D3B53), + bg_input: hex(0x0B2942), + bg_progress: hex(0x011221), + text_primary: hex(0xD6DEEB), + text_secondary: hex(0xB4C0D0), + text_muted: hex(0x8CA0B4), + text_dim: hex(0x7E94A8), + text_dimmer: hex(0x637777), + text_dimmest: hex(0x4A6060), text_placeholder: hex(0x637777), - accent_blue: hex(0x82AAFF), accent_icon: hex(0x7FDBCA), accent_progress: hex(0x82AAFF), - btn_default: hex(0x0B2942), btn_hover: hex(0x1D3B53), btn_pressed: hex(0x2A4F6C), - success: hex(0xADDB67), success_bg: hex(0x011E14), - btn_success: hex(0x8CB852), btn_success_hover: hex(0x80AC48), btn_success_pressed: hex(0x74A03E), - warning: hex(0xECC48D), warning_bg: hex(0x1A1808), - error: hex(0xEF5350), error_light: hex(0xFF6E6A), error_bg: hex(0x1A0808), - btn_danger_bg: hex(0x1A0808), btn_danger_hover: hex(0x3A1818), - btn_trash_hover: hex(0xEF5350), btn_trash_pressed: hex(0xCF4040), - bg_modal_section: hex(0x011627), border_subtle: hex(0x0B2942), divider: hex(0x0B2942), + accent_blue: hex(0x82AAFF), + accent_icon: hex(0x7FDBCA), + accent_progress: hex(0x82AAFF), + btn_default: hex(0x0B2942), + btn_hover: hex(0x1D3B53), + btn_pressed: hex(0x2A4F6C), + success: hex(0xADDB67), + success_bg: hex(0x011E14), + btn_success: hex(0x8CB852), + btn_success_hover: hex(0x80AC48), + btn_success_pressed: hex(0x74A03E), + warning: hex(0xECC48D), + warning_bg: hex(0x1A1808), + error: hex(0xEF5350), + error_light: hex(0xFF6E6A), + error_bg: hex(0x1A0808), + btn_danger_bg: hex(0x1A0808), + btn_danger_hover: hex(0x3A1818), + btn_trash_hover: hex(0xEF5350), + btn_trash_pressed: hex(0xCF4040), + bg_modal_section: hex(0x011627), + border_subtle: hex(0x0B2942), + divider: hex(0x0B2942), }; // ── Night Owl Light ── pub const NIGHTOWL_LIGHT: Self = Self { - bg_primary: hex(0xFBFBFB), bg_sidebar: hex(0xF0F0F0), bg_card: hex(0xE8E8E8), - bg_card_hover: hex(0xE0E0E0), bg_card_pressed: hex(0xD4D4D4), bg_selected: hex(0xE0E0E0), - bg_input: hex(0xE8E8E8), bg_progress: hex(0xF0F0F0), - text_primary: hex(0x403F53), text_secondary: hex(0x565570), text_muted: hex(0x6E6D88), - text_dim: hex(0x8888A0), text_dimmer: hex(0x989FB1), text_dimmest: hex(0xB0B4C0), + bg_primary: hex(0xFBFBFB), + bg_sidebar: hex(0xF0F0F0), + bg_card: hex(0xE8E8E8), + bg_card_hover: hex(0xE0E0E0), + bg_card_pressed: hex(0xD4D4D4), + bg_selected: hex(0xE0E0E0), + bg_input: hex(0xE8E8E8), + bg_progress: hex(0xF0F0F0), + text_primary: hex(0x403F53), + text_secondary: hex(0x565570), + text_muted: hex(0x6E6D88), + text_dim: hex(0x8888A0), + text_dimmer: hex(0x989FB1), + text_dimmest: hex(0xB0B4C0), text_placeholder: hex(0x989FB1), - accent_blue: hex(0x4876D6), accent_icon: hex(0x0C969B), accent_progress: hex(0x4876D6), - btn_default: hex(0xE8E8E8), btn_hover: hex(0xE0E0E0), btn_pressed: hex(0xD4D4D4), - success: hex(0x2AA298), success_bg: hex(0xD0E8E0), - btn_success: hex(0x2AA298), btn_success_hover: hex(0x22948C), btn_success_pressed: hex(0x1A8680), - warning: hex(0xD98E24), warning_bg: hex(0xECE0C8), - error: hex(0xDE3D3B), error_light: hex(0xE85858), error_bg: hex(0xECC8C8), - btn_danger_bg: hex(0xECC8C8), btn_danger_hover: hex(0xDCB0B0), - btn_trash_hover: hex(0xDE3D3B), btn_trash_pressed: hex(0xBE2E2C), - bg_modal_section: hex(0xFBFBFB), border_subtle: hex(0xE0E0E0), divider: hex(0xE0E0E0), + accent_blue: hex(0x4876D6), + accent_icon: hex(0x0C969B), + accent_progress: hex(0x4876D6), + btn_default: hex(0xE8E8E8), + btn_hover: hex(0xE0E0E0), + btn_pressed: hex(0xD4D4D4), + success: hex(0x2AA298), + success_bg: hex(0xD0E8E0), + btn_success: hex(0x2AA298), + btn_success_hover: hex(0x22948C), + btn_success_pressed: hex(0x1A8680), + warning: hex(0xD98E24), + warning_bg: hex(0xECE0C8), + error: hex(0xDE3D3B), + error_light: hex(0xE85858), + error_bg: hex(0xECC8C8), + btn_danger_bg: hex(0xECC8C8), + btn_danger_hover: hex(0xDCB0B0), + btn_trash_hover: hex(0xDE3D3B), + btn_trash_pressed: hex(0xBE2E2C), + bg_modal_section: hex(0xFBFBFB), + border_subtle: hex(0xE0E0E0), + divider: hex(0xE0E0E0), }; // ── Iceberg Dark ── pub const ICEBERG_DARK: Self = Self { - bg_primary: hex(0x161821), bg_sidebar: hex(0x0F1117), bg_card: hex(0x1E2132), - bg_card_hover: hex(0x2E313F), bg_card_pressed: hex(0x3D425B), bg_selected: hex(0x2E313F), - bg_input: hex(0x1E2132), bg_progress: hex(0x0F1117), - text_primary: hex(0xC6C8D1), text_secondary: hex(0xB0B4C0), text_muted: hex(0x9498A8), - text_dim: hex(0x818596), text_dimmer: hex(0x6B7089), text_dimmest: hex(0x4E5268), + bg_primary: hex(0x161821), + bg_sidebar: hex(0x0F1117), + bg_card: hex(0x1E2132), + bg_card_hover: hex(0x2E313F), + bg_card_pressed: hex(0x3D425B), + bg_selected: hex(0x2E313F), + bg_input: hex(0x1E2132), + bg_progress: hex(0x0F1117), + text_primary: hex(0xC6C8D1), + text_secondary: hex(0xB0B4C0), + text_muted: hex(0x9498A8), + text_dim: hex(0x818596), + text_dimmer: hex(0x6B7089), + text_dimmest: hex(0x4E5268), text_placeholder: hex(0x6B7089), - accent_blue: hex(0x84A0C6), accent_icon: hex(0x89B8C2), accent_progress: hex(0x84A0C6), - btn_default: hex(0x1E2132), btn_hover: hex(0x2E313F), btn_pressed: hex(0x3D425B), - success: hex(0xB4BE82), success_bg: hex(0x141E18), - btn_success: hex(0x949E68), btn_success_hover: hex(0x88925C), btn_success_pressed: hex(0x7C8650), - warning: hex(0xE2A478), warning_bg: hex(0x201C14), - error: hex(0xE27878), error_light: hex(0xF09090), error_bg: hex(0x201418), - btn_danger_bg: hex(0x201418), btn_danger_hover: hex(0x402428), - btn_trash_hover: hex(0xE27878), btn_trash_pressed: hex(0xC26060), - bg_modal_section: hex(0x161821), border_subtle: hex(0x1E2132), divider: hex(0x1E2132), + accent_blue: hex(0x84A0C6), + accent_icon: hex(0x89B8C2), + accent_progress: hex(0x84A0C6), + btn_default: hex(0x1E2132), + btn_hover: hex(0x2E313F), + btn_pressed: hex(0x3D425B), + success: hex(0xB4BE82), + success_bg: hex(0x141E18), + btn_success: hex(0x949E68), + btn_success_hover: hex(0x88925C), + btn_success_pressed: hex(0x7C8650), + warning: hex(0xE2A478), + warning_bg: hex(0x201C14), + error: hex(0xE27878), + error_light: hex(0xF09090), + error_bg: hex(0x201418), + btn_danger_bg: hex(0x201418), + btn_danger_hover: hex(0x402428), + btn_trash_hover: hex(0xE27878), + btn_trash_pressed: hex(0xC26060), + bg_modal_section: hex(0x161821), + border_subtle: hex(0x1E2132), + divider: hex(0x1E2132), }; // ── Iceberg Light ── pub const ICEBERG_LIGHT: Self = Self { - bg_primary: hex(0xE8E9EC), bg_sidebar: hex(0xDCDFE7), bg_card: hex(0xD0D4DE), - bg_card_hover: hex(0xCAD0DE), bg_card_pressed: hex(0xBEC4D2), bg_selected: hex(0xCAD0DE), - bg_input: hex(0xD0D4DE), bg_progress: hex(0xDCDFE7), - text_primary: hex(0x33374C), text_secondary: hex(0x444862), text_muted: hex(0x5C6080), - text_dim: hex(0x747896), text_dimmer: hex(0x8B98B6), text_dimmest: hex(0xA8B0C8), + bg_primary: hex(0xE8E9EC), + bg_sidebar: hex(0xDCDFE7), + bg_card: hex(0xD0D4DE), + bg_card_hover: hex(0xCAD0DE), + bg_card_pressed: hex(0xBEC4D2), + bg_selected: hex(0xCAD0DE), + bg_input: hex(0xD0D4DE), + bg_progress: hex(0xDCDFE7), + text_primary: hex(0x33374C), + text_secondary: hex(0x444862), + text_muted: hex(0x5C6080), + text_dim: hex(0x747896), + text_dimmer: hex(0x8B98B6), + text_dimmest: hex(0xA8B0C8), text_placeholder: hex(0x8B98B6), - accent_blue: hex(0x2D539E), accent_icon: hex(0x33635C), accent_progress: hex(0x2D539E), - btn_default: hex(0xD0D4DE), btn_hover: hex(0xCAD0DE), btn_pressed: hex(0xBEC4D2), - success: hex(0x668E3D), success_bg: hex(0xD0E0C8), - btn_success: hex(0x668E3D), btn_success_hover: hex(0x588032), btn_success_pressed: hex(0x4A7228), - warning: hex(0xC57339), warning_bg: hex(0xE4D8C8), - error: hex(0xCC517A), error_light: hex(0xDD6890), error_bg: hex(0xE4C8D4), - btn_danger_bg: hex(0xE4C8D4), btn_danger_hover: hex(0xD4B4C0), - btn_trash_hover: hex(0xCC517A), btn_trash_pressed: hex(0xAC4068), - bg_modal_section: hex(0xE8E9EC), border_subtle: hex(0xCAD0DE), divider: hex(0xCAD0DE), + accent_blue: hex(0x2D539E), + accent_icon: hex(0x33635C), + accent_progress: hex(0x2D539E), + btn_default: hex(0xD0D4DE), + btn_hover: hex(0xCAD0DE), + btn_pressed: hex(0xBEC4D2), + success: hex(0x668E3D), + success_bg: hex(0xD0E0C8), + btn_success: hex(0x668E3D), + btn_success_hover: hex(0x588032), + btn_success_pressed: hex(0x4A7228), + warning: hex(0xC57339), + warning_bg: hex(0xE4D8C8), + error: hex(0xCC517A), + error_light: hex(0xDD6890), + error_bg: hex(0xE4C8D4), + btn_danger_bg: hex(0xE4C8D4), + btn_danger_hover: hex(0xD4B4C0), + btn_trash_hover: hex(0xCC517A), + btn_trash_pressed: hex(0xAC4068), + bg_modal_section: hex(0xE8E9EC), + border_subtle: hex(0xCAD0DE), + divider: hex(0xCAD0DE), }; // ── Horizon Dark ── pub const HORIZON_DARK: Self = Self { - bg_primary: hex(0x1C1E26), bg_sidebar: hex(0x16161C), bg_card: hex(0x2E303E), - bg_card_hover: hex(0x3A3C4E), bg_card_pressed: hex(0x484A60), bg_selected: hex(0x2E303E), - bg_input: hex(0x2E303E), bg_progress: hex(0x16161C), - text_primary: hex(0xD5D8DA), text_secondary: hex(0xBEC0C4), text_muted: hex(0xA0A2A8), - text_dim: hex(0x888A92), text_dimmer: hex(0x6C6F93), text_dimmest: hex(0x50526E), + bg_primary: hex(0x1C1E26), + bg_sidebar: hex(0x16161C), + bg_card: hex(0x2E303E), + bg_card_hover: hex(0x3A3C4E), + bg_card_pressed: hex(0x484A60), + bg_selected: hex(0x2E303E), + bg_input: hex(0x2E303E), + bg_progress: hex(0x16161C), + text_primary: hex(0xD5D8DA), + text_secondary: hex(0xBEC0C4), + text_muted: hex(0xA0A2A8), + text_dim: hex(0x888A92), + text_dimmer: hex(0x6C6F93), + text_dimmest: hex(0x50526E), text_placeholder: hex(0x6C6F93), - accent_blue: hex(0x26BBD9), accent_icon: hex(0xB877DB), accent_progress: hex(0x26BBD9), - btn_default: hex(0x2E303E), btn_hover: hex(0x3A3C4E), btn_pressed: hex(0x484A60), - success: hex(0x29D398), success_bg: hex(0x141E1C), - btn_success: hex(0x22B480), btn_success_hover: hex(0x1CA874), btn_success_pressed: hex(0x169C68), - warning: hex(0xFAC29A), warning_bg: hex(0x2A2218), - error: hex(0xE95678), error_light: hex(0xF07090), error_bg: hex(0x2A1620), - btn_danger_bg: hex(0x2A1620), btn_danger_hover: hex(0x4A2630), - btn_trash_hover: hex(0xE95678), btn_trash_pressed: hex(0xC94460), - bg_modal_section: hex(0x1C1E26), border_subtle: hex(0x2E303E), divider: hex(0x2E303E), + accent_blue: hex(0x26BBD9), + accent_icon: hex(0xB877DB), + accent_progress: hex(0x26BBD9), + btn_default: hex(0x2E303E), + btn_hover: hex(0x3A3C4E), + btn_pressed: hex(0x484A60), + success: hex(0x29D398), + success_bg: hex(0x141E1C), + btn_success: hex(0x22B480), + btn_success_hover: hex(0x1CA874), + btn_success_pressed: hex(0x169C68), + warning: hex(0xFAC29A), + warning_bg: hex(0x2A2218), + error: hex(0xE95678), + error_light: hex(0xF07090), + error_bg: hex(0x2A1620), + btn_danger_bg: hex(0x2A1620), + btn_danger_hover: hex(0x4A2630), + btn_trash_hover: hex(0xE95678), + btn_trash_pressed: hex(0xC94460), + bg_modal_section: hex(0x1C1E26), + border_subtle: hex(0x2E303E), + divider: hex(0x2E303E), }; // ── Melange Dark ── pub const MELANGE_DARK: Self = Self { - bg_primary: hex(0x292522), bg_sidebar: hex(0x221E1B), bg_card: hex(0x34302C), - bg_card_hover: hex(0x403A36), bg_card_pressed: hex(0x4C4640), bg_selected: hex(0x403A36), - bg_input: hex(0x34302C), bg_progress: hex(0x221E1B), - text_primary: hex(0xECE1D7), text_secondary: hex(0xD4C8BC), text_muted: hex(0xBAB0A4), - text_dim: hex(0x9E9488), text_dimmer: hex(0x867462), text_dimmest: hex(0x6A5E50), + bg_primary: hex(0x292522), + bg_sidebar: hex(0x221E1B), + bg_card: hex(0x34302C), + bg_card_hover: hex(0x403A36), + bg_card_pressed: hex(0x4C4640), + bg_selected: hex(0x403A36), + bg_input: hex(0x34302C), + bg_progress: hex(0x221E1B), + text_primary: hex(0xECE1D7), + text_secondary: hex(0xD4C8BC), + text_muted: hex(0xBAB0A4), + text_dim: hex(0x9E9488), + text_dimmer: hex(0x867462), + text_dimmest: hex(0x6A5E50), text_placeholder: hex(0x867462), - accent_blue: hex(0xA3A9CE), accent_icon: hex(0x89B3B6), accent_progress: hex(0xA3A9CE), - btn_default: hex(0x34302C), btn_hover: hex(0x403A36), btn_pressed: hex(0x4C4640), - success: hex(0x85B695), success_bg: hex(0x1E2820), - btn_success: hex(0x6C9A7C), btn_success_hover: hex(0x608E70), btn_success_pressed: hex(0x548264), - warning: hex(0xEBC06D), warning_bg: hex(0x2A261A), - error: hex(0xD47766), error_light: hex(0xE89080), error_bg: hex(0x2A1C18), - btn_danger_bg: hex(0x2A1C18), btn_danger_hover: hex(0x4A2C28), - btn_trash_hover: hex(0xD47766), btn_trash_pressed: hex(0xB46050), - bg_modal_section: hex(0x292522), border_subtle: hex(0x34302C), divider: hex(0x34302C), + accent_blue: hex(0xA3A9CE), + accent_icon: hex(0x89B3B6), + accent_progress: hex(0xA3A9CE), + btn_default: hex(0x34302C), + btn_hover: hex(0x403A36), + btn_pressed: hex(0x4C4640), + success: hex(0x85B695), + success_bg: hex(0x1E2820), + btn_success: hex(0x6C9A7C), + btn_success_hover: hex(0x608E70), + btn_success_pressed: hex(0x548264), + warning: hex(0xEBC06D), + warning_bg: hex(0x2A261A), + error: hex(0xD47766), + error_light: hex(0xE89080), + error_bg: hex(0x2A1C18), + btn_danger_bg: hex(0x2A1C18), + btn_danger_hover: hex(0x4A2C28), + btn_trash_hover: hex(0xD47766), + btn_trash_pressed: hex(0xB46050), + bg_modal_section: hex(0x292522), + border_subtle: hex(0x34302C), + divider: hex(0x34302C), }; // ── Melange Light ── pub const MELANGE_LIGHT: Self = Self { - bg_primary: hex(0xF4F0ED), bg_sidebar: hex(0xE9E1DB), bg_card: hex(0xDDD2C8), - bg_card_hover: hex(0xD0C6BA), bg_card_pressed: hex(0xC4BAAE), bg_selected: hex(0xDDD2C8), - bg_input: hex(0xDDD2C8), bg_progress: hex(0xE9E1DB), - text_primary: hex(0x54433A), text_secondary: hex(0x6B5C4D), text_muted: hex(0x7E6E5E), - text_dim: hex(0x948472), text_dimmer: hex(0xA89888), text_dimmest: hex(0xBEB0A0), + bg_primary: hex(0xF4F0ED), + bg_sidebar: hex(0xE9E1DB), + bg_card: hex(0xDDD2C8), + bg_card_hover: hex(0xD0C6BA), + bg_card_pressed: hex(0xC4BAAE), + bg_selected: hex(0xDDD2C8), + bg_input: hex(0xDDD2C8), + bg_progress: hex(0xE9E1DB), + text_primary: hex(0x54433A), + text_secondary: hex(0x6B5C4D), + text_muted: hex(0x7E6E5E), + text_dim: hex(0x948472), + text_dimmer: hex(0xA89888), + text_dimmest: hex(0xBEB0A0), text_placeholder: hex(0xA89888), - accent_blue: hex(0x5E6DAB), accent_icon: hex(0x3F7C82), accent_progress: hex(0x5E6DAB), - btn_default: hex(0xDDD2C8), btn_hover: hex(0xD0C6BA), btn_pressed: hex(0xC4BAAE), - success: hex(0x4E7548), success_bg: hex(0xD0E0D0), - btn_success: hex(0x4E7548), btn_success_hover: hex(0x42683C), btn_success_pressed: hex(0x365C30), - warning: hex(0x9A7C24), warning_bg: hex(0xE0DCC0), - error: hex(0xA44C36), error_light: hex(0xC06048), error_bg: hex(0xE0CCC4), - btn_danger_bg: hex(0xE0CCC4), btn_danger_hover: hex(0xD0B8B0), - btn_trash_hover: hex(0xA44C36), btn_trash_pressed: hex(0x843C28), - bg_modal_section: hex(0xF4F0ED), border_subtle: hex(0xD0C6BA), divider: hex(0xD0C6BA), + accent_blue: hex(0x5E6DAB), + accent_icon: hex(0x3F7C82), + accent_progress: hex(0x5E6DAB), + btn_default: hex(0xDDD2C8), + btn_hover: hex(0xD0C6BA), + btn_pressed: hex(0xC4BAAE), + success: hex(0x4E7548), + success_bg: hex(0xD0E0D0), + btn_success: hex(0x4E7548), + btn_success_hover: hex(0x42683C), + btn_success_pressed: hex(0x365C30), + warning: hex(0x9A7C24), + warning_bg: hex(0xE0DCC0), + error: hex(0xA44C36), + error_light: hex(0xC06048), + error_bg: hex(0xE0CCC4), + btn_danger_bg: hex(0xE0CCC4), + btn_danger_hover: hex(0xD0B8B0), + btn_trash_hover: hex(0xA44C36), + btn_trash_pressed: hex(0x843C28), + bg_modal_section: hex(0xF4F0ED), + border_subtle: hex(0xD0C6BA), + divider: hex(0xD0C6BA), }; // ── Synthwave '84 ── pub const SYNTHWAVE_DARK: Self = Self { - bg_primary: hex(0x262335), bg_sidebar: hex(0x241B2F), bg_card: hex(0x34294F), - bg_card_hover: hex(0x3E3460), bg_card_pressed: hex(0x463465), bg_selected: hex(0x463465), - bg_input: hex(0x2A2139), bg_progress: hex(0x241B2F), - text_primary: hex(0xFFFFFF), text_secondary: hex(0xE2E2E2), text_muted: hex(0xC0BCD0), - text_dim: hex(0xA09CB4), text_dimmer: hex(0x848BBD), text_dimmest: hex(0x614D85), + bg_primary: hex(0x262335), + bg_sidebar: hex(0x241B2F), + bg_card: hex(0x34294F), + bg_card_hover: hex(0x3E3460), + bg_card_pressed: hex(0x463465), + bg_selected: hex(0x463465), + bg_input: hex(0x2A2139), + bg_progress: hex(0x241B2F), + text_primary: hex(0xFFFFFF), + text_secondary: hex(0xE2E2E2), + text_muted: hex(0xC0BCD0), + text_dim: hex(0xA09CB4), + text_dimmer: hex(0x848BBD), + text_dimmest: hex(0x614D85), text_placeholder: hex(0x848BBD), - accent_blue: hex(0xFF7EDB), accent_icon: hex(0x36F9F6), accent_progress: hex(0xFF7EDB), - btn_default: hex(0x34294F), btn_hover: hex(0x3E3460), btn_pressed: hex(0x463465), - success: hex(0x72F1B8), success_bg: hex(0x1A2828), - btn_success: hex(0x5CC898), btn_success_hover: hex(0x50BC8C), btn_success_pressed: hex(0x44B080), - warning: hex(0xFEDE5D), warning_bg: hex(0x2A281A), - error: hex(0xFE4450), error_light: hex(0xFF6670), error_bg: hex(0x2A1A1E), - btn_danger_bg: hex(0x2A1A1E), btn_danger_hover: hex(0x4A2A2E), - btn_trash_hover: hex(0xFE4450), btn_trash_pressed: hex(0xDE3440), - bg_modal_section: hex(0x262335), border_subtle: hex(0x34294F), divider: hex(0x34294F), + accent_blue: hex(0xFF7EDB), + accent_icon: hex(0x36F9F6), + accent_progress: hex(0xFF7EDB), + btn_default: hex(0x34294F), + btn_hover: hex(0x3E3460), + btn_pressed: hex(0x463465), + success: hex(0x72F1B8), + success_bg: hex(0x1A2828), + btn_success: hex(0x5CC898), + btn_success_hover: hex(0x50BC8C), + btn_success_pressed: hex(0x44B080), + warning: hex(0xFEDE5D), + warning_bg: hex(0x2A281A), + error: hex(0xFE4450), + error_light: hex(0xFF6670), + error_bg: hex(0x2A1A1E), + btn_danger_bg: hex(0x2A1A1E), + btn_danger_hover: hex(0x4A2A2E), + btn_trash_hover: hex(0xFE4450), + btn_trash_pressed: hex(0xDE3440), + bg_modal_section: hex(0x262335), + border_subtle: hex(0x34294F), + divider: hex(0x34294F), }; // ── Modus Operandi (light, WCAG AAA) ── pub const MODUS_OPERANDI: Self = Self { - bg_primary: hex(0xFFFFFF), bg_sidebar: hex(0xF0F0F0), bg_card: hex(0xE0E0E0), - bg_card_hover: hex(0xD0D0D0), bg_card_pressed: hex(0xC4C4C4), bg_selected: hex(0xD0D0D0), - bg_input: hex(0xE0E0E0), bg_progress: hex(0xF0F0F0), - text_primary: hex(0x000000), text_secondary: hex(0x1A1A1A), text_muted: hex(0x333333), - text_dim: hex(0x595959), text_dimmer: hex(0x7F7F7F), text_dimmest: hex(0x9F9F9F), + bg_primary: hex(0xFFFFFF), + bg_sidebar: hex(0xF0F0F0), + bg_card: hex(0xE0E0E0), + bg_card_hover: hex(0xD0D0D0), + bg_card_pressed: hex(0xC4C4C4), + bg_selected: hex(0xD0D0D0), + bg_input: hex(0xE0E0E0), + bg_progress: hex(0xF0F0F0), + text_primary: hex(0x000000), + text_secondary: hex(0x1A1A1A), + text_muted: hex(0x333333), + text_dim: hex(0x595959), + text_dimmer: hex(0x7F7F7F), + text_dimmest: hex(0x9F9F9F), text_placeholder: hex(0x7F7F7F), - accent_blue: hex(0x0031A9), accent_icon: hex(0x005E8B), accent_progress: hex(0x0031A9), - btn_default: hex(0xE0E0E0), btn_hover: hex(0xD0D0D0), btn_pressed: hex(0xC4C4C4), - success: hex(0x006800), success_bg: hex(0xD0F0D0), - btn_success: hex(0x006800), btn_success_hover: hex(0x005800), btn_success_pressed: hex(0x004800), - warning: hex(0x6F5500), warning_bg: hex(0xF0E8C8), - error: hex(0xA60000), error_light: hex(0xD00000), error_bg: hex(0xF0C8C8), - btn_danger_bg: hex(0xF0C8C8), btn_danger_hover: hex(0xE0B0B0), - btn_trash_hover: hex(0xA60000), btn_trash_pressed: hex(0x860000), - bg_modal_section: hex(0xFFFFFF), border_subtle: hex(0xD0D0D0), divider: hex(0xD0D0D0), + accent_blue: hex(0x0031A9), + accent_icon: hex(0x005E8B), + accent_progress: hex(0x0031A9), + btn_default: hex(0xE0E0E0), + btn_hover: hex(0xD0D0D0), + btn_pressed: hex(0xC4C4C4), + success: hex(0x006800), + success_bg: hex(0xD0F0D0), + btn_success: hex(0x006800), + btn_success_hover: hex(0x005800), + btn_success_pressed: hex(0x004800), + warning: hex(0x6F5500), + warning_bg: hex(0xF0E8C8), + error: hex(0xA60000), + error_light: hex(0xD00000), + error_bg: hex(0xF0C8C8), + btn_danger_bg: hex(0xF0C8C8), + btn_danger_hover: hex(0xE0B0B0), + btn_trash_hover: hex(0xA60000), + btn_trash_pressed: hex(0x860000), + bg_modal_section: hex(0xFFFFFF), + border_subtle: hex(0xD0D0D0), + divider: hex(0xD0D0D0), }; // ── Modus Vivendi (dark, WCAG AAA) ── pub const MODUS_VIVENDI: Self = Self { - bg_primary: hex(0x000000), bg_sidebar: hex(0x1E1E1E), bg_card: hex(0x303030), - bg_card_hover: hex(0x404040), bg_card_pressed: hex(0x535353), bg_selected: hex(0x404040), - bg_input: hex(0x303030), bg_progress: hex(0x1E1E1E), - text_primary: hex(0xFFFFFF), text_secondary: hex(0xE0E0E0), text_muted: hex(0xC0C0C0), - text_dim: hex(0x989898), text_dimmer: hex(0x707070), text_dimmest: hex(0x535353), + bg_primary: hex(0x000000), + bg_sidebar: hex(0x1E1E1E), + bg_card: hex(0x303030), + bg_card_hover: hex(0x404040), + bg_card_pressed: hex(0x535353), + bg_selected: hex(0x404040), + bg_input: hex(0x303030), + bg_progress: hex(0x1E1E1E), + text_primary: hex(0xFFFFFF), + text_secondary: hex(0xE0E0E0), + text_muted: hex(0xC0C0C0), + text_dim: hex(0x989898), + text_dimmer: hex(0x707070), + text_dimmest: hex(0x535353), text_placeholder: hex(0x707070), - accent_blue: hex(0x2FAFFF), accent_icon: hex(0x00D3D0), accent_progress: hex(0x2FAFFF), - btn_default: hex(0x303030), btn_hover: hex(0x404040), btn_pressed: hex(0x535353), - success: hex(0x44BC44), success_bg: hex(0x0A1A0A), - btn_success: hex(0x38A038), btn_success_hover: hex(0x30942E), btn_success_pressed: hex(0x288824), - warning: hex(0xD0BC00), warning_bg: hex(0x1A1A00), - error: hex(0xFF5F59), error_light: hex(0xFF7F86), error_bg: hex(0x1A0808), - btn_danger_bg: hex(0x1A0808), btn_danger_hover: hex(0x3A1818), - btn_trash_hover: hex(0xFF5F59), btn_trash_pressed: hex(0xDF4F48), - bg_modal_section: hex(0x000000), border_subtle: hex(0x303030), divider: hex(0x303030), + accent_blue: hex(0x2FAFFF), + accent_icon: hex(0x00D3D0), + accent_progress: hex(0x2FAFFF), + btn_default: hex(0x303030), + btn_hover: hex(0x404040), + btn_pressed: hex(0x535353), + success: hex(0x44BC44), + success_bg: hex(0x0A1A0A), + btn_success: hex(0x38A038), + btn_success_hover: hex(0x30942E), + btn_success_pressed: hex(0x288824), + warning: hex(0xD0BC00), + warning_bg: hex(0x1A1A00), + error: hex(0xFF5F59), + error_light: hex(0xFF7F86), + error_bg: hex(0x1A0808), + btn_danger_bg: hex(0x1A0808), + btn_danger_hover: hex(0x3A1818), + btn_trash_hover: hex(0xFF5F59), + btn_trash_pressed: hex(0xDF4F48), + bg_modal_section: hex(0x000000), + border_subtle: hex(0x303030), + divider: hex(0x303030), }; // ── Stellar Blade (fan-made character set) ───────────────────────────── @@ -1695,96 +2725,211 @@ impl ThemePalette { /// EVE — her Planet Diving Suit: white/grey ceramic, green legs as the ink. Light. pub const STELLAR_EVE: Self = Self { - bg_primary: hex(0xECEEEC), bg_sidebar: hex(0xD3D7D3), bg_card: hex(0xFFFFFF), - bg_card_hover: hex(0xE2E6E2), bg_card_pressed: hex(0xD7DCD7), bg_selected: hex(0xD9E4DA), - bg_input: hex(0xE0E4E0), bg_progress: hex(0xDEE1DE), - text_primary: hex(0x1A6B3B), text_secondary: hex(0x2B7D4A), text_muted: hex(0x4E8A63), - text_dim: hex(0x6FA082), text_dimmer: hex(0x84AD94), text_dimmest: hex(0x9ABDA7), + bg_primary: hex(0xECEEEC), + bg_sidebar: hex(0xD3D7D3), + bg_card: hex(0xFFFFFF), + bg_card_hover: hex(0xE2E6E2), + bg_card_pressed: hex(0xD7DCD7), + bg_selected: hex(0xD9E4DA), + bg_input: hex(0xE0E4E0), + bg_progress: hex(0xDEE1DE), + text_primary: hex(0x1A6B3B), + text_secondary: hex(0x2B7D4A), + text_muted: hex(0x4E8A63), + text_dim: hex(0x6FA082), + text_dimmer: hex(0x84AD94), + text_dimmest: hex(0x9ABDA7), text_placeholder: hex(0x84AD94), - accent_blue: hex(0x21A04D), accent_icon: hex(0x21A04D), accent_progress: hex(0x21A04D), - btn_default: hex(0xDFE3DF), btn_hover: hex(0xD2D8D3), btn_pressed: hex(0xC5CDC7), - success: hex(0x2F9E5C), success_bg: hex(0xD3ECD9), - btn_success: hex(0x2F9E5C), btn_success_hover: hex(0x288B50), btn_success_pressed: hex(0x227A46), - warning: hex(0xC8861E), warning_bg: hex(0xF0E6C8), - error: hex(0xD5493C), error_light: hex(0xE05A4E), error_bg: hex(0xF0CDC8), - btn_danger_bg: hex(0xF0CDC8), btn_danger_hover: hex(0xE3B6B0), - btn_trash_hover: hex(0xC23A2E), btn_trash_pressed: hex(0xA93227), - bg_modal_section: hex(0xE7EAE7), border_subtle: hex(0xC0C8C1), divider: hex(0xC0C8C1), + accent_blue: hex(0x21A04D), + accent_icon: hex(0x21A04D), + accent_progress: hex(0x21A04D), + btn_default: hex(0xDFE3DF), + btn_hover: hex(0xD2D8D3), + btn_pressed: hex(0xC5CDC7), + success: hex(0x2F9E5C), + success_bg: hex(0xD3ECD9), + btn_success: hex(0x2F9E5C), + btn_success_hover: hex(0x288B50), + btn_success_pressed: hex(0x227A46), + warning: hex(0xC8861E), + warning_bg: hex(0xF0E6C8), + error: hex(0xD5493C), + error_light: hex(0xE05A4E), + error_bg: hex(0xF0CDC8), + btn_danger_bg: hex(0xF0CDC8), + btn_danger_hover: hex(0xE3B6B0), + btn_trash_hover: hex(0xC23A2E), + btn_trash_pressed: hex(0xA93227), + bg_modal_section: hex(0xE7EAE7), + border_subtle: hex(0xC0C8C1), + divider: hex(0xC0C8C1), }; /// Tachy — carbon-navy suit, amber text, orange-glow accent; teal glints as success. pub const STELLAR_TACHY: Self = Self { - bg_primary: hex(0x10121A), bg_sidebar: hex(0x0A0B10), bg_card: hex(0x171A24), - bg_card_hover: hex(0x1E2230), bg_card_pressed: hex(0x252A3A), bg_selected: hex(0x202536), - bg_input: hex(0x191C28), bg_progress: hex(0x0D0E15), - text_primary: hex(0xF2BC4E), text_secondary: hex(0xD9A133), text_muted: hex(0xA58136), - text_dim: hex(0x75612F), text_dimmer: hex(0x5C4D28), text_dimmest: hex(0x453A20), + bg_primary: hex(0x10121A), + bg_sidebar: hex(0x0A0B10), + bg_card: hex(0x171A24), + bg_card_hover: hex(0x1E2230), + bg_card_pressed: hex(0x252A3A), + bg_selected: hex(0x202536), + bg_input: hex(0x191C28), + bg_progress: hex(0x0D0E15), + text_primary: hex(0xF2BC4E), + text_secondary: hex(0xD9A133), + text_muted: hex(0xA58136), + text_dim: hex(0x75612F), + text_dimmer: hex(0x5C4D28), + text_dimmest: hex(0x453A20), text_placeholder: hex(0x5C4D28), - accent_blue: hex(0xFF7C1E), accent_icon: hex(0xEAA72C), accent_progress: hex(0xFF7C1E), - btn_default: hex(0x171A24), btn_hover: hex(0x1E2230), btn_pressed: hex(0x252A3A), - success: hex(0x3FBFA8), success_bg: hex(0x0E2420), - btn_success: hex(0x2F9D8A), btn_success_hover: hex(0x298C7B), btn_success_pressed: hex(0x237B6C), - warning: hex(0xEAA72C), warning_bg: hex(0x2A2210), - error: hex(0xF0503C), error_light: hex(0xFF6A55), error_bg: hex(0x2A120E), - btn_danger_bg: hex(0x2A120E), btn_danger_hover: hex(0x41201A), - btn_trash_hover: hex(0xB8402F), btn_trash_pressed: hex(0x96331F), - bg_modal_section: hex(0x141720), border_subtle: hex(0x2B3040), divider: hex(0x2B3040), + accent_blue: hex(0xFF7C1E), + accent_icon: hex(0xEAA72C), + accent_progress: hex(0xFF7C1E), + btn_default: hex(0x171A24), + btn_hover: hex(0x1E2230), + btn_pressed: hex(0x252A3A), + success: hex(0x3FBFA8), + success_bg: hex(0x0E2420), + btn_success: hex(0x2F9D8A), + btn_success_hover: hex(0x298C7B), + btn_success_pressed: hex(0x237B6C), + warning: hex(0xEAA72C), + warning_bg: hex(0x2A2210), + error: hex(0xF0503C), + error_light: hex(0xFF6A55), + error_bg: hex(0x2A120E), + btn_danger_bg: hex(0x2A120E), + btn_danger_hover: hex(0x41201A), + btn_trash_hover: hex(0xB8402F), + btn_trash_pressed: hex(0x96331F), + bg_modal_section: hex(0x141720), + border_subtle: hex(0x2B3040), + divider: hex(0x2B3040), }; /// Lily — strict duotone: amber-gold ink on neutral blacks. pub const STELLAR_LILY: Self = Self { - bg_primary: hex(0x111010), bg_sidebar: hex(0x0A0909), bg_card: hex(0x191817), - bg_card_hover: hex(0x201E1C), bg_card_pressed: hex(0x262421), bg_selected: hex(0x232120), - bg_input: hex(0x1A1918), bg_progress: hex(0x0D0C0C), - text_primary: hex(0xF6C832), text_secondary: hex(0xD4A92C), text_muted: hex(0xA5842A), - text_dim: hex(0x7A6526), text_dimmer: hex(0x5F4F21), text_dimmest: hex(0x483C1B), + bg_primary: hex(0x111010), + bg_sidebar: hex(0x0A0909), + bg_card: hex(0x191817), + bg_card_hover: hex(0x201E1C), + bg_card_pressed: hex(0x262421), + bg_selected: hex(0x232120), + bg_input: hex(0x1A1918), + bg_progress: hex(0x0D0C0C), + text_primary: hex(0xF6C832), + text_secondary: hex(0xD4A92C), + text_muted: hex(0xA5842A), + text_dim: hex(0x7A6526), + text_dimmer: hex(0x5F4F21), + text_dimmest: hex(0x483C1B), text_placeholder: hex(0x5F4F21), - accent_blue: hex(0xFFD23E), accent_icon: hex(0xFFD23E), accent_progress: hex(0xFFD23E), - btn_default: hex(0x191817), btn_hover: hex(0x201E1C), btn_pressed: hex(0x262421), - success: hex(0x5FB55A), success_bg: hex(0x15200F), - btn_success: hex(0x4C9D48), btn_success_hover: hex(0x428C3F), btn_success_pressed: hex(0x397B36), - warning: hex(0xE08A2A), warning_bg: hex(0x261C0C), - error: hex(0xE0503C), error_light: hex(0xF0654F), error_bg: hex(0x26100C), - btn_danger_bg: hex(0x26100C), btn_danger_hover: hex(0x3C1D16), - btn_trash_hover: hex(0xB8402F), btn_trash_pressed: hex(0x96331F), - bg_modal_section: hex(0x151413), border_subtle: hex(0x2E2B26), divider: hex(0x2E2B26), + accent_blue: hex(0xFFD23E), + accent_icon: hex(0xFFD23E), + accent_progress: hex(0xFFD23E), + btn_default: hex(0x191817), + btn_hover: hex(0x201E1C), + btn_pressed: hex(0x262421), + success: hex(0x5FB55A), + success_bg: hex(0x15200F), + btn_success: hex(0x4C9D48), + btn_success_hover: hex(0x428C3F), + btn_success_pressed: hex(0x397B36), + warning: hex(0xE08A2A), + warning_bg: hex(0x261C0C), + error: hex(0xE0503C), + error_light: hex(0xF0654F), + error_bg: hex(0x26100C), + btn_danger_bg: hex(0x26100C), + btn_danger_hover: hex(0x3C1D16), + btn_trash_hover: hex(0xB8402F), + btn_trash_pressed: hex(0x96331F), + bg_modal_section: hex(0x151413), + border_subtle: hex(0x2E2B26), + divider: hex(0x2E2B26), }; /// Enya — white ceramic armour, ice-blue sheen. Light. pub const STELLAR_ENYA: Self = Self { - bg_primary: hex(0xEEF0F3), bg_sidebar: hex(0xD5DAE1), bg_card: hex(0xFFFFFF), - bg_card_hover: hex(0xE4E8EE), bg_card_pressed: hex(0xD9DFE7), bg_selected: hex(0xDCE3EC), - bg_input: hex(0xE2E6EC), bg_progress: hex(0xDFE3EA), - text_primary: hex(0x171C23), text_secondary: hex(0x3F4A58), text_muted: hex(0x66727F), - text_dim: hex(0x8D97A3), text_dimmer: hex(0xA3ADB8), text_dimmest: hex(0xBAC2CC), + bg_primary: hex(0xEEF0F3), + bg_sidebar: hex(0xD5DAE1), + bg_card: hex(0xFFFFFF), + bg_card_hover: hex(0xE4E8EE), + bg_card_pressed: hex(0xD9DFE7), + bg_selected: hex(0xDCE3EC), + bg_input: hex(0xE2E6EC), + bg_progress: hex(0xDFE3EA), + text_primary: hex(0x171C23), + text_secondary: hex(0x3F4A58), + text_muted: hex(0x66727F), + text_dim: hex(0x8D97A3), + text_dimmer: hex(0xA3ADB8), + text_dimmest: hex(0xBAC2CC), text_placeholder: hex(0xA3ADB8), - accent_blue: hex(0x3E90C9), accent_icon: hex(0x3E90C9), accent_progress: hex(0x3E90C9), - btn_default: hex(0xE1E5EB), btn_hover: hex(0xD4DAE2), btn_pressed: hex(0xC8CFD9), - success: hex(0x2F9E5C), success_bg: hex(0xD3ECD9), - btn_success: hex(0x2F9E5C), btn_success_hover: hex(0x288B50), btn_success_pressed: hex(0x227A46), - warning: hex(0xC8861E), warning_bg: hex(0xF0E6C8), - error: hex(0xD5493C), error_light: hex(0xE05A4E), error_bg: hex(0xF0CDC8), - btn_danger_bg: hex(0xF0CDC8), btn_danger_hover: hex(0xE3B6B0), - btn_trash_hover: hex(0xC23A2E), btn_trash_pressed: hex(0xA93227), - bg_modal_section: hex(0xE9ECF0), border_subtle: hex(0xC2CAD4), divider: hex(0xC2CAD4), + accent_blue: hex(0x3E90C9), + accent_icon: hex(0x3E90C9), + accent_progress: hex(0x3E90C9), + btn_default: hex(0xE1E5EB), + btn_hover: hex(0xD4DAE2), + btn_pressed: hex(0xC8CFD9), + success: hex(0x2F9E5C), + success_bg: hex(0xD3ECD9), + btn_success: hex(0x2F9E5C), + btn_success_hover: hex(0x288B50), + btn_success_pressed: hex(0x227A46), + warning: hex(0xC8861E), + warning_bg: hex(0xF0E6C8), + error: hex(0xD5493C), + error_light: hex(0xE05A4E), + error_bg: hex(0xF0CDC8), + btn_danger_bg: hex(0xF0CDC8), + btn_danger_hover: hex(0xE3B6B0), + btn_trash_hover: hex(0xC23A2E), + btn_trash_pressed: hex(0xA93227), + bg_modal_section: hex(0xE9ECF0), + border_subtle: hex(0xC2CAD4), + divider: hex(0xC2CAD4), }; /// Kaya — lavender ink on deep violet; her khaki coat survives as the success state. pub const STELLAR_KAYA: Self = Self { - bg_primary: hex(0x1A1622), bg_sidebar: hex(0x14111B), bg_card: hex(0x221D2E), - bg_card_hover: hex(0x292338), bg_card_pressed: hex(0x302A42), bg_selected: hex(0x2C2540), - bg_input: hex(0x241F31), bg_progress: hex(0x171320), - text_primary: hex(0xD9C8F0), text_secondary: hex(0xB49AE0), text_muted: hex(0x8D7BAE), - text_dim: hex(0x6B5C88), text_dimmer: hex(0x55486E), text_dimmest: hex(0x423857), + bg_primary: hex(0x1A1622), + bg_sidebar: hex(0x14111B), + bg_card: hex(0x221D2E), + bg_card_hover: hex(0x292338), + bg_card_pressed: hex(0x302A42), + bg_selected: hex(0x2C2540), + bg_input: hex(0x241F31), + bg_progress: hex(0x171320), + text_primary: hex(0xD9C8F0), + text_secondary: hex(0xB49AE0), + text_muted: hex(0x8D7BAE), + text_dim: hex(0x6B5C88), + text_dimmer: hex(0x55486E), + text_dimmest: hex(0x423857), text_placeholder: hex(0x55486E), - accent_blue: hex(0xCFA8FF), accent_icon: hex(0xCFA8FF), accent_progress: hex(0xCFA8FF), - btn_default: hex(0x221D2E), btn_hover: hex(0x292338), btn_pressed: hex(0x302A42), - success: hex(0x8A9455), success_bg: hex(0x1D2012), - btn_success: hex(0x767F48), btn_success_hover: hex(0x68703F), btn_success_pressed: hex(0x5A6136), - warning: hex(0xD9A441), warning_bg: hex(0x271F0E), - error: hex(0xE06A6A), error_light: hex(0xEF8080), error_bg: hex(0x291214), - btn_danger_bg: hex(0x291214), btn_danger_hover: hex(0x3E1E21), - btn_trash_hover: hex(0xB84848), btn_trash_pressed: hex(0x963A3A), - bg_modal_section: hex(0x1E1928), border_subtle: hex(0x382F4C), divider: hex(0x382F4C), + accent_blue: hex(0xCFA8FF), + accent_icon: hex(0xCFA8FF), + accent_progress: hex(0xCFA8FF), + btn_default: hex(0x221D2E), + btn_hover: hex(0x292338), + btn_pressed: hex(0x302A42), + success: hex(0x8A9455), + success_bg: hex(0x1D2012), + btn_success: hex(0x767F48), + btn_success_hover: hex(0x68703F), + btn_success_pressed: hex(0x5A6136), + warning: hex(0xD9A441), + warning_bg: hex(0x271F0E), + error: hex(0xE06A6A), + error_light: hex(0xEF8080), + error_bg: hex(0x291214), + btn_danger_bg: hex(0x291214), + btn_danger_hover: hex(0x3E1E21), + btn_trash_hover: hex(0xB84848), + btn_trash_pressed: hex(0x963A3A), + bg_modal_section: hex(0x1E1928), + border_subtle: hex(0x382F4C), + divider: hex(0x382F4C), }; } diff --git a/src/ui/tutorial.rs b/src/ui/tutorial.rs index c996950..1ce9e1b 100644 --- a/src/ui/tutorial.rs +++ b/src/ui/tutorial.rs @@ -30,10 +30,7 @@ struct CollectBounds { } impl Operation for CollectBounds { - fn traverse( - &mut self, - operate: &mut dyn FnMut(&mut dyn Operation), - ) { + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { operate(self); } @@ -129,7 +126,12 @@ fn steps() -> [Step; 6] { title_key: "tut_sidebar_title", desc_key: "tut_sidebar_desc", zone: Zone::SidebarCats, - fallback: Some(SpotRect { x: 0, y: 56, w: 200, h: 380 }), + fallback: Some(SpotRect { + x: 0, + y: 56, + w: 200, + h: 380, + }), placement: Placement::Right, show_github_btn: false, pad: 8, @@ -138,7 +140,12 @@ fn steps() -> [Step; 6] { title_key: "tut_search_title", desc_key: "tut_search_desc", zone: Zone::Search, - fallback: Some(SpotRect { x: 216, y: 16, w: 760, h: 68 }), + fallback: Some(SpotRect { + x: 216, + y: 16, + w: 760, + h: 68, + }), placement: Placement::Below, show_github_btn: false, pad: 10, @@ -147,7 +154,12 @@ fn steps() -> [Step; 6] { title_key: "tut_grid_title", desc_key: "tut_grid_desc", zone: Zone::Grid, - fallback: Some(SpotRect { x: 216, y: 92, w: 760, h: 560 }), + fallback: Some(SpotRect { + x: 216, + y: 92, + w: 760, + h: 560, + }), placement: Placement::Left, show_github_btn: false, pad: 10, @@ -156,7 +168,12 @@ fn steps() -> [Step; 6] { title_key: "tut_github_title", desc_key: "tut_github_desc", zone: Zone::GithubArea, - fallback: Some(SpotRect { x: 0, y: 540, w: 200, h: 130 }), + fallback: Some(SpotRect { + x: 0, + y: 540, + w: 200, + h: 130, + }), placement: Placement::Above, show_github_btn: true, pad: 8, @@ -181,7 +198,8 @@ fn resolve_rect(step: &Step, bounds: &TutorialBounds) -> Option { Zone::Grid => bounds.grid, Zone::GithubArea => bounds.github_area, }; - live.map(|r| SpotRect::from_rect(r, step.pad)).or(step.fallback) + live.map(|r| SpotRect::from_rect(r, step.pad)) + .or(step.fallback) } impl App { @@ -206,7 +224,15 @@ impl App { .center_x(Fill) .center_y(Fill) .style(|_| container::Style { - background: Some(Color { r: 0.0, g: 0.0, b: 0.0, a: 0.65 }.into()), + background: Some( + Color { + r: 0.0, + g: 0.0, + b: 0.0, + a: 0.65, + } + .into(), + ), ..Default::default() }) .into() @@ -218,7 +244,12 @@ impl App { placement: Placement, bubble: Element<'a, Message>, ) -> Element<'a, Message> { - let bg = Color { r: 0.0, g: 0.0, b: 0.0, a: 0.7 }; + let bg = Color { + r: 0.0, + g: 0.0, + b: 0.0, + a: 0.7, + }; let band_style = move |_: &iced::Theme| container::Style { background: Some(bg.into()), ..Default::default() @@ -239,7 +270,12 @@ impl App { .align_y(iced::alignment::Vertical::Bottom) .width(Fill) .height(Fill) - .padding(iced::Padding { top: 0.0, right: 16.0, bottom: 16.0, left: 16.0 }), + .padding(iced::Padding { + top: 0.0, + right: 16.0, + bottom: 16.0, + left: 16.0, + }), ) .width(Fill) .height(Length::Fixed(rect.y as f32)) @@ -267,7 +303,12 @@ impl App { .center_y(Fill) .width(Fill) .height(Fill) - .padding(iced::Padding { top: 0.0, right: 12.0, bottom: 0.0, left: 12.0 }), + .padding(iced::Padding { + top: 0.0, + right: 12.0, + bottom: 0.0, + left: 12.0, + }), ) .width(Length::Fixed(rect.x as f32)) .height(Length::Fixed(rect.h as f32)) @@ -288,7 +329,12 @@ impl App { .center_y(Fill) .width(Fill) .height(Fill) - .padding(iced::Padding { top: 0.0, right: 16.0, bottom: 0.0, left: 16.0 }), + .padding(iced::Padding { + top: 0.0, + right: 16.0, + bottom: 0.0, + left: 16.0, + }), ) .width(Fill) .height(Length::Fixed(rect.h as f32)) @@ -313,7 +359,12 @@ impl App { .align_y(iced::alignment::Vertical::Top) .width(Fill) .height(Fill) - .padding(iced::Padding { top: 16.0, right: 16.0, bottom: 0.0, left: 16.0 }), + .padding(iced::Padding { + top: 16.0, + right: 16.0, + bottom: 0.0, + left: 16.0, + }), ) .width(Fill) .height(Fill) @@ -337,51 +388,59 @@ impl App { let is_last = idx as u8 >= TUTORIAL_LAST_STEP; let is_first = idx == 0; - let primary_btn = |label_key: &'static str, msg: Message| -> iced::widget::Button<'a, Message> { - button( - text(i18n::t(label_key)).size(self.sz(13)).font(self.app_font()), - ) - .on_press(msg) - .padding([9, 18]) - .style(|_theme, status| { - let bg = match status { - button::Status::Hovered => Palette::BTN_SUCCESS_HOVER(), - _ => Palette::BTN_SUCCESS(), - }; - button::Style { - background: Some(bg.into()), - text_color: Palette::TEXT_PRIMARY(), - border: iced::Border::default().rounded(8), - ..Default::default() - } - }) - }; - - let ghost_btn = |label_key: &'static str, msg: Message| -> iced::widget::Button<'a, Message> { - button( - text(i18n::t(label_key)) - .size(self.sz(12)) - .font(self.app_font()) - .color(Palette::TEXT_SECONDARY()), - ) - .on_press(msg) - .padding([8, 14]) - .style(|_theme, status| { - let bg = match status { - button::Status::Hovered => Palette::BTN_HOVER(), - _ => Color::TRANSPARENT, - }; - button::Style { - background: Some(bg.into()), - text_color: Palette::TEXT_SECONDARY(), - border: iced::Border::default().rounded(8), - ..Default::default() - } - }) - }; + let primary_btn = + |label_key: &'static str, msg: Message| -> iced::widget::Button<'a, Message> { + button( + text(i18n::t(label_key)) + .size(self.sz(13)) + .font(self.app_font()), + ) + .on_press(msg) + .padding([9, 18]) + .style(|_theme, status| { + let bg = match status { + button::Status::Hovered => Palette::BTN_SUCCESS_HOVER(), + _ => Palette::BTN_SUCCESS(), + }; + button::Style { + background: Some(bg.into()), + text_color: Palette::TEXT_PRIMARY(), + border: iced::Border::default().rounded(8), + ..Default::default() + } + }) + }; + + let ghost_btn = + |label_key: &'static str, msg: Message| -> iced::widget::Button<'a, Message> { + button( + text(i18n::t(label_key)) + .size(self.sz(12)) + .font(self.app_font()) + .color(Palette::TEXT_SECONDARY()), + ) + .on_press(msg) + .padding([8, 14]) + .style(|_theme, status| { + let bg = match status { + button::Status::Hovered => Palette::BTN_HOVER(), + _ => Color::TRANSPARENT, + }; + button::Style { + background: Some(bg.into()), + text_color: Palette::TEXT_SECONDARY(), + border: iced::Border::default().rounded(8), + ..Default::default() + } + }) + }; let dot = |active: bool| -> iced::widget::Container<'a, Message> { - let c = if active { Palette::ACCENT() } else { Palette::BTN_HOVER() }; + let c = if active { + Palette::ACCENT() + } else { + Palette::BTN_HOVER() + }; container(text("")) .width(7) .height(7) @@ -407,7 +466,11 @@ impl App { } else { ghost_btn("welcome_back", Message::WelcomeBack).into() }; - let right_label = if is_last { "welcome_start" } else { "welcome_next" }; + let right_label = if is_last { + "welcome_start" + } else { + "welcome_next" + }; let right_btn: Element<'a, Message> = primary_btn(right_label, Message::WelcomeNext).into(); let nav = row![ @@ -419,7 +482,11 @@ impl App { ] .align_y(iced::Alignment::Center); - let title_size = if matches!(step.zone, Zone::None) { self.sz(24) } else { self.sz(18) }; + let title_size = if matches!(step.zone, Zone::None) { + self.sz(24) + } else { + self.sz(18) + }; let mut body: Column<'a, Message> = column![ text(i18n::t(step.title_key)) @@ -462,4 +529,3 @@ impl App { .into() } } -