13 Commits

Author SHA1 Message Date
s0wlz (Matthias Puchstein)
6a815f72b3 feat: streamline zsh prompt git state
- parse git status in one call and add untracked/stash/conflict markers
- escape prompt strings and harden timing math
- improve ro/jobs checks and add container intel
2026-01-12 23:46:25 +01:00
s0wlz (Matthias Puchstein)
2ac05f469c feat: expand nvim highlights and add audit script 2026-01-12 23:11:24 +01:00
s0wlz (Matthias Puchstein)
6b3bb01c2c reworked the nvim theme a bit more 2026-01-12 22:40:55 +01:00
s0wlz (Matthias Puchstein)
74cd31a03e reworked the nvim theme a bit 2026-01-12 22:18:47 +01:00
s0wlz (Matthias Puchstein)
a00cf1f6ff feat(nvim): add transparency for floating UI
Set winblend and pumblend to 20 (80% opaque) for floating windows
and popup menus.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 21:34:04 +01:00
s0wlz (Matthias Puchstein)
cb0fa9e6f1 feat: add wezterm and ghostty themes 2025-12-31 07:36:00 +01:00
s0wlz (Matthias Puchstein)
ed658e43b3 chore: track dist outputs 2025-12-31 06:22:01 +01:00
s0wlz (Matthias Puchstein)
f4566fa638 fix: release meta.yaml newlines 2025-12-31 06:17:21 +01:00
s0wlz (Matthias Puchstein)
c046821dc9 chore: release apps v1.0.0 2025-12-31 06:15:25 +01:00
s0wlz (Matthias Puchstein)
aa8bc21d97 fix: normalize new app meta.yaml 2025-12-31 06:14:52 +01:00
s0wlz (Matthias Puchstein)
3ea3533139 chore: release apps v1.0.0 2025-12-31 06:11:39 +01:00
s0wlz (Matthias Puchstein)
b8fffddd1b feat: add spicetify, owlry, and sherlock templates 2025-12-31 06:10:46 +01:00
s0wlz (Matthias Puchstein)
1198ae8afd chore: add release automation 2025-12-31 05:07:22 +01:00
55 changed files with 5874 additions and 52 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,3 @@
dist/
.venv/
__pycache__/
*.pyc

View File

@@ -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
View File

@@ -0,0 +1,3 @@
# Release artifacts (tarballs)
releases/
*.tar.gz

63
dist/alacritty/apex-aeon.toml vendored Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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 (07)
# 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 (815)
# 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
View 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 (07)
# 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 (815)
# 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View File

@@ -0,0 +1 @@
/* Apex Aeon - Spicetify overrides */

17
dist/spicetify/apex-neon-color.ini vendored Normal file
View 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
View File

@@ -0,0 +1 @@
/* Apex Neon - Spicetify overrides */

146
dist/swaync/apex-aeon-style.css vendored Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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 }}

View File

@@ -0,0 +1,4 @@
author: S0wlz (Owlibou)
description: Ghostty theme
version: 1.0.0
strategy: individual

View File

@@ -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
View 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);
}

View File

@@ -0,0 +1,4 @@
author: S0wlz (Owlibou)
description: Owlry theme
version: 1.0.0
strategy: individual

View 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;
}

View File

@@ -0,0 +1,4 @@
author: S0wlz (Owlibou)
description: Sherlock launcher theme
version: 1.0.0
strategy: individual

View 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('#', '') }}

View File

@@ -0,0 +1,4 @@
author: S0wlz (Owlibou)
description: Spicetify theme files
version: 1.0.0
strategy: individual

View File

@@ -0,0 +1 @@
/* {{ scheme }} - Spicetify overrides */

View 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 }}",
]

View File

@@ -0,0 +1,4 @@
author: S0wlz (Owlibou)
description: WezTerm TOML color scheme
version: 1.0.0
strategy: individual

View File

@@ -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=""