Compare commits
13 Commits
swaync-v1.
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a815f72b3 | ||
|
|
2ac05f469c | ||
|
|
6b3bb01c2c | ||
|
|
74cd31a03e | ||
|
|
a00cf1f6ff | ||
|
|
cb0fa9e6f1 | ||
|
|
ed658e43b3 | ||
|
|
f4566fa638 | ||
|
|
c046821dc9 | ||
|
|
aa8bc21d97 | ||
|
|
3ea3533139 | ||
|
|
b8fffddd1b | ||
|
|
1198ae8afd |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,3 @@
|
||||
dist/
|
||||
.venv/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
20
README.md
20
README.md
@@ -16,6 +16,8 @@ The factory currently generates native themes for:
|
||||
- **Zed** (JSON extension)
|
||||
- **Alacritty** (TOML)
|
||||
- **Kitty** (Conf)
|
||||
- **WezTerm** (TOML)
|
||||
- **Ghostty** (Theme)
|
||||
- **Zsh** (Theme with Radar/AAR)
|
||||
- **Gemini CLI** (JSON)
|
||||
- **GTK4 / Libadwaita** (CSS)
|
||||
@@ -52,6 +54,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 +80,4 @@ Artifacts are output to the `dist/` directory, organized by application.
|
||||
|
||||
## Authors
|
||||
|
||||
- **S0wlz (Owlibou)**
|
||||
- **S0wlz (Owlibou)**
|
||||
|
||||
3
dist/.gitignore
vendored
Normal file
3
dist/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Release artifacts (tarballs)
|
||||
releases/
|
||||
*.tar.gz
|
||||
63
dist/alacritty/apex-aeon.toml
vendored
Normal file
63
dist/alacritty/apex-aeon.toml
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
# APEX AEON — Alacritty theme (colors only)
|
||||
|
||||
[colors.primary]
|
||||
background = "#f5f5f5"
|
||||
foreground = "#0a0a0a"
|
||||
dim_foreground = "#737373"
|
||||
bright_foreground = "#ffffff"
|
||||
|
||||
[colors.cursor]
|
||||
text = "#0a0a0a"
|
||||
cursor = "#ff0044"
|
||||
|
||||
[colors.vi_mode_cursor]
|
||||
text = "#0a0a0a"
|
||||
cursor = "#007a88"
|
||||
|
||||
[colors.selection]
|
||||
text = "#0a0a0a"
|
||||
background = "#ff0044"
|
||||
|
||||
[colors.search.matches]
|
||||
foreground = "#0a0a0a"
|
||||
background = "#ff0044"
|
||||
|
||||
[colors.search.focused_match]
|
||||
foreground = "#0a0a0a"
|
||||
background = "#d18f00"
|
||||
|
||||
[colors.hints.start]
|
||||
foreground = "#0a0a0a"
|
||||
background = "#d18f00"
|
||||
|
||||
[colors.hints.end]
|
||||
foreground = "#0a0a0a"
|
||||
background = "#007a88"
|
||||
|
||||
[colors.line_indicator]
|
||||
foreground = "None"
|
||||
background = "None"
|
||||
|
||||
[colors.footer_bar]
|
||||
foreground = "#0a0a0a"
|
||||
background = "#e8e8e8"
|
||||
|
||||
[colors.normal]
|
||||
black = "#0a0a0a"
|
||||
red = "#ff0044"
|
||||
green = "#00b377"
|
||||
yellow = "#d18f00"
|
||||
blue = "#007a88"
|
||||
magenta = "#7a3cff"
|
||||
cyan = "#007a88"
|
||||
white = "#f5f5f5"
|
||||
|
||||
[colors.bright]
|
||||
black = "#737373"
|
||||
red = "#ff4d6d"
|
||||
green = "#33d6a6"
|
||||
yellow = "#ffbf40"
|
||||
blue = "#33bccc"
|
||||
magenta = "#a680ff"
|
||||
cyan = "#33bccc"
|
||||
white = "#ffffff"
|
||||
63
dist/alacritty/apex-neon.toml
vendored
Normal file
63
dist/alacritty/apex-neon.toml
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
# APEX NEON — Alacritty theme (colors only)
|
||||
|
||||
[colors.primary]
|
||||
background = "#050505"
|
||||
foreground = "#ededed"
|
||||
dim_foreground = "#737373"
|
||||
bright_foreground = "#ffffff"
|
||||
|
||||
[colors.cursor]
|
||||
text = "#050505"
|
||||
cursor = "#ff0044"
|
||||
|
||||
[colors.vi_mode_cursor]
|
||||
text = "#050505"
|
||||
cursor = "#00eaff"
|
||||
|
||||
[colors.selection]
|
||||
text = "#050505"
|
||||
background = "#ff0044"
|
||||
|
||||
[colors.search.matches]
|
||||
foreground = "#050505"
|
||||
background = "#ff0044"
|
||||
|
||||
[colors.search.focused_match]
|
||||
foreground = "#050505"
|
||||
background = "#ffb700"
|
||||
|
||||
[colors.hints.start]
|
||||
foreground = "#050505"
|
||||
background = "#ffb700"
|
||||
|
||||
[colors.hints.end]
|
||||
foreground = "#050505"
|
||||
background = "#00eaff"
|
||||
|
||||
[colors.line_indicator]
|
||||
foreground = "None"
|
||||
background = "None"
|
||||
|
||||
[colors.footer_bar]
|
||||
foreground = "#ededed"
|
||||
background = "#141414"
|
||||
|
||||
[colors.normal]
|
||||
black = "#050505"
|
||||
red = "#ff0044"
|
||||
green = "#00ff99"
|
||||
yellow = "#ffb700"
|
||||
blue = "#00eaff"
|
||||
magenta = "#9d00ff"
|
||||
cyan = "#00eaff"
|
||||
white = "#ededed"
|
||||
|
||||
[colors.bright]
|
||||
black = "#737373"
|
||||
red = "#ff8899"
|
||||
green = "#2bffb2"
|
||||
yellow = "#ffd24d"
|
||||
blue = "#5af3ff"
|
||||
magenta = "#c84dff"
|
||||
cyan = "#5af3ff"
|
||||
white = "#ffffff"
|
||||
89
dist/btop/apex-aeon.theme
vendored
Normal file
89
dist/btop/apex-aeon.theme
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
# Apex Aeon — Btop Theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
# Main background, empty for terminal default, black for dark themes
|
||||
theme[main_bg]="#f5f5f5"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#0a0a0a"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#0a0a0a"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#ff0044"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#ff0044"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#0a0a0a"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#737373"
|
||||
|
||||
# Color of text appearing on top of graphs, i.e. usage percentage
|
||||
theme[graph_text]="#737373"
|
||||
|
||||
# Background color of the percentage meters
|
||||
theme[meter_bg]="#e8e8e8"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, used memory percentage, and entries filter
|
||||
theme[proc_misc]="#007a88"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#737373"
|
||||
|
||||
# Memory box outline color
|
||||
theme[mem_box]="#737373"
|
||||
|
||||
# Net box outline color
|
||||
theme[net_box]="#737373"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#737373"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#737373"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#007a88"
|
||||
theme[temp_mid]="#7a3cff"
|
||||
theme[temp_end]="#ff0044"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#007a88"
|
||||
theme[cpu_mid]="#7a3cff"
|
||||
theme[cpu_end]="#ff0044"
|
||||
|
||||
# Mem graph colors
|
||||
theme[free_start]="#00b377"
|
||||
theme[free_mid]="#d18f00"
|
||||
theme[free_end]="#ff0044"
|
||||
|
||||
theme[cached_start]="#007a88"
|
||||
theme[cached_mid]="#7a3cff"
|
||||
theme[cached_end]="#ff0044"
|
||||
|
||||
theme[available_start]="#00b377"
|
||||
theme[available_mid]="#d18f00"
|
||||
theme[available_end]="#ff0044"
|
||||
|
||||
theme[used_start]="#007a88"
|
||||
theme[used_mid]="#7a3cff"
|
||||
theme[used_end]="#ff0044"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#007a88"
|
||||
theme[download_mid]="#7a3cff"
|
||||
theme[download_end]="#ff0044"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#007a88"
|
||||
theme[upload_mid]="#7a3cff"
|
||||
theme[upload_end]="#ff0044"
|
||||
|
||||
# Process path color
|
||||
theme[process_start]="#007a88"
|
||||
theme[process_mid]="#7a3cff"
|
||||
theme[process_end]="#ff0044"
|
||||
89
dist/btop/apex-neon.theme
vendored
Normal file
89
dist/btop/apex-neon.theme
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
# Apex Neon — Btop Theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
# Main background, empty for terminal default, black for dark themes
|
||||
theme[main_bg]="#050505"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#ededed"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#ededed"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#ff0044"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#ff0044"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#050505"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#737373"
|
||||
|
||||
# Color of text appearing on top of graphs, i.e. usage percentage
|
||||
theme[graph_text]="#737373"
|
||||
|
||||
# Background color of the percentage meters
|
||||
theme[meter_bg]="#141414"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, used memory percentage, and entries filter
|
||||
theme[proc_misc]="#00eaff"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#262626"
|
||||
|
||||
# Memory box outline color
|
||||
theme[mem_box]="#262626"
|
||||
|
||||
# Net box outline color
|
||||
theme[net_box]="#262626"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#262626"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#262626"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#00eaff"
|
||||
theme[temp_mid]="#9d00ff"
|
||||
theme[temp_end]="#ff0044"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#00eaff"
|
||||
theme[cpu_mid]="#9d00ff"
|
||||
theme[cpu_end]="#ff0044"
|
||||
|
||||
# Mem graph colors
|
||||
theme[free_start]="#00ff99"
|
||||
theme[free_mid]="#ffb700"
|
||||
theme[free_end]="#ff0044"
|
||||
|
||||
theme[cached_start]="#00eaff"
|
||||
theme[cached_mid]="#9d00ff"
|
||||
theme[cached_end]="#ff0044"
|
||||
|
||||
theme[available_start]="#00ff99"
|
||||
theme[available_mid]="#ffb700"
|
||||
theme[available_end]="#ff0044"
|
||||
|
||||
theme[used_start]="#00eaff"
|
||||
theme[used_mid]="#9d00ff"
|
||||
theme[used_end]="#ff0044"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#00eaff"
|
||||
theme[download_mid]="#9d00ff"
|
||||
theme[download_end]="#ff0044"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#00eaff"
|
||||
theme[upload_mid]="#9d00ff"
|
||||
theme[upload_end]="#ff0044"
|
||||
|
||||
# Process path color
|
||||
theme[process_start]="#00eaff"
|
||||
theme[process_mid]="#9d00ff"
|
||||
theme[process_end]="#ff0044"
|
||||
15
dist/fuzzel/apex-aeon-fuzzel.ini
vendored
Normal file
15
dist/fuzzel/apex-aeon-fuzzel.ini
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# Apex Aeon — Fuzzel Theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
[colors]
|
||||
background=f5f5f5ff
|
||||
text=0a0a0aff
|
||||
match=007a88ff
|
||||
selection=ff0044ff
|
||||
selection-text=0a0a0aff
|
||||
selection-match=007a88ff
|
||||
border=007a88ff
|
||||
|
||||
[border]
|
||||
width=2
|
||||
radius=0
|
||||
15
dist/fuzzel/apex-neon-fuzzel.ini
vendored
Normal file
15
dist/fuzzel/apex-neon-fuzzel.ini
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# Apex Neon — Fuzzel Theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
[colors]
|
||||
background=050505ff
|
||||
text=edededff
|
||||
match=00eaffff
|
||||
selection=ff0044ff
|
||||
selection-text=050505ff
|
||||
selection-match=00eaffff
|
||||
border=00eaffff
|
||||
|
||||
[border]
|
||||
width=2
|
||||
radius=0
|
||||
24
dist/gemini/apex-aeon.json
vendored
Normal file
24
dist/gemini/apex-aeon.json
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "Apex Aeon",
|
||||
"type": "custom",
|
||||
"Background": "#f5f5f5",
|
||||
"Foreground": "#0a0a0a",
|
||||
"LightBlue": "#33bccc",
|
||||
"AccentBlue": "#007a88",
|
||||
"AccentPurple": "#7a3cff",
|
||||
"AccentCyan": "#33bccc",
|
||||
"AccentGreen": "#00b377",
|
||||
"AccentYellow": "#d18f00",
|
||||
"AccentRed": "#ff0044",
|
||||
"Comment": "#737373",
|
||||
"Gray": "#a0a0a0",
|
||||
"DiffAdded": "#00b377",
|
||||
"DiffRemoved": "#ff0044",
|
||||
"DiffModified": "#d18f00",
|
||||
"text": {
|
||||
"primary": "#0a0a0a",
|
||||
"secondary": "#737373",
|
||||
"accent": "#007a88",
|
||||
"response": "#0a0a0a"
|
||||
}
|
||||
}
|
||||
24
dist/gemini/apex-neon.json
vendored
Normal file
24
dist/gemini/apex-neon.json
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "Apex Neon",
|
||||
"type": "custom",
|
||||
"Background": "#050505",
|
||||
"Foreground": "#ededed",
|
||||
"LightBlue": "#5af3ff",
|
||||
"AccentBlue": "#00eaff",
|
||||
"AccentPurple": "#9d00ff",
|
||||
"AccentCyan": "#5af3ff",
|
||||
"AccentGreen": "#00ff99",
|
||||
"AccentYellow": "#ffb700",
|
||||
"AccentRed": "#ff0044",
|
||||
"Comment": "#737373",
|
||||
"Gray": "#404040",
|
||||
"DiffAdded": "#00ff99",
|
||||
"DiffRemoved": "#ff0044",
|
||||
"DiffModified": "#ffb700",
|
||||
"text": {
|
||||
"primary": "#ededed",
|
||||
"secondary": "#737373",
|
||||
"accent": "#00eaff",
|
||||
"response": "#ededed"
|
||||
}
|
||||
}
|
||||
26
dist/ghostty/apex-aeon
vendored
Normal file
26
dist/ghostty/apex-aeon
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# Apex Aeon - Ghostty theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
background = #f5f5f5
|
||||
foreground = #0a0a0a
|
||||
|
||||
cursor-color = #ff0044
|
||||
selection-background = #ff0044
|
||||
selection-foreground = #0a0a0a
|
||||
|
||||
palette = 0=#0a0a0a
|
||||
palette = 1=#ff0044
|
||||
palette = 2=#00b377
|
||||
palette = 3=#d18f00
|
||||
palette = 4=#007a88
|
||||
palette = 5=#7a3cff
|
||||
palette = 6=#007a88
|
||||
palette = 7=#f5f5f5
|
||||
palette = 8=#737373
|
||||
palette = 9=#ff4d6d
|
||||
palette = 10=#33d6a6
|
||||
palette = 11=#ffbf40
|
||||
palette = 12=#33bccc
|
||||
palette = 13=#a680ff
|
||||
palette = 14=#33bccc
|
||||
palette = 15=#ffffff
|
||||
26
dist/ghostty/apex-neon
vendored
Normal file
26
dist/ghostty/apex-neon
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# Apex Neon - Ghostty theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
background = #050505
|
||||
foreground = #ededed
|
||||
|
||||
cursor-color = #ff0044
|
||||
selection-background = #ff0044
|
||||
selection-foreground = #050505
|
||||
|
||||
palette = 0=#050505
|
||||
palette = 1=#ff0044
|
||||
palette = 2=#00ff99
|
||||
palette = 3=#ffb700
|
||||
palette = 4=#00eaff
|
||||
palette = 5=#9d00ff
|
||||
palette = 6=#00eaff
|
||||
palette = 7=#ededed
|
||||
palette = 8=#737373
|
||||
palette = 9=#ff8899
|
||||
palette = 10=#2bffb2
|
||||
palette = 11=#ffd24d
|
||||
palette = 12=#5af3ff
|
||||
palette = 13=#c84dff
|
||||
palette = 14=#5af3ff
|
||||
palette = 15=#ffffff
|
||||
129
dist/gtk4/gtk.css
vendored
Normal file
129
dist/gtk4/gtk.css
vendored
Normal file
@@ -0,0 +1,129 @@
|
||||
/* Apex Theme System — GTK4 / Libadwaita */
|
||||
/* Auto-generated from Apex DNA */
|
||||
|
||||
|
||||
/* Scheme: Apex Neon (dark) */
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
|
||||
:root {
|
||||
/* Core Surfaces */
|
||||
@define-color window_bg_color #050505;
|
||||
@define-color window_fg_color #ededed;
|
||||
|
||||
@define-color view_bg_color #050505;
|
||||
@define-color view_fg_color #ededed;
|
||||
|
||||
@define-color headerbar_bg_color #141414;
|
||||
@define-color headerbar_fg_color #ededed;
|
||||
@define-color headerbar_border_color #262626;
|
||||
@define-color headerbar_backdrop_color @window_bg_color;
|
||||
@define-color headerbar_shade_color rgba(0, 0, 0, 0.07);
|
||||
|
||||
@define-color popover_bg_color #141414;
|
||||
@define-color popover_fg_color #ededed;
|
||||
|
||||
@define-color card_bg_color #141414;
|
||||
@define-color card_fg_color #ededed;
|
||||
@define-color card_shade_color rgba(0, 0, 0, 0.07);
|
||||
|
||||
@define-color dialog_bg_color #141414;
|
||||
@define-color dialog_fg_color #ededed;
|
||||
|
||||
/* Accents */
|
||||
@define-color accent_color #00eaff;
|
||||
@define-color accent_bg_color #00eaff;
|
||||
@define-color accent_fg_color #050505;
|
||||
|
||||
@define-color destructive_color #ff0044;
|
||||
@define-color destructive_bg_color #ff0044;
|
||||
@define-color destructive_fg_color #050505;
|
||||
|
||||
@define-color success_color #00ff99;
|
||||
@define-color success_bg_color #00ff99;
|
||||
@define-color success_fg_color #050505;
|
||||
|
||||
@define-color warning_color #ffb700;
|
||||
@define-color warning_bg_color #ffb700;
|
||||
@define-color warning_fg_color #050505;
|
||||
|
||||
@define-color error_color #ff8899;
|
||||
@define-color error_bg_color #ff8899;
|
||||
@define-color error_fg_color #050505;
|
||||
|
||||
/* UI Elements */
|
||||
@define-color borders #262626;
|
||||
@define-color sidebar_bg_color #141414;
|
||||
@define-color sidebar_fg_color #ededed;
|
||||
@define-color sidebar_backdrop_color @window_bg_color;
|
||||
@define-color sidebar_shade_color rgba(0, 0, 0, 0.07);
|
||||
|
||||
/* Custom Apex Palette */
|
||||
@define-color apex_razor #ff0044;
|
||||
@define-color apex_void #050505;
|
||||
@define-color apex_stealth #404040;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scheme: Apex Aeon (light) */
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
|
||||
:root {
|
||||
/* Core Surfaces */
|
||||
@define-color window_bg_color #f5f5f5;
|
||||
@define-color window_fg_color #0a0a0a;
|
||||
|
||||
@define-color view_bg_color #f5f5f5;
|
||||
@define-color view_fg_color #0a0a0a;
|
||||
|
||||
@define-color headerbar_bg_color #e8e8e8;
|
||||
@define-color headerbar_fg_color #0a0a0a;
|
||||
@define-color headerbar_border_color #737373;
|
||||
@define-color headerbar_backdrop_color @window_bg_color;
|
||||
@define-color headerbar_shade_color rgba(0, 0, 0, 0.07);
|
||||
|
||||
@define-color popover_bg_color #e8e8e8;
|
||||
@define-color popover_fg_color #0a0a0a;
|
||||
|
||||
@define-color card_bg_color #e8e8e8;
|
||||
@define-color card_fg_color #0a0a0a;
|
||||
@define-color card_shade_color rgba(0, 0, 0, 0.07);
|
||||
|
||||
@define-color dialog_bg_color #e8e8e8;
|
||||
@define-color dialog_fg_color #0a0a0a;
|
||||
|
||||
/* Accents */
|
||||
@define-color accent_color #007a88;
|
||||
@define-color accent_bg_color #007a88;
|
||||
@define-color accent_fg_color #f5f5f5;
|
||||
|
||||
@define-color destructive_color #ff0044;
|
||||
@define-color destructive_bg_color #ff0044;
|
||||
@define-color destructive_fg_color #f5f5f5;
|
||||
|
||||
@define-color success_color #00b377;
|
||||
@define-color success_bg_color #00b377;
|
||||
@define-color success_fg_color #f5f5f5;
|
||||
|
||||
@define-color warning_color #d18f00;
|
||||
@define-color warning_bg_color #d18f00;
|
||||
@define-color warning_fg_color #f5f5f5;
|
||||
|
||||
@define-color error_color #ff4d6d;
|
||||
@define-color error_bg_color #ff4d6d;
|
||||
@define-color error_fg_color #f5f5f5;
|
||||
|
||||
/* UI Elements */
|
||||
@define-color borders #737373;
|
||||
@define-color sidebar_bg_color #e8e8e8;
|
||||
@define-color sidebar_fg_color #0a0a0a;
|
||||
@define-color sidebar_backdrop_color @window_bg_color;
|
||||
@define-color sidebar_shade_color rgba(0, 0, 0, 0.07);
|
||||
|
||||
/* Custom Apex Palette */
|
||||
@define-color apex_razor #ff0044;
|
||||
@define-color apex_void #f5f5f5;
|
||||
@define-color apex_stealth #a0a0a0;
|
||||
}
|
||||
}
|
||||
85
dist/hyprland/apex-aeon-colors.conf
vendored
Normal file
85
dist/hyprland/apex-aeon-colors.conf
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
#############################
|
||||
### APEX AEON THEME ###
|
||||
#############################
|
||||
|
||||
# The Void (Backgrounds)
|
||||
# Pure, unadulterated darkness. None of that "grey-blue" nonsense.
|
||||
$base = rgb(f5f5f5)
|
||||
$baseAlpha = f5f5f5
|
||||
|
||||
$surface = rgb(e8e8e8)
|
||||
$surfaceAlpha = e8e8e8
|
||||
|
||||
$overlay = rgb(737373)
|
||||
$overlayAlpha = 737373
|
||||
|
||||
$muted = rgb(a0a0a0)
|
||||
$mutedAlpha = a0a0a0
|
||||
|
||||
$subtle = rgb(a0a0a0)
|
||||
$subtleAlpha = a0a0a0
|
||||
|
||||
# The Signal (Text)
|
||||
# Stark white for maximum readability.
|
||||
$text = rgb(0a0a0a)
|
||||
$textAlpha = 0a0a0a
|
||||
|
||||
# Accents (Aggressive)
|
||||
# "Razor Red" - For errors or active borders. Blood-like.
|
||||
$love = rgb(ff0044)
|
||||
$loveAlpha = ff0044
|
||||
|
||||
# "Warning Gold"
|
||||
$gold = rgb(d18f00)
|
||||
$goldAlpha = d18f00
|
||||
|
||||
# "Toxic Green" - Because nature isn't always nice.
|
||||
$pine = rgb(00b377)
|
||||
$pineAlpha = 00b377
|
||||
|
||||
# "Electric Cyan" - Cold, digital logic.
|
||||
$foam = rgb(007a88)
|
||||
$foamAlpha = 007a88
|
||||
|
||||
# "Deep Void Purple"
|
||||
$iris = rgb(7a3cff)
|
||||
$irisAlpha = 7a3cff
|
||||
|
||||
# "Pale Rose" (Mapped to alert color)
|
||||
$rose = rgb(ff4d6d)
|
||||
$roseAlpha = ff4d6d
|
||||
|
||||
# Highlight variants
|
||||
$highlight_low = rgb(e8e8e8)
|
||||
$highlight_lowAlpha = e8e8e8
|
||||
|
||||
$highlight_med = rgb(737373)
|
||||
$highlight_medAlpha = 737373
|
||||
|
||||
$highlight_high = rgb(a0a0a0)
|
||||
$highlight_highAlpha = a0a0a0
|
||||
|
||||
# Theme-specific definitions
|
||||
$splash_text = rgba($textAlphaee)
|
||||
$dec_shadow = rgba(000000ee) # Hard shadows
|
||||
|
||||
# Border configurations
|
||||
# Sharp, thin, and aggressive.
|
||||
$border_active = rgba($loveAlphaff) rgba($irisAlphaff) 45deg
|
||||
$border_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
|
||||
|
||||
$border_nogroup_active = rgba($foamAlphaff) rgba($pineAlphaff) 45deg
|
||||
$border_nogroup_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
|
||||
|
||||
$border_group_active = rgba($goldAlphaff) rgba($loveAlphaff) 45deg
|
||||
$border_group_inactive = rgba($mutedAlpha66) rgba($surfaceAlpha66) 45deg
|
||||
|
||||
$border_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff) 45deg
|
||||
$border_grouplocked_inactive = rgba($foamAlpha66) rgba($irisAlpha66) 45deg
|
||||
|
||||
# Group bar configurations
|
||||
$groupbar_text = rgba($baseAlphaff)
|
||||
$groupbar_active = rgba($loveAlphaff) rgba($irisAlphaaa)
|
||||
$groupbar_inactive = rgba($surfaceAlphaee) rgba($mutedAlphaaa)
|
||||
$groupbar_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff)
|
||||
$groupbar_grouplocked_inactive = rgba($foamAlphaaa) rgba($irisAlphaaa)
|
||||
85
dist/hyprland/apex-neon-colors.conf
vendored
Normal file
85
dist/hyprland/apex-neon-colors.conf
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
#############################
|
||||
### APEX NEON THEME ###
|
||||
#############################
|
||||
|
||||
# The Void (Backgrounds)
|
||||
# Pure, unadulterated darkness. None of that "grey-blue" nonsense.
|
||||
$base = rgb(050505)
|
||||
$baseAlpha = 050505
|
||||
|
||||
$surface = rgb(141414)
|
||||
$surfaceAlpha = 141414
|
||||
|
||||
$overlay = rgb(262626)
|
||||
$overlayAlpha = 262626
|
||||
|
||||
$muted = rgb(404040)
|
||||
$mutedAlpha = 404040
|
||||
|
||||
$subtle = rgb(404040)
|
||||
$subtleAlpha = 404040
|
||||
|
||||
# The Signal (Text)
|
||||
# Stark white for maximum readability.
|
||||
$text = rgb(ededed)
|
||||
$textAlpha = ededed
|
||||
|
||||
# Accents (Aggressive)
|
||||
# "Razor Red" - For errors or active borders. Blood-like.
|
||||
$love = rgb(ff0044)
|
||||
$loveAlpha = ff0044
|
||||
|
||||
# "Warning Gold"
|
||||
$gold = rgb(ffb700)
|
||||
$goldAlpha = ffb700
|
||||
|
||||
# "Toxic Green" - Because nature isn't always nice.
|
||||
$pine = rgb(00ff99)
|
||||
$pineAlpha = 00ff99
|
||||
|
||||
# "Electric Cyan" - Cold, digital logic.
|
||||
$foam = rgb(00eaff)
|
||||
$foamAlpha = 00eaff
|
||||
|
||||
# "Deep Void Purple"
|
||||
$iris = rgb(9d00ff)
|
||||
$irisAlpha = 9d00ff
|
||||
|
||||
# "Pale Rose" (Mapped to alert color)
|
||||
$rose = rgb(ff8899)
|
||||
$roseAlpha = ff8899
|
||||
|
||||
# Highlight variants
|
||||
$highlight_low = rgb(141414)
|
||||
$highlight_lowAlpha = 141414
|
||||
|
||||
$highlight_med = rgb(262626)
|
||||
$highlight_medAlpha = 262626
|
||||
|
||||
$highlight_high = rgb(404040)
|
||||
$highlight_highAlpha = 404040
|
||||
|
||||
# Theme-specific definitions
|
||||
$splash_text = rgba($textAlphaee)
|
||||
$dec_shadow = rgba(000000ee) # Hard shadows
|
||||
|
||||
# Border configurations
|
||||
# Sharp, thin, and aggressive.
|
||||
$border_active = rgba($loveAlphaff) rgba($irisAlphaff) 45deg
|
||||
$border_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
|
||||
|
||||
$border_nogroup_active = rgba($foamAlphaff) rgba($pineAlphaff) 45deg
|
||||
$border_nogroup_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
|
||||
|
||||
$border_group_active = rgba($goldAlphaff) rgba($loveAlphaff) 45deg
|
||||
$border_group_inactive = rgba($mutedAlpha66) rgba($surfaceAlpha66) 45deg
|
||||
|
||||
$border_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff) 45deg
|
||||
$border_grouplocked_inactive = rgba($foamAlpha66) rgba($irisAlpha66) 45deg
|
||||
|
||||
# Group bar configurations
|
||||
$groupbar_text = rgba($baseAlphaff)
|
||||
$groupbar_active = rgba($loveAlphaff) rgba($irisAlphaaa)
|
||||
$groupbar_inactive = rgba($surfaceAlphaee) rgba($mutedAlphaaa)
|
||||
$groupbar_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff)
|
||||
$groupbar_grouplocked_inactive = rgba($foamAlphaaa) rgba($irisAlphaaa)
|
||||
66
dist/kitty/apex-aeon.conf
vendored
Normal file
66
dist/kitty/apex-aeon.conf
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
## APEX AEON - KITTY THEME ##
|
||||
## Spec-accurate: color = state, not decoration
|
||||
|
||||
# --- Core ---
|
||||
foreground #0a0a0a
|
||||
background #f5f5f5
|
||||
|
||||
# Selection: "target locked"
|
||||
selection_background #ff0044
|
||||
selection_foreground #0a0a0a
|
||||
|
||||
# Cursor: Razor Red beam
|
||||
cursor #ff0044
|
||||
cursor_text_color #0a0a0a
|
||||
cursor_shape beam
|
||||
|
||||
# URLs: informational cyan
|
||||
url_color #007a88
|
||||
|
||||
# Borders (optional)
|
||||
active_border_color #ff0044
|
||||
inactive_border_color #737373
|
||||
|
||||
# Optional: subtle UI hint for visual bell
|
||||
visual_bell_color #ff4d6d
|
||||
|
||||
# Spacing
|
||||
window_padding_width 4
|
||||
|
||||
# --- 16-COLOR ANSI TABLE (Apex Aeon spec) ---
|
||||
|
||||
# Normal bank (0–7)
|
||||
# color0: Black (Void)
|
||||
color0 #0a0a0a
|
||||
# color1: Red (Razor)
|
||||
color1 #ff0044
|
||||
# color2: Green (OK)
|
||||
color2 #00b377
|
||||
# color3: Yellow (Gold)
|
||||
color3 #d18f00
|
||||
# color4: Blue (Info)
|
||||
color4 #007a88
|
||||
# color5: Magenta (Purple)
|
||||
color5 #7a3cff
|
||||
# color6: Cyan (Info mapped)
|
||||
color6 #007a88
|
||||
# color7: White (Stark)
|
||||
color7 #f5f5f5
|
||||
|
||||
# Bright bank (8–15)
|
||||
# color8: Bright black (UI separators)
|
||||
color8 #737373
|
||||
# color9: Bright red (Alerts)
|
||||
color9 #ff4d6d
|
||||
# color10: Bright green (Active success)
|
||||
color10 #33d6a6
|
||||
# color11: Bright yellow (Urgent warning)
|
||||
color11 #ffbf40
|
||||
# color12: Bright blue (Active info)
|
||||
color12 #33bccc
|
||||
# color13: Bright magenta (Elevated special)
|
||||
color13 #a680ff
|
||||
# color14: Bright cyan (Active tech signal)
|
||||
color14 #33bccc
|
||||
# color15: Bright white (Extreme highlight)
|
||||
color15 #ffffff
|
||||
66
dist/kitty/apex-neon.conf
vendored
Normal file
66
dist/kitty/apex-neon.conf
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
## APEX NEON - KITTY THEME ##
|
||||
## Spec-accurate: color = state, not decoration
|
||||
|
||||
# --- Core ---
|
||||
foreground #ededed
|
||||
background #050505
|
||||
|
||||
# Selection: "target locked"
|
||||
selection_background #ff0044
|
||||
selection_foreground #050505
|
||||
|
||||
# Cursor: Razor Red beam
|
||||
cursor #ff0044
|
||||
cursor_text_color #050505
|
||||
cursor_shape beam
|
||||
|
||||
# URLs: informational cyan
|
||||
url_color #00eaff
|
||||
|
||||
# Borders (optional)
|
||||
active_border_color #ff0044
|
||||
inactive_border_color #262626
|
||||
|
||||
# Optional: subtle UI hint for visual bell
|
||||
visual_bell_color #ff8899
|
||||
|
||||
# Spacing
|
||||
window_padding_width 4
|
||||
|
||||
# --- 16-COLOR ANSI TABLE (Apex Neon spec) ---
|
||||
|
||||
# Normal bank (0–7)
|
||||
# color0: Black (Void)
|
||||
color0 #050505
|
||||
# color1: Red (Razor)
|
||||
color1 #ff0044
|
||||
# color2: Green (OK)
|
||||
color2 #00ff99
|
||||
# color3: Yellow (Gold)
|
||||
color3 #ffb700
|
||||
# color4: Blue (Info)
|
||||
color4 #00eaff
|
||||
# color5: Magenta (Purple)
|
||||
color5 #9d00ff
|
||||
# color6: Cyan (Info mapped)
|
||||
color6 #00eaff
|
||||
# color7: White (Stark)
|
||||
color7 #ededed
|
||||
|
||||
# Bright bank (8–15)
|
||||
# color8: Bright black (UI separators)
|
||||
color8 #737373
|
||||
# color9: Bright red (Alerts)
|
||||
color9 #ff8899
|
||||
# color10: Bright green (Active success)
|
||||
color10 #2bffb2
|
||||
# color11: Bright yellow (Urgent warning)
|
||||
color11 #ffd24d
|
||||
# color12: Bright blue (Active info)
|
||||
color12 #5af3ff
|
||||
# color13: Bright magenta (Elevated special)
|
||||
color13 #c84dff
|
||||
# color14: Bright cyan (Active tech signal)
|
||||
color14 #5af3ff
|
||||
# color15: Bright white (Extreme highlight)
|
||||
color15 #ffffff
|
||||
381
dist/nvim/colors/apex-aeon.lua
vendored
Normal file
381
dist/nvim/colors/apex-aeon.lua
vendored
Normal file
@@ -0,0 +1,381 @@
|
||||
-- Apex Aeon: Standalone Theme Engine
|
||||
-- Philosophy: State over Decoration. Red is Presence. Cyan is Data.
|
||||
|
||||
local M = {}
|
||||
|
||||
M.palette = {
|
||||
-- The Void
|
||||
void = "#f5f5f5", -- Background
|
||||
panel = "#e8e8e8", -- Dark Surface (Statusline/Gutter)
|
||||
border = "#737373", -- Muted Border
|
||||
stealth = "#a0a0a0", -- Comments / Ignored
|
||||
|
||||
-- The Signal
|
||||
text = "#0a0a0a", -- Stark White
|
||||
dim = "#737373", -- Muted Text
|
||||
|
||||
-- The Hunter (Presence)
|
||||
razor = "#ff0044", -- PRIMARY: Cursor, Current Match, Active Border
|
||||
ink = "#0a0a0a", -- Text color on Razor backgrounds
|
||||
alert = "#ff0044", -- Error accent text on void/panel
|
||||
|
||||
-- The HUD (Data)
|
||||
tech = "#007a88", -- INFO: Selection, Search Match, Constants
|
||||
toxic = "#00b377", -- SUCCESS: Strings
|
||||
amber = "#d18f00", -- WARNING: Types, Search
|
||||
azure = "#005577", -- STRUCT: Functions (Deep Blue)
|
||||
sacred = "#7a3cff", -- SPECIAL: Keywords, Root
|
||||
}
|
||||
|
||||
function M.load()
|
||||
vim.cmd "hi clear"
|
||||
if vim.fn.exists "syntax_on" then vim.cmd "syntax reset" end
|
||||
vim.o.background = "light"
|
||||
vim.g.colors_name = "apex-aeon"
|
||||
|
||||
-- Optional transparency: set g:apex_blend or g:apex_transparent to opt in.
|
||||
local blend = vim.g.apex_blend
|
||||
if type(blend) == "number" then
|
||||
vim.o.winblend = blend
|
||||
vim.o.pumblend = blend
|
||||
elseif vim.g.apex_transparent == true then
|
||||
vim.o.winblend = 20
|
||||
vim.o.pumblend = 20
|
||||
end
|
||||
|
||||
local p = M.palette
|
||||
local groups = {
|
||||
-- CANVAS & UI -----------------------------------------------------------
|
||||
Normal = { fg = p.text, bg = p.void },
|
||||
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
|
||||
SignColumn = { bg = p.void },
|
||||
FoldColumn = { fg = p.stealth, bg = p.void },
|
||||
VertSplit = { fg = p.border }, -- Deprecated in nvim 0.10, but good fallback
|
||||
WinSeparator = { fg = p.border },
|
||||
EndOfBuffer = { fg = p.void }, -- Hide tildes
|
||||
NormalFloat = { fg = p.text, bg = p.panel },
|
||||
FloatBorder = { fg = p.border, bg = p.panel },
|
||||
MsgArea = { fg = p.text, bg = p.void },
|
||||
WinBar = { fg = p.text, bg = p.panel },
|
||||
WinBarNC = { fg = p.dim, bg = p.panel },
|
||||
|
||||
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
|
||||
Cursor = { fg = p.ink, bg = p.razor }, -- Red Beam
|
||||
TermCursor = { fg = p.ink, bg = p.razor },
|
||||
CursorLine = { bg = p.panel },
|
||||
CursorColumn = { bg = p.panel },
|
||||
ColorColumn = { bg = p.panel },
|
||||
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
|
||||
LineNr = { fg = p.stealth }, -- Other lines fade out
|
||||
|
||||
-- SELECTION & SEARCH ("Terminator Vision") ------------------------------
|
||||
Visual = { fg = p.void, bg = p.tech, bold = true }, -- Cyan (Data Lock)
|
||||
VisualNOS = { fg = p.void, bg = p.border },
|
||||
|
||||
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
|
||||
IncSearch = { fg = p.ink, bg = p.razor }, -- Red (Acquiring...)
|
||||
CurSearch = { fg = p.ink, bg = p.razor, bold = true }, -- Red (Target Locked)
|
||||
|
||||
-- STATUS & MESSAGES -----------------------------------------------------
|
||||
StatusLine = { fg = p.text, bg = p.panel },
|
||||
StatusLineNC = { fg = p.dim, bg = p.void },
|
||||
WildMenu = { fg = p.void, bg = p.tech },
|
||||
Pmenu = { fg = p.text, bg = p.panel },
|
||||
PmenuSel = { fg = p.ink, bg = p.razor, bold = true }, -- Red Menu Selection
|
||||
PmenuKind = { fg = p.dim, bg = p.panel },
|
||||
PmenuKindSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuExtra = { fg = p.dim, bg = p.panel },
|
||||
PmenuExtraSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuMatch = { fg = p.tech, bg = p.panel, bold = true },
|
||||
PmenuMatchSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuSbar = { bg = p.panel },
|
||||
PmenuThumb = { bg = p.stealth },
|
||||
ErrorMsg = { fg = p.alert },
|
||||
WarningMsg = { fg = p.amber },
|
||||
MoreMsg = { fg = p.tech },
|
||||
ModeMsg = { fg = p.text },
|
||||
TabLine = { fg = p.dim, bg = p.panel },
|
||||
TabLineSel = { fg = p.text, bg = p.void, bold = true },
|
||||
TabLineFill = { fg = p.panel, bg = p.panel },
|
||||
QuickFixLine = { fg = p.text, bg = p.panel, bold = true },
|
||||
|
||||
-- SYNTAX HIGHLIGHTING ---------------------------------------------------
|
||||
Comment = { fg = p.stealth, italic = true },
|
||||
Constant = { fg = p.tech }, -- Cyan (Digital values)
|
||||
String = { fg = p.toxic }, -- Green (Organic strings)
|
||||
Character = { fg = p.toxic },
|
||||
Number = { fg = p.tech },
|
||||
Boolean = { fg = p.tech },
|
||||
Float = { fg = p.tech },
|
||||
|
||||
Identifier = { fg = p.text }, -- Variables (White)
|
||||
Function = { fg = p.azure }, -- Deep Blue (Structure)
|
||||
|
||||
Statement = { fg = p.sacred }, -- Purple (Keywords)
|
||||
Conditional = { fg = p.sacred },
|
||||
Repeat = { fg = p.sacred },
|
||||
Label = { fg = p.sacred },
|
||||
Operator = { fg = p.tech }, -- Cyan (Tech)
|
||||
Keyword = { fg = p.sacred },
|
||||
Exception = { fg = p.razor }, -- Red (Errors)
|
||||
|
||||
PreProc = { fg = p.sacred },
|
||||
Include = { fg = p.sacred },
|
||||
Define = { fg = p.sacred },
|
||||
Macro = { fg = p.sacred },
|
||||
PreCondit = { fg = p.sacred },
|
||||
|
||||
Type = { fg = p.amber }, -- Yellow (Types/Classes)
|
||||
StorageClass = { fg = p.amber },
|
||||
Structure = { fg = p.amber },
|
||||
Typedef = { fg = p.amber },
|
||||
|
||||
Special = { fg = p.tech },
|
||||
SpecialChar = { fg = p.tech },
|
||||
Tag = { fg = p.tech },
|
||||
Delimiter = { fg = p.dim }, -- Subtle delimiters
|
||||
Debug = { fg = p.razor },
|
||||
|
||||
Underlined = { underline = true },
|
||||
Ignore = { fg = p.stealth },
|
||||
Error = { fg = p.alert },
|
||||
Todo = { fg = p.void, bg = p.amber, bold = true },
|
||||
Title = { fg = p.sacred, bold = true },
|
||||
|
||||
MatchParen = { fg = p.void, bg = p.amber, bold = true },
|
||||
Whitespace = { fg = p.border },
|
||||
NonText = { fg = p.border },
|
||||
SpecialKey = { fg = p.border },
|
||||
SpellBad = { sp = p.razor, undercurl = true },
|
||||
SpellCap = { sp = p.amber, undercurl = true },
|
||||
SpellRare = { sp = p.tech, undercurl = true },
|
||||
SpellLocal = { sp = p.dim, undercurl = true },
|
||||
LspReferenceText = { bg = p.panel },
|
||||
LspReferenceRead = { bg = p.panel },
|
||||
LspReferenceWrite = { bg = p.panel, bold = true },
|
||||
LspSignatureActiveParameter = { fg = p.void, bg = p.tech, bold = true },
|
||||
LspInlayHint = { fg = p.dim, bg = p.panel },
|
||||
LspCodeLens = { fg = p.dim },
|
||||
LspCodeLensSeparator = { fg = p.stealth },
|
||||
LspInfoBorder = { fg = p.border, bg = p.panel },
|
||||
LspInfoTitle = { fg = p.dim, bg = p.panel },
|
||||
|
||||
-- DIAGNOSTICS -----------------------------------------------------------
|
||||
DiagnosticError = { fg = p.alert },
|
||||
DiagnosticWarn = { fg = p.amber },
|
||||
DiagnosticInfo = { fg = p.tech },
|
||||
DiagnosticHint = { fg = p.dim },
|
||||
DiagnosticOk = { fg = p.toxic },
|
||||
DiagnosticDeprecated = { fg = p.dim, strikethrough = true },
|
||||
DiagnosticUnnecessary = { fg = p.dim },
|
||||
|
||||
DiagnosticUnderlineError = { undercurl = true, sp = p.razor },
|
||||
DiagnosticUnderlineWarn = { undercurl = true, sp = p.amber },
|
||||
DiagnosticUnderlineInfo = { undercurl = true, sp = p.tech },
|
||||
DiagnosticUnderlineHint = { undercurl = true, sp = p.dim },
|
||||
DiagnosticUnderlineOk = { undercurl = true, sp = p.toxic },
|
||||
DiagnosticVirtualTextError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticVirtualTextWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticVirtualTextInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticVirtualTextHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticVirtualTextOk = { fg = p.toxic, bg = p.panel },
|
||||
DiagnosticVirtualLinesError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticVirtualLinesWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticVirtualLinesInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticVirtualLinesHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticVirtualLinesOk = { fg = p.toxic, bg = p.panel },
|
||||
DiagnosticSignError = { fg = p.alert, bg = p.void },
|
||||
DiagnosticSignWarn = { fg = p.amber, bg = p.void },
|
||||
DiagnosticSignInfo = { fg = p.tech, bg = p.void },
|
||||
DiagnosticSignHint = { fg = p.dim, bg = p.void },
|
||||
DiagnosticSignOk = { fg = p.toxic, bg = p.void },
|
||||
DiagnosticFloatingError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticFloatingWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticFloatingInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticFloatingHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticFloatingOk = { fg = p.toxic, bg = p.panel },
|
||||
ApexMarkupStrong = { bold = true },
|
||||
ApexMarkupItalic = { italic = true },
|
||||
ApexMarkupLink = { fg = p.tech, underline = true },
|
||||
|
||||
-- DIFF ------------------------------------------------------------------
|
||||
DiffAdd = { fg = p.toxic, bg = p.panel },
|
||||
DiffChange = { fg = p.tech, bg = p.panel },
|
||||
DiffDelete = { fg = p.razor, bg = p.panel },
|
||||
DiffText = { fg = p.void, bg = p.tech, bold = true },
|
||||
|
||||
-- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
|
||||
TelescopeNormal = { bg = p.void },
|
||||
TelescopeBorder = { fg = p.razor, bg = p.void }, -- Red Border
|
||||
TelescopePromptNormal = { fg = p.text, bg = p.void },
|
||||
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
|
||||
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
|
||||
TelescopePreviewTitle = { fg = p.ink, bg = p.razor }, -- Red Label
|
||||
TelescopeResultsTitle = { fg = p.void, bg = p.panel },
|
||||
TelescopeSelection = { fg = p.ink, bg = p.razor }, -- Red Selection
|
||||
|
||||
-- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
|
||||
NeoTreeNormal = { bg = p.void },
|
||||
NeoTreeNormalNC = { bg = p.void },
|
||||
NeoTreeVertSplit = { fg = p.panel, bg = p.void },
|
||||
NeoTreeWinSeparator = { fg = p.panel, bg = p.void }, -- Fade out tree border
|
||||
NeoTreeRootName = { fg = p.razor, bold = true }, -- Root is Red
|
||||
NeoTreeGitAdded = { fg = p.toxic },
|
||||
NeoTreeGitConflict = { fg = p.amber },
|
||||
NeoTreeGitDeleted = { fg = p.razor },
|
||||
NeoTreeGitModified = { fg = p.tech },
|
||||
|
||||
-- PLUGINS: GITSIGNS -----------------------------------------------------
|
||||
GitSignsAdd = { fg = p.toxic, bg = p.void },
|
||||
GitSignsChange = { fg = p.tech, bg = p.void },
|
||||
GitSignsDelete = { fg = p.razor, bg = p.void },
|
||||
|
||||
-- PLUGINS: CMP (Completion) ---------------------------------------------
|
||||
CmpItemAbbrDeprecated = { fg = p.dim, strikethrough = true },
|
||||
CmpItemAbbrMatch = { fg = p.tech, bold = true },
|
||||
CmpItemAbbrMatchFuzzy = { fg = p.tech, bold = true },
|
||||
CmpItemKindFunction = { fg = p.azure },
|
||||
CmpItemKindMethod = { fg = p.azure },
|
||||
CmpItemKindKeyword = { fg = p.sacred },
|
||||
CmpItemKindVariable = { fg = p.text },
|
||||
}
|
||||
|
||||
for group, highlight in pairs(groups) do
|
||||
vim.api.nvim_set_hl(0, group, highlight)
|
||||
end
|
||||
|
||||
local links = {
|
||||
["@annotation"] = "Special",
|
||||
["@attribute"] = "Special",
|
||||
["@character"] = "Character",
|
||||
["@comment"] = "Comment",
|
||||
["@constant"] = "Constant",
|
||||
["@constant.builtin"] = "Constant",
|
||||
["@constant.macro"] = "Macro",
|
||||
["@constructor"] = "Type",
|
||||
["@debug"] = "Debug",
|
||||
["@define"] = "Define",
|
||||
["@exception"] = "Exception",
|
||||
["@field"] = "Identifier",
|
||||
["@float"] = "Float",
|
||||
["@function"] = "Function",
|
||||
["@function.builtin"] = "Function",
|
||||
["@function.call"] = "Function",
|
||||
["@function.macro"] = "Macro",
|
||||
["@include"] = "Include",
|
||||
["@keyword"] = "Keyword",
|
||||
["@keyword.function"] = "Keyword",
|
||||
["@keyword.operator"] = "Operator",
|
||||
["@keyword.return"] = "Keyword",
|
||||
["@label"] = "Label",
|
||||
["@method"] = "Function",
|
||||
["@method.call"] = "Function",
|
||||
["@module"] = "Structure",
|
||||
["@namespace"] = "Structure",
|
||||
["@number"] = "Number",
|
||||
["@operator"] = "Operator",
|
||||
["@parameter"] = "Identifier",
|
||||
["@preproc"] = "PreProc",
|
||||
["@property"] = "Identifier",
|
||||
["@punctuation"] = "Delimiter",
|
||||
["@punctuation.bracket"] = "Delimiter",
|
||||
["@punctuation.delimiter"] = "Delimiter",
|
||||
["@punctuation.special"] = "Delimiter",
|
||||
["@repeat"] = "Repeat",
|
||||
["@string"] = "String",
|
||||
["@string.escape"] = "SpecialChar",
|
||||
["@string.regex"] = "SpecialChar",
|
||||
["@string.special"] = "SpecialChar",
|
||||
["@tag"] = "Tag",
|
||||
["@tag.attribute"] = "Identifier",
|
||||
["@tag.delimiter"] = "Delimiter",
|
||||
["@text"] = "Normal",
|
||||
["@text.title"] = "Title",
|
||||
["@markup.heading"] = "Title",
|
||||
["@markup.heading.1"] = "Title",
|
||||
["@markup.heading.2"] = "Title",
|
||||
["@markup.heading.3"] = "Title",
|
||||
["@markup.heading.4"] = "Title",
|
||||
["@markup.heading.5"] = "Title",
|
||||
["@markup.heading.6"] = "Title",
|
||||
["@markup.link"] = "ApexMarkupLink",
|
||||
["@markup.link.label"] = "ApexMarkupLink",
|
||||
["@markup.link.url"] = "ApexMarkupLink",
|
||||
["@markup.strong"] = "ApexMarkupStrong",
|
||||
["@markup.italic"] = "ApexMarkupItalic",
|
||||
["@markup.strikethrough"] = "DiagnosticDeprecated",
|
||||
["@markup.underline"] = "Underlined",
|
||||
["@markup.raw"] = "String",
|
||||
["@markup.raw.block"] = "String",
|
||||
["@markup.raw.delimiter"] = "Delimiter",
|
||||
["@markup.quote"] = "Comment",
|
||||
["@markup.list"] = "Delimiter",
|
||||
["@markup.list.checked"] = "String",
|
||||
["@markup.list.unchecked"] = "Comment",
|
||||
["@markup.math"] = "Constant",
|
||||
["@markup.environment"] = "Type",
|
||||
["@markup.environment.name"] = "Type",
|
||||
["@type"] = "Type",
|
||||
["@type.builtin"] = "Type",
|
||||
["@type.definition"] = "Type",
|
||||
["@type.qualifier"] = "Keyword",
|
||||
["@variable"] = "Identifier",
|
||||
["@variable.builtin"] = "Identifier",
|
||||
|
||||
["@lsp.type.boolean"] = "Boolean",
|
||||
["@lsp.type.builtinType"] = "Type",
|
||||
["@lsp.type.class"] = "Type",
|
||||
["@lsp.type.comment"] = "Comment",
|
||||
["@lsp.type.decorator"] = "Special",
|
||||
["@lsp.type.enum"] = "Type",
|
||||
["@lsp.type.enumMember"] = "Constant",
|
||||
["@lsp.type.event"] = "Type",
|
||||
["@lsp.type.function"] = "Function",
|
||||
["@lsp.type.interface"] = "Type",
|
||||
["@lsp.type.keyword"] = "Keyword",
|
||||
["@lsp.type.macro"] = "Macro",
|
||||
["@lsp.type.method"] = "Function",
|
||||
["@lsp.type.modifier"] = "Keyword",
|
||||
["@lsp.type.namespace"] = "Structure",
|
||||
["@lsp.type.number"] = "Number",
|
||||
["@lsp.type.operator"] = "Operator",
|
||||
["@lsp.type.parameter"] = "Identifier",
|
||||
["@lsp.type.property"] = "Identifier",
|
||||
["@lsp.type.regexp"] = "SpecialChar",
|
||||
["@lsp.type.string"] = "String",
|
||||
["@lsp.type.struct"] = "Structure",
|
||||
["@lsp.type.type"] = "Type",
|
||||
["@lsp.type.typeParameter"] = "Type",
|
||||
["@lsp.type.variable"] = "Identifier",
|
||||
|
||||
["@lsp.mod.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.mod.abstract"] = "Type",
|
||||
["@lsp.mod.declaration"] = "Keyword",
|
||||
["@lsp.mod.defaultLibrary"] = "Constant",
|
||||
["@lsp.mod.definition"] = "Keyword",
|
||||
["@lsp.mod.documentation"] = "Comment",
|
||||
["@lsp.mod.modification"] = "Operator",
|
||||
["@lsp.mod.readonly"] = "Constant",
|
||||
["@lsp.mod.static"] = "Constant",
|
||||
["@lsp.mod.async"] = "Keyword",
|
||||
|
||||
["@lsp.typemod.function.async"] = "Keyword",
|
||||
["@lsp.typemod.method.async"] = "Keyword",
|
||||
["@lsp.typemod.function.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.method.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.variable.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.variable.readonly"] = "Constant",
|
||||
["@lsp.typemod.parameter.readonly"] = "Constant",
|
||||
["@lsp.typemod.property.readonly"] = "Constant",
|
||||
["@lsp.typemod.variable.static"] = "Constant",
|
||||
["@lsp.typemod.property.static"] = "Constant",
|
||||
}
|
||||
|
||||
for group, target in pairs(links) do
|
||||
vim.api.nvim_set_hl(0, group, { link = target })
|
||||
end
|
||||
end
|
||||
|
||||
M.load()
|
||||
|
||||
return M
|
||||
381
dist/nvim/colors/apex-neon.lua
vendored
Normal file
381
dist/nvim/colors/apex-neon.lua
vendored
Normal file
@@ -0,0 +1,381 @@
|
||||
-- Apex Neon: Standalone Theme Engine
|
||||
-- Philosophy: State over Decoration. Red is Presence. Cyan is Data.
|
||||
|
||||
local M = {}
|
||||
|
||||
M.palette = {
|
||||
-- The Void
|
||||
void = "#050505", -- Background
|
||||
panel = "#141414", -- Dark Surface (Statusline/Gutter)
|
||||
border = "#262626", -- Muted Border
|
||||
stealth = "#404040", -- Comments / Ignored
|
||||
|
||||
-- The Signal
|
||||
text = "#ededed", -- Stark White
|
||||
dim = "#737373", -- Muted Text
|
||||
|
||||
-- The Hunter (Presence)
|
||||
razor = "#ff0044", -- PRIMARY: Cursor, Current Match, Active Border
|
||||
ink = "#050505", -- Text color on Razor backgrounds
|
||||
alert = "#ff0044", -- Error accent text on void/panel
|
||||
|
||||
-- The HUD (Data)
|
||||
tech = "#00eaff", -- INFO: Selection, Search Match, Constants
|
||||
toxic = "#00ff99", -- SUCCESS: Strings
|
||||
amber = "#ffb700", -- WARNING: Types, Search
|
||||
azure = "#0088cc", -- STRUCT: Functions (Deep Blue)
|
||||
sacred = "#9d00ff", -- SPECIAL: Keywords, Root
|
||||
}
|
||||
|
||||
function M.load()
|
||||
vim.cmd "hi clear"
|
||||
if vim.fn.exists "syntax_on" then vim.cmd "syntax reset" end
|
||||
vim.o.background = "dark"
|
||||
vim.g.colors_name = "apex-neon"
|
||||
|
||||
-- Optional transparency: set g:apex_blend or g:apex_transparent to opt in.
|
||||
local blend = vim.g.apex_blend
|
||||
if type(blend) == "number" then
|
||||
vim.o.winblend = blend
|
||||
vim.o.pumblend = blend
|
||||
elseif vim.g.apex_transparent == true then
|
||||
vim.o.winblend = 20
|
||||
vim.o.pumblend = 20
|
||||
end
|
||||
|
||||
local p = M.palette
|
||||
local groups = {
|
||||
-- CANVAS & UI -----------------------------------------------------------
|
||||
Normal = { fg = p.text, bg = p.void },
|
||||
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
|
||||
SignColumn = { bg = p.void },
|
||||
FoldColumn = { fg = p.stealth, bg = p.void },
|
||||
VertSplit = { fg = p.border }, -- Deprecated in nvim 0.10, but good fallback
|
||||
WinSeparator = { fg = p.border },
|
||||
EndOfBuffer = { fg = p.void }, -- Hide tildes
|
||||
NormalFloat = { fg = p.text, bg = p.panel },
|
||||
FloatBorder = { fg = p.border, bg = p.panel },
|
||||
MsgArea = { fg = p.text, bg = p.void },
|
||||
WinBar = { fg = p.text, bg = p.panel },
|
||||
WinBarNC = { fg = p.dim, bg = p.panel },
|
||||
|
||||
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
|
||||
Cursor = { fg = p.ink, bg = p.razor }, -- Red Beam
|
||||
TermCursor = { fg = p.ink, bg = p.razor },
|
||||
CursorLine = { bg = p.panel },
|
||||
CursorColumn = { bg = p.panel },
|
||||
ColorColumn = { bg = p.panel },
|
||||
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
|
||||
LineNr = { fg = p.stealth }, -- Other lines fade out
|
||||
|
||||
-- SELECTION & SEARCH ("Terminator Vision") ------------------------------
|
||||
Visual = { fg = p.void, bg = p.tech, bold = true }, -- Cyan (Data Lock)
|
||||
VisualNOS = { fg = p.void, bg = p.border },
|
||||
|
||||
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
|
||||
IncSearch = { fg = p.ink, bg = p.razor }, -- Red (Acquiring...)
|
||||
CurSearch = { fg = p.ink, bg = p.razor, bold = true }, -- Red (Target Locked)
|
||||
|
||||
-- STATUS & MESSAGES -----------------------------------------------------
|
||||
StatusLine = { fg = p.text, bg = p.panel },
|
||||
StatusLineNC = { fg = p.dim, bg = p.void },
|
||||
WildMenu = { fg = p.void, bg = p.tech },
|
||||
Pmenu = { fg = p.text, bg = p.panel },
|
||||
PmenuSel = { fg = p.ink, bg = p.razor, bold = true }, -- Red Menu Selection
|
||||
PmenuKind = { fg = p.dim, bg = p.panel },
|
||||
PmenuKindSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuExtra = { fg = p.dim, bg = p.panel },
|
||||
PmenuExtraSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuMatch = { fg = p.tech, bg = p.panel, bold = true },
|
||||
PmenuMatchSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuSbar = { bg = p.panel },
|
||||
PmenuThumb = { bg = p.stealth },
|
||||
ErrorMsg = { fg = p.alert },
|
||||
WarningMsg = { fg = p.amber },
|
||||
MoreMsg = { fg = p.tech },
|
||||
ModeMsg = { fg = p.text },
|
||||
TabLine = { fg = p.dim, bg = p.panel },
|
||||
TabLineSel = { fg = p.text, bg = p.void, bold = true },
|
||||
TabLineFill = { fg = p.panel, bg = p.panel },
|
||||
QuickFixLine = { fg = p.text, bg = p.panel, bold = true },
|
||||
|
||||
-- SYNTAX HIGHLIGHTING ---------------------------------------------------
|
||||
Comment = { fg = p.stealth, italic = true },
|
||||
Constant = { fg = p.tech }, -- Cyan (Digital values)
|
||||
String = { fg = p.toxic }, -- Green (Organic strings)
|
||||
Character = { fg = p.toxic },
|
||||
Number = { fg = p.tech },
|
||||
Boolean = { fg = p.tech },
|
||||
Float = { fg = p.tech },
|
||||
|
||||
Identifier = { fg = p.text }, -- Variables (White)
|
||||
Function = { fg = p.azure }, -- Deep Blue (Structure)
|
||||
|
||||
Statement = { fg = p.sacred }, -- Purple (Keywords)
|
||||
Conditional = { fg = p.sacred },
|
||||
Repeat = { fg = p.sacred },
|
||||
Label = { fg = p.sacred },
|
||||
Operator = { fg = p.tech }, -- Cyan (Tech)
|
||||
Keyword = { fg = p.sacred },
|
||||
Exception = { fg = p.razor }, -- Red (Errors)
|
||||
|
||||
PreProc = { fg = p.sacred },
|
||||
Include = { fg = p.sacred },
|
||||
Define = { fg = p.sacred },
|
||||
Macro = { fg = p.sacred },
|
||||
PreCondit = { fg = p.sacred },
|
||||
|
||||
Type = { fg = p.amber }, -- Yellow (Types/Classes)
|
||||
StorageClass = { fg = p.amber },
|
||||
Structure = { fg = p.amber },
|
||||
Typedef = { fg = p.amber },
|
||||
|
||||
Special = { fg = p.tech },
|
||||
SpecialChar = { fg = p.tech },
|
||||
Tag = { fg = p.tech },
|
||||
Delimiter = { fg = p.dim }, -- Subtle delimiters
|
||||
Debug = { fg = p.razor },
|
||||
|
||||
Underlined = { underline = true },
|
||||
Ignore = { fg = p.stealth },
|
||||
Error = { fg = p.alert },
|
||||
Todo = { fg = p.void, bg = p.amber, bold = true },
|
||||
Title = { fg = p.sacred, bold = true },
|
||||
|
||||
MatchParen = { fg = p.void, bg = p.amber, bold = true },
|
||||
Whitespace = { fg = p.border },
|
||||
NonText = { fg = p.border },
|
||||
SpecialKey = { fg = p.border },
|
||||
SpellBad = { sp = p.razor, undercurl = true },
|
||||
SpellCap = { sp = p.amber, undercurl = true },
|
||||
SpellRare = { sp = p.tech, undercurl = true },
|
||||
SpellLocal = { sp = p.dim, undercurl = true },
|
||||
LspReferenceText = { bg = p.panel },
|
||||
LspReferenceRead = { bg = p.panel },
|
||||
LspReferenceWrite = { bg = p.panel, bold = true },
|
||||
LspSignatureActiveParameter = { fg = p.void, bg = p.tech, bold = true },
|
||||
LspInlayHint = { fg = p.dim, bg = p.panel },
|
||||
LspCodeLens = { fg = p.dim },
|
||||
LspCodeLensSeparator = { fg = p.stealth },
|
||||
LspInfoBorder = { fg = p.border, bg = p.panel },
|
||||
LspInfoTitle = { fg = p.dim, bg = p.panel },
|
||||
|
||||
-- DIAGNOSTICS -----------------------------------------------------------
|
||||
DiagnosticError = { fg = p.alert },
|
||||
DiagnosticWarn = { fg = p.amber },
|
||||
DiagnosticInfo = { fg = p.tech },
|
||||
DiagnosticHint = { fg = p.dim },
|
||||
DiagnosticOk = { fg = p.toxic },
|
||||
DiagnosticDeprecated = { fg = p.dim, strikethrough = true },
|
||||
DiagnosticUnnecessary = { fg = p.dim },
|
||||
|
||||
DiagnosticUnderlineError = { undercurl = true, sp = p.razor },
|
||||
DiagnosticUnderlineWarn = { undercurl = true, sp = p.amber },
|
||||
DiagnosticUnderlineInfo = { undercurl = true, sp = p.tech },
|
||||
DiagnosticUnderlineHint = { undercurl = true, sp = p.dim },
|
||||
DiagnosticUnderlineOk = { undercurl = true, sp = p.toxic },
|
||||
DiagnosticVirtualTextError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticVirtualTextWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticVirtualTextInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticVirtualTextHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticVirtualTextOk = { fg = p.toxic, bg = p.panel },
|
||||
DiagnosticVirtualLinesError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticVirtualLinesWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticVirtualLinesInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticVirtualLinesHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticVirtualLinesOk = { fg = p.toxic, bg = p.panel },
|
||||
DiagnosticSignError = { fg = p.alert, bg = p.void },
|
||||
DiagnosticSignWarn = { fg = p.amber, bg = p.void },
|
||||
DiagnosticSignInfo = { fg = p.tech, bg = p.void },
|
||||
DiagnosticSignHint = { fg = p.dim, bg = p.void },
|
||||
DiagnosticSignOk = { fg = p.toxic, bg = p.void },
|
||||
DiagnosticFloatingError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticFloatingWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticFloatingInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticFloatingHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticFloatingOk = { fg = p.toxic, bg = p.panel },
|
||||
ApexMarkupStrong = { bold = true },
|
||||
ApexMarkupItalic = { italic = true },
|
||||
ApexMarkupLink = { fg = p.tech, underline = true },
|
||||
|
||||
-- DIFF ------------------------------------------------------------------
|
||||
DiffAdd = { fg = p.toxic, bg = p.panel },
|
||||
DiffChange = { fg = p.tech, bg = p.panel },
|
||||
DiffDelete = { fg = p.razor, bg = p.panel },
|
||||
DiffText = { fg = p.void, bg = p.tech, bold = true },
|
||||
|
||||
-- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
|
||||
TelescopeNormal = { bg = p.void },
|
||||
TelescopeBorder = { fg = p.razor, bg = p.void }, -- Red Border
|
||||
TelescopePromptNormal = { fg = p.text, bg = p.void },
|
||||
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
|
||||
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
|
||||
TelescopePreviewTitle = { fg = p.ink, bg = p.razor }, -- Red Label
|
||||
TelescopeResultsTitle = { fg = p.void, bg = p.panel },
|
||||
TelescopeSelection = { fg = p.ink, bg = p.razor }, -- Red Selection
|
||||
|
||||
-- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
|
||||
NeoTreeNormal = { bg = p.void },
|
||||
NeoTreeNormalNC = { bg = p.void },
|
||||
NeoTreeVertSplit = { fg = p.panel, bg = p.void },
|
||||
NeoTreeWinSeparator = { fg = p.panel, bg = p.void }, -- Fade out tree border
|
||||
NeoTreeRootName = { fg = p.razor, bold = true }, -- Root is Red
|
||||
NeoTreeGitAdded = { fg = p.toxic },
|
||||
NeoTreeGitConflict = { fg = p.amber },
|
||||
NeoTreeGitDeleted = { fg = p.razor },
|
||||
NeoTreeGitModified = { fg = p.tech },
|
||||
|
||||
-- PLUGINS: GITSIGNS -----------------------------------------------------
|
||||
GitSignsAdd = { fg = p.toxic, bg = p.void },
|
||||
GitSignsChange = { fg = p.tech, bg = p.void },
|
||||
GitSignsDelete = { fg = p.razor, bg = p.void },
|
||||
|
||||
-- PLUGINS: CMP (Completion) ---------------------------------------------
|
||||
CmpItemAbbrDeprecated = { fg = p.dim, strikethrough = true },
|
||||
CmpItemAbbrMatch = { fg = p.tech, bold = true },
|
||||
CmpItemAbbrMatchFuzzy = { fg = p.tech, bold = true },
|
||||
CmpItemKindFunction = { fg = p.azure },
|
||||
CmpItemKindMethod = { fg = p.azure },
|
||||
CmpItemKindKeyword = { fg = p.sacred },
|
||||
CmpItemKindVariable = { fg = p.text },
|
||||
}
|
||||
|
||||
for group, highlight in pairs(groups) do
|
||||
vim.api.nvim_set_hl(0, group, highlight)
|
||||
end
|
||||
|
||||
local links = {
|
||||
["@annotation"] = "Special",
|
||||
["@attribute"] = "Special",
|
||||
["@character"] = "Character",
|
||||
["@comment"] = "Comment",
|
||||
["@constant"] = "Constant",
|
||||
["@constant.builtin"] = "Constant",
|
||||
["@constant.macro"] = "Macro",
|
||||
["@constructor"] = "Type",
|
||||
["@debug"] = "Debug",
|
||||
["@define"] = "Define",
|
||||
["@exception"] = "Exception",
|
||||
["@field"] = "Identifier",
|
||||
["@float"] = "Float",
|
||||
["@function"] = "Function",
|
||||
["@function.builtin"] = "Function",
|
||||
["@function.call"] = "Function",
|
||||
["@function.macro"] = "Macro",
|
||||
["@include"] = "Include",
|
||||
["@keyword"] = "Keyword",
|
||||
["@keyword.function"] = "Keyword",
|
||||
["@keyword.operator"] = "Operator",
|
||||
["@keyword.return"] = "Keyword",
|
||||
["@label"] = "Label",
|
||||
["@method"] = "Function",
|
||||
["@method.call"] = "Function",
|
||||
["@module"] = "Structure",
|
||||
["@namespace"] = "Structure",
|
||||
["@number"] = "Number",
|
||||
["@operator"] = "Operator",
|
||||
["@parameter"] = "Identifier",
|
||||
["@preproc"] = "PreProc",
|
||||
["@property"] = "Identifier",
|
||||
["@punctuation"] = "Delimiter",
|
||||
["@punctuation.bracket"] = "Delimiter",
|
||||
["@punctuation.delimiter"] = "Delimiter",
|
||||
["@punctuation.special"] = "Delimiter",
|
||||
["@repeat"] = "Repeat",
|
||||
["@string"] = "String",
|
||||
["@string.escape"] = "SpecialChar",
|
||||
["@string.regex"] = "SpecialChar",
|
||||
["@string.special"] = "SpecialChar",
|
||||
["@tag"] = "Tag",
|
||||
["@tag.attribute"] = "Identifier",
|
||||
["@tag.delimiter"] = "Delimiter",
|
||||
["@text"] = "Normal",
|
||||
["@text.title"] = "Title",
|
||||
["@markup.heading"] = "Title",
|
||||
["@markup.heading.1"] = "Title",
|
||||
["@markup.heading.2"] = "Title",
|
||||
["@markup.heading.3"] = "Title",
|
||||
["@markup.heading.4"] = "Title",
|
||||
["@markup.heading.5"] = "Title",
|
||||
["@markup.heading.6"] = "Title",
|
||||
["@markup.link"] = "ApexMarkupLink",
|
||||
["@markup.link.label"] = "ApexMarkupLink",
|
||||
["@markup.link.url"] = "ApexMarkupLink",
|
||||
["@markup.strong"] = "ApexMarkupStrong",
|
||||
["@markup.italic"] = "ApexMarkupItalic",
|
||||
["@markup.strikethrough"] = "DiagnosticDeprecated",
|
||||
["@markup.underline"] = "Underlined",
|
||||
["@markup.raw"] = "String",
|
||||
["@markup.raw.block"] = "String",
|
||||
["@markup.raw.delimiter"] = "Delimiter",
|
||||
["@markup.quote"] = "Comment",
|
||||
["@markup.list"] = "Delimiter",
|
||||
["@markup.list.checked"] = "String",
|
||||
["@markup.list.unchecked"] = "Comment",
|
||||
["@markup.math"] = "Constant",
|
||||
["@markup.environment"] = "Type",
|
||||
["@markup.environment.name"] = "Type",
|
||||
["@type"] = "Type",
|
||||
["@type.builtin"] = "Type",
|
||||
["@type.definition"] = "Type",
|
||||
["@type.qualifier"] = "Keyword",
|
||||
["@variable"] = "Identifier",
|
||||
["@variable.builtin"] = "Identifier",
|
||||
|
||||
["@lsp.type.boolean"] = "Boolean",
|
||||
["@lsp.type.builtinType"] = "Type",
|
||||
["@lsp.type.class"] = "Type",
|
||||
["@lsp.type.comment"] = "Comment",
|
||||
["@lsp.type.decorator"] = "Special",
|
||||
["@lsp.type.enum"] = "Type",
|
||||
["@lsp.type.enumMember"] = "Constant",
|
||||
["@lsp.type.event"] = "Type",
|
||||
["@lsp.type.function"] = "Function",
|
||||
["@lsp.type.interface"] = "Type",
|
||||
["@lsp.type.keyword"] = "Keyword",
|
||||
["@lsp.type.macro"] = "Macro",
|
||||
["@lsp.type.method"] = "Function",
|
||||
["@lsp.type.modifier"] = "Keyword",
|
||||
["@lsp.type.namespace"] = "Structure",
|
||||
["@lsp.type.number"] = "Number",
|
||||
["@lsp.type.operator"] = "Operator",
|
||||
["@lsp.type.parameter"] = "Identifier",
|
||||
["@lsp.type.property"] = "Identifier",
|
||||
["@lsp.type.regexp"] = "SpecialChar",
|
||||
["@lsp.type.string"] = "String",
|
||||
["@lsp.type.struct"] = "Structure",
|
||||
["@lsp.type.type"] = "Type",
|
||||
["@lsp.type.typeParameter"] = "Type",
|
||||
["@lsp.type.variable"] = "Identifier",
|
||||
|
||||
["@lsp.mod.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.mod.abstract"] = "Type",
|
||||
["@lsp.mod.declaration"] = "Keyword",
|
||||
["@lsp.mod.defaultLibrary"] = "Constant",
|
||||
["@lsp.mod.definition"] = "Keyword",
|
||||
["@lsp.mod.documentation"] = "Comment",
|
||||
["@lsp.mod.modification"] = "Operator",
|
||||
["@lsp.mod.readonly"] = "Constant",
|
||||
["@lsp.mod.static"] = "Constant",
|
||||
["@lsp.mod.async"] = "Keyword",
|
||||
|
||||
["@lsp.typemod.function.async"] = "Keyword",
|
||||
["@lsp.typemod.method.async"] = "Keyword",
|
||||
["@lsp.typemod.function.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.method.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.variable.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.variable.readonly"] = "Constant",
|
||||
["@lsp.typemod.parameter.readonly"] = "Constant",
|
||||
["@lsp.typemod.property.readonly"] = "Constant",
|
||||
["@lsp.typemod.variable.static"] = "Constant",
|
||||
["@lsp.typemod.property.static"] = "Constant",
|
||||
}
|
||||
|
||||
for group, target in pairs(links) do
|
||||
vim.api.nvim_set_hl(0, group, { link = target })
|
||||
end
|
||||
end
|
||||
|
||||
M.load()
|
||||
|
||||
return M
|
||||
171
dist/owlry/apex-aeon.css
vendored
Normal file
171
dist/owlry/apex-aeon.css
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
|
||||
|
||||
/*
|
||||
* Owlry - Apex Aeon 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 = "apex-aeon" in config.toml
|
||||
*/
|
||||
|
||||
:root {
|
||||
/* Core surfaces */
|
||||
--owlry-bg: #f5f5f5;
|
||||
--owlry-bg-secondary: #e8e8e8;
|
||||
--owlry-border: #737373;
|
||||
--owlry-text: #0a0a0a;
|
||||
--owlry-text-secondary: #737373;
|
||||
|
||||
/* The Predator - primary accent */
|
||||
--owlry-accent: #ff0044;
|
||||
--owlry-accent-bright: #ff4d6d;
|
||||
|
||||
/* Provider badges - mapped to Apex semantics */
|
||||
--owlry-badge-app: #007a88; /* Cyan: apps are informational */
|
||||
--owlry-badge-bookmark: #d18f00; /* Yellow: bookmarks need attention */
|
||||
--owlry-badge-calc: #ffbf40; /* Bright Yellow: calculator results */
|
||||
--owlry-badge-clip: #7a3cff; /* Purple: clipboard is special */
|
||||
--owlry-badge-cmd: #7a3cff; /* Purple: commands are elevated */
|
||||
--owlry-badge-dmenu: #00b377; /* Green: dmenu is success/pipe */
|
||||
--owlry-badge-emoji: #a680ff; /* Bright Purple: emoji is special */
|
||||
--owlry-badge-file: #33bccc; /* Bright Cyan: file search is active info */
|
||||
--owlry-badge-script: #33d6a6; /* Bright Green: scripts execute successfully */
|
||||
--owlry-badge-ssh: #007a88; /* Cyan: SSH is technical/info */
|
||||
--owlry-badge-sys: #ff0044; /* Red: system actions are critical */
|
||||
--owlry-badge-uuctl: #d18f00; /* Yellow: uuctl requires attention */
|
||||
--owlry-badge-web: #007a88; /* Cyan: web is informational */
|
||||
|
||||
/* Widget badges */
|
||||
--owlry-badge-media: #a680ff; /* Bright Purple: media is special */
|
||||
--owlry-badge-weather: #33bccc; /* Bright Cyan: weather is active info */
|
||||
--owlry-badge-pomo: #ff4d6d; /* Alert Red: pomodoro demands attention */
|
||||
}
|
||||
|
||||
.owlry-main {
|
||||
background-color: rgba(245, 245, 245, 0.98);
|
||||
border: 1px solid rgba(115, 115, 115, 0.8);
|
||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8),
|
||||
0 0 0 1px rgba(255, 0, 68, 0.1);
|
||||
}
|
||||
|
||||
.owlry-search {
|
||||
background-color: rgba(232, 232, 232, 0.9);
|
||||
border: 2px solid rgba(115, 115, 115, 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(255, 0, 68, 0.3);
|
||||
}
|
||||
|
||||
.owlry-result-row:hover {
|
||||
background-color: rgba(232, 232, 232, 0.8);
|
||||
}
|
||||
|
||||
.owlry-result-row:selected {
|
||||
background-color: rgba(255, 0, 68, 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(0, 122, 136, 0.15);
|
||||
color: var(--owlry-badge-app);
|
||||
}
|
||||
|
||||
.owlry-badge-bookmark {
|
||||
background-color: rgba(209, 143, 0, 0.15);
|
||||
color: var(--owlry-badge-bookmark);
|
||||
}
|
||||
|
||||
.owlry-badge-calc {
|
||||
background-color: rgba(255, 191, 64, 0.15);
|
||||
color: var(--owlry-badge-calc);
|
||||
}
|
||||
|
||||
.owlry-badge-clip {
|
||||
background-color: rgba(122, 60, 255, 0.15);
|
||||
color: var(--owlry-badge-clip);
|
||||
}
|
||||
|
||||
.owlry-badge-cmd {
|
||||
background-color: rgba(122, 60, 255, 0.15);
|
||||
color: var(--owlry-badge-cmd);
|
||||
}
|
||||
|
||||
.owlry-badge-dmenu {
|
||||
background-color: rgba(0, 179, 119, 0.15);
|
||||
color: var(--owlry-badge-dmenu);
|
||||
}
|
||||
|
||||
.owlry-badge-emoji {
|
||||
background-color: rgba(166, 128, 255, 0.15);
|
||||
color: var(--owlry-badge-emoji);
|
||||
}
|
||||
|
||||
.owlry-badge-file {
|
||||
background-color: rgba(51, 188, 204, 0.15);
|
||||
color: var(--owlry-badge-file);
|
||||
}
|
||||
|
||||
.owlry-badge-script {
|
||||
background-color: rgba(51, 214, 166, 0.15);
|
||||
color: var(--owlry-badge-script);
|
||||
}
|
||||
|
||||
.owlry-badge-ssh {
|
||||
background-color: rgba(0, 122, 136, 0.15);
|
||||
color: var(--owlry-badge-ssh);
|
||||
}
|
||||
|
||||
.owlry-badge-sys {
|
||||
background-color: rgba(255, 0, 68, 0.15);
|
||||
color: var(--owlry-badge-sys);
|
||||
}
|
||||
|
||||
.owlry-badge-uuctl {
|
||||
background-color: rgba(209, 143, 0, 0.15);
|
||||
color: var(--owlry-badge-uuctl);
|
||||
}
|
||||
|
||||
.owlry-badge-web {
|
||||
background-color: rgba(0, 122, 136, 0.15);
|
||||
color: var(--owlry-badge-web);
|
||||
}
|
||||
|
||||
/* Widget badges */
|
||||
.owlry-badge-media {
|
||||
background-color: rgba(166, 128, 255, 0.15);
|
||||
color: var(--owlry-badge-media);
|
||||
}
|
||||
|
||||
.owlry-badge-weather {
|
||||
background-color: rgba(51, 188, 204, 0.15);
|
||||
color: var(--owlry-badge-weather);
|
||||
}
|
||||
|
||||
.owlry-badge-pomo {
|
||||
background-color: rgba(255, 77, 109, 0.15);
|
||||
color: var(--owlry-badge-pomo);
|
||||
}
|
||||
|
||||
/* Filter button - default uses The Predator */
|
||||
.owlry-filter-button:checked {
|
||||
background-color: rgba(255, 0, 68, 0.2);
|
||||
color: var(--owlry-accent);
|
||||
border-color: rgba(255, 0, 68, 0.5);
|
||||
}
|
||||
171
dist/owlry/apex-neon.css
vendored
Normal file
171
dist/owlry/apex-neon.css
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
|
||||
|
||||
/*
|
||||
* Owlry - Apex Neon 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 = "apex-neon" in config.toml
|
||||
*/
|
||||
|
||||
:root {
|
||||
/* Core surfaces */
|
||||
--owlry-bg: #050505;
|
||||
--owlry-bg-secondary: #141414;
|
||||
--owlry-border: #262626;
|
||||
--owlry-text: #ededed;
|
||||
--owlry-text-secondary: #737373;
|
||||
|
||||
/* The Predator - primary accent */
|
||||
--owlry-accent: #ff0044;
|
||||
--owlry-accent-bright: #ff8899;
|
||||
|
||||
/* Provider badges - mapped to Apex semantics */
|
||||
--owlry-badge-app: #00eaff; /* Cyan: apps are informational */
|
||||
--owlry-badge-bookmark: #ffb700; /* Yellow: bookmarks need attention */
|
||||
--owlry-badge-calc: #ffd24d; /* Bright Yellow: calculator results */
|
||||
--owlry-badge-clip: #9d00ff; /* Purple: clipboard is special */
|
||||
--owlry-badge-cmd: #9d00ff; /* Purple: commands are elevated */
|
||||
--owlry-badge-dmenu: #00ff99; /* Green: dmenu is success/pipe */
|
||||
--owlry-badge-emoji: #c84dff; /* Bright Purple: emoji is special */
|
||||
--owlry-badge-file: #5af3ff; /* Bright Cyan: file search is active info */
|
||||
--owlry-badge-script: #2bffb2; /* Bright Green: scripts execute successfully */
|
||||
--owlry-badge-ssh: #00eaff; /* Cyan: SSH is technical/info */
|
||||
--owlry-badge-sys: #ff0044; /* Red: system actions are critical */
|
||||
--owlry-badge-uuctl: #ffb700; /* Yellow: uuctl requires attention */
|
||||
--owlry-badge-web: #00eaff; /* Cyan: web is informational */
|
||||
|
||||
/* Widget badges */
|
||||
--owlry-badge-media: #c84dff; /* Bright Purple: media is special */
|
||||
--owlry-badge-weather: #5af3ff; /* Bright Cyan: weather is active info */
|
||||
--owlry-badge-pomo: #ff8899; /* Alert Red: pomodoro demands attention */
|
||||
}
|
||||
|
||||
.owlry-main {
|
||||
background-color: rgba(5, 5, 5, 0.98);
|
||||
border: 1px solid rgba(38, 38, 38, 0.8);
|
||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8),
|
||||
0 0 0 1px rgba(255, 0, 68, 0.1);
|
||||
}
|
||||
|
||||
.owlry-search {
|
||||
background-color: rgba(20, 20, 20, 0.9);
|
||||
border: 2px solid rgba(38, 38, 38, 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(255, 0, 68, 0.3);
|
||||
}
|
||||
|
||||
.owlry-result-row:hover {
|
||||
background-color: rgba(20, 20, 20, 0.8);
|
||||
}
|
||||
|
||||
.owlry-result-row:selected {
|
||||
background-color: rgba(255, 0, 68, 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(0, 234, 255, 0.15);
|
||||
color: var(--owlry-badge-app);
|
||||
}
|
||||
|
||||
.owlry-badge-bookmark {
|
||||
background-color: rgba(255, 183, 0, 0.15);
|
||||
color: var(--owlry-badge-bookmark);
|
||||
}
|
||||
|
||||
.owlry-badge-calc {
|
||||
background-color: rgba(255, 210, 77, 0.15);
|
||||
color: var(--owlry-badge-calc);
|
||||
}
|
||||
|
||||
.owlry-badge-clip {
|
||||
background-color: rgba(157, 0, 255, 0.15);
|
||||
color: var(--owlry-badge-clip);
|
||||
}
|
||||
|
||||
.owlry-badge-cmd {
|
||||
background-color: rgba(157, 0, 255, 0.15);
|
||||
color: var(--owlry-badge-cmd);
|
||||
}
|
||||
|
||||
.owlry-badge-dmenu {
|
||||
background-color: rgba(0, 255, 153, 0.15);
|
||||
color: var(--owlry-badge-dmenu);
|
||||
}
|
||||
|
||||
.owlry-badge-emoji {
|
||||
background-color: rgba(200, 77, 255, 0.15);
|
||||
color: var(--owlry-badge-emoji);
|
||||
}
|
||||
|
||||
.owlry-badge-file {
|
||||
background-color: rgba(90, 243, 255, 0.15);
|
||||
color: var(--owlry-badge-file);
|
||||
}
|
||||
|
||||
.owlry-badge-script {
|
||||
background-color: rgba(43, 255, 178, 0.15);
|
||||
color: var(--owlry-badge-script);
|
||||
}
|
||||
|
||||
.owlry-badge-ssh {
|
||||
background-color: rgba(0, 234, 255, 0.15);
|
||||
color: var(--owlry-badge-ssh);
|
||||
}
|
||||
|
||||
.owlry-badge-sys {
|
||||
background-color: rgba(255, 0, 68, 0.15);
|
||||
color: var(--owlry-badge-sys);
|
||||
}
|
||||
|
||||
.owlry-badge-uuctl {
|
||||
background-color: rgba(255, 183, 0, 0.15);
|
||||
color: var(--owlry-badge-uuctl);
|
||||
}
|
||||
|
||||
.owlry-badge-web {
|
||||
background-color: rgba(0, 234, 255, 0.15);
|
||||
color: var(--owlry-badge-web);
|
||||
}
|
||||
|
||||
/* Widget badges */
|
||||
.owlry-badge-media {
|
||||
background-color: rgba(200, 77, 255, 0.15);
|
||||
color: var(--owlry-badge-media);
|
||||
}
|
||||
|
||||
.owlry-badge-weather {
|
||||
background-color: rgba(90, 243, 255, 0.15);
|
||||
color: var(--owlry-badge-weather);
|
||||
}
|
||||
|
||||
.owlry-badge-pomo {
|
||||
background-color: rgba(255, 136, 153, 0.15);
|
||||
color: var(--owlry-badge-pomo);
|
||||
}
|
||||
|
||||
/* Filter button - default uses The Predator */
|
||||
.owlry-filter-button:checked {
|
||||
background-color: rgba(255, 0, 68, 0.2);
|
||||
color: var(--owlry-accent);
|
||||
border-color: rgba(255, 0, 68, 0.5);
|
||||
}
|
||||
126
dist/sherlock/apex-aeon.css
vendored
Normal file
126
dist/sherlock/apex-aeon.css
vendored
Normal file
@@ -0,0 +1,126 @@
|
||||
|
||||
/* Apex Aeon - Sherlock Theme (Parser Compliant) */
|
||||
|
||||
/* 1. PALETTE DEFINITIONS */
|
||||
@define-color apex_base #f5f5f5;
|
||||
@define-color apex_surface #e8e8e8;
|
||||
@define-color apex_overlay #737373;
|
||||
@define-color apex_muted #a0a0a0;
|
||||
@define-color apex_text #0a0a0a;
|
||||
@define-color apex_love #ff0044;
|
||||
@define-color apex_foam #007a88;
|
||||
@define-color apex_gold #d18f00;
|
||||
|
||||
/* 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(255, 0, 68, 0.2);
|
||||
}
|
||||
|
||||
entry selection {
|
||||
background-color: @apex_foam;
|
||||
color: #0a0a0a;
|
||||
}
|
||||
|
||||
/* 3. LIST & SELECTION */
|
||||
listview {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/* The actual row selection - Informational */
|
||||
listview > row:selected {
|
||||
background-color: @apex_foam;
|
||||
color: #0a0a0a;
|
||||
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: #0a0a0a;
|
||||
}
|
||||
|
||||
/* Force TEXT on selection */
|
||||
listview > row:selected label,
|
||||
listview > row:selected .title,
|
||||
listview > row:selected .description,
|
||||
listview > row:selected .subtitle {
|
||||
color: #0a0a0a;
|
||||
}
|
||||
|
||||
/* Force ICONS on selection */
|
||||
listview > row:selected image,
|
||||
listview > row:selected .icon {
|
||||
color: #0a0a0a;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
126
dist/sherlock/apex-neon.css
vendored
Normal file
126
dist/sherlock/apex-neon.css
vendored
Normal file
@@ -0,0 +1,126 @@
|
||||
|
||||
/* Apex Neon - Sherlock Theme (Parser Compliant) */
|
||||
|
||||
/* 1. PALETTE DEFINITIONS */
|
||||
@define-color apex_base #050505;
|
||||
@define-color apex_surface #141414;
|
||||
@define-color apex_overlay #262626;
|
||||
@define-color apex_muted #404040;
|
||||
@define-color apex_text #ededed;
|
||||
@define-color apex_love #ff0044;
|
||||
@define-color apex_foam #00eaff;
|
||||
@define-color apex_gold #ffb700;
|
||||
|
||||
/* 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(255, 0, 68, 0.2);
|
||||
}
|
||||
|
||||
entry selection {
|
||||
background-color: @apex_foam;
|
||||
color: #050505;
|
||||
}
|
||||
|
||||
/* 3. LIST & SELECTION */
|
||||
listview {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/* The actual row selection - Informational */
|
||||
listview > row:selected {
|
||||
background-color: @apex_foam;
|
||||
color: #050505;
|
||||
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: #050505;
|
||||
}
|
||||
|
||||
/* Force TEXT on selection */
|
||||
listview > row:selected label,
|
||||
listview > row:selected .title,
|
||||
listview > row:selected .description,
|
||||
listview > row:selected .subtitle {
|
||||
color: #050505;
|
||||
}
|
||||
|
||||
/* Force ICONS on selection */
|
||||
listview > row:selected image,
|
||||
listview > row:selected .icon {
|
||||
color: #050505;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
17
dist/spicetify/apex-aeon-color.ini
vendored
Normal file
17
dist/spicetify/apex-aeon-color.ini
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
[apex-aeon]
|
||||
text = 0a0a0a
|
||||
subtext = a0a0a0
|
||||
main = f5f5f5
|
||||
sidebar = f5f5f5
|
||||
player = f5f5f5
|
||||
card = e8e8e8
|
||||
shadow = 000000
|
||||
selected-row = 007a88
|
||||
button = 007a88
|
||||
button-active = ff0044
|
||||
button-disabled = a0a0a0
|
||||
tab-active = 737373
|
||||
notification = 007a88
|
||||
notification-error = ff0044
|
||||
misc = d18f00
|
||||
1
dist/spicetify/apex-aeon-user.css
vendored
Normal file
1
dist/spicetify/apex-aeon-user.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/* Apex Aeon - Spicetify overrides */
|
||||
17
dist/spicetify/apex-neon-color.ini
vendored
Normal file
17
dist/spicetify/apex-neon-color.ini
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
[apex-neon]
|
||||
text = ededed
|
||||
subtext = 404040
|
||||
main = 050505
|
||||
sidebar = 050505
|
||||
player = 050505
|
||||
card = 141414
|
||||
shadow = 000000
|
||||
selected-row = 00eaff
|
||||
button = 00eaff
|
||||
button-active = ff0044
|
||||
button-disabled = 404040
|
||||
tab-active = 262626
|
||||
notification = 00eaff
|
||||
notification-error = ff0044
|
||||
misc = ffb700
|
||||
1
dist/spicetify/apex-neon-user.css
vendored
Normal file
1
dist/spicetify/apex-neon-user.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/* Apex Neon - Spicetify overrides */
|
||||
146
dist/swaync/apex-aeon-style.css
vendored
Normal file
146
dist/swaync/apex-aeon-style.css
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
/* Apex Aeon — SwayNC Theme */
|
||||
/* DNA: State over Decoration */
|
||||
|
||||
@define-color void #f5f5f5;
|
||||
@define-color stark #0a0a0a;
|
||||
@define-color razor #ff0044;
|
||||
@define-color tech #007a88;
|
||||
@define-color toxic #00b377;
|
||||
@define-color amber #d18f00;
|
||||
@define-color alert #ff4d6d;
|
||||
|
||||
@define-color panel #e8e8e8;
|
||||
@define-color border #737373;
|
||||
@define-color stealth #a0a0a0;
|
||||
@define-color dim #737373;
|
||||
|
||||
/* SwayNC Specific Variables */
|
||||
@define-color noti-bg @panel;
|
||||
@define-color noti-fg @stark;
|
||||
@define-color noti-border-color @border;
|
||||
@define-color noti-bg-hover @border;
|
||||
@define-color noti-bg-focus @border;
|
||||
@define-color noti-bg-critical @razor;
|
||||
@define-color noti-fg-critical @void;
|
||||
|
||||
@define-color mpris-bg @panel;
|
||||
@define-color mpris-fg @stark;
|
||||
|
||||
@define-color bg-selected @razor;
|
||||
@define-color fg-selected @void;
|
||||
|
||||
/* Base Structure */
|
||||
* {
|
||||
font-family: "JetBrainsMono Nerd Font";
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.control-center {
|
||||
background: @void;
|
||||
border: 2px solid @razor;
|
||||
border-radius: 0;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.control-center-list {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.notification {
|
||||
background: @noti-bg;
|
||||
border: 1px solid @noti-border-color;
|
||||
border-radius: 0;
|
||||
margin: 5px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.notification-content {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.notification-default-action:hover {
|
||||
background: @noti-bg-hover;
|
||||
}
|
||||
|
||||
.notification-critical {
|
||||
background: @noti-bg-critical;
|
||||
color: @noti-fg-critical;
|
||||
}
|
||||
|
||||
.notification-critical .notification-content {
|
||||
color: @noti-fg-critical;
|
||||
}
|
||||
|
||||
.notification-group {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.notification-group-headers {
|
||||
color: @dim;
|
||||
}
|
||||
|
||||
.notification-group-icon {
|
||||
color: @razor;
|
||||
}
|
||||
|
||||
.mpris {
|
||||
background: @mpris-bg;
|
||||
border: 1px solid @border;
|
||||
border-radius: 0;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.mpris-title {
|
||||
color: @stark;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mpris-subtitle {
|
||||
color: @dim;
|
||||
}
|
||||
|
||||
.widget-title {
|
||||
color: @razor;
|
||||
font-weight: bold;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.widget-label {
|
||||
color: @stark;
|
||||
}
|
||||
|
||||
.widget-dnd {
|
||||
color: @tech;
|
||||
}
|
||||
|
||||
.widget-mpris {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.widget-buttons-grid {
|
||||
background: @panel;
|
||||
padding: 10px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.widget-buttons-grid > button {
|
||||
background: @void;
|
||||
border: 1px solid @border;
|
||||
border-radius: 0;
|
||||
color: @stark;
|
||||
}
|
||||
|
||||
.widget-buttons-grid > button:hover {
|
||||
background: @razor;
|
||||
color: @void;
|
||||
}
|
||||
|
||||
.widget-menubar > button {
|
||||
background: transparent;
|
||||
color: @stark;
|
||||
}
|
||||
|
||||
.widget-menubar > button:hover {
|
||||
background: @razor;
|
||||
color: @void;
|
||||
}
|
||||
146
dist/swaync/apex-neon-style.css
vendored
Normal file
146
dist/swaync/apex-neon-style.css
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
/* Apex Neon — SwayNC Theme */
|
||||
/* DNA: State over Decoration */
|
||||
|
||||
@define-color void #050505;
|
||||
@define-color stark #ededed;
|
||||
@define-color razor #ff0044;
|
||||
@define-color tech #00eaff;
|
||||
@define-color toxic #00ff99;
|
||||
@define-color amber #ffb700;
|
||||
@define-color alert #ff8899;
|
||||
|
||||
@define-color panel #141414;
|
||||
@define-color border #262626;
|
||||
@define-color stealth #404040;
|
||||
@define-color dim #737373;
|
||||
|
||||
/* SwayNC Specific Variables */
|
||||
@define-color noti-bg @panel;
|
||||
@define-color noti-fg @stark;
|
||||
@define-color noti-border-color @border;
|
||||
@define-color noti-bg-hover @border;
|
||||
@define-color noti-bg-focus @border;
|
||||
@define-color noti-bg-critical @razor;
|
||||
@define-color noti-fg-critical @void;
|
||||
|
||||
@define-color mpris-bg @panel;
|
||||
@define-color mpris-fg @stark;
|
||||
|
||||
@define-color bg-selected @razor;
|
||||
@define-color fg-selected @void;
|
||||
|
||||
/* Base Structure */
|
||||
* {
|
||||
font-family: "JetBrainsMono Nerd Font";
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.control-center {
|
||||
background: @void;
|
||||
border: 2px solid @razor;
|
||||
border-radius: 0;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.control-center-list {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.notification {
|
||||
background: @noti-bg;
|
||||
border: 1px solid @noti-border-color;
|
||||
border-radius: 0;
|
||||
margin: 5px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.notification-content {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.notification-default-action:hover {
|
||||
background: @noti-bg-hover;
|
||||
}
|
||||
|
||||
.notification-critical {
|
||||
background: @noti-bg-critical;
|
||||
color: @noti-fg-critical;
|
||||
}
|
||||
|
||||
.notification-critical .notification-content {
|
||||
color: @noti-fg-critical;
|
||||
}
|
||||
|
||||
.notification-group {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.notification-group-headers {
|
||||
color: @dim;
|
||||
}
|
||||
|
||||
.notification-group-icon {
|
||||
color: @razor;
|
||||
}
|
||||
|
||||
.mpris {
|
||||
background: @mpris-bg;
|
||||
border: 1px solid @border;
|
||||
border-radius: 0;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.mpris-title {
|
||||
color: @stark;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mpris-subtitle {
|
||||
color: @dim;
|
||||
}
|
||||
|
||||
.widget-title {
|
||||
color: @razor;
|
||||
font-weight: bold;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.widget-label {
|
||||
color: @stark;
|
||||
}
|
||||
|
||||
.widget-dnd {
|
||||
color: @tech;
|
||||
}
|
||||
|
||||
.widget-mpris {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.widget-buttons-grid {
|
||||
background: @panel;
|
||||
padding: 10px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.widget-buttons-grid > button {
|
||||
background: @void;
|
||||
border: 1px solid @border;
|
||||
border-radius: 0;
|
||||
color: @stark;
|
||||
}
|
||||
|
||||
.widget-buttons-grid > button:hover {
|
||||
background: @razor;
|
||||
color: @void;
|
||||
}
|
||||
|
||||
.widget-menubar > button {
|
||||
background: transparent;
|
||||
color: @stark;
|
||||
}
|
||||
|
||||
.widget-menubar > button:hover {
|
||||
background: @razor;
|
||||
color: @void;
|
||||
}
|
||||
25
dist/waybar/apex-aeon-colors.css
vendored
Normal file
25
dist/waybar/apex-aeon-colors.css
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/* Apex Aeon — Waybar Color Palette */
|
||||
/* DNA: State over Decoration */
|
||||
|
||||
@define-color void #f5f5f5;
|
||||
@define-color stark #0a0a0a;
|
||||
@define-color razor #ff0044;
|
||||
@define-color tech #007a88;
|
||||
@define-color toxic #00b377;
|
||||
@define-color amber #d18f00;
|
||||
@define-color sacred #7a3cff;
|
||||
@define-color alert #ff4d6d;
|
||||
|
||||
@define-color panel #e8e8e8;
|
||||
@define-color border #737373;
|
||||
@define-color stealth #a0a0a0;
|
||||
@define-color dim #737373;
|
||||
|
||||
/* Semantic mappings for easier integration */
|
||||
@define-color background @void;
|
||||
@define-color foreground @stark;
|
||||
@define-color accent @razor;
|
||||
@define-color info @tech;
|
||||
@define-color success @toxic;
|
||||
@define-color warning @amber;
|
||||
@define-color error @alert;
|
||||
25
dist/waybar/apex-neon-colors.css
vendored
Normal file
25
dist/waybar/apex-neon-colors.css
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/* Apex Neon — Waybar Color Palette */
|
||||
/* DNA: State over Decoration */
|
||||
|
||||
@define-color void #050505;
|
||||
@define-color stark #ededed;
|
||||
@define-color razor #ff0044;
|
||||
@define-color tech #00eaff;
|
||||
@define-color toxic #00ff99;
|
||||
@define-color amber #ffb700;
|
||||
@define-color sacred #9d00ff;
|
||||
@define-color alert #ff8899;
|
||||
|
||||
@define-color panel #141414;
|
||||
@define-color border #262626;
|
||||
@define-color stealth #404040;
|
||||
@define-color dim #737373;
|
||||
|
||||
/* Semantic mappings for easier integration */
|
||||
@define-color background @void;
|
||||
@define-color foreground @stark;
|
||||
@define-color accent @razor;
|
||||
@define-color info @tech;
|
||||
@define-color success @toxic;
|
||||
@define-color warning @amber;
|
||||
@define-color error @alert;
|
||||
35
dist/wezterm/apex-aeon.toml
vendored
Normal file
35
dist/wezterm/apex-aeon.toml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# APEX AEON - WezTerm color scheme
|
||||
# Spec-accurate: color = state, not decoration
|
||||
|
||||
[colors]
|
||||
foreground = "#0a0a0a"
|
||||
background = "#f5f5f5"
|
||||
|
||||
cursor_bg = "#ff0044"
|
||||
cursor_border = "#ff0044"
|
||||
cursor_fg = "#0a0a0a"
|
||||
|
||||
selection_bg = "#ff0044"
|
||||
selection_fg = "#0a0a0a"
|
||||
|
||||
ansi = [
|
||||
"#0a0a0a",
|
||||
"#ff0044",
|
||||
"#00b377",
|
||||
"#d18f00",
|
||||
"#007a88",
|
||||
"#7a3cff",
|
||||
"#007a88",
|
||||
"#f5f5f5",
|
||||
]
|
||||
|
||||
brights = [
|
||||
"#737373",
|
||||
"#ff4d6d",
|
||||
"#33d6a6",
|
||||
"#ffbf40",
|
||||
"#33bccc",
|
||||
"#a680ff",
|
||||
"#33bccc",
|
||||
"#ffffff",
|
||||
]
|
||||
35
dist/wezterm/apex-neon.toml
vendored
Normal file
35
dist/wezterm/apex-neon.toml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
# APEX NEON - WezTerm color scheme
|
||||
# Spec-accurate: color = state, not decoration
|
||||
|
||||
[colors]
|
||||
foreground = "#ededed"
|
||||
background = "#050505"
|
||||
|
||||
cursor_bg = "#ff0044"
|
||||
cursor_border = "#ff0044"
|
||||
cursor_fg = "#050505"
|
||||
|
||||
selection_bg = "#ff0044"
|
||||
selection_fg = "#050505"
|
||||
|
||||
ansi = [
|
||||
"#050505",
|
||||
"#ff0044",
|
||||
"#00ff99",
|
||||
"#ffb700",
|
||||
"#00eaff",
|
||||
"#9d00ff",
|
||||
"#00eaff",
|
||||
"#ededed",
|
||||
]
|
||||
|
||||
brights = [
|
||||
"#737373",
|
||||
"#ff8899",
|
||||
"#2bffb2",
|
||||
"#ffd24d",
|
||||
"#5af3ff",
|
||||
"#c84dff",
|
||||
"#5af3ff",
|
||||
"#ffffff",
|
||||
]
|
||||
46
dist/zathura/apex-aeon-zathurarc
vendored
Normal file
46
dist/zathura/apex-aeon-zathurarc
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# Apex Aeon — Zathura Theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
# Core
|
||||
set default-bg "#f5f5f5"
|
||||
set default-fg "#0a0a0a"
|
||||
|
||||
# Status Bar
|
||||
set statusbar-bg "#e8e8e8"
|
||||
set statusbar-fg "#0a0a0a"
|
||||
|
||||
# Input Bar
|
||||
set inputbar-bg "#e8e8e8"
|
||||
set inputbar-fg "#0a0a0a"
|
||||
|
||||
# Completion
|
||||
set completion-bg "#e8e8e8"
|
||||
set completion-fg "#0a0a0a"
|
||||
set completion-group-bg "#737373"
|
||||
set completion-group-fg "#737373"
|
||||
set completion-highlight-bg "#ff0044"
|
||||
set completion-highlight-fg "#0a0a0a"
|
||||
|
||||
# Notifications
|
||||
set notification-bg "#e8e8e8"
|
||||
set notification-fg "#0a0a0a"
|
||||
set notification-error-bg "#ff4d6d"
|
||||
set notification-error-fg "#f5f5f5"
|
||||
set notification-warning-bg "#d18f00"
|
||||
set notification-warning-fg "#f5f5f5"
|
||||
|
||||
# Selection & Highlight
|
||||
set highlight-color "rgba(ff0044, 0.5)"
|
||||
set highlight-active-color "rgba(ff0044, 0.8)"
|
||||
|
||||
# Recolor (Dark Mode for PDFs)
|
||||
# In Neon (Dark), we want dark paper (background) and light ink (foreground).
|
||||
# In Aeon (Light), we want light paper and dark ink (standard).
|
||||
set recolor-lightcolor "#f5f5f5"
|
||||
set recolor-darkcolor "#0a0a0a"
|
||||
|
||||
# Default recolor state
|
||||
# Ideally, only true for dark themes, but Zathura config is static.
|
||||
# Users can toggle with Ctrl+R.
|
||||
set recolor "false"
|
||||
set recolor-keephue "true"
|
||||
46
dist/zathura/apex-neon-zathurarc
vendored
Normal file
46
dist/zathura/apex-neon-zathurarc
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# Apex Neon — Zathura Theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
# Core
|
||||
set default-bg "#050505"
|
||||
set default-fg "#ededed"
|
||||
|
||||
# Status Bar
|
||||
set statusbar-bg "#141414"
|
||||
set statusbar-fg "#ededed"
|
||||
|
||||
# Input Bar
|
||||
set inputbar-bg "#141414"
|
||||
set inputbar-fg "#ededed"
|
||||
|
||||
# Completion
|
||||
set completion-bg "#141414"
|
||||
set completion-fg "#ededed"
|
||||
set completion-group-bg "#262626"
|
||||
set completion-group-fg "#737373"
|
||||
set completion-highlight-bg "#ff0044"
|
||||
set completion-highlight-fg "#050505"
|
||||
|
||||
# Notifications
|
||||
set notification-bg "#141414"
|
||||
set notification-fg "#ededed"
|
||||
set notification-error-bg "#ff8899"
|
||||
set notification-error-fg "#050505"
|
||||
set notification-warning-bg "#ffb700"
|
||||
set notification-warning-fg "#050505"
|
||||
|
||||
# Selection & Highlight
|
||||
set highlight-color "rgba(ff0044, 0.5)"
|
||||
set highlight-active-color "rgba(ff0044, 0.8)"
|
||||
|
||||
# Recolor (Dark Mode for PDFs)
|
||||
# In Neon (Dark), we want dark paper (background) and light ink (foreground).
|
||||
# In Aeon (Light), we want light paper and dark ink (standard).
|
||||
set recolor-lightcolor "#050505"
|
||||
set recolor-darkcolor "#ededed"
|
||||
|
||||
# Default recolor state
|
||||
# Ideally, only true for dark themes, but Zathura config is static.
|
||||
# Users can toggle with Ctrl+R.
|
||||
set recolor "false"
|
||||
set recolor-keephue "true"
|
||||
632
dist/zed/apex.json
vendored
Normal file
632
dist/zed/apex.json
vendored
Normal file
@@ -0,0 +1,632 @@
|
||||
{
|
||||
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
|
||||
"name": "Apex",
|
||||
"author": "S0wlz (Owlibou)",
|
||||
"themes": [
|
||||
|
||||
{
|
||||
"name": "Apex Neon",
|
||||
"appearance": "dark",
|
||||
"style": {
|
||||
"background": "#050505",
|
||||
"background.appearance": "opaque",
|
||||
"surface.background": "#141414",
|
||||
"elevated_surface.background": "#141414",
|
||||
"panel.background": "#141414",
|
||||
"panel.focused_border": "#ff0044",
|
||||
"panel.indent_guide": "#26262666",
|
||||
"panel.indent_guide_active": "#737373aa",
|
||||
"panel.indent_guide_hover": "#737373cc",
|
||||
"tab_bar.background": "#141414",
|
||||
"tab.inactive_background": "#141414",
|
||||
"tab.active_background": "#050505",
|
||||
"title_bar.background": "#050505",
|
||||
"title_bar.inactive_background": "#141414",
|
||||
"toolbar.background": "#141414",
|
||||
"status_bar.background": "#141414",
|
||||
"border": "#262626",
|
||||
"border.variant": "#141414",
|
||||
"border.focused": "#ff0044",
|
||||
"border.selected": "#ff0044",
|
||||
"border.disabled": "#141414",
|
||||
"border.transparent": "transparent",
|
||||
"text": "#ededed",
|
||||
"text.muted": "#737373",
|
||||
"text.placeholder": "#737373",
|
||||
"text.disabled": "#737373",
|
||||
"text.accent": "#00eaff",
|
||||
"icon": "#ededed",
|
||||
"icon.muted": "#737373",
|
||||
"icon.placeholder": "#737373",
|
||||
"icon.disabled": "#737373",
|
||||
"icon.accent": "#00eaff",
|
||||
"accents": [
|
||||
"#ff0044",
|
||||
"#00eaff",
|
||||
"#9d00ff",
|
||||
"#00ff99",
|
||||
"#ffb700"
|
||||
],
|
||||
"element.background": "#141414",
|
||||
"element.hover": "#262626",
|
||||
"element.active": "#262626",
|
||||
"element.selected": "#262626",
|
||||
"element.disabled": "#141414",
|
||||
"ghost_element.background": null,
|
||||
"ghost_element.hover": "#26262666",
|
||||
"ghost_element.active": "#26262688",
|
||||
"ghost_element.selected": "#26262666",
|
||||
"ghost_element.disabled": null,
|
||||
"drop_target.background": "#00eaff22",
|
||||
"editor.background": "#050505",
|
||||
"editor.foreground": "#ededed",
|
||||
"editor.gutter.background": "#050505",
|
||||
"editor.subheader.background": "#141414",
|
||||
"editor.active_line.background": "#141414",
|
||||
"editor.highlighted_line.background": "#141414",
|
||||
"editor.line_number": "#737373",
|
||||
"editor.active_line_number": "#ff0044",
|
||||
"editor.wrap_guide": "#262626",
|
||||
"editor.active_wrap_guide": "#737373",
|
||||
"editor.indent_guide": "#26262666",
|
||||
"editor.indent_guide_active": "#737373aa",
|
||||
"editor.invisible": "#26262688",
|
||||
"editor.document_highlight.read_background": "#00eaff22",
|
||||
"editor.document_highlight.write_background": "#ff004422",
|
||||
"editor.document_highlight.bracket_background": "#26262666",
|
||||
"search.match_background": "#00eaff33",
|
||||
"scrollbar.track.background": "#050505",
|
||||
"scrollbar.track.border": "#050505",
|
||||
"scrollbar.thumb.background": "#262626aa",
|
||||
"scrollbar.thumb.hover_background": "#404040",
|
||||
"scrollbar.thumb.border": "transparent",
|
||||
"pane.focused_border": "#ff0044",
|
||||
"pane_group.border": "#262626",
|
||||
"link_text.hover": "#5af3ff",
|
||||
"success": "#00ff99",
|
||||
"success.background": "#00ff991a",
|
||||
"success.border": "#00ff99",
|
||||
"warning": "#ffb700",
|
||||
"warning.background": "#ffb7001a",
|
||||
"warning.border": "#ffb700",
|
||||
"error": "#ff8899",
|
||||
"error.background": "#ff88991a",
|
||||
"error.border": "#ff8899",
|
||||
"info": "#00eaff",
|
||||
"info.background": "#00eaff1a",
|
||||
"info.border": "#00eaff",
|
||||
"hint": "#0088cc",
|
||||
"hint.background": "#0088cc1a",
|
||||
"hint.border": "#0088cc",
|
||||
"predictive": "#0088cc",
|
||||
"predictive.background": "#0088cc1a",
|
||||
"predictive.border": "#0088cc",
|
||||
"unreachable": "#9d00ff",
|
||||
"unreachable.background": "#9d00ff1a",
|
||||
"unreachable.border": "#9d00ff",
|
||||
"created": "#00ff99",
|
||||
"created.background": "#00ff991a",
|
||||
"created.border": "#00ff99",
|
||||
"modified": "#ffb700",
|
||||
"modified.background": "#ffb7001a",
|
||||
"modified.border": "#ffb700",
|
||||
"deleted": "#ff8899",
|
||||
"deleted.background": "#ff88991a",
|
||||
"deleted.border": "#ff8899",
|
||||
"renamed": "#00eaff",
|
||||
"renamed.background": "#00eaff1a",
|
||||
"renamed.border": "#00eaff",
|
||||
"conflict": "#ff8899",
|
||||
"conflict.background": "#ff88991a",
|
||||
"conflict.border": "#ff8899",
|
||||
"ignored": "#737373",
|
||||
"ignored.background": "#7373731a",
|
||||
"ignored.border": "#262626",
|
||||
"hidden": "#737373",
|
||||
"hidden.background": "#7373731a",
|
||||
"hidden.border": "#262626",
|
||||
"terminal.background": "#050505",
|
||||
"terminal.foreground": "#ededed",
|
||||
"terminal.bright_foreground": "#ffffff",
|
||||
"terminal.dim_foreground": "#737373",
|
||||
"terminal.ansi.background": "#050505",
|
||||
"terminal.ansi.black": "#050505",
|
||||
"terminal.ansi.red": "#ff0044",
|
||||
"terminal.ansi.green": "#00ff99",
|
||||
"terminal.ansi.yellow": "#ffb700",
|
||||
"terminal.ansi.blue": "#00eaff",
|
||||
"terminal.ansi.magenta": "#9d00ff",
|
||||
"terminal.ansi.cyan": "#00eaff",
|
||||
"terminal.ansi.white": "#ededed",
|
||||
"terminal.ansi.bright_black": "#737373",
|
||||
"terminal.ansi.bright_red": "#ff8899",
|
||||
"terminal.ansi.bright_green": "#2bffb2",
|
||||
"terminal.ansi.bright_yellow": "#ffd24d",
|
||||
"terminal.ansi.bright_blue": "#5af3ff",
|
||||
"terminal.ansi.bright_magenta": "#c84dff",
|
||||
"terminal.ansi.bright_cyan": "#5af3ff",
|
||||
"terminal.ansi.bright_white": "#ffffff",
|
||||
"terminal.ansi.dim_black": "#050505",
|
||||
"terminal.ansi.dim_red": "#ff0044",
|
||||
"terminal.ansi.dim_green": "#00ff99",
|
||||
"terminal.ansi.dim_yellow": "#ffb700",
|
||||
"terminal.ansi.dim_blue": "#00eaff",
|
||||
"terminal.ansi.dim_magenta": "#9d00ff",
|
||||
"terminal.ansi.dim_cyan": "#00eaff",
|
||||
"terminal.ansi.dim_white": "#ededed",
|
||||
"players": [
|
||||
{
|
||||
"cursor": "#ff0044",
|
||||
"background": "#ff0044",
|
||||
"selection": "#ff004433"
|
||||
},
|
||||
{
|
||||
"cursor": "#00eaff",
|
||||
"background": "#00eaff",
|
||||
"selection": "#00eaff33"
|
||||
},
|
||||
{
|
||||
"cursor": "#9d00ff",
|
||||
"background": "#9d00ff",
|
||||
"selection": "#9d00ff33"
|
||||
},
|
||||
{
|
||||
"cursor": "#00ff99",
|
||||
"background": "#00ff99",
|
||||
"selection": "#00ff9933"
|
||||
},
|
||||
{
|
||||
"cursor": "#ffb700",
|
||||
"background": "#ffb700",
|
||||
"selection": "#ffb70033"
|
||||
}
|
||||
],
|
||||
"version_control.added": "#00ff99",
|
||||
"version_control.modified": "#ffb700",
|
||||
"version_control.deleted": "#ff8899",
|
||||
"version_control.conflict": "#ff8899",
|
||||
"version_control.renamed": "#00eaff",
|
||||
"version_control.ignored": "#737373",
|
||||
"syntax": {
|
||||
"comment": {
|
||||
"color": "#737373",
|
||||
"font_style": "italic"
|
||||
},
|
||||
"comment.doc": {
|
||||
"color": "#737373",
|
||||
"font_style": "italic"
|
||||
},
|
||||
"keyword": {
|
||||
"color": "#00eaff"
|
||||
},
|
||||
"keyword.import": {
|
||||
"color": "#00eaff"
|
||||
},
|
||||
"keyword.storage": {
|
||||
"color": "#00eaff"
|
||||
},
|
||||
"function": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"function.method": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"function.special.definition": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"type": {
|
||||
"color": "#9d00ff"
|
||||
},
|
||||
"type.builtin": {
|
||||
"color": "#9d00ff"
|
||||
},
|
||||
"string": {
|
||||
"color": "#00ff99"
|
||||
},
|
||||
"string.escape": {
|
||||
"color": "#2bffb2"
|
||||
},
|
||||
"string.regex": {
|
||||
"color": "#ffb700"
|
||||
},
|
||||
"number": {
|
||||
"color": "#ffb700"
|
||||
},
|
||||
"boolean": {
|
||||
"color": "#ffb700"
|
||||
},
|
||||
"constant": {
|
||||
"color": "#ededed"
|
||||
},
|
||||
"constant.builtin": {
|
||||
"color": "#9d00ff"
|
||||
},
|
||||
"variable": {
|
||||
"color": "#ededed"
|
||||
},
|
||||
"variable.special": {
|
||||
"color": "#9d00ff"
|
||||
},
|
||||
"property": {
|
||||
"color": "#ededed"
|
||||
},
|
||||
"attribute": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"tag": {
|
||||
"color": "#00eaff"
|
||||
},
|
||||
"label": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"operator": {
|
||||
"color": "#ededed"
|
||||
},
|
||||
"punctuation": {
|
||||
"color": "#737373"
|
||||
},
|
||||
"punctuation.bracket": {
|
||||
"color": "#737373"
|
||||
},
|
||||
"punctuation.delimiter": {
|
||||
"color": "#737373"
|
||||
},
|
||||
"punctuation.list_marker": {
|
||||
"color": "#737373",
|
||||
"font_weight": 700
|
||||
},
|
||||
"link_text": {
|
||||
"color": "#00eaff"
|
||||
},
|
||||
"link_uri": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"emphasis": {
|
||||
"font_style": "italic"
|
||||
},
|
||||
"emphasis.strong": {
|
||||
"font_weight": 700
|
||||
},
|
||||
"title": {
|
||||
"color": "#ededed",
|
||||
"font_weight": 700
|
||||
},
|
||||
"text.literal": {
|
||||
"color": "#00ff99"
|
||||
},
|
||||
"preproc": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"constructor": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"enum": {
|
||||
"color": "#9d00ff"
|
||||
},
|
||||
"variant": {
|
||||
"color": "#9d00ff"
|
||||
},
|
||||
"hint": {
|
||||
"color": "#0088cc"
|
||||
},
|
||||
"predictive": {
|
||||
"color": "#737373"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"name": "Apex Aeon",
|
||||
"appearance": "light",
|
||||
"style": {
|
||||
"background": "#f5f5f5",
|
||||
"background.appearance": "opaque",
|
||||
"surface.background": "#e8e8e8",
|
||||
"elevated_surface.background": "#ffffff",
|
||||
"panel.background": "#e8e8e8",
|
||||
"panel.focused_border": "#ff0044",
|
||||
"panel.indent_guide": "#73737366",
|
||||
"panel.indent_guide_active": "#737373aa",
|
||||
"panel.indent_guide_hover": "#737373cc",
|
||||
"tab_bar.background": "#e8e8e8",
|
||||
"tab.inactive_background": "#e8e8e8",
|
||||
"tab.active_background": "#f5f5f5",
|
||||
"title_bar.background": "#f5f5f5",
|
||||
"title_bar.inactive_background": "#e8e8e8",
|
||||
"toolbar.background": "#e8e8e8",
|
||||
"status_bar.background": "#e8e8e8",
|
||||
"border": "#737373",
|
||||
"border.variant": "#a0a0a0",
|
||||
"border.focused": "#ff0044",
|
||||
"border.selected": "#ff0044",
|
||||
"border.disabled": "#a0a0a0",
|
||||
"border.transparent": "transparent",
|
||||
"text": "#0a0a0a",
|
||||
"text.muted": "#737373",
|
||||
"text.placeholder": "#737373",
|
||||
"text.disabled": "#a0a0a0",
|
||||
"text.accent": "#007a88",
|
||||
"icon": "#0a0a0a",
|
||||
"icon.muted": "#737373",
|
||||
"icon.placeholder": "#737373",
|
||||
"icon.disabled": "#a0a0a0",
|
||||
"icon.accent": "#007a88",
|
||||
"accents": [
|
||||
"#ff0044",
|
||||
"#007a88",
|
||||
"#7a3cff",
|
||||
"#00b377",
|
||||
"#d18f00"
|
||||
],
|
||||
"element.background": "#ffffff",
|
||||
"element.hover": "#737373",
|
||||
"element.active": "#737373",
|
||||
"element.selected": "#737373",
|
||||
"element.disabled": "#e8e8e8",
|
||||
"ghost_element.background": null,
|
||||
"ghost_element.hover": "#73737366",
|
||||
"ghost_element.active": "#73737388",
|
||||
"ghost_element.selected": "#73737366",
|
||||
"ghost_element.disabled": null,
|
||||
"drop_target.background": "#33bccc22",
|
||||
"editor.background": "#f5f5f5",
|
||||
"editor.foreground": "#0a0a0a",
|
||||
"editor.gutter.background": "#f5f5f5",
|
||||
"editor.subheader.background": "#e8e8e8",
|
||||
"editor.active_line.background": "#e8e8e8",
|
||||
"editor.highlighted_line.background": "#e8e8e8",
|
||||
"editor.line_number": "#737373",
|
||||
"editor.active_line_number": "#ff0044",
|
||||
"editor.wrap_guide": "#737373",
|
||||
"editor.active_wrap_guide": "#737373",
|
||||
"editor.indent_guide": "#73737366",
|
||||
"editor.indent_guide_active": "#737373aa",
|
||||
"editor.invisible": "#73737388",
|
||||
"editor.document_highlight.read_background": "#007a881a",
|
||||
"editor.document_highlight.write_background": "#ff00441a",
|
||||
"editor.document_highlight.bracket_background": "#73737366",
|
||||
"search.match_background": "#33bccc44",
|
||||
"scrollbar.track.background": "#f5f5f5",
|
||||
"scrollbar.track.border": "#f5f5f5",
|
||||
"scrollbar.thumb.background": "#a0a0a0aa",
|
||||
"scrollbar.thumb.hover_background": "#737373",
|
||||
"scrollbar.thumb.border": "transparent",
|
||||
"pane.focused_border": "#ff0044",
|
||||
"pane_group.border": "#a0a0a0",
|
||||
"link_text.hover": "#33bccc",
|
||||
"success": "#00b377",
|
||||
"success.background": "#00b3771a",
|
||||
"success.border": "#00b377",
|
||||
"warning": "#d18f00",
|
||||
"warning.background": "#d18f001a",
|
||||
"warning.border": "#d18f00",
|
||||
"error": "#ff4d6d",
|
||||
"error.background": "#ff4d6d1a",
|
||||
"error.border": "#ff4d6d",
|
||||
"info": "#007a88",
|
||||
"info.background": "#007a881a",
|
||||
"info.border": "#007a88",
|
||||
"hint": "#005577",
|
||||
"hint.background": "#0055771a",
|
||||
"hint.border": "#005577",
|
||||
"predictive": "#005577",
|
||||
"predictive.background": "#0055771a",
|
||||
"predictive.border": "#005577",
|
||||
"unreachable": "#7a3cff",
|
||||
"unreachable.background": "#7a3cff1a",
|
||||
"unreachable.border": "#7a3cff",
|
||||
"created": "#00b377",
|
||||
"created.background": "#00b3771a",
|
||||
"created.border": "#00b377",
|
||||
"modified": "#d18f00",
|
||||
"modified.background": "#d18f001a",
|
||||
"modified.border": "#d18f00",
|
||||
"deleted": "#ff4d6d",
|
||||
"deleted.background": "#ff4d6d1a",
|
||||
"deleted.border": "#ff4d6d",
|
||||
"renamed": "#007a88",
|
||||
"renamed.background": "#007a881a",
|
||||
"renamed.border": "#007a88",
|
||||
"conflict": "#ff4d6d",
|
||||
"conflict.background": "#ff4d6d1a",
|
||||
"conflict.border": "#ff4d6d",
|
||||
"ignored": "#737373",
|
||||
"ignored.background": "#7373731a",
|
||||
"ignored.border": "#737373",
|
||||
"hidden": "#737373",
|
||||
"hidden.background": "#7373731a",
|
||||
"hidden.border": "#737373",
|
||||
"terminal.background": "#f5f5f5",
|
||||
"terminal.foreground": "#0a0a0a",
|
||||
"terminal.bright_foreground": "#0a0a0a",
|
||||
"terminal.dim_foreground": "#737373",
|
||||
"terminal.ansi.background": "#f5f5f5",
|
||||
"terminal.ansi.black": "#0a0a0a",
|
||||
"terminal.ansi.red": "#ff0044",
|
||||
"terminal.ansi.green": "#00b377",
|
||||
"terminal.ansi.yellow": "#d18f00",
|
||||
"terminal.ansi.blue": "#007a88",
|
||||
"terminal.ansi.magenta": "#7a3cff",
|
||||
"terminal.ansi.cyan": "#007a88",
|
||||
"terminal.ansi.white": "#f5f5f5",
|
||||
"terminal.ansi.bright_black": "#737373",
|
||||
"terminal.ansi.bright_red": "#ff4d6d",
|
||||
"terminal.ansi.bright_green": "#33d6a6",
|
||||
"terminal.ansi.bright_yellow": "#ffbf40",
|
||||
"terminal.ansi.bright_blue": "#33bccc",
|
||||
"terminal.ansi.bright_magenta": "#a680ff",
|
||||
"terminal.ansi.bright_cyan": "#33bccc",
|
||||
"terminal.ansi.bright_white": "#ffffff",
|
||||
"terminal.ansi.dim_black": "#0a0a0a",
|
||||
"terminal.ansi.dim_red": "#ff0044",
|
||||
"terminal.ansi.dim_green": "#00b377",
|
||||
"terminal.ansi.dim_yellow": "#d18f00",
|
||||
"terminal.ansi.dim_blue": "#007a88",
|
||||
"terminal.ansi.dim_magenta": "#7a3cff",
|
||||
"terminal.ansi.dim_cyan": "#007a88",
|
||||
"terminal.ansi.dim_white": "#f5f5f5",
|
||||
"players": [
|
||||
{
|
||||
"cursor": "#ff0044",
|
||||
"background": "#ff0044",
|
||||
"selection": "#ff004433"
|
||||
},
|
||||
{
|
||||
"cursor": "#007a88",
|
||||
"background": "#007a88",
|
||||
"selection": "#007a8833"
|
||||
},
|
||||
{
|
||||
"cursor": "#7a3cff",
|
||||
"background": "#7a3cff",
|
||||
"selection": "#7a3cff33"
|
||||
},
|
||||
{
|
||||
"cursor": "#00b377",
|
||||
"background": "#00b377",
|
||||
"selection": "#00b37733"
|
||||
},
|
||||
{
|
||||
"cursor": "#d18f00",
|
||||
"background": "#d18f00",
|
||||
"selection": "#d18f0033"
|
||||
}
|
||||
],
|
||||
"version_control.added": "#00b377",
|
||||
"version_control.modified": "#d18f00",
|
||||
"version_control.deleted": "#ff4d6d",
|
||||
"version_control.conflict": "#ff4d6d",
|
||||
"version_control.renamed": "#007a88",
|
||||
"version_control.ignored": "#737373",
|
||||
"syntax": {
|
||||
"comment": {
|
||||
"color": "#737373",
|
||||
"font_style": "italic"
|
||||
},
|
||||
"comment.doc": {
|
||||
"color": "#737373",
|
||||
"font_style": "italic"
|
||||
},
|
||||
"keyword": {
|
||||
"color": "#007a88"
|
||||
},
|
||||
"keyword.import": {
|
||||
"color": "#007a88"
|
||||
},
|
||||
"keyword.storage": {
|
||||
"color": "#007a88"
|
||||
},
|
||||
"function": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"function.method": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"function.special.definition": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"type": {
|
||||
"color": "#7a3cff"
|
||||
},
|
||||
"type.builtin": {
|
||||
"color": "#7a3cff"
|
||||
},
|
||||
"string": {
|
||||
"color": "#00b377"
|
||||
},
|
||||
"string.escape": {
|
||||
"color": "#33d6a6"
|
||||
},
|
||||
"string.regex": {
|
||||
"color": "#d18f00"
|
||||
},
|
||||
"number": {
|
||||
"color": "#d18f00"
|
||||
},
|
||||
"boolean": {
|
||||
"color": "#d18f00"
|
||||
},
|
||||
"constant": {
|
||||
"color": "#0a0a0a"
|
||||
},
|
||||
"constant.builtin": {
|
||||
"color": "#7a3cff"
|
||||
},
|
||||
"variable": {
|
||||
"color": "#0a0a0a"
|
||||
},
|
||||
"variable.special": {
|
||||
"color": "#7a3cff"
|
||||
},
|
||||
"property": {
|
||||
"color": "#0a0a0a"
|
||||
},
|
||||
"attribute": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"tag": {
|
||||
"color": "#007a88"
|
||||
},
|
||||
"label": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"operator": {
|
||||
"color": "#0a0a0a"
|
||||
},
|
||||
"punctuation": {
|
||||
"color": "#737373"
|
||||
},
|
||||
"punctuation.bracket": {
|
||||
"color": "#737373"
|
||||
},
|
||||
"punctuation.delimiter": {
|
||||
"color": "#737373"
|
||||
},
|
||||
"punctuation.list_marker": {
|
||||
"color": "#737373",
|
||||
"font_weight": 700
|
||||
},
|
||||
"link_text": {
|
||||
"color": "#007a88"
|
||||
},
|
||||
"link_uri": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"emphasis": {
|
||||
"font_style": "italic"
|
||||
},
|
||||
"emphasis.strong": {
|
||||
"font_weight": 700
|
||||
},
|
||||
"title": {
|
||||
"color": "#0a0a0a",
|
||||
"font_weight": 700
|
||||
},
|
||||
"text.literal": {
|
||||
"color": "#00b377"
|
||||
},
|
||||
"preproc": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"constructor": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"enum": {
|
||||
"color": "#7a3cff"
|
||||
},
|
||||
"variant": {
|
||||
"color": "#7a3cff"
|
||||
},
|
||||
"hint": {
|
||||
"color": "#005577"
|
||||
},
|
||||
"predictive": {
|
||||
"color": "#737373"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
620
dist/zsh/apex-aeon.zsh-theme
vendored
Normal file
620
dist/zsh/apex-aeon.zsh-theme
vendored
Normal file
@@ -0,0 +1,620 @@
|
||||
# Apex Aeon — Predator Cockpit (Zsh) — v1
|
||||
# Two-bus design:
|
||||
# [precmd radar] -> after-action + context bursts (event-driven)
|
||||
# [promptline] -> LEFT: identity + territory
|
||||
# RIGHT: intel + vcs + friction (stable)
|
||||
|
||||
setopt prompt_subst
|
||||
setopt no_beep
|
||||
|
||||
zmodload zsh/datetime 2>/dev/null
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 1) PALETTE (Apex Aeon DNA)
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gA C
|
||||
C[VOID]="#f5f5f5"
|
||||
C[WHITE]="#0a0a0a"
|
||||
C[MUTED]="#737373"
|
||||
C[RAZOR]="#ff0044"
|
||||
C[CYAN]="#007a88"
|
||||
C[GOLD]="#d18f00"
|
||||
C[OK]="#00b377"
|
||||
C[PURPLE]="#7a3cff"
|
||||
C[ALERT]="#ff4d6d"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 2) ICONS / GLYPHS (Nerd Font optional)
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gA I
|
||||
I[OS]=""
|
||||
I[SSH]=""
|
||||
I[ROOT]=""
|
||||
I[GIT]=""
|
||||
I[JOBS]=""
|
||||
I[RADAR]="⌁"
|
||||
I[RET]="↩"
|
||||
|
||||
typeset -gA S
|
||||
S[PL_L]=""
|
||||
S[PL_R]=""
|
||||
S[DOT]="·"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 3) CONFIG
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gA APEX
|
||||
APEX[SLOW_SOFT_MS]=750
|
||||
APEX[SLOW_HARD_MS]=2000
|
||||
|
||||
APEX[STARTUP_BURST]=1
|
||||
APEX[SHOW_AAR]=1
|
||||
APEX[SHOW_CONTEXT_BURST]=1
|
||||
APEX[SHOW_VCS]=1
|
||||
APEX[SHOW_INTEL]=1
|
||||
APEX[SHOW_JOBS]=1
|
||||
APEX[SHOW_RO]=1
|
||||
APEX[GIT_AHEAD_BEHIND]=1
|
||||
|
||||
# Ops commands (also match wrappers like sudo/doas/command)
|
||||
APEX[OPS_RE]='^((sudo|doas|command)[[:space:]]+)*((pacman|yay|paru|apt|dnf|brew|systemctl|docker|kubectl|helm|git))([[:space:]]|$)'
|
||||
|
||||
# Session-ish commands (spawn a subshell; exit codes are often “not a failure”)
|
||||
APEX[SESSION_RE]='^((sudo|doas|command)[[:space:]]+)*chezmoi[[:space:]]+cd([[:space:]]|$)'
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 4) STATE
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gF apex_cmd_start=0.0
|
||||
typeset -g apex_last_cmd=""
|
||||
typeset -g apex_has_run_cmd=0
|
||||
|
||||
typeset -g apex_startup_done=0
|
||||
typeset -g apex_pwd_changed=1
|
||||
|
||||
# Sticky intel
|
||||
typeset -g apex_venv_name=""
|
||||
typeset -g apex_target_sig=""
|
||||
typeset -g apex_mode_sig=""
|
||||
|
||||
# Git state
|
||||
typeset -g apex_in_git=0
|
||||
typeset -g apex_git_branch=""
|
||||
typeset -g apex_git_dirty_wt=0
|
||||
typeset -g apex_git_dirty_ix=0
|
||||
typeset -g apex_git_untracked=0
|
||||
typeset -g apex_git_conflict=0
|
||||
typeset -g apex_git_op=""
|
||||
typeset -g apex_git_up_ok=0
|
||||
typeset -g apex_git_ahead=0
|
||||
typeset -g apex_git_behind=0
|
||||
typeset -g apex_git_stash=0
|
||||
typeset -g apex_git_root=""
|
||||
typeset -g apex_git_dir=""
|
||||
|
||||
# Radar previous snapshots (transition detection)
|
||||
typeset -g apex_prev_in_git=-1
|
||||
typeset -g apex_prev_git_branch=""
|
||||
typeset -g apex_prev_git_op=""
|
||||
typeset -g apex_prev_venv_name=""
|
||||
typeset -g apex_prev_target_sig=""
|
||||
typeset -g apex_prev_proj_sig=""
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 5) UTILITIES
|
||||
# -----------------------------------------------------------------------------
|
||||
apex__short_cmd() {
|
||||
local s="$1"
|
||||
s="${s//$'
|
||||
'/ }"
|
||||
s="${s#"${s%%[![:space:]]*}"}" # ltrim
|
||||
s="${s%"${s##*[![:space:]]}"}" # rtrim
|
||||
print -r -- "${s[1,90]}"
|
||||
}
|
||||
|
||||
apex__project_sig() {
|
||||
local s=""
|
||||
[[ -f package.json ]] && s+="node"
|
||||
[[ -f pnpm-lock.yaml ]] && s+="+pnpm"
|
||||
[[ -f bun.lockb ]] && s+="+bun"
|
||||
[[ -f yarn.lock ]] && s+="+yarn"
|
||||
|
||||
[[ -f pyproject.toml || -f requirements.txt ]] && s+="${s:+ }py"
|
||||
[[ -f uv.lock ]] && s+="+uv"
|
||||
|
||||
[[ -f Cargo.toml ]] && s+="${s:+ }rust"
|
||||
[[ -f go.mod ]] && s+="${s:+ }go"
|
||||
|
||||
[[ -n "$s" ]] && print -r -- "$s"
|
||||
}
|
||||
|
||||
apex__escape_prompt() {
|
||||
local s="$1"
|
||||
s="${s//\\%/%%}"
|
||||
print -r -- "$s"
|
||||
}
|
||||
|
||||
apex__now_float() {
|
||||
if [[ -n "${EPOCHREALTIME:-}" ]]; then
|
||||
print -r -- "$EPOCHREALTIME"
|
||||
elif [[ -n "${EPOCHSECONDS:-}" ]]; then
|
||||
print -r -- "${EPOCHSECONDS}.0"
|
||||
else
|
||||
print -r -- "0.0"
|
||||
fi
|
||||
}
|
||||
|
||||
apex__find_git_root() {
|
||||
local dir="$PWD"
|
||||
local git_root=""
|
||||
local git_dir=""
|
||||
|
||||
while [[ -n "$dir" ]]; do
|
||||
if [[ -d "$dir/.git" ]]; then
|
||||
git_root="$dir"
|
||||
git_dir="$dir/.git"
|
||||
break
|
||||
elif [[ -f "$dir/.git" ]]; then
|
||||
local line
|
||||
line="$(<"$dir/.git")"
|
||||
if [[ "$line" == gitdir:* ]]; then
|
||||
git_root="$dir"
|
||||
git_dir="${line#gitdir: }"
|
||||
[[ "$git_dir" != /* ]] && git_dir="$dir/$git_dir"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ "$dir" == "/" ]] && break
|
||||
dir="${dir:h}"
|
||||
done
|
||||
|
||||
[[ -n "$git_root" ]] && print -r -- "${git_root}|${git_dir}"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 6) INTEL (sticky; updated each prompt)
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_update_intel() {
|
||||
# Target (cheap env-based; no kubectl calls)
|
||||
if [[ -n "$AWS_PROFILE" ]]; then
|
||||
apex_target_sig="aws:${AWS_PROFILE}"
|
||||
elif [[ -n "$GOOGLE_CLOUD_PROJECT" ]]; then
|
||||
apex_target_sig="gcp:${GOOGLE_CLOUD_PROJECT}"
|
||||
elif [[ -n "$KUBE_CONTEXT" ]]; then
|
||||
apex_target_sig="kube:${KUBE_CONTEXT}"
|
||||
else
|
||||
apex_target_sig=""
|
||||
fi
|
||||
|
||||
# Mode
|
||||
if [[ -n "$IN_NIX_SHELL" ]]; then
|
||||
apex_mode_sig="nix"
|
||||
elif [[ -n "$DIRENV_DIR" ]]; then
|
||||
apex_mode_sig="direnv"
|
||||
elif [[ -f /run/.containerenv || -f /.dockerenv ]]; then
|
||||
apex_mode_sig="ctr"
|
||||
else
|
||||
apex_mode_sig=""
|
||||
fi
|
||||
|
||||
# Venv
|
||||
apex_venv_name=""
|
||||
if [[ -n "$VIRTUAL_ENV" ]]; then
|
||||
apex_venv_name="$(basename "$VIRTUAL_ENV")"
|
||||
elif [[ -n "$CONDA_DEFAULT_ENV" ]]; then
|
||||
apex_venv_name="$CONDA_DEFAULT_ENV"
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 7) GIT
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_git_update() {
|
||||
apex_in_git=0
|
||||
apex_git_branch=""
|
||||
apex_git_dirty_wt=0
|
||||
apex_git_dirty_ix=0
|
||||
apex_git_untracked=0
|
||||
apex_git_conflict=0
|
||||
apex_git_op=""
|
||||
apex_git_up_ok=0
|
||||
apex_git_ahead=0
|
||||
apex_git_behind=0
|
||||
apex_git_stash=0
|
||||
|
||||
local status_out
|
||||
status_out="$(command git status --porcelain=2 --branch 2>/dev/null)" || {
|
||||
apex_git_root=""
|
||||
apex_git_dir=""
|
||||
return
|
||||
}
|
||||
apex_in_git=1
|
||||
|
||||
if (( apex_pwd_changed )) || [[ -z "$apex_git_root" ]]; then
|
||||
local root_info
|
||||
root_info="$(apex__find_git_root)"
|
||||
if [[ -n "$root_info" ]]; then
|
||||
apex_git_root="${root_info%%|*}"
|
||||
apex_git_dir="${root_info#*|}"
|
||||
else
|
||||
apex_git_root=""
|
||||
apex_git_dir=""
|
||||
fi
|
||||
fi
|
||||
|
||||
local branch_head="" branch_oid="" upstream=""
|
||||
local xy="" ix="" wt=""
|
||||
local line
|
||||
while IFS= read -r line; do
|
||||
case "$line" in
|
||||
\#\ branch.head\ *)
|
||||
branch_head="${line#\# branch.head }"
|
||||
;;
|
||||
\#\ branch.oid\ *)
|
||||
branch_oid="${line#\# branch.oid }"
|
||||
;;
|
||||
\#\ branch.upstream\ *)
|
||||
upstream="${line#\# branch.upstream }"
|
||||
;;
|
||||
\#\ branch.ab\ *)
|
||||
local ab a b
|
||||
ab="${line#\# branch.ab }"
|
||||
IFS=' ' read -r a b <<<"$ab"
|
||||
a="${a#+}"
|
||||
b="${b#-}"
|
||||
apex_git_ahead="${a:-0}"
|
||||
apex_git_behind="${b:-0}"
|
||||
;;
|
||||
1\ *|2\ *)
|
||||
xy="${line[3,4]}"
|
||||
ix="${xy[1]}"
|
||||
wt="${xy[2]}"
|
||||
[[ "$ix" != "." ]] && apex_git_dirty_ix=1
|
||||
[[ "$wt" != "." ]] && apex_git_dirty_wt=1
|
||||
;;
|
||||
u\ *)
|
||||
apex_git_conflict=1
|
||||
apex_git_dirty_ix=1
|
||||
apex_git_dirty_wt=1
|
||||
;;
|
||||
\?\ *)
|
||||
apex_git_untracked=1
|
||||
;;
|
||||
esac
|
||||
done <<<"$status_out"
|
||||
|
||||
if [[ -n "$branch_head" && "$branch_head" != "(detached)" && "$branch_head" != "HEAD" ]]; then
|
||||
apex_git_branch="$branch_head"
|
||||
elif [[ -n "$branch_oid" ]]; then
|
||||
apex_git_branch="${branch_oid[1,7]}"
|
||||
fi
|
||||
|
||||
if [[ -n "$apex_git_dir" ]]; then
|
||||
[[ -d "$apex_git_dir/rebase-apply" || -d "$apex_git_dir/rebase-merge" ]] && apex_git_op="rebase"
|
||||
[[ -f "$apex_git_dir/MERGE_HEAD" ]] && apex_git_op="merge"
|
||||
[[ -f "$apex_git_dir/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
|
||||
[[ -f "$apex_git_dir/BISECT_LOG" ]] && apex_git_op="bisect"
|
||||
|
||||
if [[ -f "$apex_git_dir/logs/refs/stash" ]]; then
|
||||
local -a stash_lines
|
||||
stash_lines=(${(f)"$(<"$apex_git_dir/logs/refs/stash")"})
|
||||
apex_git_stash=$#stash_lines
|
||||
elif [[ -f "$apex_git_dir/refs/stash" ]]; then
|
||||
apex_git_stash=1
|
||||
fi
|
||||
fi
|
||||
|
||||
(( apex_git_conflict )) && apex_git_op="conflict"
|
||||
|
||||
if [[ -n "$upstream" && "$upstream" != "(gone)" ]]; then
|
||||
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 && apex_git_untracked == 0 && apex_git_conflict == 0 && apex_git_stash == 0 )) \
|
||||
&& [[ -z "$apex_git_op" ]]; then
|
||||
[[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 8) LEFT PROMPTLINE: IDENTITY + TERRITORY
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_identity() {
|
||||
local is_root=0 is_ssh=0 color label
|
||||
(( EUID == 0 )) && is_root=1
|
||||
[[ -n "$SSH_CONNECTION$SSH_TTY" ]] && is_ssh=1
|
||||
|
||||
if (( is_root )); then
|
||||
color="${C[PURPLE]}"
|
||||
if (( is_ssh )); then
|
||||
label="${I[ROOT]} @%m"
|
||||
else
|
||||
label="${I[ROOT]} root"
|
||||
fi
|
||||
elif (( is_ssh )); then
|
||||
color="${C[CYAN]}"
|
||||
label="${I[SSH]} %n@%m"
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
|
||||
print -n "%F{${color}}${S[PL_L]}%f%K{${color}}%F{${C[VOID]}}%B ${label} %b%f%k%F{${color}}${S[PL_R]}%f "
|
||||
}
|
||||
|
||||
apex_territory() {
|
||||
print -n "%F{${C[RAZOR]}}${S[PL_L]}%f%K{${C[RAZOR]}}%F{${C[VOID]}}%B ${I[OS]}%b %F{${C[WHITE]}}%B%~%b %f%k%F{${C[RAZOR]}}${S[PL_R]}%f"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 9) RIGHT PROMPT (RPROMPT): INTEL + VCS + FRICTION
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_intel_r() {
|
||||
(( APEX[SHOW_INTEL] )) || return 0
|
||||
if [[ -n "$apex_target_sig" ]]; then
|
||||
print -n "%F{${C[CYAN]}}(${apex_target_sig})%f"
|
||||
elif [[ -n "$apex_mode_sig" ]]; then
|
||||
print -n "%F{${C[CYAN]}}(${apex_mode_sig})%f"
|
||||
elif [[ -n "$apex_venv_name" ]]; then
|
||||
print -n "%F{${C[CYAN]}}(${apex_venv_name})%f"
|
||||
fi
|
||||
}
|
||||
|
||||
apex_vcs_r() {
|
||||
(( APEX[SHOW_VCS] )) || return 0
|
||||
(( apex_in_git )) || return 0
|
||||
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
|
||||
|
||||
if [[ -n "$apex_git_op" ]]; then
|
||||
print -n "%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
|
||||
return 0
|
||||
fi
|
||||
|
||||
print -n "%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
|
||||
|
||||
local mark=""
|
||||
(( apex_git_dirty_ix )) && mark+="+"
|
||||
(( apex_git_dirty_wt )) && mark+="!"
|
||||
(( apex_git_untracked )) && mark+="?"
|
||||
[[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f"
|
||||
|
||||
(( apex_git_stash > 0 )) && print -n "%F{${C[MUTED]}} s${apex_git_stash}%f"
|
||||
|
||||
(( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f"
|
||||
|
||||
if (( APEX[GIT_AHEAD_BEHIND] )); then
|
||||
(( apex_git_ahead > 0 )) && print -n "%F{${C[MUTED]}} ⇡${apex_git_ahead}%f"
|
||||
(( apex_git_behind > 0 )) && print -n "%F{${C[MUTED]}} ⇣${apex_git_behind}%f"
|
||||
fi
|
||||
}
|
||||
|
||||
apex_friction_r() {
|
||||
if (( APEX[SHOW_RO] )); then
|
||||
local ro=0
|
||||
[[ ! -w . ]] && ro=1
|
||||
if (( apex_in_git )) && [[ -n "$apex_git_root" && ! -w "$apex_git_root" ]]; then
|
||||
ro=1
|
||||
fi
|
||||
if (( ro )); then
|
||||
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( APEX[SHOW_JOBS] )); then
|
||||
local -a job_pids
|
||||
job_pids=(${(f)"$(jobs -p 2>/dev/null)"})
|
||||
local jc=$#job_pids
|
||||
if (( jc > 0 )); then
|
||||
print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
build_rprompt() {
|
||||
local s out=""
|
||||
local sep="%F{${C[MUTED]}} ${S[DOT]} %f"
|
||||
|
||||
s="$(apex_intel_r)"; [[ -n "$s" ]] && out+="$s"
|
||||
s="$(apex_vcs_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
|
||||
s="$(apex_friction_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
|
||||
|
||||
[[ -n "$out" ]] && out="%F{${C[MUTED]}}[%f${out}%F{${C[MUTED]}}]%f"
|
||||
print -n "$out"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 10) RADAR (precmd)
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_radar_aar() {
|
||||
(( APEX[SHOW_AAR] )) || return 0
|
||||
|
||||
local ec=$1 cmd="$2" dur="$3"
|
||||
local -i ms=${4:-0}
|
||||
|
||||
local show=0
|
||||
(( ec != 0 )) && show=1
|
||||
[[ -n "$dur" ]] && show=1
|
||||
[[ "$cmd" =~ ${APEX[OPS_RE]} ]] && show=1
|
||||
(( show )) || return 0
|
||||
|
||||
local short; short="$(apex__short_cmd "$cmd")"
|
||||
short="$(apex__escape_prompt "$short")"
|
||||
|
||||
local dur_color="${C[MUTED]}"
|
||||
(( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}"
|
||||
|
||||
local dur_chunk=""
|
||||
if [[ -n "$dur" ]]; then
|
||||
if (( ms >= ${APEX[SLOW_HARD_MS]} )); then
|
||||
dur_chunk=" %F{${dur_color}}%B${dur}%b%f"
|
||||
else
|
||||
dur_chunk=" %F{${dur_color}}${dur}%f"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Session commands: don't scream in red for “rc:1”
|
||||
if [[ "$cmd" =~ ${APEX[SESSION_RE]} ]]; then
|
||||
if (( ec == 0 )); then
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
else
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f %F{${C[MUTED]}}rc:${ec}%f${dur_chunk}"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if (( ec == 0 )); then
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}✓%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Signals: 128 + signal number
|
||||
case $ec in
|
||||
130) # SIGINT (Ctrl+C)
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[CYAN]}}^C%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
141) # SIGPIPE
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[MUTED]}}PIPE%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
143) # SIGTERM
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}TERM%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
*)
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[ALERT]}}✘ ${ec}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
apex_radar_context_burst() {
|
||||
(( APEX[SHOW_CONTEXT_BURST] )) || return 0
|
||||
|
||||
local proj_sig; proj_sig="$(apex__project_sig 2>/dev/null || print -r -- "")"
|
||||
|
||||
local emit=0
|
||||
if (( apex_startup_done == 0 )); then
|
||||
(( APEX[STARTUP_BURST] )) && emit=1
|
||||
fi
|
||||
(( apex_pwd_changed )) && emit=1
|
||||
[[ "$apex_venv_name" != "$apex_prev_venv_name" ]] && emit=1
|
||||
[[ "$apex_target_sig" != "$apex_prev_target_sig" ]] && emit=1
|
||||
(( apex_in_git != apex_prev_in_git )) && emit=1
|
||||
[[ "$apex_git_branch" != "$apex_prev_git_branch" ]] && emit=1
|
||||
[[ "$apex_git_op" != "$apex_prev_git_op" ]] && emit=1
|
||||
[[ "$proj_sig" != "$apex_prev_proj_sig" ]] && emit=1
|
||||
|
||||
(( emit )) || return 0
|
||||
|
||||
# If nothing to say, say nothing.
|
||||
if [[ -z "$proj_sig" && -z "$apex_venv_name" && -z "$apex_target_sig" ]] && (( apex_in_git == 0 )); then
|
||||
apex_pwd_changed=0
|
||||
apex_startup_done=1
|
||||
return 0
|
||||
fi
|
||||
|
||||
local out="%F{${C[MUTED]}}${I[RADAR]}%f "
|
||||
|
||||
# Git first
|
||||
if (( apex_in_git )); then
|
||||
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
|
||||
if [[ -n "$apex_git_op" ]]; then
|
||||
out+="%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
|
||||
else
|
||||
out+="%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ -n "$proj_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[MUTED]}}${proj_sig}%f"
|
||||
[[ -n "$apex_venv_name" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_venv_name})%f"
|
||||
[[ -n "$apex_target_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_target_sig})%f"
|
||||
|
||||
print -P "$out"
|
||||
|
||||
apex_prev_venv_name="$apex_venv_name"
|
||||
apex_prev_target_sig="$apex_target_sig"
|
||||
apex_prev_in_git="$apex_in_git"
|
||||
apex_prev_git_branch="$apex_git_branch"
|
||||
apex_prev_git_op="$apex_git_op"
|
||||
apex_prev_proj_sig="$proj_sig"
|
||||
|
||||
apex_pwd_changed=0
|
||||
apex_startup_done=1
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 11) HOOKS
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_preexec_hook() {
|
||||
apex_has_run_cmd=1
|
||||
apex_cmd_start="$(apex__now_float)"
|
||||
apex_last_cmd="$1"
|
||||
}
|
||||
|
||||
apex_chpwd_hook() {
|
||||
apex_pwd_changed=1
|
||||
}
|
||||
|
||||
apex_precmd_hook() {
|
||||
local ec=$?
|
||||
|
||||
apex_update_intel
|
||||
apex_git_update
|
||||
|
||||
# Did a command actually run since the last prompt?
|
||||
local ran=0
|
||||
(( apex_has_run_cmd )) && ran=1
|
||||
|
||||
if (( ran )); then
|
||||
local now; now="$(apex__now_float)"
|
||||
local -i ms=0
|
||||
local -F delta=0.0
|
||||
if [[ -n "$now" ]]; then
|
||||
delta=$(( now - apex_cmd_start ))
|
||||
(( delta < 0 )) && delta=0
|
||||
ms=$(( delta * 1000 ))
|
||||
fi
|
||||
|
||||
# Show time if: slow OR ops OR failed.
|
||||
local dur=""
|
||||
if (( ms >= ${APEX[SLOW_SOFT_MS]} )) || [[ "$apex_last_cmd" =~ ${APEX[OPS_RE]} ]] || (( ec != 0 )); then
|
||||
dur="$(printf "%.2fs" $(( ms / 1000.0 )))"
|
||||
fi
|
||||
|
||||
apex_radar_aar $ec "$apex_last_cmd" "$dur" $ms
|
||||
|
||||
apex_has_run_cmd=0
|
||||
|
||||
# Spacer between AAR and context burst / prompt.
|
||||
print -r -- ""
|
||||
fi
|
||||
|
||||
apex_radar_context_burst
|
||||
}
|
||||
|
||||
autoload -Uz add-zsh-hook
|
||||
add-zsh-hook preexec apex_preexec_hook
|
||||
add-zsh-hook precmd apex_precmd_hook
|
||||
add-zsh-hook chpwd apex_chpwd_hook
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 12) PROMPT BUILD
|
||||
# -----------------------------------------------------------------------------
|
||||
build_prompt() {
|
||||
local ec=$?
|
||||
|
||||
# Line 1: identity + territory (left)
|
||||
print -n "$(apex_identity)"
|
||||
print -n "$(apex_territory)"
|
||||
print -n $'
|
||||
'
|
||||
|
||||
# Line 2: trigger posture
|
||||
if (( EUID == 0 )); then
|
||||
print -n "%F{${C[PURPLE]}}❯%f "
|
||||
elif (( ec != 0 )); then
|
||||
print -n "%F{${C[ALERT]}}❯%f "
|
||||
else
|
||||
print -n "%F{${C[CYAN]}}❯%f "
|
||||
fi
|
||||
}
|
||||
|
||||
PROMPT='$(build_prompt)'
|
||||
RPROMPT='$(build_rprompt)'
|
||||
620
dist/zsh/apex-neon.zsh-theme
vendored
Normal file
620
dist/zsh/apex-neon.zsh-theme
vendored
Normal file
@@ -0,0 +1,620 @@
|
||||
# Apex Neon — Predator Cockpit (Zsh) — v1
|
||||
# Two-bus design:
|
||||
# [precmd radar] -> after-action + context bursts (event-driven)
|
||||
# [promptline] -> LEFT: identity + territory
|
||||
# RIGHT: intel + vcs + friction (stable)
|
||||
|
||||
setopt prompt_subst
|
||||
setopt no_beep
|
||||
|
||||
zmodload zsh/datetime 2>/dev/null
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 1) PALETTE (Apex Neon DNA)
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gA C
|
||||
C[VOID]="#050505"
|
||||
C[WHITE]="#ededed"
|
||||
C[MUTED]="#737373"
|
||||
C[RAZOR]="#ff0044"
|
||||
C[CYAN]="#00eaff"
|
||||
C[GOLD]="#ffb700"
|
||||
C[OK]="#00ff99"
|
||||
C[PURPLE]="#9d00ff"
|
||||
C[ALERT]="#ff8899"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 2) ICONS / GLYPHS (Nerd Font optional)
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gA I
|
||||
I[OS]=""
|
||||
I[SSH]=""
|
||||
I[ROOT]=""
|
||||
I[GIT]=""
|
||||
I[JOBS]=""
|
||||
I[RADAR]="⌁"
|
||||
I[RET]="↩"
|
||||
|
||||
typeset -gA S
|
||||
S[PL_L]=""
|
||||
S[PL_R]=""
|
||||
S[DOT]="·"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 3) CONFIG
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gA APEX
|
||||
APEX[SLOW_SOFT_MS]=750
|
||||
APEX[SLOW_HARD_MS]=2000
|
||||
|
||||
APEX[STARTUP_BURST]=1
|
||||
APEX[SHOW_AAR]=1
|
||||
APEX[SHOW_CONTEXT_BURST]=1
|
||||
APEX[SHOW_VCS]=1
|
||||
APEX[SHOW_INTEL]=1
|
||||
APEX[SHOW_JOBS]=1
|
||||
APEX[SHOW_RO]=1
|
||||
APEX[GIT_AHEAD_BEHIND]=1
|
||||
|
||||
# Ops commands (also match wrappers like sudo/doas/command)
|
||||
APEX[OPS_RE]='^((sudo|doas|command)[[:space:]]+)*((pacman|yay|paru|apt|dnf|brew|systemctl|docker|kubectl|helm|git))([[:space:]]|$)'
|
||||
|
||||
# Session-ish commands (spawn a subshell; exit codes are often “not a failure”)
|
||||
APEX[SESSION_RE]='^((sudo|doas|command)[[:space:]]+)*chezmoi[[:space:]]+cd([[:space:]]|$)'
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 4) STATE
|
||||
# -----------------------------------------------------------------------------
|
||||
typeset -gF apex_cmd_start=0.0
|
||||
typeset -g apex_last_cmd=""
|
||||
typeset -g apex_has_run_cmd=0
|
||||
|
||||
typeset -g apex_startup_done=0
|
||||
typeset -g apex_pwd_changed=1
|
||||
|
||||
# Sticky intel
|
||||
typeset -g apex_venv_name=""
|
||||
typeset -g apex_target_sig=""
|
||||
typeset -g apex_mode_sig=""
|
||||
|
||||
# Git state
|
||||
typeset -g apex_in_git=0
|
||||
typeset -g apex_git_branch=""
|
||||
typeset -g apex_git_dirty_wt=0
|
||||
typeset -g apex_git_dirty_ix=0
|
||||
typeset -g apex_git_untracked=0
|
||||
typeset -g apex_git_conflict=0
|
||||
typeset -g apex_git_op=""
|
||||
typeset -g apex_git_up_ok=0
|
||||
typeset -g apex_git_ahead=0
|
||||
typeset -g apex_git_behind=0
|
||||
typeset -g apex_git_stash=0
|
||||
typeset -g apex_git_root=""
|
||||
typeset -g apex_git_dir=""
|
||||
|
||||
# Radar previous snapshots (transition detection)
|
||||
typeset -g apex_prev_in_git=-1
|
||||
typeset -g apex_prev_git_branch=""
|
||||
typeset -g apex_prev_git_op=""
|
||||
typeset -g apex_prev_venv_name=""
|
||||
typeset -g apex_prev_target_sig=""
|
||||
typeset -g apex_prev_proj_sig=""
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 5) UTILITIES
|
||||
# -----------------------------------------------------------------------------
|
||||
apex__short_cmd() {
|
||||
local s="$1"
|
||||
s="${s//$'
|
||||
'/ }"
|
||||
s="${s#"${s%%[![:space:]]*}"}" # ltrim
|
||||
s="${s%"${s##*[![:space:]]}"}" # rtrim
|
||||
print -r -- "${s[1,90]}"
|
||||
}
|
||||
|
||||
apex__project_sig() {
|
||||
local s=""
|
||||
[[ -f package.json ]] && s+="node"
|
||||
[[ -f pnpm-lock.yaml ]] && s+="+pnpm"
|
||||
[[ -f bun.lockb ]] && s+="+bun"
|
||||
[[ -f yarn.lock ]] && s+="+yarn"
|
||||
|
||||
[[ -f pyproject.toml || -f requirements.txt ]] && s+="${s:+ }py"
|
||||
[[ -f uv.lock ]] && s+="+uv"
|
||||
|
||||
[[ -f Cargo.toml ]] && s+="${s:+ }rust"
|
||||
[[ -f go.mod ]] && s+="${s:+ }go"
|
||||
|
||||
[[ -n "$s" ]] && print -r -- "$s"
|
||||
}
|
||||
|
||||
apex__escape_prompt() {
|
||||
local s="$1"
|
||||
s="${s//\\%/%%}"
|
||||
print -r -- "$s"
|
||||
}
|
||||
|
||||
apex__now_float() {
|
||||
if [[ -n "${EPOCHREALTIME:-}" ]]; then
|
||||
print -r -- "$EPOCHREALTIME"
|
||||
elif [[ -n "${EPOCHSECONDS:-}" ]]; then
|
||||
print -r -- "${EPOCHSECONDS}.0"
|
||||
else
|
||||
print -r -- "0.0"
|
||||
fi
|
||||
}
|
||||
|
||||
apex__find_git_root() {
|
||||
local dir="$PWD"
|
||||
local git_root=""
|
||||
local git_dir=""
|
||||
|
||||
while [[ -n "$dir" ]]; do
|
||||
if [[ -d "$dir/.git" ]]; then
|
||||
git_root="$dir"
|
||||
git_dir="$dir/.git"
|
||||
break
|
||||
elif [[ -f "$dir/.git" ]]; then
|
||||
local line
|
||||
line="$(<"$dir/.git")"
|
||||
if [[ "$line" == gitdir:* ]]; then
|
||||
git_root="$dir"
|
||||
git_dir="${line#gitdir: }"
|
||||
[[ "$git_dir" != /* ]] && git_dir="$dir/$git_dir"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ "$dir" == "/" ]] && break
|
||||
dir="${dir:h}"
|
||||
done
|
||||
|
||||
[[ -n "$git_root" ]] && print -r -- "${git_root}|${git_dir}"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 6) INTEL (sticky; updated each prompt)
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_update_intel() {
|
||||
# Target (cheap env-based; no kubectl calls)
|
||||
if [[ -n "$AWS_PROFILE" ]]; then
|
||||
apex_target_sig="aws:${AWS_PROFILE}"
|
||||
elif [[ -n "$GOOGLE_CLOUD_PROJECT" ]]; then
|
||||
apex_target_sig="gcp:${GOOGLE_CLOUD_PROJECT}"
|
||||
elif [[ -n "$KUBE_CONTEXT" ]]; then
|
||||
apex_target_sig="kube:${KUBE_CONTEXT}"
|
||||
else
|
||||
apex_target_sig=""
|
||||
fi
|
||||
|
||||
# Mode
|
||||
if [[ -n "$IN_NIX_SHELL" ]]; then
|
||||
apex_mode_sig="nix"
|
||||
elif [[ -n "$DIRENV_DIR" ]]; then
|
||||
apex_mode_sig="direnv"
|
||||
elif [[ -f /run/.containerenv || -f /.dockerenv ]]; then
|
||||
apex_mode_sig="ctr"
|
||||
else
|
||||
apex_mode_sig=""
|
||||
fi
|
||||
|
||||
# Venv
|
||||
apex_venv_name=""
|
||||
if [[ -n "$VIRTUAL_ENV" ]]; then
|
||||
apex_venv_name="$(basename "$VIRTUAL_ENV")"
|
||||
elif [[ -n "$CONDA_DEFAULT_ENV" ]]; then
|
||||
apex_venv_name="$CONDA_DEFAULT_ENV"
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 7) GIT
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_git_update() {
|
||||
apex_in_git=0
|
||||
apex_git_branch=""
|
||||
apex_git_dirty_wt=0
|
||||
apex_git_dirty_ix=0
|
||||
apex_git_untracked=0
|
||||
apex_git_conflict=0
|
||||
apex_git_op=""
|
||||
apex_git_up_ok=0
|
||||
apex_git_ahead=0
|
||||
apex_git_behind=0
|
||||
apex_git_stash=0
|
||||
|
||||
local status_out
|
||||
status_out="$(command git status --porcelain=2 --branch 2>/dev/null)" || {
|
||||
apex_git_root=""
|
||||
apex_git_dir=""
|
||||
return
|
||||
}
|
||||
apex_in_git=1
|
||||
|
||||
if (( apex_pwd_changed )) || [[ -z "$apex_git_root" ]]; then
|
||||
local root_info
|
||||
root_info="$(apex__find_git_root)"
|
||||
if [[ -n "$root_info" ]]; then
|
||||
apex_git_root="${root_info%%|*}"
|
||||
apex_git_dir="${root_info#*|}"
|
||||
else
|
||||
apex_git_root=""
|
||||
apex_git_dir=""
|
||||
fi
|
||||
fi
|
||||
|
||||
local branch_head="" branch_oid="" upstream=""
|
||||
local xy="" ix="" wt=""
|
||||
local line
|
||||
while IFS= read -r line; do
|
||||
case "$line" in
|
||||
\#\ branch.head\ *)
|
||||
branch_head="${line#\# branch.head }"
|
||||
;;
|
||||
\#\ branch.oid\ *)
|
||||
branch_oid="${line#\# branch.oid }"
|
||||
;;
|
||||
\#\ branch.upstream\ *)
|
||||
upstream="${line#\# branch.upstream }"
|
||||
;;
|
||||
\#\ branch.ab\ *)
|
||||
local ab a b
|
||||
ab="${line#\# branch.ab }"
|
||||
IFS=' ' read -r a b <<<"$ab"
|
||||
a="${a#+}"
|
||||
b="${b#-}"
|
||||
apex_git_ahead="${a:-0}"
|
||||
apex_git_behind="${b:-0}"
|
||||
;;
|
||||
1\ *|2\ *)
|
||||
xy="${line[3,4]}"
|
||||
ix="${xy[1]}"
|
||||
wt="${xy[2]}"
|
||||
[[ "$ix" != "." ]] && apex_git_dirty_ix=1
|
||||
[[ "$wt" != "." ]] && apex_git_dirty_wt=1
|
||||
;;
|
||||
u\ *)
|
||||
apex_git_conflict=1
|
||||
apex_git_dirty_ix=1
|
||||
apex_git_dirty_wt=1
|
||||
;;
|
||||
\?\ *)
|
||||
apex_git_untracked=1
|
||||
;;
|
||||
esac
|
||||
done <<<"$status_out"
|
||||
|
||||
if [[ -n "$branch_head" && "$branch_head" != "(detached)" && "$branch_head" != "HEAD" ]]; then
|
||||
apex_git_branch="$branch_head"
|
||||
elif [[ -n "$branch_oid" ]]; then
|
||||
apex_git_branch="${branch_oid[1,7]}"
|
||||
fi
|
||||
|
||||
if [[ -n "$apex_git_dir" ]]; then
|
||||
[[ -d "$apex_git_dir/rebase-apply" || -d "$apex_git_dir/rebase-merge" ]] && apex_git_op="rebase"
|
||||
[[ -f "$apex_git_dir/MERGE_HEAD" ]] && apex_git_op="merge"
|
||||
[[ -f "$apex_git_dir/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
|
||||
[[ -f "$apex_git_dir/BISECT_LOG" ]] && apex_git_op="bisect"
|
||||
|
||||
if [[ -f "$apex_git_dir/logs/refs/stash" ]]; then
|
||||
local -a stash_lines
|
||||
stash_lines=(${(f)"$(<"$apex_git_dir/logs/refs/stash")"})
|
||||
apex_git_stash=$#stash_lines
|
||||
elif [[ -f "$apex_git_dir/refs/stash" ]]; then
|
||||
apex_git_stash=1
|
||||
fi
|
||||
fi
|
||||
|
||||
(( apex_git_conflict )) && apex_git_op="conflict"
|
||||
|
||||
if [[ -n "$upstream" && "$upstream" != "(gone)" ]]; then
|
||||
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 && apex_git_untracked == 0 && apex_git_conflict == 0 && apex_git_stash == 0 )) \
|
||||
&& [[ -z "$apex_git_op" ]]; then
|
||||
[[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 8) LEFT PROMPTLINE: IDENTITY + TERRITORY
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_identity() {
|
||||
local is_root=0 is_ssh=0 color label
|
||||
(( EUID == 0 )) && is_root=1
|
||||
[[ -n "$SSH_CONNECTION$SSH_TTY" ]] && is_ssh=1
|
||||
|
||||
if (( is_root )); then
|
||||
color="${C[PURPLE]}"
|
||||
if (( is_ssh )); then
|
||||
label="${I[ROOT]} @%m"
|
||||
else
|
||||
label="${I[ROOT]} root"
|
||||
fi
|
||||
elif (( is_ssh )); then
|
||||
color="${C[CYAN]}"
|
||||
label="${I[SSH]} %n@%m"
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
|
||||
print -n "%F{${color}}${S[PL_L]}%f%K{${color}}%F{${C[VOID]}}%B ${label} %b%f%k%F{${color}}${S[PL_R]}%f "
|
||||
}
|
||||
|
||||
apex_territory() {
|
||||
print -n "%F{${C[RAZOR]}}${S[PL_L]}%f%K{${C[RAZOR]}}%F{${C[VOID]}}%B ${I[OS]}%b %F{${C[WHITE]}}%B%~%b %f%k%F{${C[RAZOR]}}${S[PL_R]}%f"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 9) RIGHT PROMPT (RPROMPT): INTEL + VCS + FRICTION
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_intel_r() {
|
||||
(( APEX[SHOW_INTEL] )) || return 0
|
||||
if [[ -n "$apex_target_sig" ]]; then
|
||||
print -n "%F{${C[CYAN]}}(${apex_target_sig})%f"
|
||||
elif [[ -n "$apex_mode_sig" ]]; then
|
||||
print -n "%F{${C[CYAN]}}(${apex_mode_sig})%f"
|
||||
elif [[ -n "$apex_venv_name" ]]; then
|
||||
print -n "%F{${C[CYAN]}}(${apex_venv_name})%f"
|
||||
fi
|
||||
}
|
||||
|
||||
apex_vcs_r() {
|
||||
(( APEX[SHOW_VCS] )) || return 0
|
||||
(( apex_in_git )) || return 0
|
||||
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
|
||||
|
||||
if [[ -n "$apex_git_op" ]]; then
|
||||
print -n "%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
|
||||
return 0
|
||||
fi
|
||||
|
||||
print -n "%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
|
||||
|
||||
local mark=""
|
||||
(( apex_git_dirty_ix )) && mark+="+"
|
||||
(( apex_git_dirty_wt )) && mark+="!"
|
||||
(( apex_git_untracked )) && mark+="?"
|
||||
[[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f"
|
||||
|
||||
(( apex_git_stash > 0 )) && print -n "%F{${C[MUTED]}} s${apex_git_stash}%f"
|
||||
|
||||
(( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f"
|
||||
|
||||
if (( APEX[GIT_AHEAD_BEHIND] )); then
|
||||
(( apex_git_ahead > 0 )) && print -n "%F{${C[MUTED]}} ⇡${apex_git_ahead}%f"
|
||||
(( apex_git_behind > 0 )) && print -n "%F{${C[MUTED]}} ⇣${apex_git_behind}%f"
|
||||
fi
|
||||
}
|
||||
|
||||
apex_friction_r() {
|
||||
if (( APEX[SHOW_RO] )); then
|
||||
local ro=0
|
||||
[[ ! -w . ]] && ro=1
|
||||
if (( apex_in_git )) && [[ -n "$apex_git_root" && ! -w "$apex_git_root" ]]; then
|
||||
ro=1
|
||||
fi
|
||||
if (( ro )); then
|
||||
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( APEX[SHOW_JOBS] )); then
|
||||
local -a job_pids
|
||||
job_pids=(${(f)"$(jobs -p 2>/dev/null)"})
|
||||
local jc=$#job_pids
|
||||
if (( jc > 0 )); then
|
||||
print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
build_rprompt() {
|
||||
local s out=""
|
||||
local sep="%F{${C[MUTED]}} ${S[DOT]} %f"
|
||||
|
||||
s="$(apex_intel_r)"; [[ -n "$s" ]] && out+="$s"
|
||||
s="$(apex_vcs_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
|
||||
s="$(apex_friction_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
|
||||
|
||||
[[ -n "$out" ]] && out="%F{${C[MUTED]}}[%f${out}%F{${C[MUTED]}}]%f"
|
||||
print -n "$out"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 10) RADAR (precmd)
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_radar_aar() {
|
||||
(( APEX[SHOW_AAR] )) || return 0
|
||||
|
||||
local ec=$1 cmd="$2" dur="$3"
|
||||
local -i ms=${4:-0}
|
||||
|
||||
local show=0
|
||||
(( ec != 0 )) && show=1
|
||||
[[ -n "$dur" ]] && show=1
|
||||
[[ "$cmd" =~ ${APEX[OPS_RE]} ]] && show=1
|
||||
(( show )) || return 0
|
||||
|
||||
local short; short="$(apex__short_cmd "$cmd")"
|
||||
short="$(apex__escape_prompt "$short")"
|
||||
|
||||
local dur_color="${C[MUTED]}"
|
||||
(( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}"
|
||||
|
||||
local dur_chunk=""
|
||||
if [[ -n "$dur" ]]; then
|
||||
if (( ms >= ${APEX[SLOW_HARD_MS]} )); then
|
||||
dur_chunk=" %F{${dur_color}}%B${dur}%b%f"
|
||||
else
|
||||
dur_chunk=" %F{${dur_color}}${dur}%f"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Session commands: don't scream in red for “rc:1”
|
||||
if [[ "$cmd" =~ ${APEX[SESSION_RE]} ]]; then
|
||||
if (( ec == 0 )); then
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
else
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f %F{${C[MUTED]}}rc:${ec}%f${dur_chunk}"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if (( ec == 0 )); then
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}✓%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Signals: 128 + signal number
|
||||
case $ec in
|
||||
130) # SIGINT (Ctrl+C)
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[CYAN]}}^C%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
141) # SIGPIPE
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[MUTED]}}PIPE%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
143) # SIGTERM
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}TERM%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
*)
|
||||
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[ALERT]}}✘ ${ec}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
apex_radar_context_burst() {
|
||||
(( APEX[SHOW_CONTEXT_BURST] )) || return 0
|
||||
|
||||
local proj_sig; proj_sig="$(apex__project_sig 2>/dev/null || print -r -- "")"
|
||||
|
||||
local emit=0
|
||||
if (( apex_startup_done == 0 )); then
|
||||
(( APEX[STARTUP_BURST] )) && emit=1
|
||||
fi
|
||||
(( apex_pwd_changed )) && emit=1
|
||||
[[ "$apex_venv_name" != "$apex_prev_venv_name" ]] && emit=1
|
||||
[[ "$apex_target_sig" != "$apex_prev_target_sig" ]] && emit=1
|
||||
(( apex_in_git != apex_prev_in_git )) && emit=1
|
||||
[[ "$apex_git_branch" != "$apex_prev_git_branch" ]] && emit=1
|
||||
[[ "$apex_git_op" != "$apex_prev_git_op" ]] && emit=1
|
||||
[[ "$proj_sig" != "$apex_prev_proj_sig" ]] && emit=1
|
||||
|
||||
(( emit )) || return 0
|
||||
|
||||
# If nothing to say, say nothing.
|
||||
if [[ -z "$proj_sig" && -z "$apex_venv_name" && -z "$apex_target_sig" ]] && (( apex_in_git == 0 )); then
|
||||
apex_pwd_changed=0
|
||||
apex_startup_done=1
|
||||
return 0
|
||||
fi
|
||||
|
||||
local out="%F{${C[MUTED]}}${I[RADAR]}%f "
|
||||
|
||||
# Git first
|
||||
if (( apex_in_git )); then
|
||||
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
|
||||
if [[ -n "$apex_git_op" ]]; then
|
||||
out+="%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
|
||||
else
|
||||
out+="%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ -n "$proj_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[MUTED]}}${proj_sig}%f"
|
||||
[[ -n "$apex_venv_name" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_venv_name})%f"
|
||||
[[ -n "$apex_target_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_target_sig})%f"
|
||||
|
||||
print -P "$out"
|
||||
|
||||
apex_prev_venv_name="$apex_venv_name"
|
||||
apex_prev_target_sig="$apex_target_sig"
|
||||
apex_prev_in_git="$apex_in_git"
|
||||
apex_prev_git_branch="$apex_git_branch"
|
||||
apex_prev_git_op="$apex_git_op"
|
||||
apex_prev_proj_sig="$proj_sig"
|
||||
|
||||
apex_pwd_changed=0
|
||||
apex_startup_done=1
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 11) HOOKS
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_preexec_hook() {
|
||||
apex_has_run_cmd=1
|
||||
apex_cmd_start="$(apex__now_float)"
|
||||
apex_last_cmd="$1"
|
||||
}
|
||||
|
||||
apex_chpwd_hook() {
|
||||
apex_pwd_changed=1
|
||||
}
|
||||
|
||||
apex_precmd_hook() {
|
||||
local ec=$?
|
||||
|
||||
apex_update_intel
|
||||
apex_git_update
|
||||
|
||||
# Did a command actually run since the last prompt?
|
||||
local ran=0
|
||||
(( apex_has_run_cmd )) && ran=1
|
||||
|
||||
if (( ran )); then
|
||||
local now; now="$(apex__now_float)"
|
||||
local -i ms=0
|
||||
local -F delta=0.0
|
||||
if [[ -n "$now" ]]; then
|
||||
delta=$(( now - apex_cmd_start ))
|
||||
(( delta < 0 )) && delta=0
|
||||
ms=$(( delta * 1000 ))
|
||||
fi
|
||||
|
||||
# Show time if: slow OR ops OR failed.
|
||||
local dur=""
|
||||
if (( ms >= ${APEX[SLOW_SOFT_MS]} )) || [[ "$apex_last_cmd" =~ ${APEX[OPS_RE]} ]] || (( ec != 0 )); then
|
||||
dur="$(printf "%.2fs" $(( ms / 1000.0 )))"
|
||||
fi
|
||||
|
||||
apex_radar_aar $ec "$apex_last_cmd" "$dur" $ms
|
||||
|
||||
apex_has_run_cmd=0
|
||||
|
||||
# Spacer between AAR and context burst / prompt.
|
||||
print -r -- ""
|
||||
fi
|
||||
|
||||
apex_radar_context_burst
|
||||
}
|
||||
|
||||
autoload -Uz add-zsh-hook
|
||||
add-zsh-hook preexec apex_preexec_hook
|
||||
add-zsh-hook precmd apex_precmd_hook
|
||||
add-zsh-hook chpwd apex_chpwd_hook
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 12) PROMPT BUILD
|
||||
# -----------------------------------------------------------------------------
|
||||
build_prompt() {
|
||||
local ec=$?
|
||||
|
||||
# Line 1: identity + territory (left)
|
||||
print -n "$(apex_identity)"
|
||||
print -n "$(apex_territory)"
|
||||
print -n $'
|
||||
'
|
||||
|
||||
# Line 2: trigger posture
|
||||
if (( EUID == 0 )); then
|
||||
print -n "%F{${C[PURPLE]}}❯%f "
|
||||
elif (( ec != 0 )); then
|
||||
print -n "%F{${C[ALERT]}}❯%f "
|
||||
else
|
||||
print -n "%F{${C[CYAN]}}❯%f "
|
||||
fi
|
||||
}
|
||||
|
||||
PROMPT='$(build_prompt)'
|
||||
RPROMPT='$(build_rprompt)'
|
||||
18
scripts/nvim-audit.sh
Executable file
18
scripts/nvim-audit.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
|
||||
if ! command -v nvim >/dev/null 2>&1; then
|
||||
echo "error: nvim not found on PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${root}/dist/nvim/colors/apex-neon.lua" ]]; then
|
||||
echo "error: missing dist/nvim/colors/apex-neon.lua; run 'uv run build.py'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "$root"
|
||||
nvim --headless -u NONE -U NONE -c "lua dofile('${root}/scripts/nvim_audit.lua')"
|
||||
181
scripts/nvim_audit.lua
Normal file
181
scripts/nvim_audit.lua
Normal file
@@ -0,0 +1,181 @@
|
||||
local function out(msg)
|
||||
vim.api.nvim_out_write(msg .. "\n")
|
||||
end
|
||||
|
||||
local function err(msg)
|
||||
vim.api.nvim_err_write(msg .. "\n")
|
||||
end
|
||||
|
||||
if not vim.api.nvim_get_hl then
|
||||
err("error: nvim_get_hl unavailable; require Neovim 0.9+")
|
||||
vim.cmd("cquit")
|
||||
end
|
||||
|
||||
local function load_theme()
|
||||
local theme_path = vim.fn.getcwd() .. "/dist/nvim/colors/apex-neon.lua"
|
||||
local ok, load_err = pcall(dofile, theme_path)
|
||||
if not ok then
|
||||
err("error: failed to load theme: " .. tostring(load_err))
|
||||
err("hint: run 'uv run build.py' to regenerate dist/")
|
||||
vim.cmd("cquit")
|
||||
end
|
||||
end
|
||||
|
||||
local function has_style(hl)
|
||||
for key, value in pairs(hl) do
|
||||
if key ~= "link" and key ~= "default" then
|
||||
if type(value) ~= "boolean" or value then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function get_hl(name)
|
||||
local ok, hl = pcall(vim.api.nvim_get_hl, 0, { name = name, link = false })
|
||||
if not ok then
|
||||
return nil, "error"
|
||||
end
|
||||
return hl, nil
|
||||
end
|
||||
|
||||
local function audit(groups)
|
||||
local issues = {}
|
||||
local default_links = {
|
||||
Normal = true,
|
||||
NONE = true,
|
||||
}
|
||||
|
||||
for _, group in ipairs(groups) do
|
||||
local hl, api_err = get_hl(group)
|
||||
if api_err or not hl or next(hl) == nil then
|
||||
table.insert(issues, "missing: " .. group)
|
||||
elseif hl.link and default_links[hl.link] then
|
||||
table.insert(issues, "default-link: " .. group .. " -> " .. hl.link)
|
||||
elseif not hl.link and not has_style(hl) then
|
||||
table.insert(issues, "empty: " .. group)
|
||||
end
|
||||
end
|
||||
|
||||
return issues
|
||||
end
|
||||
|
||||
local groups = {
|
||||
-- Pmenu
|
||||
"Pmenu",
|
||||
"PmenuSel",
|
||||
"PmenuSbar",
|
||||
"PmenuThumb",
|
||||
"WildMenu",
|
||||
|
||||
-- LSP UI
|
||||
"LspReferenceText",
|
||||
"LspReferenceRead",
|
||||
"LspReferenceWrite",
|
||||
"LspSignatureActiveParameter",
|
||||
"LspInlayHint",
|
||||
|
||||
-- Diagnostics (core + variants)
|
||||
"DiagnosticError",
|
||||
"DiagnosticWarn",
|
||||
"DiagnosticInfo",
|
||||
"DiagnosticHint",
|
||||
"DiagnosticOk",
|
||||
"DiagnosticDeprecated",
|
||||
"DiagnosticUnnecessary",
|
||||
"DiagnosticUnderlineError",
|
||||
"DiagnosticUnderlineWarn",
|
||||
"DiagnosticUnderlineInfo",
|
||||
"DiagnosticUnderlineHint",
|
||||
"DiagnosticUnderlineOk",
|
||||
"DiagnosticVirtualTextError",
|
||||
"DiagnosticVirtualTextWarn",
|
||||
"DiagnosticVirtualTextInfo",
|
||||
"DiagnosticVirtualTextHint",
|
||||
"DiagnosticVirtualTextOk",
|
||||
"DiagnosticVirtualLinesError",
|
||||
"DiagnosticVirtualLinesWarn",
|
||||
"DiagnosticVirtualLinesInfo",
|
||||
"DiagnosticVirtualLinesHint",
|
||||
"DiagnosticVirtualLinesOk",
|
||||
"DiagnosticSignError",
|
||||
"DiagnosticSignWarn",
|
||||
"DiagnosticSignInfo",
|
||||
"DiagnosticSignHint",
|
||||
"DiagnosticSignOk",
|
||||
"DiagnosticFloatingError",
|
||||
"DiagnosticFloatingWarn",
|
||||
"DiagnosticFloatingInfo",
|
||||
"DiagnosticFloatingHint",
|
||||
"DiagnosticFloatingOk",
|
||||
|
||||
-- Markup (Tree-sitter)
|
||||
"@markup.heading",
|
||||
"@markup.link",
|
||||
"@markup.link.url",
|
||||
"@markup.strong",
|
||||
"@markup.italic",
|
||||
"ApexMarkupStrong",
|
||||
"ApexMarkupItalic",
|
||||
"ApexMarkupLink",
|
||||
|
||||
-- LSP semantic tokens (types)
|
||||
"@lsp.type.boolean",
|
||||
"@lsp.type.builtinType",
|
||||
"@lsp.type.class",
|
||||
"@lsp.type.comment",
|
||||
"@lsp.type.decorator",
|
||||
"@lsp.type.enum",
|
||||
"@lsp.type.enumMember",
|
||||
"@lsp.type.event",
|
||||
"@lsp.type.function",
|
||||
"@lsp.type.interface",
|
||||
"@lsp.type.keyword",
|
||||
"@lsp.type.macro",
|
||||
"@lsp.type.method",
|
||||
"@lsp.type.modifier",
|
||||
"@lsp.type.namespace",
|
||||
"@lsp.type.number",
|
||||
"@lsp.type.operator",
|
||||
"@lsp.type.parameter",
|
||||
"@lsp.type.property",
|
||||
"@lsp.type.regexp",
|
||||
"@lsp.type.string",
|
||||
"@lsp.type.struct",
|
||||
"@lsp.type.type",
|
||||
"@lsp.type.typeParameter",
|
||||
"@lsp.type.variable",
|
||||
|
||||
-- LSP semantic tokens (modifiers)
|
||||
"@lsp.mod.deprecated",
|
||||
"@lsp.mod.readonly",
|
||||
"@lsp.mod.static",
|
||||
"@lsp.mod.async",
|
||||
|
||||
-- LSP semantic tokens (typemods)
|
||||
"@lsp.typemod.function.async",
|
||||
"@lsp.typemod.method.async",
|
||||
"@lsp.typemod.function.deprecated",
|
||||
"@lsp.typemod.method.deprecated",
|
||||
"@lsp.typemod.variable.deprecated",
|
||||
"@lsp.typemod.variable.readonly",
|
||||
"@lsp.typemod.parameter.readonly",
|
||||
"@lsp.typemod.property.readonly",
|
||||
"@lsp.typemod.variable.static",
|
||||
"@lsp.typemod.property.static",
|
||||
}
|
||||
|
||||
load_theme()
|
||||
|
||||
local issues = audit(groups)
|
||||
if #issues == 0 then
|
||||
out("nvim audit: ok (" .. tostring(#groups) .. " groups)")
|
||||
vim.cmd("qa")
|
||||
end
|
||||
|
||||
err("nvim audit: " .. tostring(#issues) .. " issue(s)")
|
||||
for _, issue in ipairs(issues) do
|
||||
err(issue)
|
||||
end
|
||||
vim.cmd("cquit")
|
||||
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
|
||||
26
templates/ghostty/apex.j2
Normal file
26
templates/ghostty/apex.j2
Normal file
@@ -0,0 +1,26 @@
|
||||
# {{ scheme }} - Ghostty theme
|
||||
# DNA: State over Decoration
|
||||
|
||||
background = {{ palette.background }}
|
||||
foreground = {{ palette.foreground }}
|
||||
|
||||
cursor-color = {{ palette.cursor }}
|
||||
selection-background = {{ palette.selection }}
|
||||
selection-foreground = {{ palette.selection_fg }}
|
||||
|
||||
palette = 0={{ ansi.normal.black }}
|
||||
palette = 1={{ ansi.normal.red }}
|
||||
palette = 2={{ ansi.normal.green }}
|
||||
palette = 3={{ ansi.normal.yellow }}
|
||||
palette = 4={{ ansi.normal.blue }}
|
||||
palette = 5={{ ansi.normal.magenta }}
|
||||
palette = 6={{ ansi.normal.cyan }}
|
||||
palette = 7={{ ansi.normal.white }}
|
||||
palette = 8={{ ansi.bright.black }}
|
||||
palette = 9={{ ansi.bright.red }}
|
||||
palette = 10={{ ansi.bright.green }}
|
||||
palette = 11={{ ansi.bright.yellow }}
|
||||
palette = 12={{ ansi.bright.blue }}
|
||||
palette = 13={{ ansi.bright.magenta }}
|
||||
palette = 14={{ ansi.bright.cyan }}
|
||||
palette = 15={{ ansi.bright.white }}
|
||||
4
templates/ghostty/meta.yaml
Normal file
4
templates/ghostty/meta.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: S0wlz (Owlibou)
|
||||
description: Ghostty theme
|
||||
version: 1.0.0
|
||||
strategy: individual
|
||||
@@ -16,7 +16,8 @@ M.palette = {
|
||||
|
||||
-- The Hunter (Presence)
|
||||
razor = "{{ palette.cursor }}", -- PRIMARY: Cursor, Current Match, Active Border
|
||||
alert = "{{ ansi.bright.red }}", -- ERROR: Readable text on Red
|
||||
ink = "{{ palette.selection_fg }}", -- Text color on Razor backgrounds
|
||||
alert = "{{ palette.error }}", -- Error accent text on void/panel
|
||||
|
||||
-- The HUD (Data)
|
||||
tech = "{{ palette.info }}", -- INFO: Selection, Search Match, Constants
|
||||
@@ -32,6 +33,16 @@ function M.load()
|
||||
vim.o.background = "{{ type }}"
|
||||
vim.g.colors_name = "{{ scheme | lower | replace(' ', '-') }}"
|
||||
|
||||
-- Optional transparency: set g:apex_blend or g:apex_transparent to opt in.
|
||||
local blend = vim.g.apex_blend
|
||||
if type(blend) == "number" then
|
||||
vim.o.winblend = blend
|
||||
vim.o.pumblend = blend
|
||||
elseif vim.g.apex_transparent == true then
|
||||
vim.o.winblend = 20
|
||||
vim.o.pumblend = 20
|
||||
end
|
||||
|
||||
local p = M.palette
|
||||
local groups = {
|
||||
-- CANVAS & UI -----------------------------------------------------------
|
||||
@@ -39,14 +50,21 @@ function M.load()
|
||||
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
|
||||
SignColumn = { bg = p.void },
|
||||
FoldColumn = { fg = p.stealth, bg = p.void },
|
||||
VertSplit = { fg = p.razor }, -- Deprecated in nvim 0.10, but good fallback
|
||||
WinSeparator = { fg = p.razor }, -- The Cage (Red Borders)
|
||||
VertSplit = { fg = p.border }, -- Deprecated in nvim 0.10, but good fallback
|
||||
WinSeparator = { fg = p.border },
|
||||
EndOfBuffer = { fg = p.void }, -- Hide tildes
|
||||
NormalFloat = { fg = p.text, bg = p.panel },
|
||||
FloatBorder = { fg = p.border, bg = p.panel },
|
||||
MsgArea = { fg = p.text, bg = p.void },
|
||||
WinBar = { fg = p.text, bg = p.panel },
|
||||
WinBarNC = { fg = p.dim, bg = p.panel },
|
||||
|
||||
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
|
||||
Cursor = { fg = p.void, bg = p.razor }, -- Red Beam
|
||||
TermCursor = { fg = p.void, bg = p.razor },
|
||||
Cursor = { fg = p.ink, bg = p.razor }, -- Red Beam
|
||||
TermCursor = { fg = p.ink, bg = p.razor },
|
||||
CursorLine = { bg = p.panel },
|
||||
CursorColumn = { bg = p.panel },
|
||||
ColorColumn = { bg = p.panel },
|
||||
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
|
||||
LineNr = { fg = p.stealth }, -- Other lines fade out
|
||||
|
||||
@@ -55,17 +73,31 @@ function M.load()
|
||||
VisualNOS = { fg = p.void, bg = p.border },
|
||||
|
||||
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
|
||||
IncSearch = { fg = p.void, bg = p.razor }, -- Red (Acquiring...)
|
||||
CurSearch = { fg = p.void, bg = p.razor, bold = true }, -- Red (Target Locked)
|
||||
IncSearch = { fg = p.ink, bg = p.razor }, -- Red (Acquiring...)
|
||||
CurSearch = { fg = p.ink, bg = p.razor, bold = true }, -- Red (Target Locked)
|
||||
|
||||
-- STATUS & MESSAGES -----------------------------------------------------
|
||||
StatusLine = { fg = p.text, bg = p.panel },
|
||||
StatusLineNC = { fg = p.dim, bg = p.void },
|
||||
WildMenu = { fg = p.void, bg = p.tech },
|
||||
Pmenu = { fg = p.text, bg = p.panel },
|
||||
PmenuSel = { fg = p.void, bg = p.razor, bold = true }, -- Red Menu Selection
|
||||
PmenuSel = { fg = p.ink, bg = p.razor, bold = true }, -- Red Menu Selection
|
||||
PmenuKind = { fg = p.dim, bg = p.panel },
|
||||
PmenuKindSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuExtra = { fg = p.dim, bg = p.panel },
|
||||
PmenuExtraSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuMatch = { fg = p.tech, bg = p.panel, bold = true },
|
||||
PmenuMatchSel = { fg = p.ink, bg = p.razor, bold = true },
|
||||
PmenuSbar = { bg = p.panel },
|
||||
PmenuThumb = { bg = p.stealth },
|
||||
ErrorMsg = { fg = p.alert },
|
||||
WarningMsg = { fg = p.amber },
|
||||
MoreMsg = { fg = p.tech },
|
||||
ModeMsg = { fg = p.text },
|
||||
TabLine = { fg = p.dim, bg = p.panel },
|
||||
TabLineSel = { fg = p.text, bg = p.void, bold = true },
|
||||
TabLineFill = { fg = p.panel, bg = p.panel },
|
||||
QuickFixLine = { fg = p.text, bg = p.panel, bold = true },
|
||||
|
||||
-- SYNTAX HIGHLIGHTING ---------------------------------------------------
|
||||
Comment = { fg = p.stealth, italic = true },
|
||||
@@ -106,17 +138,71 @@ function M.load()
|
||||
|
||||
Underlined = { underline = true },
|
||||
Ignore = { fg = p.stealth },
|
||||
Error = { fg = p.razor },
|
||||
Error = { fg = p.alert },
|
||||
Todo = { fg = p.void, bg = p.amber, bold = true },
|
||||
Title = { fg = p.sacred, bold = true },
|
||||
|
||||
MatchParen = { fg = p.void, bg = p.amber, bold = true },
|
||||
Whitespace = { fg = p.border },
|
||||
NonText = { fg = p.border },
|
||||
SpecialKey = { fg = p.border },
|
||||
SpellBad = { sp = p.razor, undercurl = true },
|
||||
SpellCap = { sp = p.amber, undercurl = true },
|
||||
SpellRare = { sp = p.tech, undercurl = true },
|
||||
SpellLocal = { sp = p.dim, undercurl = true },
|
||||
LspReferenceText = { bg = p.panel },
|
||||
LspReferenceRead = { bg = p.panel },
|
||||
LspReferenceWrite = { bg = p.panel, bold = true },
|
||||
LspSignatureActiveParameter = { fg = p.void, bg = p.tech, bold = true },
|
||||
LspInlayHint = { fg = p.dim, bg = p.panel },
|
||||
LspCodeLens = { fg = p.dim },
|
||||
LspCodeLensSeparator = { fg = p.stealth },
|
||||
LspInfoBorder = { fg = p.border, bg = p.panel },
|
||||
LspInfoTitle = { fg = p.dim, bg = p.panel },
|
||||
|
||||
-- DIAGNOSTICS -----------------------------------------------------------
|
||||
DiagnosticError = { fg = p.razor },
|
||||
DiagnosticError = { fg = p.alert },
|
||||
DiagnosticWarn = { fg = p.amber },
|
||||
DiagnosticInfo = { fg = p.tech },
|
||||
DiagnosticHint = { fg = p.dim },
|
||||
DiagnosticOk = { fg = p.toxic },
|
||||
DiagnosticDeprecated = { fg = p.dim, strikethrough = true },
|
||||
DiagnosticUnnecessary = { fg = p.dim },
|
||||
|
||||
DiagnosticUnderlineError = { sp = p.razor, underline = true },
|
||||
DiagnosticUnderlineWarn = { sp = p.amber, underline = true },
|
||||
DiagnosticUnderlineError = { undercurl = true, sp = p.razor },
|
||||
DiagnosticUnderlineWarn = { undercurl = true, sp = p.amber },
|
||||
DiagnosticUnderlineInfo = { undercurl = true, sp = p.tech },
|
||||
DiagnosticUnderlineHint = { undercurl = true, sp = p.dim },
|
||||
DiagnosticUnderlineOk = { undercurl = true, sp = p.toxic },
|
||||
DiagnosticVirtualTextError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticVirtualTextWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticVirtualTextInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticVirtualTextHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticVirtualTextOk = { fg = p.toxic, bg = p.panel },
|
||||
DiagnosticVirtualLinesError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticVirtualLinesWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticVirtualLinesInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticVirtualLinesHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticVirtualLinesOk = { fg = p.toxic, bg = p.panel },
|
||||
DiagnosticSignError = { fg = p.alert, bg = p.void },
|
||||
DiagnosticSignWarn = { fg = p.amber, bg = p.void },
|
||||
DiagnosticSignInfo = { fg = p.tech, bg = p.void },
|
||||
DiagnosticSignHint = { fg = p.dim, bg = p.void },
|
||||
DiagnosticSignOk = { fg = p.toxic, bg = p.void },
|
||||
DiagnosticFloatingError = { fg = p.alert, bg = p.panel },
|
||||
DiagnosticFloatingWarn = { fg = p.amber, bg = p.panel },
|
||||
DiagnosticFloatingInfo = { fg = p.tech, bg = p.panel },
|
||||
DiagnosticFloatingHint = { fg = p.dim, bg = p.panel },
|
||||
DiagnosticFloatingOk = { fg = p.toxic, bg = p.panel },
|
||||
ApexMarkupStrong = { bold = true },
|
||||
ApexMarkupItalic = { italic = true },
|
||||
ApexMarkupLink = { fg = p.tech, underline = true },
|
||||
|
||||
-- DIFF ------------------------------------------------------------------
|
||||
DiffAdd = { fg = p.toxic, bg = p.panel },
|
||||
DiffChange = { fg = p.tech, bg = p.panel },
|
||||
DiffDelete = { fg = p.razor, bg = p.panel },
|
||||
DiffText = { fg = p.void, bg = p.tech, bold = true },
|
||||
|
||||
-- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
|
||||
TelescopeNormal = { bg = p.void },
|
||||
@@ -124,9 +210,9 @@ function M.load()
|
||||
TelescopePromptNormal = { fg = p.text, bg = p.void },
|
||||
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
|
||||
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
|
||||
TelescopePreviewTitle = { fg = p.void, bg = p.razor }, -- Red Label
|
||||
TelescopePreviewTitle = { fg = p.ink, bg = p.razor }, -- Red Label
|
||||
TelescopeResultsTitle = { fg = p.void, bg = p.panel },
|
||||
TelescopeSelection = { fg = p.void, bg = p.razor }, -- Red Selection
|
||||
TelescopeSelection = { fg = p.ink, bg = p.razor }, -- Red Selection
|
||||
|
||||
-- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
|
||||
NeoTreeNormal = { bg = p.void },
|
||||
@@ -157,6 +243,137 @@ function M.load()
|
||||
for group, highlight in pairs(groups) do
|
||||
vim.api.nvim_set_hl(0, group, highlight)
|
||||
end
|
||||
|
||||
local links = {
|
||||
["@annotation"] = "Special",
|
||||
["@attribute"] = "Special",
|
||||
["@character"] = "Character",
|
||||
["@comment"] = "Comment",
|
||||
["@constant"] = "Constant",
|
||||
["@constant.builtin"] = "Constant",
|
||||
["@constant.macro"] = "Macro",
|
||||
["@constructor"] = "Type",
|
||||
["@debug"] = "Debug",
|
||||
["@define"] = "Define",
|
||||
["@exception"] = "Exception",
|
||||
["@field"] = "Identifier",
|
||||
["@float"] = "Float",
|
||||
["@function"] = "Function",
|
||||
["@function.builtin"] = "Function",
|
||||
["@function.call"] = "Function",
|
||||
["@function.macro"] = "Macro",
|
||||
["@include"] = "Include",
|
||||
["@keyword"] = "Keyword",
|
||||
["@keyword.function"] = "Keyword",
|
||||
["@keyword.operator"] = "Operator",
|
||||
["@keyword.return"] = "Keyword",
|
||||
["@label"] = "Label",
|
||||
["@method"] = "Function",
|
||||
["@method.call"] = "Function",
|
||||
["@module"] = "Structure",
|
||||
["@namespace"] = "Structure",
|
||||
["@number"] = "Number",
|
||||
["@operator"] = "Operator",
|
||||
["@parameter"] = "Identifier",
|
||||
["@preproc"] = "PreProc",
|
||||
["@property"] = "Identifier",
|
||||
["@punctuation"] = "Delimiter",
|
||||
["@punctuation.bracket"] = "Delimiter",
|
||||
["@punctuation.delimiter"] = "Delimiter",
|
||||
["@punctuation.special"] = "Delimiter",
|
||||
["@repeat"] = "Repeat",
|
||||
["@string"] = "String",
|
||||
["@string.escape"] = "SpecialChar",
|
||||
["@string.regex"] = "SpecialChar",
|
||||
["@string.special"] = "SpecialChar",
|
||||
["@tag"] = "Tag",
|
||||
["@tag.attribute"] = "Identifier",
|
||||
["@tag.delimiter"] = "Delimiter",
|
||||
["@text"] = "Normal",
|
||||
["@text.title"] = "Title",
|
||||
["@markup.heading"] = "Title",
|
||||
["@markup.heading.1"] = "Title",
|
||||
["@markup.heading.2"] = "Title",
|
||||
["@markup.heading.3"] = "Title",
|
||||
["@markup.heading.4"] = "Title",
|
||||
["@markup.heading.5"] = "Title",
|
||||
["@markup.heading.6"] = "Title",
|
||||
["@markup.link"] = "ApexMarkupLink",
|
||||
["@markup.link.label"] = "ApexMarkupLink",
|
||||
["@markup.link.url"] = "ApexMarkupLink",
|
||||
["@markup.strong"] = "ApexMarkupStrong",
|
||||
["@markup.italic"] = "ApexMarkupItalic",
|
||||
["@markup.strikethrough"] = "DiagnosticDeprecated",
|
||||
["@markup.underline"] = "Underlined",
|
||||
["@markup.raw"] = "String",
|
||||
["@markup.raw.block"] = "String",
|
||||
["@markup.raw.delimiter"] = "Delimiter",
|
||||
["@markup.quote"] = "Comment",
|
||||
["@markup.list"] = "Delimiter",
|
||||
["@markup.list.checked"] = "String",
|
||||
["@markup.list.unchecked"] = "Comment",
|
||||
["@markup.math"] = "Constant",
|
||||
["@markup.environment"] = "Type",
|
||||
["@markup.environment.name"] = "Type",
|
||||
["@type"] = "Type",
|
||||
["@type.builtin"] = "Type",
|
||||
["@type.definition"] = "Type",
|
||||
["@type.qualifier"] = "Keyword",
|
||||
["@variable"] = "Identifier",
|
||||
["@variable.builtin"] = "Identifier",
|
||||
|
||||
["@lsp.type.boolean"] = "Boolean",
|
||||
["@lsp.type.builtinType"] = "Type",
|
||||
["@lsp.type.class"] = "Type",
|
||||
["@lsp.type.comment"] = "Comment",
|
||||
["@lsp.type.decorator"] = "Special",
|
||||
["@lsp.type.enum"] = "Type",
|
||||
["@lsp.type.enumMember"] = "Constant",
|
||||
["@lsp.type.event"] = "Type",
|
||||
["@lsp.type.function"] = "Function",
|
||||
["@lsp.type.interface"] = "Type",
|
||||
["@lsp.type.keyword"] = "Keyword",
|
||||
["@lsp.type.macro"] = "Macro",
|
||||
["@lsp.type.method"] = "Function",
|
||||
["@lsp.type.modifier"] = "Keyword",
|
||||
["@lsp.type.namespace"] = "Structure",
|
||||
["@lsp.type.number"] = "Number",
|
||||
["@lsp.type.operator"] = "Operator",
|
||||
["@lsp.type.parameter"] = "Identifier",
|
||||
["@lsp.type.property"] = "Identifier",
|
||||
["@lsp.type.regexp"] = "SpecialChar",
|
||||
["@lsp.type.string"] = "String",
|
||||
["@lsp.type.struct"] = "Structure",
|
||||
["@lsp.type.type"] = "Type",
|
||||
["@lsp.type.typeParameter"] = "Type",
|
||||
["@lsp.type.variable"] = "Identifier",
|
||||
|
||||
["@lsp.mod.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.mod.abstract"] = "Type",
|
||||
["@lsp.mod.declaration"] = "Keyword",
|
||||
["@lsp.mod.defaultLibrary"] = "Constant",
|
||||
["@lsp.mod.definition"] = "Keyword",
|
||||
["@lsp.mod.documentation"] = "Comment",
|
||||
["@lsp.mod.modification"] = "Operator",
|
||||
["@lsp.mod.readonly"] = "Constant",
|
||||
["@lsp.mod.static"] = "Constant",
|
||||
["@lsp.mod.async"] = "Keyword",
|
||||
|
||||
["@lsp.typemod.function.async"] = "Keyword",
|
||||
["@lsp.typemod.method.async"] = "Keyword",
|
||||
["@lsp.typemod.function.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.method.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.variable.deprecated"] = "DiagnosticDeprecated",
|
||||
["@lsp.typemod.variable.readonly"] = "Constant",
|
||||
["@lsp.typemod.parameter.readonly"] = "Constant",
|
||||
["@lsp.typemod.property.readonly"] = "Constant",
|
||||
["@lsp.typemod.variable.static"] = "Constant",
|
||||
["@lsp.typemod.property.static"] = "Constant",
|
||||
}
|
||||
|
||||
for group, target in pairs(links) do
|
||||
vim.api.nvim_set_hl(0, group, { link = target })
|
||||
end
|
||||
end
|
||||
|
||||
M.load()
|
||||
|
||||
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 */
|
||||
35
templates/wezterm/apex.toml.j2
Normal file
35
templates/wezterm/apex.toml.j2
Normal file
@@ -0,0 +1,35 @@
|
||||
# {{ scheme | upper }} - WezTerm color scheme
|
||||
# Spec-accurate: color = state, not decoration
|
||||
|
||||
[colors]
|
||||
foreground = "{{ palette.foreground }}"
|
||||
background = "{{ palette.background }}"
|
||||
|
||||
cursor_bg = "{{ palette.cursor }}"
|
||||
cursor_border = "{{ palette.cursor }}"
|
||||
cursor_fg = "{{ palette.selection_fg }}"
|
||||
|
||||
selection_bg = "{{ palette.selection }}"
|
||||
selection_fg = "{{ palette.selection_fg }}"
|
||||
|
||||
ansi = [
|
||||
"{{ ansi.normal.black }}",
|
||||
"{{ ansi.normal.red }}",
|
||||
"{{ ansi.normal.green }}",
|
||||
"{{ ansi.normal.yellow }}",
|
||||
"{{ ansi.normal.blue }}",
|
||||
"{{ ansi.normal.magenta }}",
|
||||
"{{ ansi.normal.cyan }}",
|
||||
"{{ ansi.normal.white }}",
|
||||
]
|
||||
|
||||
brights = [
|
||||
"{{ ansi.bright.black }}",
|
||||
"{{ ansi.bright.red }}",
|
||||
"{{ ansi.bright.green }}",
|
||||
"{{ ansi.bright.yellow }}",
|
||||
"{{ ansi.bright.blue }}",
|
||||
"{{ ansi.bright.magenta }}",
|
||||
"{{ ansi.bright.cyan }}",
|
||||
"{{ ansi.bright.white }}",
|
||||
]
|
||||
4
templates/wezterm/meta.yaml
Normal file
4
templates/wezterm/meta.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: S0wlz (Owlibou)
|
||||
description: WezTerm TOML color scheme
|
||||
version: 1.0.0
|
||||
strategy: individual
|
||||
@@ -82,10 +82,15 @@ typeset -g apex_in_git=0
|
||||
typeset -g apex_git_branch=""
|
||||
typeset -g apex_git_dirty_wt=0
|
||||
typeset -g apex_git_dirty_ix=0
|
||||
typeset -g apex_git_untracked=0
|
||||
typeset -g apex_git_conflict=0
|
||||
typeset -g apex_git_op=""
|
||||
typeset -g apex_git_up_ok=0
|
||||
typeset -g apex_git_ahead=0
|
||||
typeset -g apex_git_behind=0
|
||||
typeset -g apex_git_stash=0
|
||||
typeset -g apex_git_root=""
|
||||
typeset -g apex_git_dir=""
|
||||
|
||||
# Radar previous snapshots (transition detection)
|
||||
typeset -g apex_prev_in_git=-1
|
||||
@@ -123,6 +128,50 @@ apex__project_sig() {
|
||||
[[ -n "$s" ]] && print -r -- "$s"
|
||||
}
|
||||
|
||||
apex__escape_prompt() {
|
||||
local s="$1"
|
||||
s="${s//\\%/%%}"
|
||||
print -r -- "$s"
|
||||
}
|
||||
|
||||
apex__now_float() {
|
||||
if [[ -n "${EPOCHREALTIME:-}" ]]; then
|
||||
print -r -- "$EPOCHREALTIME"
|
||||
elif [[ -n "${EPOCHSECONDS:-}" ]]; then
|
||||
print -r -- "${EPOCHSECONDS}.0"
|
||||
else
|
||||
print -r -- "0.0"
|
||||
fi
|
||||
}
|
||||
|
||||
apex__find_git_root() {
|
||||
local dir="$PWD"
|
||||
local git_root=""
|
||||
local git_dir=""
|
||||
|
||||
while [[ -n "$dir" ]]; do
|
||||
if [[ -d "$dir/.git" ]]; then
|
||||
git_root="$dir"
|
||||
git_dir="$dir/.git"
|
||||
break
|
||||
elif [[ -f "$dir/.git" ]]; then
|
||||
local line
|
||||
line="$(<"$dir/.git")"
|
||||
if [[ "$line" == gitdir:* ]]; then
|
||||
git_root="$dir"
|
||||
git_dir="${line#gitdir: }"
|
||||
[[ "$git_dir" != /* ]] && git_dir="$dir/$git_dir"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ "$dir" == "/" ]] && break
|
||||
dir="${dir:h}"
|
||||
done
|
||||
|
||||
[[ -n "$git_root" ]] && print -r -- "${git_root}|${git_dir}"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 6) INTEL (sticky; updated each prompt)
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -143,6 +192,8 @@ apex_update_intel() {
|
||||
apex_mode_sig="nix"
|
||||
elif [[ -n "$DIRENV_DIR" ]]; then
|
||||
apex_mode_sig="direnv"
|
||||
elif [[ -f /run/.containerenv || -f /.dockerenv ]]; then
|
||||
apex_mode_sig="ctr"
|
||||
else
|
||||
apex_mode_sig=""
|
||||
fi
|
||||
@@ -164,39 +215,101 @@ apex_git_update() {
|
||||
apex_git_branch=""
|
||||
apex_git_dirty_wt=0
|
||||
apex_git_dirty_ix=0
|
||||
apex_git_untracked=0
|
||||
apex_git_conflict=0
|
||||
apex_git_op=""
|
||||
apex_git_up_ok=0
|
||||
apex_git_ahead=0
|
||||
apex_git_behind=0
|
||||
apex_git_stash=0
|
||||
|
||||
command git rev-parse --is-inside-work-tree &>/dev/null || return
|
||||
local status_out
|
||||
status_out="$(command git status --porcelain=2 --branch 2>/dev/null)" || {
|
||||
apex_git_root=""
|
||||
apex_git_dir=""
|
||||
return
|
||||
}
|
||||
apex_in_git=1
|
||||
|
||||
apex_git_branch="$(
|
||||
command git symbolic-ref --quiet --short HEAD 2>/dev/null \
|
||||
|| command git rev-parse --short HEAD 2>/dev/null
|
||||
)"
|
||||
if (( apex_pwd_changed )) || [[ -z "$apex_git_root" ]]; then
|
||||
local root_info
|
||||
root_info="$(apex__find_git_root)"
|
||||
if [[ -n "$root_info" ]]; then
|
||||
apex_git_root="${root_info%%|*}"
|
||||
apex_git_dir="${root_info#*|}"
|
||||
else
|
||||
apex_git_root=""
|
||||
apex_git_dir=""
|
||||
fi
|
||||
fi
|
||||
|
||||
local gd; gd="$(command git rev-parse --git-dir 2>/dev/null)" || return
|
||||
[[ -d "$gd/rebase-apply" || -d "$gd/rebase-merge" ]] && apex_git_op="rebase"
|
||||
[[ -f "$gd/MERGE_HEAD" ]] && apex_git_op="merge"
|
||||
[[ -f "$gd/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
|
||||
[[ -f "$gd/BISECT_LOG" ]] && apex_git_op="bisect"
|
||||
local branch_head="" branch_oid="" upstream=""
|
||||
local xy="" ix="" wt=""
|
||||
local line
|
||||
while IFS= read -r line; do
|
||||
case "$line" in
|
||||
\#\ branch.head\ *)
|
||||
branch_head="${line#\# branch.head }"
|
||||
;;
|
||||
\#\ branch.oid\ *)
|
||||
branch_oid="${line#\# branch.oid }"
|
||||
;;
|
||||
\#\ branch.upstream\ *)
|
||||
upstream="${line#\# branch.upstream }"
|
||||
;;
|
||||
\#\ branch.ab\ *)
|
||||
local ab a b
|
||||
ab="${line#\# branch.ab }"
|
||||
IFS=' ' read -r a b <<<"$ab"
|
||||
a="${a#+}"
|
||||
b="${b#-}"
|
||||
apex_git_ahead="${a:-0}"
|
||||
apex_git_behind="${b:-0}"
|
||||
;;
|
||||
1\ *|2\ *)
|
||||
xy="${line[3,4]}"
|
||||
ix="${xy[1]}"
|
||||
wt="${xy[2]}"
|
||||
[[ "$ix" != "." ]] && apex_git_dirty_ix=1
|
||||
[[ "$wt" != "." ]] && apex_git_dirty_wt=1
|
||||
;;
|
||||
u\ *)
|
||||
apex_git_conflict=1
|
||||
apex_git_dirty_ix=1
|
||||
apex_git_dirty_wt=1
|
||||
;;
|
||||
\?\ *)
|
||||
apex_git_untracked=1
|
||||
;;
|
||||
esac
|
||||
done <<<"$status_out"
|
||||
|
||||
# Dirty markers
|
||||
command git diff --quiet --ignore-submodules -- 2>/dev/null || apex_git_dirty_wt=1
|
||||
command git diff --cached --quiet --ignore-submodules -- 2>/dev/null || apex_git_dirty_ix=1
|
||||
if [[ -n "$branch_head" && "$branch_head" != "(detached)" && "$branch_head" != "HEAD" ]]; then
|
||||
apex_git_branch="$branch_head"
|
||||
elif [[ -n "$branch_oid" ]]; then
|
||||
apex_git_branch="${branch_oid[1,7]}"
|
||||
fi
|
||||
|
||||
# Upstream (earned ✓)
|
||||
if command git rev-parse --abbrev-ref --symbolic-full-name @{u} &>/dev/null; then
|
||||
local counts behind ahead
|
||||
counts="$(command git rev-list --left-right --count @{u}...HEAD 2>/dev/null)" || return
|
||||
local IFS=$' \t'
|
||||
read -r behind ahead <<<"$counts"
|
||||
apex_git_behind="${behind:-0}"
|
||||
apex_git_ahead="${ahead:-0}"
|
||||
if [[ -n "$apex_git_dir" ]]; then
|
||||
[[ -d "$apex_git_dir/rebase-apply" || -d "$apex_git_dir/rebase-merge" ]] && apex_git_op="rebase"
|
||||
[[ -f "$apex_git_dir/MERGE_HEAD" ]] && apex_git_op="merge"
|
||||
[[ -f "$apex_git_dir/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
|
||||
[[ -f "$apex_git_dir/BISECT_LOG" ]] && apex_git_op="bisect"
|
||||
|
||||
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 )) && [[ -z "$apex_git_op" ]]; then
|
||||
if [[ -f "$apex_git_dir/logs/refs/stash" ]]; then
|
||||
local -a stash_lines
|
||||
stash_lines=(${(f)"$(<"$apex_git_dir/logs/refs/stash")"})
|
||||
apex_git_stash=$#stash_lines
|
||||
elif [[ -f "$apex_git_dir/refs/stash" ]]; then
|
||||
apex_git_stash=1
|
||||
fi
|
||||
fi
|
||||
|
||||
(( apex_git_conflict )) && apex_git_op="conflict"
|
||||
|
||||
if [[ -n "$upstream" && "$upstream" != "(gone)" ]]; then
|
||||
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 && apex_git_untracked == 0 && apex_git_conflict == 0 && apex_git_stash == 0 )) \
|
||||
&& [[ -z "$apex_git_op" ]]; then
|
||||
[[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1
|
||||
fi
|
||||
fi
|
||||
@@ -248,19 +361,23 @@ apex_intel_r() {
|
||||
apex_vcs_r() {
|
||||
(( APEX[SHOW_VCS] )) || return 0
|
||||
(( apex_in_git )) || return 0
|
||||
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
|
||||
|
||||
if [[ -n "$apex_git_op" ]]; then
|
||||
print -n "%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f"
|
||||
print -n "%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
|
||||
return 0
|
||||
fi
|
||||
|
||||
print -n "%F{${C[CYAN]}}${I[GIT]} ${apex_git_branch}%f"
|
||||
print -n "%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
|
||||
|
||||
local mark=""
|
||||
(( apex_git_dirty_ix )) && mark+="+"
|
||||
(( apex_git_dirty_wt )) && mark+="!"
|
||||
(( apex_git_untracked )) && mark+="?"
|
||||
[[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f"
|
||||
|
||||
(( apex_git_stash > 0 )) && print -n "%F{${C[MUTED]}} s${apex_git_stash}%f"
|
||||
|
||||
(( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f"
|
||||
|
||||
if (( APEX[GIT_AHEAD_BEHIND] )); then
|
||||
@@ -270,15 +387,23 @@ apex_vcs_r() {
|
||||
}
|
||||
|
||||
apex_friction_r() {
|
||||
if (( APEX[SHOW_RO] )) && [[ ! -w . ]]; then
|
||||
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
|
||||
return 0
|
||||
if (( APEX[SHOW_RO] )); then
|
||||
local ro=0
|
||||
[[ ! -w . ]] && ro=1
|
||||
if (( apex_in_git )) && [[ -n "$apex_git_root" && ! -w "$apex_git_root" ]]; then
|
||||
ro=1
|
||||
fi
|
||||
if (( ro )); then
|
||||
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( APEX[SHOW_JOBS] )); then
|
||||
local jc
|
||||
jc=$(jobs -p 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [[ -n "$jc" && "$jc" != "0" ]]; then
|
||||
local -a job_pids
|
||||
job_pids=(${(f)"$(jobs -p 2>/dev/null)"})
|
||||
local jc=$#job_pids
|
||||
if (( jc > 0 )); then
|
||||
print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f"
|
||||
return 0
|
||||
fi
|
||||
@@ -313,6 +438,7 @@ apex_radar_aar() {
|
||||
(( show )) || return 0
|
||||
|
||||
local short; short="$(apex__short_cmd "$cmd")"
|
||||
short="$(apex__escape_prompt "$short")"
|
||||
|
||||
local dur_color="${C[MUTED]}"
|
||||
(( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}"
|
||||
@@ -388,10 +514,11 @@ apex_radar_context_burst() {
|
||||
|
||||
# Git first
|
||||
if (( apex_in_git )); then
|
||||
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
|
||||
if [[ -n "$apex_git_op" ]]; then
|
||||
out+="%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f"
|
||||
out+="%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
|
||||
else
|
||||
out+="%F{${C[CYAN]}}${I[GIT]} ${apex_git_branch}%f"
|
||||
out+="%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -417,7 +544,7 @@ apex_radar_context_burst() {
|
||||
# -----------------------------------------------------------------------------
|
||||
apex_preexec_hook() {
|
||||
apex_has_run_cmd=1
|
||||
apex_cmd_start=${EPOCHREALTIME:-$EPOCHSECONDS}
|
||||
apex_cmd_start="$(apex__now_float)"
|
||||
apex_last_cmd="$1"
|
||||
}
|
||||
|
||||
@@ -436,9 +563,14 @@ apex_precmd_hook() {
|
||||
(( apex_has_run_cmd )) && ran=1
|
||||
|
||||
if (( ran )); then
|
||||
local now=${EPOCHREALTIME:-$EPOCHSECONDS}
|
||||
local -i ms
|
||||
ms=$(( (now - apex_cmd_start) * 1000 ))
|
||||
local now; now="$(apex__now_float)"
|
||||
local -i ms=0
|
||||
local -F delta=0.0
|
||||
if [[ -n "$now" ]]; then
|
||||
delta=$(( now - apex_cmd_start ))
|
||||
(( delta < 0 )) && delta=0
|
||||
ms=$(( delta * 1000 ))
|
||||
fi
|
||||
|
||||
# Show time if: slow OR ops OR failed.
|
||||
local dur=""
|
||||
|
||||
Reference in New Issue
Block a user