Compare commits
6 Commits
zsh-v1.0.1
...
owlry-v1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4566fa638 | ||
|
|
c046821dc9 | ||
|
|
aa8bc21d97 | ||
|
|
3ea3533139 | ||
|
|
b8fffddd1b | ||
|
|
1198ae8afd |
18
README.md
18
README.md
@@ -52,6 +52,22 @@ uv run build.py
|
||||
|
||||
Artifacts are output to the `dist/` directory, organized by application.
|
||||
|
||||
## Releases
|
||||
|
||||
Per-app releases are automated via `scripts/release.sh`. The script only bumps
|
||||
app versions when relevant files changed since the last `<app>-vX.Y.Z` tag,
|
||||
then rebuilds, creates per-app tarballs, and publishes Gitea releases.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
./scripts/release.sh 1.0.2 --notes-dir release-notes
|
||||
```
|
||||
|
||||
Notes:
|
||||
- Use `release-notes/<app>.md` or `release-notes/common.md` for release notes.
|
||||
- Requires a working `tea` login and push access to the repo.
|
||||
|
||||
## Project Structure
|
||||
|
||||
- `src/`: Source YAML definitions containing the "DNA" of the themes.
|
||||
@@ -62,4 +78,4 @@ Artifacts are output to the `dist/` directory, organized by application.
|
||||
|
||||
## Authors
|
||||
|
||||
- **S0wlz (Owlibou)**
|
||||
- **S0wlz (Owlibou)**
|
||||
|
||||
219
scripts/release.sh
Executable file
219
scripts/release.sh
Executable file
@@ -0,0 +1,219 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage: scripts/release.sh <version> [options]
|
||||
|
||||
Options:
|
||||
--repo <slug> Gitea repo slug (default: auto-detect)
|
||||
--login <name> tea login name (default: tea default)
|
||||
--notes <text> Release notes (single line)
|
||||
--notes-file <file> Release notes file (applies to all apps)
|
||||
--notes-dir <dir> Per-app notes dir; uses <app>.md or common.md
|
||||
--no-push Skip git push
|
||||
--dry-run Print actions without executing
|
||||
-h, --help Show this help
|
||||
EOF
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
version="${1:-}"
|
||||
shift || true
|
||||
|
||||
if [[ -z "$version" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo "error: version must be semver (e.g., 1.2.3)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
repo=""
|
||||
login=""
|
||||
notes=""
|
||||
notes_file=""
|
||||
notes_dir=""
|
||||
no_push=0
|
||||
dry_run=0
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--repo)
|
||||
repo="$2"
|
||||
shift 2
|
||||
;;
|
||||
--login)
|
||||
login="$2"
|
||||
shift 2
|
||||
;;
|
||||
--notes)
|
||||
notes="$2"
|
||||
shift 2
|
||||
;;
|
||||
--notes-file)
|
||||
notes_file="$2"
|
||||
shift 2
|
||||
;;
|
||||
--notes-dir)
|
||||
notes_dir="$2"
|
||||
shift 2
|
||||
;;
|
||||
--no-push)
|
||||
no_push=1
|
||||
shift
|
||||
;;
|
||||
--dry-run)
|
||||
dry_run=1
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "error: unknown option: $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
run() {
|
||||
if (( dry_run )); then
|
||||
echo "+ $*"
|
||||
else
|
||||
"$@"
|
||||
fi
|
||||
}
|
||||
|
||||
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||
echo "error: not inside a git repository"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! git diff --quiet || ! git diff --cached --quiet; then
|
||||
echo "error: working tree not clean; commit or stash first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v tea >/dev/null 2>&1; then
|
||||
echo "error: tea is not installed or not on PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mapfile -t apps < <(python - <<'PY'
|
||||
from pathlib import Path
|
||||
apps = sorted({p.parent.name for p in Path("templates").rglob("meta.yaml")})
|
||||
print("\n".join(apps))
|
||||
PY
|
||||
)
|
||||
|
||||
changed_apps=()
|
||||
for app in "${apps[@]}"; do
|
||||
last_tag="$(git tag --list "${app}-v*" --sort=-version:refname | head -n 1)"
|
||||
if [[ -z "$last_tag" ]]; then
|
||||
changed_apps+=("$app")
|
||||
continue
|
||||
fi
|
||||
if git diff --name-only "${last_tag}..HEAD" | grep -Eq "^(src/|build.py$|templates/${app}/)"; then
|
||||
changed_apps+=("$app")
|
||||
fi
|
||||
done
|
||||
|
||||
if (( ${#changed_apps[@]} == 0 )); then
|
||||
echo "no app changes detected since last per-app tags; nothing to release"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if (( dry_run )); then
|
||||
echo "+ update meta.yaml for: ${changed_apps[*]}"
|
||||
else
|
||||
APP_LIST="$(printf "%s\n" "${changed_apps[@]}")" APP_VERSION="${version}" python - <<'PY'
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
new_version = os.environ["APP_VERSION"]
|
||||
targets = set(filter(None, os.environ["APP_LIST"].splitlines()))
|
||||
for path in Path("templates").rglob("meta.yaml"):
|
||||
if path.parent.name not in targets:
|
||||
continue
|
||||
text = path.read_text()
|
||||
lines = text.splitlines()
|
||||
out = []
|
||||
changed = False
|
||||
for line in lines:
|
||||
if line.startswith("version:"):
|
||||
out.append(f"version: {new_version}")
|
||||
changed = True
|
||||
else:
|
||||
out.append(line)
|
||||
if changed:
|
||||
path.write_text("\n".join(out) + "\n")
|
||||
PY
|
||||
fi
|
||||
|
||||
if ! git diff --quiet; then
|
||||
run git add templates/*/meta.yaml
|
||||
run git commit -m "chore: release apps v${version}"
|
||||
fi
|
||||
|
||||
run uv run build.py
|
||||
run mkdir -p dist/releases
|
||||
|
||||
for app in "${changed_apps[@]}"; do
|
||||
run tar -czf "dist/releases/apex-${app}-v${version}.tar.gz" -C dist "$app"
|
||||
done
|
||||
|
||||
if (( no_push == 0 )); then
|
||||
run git push origin HEAD
|
||||
fi
|
||||
|
||||
commit="$(git rev-parse HEAD)"
|
||||
|
||||
note_args=()
|
||||
pick_note_args() {
|
||||
local app="$1"
|
||||
note_args=()
|
||||
if [[ -n "$notes_file" ]]; then
|
||||
note_args=(--note-file "$notes_file")
|
||||
return
|
||||
fi
|
||||
if [[ -n "$notes" ]]; then
|
||||
note_args=(--note "$notes")
|
||||
return
|
||||
fi
|
||||
if [[ -n "$notes_dir" ]]; then
|
||||
if [[ -f "$notes_dir/$app.md" ]]; then
|
||||
note_args=(--note-file "$notes_dir/$app.md")
|
||||
return
|
||||
fi
|
||||
if [[ -f "$notes_dir/common.md" ]]; then
|
||||
note_args=(--note-file "$notes_dir/common.md")
|
||||
return
|
||||
fi
|
||||
fi
|
||||
note_args=(--note "Release v${version}")
|
||||
}
|
||||
|
||||
for app in "${changed_apps[@]}"; do
|
||||
tag="${app}-v${version}"
|
||||
title="Apex ${app} v${version}"
|
||||
asset="dist/releases/apex-${app}-v${version}.tar.gz"
|
||||
|
||||
args=(tea releases create)
|
||||
[[ -n "$repo" ]] && args+=(--repo "$repo")
|
||||
[[ -n "$login" ]] && args+=(--login "$login")
|
||||
args+=(--tag "$tag" --target "$commit" --title "$title")
|
||||
pick_note_args "$app"
|
||||
args+=("${note_args[@]}" --asset "$asset")
|
||||
|
||||
run "${args[@]}"
|
||||
done
|
||||
174
templates/owlry/apex.css.j2
Normal file
174
templates/owlry/apex.css.j2
Normal file
@@ -0,0 +1,174 @@
|
||||
{% set scheme_slug = scheme|lower|replace(' ', '-') %}
|
||||
{% macro rgb(hex) -%}
|
||||
{%- set value = hex|replace('#', '') -%}
|
||||
{{ value[0:2]|int(base=16) }}, {{ value[2:4]|int(base=16) }}, {{ value[4:6]|int(base=16) }}
|
||||
{%- endmacro %}
|
||||
/*
|
||||
* Owlry - {{ scheme }} Theme
|
||||
* "State over Decoration."
|
||||
*
|
||||
* A high-contrast theme built for focus and clinical clarity.
|
||||
* Color exists to signal STATE, not to decorate space.
|
||||
*
|
||||
* Author: S0wlz (Owlibou)
|
||||
*
|
||||
* Usage: Set theme = "{{ scheme_slug }}" in config.toml
|
||||
*/
|
||||
|
||||
:root {
|
||||
/* Core surfaces */
|
||||
--owlry-bg: {{ palette.background }};
|
||||
--owlry-bg-secondary: {{ ui.panel }};
|
||||
--owlry-border: {{ ui.border }};
|
||||
--owlry-text: {{ palette.foreground }};
|
||||
--owlry-text-secondary: {{ ui.dim }};
|
||||
|
||||
/* The Predator - primary accent */
|
||||
--owlry-accent: {{ palette.cursor }};
|
||||
--owlry-accent-bright: {{ ansi.bright.red }};
|
||||
|
||||
/* Provider badges - mapped to Apex semantics */
|
||||
--owlry-badge-app: {{ palette.info }}; /* Cyan: apps are informational */
|
||||
--owlry-badge-bookmark: {{ palette.warning }}; /* Yellow: bookmarks need attention */
|
||||
--owlry-badge-calc: {{ ansi.bright.yellow }}; /* Bright Yellow: calculator results */
|
||||
--owlry-badge-clip: {{ palette.special }}; /* Purple: clipboard is special */
|
||||
--owlry-badge-cmd: {{ palette.special }}; /* Purple: commands are elevated */
|
||||
--owlry-badge-dmenu: {{ palette.success }}; /* Green: dmenu is success/pipe */
|
||||
--owlry-badge-emoji: {{ ansi.bright.magenta }}; /* Bright Purple: emoji is special */
|
||||
--owlry-badge-file: {{ ansi.bright.cyan }}; /* Bright Cyan: file search is active info */
|
||||
--owlry-badge-script: {{ ansi.bright.green }}; /* Bright Green: scripts execute successfully */
|
||||
--owlry-badge-ssh: {{ palette.info }}; /* Cyan: SSH is technical/info */
|
||||
--owlry-badge-sys: {{ palette.cursor }}; /* Red: system actions are critical */
|
||||
--owlry-badge-uuctl: {{ palette.warning }}; /* Yellow: uuctl requires attention */
|
||||
--owlry-badge-web: {{ palette.info }}; /* Cyan: web is informational */
|
||||
|
||||
/* Widget badges */
|
||||
--owlry-badge-media: {{ ansi.bright.magenta }}; /* Bright Purple: media is special */
|
||||
--owlry-badge-weather: {{ ansi.bright.cyan }}; /* Bright Cyan: weather is active info */
|
||||
--owlry-badge-pomo: {{ ansi.bright.red }}; /* Alert Red: pomodoro demands attention */
|
||||
}
|
||||
|
||||
.owlry-main {
|
||||
background-color: rgba({{ rgb(palette.background) }}, 0.98);
|
||||
border: 1px solid rgba({{ rgb(ui.border) }}, 0.8);
|
||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8),
|
||||
0 0 0 1px rgba({{ rgb(palette.cursor) }}, 0.1);
|
||||
}
|
||||
|
||||
.owlry-search {
|
||||
background-color: rgba({{ rgb(ui.panel) }}, 0.9);
|
||||
border: 2px solid rgba({{ rgb(ui.border) }}, 0.8);
|
||||
color: var(--owlry-text);
|
||||
caret-color: var(--owlry-accent);
|
||||
}
|
||||
|
||||
.owlry-search:focus {
|
||||
border-color: var(--owlry-accent);
|
||||
box-shadow: 0 0 0 2px rgba({{ rgb(palette.cursor) }}, 0.3);
|
||||
}
|
||||
|
||||
.owlry-result-row:hover {
|
||||
background-color: rgba({{ rgb(ui.panel) }}, 0.8);
|
||||
}
|
||||
|
||||
.owlry-result-row:selected {
|
||||
background-color: rgba({{ rgb(palette.cursor) }}, 0.15);
|
||||
border-left: 3px solid var(--owlry-accent);
|
||||
}
|
||||
|
||||
.owlry-result-row:selected .owlry-result-name {
|
||||
color: var(--owlry-accent-bright);
|
||||
}
|
||||
|
||||
.owlry-result-row:selected .owlry-result-icon {
|
||||
color: var(--owlry-accent);
|
||||
}
|
||||
|
||||
/* Provider badges - styled per Apex semantics */
|
||||
.owlry-badge-app {
|
||||
background-color: rgba({{ rgb(palette.info) }}, 0.15);
|
||||
color: var(--owlry-badge-app);
|
||||
}
|
||||
|
||||
.owlry-badge-bookmark {
|
||||
background-color: rgba({{ rgb(palette.warning) }}, 0.15);
|
||||
color: var(--owlry-badge-bookmark);
|
||||
}
|
||||
|
||||
.owlry-badge-calc {
|
||||
background-color: rgba({{ rgb(ansi.bright.yellow) }}, 0.15);
|
||||
color: var(--owlry-badge-calc);
|
||||
}
|
||||
|
||||
.owlry-badge-clip {
|
||||
background-color: rgba({{ rgb(palette.special) }}, 0.15);
|
||||
color: var(--owlry-badge-clip);
|
||||
}
|
||||
|
||||
.owlry-badge-cmd {
|
||||
background-color: rgba({{ rgb(palette.special) }}, 0.15);
|
||||
color: var(--owlry-badge-cmd);
|
||||
}
|
||||
|
||||
.owlry-badge-dmenu {
|
||||
background-color: rgba({{ rgb(palette.success) }}, 0.15);
|
||||
color: var(--owlry-badge-dmenu);
|
||||
}
|
||||
|
||||
.owlry-badge-emoji {
|
||||
background-color: rgba({{ rgb(ansi.bright.magenta) }}, 0.15);
|
||||
color: var(--owlry-badge-emoji);
|
||||
}
|
||||
|
||||
.owlry-badge-file {
|
||||
background-color: rgba({{ rgb(ansi.bright.cyan) }}, 0.15);
|
||||
color: var(--owlry-badge-file);
|
||||
}
|
||||
|
||||
.owlry-badge-script {
|
||||
background-color: rgba({{ rgb(ansi.bright.green) }}, 0.15);
|
||||
color: var(--owlry-badge-script);
|
||||
}
|
||||
|
||||
.owlry-badge-ssh {
|
||||
background-color: rgba({{ rgb(palette.info) }}, 0.15);
|
||||
color: var(--owlry-badge-ssh);
|
||||
}
|
||||
|
||||
.owlry-badge-sys {
|
||||
background-color: rgba({{ rgb(palette.cursor) }}, 0.15);
|
||||
color: var(--owlry-badge-sys);
|
||||
}
|
||||
|
||||
.owlry-badge-uuctl {
|
||||
background-color: rgba({{ rgb(palette.warning) }}, 0.15);
|
||||
color: var(--owlry-badge-uuctl);
|
||||
}
|
||||
|
||||
.owlry-badge-web {
|
||||
background-color: rgba({{ rgb(palette.info) }}, 0.15);
|
||||
color: var(--owlry-badge-web);
|
||||
}
|
||||
|
||||
/* Widget badges */
|
||||
.owlry-badge-media {
|
||||
background-color: rgba({{ rgb(ansi.bright.magenta) }}, 0.15);
|
||||
color: var(--owlry-badge-media);
|
||||
}
|
||||
|
||||
.owlry-badge-weather {
|
||||
background-color: rgba({{ rgb(ansi.bright.cyan) }}, 0.15);
|
||||
color: var(--owlry-badge-weather);
|
||||
}
|
||||
|
||||
.owlry-badge-pomo {
|
||||
background-color: rgba({{ rgb(ansi.bright.red) }}, 0.15);
|
||||
color: var(--owlry-badge-pomo);
|
||||
}
|
||||
|
||||
/* Filter button - default uses The Predator */
|
||||
.owlry-filter-button:checked {
|
||||
background-color: rgba({{ rgb(palette.cursor) }}, 0.2);
|
||||
color: var(--owlry-accent);
|
||||
border-color: rgba({{ rgb(palette.cursor) }}, 0.5);
|
||||
}
|
||||
4
templates/owlry/meta.yaml
Normal file
4
templates/owlry/meta.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: S0wlz (Owlibou)
|
||||
description: Owlry theme
|
||||
version: 1.0.0
|
||||
strategy: individual
|
||||
129
templates/sherlock/apex.css.j2
Normal file
129
templates/sherlock/apex.css.j2
Normal file
@@ -0,0 +1,129 @@
|
||||
{% macro rgb(hex) -%}
|
||||
{%- set value = hex|replace('#', '') -%}
|
||||
{{ value[0:2]|int(base=16) }}, {{ value[2:4]|int(base=16) }}, {{ value[4:6]|int(base=16) }}
|
||||
{%- endmacro %}
|
||||
/* {{ scheme }} - Sherlock Theme (Parser Compliant) */
|
||||
|
||||
/* 1. PALETTE DEFINITIONS */
|
||||
@define-color apex_base {{ palette.background }};
|
||||
@define-color apex_surface {{ ui.panel }};
|
||||
@define-color apex_overlay {{ ui.border }};
|
||||
@define-color apex_muted {{ ui.stealth }};
|
||||
@define-color apex_text {{ palette.foreground }};
|
||||
@define-color apex_love {{ palette.cursor }};
|
||||
@define-color apex_foam {{ palette.info }};
|
||||
@define-color apex_gold {{ palette.warning }};
|
||||
|
||||
/* 2. WINDOW & INPUT */
|
||||
window {
|
||||
background-color: @apex_base;
|
||||
color: @apex_text;
|
||||
border: 2px solid @apex_love;
|
||||
border-radius: 10px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @apex_surface;
|
||||
color: @apex_text;
|
||||
caret-color: @apex_love;
|
||||
border: 1px solid @apex_overlay;
|
||||
border-radius: 7px;
|
||||
padding: 6px 9px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
entry:focus {
|
||||
border-color: @apex_love;
|
||||
box-shadow: 0 0 10px rgba({{ rgb(palette.cursor) }}, 0.2);
|
||||
}
|
||||
|
||||
entry selection {
|
||||
background-color: @apex_foam;
|
||||
color: {{ palette.selection_fg }};
|
||||
}
|
||||
|
||||
/* 3. LIST & SELECTION */
|
||||
listview {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/* The actual row selection - Informational */
|
||||
listview > row:selected {
|
||||
background-color: @apex_foam;
|
||||
color: {{ palette.selection_fg }};
|
||||
border-radius: 7px;
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* 4. TILES (The Items) */
|
||||
.tile, .launcher-tile, .launcher-item, .item {
|
||||
background-color: @apex_surface;
|
||||
color: @apex_text;
|
||||
border-radius: 7px;
|
||||
padding: 4px 10px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
/* When the ROW is selected, make the TILE transparent so info shows through */
|
||||
listview > row:selected .tile,
|
||||
listview > row:selected .launcher-tile,
|
||||
listview > row:selected .item {
|
||||
background-color: transparent;
|
||||
color: {{ palette.selection_fg }};
|
||||
}
|
||||
|
||||
/* Force TEXT on selection */
|
||||
listview > row:selected label,
|
||||
listview > row:selected .title,
|
||||
listview > row:selected .description,
|
||||
listview > row:selected .subtitle {
|
||||
color: {{ palette.selection_fg }};
|
||||
}
|
||||
|
||||
/* Force ICONS on selection */
|
||||
listview > row:selected image,
|
||||
listview > row:selected .icon {
|
||||
color: {{ palette.selection_fg }};
|
||||
}
|
||||
|
||||
/* 5. WIDGETS (Weather Fix without !important) */
|
||||
.widget, .weather-widget, .music-widget {
|
||||
background-color: @apex_surface;
|
||||
border: 1px solid @apex_overlay;
|
||||
color: @apex_text;
|
||||
border-radius: 7px;
|
||||
}
|
||||
|
||||
/* Specific overrides for weather internals */
|
||||
.weather-widget box {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.weather-widget label {
|
||||
color: @apex_text;
|
||||
}
|
||||
|
||||
/* Temperature info */
|
||||
.weather-widget .temperature {
|
||||
color: @apex_foam;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.weather-widget .condition {
|
||||
color: @apex_muted;
|
||||
}
|
||||
|
||||
/* 6. SCROLLBARS */
|
||||
scrollbar slider {
|
||||
background-color: @apex_overlay;
|
||||
min-width: 6px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
scrollbar slider:hover { background-color: @apex_love; }
|
||||
|
||||
progressbar progress {
|
||||
background-color: @apex_love;
|
||||
border-radius: 4px;
|
||||
}
|
||||
4
templates/sherlock/meta.yaml
Normal file
4
templates/sherlock/meta.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: S0wlz (Owlibou)
|
||||
description: Sherlock launcher theme
|
||||
version: 1.0.0
|
||||
strategy: individual
|
||||
17
templates/spicetify/color.ini.j2
Normal file
17
templates/spicetify/color.ini.j2
Normal file
@@ -0,0 +1,17 @@
|
||||
{% set scheme_slug = scheme|lower|replace(' ', '-') %}
|
||||
[{{ scheme_slug }}]
|
||||
text = {{ palette.foreground|replace('#', '') }}
|
||||
subtext = {{ ui.stealth|replace('#', '') }}
|
||||
main = {{ palette.background|replace('#', '') }}
|
||||
sidebar = {{ palette.background|replace('#', '') }}
|
||||
player = {{ palette.background|replace('#', '') }}
|
||||
card = {{ ui.panel|replace('#', '') }}
|
||||
shadow = 000000
|
||||
selected-row = {{ palette.info|replace('#', '') }}
|
||||
button = {{ palette.info|replace('#', '') }}
|
||||
button-active = {{ palette.cursor|replace('#', '') }}
|
||||
button-disabled = {{ ui.stealth|replace('#', '') }}
|
||||
tab-active = {{ ui.border|replace('#', '') }}
|
||||
notification = {{ palette.info|replace('#', '') }}
|
||||
notification-error = {{ palette.cursor|replace('#', '') }}
|
||||
misc = {{ palette.warning|replace('#', '') }}
|
||||
4
templates/spicetify/meta.yaml
Normal file
4
templates/spicetify/meta.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: S0wlz (Owlibou)
|
||||
description: Spicetify theme files
|
||||
version: 1.0.0
|
||||
strategy: individual
|
||||
1
templates/spicetify/user.css.j2
Normal file
1
templates/spicetify/user.css.j2
Normal file
@@ -0,0 +1 @@
|
||||
/* {{ scheme }} - Spicetify overrides */
|
||||
Reference in New Issue
Block a user