15 Commits

Author SHA1 Message Date
799601134d added claude to this repo 2026-03-11 00:44:29 +01:00
e65eb8f6a4 feat: canonicalize syntax roles + theme zsh plugins
Add authoritative `syntax:` block to both YAML specs mapping keyword,
type, function, string, constant, operator, variable, comment, and
punctuation to their semantic palette colors. Align nvim and Zed
templates to this canonical mapping (keyword=purple, type=amber,
number/bool/constant=cyan, operator=white). Fix nvim Special/SpecialChar/
Tag (were cyan; now purple/amber/blue respectively).

Add plugin color variables to zsh template: ZSH_AUTOSUGGEST uses dim
grey for ghost text; HISTORY_SUBSTRING_SEARCH uses cyan for found and
bright-red for not-found, matching the semantic palette signal system.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 00:43:52 +01:00
6a815f72b3 feat: streamline zsh prompt git state
- parse git status in one call and add untracked/stash/conflict markers
- escape prompt strings and harden timing math
- improve ro/jobs checks and add container intel
2026-01-12 23:46:25 +01:00
2ac05f469c feat: expand nvim highlights and add audit script 2026-01-12 23:11:24 +01:00
6b3bb01c2c reworked the nvim theme a bit more 2026-01-12 22:40:55 +01:00
74cd31a03e reworked the nvim theme a bit 2026-01-12 22:18:47 +01:00
a00cf1f6ff feat(nvim): add transparency for floating UI
Set winblend and pumblend to 20 (80% opaque) for floating windows
and popup menus.

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

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

1
.gitignore vendored
View File

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

48
CLAUDE.md Normal file
View File

@@ -0,0 +1,48 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Build
```bash
uv run build.py
```
Regenerates all theme files from `src/*.yaml` via Jinja2 templates into `dist/`. There is no watch mode — rerun after any YAML or template change. Python 3.12+ required; dependencies managed via `uv` (`pyproject.toml`).
## Architecture
Apex is a **theme factory** — a build system that generates native theme configs for 14+ applications from a single semantic color specification.
**Data flow:**
1. `src/neon.yaml` and `src/aeon.yaml` define the canonical color palette and semantic roles
2. `templates/<app>/*.j2` define per-application output formats (Lua, JSON, TOML, CSS, Conf, etc.)
3. `templates/<app>/meta.yaml` controls the build strategy:
- `strategy: individual` → outputs `apex-neon.<ext>` and `apex-aeon.<ext>` separately
- `strategy: aggregated` → outputs a single file containing both schemes (e.g., `apex.json` for Zed)
4. `build.py` orchestrates rendering; `dist/` holds all generated artifacts (gitignored)
**Adding a new app target:** create `templates/<app>/`, add a `meta.yaml` with strategy, write `.j2` templates using the YAML variables, then run the build.
## Theme Design Rules
`GEMINI.md` is the authoritative source of truth for color semantics. Key axioms:
- **Red (`#ff0044`) = Active Intent** — cursor, current location, selection, critical errors. Text on red backgrounds must be `#050505` (Neon) or `#0a0a0a` (Aeon).
- **Cyan = Informational** — never use for errors or destruction.
- **Purple = Sacred** — reserved for root access and exceptional system states.
- **Bright ANSI variants (815)** are for escalated/active states only.
- Do not introduce colors without a semantic reason. If it has no signal purpose, remove it.
Before modifying `src/*.yaml`, consult `GEMINI.md` to verify that any new or changed role fits the semantic palette.
## Conventions
- Commit style: Conventional Commits (`feat:`, `fix:`, `docs:`, `chore:`, `refactor:`)
- Template output names: `apex-<scheme>.<ext>` for individual; base name for aggregated
- YAML keys in `src/`: keep consistent with existing semantic roles; add new roles only when truly necessary
- `dist/` is build output — never edit by hand
## Validation
After changes, run `uv run build.py` and inspect relevant files in `dist/`. For Neovim-specific validation, `scripts/nvim-audit.sh` is available.

View File

@@ -16,6 +16,8 @@ The factory currently generates native themes for:
- **Zed** (JSON extension) - **Zed** (JSON extension)
- **Alacritty** (TOML) - **Alacritty** (TOML)
- **Kitty** (Conf) - **Kitty** (Conf)
- **WezTerm** (TOML)
- **Ghostty** (Theme)
- **Zsh** (Theme with Radar/AAR) - **Zsh** (Theme with Radar/AAR)
- **Gemini CLI** (JSON) - **Gemini CLI** (JSON)
- **GTK4 / Libadwaita** (CSS) - **GTK4 / Libadwaita** (CSS)
@@ -52,6 +54,22 @@ uv run build.py
Artifacts are output to the `dist/` directory, organized by application. Artifacts are output to the `dist/` directory, organized by application.
## Releases
Per-app releases are automated via `scripts/release.sh`. The script only bumps
app versions when relevant files changed since the last `<app>-vX.Y.Z` tag,
then rebuilds, creates per-app tarballs, and publishes Gitea releases.
Example:
```bash
./scripts/release.sh 1.0.2 --notes-dir release-notes
```
Notes:
- Use `release-notes/<app>.md` or `release-notes/common.md` for release notes.
- Requires a working `tea` login and push access to the repo.
## Project Structure ## Project Structure
- `src/`: Source YAML definitions containing the "DNA" of the themes. - `src/`: Source YAML definitions containing the "DNA" of the themes.

3
dist/.gitignore vendored Normal file
View File

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

63
dist/alacritty/apex-aeon.toml vendored Normal file
View File

@@ -0,0 +1,63 @@
# APEX AEON — Alacritty theme (colors only)
[colors.primary]
background = "#f5f5f5"
foreground = "#0a0a0a"
dim_foreground = "#737373"
bright_foreground = "#ffffff"
[colors.cursor]
text = "#0a0a0a"
cursor = "#ff0044"
[colors.vi_mode_cursor]
text = "#0a0a0a"
cursor = "#007a88"
[colors.selection]
text = "#0a0a0a"
background = "#ff0044"
[colors.search.matches]
foreground = "#0a0a0a"
background = "#ff0044"
[colors.search.focused_match]
foreground = "#0a0a0a"
background = "#d18f00"
[colors.hints.start]
foreground = "#0a0a0a"
background = "#d18f00"
[colors.hints.end]
foreground = "#0a0a0a"
background = "#007a88"
[colors.line_indicator]
foreground = "None"
background = "None"
[colors.footer_bar]
foreground = "#0a0a0a"
background = "#e8e8e8"
[colors.normal]
black = "#0a0a0a"
red = "#ff0044"
green = "#00b377"
yellow = "#d18f00"
blue = "#007a88"
magenta = "#7a3cff"
cyan = "#007a88"
white = "#f5f5f5"
[colors.bright]
black = "#737373"
red = "#ff4d6d"
green = "#33d6a6"
yellow = "#ffbf40"
blue = "#33bccc"
magenta = "#a680ff"
cyan = "#33bccc"
white = "#ffffff"

63
dist/alacritty/apex-neon.toml vendored Normal file
View File

@@ -0,0 +1,63 @@
# APEX NEON — Alacritty theme (colors only)
[colors.primary]
background = "#050505"
foreground = "#ededed"
dim_foreground = "#737373"
bright_foreground = "#ffffff"
[colors.cursor]
text = "#050505"
cursor = "#ff0044"
[colors.vi_mode_cursor]
text = "#050505"
cursor = "#00eaff"
[colors.selection]
text = "#050505"
background = "#ff0044"
[colors.search.matches]
foreground = "#050505"
background = "#ff0044"
[colors.search.focused_match]
foreground = "#050505"
background = "#ffb700"
[colors.hints.start]
foreground = "#050505"
background = "#ffb700"
[colors.hints.end]
foreground = "#050505"
background = "#00eaff"
[colors.line_indicator]
foreground = "None"
background = "None"
[colors.footer_bar]
foreground = "#ededed"
background = "#141414"
[colors.normal]
black = "#050505"
red = "#ff0044"
green = "#00ff99"
yellow = "#ffb700"
blue = "#00eaff"
magenta = "#9d00ff"
cyan = "#00eaff"
white = "#ededed"
[colors.bright]
black = "#737373"
red = "#ff8899"
green = "#2bffb2"
yellow = "#ffd24d"
blue = "#5af3ff"
magenta = "#c84dff"
cyan = "#5af3ff"
white = "#ffffff"

89
dist/btop/apex-aeon.theme vendored Normal file
View File

@@ -0,0 +1,89 @@
# Apex Aeon — Btop Theme
# DNA: State over Decoration
# Main background, empty for terminal default, black for dark themes
theme[main_bg]="#f5f5f5"
# Main text color
theme[main_fg]="#0a0a0a"
# Title color for boxes
theme[title]="#0a0a0a"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#ff0044"
# Background color of selected item in processes box
theme[selected_bg]="#ff0044"
# Foreground color of selected item in processes box
theme[selected_fg]="#0a0a0a"
# Color of inactive/disabled text
theme[inactive_fg]="#737373"
# Color of text appearing on top of graphs, i.e. usage percentage
theme[graph_text]="#737373"
# Background color of the percentage meters
theme[meter_bg]="#e8e8e8"
# Misc colors for processes box including mini cpu graphs, used memory percentage, and entries filter
theme[proc_misc]="#007a88"
# Cpu box outline color
theme[cpu_box]="#737373"
# Memory box outline color
theme[mem_box]="#737373"
# Net box outline color
theme[net_box]="#737373"
# Processes box outline color
theme[proc_box]="#737373"
# Box divider line and small boxes line color
theme[div_line]="#737373"
# Temperature graph colors
theme[temp_start]="#007a88"
theme[temp_mid]="#7a3cff"
theme[temp_end]="#ff0044"
# CPU graph colors
theme[cpu_start]="#007a88"
theme[cpu_mid]="#7a3cff"
theme[cpu_end]="#ff0044"
# Mem graph colors
theme[free_start]="#00b377"
theme[free_mid]="#d18f00"
theme[free_end]="#ff0044"
theme[cached_start]="#007a88"
theme[cached_mid]="#7a3cff"
theme[cached_end]="#ff0044"
theme[available_start]="#00b377"
theme[available_mid]="#d18f00"
theme[available_end]="#ff0044"
theme[used_start]="#007a88"
theme[used_mid]="#7a3cff"
theme[used_end]="#ff0044"
# Download graph colors
theme[download_start]="#007a88"
theme[download_mid]="#7a3cff"
theme[download_end]="#ff0044"
# Upload graph colors
theme[upload_start]="#007a88"
theme[upload_mid]="#7a3cff"
theme[upload_end]="#ff0044"
# Process path color
theme[process_start]="#007a88"
theme[process_mid]="#7a3cff"
theme[process_end]="#ff0044"

89
dist/btop/apex-neon.theme vendored Normal file
View File

@@ -0,0 +1,89 @@
# Apex Neon — Btop Theme
# DNA: State over Decoration
# Main background, empty for terminal default, black for dark themes
theme[main_bg]="#050505"
# Main text color
theme[main_fg]="#ededed"
# Title color for boxes
theme[title]="#ededed"
# Highlight color for keyboard shortcuts
theme[hi_fg]="#ff0044"
# Background color of selected item in processes box
theme[selected_bg]="#ff0044"
# Foreground color of selected item in processes box
theme[selected_fg]="#050505"
# Color of inactive/disabled text
theme[inactive_fg]="#737373"
# Color of text appearing on top of graphs, i.e. usage percentage
theme[graph_text]="#737373"
# Background color of the percentage meters
theme[meter_bg]="#141414"
# Misc colors for processes box including mini cpu graphs, used memory percentage, and entries filter
theme[proc_misc]="#00eaff"
# Cpu box outline color
theme[cpu_box]="#262626"
# Memory box outline color
theme[mem_box]="#262626"
# Net box outline color
theme[net_box]="#262626"
# Processes box outline color
theme[proc_box]="#262626"
# Box divider line and small boxes line color
theme[div_line]="#262626"
# Temperature graph colors
theme[temp_start]="#00eaff"
theme[temp_mid]="#9d00ff"
theme[temp_end]="#ff0044"
# CPU graph colors
theme[cpu_start]="#00eaff"
theme[cpu_mid]="#9d00ff"
theme[cpu_end]="#ff0044"
# Mem graph colors
theme[free_start]="#00ff99"
theme[free_mid]="#ffb700"
theme[free_end]="#ff0044"
theme[cached_start]="#00eaff"
theme[cached_mid]="#9d00ff"
theme[cached_end]="#ff0044"
theme[available_start]="#00ff99"
theme[available_mid]="#ffb700"
theme[available_end]="#ff0044"
theme[used_start]="#00eaff"
theme[used_mid]="#9d00ff"
theme[used_end]="#ff0044"
# Download graph colors
theme[download_start]="#00eaff"
theme[download_mid]="#9d00ff"
theme[download_end]="#ff0044"
# Upload graph colors
theme[upload_start]="#00eaff"
theme[upload_mid]="#9d00ff"
theme[upload_end]="#ff0044"
# Process path color
theme[process_start]="#00eaff"
theme[process_mid]="#9d00ff"
theme[process_end]="#ff0044"

15
dist/fuzzel/apex-aeon-fuzzel.ini vendored Normal file
View File

@@ -0,0 +1,15 @@
# Apex Aeon — Fuzzel Theme
# DNA: State over Decoration
[colors]
background=f5f5f5ff
text=0a0a0aff
match=007a88ff
selection=ff0044ff
selection-text=0a0a0aff
selection-match=007a88ff
border=007a88ff
[border]
width=2
radius=0

15
dist/fuzzel/apex-neon-fuzzel.ini vendored Normal file
View File

@@ -0,0 +1,15 @@
# Apex Neon — Fuzzel Theme
# DNA: State over Decoration
[colors]
background=050505ff
text=edededff
match=00eaffff
selection=ff0044ff
selection-text=050505ff
selection-match=00eaffff
border=00eaffff
[border]
width=2
radius=0

24
dist/gemini/apex-aeon.json vendored Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "Apex Aeon",
"type": "custom",
"Background": "#f5f5f5",
"Foreground": "#0a0a0a",
"LightBlue": "#33bccc",
"AccentBlue": "#007a88",
"AccentPurple": "#7a3cff",
"AccentCyan": "#33bccc",
"AccentGreen": "#00b377",
"AccentYellow": "#d18f00",
"AccentRed": "#ff0044",
"Comment": "#737373",
"Gray": "#a0a0a0",
"DiffAdded": "#00b377",
"DiffRemoved": "#ff0044",
"DiffModified": "#d18f00",
"text": {
"primary": "#0a0a0a",
"secondary": "#737373",
"accent": "#007a88",
"response": "#0a0a0a"
}
}

24
dist/gemini/apex-neon.json vendored Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "Apex Neon",
"type": "custom",
"Background": "#050505",
"Foreground": "#ededed",
"LightBlue": "#5af3ff",
"AccentBlue": "#00eaff",
"AccentPurple": "#9d00ff",
"AccentCyan": "#5af3ff",
"AccentGreen": "#00ff99",
"AccentYellow": "#ffb700",
"AccentRed": "#ff0044",
"Comment": "#737373",
"Gray": "#404040",
"DiffAdded": "#00ff99",
"DiffRemoved": "#ff0044",
"DiffModified": "#ffb700",
"text": {
"primary": "#ededed",
"secondary": "#737373",
"accent": "#00eaff",
"response": "#ededed"
}
}

26
dist/ghostty/apex-aeon vendored Normal file
View File

@@ -0,0 +1,26 @@
# Apex Aeon - Ghostty theme
# DNA: State over Decoration
background = #f5f5f5
foreground = #0a0a0a
cursor-color = #ff0044
selection-background = #ff0044
selection-foreground = #0a0a0a
palette = 0=#0a0a0a
palette = 1=#ff0044
palette = 2=#00b377
palette = 3=#d18f00
palette = 4=#007a88
palette = 5=#7a3cff
palette = 6=#007a88
palette = 7=#f5f5f5
palette = 8=#737373
palette = 9=#ff4d6d
palette = 10=#33d6a6
palette = 11=#ffbf40
palette = 12=#33bccc
palette = 13=#a680ff
palette = 14=#33bccc
palette = 15=#ffffff

26
dist/ghostty/apex-neon vendored Normal file
View File

@@ -0,0 +1,26 @@
# Apex Neon - Ghostty theme
# DNA: State over Decoration
background = #050505
foreground = #ededed
cursor-color = #ff0044
selection-background = #ff0044
selection-foreground = #050505
palette = 0=#050505
palette = 1=#ff0044
palette = 2=#00ff99
palette = 3=#ffb700
palette = 4=#00eaff
palette = 5=#9d00ff
palette = 6=#00eaff
palette = 7=#ededed
palette = 8=#737373
palette = 9=#ff8899
palette = 10=#2bffb2
palette = 11=#ffd24d
palette = 12=#5af3ff
palette = 13=#c84dff
palette = 14=#5af3ff
palette = 15=#ffffff

129
dist/gtk4/gtk.css vendored Normal file
View File

@@ -0,0 +1,129 @@
/* Apex Theme System — GTK4 / Libadwaita */
/* Auto-generated from Apex DNA */
/* Scheme: Apex Neon (dark) */
@media (prefers-color-scheme: dark) {
:root {
/* Core Surfaces */
@define-color window_bg_color #050505;
@define-color window_fg_color #ededed;
@define-color view_bg_color #050505;
@define-color view_fg_color #ededed;
@define-color headerbar_bg_color #141414;
@define-color headerbar_fg_color #ededed;
@define-color headerbar_border_color #262626;
@define-color headerbar_backdrop_color @window_bg_color;
@define-color headerbar_shade_color rgba(0, 0, 0, 0.07);
@define-color popover_bg_color #141414;
@define-color popover_fg_color #ededed;
@define-color card_bg_color #141414;
@define-color card_fg_color #ededed;
@define-color card_shade_color rgba(0, 0, 0, 0.07);
@define-color dialog_bg_color #141414;
@define-color dialog_fg_color #ededed;
/* Accents */
@define-color accent_color #00eaff;
@define-color accent_bg_color #00eaff;
@define-color accent_fg_color #050505;
@define-color destructive_color #ff0044;
@define-color destructive_bg_color #ff0044;
@define-color destructive_fg_color #050505;
@define-color success_color #00ff99;
@define-color success_bg_color #00ff99;
@define-color success_fg_color #050505;
@define-color warning_color #ffb700;
@define-color warning_bg_color #ffb700;
@define-color warning_fg_color #050505;
@define-color error_color #ff8899;
@define-color error_bg_color #ff8899;
@define-color error_fg_color #050505;
/* UI Elements */
@define-color borders #262626;
@define-color sidebar_bg_color #141414;
@define-color sidebar_fg_color #ededed;
@define-color sidebar_backdrop_color @window_bg_color;
@define-color sidebar_shade_color rgba(0, 0, 0, 0.07);
/* Custom Apex Palette */
@define-color apex_razor #ff0044;
@define-color apex_void #050505;
@define-color apex_stealth #404040;
}
}
/* Scheme: Apex Aeon (light) */
@media (prefers-color-scheme: light) {
:root {
/* Core Surfaces */
@define-color window_bg_color #f5f5f5;
@define-color window_fg_color #0a0a0a;
@define-color view_bg_color #f5f5f5;
@define-color view_fg_color #0a0a0a;
@define-color headerbar_bg_color #e8e8e8;
@define-color headerbar_fg_color #0a0a0a;
@define-color headerbar_border_color #737373;
@define-color headerbar_backdrop_color @window_bg_color;
@define-color headerbar_shade_color rgba(0, 0, 0, 0.07);
@define-color popover_bg_color #e8e8e8;
@define-color popover_fg_color #0a0a0a;
@define-color card_bg_color #e8e8e8;
@define-color card_fg_color #0a0a0a;
@define-color card_shade_color rgba(0, 0, 0, 0.07);
@define-color dialog_bg_color #e8e8e8;
@define-color dialog_fg_color #0a0a0a;
/* Accents */
@define-color accent_color #007a88;
@define-color accent_bg_color #007a88;
@define-color accent_fg_color #f5f5f5;
@define-color destructive_color #ff0044;
@define-color destructive_bg_color #ff0044;
@define-color destructive_fg_color #f5f5f5;
@define-color success_color #00b377;
@define-color success_bg_color #00b377;
@define-color success_fg_color #f5f5f5;
@define-color warning_color #d18f00;
@define-color warning_bg_color #d18f00;
@define-color warning_fg_color #f5f5f5;
@define-color error_color #ff4d6d;
@define-color error_bg_color #ff4d6d;
@define-color error_fg_color #f5f5f5;
/* UI Elements */
@define-color borders #737373;
@define-color sidebar_bg_color #e8e8e8;
@define-color sidebar_fg_color #0a0a0a;
@define-color sidebar_backdrop_color @window_bg_color;
@define-color sidebar_shade_color rgba(0, 0, 0, 0.07);
/* Custom Apex Palette */
@define-color apex_razor #ff0044;
@define-color apex_void #f5f5f5;
@define-color apex_stealth #a0a0a0;
}
}

85
dist/hyprland/apex-aeon-colors.conf vendored Normal file
View File

@@ -0,0 +1,85 @@
#############################
### APEX AEON THEME ###
#############################
# The Void (Backgrounds)
# Pure, unadulterated darkness. None of that "grey-blue" nonsense.
$base = rgb(f5f5f5)
$baseAlpha = f5f5f5
$surface = rgb(e8e8e8)
$surfaceAlpha = e8e8e8
$overlay = rgb(737373)
$overlayAlpha = 737373
$muted = rgb(a0a0a0)
$mutedAlpha = a0a0a0
$subtle = rgb(a0a0a0)
$subtleAlpha = a0a0a0
# The Signal (Text)
# Stark white for maximum readability.
$text = rgb(0a0a0a)
$textAlpha = 0a0a0a
# Accents (Aggressive)
# "Razor Red" - For errors or active borders. Blood-like.
$love = rgb(ff0044)
$loveAlpha = ff0044
# "Warning Gold"
$gold = rgb(d18f00)
$goldAlpha = d18f00
# "Toxic Green" - Because nature isn't always nice.
$pine = rgb(00b377)
$pineAlpha = 00b377
# "Electric Cyan" - Cold, digital logic.
$foam = rgb(007a88)
$foamAlpha = 007a88
# "Deep Void Purple"
$iris = rgb(7a3cff)
$irisAlpha = 7a3cff
# "Pale Rose" (Mapped to alert color)
$rose = rgb(ff4d6d)
$roseAlpha = ff4d6d
# Highlight variants
$highlight_low = rgb(e8e8e8)
$highlight_lowAlpha = e8e8e8
$highlight_med = rgb(737373)
$highlight_medAlpha = 737373
$highlight_high = rgb(a0a0a0)
$highlight_highAlpha = a0a0a0
# Theme-specific definitions
$splash_text = rgba($textAlphaee)
$dec_shadow = rgba(000000ee) # Hard shadows
# Border configurations
# Sharp, thin, and aggressive.
$border_active = rgba($loveAlphaff) rgba($irisAlphaff) 45deg
$border_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
$border_nogroup_active = rgba($foamAlphaff) rgba($pineAlphaff) 45deg
$border_nogroup_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
$border_group_active = rgba($goldAlphaff) rgba($loveAlphaff) 45deg
$border_group_inactive = rgba($mutedAlpha66) rgba($surfaceAlpha66) 45deg
$border_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff) 45deg
$border_grouplocked_inactive = rgba($foamAlpha66) rgba($irisAlpha66) 45deg
# Group bar configurations
$groupbar_text = rgba($baseAlphaff)
$groupbar_active = rgba($loveAlphaff) rgba($irisAlphaaa)
$groupbar_inactive = rgba($surfaceAlphaee) rgba($mutedAlphaaa)
$groupbar_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff)
$groupbar_grouplocked_inactive = rgba($foamAlphaaa) rgba($irisAlphaaa)

85
dist/hyprland/apex-neon-colors.conf vendored Normal file
View File

