From 165ef4c9bce5a10600de2738335cb2feabc55149 Mon Sep 17 00:00:00 2001 From: Sridou Date: Sun, 19 Oct 2025 17:20:51 +0530 Subject: [PATCH 1/2] matugen theming for vicinae launcher do not overwrite logo if it exists --- Assets/MatugenTemplates/vicinae.toml | 140 +++++++++++++++++++++++ Assets/Translations/en.json | 4 + Bin/colors-apply.sh | 9 +- Commons/Settings.qml | 1 + Modules/Settings/Tabs/ColorSchemeTab.qml | 19 +++ Services/MatugenTemplates.qml | 8 ++ Services/ProgramCheckerService.qml | 4 +- 7 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 Assets/MatugenTemplates/vicinae.toml diff --git a/Assets/MatugenTemplates/vicinae.toml b/Assets/MatugenTemplates/vicinae.toml new file mode 100644 index 00000000..e4cc6da6 --- /dev/null +++ b/Assets/MatugenTemplates/vicinae.toml @@ -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}}" diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index cbad3dd8..35b99773 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -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." diff --git a/Bin/colors-apply.sh b/Bin/colors-apply.sh index 4c23afa1..00fe43b6 100755 --- a/Bin/colors-apply.sh +++ b/Bin/colors-apply.sh @@ -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." \ No newline at end of file +echo "✅ Command sent for $APP_NAME." diff --git a/Commons/Settings.qml b/Commons/Settings.qml index f98e3e3e..2a392176 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -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 } diff --git a/Modules/Settings/Tabs/ColorSchemeTab.qml b/Modules/Settings/Tabs/ColorSchemeTab.qml index 7cfcf595..314cc07d 100644 --- a/Modules/Settings/Tabs/ColorSchemeTab.qml +++ b/Modules/Settings/Tabs/ColorSchemeTab.qml @@ -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 diff --git a/Services/MatugenTemplates.qml b/Services/MatugenTemplates.qml index 3475e444..19066213 100644 --- a/Services/MatugenTemplates.qml +++ b/Services/MatugenTemplates.qml @@ -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": [{ diff --git a/Services/ProgramCheckerService.qml b/Services/ProgramCheckerService.qml index 790fa71a..ca06dc0c 100644 --- a/Services/ProgramCheckerService.qml +++ b/Services/ProgramCheckerService.qml @@ -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"] From 96a71d8607c25d68e6f32b521bc948111e9d6a0f Mon Sep 17 00:00:00 2001 From: Sridou Date: Mon, 20 Oct 2025 11:42:03 +0530 Subject: [PATCH 2/2] added translations for vicinae --- Assets/Translations/de.json | 4 ++++ Assets/Translations/es.json | 4 ++++ Assets/Translations/fr.json | 4 ++++ Assets/Translations/pt.json | 4 ++++ Assets/Translations/zh-CN.json | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/Assets/Translations/de.json b/Assets/Translations/de.json index a3318920..868171a8 100644 --- a/Assets/Translations/de.json +++ b/Assets/Translations/de.json @@ -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." diff --git a/Assets/Translations/es.json b/Assets/Translations/es.json index 2db6da8f..3db89e79 100644 --- a/Assets/Translations/es.json +++ b/Assets/Translations/es.json @@ -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." diff --git a/Assets/Translations/fr.json b/Assets/Translations/fr.json index 8131592a..15533f02 100644 --- a/Assets/Translations/fr.json +++ b/Assets/Translations/fr.json @@ -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." diff --git a/Assets/Translations/pt.json b/Assets/Translations/pt.json index dd3fe7f0..2e8d3e8a 100644 --- a/Assets/Translations/pt.json +++ b/Assets/Translations/pt.json @@ -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." diff --git a/Assets/Translations/zh-CN.json b/Assets/Translations/zh-CN.json index 4738030b..6a2ccb10 100644 --- a/Assets/Translations/zh-CN.json +++ b/Assets/Translations/zh-CN.json @@ -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。"