This commit is contained in:
Lysec
2026-01-18 16:24:57 +01:00
parent 385b2d57f2
commit 1410269dfd
52 changed files with 51 additions and 67 deletions
@@ -1,4 +1,4 @@
;;; noctalia-theme.el --- Theme using Matugen SCSS variables ;;; noctalia-theme.el --- Theme using Template SCSS variables
;; Copyright (C) 2025 ;; Copyright (C) 2025
@@ -9,7 +9,7 @@
;;; Commentary: ;;; Commentary:
;; A theme using Matugen SCSS variables with quality of life improvements: ;; A theme using Template SCSS variables with quality of life improvements:
;; - Better source block distinction ;; - Better source block distinction
;; - Improved text visibility when selected ;; - Improved text visibility when selected
;; - Refined org-mode styling with hidden asterisks ;; - Refined org-mode styling with hidden asterisks
@@ -18,7 +18,7 @@
;;; Code: ;;; Code:
(deftheme noctalia "Theme using Matugen variables with quality of life improvements.") (deftheme noctalia "Theme using Template variables with quality of life improvements.")
;; Define all the color variables (replaced by template processor) ;; Define all the color variables (replaced by template processor)
(let* ((bg "{{colors.background.default.hex}}") (let* ((bg "{{colors.background.default.hex}}")
@@ -1,5 +1,5 @@
# Fuzzel Colors # Fuzzel Colors
# Generated with Matugen # Generated with Template Processor
[colors] [colors]
background={{colors.background.default.hex_stripped}}CC background={{colors.background.default.hex_stripped}}CC
@@ -1,6 +1,6 @@
/* /*
* GTK Colors * GTK Colors
* Generated with Matugen * Generated with Template Processor
*/ */
@define-color accent_color {{colors.primary.default.hex}}; @define-color accent_color {{colors.primary.default.hex}};
@@ -113,14 +113,14 @@ hint = "hint"
"diagnostic.unnecessary" = { modifiers = ["dim"] } "diagnostic.unnecessary" = { modifiers = ["dim"] }
[palette] [palette]
# Constants to be used in syntax highlighting, not meant for matugen. # Constants to be used in syntax highlighting, not meant for template processor.
warning = "#f9e2af" warning = "#f9e2af"
info = "#89dceb" info = "#89dceb"
hint = "#94e2d5" hint = "#94e2d5"
plus = "#a6e3a1" plus = "#a6e3a1"
delta = "#89b4fa" delta = "#89b4fa"
# Matugen colors # Template colors
primary = "{{colors.primary.default.hex}}" primary = "{{colors.primary.default.hex}}"
surfaceTint = "{{colors.primary.default.hex}}" surfaceTint = "{{colors.primary.default.hex}}"
onPrimary = "{{colors.on_primary.default.hex}}" onPrimary = "{{colors.on_primary.default.hex}}"
@@ -2,7 +2,7 @@
contrast=4 contrast=4
[General] [General]
ColorScheme=Matugen ColorScheme=Noctalia
Name=noctalia Name=noctalia
[ColorEffects:Disabled] [ColorEffects:Disabled]
@@ -1,5 +1,5 @@
// Material You theme for Telegram Desktop // Material You theme for Telegram Desktop
// Generated by matugen // Generated by Template Processor
COLOR_GRAY: {{colors.outline.default.hex}}; COLOR_GRAY: {{colors.outline.default.hex}};
COLOR_DARK: {{colors.surface_variant.default.hex}}; COLOR_DARK: {{colors.surface_variant.default.hex}};
+1 -3
View File
@@ -381,13 +381,11 @@
"schedulingMode": "off", "schedulingMode": "off",
"manualSunrise": "06:30", "manualSunrise": "06:30",
"manualSunset": "18:30", "manualSunset": "18:30",
"matugenSchemeType": "scheme-fruit-salad",
"generationBackend": "matugen",
"internalThemerMode": "material" "internalThemerMode": "material"
}, },
"templates": { "templates": {
"activeTemplates": [], "activeTemplates": [],
"enableUserTemplates": false "enableUserTheming": false
}, },
"nightLight": { "nightLight": {
"enabled": false, "enabled": false,
-3
View File
@@ -24,9 +24,6 @@ Noctalia Shell is made possible by the incredible work of many open-source proje
- **[gpu-screen-recorder](https://git.dec05eba.com/gpu-screen-recorder/about/)** - Hardware-accelerated screen recording - **[gpu-screen-recorder](https://git.dec05eba.com/gpu-screen-recorder/about/)** - Hardware-accelerated screen recording
- **[Cava](https://github.com/karlstav/cava)** - Audio visualizer component - **[Cava](https://github.com/karlstav/cava)** - Audio visualizer component
### Theming & Appearance
- **[Matugen](https://github.com/InioX/matugen)** - Material You color scheme generation from wallpapers
### Utilities ### Utilities
- **[cliphist](https://github.com/sentriz/cliphist)** - Clipboard history support - **[cliphist](https://github.com/sentriz/cliphist)** - Clipboard history support
+1 -2
View File
@@ -602,7 +602,6 @@ Singleton {
property string schedulingMode: "off" property string schedulingMode: "off"
property string manualSunrise: "06:30" property string manualSunrise: "06:30"
property string manualSunset: "18:30" property string manualSunset: "18:30"
property string generationBackend: "internal"
property string internalThemerMode: "material" property string internalThemerMode: "material"
} }
@@ -610,7 +609,7 @@ Singleton {
property JsonObject templates: JsonObject { property JsonObject templates: JsonObject {
property list<var> activeTemplates: [] property list<var> activeTemplates: []
// Format: [{ "id": "gtk", "enabled": true }, { "id": "qt", "enabled": true }, ...] // Format: [{ "id": "gtk", "enabled": true }, { "id": "qt", "enabled": true }, ...]
property bool enableUserTemplates: false property bool enableUserTheming: false
} }
// night light // night light
@@ -1457,6 +1457,9 @@ def main() -> int:
return 1 return 1
# Initialize result dictionary
result: dict[str, dict[str, str]] = {}
# Check if input is a JSON palette (Predefined Scheme bypass) # Check if input is a JSON palette (Predefined Scheme bypass)
if args.image.suffix.lower() == '.json': if args.image.suffix.lower() == '.json':
try: try:
@@ -1478,8 +1481,6 @@ def main() -> int:
# Best effort fallback # Best effort fallback
flat_colors[k] = str(v) flat_colors[k] = str(v)
# Pre-populate result (bypass extraction)
result = {}
# Assign to both/all modes since predefined scheme usually provides the correct palette for the requested mode # Assign to both/all modes since predefined scheme usually provides the correct palette for the requested mode
result["dark"] = flat_colors result["dark"] = flat_colors
result["light"] = flat_colors result["light"] = flat_colors
@@ -1531,7 +1532,6 @@ def main() -> int:
arg_light = True arg_light = True
arg_both = False arg_both = False
result: dict[str, dict[str, str]] = {}
if palette: if palette:
if arg_dark: if arg_dark:
+3 -3
View File
@@ -19,9 +19,9 @@ Singleton {
property string cacheFile: Settings.cacheDir + "calendar.json" property string cacheFile: Settings.cacheDir + "calendar.json"
// Python scripts // Python scripts
readonly property string checkCalendarAvailableScript: Quickshell.shellDir + '/Bin/calendar/check-calendar.py' readonly property string checkCalendarAvailableScript: Quickshell.shellDir + '/Scripts/calendar/check-calendar.py'
readonly property string listCalendarsScript: Quickshell.shellDir + '/Bin/calendar/list-calendars.py' readonly property string listCalendarsScript: Quickshell.shellDir + '/Scripts/calendar/list-calendars.py'
readonly property string calendarEventsScript: Quickshell.shellDir + '/Bin/calendar/calendar-events.py' readonly property string calendarEventsScript: Quickshell.shellDir + '/Scripts/calendar/calendar-events.py'
// Cache file handling // Cache file handling
FileView { FileView {
+1 -1
View File
@@ -540,7 +540,7 @@ Singleton {
_pauseDiscoveryFor(totalPauseMs); _pauseDiscoveryFor(totalPauseMs);
// Prefer external dev script for pairing/connecting; executed detached // Prefer external dev script for pairing/connecting; executed detached
const scriptPath = Quickshell.shellDir + "/Bin/network/bluetooth-connect.sh"; const scriptPath = Quickshell.shellDir + "/Scripts/network/bluetooth-connect.sh";
// Use bash explicitly to avoid relying on executable bit in all environments // Use bash explicitly to avoid relying on executable bit in all environments
btExec(["bash", scriptPath, String(addr), String(pairWait), String(attempts), String(intervalSec)]); btExec(["bash", scriptPath, String(addr), String(pairWait), String(attempts), String(intervalSec)]);
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import qs.Services.UI
Singleton { Singleton {
id: root id: root
readonly property string colorsApplyScript: Quickshell.shellDir + '/Bin/colors-apply.sh' readonly property string colorsApplyScript: Quickshell.shellDir + '/Scripts/theming/template-apply.sh'
Connections { Connections {
target: WallpaperService target: WallpaperService
+28 -38
View File
@@ -59,12 +59,8 @@ Singleton {
return; return;
const wp = wallpaperPath.replace(/'/g, "'\\''"); const wp = wallpaperPath.replace(/'/g, "'\\''");
// Always use internal backend (colors.py) const script = buildGenerationScript(content, wp, mode);
let backend = "internal";
const script = buildGenerationScript(content, wp, mode, backend);
generateProcess.generator = backend;
generateProcess.command = ["sh", "-lc", script]; generateProcess.command = ["sh", "-lc", script];
generateProcess.running = true; generateProcess.running = true;
} }
@@ -145,10 +141,10 @@ Singleton {
var mode = Settings.data.colorSchemes.darkMode ? "dark" : "light"; var mode = Settings.data.colorSchemes.darkMode ? "dark" : "light";
if (Settings.data.colorSchemes.useWallpaperColors) { if (Settings.data.colorSchemes.useWallpaperColors) {
addWallpaperTemplates(lines, mode); addWallpaperTheming(lines, mode);
} }
addApplicationTemplates(lines, mode); addApplicationTheming(lines, mode);
if (lines.length > 0) { if (lines.length > 0) {
return ["[config]"].concat(lines).join("\n") + "\n"; return ["[config]"].concat(lines).join("\n") + "\n";
@@ -156,18 +152,18 @@ Singleton {
return ""; return "";
} }
function addWallpaperTemplates(lines, mode) { function addWallpaperTheming(lines, mode) {
const homeDir = Quickshell.env("HOME"); const homeDir = Quickshell.env("HOME");
// Noctalia colors JSON // Noctalia colors JSON
lines.push("[templates.noctalia]"); lines.push("[templates.noctalia]");
lines.push('input_path = "' + Quickshell.shellDir + '/Assets/Theming/noctalia.json"'); lines.push('input_path = "' + Quickshell.shellDir + '/Assets/Templates/noctalia.json"');
lines.push('output_path = "' + Settings.configDir + 'colors.json"'); lines.push('output_path = "' + Settings.configDir + 'colors.json"');
// Terminal templates // Terminal templates
TemplateRegistry.terminals.forEach(terminal => { TemplateRegistry.terminals.forEach(terminal => {
if (isTemplateEnabled(terminal.id)) { if (isTemplateEnabled(terminal.id)) {
lines.push(`\n[templates.${terminal.id}]`); lines.push(`\n[templates.${terminal.id}]`);
lines.push(`input_path = "${Quickshell.shellDir}/Assets/Theming/${terminal.templatePath}"`); lines.push(`input_path = "${Quickshell.shellDir}/Assets/Templates/${terminal.templatePath}"`);
const outputPath = terminal.outputPath.replace("~", homeDir); const outputPath = terminal.outputPath.replace("~", homeDir);
lines.push(`output_path = "${outputPath}"`); lines.push(`output_path = "${outputPath}"`);
const postHook = terminal.postHook || `${TemplateRegistry.colorsApplyScript} ${terminal.id}`; const postHook = terminal.postHook || `${TemplateRegistry.colorsApplyScript} ${terminal.id}`;
@@ -177,7 +173,7 @@ Singleton {
}); });
} }
function addApplicationTemplates(lines, mode) { function addApplicationTheming(lines, mode) {
const homeDir = Quickshell.env("HOME"); const homeDir = Quickshell.env("HOME");
TemplateRegistry.applications.forEach(app => { TemplateRegistry.applications.forEach(app => {
if (app.id === "discord") { if (app.id === "discord") {
@@ -187,7 +183,7 @@ Singleton {
// Check if this specific client is detected // Check if this specific client is detected
if (isDiscordClientEnabled(client.name)) { if (isDiscordClientEnabled(client.name)) {
lines.push(`\n[templates.discord_${client.name}]`); lines.push(`\n[templates.discord_${client.name}]`);
lines.push(`input_path = "${Quickshell.shellDir}/Assets/Theming/${app.input}"`); lines.push(`input_path = "${Quickshell.shellDir}/Assets/Templates/${app.input}"`);
const outputPath = client.path.replace("~", homeDir) + "/themes/noctalia.theme.css"; const outputPath = client.path.replace("~", homeDir) + "/themes/noctalia.theme.css";
lines.push(`output_path = "${outputPath}"`); lines.push(`output_path = "${outputPath}"`);
} }
@@ -200,7 +196,7 @@ Singleton {
// Check if this specific client is detected // Check if this specific client is detected
if (isCodeClientEnabled(client.name)) { if (isCodeClientEnabled(client.name)) {
lines.push(`\n[templates.code_${client.name}]`); lines.push(`\n[templates.code_${client.name}]`);
lines.push(`input_path = "${Quickshell.shellDir}/Assets/Theming/${app.input}"`); lines.push(`input_path = "${Quickshell.shellDir}/Assets/Templates/${app.input}"`);
const expandedPath = client.path.replace("~", homeDir); const expandedPath = client.path.replace("~", homeDir);
lines.push(`output_path = "${expandedPath}"`); lines.push(`output_path = "${expandedPath}"`);
} }
@@ -216,7 +212,7 @@ Singleton {
const doomDir = doomPath.substring(0, doomPath.lastIndexOf('/')); const doomDir = doomPath.substring(0, doomPath.lastIndexOf('/'));
lines.push(`\n[templates.emacs]`); lines.push(`\n[templates.emacs]`);
lines.push(`input_path = "${Quickshell.shellDir}/Assets/Theming/${app.input}"`); lines.push(`input_path = "${Quickshell.shellDir}/Assets/Templates/${app.input}"`);
lines.push(`output_path = "${standardPath}"`); lines.push(`output_path = "${standardPath}"`);
// Move to doom if doom exists, then remove empty .emacs.d/themes and .emacs.d directories // Move to doom if doom exists, then remove empty .emacs.d/themes and .emacs.d directories
// Check directories are empty before removing // Check directories are empty before removing
@@ -230,7 +226,7 @@ Singleton {
app.outputs.forEach((output, idx) => { app.outputs.forEach((output, idx) => {
lines.push(`\n[templates.${app.id}_${idx}]`); lines.push(`\n[templates.${app.id}_${idx}]`);
const inputFile = output.input || app.input; const inputFile = output.input || app.input;
lines.push(`input_path = "${Quickshell.shellDir}/Assets/Theming/${inputFile}"`); lines.push(`input_path = "${Quickshell.shellDir}/Assets/Templates/${inputFile}"`);
const outputPath = output.path.replace("~", homeDir); const outputPath = output.path.replace("~", homeDir);
lines.push(`output_path = "${outputPath}"`); lines.push(`output_path = "${outputPath}"`);
if (app.postProcess) { if (app.postProcess) {
@@ -263,7 +259,7 @@ Singleton {
return false; return false;
} }
function buildGenerationScript(content, wallpaper, mode, backend) { function buildGenerationScript(content, wallpaper, mode) {
const delimiter = "THEME_CONFIG_EOF_" + Math.random().toString(36).substr(2, 9); const delimiter = "THEME_CONFIG_EOF_" + Math.random().toString(36).substr(2, 9);
const pathEsc = dynamicConfigPath.replace(/'/g, "'\\''"); const pathEsc = dynamicConfigPath.replace(/'/g, "'\\''");
const wpDelimiter = "WALLPAPER_PATH_EOF_" + Math.random().toString(36).substr(2, 9); const wpDelimiter = "WALLPAPER_PATH_EOF_" + Math.random().toString(36).substr(2, 9);
@@ -272,13 +268,13 @@ Singleton {
let script = `cat > '${pathEsc}' << '${delimiter}'\n${content}\n${delimiter}\n`; let script = `cat > '${pathEsc}' << '${delimiter}'\n${content}\n${delimiter}\n`;
script += `NOCTALIA_WP_PATH=$(cat << '${wpDelimiter}'\n${wallpaper}\n${wpDelimiter}\n)\n`; script += `NOCTALIA_WP_PATH=$(cat << '${wpDelimiter}'\n${wallpaper}\n${wpDelimiter}\n)\n`;
// Use colors.py (Python implementation) // Use template-processor.py (Python implementation)
const scriptPath = Quickshell.shellDir + "/Bin/theming/template-processor.py"; const scriptPath = Quickshell.shellDir + "/Scripts/theming/template-processor.py";
const styleFlag = (Settings.data.colorSchemes.internalThemerMode === "normal") ? "--normal" : "--material"; const styleFlag = (Settings.data.colorSchemes.internalThemerMode === "normal") ? "--normal" : "--material";
// We pass --type for compatibility but it is ignored by internal logic unless needed // We pass --type for compatibility but it is ignored by internal logic unless needed
script += `python3 "${scriptPath}" "$NOCTALIA_WP_PATH" ${styleFlag} --config '${pathEsc}' --mode ${mode} `; script += `python3 "${scriptPath}" "$NOCTALIA_WP_PATH" ${styleFlag} --config '${pathEsc}' --mode ${mode} `;
script += buildUserTemplateCommand("$NOCTALIA_WP_PATH", mode, backend); script += buildUserTemplateCommand("$NOCTALIA_WP_PATH", mode);
return script + "\n"; return script + "\n";
} }
@@ -294,7 +290,7 @@ Singleton {
if (!isDiscordClientEnabled(client.name)) if (!isDiscordClientEnabled(client.name))
return; return;
const templatePath = `${Quickshell.shellDir}/Assets/Theming/${discordApp.input}`; const templatePath = `${Quickshell.shellDir}/Assets/Templates/${discordApp.input}`;
const outputPath = `${client.path}/themes/noctalia.theme.css`.replace("~", homeDir); const outputPath = `${client.path}/themes/noctalia.theme.css`.replace("~", homeDir);
const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/')); const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/'));
const baseConfigDir = outputDir.replace("/themes", ""); const baseConfigDir = outputDir.replace("/themes", "");
@@ -324,7 +320,7 @@ Singleton {
if (!isCodeClientEnabled(client.name)) if (!isCodeClientEnabled(client.name))
return; return;
const templatePath = `${Quickshell.shellDir}/Assets/Theming/${codeApp.input}`; const templatePath = `${Quickshell.shellDir}/Assets/Templates/${codeApp.input}`;
const outputPath = client.path.replace("~", homeDir); const outputPath = client.path.replace("~", homeDir);
const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/')); const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/'));
@@ -369,7 +365,7 @@ Singleton {
const doomConfigDir = doomDir.substring(0, doomDir.lastIndexOf('/')); const doomConfigDir = doomDir.substring(0, doomDir.lastIndexOf('/'));
const standardPath = app.outputs[1].path.replace("~", homeDir); const standardPath = app.outputs[1].path.replace("~", homeDir);
const standardDir = standardPath.substring(0, standardPath.lastIndexOf('/')); const standardDir = standardPath.substring(0, standardPath.lastIndexOf('/'));
const templatePath = `${Quickshell.shellDir}/Assets/Theming/${app.input}`; const templatePath = `${Quickshell.shellDir}/Assets/Templates/${app.input}`;
let script = ""; let script = "";
script += `if [ -d "${doomConfigDir}" ]; then\n`; script += `if [ -d "${doomConfigDir}" ]; then\n`;
@@ -389,13 +385,13 @@ Singleton {
}); });
} else { } else {
app.outputs.forEach((output, idx) => { app.outputs.forEach((output, idx) => {
const templatePath = `${Quickshell.shellDir}/Assets/Theming/${app.input}`; const templatePath = `${Quickshell.shellDir}/Assets/Templates/${app.input}`;
const outputPath = output.path.replace("~", homeDir); const outputPath = output.path.replace("~", homeDir);
const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/')); const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/'));
let script = ""; let script = "";
script += `mkdir -p ${outputDir}\n`; script += `mkdir -p ${outputDir}\n`;
const templateFile = output.input ? `${Quickshell.shellDir}/Assets/Theming/${output.input}` : templatePath; const templateFile = output.input ? `${Quickshell.shellDir}/Assets/Templates/${output.input}` : templatePath;
script += `cp '${templateFile}' '${outputPath}'\n`; script += `cp '${templateFile}' '${outputPath}'\n`;
script += replaceColorsInFile(outputPath, palette); script += replaceColorsInFile(outputPath, palette);
if (hasDualModePatterns && darkPalette && lightPalette) { if (hasDualModePatterns && darkPalette && lightPalette) {
@@ -555,8 +551,8 @@ Singleton {
// ================================================================================ // ================================================================================
// USER TEMPLATES, advanced usage // USER TEMPLATES, advanced usage
// ================================================================================ // ================================================================================
function buildUserTemplateCommand(input, mode, backend) { function buildUserTemplateCommand(input, mode) {
if (!Settings.data.templates.enableUserTemplates) if (!Settings.data.templates.enableUserTheming)
return ""; return "";
const userConfigPath = getUserConfigPath(); const userConfigPath = getUserConfigPath();
@@ -566,22 +562,16 @@ Singleton {
// Otherwise, use single quotes for safety with file paths // Otherwise, use single quotes for safety with file paths
const inputQuoted = input.startsWith("$") ? `"${input}"` : `'${input.replace(/'/g, "'\\''")}'`; const inputQuoted = input.startsWith("$") ? `"${input}"` : `'${input.replace(/'/g, "'\\''")}'`;
if (backend === "internal") { const scriptPath = Quickshell.shellDir + "/Scripts/theming/template-processor.py";
const scriptPath = Quickshell.shellDir + "/Bin/theming/template-processor.py"; const styleFlag = (Settings.data.colorSchemes.internalThemerMode === "normal") ? "--normal" : "--material";
const styleFlag = (Settings.data.colorSchemes.internalThemerMode === "normal") ? "--normal" : "--material"; script += ` python3 "${scriptPath}" ${inputQuoted} ${styleFlag} --config '${userConfigPath}' --mode ${mode}\n`;
script += ` python3 "${scriptPath}" ${inputQuoted} ${styleFlag} --config '${userConfigPath}' --mode ${mode}\n`;
} else {
// Fallback to internal if backend param is weird
const scriptPath = Quickshell.shellDir + "/Bin/theming/template-processor.py";
script += ` python3 "${scriptPath}" ${inputQuoted} --material --config '${userConfigPath}' --mode ${mode}\n`;
}
script += "fi"; script += "fi";
return script; return script;
} }
function buildUserTemplateCommandForPredefined(schemeData, mode) { function buildUserTemplateCommandForPredefined(schemeData, mode) {
if (!Settings.data.templates.enableUserTemplates) if (!Settings.data.templates.enableUserTheming)
return ""; return "";
const userConfigPath = getUserConfigPath(); const userConfigPath = getUserConfigPath();
@@ -599,8 +589,8 @@ Singleton {
}, null, 2) + "\n"; }, null, 2) + "\n";
script += "EOF\n"; script += "EOF\n";
const scriptPath = Quickshell.shellDir + "/Bin/theming/template-processor.py"; const scriptPath = Quickshell.shellDir + "/Scripts/theming/template-processor.py";
// Call colors.py with JSON file as first arg (it will detect extension) // Call template-processor.py with JSON file as first arg (it will detect extension)
script += ` python3 "${scriptPath}" '${tempJsonPathEsc}' --config '${userConfigPath}' --mode ${mode}\n`; script += ` python3 "${scriptPath}" '${tempJsonPathEsc}' --config '${userConfigPath}' --mode ${mode}\n`;
script += "fi"; script += "fi";
+2 -2
View File
@@ -8,7 +8,7 @@ import qs.Commons
Singleton { Singleton {
id: root id: root
readonly property string colorsApplyScript: Quickshell.shellDir + '/Bin/theming/template-apply.sh' readonly property string colorsApplyScript: Quickshell.shellDir + '/Scripts/theming/template-apply.sh'
// Terminal configurations (for wallpaper-based templates) // Terminal configurations (for wallpaper-based templates)
readonly property var terminals: [ readonly property var terminals: [
@@ -430,7 +430,7 @@ Singleton {
lines.push(""); lines.push("");
lines.push("# Remove this section and add your own templates"); lines.push("# Remove this section and add your own templates");
lines.push("#[templates.placeholder]"); lines.push("#[templates.placeholder]");
lines.push("#input_path = \"" + Quickshell.shellDir + "/Assets/Theming/noctalia.json\""); lines.push("#input_path = \"" + Quickshell.shellDir + "/Assets/Templates/noctalia.json\"");
lines.push("#output_path = \"" + Settings.cacheDir + "placeholder.json\""); lines.push("#output_path = \"" + Settings.cacheDir + "placeholder.json\"");
lines.push(""); lines.push("");
+1 -1
View File
@@ -1,4 +1,4 @@
pre-commit: pre-commit:
jobs: jobs:
- name: format qml - name: format qml
run: cd "$(git rev-parse --show-toplevel)" && ./Bin/dev/qmlfmt.sh && git update-index --again run: cd "$(git rev-parse --show-toplevel)" && ./Scripts/dev/qmlfmt.sh && git update-index --again
+1 -1
View File
@@ -33,7 +33,7 @@ let
/.github /.github
/.gitignore /.gitignore
/Assets/Screenshots /Assets/Screenshots
/Bin/dev /Scripts/dev
/nix /nix
/LICENSE /LICENSE
/README.md /README.md