mirror of
https://github.com/zoriya/noctalia-shell.git
synced 2026-05-30 09:19:08 +00:00
Merge pull request #461 from Sridou/themes
Added matugen template for vicinae
This commit is contained in:
@@ -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}}"
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
@@ -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."
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": [{
|
||||
|
||||
@@ -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"]
|
||||
|
||||
Reference in New Issue
Block a user