Compare commits

...

47 Commits

Author SHA1 Message Date
d1ee693044 Ignore local SSH notes 2026-01-24 21:23:44 +00:00
3fb8b9697a Clarify git capsule state meanings 2026-01-24 20:44:31 +00:00
12fc686de1 Document git capsule in library 2026-01-24 20:40:29 +00:00
16a7d8dad9 . 2026-01-24 20:13:06 +00:00
8079b90e0c . 2026-01-24 19:57:11 +00:00
d944ed83e6 Document emoji usage per theme 2026-01-24 19:43:32 +00:00
4347690b4a Add installer menu structure 2026-01-24 19:34:34 +00:00
af0df324da Remove demo note from library 2026-01-24 19:30:07 +00:00
a7c88d772e Remove demo references and add theme gallery 2026-01-24 19:26:21 +00:00
dbe1843415 Tidy library spacing 2026-01-24 19:16:29 +00:00
3a970dde82 Reorder library to name-image-palette 2026-01-24 19:13:25 +00:00
ecf0ec07bd Place seasonal previews under each season 2026-01-24 19:08:15 +00:00
ee8e3dcafb Add seasonal and HawolexV2 screenshots 2026-01-24 19:05:31 +00:00
55909294b1 Fix library image links 2026-01-24 18:58:14 +00:00
bbc4281d50 Add theme screenshots and update library 2026-01-24 18:51:28 +00:00
8c68ce28f7 Fix demo rotation and move demo to top 2026-01-24 18:27:03 +00:00
761a1ae38a Add demo mode to cycle all themes 2026-01-24 18:20:27 +00:00
98ae44cc3b Add layout order selection for seasonal prompts 2026-01-24 16:15:28 +00:00
9774c15d34 Add theme library and fix HawolexV2 layout 2026-01-24 16:10:06 +00:00
a6b588ad8a Add HawolexV2 gradient style 2026-01-24 15:57:58 +00:00
77cbefe2a2 Polish README and update state JSONs 2026-01-24 15:51:38 +00:00
aa862e7854 Merge branch 'dev' 2026-01-24 15:42:27 +00:00
9cb60c2b03 Add custom style pack 2026-01-24 15:34:23 +00:00
f66a45d438 Add seasonal screenshot placeholders 2026-01-24 15:17:49 +00:00
865e351171 Expand README for dynamic season and git/emoji notes 2026-01-24 15:10:10 +00:00
f22f319af4 Clarify dynamic season prompt 2026-01-24 15:07:10 +00:00
a57c5d355d Darken seasonal path background 2026-01-24 15:01:23 +00:00
e4c41a8fb1 Darken seasonal path text 2026-01-24 14:55:09 +00:00
27fe9ee246 Tune seasonal gradient contrast 2026-01-24 14:51:38 +00:00
7c4e99667c Add four-segment seasonal gradients 2026-01-24 14:45:15 +00:00
d7c08d5a4c Add git capsule toggle across themes 2026-01-24 14:30:34 +00:00
c039075927 Resolve hawolex git enable flag 2026-01-24 14:16:49 +00:00
84336c0a7b Honor PS1_GIT for hawolex 2026-01-24 14:09:59 +00:00
5ed49cc54c Fix git capsule fallback when __git_ps1 is empty 2026-01-24 14:03:33 +00:00
4bd8307bf0 Fix hawolex git capsule detection 2026-01-24 13:53:10 +00:00
27ff3de89d manual commit 2026-01-24 13:45:47 +00:00
1c67eb6f05 - 2026-01-24 13:39:17 +00:00
d0cb724706 Prompt for git in Hawolex
- Add PS1_GIT toggle for Hawolex

- Update installers and context
2026-01-24 13:34:43 +00:00
e56aecd1c0 Fix cap bleed for neon and forge 2026-01-24 13:29:49 +00:00
73f23bcd61 Fix cap bleed for seasonal themes 2026-01-24 13:27:39 +00:00
fa33ab13f0 Fix cap bleed for holiday and Hawolex 2026-01-24 13:24:50 +00:00
8b5c833a1e Match git cap colors to segments 2026-01-24 13:19:24 +00:00
3dcec1b51b Fix git cap alignment and emoji spacing 2026-01-24 13:16:14 +00:00
d3f586afbf Tighten git triangle spacing 2026-01-24 13:12:13 +00:00
80add3e09b Align git caps with separator 2026-01-24 13:10:09 +00:00
85e9959fb0 Use triangle caps for git style 2026-01-24 13:06:42 +00:00
19f3d58a42 Revert "Square caps for git style"
This reverts commit 4b9c29f895.
2026-01-24 13:05:47 +00:00
33 changed files with 1541 additions and 179 deletions

View File

@@ -10,14 +10,9 @@
"main": { "main": {
"notes": [ "notes": [
"Shared PS1 module in dotfiles/ps1/ps1.sh is source of truth for both Linux and macOS installers.", "Shared PS1 module in dotfiles/ps1/ps1.sh is source of truth for both Linux and macOS installers.",
"README documents 4seasons branch, seasonal ranges, static/dynamic choice.", "README documents seasonal ranges and style packs.",
"README example image uses images/bash-pallete.png." "README example image uses images/bash-pallete.png."
] ]
},
"dev": {
"notes": [
"Development branch; currently in sync with main."
]
} }
}, },
"files": { "files": {
@@ -26,7 +21,36 @@
"macos_installer": "dotfiles/install/install-macos-user.sh", "macos_installer": "dotfiles/install/install-macos-user.sh",
"global_installer_wrapper": "dotfiles/install/install-global-ps1.sh", "global_installer_wrapper": "dotfiles/install/install-global-ps1.sh",
"readme": "README.md", "readme": "README.md",
"palette_image": "images/bash-pallete.png" "library": "libary.md",
"palette_image": "images/bash-pallete.png",
"theme_images_dir": "images/themes",
"theme_images": {
"season_winter": "images/themes/season-winter.png",
"season_spring": "images/themes/season-spring.png",
"season_summer": "images/themes/season-summer.png",
"season_autumn": "images/themes/season-autumn.png",
"aurora": "images/themes/aurora.png",
"neon": "images/themes/neon.png",
"forge": "images/themes/forge.png",
"circuit": "images/themes/circuit.png",
"mono": "images/themes/mono.png",
"git": "images/themes/git.png",
"hawolex": "images/themes/hawolex.png",
"hawolexv2": "images/themes/hawolexv2.png",
"christmas": "images/themes/christmas.png",
"easter": "images/themes/easter.png",
"halloween": "images/themes/halloween.png",
"valentine": "images/themes/valentine.png",
"thanksgiving": "images/themes/thanksgiving.png",
"newyear": "images/themes/newyear.png",
"radar": "images/themes/radar.png",
"synthwave": "images/themes/synthwave.png",
"noir": "images/themes/noir.png",
"topo": "images/themes/topo.png",
"glitch": "images/themes/glitch.png",
"arcticfire": "images/themes/arcticfire.png",
"acidlime": "images/themes/acidlime.png"
}
}, },
"install_behavior": { "install_behavior": {
"linux": { "linux": {
@@ -39,11 +63,13 @@
"sources_from": "/etc/bash.bashrc", "sources_from": "/etc/bash.bashrc",
"prompts": [ "prompts": [
"PS1 only / Banner only / Both", "PS1 only / Banner only / Both",
"PS1 mode: Single season / Dynamic / Contest / Holidays (if PS1 selected)", "PS1 mode: Single season / Dynamic / Contest / Holidays / Custom (if PS1 selected)",
"Season pick (if single season)", "Season pick (if single season)",
"Contest layout selection (if contest/holidays)", "Layout order selection (seasonal/contest/holidays)",
"Style preset selection (if contest)", "Style preset selection (if contest)",
"Holiday selection (if holidays)" "Holiday selection (if holidays)",
"Custom style selection (if custom)",
"Enable git capsule for all themes (if PS1 selected)"
], ],
"season_config_file": "/etc/ps1-season", "season_config_file": "/etc/ps1-season",
"style_config_file": "/etc/ps1-style", "style_config_file": "/etc/ps1-style",
@@ -60,11 +86,13 @@
"~/.bash_profile" "~/.bash_profile"
], ],
"prompts": [ "prompts": [
"PS1 mode: Single season / Dynamic / Contest / Holidays", "PS1 mode: Single season / Dynamic / Contest / Holidays / Custom",
"Season pick (if single season)", "Season pick (if single season)",
"Contest layout selection (if contest/holidays)", "Layout order selection (seasonal/contest/holidays)",
"Style preset selection (if contest)", "Style preset selection (if contest)",
"Holiday selection (if holidays)" "Holiday selection (if holidays)",
"Custom style selection (if custom)",
"Enable git capsule for all themes"
], ],
"season_config_file": "~/.config/ps1/season", "season_config_file": "~/.config/ps1/season",
"style_config_file": "~/.config/ps1/style" "style_config_file": "~/.config/ps1/style"
@@ -93,33 +121,45 @@
}, },
"palettes": { "palettes": {
"winter": { "winter": {
"Z1_BG": 61, "Z1_BG": 59,
"Z2_BG": 61,
"Z3_BG": 63,
"Z4_BG": 38,
"Z5_BG": 37,
"Z1_FG": 255, "Z1_FG": 255,
"Z2_BG": 37,
"Z2_FG": 255, "Z2_FG": 255,
"PATH_FG": 194, "PATH_FG": 152,
"FRAME": 60 "FRAME": 60
}, },
"spring": { "spring": {
"Z1_BG": 71, "Z1_BG": 68,
"Z2_BG": 70,
"Z3_BG": 72,
"Z4_BG": 121,
"Z5_BG": 120,
"Z1_FG": 255, "Z1_FG": 255,
"Z2_BG": 120,
"Z2_FG": 22, "Z2_FG": 22,
"PATH_FG": 22, "PATH_FG": 28,
"FRAME": 65 "FRAME": 65
}, },
"summer": { "summer": {
"Z1_BG": 142, "Z1_BG": 141,
"Z2_BG": 142,
"Z3_BG": 143,
"Z4_BG": 214,
"Z5_BG": 208,
"Z1_FG": 255, "Z1_FG": 255,
"Z2_BG": 214,
"Z2_FG": 0, "Z2_FG": 0,
"PATH_FG": 232, "PATH_FG": 0,
"FRAME": 130 "FRAME": 130
}, },
"autumn": { "autumn": {
"Z1_BG": 95, "Z1_BG": 93,
"Z2_BG": 95,
"Z3_BG": 97,
"Z4_BG": 166,
"Z5_BG": 136,
"Z1_FG": 255, "Z1_FG": 255,
"Z2_BG": 173,
"Z2_FG": 255, "Z2_FG": 255,
"PATH_FG": 223, "PATH_FG": 223,
"FRAME": 95 "FRAME": 95
@@ -176,15 +216,72 @@
"description": "Winter neon with tech icons, contest layout.", "description": "Winter neon with tech icons, contest layout.",
"layout": "two-line, contest layout", "layout": "two-line, contest layout",
"preview": "[date time user] @host - /path" "preview": "[date time user] @host - /path"
},
{
"id": "hawolexv2",
"name": "HawolexV2",
"description": "Winter neon with multi-segment gradient.",
"layout": "two-line, segmented gradient",
"preview": "[date time user] @host - /path"
},
{
"id": "radar",
"name": "Radar",
"description": "Green scanline HUD with a clean, low-noise read.",
"layout": "two-line, minimal HUD",
"preview": "[user time] @host /path"
},
{
"id": "synthwave",
"name": "Synthwave",
"description": "Pink/cyan/orange glow blocks, aggressive contrast.",
"layout": "two-line, three blocks",
"preview": "[date time user] | @host | /path"
},
{
"id": "noir",
"name": "Noir",
"description": "Near-black minimal with a sharp path accent.",
"layout": "two-line, minimal",
"preview": "[date time user] @host /path"
},
{
"id": "topo",
"name": "Topo",
"description": "Elevation-style path with multi-tone segments.",
"layout": "two-line, path emphasis",
"preview": "[date time user] @host /path"
},
{
"id": "glitch",
"name": "Glitch",
"description": "Jitter separators and neon contrast.",
"layout": "two-line, glitch separators",
"preview": "[date time user] ~ @host /path"
},
{
"id": "arcticfire",
"name": "ArcticFire",
"description": "Icy blues on the left, ember orange on the right.",
"layout": "two-line, three blocks",
"preview": "[date time user] | @host | /path"
},
{
"id": "acidlime",
"name": "AcidLime",
"description": "Black background with electric green signal.",
"layout": "two-line, minimal",
"preview": "[date time user] @host /path"
} }
], ],
"config": { "config": {
"env": "PS1_STYLE=aurora|neon|forge|circuit|mono|git|hawolex; PS1_STYLE_PACK=standard|contest|holiday; PS1_CONTEST_LAYOUT=day-time-user|user-time|time-user|day-time; PS1_HOLIDAY=christmas|easter|halloween|valentine|thanksgiving|newyear", "env": "PS1_STYLE=aurora|neon|forge|circuit|mono|git|hawolex|hawolexv2|radar|synthwave|noir|topo|glitch|arcticfire|acidlime; PS1_STYLE_PACK=standard|contest|holiday|custom; PS1_CONTEST_LAYOUT=day-time-user|user-time|time-user|day-time; PS1_HOLIDAY=christmas|easter|halloween|valentine|thanksgiving|newyear; PS1_GIT=0|1",
"config_file_keys": [ "config_file_keys": [
"PS1_STYLE", "PS1_STYLE",
"PS1_STYLE_PACK", "PS1_STYLE_PACK",
"PS1_CONTEST_LAYOUT", "PS1_CONTEST_LAYOUT",
"PS1_HOLIDAY" "PS1_HOLIDAY",
"PS1_GIT"
] ]
} }
}, },
@@ -415,7 +512,9 @@
"prompt_structure": { "prompt_structure": {
"zone1": "date time user", "zone1": "date time user",
"zone2": "host path", "zone2": "host path",
"seasonal_segments": "date | time | user | host+path (subtle seasonal gradient)",
"line2": "status arrow + emoji", "line2": "status arrow + emoji",
"emoji_padding": "Two spaces after the emoji before the cursor",
"path_shortening": "Keeps /home/user or /Users/user visible and shortens middle if deep.", "path_shortening": "Keeps /home/user or /Users/user visible and shortens middle if deep.",
"nerd_font_caps": "Always enabled unless PS1_FORCE_ASCII=1" "nerd_font_caps": "Always enabled unless PS1_FORCE_ASCII=1"
}, },
@@ -429,6 +528,10 @@
"On Linux, installer affects all users by writing to /etc/profile.d and sourcing from /etc/bash.bashrc.", "On Linux, installer affects all users by writing to /etc/profile.d and sourcing from /etc/bash.bashrc.",
"On macOS, installer is per-user and sources from .bashrc/.bash_profile.", "On macOS, installer is per-user and sources from .bashrc/.bash_profile.",
"Seasonal palettes and contest pack are now documented directly in main.", "Seasonal palettes and contest pack are now documented directly in main.",
"README uses images/bash-pallete.png." "README uses images/bash-pallete.png.",
"Git capsule prefers __git_ps1 and falls back to git symbolic-ref/short hash when git-prompt is unavailable or returns empty.",
"Hawolex git capsule enables when PS1_GIT resolves to a truthy value (1/yes/true/on).",
"Custom pack adds bold styles (radar, synthwave, noir, topo, glitch, arcticfire, acidlime).",
"Library includes emoji usage blocks per theme (sets, fixed times, time slots, rotation)."
] ]
} }

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.sshinfo.txt

