Compare commits

...

122 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
4b9c29f895 Square caps for git style 2026-01-24 13:02:46 +00:00
24374eb9fa Add consistent end padding for all themes 2026-01-24 12:58:33 +00:00
cb36ca7cb9 Add extra end padding for shortened paths 2026-01-24 12:57:21 +00:00
5f0c3fa06e Remove reset before right caps 2026-01-24 12:54:20 +00:00
6922271334 Pad git right cap 2026-01-24 12:50:35 +00:00
5c336e77a4 Tighten right-cap spacing 2026-01-24 12:39:42 +00:00
cbace1a1c7 Add Nerd Fonts download link 2026-01-24 12:35:52 +00:00
87c49dab23 Tidy README for production
- Restructure sections and add collapsible details

- Update repo tree and production note

- Mark main as production-ready in context
2026-01-24 12:20:54 +00:00
cc61e6281d Update context after merging dev 2026-01-24 12:10:06 +00:00
db558c76aa Add Git theme details to README 2026-01-24 12:08:23 +00:00
21233b9083 Update git emojis and move Hawolex to contest
- Add git state emojis and branch wrapping

- Move Hawolex to contest styles and update JSONs
2026-01-24 12:01:55 +00:00
059a642ff5 Add Git style and strengthen Hawolex
- Add git preset with repo capsule

- Boost Hawolex palette contrast

- Update context and contest JSONs
2026-01-24 11:49:32 +00:00
808fcc774f Add Hawolex holiday theme
- Add Hawolex palette and emoji set

- Add Hawolex option to holiday prompts
2026-01-24 11:34:34 +00:00
a462aa81f9 Add holidays pack
- Add holiday themes, palettes, and emojis

- Add holidays option and layout selection in installers

- Update context JSONs for holiday pack
2026-01-24 11:29:09 +00:00
42124810b7 Update context after branch cleanup
- Remove 4seasons branch notes
2026-01-24 11:13:53 +00:00
1b15831ec2 Merge dev into main 2026-01-24 11:12:33 +00:00
388413e696 Add right-side padding before end cap 2026-01-24 11:04:00 +00:00
4b5f886b79 Fix contest pack authorship note 2026-01-24 10:59:31 +00:00
299e7fe4cb Document contest pack
- Add DEFCON contest pack section and authorship note
2026-01-24 10:56:18 +00:00
2696f4aa01 Document contest pack
- Add DEFCON contest pack section and authorship note
2026-01-24 10:50:57 +00:00
5bd1ba0a92 Add right-side padding before end cap 2026-01-24 10:47:20 +00:00
9666d1f4cf Update contest JSON context
- Add contest pack layouts and emoji set

- Include contest render image
2026-01-24 10:42:08 +00:00
231e2df9b8 Update contest JSON context
- Add contest pack layouts and emoji set

- Include contest render image
2026-01-24 10:40:32 +00:00
b4a6579e4b Contest mode layout and prompt flow
- Add contest layout selection and config

- Default PS1 mode to contest option
2026-01-24 10:35:07 +00:00
7ac8c926ec Add contest option to PS1 mode
- Include contest pack as PS1 mode choice

- Keep single season path free of style prompts
2026-01-24 10:24:17 +00:00
9a61d5a9f2 Reorder PS1 prompts for season and contest pack
- Ask PS1 mode first, then season and style for single
2026-01-24 10:20:34 +00:00
cf1434050a Add contest pack prompt
- Add style pack choice before install options

- Only show style presets when contest pack is selected
2026-01-24 10:14:53 +00:00
91e0725b23 Add PS1 style data to context
- Expand .context.json with style presets and emoji rotation

- Add contest-styles.json for render tooling
2026-01-24 10:10:30 +00:00
a737cf90dd Add selectable PS1 styles
- Implement 5 bold styles and style config

- Prompt for style selection in installers
2026-01-24 10:04:14 +00:00
ade4a74f18 Update repo structure in README
- Include images, banner, and global installer
2026-01-24 09:55:06 +00:00
b411dd706a Rename emoji palette section
- Remove 'compressed' from README heading
2026-01-24 09:53:03 +00:00
95103f80cc Add compressed emoji palette to README 2026-01-24 09:52:37 +00:00
da123e9574 Add compressed emoji palette to README 2026-01-24 09:51:02 +00:00
91824d6160 Rotate seasonal sunrise/work emojis
- Add per-season emoji sets and daily rotation
2026-01-24 09:49:16 +00:00
aa76832710 Use mountain icon for winter sunrise
- Replace winter sunrise emoji with 🏔️
2026-01-24 09:47:07 +00:00
78346175a9 Add project context state file
- Capture palettes, seasons, emoji rules, and installer notes
2026-01-24 09:42:32 +00:00
d48fee89aa Revert "Add seasonal emoji accents"
This reverts commit fbd5fc40e2.
2026-01-24 09:38:09 +00:00
36ef66979b Add seasonal emoji accents
- Keep lunch/dinner fixed and vary other time emojis by season
2026-01-24 09:37:50 +00:00
fbd5fc40e2 Add seasonal emoji accents
- Keep lunch/dinner fixed and vary other time emojis by season
2026-01-24 09:35:47 +00:00
633704b777 Document seasonal palettes and 4seasons branch
- Add season ranges and selection modes
2026-01-24 09:32:06 +00:00
820d2c5991 Use seasonal palette image in README
- Swap example screenshot to bash-pallete.png
2026-01-24 09:29:46 +00:00
ce7944e135 Tune spring/summer text colors
- Darken summer path text

- Use dark green for spring host/path
2026-01-24 09:18:28 +00:00
8e5d4b8395 Improve spring/summer text contrast
- Use dark text for spring and summer path
2026-01-24 09:15:46 +00:00
006a3add58 Add seasonal palettes and selection prompts
- Implement dynamic/static season support in shared PS1

- Add season selection prompts to Linux and macOS installers
2026-01-24 09:11:07 +00:00
dbeadcf1e4 Translate installer prompts to English
- Update Linux global installer choices and error text
2026-01-24 08:36:33 +00:00
83481bbc00 Translate README to English
- Replace remaining Norwegian sections

- Update color palette description
2026-01-24 08:35:18 +00:00
8d7af2d863 Document installer choices and uninstall workflow
- Note the three install options in the Linux script

- Explain re-running the script to remove PS1/banner
2026-01-24 08:33:23 +00:00
259c1061bb Unify global installer with shared PS1
- Use dotfiles/ps1/ps1.sh for global installs

- Force NF caps and bold prompt arrow in shared PS1
2026-01-24 08:28:39 +00:00
cc94612994 Use static NF caps and moon prompt
- Switch to fixed NF separators and \w path

- Use fixed moon emoji and inline status arrow
2026-01-24 08:20:12 +00:00
4d7bc9d221 Force Nerd Font separators globally
- Export PS1_FORCE_NF to keep rounded caps everywhere
2026-01-24 08:15:44 +00:00
85074ee154 Tighten PS1 caps and emphasize prompt arrow
- Bold the prompt arrow for stronger line-break emphasis

- Tighten spacing at the right end cap

- Document PS1 design rationale and palette
2026-01-24 08:10:36 +00:00
82039b35cd Allow uninstalling banner or PS1 via installer 2026-01-24 07:56:07 +00:00
608c0dad96 1 2026-01-24 07:52:33 +00:00
c96812c6e9 . 2026-01-24 07:48:10 +00:00
67b9946dfc . 2026-01-24 07:38:48 +00:00
de60d62d1a . 2026-01-24 07:34:13 +00:00
1d4cda3b47 . 2026-01-24 07:29:29 +00:00
91b82ec026 . 2026-01-24 07:27:13 +00:00
8b7d75740e Restructure README install flow 2026-01-24 07:22:36 +00:00
64585f8445 . 2026-01-24 06:54:32 +00:00
affc90af41 Install banner deps and prompt for punchline 2026-01-24 06:52:10 +00:00
874c7910d5 . 2026-01-24 05:57:54 +00:00
976bfba988 . 2026-01-24 05:36:48 +00:00
4d8c196773 md 2026-01-24 05:35:50 +00:00
bdd64ebe76 fix 2026-01-24 05:28:05 +00:00
a7bfcf155b README 2026-01-24 05:27:20 +00:00
ee39628557 . 2026-01-24 05:25:45 +00:00
73c54192f7 2 2026-01-24 05:15:38 +00:00
2d9b57fc18 . 2026-01-24 05:14:33 +00:00
7bb113b953 img 2026-01-24 05:13:42 +00:00
57fdadd11b . 2026-01-24 05:12:44 +00:00
8e15f62547 Update README.md 2026-01-24 05:11:21 +00:00
d9c10f7e0b dad
Signed-off-by: steffen <steffen@skui.io>
2026-01-24 05:10:30 +00:00
021a76acc1 cd /home/steffen/Bashrc && git status
cd /home/steffen/Bashrc && git log --oneline -5
 cd /home/steffen/Bashrc && git push origin main -f
 cd /home/steffen/Bashrc && git rebase --abort 2>/dev/null; git push origin main -f
.
2026-01-24 05:09:51 +00:00
4766b72957 a 2026-01-24 05:09:42 +00:00
39 changed files with 3387 additions and 400 deletions

537
.context.json Normal file
View File

