El sistema de temas separa la apariencia visual (colores, iconos, diseño) de la configuración de módulos, permitiendo cambiar el aspecto sin tocar la configuración de los módulos.
Arquitectura
Los temas operan en la capa de carga de configuración, antes de que ocurra cualquier renderizado o ejecución de plugins.
config.jsonc (theme: "berlin", modules: [...])
|
v
Cargar Config por defecto
|
v
Cargar config.jsonc del usuario
|
v
Cargar theme/<name>.jsonc
|
v
Fusión: defaults <- config.jsonc <- theme
|
v
Config final (usada por el renderizador)
Orden de fusión (el último prevalece)
Cada capa puede sobrescribir cualquier campo visual. Desde v0.2.0, el tema tiene la prioridad más alta:
| Capa | Fuente | Contiene |
|---|---|---|
| 1. Valores por defecto | Hardcodeados en config.rs | Iconos, colores y diseño por defecto |
| 2. Config del usuario | config.jsonc | modules, info_plugins, más sobrescrituras para cualquier campo visual |
| 3. Archivo de tema | themes/<name>.jsonc | colors, layout, palette_style, logo_path, logo_color, logo_colors, header_icons, footer_text, show_colors |
Un campo en el archivo de tema siempre prevalece sobre el mismo campo en config.jsonc o los valores por defecto.
Detalles de la fusión
La fusión usa deep_merge() que trabaja clave por clave:
- Objetos: se fusionan recursivamente — cada clave se resuelve independientemente
- Strings, números, booleanos: el overlay reemplaza la base
- Strings vacíos: un string vacío no sobrescribe un string no vacío (evita que los temas borren iconos accidentalmente)
- Objetos vacíos
{}: no operan — las claves existentes se conservan
Nota de actualización (v0.1.x → v0.2.0): En v0.1.x,
config.jsoncganaba sobre el tema. Si actualizas, tu config existente puede sobrescribir el tema. Exporta tu aspecto actual conxfetch theme export my-look, establece"theme": "my-look", y elimina los campos visuales deconfig.jsonc.
Formato del archivo de tema
Un archivo de tema es un documento JSONC que contiene únicamente campos visuales. No debe contener modules ni info_plugins.
{
"layout": "section",
"show_colors": true,
"palette_style": "circles",
"colors": {
"os": "Magenta",
"cpu": "Red",
"memory": "Yellow",
"disk": "Cyan",
"shell": "Green",
"wm": "Blue"
}
}
Campos admitidos
| Campo | Tipo | Descripción |
|---|---|---|
layout | string o null | Nombre del estilo de diseño |
colors | object | Mapeo de colores por módulo |
palette_style | string o null | Visualización de paleta: squares, circles, triangles, lines |
show_colors | boolean | Activar o desactivar indicadores de color ANSI en línea |
logo_path | string o null | Ruta a un archivo de logo |
logo_color | string o null | Color para logos ASCII (nombre, hex o RGB) |
logo_colors | array o null | Colores por fila para logos ASCII (la fila i usa logo_colors[i % len]) |
header_icons | array o null | Iconos de cabecera del diseño Pac-Man |
footer_text | string o null | Texto de pie del diseño Pac-Man |
Los temas no llevan icons: la elección de iconos es decisión de la fuente del usuario; el núcleo los rellena desde los valores internos predeterminados.
Resolución de temas
Cuando xfetch carga una configuración con theme: "dracula", el resolvedor busca en el siguiente orden:
- Ruta directa — Si el valor es una ruta de archivo (contiene
/o empieza con~), se carga directamente - Directorio de temas — Busca
<name>.jsoncen~/.config/xfetch/themes/
Si el tema no se encuentra, la configuración se carga tal cual sin el tema.
Comandos CLI
# Listar temas instalados
xfetch theme list
# Activar un tema (establece el campo "theme" en config.jsonc)
xfetch theme set nord
# Eliminar un archivo de tema
xfetch theme remove nord
# Exportar la configuración visual actual como archivo de tema
xfetch theme export my-theme
Comportamiento de exportación
xfetch theme export <name> captura el estado visual actual en tiempo de ejecución (después de la fusión) y lo escribe en ~/.config/xfetch/themes/<name>.jsonc. Esto permite compartir tu aspecto sin exponer tu lista de módulos.
El archivo exportado contiene únicamente:
layoutcolorspalette_styleheader_iconsfooter_textlogo_pathshow_colors
Compatibilidad hacia atrás
El sistema de temas es completamente compatible hacia atrás:
- Sin el campo
theme: Todo funciona exactamente como antes. El archivo de configuración contiene todos los campos visuales directamente. - Configs existentes: Se pueden migrar exportando:
xfetch theme export current, luego estableciendo"theme": "current"y eliminando los campos visuales de la configuración principal. - Configs de plugins: Las referencias a plugins (
info_plugins) permanecen exclusivamente enconfig.jsonc, nunca en archivos de tema.
Estructura de directorios
~/.config/xfetch/
config.jsonc # Módulos, plugins y referencia opcional a tema
themes/
dracula.jsonc # Archivos de tema: colores, diseño
nord.jsonc
catppuccin-mocha.jsonc
retro-pacman.jsonc
berlin.jsonc
tree-compact.jsonc
Temas incorporados
El repositorio oficial de temas se encuentra en github.com/xfetch-cli/themes, registrado mediante index.json con los archivos de tema en colors/:
| Tema | Diseño | Estilo |
|---|---|---|
dracula | section | Paleta magenta oscuro, rojo y cian |
nord | section | Paleta azul frío y cian ártico |
catppuccin-mocha | section | Paleta pastel cálida mocha |
retro-pacman | pacman | Estilo arcade clásico de Pac-Man con iconos de cabecera y texto de pie |
berlin | default | Sin colores y sin iconos: salida limpia solo de texto |
tree-compact | tree | Diseño jerárquico en árbol con esquema azul-verdoso frío |
bogota | bottom | Diseño inferior con paleta cálida roja, magenta y blanca |
helsinki | line | Diseño de una sola línea con mezcla de acentos verde, azul y magenta |
lahabana | section | Diseño de sección con paleta roja, magenta y blanca |
london | minimal | Paleta grisácea minimalista (blanco y gris) |
madrid | default | Diseño predeterminado con paleta tricolor roja, verde y azul |
miami | section | Diseño de sección con paleta vaporwave magenta, cian y blanca |
oslo | compact | Diseño compacto con paleta azul, cian y blanca fría |
paris | box | Diseño de recuadro con paleta roja, magenta y blanca |
praha | section | Diseño de sección con paleta roja y magenta, muestras de triángulo |
tokio | horizontal | Diseño horizontal con paleta roja, blanca y magenta |
x | section | Diseño de sección con acentos cian, magenta y blanco |
Detalles de implementación
Carga de configuración (config.rs)
La fusión usa serde_json::Value con fusión profunda antes de la deserialización:
- Analizar
config.jsonccomoserde_json::Value - Deserializar a
Configpara extraer el campotheme - Si
themeestá establecido, cargar el archivo de tema comoserde_json::Value - Crear un
Valuevacío y fusionar en orden: defaults → config.jsonc → theme - Deserializar el resultado fusionado a
Config
Gestión de temas (themes/mod.rs)
list_themes()— Escanea~/.config/xfetch/themes/en busca de archivos*.jsoncset_active_theme()— Leeconfig.jsonc, establece el campotheme, escribe de vueltaremove_theme()— Elimina un archivo de tema del directorio de temasexport_current_theme()— Construye un archivo JSONC a partir de los campos visuales del Config actual