210
README.md
View File

@@ -1,15 +1,30 @@
# Bashrc Dotfiles — Global & Portable Bash Prompt # Bashrc Dotfiles — Global & Portable Bash Prompt
Production-ready on `main`. Elegant, portable, and easy-to-install Bash prompt with seasonal palettes, time-aware emoji, and clean powerline structure.
Elegant, portable, and easy-to-install Bash prompt with: ---
- ✨ Two color zones ## ⚡ Quick Look
- 🌅 Time-based emoji accents
- 🖥️ Fallback when Nerd Fonts arent available - Theme gallery + full specs: [Theme Library](libary.md)
- 📍 Shortened but informative path - Packs: Seasonal (auto), Contest, Holidays, Custom, Git
- 🔘 Status-colored prompt arrow - Layout order option: day-time-user, user-time, time-user, day-time
- 🧠 Works on Linux, WSL, and macOS - Optional git capsule across themes
## ✅ Requirements (Nerd Fonts)
This prompt relies on Nerd Font glyphs for the rounded separators.
```bash
bash dotfiles/install/install-nerdfont.sh
```
After install:
- Set your terminal font to JetBrainsMono Nerd Font (or any Nerd Font)
- Manual download: https://www.nerdfonts.com/font-downloads
If you use a nonNerd font, the prompt falls back to ASCII/Unicode.
--- ---
@@ -63,20 +78,33 @@ bash dotfiles/install/install-macos-user.sh
source ~/.bashrc source ~/.bashrc
``` ```
### 🖼️ Nerd Fonts (optional but recommended) <details>
<summary><strong>Installer menu (structure)</strong></summary>
```bash ```text
bash dotfiles/install/install-nerdfont.sh Install options
├─ 1) PS1 only
├─ 2) Banner only
└─ 3) Both (PS1 + banner)
└─ PS1 mode
├─ 1) Single season (static)
│ ├─ Pick season (Winter/Spring/Summer/Autumn)
│ └─ Layout order (day-time-user / user-time / time-user / day-time)
├─ 2) Dynamic season (auto)
│ └─ Layout order (day-time-user / user-time / time-user / day-time)
├─ 3) Contest pack (static)
│ ├─ Layout order
│ └─ Style preset (Aurora/Neon/Forge/Circuit/Mono/Git/Hawolex/HawolexV2)
├─ 4) Holidays pack (static)
│ ├─ Pick holiday (Christmas/Easter/Halloween/Valentine/Thanksgiving/NewYear)
│ └─ Layout order
└─ 5) Custom pack (static)
└─ Style (Radar/Synthwave/Noir/Topo/Glitch/ArcticFire/AcidLime)
Final prompt:
└─ Enable git capsule for all themes? [y/N]
``` ```
</details>
After install:
- Open your terminal settings
- Set font to JetBrainsMono Nerd Font (or any Nerd Font)
- Terminal must use a Nerd Font for glyphs like ``, ``, `` to render correctly
- Manual download: https://www.nerdfonts.com/font-downloads
---
<details> <details>
<summary><strong>Installer choices</strong></summary> <summary><strong>Installer choices</strong></summary>
@@ -84,15 +112,30 @@ After install:
Linux/WSL: Linux/WSL:
- PS1 only / Banner only / Both - PS1 only / Banner only / Both
- PS1 modes: Single season, Dynamic season, Contest pack, Holidays pack - PS1 modes: Single season, Dynamic season, Contest pack, Holidays pack, Custom pack
- Dynamic season auto-switches by time of year (Spring: MarMay, Summer: JunAug, Autumn: SepNov 14, Winter: Nov 15Feb)
- Layout order (day-time-user, user-time, time-user, day-time) for seasonal and contest modes
macOS: macOS:
- PS1 modes: Single season, Dynamic season, Contest pack, Holidays pack - PS1 modes: Single season, Dynamic season, Contest pack, Holidays pack, Custom pack
- Dynamic season auto-switches by time of year (same ranges as Linux)
- Layout order (day-time-user, user-time, time-user, day-time) for seasonal and contest modes
</details> </details>
--- ---
## ✨ Features
- Two-line, powerline-style prompt
- Seasonal palettes + time-based emoji accents
- Smart path shortening (keeps home visible)
- Status-colored prompt arrow
- Works on Linux, WSL, and macOS
- Per-user disable switch
---
<details> <details>
<summary><strong>What gets installed</strong></summary> <summary><strong>What gets installed</strong></summary>
@@ -149,19 +192,6 @@ echo "Your punchline" | sudo tee /etc/ps1-punchline >/dev/null
--- ---
## 🧠 Features
- **Clean, modern powerline-style prompt**
- Zone 1: date/time/user (cool gray-blue)
- Zone 2: host/path (turquoise / cool green)
- Automatically switches emoji during the day
- Smart path shortening (keeps your home dir visible)
- Fallback to ASCII/Unicode if Nerd Fonts are not installed
- Per-user disable support
- Simple per-user or global install
---
## 🎛️ Themes & Style Packs ## 🎛️ Themes & Style Packs
### 🏁 Contest Pack ### 🏁 Contest Pack
@@ -172,6 +202,24 @@ Note: This repo was built with AI assistance, and the contest pack itself is ful
--- ---
<details>
<summary><strong>Custom Pack (bold styles)</strong></summary>
Seven extra styles, built to be loud and expressive:
- Radar: green scanline HUD
- Synthwave: pink/cyan/orange glow blocks
- Noir: near-black minimal + red path
- Topo: elevation-style path segments
- Glitch: jitter separators + neon
- ArcticFire: icy blues into ember orange
- AcidLime: black + electric green
Custom styles add a small context badge when relevant (`ssh`, `ctr`, `git`).
</details>
---
<details> <details>
<summary><strong>Git Theme (details)</strong></summary> <summary><strong>Git Theme (details)</strong></summary>
@@ -183,7 +231,12 @@ The Git theme adds a repo-aware capsule on line 2 that only appears inside a Git
- Untracked: 🧷 - Untracked: 🧷
- Stashed: 📦 - Stashed: 📦
It uses the same two-block layout as Aurora, but focuses on signal and minimal noise for fast scanning. It uses the same two-block layout as Aurora, but focuses on signal and minimal noise for fast scanning. Use it when you want repo status on every command without a full VCS prompt.
Git capsule switch:
- `PS1_GIT=1` enables the git capsule on all themes
- Git theme always shows it, regardless of `PS1_GIT`
</details> </details>
--- ---
@@ -198,6 +251,15 @@ Holidays pack uses themed palettes + emojis and the contest layout order:
--- ---
## 🧭 Theme Design Notes
- **Aurora (seasonal):** calm hierarchy, subtle gradients, long-term readability
- **Contest styles:** bold contrast and distinct silhouettes for instant recognition
- **Custom pack:** experimental, high-signal variants for strong personal style
- **Holidays:** themed colors + emojis without compromising legibility
---
<details> <details>
<summary><strong>Emoji palette</strong></summary> <summary><strong>Emoji palette</strong></summary>
@@ -212,6 +274,18 @@ Seasonal sets (sunrise / work):
- Summer: 🌞 🏖️ 🌅 🌤 / 🏄 🏖️ 🚤 🌴 - Summer: 🌞 🏖️ 🌅 🌤 / 🏄 🏖️ 🚤 🌴
- Autumn: 🍁 🍂 🌫️ 🌦️ / 🍂 🍄 🎃 🪵 - Autumn: 🍁 🍂 🌫️ 🌦️ / 🍂 🍄 🎃 🪵
- Winter: 🏔️ 🌨️ ❄️ 🌌 / 🎿 ⛷️ 🏂 🧊 - Winter: 🏔️ 🌨️ ❄️ 🌌 / 🎿 ⛷️ 🏂 🧊
Time slots:
- Sunrise: 05:0008:59
- Coffee: 09:0010:59
- Work: 11:3015:59 (unless lunch overrides)
- Evening: 17:0022:59
- Night: 23:0004:59
Meaning:
- Emoji is a light accent for time/season; it never replaces core info
</details> </details>
--- ---
@@ -225,6 +299,7 @@ Seasonal sets (sunrise / work):
├── images/ ├── images/
│ ├── bash-pallete.png │ ├── bash-pallete.png
│ └── contest.png │ └── contest.png
│ └── themes/
├── dotfiles/ ├── dotfiles/
│ ├── banner/ │ ├── banner/
│ │ └── banner.sh │ │ └── banner.sh
@@ -319,36 +394,51 @@ If you see squares or missing glyphs, your terminal is likely using a non-Nerd f
--- ---
## 📸 Example Prompt ## 📸 Theme Gallery
This prompt shows: Seasonal (Aurora):
![Winter](images/themes/season-winter.png)
![Spring](images/themes/season-spring.png)
![Summer](images/themes/season-summer.png)
![Autumn](images/themes/season-autumn.png)
Contest pack:
![Aurora (contest)](images/themes/aurora.png)
![Neon](images/themes/neon.png)
![Forge](images/themes/forge.png)
![Circuit](images/themes/circuit.png)
![Mono](images/themes/mono.png)
![Git](images/themes/git.png)
![Hawolex](images/themes/hawolex.png)
![HawolexV2](images/themes/hawolexv2.png)
Holidays pack:
![Christmas](images/themes/christmas.png)
![Easter](images/themes/easter.png)
![Halloween](images/themes/halloween.png)
![Valentine](images/themes/valentine.png)
![Thanksgiving](images/themes/thanksgiving.png)
![NewYear](images/themes/newyear.png)
Custom pack:
![Radar](images/themes/radar.png)
![Synthwave](images/themes/synthwave.png)
![Noir](images/themes/noir.png)
![Topo](images/themes/topo.png)
![Glitch](images/themes/glitch.png)
![ArcticFire](images/themes/arcticfire.png)
![AcidLime](images/themes/acidlime.png)
Palette reference:
<p align="center"> <p align="center">
<img src="images/bash-pallete.png" width="900"> <img src="images/bash-pallete.png" width="900">
</p> </p>
With exit-status colored arrow and emoji reflecting time of day.
---
## 🔥 Why this is real high-end PS1 design
- Semantic color use (identity vs location)
- Few colors, but with meaning
- Path is visible, but never dominant
- Emoji is an accent, not a gimmick
- Prompt line is calm → the command gets focus
### 🎨 Color palette (notes)
| Role | BG | Description |
| --- | --- | --- |
| Zone 1 BG | 61 | gray-blue pastel |
| Zone 1 FG | 255 | pure white |
| Zone 2 BG | 37 | turquoise / cool green |
| Path FG | 194 (FG) | light green, muted |
| Frame | 60 | darker blue |
--- ---
## 🛠️ Contribution ## 🛠️ Contribution

