@vasakgroup/plugin-config-manager
Plugin de Tauri para persistir la configuración de Vasak, leerla desde el frontend y reaccionar a cambios externos del archivo.
Pensado para npm, con una API limpia para Vue 3 + Pinia y una superficie mínima para consumirlo también sin store.
Lo que resuelve
| Capacidad | Qué hace |
|---|---|
| Persistencia | Guarda y lee configuración sin lógica duplicada en el frontend. |
| Sincronización | Emite eventos cuando el archivo cambia externamente. |
| Compatibilidad | Mantiene soporte con configs previas gracias a defaults y campos opcionales. |
| Integración visual | Sincroniza tema y esquema cuando el entorno lo permite. |
Instalación
Frontend
O con Bun:
Backend Tauri
En tu proyecto Rust agrega el plugin y registra la inicialización:
[]
= { = "https://github.com/Vasak-OS/tauri-plugin-config-manager" }
Uso rápido
El flujo típico es simple: el frontend invoca el plugin, el plugin persiste la configuración y emite config-changed cuando detecta cambios externos.
Con el store incluido
import { onMounted } from "vue";
import { listen } from "@tauri-apps/api/event";
import { useConfigStore } from "@vasakgroup/plugin-config-manager";
const configStore = useConfigStore();
let unlistenConfig: null | (() => void) = null;
onMounted(async () => {
await configStore.loadConfig();
unlistenConfig = await listen("config-changed", async () => {
await configStore.loadConfig();
});
});
Sin el store
import {
readConfig,
writeConfig,
setDarkMode,
getSchemes,
getSchemeById,
} from "@vasakgroup/plugin-config-manager";
const config = await readConfig();
await writeConfig({
style: {
darkmode: true,
"color-scheme": "vasak-default",
radius: 8,
},
desktop: {
wallpaper: [],
iconsize: 48,
showfiles: true,
showhiddenfiles: false,
},
fonts: {
termina: "JetBrains Mono",
title: "Inter",
apps: "Noto Sans",
},
});
API pública
readConfig(): Promise<VSKConfig | null>
Lee el archivo de configuración y lo parsea como JSON.
writeConfig(value: VSKConfig): Promise<void>
Guarda la configuración completa.
setDarkMode(darkmode: boolean): Promise<void>
Actualiza el modo oscuro en la configuración y, cuando corresponde, intenta sincronizar el tema del sistema.
getSchemes(): Promise<Scheme[]>
Lista todos los esquemas disponibles.
getSchemeById(schemeId: string): Promise<Scheme | null>
Busca un esquema por ID.
useConfigStore()
Store de Pinia que carga la configuración y aplica las variables visuales del tema.
Ejemplo de integración
<script lang="ts" setup>
import { onMounted, onUnmounted } from "vue";
import { listen } from "@tauri-apps/api/event";
import { useConfigStore } from "@vasakgroup/plugin-config-manager";
const configStore = useConfigStore();
let unlistenConfig: null | (() => void) = null;
onMounted(async () => {
await configStore.loadConfig();
unlistenConfig = await listen("config-changed", async () => {
await configStore.loadConfig();
});
});
onUnmounted(() => {
unlistenConfig?.();
});
</script>
Esquema de configuración
export type VSKConfig = {
style: {
darkmode: boolean;
"color-scheme": string;
radius: number;
};
desktop: {
wallpaper: string[];
iconsize: number;
showfiles: boolean;
showhiddenfiles: boolean;
};
fonts: {
termina: string;
title: string;
apps: string;
};
};
Ejemplo completo:
Compatibilidad y runtime
- Linux es la plataforma principal soportada.
setDarkModedetecta el backend desktop usandoXDG_CURRENT_DESKTOPyDESKTOP_SESSION.- La sincronización del tema del sistema solo se intenta en GNOME.
- Si
gsettingsno está disponible, la persistencia de configuración sigue funcionando. - La ruta del archivo de configuración puede sobrescribirse con
VASAK_CONFIG_PATH. - La búsqueda de schemes puede sobrescribirse con
VASAK_SCHEMES_PATHS.
Prioridad de búsqueda de schemes:
- Orden definido en
VASAK_SCHEMES_PATHSsi existe. - Orden por defecto:
~/.config/vasak/schemesy luego/usr/share/vasak-schemes.
Feature Flags
El crate Rust expone la feature system-theme-sync.
system-theme-synchabilitada por defecto.- Deshabilítala si no quieres sincronizar el tema del sistema.
[]
= { = "https://github.com/Vasak-OS/tauri-plugin-config-manager", = false }
Recomendado para apps Vasak
[]
= { = "https://github.com/Vasak-OS/tauri-plugin-config-manager" }
Si no necesitas sincronización con GNOME/gsettings, desactiva la feature por defecto:
[]
= { = "https://github.com/Vasak-OS/tauri-plugin-config-manager", = false }
Eventos
El plugin emite el evento config-changed cuando el archivo de configuración se actualiza.
Estado de la configuración
La estructura actual soporta:
style: color scheme, dark mode y radius.desktop: wallpaper, icon size y visibilidad de archivos.fonts: fuentes para terminal, títulos y apps.
Las claves fonts.termina, fonts.title y fonts.apps se serializan como strings y se mantienen compatibles con configuraciones previas.
Buenas prácticas de consumo
- Carga la configuración una vez al arrancar la app.
- Escucha
config-changedsi otro proceso puede modificar el archivo. - Usa
writeConfigpara persistir cambios del usuario. - Usa
setDarkModesolo cuando quieras sincronizar también el estado visual del sistema.
Licencia
LGPL-3.0-or-later