@@ -0,0 +1,537 @@
{
"project": {
"name": "Bashrc Dotfiles",
"purpose": "Global and per-user bash prompt + banner with seasonal palettes and time/season emoji accents.",
"repo_root": "/home/steffen/Bashrc",
"default_branch": "main",
"release_state": "main is production-ready"
},
"branches": {
"main": {
"notes": [
"Shared PS1 module in dotfiles/ps1/ps1.sh is source of truth for both Linux and macOS installers.",
"README documents seasonal ranges and style packs.",
"README example image uses images/bash-pallete.png."
]
}
},
"files": {
"ps1_shared": "dotfiles/ps1/ps1.sh",
"linux_installer": "dotfiles/install/install-linux-global.sh",
"macos_installer": "dotfiles/install/install-macos-user.sh",
"global_installer_wrapper": "dotfiles/install/install-global-ps1.sh",
"readme": "README.md",
"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": {
"linux": {
"script": "dotfiles/install/install-linux-global.sh",
"scope": "global (all users)",
"installs": [
"/etc/profile.d/ps1.sh",
"/etc/profile.d/banner.sh"
],
"sources_from": "/etc/bash.bashrc",
"prompts": [
"PS1 only / Banner only / Both",
"PS1 mode: Single season / Dynamic / Contest / Holidays / Custom (if PS1 selected)",
"Season pick (if single season)",
"Layout order selection (seasonal/contest/holidays)",
"Style preset selection (if contest)",
"Holiday selection (if holidays)",
"Custom style selection (if custom)",
"Enable git capsule for all themes (if PS1 selected)"
],
"season_config_file": "/etc/ps1-season",
"style_config_file": "/etc/ps1-style",
"banner_punchline_file": "/etc/ps1-punchline"
},
"macos": {
"script": "dotfiles/install/install-macos-user.sh",
"scope": "per-user",
"installs": [
"~/.config/ps1/ps1.sh"
],
"sources_from": [
"~/.bashrc",
"~/.bash_profile"
],
"prompts": [
"PS1 mode: Single season / Dynamic / Contest / Holidays / Custom",
"Season pick (if single season)",
"Layout order selection (seasonal/contest/holidays)",
"Style preset selection (if contest)",
"Holiday selection (if holidays)",
"Custom style selection (if custom)",
"Enable git capsule for all themes"
],
"season_config_file": "~/.config/ps1/season",
"style_config_file": "~/.config/ps1/style"
},
"global_installer_wrapper": {
"script": "dotfiles/install/install-global-ps1.sh",
"behavior": "Copies shared PS1 module to /etc/profile.d/ps1.sh and updates /etc/bash.bashrc."
}
},
"season_rules": {
"timezone": "Europe/Oslo",
"dynamic_ranges": {
"spring": "March-May",
"summer": "June-August",
"autumn": "September-mid November (before Nov 15)",
"winter": "mid November-February"
},
"config": {
"mode_env": "PS1_SEASON_MODE=dynamic|static",
"season_env": "PS1_SEASON=winter|spring|summer|autumn",
"config_file_keys": [
"PS1_SEASON_MODE",
"PS1_SEASON"
]
}
},
"palettes": {
"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": 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": 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": 93,
"Z2_BG": 95,
"Z3_BG": 97,
"Z4_BG": 166,
"Z5_BG": 136,
"Z1_FG": 255,
"Z2_FG": 255,
"PATH_FG": 223,
"FRAME": 95
}
},
"styles": {
"default": "aurora",
"available": [
{
"id": "aurora",
"name": "Aurora",
"description": "Powerline blocks with seasonal palette, two-line calm layout.",
"layout": "two-line, segmented blocks",
"preview": "[date time user] > [@host /path]"
},
{
"id": "neon",
"name": "Neon",
"description": "Magenta/cyan cyber blocks, high contrast, two-line.",
"layout": "two-line, neon blocks",
"preview": "[user time] > [@host /path]"
},
{
"id": "forge",
"name": "Forge",
"description": "Warm copper blocks, heavy frame, assertive.",
"layout": "two-line, bold blocks",
"preview": "[date time user] > [@host /path]"
},
{
"id": "circuit",
"name": "Circuit",
"description": "Green scanline rail, minimal chrome, compact.",
"layout": "two-line, rail style",
"preview": "[user time] - @host /path"
},
{
"id": "mono",
"name": "Mono",
"description": "Clean monochrome, fast read, low noise.",
"layout": "two-line, minimal",
"preview": "[date time user] @host /path"
},
{
"id": "git",
"name": "Git",
"description": "Minimal blocks with git capsule when in repo.",
"layout": "two-line, git capsule on line 2",
"preview": "[date time user] @host - /path (git)"
},
{
"id": "hawolex",
"name": "Hawolex",
"description": "Winter neon with tech icons, contest layout.",
"layout": "two-line, contest layout",
"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": {
"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": [
"PS1_STYLE",
"PS1_STYLE_PACK",
"PS1_CONTEST_LAYOUT",
"PS1_HOLIDAY",
"PS1_GIT"
]
}
},
"emoji_rules": {
"fixed_times": {
"lunch": "11:00-11:29 => 🥪",
"dinner": "16:00-16:59 => 🍲"
},
"rotation": "Daily rotation by day-of-year with season offsets.",
"seasonal_accents": {
"spring": {
"sunrise": [
"🌷",
"🌱",
"🐣",
"🌤"
],
"coffee": "☕",
"work": [
"🌿",
"🪴",
"🐝",
"🌼"
],
"evening": "🌤",
"night": "🌙"
},
"summer": {
"sunrise": [
"🌞",
"🏖️",
"🌅",
"🌤"
],
"coffee": "🧃",
"work": [
"🏄",
"🏖️",
"🚤",
"🌴"
],
"evening": "🌇",
"night": "🌙"
},
"autumn": {
"sunrise": [
"🍁",
"🍂",
"🌫️",
"🌦️"
],
"coffee": "☕",
"work": [
"🍂",
"🍄",
"🎃",
"🪵"
],
"evening": "🌆",
"night": "🌙"
},
"winter": {
"sunrise": [
"🏔️",
"🌨️",
"❄️",
"🌌"
],
"coffee": "☕",
"work": [
"🎿",
"⛷️",
"🏂",
"🧊"
],
"evening": "🌆",
"night": "🌙"
}
},
"contest_accents": {
"sunrise": [
"⚡️",
"🛰️",
"🧬",
"🧠"
],
"work": [
"🛠️",
"💾",
"🧪",
"🧩"
],
"coffee": "☕",
"evening": "🎛️",
"night": "🕶️"
},
"holiday_accents": {
"christmas": {
"sunrise": [
"🎄",
"🎅",
"❄️",
"⛄"
],
"work": [
"🎁",
"🧤",
"🧣",
"🦌"
],
"coffee": "☕",
"evening": "🌟",
"night": "🕯️"
},
"easter": {
"sunrise": [
"🐣",
"🥚",
"🌷",
"🌤"
],
"work": [
"🐰",
"🌼",
"🧺",
"🍫"
],
"coffee": "☕",
"evening": "🌅",
"night": "🌙"
},
"halloween": {
"sunrise": [
"🎃",
"🦇",
"🌕",
"🕸️"
],
"work": [
"👻",
"💀",
"🕯️",
"🧪"
],
"coffee": "☕",
"evening": "🌆",
"night": "🕷️"
},
"valentine": {
"sunrise": [
"💖",
"🌹",
"💘",
"💕"
],
"work": [
"💌",
"🍫",
"🕊️",
"💗"
],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
},
"thanksgiving": {
"sunrise": [
"🦃",
"🍁",
"🥧",
"🍂"
],
"work": [
"🍽️",
"🌾",
"🧺",
"🥖"
],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
},
"newyear": {
"sunrise": [
"🎆",
"🥂",
"🎇",
"✨"
],
"work": [
"🗓️",
"⏳",
"🚀",
"✨"
],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
}
},
"style_accents": {
"hawolex": {
"sunrise": [
"💻",
"🚗",
"🔊",
"🎮"
],
"work": [
"🎧",
"🕹️",
"📟",
"🧩"
],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
}
},
"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"
}
},
"prompt_structure": {
"zone1": "date time user",
"zone2": "host path",
"seasonal_segments": "date | time | user | host+path (subtle seasonal gradient)",
"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.",
"nerd_font_caps": "Always enabled unless PS1_FORCE_ASCII=1"
},
"overrides": {
"force_nerd_font": "PS1_FORCE_NF=1",
"force_ascii": "PS1_FORCE_ASCII=1",
"disable_prompt_env": "DISABLE_GLOBAL_PS1=1",
"disable_prompt_file": "~/.config/ps1/disable"
},
"notes": [
"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.",
"Seasonal palettes and contest pack are now documented directly in main.",
"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

495
README.md
View File

@@ -1,144 +1,457 @@
# Bashrc Dotfiles — Global & Portable Bash Prompt
Elegant, portable, and easy-to-install Bash prompt with:
✨ Two color zones
🌅 Time-based emoji accents
🖥️ Fallback when Nerd Fonts arent available
📍 Shortened but informative path
🔘 Status-colored prompt arrow
🧠 Works on Linux, WSL, and macOS
Elegant, portable, and easy-to-install Bash prompt with seasonal palettes, time-aware emoji, and clean powerline structure.
---
## 🧠 Features
## ⚡ Quick Look
- **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
- Theme gallery + full specs: [Theme Library](libary.md)
- Packs: Seasonal (auto), Contest, Holidays, Custom, Git
- Layout order option: day-time-user, user-time, time-user, day-time
- 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.
---
## 🚀 Install
### 🐧 Linux / WSL (global, all users)
1) Clone the repo:
```bash
git clone <repo-url>
```
2) Enter the folder:
```bash
cd Bashrc
```
3) Run the global installer (auto-installs deps + prompts for punchline):
```bash
sudo bash dotfiles/install/install-linux-global.sh
```
4) Open a new shell to see the prompt and banner.
### 🍏 macOS (per-user)
1) Clone the repo:
```bash
git clone <repo-url>
```
2) Enter the folder:
```bash
cd Bashrc
```
3) Run the user installer:
```bash
bash dotfiles/install/install-macos-user.sh
```
4) Reload your shell (or open a new terminal):
```bash
source ~/.bashrc
```
<details>
<summary><strong>Installer menu (structure)</strong></summary>
```text
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>
<details>
<summary><strong>Installer choices</strong></summary>
Linux/WSL:
- PS1 only / Banner only / Both
- 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:
- 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>
---
## ✨ 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>
<summary><strong>What gets installed</strong></summary>
### Linux / WSL
- Installs the prompt module to `/etc/profile.d/ps1.sh`
- Installs the banner module to `/etc/profile.d/banner.sh`
- Sources both from `/etc/bash.bashrc`
- Installs `landscape-common`, `figlet`, and `lolcat` if missing
- Prompts for the global punchline used by the banner
- You can change the selection or remove PS1/banner by running the installer again
### macOS
- Copies `ps1/ps1.sh` to `~/.config/ps1/ps1.sh`
- Adds a source block in `~/.bashrc` and `~/.bash_profile`
</details>
---
<details>
<summary><strong>PS1 module (when it runs)</strong></summary>
- Linux/WSL: sourced from `/etc/bash.bashrc` (global)
- macOS: sourced from `~/.bashrc` and `~/.bash_profile` (per-user)
You normally do not need to run `ps1.sh` manually.
</details>
---
<details>
<summary><strong>Banner (hostname + punchline + sysinfo)</strong></summary>
On Linux/WSL, a banner is also shown on login:
- `figlet $(hostname) -c | lolcat`
- `figlet -f digital "<punchline>" -c | lolcat`
- `landscape-sysinfo | lolcat`
### Punchline (global)
The banner reads the punchline from:
- `/etc/ps1-punchline`
The install script prompts for a punchline and stores it in the file. You can also set it manually:
```bash
echo "Your punchline" | sudo tee /etc/ps1-punchline >/dev/null
```
</details>
---
## 🎛️ Themes & Style Packs
### 🏁 Contest Pack
The contest pack is a bold, DEFCON-ready set of five styles (Aurora, Neon, Forge, Circuit, Mono) with optional layout order. It always starts on a new line and ends with `@host - /path`.
Note: This repo was built with AI assistance, and the contest pack itself is fully AI-authored.
---
<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>
<summary><strong>Git Theme (details)</strong></summary>
The Git theme adds a repo-aware capsule on line 2 that only appears inside a Git repo. The branch name is wrapped as `⟦branch⟧`, and status emojis reflect state:
- Clean: ✨
- Dirty: 🔨
- Staged: 📌
- Untracked: 🧷
- Stashed: 📦
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>
<summary><strong>Holidays Pack (themes)</strong></summary>
Holidays pack uses themed palettes + emojis and the contest layout order:
- Christmas, Easter, Halloween, Valentine, Thanksgiving, New Year
</details>
---
## 🧭 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>
<summary><strong>Emoji palette</strong></summary>
Fixed times (all seasons):
- Lunch 11:0011:29 = 🥪
- Dinner 16:0016:59 = 🍲
Seasonal sets (sunrise / work):
- Spring: 🌷 🌱 🐣 🌤 / 🌿 🪴 🐝 🌼
- Summer: 🌞 🏖️ 🌅 🌤 / 🏄 🏖️ 🚤 🌴
- Autumn: 🍁 🍂 🌫️ 🌦️ / 🍂 🍄 🎃 🪵
- 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>
---
## 🗂️ Repo Structure
dotfiles/
├── ps1/
│ └── ps1.sh
├── install/
├── install-linux-global.sh
│ ├── install-macos-user.sh
│ └── install-nerdfont.sh
```text
.
├── .context.json
├── contest-styles.json
├── images/
├── bash-pallete.png
└── contest.png
│ └── themes/
├── dotfiles/
│ ├── banner/
│ │ └── banner.sh
│ ├── ps1/
│ │ └── ps1.sh
│ └── install/
│ ├── install-global-ps1.sh
│ ├── install-linux-global.sh
│ ├── install-macos-user.sh
│ └── install-nerdfont.sh
└── README.md
```
<details>
<summary><strong>Overrides (Optional)</strong></summary>
---
## 🚀 Installation
### 🐧 Linux / WSL (global, all users)
```bash
sudo bash install/install-linux-global.sh
This:
Installs the prompt module to /etc/profile.d/ps1.sh
Sources it in /etc/bash.bashrc so all users get the prompt
After install, open a new shell to see the prompt.
🍏 macOS (per-user)
bash install/install-macos-user.sh
This:
Copies ps1/ps1.sh to ~/.config/ps1/ps1.sh
Adds source block in ~/.bashrc and ~/.bash_profile
Open a new terminal or reload your shell:
source ~/.bashrc
🖼️ Nerd Fonts (optional but recommended)
Nerd Fonts provide the best display for glyphs (powerline symbols):
bash install/install-nerdfont.sh
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.
⚙️ Overrides (Optional)
Sometimes autodetection doesnt work (e.g., on macOS without fontconfig):
Force Nerd Font glyphs:
```bash
export PS1_FORCE_NF=1
```
Force fallback (no powerline glyphs):
```bash
export PS1_FORCE_ASCII=1
Add these to your ~/.bashrc or ~/.bash_profile.
```
Add these to your `~/.bashrc` or `~/.bash_profile`.
</details>
---
<details>
<summary><strong>Disable prompt (per user)</strong></summary>
🙅 Disable Prompt (per user)
If you want to disable the global prompt for your account:
Temporarily in a shell:
```bash
export DISABLE_GLOBAL_PS1=1
```
Permanently:
```bash
mkdir -p ~/.config/ps1
touch ~/.config/ps1/disable
```
To re-enable:
```bash
rm -f ~/.config/ps1/disable
🧪 Testing
```
</details>
---
<details>
<summary><strong>Testing</strong></summary>
After install, open a new shell and run:
```bash
bash -i -c 'echo OK'
If you see a prompt with colors and emoji, things are working.
```
💡 Usage Notes
Font matters: Even with Nerd Fonts installed, you must select them in your terminal settings.
If you see a prompt with colors and emoji, things are working.
</details>
---
<details>
<summary><strong>Usage notes</strong></summary>
Font matters: even with Nerd Fonts installed, you must select them in your terminal settings.
Works on terminals like:
GNOME Terminal
iTerm2
Kitty
VS Code integrated terminal
Windows Terminal (WSL)
- GNOME Terminal
- iTerm2
- Kitty
- VS Code integrated terminal
- Windows Terminal (WSL)
If you see squares or missing glyphs, your terminal is likely using a non-Nerd font.
</details>
📸 Example Prompt
This prompt shows:
![Bash prompt with two color zones and emoji](image.png)
---
## 📸 Theme Gallery
With exit-status colored arrow and emoji reflecting time of day.
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">
<img src="images/bash-pallete.png" width="900">
</p>
---
## 🛠️ Contribution
🛠️ Contribution
Want to help improve this project?
Fork the repository
- Fork the repository
- Make your changes
- Open a merge request
- Please keep consistent colors and styles
Make your changes
---
Open a merge request
## 📄 License
Please keep consistent colors and styles.
📄 License
MIT © 2026 Your Name
MIT © 2026 Steffen Skui