@@ -0,0 +1,85 @@
#############################
### APEX NEON THEME ###
#############################
# The Void (Backgrounds)
# Pure, unadulterated darkness. None of that "grey-blue" nonsense.
$base = rgb(050505)
$baseAlpha = 050505
$surface = rgb(141414)
$surfaceAlpha = 141414
$overlay = rgb(262626)
$overlayAlpha = 262626
$muted = rgb(404040)
$mutedAlpha = 404040
$subtle = rgb(404040)
$subtleAlpha = 404040
# The Signal (Text)
# Stark white for maximum readability.
$text = rgb(ededed)
$textAlpha = ededed
# Accents (Aggressive)
# "Razor Red" - For errors or active borders. Blood-like.
$love = rgb(ff0044)
$loveAlpha = ff0044
# "Warning Gold"
$gold = rgb(ffb700)
$goldAlpha = ffb700
# "Toxic Green" - Because nature isn't always nice.
$pine = rgb(00ff99)
$pineAlpha = 00ff99
# "Electric Cyan" - Cold, digital logic.
$foam = rgb(00eaff)
$foamAlpha = 00eaff
# "Deep Void Purple"
$iris = rgb(9d00ff)
$irisAlpha = 9d00ff
# "Pale Rose" (Mapped to alert color)
$rose = rgb(ff8899)
$roseAlpha = ff8899
# Highlight variants
$highlight_low = rgb(141414)
$highlight_lowAlpha = 141414
$highlight_med = rgb(262626)
$highlight_medAlpha = 262626
$highlight_high = rgb(404040)
$highlight_highAlpha = 404040
# Theme-specific definitions
$splash_text = rgba($textAlphaee)
$dec_shadow = rgba(000000ee) # Hard shadows
# Border configurations
# Sharp, thin, and aggressive.
$border_active = rgba($loveAlphaff) rgba($irisAlphaff) 45deg
$border_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
$border_nogroup_active = rgba($foamAlphaff) rgba($pineAlphaff) 45deg
$border_nogroup_inactive = rgba($mutedAlpha44) rgba($surfaceAlpha44) 45deg
$border_group_active = rgba($goldAlphaff) rgba($loveAlphaff) 45deg
$border_group_inactive = rgba($mutedAlpha66) rgba($surfaceAlpha66) 45deg
$border_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff) 45deg
$border_grouplocked_inactive = rgba($foamAlpha66) rgba($irisAlpha66) 45deg
# Group bar configurations
$groupbar_text = rgba($baseAlphaff)
$groupbar_active = rgba($loveAlphaff) rgba($irisAlphaaa)
$groupbar_inactive = rgba($surfaceAlphaee) rgba($mutedAlphaaa)
$groupbar_grouplocked_active = rgba($foamAlphaff) rgba($irisAlphaff)
$groupbar_grouplocked_inactive = rgba($foamAlphaaa) rgba($irisAlphaaa)

66
dist/kitty/apex-aeon.conf vendored Normal file
View File

@@ -0,0 +1,66 @@
## APEX AEON - KITTY THEME ##
## Spec-accurate: color = state, not decoration
# --- Core ---
foreground #0a0a0a
background #f5f5f5
# Selection: "target locked"
selection_background #ff0044
selection_foreground #0a0a0a
# Cursor: Razor Red beam
cursor #ff0044
cursor_text_color #0a0a0a
cursor_shape beam
# URLs: informational cyan
url_color #007a88
# Borders (optional)
active_border_color #ff0044
inactive_border_color #737373
# Optional: subtle UI hint for visual bell
visual_bell_color #ff4d6d
# Spacing
window_padding_width 4
# --- 16-COLOR ANSI TABLE (Apex Aeon spec) ---
# Normal bank (07)
# color0: Black (Void)
color0 #0a0a0a
# color1: Red (Razor)
color1 #ff0044
# color2: Green (OK)
color2 #00b377
# color3: Yellow (Gold)
color3 #d18f00
# color4: Blue (Info)
color4 #007a88
# color5: Magenta (Purple)
color5 #7a3cff
# color6: Cyan (Info mapped)
color6 #007a88
# color7: White (Stark)
color7 #f5f5f5
# Bright bank (815)
# color8: Bright black (UI separators)
color8 #737373
# color9: Bright red (Alerts)
color9 #ff4d6d
# color10: Bright green (Active success)
color10 #33d6a6
# color11: Bright yellow (Urgent warning)
color11 #ffbf40
# color12: Bright blue (Active info)
color12 #33bccc
# color13: Bright magenta (Elevated special)
color13 #a680ff
# color14: Bright cyan (Active tech signal)
color14 #33bccc
# color15: Bright white (Extreme highlight)
color15 #ffffff

66
dist/kitty/apex-neon.conf vendored Normal file
View File

@@ -0,0 +1,66 @@
## APEX NEON - KITTY THEME ##
## Spec-accurate: color = state, not decoration
# --- Core ---
foreground #ededed
background #050505
# Selection: "target locked"
selection_background #ff0044
selection_foreground #050505
# Cursor: Razor Red beam
cursor #ff0044
cursor_text_color #050505
cursor_shape beam
# URLs: informational cyan
url_color #00eaff
# Borders (optional)
active_border_color #ff0044
inactive_border_color #262626
# Optional: subtle UI hint for visual bell
visual_bell_color #ff8899
# Spacing
window_padding_width 4
# --- 16-COLOR ANSI TABLE (Apex Neon spec) ---
# Normal bank (07)
# color0: Black (Void)
color0 #050505
# color1: Red (Razor)
color1 #ff0044
# color2: Green (OK)
color2 #00ff99
# color3: Yellow (Gold)
color3 #ffb700
# color4: Blue (Info)
color4 #00eaff
# color5: Magenta (Purple)
color5 #9d00ff
# color6: Cyan (Info mapped)
color6 #00eaff
# color7: White (Stark)
color7 #ededed
# Bright bank (815)
# color8: Bright black (UI separators)
color8 #737373
# color9: Bright red (Alerts)
color9 #ff8899
# color10: Bright green (Active success)
color10 #2bffb2
# color11: Bright yellow (Urgent warning)
color11 #ffd24d
# color12: Bright blue (Active info)
color12 #5af3ff
# color13: Bright magenta (Elevated special)
color13 #c84dff
# color14: Bright cyan (Active tech signal)
color14 #5af3ff
# color15: Bright white (Extreme highlight)
color15 #ffffff

381
dist/nvim/colors/apex-aeon.lua vendored Normal file
View File

@@ -0,0 +1,381 @@
-- Apex Aeon: Standalone Theme Engine
-- Philosophy: State over Decoration. Red is Presence. Cyan is Data.
local M = {}
M.palette = {
-- The Void
void = "#f5f5f5", -- Background
panel = "#e8e8e8", -- Dark Surface (Statusline/Gutter)
border = "#737373", -- Muted Border
stealth = "#a0a0a0", -- Comments / Ignored
-- The Signal
text = "#0a0a0a", -- Stark White
dim = "#737373", -- Muted Text
-- The Hunter (Presence)
razor = "#ff0044", -- PRIMARY: Cursor, Current Match, Active Border
ink = "#0a0a0a", -- Text color on Razor backgrounds
alert = "#ff0044", -- Error accent text on void/panel
-- The HUD (Data)
tech = "#007a88", -- INFO: Selection, Search Match, Constants
toxic = "#00b377", -- SUCCESS: Strings
amber = "#d18f00", -- WARNING: Types, Search
azure = "#005577", -- STRUCT: Functions (Deep Blue)
sacred = "#7a3cff", -- SPECIAL: Keywords, Root
}
function M.load()
vim.cmd "hi clear"
if vim.fn.exists "syntax_on" then vim.cmd "syntax reset" end
vim.o.background = "light"
vim.g.colors_name = "apex-aeon"
-- Optional transparency: set g:apex_blend or g:apex_transparent to opt in.
local blend = vim.g.apex_blend
if type(blend) == "number" then
vim.o.winblend = blend
vim.o.pumblend = blend
elseif vim.g.apex_transparent == true then
vim.o.winblend = 20
vim.o.pumblend = 20
end
local p = M.palette
local groups = {
-- CANVAS & UI -----------------------------------------------------------
Normal = { fg = p.text, bg = p.void },
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
SignColumn = { bg = p.void },
FoldColumn = { fg = p.stealth, bg = p.void },
VertSplit = { fg = p.border }, -- Deprecated in nvim 0.10, but good fallback
WinSeparator = { fg = p.border },
EndOfBuffer = { fg = p.void }, -- Hide tildes
NormalFloat = { fg = p.text, bg = p.panel },
FloatBorder = { fg = p.border, bg = p.panel },
MsgArea = { fg = p.text, bg = p.void },
WinBar = { fg = p.text, bg = p.panel },
WinBarNC = { fg = p.dim, bg = p.panel },
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
Cursor = { fg = p.ink, bg = p.razor }, -- Red Beam
TermCursor = { fg = p.ink, bg = p.razor },
CursorLine = { bg = p.panel },
CursorColumn = { bg = p.panel },
ColorColumn = { bg = p.panel },
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
LineNr = { fg = p.stealth }, -- Other lines fade out
-- SELECTION & SEARCH ("Terminator Vision") ------------------------------
Visual = { fg = p.void, bg = p.tech, bold = true }, -- Cyan (Data Lock)
VisualNOS = { fg = p.void, bg = p.border },
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
IncSearch = { fg = p.ink, bg = p.razor }, -- Red (Acquiring...)
CurSearch = { fg = p.ink, bg = p.razor, bold = true }, -- Red (Target Locked)
-- STATUS & MESSAGES -----------------------------------------------------
StatusLine = { fg = p.text, bg = p.panel },
StatusLineNC = { fg = p.dim, bg = p.void },
WildMenu = { fg = p.void, bg = p.tech },
Pmenu = { fg = p.text, bg = p.panel },
PmenuSel = { fg = p.ink, bg = p.razor, bold = true }, -- Red Menu Selection
PmenuKind = { fg = p.dim, bg = p.panel },
PmenuKindSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuExtra = { fg = p.dim, bg = p.panel },
PmenuExtraSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuMatch = { fg = p.tech, bg = p.panel, bold = true },
PmenuMatchSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuSbar = { bg = p.panel },
PmenuThumb = { bg = p.stealth },
ErrorMsg = { fg = p.alert },
WarningMsg = { fg = p.amber },
MoreMsg = { fg = p.tech },
ModeMsg = { fg = p.text },
TabLine = { fg = p.dim, bg = p.panel },
TabLineSel = { fg = p.text, bg = p.void, bold = true },
TabLineFill = { fg = p.panel, bg = p.panel },
QuickFixLine = { fg = p.text, bg = p.panel, bold = true },
-- SYNTAX HIGHLIGHTING ---------------------------------------------------
Comment = { fg = p.stealth, italic = true },
Constant = { fg = p.tech }, -- Cyan (Digital values)
String = { fg = p.toxic }, -- Green (Organic strings)
Character = { fg = p.toxic },
Number = { fg = p.tech },
Boolean = { fg = p.tech },
Float = { fg = p.tech },
Identifier = { fg = p.text }, -- Variables (White)
Function = { fg = p.azure }, -- Deep Blue (Structure)
Statement = { fg = p.sacred }, -- Purple (Keywords)
Conditional = { fg = p.sacred },
Repeat = { fg = p.sacred },
Label = { fg = p.sacred },
Operator = { fg = p.text }, -- White (Neutral)
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.sacred }, -- Purple (special grammar tokens)
SpecialChar = { fg = p.amber }, -- Amber (escalated string variant: escapes, regex)
Tag = { fg = p.azure }, -- Blue (structural: HTML/XML tags)
Delimiter = { fg = p.dim }, -- Subtle delimiters
Debug = { fg = p.razor },
Underlined = { underline = true },
Ignore = { fg = p.stealth },
Error = { fg = p.alert },
Todo = { fg = p.void, bg = p.amber, bold = true },
Title = { fg = p.sacred, bold = true },
MatchParen = { fg = p.void, bg = p.amber, bold = true },
Whitespace = { fg = p.border },
NonText = { fg = p.border },
SpecialKey = { fg = p.border },
SpellBad = { sp = p.razor, undercurl = true },
SpellCap = { sp = p.amber, undercurl = true },
SpellRare = { sp = p.tech, undercurl = true },
SpellLocal = { sp = p.dim, undercurl = true },
LspReferenceText = { bg = p.panel },
LspReferenceRead = { bg = p.panel },
LspReferenceWrite = { bg = p.panel, bold = true },
LspSignatureActiveParameter = { fg = p.void, bg = p.tech, bold = true },
LspInlayHint = { fg = p.dim, bg = p.panel },
LspCodeLens = { fg = p.dim },
LspCodeLensSeparator = { fg = p.stealth },
LspInfoBorder = { fg = p.border, bg = p.panel },
LspInfoTitle = { fg = p.dim, bg = p.panel },
-- DIAGNOSTICS -----------------------------------------------------------
DiagnosticError = { fg = p.alert },
DiagnosticWarn = { fg = p.amber },
DiagnosticInfo = { fg = p.tech },
DiagnosticHint = { fg = p.dim },
DiagnosticOk = { fg = p.toxic },
DiagnosticDeprecated = { fg = p.dim, strikethrough = true },
DiagnosticUnnecessary = { fg = p.dim },
DiagnosticUnderlineError = { undercurl = true, sp = p.razor },
DiagnosticUnderlineWarn = { undercurl = true, sp = p.amber },
DiagnosticUnderlineInfo = { undercurl = true, sp = p.tech },
DiagnosticUnderlineHint = { undercurl = true, sp = p.dim },
DiagnosticUnderlineOk = { undercurl = true, sp = p.toxic },
DiagnosticVirtualTextError = { fg = p.alert, bg = p.panel },
DiagnosticVirtualTextWarn = { fg = p.amber, bg = p.panel },
DiagnosticVirtualTextInfo = { fg = p.tech, bg = p.panel },
DiagnosticVirtualTextHint = { fg = p.dim, bg = p.panel },
DiagnosticVirtualTextOk = { fg = p.toxic, bg = p.panel },
DiagnosticVirtualLinesError = { fg = p.alert, bg = p.panel },
DiagnosticVirtualLinesWarn = { fg = p.amber, bg = p.panel },
DiagnosticVirtualLinesInfo = { fg = p.tech, bg = p.panel },
DiagnosticVirtualLinesHint = { fg = p.dim, bg = p.panel },
DiagnosticVirtualLinesOk = { fg = p.toxic, bg = p.panel },
DiagnosticSignError = { fg = p.alert, bg = p.void },
DiagnosticSignWarn = { fg = p.amber, bg = p.void },
DiagnosticSignInfo = { fg = p.tech, bg = p.void },
DiagnosticSignHint = { fg = p.dim, bg = p.void },
DiagnosticSignOk = { fg = p.toxic, bg = p.void },
DiagnosticFloatingError = { fg = p.alert, bg = p.panel },
DiagnosticFloatingWarn = { fg = p.amber, bg = p.panel },
DiagnosticFloatingInfo = { fg = p.tech, bg = p.panel },
DiagnosticFloatingHint = { fg = p.dim, bg = p.panel },
DiagnosticFloatingOk = { fg = p.toxic, bg = p.panel },
ApexMarkupStrong = { bold = true },
ApexMarkupItalic = { italic = true },
ApexMarkupLink = { fg = p.tech, underline = true },
-- DIFF ------------------------------------------------------------------
DiffAdd = { fg = p.toxic, bg = p.panel },
DiffChange = { fg = p.tech, bg = p.panel },
DiffDelete = { fg = p.razor, bg = p.panel },
DiffText = { fg = p.void, bg = p.tech, bold = true },
-- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
TelescopeNormal = { bg = p.void },
TelescopeBorder = { fg = p.razor, bg = p.void }, -- Red Border
TelescopePromptNormal = { fg = p.text, bg = p.void },
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
TelescopePreviewTitle = { fg = p.ink, bg = p.razor }, -- Red Label
TelescopeResultsTitle = { fg = p.void, bg = p.panel },
TelescopeSelection = { fg = p.ink, bg = p.razor }, -- Red Selection
-- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
NeoTreeNormal = { bg = p.void },
NeoTreeNormalNC = { bg = p.void },
NeoTreeVertSplit = { fg = p.panel, bg = p.void },
NeoTreeWinSeparator = { fg = p.panel, bg = p.void }, -- Fade out tree border
NeoTreeRootName = { fg = p.razor, bold = true }, -- Root is Red
NeoTreeGitAdded = { fg = p.toxic },
NeoTreeGitConflict = { fg = p.amber },
NeoTreeGitDeleted = { fg = p.razor },
NeoTreeGitModified = { fg = p.tech },
-- PLUGINS: GITSIGNS -----------------------------------------------------
GitSignsAdd = { fg = p.toxic, bg = p.void },
GitSignsChange = { fg = p.tech, bg = p.void },
GitSignsDelete = { fg = p.razor, bg = p.void },
-- PLUGINS: CMP (Completion) ---------------------------------------------
CmpItemAbbrDeprecated = { fg = p.dim, strikethrough = true },
CmpItemAbbrMatch = { fg = p.tech, bold = true },
CmpItemAbbrMatchFuzzy = { fg = p.tech, bold = true },
CmpItemKindFunction = { fg = p.azure },
CmpItemKindMethod = { fg = p.azure },
CmpItemKindKeyword = { fg = p.sacred },
CmpItemKindVariable = { fg = p.text },
}
for group, highlight in pairs(groups) do
vim.api.nvim_set_hl(0, group, highlight)
end
local links = {
["@annotation"] = "Special",
["@attribute"] = "Special",
["@character"] = "Character",
["@comment"] = "Comment",
["@constant"] = "Constant",
["@constant.builtin"] = "Constant",
["@constant.macro"] = "Macro",
["@constructor"] = "Type",
["@debug"] = "Debug",
["@define"] = "Define",
["@exception"] = "Exception",
["@field"] = "Identifier",
["@float"] = "Float",
["@function"] = "Function",
["@function.builtin"] = "Function",
["@function.call"] = "Function",
["@function.macro"] = "Macro",
["@include"] = "Include",
["@keyword"] = "Keyword",
["@keyword.function"] = "Keyword",
["@keyword.operator"] = "Operator",
["@keyword.return"] = "Keyword",
["@label"] = "Label",
["@method"] = "Function",
["@method.call"] = "Function",
["@module"] = "Structure",
["@namespace"] = "Structure",
["@number"] = "Number",
["@operator"] = "Operator",
["@parameter"] = "Identifier",
["@preproc"] = "PreProc",
["@property"] = "Identifier",
["@punctuation"] = "Delimiter",
["@punctuation.bracket"] = "Delimiter",
["@punctuation.delimiter"] = "Delimiter",
["@punctuation.special"] = "Delimiter",
["@repeat"] = "Repeat",
["@string"] = "String",
["@string.escape"] = "SpecialChar",
["@string.regex"] = "SpecialChar",
["@string.special"] = "SpecialChar",
["@tag"] = "Tag",
["@tag.attribute"] = "Identifier",
["@tag.delimiter"] = "Delimiter",
["@text"] = "Normal",
["@text.title"] = "Title",
["@markup.heading"] = "Title",
["@markup.heading.1"] = "Title",
["@markup.heading.2"] = "Title",
["@markup.heading.3"] = "Title",
["@markup.heading.4"] = "Title",
["@markup.heading.5"] = "Title",
["@markup.heading.6"] = "Title",
["@markup.link"] = "ApexMarkupLink",
["@markup.link.label"] = "ApexMarkupLink",
["@markup.link.url"] = "ApexMarkupLink",
["@markup.strong"] = "ApexMarkupStrong",
["@markup.italic"] = "ApexMarkupItalic",
["@markup.strikethrough"] = "DiagnosticDeprecated",
["@markup.underline"] = "Underlined",
["@markup.raw"] = "String",
["@markup.raw.block"] = "String",
["@markup.raw.delimiter"] = "Delimiter",
["@markup.quote"] = "Comment",
["@markup.list"] = "Delimiter",
["@markup.list.checked"] = "String",
["@markup.list.unchecked"] = "Comment",
["@markup.math"] = "Constant",
["@markup.environment"] = "Type",
["@markup.environment.name"] = "Type",
["@type"] = "Type",
["@type.builtin"] = "Type",
["@type.definition"] = "Type",
["@type.qualifier"] = "Keyword",
["@variable"] = "Identifier",
["@variable.builtin"] = "Identifier",
["@lsp.type.boolean"] = "Boolean",
["@lsp.type.builtinType"] = "Type",
["@lsp.type.class"] = "Type",
["@lsp.type.comment"] = "Comment",
["@lsp.type.decorator"] = "Special",
["@lsp.type.enum"] = "Type",
["@lsp.type.enumMember"] = "Constant",
["@lsp.type.event"] = "Type",
["@lsp.type.function"] = "Function",
["@lsp.type.interface"] = "Type",
["@lsp.type.keyword"] = "Keyword",
["@lsp.type.macro"] = "Macro",
["@lsp.type.method"] = "Function",
["@lsp.type.modifier"] = "Keyword",
["@lsp.type.namespace"] = "Structure",
["@lsp.type.number"] = "Number",
["@lsp.type.operator"] = "Operator",
["@lsp.type.parameter"] = "Identifier",
["@lsp.type.property"] = "Identifier",
["@lsp.type.regexp"] = "SpecialChar",
["@lsp.type.string"] = "String",
["@lsp.type.struct"] = "Structure",
["@lsp.type.type"] = "Type",
["@lsp.type.typeParameter"] = "Type",
["@lsp.type.variable"] = "Identifier",
["@lsp.mod.deprecated"] = "DiagnosticDeprecated",
["@lsp.mod.abstract"] = "Type",
["@lsp.mod.declaration"] = "Keyword",
["@lsp.mod.defaultLibrary"] = "Constant",
["@lsp.mod.definition"] = "Keyword",
["@lsp.mod.documentation"] = "Comment",
["@lsp.mod.modification"] = "Operator",
["@lsp.mod.readonly"] = "Constant",
["@lsp.mod.static"] = "Constant",
["@lsp.mod.async"] = "Keyword",
["@lsp.typemod.function.async"] = "Keyword",
["@lsp.typemod.method.async"] = "Keyword",
["@lsp.typemod.function.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.method.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.variable.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.variable.readonly"] = "Constant",
["@lsp.typemod.parameter.readonly"] = "Constant",
["@lsp.typemod.property.readonly"] = "Constant",
["@lsp.typemod.variable.static"] = "Constant",
["@lsp.typemod.property.static"] = "Constant",
}
for group, target in pairs(links) do
vim.api.nvim_set_hl(0, group, { link = target })
end
end
M.load()
return M

381
dist/nvim/colors/apex-neon.lua vendored Normal file
View File

