Merge pull request #461 from Sridou/themes

Added matugen template for vicinae
This commit is contained in:
Lysec
2025-10-20 13:36:32 +02:00
committed by GitHub
12 changed files with 203 additions and 2 deletions
+140
View File
@@ -0,0 +1,140 @@
# Vicinae Matugen Theme Template
# Used LLM for initial generation, then modified to a satisfactory level
[meta]
name = "Matugen"
description = "Material You theme generated by Matugen - {{mode}} variant"
variant = "{{mode}}"
icon = "noctalia.svg"
# ============================================================================
# Core Colors
# ============================================================================
# Foundation colors that define the entire theme's personality
# Uses Material You's semantic color system for perfect harmony
[colors.core]
accent = "{{colors.primary.default.hex}}"
accent_foreground = "{{colors.on_primary.default.hex}}"
background = "{{colors.surface.default.hex}}"
foreground = "{{colors.on_surface.default.hex}}"
secondary_background = "{{colors.surface_container.default.hex}}"
border = "{{colors.outline_variant.default.hex}}"
# ============================================================================
# Window-Specific Colors
# ============================================================================
# Different borders for visual hierarchy between window types
[colors.main_window]
border = "{{colors.outline_variant.default.hex}}"
[colors.settings_window]
border = "{{colors.outline.default.hex}}"
# ============================================================================
# Accent Colors
# ============================================================================
# Complete color palette using Material You's harmonious color generation
# Maps to various UI elements throughout Vicinae
[colors.accents]
blue = "{{colors.primary.default.hex}}"
green = "{{colors.tertiary.default.hex}}"
magenta = "{{colors.secondary.default.hex}}"
orange = "{{colors.error.default.hex}}"
red = "{{colors.error.default.hex}}"
yellow = "{{colors.tertiary.default.hex}}"
cyan = "{{colors.primary.default.hex}}"
purple = "{{colors.secondary.default.hex}}"
# ============================================================================
# Text Colors
# ============================================================================
# Semantic text colors for all states and contexts
[colors.text]
default = "{{colors.on_surface.default.hex}}"
muted = "{{colors.on_surface_variant.default.hex}}"
danger = "{{colors.error.default.hex}}"
success = "{{colors.tertiary.default.hex}}"
placeholder = "{{colors.on_surface_variant.default.hex}}"
[colors.text.selection]
background = "{{colors.primary.default.hex}}"
foreground = "{{colors.on_primary.default.hex}}"
[colors.text.links]
default = "{{colors.primary.default.hex}}"
visited = "{{colors.secondary.default.hex}}"
# ============================================================================
# Input Fields
# ============================================================================
# Text inputs, search boxes with proper focus states
[colors.input]
border = "{{colors.outline.default.hex}}"
border_focus = "{{colors.primary.default.hex}}"
border_error = "{{colors.error.default.hex}}"
# ============================================================================
# Buttons
# ============================================================================
# All button states with subtle hover effects and focus indicators
[colors.button.primary]
background = "{{colors.surface_container_high.default.hex}}"
foreground = "{{colors.on_surface.default.hex}}"
[colors.button.primary.hover]
background = { name = "{{colors.surface_container_highest.default.hex}}", opacity = 0.85 }
[colors.button.primary.focus]
outline = "colors.core.accent"
# ============================================================================
# Lists
# ============================================================================
# Horizontal list views with elevation-based selection
[colors.list.item.hover]
background = { name = "{{colors.surface_container_high.default.hex}}", opacity = 0.7 }
foreground = "{{colors.on_surface.default.hex}}"
[colors.list.item.selection]
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.5 }
foreground = "{{colors.on_primary_container.default.hex}}"
secondary_background = "{{colors.primary_container.default.hex}}"
secondary_foreground = "{{colors.on_primary_container.default.hex}}"
# ============================================================================
# Grid Items
# ============================================================================
# Grid layouts (icon grids, tiles) with outline-based selection
[colors.grid.item]
background = "{{colors.surface_container.default.hex}}"
[colors.grid.item.hover]
outline = { name = "{{colors.primary.default.hex}}", opacity = 0.6 }
[colors.grid.item.selection]
outline = { name = "{{colors.primary.default.hex}}", opacity = 0.9 }
# ============================================================================
# Scrollbars
# ============================================================================
# Subtle scrollbar styling
[colors.scrollbars]
background = { name = "{{colors.on_surface.default.hex}}", opacity = 0.2 }
# ============================================================================
# Loading Indicators
# ============================================================================
# Progress bars and spinners for loading states
[colors.loading]
bar = "{{colors.primary.default.hex}}"
spinner = "{{colors.primary.default.hex}}"
+4
View File
@@ -569,6 +569,10 @@
"description": "Schreibt {filepath} und lädt neu",
"description-missing": "Erfordert fuzzel Starter"
},
"vicinae": {
"description": "Schreibt {filepath} und lädt neu",
"description-missing": "Erfordert {app} Starter"
},
"discord": {
"description": "Schreibt {filepath} für {client}",
"description-missing": "Kein Discord-Client erkannt. Installieren Sie vencord, vesktop, webcord, armcord, equibop, lightcord oder dorion."
+4
View File
@@ -573,6 +573,10 @@
"description": "Write {filepath} and reload",
"description-missing": "Requires {app} to be installed"
},
"vicinae": {
"description": "Write {filepath} and reload",
"description-missing": "Requires {app} to be installed"
},
"discord": {
"description": "Write {filepath} for {client}",
"description-missing": "No Discord client detected. Install vencord, vesktop, webcord, armcord, equibop, lightcord, or dorion."
+4
View File
@@ -562,6 +562,10 @@
"description": "Escribir {filepath} y recargar",
"description-missing": "Requiere que {app} esté instalado"
},
"vicinae": {
"description": "Escribir {filepath} y recargar",
"description-missing": "Requiere que {app} esté instalado"
},
"discord": {
"description": "Escribir {filepath} para {client}",
"description-missing": "No se detectó cliente de Discord. Instala vencord, vesktop, webcord, armcord, equibop, lightcord o dorion."
+4
View File
@@ -562,6 +562,10 @@
"description": "Écrire ~/.config/fuzzel/themes/noctalia et recharger",
"description-missing": "Nécessite que le lanceur fuzzel soit installé"
},
"vicinae": {
"description": "Écrire {filepath} et recharger",
"description-missing": "Nécessite que le lanceur {app} soit installé"
},
"discord": {
"description": "Écrire {filepath} pour {client}",
"description-missing": "Aucun client Discord détecté. Installez vencord, vesktop, webcord, armcord, equibop, lightcord ou dorion."
+4
View File
@@ -524,6 +524,10 @@
"description": "Escrever {filepath} e recarregar",
"description-missing": "Requer que o {app} esteja instalado"
},
"vicinae": {
"description": "Escrever {filepath} e recarregar",
"description-missing": "Requer que o {app} esteja instalado"
},
"discord": {
"description": "Escrever {filepath} para {client}",
"description-missing": "Nenhum cliente Discord detectado. Instale vencord, vesktop, webcord, armcord, equibop, lightcord ou dorion."
+4
View File
@@ -562,6 +562,10 @@
"description": "写入 {filepath} 并重新加载",
"description-missing": "需要安装 {app}"
},
"vicinae": {
"description": "写入 {filepath} 并重新加载",
"description-missing": "需要安装 {app}"
},
"discord": {
"description": "为 {client} 写入 {filepath}",
"description-missing": "未检测到 Discord 客户端。请安装 vencord、vesktop、webcord、armcord、equibop、lightcord 或 dorion。"
+8 -1
View File
@@ -72,6 +72,13 @@ case "$APP_NAME" in
fi
;;
vicinae)
echo "🎨 Applying 'matugen' theme to vicinae..."
# Apply the theme
vicinae theme set matugen
;;
pywalfox)
echo "🎨 Updating pywalfox themes..."
pywalfox update
@@ -84,4 +91,4 @@ case "$APP_NAME" in
;;
esac
echo "✅ Command sent for $APP_NAME."
echo "✅ Command sent for $APP_NAME."
+1
View File
@@ -381,6 +381,7 @@ Singleton {
property bool discord_lightcord: false
property bool discord_dorion: false
property bool pywalfox: false
property bool vicinae: false
property bool enableUserTemplates: false
}
+19
View File
@@ -664,6 +664,25 @@ ColumnLayout {
}
}
}
NCheckbox {
label: "Vicinae"
description: ProgramCheckerService.vicinaeAvailable
? I18n.tr("settings.color-scheme.templates.programs.vicinae.description", {
"filepath": "~/.local/share/vicinae/themes/matugen.toml"
})
: I18n.tr("settings.color-scheme.templates.programs.vicinae.description-missing", {
"app": "vicinae"
})
checked: Settings.data.templates.vicinae
enabled: ProgramCheckerService.vicinaeAvailable
opacity: ProgramCheckerService.vicinaeAvailable ? 1.0 : 0.6
onToggled: checked => {
if (ProgramCheckerService.vicinaeAvailable) {
Settings.data.templates.vicinae = checked
AppThemeService.generate()
}
}
}
}
// Miscellaneous
+8
View File
@@ -151,6 +151,14 @@ Singleton {
}],
"input": "fuzzel.conf",
"postHook": AppThemeService.colorsApplyScript + " fuzzel"
}, {
"name": "vicinae",
"templates": [{
"version": "vicinae",
"output": "~/.local/share/vicinae/themes/matugen.toml"
}],
"input": "vicinae.toml",
"postHook": "cp -n " + Quickshell.shellDir + "/Assets/noctalia.svg ~/.local/share/vicinae/themes/noctalia.svg && " + AppThemeService.colorsApplyScript + " vicinae"
}, {
"name": "pywalfox",
"templates": [{
+3 -1
View File
@@ -16,6 +16,7 @@ Singleton {
property bool ghosttyAvailable: false
property bool footAvailable: false
property bool fuzzelAvailable: false
property bool vicinaeAvailable: false
property bool gpuScreenRecorderAvailable: false
property bool wlsunsetAvailable: false
property bool app2unitAvailable: false
@@ -96,7 +97,8 @@ Singleton {
"kittyAvailable": ["which", "kitty"],
"ghosttyAvailable": ["which", "ghostty"],
"footAvailable": ["which", "foot"],
"fuzzelAvailable": ["which", "fuzzel"],
"fuzzelAvailable": ["which", "fuzzel"],
"vicinaeAvailable": ["which", "vicinae"],
"app2unitAvailable": ["which", "app2unit"],
"gpuScreenRecorderAvailable": ["sh", "-c", "command -v gpu-screen-recorder >/dev/null 2>&1 || (command -v flatpak >/dev/null 2>&1 && flatpak list --app | grep -q 'com.dec05eba.gpu_screen_recorder')"],
"wlsunsetAvailable": ["which", "wlsunset"]