View File

@@ -1,7 +1,7 @@
{ {
"project": "Bashrc Dotfiles", "project": "Bashrc Dotfiles",
"branch": "dev", "branch": "main",
"purpose": "DEFCON contest render pack for PS1 styles", "purpose": "DEFCON contest + custom render pack for PS1 styles",
"contest_pack": { "contest_pack": {
"layout_options": [ "layout_options": [
"day-time-user", "day-time-user",
@@ -29,6 +29,24 @@
"night": "🕶️" "night": "🕶️"
} }
}, },
"prompt_spacing": {
"emoji_padding": 2,
"note": "Two spaces after the emoji before the cursor"
},
"emoji_rules": {
"fixed_times": [
"11:00-11:29 => 🥪",
"16:00-16:59 => 🍲"
],
"time_slots": {
"sunrise": "05:00-08:59",
"coffee": "09:00-10:59",
"work": "11:30-15:59",
"evening": "17:00-22:59",
"night": "23:00-04:59"
},
"rotation": "Daily rotation by day-of-year with season offsets."
},
"holiday_pack": { "holiday_pack": {
"layout_options": [ "layout_options": [
"day-time-user", "day-time-user",
@@ -101,6 +119,45 @@
} }
} }
}, },
"custom_pack": {
"styles": [
{
"id": "radar",
"tagline": "Green scanline HUD",
"preview": "[user time] @host /path"
},
{
"id": "synthwave",
"tagline": "Pink/cyan/orange glow blocks",
"preview": "[date time user] | @host | /path"
},
{
"id": "noir",
"tagline": "Near-black minimal + red path",
"preview": "[date time user] @host /path"
},
{
"id": "topo",
"tagline": "Elevation path (multi-tone)",
"preview": "[date time user] @host /path"
},
{
"id": "glitch",
"tagline": "Jitter separators",
"preview": "[date time user] ~ @host /path"
},
{
"id": "arcticfire",
"tagline": "Ice blue to ember orange",
"preview": "[date time user] | @host | /path"
},
{
"id": "acidlime",
"tagline": "Black + electric green",
"preview": "[date time user] @host /path"
}
]
},
"styles": [ "styles": [
{ {
"id": "aurora", "id": "aurora",
@@ -223,13 +280,156 @@
"frame": 24 "frame": 24
}, },
"preview": "[date time user] @host - /path" "preview": "[date time user] @host - /path"
},
{
"id": "hawolexv2",
"name": "HawolexV2",
"tagline": "Winter neon gradient",
"description": "Multi-segment winter neon gradient with stronger separation.",
"layout": {
"line1": "date time user | @host | /path",
"line2": "status arrow + emoji"
},
"colors": {
"zone1_bg": 54,
"zone2_bg": 55,
"zone3_bg": 56,
"zone4_bg": 31,
"zone5_bg": 30,
"zone_fg": 255,
"path_fg": 230,
"frame": 24
},
"preview": "[date time user] @host - /path"
},
{
"id": "radar",
"name": "Radar",
"tagline": "Green scanline HUD",
"description": "Minimal HUD lines with green signal accents.",
"layout": {
"line1": "user time @host /path",
"line2": "status arrow + emoji"
},
"colors": {
"frame": 22,
"fg_main": 46,
"fg_dim": 28,
"path_fg": 120
},
"preview": "[user time] @host /path"
},
{
"id": "synthwave",
"name": "Synthwave",
"tagline": "Pink/cyan/orange glow",
"description": "Three-block powerline glow in neon tones.",
"layout": {
"line1": "date time user | @host | /path",
"line2": "status arrow + emoji"
},
"colors": {
"zone1_bg": 198,
"zone1_fg": 255,
"zone2_bg": 45,
"zone2_fg": 16,
"zone3_bg": 208,
"zone3_fg": 16,
"frame": 201
},
"preview": "[date time user] | @host | /path"
},
{
"id": "noir",
"name": "Noir",
"tagline": "Near-black minimal",
"description": "Low-light mono with a red path accent.",
"layout": {
"line1": "date time user @host /path",
"line2": "status arrow + emoji"
},
"colors": {
"fg_main": 250,
"fg_dim": 242,
"path_fg": 160,
"frame": 236
},
"preview": "[date time user] @host /path"
},
{
"id": "topo",
"name": "Topo",
"tagline": "Elevation path",
"description": "Multi-tone path segments for depth.",
"layout": {
"line1": "date time user @host /path",
"line2": "status arrow + emoji"
},
"colors": {
"path_fg": [109, 110, 111, 110],
"frame": 24
},
"preview": "[date time user] @host /path"
},
{
"id": "glitch",
"name": "Glitch",
"tagline": "Jitter separators",
"description": "Shifting glyph separators in neon tones.",
"layout": {
"line1": "date time user ~ @host /path",
"line2": "status arrow + emoji"
},
"colors": {
"fg_main": 118,
"fg_dim": 60,
"frame": 129
},
"preview": "[date time user] ~ @host /path"
},
{
"id": "arcticfire",
"name": "ArcticFire",
"tagline": "Ice to ember",
"description": "Cold blues into hot orange, three blocks.",
"layout": {
"line1": "date time user | @host | /path",
"line2": "status arrow + emoji"
},
"colors": {
"zone1_bg": 24,
"zone1_fg": 255,
"zone2_bg": 31,
"zone2_fg": 255,
"zone3_bg": 208,
"zone3_fg": 16,
"frame": 25
},
"preview": "[date time user] | @host | /path"
},
{
"id": "acidlime",
"name": "AcidLime",
"tagline": "Electric green",
"description": "Black background with green signal.",
"layout": {
"line1": "date time user @host /path",
"line2": "status arrow + emoji"
},
"colors": {
"fg_main": 46,
"fg_dim": 40,
"path_fg": 118,
"frame": 46
},
"preview": "[date time user] @host /path"
} }
], ],
"seasonal_palettes": { "seasonal_palettes": {
"winter": { "Z1_BG": 61, "Z1_FG": 255, "Z2_BG": 37, "Z2_FG": 255, "PATH_FG": 194, "FRAME": 60 }, "winter": { "Z1_BG": 59, "Z2_BG": 61, "Z3_BG": 63, "Z4_BG": 38, "Z5_BG": 37, "Z1_FG": 255, "Z2_FG": 255, "PATH_FG": 152, "FRAME": 60 },
"spring": { "Z1_BG": 71, "Z1_FG": 255, "Z2_BG": 120, "Z2_FG": 22, "PATH_FG": 22, "FRAME": 65 }, "spring": { "Z1_BG": 68, "Z2_BG": 70, "Z3_BG": 72, "Z4_BG": 121, "Z5_BG": 120, "Z1_FG": 255, "Z2_FG": 22, "PATH_FG": 28, "FRAME": 65 },
"summer": { "Z1_BG": 142, "Z1_FG": 255, "Z2_BG": 214, "Z2_FG": 0, "PATH_FG": 232, "FRAME": 130 }, "summer": { "Z1_BG": 141, "Z2_BG": 142, "Z3_BG": 143, "Z4_BG": 214, "Z5_BG": 208, "Z1_FG": 255, "Z2_FG": 0, "PATH_FG": 0, "FRAME": 130 },
"autumn": { "Z1_BG": 95, "Z1_FG": 255, "Z2_BG": 173, "Z2_FG": 255, "PATH_FG": 223, "FRAME": 95 } "autumn": { "Z1_BG": 93, "Z2_BG": 95, "Z3_BG": 97, "Z4_BG": 166, "Z5_BG": 136, "Z1_FG": 255, "Z2_FG": 255, "PATH_FG": 223, "FRAME": 95 }
}, },
"notes": [ "notes": [
"Palette values are 256-color codes.", "Palette values are 256-color codes.",

View File

@@ -29,6 +29,7 @@ style_choice="aurora"
style_pack="standard" style_pack="standard"
contest_layout="day-time-user" contest_layout="day-time-user"
holiday_choice="christmas" holiday_choice="christmas"
git_choice="0"
if [[ -t 0 ]]; then if [[ -t 0 ]]; then
echo "Install options:" echo "Install options:"
echo " 1) PS1 only" echo " 1) PS1 only"
@@ -46,9 +47,10 @@ if [[ -t 0 ]]; then
echo echo
echo "PS1 mode:" echo "PS1 mode:"
echo " 1) Single season (static)" echo " 1) Single season (static)"
echo " 2) Dynamic season (changing)" echo " 2) Dynamic season (auto, shifts with the year)"
echo " 3) Contest pack (static)" echo " 3) Contest pack (static)"
echo " 4) Holidays pack (static)" echo " 4) Holidays pack (static)"
echo " 5) Custom pack (static)"
read -r -p "Choose [3]: " season_mode_choice read -r -p "Choose [3]: " season_mode_choice
case "${season_mode_choice}" in case "${season_mode_choice}" in
1) 1)
@@ -68,10 +70,38 @@ if [[ -t 0 ]]; then
esac esac
style_pack="standard" style_pack="standard"
contest_layout="day-time-user"
echo "Layout order:"
echo " 1) day-time-user"
echo " 2) user-time"
echo " 3) time-user"
echo " 4) day-time"
read -r -p "Choose [1]: " layout_pick
case "${layout_pick}" in
2) contest_layout="user-time" ;;
3) contest_layout="time-user" ;;
4) contest_layout="day-time" ;;
""|1) contest_layout="day-time-user" ;;
*) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;;
esac
;; ;;
2) 2)
season_mode="dynamic" season_mode="dynamic"
style_pack="standard" style_pack="standard"
contest_layout="day-time-user"
echo "Layout order:"
echo " 1) day-time-user"
echo " 2) user-time"
echo " 3) time-user"
echo " 4) day-time"
read -r -p "Choose [1]: " layout_pick
case "${layout_pick}" in
2) contest_layout="user-time" ;;
3) contest_layout="time-user" ;;
4) contest_layout="day-time" ;;
""|1) contest_layout="day-time-user" ;;
*) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;;
esac
;; ;;
""|3) ""|3)
season_mode="static" season_mode="static"
@@ -127,6 +157,10 @@ if [[ -t 0 ]]; then
*) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;; *) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;;
esac esac
;; ;;
5)
season_mode="static"
style_pack="custom"
;;
*) *)
echo "Invalid choice, using dynamic." echo "Invalid choice, using dynamic."
season_mode="dynamic" season_mode="dynamic"
@@ -151,6 +185,8 @@ if [[ -t 0 ]]; then
echo " Preview: [date time user] @host - /path (git)" echo " Preview: [date time user] @host - /path (git)"
echo " 7) Hawolex - Winter neon, tech icons" echo " 7) Hawolex - Winter neon, tech icons"
echo " Preview: [date time user] @host - /path" echo " Preview: [date time user] @host - /path"
echo " 8) HawolexV2 - Winter neon gradient"
echo " Preview: [date time user] @host - /path"
read -r -p "Choose style [1]: " style_pick read -r -p "Choose style [1]: " style_pick
case "${style_pick}" in case "${style_pick}" in
2) style_choice="neon" ;; 2) style_choice="neon" ;;
@@ -159,12 +195,51 @@ if [[ -t 0 ]]; then
5) style_choice="mono" ;; 5) style_choice="mono" ;;
6) style_choice="git" ;; 6) style_choice="git" ;;
7) style_choice="hawolex" ;; 7) style_choice="hawolex" ;;
8) style_choice="hawolexv2" ;;
""|1) style_choice="aurora" ;; ""|1) style_choice="aurora" ;;
*) echo "Invalid choice, using aurora."; style_choice="aurora" ;; *) echo "Invalid choice, using aurora."; style_choice="aurora" ;;
esac esac
elif [[ "$style_pack" == "custom" ]]; then
echo
echo "Custom styles:"
echo " 1) Radar - Green scanline HUD, ultra clean"
echo " Preview: [user time] @host /path"
echo " 2) Synthwave - Pink/cyan/orange glow blocks"
echo " Preview: [date time user] | @host | /path"
echo " 3) Noir - Near-black minimal + red path"
echo " Preview: [date time user] @host /path"
echo " 4) Topo - Elevation path (multi-tone)"
echo " Preview: [date time user] @host /path"
echo " 5) Glitch - Jitter glyph separators"
echo " Preview: [date time user] ~ @host /path"
echo " 6) ArcticFire - Ice blue to ember orange"
echo " Preview: [date time user] | @host | /path"
echo " 7) AcidLime - Black + electric green"
echo " Preview: [date time user] @host /path"
read -r -p "Choose style [1]: " style_pick
case "${style_pick}" in
2) style_choice="synthwave" ;;
3) style_choice="noir" ;;
4) style_choice="topo" ;;
5) style_choice="glitch" ;;
6) style_choice="arcticfire" ;;
7) style_choice="acidlime" ;;
""|1) style_choice="radar" ;;
*) echo "Invalid choice, using radar."; style_choice="radar" ;;
esac
else else
style_choice="aurora" style_choice="aurora"
fi fi
read -r -p "Enable git capsule for all themes? [y/N]: " git_pick
case "${git_pick}" in
y|Y) git_choice="1" ;;
*) git_choice="0" ;;
esac
if [[ "$style_choice" == "git" ]]; then
git_choice="1"
fi
fi fi
fi fi
@@ -237,12 +312,13 @@ if [[ "$install_ps1" -eq 1 ]]; then
{ {
printf 'PS1_STYLE=%s\n' "$style_choice" printf 'PS1_STYLE=%s\n' "$style_choice"
printf 'PS1_STYLE_PACK=%s\n' "$style_pack" printf 'PS1_STYLE_PACK=%s\n' "$style_pack"
if [[ "$style_pack" == "contest" || "$style_pack" == "holiday" ]]; then if [[ "$style_pack" == "contest" || "$style_pack" == "holiday" || "$style_pack" == "standard" ]]; then
printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout" printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout"
fi fi
if [[ "$style_pack" == "holiday" ]]; then if [[ "$style_pack" == "holiday" ]]; then
printf 'PS1_HOLIDAY=%s\n' "${holiday_choice:-christmas}" printf 'PS1_HOLIDAY=%s\n' "${holiday_choice:-christmas}"
fi fi
printf 'PS1_GIT=%s\n' "$git_choice"
} > /etc/ps1-style } > /etc/ps1-style
chmod 0644 /etc/ps1-style chmod 0644 /etc/ps1-style
else else