View File

@@ -1,119 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Must be root
if [[ "${EUID}" -ne 0 ]]; then
echo "Kjør som root: sudo bash $0"
exit 1
fi
### 1) Ensure required packages installed
need_pkgs=(landscape-common figlet lolcat)
missing=()
for p in "${need_pkgs[@]}"; do
if ! dpkg -s "$p" >/dev/null 2>&1; then
missing+=("$p")
fi
done
if ((${#missing[@]} > 0)); then
echo "Installerer manglende pakker: ${missing[*]}"
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y "${missing[@]}"
fi
### 2) Ask punchline (clear wording, always from TTY)
echo
read -r -p "Skriv ønsket punchline (vises under hostname i banneret): " PUNCHLINE </dev/tty
if [[ -z "${PUNCHLINE// }" ]]; then
echo "Punchline kan ikke være tom."
exit 1
fi
GLOBAL_BASHRC="/etc/bash.bashrc"
MARKER_START="# >>> global custom bashrc (managed) >>>"
MARKER_END="# <<< global custom bashrc (managed) <<<"
# Backup
cp -a "$GLOBAL_BASHRC" "${GLOBAL_BASHRC}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true
# Remove old managed block (if any)
tmp="$(mktemp)"
awk -v s="$MARKER_START" -v e="$MARKER_END" '
$0==s {inside=1; next}
$0==e {inside=0; next}
!inside {print}
' "$GLOBAL_BASHRC" > "$tmp"
cat "$tmp" > "$GLOBAL_BASHRC"
rm -f "$tmp"
# Append fresh managed block (NO expansion while writing)
cat >> "$GLOBAL_BASHRC" <<'EOF'
# >>> global custom bashrc (managed) >>>
# Only run in interactive shells
case "$-" in
*i*) ;;
*) return ;;
esac
##### HISTORY / BASICS #####
HISTCONTROL=ignoreboth
shopt -s histappend
HISTSIZE=999999
HISTFILESIZE=999999
shopt -s checkwinsize
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
##### PROMPT (GLOBAL) #####
export PS1="\[\e[0m\]\[\e[38;5;35m\]╭─(\[\e[38;5;38m\]\t\[\e[38;5;35m\])-(\[\e[38;5;38m\]\j\[\e[38;5;35m\])-(\[\e[38;5;38m\]\H\[\e[38;5;35m\])-(\[\e[38;5;38m\]\w\[\e[38;5;35m\])\n\[\e[38;5;35m\]╰──🚀 \[\e[0m\]"
##### COLORS / ALIASES #####
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
##### BANNER #####
LOLCAT="/usr/games/lolcat"
if [ ! -x "$LOLCAT" ]; then
LOLCAT="$(command -v lolcat 2>/dev/null || true)"
fi
[ -z "$LOLCAT" ] && LOLCAT="cat"
figlet "$(hostname)" -c | "$LOLCAT"
figlet -f digital "__PUNCHLINE__" -c | "$LOLCAT"
landscape-sysinfo | "$LOLCAT"
# <<< global custom bashrc (managed) <<<
EOF
# Replace placeholder with user punchline (safe)
safe_punchline="$(printf '%s' "$PUNCHLINE" | sed 's/[\/&]/\\&/g')"
sed -i "s/__PUNCHLINE__/${safe_punchline}/g" "$GLOBAL_BASHRC"
echo
echo "Ferdig ✅"
echo "Global PS1 + banner er nå aktivt for alle brukere."
echo "Kjør scriptet på nytt for å endre punchline."

440
contest-styles.json Normal file
View File

@@ -0,0 +1,440 @@
{
"project": "Bashrc Dotfiles",
"branch": "main",
"purpose": "DEFCON contest + custom render pack for PS1 styles",
"contest_pack": {
"layout_options": [
"day-time-user",
"user-time",
"time-user",
"day-time"
],
"host_path_format": "@host - /path",
"prefix_newline": true,
"emoji_set": {
"sunrise": [
"⚡️",
"🛰️",
"🧬",
"🧠"
],
"work": [
"🛠️",
"💾",
"🧪",
"🧩"
],
"coffee": "☕",
"evening": "🎛️",
"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": {
"layout_options": [
"day-time-user",
"user-time",
"time-user",
"day-time"
],
"host_path_format": "@host - /path",
"prefix_newline": true,
"themes": {
"christmas": {
"palette": { "Z1_BG": 52, "Z1_FG": 255, "Z2_BG": 28, "Z2_FG": 255, "PATH_FG": 194, "FRAME": 88 },
"emoji_set": {
"sunrise": [ "🎄", "🎅", "❄️", "⛄" ],
"work": [ "🎁", "🧤", "🧣", "🦌" ],
"coffee": "☕",
"evening": "🌟",
"night": "🕯️"
}
},
"easter": {
"palette": { "Z1_BG": 186, "Z1_FG": 16, "Z2_BG": 150, "Z2_FG": 16, "PATH_FG": 94, "FRAME": 143 },
"emoji_set": {
"sunrise": [ "🐣", "🥚", "🌷", "🌤" ],
"work": [ "🐰", "🌼", "🧺", "🍫" ],
"coffee": "☕",
"evening": "🌅",
"night": "🌙"
}
},
"halloween": {
"palette": { "Z1_BG": 53, "Z1_FG": 255, "Z2_BG": 166, "Z2_FG": 16, "PATH_FG": 16, "FRAME": 89 },
"emoji_set": {
"sunrise": [ "🎃", "🦇", "🌕", "🕸️" ],
"work": [ "👻", "💀", "🕯️", "🧪" ],
"coffee": "☕",
"evening": "🌆",
"night": "🕷️"
}
},
"valentine": {
"palette": { "Z1_BG": 198, "Z1_FG": 255, "Z2_BG": 205, "Z2_FG": 255, "PATH_FG": 224, "FRAME": 162 },
"emoji_set": {
"sunrise": [ "💖", "🌹", "💘", "💕" ],
"work": [ "💌", "🍫", "🕊️", "💗" ],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
}
},
"thanksgiving": {
"palette": { "Z1_BG": 94, "Z1_FG": 230, "Z2_BG": 136, "Z2_FG": 231, "PATH_FG": 223, "FRAME": 130 },
"emoji_set": {
"sunrise": [ "🦃", "🍁", "🥧", "🍂" ],
"work": [ "🍽️", "🌾", "🧺", "🥖" ],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
}
},
"newyear": {
"palette": { "Z1_BG": 17, "Z1_FG": 255, "Z2_BG": 20, "Z2_FG": 255, "PATH_FG": 229, "FRAME": 19 },
"emoji_set": {
"sunrise": [ "🎆", "🥂", "🎇", "✨" ],
"work": [ "🗓️", "⏳", "🚀", "✨" ],
"coffee": "☕",
"evening": "🌆",
"night": "🌙"
}
}
}
},
"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": [
{
"id": "aurora",
"name": "Aurora",
"tagline": "Seasonal powerline glow",
"description": "Two-line powerline blocks with seasonal palette and calm hierarchy.",
"layout": {
"line1": "date time user | @host path",
"line2": "status arrow + emoji"
},
"colors": {
"palette_source": "seasonal",
"seasonal": true
},
"preview": "[date time user] > [@host /path]"
},
{
"id": "neon",
"name": "Neon",
"tagline": "Cyber-magenta strike",
"description": "Magenta + cyan blocks, high contrast, aggressive read.",
"layout": {
"line1": "user time | @host path",
"line2": "status arrow + emoji"
},
"colors": {
"zone1_bg": 201,
"zone1_fg": 255,
"zone2_bg": 45,
"zone2_fg": 16,
"path_fg": 16,
"frame": 199
},
"preview": "[user time] > [@host /path]"
},
{
"id": "forge",
"name": "Forge",
"tagline": "Copper heatline",
"description": "Warm copper blocks with heavy frame and bold emphasis.",
"layout": {
"line1": "date time user | @host path",
"line2": "status arrow + emoji"
},
"colors": {
"zone1_bg": 94,
"zone1_fg": 230,
"zone2_bg": 166,
"zone2_fg": 231,
"path_fg": 224,
"frame": 130
},
"preview": "[date time user] > [@host /path]"
},
{
"id": "circuit",
"name": "Circuit",
"tagline": "Green scanline rail",
"description": "Minimal rails, green scanline glow, compact density.",
"layout": {
"line1": "user time - @host path",
"line2": "status arrow + emoji"
},
"colors": {
"fg_primary": 46,
"fg_dim": 22,
"path_fg": 120
},
"preview": "[user time] - @host /path"
},
{
"id": "mono",
"name": "Mono",
"tagline": "No-frills sniper view",
"description": "Monochrome clarity with minimal chrome.",
"layout": {
"line1": "date time user @host path",
"line2": "status arrow + emoji"
},
"colors": {
"fg_primary": 250,
"fg_dim": 240
},
"preview": "[date time user] @host /path"
},
{
"id": "git",
"name": "Git",
"tagline": "Repo-aware minimalism",
"description": "Minimal blocks with git capsule on line 2.",
"layout": {
"line1": "date time user | @host - /path",
"line2": "status arrow + emoji + git"
},
"colors": {
"zone1_bg": 61,
"zone1_fg": 255,
"zone2_bg": 37,
"zone2_fg": 255,
"path_fg": 194,
"frame": 60
},
"preview": "[date time user] @host - /path (git)"
},
{
"id": "hawolex",
"name": "Hawolex",
"tagline": "Winter neon, tech icons",
"description": "Contest layout with winter-strong palette and tech emojis.",
"layout": {
"line1": "date time user | @host - /path",
"line2": "status arrow + emoji"
},
"colors": {
"zone1_bg": 54,
"zone1_fg": 255,
"zone2_bg": 31,
"zone2_fg": 255,
"path_fg": 230,
"frame": 24
},
"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": {
"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": 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": 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": 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": [
"Palette values are 256-color codes.",
"Aurora uses seasonal palettes; other styles use fixed palettes.",
"Previews are textual layout hints for rendering.",
"Contest pack prepends a blank line and always ends with host - path."
]
}

65
dotfiles/banner/banner.sh Normal file
View File

@@ -0,0 +1,65 @@
#!/usr/bin/env bash
# Banner module (global/user). Runs once per login session.
case "$-" in
*i*) ;;
*) return 0 ;;
esac
# Disable switch (per-user/per-shell)
# 1) env: DISABLE_GLOBAL_BANNER=1
# 2) file: ~/.config/ps1/disable-banner
if [[ "${DISABLE_GLOBAL_BANNER:-0}" == "1" ]]; then
return 0
fi
if [[ -f "$HOME/.config/ps1/disable-banner" ]]; then
return 0
fi
# Run banner only once per session
if [[ -n "${__BANNER_ALREADY_SHOWN:-}" ]]; then
return 0
fi
__BANNER_ALREADY_SHOWN=1
# Find tools (be defensive)
FIGLET="$(command -v figlet 2>/dev/null || true)"
LANDSCAPE="$(command -v landscape-sysinfo 2>/dev/null || true)"
# lolcat is often /usr/games/lolcat on Ubuntu
if [[ -x /usr/games/lolcat ]]; then
LOLCAT="/usr/games/lolcat"
else
LOLCAT="$(command -v lolcat 2>/dev/null || true)"
fi
HAVE_LOLCAT=0
if [[ -n "${LOLCAT:-}" ]]; then
HAVE_LOLCAT=1
fi
# Punchline source:
# - global file: /etc/ps1-punchline
# - fallback: "Hello"
PUNCHLINE="Hello"
if [[ -r /etc/ps1-punchline ]]; then
PUNCHLINE="$(head -n 1 /etc/ps1-punchline 2>/dev/null || echo "Hello")"
PUNCHLINE="${PUNCHLINE%%$'\r'}"
fi
# Print banner + sysinfo
if [[ -n "${FIGLET:-}" ]]; then
if [[ "$HAVE_LOLCAT" -eq 1 ]]; then
"$FIGLET" "$(hostname)" -c | "$LOLCAT"
"$FIGLET" -f digital "$PUNCHLINE" -c | "$LOLCAT"
if [[ -n "${LANDSCAPE:-}" ]]; then
"$LANDSCAPE" | "$LOLCAT"
fi
else
"$FIGLET" "$(hostname)" -c
"$FIGLET" -f digital "$PUNCHLINE" -c
if [[ -n "${LANDSCAPE:-}" ]]; then
"$LANDSCAPE"
fi
fi
fi

View File

@@ -6,147 +6,19 @@ if [[ "${EUID}" -ne 0 ]]; then
exit 1
fi
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SRC_PS1="$REPO_ROOT/ps1/ps1.sh"
PS1_FILE="/etc/profile.d/ps1.sh"
BASH_BASHRC="/etc/bash.bashrc"
MARKER_START="# >>> global ps1 (managed) >>>"
MARKER_END="# <<< global ps1 (managed) <<<"
echo "Skriver global PS1 til: $PS1_FILE"
# Write the PS1 module (global)
cat > "$PS1_FILE" <<'EOF'
#!/usr/bin/env bash
# This file is loaded globally. It may be sourced from /etc/bash.bashrc.
# It must not exit the shell; only return when not interactive.
case "$-" in
*i*) ;;
*) return 0 ;;
esac
# -------------------------------------------------
# Nerd Font detection + fallback controls
# Env overrides:
# PS1_FORCE_ASCII=1 -> always fallback separators
# PS1_FORCE_NF=1 -> always use Nerd Font separators
# -------------------------------------------------
_ps1_has_nf() {
if [[ "${PS1_FORCE_ASCII:-0}" == "1" ]]; then return 1; fi
if [[ "${PS1_FORCE_NF:-0}" == "1" ]]; then return 0; fi
if command -v fc-list >/dev/null 2>&1; then
if fc-list 2>/dev/null | grep -qi "Nerd Font"; then
return 0
fi
fi
return 1
}
# -------------------------------------------------
# Time-based emoji (Europe/Oslo)
# -------------------------------------------------
_ps1_symbol() {
local hh mm h m
hh=$(TZ=Europe/Oslo date +%H); mm=$(TZ=Europe/Oslo date +%M)
h=$((10#$hh)); m=$((10#$mm))
if (( h >= 5 && h <= 8 )); then echo "🌅"
elif (( h >= 9 && h <= 10 )); then echo "☕"
elif (( h == 11 && m < 30 )); then echo "🥪"
elif (( (h == 11 && m >= 30) || (h >= 12 && h <= 15) )); then echo "💻"
elif (( h == 16 )); then echo "🍲"
elif (( h >= 17 && h <= 22 )); then echo "🌆"
else echo "🌙"
fi
}
# -------------------------------------------------
# Path shortening (keeps /home/user visible)
# bash 3.2+ compatible (no negative array indexes)
# -------------------------------------------------
_ps1_path() {
local p="$PWD"
local parts=()
IFS='/' read -ra parts <<< "$p"
if ((${#parts[@]} < 6)); then
echo "$p"
return
fi
local n=${#parts[@]}
local a="${parts[1]}"
local b="${parts[2]}"
local c="${parts[$((n-2))]}"
local d="${parts[$((n-1))]}"
echo "/${a}/${b}/…/${c}/${d}"
}
# -------------------------------------------------
# Dynamic vars updated before each prompt
# -------------------------------------------------
__PS1_SYM=""
__PS1_PATH=""
__PS1_STATUS=0
__PS1_USE_NF=0
_ps1_update() {
__PS1_STATUS=$?
__PS1_SYM="$(_ps1_symbol)"
__PS1_PATH="$(_ps1_path)"
if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi
}
# -------------------------------------------------
# Public functions
# -------------------------------------------------
ps1_on() {
PROMPT_COMMAND="_ps1_update"
local RST="\[\e[0m\]"
# Zone 1 (date/time/user): gray-blue pastel
local Z1_BG="\[\e[48;5;61m\]"
local Z1_FG="\[\e[38;5;255m\]"
# Zone 2 (host/path): turquoise / cool green
local Z2_BG="\[\e[48;5;37m\]"
local Z2_FG="\[\e[38;5;255m\]"
local PATH_FG="\[\e[38;5;194m\]"
# Frame
local FRAME="\[\e[38;5;60m\]"
# Status colors
local OK="\[\e[38;5;76m\]"
local BAD="\[\e[38;5;203m\]"
# Separators w/ fallback (NF vs non-NF)
local SEP_EXPR='\$( [ "$__PS1_USE_NF" -eq 1 ] && printf "" || printf "▶" )'
local LEFT_EXPR='\$( [ "$__PS1_USE_NF" -eq 1 ] && printf "" || printf "[" )'
local RIGHT_EXPR='\$( [ "$__PS1_USE_NF" -eq 1 ] && printf "" || printf "]" )'
local PROMPT_SYM="\$( [ \$__PS1_STATUS -eq 0 ] && printf '${OK}' || printf '${BAD}' )➜${RST}"
PS1="\
${FRAME}╭─${RST}\
${Z1_BG}${Z1_FG}${LEFT_EXPR} \d \A \u ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${SEP_EXPR}${RST}\
${Z2_BG}${Z2_FG} @\h ${PATH_FG}\${__PS1_PATH} ${RST}${Z2_BG}${Z2_FG}${RIGHT_EXPR}${RST}\
\n${FRAME}╰── ${RST}${PROMPT_SYM} \${__PS1_SYM} "
}
ps1_off() {
# no-op helper; users can override if needed
:
}
# Enable by default (global standard)
ps1_on
EOF
echo "Installerer global PS1: $SRC_PS1 -> $PS1_FILE"
cp -f "$SRC_PS1" "$PS1_FILE"
chmod 0644 "$PS1_FILE"
echo "Oppdaterer $BASH_BASHRC for å source $PS1_FILE (idempotent)"
@@ -161,7 +33,7 @@ awk -v s="$MARKER_START" -v e="$MARKER_END" '
cat "$tmp" > "$BASH_BASHRC"
rm -f "$tmp"
cat >> "$BASH_BASHRC" <<EOF
cat >> "$BASH_BASHRC" <<EOF2
$MARKER_START
# Load global PS1 (managed)
@@ -169,7 +41,7 @@ if [ -r "$PS1_FILE" ]; then
. "$PS1_FILE"
fi
$MARKER_END
EOF
EOF2
echo "✅ Ferdig."
echo "Logg ut/inn (eller åpne ny shell) for å se global PS1."

View File

@@ -10,44 +10,380 @@ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SRC_PS1="$REPO_ROOT/ps1/ps1.sh"
SRC_BANNER="$REPO_ROOT/banner/banner.sh"
DST_PS1="/etc/profile.d/ps1.sh"
DST_BANNER="/etc/profile.d/banner.sh"
BASH_BASHRC="/etc/bash.bashrc"
MARKER_START="# >>> global ps1 (managed) >>>"
MARKER_END="# <<< global ps1 (managed) <<<"
MARKER_START="# >>> dotfiles (managed) >>>"
MARKER_END="# <<< dotfiles (managed) <<<"
if [[ ! -r "$SRC_PS1" ]]; then
echo "Fant ikke $SRC_PS1"
exit 1
# Select install mode (PS1, banner, or both)
install_ps1=1
install_banner=1
season_mode="dynamic"
season_choice=""
style_choice="aurora"
style_pack="standard"
contest_layout="day-time-user"
holiday_choice="christmas"
git_choice="0"
if [[ -t 0 ]]; then
echo "Install options:"
echo " 1) PS1 only"
echo " 2) Banner only"
echo " 3) Both (PS1 + banner)"
read -r -p "Choose [3]: " install_choice
case "${install_choice}" in
1) install_ps1=1; install_banner=0 ;;
2) install_ps1=0; install_banner=1 ;;
""|3) install_ps1=1; install_banner=1 ;;
*) echo "Invalid choice, using both."; install_ps1=1; install_banner=1 ;;
esac
if [[ "$install_ps1" -eq 1 ]]; then
echo
echo "PS1 mode:"
echo " 1) Single season (static)"
echo " 2) Dynamic season (auto, shifts with the year)"
echo " 3) Contest pack (static)"
echo " 4) Holidays pack (static)"
echo " 5) Custom pack (static)"
read -r -p "Choose [3]: " season_mode_choice
case "${season_mode_choice}" in
1)
season_mode="static"
echo "Pick a season:"
echo " 1) Winter"
echo " 2) Spring"
echo " 3) Summer"
echo " 4) Autumn"
read -r -p "Choose [1]: " season_pick
case "${season_pick}" in
2) season_choice="spring" ;;
3) season_choice="summer" ;;
4) season_choice="autumn" ;;
""|1) season_choice="winter" ;;
*) echo "Invalid choice, using winter."; season_choice="winter" ;;
esac
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)
season_mode="dynamic"
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)
season_mode="static"
style_pack="contest"
contest_layout="day-time-user"
echo "Contest 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
;;
4)
season_mode="dynamic"
style_pack="holiday"
echo "Holiday theme:"
echo " 1) Christmas"
echo " 2) Easter"
echo " 3) Halloween"
echo " 4) Valentine"
echo " 5) Thanksgiving"
echo " 6) New Year"
read -r -p "Choose [1]: " holiday_pick
case "${holiday_pick}" in
2) holiday_choice="easter" ;;
3) holiday_choice="halloween" ;;
4) holiday_choice="valentine" ;;
5) holiday_choice="thanksgiving" ;;
6) holiday_choice="newyear" ;;
""|1) holiday_choice="christmas" ;;
*) echo "Invalid choice, using christmas."; holiday_choice="christmas" ;;
esac
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
;;
5)
season_mode="static"
style_pack="custom"
;;
*)
echo "Invalid choice, using dynamic."
season_mode="dynamic"
style_pack="standard"
;;
esac
if [[ "$style_pack" == "contest" ]]; then
echo
echo "Style presets:"
echo " 1) Aurora - Powerline blocks, seasonal palette, two-line"
echo " Preview: [date time user] > [@host /path]"
echo " 2) Neon - Magenta/cyan cyber blocks, high contrast"
echo " Preview: [user time] > [@host /path]"
echo " 3) Forge - Warm copper blocks, heavy frame"
echo " Preview: [date time user] > [@host /path]"
echo " 4) Circuit - Green scanline, minimal rails"
echo " Preview: [user time] - @host /path"
echo " 5) Mono - Clean monochrome, fast read"
echo " Preview: [date time user] @host /path"
echo " 6) Git - Minimal with git capsule"
echo " Preview: [date time user] @host - /path (git)"
echo " 7) Hawolex - Winter neon, tech icons"
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
case "${style_pick}" in
2) style_choice="neon" ;;
3) style_choice="forge" ;;
4) style_choice="circuit" ;;
5) style_choice="mono" ;;
6) style_choice="git" ;;
7) style_choice="hawolex" ;;
8) style_choice="hawolexv2" ;;
""|1) style_choice="aurora" ;;
*) echo "Invalid choice, using aurora."; style_choice="aurora" ;;
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
style_choice="aurora"
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
cp -f "$SRC_PS1" "$DST_PS1"
chmod 0644 "$DST_PS1"
if [[ "$install_banner" -eq 1 ]]; then
# Ensure required packages are installed (no prompt)
missing_pkgs=()
if ! command -v figlet >/dev/null 2>&1; then
missing_pkgs+=("figlet")
fi
if ! command -v lolcat >/dev/null 2>&1 && [[ ! -x /usr/games/lolcat ]]; then
missing_pkgs+=("lolcat")
fi
if ! command -v landscape-sysinfo >/dev/null 2>&1; then
missing_pkgs+=("landscape-common")
fi
# Ensure /etc/bash.bashrc sources it (idempotent)
if ((${#missing_pkgs[@]} > 0)); then
if command -v apt-get >/dev/null 2>&1; then
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y "${missing_pkgs[@]}"
elif command -v dnf >/dev/null 2>&1; then
dnf install -y "${missing_pkgs[@]}"
elif command -v yum >/dev/null 2>&1; then
yum install -y "${missing_pkgs[@]}"
elif command -v pacman >/dev/null 2>&1; then
pacman -Sy --noconfirm "${missing_pkgs[@]}"
elif command -v zypper >/dev/null 2>&1; then
zypper -n in "${missing_pkgs[@]}"
else
echo "Fant ingen støttet pakkehåndterer for å installere: ${missing_pkgs[*]}"
exit 1
fi
fi
# Prompt for punchline (stored globally)
current_punchline="Hello"
if [[ -r /etc/ps1-punchline ]]; then
current_punchline="$(head -n 1 /etc/ps1-punchline 2>/dev/null || echo "Hello")"
current_punchline="${current_punchline%%$'\r'}"
fi
if [[ -t 0 ]]; then
echo "Punchline (enter for å beholde eksisterende):"
read -r -p "> " new_punchline
else
new_punchline=""
fi
if [[ -n "${new_punchline}" ]]; then
printf '%s\n' "${new_punchline}" > /etc/ps1-punchline
else
printf '%s\n' "${current_punchline}" > /etc/ps1-punchline
fi
chmod 0644 /etc/ps1-punchline
fi
# Copy modules
if [[ "$install_ps1" -eq 1 ]]; then
cp -f "$SRC_PS1" "$DST_PS1"
chmod 0644 "$DST_PS1"
{
printf 'PS1_SEASON_MODE=%s\n' "$season_mode"
if [[ "$season_mode" == "static" && -n "$season_choice" ]]; then
printf 'PS1_SEASON=%s\n' "$season_choice"
fi
} > /etc/ps1-season
chmod 0644 /etc/ps1-season
{
printf 'PS1_STYLE=%s\n' "$style_choice"
printf 'PS1_STYLE_PACK=%s\n' "$style_pack"
if [[ "$style_pack" == "contest" || "$style_pack" == "holiday" || "$style_pack" == "standard" ]]; then
printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout"
fi
if [[ "$style_pack" == "holiday" ]]; then
printf 'PS1_HOLIDAY=%s\n' "${holiday_choice:-christmas}"
fi
printf 'PS1_GIT=%s\n' "$git_choice"
} > /etc/ps1-style
chmod 0644 /etc/ps1-style
else
rm -f "$DST_PS1"
rm -f /etc/ps1-season
rm -f /etc/ps1-style
fi
if [[ "$install_banner" -eq 1 ]]; then
cp -f "$SRC_BANNER" "$DST_BANNER"
chmod 0644 "$DST_BANNER"
else
rm -f "$DST_BANNER"
fi
# Ensure /etc/bash.bashrc sources both (idempotent)
tmp="$(mktemp)"
orig_mode="$(stat -c '%a' "$BASH_BASHRC")"
orig_owner="$(stat -c '%u' "$BASH_BASHRC")"
orig_group="$(stat -c '%g' "$BASH_BASHRC")"
awk -v s="$MARKER_START" -v e="$MARKER_END" '
$0==s {inside=1; next}
$0==e {inside=0; next}
!inside {print}
' "$BASH_BASHRC" > "$tmp"
cat "$tmp" > "$BASH_BASHRC"
rm -f "$tmp"
cat >> "$BASH_BASHRC" <<EOF
cat >> "$tmp" <<EOF
$MARKER_START
# Load global PS1 (managed)
if [ -r "$DST_PS1" ]; then
. "$DST_PS1"
# Load PS1 + Banner (managed)
$(if [[ "$install_ps1" -eq 1 ]]; then cat <<'INNER'
if [ -r "/etc/profile.d/ps1.sh" ]; then
. "/etc/profile.d/ps1.sh"
fi
INNER
fi)
$(if [[ "$install_banner" -eq 1 ]]; then cat <<'INNER'
if [ -r "/etc/profile.d/banner.sh" ]; then
. "/etc/profile.d/banner.sh"
fi
INNER
fi)
$MARKER_END
EOF
echo "✅ Linux/WSL global PS1 installert:"
echo " $DST_PS1"
echo " og sourcet fra $BASH_BASHRC"
install -m "$orig_mode" -o "$orig_owner" -g "$orig_group" "$tmp" "$BASH_BASHRC"
if command -v restorecon >/dev/null 2>&1; then
restorecon "$BASH_BASHRC" >/dev/null 2>&1 || true
fi
rm -f "$tmp"
echo "✅ Installert globalt (Linux/WSL):"
if [[ "$install_ps1" -eq 1 ]]; then
echo " - $DST_PS1"
fi
if [[ "$install_banner" -eq 1 ]]; then
echo " - $DST_BANNER"
fi
echo " - sourcet fra $BASH_BASHRC"
echo
echo "Åpne et nytt shell for å se endringene."
echo
echo "Disable per bruker:"
echo " export DISABLE_GLOBAL_PS1=1"
echo " eller touch ~/.config/ps1/disable"
echo " export DISABLE_GLOBAL_BANNER=1"
echo " eller:"
echo " mkdir -p ~/.config/ps1 && touch ~/.config/ps1/disable # disable PS1"
echo " mkdir -p ~/.config/ps1 && touch ~/.config/ps1/disable-banner # disable banner"

View File

@@ -7,14 +7,242 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SRC_PS1="$REPO_ROOT/ps1/ps1.sh"
DST_DIR="$HOME/.config/ps1"
DST_PS1="$DST_DIR/ps1.sh"
SEASON_FILE="$DST_DIR/season"
STYLE_FILE="$DST_DIR/style"
MARKER_START="# >>> user ps1 (managed) >>>"
MARKER_END="# <<< user ps1 (managed) <<<"
season_mode="dynamic"
season_choice=""
style_choice="aurora"
contest_layout="day-time-user"
holiday_choice="christmas"
git_choice="0"
if [[ -t 0 ]]; then
style_pack="standard"
echo "PS1 mode:"
echo " 1) Single season (static)"
echo " 2) Dynamic season (auto, shifts with the year)"
echo " 3) Contest pack (static)"
echo " 4) Holidays pack (static)"
echo " 5) Custom pack (static)"
read -r -p "Choose [3]: " season_mode_choice
case "${season_mode_choice}" in
1)
season_mode="static"
echo "Pick a season:"
echo " 1) Winter"
echo " 2) Spring"
echo " 3) Summer"
echo " 4) Autumn"
read -r -p "Choose [1]: " season_pick
case "${season_pick}" in
2) season_choice="spring" ;;
3) season_choice="summer" ;;
4) season_choice="autumn" ;;
""|1) season_choice="winter" ;;
*) echo "Invalid choice, using winter."; season_choice="winter" ;;
esac
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)
season_mode="dynamic"
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)
season_mode="static"
style_pack="contest"
contest_layout="day-time-user"
echo "Contest 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
;;
4)
season_mode="dynamic"
style_pack="holiday"
echo "Holiday theme:"
echo " 1) Christmas"
echo " 2) Easter"
echo " 3) Halloween"
echo " 4) Valentine"
echo " 5) Thanksgiving"
echo " 6) New Year"
read -r -p "Choose [1]: " holiday_pick
case "${holiday_pick}" in
2) holiday_choice="easter" ;;
3) holiday_choice="halloween" ;;
4) holiday_choice="valentine" ;;
5) holiday_choice="thanksgiving" ;;
6) holiday_choice="newyear" ;;
""|1) holiday_choice="christmas" ;;
*) echo "Invalid choice, using christmas."; holiday_choice="christmas" ;;
esac
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
;;
5)
season_mode="static"
style_pack="custom"
;;
*)
echo "Invalid choice, using dynamic."
season_mode="dynamic"
style_pack="standard"
;;
esac
if [[ "$style_pack" == "contest" ]]; then
echo
echo "Style presets:"
echo " 1) Aurora - Powerline blocks, seasonal palette, two-line"
echo " Preview: [date time user] > [@host /path]"
echo " 2) Neon - Magenta/cyan cyber blocks, high contrast"
echo " Preview: [user time] > [@host /path]"
echo " 3) Forge - Warm copper blocks, heavy frame"
echo " Preview: [date time user] > [@host /path]"
echo " 4) Circuit - Green scanline, minimal rails"
echo " Preview: [user time] - @host /path"
echo " 5) Mono - Clean monochrome, fast read"
echo " Preview: [date time user] @host /path"
echo " 6) Git - Minimal with git capsule"
echo " Preview: [date time user] @host - /path (git)"
echo " 7) Hawolex - Winter neon, tech icons"
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
case "${style_pick}" in
2) style_choice="neon" ;;
3) style_choice="forge" ;;
4) style_choice="circuit" ;;
5) style_choice="mono" ;;
6) style_choice="git" ;;
7) style_choice="hawolex" ;;
8) style_choice="hawolexv2" ;;
""|1) style_choice="aurora" ;;
*) echo "Invalid choice, using aurora."; style_choice="aurora" ;;
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
style_choice="aurora"
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
mkdir -p "$DST_DIR"
cp -f "$SRC_PS1" "$DST_PS1"
chmod 0644 "$DST_PS1"
{
printf 'PS1_SEASON_MODE=%s\n' "$season_mode"
if [[ "$season_mode" == "static" && -n "$season_choice" ]]; then
printf 'PS1_SEASON=%s\n' "$season_choice"
fi
} > "$SEASON_FILE"
chmod 0644 "$SEASON_FILE"
{
printf 'PS1_STYLE=%s\n' "$style_choice"
printf 'PS1_STYLE_PACK=%s\n' "$style_pack"
if [[ "$style_pack" == "contest" || "$style_pack" == "holiday" || "$style_pack" == "standard" ]]; then
printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout"
fi
if [[ "$style_pack" == "holiday" ]]; then
printf 'PS1_HOLIDAY=%s\n' "${holiday_choice:-christmas}"
fi
printf 'PS1_GIT=%s\n' "$git_choice"
} > "$STYLE_FILE"
chmod 0644 "$STYLE_FILE"
add_source_block() {
local file="$1"
[[ -f "$file" ]] || touch "$file"

View File

@@ -18,6 +18,9 @@ if [[ -f "$HOME/.config/ps1/disable" ]]; then
return 0
fi
# Force NF separators globally (rounded caps) unless ASCII is forced.
export PS1_FORCE_NF=1
# Nerd Font detection (best-effort) + overrides
# PS1_FORCE_ASCII=1 -> always fallback separators
# PS1_FORCE_NF=1 -> always Nerd Font separators
@@ -34,19 +37,366 @@ _ps1_has_nf() {
return 1
}
# Time-based emoji (Europe/Oslo)
# Season selection (dynamic or static)
# PS1_SEASON_MODE=dynamic|static
# PS1_SEASON= winter|spring|summer|autumn
# Also reads config from /etc/ps1-season or ~/.config/ps1/season
_ps1_season_config() {
local cfg=""
if [[ -r /etc/ps1-season ]]; then
cfg="/etc/ps1-season"
elif [[ -r "$HOME/.config/ps1/season" ]]; then
cfg="$HOME/.config/ps1/season"
fi
if [[ -n "$cfg" ]]; then
while IFS='=' read -r k v; do
k="${k//[[:space:]]/}"
v="${v//[[:space:]]/}"
case "$k" in
PS1_SEASON_MODE) export PS1_SEASON_MODE="$v" ;;
PS1_SEASON) export PS1_SEASON="$v" ;;
esac
done < "$cfg"
fi
}
_ps1_season_dynamic() {
local mm dd m d
mm=$(TZ=Europe/Oslo date +%m); dd=$(TZ=Europe/Oslo date +%d)
m=$((10#$mm)); d=$((10#$dd))
if (( m >= 3 && m <= 5 )); then
echo "spring"
elif (( m >= 6 && m <= 8 )); then
echo "summer"
elif (( m == 9 || m == 10 || (m == 11 && d < 15) )); then
echo "autumn"
else
echo "winter"
fi
}
_ps1_season() {
_ps1_season_config
local mode="${PS1_SEASON_MODE:-dynamic}"
local season="${PS1_SEASON:-}"
if [[ "$mode" == "static" && -n "$season" ]]; then
echo "$season"
else
_ps1_season_dynamic
fi
}
# Style selection (aurora/neon/forge/circuit/mono/git/hawolex + custom pack)
# 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
# Also reads config from /etc/ps1-style or ~/.config/ps1/style
_ps1_style_config() {
local cfg=""
if [[ -r /etc/ps1-style ]]; then
cfg="/etc/ps1-style"
elif [[ -r "$HOME/.config/ps1/style" ]]; then
cfg="$HOME/.config/ps1/style"
fi
if [[ -n "$cfg" ]]; then
while IFS='=' read -r k v; do
k="${k//[[:space:]]/}"
v="${v//[[:space:]]/}"
case "$k" in
PS1_STYLE) export PS1_STYLE="$v" ;;
PS1_STYLE_PACK) export PS1_STYLE_PACK="$v" ;;
PS1_CONTEST_LAYOUT) export PS1_CONTEST_LAYOUT="$v" ;;
PS1_HOLIDAY) export PS1_HOLIDAY="$v" ;;
PS1_GIT) export PS1_GIT="$v" ;;
esac
done < "$cfg"
fi
}
_ps1_style() {
_ps1_style_config
local style="${PS1_STYLE:-aurora}"
echo "$style"
}
_ps1_style_pack() {
_ps1_style_config
local pack="${PS1_STYLE_PACK:-standard}"
echo "$pack"
}
_ps1_contest_layout() {
_ps1_style_config
local layout="${PS1_CONTEST_LAYOUT:-day-time-user}"
echo "$layout"
}
_ps1_holiday() {
_ps1_style_config
local holiday="${PS1_HOLIDAY:-christmas}"
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) ----
__try_source_git_prompt() {
local candidates=(
"/usr/share/git/completion/git-prompt.sh"
"/usr/local/etc/bash_completion.d/git-prompt.sh"
"/etc/bash_completion.d/git-prompt.sh"
)
for f in "${candidates[@]}"; do
[[ -r "$f" ]] && source "$f" && return 0
done
return 1
}
__try_source_git_prompt >/dev/null 2>&1
__git_capsule() {
local info status=""
local clean="✨"
local dirty="🔨"
local staged="📌"
local untracked="🧷"
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
[[ -z "$info" ]] && return 0
if (( has_ps1 )); then
if [[ "$info" == *"*"* ]]; then status+=" $dirty"; fi
if [[ "$info" == *"+"* ]]; then status+=" $staged"; fi
if [[ "$info" == *"%"* ]]; then status+=" $untracked"; fi
if [[ "$info" == *"$"* ]]; then status+=" $stashed"; fi
if [[ -z "$status" ]]; then status=" $clean"; fi
info="${info//\%/}"
info="${info//\*/}"
info="${info//\+/}"
info="${info//\$/}"
fi
info="$(printf "%s" "$info" | xargs)"
printf " ⟦%s⟧%s" "$info" "$status"
}
# Time-based emoji with seasonal accents (Europe/Oslo)
_ps1_pick_icon() {
local list_name="$1"
local season="$2"
local day
local -a list
local idx
local offset=0
day=$(TZ=Europe/Oslo date +%j)
case "$season" in
spring) offset=11 ;;
summer) offset=23 ;;
autumn) offset=37 ;;
christmas) offset=61 ;;
easter) offset=73 ;;
halloween) offset=97 ;;
valentine) offset=109 ;;
thanksgiving) offset=131 ;;
newyear) offset=151 ;;
hawolex) offset=173 ;;
*) offset=0 ;;
esac
eval "list=(\"\${${list_name}[@]}\")"
if ((${#list[@]} == 0)); then
echo ""
return
fi
idx=$(( (10#$day + offset) % ${#list[@]} ))
echo "${list[$idx]}"
}
_ps1_symbol() {
local hh mm h m
hh=$(TZ=Europe/Oslo date +%H); mm=$(TZ=Europe/Oslo date +%M)
h=$((10#$hh)); m=$((10#$mm))
if (( h >= 5 && h <= 8 )); then echo "🌅"
elif (( h >= 9 && h <= 10 )); then echo "☕"
local season="${__PS1_SEASON:-winter}"
local pack="${__PS1_STYLE_PACK:-standard}"
local holiday="${__PS1_HOLIDAY:-christmas}"
local rot_season="${season}"
local sunrise coffee work evening night
local -a sunrise_list work_list
if [[ "$__PS1_STYLE" == "hawolex" ]]; then
rot_season="hawolex"
sunrise_list=( "💻" "🚗" "🔊" "🎮" )
work_list=( "🎧" "🕹️" "📟" "🧩" )
coffee="☕"; evening="🌆"; night="🌙"
elif [[ "$pack" == "contest" ]]; then
rot_season="winter"
sunrise_list=( "⚡️" "🛰️" "🧬" "🧠" )
work_list=( "🛠️" "💾" "🧪" "🧩" )
coffee="☕"; evening="🎛️"; night="🕶️"
elif [[ "$pack" == "holiday" ]]; then
rot_season="$holiday"
case "$holiday" in
christmas)
sunrise_list=( "🎄" "🎅" "❄️" "⛄" )
work_list=( "🎁" "🧤" "🧣" "🦌" )
coffee="☕"; evening="🌟"; night="🕯️"
;;
easter)
sunrise_list=( "🐣" "🥚" "🌷" "🌤" )
work_list=( "🐰" "🌼" "🧺" "🍫" )
coffee="☕"; evening="🌅"; night="🌙"
;;
halloween)
sunrise_list=( "🎃" "🦇" "🌕" "🕸️" )
work_list=( "👻" "💀" "🕯️" "🧪" )
coffee="☕"; evening="🌆"; night="🕷️"
;;
valentine)
sunrise_list=( "💖" "🌹" "💘" "💕" )
work_list=( "💌" "🍫" "🕊️" "💗" )
coffee="☕"; evening="🌆"; night="🌙"
;;
thanksgiving)
sunrise_list=( "🦃" "🍁" "🥧" "🍂" )
work_list=( "🍽️" "🌾" "🧺" "🥖" )
coffee="☕"; evening="🌆"; night="🌙"
;;
newyear)
sunrise_list=( "🎆" "🥂" "🎇" "✨" )
work_list=( "🗓️" "⏳" "🚀" "✨" )
coffee="☕"; evening="🌆"; night="🌙"
;;
*)
sunrise_list=( "🎉" "✨" "🎊" "🌟" )
work_list=( "🧩" "🛠️" "💾" "🧪" )
coffee="☕"; evening="🌆"; night="🌙"
;;
esac
else
case "$season" in
spring)
sunrise_list=( "🌷" "🌱" "🐣" "🌤" )
work_list=( "🌿" "🪴" "🐝" "🌼" )
coffee="☕"; evening="🌤"; night="🌙"
;;
summer)
sunrise_list=( "🌞" "🏖️" "🌅" "🌤" )
work_list=( "🏄" "🏖️" "🚤" "🌴" )
coffee="🧃"; evening="🌇"; night="🌙"
;;
autumn)
sunrise_list=( "🍁" "🍂" "🌫️" "🌦️" )
work_list=( "🍂" "🍄" "🎃" "🪵" )
coffee="☕"; evening="🌆"; night="🌙"
;;
*)
sunrise_list=( "🏔️" "🌨️" "❄️" "🌌" )
work_list=( "🎿" "⛷️" "🏂" "🧊" )
coffee="☕"; evening="🌆"; night="🌙"
;;
esac
fi
sunrise="$(_ps1_pick_icon sunrise_list "$rot_season")"
work="$(_ps1_pick_icon work_list "$rot_season")"
if (( h >= 5 && h <= 8 )); then echo "$sunrise"
elif (( h >= 9 && h <= 10 )); then echo "$coffee"
elif (( h == 11 && m < 30 )); then echo "🥪"
elif (( (h == 11 && m >= 30) || (h >= 12 && h <= 15) )); then echo "💻"
elif (( (h == 11 && m >= 30) || (h >= 12 && h <= 15) )); then echo "$work"
elif (( h == 16 )); then echo "🍲"
elif (( h >= 17 && h <= 22 )); then echo "🌆"
else echo "🌙"
elif (( h >= 17 && h <= 22 )); then echo "$evening"
else echo "$night"
fi
}
@@ -70,49 +420,549 @@ __PS1_SYM=""
__PS1_PATH=""
__PS1_STATUS=0
__PS1_USE_NF=0
__PS1_SEASON="winter"
__PS1_STYLE="aurora"
__PS1_STYLE_PACK="standard"
__PS1_CONTEST_LAYOUT="day-time-user"
__PS1_HOLIDAY="christmas"
__PS1_GIT=0
_ps1_update() {
__PS1_STATUS=$?
__PS1_SYM="$(_ps1_symbol)"
__PS1_PATH="$(_ps1_path)"
if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi
}
ps1_on() {
PROMPT_COMMAND="_ps1_update"
_ps1_set_prompt() {
local RST="\[\e[0m\]"
# Two-zone palette
# Zone 1: gray-blue pastel (date/time/user)
local Z1_BG="\[\e[48;5;61m\]"
local Z1_FG="\[\e[38;5;255m\]"
# Zone 2: turquoise / cool green (host/path)
local Z2_BG="\[\e[48;5;37m\]"
local Z2_FG="\[\e[38;5;255m\]"
local PATH_FG="\[\e[38;5;194m\]"
# Frame
local FRAME="\[\e[38;5;60m\]"
# Seasonal palettes (Z1 is darker than Z2)
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
Z1_BG_CODE=24
Z2_BG_CODE=31
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;51m\]"
FRAME="\[\e[38;5;23m\]"
elif [[ "$__PS1_STYLE_PACK" == "holiday" ]]; then
case "$__PS1_HOLIDAY" in
christmas)
Z1_BG_CODE=52
Z2_BG_CODE=28
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;194m\]"
FRAME="\[\e[38;5;88m\]"
;;
easter)
Z1_BG_CODE=186
Z2_BG_CODE=150
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;16m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;16m\]"
PATH_FG="\[\e[38;5;94m\]"
FRAME="\[\e[38;5;143m\]"
;;
halloween)
Z1_BG_CODE=53
Z2_BG_CODE=166
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;16m\]"
PATH_FG="\[\e[38;5;16m\]"
FRAME="\[\e[38;5;89m\]"
;;
valentine)
Z1_BG_CODE=198
Z2_BG_CODE=205
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;224m\]"
FRAME="\[\e[38;5;162m\]"
;;
thanksgiving)
Z1_BG_CODE=94
Z2_BG_CODE=136
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;230m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;231m\]"
PATH_FG="\[\e[38;5;223m\]"
FRAME="\[\e[38;5;130m\]"
;;
newyear)
Z1_BG_CODE=17
Z2_BG_CODE=20
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;255m\]"
PATH_FG="\[\e[38;5;229m\]"
FRAME="\[\e[38;5;19m\]"
;;
*)
Z1_BG_CODE=24
Z2_BG_CODE=31
Z1_BG="\[\e[48;5;${Z1_BG_CODE}m\]"
Z1_FG="\[\e[38;5;255m\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
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\]"
FRAME="\[\e[38;5;23m\]"
;;
esac
else
case "$__PS1_SEASON" in
spring)
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\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_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\]"
;;
summer)
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\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
Z2_FG="\[\e[38;5;0m\]"
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\]"
;;
autumn)
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\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
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\]"
FRAME="\[\e[38;5;95m\]"
;;
*)
# winter (default)
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\]"
Z2_BG="\[\e[48;5;${Z2_BG_CODE}m\]"
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;152m\]"
FRAME="\[\e[38;5;60m\]"
;;
esac
fi
# Status colors
local OK="\[\e[38;5;76m\]"
local BAD="\[\e[38;5;203m\]"
local BOLD="\[\e[1m\]"
local NOBOLD="\[\e[22m\]"
# Separators with fallback
local SEP_EXPR='\$( [ "$__PS1_USE_NF" -eq 1 ] && printf "" || printf "▶" )'
local LEFT_EXPR='\$( [ "$__PS1_USE_NF" -eq 1 ] && printf "" || printf "[" )'
local RIGHT_EXPR='\$( [ "$__PS1_USE_NF" -eq 1 ] && printf "" || printf "]" )'
local left right sep
if [[ "$__PS1_USE_NF" -eq 1 ]]; then
left=""; right=""; sep=""
else
left="["; right="]"; sep="▶"
fi
local PROMPT_SYM="\$( [ \$__PS1_STATUS -eq 0 ] && printf '${OK}' || printf '${BAD}' )➜${RST}"
local prompt_sym
if [[ "$__PS1_STATUS" -eq 0 ]]; then
prompt_sym="${OK}${BOLD}${NOBOLD}${RST}"
else
prompt_sym="${BAD}${BOLD}${NOBOLD}${RST}"
fi
# Keep order: date time user | host path, newline, then prompt
PS1="\
${FRAME}╭─${RST}\
${Z1_BG}${Z1_FG}${LEFT_EXPR} \d \A \u ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${SEP_EXPR}${RST}\
${Z2_BG}${Z2_FG} @\h ${PATH_FG}\${__PS1_PATH} ${RST}${Z2_BG}${Z2_FG}${RIGHT_EXPR}${RST}\
\n${FRAME}╰── ${RST}${PROMPT_SYM} \${__PS1_SYM} "
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 L_HOST="@\\h"
local PREFIX=""
local HOST_PART="${L_HOST}"
local PATH_PART="${__PS1_PATH}"
local PATH_SEP=" "
local END_PAD=" "
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
user-time) L1="\\u \\A" ;;
time-user) L1="\\A \\u" ;;
day-time) L1="\\d \\A" ;;
*) L1="\\d \\A \\u" ;;
esac
fi
if [[ "$__PS1_STYLE_PACK" == "contest" || "$__PS1_STYLE_PACK" == "holiday" ]]; then
HOST_PART="@\\h - ${__PS1_PATH}"
PATH_PART=""
PATH_SEP=""
PREFIX="\n"
fi
case "$style" in
neon)
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 N2_BG="\[\e[48;5;${N2_BG_CODE}m\]"
local N2_FG="\[\e[38;5;16m\]"
local N_PATH_FG="\[\e[38;5;16m\]"
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="\
${PREFIX}${N_FRAME}╭─${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}${RST}${N_RIGHT_FG}${N_RIGHT}${RST}\
\n${N_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
forge)
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 F2_BG="\[\e[48;5;${F2_BG_CODE}m\]"
local F2_FG="\[\e[38;5;231m\]"
local F_PATH_FG="\[\e[38;5;224m\]"
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="\
${PREFIX}${F_FRAME}╭─${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}${RST}${F_RIGHT_FG}${F_RIGHT}${RST}\
\n${F_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
circuit)
local C_FG="\[\e[38;5;46m\]"
local C_DIM="\[\e[38;5;22m\]"
local C_PATH="\[\e[38;5;120m\]"
PS1="\
${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}\
\n${C_DIM}┗━${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
mono)
local M_FG="\[\e[38;5;250m\]"
local M_DIM="\[\e[38;5;240m\]"
PS1="\
${PREFIX}${M_FG}${L1}${M_DIM}${HOST_PART}${PATH_SEP}${M_FG}${PATH_PART}${RST}\
\n${M_DIM}└─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
;;
git)
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
local G_FRAME="\[\e[38;5;60m\]"
local G_Z1_BG="\[\e[48;5;61m\]"
local G_Z1_FG="\[\e[38;5;255m\]"
local G_Z2_BG="\[\e[48;5;37m\]"
local G_Z2_FG="\[\e[38;5;255m\]"
local G_PATH_FG="\[\e[38;5;194m\]"
local GIT_INFO="$(__git_capsule)"
local G_LEFT=""
local G_RIGHT=""
local G_SEP=""
local G_END_PAD=" "
local G_LEFT_FG="\[\e[38;5;61m\]"
local G_RIGHT_FG="\[\e[38;5;37m\]"
PS1="\
${PREFIX}${G_FRAME}╭─${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}${G_END_PAD}${RST}${G_RIGHT_FG}${G_RIGHT}${RST}\
\n${G_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} ${GIT_INFO} "
;;
hawolex)
local H_FRAME="\[\e[38;5;24m\]"
local H_Z1_BG="\[\e[48;5;54m\]"
local H_Z1_FG="\[\e[38;5;255m\]"
local H_Z2_BG="\[\e[48;5;31m\]"
local H_Z2_FG="\[\e[38;5;255m\]"
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="\
${PREFIX}${H_FRAME}╭─${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}${RST}${H_RIGHT_FG}${H_RIGHT}${RST}\
\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)
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}\
${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}\
\n${FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
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
}
_ps1_update() {
__PS1_STATUS=$?
__PS1_SEASON="$(_ps1_season)"
__PS1_STYLE_PACK="$(_ps1_style_pack)"
__PS1_CONTEST_LAYOUT="$(_ps1_contest_layout)"
__PS1_HOLIDAY="$(_ps1_holiday)"
__PS1_STYLE="$(_ps1_style)"
__PS1_GIT="${PS1_GIT:-0}"
__PS1_SYM="$(_ps1_symbol)"
__PS1_PATH="$(_ps1_path)"
if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi
_ps1_set_prompt
}
ps1_on() {
if [[ "${PROMPT_COMMAND:-}" != *"_ps1_update"* ]]; then
if [[ -n "${PROMPT_COMMAND:-}" ]]; then
PROMPT_COMMAND="${PROMPT_COMMAND}; _ps1_update"
else
PROMPT_COMMAND="_ps1_update"
fi
fi
_ps1_set_prompt
}
ps1_off() { :; }

BIN
images/bash-pallete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
images/contest.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

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
```