feat: Add some more themeing

This commit is contained in:
2025-04-19 17:42:27 +10:00
parent 53ca01cd68
commit ee622ed902
12 changed files with 1312 additions and 1 deletions

View File

@@ -0,0 +1,180 @@
/*
For: Btop, https://github.com/aristocratos/btop
Author: https://github.com/5hubham5ingh
Version: 0.0.1
Prerequisite: Edit the ~/.config/btop/btop.conf file to add this line-
color_theme = "WallRizz.theme"
Note: The theme only takes effect after restarting btop.
*/
function generateTheme(colors, isDark) {
const sortedColors = colors.sort((a, b) => {
const la = Color(a).getLuminance();
const lb = Color(b).getLuminance();
return isDark ? la - lb : lb - la;
});
const background = sortedColors[0];
const foreground = sortedColors[colors.length - 1];
const midIndex = Math.floor(sortedColors.length / 2);
const selection = sortedColors[midIndex];
const cursor = isDark
? sortedColors[Math.floor(midIndex / 2)]
: sortedColors[Math.floor(midIndex * 1.5)];
const black = isDark
? sortedColors[1]
: sortedColors[sortedColors.length - 2];
const white = isDark
? sortedColors[sortedColors.length - 2]
: sortedColors[1];
return Object.assign(
{
background,
foreground,
selection,
cursor,
black,
white,
},
...sortedColors.filter(
(color) =>
color !== selection ||
color !== cursor,
)
.map((color, i) => ({
[`color${i + 1}`]: adjustColorForReadability(background, color),
})),
);
}
function adjustColorForReadability(background, foreground) {
const fg = Color(foreground);
while (!Color.isReadable(background, foreground)) {
fg.brighten(1).saturate(1);
const hex = fg.toHex();
if (hex === "000000" || hex === "ffffff") {
return Color(foreground).brighten().saturate().toHexString();
}
}
return fg.toHexString();
}
function generateBtopConfig(theme) {
const config = `
# Main background
theme[main_bg]="${theme.background}"
# Main text color
theme[main_fg]="${theme.foreground}"
# Title color for boxes
theme[title]="${theme.foreground}"
# Highlight color for keyboard shortcuts
theme[hi_fg]="${theme.color1}"
# Background color of selected items
theme[selected_bg]="${theme.selection}"
# Foreground color of selected items
theme[selected_fg]="${theme.color3}"
# Color of inactive/disabled text
theme[inactive_fg]="${theme.black}"
# Color of text appearing on top of graphs
theme[graph_text]="${theme.foreground}"
# Misc colors for processes box
theme[proc_misc]="${theme.color2}"
# CPU box outline color
theme[cpu_box]="${theme.selection}"
# Memory/disks box outline color
theme[mem_box]="${theme.selection}"
# Network up/down box outline color
theme[net_box]="${theme.selection}"
# Processes box outline color
theme[proc_box]="${theme.selection}"
# Box divider lines and small box borders
theme[div_line]="${theme.selection}"
# Temperature graph colors
theme[temp_start]="${theme.color2}"
theme[temp_mid]="${theme.color3}"
theme[temp_end]="${theme.color1}"
# CPU graph colors
theme[cpu_start]="${theme.color2}"
theme[cpu_mid]="${theme.color3}"
theme[cpu_end]="${theme.color1}"
# Mem/Disk free meter
theme[free_start]="${theme.color1}"
theme[free_mid]="${theme.color3}"
theme[free_end]="${theme.color2}"
# Mem/Disk cached meter
theme[cached_start]="${theme.color6}"
theme[cached_mid]="${theme.color2}"
theme[cached_end]="${theme.color3}"
# Mem/Disk available meter
theme[available_start]="${theme.color1}"
theme[available_mid]="${theme.color3}"
theme[available_end]="${theme.color2}"
# Mem/Disk used meter
theme[used_start]="${theme.color2}"
theme[used_mid]="${theme.color3}"
theme[used_end]="${theme.color1}"
# Download graph colors
theme[download_start]="${theme.color2}"
theme[download_mid]="${theme.color6}"
theme[download_end]="${theme.color4}"
# Upload graph colors
theme[upload_start]="${theme.color3}"
theme[upload_mid]="${theme.color5}"
theme[upload_end]="${theme.color1}"
# Process box color gradient for threads, mem and cpu usage
theme[process_start]="${theme.color2}"
theme[process_mid]="${theme.color1}"
theme[process_end]="${theme.color4}"
`.trim();
return config;
}
function getDarkThemeConf(colors) {
const theme = generateTheme(colors, true);
return generateBtopConfig(theme, true);
}
function getLightThemeConf(colors) {
const theme = generateTheme(colors, false);
return generateBtopConfig(theme, false);
}
function setTheme(themeConfPath) {
const btopThemeConf = STD.open(
HOME_DIR.concat("/.config/btop/themes/WallRizz.theme"),
"w+",
);
const conf = STD.loadFile(themeConfPath);
btopThemeConf.puts(conf);
btopThemeConf.close();
}
export { getDarkThemeConf, getLightThemeConf, setTheme };