View File

@@ -18,13 +18,15 @@ season_choice=""
style_choice="aurora" style_choice="aurora"
contest_layout="day-time-user" contest_layout="day-time-user"
holiday_choice="christmas" holiday_choice="christmas"
git_choice="0"
if [[ -t 0 ]]; then if [[ -t 0 ]]; then
style_pack="standard" style_pack="standard"
echo "PS1 mode:" echo "PS1 mode:"
echo " 1) Single season (static)" echo " 1) Single season (static)"
echo " 2) Dynamic season (changing)" echo " 2) Dynamic season (auto, shifts with the year)"
echo " 3) Contest pack (static)" echo " 3) Contest pack (static)"
echo " 4) Holidays pack (static)" echo " 4) Holidays pack (static)"
echo " 5) Custom pack (static)"
read -r -p "Choose [3]: " season_mode_choice read -r -p "Choose [3]: " season_mode_choice
case "${season_mode_choice}" in case "${season_mode_choice}" in
1) 1)
@@ -43,11 +45,39 @@ if [[ -t 0 ]]; then
*) echo "Invalid choice, using winter."; season_choice="winter" ;; *) echo "Invalid choice, using winter."; season_choice="winter" ;;
esac esac
style_pack="standard" style_pack="standard"
;; contest_layout="day-time-user"
echo "Layout order:"
echo " 1) day-time-user"
echo " 2) user-time"
echo " 3) time-user"
echo " 4) day-time"
read -r -p "Choose [1]: " layout_pick
case "${layout_pick}" in
2) contest_layout="user-time" ;;
3) contest_layout="time-user" ;;
4) contest_layout="day-time" ;;
""|1) contest_layout="day-time-user" ;;
*) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;;
esac
;;
2) 2)
season_mode="dynamic" season_mode="dynamic"
style_pack="standard" style_pack="standard"
contest_layout="day-time-user"
echo "Layout order:"
echo " 1) day-time-user"
echo " 2) user-time"
echo " 3) time-user"
echo " 4) day-time"
read -r -p "Choose [1]: " layout_pick
case "${layout_pick}" in
2) contest_layout="user-time" ;;
3) contest_layout="time-user" ;;
4) contest_layout="day-time" ;;
""|1) contest_layout="day-time-user" ;;
*) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;;
esac
;; ;;
""|3) ""|3)
season_mode="static" season_mode="static"
@@ -103,6 +133,10 @@ if [[ -t 0 ]]; then
*) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;; *) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;;
esac esac
;; ;;
5)
season_mode="static"
style_pack="custom"
;;
*) *)
echo "Invalid choice, using dynamic." echo "Invalid choice, using dynamic."
season_mode="dynamic" season_mode="dynamic"
@@ -127,6 +161,8 @@ if [[ -t 0 ]]; then
echo " Preview: [date time user] @host - /path (git)" echo " Preview: [date time user] @host - /path (git)"
echo " 7) Hawolex - Winter neon, tech icons" echo " 7) Hawolex - Winter neon, tech icons"
echo " Preview: [date time user] @host - /path" echo " Preview: [date time user] @host - /path"
echo " 8) HawolexV2 - Winter neon gradient"
echo " Preview: [date time user] @host - /path"
read -r -p "Choose style [1]: " style_pick read -r -p "Choose style [1]: " style_pick
case "${style_pick}" in case "${style_pick}" in
2) style_choice="neon" ;; 2) style_choice="neon" ;;
@@ -135,12 +171,51 @@ if [[ -t 0 ]]; then
5) style_choice="mono" ;; 5) style_choice="mono" ;;
6) style_choice="git" ;; 6) style_choice="git" ;;
7) style_choice="hawolex" ;; 7) style_choice="hawolex" ;;
8) style_choice="hawolexv2" ;;
""|1) style_choice="aurora" ;; ""|1) style_choice="aurora" ;;
*) echo "Invalid choice, using aurora."; style_choice="aurora" ;; *) echo "Invalid choice, using aurora."; style_choice="aurora" ;;
esac esac
elif [[ "$style_pack" == "custom" ]]; then
echo
echo "Custom styles:"
echo " 1) Radar - Green scanline HUD, ultra clean"
echo " Preview: [user time] @host /path"
echo " 2) Synthwave - Pink/cyan/orange glow blocks"
echo " Preview: [date time user] | @host | /path"
echo " 3) Noir - Near-black minimal + red path"
echo " Preview: [date time user] @host /path"
echo " 4) Topo - Elevation path (multi-tone)"
echo " Preview: [date time user] @host /path"
echo " 5) Glitch - Jitter glyph separators"
echo " Preview: [date time user] ~ @host /path"
echo " 6) ArcticFire - Ice blue to ember orange"
echo " Preview: [date time user] | @host | /path"
echo " 7) AcidLime - Black + electric green"
echo " Preview: [date time user] @host /path"
read -r -p "Choose style [1]: " style_pick
case "${style_pick}" in
2) style_choice="synthwave" ;;
3) style_choice="noir" ;;
4) style_choice="topo" ;;
5) style_choice="glitch" ;;
6) style_choice="arcticfire" ;;
7) style_choice="acidlime" ;;
""|1) style_choice="radar" ;;
*) echo "Invalid choice, using radar."; style_choice="radar" ;;
esac
else else
style_choice="aurora" style_choice="aurora"
fi fi
read -r -p "Enable git capsule for all themes? [y/N]: " git_pick
case "${git_pick}" in
y|Y) git_choice="1" ;;
*) git_choice="0" ;;
esac
if [[ "$style_choice" == "git" ]]; then
git_choice="1"
fi
fi fi
mkdir -p "$DST_DIR" mkdir -p "$DST_DIR"
@@ -158,12 +233,13 @@ chmod 0644 "$SEASON_FILE"
{ {
printf 'PS1_STYLE=%s\n' "$style_choice" printf 'PS1_STYLE=%s\n' "$style_choice"
printf 'PS1_STYLE_PACK=%s\n' "$style_pack" printf 'PS1_STYLE_PACK=%s\n' "$style_pack"
if [[ "$style_pack" == "contest" || "$style_pack" == "holiday" ]]; then if [[ "$style_pack" == "contest" || "$style_pack" == "holiday" || "$style_pack" == "standard" ]]; then
printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout" printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout"
fi fi
if [[ "$style_pack" == "holiday" ]]; then if [[ "$style_pack" == "holiday" ]]; then
printf 'PS1_HOLIDAY=%s\n' "${holiday_choice:-christmas}" printf 'PS1_HOLIDAY=%s\n' "${holiday_choice:-christmas}"
fi fi
printf 'PS1_GIT=%s\n' "$git_choice"
} > "$STYLE_FILE" } > "$STYLE_FILE"
chmod 0644 "$STYLE_FILE" chmod 0644 "$STYLE_FILE"

View File

