mirror of
https://github.com/zellij-org/zellij.git
synced 2024-11-22 13:02:12 +03:00
feat: provide default themes (#2307)
* refactor: move themes to zellij-assets * feat: add theme to the binary * chore: move new theme from example to assets
This commit is contained in:
parent
0a8bbd7f23
commit
ff36798c9e
@ -1,19 +1,5 @@
|
|||||||
# Themes
|
# Themes
|
||||||
|
|
||||||
Themes can contain different flavors in one file, or can be created as individual files.
|
It contains examples showing how to write a theme.
|
||||||
|
|
||||||
Example:
|
If you would like to add a theme to zellij, please refer [zellij-utils/assets/themes](../../zellij-utils/assets/themes).
|
||||||
|
|
||||||
```
|
|
||||||
gruvbox.kdl
|
|
||||||
├─ gruvbox-light
|
|
||||||
└─ gruvbox-dark
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
gruvbox-light.kdl
|
|
||||||
└─ gruvbox-light
|
|
||||||
|
|
||||||
gruvbox-dark.kdl
|
|
||||||
└─ gruvbox-dark
|
|
||||||
```
|
|
||||||
|
34
example/themes/example.kdl
Normal file
34
example/themes/example.kdl
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// This file shows how to write a theme file
|
||||||
|
// using `gruvbox` theme.
|
||||||
|
|
||||||
|
themes {
|
||||||
|
// example of how to set a theme in RGB format
|
||||||
|
gruvbox-light {
|
||||||
|
fg 60 56 54
|
||||||
|
bg 251 82 75
|
||||||
|
black 40 40 40
|
||||||
|
red 205 75 69
|
||||||
|
green 152 151 26
|
||||||
|
yellow 215 153 33
|
||||||
|
blue 69 133 136
|
||||||
|
magenta 177 98 134
|
||||||
|
cyan 104 157 106
|
||||||
|
white 213 196 161
|
||||||
|
orange 214 93 14
|
||||||
|
}
|
||||||
|
|
||||||
|
// example of how to set a theme in HEX format
|
||||||
|
gruvbox-dark {
|
||||||
|
fg "#D5C4A1"
|
||||||
|
bg "#282828"
|
||||||
|
black "#3C3836"
|
||||||
|
red "#CC241D"
|
||||||
|
green "#98971A"
|
||||||
|
yellow "#D79921"
|
||||||
|
blue "#3C8588"
|
||||||
|
magenta "#B16286"
|
||||||
|
cyan "#689D6A"
|
||||||
|
white "#FBF1C7"
|
||||||
|
orange "#D65D0E"
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,5 +1,6 @@
|
|||||||
//! Zellij program-wide constants.
|
//! Zellij program-wide constants.
|
||||||
|
|
||||||
|
use crate::input::theme::Themes;
|
||||||
use directories_next::ProjectDirs;
|
use directories_next::ProjectDirs;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::OnceCell;
|
||||||
@ -28,6 +29,19 @@ lazy_static! {
|
|||||||
pub static ref ZELLIJ_PROJ_DIR: ProjectDirs =
|
pub static ref ZELLIJ_PROJ_DIR: ProjectDirs =
|
||||||
ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap();
|
ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap();
|
||||||
pub static ref ZELLIJ_CACHE_DIR: PathBuf = ZELLIJ_PROJ_DIR.cache_dir().to_path_buf();
|
pub static ref ZELLIJ_CACHE_DIR: PathBuf = ZELLIJ_PROJ_DIR.cache_dir().to_path_buf();
|
||||||
|
pub static ref ZELLIJ_DEFAULT_THEMES: Themes = {
|
||||||
|
let mut default_themes = Themes::default();
|
||||||
|
|
||||||
|
let path = PathBuf::from(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/themes"));
|
||||||
|
match Themes::from_dir(path) {
|
||||||
|
Ok(themes) => {
|
||||||
|
default_themes = default_themes.merge(themes);
|
||||||
|
},
|
||||||
|
Err(_) => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
default_themes
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const FEATURES: &[&str] = &[
|
pub const FEATURES: &[&str] = &[
|
||||||
|
@ -1758,4 +1758,18 @@ impl Themes {
|
|||||||
let all_themes_in_file = Themes::from_kdl(kdl_themes)?;
|
let all_themes_in_file = Themes::from_kdl(kdl_themes)?;
|
||||||
Ok(all_themes_in_file)
|
Ok(all_themes_in_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn from_dir(path_to_theme_dir: PathBuf) -> Result<Self, ConfigError> {
|
||||||
|
let mut themes = Themes::default();
|
||||||
|
for entry in std::fs::read_dir(path_to_theme_dir)? {
|
||||||
|
let entry = entry?;
|
||||||
|
let path = entry.path();
|
||||||
|
if let Some(extension) = path.extension() {
|
||||||
|
if extension == "kdl" {
|
||||||
|
themes = themes.merge(Themes::from_path(path)?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(themes)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ use crate::{
|
|||||||
cli::{CliArgs, Command},
|
cli::{CliArgs, Command},
|
||||||
consts::{
|
consts::{
|
||||||
FEATURES, SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION,
|
FEATURES, SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION,
|
||||||
ZELLIJ_PROJ_DIR,
|
ZELLIJ_DEFAULT_THEMES, ZELLIJ_PROJ_DIR,
|
||||||
},
|
},
|
||||||
errors::prelude::*,
|
errors::prelude::*,
|
||||||
input::{
|
input::{
|
||||||
@ -63,6 +63,16 @@ pub fn get_default_data_dir() -> PathBuf {
|
|||||||
.unwrap_or_else(xdg_data_dir)
|
.unwrap_or_else(xdg_data_dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(test))]
|
||||||
|
fn get_default_themes() -> Themes {
|
||||||
|
ZELLIJ_DEFAULT_THEMES.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
fn get_default_themes() -> Themes {
|
||||||
|
Themes::default()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn xdg_config_dir() -> PathBuf {
|
pub fn xdg_config_dir() -> PathBuf {
|
||||||
ZELLIJ_PROJ_DIR.config_dir().to_owned()
|
ZELLIJ_PROJ_DIR.config_dir().to_owned()
|
||||||
}
|
}
|
||||||
@ -310,25 +320,13 @@ impl Setup {
|
|||||||
None => config.options.clone(),
|
None => config.options.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(theme_dir) = config_options
|
config.themes = config.themes.merge(get_default_themes());
|
||||||
.theme_dir
|
|
||||||
.clone()
|
let user_theme_dir = config_options.theme_dir.clone().or_else(|| {
|
||||||
.or_else(|| get_theme_dir(cli_args.config_dir.clone().or_else(find_default_config_dir)))
|
get_theme_dir(cli_args.config_dir.clone().or_else(find_default_config_dir))
|
||||||
{
|
});
|
||||||
if theme_dir.is_dir() {
|
if let Some(user_theme_dir) = user_theme_dir {
|
||||||
for entry in (theme_dir.read_dir()?).flatten() {
|
config.themes = config.themes.merge(Themes::from_dir(user_theme_dir)?);
|
||||||
if let Some(extension) = entry.path().extension() {
|
|
||||||
if extension == "kdl" {
|
|
||||||
match Themes::from_path(entry.path()) {
|
|
||||||
Ok(themes) => config.themes = config.themes.merge(themes),
|
|
||||||
Err(e) => {
|
|
||||||
log::error!("error loading theme file: {:?}", e);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(Command::Setup(ref setup)) = &cli_args.command {
|
if let Some(Command::Setup(ref setup)) = &cli_args.command {
|
||||||
|
Loading…
Reference in New Issue
Block a user