@@ -0,0 +1,381 @@
-- Apex Neon: Standalone Theme Engine
-- Philosophy: State over Decoration. Red is Presence. Cyan is Data.
local M = {}
M.palette = {
-- The Void
void = "#050505", -- Background
panel = "#141414", -- Dark Surface (Statusline/Gutter)
border = "#262626", -- Muted Border
stealth = "#404040", -- Comments / Ignored
-- The Signal
text = "#ededed", -- Stark White
dim = "#737373", -- Muted Text
-- The Hunter (Presence)
razor = "#ff0044", -- PRIMARY: Cursor, Current Match, Active Border
ink = "#050505", -- Text color on Razor backgrounds
alert = "#ff0044", -- Error accent text on void/panel
-- The HUD (Data)
tech = "#00eaff", -- INFO: Selection, Search Match, Constants
toxic = "#00ff99", -- SUCCESS: Strings
amber = "#ffb700", -- WARNING: Types, Search
azure = "#0088cc", -- STRUCT: Functions (Deep Blue)
sacred = "#9d00ff", -- SPECIAL: Keywords, Root
}
function M.load()
vim.cmd "hi clear"
if vim.fn.exists "syntax_on" then vim.cmd "syntax reset" end
vim.o.background = "dark"
vim.g.colors_name = "apex-neon"
-- Optional transparency: set g:apex_blend or g:apex_transparent to opt in.
local blend = vim.g.apex_blend
if type(blend) == "number" then
vim.o.winblend = blend
vim.o.pumblend = blend
elseif vim.g.apex_transparent == true then
vim.o.winblend = 20
vim.o.pumblend = 20
end
local p = M.palette
local groups = {
-- CANVAS & UI -----------------------------------------------------------
Normal = { fg = p.text, bg = p.void },
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
SignColumn = { bg = p.void },
FoldColumn = { fg = p.stealth, bg = p.void },
VertSplit = { fg = p.border }, -- Deprecated in nvim 0.10, but good fallback
WinSeparator = { fg = p.border },
EndOfBuffer = { fg = p.void }, -- Hide tildes
NormalFloat = { fg = p.text, bg = p.panel },
FloatBorder = { fg = p.border, bg = p.panel },
MsgArea = { fg = p.text, bg = p.void },
WinBar = { fg = p.text, bg = p.panel },
WinBarNC = { fg = p.dim, bg = p.panel },
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
Cursor = { fg = p.ink, bg = p.razor }, -- Red Beam
TermCursor = { fg = p.ink, bg = p.razor },
CursorLine = { bg = p.panel },
CursorColumn = { bg = p.panel },
ColorColumn = { bg = p.panel },
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
LineNr = { fg = p.stealth }, -- Other lines fade out
-- SELECTION & SEARCH ("Terminator Vision") ------------------------------
Visual = { fg = p.void, bg = p.tech, bold = true }, -- Cyan (Data Lock)
VisualNOS = { fg = p.void, bg = p.border },
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
IncSearch = { fg = p.ink, bg = p.razor }, -- Red (Acquiring...)
CurSearch = { fg = p.ink, bg = p.razor, bold = true }, -- Red (Target Locked)
-- STATUS & MESSAGES -----------------------------------------------------
StatusLine = { fg = p.text, bg = p.panel },
StatusLineNC = { fg = p.dim, bg = p.void },
WildMenu = { fg = p.void, bg = p.tech },
Pmenu = { fg = p.text, bg = p.panel },
PmenuSel = { fg = p.ink, bg = p.razor, bold = true }, -- Red Menu Selection
PmenuKind = { fg = p.dim, bg = p.panel },
PmenuKindSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuExtra = { fg = p.dim, bg = p.panel },
PmenuExtraSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuMatch = { fg = p.tech, bg = p.panel, bold = true },
PmenuMatchSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuSbar = { bg = p.panel },
PmenuThumb = { bg = p.stealth },
ErrorMsg = { fg = p.alert },
WarningMsg = { fg = p.amber },
MoreMsg = { fg = p.tech },
ModeMsg = { fg = p.text },
TabLine = { fg = p.dim, bg = p.panel },
TabLineSel = { fg = p.text, bg = p.void, bold = true },
TabLineFill = { fg = p.panel, bg = p.panel },
QuickFixLine = { fg = p.text, bg = p.panel, bold = true },
-- SYNTAX HIGHLIGHTING ---------------------------------------------------
Comment = { fg = p.stealth, italic = true },
Constant = { fg = p.tech }, -- Cyan (Digital values)
String = { fg = p.toxic }, -- Green (Organic strings)
Character = { fg = p.toxic },
Number = { fg = p.tech },
Boolean = { fg = p.tech },
Float = { fg = p.tech },
Identifier = { fg = p.text }, -- Variables (White)
Function = { fg = p.azure }, -- Deep Blue (Structure)
Statement = { fg = p.sacred }, -- Purple (Keywords)
Conditional = { fg = p.sacred },
Repeat = { fg = p.sacred },
Label = { fg = p.sacred },
Operator = { fg = p.text }, -- White (Neutral)
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.sacred }, -- Purple (special grammar tokens)
SpecialChar = { fg = p.amber }, -- Amber (escalated string variant: escapes, regex)
Tag = { fg = p.azure }, -- Blue (structural: HTML/XML tags)
Delimiter = { fg = p.dim }, -- Subtle delimiters
Debug = { fg = p.razor },
Underlined = { underline = true },
Ignore = { fg = p.stealth },
Error = { fg = p.alert },
Todo = { fg = p.void, bg = p.amber, bold = true },
Title = { fg = p.sacred, bold = true },
MatchParen = { fg = p.void, bg = p.amber, bold = true },
Whitespace = { fg = p.border },
NonText = { fg = p.border },
SpecialKey = { fg = p.border },
SpellBad = { sp = p.razor, undercurl = true },
SpellCap = { sp = p.amber, undercurl = true },
SpellRare = { sp = p.tech, undercurl = true },
SpellLocal = { sp = p.dim, undercurl = true },
LspReferenceText = { bg = p.panel },
LspReferenceRead = { bg = p.panel },
LspReferenceWrite = { bg = p.panel, bold = true },
LspSignatureActiveParameter = { fg = p.void, bg = p.tech, bold = true },
LspInlayHint = { fg = p.dim, bg = p.panel },
LspCodeLens = { fg = p.dim },
LspCodeLensSeparator = { fg = p.stealth },
LspInfoBorder = { fg = p.border, bg = p.panel },
LspInfoTitle = { fg = p.dim, bg = p.panel },
-- DIAGNOSTICS -----------------------------------------------------------
DiagnosticError = { fg = p.alert },
DiagnosticWarn = { fg = p.amber },
DiagnosticInfo = { fg = p.tech },
DiagnosticHint = { fg = p.dim },
DiagnosticOk = { fg = p.toxic },
DiagnosticDeprecated = { fg = p.dim, strikethrough = true },
DiagnosticUnnecessary = { fg = p.dim },
DiagnosticUnderlineError = { undercurl = true, sp = p.razor },
DiagnosticUnderlineWarn = { undercurl = true, sp = p.amber },
DiagnosticUnderlineInfo = { undercurl = true, sp = p.tech },
DiagnosticUnderlineHint = { undercurl = true, sp = p.dim },
DiagnosticUnderlineOk = { undercurl = true, sp = p.toxic },
DiagnosticVirtualTextError = { fg = p.alert, bg = p.panel },
DiagnosticVirtualTextWarn = { fg = p.amber, bg = p.panel },
DiagnosticVirtualTextInfo = { fg = p.tech, bg = p.panel },
DiagnosticVirtualTextHint = { fg = p.dim, bg = p.panel },
DiagnosticVirtualTextOk = { fg = p.toxic, bg = p.panel },
DiagnosticVirtualLinesError = { fg = p.alert, bg = p.panel },
DiagnosticVirtualLinesWarn = { fg = p.amber, bg = p.panel },
DiagnosticVirtualLinesInfo = { fg = p.tech, bg = p.panel },
DiagnosticVirtualLinesHint = { fg = p.dim, bg = p.panel },
DiagnosticVirtualLinesOk = { fg = p.toxic, bg = p.panel },
DiagnosticSignError = { fg = p.alert, bg = p.void },
DiagnosticSignWarn = { fg = p.amber, bg = p.void },
DiagnosticSignInfo = { fg = p.tech, bg = p.void },
DiagnosticSignHint = { fg = p.dim, bg = p.void },
DiagnosticSignOk = { fg = p.toxic, bg = p.void },
DiagnosticFloatingError = { fg = p.alert, bg = p.panel },
DiagnosticFloatingWarn = { fg = p.amber, bg = p.panel },
DiagnosticFloatingInfo = { fg = p.tech, bg = p.panel },
DiagnosticFloatingHint = { fg = p.dim, bg = p.panel },
DiagnosticFloatingOk = { fg = p.toxic, bg = p.panel },
ApexMarkupStrong = { bold = true },
ApexMarkupItalic = { italic = true },
ApexMarkupLink = { fg = p.tech, underline = true },
-- DIFF ------------------------------------------------------------------
DiffAdd = { fg = p.toxic, bg = p.panel },
DiffChange = { fg = p.tech, bg = p.panel },
DiffDelete = { fg = p.razor, bg = p.panel },
DiffText = { fg = p.void, bg = p.tech, bold = true },
-- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
TelescopeNormal = { bg = p.void },
TelescopeBorder = { fg = p.razor, bg = p.void }, -- Red Border
TelescopePromptNormal = { fg = p.text, bg = p.void },
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
TelescopePreviewTitle = { fg = p.ink, bg = p.razor }, -- Red Label
TelescopeResultsTitle = { fg = p.void, bg = p.panel },
TelescopeSelection = { fg = p.ink, bg = p.razor }, -- Red Selection
-- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
NeoTreeNormal = { bg = p.void },
NeoTreeNormalNC = { bg = p.void },
NeoTreeVertSplit = { fg = p.panel, bg = p.void },
NeoTreeWinSeparator = { fg = p.panel, bg = p.void }, -- Fade out tree border
NeoTreeRootName = { fg = p.razor, bold = true }, -- Root is Red
NeoTreeGitAdded = { fg = p.toxic },
NeoTreeGitConflict = { fg = p.amber },
NeoTreeGitDeleted = { fg = p.razor },
NeoTreeGitModified = { fg = p.tech },
-- PLUGINS: GITSIGNS -----------------------------------------------------
GitSignsAdd = { fg = p.toxic, bg = p.void },
GitSignsChange = { fg = p.tech, bg = p.void },
GitSignsDelete = { fg = p.razor, bg = p.void },
-- PLUGINS: CMP (Completion) ---------------------------------------------
CmpItemAbbrDeprecated = { fg = p.dim, strikethrough = true },
CmpItemAbbrMatch = { fg = p.tech, bold = true },
CmpItemAbbrMatchFuzzy = { fg = p.tech, bold = true },
CmpItemKindFunction = { fg = p.azure },
CmpItemKindMethod = { fg = p.azure },
CmpItemKindKeyword = { fg = p.sacred },
CmpItemKindVariable = { fg = p.text },
}
for group, highlight in pairs(groups) do
vim.api.nvim_set_hl(0, group, highlight)
end
local links = {
["@annotation"] = "Special",
["@attribute"] = "Special",
["@character"] = "Character",
["@comment"] = "Comment",
["@constant"] = "Constant",
["@constant.builtin"] = "Constant",
["@constant.macro"] = "Macro",
["@constructor"] = "Type",
["@debug"] = "Debug",
["@define"] = "Define",
["@exception"] = "Exception",
["@field"] = "Identifier",
["@float"] = "Float",
["@function"] = "Function",
["@function.builtin"] = "Function",
["@function.call"] = "Function",
["@function.macro"] = "Macro",
["@include"] = "Include",
["@keyword"] = "Keyword",
["@keyword.function"] = "Keyword",
["@keyword.operator"] = "Operator",
["@keyword.return"] = "Keyword",
["@label"] = "Label",
["@method"] = "Function",
["@method.call"] = "Function",
["@module"] = "Structure",
["@namespace"] = "Structure",
["@number"] = "Number",
["@operator"] = "Operator",
["@parameter"] = "Identifier",
["@preproc"] = "PreProc",
["@property"] = "Identifier",
["@punctuation"] = "Delimiter",
["@punctuation.bracket"] = "Delimiter",
["@punctuation.delimiter"] = "Delimiter",
["@punctuation.special"] = "Delimiter",
["@repeat"] = "Repeat",
["@string"] = "String",
["@string.escape"] = "SpecialChar",
["@string.regex"] = "SpecialChar",
["@string.special"] = "SpecialChar",
["@tag"] = "Tag",
["@tag.attribute"] = "Identifier",
["@tag.delimiter"] = "Delimiter",
["@text"] = "Normal",
["@text.title"] = "Title",
["@markup.heading"] = "Title",
["@markup.heading.1"] = "Title",
["@markup.heading.2"] = "Title",
["@markup.heading.3"] = "Title",
["@markup.heading.4"] = "Title",
["@markup.heading.5"] = "Title",
["@markup.heading.6"] = "Title",
["@markup.link"] = "ApexMarkupLink",
["@markup.link.label"] = "ApexMarkupLink",
["@markup.link.url"] = "ApexMarkupLink",
["@markup.strong"] = "ApexMarkupStrong",
["@markup.italic"] = "ApexMarkupItalic",
["@markup.strikethrough"] = "DiagnosticDeprecated",
["@markup.underline"] = "Underlined",
["@markup.raw"] = "String",
["@markup.raw.block"] = "String",
["@markup.raw.delimiter"] = "Delimiter",
["@markup.quote"] = "Comment",
["@markup.list"] = "Delimiter",
["@markup.list.checked"] = "String",
["@markup.list.unchecked"] = "Comment",
["@markup.math"] = "Constant",
["@markup.environment"] = "Type",
["@markup.environment.name"] = "Type",
["@type"] = "Type",
["@type.builtin"] = "Type",
["@type.definition"] = "Type",
["@type.qualifier"] = "Keyword",
["@variable"] = "Identifier",
["@variable.builtin"] = "Identifier",
["@lsp.type.boolean"] = "Boolean",
["@lsp.type.builtinType"] = "Type",
["@lsp.type.class"] = "Type",
["@lsp.type.comment"] = "Comment",
["@lsp.type.decorator"] = "Special",
["@lsp.type.enum"] = "Type",
["@lsp.type.enumMember"] = "Constant",
["@lsp.type.event"] = "Type",
["@lsp.type.function"] = "Function",
["@lsp.type.interface"] = "Type",
["@lsp.type.keyword"] = "Keyword",
["@lsp.type.macro"] = "Macro",
["@lsp.type.method"] = "Function",
["@lsp.type.modifier"] = "Keyword",
["@lsp.type.namespace"] = "Structure",
["@lsp.type.number"] = "Number",
["@lsp.type.operator"] = "Operator",
["@lsp.type.parameter"] = "Identifier",
["@lsp.type.property"] = "Identifier",
["@lsp.type.regexp"] = "SpecialChar",
["@lsp.type.string"] = "String",
["@lsp.type.struct"] = "Structure",
["@lsp.type.type"] = "Type",
["@lsp.type.typeParameter"] = "Type",
["@lsp.type.variable"] = "Identifier",
["@lsp.mod.deprecated"] = "DiagnosticDeprecated",
["@lsp.mod.abstract"] = "Type",
["@lsp.mod.declaration"] = "Keyword",
["@lsp.mod.defaultLibrary"] = "Constant",
["@lsp.mod.definition"] = "Keyword",
["@lsp.mod.documentation"] = "Comment",
["@lsp.mod.modification"] = "Operator",
["@lsp.mod.readonly"] = "Constant",
["@lsp.mod.static"] = "Constant",
["@lsp.mod.async"] = "Keyword",
["@lsp.typemod.function.async"] = "Keyword",
["@lsp.typemod.method.async"] = "Keyword",
["@lsp.typemod.function.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.method.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.variable.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.variable.readonly"] = "Constant",
["@lsp.typemod.parameter.readonly"] = "Constant",
["@lsp.typemod.property.readonly"] = "Constant",
["@lsp.typemod.variable.static"] = "Constant",
["@lsp.typemod.property.static"] = "Constant",
}
for group, target in pairs(links) do
vim.api.nvim_set_hl(0, group, { link = target })
end
end
M.load()
return M

171
dist/owlry/apex-aeon.css vendored Normal file
View File

@@ -0,0 +1,171 @@
/*
* Owlry - Apex Aeon Theme
* "State over Decoration."
*
* A high-contrast theme built for focus and clinical clarity.
* Color exists to signal STATE, not to decorate space.
*
* Author: S0wlz (Owlibou)
*
* Usage: Set theme = "apex-aeon" in config.toml
*/
:root {
/* Core surfaces */
--owlry-bg: #f5f5f5;
--owlry-bg-secondary: #e8e8e8;
--owlry-border: #737373;
--owlry-text: #0a0a0a;
--owlry-text-secondary: #737373;
/* The Predator - primary accent */
--owlry-accent: #ff0044;
--owlry-accent-bright: #ff4d6d;
/* Provider badges - mapped to Apex semantics */
--owlry-badge-app: #007a88; /* Cyan: apps are informational */
--owlry-badge-bookmark: #d18f00; /* Yellow: bookmarks need attention */
--owlry-badge-calc: #ffbf40; /* Bright Yellow: calculator results */
--owlry-badge-clip: #7a3cff; /* Purple: clipboard is special */
--owlry-badge-cmd: #7a3cff; /* Purple: commands are elevated */
--owlry-badge-dmenu: #00b377; /* Green: dmenu is success/pipe */
--owlry-badge-emoji: #a680ff; /* Bright Purple: emoji is special */
--owlry-badge-file: #33bccc; /* Bright Cyan: file search is active info */
--owlry-badge-script: #33d6a6; /* Bright Green: scripts execute successfully */
--owlry-badge-ssh: #007a88; /* Cyan: SSH is technical/info */
--owlry-badge-sys: #ff0044; /* Red: system actions are critical */
--owlry-badge-uuctl: #d18f00; /* Yellow: uuctl requires attention */
--owlry-badge-web: #007a88; /* Cyan: web is informational */
/* Widget badges */
--owlry-badge-media: #a680ff; /* Bright Purple: media is special */
--owlry-badge-weather: #33bccc; /* Bright Cyan: weather is active info */
--owlry-badge-pomo: #ff4d6d; /* Alert Red: pomodoro demands attention */
}
.owlry-main {
background-color: rgba(245, 245, 245, 0.98);
border: 1px solid rgba(115, 115, 115, 0.8);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8),
0 0 0 1px rgba(255, 0, 68, 0.1);
}
.owlry-search {
background-color: rgba(232, 232, 232, 0.9);
border: 2px solid rgba(115, 115, 115, 0.8);
color: var(--owlry-text);
caret-color: var(--owlry-accent);
}
.owlry-search:focus {
border-color: var(--owlry-accent);
box-shadow: 0 0 0 2px rgba(255, 0, 68, 0.3);
}
.owlry-result-row:hover {
background-color: rgba(232, 232, 232, 0.8);
}
.owlry-result-row:selected {
background-color: rgba(255, 0, 68, 0.15);
border-left: 3px solid var(--owlry-accent);
}
.owlry-result-row:selected .owlry-result-name {
color: var(--owlry-accent-bright);
}
.owlry-result-row:selected .owlry-result-icon {
color: var(--owlry-accent);
}
/* Provider badges - styled per Apex semantics */
.owlry-badge-app {
background-color: rgba(0, 122, 136, 0.15);
color: var(--owlry-badge-app);
}
.owlry-badge-bookmark {
background-color: rgba(209, 143, 0, 0.15);
color: var(--owlry-badge-bookmark);
}
.owlry-badge-calc {
background-color: rgba(255, 191, 64, 0.15);
color: var(--owlry-badge-calc);
}
.owlry-badge-clip {
background-color: rgba(122, 60, 255, 0.15);
color: var(--owlry-badge-clip);
}
.owlry-badge-cmd {
background-color: rgba(122, 60, 255, 0.15);
color: var(--owlry-badge-cmd);
}
.owlry-badge-dmenu {
background-color: rgba(0, 179, 119, 0.15);
color: var(--owlry-badge-dmenu);
}
.owlry-badge-emoji {
background-color: rgba(166, 128, 255, 0.15);
color: var(--owlry-badge-emoji);
}
.owlry-badge-file {
background-color: rgba(51, 188, 204, 0.15);
color: var(--owlry-badge-file);
}
.owlry-badge-script {
background-color: rgba(51, 214, 166, 0.15);
color: var(--owlry-badge-script);
}
.owlry-badge-ssh {
background-color: rgba(0, 122, 136, 0.15);
color: var(--owlry-badge-ssh);
}
.owlry-badge-sys {
background-color: rgba(255, 0, 68, 0.15);
color: var(--owlry-badge-sys);
}
.owlry-badge-uuctl {
background-color: rgba(209, 143, 0, 0.15);
color: var(--owlry-badge-uuctl);
}
.owlry-badge-web {
background-color: rgba(0, 122, 136, 0.15);
color: var(--owlry-badge-web);
}
/* Widget badges */
.owlry-badge-media {
background-color: rgba(166, 128, 255, 0.15);
color: var(--owlry-badge-media);
}
.owlry-badge-weather {
background-color: rgba(51, 188, 204, 0.15);
color: var(--owlry-badge-weather);
}
.owlry-badge-pomo {
background-color: rgba(255, 77, 109, 0.15);
color: var(--owlry-badge-pomo);
}
/* Filter button - default uses The Predator */
.owlry-filter-button:checked {
background-color: rgba(255, 0, 68, 0.2);
color: var(--owlry-accent);
border-color: rgba(255, 0, 68, 0.5);
}

171
dist/owlry/apex-neon.css vendored Normal file
View File

@@ -0,0 +1,171 @@
/*
* Owlry - Apex Neon Theme
* "State over Decoration."
*
* A high-contrast theme built for focus and clinical clarity.
* Color exists to signal STATE, not to decorate space.
*
* Author: S0wlz (Owlibou)
*
* Usage: Set theme = "apex-neon" in config.toml
*/
:root {
/* Core surfaces */
--owlry-bg: #050505;
--owlry-bg-secondary: #141414;
--owlry-border: #262626;
--owlry-text: #ededed;
--owlry-text-secondary: #737373;
/* The Predator - primary accent */
--owlry-accent: #ff0044;
--owlry-accent-bright: #ff8899;
/* Provider badges - mapped to Apex semantics */
--owlry-badge-app: #00eaff; /* Cyan: apps are informational */
--owlry-badge-bookmark: #ffb700; /* Yellow: bookmarks need attention */
--owlry-badge-calc: #ffd24d; /* Bright Yellow: calculator results */
--owlry-badge-clip: #9d00ff; /* Purple: clipboard is special */
--owlry-badge-cmd: #9d00ff; /* Purple: commands are elevated */
--owlry-badge-dmenu: #00ff99; /* Green: dmenu is success/pipe */
--owlry-badge-emoji: #c84dff; /* Bright Purple: emoji is special */
--owlry-badge-file: #5af3ff; /* Bright Cyan: file search is active info */
--owlry-badge-script: #2bffb2; /* Bright Green: scripts execute successfully */
--owlry-badge-ssh: #00eaff; /* Cyan: SSH is technical/info */
--owlry-badge-sys: #ff0044; /* Red: system actions are critical */
--owlry-badge-uuctl: #ffb700; /* Yellow: uuctl requires attention */
--owlry-badge-web: #00eaff; /* Cyan: web is informational */
/* Widget badges */
--owlry-badge-media: #c84dff; /* Bright Purple: media is special */
--owlry-badge-weather: #5af3ff; /* Bright Cyan: weather is active info */
--owlry-badge-pomo: #ff8899; /* Alert Red: pomodoro demands attention */
}
.owlry-main {
background-color: rgba(5, 5, 5, 0.98);
border: 1px solid rgba(38, 38, 38, 0.8);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8),
0 0 0 1px rgba(255, 0, 68, 0.1);
}
.owlry-search {
background-color: rgba(20, 20, 20, 0.9);
border: 2px solid rgba(38, 38, 38, 0.8);
color: var(--owlry-text);
caret-color: var(--owlry-accent);
}
.owlry-search:focus {
border-color: var(--owlry-accent);
box-shadow: 0 0 0 2px rgba(255, 0, 68, 0.3);
}
.owlry-result-row:hover {
background-color: rgba(20, 20, 20, 0.8);
}
.owlry-result-row:selected {
background-color: rgba(255, 0, 68, 0.15);
border-left: 3px solid var(--owlry-accent);
}
.owlry-result-row:selected .owlry-result-name {
color: var(--owlry-accent-bright);
}
.owlry-result-row:selected .owlry-result-icon {
color: var(--owlry-accent);
}
/* Provider badges - styled per Apex semantics */
.owlry-badge-app {
background-color: rgba(0, 234, 255, 0.15);
color: var(--owlry-badge-app);
}
.owlry-badge-bookmark {
background-color: rgba(255, 183, 0, 0.15);
color: var(--owlry-badge-bookmark);
}
.owlry-badge-calc {
background-color: rgba(255, 210, 77, 0.15);
color: var(--owlry-badge-calc);
}
.owlry-badge-clip {
background-color: rgba(157, 0, 255, 0.15);
color: var(--owlry-badge-clip);
}
.owlry-badge-cmd {
background-color: rgba(157, 0, 255, 0.15);
color: var(--owlry-badge-cmd);
}
.owlry-badge-dmenu {
background-color: rgba(0, 255, 153, 0.15);
color: var(--owlry-badge-dmenu);
}
.owlry-badge-emoji {
background-color: rgba(200, 77, 255, 0.15);
color: var(--owlry-badge-emoji);
}
.owlry-badge-file {
background-color: rgba(90, 243, 255, 0.15);
color: var(--owlry-badge-file);
}
.owlry-badge-script {
background-color: rgba(43, 255, 178, 0.15);
color: var(--owlry-badge-script);
}
.owlry-badge-ssh {
background-color: rgba(0, 234, 255, 0.15);
color: var(--owlry-badge-ssh);
}
.owlry-badge-sys {
background-color: rgba(255, 0, 68, 0.15);
color: var(--owlry-badge-sys);
}
.owlry-badge-uuctl {
background-color: rgba(255, 183, 0, 0.15);
color: var(--owlry-badge-uuctl);
}
.owlry-badge-web {
background-color: rgba(0, 234, 255, 0.15);
color: var(--owlry-badge-web);
}
/* Widget badges */
.owlry-badge-media {
background-color: rgba(200, 77, 255, 0.15);
color: var(--owlry-badge-media);
}
.owlry-badge-weather {
background-color: rgba(90, 243, 255, 0.15);
color: var(--owlry-badge-weather);
}
.owlry-badge-pomo {
background-color: rgba(255, 136, 153, 0.15);
color: var(--owlry-badge-pomo);
}
/* Filter button - default uses The Predator */
.owlry-filter-button:checked {
background-color: rgba(255, 0, 68, 0.2);
color: var(--owlry-accent);
border-color: rgba(255, 0, 68, 0.5);
}

126
dist/sherlock/apex-aeon.css vendored Normal file
View File