@@ -89,11 +89,12 @@ _ps1_season() {
fi fi
} }
# Style selection (aurora/neon/forge/circuit/mono/git/hawolex) # Style selection (aurora/neon/forge/circuit/mono/git/hawolex + custom pack)
# PS1_STYLE=aurora|neon|forge|circuit|mono|git|hawolex # PS1_STYLE=aurora|neon|forge|circuit|mono|git|hawolex|hawolexv2|radar|synthwave|noir|topo|glitch|arcticfire|acidlime
# PS1_STYLE_PACK=standard|contest|holiday # PS1_STYLE_PACK=standard|contest|holiday|custom
# PS1_CONTEST_LAYOUT=day-time-user|user-time|time-user|day-time # PS1_CONTEST_LAYOUT=day-time-user|user-time|time-user|day-time
# PS1_HOLIDAY=christmas|easter|halloween|valentine|thanksgiving|newyear # PS1_HOLIDAY=christmas|easter|halloween|valentine|thanksgiving|newyear
# PS1_GIT=0|1
# Also reads config from /etc/ps1-style or ~/.config/ps1/style # Also reads config from /etc/ps1-style or ~/.config/ps1/style
_ps1_style_config() { _ps1_style_config() {
local cfg="" local cfg=""
@@ -112,6 +113,7 @@ _ps1_style_config() {
PS1_STYLE_PACK) export PS1_STYLE_PACK="$v" ;; PS1_STYLE_PACK) export PS1_STYLE_PACK="$v" ;;
PS1_CONTEST_LAYOUT) export PS1_CONTEST_LAYOUT="$v" ;; PS1_CONTEST_LAYOUT) export PS1_CONTEST_LAYOUT="$v" ;;
PS1_HOLIDAY) export PS1_HOLIDAY="$v" ;; PS1_HOLIDAY) export PS1_HOLIDAY="$v" ;;
PS1_GIT) export PS1_GIT="$v" ;;
esac esac
done < "$cfg" done < "$cfg"
fi fi
@@ -141,6 +143,75 @@ _ps1_holiday() {
echo "$holiday" echo "$holiday"
} }
_ps1_git_enabled() {
_ps1_style_config
local v="${PS1_GIT:-0}"
case "$v" in
1|y|Y|yes|YES|true|TRUE|on|ON) echo "1" ;;
*) echo "0" ;;
esac
}
_ps1_git_line_tail() {
if [[ "$(_ps1_git_enabled)" == "1" ]]; then
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
local info
info="$(__git_capsule)"
if [[ -n "$info" ]]; then
printf "%s " "$info"
return
fi
fi
printf " "
}
_ps1_context_badge() {
local parts=()
if [[ -n "${SSH_CONNECTION:-}" ]]; then
parts+=("ssh")
fi
if [[ -f /.dockerenv || -f /run/.containerenv ]]; then
parts+=("ctr")
fi
if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
parts+=("git")
fi
if ((${#parts[@]} == 0)); then
printf ""
return
fi
printf "[%s] " "$(IFS=:; echo "${parts[*]}")"
}
_ps1_glitch_glyph() {
local glyphs=( "≣" "∿" "⌁" "⋯" "⋆" "≡" )
local idx=$((10#$(date +%S) % ${#glyphs[@]}))
printf "%s" "${glyphs[$idx]}"
}
_ps1_path_topo() {
local p="${__PS1_PATH}"
local colors=(109 110 111 110)
local out=""
local idx=0
local IFS='/'
read -ra parts <<< "$p"
for part in "${parts[@]}"; do
if [[ -z "$part" ]]; then
out+="/"
continue
fi
local c="${colors[$((idx % ${#colors[@]}))]}"
out+="\[\e[38;5;${c}m\]${part}\[\e[0m\]/"
((idx++))
done
out="${out%/}"
printf "%s" "$out"
}
# ---- Load Git prompt helper (best effort) ---- # ---- Load Git prompt helper (best effort) ----
__try_source_git_prompt() { __try_source_git_prompt() {
local candidates=( local candidates=(
@@ -156,39 +227,44 @@ __try_source_git_prompt() {
__try_source_git_prompt >/dev/null 2>&1 __try_source_git_prompt >/dev/null 2>&1
__git_capsule() { __git_capsule() {
if ! declare -F __git_ps1 >/dev/null 2>&1; then
return 0
fi
local info status="" local info status=""
local clean="✨" local clean="✨"
local dirty="🔨" local dirty="🔨"
local staged="📌" local staged="📌"
local untracked="🧷" local untracked="🧷"
local stashed="📦" local stashed="📦"
local has_ps1=0
if declare -F __git_ps1 >/dev/null 2>&1; then
has_ps1=1
info="$(__git_ps1 "%s" 2>/dev/null)"
if [[ -z "$info" ]]; then
has_ps1=0
fi
fi
if [[ -z "$info" ]]; then
if command -v git >/dev/null 2>&1; then
info="$(git symbolic-ref --quiet --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)"
fi
fi
info="$(__git_ps1 "%s" 2>/dev/null)"
[[ -z "$info" ]] && return 0 [[ -z "$info" ]] && return 0
if [[ "$info" == *"*"* ]]; then status+=" $dirty"; fi if (( has_ps1 )); then
if [[ "$info" == *"+"* ]]; then status+=" $staged"; fi if [[ "$info" == *"*"* ]]; then status+=" $dirty"; fi
if [[ "$info" == *"%"* ]]; then status+=" $untracked"; fi if [[ "$info" == *"+"* ]]; then status+=" $staged"; fi
if [[ "$info" == *"$"* ]]; then status+=" $stashed"; fi if [[ "$info" == *"%"* ]]; then status+=" $untracked"; fi
if [[ -z "$status" ]]; then status=" $clean"; fi if [[ "$info" == *"$"* ]]; then status+=" $stashed"; fi
if [[ -z "$status" ]]; then status=" $clean"; fi
info="${info//\%/}" info="${info//\%/}"
info="${info//\*/}" info="${info//\*/}"
info="${info//\+/}" info="${info//\+/}"
info="${info//\$/}" info="${info//\$/}"
info="$(printf "%s" "$info" | xargs)"
printf " ⟦%s⟧%s" "$info" "$status"
}
__git_capsule() {
if declare -F __git_ps1 >/dev/null 2>&1; then
__git_ps1 " (%s)" 2>/dev/null
fi fi
info="$(printf "%s" "$info" | xargs)"
printf " ⟦%s⟧%s" "$info" "$status"
} }
# Time-based emoji with seasonal accents (Europe/Oslo) # Time-based emoji with seasonal accents (Europe/Oslo)
@@ -349,74 +425,98 @@ __PS1_STYLE="aurora"
__PS1_STYLE_PACK="standard" __PS1_STYLE_PACK="standard"
__PS1_CONTEST_LAYOUT="day-time-user" __PS1_CONTEST_LAYOUT="day-time-user"
__PS1_HOLIDAY="christmas" __PS1_HOLIDAY="christmas"
__PS1_GIT=0
_ps1_set_prompt() { _ps1_set_prompt() {
local RST="\[\e[0m\]" local RST="\[\e[0m\]"
# Seasonal palettes (Z1 is darker than Z2) # Seasonal palettes (Z1 is darker than Z2)
local Z1_BG Z1_FG Z2_BG Z2_FG PATH_FG FRAME local Z1_BG Z1_FG Z2_BG Z2_FG Z3_BG Z4_BG Z5_BG PATH_FG FRAME
local Z1_BG_CODE Z2_BG_CODE Z3_BG_CODE Z4_BG_CODE Z5_BG_CODE
if [[ "$__PS1_STYLE_PACK" == "contest" ]]; then if [[ "$__PS1_STYLE_PACK" == "contest" ]]; then
Z1_BG="\[\e[48;5;24m\]" Z1_BG_CODE=24
Z2_BG_CODE=31
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;31m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;51m\]" PATH_FG="\[\e[38;5;51m\]"
FRAME="\[\e[38;5;23m\]" FRAME="\[\e[38;5;23m\]"
elif [[ "$__PS1_STYLE_PACK" == "holiday" ]]; then elif [[ "$__PS1_STYLE_PACK" == "holiday" ]]; then
case "$__PS1_HOLIDAY" in case "$__PS1_HOLIDAY" in
christmas) christmas)
Z1_BG="\[\e[48;5;52m\]" Z1_BG_CODE=52
Z2_BG_CODE=28
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;28m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;194m\]" PATH_FG="\[\e[38;5;194m\]"
FRAME="\[\e[38;5;88m\]" FRAME="\[\e[38;5;88m\]"
;; ;;
easter) easter)
Z1_BG="\[\e[48;5;186m\]" Z1_BG_CODE=186
Z2_BG_CODE=150
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;16m\]" Z1_FG="\[\e[38;5;16m\]"
Z2_BG="\[\e[48;5;150m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;16m\]" Z2_FG="\[\e[38;5;16m\]"
PATH_FG="\[\e[38;5;94m\]" PATH_FG="\[\e[38;5;94m\]"
FRAME="\[\e[38;5;143m\]" FRAME="\[\e[38;5;143m\]"
;; ;;
halloween) halloween)
Z1_BG="\[\e[48;5;53m\]" Z1_BG_CODE=53
Z2_BG_CODE=166
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;166m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;16m\]" Z2_FG="\[\e[38;5;16m\]"
PATH_FG="\[\e[38;5;16m\]" PATH_FG="\[\e[38;5;16m\]"
FRAME="\[\e[38;5;89m\]" FRAME="\[\e[38;5;89m\]"
;; ;;
valentine) valentine)
Z1_BG="\[\e[48;5;198m\]" Z1_BG_CODE=198
Z2_BG_CODE=205
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;205m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;224m\]" PATH_FG="\[\e[38;5;224m\]"
FRAME="\[\e[38;5;162m\]" FRAME="\[\e[38;5;162m\]"
;; ;;
thanksgiving) thanksgiving)
Z1_BG="\[\e[48;5;94m\]" Z1_BG_CODE=94
Z2_BG_CODE=136
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;230m\]" Z1_FG="\[\e[38;5;230m\]"
Z2_BG="\[\e[48;5;136m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;231m\]" Z2_FG="\[\e[38;5;231m\]"
PATH_FG="\[\e[38;5;223m\]" PATH_FG="\[\e[38;5;223m\]"
FRAME="\[\e[38;5;130m\]" FRAME="\[\e[38;5;130m\]"
;; ;;
newyear) newyear)
Z1_BG="\[\e[48;5;17m\]" Z1_BG_CODE=17
Z2_BG_CODE=20
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;20m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;229m\]" PATH_FG="\[\e[38;5;229m\]"
FRAME="\[\e[38;5;19m\]" FRAME="\[\e[38;5;19m\]"
;; ;;
*) *)
Z1_BG="\[\e[48;5;24m\]" Z1_BG_CODE=24
Z2_BG_CODE=31
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;31m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
Z3_BG_CODE="${Z2_BG_CODE}"
Z4_BG_CODE="${Z2_BG_CODE}"
Z5_BG_CODE="${Z2_BG_CODE}"
Z3_BG="\[\e[48;5;${Z3_BG_CODE}m\]"
Z4_BG="\[\e[48;5;${Z4_BG_CODE}m\]"
Z5_BG="\[\e[48;5;${Z5_BG_CODE}m\]"
PATH_FG="\[\e[38;5;51m\]" PATH_FG="\[\e[38;5;51m\]"
FRAME="\[\e[38;5;23m\]" FRAME="\[\e[38;5;23m\]"
;; ;;
@@ -424,36 +524,68 @@ _ps1_set_prompt() {
else else
case "$__PS1_SEASON" in case "$__PS1_SEASON" in
spring) spring)
Z1_BG="\[\e[48;5;71m\]" Z1_BG_CODE=68
Z2_BG_CODE=70
Z3_BG_CODE=72
Z4_BG_CODE=121
Z5_BG_CODE=120
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;120m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;22m\]" Z2_FG="\[\e[38;5;22m\]"
PATH_FG="\[\e[38;5;22m\]" Z3_BG="\[\e[48;5;${Z3_BG_CODE}m\]"
Z4_BG="\[\e[48;5;${Z4_BG_CODE}m\]"
Z5_BG="\[\e[48;5;${Z5_BG_CODE}m\]"
PATH_FG="\[\e[38;5;28m\]"
FRAME="\[\e[38;5;65m\]" FRAME="\[\e[38;5;65m\]"
;; ;;
summer) summer)
Z1_BG="\[\e[48;5;142m\]" Z1_BG_CODE=141
Z2_BG_CODE=142
Z3_BG_CODE=143
Z4_BG_CODE=214
Z5_BG_CODE=208
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;214m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;0m\]" Z2_FG="\[\e[38;5;0m\]"
PATH_FG="\[\e[38;5;232m\]" Z3_BG="\[\e[48;5;${Z3_BG_CODE}m\]"
Z4_BG="\[\e[48;5;${Z4_BG_CODE}m\]"
Z5_BG="\[\e[48;5;${Z5_BG_CODE}m\]"
PATH_FG="\[\e[38;5;0m\]"
FRAME="\[\e[38;5;130m\]" FRAME="\[\e[38;5;130m\]"
;; ;;
autumn) autumn)
Z1_BG="\[\e[48;5;95m\]" Z1_BG_CODE=93
Z2_BG_CODE=95
Z3_BG_CODE=97
Z4_BG_CODE=166
Z5_BG_CODE=136
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;173m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
Z3_BG="\[\e[48;5;${Z3_BG_CODE}m\]"
Z4_BG="\[\e[48;5;${Z4_BG_CODE}m\]"
Z5_BG="\[\e[48;5;${Z5_BG_CODE}m\]"
PATH_FG="\[\e[38;5;223m\]" PATH_FG="\[\e[38;5;223m\]"
FRAME="\[\e[38;5;95m\]" FRAME="\[\e[38;5;95m\]"
;; ;;
*) *)
# winter (default) # winter (default)
Z1_BG="\[\e[48;5;61m\]" Z1_BG_CODE=59
Z2_BG_CODE=61
Z3_BG_CODE=63
Z4_BG_CODE=38
Z5_BG_CODE=37
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]" Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;37m\]" Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]" Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;194m\]" Z3_BG="\[\e[48;5;${Z3_BG_CODE}m\]"
Z4_BG="\[\e[48;5;${Z4_BG_CODE}m\]"
Z5_BG="\[\e[48;5;${Z5_BG_CODE}m\]"
PATH_FG="\[\e[38;5;152m\]"
FRAME="\[\e[38;5;60m\]" FRAME="\[\e[38;5;60m\]"
;; ;;
esac esac
@@ -480,6 +612,10 @@ _ps1_set_prompt() {
fi fi
local style="${__PS1_STYLE:-aurora}" local style="${__PS1_STYLE:-aurora}"
local git_tail=""
if [[ "$style" != "git" ]]; then
git_tail="$(_ps1_git_line_tail)"
fi
local L1="\\d \\A \\u" local L1="\\d \\A \\u"
local L_HOST="@\\h" local L_HOST="@\\h"
local PREFIX="" local PREFIX=""
@@ -487,14 +623,16 @@ _ps1_set_prompt() {
local PATH_PART="${__PS1_PATH}" local PATH_PART="${__PS1_PATH}"
local PATH_SEP=" " local PATH_SEP=" "
local END_PAD=" " local END_PAD=" "
if [[ "$__PS1_STYLE_PACK" == "contest" || "$__PS1_STYLE_PACK" == "holiday" ]]; then local layout="${__PS1_CONTEST_LAYOUT:-day-time-user}"
local layout="${__PS1_CONTEST_LAYOUT:-day-time-user}" if [[ "$__PS1_STYLE_PACK" == "contest" || "$__PS1_STYLE_PACK" == "holiday" || "$__PS1_STYLE_PACK" == "standard" ]]; then
case "$layout" in case "$layout" in
user-time) L1="\\u \\A" ;; user-time) L1="\\u \\A" ;;
time-user) L1="\\A \\u" ;; time-user) L1="\\A \\u" ;;
day-time) L1="\\d \\A" ;; day-time) L1="\\d \\A" ;;
*) L1="\\d \\A \\u" ;; *) L1="\\d \\A \\u" ;;
esac esac
fi
if [[ "$__PS1_STYLE_PACK" == "contest" || "$__PS1_STYLE_PACK" == "holiday" ]]; then
HOST_PART="@\\h - ${__PS1_PATH}" HOST_PART="@\\h - ${__PS1_PATH}"
PATH_PART="" PATH_PART=""
PATH_SEP="" PATH_SEP=""
@@ -503,30 +641,58 @@ _ps1_set_prompt() {
case "$style" in case "$style" in
neon) neon)
local N1_BG="\[\e[48;5;201m\]" local N1_BG_CODE=201
local N2_BG_CODE=45
local N1_BG="\[\e[48;5;${N1_BG_CODE}m\]"
local N1_FG="\[\e[38;5;255m\]" local N1_FG="\[\e[38;5;255m\]"
local N2_BG="\[\e[48;5;45m\]" local N2_BG="\[\e[48;5;${N2_BG_CODE}m\]"
local N2_FG="\[\e[38;5;16m\]" local N2_FG="\[\e[38;5;16m\]"
local N_PATH_FG="\[\e[38;5;16m\]" local N_PATH_FG="\[\e[38;5;16m\]"
local N_FRAME="\[\e[38;5;199m\]" local N_FRAME="\[\e[38;5;199m\]"
local N_LEFT="${left}"
local N_RIGHT="${right}"
local N_SEP="${sep}"
local N_LEFT_FG=""
local N_RIGHT_FG=""
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
N_LEFT=""
N_RIGHT=""
N_SEP=""
N_LEFT_FG="\[\e[38;5;${N1_BG_CODE}m\]"
N_RIGHT_FG="\[\e[38;5;${N2_BG_CODE}m\]"
fi
PS1="\ PS1="\
${PREFIX}${N_FRAME}╭─${RST}\ ${PREFIX}${N_FRAME}╭─${RST}\
${N1_BG}${N1_FG}${left} ${BOLD}\\u${NOBOLD} \\d \\A ${RST}${N1_BG}${N2_BG}${N2_FG}${sep}${RST}\ ${N_LEFT_FG}${N_LEFT}${RST}${N1_BG}${N1_FG} ${BOLD}\\u${NOBOLD} \\d \\A ${RST}${N1_BG}${N2_BG}${N2_FG}${N_SEP}${RST}\
${N2_BG}${N2_FG} ${HOST_PART}${PATH_SEP}${N_PATH_FG}${PATH_PART}${END_PAD}${right}${RST}\ ${N2_BG}${N2_FG} ${HOST_PART}${PATH_SEP}${N_PATH_FG}${PATH_PART}${END_PAD}${RST}${N_RIGHT_FG}${N_RIGHT}${RST}\
\n${N_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " \n${N_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;; ;;
forge) forge)
local F1_BG="\[\e[48;5;94m\]" local F1_BG_CODE=94
local F2_BG_CODE=166
local F1_BG="\[\e[48;5;${F1_BG_CODE}m\]"
local F1_FG="\[\e[38;5;230m\]" local F1_FG="\[\e[38;5;230m\]"
local F2_BG="\[\e[48;5;166m\]" local F2_BG="\[\e[48;5;${F2_BG_CODE}m\]"
local F2_FG="\[\e[38;5;231m\]" local F2_FG="\[\e[38;5;231m\]"
local F_PATH_FG="\[\e[38;5;224m\]" local F_PATH_FG="\[\e[38;5;224m\]"
local F_FRAME="\[\e[38;5;130m\]" local F_FRAME="\[\e[38;5;130m\]"
local F_LEFT="${left}"
local F_RIGHT="${right}"
local F_SEP="${sep}"
local F_LEFT_FG=""
local F_RIGHT_FG=""
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
F_LEFT=""
F_RIGHT=""
F_SEP=""
F_LEFT_FG="\[\e[38;5;${F1_BG_CODE}m\]"
F_RIGHT_FG="\[\e[38;5;${F2_BG_CODE}m\]"
fi
PS1="\ PS1="\
${PREFIX}${F_FRAME}╭─${RST}\ ${PREFIX}${F_FRAME}╭─${RST}\
${F1_BG}${F1_FG}${left} ${BOLD}${L1}${NOBOLD} ${RST}${F1_BG}${F2_BG}${F2_FG}${sep}${RST}\ ${F_LEFT_FG}${F_LEFT}${RST}${F1_BG}${F1_FG} ${BOLD}${L1}${NOBOLD} ${RST}${F1_BG}${F2_BG}${F2_FG}${F_SEP}${RST}\
${F2_BG}${F2_FG} ${HOST_PART}${PATH_SEP}${F_PATH_FG}${PATH_PART}${END_PAD}${right}${RST}\ ${F2_BG}${F2_FG} ${HOST_PART}${PATH_SEP}${F_PATH_FG}${PATH_PART}${END_PAD}${RST}${F_RIGHT_FG}${F_RIGHT}${RST}\
\n${F_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " \n${F_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;; ;;
circuit) circuit)
local C_FG="\[\e[38;5;46m\]" local C_FG="\[\e[38;5;46m\]"
@@ -535,14 +701,14 @@ ${F2_BG}${F2_FG} ${HOST_PART}${PATH_SEP}${F_PATH_FG}${PATH_PART}${END_PAD}${righ
PS1="\ PS1="\
${PREFIX}${C_DIM}┏━${RST}${C_FG}[${BOLD}\\u${NOBOLD} ${RST}${C_FG}\\A${RST}${C_DIM}]${RST}\ ${PREFIX}${C_DIM}┏━${RST}${C_FG}[${BOLD}\\u${NOBOLD} ${RST}${C_FG}\\A${RST}${C_DIM}]${RST}\
${C_DIM}${RST}${C_FG}${HOST_PART}${RST}${PATH_SEP}${C_PATH}${PATH_PART}${RST}\ ${C_DIM}${RST}${C_FG}${HOST_PART}${RST}${PATH_SEP}${C_PATH}${PATH_PART}${RST}\
\n${C_DIM}┗━${RST}${prompt_sym} ${__PS1_SYM} " \n${C_DIM}┗━${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;; ;;
mono) mono)
local M_FG="\[\e[38;5;250m\]" local M_FG="\[\e[38;5;250m\]"
local M_DIM="\[\e[38;5;240m\]" local M_DIM="\[\e[38;5;240m\]"
PS1="\ PS1="\
${PREFIX}${M_FG}${L1}${M_DIM}${HOST_PART}${PATH_SEP}${M_FG}${PATH_PART}${RST}\ ${PREFIX}${M_FG}${L1}${M_DIM}${HOST_PART}${PATH_SEP}${M_FG}${PATH_PART}${RST}\
\n${M_DIM}└─${RST}${prompt_sym} ${__PS1_SYM} " \n${M_DIM}└─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;; ;;
git) git)
export GIT_PS1_SHOWDIRTYSTATE=1 export GIT_PS1_SHOWDIRTYSTATE=1
@@ -555,14 +721,17 @@ ${PREFIX}${M_FG}⟦${L1}⟧ ${M_DIM}${HOST_PART}${PATH_SEP}${M_FG}${PATH_PART}${
local G_Z2_FG="\[\e[38;5;255m\]" local G_Z2_FG="\[\e[38;5;255m\]"
local G_PATH_FG="\[\e[38;5;194m\]" local G_PATH_FG="\[\e[38;5;194m\]"
local GIT_INFO="$(__git_capsule)" local GIT_INFO="$(__git_capsule)"
local G_LEFT="[" local G_LEFT=""
local G_RIGHT="]" local G_RIGHT=""
local G_SEP="" local G_SEP=""
local G_END_PAD=" "
local G_LEFT_FG="\[\e[38;5;61m\]"
local G_RIGHT_FG="\[\e[38;5;37m\]"
PS1="\ PS1="\
${PREFIX}${G_FRAME}╭─${RST}\ ${PREFIX}${G_FRAME}╭─${RST}\
${G_Z1_BG}${G_Z1_FG}${G_LEFT} ${L1} ${RST}${G_Z1_BG}${G_Z2_BG}${G_Z2_FG}${G_SEP}${RST}\ ${G_LEFT_FG}${G_LEFT}${RST}${G_Z1_BG}${G_Z1_FG} ${L1} ${RST}${G_Z1_BG}${G_Z2_BG}${G_Z2_FG}${G_SEP}${RST}\
${G_Z2_BG}${G_Z2_FG} ${HOST_PART}${PATH_SEP}${G_PATH_FG}${PATH_PART}${END_PAD}${G_RIGHT}${RST}\ ${G_Z2_BG}${G_Z2_FG} ${HOST_PART}${PATH_SEP}${G_PATH_FG}${PATH_PART}${G_END_PAD}${RST}${G_RIGHT_FG}${G_RIGHT}${RST}\
\n${G_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${GIT_INFO} " \n${G_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} ${GIT_INFO} "
;; ;;
hawolex) hawolex)
local H_FRAME="\[\e[38;5;24m\]" local H_FRAME="\[\e[38;5;24m\]"
@@ -571,19 +740,201 @@ ${G_Z2_BG}${G_Z2_FG} ${HOST_PART}${PATH_SEP}${G_PATH_FG}${PATH_PART}${END_PAD}${
local H_Z2_BG="\[\e[48;5;31m\]" local H_Z2_BG="\[\e[48;5;31m\]"
local H_Z2_FG="\[\e[38;5;255m\]" local H_Z2_FG="\[\e[38;5;255m\]"
local H_PATH_FG="\[\e[38;5;230m\]" local H_PATH_FG="\[\e[38;5;230m\]"
local H_LEFT=""
local H_RIGHT=""
local H_SEP=""
local H_LEFT_FG="\[\e[38;5;54m\]"
local H_RIGHT_FG="\[\e[38;5;31m\]"
PS1="\ PS1="\
${PREFIX}${H_FRAME}╭─${RST}\ ${PREFIX}${H_FRAME}╭─${RST}\
${H_Z1_BG}${H_Z1_FG}${left} ${L1} ${RST}${H_Z1_BG}${H_Z2_BG}${H_Z2_FG}${sep}${RST}\ ${H_LEFT_FG}${H_LEFT}${RST}${H_Z1_BG}${H_Z1_FG} ${L1} ${RST}${H_Z1_BG}${H_Z2_BG}${H_Z2_FG}${H_SEP}${RST}\
${H_Z2_BG}${H_Z2_FG} ${HOST_PART}${PATH_SEP}${H_PATH_FG}${PATH_PART}${END_PAD}${right}${RST}\ ${H_Z2_BG}${H_Z2_FG} ${HOST_PART}${PATH_SEP}${H_PATH_FG}${PATH_PART}${END_PAD}${RST}${H_RIGHT_FG}${H_RIGHT}${RST}\
\n${H_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " \n${H_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
hawolexv2)
local HV2_FRAME="\[\e[38;5;24m\]"
local HV2_1_BG="\[\e[48;5;54m\]"
local HV2_1_FG="\[\e[38;5;255m\]"
local HV2_2_BG="\[\e[48;5;55m\]"
local HV2_2_FG="\[\e[38;5;255m\]"
local HV2_3_BG="\[\e[48;5;56m\]"
local HV2_3_FG="\[\e[38;5;255m\]"
local HV2_4_BG="\[\e[48;5;31m\]"
local HV2_4_FG="\[\e[38;5;255m\]"
local HV2_5_BG="\[\e[48;5;30m\]"
local HV2_PATH_FG="\[\e[38;5;230m\]"
local HV2_LEFT="${left}"
local HV2_RIGHT="${right}"
local HV2_SEP="${sep}"
local HV2_LEFT_FG=""
local HV2_RIGHT_FG=""
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
HV2_LEFT=""
HV2_RIGHT=""
HV2_SEP=""
HV2_LEFT_FG="\[\e[38;5;54m\]"
HV2_RIGHT_FG="\[\e[38;5;30m\]"
fi
local HV2_SEP12="\[\e[38;5;55m\]\[\e[48;5;54m\]${HV2_SEP}${RST}"
local HV2_SEP23="\[\e[38;5;56m\]\[\e[48;5;55m\]${HV2_SEP}${RST}"
local HV2_SEP34="\[\e[38;5;31m\]\[\e[48;5;56m\]${HV2_SEP}${RST}"
local HV2_SEP45="\[\e[38;5;30m\]\[\e[48;5;31m\]${HV2_SEP}${RST}"
local HV2_P1="" HV2_P2="" HV2_P3=""
local HV2_LAYOUT="${__PS1_CONTEST_LAYOUT:-day-time-user}"
if [[ "$__PS1_STYLE_PACK" == "contest" || "$__PS1_STYLE_PACK" == "holiday" ]]; then
case "$HV2_LAYOUT" in
user-time) HV2_P1="\\u"; HV2_P2="\\A" ;;
time-user) HV2_P1="\\A"; HV2_P2="\\u" ;;
day-time) HV2_P1="\\d"; HV2_P2="\\A" ;;
*) HV2_P1="\\d"; HV2_P2="\\A"; HV2_P3="\\u" ;;
esac
else
HV2_P1="\\d"; HV2_P2="\\A"; HV2_P3="\\u"
fi
local HV2_HOST="@\\h"
local HV2_PATH_PREFIX=""
if [[ "$__PS1_STYLE_PACK" == "contest" || "$__PS1_STYLE_PACK" == "holiday" ]]; then
HV2_PATH_PREFIX="- "
fi
if [[ -n "$HV2_P3" ]]; then
PS1="\
${PREFIX}${HV2_FRAME}╭─${RST}\
${HV2_LEFT_FG}${HV2_LEFT}${RST}${HV2_1_BG}${HV2_1_FG} ${HV2_P1} ${RST}${HV2_SEP12}${HV2_2_BG}${HV2_2_FG} ${HV2_P2} ${RST}${HV2_SEP23}${HV2_3_BG}${HV2_3_FG} ${HV2_P3} ${RST}${HV2_SEP34}${HV2_4_BG}${HV2_4_FG} ${HV2_HOST} ${RST}${HV2_SEP45}${HV2_5_BG}${HV2_PATH_FG} ${HV2_PATH_PREFIX}${__PS1_PATH}${END_PAD}${RST}${HV2_RIGHT_FG}${HV2_RIGHT}${RST}\
\n${HV2_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
else
PS1="\
${PREFIX}${HV2_FRAME}╭─${RST}\
${HV2_LEFT_FG}${HV2_LEFT}${RST}${HV2_1_BG}${HV2_1_FG} ${HV2_P1} ${RST}${HV2_SEP12}${HV2_2_BG}${HV2_2_FG} ${HV2_P2} ${RST}${HV2_SEP23}${HV2_3_BG}${HV2_3_FG} ${HV2_HOST} ${RST}${HV2_SEP34}${HV2_4_BG}${HV2_4_FG} ${HV2_PATH_PREFIX}${__PS1_PATH}${END_PAD}${RST}${HV2_RIGHT_FG}${HV2_RIGHT}${RST}\
\n${HV2_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
fi
;;
radar)
local R_FRAME="\[\e[38;5;22m\]"
local R_MAIN="\[\e[38;5;46m\]"
local R_DIM="\[\e[38;5;28m\]"
local R_PATH="\[\e[38;5;120m\]"
PS1="\
${R_FRAME}╭─${RST}${R_MAIN}⟦\\u \\A⟧ ${R_DIM}@\\h ${R_PATH}${__PS1_PATH}${RST}\
\n${R_FRAME}╰─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
synthwave)
local SW_FRAME="\[\e[38;5;201m\]"
local SW1_BG="\[\e[48;5;198m\]"
local SW1_FG="\[\e[38;5;255m\]"
local SW2_BG="\[\e[48;5;45m\]"
local SW2_FG="\[\e[38;5;16m\]"
local SW3_BG="\[\e[48;5;208m\]"
local SW3_FG="\[\e[38;5;16m\]"
local SW_LEFT="${left}"
local SW_RIGHT="${right}"
local SW_SEP="${sep}"
local SW_LEFT_FG=""
local SW_RIGHT_FG=""
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
SW_LEFT=""
SW_RIGHT=""
SW_SEP=""
SW_LEFT_FG="\[\e[38;5;198m\]"
SW_RIGHT_FG="\[\e[38;5;208m\]"
fi
local SW_SEP12="\[\e[38;5;45m\]\[\e[48;5;198m\]${SW_SEP}${RST}"
local SW_SEP23="\[\e[38;5;208m\]\[\e[48;5;45m\]${SW_SEP}${RST}"
PS1="\
${SW_FRAME}╭─${RST}\
${SW_LEFT_FG}${SW_LEFT}${RST}${SW1_BG}${SW1_FG} ${L1} ${RST}${SW_SEP12}${SW2_BG}${SW2_FG} ${L_HOST} ${RST}${SW_SEP23}${SW3_BG}${SW3_FG} ${__PS1_PATH}${END_PAD}${RST}${SW_RIGHT_FG}${SW_RIGHT}${RST}\
\n${SW_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
noir)
local N_FRAME="\[\e[38;5;236m\]"
local N_MAIN="\[\e[38;5;250m\]"
local N_DIM="\[\e[38;5;242m\]"
local N_PATH="\[\e[38;5;160m\]"
PS1="\
${N_FRAME}╭─${RST}${N_MAIN}${L1}${RST} ${N_DIM}${L_HOST}${RST} ${N_PATH}${__PS1_PATH}${RST}\
\n${N_FRAME}╰─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
topo)
local T_FRAME="\[\e[38;5;24m\]"
local T_MAIN="\[\e[38;5;248m\]"
PS1="\
${T_FRAME}╭─${RST}${T_MAIN}${L1}${RST} ${T_FRAME}${L_HOST}${RST} $(_ps1_path_topo)${END_PAD}${RST}\
\n${T_FRAME}╰─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
glitch)
local G_FRAME="\[\e[38;5;129m\]"
local G_MAIN="\[\e[38;5;118m\]"
local G_DIM="\[\e[38;5;60m\]"
local G_SEP="$(_ps1_glitch_glyph)"
PS1="\
${G_FRAME}╭─${RST}${G_MAIN}${L1}${RST} ${G_DIM}${G_SEP}${RST} ${G_MAIN}${L_HOST} ${RST}${G_DIM}${G_SEP}${RST} ${G_MAIN}${__PS1_PATH}${RST}\
\n${G_FRAME}╰─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
arcticfire)
local AF_FRAME="\[\e[38;5;25m\]"
local AF1_BG="\[\e[48;5;24m\]"
local AF1_FG="\[\e[38;5;255m\]"
local AF2_BG="\[\e[48;5;31m\]"
local AF2_FG="\[\e[38;5;255m\]"
local AF3_BG="\[\e[48;5;208m\]"
local AF3_FG="\[\e[38;5;16m\]"
local AF_LEFT="${left}"
local AF_RIGHT="${right}"
local AF_SEP="${sep}"
local AF_LEFT_FG=""
local AF_RIGHT_FG=""
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
AF_LEFT=""
AF_RIGHT=""
AF_SEP=""
AF_LEFT_FG="\[\e[38;5;24m\]"
AF_RIGHT_FG="\[\e[38;5;208m\]"
fi
local AF_SEP12="\[\e[38;5;31m\]\[\e[48;5;24m\]${AF_SEP}${RST}"
local AF_SEP23="\[\e[38;5;208m\]\[\e[48;5;31m\]${AF_SEP}${RST}"
PS1="\
${AF_FRAME}╭─${RST}\
${AF_LEFT_FG}${AF_LEFT}${RST}${AF1_BG}${AF1_FG} ${L1} ${RST}${AF_SEP12}${AF2_BG}${AF2_FG} ${L_HOST} ${RST}${AF_SEP23}${AF3_BG}${AF3_FG} ${__PS1_PATH}${END_PAD}${RST}${AF_RIGHT_FG}${AF_RIGHT}${RST}\
\n${AF_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
acidlime)
local AL_FRAME="\[\e[38;5;46m\]"
local AL_MAIN="\[\e[38;5;46m\]"
local AL_DIM="\[\e[38;5;40m\]"
local AL_PATH="\[\e[38;5;118m\]"
PS1="\
${AL_FRAME}╭─${RST}${AL_MAIN}${L1}${RST} ${AL_DIM}${L_HOST}${RST} ${AL_PATH}${__PS1_PATH}${RST}\
\n${AL_FRAME}╰─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;; ;;
*) *)
# aurora (default) # aurora (default)
PS1="\ local A_LEFT="${left}"
local A_RIGHT="${right}"
local A_SEP="${sep}"
local A_LEFT_FG=""
local A_RIGHT_FG=""
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
A_LEFT=""
A_RIGHT=""
A_SEP=""
A_LEFT_FG="\[\e[38;5;${Z1_BG_CODE}m\]"
A_RIGHT_FG="\[\e[38;5;${Z5_BG_CODE:-$Z2_BG_CODE}m\]"
fi
if [[ "$__PS1_STYLE_PACK" == "standard" && "$__PS1_USE_NF" -eq 1 ]]; then
local SEP12="\[\e[38;5;${Z2_BG_CODE}m\]\[\e[48;5;${Z1_BG_CODE}m\]${A_SEP}${RST}"
local SEP23="\[\e[38;5;${Z3_BG_CODE}m\]\[\e[48;5;${Z2_BG_CODE}m\]${A_SEP}${RST}"
local SEP34="\[\e[38;5;${Z4_BG_CODE}m\]\[\e[48;5;${Z3_BG_CODE}m\]${A_SEP}${RST}"
local SEP45="\[\e[38;5;${Z5_BG_CODE}m\]\[\e[48;5;${Z4_BG_CODE}m\]${A_SEP}${RST}"
PS1="\
${PREFIX}${FRAME}╭─${RST}\ ${PREFIX}${FRAME}╭─${RST}\
${Z1_BG}${Z1_FG}${left} ${L1} ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${sep}${RST}\ ${A_LEFT_FG}${A_LEFT}${RST}${Z1_BG}${Z1_FG} \\d ${RST}${SEP12}${Z2_BG}${Z1_FG} \\A ${RST}${SEP23}${Z3_BG}${Z1_FG} \\u ${RST}${SEP34}${Z4_BG}${Z2_FG} ${L_HOST} ${RST}${SEP45}${Z5_BG}${PATH_FG} ${__PS1_PATH}${END_PAD}${RST}${A_RIGHT_FG}${A_RIGHT}${RST}\
${Z2_BG}${Z2_FG} ${HOST_PART}${PATH_SEP}${PATH_FG}${PATH_PART}${END_PAD}${right}${RST}\ \n${FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
\n${FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " else
PS1="\
${PREFIX}${FRAME}╭─${RST}\
${A_LEFT_FG}${A_LEFT}${RST}${Z1_BG}${Z1_FG} ${L1} ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${A_SEP}${RST}\
${Z2_BG}${Z2_FG} ${HOST_PART}${PATH_SEP}${PATH_FG}${PATH_PART}${END_PAD}${RST}${A_RIGHT_FG}${A_RIGHT}${RST}\
\n${FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
fi
;; ;;
esac esac
} }
@@ -595,6 +946,7 @@ _ps1_update() {
__PS1_CONTEST_LAYOUT="$(_ps1_contest_layout)" __PS1_CONTEST_LAYOUT="$(_ps1_contest_layout)"
__PS1_HOLIDAY="$(_ps1_holiday)" __PS1_HOLIDAY="$(_ps1_holiday)"
__PS1_STYLE="$(_ps1_style)" __PS1_STYLE="$(_ps1_style)"
__PS1_GIT="${PS1_GIT:-0}"
__PS1_SYM="$(_ps1_symbol)" __PS1_SYM="$(_ps1_symbol)"
__PS1_PATH="$(_ps1_path)" __PS1_PATH="$(_ps1_path)"
if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi

BIN
images/themes/acidlime.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
images/themes/aurora.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
images/themes/christmas.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
images/themes/circuit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
images/themes/easter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
images/themes/forge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
images/themes/git.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
images/themes/glitch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
images/themes/halloween.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
images/themes/hawolex.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
images/themes/hawolexv2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
images/themes/mono.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
images/themes/neon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
images/themes/newyear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
images/themes/noir.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
images/themes/radar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
images/themes/synthwave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
images/themes/topo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
images/themes/valentine.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

464
libary.md Normal file
View File

@@ -0,0 +1,464 @@
# Theme Library
This file lists every prompt theme, color codes, design intent, and configuration options.
## Git Capsule (optional, all themes)
What it is: a compact git status block shown on line 2 when you're inside a git repo.
It uses `__git_ps1` when available, with a safe fallback to `git rev-parse` for the branch.
States + emojis (plain language):
- Clean repo: ✨ no local changes; your files match the last commit
- Dirty working tree: 🔨 you edited tracked files but havent staged them yet
- Staged changes: 📌 changes are staged and ready to commit
- Untracked files: 🧷 new files git hasnt started tracking
- Stashed changes: 📦 work saved with `git stash` (not in your working tree)
How it works:
- The capsule only renders when a repo is detected (no extra noise outside git).
- If `__git_ps1` is available, it reads git state flags and maps them to emojis.
- If not, it falls back to the current branch/short SHA (still useful, but fewer states).
Best practices:
- Keep the capsule on during active work; it surfaces risk at a glance.
- If you want faster prompts in very large repos, leave untracked detection off.
- Use the Git theme for a minimal, work-safe look with the capsule always enabled.
## Seasonal (Aurora, Standard Pack)
Design intent: calm, readable, long-session comfort with a subtle five-step gradient
(date -> time -> user -> host -> path).
Layout: two-line powerline, host+path on line 1, status + emoji on line 2.
Winter:
![Winter](./images/themes/season-winter.png)
Emoji:
- Set: sunrise 🏔️ 🌨️ ❄️ 🌌; work 🎿 ⛷️ 🏂 🧊; coffee ☕; evening 🌆; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=59 Z2_BG=61 Z3_BG=63 Z4_BG=38 Z5_BG=37
Z1_FG=255 Z2_FG=255
PATH_FG=152
FRAME=60
```
Spring:
![Spring](./images/themes/season-spring.png)
Emoji:
- Set: sunrise 🌷 🌱 🐣 🌤; work 🌿 🪴 🐝 🌼; coffee ☕; evening 🌤; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=68 Z2_BG=70 Z3_BG=72 Z4_BG=121 Z5_BG=120
Z1_FG=255 Z2_FG=22
PATH_FG=28
FRAME=65
```
Summer:
![Summer](./images/themes/season-summer.png)
Emoji:
- Set: sunrise 🌞 🏖️ 🌅 🌤; work 🏄 🏖️ 🚤 🌴; coffee 🧃; evening 🌇; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=141 Z2_BG=142 Z3_BG=143 Z4_BG=214 Z5_BG=208
Z1_FG=255 Z2_FG=0
PATH_FG=0
FRAME=130
```
Autumn:
![Autumn](./images/themes/season-autumn.png)
Emoji:
- Set: sunrise 🍁 🍂 🌫️ 🌦️; work 🍂 🍄 🎃 🪵; coffee ☕; evening 🌆; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=93 Z2_BG=95 Z3_BG=97 Z4_BG=166 Z5_BG=136
Z1_FG=255 Z2_FG=255
PATH_FG=223
FRAME=95
```
## Contest Pack (style_pack=contest)
Design intent: high-contrast silhouettes, fast scanning, stage-ready presence.
Layout: configurable order for the left segment, always ends with "@host - /path".
Aurora (contest palette):
![Aurora (contest)](./images/themes/aurora.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=24 Z2_BG=31
Z1_FG=255 Z2_FG=255
PATH_FG=51
FRAME=23
```
Neon:
![Neon](./images/themes/neon.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=201 Z1_FG=255
Z2_BG=45 Z2_FG=16
PATH_FG=16
FRAME=199
```
Forge:
![Forge](./images/themes/forge.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=94 Z1_FG=230
Z2_BG=166 Z2_FG=231
PATH_FG=224
FRAME=130
```
Circuit:
![Circuit](./images/themes/circuit.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
FG_MAIN=46
FG_DIM=22
PATH_FG=120
```
Mono:
![Mono](./images/themes/mono.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
FG_MAIN=250
FG_DIM=240
```
Git:
![Git](./images/themes/git.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=61 Z1_FG=255
Z2_BG=37 Z2_FG=255
PATH_FG=194
FRAME=60
```
Hawolex:
![Hawolex](./images/themes/hawolex.png)
Emoji:
- Set: sunrise 💻 🚗 🔊 🎮; work 🎧 🕹️ 📟 🧩; coffee ☕; evening 🌆; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=54 Z1_FG=255
Z2_BG=31 Z2_FG=255
PATH_FG=230
FRAME=24
```
HawolexV2 (gradient):
![HawolexV2](./images/themes/hawolexv2.png)
Emoji:
- Set: sunrise ⚡️ 🛰️ 🧬 🧠; work 🛠️ 💾 🧪 🧩; coffee ☕; evening 🎛️; night 🕶️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=54 Z2_BG=55 Z3_BG=56 Z4_BG=31 Z5_BG=30
Z_FG=255
PATH_FG=230
FRAME=24
```
## Holidays Pack (style_pack=holiday)
Design intent: themed color + emoji without sacrificing readability.
Layout uses contest order and ends with "@host - /path".
Christmas:
![Christmas](./images/themes/christmas.png)
Emoji:
- Set: sunrise 🎄 🎅 ❄️ ⛄; work 🎁 🧤 🧣 🦌; coffee ☕; evening 🌟; night 🕯️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=52 Z2_BG=28
Z1_FG=255 Z2_FG=255
PATH_FG=194
FRAME=88
```
Easter:
![Easter](./images/themes/easter.png)
Emoji:
- Set: sunrise 🐣 🥚 🌷 🌤; work 🐰 🌼 🧺 🍫; coffee ☕; evening 🌅; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=186 Z2_BG=150
Z1_FG=16 Z2_FG=16
PATH_FG=94
FRAME=143
```
Halloween:
![Halloween](./images/themes/halloween.png)
Emoji:
- Set: sunrise 🎃 🦇 🌕 🕸️; work 👻 💀 🕯️ 🧪; coffee ☕; evening 🌆; night 🕷️
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=53 Z2_BG=166
Z1_FG=255 Z2_FG=16
PATH_FG=16
FRAME=89
```
Valentine:
![Valentine](./images/themes/valentine.png)
Emoji:
- Set: sunrise 💖 🌹 💘 💕; work 💌 🍫 🕊️ 💗; coffee ☕; evening 🌆; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=198 Z2_BG=205
Z1_FG=255 Z2_FG=255
PATH_FG=224
FRAME=162
```
Thanksgiving:
![Thanksgiving](./images/themes/thanksgiving.png)
Emoji:
- Set: sunrise 🦃 🍁 🥧 🍂; work 🍽️ 🌾 🧺 🥖; coffee ☕; evening 🌆; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=94 Z2_BG=136
Z1_FG=230 Z2_FG=231
PATH_FG=223
FRAME=130
```
NewYear:
![NewYear](./images/themes/newyear.png)
Emoji:
- Set: sunrise 🎆 🥂 🎇 ✨; work 🗓️ ⏳ 🚀 ✨; coffee ☕; evening 🌆; night 🌙
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=17 Z2_BG=20
Z1_FG=255 Z2_FG=255
PATH_FG=229
FRAME=19
```
## Custom Pack (style_pack=custom)
Design intent: experimental, high-signal styles with bold contrast and distinct silhouettes.
Custom styles include a context badge when relevant (ssh, ctr, git).
Radar:
![Radar](./images/themes/radar.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
FRAME=22
FG_MAIN=46
FG_DIM=28
PATH_FG=120
```
Synthwave:
![Synthwave](./images/themes/synthwave.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=198 Z1_FG=255
Z2_BG=45 Z2_FG=16
Z3_BG=208 Z3_FG=16
FRAME=201
```
Noir:
![Noir](./images/themes/noir.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
FG_MAIN=250
FG_DIM=242
PATH_FG=160
FRAME=236
```
Topo:
![Topo](./images/themes/topo.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
PATH_FG_LIST=109,110,111,110
FRAME=24
```
Glitch:
![Glitch](./images/themes/glitch.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
FG_MAIN=118
FG_DIM=60
FRAME=129
```
ArcticFire:
![ArcticFire](./images/themes/arcticfire.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
Z1_BG=24 Z1_FG=255
Z2_BG=31 Z2_FG=255
Z3_BG=208 Z3_FG=16
FRAME=25
```
AcidLime:
![AcidLime](./images/themes/acidlime.png)
Emoji:
- Set: seasonal (Spring/Summer/Autumn/Winter sets, same as Seasonal section)
- Fixed times: 🥪 11:0011:29, 🍲 16:0016:59
- Interval: time slots (Sunrise 05:0008:59, Coffee 09:0010:59, Work 11:3015:59, Evening 17:0022:59, Night 23:0004:59), daily rotation
```
FG_MAIN=46
FG_DIM=40
PATH_FG=118
FRAME=46
```
## Configuration Options
Core:
```
PS1_STYLE_PACK=standard|contest|holiday|custom
PS1_STYLE=aurora|neon|forge|circuit|mono|git|hawolex|hawolexv2|radar|synthwave|noir|topo|glitch|arcticfire|acidlime
PS1_SEASON_MODE=dynamic|static
PS1_SEASON=winter|spring|summer|autumn
PS1_CONTEST_LAYOUT=day-time-user|user-time|time-user|day-time
PS1_HOLIDAY=christmas|easter|halloween|valentine|thanksgiving|newyear
PS1_GIT=0|1
```
Overrides:
```
PS1_FORCE_NF=1 # force Nerd Font separators
PS1_FORCE_ASCII=1 # force ASCII/Unicode separators
DISABLE_GLOBAL_PS1=1 # disable prompt in current shell
~/.config/ps1/disable # disable prompt per-user
```