Temas

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:

CapaFuenteContiene
1. Valores por defectoHardcodeados en config.rsIconos, colores y diseño por defecto
2. Config del usuarioconfig.jsoncmodules, info_plugins, más sobrescrituras para cualquier campo visual
3. Archivo de temathemes/<name>.jsonccolors, 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.jsonc ganaba sobre el tema. Si actualizas, tu config existente puede sobrescribir el tema. Exporta tu aspecto actual con xfetch theme export my-look, establece "theme": "my-look", y elimina los campos visuales de config.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

CampoTipoDescripción
layoutstring o nullNombre del estilo de diseño
colorsobjectMapeo de colores por módulo
palette_stylestring o nullVisualización de paleta: squares, circles, triangles, lines
show_colorsbooleanActivar o desactivar indicadores de color ANSI en línea
logo_pathstring o nullRuta a un archivo de logo
logo_colorstring o nullColor para logos ASCII (nombre, hex o RGB)
logo_colorsarray o nullColores por fila para logos ASCII (la fila i usa logo_colors[i % len])
header_iconsarray o nullIconos de cabecera del diseño Pac-Man
footer_textstring o nullTexto 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:

  1. Ruta directa — Si el valor es una ruta de archivo (contiene / o empieza con ~), se carga directamente
  2. Directorio de temas — Busca <name>.jsonc en ~/.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:

  • layout
  • colors
  • palette_style
  • header_icons
  • footer_text
  • logo_path
  • show_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 en config.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/:

TemaDiseñoEstilo
draculasectionPaleta magenta oscuro, rojo y cian
nordsectionPaleta azul frío y cian ártico
catppuccin-mochasectionPaleta pastel cálida mocha
retro-pacmanpacmanEstilo arcade clásico de Pac-Man con iconos de cabecera y texto de pie
berlindefaultSin colores y sin iconos: salida limpia solo de texto
tree-compacttreeDiseño jerárquico en árbol con esquema azul-verdoso frío
bogotabottomDiseño inferior con paleta cálida roja, magenta y blanca
helsinkilineDiseño de una sola línea con mezcla de acentos verde, azul y magenta
lahabanasectionDiseño de sección con paleta roja, magenta y blanca
londonminimalPaleta grisácea minimalista (blanco y gris)
madriddefaultDiseño predeterminado con paleta tricolor roja, verde y azul
miamisectionDiseño de sección con paleta vaporwave magenta, cian y blanca
oslocompactDiseño compacto con paleta azul, cian y blanca fría
parisboxDiseño de recuadro con paleta roja, magenta y blanca
prahasectionDiseño de sección con paleta roja y magenta, muestras de triángulo
tokiohorizontalDiseño horizontal con paleta roja, blanca y magenta
xsectionDiseñ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:

  1. Analizar config.jsonc como serde_json::Value
  2. Deserializar a Config para extraer el campo theme
  3. Si theme está establecido, cargar el archivo de tema como serde_json::Value
  4. Crear un Value vacío y fusionar en orden: defaults → config.jsonc → theme
  5. Deserializar el resultado fusionado a Config

Gestión de temas (themes/mod.rs)

  • list_themes() — Escanea ~/.config/xfetch/themes/ en busca de archivos *.jsonc
  • set_active_theme() — Lee config.jsonc, establece el campo theme, escribe de vuelta
  • remove_theme() — Elimina un archivo de tema del directorio de temas
  • export_current_theme() — Construye un archivo JSONC a partir de los campos visuales del Config actual