@@ -0,0 +1,126 @@
/* Apex Aeon - Sherlock Theme (Parser Compliant) */
/* 1. PALETTE DEFINITIONS */
@define-color apex_base #f5f5f5;
@define-color apex_surface #e8e8e8;
@define-color apex_overlay #737373;
@define-color apex_muted #a0a0a0;
@define-color apex_text #0a0a0a;
@define-color apex_love #ff0044;
@define-color apex_foam #007a88;
@define-color apex_gold #d18f00;
/* 2. WINDOW & INPUT */
window {
background-color: @apex_base;
color: @apex_text;
border: 2px solid @apex_love;
border-radius: 10px;
padding: 6px;
}
entry {
background-color: @apex_surface;
color: @apex_text;
caret-color: @apex_love;
border: 1px solid @apex_overlay;
border-radius: 7px;
padding: 6px 9px;
margin-bottom: 6px;
}
entry:focus {
border-color: @apex_love;
box-shadow: 0 0 10px rgba(255, 0, 68, 0.2);
}
entry selection {
background-color: @apex_foam;
color: #0a0a0a;
}
/* 3. LIST & SELECTION */
listview {
background-color: transparent;
}
/* The actual row selection - Informational */
listview > row:selected {
background-color: @apex_foam;
color: #0a0a0a;
border-radius: 7px;
border: none;
outline: none;
}
/* 4. TILES (The Items) */
.tile, .launcher-tile, .launcher-item, .item {
background-color: @apex_surface;
color: @apex_text;
border-radius: 7px;
padding: 4px 10px;
margin-bottom: 4px;
}
/* When the ROW is selected, make the TILE transparent so info shows through */
listview > row:selected .tile,
listview > row:selected .launcher-tile,
listview > row:selected .item {
background-color: transparent;
color: #0a0a0a;
}
/* Force TEXT on selection */
listview > row:selected label,
listview > row:selected .title,
listview > row:selected .description,
listview > row:selected .subtitle {
color: #0a0a0a;
}
/* Force ICONS on selection */
listview > row:selected image,
listview > row:selected .icon {
color: #0a0a0a;
}
/* 5. WIDGETS (Weather Fix without !important) */
.widget, .weather-widget, .music-widget {
background-color: @apex_surface;
border: 1px solid @apex_overlay;
color: @apex_text;
border-radius: 7px;
}
/* Specific overrides for weather internals */
.weather-widget box {
background-color: transparent;
}
.weather-widget label {
color: @apex_text;
}
/* Temperature info */
.weather-widget .temperature {
color: @apex_foam;
font-weight: 800;
}
.weather-widget .condition {
color: @apex_muted;
}
/* 6. SCROLLBARS */
scrollbar slider {
background-color: @apex_overlay;
min-width: 6px;
border-radius: 10px;
}
scrollbar slider:hover { background-color: @apex_love; }
progressbar progress {
background-color: @apex_love;
border-radius: 4px;
}

126
dist/sherlock/apex-neon.css vendored Normal file
View File

@@ -0,0 +1,126 @@
/* Apex Neon - Sherlock Theme (Parser Compliant) */
/* 1. PALETTE DEFINITIONS */
@define-color apex_base #050505;
@define-color apex_surface #141414;
@define-color apex_overlay #262626;
@define-color apex_muted #404040;
@define-color apex_text #ededed;
@define-color apex_love #ff0044;
@define-color apex_foam #00eaff;
@define-color apex_gold #ffb700;
/* 2. WINDOW & INPUT */
window {
background-color: @apex_base;
color: @apex_text;
border: 2px solid @apex_love;
border-radius: 10px;
padding: 6px;
}
entry {
background-color: @apex_surface;
color: @apex_text;
caret-color: @apex_love;
border: 1px solid @apex_overlay;
border-radius: 7px;
padding: 6px 9px;
margin-bottom: 6px;
}
entry:focus {
border-color: @apex_love;
box-shadow: 0 0 10px rgba(255, 0, 68, 0.2);
}
entry selection {
background-color: @apex_foam;
color: #050505;
}
/* 3. LIST & SELECTION */
listview {
background-color: transparent;
}
/* The actual row selection - Informational */
listview > row:selected {
background-color: @apex_foam;
color: #050505;
border-radius: 7px;
border: none;
outline: none;
}
/* 4. TILES (The Items) */
.tile, .launcher-tile, .launcher-item, .item {
background-color: @apex_surface;
color: @apex_text;
border-radius: 7px;
padding: 4px 10px;
margin-bottom: 4px;
}
/* When the ROW is selected, make the TILE transparent so info shows through */
listview > row:selected .tile,
listview > row:selected .launcher-tile,
listview > row:selected .item {
background-color: transparent;
color: #050505;
}
/* Force TEXT on selection */
listview > row:selected label,
listview > row:selected .title,
listview > row:selected .description,
listview > row:selected .subtitle {
color: #050505;
}
/* Force ICONS on selection */
listview > row:selected image,
listview > row:selected .icon {
color: #050505;
}
/* 5. WIDGETS (Weather Fix without !important) */
.widget, .weather-widget, .music-widget {
background-color: @apex_surface;
border: 1px solid @apex_overlay;
color: @apex_text;
border-radius: 7px;
}
/* Specific overrides for weather internals */
.weather-widget box {
background-color: transparent;
}
.weather-widget label {
color: @apex_text;
}
/* Temperature info */
.weather-widget .temperature {
color: @apex_foam;
font-weight: 800;
}
.weather-widget .condition {
color: @apex_muted;
}
/* 6. SCROLLBARS */
scrollbar slider {
background-color: @apex_overlay;
min-width: 6px;
border-radius: 10px;
}
scrollbar slider:hover { background-color: @apex_love; }
progressbar progress {
background-color: @apex_love;
border-radius: 4px;
}

17
dist/spicetify/apex-aeon-color.ini vendored Normal file
View File

@@ -0,0 +1,17 @@
[apex-aeon]
text = 0a0a0a
subtext = a0a0a0
main = f5f5f5
sidebar = f5f5f5
player = f5f5f5
card = e8e8e8
shadow = 000000
selected-row = 007a88
button = 007a88
button-active = ff0044
button-disabled = a0a0a0
tab-active = 737373
notification = 007a88
notification-error = ff0044
misc = d18f00

1
dist/spicetify/apex-aeon-user.css vendored Normal file
View File

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

17
dist/spicetify/apex-neon-color.ini vendored Normal file
View File

@@ -0,0 +1,17 @@
[apex-neon]
text = ededed
subtext = 404040
main = 050505
sidebar = 050505
player = 050505
card = 141414
shadow = 000000
selected-row = 00eaff
button = 00eaff
button-active = ff0044
button-disabled = 404040
tab-active = 262626
notification = 00eaff
notification-error = ff0044
misc = ffb700

1
dist/spicetify/apex-neon-user.css vendored Normal file
View File

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

146
dist/swaync/apex-aeon-style.css vendored Normal file
View File

@@ -0,0 +1,146 @@
/* Apex Aeon — SwayNC Theme */
/* DNA: State over Decoration */
@define-color void #f5f5f5;
@define-color stark #0a0a0a;
@define-color razor #ff0044;
@define-color tech #007a88;
@define-color toxic #00b377;
@define-color amber #d18f00;
@define-color alert #ff4d6d;
@define-color panel #e8e8e8;
@define-color border #737373;
@define-color stealth #a0a0a0;
@define-color dim #737373;
/* SwayNC Specific Variables */
@define-color noti-bg @panel;
@define-color noti-fg @stark;
@define-color noti-border-color @border;
@define-color noti-bg-hover @border;
@define-color noti-bg-focus @border;
@define-color noti-bg-critical @razor;
@define-color noti-fg-critical @void;
@define-color mpris-bg @panel;
@define-color mpris-fg @stark;
@define-color bg-selected @razor;
@define-color fg-selected @void;
/* Base Structure */
* {
font-family: "JetBrainsMono Nerd Font";
font-weight: 500;
}
.control-center {
background: @void;
border: 2px solid @razor;
border-radius: 0;
margin: 10px;
}
.control-center-list {
background: transparent;
}
.notification {
background: @noti-bg;
border: 1px solid @noti-border-color;
border-radius: 0;
margin: 5px;
padding: 10px;
}
.notification-content {
background: transparent;
}
.notification-default-action:hover {
background: @noti-bg-hover;
}
.notification-critical {
background: @noti-bg-critical;
color: @noti-fg-critical;
}
.notification-critical .notification-content {
color: @noti-fg-critical;
}
.notification-group {
background: transparent;
}
.notification-group-headers {
color: @dim;
}
.notification-group-icon {
color: @razor;
}
.mpris {
background: @mpris-bg;
border: 1px solid @border;
border-radius: 0;
margin: 5px;
}
.mpris-title {
color: @stark;
font-weight: bold;
}
.mpris-subtitle {
color: @dim;
}
.widget-title {
color: @razor;
font-weight: bold;
font-size: 1.2rem;
}
.widget-label {
color: @stark;
}
.widget-dnd {
color: @tech;
}
.widget-mpris {
background: transparent;
}
.widget-buttons-grid {
background: @panel;
padding: 10px;
margin: 5px;
}
.widget-buttons-grid > button {
background: @void;
border: 1px solid @border;
border-radius: 0;
color: @stark;
}
.widget-buttons-grid > button:hover {
background: @razor;
color: @void;
}
.widget-menubar > button {
background: transparent;
color: @stark;
}
.widget-menubar > button:hover {
background: @razor;
color: @void;
}

146
dist/swaync/apex-neon-style.css vendored Normal file
View File

@@ -0,0 +1,146 @@
/* Apex Neon — SwayNC Theme */
/* DNA: State over Decoration */
@define-color void #050505;
@define-color stark #ededed;
@define-color razor #ff0044;
@define-color tech #00eaff;
@define-color toxic #00ff99;
@define-color amber #ffb700;
@define-color alert #ff8899;
@define-color panel #141414;
@define-color border #262626;
@define-color stealth #404040;
@define-color dim #737373;
/* SwayNC Specific Variables */
@define-color noti-bg @panel;
@define-color noti-fg @stark;
@define-color noti-border-color @border;
@define-color noti-bg-hover @border;
@define-color noti-bg-focus @border;
@define-color noti-bg-critical @razor;
@define-color noti-fg-critical @void;
@define-color mpris-bg @panel;
@define-color mpris-fg @stark;
@define-color bg-selected @razor;
@define-color fg-selected @void;
/* Base Structure */
* {
font-family: "JetBrainsMono Nerd Font";
font-weight: 500;
}
.control-center {
background: @void;
border: 2px solid @razor;
border-radius: 0;
margin: 10px;
}
.control-center-list {
background: transparent;
}
.notification {
background: @noti-bg;
border: 1px solid @noti-border-color;
border-radius: 0;
margin: 5px;
padding: 10px;
}
.notification-content {
background: transparent;
}
.notification-default-action:hover {
background: @noti-bg-hover;
}
.notification-critical {
background: @noti-bg-critical;
color: @noti-fg-critical;
}
.notification-critical .notification-content {
color: @noti-fg-critical;
}
.notification-group {
background: transparent;
}
.notification-group-headers {
color: @dim;
}
.notification-group-icon {
color: @razor;
}
.mpris {
background: @mpris-bg;
border: 1px solid @border;
border-radius: 0;
margin: 5px;
}
.mpris-title {
color: @stark;
font-weight: bold;
}
.mpris-subtitle {
color: @dim;
}
.widget-title {
color: @razor;
font-weight: bold;
font-size: 1.2rem;
}
.widget-label {
color: @stark;
}
.widget-dnd {
color: @tech;
}
.widget-mpris {
background: transparent;
}
.widget-buttons-grid {
background: @panel;
padding: 10px;
margin: 5px;
}
.widget-buttons-grid > button {
background: @void;
border: 1px solid @border;
border-radius: 0;
color: @stark;
}
.widget-buttons-grid > button:hover {
background: @razor;
color: @void;
}
.widget-menubar > button {
background: transparent;
color: @stark;
}
.widget-menubar > button:hover {
background: @razor;
color: @void;
}

25
dist/waybar/apex-aeon-colors.css vendored Normal file
View File

@@ -0,0 +1,25 @@
/* Apex Aeon — Waybar Color Palette */
/* DNA: State over Decoration */
@define-color void #f5f5f5;
@define-color stark #0a0a0a;
@define-color razor #ff0044;
@define-color tech #007a88;
@define-color toxic #00b377;
@define-color amber #d18f00;
@define-color sacred #7a3cff;
@define-color alert #ff4d6d;
@define-color panel #e8e8e8;
@define-color border #737373;
@define-color stealth #a0a0a0;
@define-color dim #737373;
/* Semantic mappings for easier integration */
@define-color background @void;
@define-color foreground @stark;
@define-color accent @razor;
@define-color info @tech;
@define-color success @toxic;
@define-color warning @amber;
@define-color error @alert;

25
dist/waybar/apex-neon-colors.css vendored Normal file
View File

@@ -0,0 +1,25 @@
/* Apex Neon — Waybar Color Palette */
/* DNA: State over Decoration */
@define-color void #050505;
@define-color stark #ededed;
@define-color razor #ff0044;
@define-color tech #00eaff;
@define-color toxic #00ff99;
@define-color amber #ffb700;
@define-color sacred #9d00ff;
@define-color alert #ff8899;
@define-color panel #141414;
@define-color border #262626;
@define-color stealth #404040;
@define-color dim #737373;
/* Semantic mappings for easier integration */
@define-color background @void;
@define-color foreground @stark;
@define-color accent @razor;
@define-color info @tech;
@define-color success @toxic;
@define-color warning @amber;
@define-color error @alert;

35
dist/wezterm/apex-aeon.toml vendored Normal file
View File

@@ -0,0 +1,35 @@
# APEX AEON - WezTerm color scheme
# Spec-accurate: color = state, not decoration
[colors]
foreground = "#0a0a0a"
background = "#f5f5f5"
cursor_bg = "#ff0044"
cursor_border = "#ff0044"
cursor_fg = "#0a0a0a"
selection_bg = "#ff0044"
selection_fg = "#0a0a0a"
ansi = [
"#0a0a0a",
"#ff0044",
"#00b377",
"#d18f00",
"#007a88",
"#7a3cff",
"#007a88",
"#f5f5f5",
]
brights = [
"#737373",
"#ff4d6d",
"#33d6a6",
"#ffbf40",
"#33bccc",
"#a680ff",
"#33bccc",
"#ffffff",
]

35
dist/wezterm/apex-neon.toml vendored Normal file
View File

@@ -0,0 +1,35 @@
# APEX NEON - WezTerm color scheme
# Spec-accurate: color = state, not decoration
[colors]
foreground = "#ededed"
background = "#050505"
cursor_bg = "#ff0044"
cursor_border = "#ff0044"
cursor_fg = "#050505"
selection_bg = "#ff0044"
selection_fg = "#050505"
ansi = [
"#050505",
"#ff0044",
"#00ff99",
"#ffb700",
"#00eaff",
"#9d00ff",
"#00eaff",
"#ededed",
]
brights = [
"#737373",
"#ff8899",
"#2bffb2",
"#ffd24d",
"#5af3ff",
"#c84dff",
"#5af3ff",
"#ffffff",
]

46
dist/zathura/apex-aeon-zathurarc vendored Normal file
View File

@@ -0,0 +1,46 @@
# Apex Aeon — Zathura Theme
# DNA: State over Decoration
# Core
set default-bg "#f5f5f5"
set default-fg "#0a0a0a"
# Status Bar
set statusbar-bg "#e8e8e8"
set statusbar-fg "#0a0a0a"
# Input Bar
set inputbar-bg "#e8e8e8"
set inputbar-fg "#0a0a0a"
# Completion
set completion-bg "#e8e8e8"
set completion-fg "#0a0a0a"
set completion-group-bg "#737373"
set completion-group-fg "#737373"
set completion-highlight-bg "#ff0044"
set completion-highlight-fg "#0a0a0a"
# Notifications
set notification-bg "#e8e8e8"
set notification-fg "#0a0a0a"
set notification-error-bg "#ff4d6d"
set notification-error-fg "#f5f5f5"
set notification-warning-bg "#d18f00"
set notification-warning-fg "#f5f5f5"
# Selection & Highlight
set highlight-color "rgba(ff0044, 0.5)"
set highlight-active-color "rgba(ff0044, 0.8)"
# Recolor (Dark Mode for PDFs)
# In Neon (Dark), we want dark paper (background) and light ink (foreground).
# In Aeon (Light), we want light paper and dark ink (standard).
set recolor-lightcolor "#f5f5f5"
set recolor-darkcolor "#0a0a0a"
# Default recolor state
# Ideally, only true for dark themes, but Zathura config is static.
# Users can toggle with Ctrl+R.
set recolor "false"
set recolor-keephue "true"

46
dist/zathura/apex-neon-zathurarc vendored Normal file
View File

@@ -0,0 +1,46 @@
# Apex Neon — Zathura Theme
# DNA: State over Decoration
# Core
set default-bg "#050505"
set default-fg "#ededed"
# Status Bar
set statusbar-bg "#141414"
set statusbar-fg "#ededed"
# Input Bar
set inputbar-bg "#141414"
set inputbar-fg "#ededed"
# Completion
set completion-bg "#141414"
set completion-fg "#ededed"
set completion-group-bg "#262626"
set completion-group-fg "#737373"
set completion-highlight-bg "#ff0044"
set completion-highlight-fg "#050505"
# Notifications
set notification-bg "#141414"
set notification-fg "#ededed"
set notification-error-bg "#ff8899"
set notification-error-fg "#050505"
set notification-warning-bg "#ffb700"
set notification-warning-fg "#050505"
# Selection & Highlight
set highlight-color "rgba(ff0044, 0.5)"
set highlight-active-color "rgba(ff0044, 0.8)"
# Recolor (Dark Mode for PDFs)
# In Neon (Dark), we want dark paper (background) and light ink (foreground).
# In Aeon (Light), we want light paper and dark ink (standard).
set recolor-lightcolor "#050505"
set recolor-darkcolor "#ededed"
# Default recolor state
# Ideally, only true for dark themes, but Zathura config is static.
# Users can toggle with Ctrl+R.
set recolor "false"
set recolor-keephue "true"

632
dist/zed/apex.json vendored Normal file
View File

@@ -0,0 +1,632 @@
{
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
"name": "Apex",
"author": "S0wlz (Owlibou)",
"themes": [
{
"name": "Apex Neon",
"appearance": "dark",
"style": {
"background": "#050505",
"background.appearance": "opaque",
"surface.background": "#141414",
"elevated_surface.background": "#141414",
"panel.background": "#141414",
"panel.focused_border": "#ff0044",
"panel.indent_guide": "#26262666",
"panel.indent_guide_active": "#737373aa",
"panel.indent_guide_hover": "#737373cc",
"tab_bar.background": "#141414",
"tab.inactive_background": "#141414",
"tab.active_background": "#050505",
"title_bar.background": "#050505",
"title_bar.inactive_background": "#141414",
"toolbar.background": "#141414",
"status_bar.background": "#141414",
"border": "#262626",
"border.variant": "#141414",
"border.focused": "#ff0044",
"border.selected": "#ff0044",
"border.disabled": "#141414",
"border.transparent": "transparent",
"text": "#ededed",
"text.muted": "#737373",
"text.placeholder": "#737373",
"text.disabled": "#737373",
"text.accent": "#00eaff",
"icon": "#ededed",
"icon.muted": "#737373",
"icon.placeholder": "#737373",
"icon.disabled": "#737373",
"icon.accent": "#00eaff",
"accents": [
"#ff0044",
"#00eaff",
"#9d00ff",
"#00ff99",
"#ffb700"
],
"element.background": "#141414",
"element.hover": "#262626",
"element.active": "#262626",
"element.selected": "#262626",
"element.disabled": "#141414",
"ghost_element.background": null,
"ghost_element.hover": "#26262666",
"ghost_element.active": "#26262688",
"ghost_element.selected": "#26262666",
"ghost_element.disabled": null,
"drop_target.background": "#00eaff22",
"editor.background": "#050505",
"editor.foreground": "#ededed",
"editor.gutter.background": "#050505",
"editor.subheader.background": "#141414",
"editor.active_line.background": "#141414",
"editor.highlighted_line.background": "#141414",
"editor.line_number": "#737373",
"editor.active_line_number": "#ff0044",
"editor.wrap_guide": "#262626",
"editor.active_wrap_guide": "#737373",
"editor.indent_guide": "#26262666",
"editor.indent_guide_active": "#737373aa",
"editor.invisible": "#26262688",
"editor.document_highlight.read_background": "#00eaff22",
"editor.document_highlight.write_background": "#ff004422",
"editor.document_highlight.bracket_background": "#26262666",
"search.match_background": "#00eaff33",
"scrollbar.track.background": "#050505",
"scrollbar.track.border": "#050505",
"scrollbar.thumb.background": "#262626aa",
"scrollbar.thumb.hover_background": "#404040",
"scrollbar.thumb.border": "transparent",
"pane.focused_border": "#ff0044",
"pane_group.border": "#262626",
"link_text.hover": "#5af3ff",
"success": "#00ff99",
"success.background": "#00ff991a",
"success.border": "#00ff99",
"warning": "#ffb700",
"warning.background": "#ffb7001a",
"warning.border": "#ffb700",
"error": "#ff8899",
"error.background": "#ff88991a",
"error.border": "#ff8899",
"info": "#00eaff",
"info.background": "#00eaff1a",
"info.border": "#00eaff",
"hint": "#0088cc",
"hint.background": "#0088cc1a",
"hint.border": "#0088cc",
"predictive": "#0088cc",
"predictive.background": "#0088cc1a",
"predictive.border": "#0088cc",
"unreachable": "#9d00ff",
"unreachable.background": "#9d00ff1a",
"unreachable.border": "#9d00ff",
"created": "#00ff99",
"created.background": "#00ff991a",
"created.border": "#00ff99",
"modified": "#ffb700",
"modified.background": "#ffb7001a",
"modified.border": "#ffb700",
"deleted": "#ff8899",
"deleted.background": "#ff88991a",
"deleted.border": "#ff8899",
"renamed": "#00eaff",
"renamed.background": "#00eaff1a",
"renamed.border": "#00eaff",
"conflict": "#ff8899",
"conflict.background": "#ff88991a",
"conflict.border": "#ff8899",
"ignored": "#737373",
"ignored.background": "#7373731a",
"ignored.border": "#262626",
"hidden": "#737373",
"hidden.background": "#7373731a",
"hidden.border": "#262626",
"terminal.background": "#050505",
"terminal.foreground": "#ededed",
"terminal.bright_foreground": "#ffffff",
"terminal.dim_foreground": "#737373",
"terminal.ansi.background": "#050505",
"terminal.ansi.black": "#050505",
"terminal.ansi.red": "#ff0044",
"terminal.ansi.green": "#00ff99",
"terminal.ansi.yellow": "#ffb700",
"terminal.ansi.blue": "#00eaff",
"terminal.ansi.magenta": "#9d00ff",
"terminal.ansi.cyan": "#00eaff",
"terminal.ansi.white": "#ededed",
"terminal.ansi.bright_black": "#737373",
"terminal.ansi.bright_red": "#ff8899",
"terminal.ansi.bright_green": "#2bffb2",
"terminal.ansi.bright_yellow": "#ffd24d",
"terminal.ansi.bright_blue": "#5af3ff",
"terminal.ansi.bright_magenta": "#c84dff",
"terminal.ansi.bright_cyan": "#5af3ff",
"terminal.ansi.bright_white": "#ffffff",
"terminal.ansi.dim_black": "#050505",
"terminal.ansi.dim_red": "#ff0044",
"terminal.ansi.dim_green": "#00ff99",
"terminal.ansi.dim_yellow": "#ffb700",
"terminal.ansi.dim_blue": "#00eaff",
"terminal.ansi.dim_magenta": "#9d00ff",
"terminal.ansi.dim_cyan": "#00eaff",
"terminal.ansi.dim_white": "#ededed",
"players": [
{
"cursor": "#ff0044",
"background": "#ff0044",
"selection": "#ff004433"
},
{
"cursor": "#00eaff",
"background": "#00eaff",
"selection": "#00eaff33"
},
{
"cursor": "#9d00ff",
"background": "#9d00ff",
"selection": "#9d00ff33"
},
{
"cursor": "#00ff99",
"background": "#00ff99",
"selection": "#00ff9933"
},
{
"cursor": "#ffb700",
"background": "#ffb700",
"selection": "#ffb70033"
}
],
"version_control.added": "#00ff99",
"version_control.modified": "#ffb700",
"version_control.deleted": "#ff8899",
"version_control.conflict": "#ff8899",
"version_control.renamed": "#00eaff",
"version_control.ignored": "#737373",
"syntax": {
"comment": {
"color": "#737373",
"font_style": "italic"
},
"comment.doc": {
"color": "#737373",
"font_style": "italic"
},
"keyword": {
"color": "#9d00ff"
},
"keyword.import": {
"color": "#9d00ff"
},
"keyword.storage": {
"color": "#9d00ff"
},
"function": {
"color": "#0088cc"
},
"function.method": {
"color": "#0088cc"
},
"function.special.definition": {
"color": "#0088cc"
},
"type": {
"color": "#ffb700"
},
"type.builtin": {
"color": "#ffb700"
},
"string": {
"color": "#00ff99"
},
"string.escape": {
"color": "#2bffb2"
},
"string.regex": {
"color": "#ffb700"
},
"number": {
"color": "#00eaff"
},
"boolean": {
"color": "#00eaff"
},
"constant": {
"color": "#00eaff"
},
"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": "#7a3cff"
},
"keyword.import": {
"color": "#7a3cff"
},
"keyword.storage": {
"color": "#7a3cff"
},
"function": {
"color": "#005577"
},
"function.method": {
"color": "#005577"
},
"function.special.definition": {
"color": "#005577"
},
"type": {
"color": "#d18f00"
},
"type.builtin": {
"color": "#d18f00"
},
"string": {
"color": "#00b377"
},
"string.escape": {
"color": "#33d6a6"
},
"string.regex": {
"color": "#d18f00"
},
"number": {
"color": "#007a88"
},
"boolean": {
"color": "#007a88"
},
"constant": {
"color": "#007a88"
},
"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"
}
}
}
}
]
}

