diff --git a/.gitignore b/.gitignore index f216769..77ac754 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -dist/ .venv/ __pycache__/ *.pyc diff --git a/dist/.gitignore b/dist/.gitignore new file mode 100644 index 0000000..1a5a389 --- /dev/null +++ b/dist/.gitignore @@ -0,0 +1,3 @@ +# Release artifacts (tarballs) +releases/ +*.tar.gz diff --git a/dist/alacritty/apex-aeon.toml b/dist/alacritty/apex-aeon.toml new file mode 100644 index 0000000..c711f43 --- /dev/null +++ b/dist/alacritty/apex-aeon.toml @@ -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" \ No newline at end of file diff --git a/dist/alacritty/apex-neon.toml b/dist/alacritty/apex-neon.toml new file mode 100644 index 0000000..edf015e --- /dev/null +++ b/dist/alacritty/apex-neon.toml @@ -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" \ No newline at end of file diff --git a/dist/btop/apex-aeon.theme b/dist/btop/apex-aeon.theme new file mode 100644 index 0000000..884bf10 --- /dev/null +++ b/dist/btop/apex-aeon.theme @@ -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" \ No newline at end of file diff --git a/dist/btop/apex-neon.theme b/dist/btop/apex-neon.theme new file mode 100644 index 0000000..a430d27 --- /dev/null +++ b/dist/btop/apex-neon.theme @@ -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" \ No newline at end of file diff --git a/dist/fuzzel/apex-aeon-fuzzel.ini b/dist/fuzzel/apex-aeon-fuzzel.ini new file mode 100644 index 0000000..3027163 --- /dev/null +++ b/dist/fuzzel/apex-aeon-fuzzel.ini @@ -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 \ No newline at end of file diff --git a/dist/fuzzel/apex-neon-fuzzel.ini b/dist/fuzzel/apex-neon-fuzzel.ini new file mode 100644 index 0000000..5e94581 --- /dev/null +++ b/dist/fuzzel/apex-neon-fuzzel.ini @@ -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 \ No newline at end of file diff --git a/dist/gemini/apex-aeon.json b/dist/gemini/apex-aeon.json new file mode 100644 index 0000000..a1d3e92 --- /dev/null +++ b/dist/gemini/apex-aeon.json @@ -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" + } +} \ No newline at end of file diff --git a/dist/gemini/apex-neon.json b/dist/gemini/apex-neon.json new file mode 100644 index 0000000..db11b47 --- /dev/null +++ b/dist/gemini/apex-neon.json @@ -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" + } +} \ No newline at end of file diff --git a/dist/gtk4/gtk.css b/dist/gtk4/gtk.css new file mode 100644 index 0000000..492891d --- /dev/null +++ b/dist/gtk4/gtk.css @@ -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; + } +} diff --git a/dist/hyprland/apex-aeon-colors.conf b/dist/hyprland/apex-aeon-colors.conf new file mode 100644 index 0000000..3e63f64 --- /dev/null +++ b/dist/hyprland/apex-aeon-colors.conf @@ -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) \ No newline at end of file diff --git a/dist/hyprland/apex-neon-colors.conf b/dist/hyprland/apex-neon-colors.conf new file mode 100644 index 0000000..9f0b22f --- /dev/null +++ b/dist/hyprland/apex-neon-colors.conf @@ -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) \ No newline at end of file diff --git a/dist/kitty/apex-aeon.conf b/dist/kitty/apex-aeon.conf new file mode 100644 index 0000000..d2d3990 --- /dev/null +++ b/dist/kitty/apex-aeon.conf @@ -0,0 +1,66 @@ +## APEX AEON - KITTY THEME ## +## Spec-accurate: color = state, not decoration + +# --- Core --- +foreground #0a0a0a +background #f5f5f5 + +# Selection: "target locked" +selection_background #ff0044 +selection_foreground #0a0a0a + +# Cursor: Razor Red beam +cursor #ff0044 +cursor_text_color #0a0a0a +cursor_shape beam + +# URLs: informational cyan +url_color #007a88 + +# Borders (optional) +active_border_color #ff0044 +inactive_border_color #737373 + +# Optional: subtle UI hint for visual bell +visual_bell_color #ff4d6d + +# Spacing +window_padding_width 4 + +# --- 16-COLOR ANSI TABLE (Apex Aeon spec) --- + +# Normal bank (0–7) +# color0: Black (Void) +color0 #0a0a0a +# color1: Red (Razor) +color1 #ff0044 +# color2: Green (OK) +color2 #00b377 +# color3: Yellow (Gold) +color3 #d18f00 +# color4: Blue (Info) +color4 #007a88 +# color5: Magenta (Purple) +color5 #7a3cff +# color6: Cyan (Info mapped) +color6 #007a88 +# color7: White (Stark) +color7 #f5f5f5 + +# Bright bank (8–15) +# color8: Bright black (UI separators) +color8 #737373 +# color9: Bright red (Alerts) +color9 #ff4d6d +# color10: Bright green (Active success) +color10 #33d6a6 +# color11: Bright yellow (Urgent warning) +color11 #ffbf40 +# color12: Bright blue (Active info) +color12 #33bccc +# color13: Bright magenta (Elevated special) +color13 #a680ff +# color14: Bright cyan (Active tech signal) +color14 #33bccc +# color15: Bright white (Extreme highlight) +color15 #ffffff \ No newline at end of file diff --git a/dist/kitty/apex-neon.conf b/dist/kitty/apex-neon.conf new file mode 100644 index 0000000..74ab105 --- /dev/null +++ b/dist/kitty/apex-neon.conf @@ -0,0 +1,66 @@ +## APEX NEON - KITTY THEME ## +## Spec-accurate: color = state, not decoration + +# --- Core --- +foreground #ededed +background #050505 + +# Selection: "target locked" +selection_background #ff0044 +selection_foreground #050505 + +# Cursor: Razor Red beam +cursor #ff0044 +cursor_text_color #050505 +cursor_shape beam + +# URLs: informational cyan +url_color #00eaff + +# Borders (optional) +active_border_color #ff0044 +inactive_border_color #262626 + +# Optional: subtle UI hint for visual bell +visual_bell_color #ff8899 + +# Spacing +window_padding_width 4 + +# --- 16-COLOR ANSI TABLE (Apex Neon spec) --- + +# Normal bank (0–7) +# color0: Black (Void) +color0 #050505 +# color1: Red (Razor) +color1 #ff0044 +# color2: Green (OK) +color2 #00ff99 +# color3: Yellow (Gold) +color3 #ffb700 +# color4: Blue (Info) +color4 #00eaff +# color5: Magenta (Purple) +color5 #9d00ff +# color6: Cyan (Info mapped) +color6 #00eaff +# color7: White (Stark) +color7 #ededed + +# Bright bank (8–15) +# color8: Bright black (UI separators) +color8 #737373 +# color9: Bright red (Alerts) +color9 #ff8899 +# color10: Bright green (Active success) +color10 #2bffb2 +# color11: Bright yellow (Urgent warning) +color11 #ffd24d +# color12: Bright blue (Active info) +color12 #5af3ff +# color13: Bright magenta (Elevated special) +color13 #c84dff +# color14: Bright cyan (Active tech signal) +color14 #5af3ff +# color15: Bright white (Extreme highlight) +color15 #ffffff \ No newline at end of file diff --git a/dist/nvim/colors/apex-aeon.lua b/dist/nvim/colors/apex-aeon.lua new file mode 100644 index 0000000..15fb36d --- /dev/null +++ b/dist/nvim/colors/apex-aeon.lua @@ -0,0 +1,164 @@ +-- 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 + alert = "#ff4d6d", -- ERROR: Readable text on Red + + -- 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" + + 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.razor }, -- Deprecated in nvim 0.10, but good fallback + WinSeparator = { fg = p.razor }, -- The Cage (Red Borders) + EndOfBuffer = { fg = p.void }, -- Hide tildes + + -- CURSOR & NAVIGATION ("The Hunter") ------------------------------------ + Cursor = { fg = p.void, bg = p.razor }, -- Red Beam + TermCursor = { fg = p.void, bg = p.razor }, + CursorLine = { 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.void, bg = p.razor }, -- Red (Acquiring...) + CurSearch = { fg = p.void, 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 + PmenuSbar = { bg = p.panel }, + PmenuThumb = { bg = p.stealth }, + + -- 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.razor }, + Todo = { fg = p.void, bg = p.amber, bold = true }, + + -- DIAGNOSTICS ----------------------------------------------------------- + DiagnosticError = { fg = p.razor }, + DiagnosticWarn = { fg = p.amber }, + DiagnosticInfo = { fg = p.tech }, + DiagnosticHint = { fg = p.dim }, + + DiagnosticUnderlineError = { sp = p.razor, underline = true }, + DiagnosticUnderlineWarn = { sp = p.amber, underline = 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.void, bg = p.razor }, -- Red Label + TelescopeResultsTitle = { fg = p.void, bg = p.panel }, + TelescopeSelection = { fg = p.void, 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 +end + +M.load() + +return M \ No newline at end of file diff --git a/dist/nvim/colors/apex-neon.lua b/dist/nvim/colors/apex-neon.lua new file mode 100644 index 0000000..2e3ca9d --- /dev/null +++ b/dist/nvim/colors/apex-neon.lua @@ -0,0 +1,164 @@ +-- 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 + alert = "#ff8899", -- ERROR: Readable text on Red + + -- 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" + + 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.razor }, -- Deprecated in nvim 0.10, but good fallback + WinSeparator = { fg = p.razor }, -- The Cage (Red Borders) + EndOfBuffer = { fg = p.void }, -- Hide tildes + + -- CURSOR & NAVIGATION ("The Hunter") ------------------------------------ + Cursor = { fg = p.void, bg = p.razor }, -- Red Beam + TermCursor = { fg = p.void, bg = p.razor }, + CursorLine = { 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.void, bg = p.razor }, -- Red (Acquiring...) + CurSearch = { fg = p.void, 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 + PmenuSbar = { bg = p.panel }, + PmenuThumb = { bg = p.stealth }, + + -- 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.razor }, + Todo = { fg = p.void, bg = p.amber, bold = true }, + + -- DIAGNOSTICS ----------------------------------------------------------- + DiagnosticError = { fg = p.razor }, + DiagnosticWarn = { fg = p.amber }, + DiagnosticInfo = { fg = p.tech }, + DiagnosticHint = { fg = p.dim }, + + DiagnosticUnderlineError = { sp = p.razor, underline = true }, + DiagnosticUnderlineWarn = { sp = p.amber, underline = 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.void, bg = p.razor }, -- Red Label + TelescopeResultsTitle = { fg = p.void, bg = p.panel }, + TelescopeSelection = { fg = p.void, 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 +end + +M.load() + +return M \ No newline at end of file diff --git a/dist/owlry/apex-aeon.css b/dist/owlry/apex-aeon.css new file mode 100644 index 0000000..f6c8928 --- /dev/null +++ b/dist/owlry/apex-aeon.css @@ -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); +} \ No newline at end of file diff --git a/dist/owlry/apex-neon.css b/dist/owlry/apex-neon.css new file mode 100644 index 0000000..d2d7b91 --- /dev/null +++ b/dist/owlry/apex-neon.css @@ -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); +} \ No newline at end of file diff --git a/dist/sherlock/apex-aeon.css b/dist/sherlock/apex-aeon.css new file mode 100644 index 0000000..368dc64 --- /dev/null +++ b/dist/sherlock/apex-aeon.css @@ -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; +} \ No newline at end of file diff --git a/dist/sherlock/apex-neon.css b/dist/sherlock/apex-neon.css new file mode 100644 index 0000000..e652ba4 --- /dev/null +++ b/dist/sherlock/apex-neon.css @@ -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; +} \ No newline at end of file diff --git a/dist/spicetify/apex-aeon-color.ini b/dist/spicetify/apex-aeon-color.ini new file mode 100644 index 0000000..9e82cec --- /dev/null +++ b/dist/spicetify/apex-aeon-color.ini @@ -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 \ No newline at end of file diff --git a/dist/spicetify/apex-aeon-user.css b/dist/spicetify/apex-aeon-user.css new file mode 100644 index 0000000..503f559 --- /dev/null +++ b/dist/spicetify/apex-aeon-user.css @@ -0,0 +1 @@ +/* Apex Aeon - Spicetify overrides */ \ No newline at end of file diff --git a/dist/spicetify/apex-neon-color.ini b/dist/spicetify/apex-neon-color.ini new file mode 100644 index 0000000..aabc0bf --- /dev/null +++ b/dist/spicetify/apex-neon-color.ini @@ -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 \ No newline at end of file diff --git a/dist/spicetify/apex-neon-user.css b/dist/spicetify/apex-neon-user.css new file mode 100644 index 0000000..54b8437 --- /dev/null +++ b/dist/spicetify/apex-neon-user.css @@ -0,0 +1 @@ +/* Apex Neon - Spicetify overrides */ \ No newline at end of file diff --git a/dist/swaync/apex-aeon-style.css b/dist/swaync/apex-aeon-style.css new file mode 100644 index 0000000..21d96eb --- /dev/null +++ b/dist/swaync/apex-aeon-style.css @@ -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; +} \ No newline at end of file diff --git a/dist/swaync/apex-neon-style.css b/dist/swaync/apex-neon-style.css new file mode 100644 index 0000000..fe23a00 --- /dev/null +++ b/dist/swaync/apex-neon-style.css @@ -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; +} \ No newline at end of file diff --git a/dist/waybar/apex-aeon-colors.css b/dist/waybar/apex-aeon-colors.css new file mode 100644 index 0000000..ef926f9 --- /dev/null +++ b/dist/waybar/apex-aeon-colors.css @@ -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; \ No newline at end of file diff --git a/dist/waybar/apex-neon-colors.css b/dist/waybar/apex-neon-colors.css new file mode 100644 index 0000000..886227d --- /dev/null +++ b/dist/waybar/apex-neon-colors.css @@ -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; \ No newline at end of file diff --git a/dist/zathura/apex-aeon-zathurarc b/dist/zathura/apex-aeon-zathurarc new file mode 100644 index 0000000..1bfd76f --- /dev/null +++ b/dist/zathura/apex-aeon-zathurarc @@ -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" \ No newline at end of file diff --git a/dist/zathura/apex-neon-zathurarc b/dist/zathura/apex-neon-zathurarc new file mode 100644 index 0000000..e0ce10f --- /dev/null +++ b/dist/zathura/apex-neon-zathurarc @@ -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" \ No newline at end of file diff --git a/dist/zed/apex.json b/dist/zed/apex.json new file mode 100644 index 0000000..32c0ac3 --- /dev/null +++ b/dist/zed/apex.json @@ -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" + } + } + } + } + + ] +} diff --git a/dist/zsh/apex-aeon.zsh-theme b/dist/zsh/apex-aeon.zsh-theme new file mode 100644 index 0000000..3963e5b --- /dev/null +++ b/dist/zsh/apex-aeon.zsh-theme @@ -0,0 +1,488 @@ +# 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_op="" +typeset -g apex_git_up_ok=0 +typeset -g apex_git_ahead=0 +typeset -g apex_git_behind=0 + +# 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" +} + +# ----------------------------------------------------------------------------- +# 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" + 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_op="" + apex_git_up_ok=0 + apex_git_ahead=0 + apex_git_behind=0 + + command git rev-parse --is-inside-work-tree &>/dev/null || 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 + )" + + 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" + + # 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 + + # 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 (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 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 + + if [[ -n "$apex_git_op" ]]; then + print -n "%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f" + return 0 + fi + + print -n "%F{${C[CYAN]}}${I[GIT]} ${apex_git_branch}%f" + + local mark="" + (( apex_git_dirty_ix )) && mark+="+" + (( apex_git_dirty_wt )) && mark+="!" + [[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%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] )) && [[ ! -w . ]]; then + print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f" + return 0 + fi + + if (( APEX[SHOW_JOBS] )); then + local jc + jc=$(jobs -p 2>/dev/null | wc -l | tr -d ' ') + if [[ -n "$jc" && "$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")" + + 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 + if [[ -n "$apex_git_op" ]]; then + out+="%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f" + else + out+="%F{${C[CYAN]}}${I[GIT]} ${apex_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=${EPOCHREALTIME:-$EPOCHSECONDS} + 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=${EPOCHREALTIME:-$EPOCHSECONDS} + local -i ms + ms=$(( (now - apex_cmd_start) * 1000 )) + + # 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)' \ No newline at end of file diff --git a/dist/zsh/apex-neon.zsh-theme b/dist/zsh/apex-neon.zsh-theme new file mode 100644 index 0000000..dd4dd15 --- /dev/null +++ b/dist/zsh/apex-neon.zsh-theme @@ -0,0 +1,488 @@ +# 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_op="" +typeset -g apex_git_up_ok=0 +typeset -g apex_git_ahead=0 +typeset -g apex_git_behind=0 + +# 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" +} + +# ----------------------------------------------------------------------------- +# 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" + 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_op="" + apex_git_up_ok=0 + apex_git_ahead=0 + apex_git_behind=0 + + command git rev-parse --is-inside-work-tree &>/dev/null || 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 + )" + + 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" + + # 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 + + # 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 (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 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 + + if [[ -n "$apex_git_op" ]]; then + print -n "%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f" + return 0 + fi + + print -n "%F{${C[CYAN]}}${I[GIT]} ${apex_git_branch}%f" + + local mark="" + (( apex_git_dirty_ix )) && mark+="+" + (( apex_git_dirty_wt )) && mark+="!" + [[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%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] )) && [[ ! -w . ]]; then + print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f" + return 0 + fi + + if (( APEX[SHOW_JOBS] )); then + local jc + jc=$(jobs -p 2>/dev/null | wc -l | tr -d ' ') + if [[ -n "$jc" && "$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")" + + 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 + if [[ -n "$apex_git_op" ]]; then + out+="%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f" + else + out+="%F{${C[CYAN]}}${I[GIT]} ${apex_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=${EPOCHREALTIME:-$EPOCHSECONDS} + 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=${EPOCHREALTIME:-$EPOCHSECONDS} + local -i ms + ms=$(( (now - apex_cmd_start) * 1000 )) + + # 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)' \ No newline at end of file