630
dist/zsh/apex-aeon.zsh-theme vendored Normal file
View File

@@ -0,0 +1,630 @@
# 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"
# -----------------------------------------------------------------------------
# 1b) PLUGIN COLORS
# -----------------------------------------------------------------------------
# zsh-autosuggestions: ghost text from history (subtle, intentionally dim)
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#737373"
# zsh-history-substring-search
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND="fg=#007a88,bold"
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND="fg=#ff4d6d,bold"
# -----------------------------------------------------------------------------
# 2) ICONS / GLYPHS (Nerd Font optional)
# -----------------------------------------------------------------------------
typeset -gA I
I[OS]=""
I[SSH]=""
I[ROOT]=""
I[GIT]=""
I[JOBS]=""
I[RADAR]="⌁"
I[RET]="↩"
typeset -gA S
S[PL_L]=""
S[PL_R]=""
S[DOT]="·"
# -----------------------------------------------------------------------------
# 3) CONFIG
# -----------------------------------------------------------------------------
typeset -gA APEX
APEX[SLOW_SOFT_MS]=750
APEX[SLOW_HARD_MS]=2000
APEX[STARTUP_BURST]=1
APEX[SHOW_AAR]=1
APEX[SHOW_CONTEXT_BURST]=1
APEX[SHOW_VCS]=1
APEX[SHOW_INTEL]=1
APEX[SHOW_JOBS]=1
APEX[SHOW_RO]=1
APEX[GIT_AHEAD_BEHIND]=1
# Ops commands (also match wrappers like sudo/doas/command)
APEX[OPS_RE]='^((sudo|doas|command)[[:space:]]+)*((pacman|yay|paru|apt|dnf|brew|systemctl|docker|kubectl|helm|git))([[:space:]]|$)'
# Session-ish commands (spawn a subshell; exit codes are often “not a failure”)
APEX[SESSION_RE]='^((sudo|doas|command)[[:space:]]+)*chezmoi[[:space:]]+cd([[:space:]]|$)'
# -----------------------------------------------------------------------------
# 4) STATE
# -----------------------------------------------------------------------------
typeset -gF apex_cmd_start=0.0
typeset -g apex_last_cmd=""
typeset -g apex_has_run_cmd=0
typeset -g apex_startup_done=0
typeset -g apex_pwd_changed=1
# Sticky intel
typeset -g apex_venv_name=""
typeset -g apex_target_sig=""
typeset -g apex_mode_sig=""
# Git state
typeset -g apex_in_git=0
typeset -g apex_git_branch=""
typeset -g apex_git_dirty_wt=0
typeset -g apex_git_dirty_ix=0
typeset -g apex_git_untracked=0
typeset -g apex_git_conflict=0
typeset -g apex_git_op=""
typeset -g apex_git_up_ok=0
typeset -g apex_git_ahead=0
typeset -g apex_git_behind=0
typeset -g apex_git_stash=0
typeset -g apex_git_root=""
typeset -g apex_git_dir=""
# Radar previous snapshots (transition detection)
typeset -g apex_prev_in_git=-1
typeset -g apex_prev_git_branch=""
typeset -g apex_prev_git_op=""
typeset -g apex_prev_venv_name=""
typeset -g apex_prev_target_sig=""
typeset -g apex_prev_proj_sig=""
# -----------------------------------------------------------------------------
# 5) UTILITIES
# -----------------------------------------------------------------------------
apex__short_cmd() {
local s="$1"
s="${s//$'
'/ }"
s="${s#"${s%%[![:space:]]*}"}" # ltrim
s="${s%"${s##*[![:space:]]}"}" # rtrim
print -r -- "${s[1,90]}"
}
apex__project_sig() {
local s=""
[[ -f package.json ]] && s+="node"
[[ -f pnpm-lock.yaml ]] && s+="+pnpm"
[[ -f bun.lockb ]] && s+="+bun"
[[ -f yarn.lock ]] && s+="+yarn"
[[ -f pyproject.toml || -f requirements.txt ]] && s+="${s:+ }py"
[[ -f uv.lock ]] && s+="+uv"
[[ -f Cargo.toml ]] && s+="${s:+ }rust"
[[ -f go.mod ]] && s+="${s:+ }go"
[[ -n "$s" ]] && print -r -- "$s"
}
apex__escape_prompt() {
local s="$1"
s="${s//\\%/%%}"
print -r -- "$s"
}
apex__now_float() {
if [[ -n "${EPOCHREALTIME:-}" ]]; then
print -r -- "$EPOCHREALTIME"
elif [[ -n "${EPOCHSECONDS:-}" ]]; then
print -r -- "${EPOCHSECONDS}.0"
else
print -r -- "0.0"
fi
}
apex__find_git_root() {
local dir="$PWD"
local git_root=""
local git_dir=""
while [[ -n "$dir" ]]; do
if [[ -d "$dir/.git" ]]; then
git_root="$dir"
git_dir="$dir/.git"
break
elif [[ -f "$dir/.git" ]]; then
local line
line="$(<"$dir/.git")"
if [[ "$line" == gitdir:* ]]; then
git_root="$dir"
git_dir="${line#gitdir: }"
[[ "$git_dir" != /* ]] && git_dir="$dir/$git_dir"
break
fi
fi
[[ "$dir" == "/" ]] && break
dir="${dir:h}"
done
[[ -n "$git_root" ]] && print -r -- "${git_root}|${git_dir}"
}
# -----------------------------------------------------------------------------
# 6) INTEL (sticky; updated each prompt)
# -----------------------------------------------------------------------------
apex_update_intel() {
# Target (cheap env-based; no kubectl calls)
if [[ -n "$AWS_PROFILE" ]]; then
apex_target_sig="aws:${AWS_PROFILE}"
elif [[ -n "$GOOGLE_CLOUD_PROJECT" ]]; then
apex_target_sig="gcp:${GOOGLE_CLOUD_PROJECT}"
elif [[ -n "$KUBE_CONTEXT" ]]; then
apex_target_sig="kube:${KUBE_CONTEXT}"
else
apex_target_sig=""
fi
# Mode
if [[ -n "$IN_NIX_SHELL" ]]; then
apex_mode_sig="nix"
elif [[ -n "$DIRENV_DIR" ]]; then
apex_mode_sig="direnv"
elif [[ -f /run/.containerenv || -f /.dockerenv ]]; then
apex_mode_sig="ctr"
else
apex_mode_sig=""
fi
# Venv
apex_venv_name=""
if [[ -n "$VIRTUAL_ENV" ]]; then
apex_venv_name="$(basename "$VIRTUAL_ENV")"
elif [[ -n "$CONDA_DEFAULT_ENV" ]]; then
apex_venv_name="$CONDA_DEFAULT_ENV"
fi
}
# -----------------------------------------------------------------------------
# 7) GIT
# -----------------------------------------------------------------------------
apex_git_update() {
apex_in_git=0
apex_git_branch=""
apex_git_dirty_wt=0
apex_git_dirty_ix=0
apex_git_untracked=0
apex_git_conflict=0
apex_git_op=""
apex_git_up_ok=0
apex_git_ahead=0
apex_git_behind=0
apex_git_stash=0
local status_out
status_out="$(command git status --porcelain=2 --branch 2>/dev/null)" || {
apex_git_root=""
apex_git_dir=""
return
}
apex_in_git=1
if (( apex_pwd_changed )) || [[ -z "$apex_git_root" ]]; then
local root_info
root_info="$(apex__find_git_root)"
if [[ -n "$root_info" ]]; then
apex_git_root="${root_info%%|*}"
apex_git_dir="${root_info#*|}"
else
apex_git_root=""
apex_git_dir=""
fi
fi
local branch_head="" branch_oid="" upstream=""
local xy="" ix="" wt=""
local line
while IFS= read -r line; do
case "$line" in
\#\ branch.head\ *)
branch_head="${line#\# branch.head }"
;;
\#\ branch.oid\ *)
branch_oid="${line#\# branch.oid }"
;;
\#\ branch.upstream\ *)
upstream="${line#\# branch.upstream }"
;;
\#\ branch.ab\ *)
local ab a b
ab="${line#\# branch.ab }"
IFS=' ' read -r a b <<<"$ab"
a="${a#+}"
b="${b#-}"
apex_git_ahead="${a:-0}"
apex_git_behind="${b:-0}"
;;
1\ *|2\ *)
xy="${line[3,4]}"
ix="${xy[1]}"
wt="${xy[2]}"
[[ "$ix" != "." ]] && apex_git_dirty_ix=1
[[ "$wt" != "." ]] && apex_git_dirty_wt=1
;;
u\ *)
apex_git_conflict=1
apex_git_dirty_ix=1
apex_git_dirty_wt=1
;;
\?\ *)
apex_git_untracked=1
;;
esac
done <<<"$status_out"
if [[ -n "$branch_head" && "$branch_head" != "(detached)" && "$branch_head" != "HEAD" ]]; then
apex_git_branch="$branch_head"
elif [[ -n "$branch_oid" ]]; then
apex_git_branch="${branch_oid[1,7]}"
fi
if [[ -n "$apex_git_dir" ]]; then
[[ -d "$apex_git_dir/rebase-apply" || -d "$apex_git_dir/rebase-merge" ]] && apex_git_op="rebase"
[[ -f "$apex_git_dir/MERGE_HEAD" ]] && apex_git_op="merge"
[[ -f "$apex_git_dir/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
[[ -f "$apex_git_dir/BISECT_LOG" ]] && apex_git_op="bisect"
if [[ -f "$apex_git_dir/logs/refs/stash" ]]; then
local -a stash_lines
stash_lines=(${(f)"$(<"$apex_git_dir/logs/refs/stash")"})
apex_git_stash=$#stash_lines
elif [[ -f "$apex_git_dir/refs/stash" ]]; then
apex_git_stash=1
fi
fi
(( apex_git_conflict )) && apex_git_op="conflict"
if [[ -n "$upstream" && "$upstream" != "(gone)" ]]; then
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 && apex_git_untracked == 0 && apex_git_conflict == 0 && apex_git_stash == 0 )) \
&& [[ -z "$apex_git_op" ]]; then
[[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1
fi
fi
}
# -----------------------------------------------------------------------------
# 8) LEFT PROMPTLINE: IDENTITY + TERRITORY
# -----------------------------------------------------------------------------
apex_identity() {
local is_root=0 is_ssh=0 color label
(( EUID == 0 )) && is_root=1
[[ -n "$SSH_CONNECTION$SSH_TTY" ]] && is_ssh=1
if (( is_root )); then
color="${C[PURPLE]}"
if (( is_ssh )); then
label="${I[ROOT]} @%m"
else
label="${I[ROOT]} root"
fi
elif (( is_ssh )); then
color="${C[CYAN]}"
label="${I[SSH]} %n@%m"
else
return 0
fi
print -n "%F{${color}}${S[PL_L]}%f%K{${color}}%F{${C[VOID]}}%B ${label} %b%f%k%F{${color}}${S[PL_R]}%f "
}
apex_territory() {
print -n "%F{${C[RAZOR]}}${S[PL_L]}%f%K{${C[RAZOR]}}%F{${C[VOID]}}%B ${I[OS]}%b %F{${C[WHITE]}}%B%~%b %f%k%F{${C[RAZOR]}}${S[PL_R]}%f"
}
# -----------------------------------------------------------------------------
# 9) RIGHT PROMPT (RPROMPT): INTEL + VCS + FRICTION
# -----------------------------------------------------------------------------
apex_intel_r() {
(( APEX[SHOW_INTEL] )) || return 0
if [[ -n "$apex_target_sig" ]]; then
print -n "%F{${C[CYAN]}}(${apex_target_sig})%f"
elif [[ -n "$apex_mode_sig" ]]; then
print -n "%F{${C[CYAN]}}(${apex_mode_sig})%f"
elif [[ -n "$apex_venv_name" ]]; then
print -n "%F{${C[CYAN]}}(${apex_venv_name})%f"
fi
}
apex_vcs_r() {
(( APEX[SHOW_VCS] )) || return 0
(( apex_in_git )) || return 0
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
if [[ -n "$apex_git_op" ]]; then
print -n "%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
return 0
fi
print -n "%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
local mark=""
(( apex_git_dirty_ix )) && mark+="+"
(( apex_git_dirty_wt )) && mark+="!"
(( apex_git_untracked )) && mark+="?"
[[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f"
(( apex_git_stash > 0 )) && print -n "%F{${C[MUTED]}} s${apex_git_stash}%f"
(( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f"
if (( APEX[GIT_AHEAD_BEHIND] )); then
(( apex_git_ahead > 0 )) && print -n "%F{${C[MUTED]}} ⇡${apex_git_ahead}%f"
(( apex_git_behind > 0 )) && print -n "%F{${C[MUTED]}} ⇣${apex_git_behind}%f"
fi
}
apex_friction_r() {
if (( APEX[SHOW_RO] )); then
local ro=0
[[ ! -w . ]] && ro=1
if (( apex_in_git )) && [[ -n "$apex_git_root" && ! -w "$apex_git_root" ]]; then
ro=1
fi
if (( ro )); then
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
return 0
fi
fi
if (( APEX[SHOW_JOBS] )); then
local -a job_pids
job_pids=(${(f)"$(jobs -p 2>/dev/null)"})
local jc=$#job_pids
if (( jc > 0 )); then
print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f"
return 0
fi
fi
}
build_rprompt() {
local s out=""
local sep="%F{${C[MUTED]}} ${S[DOT]} %f"
s="$(apex_intel_r)"; [[ -n "$s" ]] && out+="$s"
s="$(apex_vcs_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
s="$(apex_friction_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
[[ -n "$out" ]] && out="%F{${C[MUTED]}}[%f${out}%F{${C[MUTED]}}]%f"
print -n "$out"
}
# -----------------------------------------------------------------------------
# 10) RADAR (precmd)
# -----------------------------------------------------------------------------
apex_radar_aar() {
(( APEX[SHOW_AAR] )) || return 0
local ec=$1 cmd="$2" dur="$3"
local -i ms=${4:-0}
local show=0
(( ec != 0 )) && show=1
[[ -n "$dur" ]] && show=1
[[ "$cmd" =~ ${APEX[OPS_RE]} ]] && show=1
(( show )) || return 0
local short; short="$(apex__short_cmd "$cmd")"
short="$(apex__escape_prompt "$short")"
local dur_color="${C[MUTED]}"
(( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}"
local dur_chunk=""
if [[ -n "$dur" ]]; then
if (( ms >= ${APEX[SLOW_HARD_MS]} )); then
dur_chunk=" %F{${dur_color}}%B${dur}%b%f"
else
dur_chunk=" %F{${dur_color}}${dur}%f"
fi
fi
# Session commands: don't scream in red for “rc:1”
if [[ "$cmd" =~ ${APEX[SESSION_RE]} ]]; then
if (( ec == 0 )); then
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
else
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f %F{${C[MUTED]}}rc:${ec}%f${dur_chunk}"
fi
return 0
fi
if (( ec == 0 )); then
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}✓%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
return 0
fi
# Signals: 128 + signal number
case $ec in
130) # SIGINT (Ctrl+C)
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[CYAN]}}^C%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
141) # SIGPIPE
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[MUTED]}}PIPE%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
143) # SIGTERM
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}TERM%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
*)
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[ALERT]}}✘ ${ec}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
esac
}
apex_radar_context_burst() {
(( APEX[SHOW_CONTEXT_BURST] )) || return 0
local proj_sig; proj_sig="$(apex__project_sig 2>/dev/null || print -r -- "")"
local emit=0
if (( apex_startup_done == 0 )); then
(( APEX[STARTUP_BURST] )) && emit=1
fi
(( apex_pwd_changed )) && emit=1
[[ "$apex_venv_name" != "$apex_prev_venv_name" ]] && emit=1
[[ "$apex_target_sig" != "$apex_prev_target_sig" ]] && emit=1
(( apex_in_git != apex_prev_in_git )) && emit=1
[[ "$apex_git_branch" != "$apex_prev_git_branch" ]] && emit=1
[[ "$apex_git_op" != "$apex_prev_git_op" ]] && emit=1
[[ "$proj_sig" != "$apex_prev_proj_sig" ]] && emit=1
(( emit )) || return 0
# If nothing to say, say nothing.
if [[ -z "$proj_sig" && -z "$apex_venv_name" && -z "$apex_target_sig" ]] && (( apex_in_git == 0 )); then
apex_pwd_changed=0
apex_startup_done=1
return 0
fi
local out="%F{${C[MUTED]}}${I[RADAR]}%f "
# Git first
if (( apex_in_git )); then
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
if [[ -n "$apex_git_op" ]]; then
out+="%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
else
out+="%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
fi
fi
[[ -n "$proj_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[MUTED]}}${proj_sig}%f"
[[ -n "$apex_venv_name" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_venv_name})%f"
[[ -n "$apex_target_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_target_sig})%f"
print -P "$out"
apex_prev_venv_name="$apex_venv_name"
apex_prev_target_sig="$apex_target_sig"
apex_prev_in_git="$apex_in_git"
apex_prev_git_branch="$apex_git_branch"
apex_prev_git_op="$apex_git_op"
apex_prev_proj_sig="$proj_sig"
apex_pwd_changed=0
apex_startup_done=1
}
# -----------------------------------------------------------------------------
# 11) HOOKS
# -----------------------------------------------------------------------------
apex_preexec_hook() {
apex_has_run_cmd=1
apex_cmd_start="$(apex__now_float)"
apex_last_cmd="$1"
}
apex_chpwd_hook() {
apex_pwd_changed=1
}
apex_precmd_hook() {
local ec=$?
apex_update_intel
apex_git_update
# Did a command actually run since the last prompt?
local ran=0
(( apex_has_run_cmd )) && ran=1
if (( ran )); then
local now; now="$(apex__now_float)"
local -i ms=0
local -F delta=0.0
if [[ -n "$now" ]]; then
delta=$(( now - apex_cmd_start ))
(( delta < 0 )) && delta=0
ms=$(( delta * 1000 ))
fi
# Show time if: slow OR ops OR failed.
local dur=""
if (( ms >= ${APEX[SLOW_SOFT_MS]} )) || [[ "$apex_last_cmd" =~ ${APEX[OPS_RE]} ]] || (( ec != 0 )); then
dur="$(printf "%.2fs" $(( ms / 1000.0 )))"
fi
apex_radar_aar $ec "$apex_last_cmd" "$dur" $ms
apex_has_run_cmd=0
# Spacer between AAR and context burst / prompt.
print -r -- ""
fi
apex_radar_context_burst
}
autoload -Uz add-zsh-hook
add-zsh-hook preexec apex_preexec_hook
add-zsh-hook precmd apex_precmd_hook
add-zsh-hook chpwd apex_chpwd_hook
# -----------------------------------------------------------------------------
# 12) PROMPT BUILD
# -----------------------------------------------------------------------------
build_prompt() {
local ec=$?
# Line 1: identity + territory (left)
print -n "$(apex_identity)"
print -n "$(apex_territory)"
print -n $'
'
# Line 2: trigger posture
if (( EUID == 0 )); then
print -n "%F{${C[PURPLE]}}%f "
elif (( ec != 0 )); then
print -n "%F{${C[ALERT]}}%f "
else
print -n "%F{${C[CYAN]}}%f "
fi
}
PROMPT='$(build_prompt)'
RPROMPT='$(build_rprompt)'

630
dist/zsh/apex-neon.zsh-theme vendored Normal file
View File

@@ -0,0 +1,630 @@
# 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"
# -----------------------------------------------------------------------------
# 1b) PLUGIN COLORS
# -----------------------------------------------------------------------------
# zsh-autosuggestions: ghost text from history (subtle, intentionally dim)
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#737373"
# zsh-history-substring-search
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND="fg=#00eaff,bold"
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND="fg=#ff8899,bold"
# -----------------------------------------------------------------------------
# 2) ICONS / GLYPHS (Nerd Font optional)
# -----------------------------------------------------------------------------
typeset -gA I
I[OS]=""
I[SSH]=""
I[ROOT]=""
I[GIT]=""
I[JOBS]=""
I[RADAR]="⌁"
I[RET]="↩"
typeset -gA S
S[PL_L]=""
S[PL_R]=""
S[DOT]="·"
# -----------------------------------------------------------------------------
# 3) CONFIG
# -----------------------------------------------------------------------------
typeset -gA APEX
APEX[SLOW_SOFT_MS]=750
APEX[SLOW_HARD_MS]=2000
APEX[STARTUP_BURST]=1
APEX[SHOW_AAR]=1
APEX[SHOW_CONTEXT_BURST]=1
APEX[SHOW_VCS]=1
APEX[SHOW_INTEL]=1
APEX[SHOW_JOBS]=1
APEX[SHOW_RO]=1
APEX[GIT_AHEAD_BEHIND]=1
# Ops commands (also match wrappers like sudo/doas/command)
APEX[OPS_RE]='^((sudo|doas|command)[[:space:]]+)*((pacman|yay|paru|apt|dnf|brew|systemctl|docker|kubectl|helm|git))([[:space:]]|$)'
# Session-ish commands (spawn a subshell; exit codes are often “not a failure”)
APEX[SESSION_RE]='^((sudo|doas|command)[[:space:]]+)*chezmoi[[:space:]]+cd([[:space:]]|$)'
# -----------------------------------------------------------------------------
# 4) STATE
# -----------------------------------------------------------------------------
typeset -gF apex_cmd_start=0.0
typeset -g apex_last_cmd=""
typeset -g apex_has_run_cmd=0
typeset -g apex_startup_done=0
typeset -g apex_pwd_changed=1
# Sticky intel
typeset -g apex_venv_name=""
typeset -g apex_target_sig=""
typeset -g apex_mode_sig=""
# Git state
typeset -g apex_in_git=0
typeset -g apex_git_branch=""
typeset -g apex_git_dirty_wt=0
typeset -g apex_git_dirty_ix=0
typeset -g apex_git_untracked=0
typeset -g apex_git_conflict=0
typeset -g apex_git_op=""
typeset -g apex_git_up_ok=0
typeset -g apex_git_ahead=0
typeset -g apex_git_behind=0
typeset -g apex_git_stash=0
typeset -g apex_git_root=""
typeset -g apex_git_dir=""
# Radar previous snapshots (transition detection)
typeset -g apex_prev_in_git=-1
typeset -g apex_prev_git_branch=""
typeset -g apex_prev_git_op=""
typeset -g apex_prev_venv_name=""
typeset -g apex_prev_target_sig=""
typeset -g apex_prev_proj_sig=""
# -----------------------------------------------------------------------------
# 5) UTILITIES
# -----------------------------------------------------------------------------
apex__short_cmd() {
local s="$1"
s="${s//$'
'/ }"
s="${s#"${s%%[![:space:]]*}"}" # ltrim
s="${s%"${s##*[![:space:]]}"}" # rtrim
print -r -- "${s[1,90]}"
}
apex__project_sig() {
local s=""
[[ -f package.json ]] && s+="node"
[[ -f pnpm-lock.yaml ]] && s+="+pnpm"
[[ -f bun.lockb ]] && s+="+bun"
[[ -f yarn.lock ]] && s+="+yarn"
[[ -f pyproject.toml || -f requirements.txt ]] && s+="${s:+ }py"
[[ -f uv.lock ]] && s+="+uv"
[[ -f Cargo.toml ]] && s+="${s:+ }rust"
[[ -f go.mod ]] && s+="${s:+ }go"
[[ -n "$s" ]] && print -r -- "$s"
}
apex__escape_prompt() {
local s="$1"
s="${s//\\%/%%}"
print -r -- "$s"
}
apex__now_float() {
if [[ -n "${EPOCHREALTIME:-}" ]]; then
print -r -- "$EPOCHREALTIME"
elif [[ -n "${EPOCHSECONDS:-}" ]]; then
print -r -- "${EPOCHSECONDS}.0"
else
print -r -- "0.0"
fi
}
apex__find_git_root() {
local dir="$PWD"
local git_root=""
local git_dir=""
while [[ -n "$dir" ]]; do
if [[ -d "$dir/.git" ]]; then
git_root="$dir"
git_dir="$dir/.git"
break
elif [[ -f "$dir/.git" ]]; then
local line
line="$(<"$dir/.git")"
if [[ "$line" == gitdir:* ]]; then
git_root="$dir"
git_dir="${line#gitdir: }"
[[ "$git_dir" != /* ]] && git_dir="$dir/$git_dir"
break
fi
fi
[[ "$dir" == "/" ]] && break
dir="${dir:h}"
done
[[ -n "$git_root" ]] && print -r -- "${git_root}|${git_dir}"
}
# -----------------------------------------------------------------------------
# 6) INTEL (sticky; updated each prompt)
# -----------------------------------------------------------------------------
apex_update_intel() {
# Target (cheap env-based; no kubectl calls)
if [[ -n "$AWS_PROFILE" ]]; then
apex_target_sig="aws:${AWS_PROFILE}"
elif [[ -n "$GOOGLE_CLOUD_PROJECT" ]]; then
apex_target_sig="gcp:${GOOGLE_CLOUD_PROJECT}"
elif [[ -n "$KUBE_CONTEXT" ]]; then
apex_target_sig="kube:${KUBE_CONTEXT}"
else
apex_target_sig=""
fi
# Mode
if [[ -n "$IN_NIX_SHELL" ]]; then
apex_mode_sig="nix"
elif [[ -n "$DIRENV_DIR" ]]; then
apex_mode_sig="direnv"
elif [[ -f /run/.containerenv || -f /.dockerenv ]]; then
apex_mode_sig="ctr"
else
apex_mode_sig=""
fi
# Venv
apex_venv_name=""
if [[ -n "$VIRTUAL_ENV" ]]; then
apex_venv_name="$(basename "$VIRTUAL_ENV")"
elif [[ -n "$CONDA_DEFAULT_ENV" ]]; then
apex_venv_name="$CONDA_DEFAULT_ENV"
fi
}
# -----------------------------------------------------------------------------
# 7) GIT
# -----------------------------------------------------------------------------
apex_git_update() {
apex_in_git=0
apex_git_branch=""
apex_git_dirty_wt=0
apex_git_dirty_ix=0
apex_git_untracked=0
apex_git_conflict=0
apex_git_op=""
apex_git_up_ok=0
apex_git_ahead=0
apex_git_behind=0
apex_git_stash=0
local status_out
status_out="$(command git status --porcelain=2 --branch 2>/dev/null)" || {
apex_git_root=""
apex_git_dir=""
return
}
apex_in_git=1
if (( apex_pwd_changed )) || [[ -z "$apex_git_root" ]]; then
local root_info
root_info="$(apex__find_git_root)"
if [[ -n "$root_info" ]]; then
apex_git_root="${root_info%%|*}"
apex_git_dir="${root_info#*|}"
else
apex_git_root=""
apex_git_dir=""
fi
fi
local branch_head="" branch_oid="" upstream=""
local xy="" ix="" wt=""
local line
while IFS= read -r line; do
case "$line" in
\#\ branch.head\ *)
branch_head="${line#\# branch.head }"
;;
\#\ branch.oid\ *)
branch_oid="${line#\# branch.oid }"
;;
\#\ branch.upstream\ *)
upstream="${line#\# branch.upstream }"
;;
\#\ branch.ab\ *)
local ab a b
ab="${line#\# branch.ab }"
IFS=' ' read -r a b <<<"$ab"
a="${a#+}"
b="${b#-}"
apex_git_ahead="${a:-0}"
apex_git_behind="${b:-0}"
;;
1\ *|2\ *)
xy="${line[3,4]}"
ix="${xy[1]}"
wt="${xy[2]}"
[[ "$ix" != "." ]] && apex_git_dirty_ix=1
[[ "$wt" != "." ]] && apex_git_dirty_wt=1
;;
u\ *)
apex_git_conflict=1
apex_git_dirty_ix=1
apex_git_dirty_wt=1
;;
\?\ *)
apex_git_untracked=1
;;
esac
done <<<"$status_out"
if [[ -n "$branch_head" && "$branch_head" != "(detached)" && "$branch_head" != "HEAD" ]]; then
apex_git_branch="$branch_head"
elif [[ -n "$branch_oid" ]]; then
apex_git_branch="${branch_oid[1,7]}"
fi
if [[ -n "$apex_git_dir" ]]; then
[[ -d "$apex_git_dir/rebase-apply" || -d "$apex_git_dir/rebase-merge" ]] && apex_git_op="rebase"
[[ -f "$apex_git_dir/MERGE_HEAD" ]] && apex_git_op="merge"
[[ -f "$apex_git_dir/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
[[ -f "$apex_git_dir/BISECT_LOG" ]] && apex_git_op="bisect"
if [[ -f "$apex_git_dir/logs/refs/stash" ]]; then
local -a stash_lines
stash_lines=(${(f)"$(<"$apex_git_dir/logs/refs/stash")"})
apex_git_stash=$#stash_lines
elif [[ -f "$apex_git_dir/refs/stash" ]]; then
apex_git_stash=1
fi
fi
(( apex_git_conflict )) && apex_git_op="conflict"
if [[ -n "$upstream" && "$upstream" != "(gone)" ]]; then
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 && apex_git_untracked == 0 && apex_git_conflict == 0 && apex_git_stash == 0 )) \
&& [[ -z "$apex_git_op" ]]; then
[[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1
fi
fi
}
# -----------------------------------------------------------------------------
# 8) LEFT PROMPTLINE: IDENTITY + TERRITORY
# -----------------------------------------------------------------------------
apex_identity() {
local is_root=0 is_ssh=0 color label
(( EUID == 0 )) && is_root=1
[[ -n "$SSH_CONNECTION$SSH_TTY" ]] && is_ssh=1
if (( is_root )); then
color="${C[PURPLE]}"
if (( is_ssh )); then
label="${I[ROOT]} @%m"
else
label="${I[ROOT]} root"
fi
elif (( is_ssh )); then
color="${C[CYAN]}"
label="${I[SSH]} %n@%m"
else
return 0
fi
print -n "%F{${color}}${S[PL_L]}%f%K{${color}}%F{${C[VOID]}}%B ${label} %b%f%k%F{${color}}${S[PL_R]}%f "
}
apex_territory() {
print -n "%F{${C[RAZOR]}}${S[PL_L]}%f%K{${C[RAZOR]}}%F{${C[VOID]}}%B ${I[OS]}%b %F{${C[WHITE]}}%B%~%b %f%k%F{${C[RAZOR]}}${S[PL_R]}%f"
}
# -----------------------------------------------------------------------------
# 9) RIGHT PROMPT (RPROMPT): INTEL + VCS + FRICTION
# -----------------------------------------------------------------------------
apex_intel_r() {
(( APEX[SHOW_INTEL] )) || return 0
if [[ -n "$apex_target_sig" ]]; then
print -n "%F{${C[CYAN]}}(${apex_target_sig})%f"
elif [[ -n "$apex_mode_sig" ]]; then
print -n "%F{${C[CYAN]}}(${apex_mode_sig})%f"
elif [[ -n "$apex_venv_name" ]]; then
print -n "%F{${C[CYAN]}}(${apex_venv_name})%f"
fi
}
apex_vcs_r() {
(( APEX[SHOW_VCS] )) || return 0
(( apex_in_git )) || return 0
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
if [[ -n "$apex_git_op" ]]; then
print -n "%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
return 0
fi
print -n "%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
local mark=""
(( apex_git_dirty_ix )) && mark+="+"
(( apex_git_dirty_wt )) && mark+="!"
(( apex_git_untracked )) && mark+="?"
[[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f"
(( apex_git_stash > 0 )) && print -n "%F{${C[MUTED]}} s${apex_git_stash}%f"
(( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f"
if (( APEX[GIT_AHEAD_BEHIND] )); then
(( apex_git_ahead > 0 )) && print -n "%F{${C[MUTED]}} ⇡${apex_git_ahead}%f"
(( apex_git_behind > 0 )) && print -n "%F{${C[MUTED]}} ⇣${apex_git_behind}%f"
fi
}
apex_friction_r() {
if (( APEX[SHOW_RO] )); then
local ro=0
[[ ! -w . ]] && ro=1
if (( apex_in_git )) && [[ -n "$apex_git_root" && ! -w "$apex_git_root" ]]; then
ro=1
fi
if (( ro )); then
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
return 0
fi
fi
if (( APEX[SHOW_JOBS] )); then
local -a job_pids
job_pids=(${(f)"$(jobs -p 2>/dev/null)"})
local jc=$#job_pids
if (( jc > 0 )); then
print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f"
return 0
fi
fi
}
build_rprompt() {
local s out=""
local sep="%F{${C[MUTED]}} ${S[DOT]} %f"
s="$(apex_intel_r)"; [[ -n "$s" ]] && out+="$s"
s="$(apex_vcs_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
s="$(apex_friction_r)"; [[ -n "$s" ]] && out+="${out:+$sep}$s"
[[ -n "$out" ]] && out="%F{${C[MUTED]}}[%f${out}%F{${C[MUTED]}}]%f"
print -n "$out"
}
# -----------------------------------------------------------------------------
# 10) RADAR (precmd)
# -----------------------------------------------------------------------------
apex_radar_aar() {
(( APEX[SHOW_AAR] )) || return 0
local ec=$1 cmd="$2" dur="$3"
local -i ms=${4:-0}
local show=0
(( ec != 0 )) && show=1
[[ -n "$dur" ]] && show=1
[[ "$cmd" =~ ${APEX[OPS_RE]} ]] && show=1
(( show )) || return 0
local short; short="$(apex__short_cmd "$cmd")"
short="$(apex__escape_prompt "$short")"
local dur_color="${C[MUTED]}"
(( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}"
local dur_chunk=""
if [[ -n "$dur" ]]; then
if (( ms >= ${APEX[SLOW_HARD_MS]} )); then
dur_chunk=" %F{${dur_color}}%B${dur}%b%f"
else
dur_chunk=" %F{${dur_color}}${dur}%f"
fi
fi
# Session commands: don't scream in red for “rc:1”
if [[ "$cmd" =~ ${APEX[SESSION_RE]} ]]; then
if (( ec == 0 )); then
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
else
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}${I[RET]}%f %F{${C[WHITE]}}${short}%f %F{${C[MUTED]}}rc:${ec}%f${dur_chunk}"
fi
return 0
fi
if (( ec == 0 )); then
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[OK]}}✓%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
return 0
fi
# Signals: 128 + signal number
case $ec in
130) # SIGINT (Ctrl+C)
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[CYAN]}}^C%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
141) # SIGPIPE
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[MUTED]}}PIPE%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
143) # SIGTERM
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[GOLD]}}TERM%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
*)
print -P "%F{${C[MUTED]}}${I[RADAR]}%f %F{${C[ALERT]}}✘ ${ec}%f %F{${C[WHITE]}}${short}%f${dur_chunk}"
;;
esac
}
apex_radar_context_burst() {
(( APEX[SHOW_CONTEXT_BURST] )) || return 0
local proj_sig; proj_sig="$(apex__project_sig 2>/dev/null || print -r -- "")"
local emit=0
if (( apex_startup_done == 0 )); then
(( APEX[STARTUP_BURST] )) && emit=1
fi
(( apex_pwd_changed )) && emit=1
[[ "$apex_venv_name" != "$apex_prev_venv_name" ]] && emit=1
[[ "$apex_target_sig" != "$apex_prev_target_sig" ]] && emit=1
(( apex_in_git != apex_prev_in_git )) && emit=1
[[ "$apex_git_branch" != "$apex_prev_git_branch" ]] && emit=1
[[ "$apex_git_op" != "$apex_prev_git_op" ]] && emit=1
[[ "$proj_sig" != "$apex_prev_proj_sig" ]] && emit=1
(( emit )) || return 0
# If nothing to say, say nothing.
if [[ -z "$proj_sig" && -z "$apex_venv_name" && -z "$apex_target_sig" ]] && (( apex_in_git == 0 )); then
apex_pwd_changed=0
apex_startup_done=1
return 0
fi
local out="%F{${C[MUTED]}}${I[RADAR]}%f "
# Git first
if (( apex_in_git )); then
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
if [[ -n "$apex_git_op" ]]; then
out+="%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
else
out+="%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
fi
fi
[[ -n "$proj_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[MUTED]}}${proj_sig}%f"
[[ -n "$apex_venv_name" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_venv_name})%f"
[[ -n "$apex_target_sig" ]] && out+="${out:+ %F{${C[MUTED]}}·%f }%F{${C[CYAN]}}(${apex_target_sig})%f"
print -P "$out"
apex_prev_venv_name="$apex_venv_name"
apex_prev_target_sig="$apex_target_sig"
apex_prev_in_git="$apex_in_git"
apex_prev_git_branch="$apex_git_branch"
apex_prev_git_op="$apex_git_op"
apex_prev_proj_sig="$proj_sig"
apex_pwd_changed=0
apex_startup_done=1
}
# -----------------------------------------------------------------------------
# 11) HOOKS
# -----------------------------------------------------------------------------
apex_preexec_hook() {
apex_has_run_cmd=1
apex_cmd_start="$(apex__now_float)"
apex_last_cmd="$1"
}
apex_chpwd_hook() {
apex_pwd_changed=1
}
apex_precmd_hook() {
local ec=$?
apex_update_intel
apex_git_update
# Did a command actually run since the last prompt?
local ran=0
(( apex_has_run_cmd )) && ran=1
if (( ran )); then
local now; now="$(apex__now_float)"
local -i ms=0
local -F delta=0.0
if [[ -n "$now" ]]; then
delta=$(( now - apex_cmd_start ))
(( delta < 0 )) && delta=0
ms=$(( delta * 1000 ))
fi
# Show time if: slow OR ops OR failed.
local dur=""
if (( ms >= ${APEX[SLOW_SOFT_MS]} )) || [[ "$apex_last_cmd" =~ ${APEX[OPS_RE]} ]] || (( ec != 0 )); then
dur="$(printf "%.2fs" $(( ms / 1000.0 )))"
fi
apex_radar_aar $ec "$apex_last_cmd" "$dur" $ms
apex_has_run_cmd=0
# Spacer between AAR and context burst / prompt.
print -r -- ""
fi
apex_radar_context_burst
}
autoload -Uz add-zsh-hook
add-zsh-hook preexec apex_preexec_hook
add-zsh-hook precmd apex_precmd_hook
add-zsh-hook chpwd apex_chpwd_hook
# -----------------------------------------------------------------------------
# 12) PROMPT BUILD
# -----------------------------------------------------------------------------
build_prompt() {
local ec=$?
# Line 1: identity + territory (left)
print -n "$(apex_identity)"
print -n "$(apex_territory)"
print -n $'
'
# Line 2: trigger posture
if (( EUID == 0 )); then
print -n "%F{${C[PURPLE]}}%f "
elif (( ec != 0 )); then
print -n "%F{${C[ALERT]}}%f "
else
print -n "%F{${C[CYAN]}}%f "
fi
}
PROMPT='$(build_prompt)'
RPROMPT='$(build_rprompt)'

18
scripts/nvim-audit.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
if ! command -v nvim >/dev/null 2>&1; then
echo "error: nvim not found on PATH" >&2
exit 1
fi
if [[ ! -f "${root}/dist/nvim/colors/apex-neon.lua" ]]; then
echo "error: missing dist/nvim/colors/apex-neon.lua; run 'uv run build.py'" >&2
exit 1
fi
cd "$root"
nvim --headless -u NONE -U NONE -c "lua dofile('${root}/scripts/nvim_audit.lua')"

181
scripts/nvim_audit.lua Normal file
View File

@@ -0,0 +1,181 @@
local function out(msg)
vim.api.nvim_out_write(msg .. "\n")
end
local function err(msg)
vim.api.nvim_err_write(msg .. "\n")
end
if not vim.api.nvim_get_hl then
err("error: nvim_get_hl unavailable; require Neovim 0.9+")
vim.cmd("cquit")
end
local function load_theme()
local theme_path = vim.fn.getcwd() .. "/dist/nvim/colors/apex-neon.lua"
local ok, load_err = pcall(dofile, theme_path)
if not ok then
err("error: failed to load theme: " .. tostring(load_err))
err("hint: run 'uv run build.py' to regenerate dist/")
vim.cmd("cquit")
end
end
local function has_style(hl)
for key, value in pairs(hl) do
if key ~= "link" and key ~= "default" then
if type(value) ~= "boolean" or value then
return true
end
end
end
return false
end
local function get_hl(name)
local ok, hl = pcall(vim.api.nvim_get_hl, 0, { name = name, link = false })
if not ok then
return nil, "error"
end
return hl, nil
end
local function audit(groups)
local issues = {}
local default_links = {
Normal = true,
NONE = true,
}
for _, group in ipairs(groups) do
local hl, api_err = get_hl(group)
if api_err or not hl or next(hl) == nil then
table.insert(issues, "missing: " .. group)
elseif hl.link and default_links[hl.link] then
table.insert(issues, "default-link: " .. group .. " -> " .. hl.link)
elseif not hl.link and not has_style(hl) then
table.insert(issues, "empty: " .. group)
end
end
return issues
end
local groups = {
-- Pmenu
"Pmenu",
"PmenuSel",
"PmenuSbar",
"PmenuThumb",
"WildMenu",
-- LSP UI
"LspReferenceText",
"LspReferenceRead",
"LspReferenceWrite",
"LspSignatureActiveParameter",
"LspInlayHint",
-- Diagnostics (core + variants)
"DiagnosticError",
"DiagnosticWarn",
"DiagnosticInfo",
"DiagnosticHint",
"DiagnosticOk",
"DiagnosticDeprecated",
"DiagnosticUnnecessary",
"DiagnosticUnderlineError",
"DiagnosticUnderlineWarn",
"DiagnosticUnderlineInfo",
"DiagnosticUnderlineHint",
"DiagnosticUnderlineOk",
"DiagnosticVirtualTextError",
"DiagnosticVirtualTextWarn",
"DiagnosticVirtualTextInfo",
"DiagnosticVirtualTextHint",
"DiagnosticVirtualTextOk",
"DiagnosticVirtualLinesError",
"DiagnosticVirtualLinesWarn",
"DiagnosticVirtualLinesInfo",
"DiagnosticVirtualLinesHint",
"DiagnosticVirtualLinesOk",
"DiagnosticSignError",
"DiagnosticSignWarn",
"DiagnosticSignInfo",
"DiagnosticSignHint",
"DiagnosticSignOk",
"DiagnosticFloatingError",
"DiagnosticFloatingWarn",
"DiagnosticFloatingInfo",
"DiagnosticFloatingHint",
"DiagnosticFloatingOk",
-- Markup (Tree-sitter)
"@markup.heading",
"@markup.link",
"@markup.link.url",
"@markup.strong",
"@markup.italic",
"ApexMarkupStrong",
"ApexMarkupItalic",
"ApexMarkupLink",
-- LSP semantic tokens (types)
"@lsp.type.boolean",
"@lsp.type.builtinType",
"@lsp.type.class",
"@lsp.type.comment",
"@lsp.type.decorator",
"@lsp.type.enum",
"@lsp.type.enumMember",
"@lsp.type.event",
"@lsp.type.function",
"@lsp.type.interface",
"@lsp.type.keyword",
"@lsp.type.macro",
"@lsp.type.method",
"@lsp.type.modifier",
"@lsp.type.namespace",
"@lsp.type.number",
"@lsp.type.operator",
"@lsp.type.parameter",
"@lsp.type.property",
"@lsp.type.regexp",
"@lsp.type.string",
"@lsp.type.struct",
"@lsp.type.type",
"@lsp.type.typeParameter",
"@lsp.type.variable",
-- LSP semantic tokens (modifiers)
"@lsp.mod.deprecated",
"@lsp.mod.readonly",
"@lsp.mod.static",
"@lsp.mod.async",
-- LSP semantic tokens (typemods)
"@lsp.typemod.function.async",
"@lsp.typemod.method.async",
"@lsp.typemod.function.deprecated",
"@lsp.typemod.method.deprecated",
"@lsp.typemod.variable.deprecated",
"@lsp.typemod.variable.readonly",
"@lsp.typemod.parameter.readonly",
"@lsp.typemod.property.readonly",
"@lsp.typemod.variable.static",
"@lsp.typemod.property.static",
}
load_theme()
local issues = audit(groups)
if #issues == 0 then
out("nvim audit: ok (" .. tostring(#groups) .. " groups)")
vim.cmd("qa")
end
err("nvim audit: " .. tostring(#issues) .. " issue(s)")
for _, issue in ipairs(issues) do
err(issue)
end
vim.cmd("cquit")

219
scripts/release.sh Executable file
View File

@@ -0,0 +1,219 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
usage() {
cat <<'EOF'
Usage: scripts/release.sh <version> [options]
Options:
--repo <slug> Gitea repo slug (default: auto-detect)
--login <name> tea login name (default: tea default)
--notes <text> Release notes (single line)
--notes-file <file> Release notes file (applies to all apps)
--notes-dir <dir> Per-app notes dir; uses <app>.md or common.md
--no-push Skip git push
--dry-run Print actions without executing
-h, --help Show this help
EOF
}
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
usage
exit 0
fi
version="${1:-}"
shift || true
if [[ -z "$version" ]]; then
usage
exit 1
fi
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "error: version must be semver (e.g., 1.2.3)"
exit 1
fi
repo=""
login=""
notes=""
notes_file=""
notes_dir=""
no_push=0
dry_run=0
while [[ $# -gt 0 ]]; do
case "$1" in
--repo)
repo="$2"
shift 2
;;
--login)
login="$2"
shift 2
;;
--notes)
notes="$2"
shift 2
;;
--notes-file)
notes_file="$2"
shift 2
;;
--notes-dir)
notes_dir="$2"
shift 2
;;
--no-push)
no_push=1
shift
;;
--dry-run)
dry_run=1
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "error: unknown option: $1"
usage
exit 1
;;
esac
done
run() {
if (( dry_run )); then
echo "+ $*"
else
"$@"
fi
}
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "error: not inside a git repository"
exit 1
fi
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "error: working tree not clean; commit or stash first"
exit 1
fi
if ! command -v tea >/dev/null 2>&1; then
echo "error: tea is not installed or not on PATH"
exit 1
fi
mapfile -t apps < <(python - <<'PY'
from pathlib import Path
apps = sorted({p.parent.name for p in Path("templates").rglob("meta.yaml")})
print("\n".join(apps))
PY
)
changed_apps=()
for app in "${apps[@]}"; do
last_tag="$(git tag --list "${app}-v*" --sort=-version:refname | head -n 1)"
if [[ -z "$last_tag" ]]; then
changed_apps+=("$app")
continue
fi
if git diff --name-only "${last_tag}..HEAD" | grep -Eq "^(src/|build.py$|templates/${app}/)"; then
changed_apps+=("$app")
fi
done
if (( ${#changed_apps[@]} == 0 )); then
echo "no app changes detected since last per-app tags; nothing to release"
exit 0
fi
if (( dry_run )); then
echo "+ update meta.yaml for: ${changed_apps[*]}"
else
APP_LIST="$(printf "%s\n" "${changed_apps[@]}")" APP_VERSION="${version}" python - <<'PY'
import os
from pathlib import Path
new_version = os.environ["APP_VERSION"]
targets = set(filter(None, os.environ["APP_LIST"].splitlines()))
for path in Path("templates").rglob("meta.yaml"):
if path.parent.name not in targets:
continue
text = path.read_text()
lines = text.splitlines()
out = []
changed = False
for line in lines:
if line.startswith("version:"):
out.append(f"version: {new_version}")
changed = True
else:
out.append(line)
if changed:
path.write_text("\n".join(out) + "\n")
PY
fi
if ! git diff --quiet; then
run git add templates/*/meta.yaml
run git commit -m "chore: release apps v${version}"
fi
run uv run build.py
run mkdir -p dist/releases
for app in "${changed_apps[@]}"; do
run tar -czf "dist/releases/apex-${app}-v${version}.tar.gz" -C dist "$app"
done
if (( no_push == 0 )); then
run git push origin HEAD
fi
commit="$(git rev-parse HEAD)"
note_args=()
pick_note_args() {
local app="$1"
note_args=()
if [[ -n "$notes_file" ]]; then
note_args=(--note-file "$notes_file")
return
fi
if [[ -n "$notes" ]]; then
note_args=(--note "$notes")
return
fi
if [[ -n "$notes_dir" ]]; then
if [[ -f "$notes_dir/$app.md" ]]; then
note_args=(--note-file "$notes_dir/$app.md")
return
fi
if [[ -f "$notes_dir/common.md" ]]; then
note_args=(--note-file "$notes_dir/common.md")
return
fi
fi
note_args=(--note "Release v${version}")
}
for app in "${changed_apps[@]}"; do
tag="${app}-v${version}"
title="Apex ${app} v${version}"
asset="dist/releases/apex-${app}-v${version}.tar.gz"
args=(tea releases create)
[[ -n "$repo" ]] && args+=(--repo "$repo")
[[ -n "$login" ]] && args+=(--login "$login")
args+=(--tag "$tag" --target "$commit" --title "$title")
pick_note_args "$app"
args+=("${note_args[@]}" --asset "$asset")
run "${args[@]}"
done

View File

@@ -26,6 +26,18 @@ ui:
dim: "#737373" dim: "#737373"
stealth: "#a0a0a0" stealth: "#a0a0a0"
# Syntax Token Roles (canonical mapping for all editor targets)
syntax:
keyword: "#7a3cff" # palette.special — purple, sacred structural tokens
type: "#d18f00" # palette.warning — amber, type/class definitions
function: "#005577" # palette.azure — blue, callable structure
string: "#00b377" # palette.success — green, organic string data
constant: "#007a88" # palette.info — cyan, digital values (numbers, booleans)
operator: "#0a0a0a" # palette.foreground — near black, neutral
variable: "#0a0a0a" # palette.foreground — near black, neutral
comment: "#a0a0a0" # ui.stealth — fade out
punctuation: "#737373" # ui.dim — structural noise
# ANSI Table (Terminal) # ANSI Table (Terminal)
ansi: ansi:
normal: normal:

View File

@@ -25,6 +25,18 @@ ui:
dim: "#737373" # Muted Text dim: "#737373" # Muted Text
stealth: "#404040" # Comments/Ignored stealth: "#404040" # Comments/Ignored
# Syntax Token Roles (canonical mapping for all editor targets)
syntax:
keyword: "#9d00ff" # palette.special — purple, sacred structural tokens
type: "#ffb700" # palette.warning — amber, type/class definitions
function: "#0088cc" # palette.azure — blue, callable structure
string: "#00ff99" # palette.success — green, organic string data
constant: "#00eaff" # palette.info — cyan, digital values (numbers, booleans)
operator: "#ededed" # palette.foreground — white, neutral
variable: "#ededed" # palette.foreground — white, neutral
comment: "#404040" # ui.stealth — fade out
punctuation: "#737373" # ui.dim — structural noise
# ANSI Table (Terminal) # ANSI Table (Terminal)
ansi: ansi:
normal: normal:

26
templates/ghostty/apex.j2 Normal file
View File

@@ -0,0 +1,26 @@
# {{ scheme }} - Ghostty theme
# DNA: State over Decoration
background = {{ palette.background }}
foreground = {{ palette.foreground }}
cursor-color = {{ palette.cursor }}
selection-background = {{ palette.selection }}
selection-foreground = {{ palette.selection_fg }}
palette = 0={{ ansi.normal.black }}
palette = 1={{ ansi.normal.red }}
palette = 2={{ ansi.normal.green }}
palette = 3={{ ansi.normal.yellow }}
palette = 4={{ ansi.normal.blue }}
palette = 5={{ ansi.normal.magenta }}
palette = 6={{ ansi.normal.cyan }}
palette = 7={{ ansi.normal.white }}
palette = 8={{ ansi.bright.black }}
palette = 9={{ ansi.bright.red }}
palette = 10={{ ansi.bright.green }}
palette = 11={{ ansi.bright.yellow }}
palette = 12={{ ansi.bright.blue }}
palette = 13={{ ansi.bright.magenta }}
palette = 14={{ ansi.bright.cyan }}
palette = 15={{ ansi.bright.white }}

View File

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

View File

@@ -16,7 +16,8 @@ M.palette = {
-- The Hunter (Presence) -- The Hunter (Presence)
razor = "{{ palette.cursor }}", -- PRIMARY: Cursor, Current Match, Active Border razor = "{{ palette.cursor }}", -- PRIMARY: Cursor, Current Match, Active Border
alert = "{{ ansi.bright.red }}", -- ERROR: Readable text on Red ink = "{{ palette.selection_fg }}", -- Text color on Razor backgrounds
alert = "{{ palette.error }}", -- Error accent text on void/panel
-- The HUD (Data) -- The HUD (Data)
tech = "{{ palette.info }}", -- INFO: Selection, Search Match, Constants tech = "{{ palette.info }}", -- INFO: Selection, Search Match, Constants
@@ -32,6 +33,16 @@ function M.load()
vim.o.background = "{{ type }}" vim.o.background = "{{ type }}"
vim.g.colors_name = "{{ scheme | lower | replace(' ', '-') }}" vim.g.colors_name = "{{ scheme | lower | replace(' ', '-') }}"
-- Optional transparency: set g:apex_blend or g:apex_transparent to opt in.
local blend = vim.g.apex_blend
if type(blend) == "number" then
vim.o.winblend = blend
vim.o.pumblend = blend
elseif vim.g.apex_transparent == true then
vim.o.winblend = 20
vim.o.pumblend = 20
end
local p = M.palette local p = M.palette
local groups = { local groups = {
-- CANVAS & UI ----------------------------------------------------------- -- CANVAS & UI -----------------------------------------------------------
@@ -39,14 +50,21 @@ function M.load()
NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows NormalNC = { fg = p.dim, bg = p.void }, -- Non-focused windows
SignColumn = { bg = p.void }, SignColumn = { bg = p.void },
FoldColumn = { fg = p.stealth, bg = p.void }, FoldColumn = { fg = p.stealth, bg = p.void },
VertSplit = { fg = p.razor }, -- Deprecated in nvim 0.10, but good fallback VertSplit = { fg = p.border }, -- Deprecated in nvim 0.10, but good fallback
WinSeparator = { fg = p.razor }, -- The Cage (Red Borders) WinSeparator = { fg = p.border },
EndOfBuffer = { fg = p.void }, -- Hide tildes EndOfBuffer = { fg = p.void }, -- Hide tildes
NormalFloat = { fg = p.text, bg = p.panel },
FloatBorder = { fg = p.border, bg = p.panel },
MsgArea = { fg = p.text, bg = p.void },
WinBar = { fg = p.text, bg = p.panel },
WinBarNC = { fg = p.dim, bg = p.panel },
-- CURSOR & NAVIGATION ("The Hunter") ------------------------------------ -- CURSOR & NAVIGATION ("The Hunter") ------------------------------------
Cursor = { fg = p.void, bg = p.razor }, -- Red Beam Cursor = { fg = p.ink, bg = p.razor }, -- Red Beam
TermCursor = { fg = p.void, bg = p.razor }, TermCursor = { fg = p.ink, bg = p.razor },
CursorLine = { bg = p.panel }, CursorLine = { bg = p.panel },
CursorColumn = { bg = p.panel },
ColorColumn = { bg = p.panel },
CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here) CursorLineNr = { fg = p.razor, bold = true }, -- Red Line Number (You are here)
LineNr = { fg = p.stealth }, -- Other lines fade out LineNr = { fg = p.stealth }, -- Other lines fade out
@@ -55,17 +73,31 @@ function M.load()
VisualNOS = { fg = p.void, bg = p.border }, VisualNOS = { fg = p.void, bg = p.border },
Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets) Search = { fg = p.void, bg = p.tech }, -- Cyan (Potential Targets)
IncSearch = { fg = p.void, bg = p.razor }, -- Red (Acquiring...) IncSearch = { fg = p.ink, bg = p.razor }, -- Red (Acquiring...)
CurSearch = { fg = p.void, bg = p.razor, bold = true }, -- Red (Target Locked) CurSearch = { fg = p.ink, bg = p.razor, bold = true }, -- Red (Target Locked)
-- STATUS & MESSAGES ----------------------------------------------------- -- STATUS & MESSAGES -----------------------------------------------------
StatusLine = { fg = p.text, bg = p.panel }, StatusLine = { fg = p.text, bg = p.panel },
StatusLineNC = { fg = p.dim, bg = p.void }, StatusLineNC = { fg = p.dim, bg = p.void },
WildMenu = { fg = p.void, bg = p.tech }, WildMenu = { fg = p.void, bg = p.tech },
Pmenu = { fg = p.text, bg = p.panel }, Pmenu = { fg = p.text, bg = p.panel },
PmenuSel = { fg = p.void, bg = p.razor, bold = true }, -- Red Menu Selection PmenuSel = { fg = p.ink, bg = p.razor, bold = true }, -- Red Menu Selection
PmenuKind = { fg = p.dim, bg = p.panel },
PmenuKindSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuExtra = { fg = p.dim, bg = p.panel },
PmenuExtraSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuMatch = { fg = p.tech, bg = p.panel, bold = true },
PmenuMatchSel = { fg = p.ink, bg = p.razor, bold = true },
PmenuSbar = { bg = p.panel }, PmenuSbar = { bg = p.panel },
PmenuThumb = { bg = p.stealth }, PmenuThumb = { bg = p.stealth },
ErrorMsg = { fg = p.alert },
WarningMsg = { fg = p.amber },
MoreMsg = { fg = p.tech },
ModeMsg = { fg = p.text },
TabLine = { fg = p.dim, bg = p.panel },
TabLineSel = { fg = p.text, bg = p.void, bold = true },
TabLineFill = { fg = p.panel, bg = p.panel },
QuickFixLine = { fg = p.text, bg = p.panel, bold = true },
-- SYNTAX HIGHLIGHTING --------------------------------------------------- -- SYNTAX HIGHLIGHTING ---------------------------------------------------
Comment = { fg = p.stealth, italic = true }, Comment = { fg = p.stealth, italic = true },
@@ -83,7 +115,7 @@ function M.load()
Conditional = { fg = p.sacred }, Conditional = { fg = p.sacred },
Repeat = { fg = p.sacred }, Repeat = { fg = p.sacred },
Label = { fg = p.sacred }, Label = { fg = p.sacred },
Operator = { fg = p.tech }, -- Cyan (Tech) Operator = { fg = p.text }, -- White (Neutral)
Keyword = { fg = p.sacred }, Keyword = { fg = p.sacred },
Exception = { fg = p.razor }, -- Red (Errors) Exception = { fg = p.razor }, -- Red (Errors)
@@ -98,25 +130,79 @@ function M.load()
Structure = { fg = p.amber }, Structure = { fg = p.amber },
Typedef = { fg = p.amber }, Typedef = { fg = p.amber },
Special = { fg = p.tech }, Special = { fg = p.sacred }, -- Purple (special grammar tokens)
SpecialChar = { fg = p.tech }, SpecialChar = { fg = p.amber }, -- Amber (escalated string variant: escapes, regex)
Tag = { fg = p.tech }, Tag = { fg = p.azure }, -- Blue (structural: HTML/XML tags)
Delimiter = { fg = p.dim }, -- Subtle delimiters Delimiter = { fg = p.dim }, -- Subtle delimiters
Debug = { fg = p.razor }, Debug = { fg = p.razor },
Underlined = { underline = true }, Underlined = { underline = true },
Ignore = { fg = p.stealth }, Ignore = { fg = p.stealth },
Error = { fg = p.razor }, Error = { fg = p.alert },
Todo = { fg = p.void, bg = p.amber, bold = true }, Todo = { fg = p.void, bg = p.amber, bold = true },
Title = { fg = p.sacred, bold = true },
MatchParen = { fg = p.void, bg = p.amber, bold = true },
Whitespace = { fg = p.border },
NonText = { fg = p.border },
SpecialKey = { fg = p.border },
SpellBad = { sp = p.razor, undercurl = true },
SpellCap = { sp = p.amber, undercurl = true },
SpellRare = { sp = p.tech, undercurl = true },
SpellLocal = { sp = p.dim, undercurl = true },
LspReferenceText = { bg = p.panel },
LspReferenceRead = { bg = p.panel },
LspReferenceWrite = { bg = p.panel, bold = true },
LspSignatureActiveParameter = { fg = p.void, bg = p.tech, bold = true },
LspInlayHint = { fg = p.dim, bg = p.panel },
LspCodeLens = { fg = p.dim },
LspCodeLensSeparator = { fg = p.stealth },
LspInfoBorder = { fg = p.border, bg = p.panel },
LspInfoTitle = { fg = p.dim, bg = p.panel },
-- DIAGNOSTICS ----------------------------------------------------------- -- DIAGNOSTICS -----------------------------------------------------------
DiagnosticError = { fg = p.razor }, DiagnosticError = { fg = p.alert },
DiagnosticWarn = { fg = p.amber }, DiagnosticWarn = { fg = p.amber },
DiagnosticInfo = { fg = p.tech }, DiagnosticInfo = { fg = p.tech },
DiagnosticHint = { fg = p.dim }, DiagnosticHint = { fg = p.dim },
DiagnosticOk = { fg = p.toxic },
DiagnosticDeprecated = { fg = p.dim, strikethrough = true },
DiagnosticUnnecessary = { fg = p.dim },
DiagnosticUnderlineError = { sp = p.razor, underline = true }, DiagnosticUnderlineError = { undercurl = true, sp = p.razor },
DiagnosticUnderlineWarn = { sp = p.amber, underline = true }, DiagnosticUnderlineWarn = { undercurl = true, sp = p.amber },
DiagnosticUnderlineInfo = { undercurl = true, sp = p.tech },
DiagnosticUnderlineHint = { undercurl = true, sp = p.dim },
DiagnosticUnderlineOk = { undercurl = true, sp = p.toxic },
DiagnosticVirtualTextError = { fg = p.alert, bg = p.panel },
DiagnosticVirtualTextWarn = { fg = p.amber, bg = p.panel },
DiagnosticVirtualTextInfo = { fg = p.tech, bg = p.panel },
DiagnosticVirtualTextHint = { fg = p.dim, bg = p.panel },
DiagnosticVirtualTextOk = { fg = p.toxic, bg = p.panel },
DiagnosticVirtualLinesError = { fg = p.alert, bg = p.panel },
DiagnosticVirtualLinesWarn = { fg = p.amber, bg = p.panel },
DiagnosticVirtualLinesInfo = { fg = p.tech, bg = p.panel },
DiagnosticVirtualLinesHint = { fg = p.dim, bg = p.panel },
DiagnosticVirtualLinesOk = { fg = p.toxic, bg = p.panel },
DiagnosticSignError = { fg = p.alert, bg = p.void },
DiagnosticSignWarn = { fg = p.amber, bg = p.void },
DiagnosticSignInfo = { fg = p.tech, bg = p.void },
DiagnosticSignHint = { fg = p.dim, bg = p.void },
DiagnosticSignOk = { fg = p.toxic, bg = p.void },
DiagnosticFloatingError = { fg = p.alert, bg = p.panel },
DiagnosticFloatingWarn = { fg = p.amber, bg = p.panel },
DiagnosticFloatingInfo = { fg = p.tech, bg = p.panel },
DiagnosticFloatingHint = { fg = p.dim, bg = p.panel },
DiagnosticFloatingOk = { fg = p.toxic, bg = p.panel },
ApexMarkupStrong = { bold = true },
ApexMarkupItalic = { italic = true },
ApexMarkupLink = { fg = p.tech, underline = true },
-- DIFF ------------------------------------------------------------------
DiffAdd = { fg = p.toxic, bg = p.panel },
DiffChange = { fg = p.tech, bg = p.panel },
DiffDelete = { fg = p.razor, bg = p.panel },
DiffText = { fg = p.void, bg = p.tech, bold = true },
-- PLUGINS: TELESCOPE ("The HUD") ---------------------------------------- -- PLUGINS: TELESCOPE ("The HUD") ----------------------------------------
TelescopeNormal = { bg = p.void }, TelescopeNormal = { bg = p.void },
@@ -124,9 +210,9 @@ function M.load()
TelescopePromptNormal = { fg = p.text, bg = p.void }, TelescopePromptNormal = { fg = p.text, bg = p.void },
TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border TelescopePromptBorder = { fg = p.tech, bg = p.void }, -- Cyan Input Border
TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label TelescopePromptTitle = { fg = p.void, bg = p.tech }, -- Cyan Label
TelescopePreviewTitle = { fg = p.void, bg = p.razor }, -- Red Label TelescopePreviewTitle = { fg = p.ink, bg = p.razor }, -- Red Label
TelescopeResultsTitle = { fg = p.void, bg = p.panel }, TelescopeResultsTitle = { fg = p.void, bg = p.panel },
TelescopeSelection = { fg = p.void, bg = p.razor }, -- Red Selection TelescopeSelection = { fg = p.ink, bg = p.razor }, -- Red Selection
-- PLUGINS: NEO-TREE ("Stealth") ----------------------------------------- -- PLUGINS: NEO-TREE ("Stealth") -----------------------------------------
NeoTreeNormal = { bg = p.void }, NeoTreeNormal = { bg = p.void },
@@ -157,6 +243,137 @@ function M.load()
for group, highlight in pairs(groups) do for group, highlight in pairs(groups) do
vim.api.nvim_set_hl(0, group, highlight) vim.api.nvim_set_hl(0, group, highlight)
end end
local links = {
["@annotation"] = "Special",
["@attribute"] = "Special",
["@character"] = "Character",
["@comment"] = "Comment",
["@constant"] = "Constant",
["@constant.builtin"] = "Constant",
["@constant.macro"] = "Macro",
["@constructor"] = "Type",
["@debug"] = "Debug",
["@define"] = "Define",
["@exception"] = "Exception",
["@field"] = "Identifier",
["@float"] = "Float",
["@function"] = "Function",
["@function.builtin"] = "Function",
["@function.call"] = "Function",
["@function.macro"] = "Macro",
["@include"] = "Include",
["@keyword"] = "Keyword",
["@keyword.function"] = "Keyword",
["@keyword.operator"] = "Operator",
["@keyword.return"] = "Keyword",
["@label"] = "Label",
["@method"] = "Function",
["@method.call"] = "Function",
["@module"] = "Structure",
["@namespace"] = "Structure",
["@number"] = "Number",
["@operator"] = "Operator",
["@parameter"] = "Identifier",
["@preproc"] = "PreProc",
["@property"] = "Identifier",
["@punctuation"] = "Delimiter",
["@punctuation.bracket"] = "Delimiter",
["@punctuation.delimiter"] = "Delimiter",
["@punctuation.special"] = "Delimiter",
["@repeat"] = "Repeat",
["@string"] = "String",
["@string.escape"] = "SpecialChar",
["@string.regex"] = "SpecialChar",
["@string.special"] = "SpecialChar",
["@tag"] = "Tag",
["@tag.attribute"] = "Identifier",
["@tag.delimiter"] = "Delimiter",
["@text"] = "Normal",
["@text.title"] = "Title",
["@markup.heading"] = "Title",
["@markup.heading.1"] = "Title",
["@markup.heading.2"] = "Title",
["@markup.heading.3"] = "Title",
["@markup.heading.4"] = "Title",
["@markup.heading.5"] = "Title",
["@markup.heading.6"] = "Title",
["@markup.link"] = "ApexMarkupLink",
["@markup.link.label"] = "ApexMarkupLink",
["@markup.link.url"] = "ApexMarkupLink",
["@markup.strong"] = "ApexMarkupStrong",
["@markup.italic"] = "ApexMarkupItalic",
["@markup.strikethrough"] = "DiagnosticDeprecated",
["@markup.underline"] = "Underlined",
["@markup.raw"] = "String",
["@markup.raw.block"] = "String",
["@markup.raw.delimiter"] = "Delimiter",
["@markup.quote"] = "Comment",
["@markup.list"] = "Delimiter",
["@markup.list.checked"] = "String",
["@markup.list.unchecked"] = "Comment",
["@markup.math"] = "Constant",
["@markup.environment"] = "Type",
["@markup.environment.name"] = "Type",
["@type"] = "Type",
["@type.builtin"] = "Type",
["@type.definition"] = "Type",
["@type.qualifier"] = "Keyword",
["@variable"] = "Identifier",
["@variable.builtin"] = "Identifier",
["@lsp.type.boolean"] = "Boolean",
["@lsp.type.builtinType"] = "Type",
["@lsp.type.class"] = "Type",
["@lsp.type.comment"] = "Comment",
["@lsp.type.decorator"] = "Special",
["@lsp.type.enum"] = "Type",
["@lsp.type.enumMember"] = "Constant",
["@lsp.type.event"] = "Type",
["@lsp.type.function"] = "Function",
["@lsp.type.interface"] = "Type",
["@lsp.type.keyword"] = "Keyword",
["@lsp.type.macro"] = "Macro",
["@lsp.type.method"] = "Function",
["@lsp.type.modifier"] = "Keyword",
["@lsp.type.namespace"] = "Structure",
["@lsp.type.number"] = "Number",
["@lsp.type.operator"] = "Operator",
["@lsp.type.parameter"] = "Identifier",
["@lsp.type.property"] = "Identifier",
["@lsp.type.regexp"] = "SpecialChar",
["@lsp.type.string"] = "String",
["@lsp.type.struct"] = "Structure",
["@lsp.type.type"] = "Type",
["@lsp.type.typeParameter"] = "Type",
["@lsp.type.variable"] = "Identifier",
["@lsp.mod.deprecated"] = "DiagnosticDeprecated",
["@lsp.mod.abstract"] = "Type",
["@lsp.mod.declaration"] = "Keyword",
["@lsp.mod.defaultLibrary"] = "Constant",
["@lsp.mod.definition"] = "Keyword",
["@lsp.mod.documentation"] = "Comment",
["@lsp.mod.modification"] = "Operator",
["@lsp.mod.readonly"] = "Constant",
["@lsp.mod.static"] = "Constant",
["@lsp.mod.async"] = "Keyword",
["@lsp.typemod.function.async"] = "Keyword",
["@lsp.typemod.method.async"] = "Keyword",
["@lsp.typemod.function.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.method.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.variable.deprecated"] = "DiagnosticDeprecated",
["@lsp.typemod.variable.readonly"] = "Constant",
["@lsp.typemod.parameter.readonly"] = "Constant",
["@lsp.typemod.property.readonly"] = "Constant",
["@lsp.typemod.variable.static"] = "Constant",
["@lsp.typemod.property.static"] = "Constant",
}
for group, target in pairs(links) do
vim.api.nvim_set_hl(0, group, { link = target })
end
end end
M.load() M.load()

174
templates/owlry/apex.css.j2 Normal file
View File

@@ -0,0 +1,174 @@
{% set scheme_slug = scheme|lower|replace(' ', '-') %}
{% macro rgb(hex) -%}
{%- set value = hex|replace('#', '') -%}
{{ value[0:2]|int(base=16) }}, {{ value[2:4]|int(base=16) }}, {{ value[4:6]|int(base=16) }}
{%- endmacro %}
/*
* Owlry - {{ scheme }} Theme
* "State over Decoration."
*
* A high-contrast theme built for focus and clinical clarity.
* Color exists to signal STATE, not to decorate space.
*
* Author: S0wlz (Owlibou)
*
* Usage: Set theme = "{{ scheme_slug }}" in config.toml
*/
:root {
/* Core surfaces */
--owlry-bg: {{ palette.background }};
--owlry-bg-secondary: {{ ui.panel }};
--owlry-border: {{ ui.border }};
--owlry-text: {{ palette.foreground }};
--owlry-text-secondary: {{ ui.dim }};
/* The Predator - primary accent */
--owlry-accent: {{ palette.cursor }};
--owlry-accent-bright: {{ ansi.bright.red }};
/* Provider badges - mapped to Apex semantics */
--owlry-badge-app: {{ palette.info }}; /* Cyan: apps are informational */
--owlry-badge-bookmark: {{ palette.warning }}; /* Yellow: bookmarks need attention */
--owlry-badge-calc: {{ ansi.bright.yellow }}; /* Bright Yellow: calculator results */
--owlry-badge-clip: {{ palette.special }}; /* Purple: clipboard is special */
--owlry-badge-cmd: {{ palette.special }}; /* Purple: commands are elevated */
--owlry-badge-dmenu: {{ palette.success }}; /* Green: dmenu is success/pipe */
--owlry-badge-emoji: {{ ansi.bright.magenta }}; /* Bright Purple: emoji is special */
--owlry-badge-file: {{ ansi.bright.cyan }}; /* Bright Cyan: file search is active info */
--owlry-badge-script: {{ ansi.bright.green }}; /* Bright Green: scripts execute successfully */
--owlry-badge-ssh: {{ palette.info }}; /* Cyan: SSH is technical/info */
--owlry-badge-sys: {{ palette.cursor }}; /* Red: system actions are critical */
--owlry-badge-uuctl: {{ palette.warning }}; /* Yellow: uuctl requires attention */
--owlry-badge-web: {{ palette.info }}; /* Cyan: web is informational */
/* Widget badges */
--owlry-badge-media: {{ ansi.bright.magenta }}; /* Bright Purple: media is special */
--owlry-badge-weather: {{ ansi.bright.cyan }}; /* Bright Cyan: weather is active info */
--owlry-badge-pomo: {{ ansi.bright.red }}; /* Alert Red: pomodoro demands attention */
}
.owlry-main {
background-color: rgba({{ rgb(palette.background) }}, 0.98);
border: 1px solid rgba({{ rgb(ui.border) }}, 0.8);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8),
0 0 0 1px rgba({{ rgb(palette.cursor) }}, 0.1);
}
.owlry-search {
background-color: rgba({{ rgb(ui.panel) }}, 0.9);
border: 2px solid rgba({{ rgb(ui.border) }}, 0.8);
color: var(--owlry-text);
caret-color: var(--owlry-accent);
}
.owlry-search:focus {
border-color: var(--owlry-accent);
box-shadow: 0 0 0 2px rgba({{ rgb(palette.cursor) }}, 0.3);
}
.owlry-result-row:hover {
background-color: rgba({{ rgb(ui.panel) }}, 0.8);
}
.owlry-result-row:selected {
background-color: rgba({{ rgb(palette.cursor) }}, 0.15);
border-left: 3px solid var(--owlry-accent);
}
.owlry-result-row:selected .owlry-result-name {
color: var(--owlry-accent-bright);
}
.owlry-result-row:selected .owlry-result-icon {
color: var(--owlry-accent);
}
/* Provider badges - styled per Apex semantics */
.owlry-badge-app {
background-color: rgba({{ rgb(palette.info) }}, 0.15);
color: var(--owlry-badge-app);
}
.owlry-badge-bookmark {
background-color: rgba({{ rgb(palette.warning) }}, 0.15);
color: var(--owlry-badge-bookmark);
}
.owlry-badge-calc {
background-color: rgba({{ rgb(ansi.bright.yellow) }}, 0.15);
color: var(--owlry-badge-calc);
}
.owlry-badge-clip {
background-color: rgba({{ rgb(palette.special) }}, 0.15);
color: var(--owlry-badge-clip);
}
.owlry-badge-cmd {
background-color: rgba({{ rgb(palette.special) }}, 0.15);
color: var(--owlry-badge-cmd);
}
.owlry-badge-dmenu {
background-color: rgba({{ rgb(palette.success) }}, 0.15);
color: var(--owlry-badge-dmenu);
}
.owlry-badge-emoji {
background-color: rgba({{ rgb(ansi.bright.magenta) }}, 0.15);
color: var(--owlry-badge-emoji);
}
.owlry-badge-file {
background-color: rgba({{ rgb(ansi.bright.cyan) }}, 0.15);
color: var(--owlry-badge-file);
}
.owlry-badge-script {
background-color: rgba({{ rgb(ansi.bright.green) }}, 0.15);
color: var(--owlry-badge-script);
}
.owlry-badge-ssh {
background-color: rgba({{ rgb(palette.info) }}, 0.15);
color: var(--owlry-badge-ssh);
}
.owlry-badge-sys {
background-color: rgba({{ rgb(palette.cursor) }}, 0.15);
color: var(--owlry-badge-sys);
}
.owlry-badge-uuctl {
background-color: rgba({{ rgb(palette.warning) }}, 0.15);
color: var(--owlry-badge-uuctl);
}
.owlry-badge-web {
background-color: rgba({{ rgb(palette.info) }}, 0.15);
color: var(--owlry-badge-web);
}
/* Widget badges */
.owlry-badge-media {
background-color: rgba({{ rgb(ansi.bright.magenta) }}, 0.15);
color: var(--owlry-badge-media);
}
.owlry-badge-weather {
background-color: rgba({{ rgb(ansi.bright.cyan) }}, 0.15);
color: var(--owlry-badge-weather);
}
.owlry-badge-pomo {
background-color: rgba({{ rgb(ansi.bright.red) }}, 0.15);
color: var(--owlry-badge-pomo);
}
/* Filter button - default uses The Predator */
.owlry-filter-button:checked {
background-color: rgba({{ rgb(palette.cursor) }}, 0.2);
color: var(--owlry-accent);
border-color: rgba({{ rgb(palette.cursor) }}, 0.5);
}

View File

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

View File

@@ -0,0 +1,129 @@
{% macro rgb(hex) -%}
{%- set value = hex|replace('#', '') -%}
{{ value[0:2]|int(base=16) }}, {{ value[2:4]|int(base=16) }}, {{ value[4:6]|int(base=16) }}
{%- endmacro %}
/* {{ scheme }} - Sherlock Theme (Parser Compliant) */
/* 1. PALETTE DEFINITIONS */
@define-color apex_base {{ palette.background }};
@define-color apex_surface {{ ui.panel }};
@define-color apex_overlay {{ ui.border }};
@define-color apex_muted {{ ui.stealth }};
@define-color apex_text {{ palette.foreground }};
@define-color apex_love {{ palette.cursor }};
@define-color apex_foam {{ palette.info }};
@define-color apex_gold {{ palette.warning }};
/* 2. WINDOW & INPUT */
window {
background-color: @apex_base;
color: @apex_text;
border: 2px solid @apex_love;
border-radius: 10px;
padding: 6px;
}
entry {
background-color: @apex_surface;
color: @apex_text;
caret-color: @apex_love;
border: 1px solid @apex_overlay;
border-radius: 7px;
padding: 6px 9px;
margin-bottom: 6px;
}
entry:focus {
border-color: @apex_love;
box-shadow: 0 0 10px rgba({{ rgb(palette.cursor) }}, 0.2);
}
entry selection {
background-color: @apex_foam;
color: {{ palette.selection_fg }};
}
/* 3. LIST & SELECTION */
listview {
background-color: transparent;
}
/* The actual row selection - Informational */
listview > row:selected {
background-color: @apex_foam;
color: {{ palette.selection_fg }};
border-radius: 7px;
border: none;
outline: none;
}
/* 4. TILES (The Items) */
.tile, .launcher-tile, .launcher-item, .item {
background-color: @apex_surface;
color: @apex_text;
border-radius: 7px;
padding: 4px 10px;
margin-bottom: 4px;
}
/* When the ROW is selected, make the TILE transparent so info shows through */
listview > row:selected .tile,
listview > row:selected .launcher-tile,
listview > row:selected .item {
background-color: transparent;
color: {{ palette.selection_fg }};
}
/* Force TEXT on selection */
listview > row:selected label,
listview > row:selected .title,
listview > row:selected .description,
listview > row:selected .subtitle {
color: {{ palette.selection_fg }};
}
/* Force ICONS on selection */
listview > row:selected image,
listview > row:selected .icon {
color: {{ palette.selection_fg }};
}
/* 5. WIDGETS (Weather Fix without !important) */
.widget, .weather-widget, .music-widget {
background-color: @apex_surface;
border: 1px solid @apex_overlay;
color: @apex_text;
border-radius: 7px;
}
/* Specific overrides for weather internals */
.weather-widget box {
background-color: transparent;
}
.weather-widget label {
color: @apex_text;
}
/* Temperature info */
.weather-widget .temperature {
color: @apex_foam;
font-weight: 800;
}
.weather-widget .condition {
color: @apex_muted;
}
/* 6. SCROLLBARS */
scrollbar slider {
background-color: @apex_overlay;
min-width: 6px;
border-radius: 10px;
}
scrollbar slider:hover { background-color: @apex_love; }
progressbar progress {
background-color: @apex_love;
border-radius: 4px;
}

View File

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

View File

@@ -0,0 +1,17 @@
{% set scheme_slug = scheme|lower|replace(' ', '-') %}
[{{ scheme_slug }}]
text = {{ palette.foreground|replace('#', '') }}
subtext = {{ ui.stealth|replace('#', '') }}
main = {{ palette.background|replace('#', '') }}
sidebar = {{ palette.background|replace('#', '') }}
player = {{ palette.background|replace('#', '') }}
card = {{ ui.panel|replace('#', '') }}
shadow = 000000
selected-row = {{ palette.info|replace('#', '') }}
button = {{ palette.info|replace('#', '') }}
button-active = {{ palette.cursor|replace('#', '') }}
button-disabled = {{ ui.stealth|replace('#', '') }}
tab-active = {{ ui.border|replace('#', '') }}
notification = {{ palette.info|replace('#', '') }}
notification-error = {{ palette.cursor|replace('#', '') }}
misc = {{ palette.warning|replace('#', '') }}

View File

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

View File

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

View File

@@ -0,0 +1,35 @@
# {{ scheme | upper }} - WezTerm color scheme
# Spec-accurate: color = state, not decoration
[colors]
foreground = "{{ palette.foreground }}"
background = "{{ palette.background }}"
cursor_bg = "{{ palette.cursor }}"
cursor_border = "{{ palette.cursor }}"
cursor_fg = "{{ palette.selection_fg }}"
selection_bg = "{{ palette.selection }}"
selection_fg = "{{ palette.selection_fg }}"
ansi = [
"{{ ansi.normal.black }}",
"{{ ansi.normal.red }}",
"{{ ansi.normal.green }}",
"{{ ansi.normal.yellow }}",
"{{ ansi.normal.blue }}",
"{{ ansi.normal.magenta }}",
"{{ ansi.normal.cyan }}",
"{{ ansi.normal.white }}",
]
brights = [
"{{ ansi.bright.black }}",
"{{ ansi.bright.red }}",
"{{ ansi.bright.green }}",
"{{ ansi.bright.yellow }}",
"{{ ansi.bright.blue }}",
"{{ ansi.bright.magenta }}",
"{{ ansi.bright.cyan }}",
"{{ ansi.bright.white }}",
]

View File

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

View File

@@ -197,13 +197,13 @@
"font_style": "italic" "font_style": "italic"
}, },
"keyword": { "keyword": {
"color": "{{ s.palette.info }}" "color": "{{ s.palette.special }}"
}, },
"keyword.import": { "keyword.import": {
"color": "{{ s.palette.info }}" "color": "{{ s.palette.special }}"
}, },
"keyword.storage": { "keyword.storage": {
"color": "{{ s.palette.info }}" "color": "{{ s.palette.special }}"
}, },
"function": { "function": {
"color": "{{ s.palette.azure }}" "color": "{{ s.palette.azure }}"
@@ -215,10 +215,10 @@
"color": "{{ s.palette.azure }}" "color": "{{ s.palette.azure }}"
}, },
"type": { "type": {
"color": "{{ s.palette.special }}" "color": "{{ s.palette.warning }}"
}, },
"type.builtin": { "type.builtin": {
"color": "{{ s.palette.special }}" "color": "{{ s.palette.warning }}"
}, },
"string": { "string": {
"color": "{{ s.palette.success }}" "color": "{{ s.palette.success }}"
@@ -230,13 +230,13 @@
"color": "{{ s.palette.warning }}" "color": "{{ s.palette.warning }}"
}, },
"number": { "number": {
"color": "{{ s.palette.warning }}" "color": "{{ s.palette.info }}"
}, },
"boolean": { "boolean": {
"color": "{{ s.palette.warning }}" "color": "{{ s.palette.info }}"
}, },
"constant": { "constant": {
"color": "{{ s.palette.foreground }}" "color": "{{ s.palette.info }}"
}, },
"constant.builtin": { "constant.builtin": {
"color": "{{ s.palette.special }}" "color": "{{ s.palette.special }}"

View File

@@ -23,6 +23,16 @@ C[OK]="{{ palette.success }}"
C[PURPLE]="{{ palette.special }}" C[PURPLE]="{{ palette.special }}"
C[ALERT]="{{ ansi.bright.red }}" C[ALERT]="{{ ansi.bright.red }}"
# -----------------------------------------------------------------------------
# 1b) PLUGIN COLORS
# -----------------------------------------------------------------------------
# zsh-autosuggestions: ghost text from history (subtle, intentionally dim)
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg={{ ui.dim }}"
# zsh-history-substring-search
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND="fg={{ palette.info }},bold"
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND="fg={{ ansi.bright.red }},bold"
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# 2) ICONS / GLYPHS (Nerd Font optional) # 2) ICONS / GLYPHS (Nerd Font optional)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@@ -82,10 +92,15 @@ typeset -g apex_in_git=0
typeset -g apex_git_branch="" typeset -g apex_git_branch=""
typeset -g apex_git_dirty_wt=0 typeset -g apex_git_dirty_wt=0
typeset -g apex_git_dirty_ix=0 typeset -g apex_git_dirty_ix=0
typeset -g apex_git_untracked=0
typeset -g apex_git_conflict=0
typeset -g apex_git_op="" typeset -g apex_git_op=""
typeset -g apex_git_up_ok=0 typeset -g apex_git_up_ok=0
typeset -g apex_git_ahead=0 typeset -g apex_git_ahead=0
typeset -g apex_git_behind=0 typeset -g apex_git_behind=0
typeset -g apex_git_stash=0
typeset -g apex_git_root=""
typeset -g apex_git_dir=""
# Radar previous snapshots (transition detection) # Radar previous snapshots (transition detection)
typeset -g apex_prev_in_git=-1 typeset -g apex_prev_in_git=-1
@@ -123,6 +138,50 @@ apex__project_sig() {
[[ -n "$s" ]] && print -r -- "$s" [[ -n "$s" ]] && print -r -- "$s"
} }
apex__escape_prompt() {
local s="$1"
s="${s//\\%/%%}"
print -r -- "$s"
}
apex__now_float() {
if [[ -n "${EPOCHREALTIME:-}" ]]; then
print -r -- "$EPOCHREALTIME"
elif [[ -n "${EPOCHSECONDS:-}" ]]; then
print -r -- "${EPOCHSECONDS}.0"
else
print -r -- "0.0"
fi
}
apex__find_git_root() {
local dir="$PWD"
local git_root=""
local git_dir=""
while [[ -n "$dir" ]]; do
if [[ -d "$dir/.git" ]]; then
git_root="$dir"
git_dir="$dir/.git"
break
elif [[ -f "$dir/.git" ]]; then
local line
line="$(<"$dir/.git")"
if [[ "$line" == gitdir:* ]]; then
git_root="$dir"
git_dir="${line#gitdir: }"
[[ "$git_dir" != /* ]] && git_dir="$dir/$git_dir"
break
fi
fi
[[ "$dir" == "/" ]] && break
dir="${dir:h}"
done
[[ -n "$git_root" ]] && print -r -- "${git_root}|${git_dir}"
}
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# 6) INTEL (sticky; updated each prompt) # 6) INTEL (sticky; updated each prompt)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@@ -143,6 +202,8 @@ apex_update_intel() {
apex_mode_sig="nix" apex_mode_sig="nix"
elif [[ -n "$DIRENV_DIR" ]]; then elif [[ -n "$DIRENV_DIR" ]]; then
apex_mode_sig="direnv" apex_mode_sig="direnv"
elif [[ -f /run/.containerenv || -f /.dockerenv ]]; then
apex_mode_sig="ctr"
else else
apex_mode_sig="" apex_mode_sig=""
fi fi
@@ -164,39 +225,101 @@ apex_git_update() {
apex_git_branch="" apex_git_branch=""
apex_git_dirty_wt=0 apex_git_dirty_wt=0
apex_git_dirty_ix=0 apex_git_dirty_ix=0
apex_git_untracked=0
apex_git_conflict=0
apex_git_op="" apex_git_op=""
apex_git_up_ok=0 apex_git_up_ok=0
apex_git_ahead=0 apex_git_ahead=0
apex_git_behind=0 apex_git_behind=0
apex_git_stash=0
command git rev-parse --is-inside-work-tree &>/dev/null || return local status_out
status_out="$(command git status --porcelain=2 --branch 2>/dev/null)" || {
apex_git_root=""
apex_git_dir=""
return
}
apex_in_git=1 apex_in_git=1
apex_git_branch="$( if (( apex_pwd_changed )) || [[ -z "$apex_git_root" ]]; then
command git symbolic-ref --quiet --short HEAD 2>/dev/null \ local root_info
|| command git rev-parse --short HEAD 2>/dev/null root_info="$(apex__find_git_root)"
)" if [[ -n "$root_info" ]]; then
apex_git_root="${root_info%%|*}"
apex_git_dir="${root_info#*|}"
else
apex_git_root=""
apex_git_dir=""
fi
fi
local gd; gd="$(command git rev-parse --git-dir 2>/dev/null)" || return local branch_head="" branch_oid="" upstream=""
[[ -d "$gd/rebase-apply" || -d "$gd/rebase-merge" ]] && apex_git_op="rebase" local xy="" ix="" wt=""
[[ -f "$gd/MERGE_HEAD" ]] && apex_git_op="merge" local line
[[ -f "$gd/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick" while IFS= read -r line; do
[[ -f "$gd/BISECT_LOG" ]] && apex_git_op="bisect" case "$line" in
\#\ branch.head\ *)
branch_head="${line#\# branch.head }"
;;
\#\ branch.oid\ *)
branch_oid="${line#\# branch.oid }"
;;
\#\ branch.upstream\ *)
upstream="${line#\# branch.upstream }"
;;
\#\ branch.ab\ *)
local ab a b
ab="${line#\# branch.ab }"
IFS=' ' read -r a b <<<"$ab"
a="${a#+}"
b="${b#-}"
apex_git_ahead="${a:-0}"
apex_git_behind="${b:-0}"
;;
1\ *|2\ *)
xy="${line[3,4]}"
ix="${xy[1]}"
wt="${xy[2]}"
[[ "$ix" != "." ]] && apex_git_dirty_ix=1
[[ "$wt" != "." ]] && apex_git_dirty_wt=1
;;
u\ *)
apex_git_conflict=1
apex_git_dirty_ix=1
apex_git_dirty_wt=1
;;
\?\ *)
apex_git_untracked=1
;;
esac
done <<<"$status_out"
# Dirty markers if [[ -n "$branch_head" && "$branch_head" != "(detached)" && "$branch_head" != "HEAD" ]]; then
command git diff --quiet --ignore-submodules -- 2>/dev/null || apex_git_dirty_wt=1 apex_git_branch="$branch_head"
command git diff --cached --quiet --ignore-submodules -- 2>/dev/null || apex_git_dirty_ix=1 elif [[ -n "$branch_oid" ]]; then
apex_git_branch="${branch_oid[1,7]}"
fi
# Upstream (earned ✓) if [[ -n "$apex_git_dir" ]]; then
if command git rev-parse --abbrev-ref --symbolic-full-name @{u} &>/dev/null; then [[ -d "$apex_git_dir/rebase-apply" || -d "$apex_git_dir/rebase-merge" ]] && apex_git_op="rebase"
local counts behind ahead [[ -f "$apex_git_dir/MERGE_HEAD" ]] && apex_git_op="merge"
counts="$(command git rev-list --left-right --count @{u}...HEAD 2>/dev/null)" || return [[ -f "$apex_git_dir/CHERRY_PICK_HEAD" ]] && apex_git_op="cherry-pick"
local IFS=$' \t' [[ -f "$apex_git_dir/BISECT_LOG" ]] && apex_git_op="bisect"
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 if [[ -f "$apex_git_dir/logs/refs/stash" ]]; then
local -a stash_lines
stash_lines=(${(f)"$(<"$apex_git_dir/logs/refs/stash")"})
apex_git_stash=$#stash_lines
elif [[ -f "$apex_git_dir/refs/stash" ]]; then
apex_git_stash=1
fi
fi
(( apex_git_conflict )) && apex_git_op="conflict"
if [[ -n "$upstream" && "$upstream" != "(gone)" ]]; then
if (( apex_git_dirty_wt == 0 && apex_git_dirty_ix == 0 && apex_git_untracked == 0 && apex_git_conflict == 0 && apex_git_stash == 0 )) \
&& [[ -z "$apex_git_op" ]]; then
[[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1 [[ "$apex_git_behind" == "0" && "$apex_git_ahead" == "0" ]] && apex_git_up_ok=1
fi fi
fi fi
@@ -248,19 +371,23 @@ apex_intel_r() {
apex_vcs_r() { apex_vcs_r() {
(( APEX[SHOW_VCS] )) || return 0 (( APEX[SHOW_VCS] )) || return 0
(( apex_in_git )) || return 0 (( apex_in_git )) || return 0
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
if [[ -n "$apex_git_op" ]]; then if [[ -n "$apex_git_op" ]]; then
print -n "%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f" print -n "%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
return 0 return 0
fi fi
print -n "%F{${C[CYAN]}}${I[GIT]} ${apex_git_branch}%f" print -n "%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
local mark="" local mark=""
(( apex_git_dirty_ix )) && mark+="+" (( apex_git_dirty_ix )) && mark+="+"
(( apex_git_dirty_wt )) && mark+="!" (( apex_git_dirty_wt )) && mark+="!"
(( apex_git_untracked )) && mark+="?"
[[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f" [[ -n "$mark" ]] && print -n "%F{${C[GOLD]}} ${mark}%f"
(( apex_git_stash > 0 )) && print -n "%F{${C[MUTED]}} s${apex_git_stash}%f"
(( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f" (( apex_git_up_ok )) && print -n "%F{${C[OK]}} ✓%f"
if (( APEX[GIT_AHEAD_BEHIND] )); then if (( APEX[GIT_AHEAD_BEHIND] )); then
@@ -270,15 +397,23 @@ apex_vcs_r() {
} }
apex_friction_r() { apex_friction_r() {
if (( APEX[SHOW_RO] )) && [[ ! -w . ]]; then if (( APEX[SHOW_RO] )); then
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f" local ro=0
return 0 [[ ! -w . ]] && ro=1
if (( apex_in_git )) && [[ -n "$apex_git_root" && ! -w "$apex_git_root" ]]; then
ro=1
fi
if (( ro )); then
print -n "%F{${C[GOLD]}}${I[ROOT]} ro%f"
return 0
fi
fi fi
if (( APEX[SHOW_JOBS] )); then if (( APEX[SHOW_JOBS] )); then
local jc local -a job_pids
jc=$(jobs -p 2>/dev/null | wc -l | tr -d ' ') job_pids=(${(f)"$(jobs -p 2>/dev/null)"})
if [[ -n "$jc" && "$jc" != "0" ]]; then local jc=$#job_pids
if (( jc > 0 )); then
print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f" print -n "%F{${C[MUTED]}}${I[JOBS]} ${jc}%f"
return 0 return 0
fi fi
@@ -313,6 +448,7 @@ apex_radar_aar() {
(( show )) || return 0 (( show )) || return 0
local short; short="$(apex__short_cmd "$cmd")" local short; short="$(apex__short_cmd "$cmd")"
short="$(apex__escape_prompt "$short")"
local dur_color="${C[MUTED]}" local dur_color="${C[MUTED]}"
(( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}" (( ms >= ${APEX[SLOW_HARD_MS]} )) && dur_color="${C[GOLD]}"
@@ -388,10 +524,11 @@ apex_radar_context_burst() {
# Git first # Git first
if (( apex_in_git )); then if (( apex_in_git )); then
local branch; branch="$(apex__escape_prompt "$apex_git_branch")"
if [[ -n "$apex_git_op" ]]; then if [[ -n "$apex_git_op" ]]; then
out+="%F{${C[ALERT]}}${I[GIT]} ${apex_git_branch} ${apex_git_op}%f" out+="%F{${C[ALERT]}}${I[GIT]} ${branch} ${apex_git_op}%f"
else else
out+="%F{${C[CYAN]}}${I[GIT]} ${apex_git_branch}%f" out+="%F{${C[CYAN]}}${I[GIT]} ${branch}%f"
fi fi
fi fi
@@ -417,7 +554,7 @@ apex_radar_context_burst() {
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
apex_preexec_hook() { apex_preexec_hook() {
apex_has_run_cmd=1 apex_has_run_cmd=1
apex_cmd_start=${EPOCHREALTIME:-$EPOCHSECONDS} apex_cmd_start="$(apex__now_float)"
apex_last_cmd="$1" apex_last_cmd="$1"
} }
@@ -436,9 +573,14 @@ apex_precmd_hook() {
(( apex_has_run_cmd )) && ran=1 (( apex_has_run_cmd )) && ran=1
if (( ran )); then if (( ran )); then
local now=${EPOCHREALTIME:-$EPOCHSECONDS} local now; now="$(apex__now_float)"
local -i ms local -i ms=0
ms=$(( (now - apex_cmd_start) * 1000 )) local -F delta=0.0
if [[ -n "$now" ]]; then
delta=$(( now - apex_cmd_start ))
(( delta < 0 )) && delta=0
ms=$(( delta * 1000 ))
fi
# Show time if: slow OR ops OR failed. # Show time if: slow OR ops OR failed.
local dur="" local dur=""