Last active
April 26, 2026 01:09
-
-
Save miaLDN/632cbaec40e44f65c4e77e07c450e633 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| # | |
| # shellcheck shell=bash | |
| # shellcheck disable=SC2034 | |
| # | |
| # (C) miaLDN 2026 | |
| # Control Sequence Introducer (CSI) = `ESC[` | |
| CSI="\033[" | |
| CSI_END="m" | |
| FG_XTERM256="38:" | |
| BG_XTERM256="38:" | |
| FG_RGB24="38:2::" | |
| BG_RGB24="48:2::" | |
| # Generate an xterm256 FG escape code from R G B (0-5) | |
| # Usage: MY_COLOR=$(rgb256 5 2 0) # Returns Orange | |
| rgb256() { | |
| local r=$1 g=$2 b=$3 | |
| local color_idx=$(( 16 + (36 * r) + (6 * g) + b )) | |
| echo -e "${CSI}38;5;${color_idx}m" | |
| } | |
| # Control sequence `CSI n m` is named Select Graphic Rendition (SGR) | |
| # ANSI SGR | |
| ANSI_DEFAULT="${CSI}0m" | |
| BOLD="${CSI}1m" | |
| ITALIC="${CSI}3m" | |
| UNDERLINE="${CSI}4m" | |
| FONT_NORMAL="${CSI}10m" | |
| FONT1="${CSI}11m" | |
| FONT2="${CSI}12m" | |
| FONT3="${CSI}13m" | |
| FONT4="${CSI}14m" | |
| FONT5="${CSI}15m" | |
| FONT6="${CSI}16m" | |
| FONT7="${CSI}17m" | |
| FONT8="${CSI}18m" | |
| NOT_BOLD="${CSI}22m" | |
| NOT_ITALIC="${CSI}22m" | |
| NOT_UNDERLINE="${CSI}24m" | |
| CURSOR_HOME="${CSI}H" | |
| CURSOR_UP="${CSI}A" | |
| CURSOR_DOWN="${CSI}B" | |
| CURSOR_FORWARD="${CSI}C" | |
| CURSOR_BACKWARD="${CSI}D" | |
| CURSOR_NEXT_LINE="${CSI}E" | |
| CURSOR_PREVIOUS_LINE="${CSI}F" | |
| ERASE_LINE="${CSI}K" | |
| ERASE_DISPLAY="${CSI}J" | |
| SMCUP="${CSI}?1049h" #Save cursor position and switch to alternate screen buffer | |
| RMCUP="${CSI}?1049l" # Restore cursor position and switch back to normal screen buffer | |
| # Red background, white bold text | |
| ERR_RED_B="${CSI}48;5;124;97;1m" | |
| # ANSI 16Colors | |
| FG_BLACK="${CSI}30m" | |
| FG_RED="${CSI}31m" | |
| FG_GREEN="${CSI}32m" | |
| FG_YELLOW="${CSI}33m" | |
| FG_BLUE="${CSI}34m" | |
| FG_MAGENTA="${CSI}35m" | |
| FG_CYAN="${CSI}36m" | |
| FG_WHITE="${CSI}37m" | |
| BG_BLACK="${CSI}40m" | |
| BG_RED="${CSI}41m" | |
| BG_GREEN="${CSI}42m" | |
| BG_YELLOW="${CSI}43m" | |
| BG_BLUE="${CSI}44m" | |
| BG_MAGENTA="${CSI}45m" | |
| BG_CYAN="${CSI}46m" | |
| BG_WHITE="${CSI}47m" | |
| # ANSI 16Colors Bright | |
| FG_BLACK_B="${CSI}90m" | |
| FG_RED_B="${CSI}91m" | |
| FG_GREEN_B="${CSI}92m" | |
| FG_YELLOW_B="${CSI}93m" | |
| FG_BLUE_B="${CSI}94m" | |
| FG_MAGENTA_B="${CSI}95m" | |
| FG_CYAN_B="${CSI}96m" | |
| FG_WHITE_B="${CSI}97m" | |
| BG_BLACK_B="${CSI}100m" | |
| BG_RED_B="${CSI}101m" | |
| BG_GREEN_B="${CSI}102m" | |
| BG_YELLOW_B="${CSI}103m" | |
| BG_BLUE_B="${CSI}104m" | |
| BG_MAGENTA_B="${CSI}105m" | |
| BG_CYAN_B="${CSI}106m" | |
| BG_WHITE_B="${CSI}107m" | |
| # ␛[38;5;⟨n⟩m Select foreground color where n is a number from the table below | |
| # ␛[48;5;⟨n⟩m Select background color | |
| # ␛ 0- 7: standard colors (as in ␛ [ 30–37 m) | |
| # ␛ 8- 15: high intensity colors (as in ␛ [ 90–97 m) | |
| # ␛ 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) | |
| # ␛232-255: grayscale from dark to light in 24 steps | |
| # ␛[38;2;⟨r⟩;⟨g⟩;⟨b⟩m select RGB foreground color | |
| # ␛[48;2;⟨r⟩;⟨g⟩;⟨b⟩m select RGB background color | |
| # ␛[39m select default foreground color | |
| # ␛[49m select default background color | |
| # ␛[⟨n⟩m select 8-color mode | |
| # ⟨n⟩ = 30....37 standard foreground | |
| # ⟨n⟩ = 40....47 standard background | |
| # ⟨n⟩ = 90....97 intense foreground | |
| # ⟨n⟩ = 100...107 intense background | |
| # ITU T.416 uses ":" as separator instead of ";" | |
| # ANSI Colors | |
| PLEX_ORANGE="${CSI}48;5;166m" | |
| PLEX_ORANGE_SUBDUED="${CSI}48;2;171;120;10;38;2;255;255;255m" | |
| RED="${CSI}48;5;88m" | |
| PLUM="${CSI}48;5;89m" | |
| PINK="${CSI}48;5;205m" | |
| PINK1="${CSI}48;5;163m" | |
| PINK2="${CSI}48;5;128m" | |
| PINK3="${CSI}48;5;205m" | |
| GREEN1="${CSI}48;5;22m" | |
| GREEN2="${CSI}48;5;28m" | |
| GREEN3="${CSI}48;5;46m" | |
| BLUE="${CSI}48;5;21m" | |
| BLUE2="${CSI}48;5;19m" | |
| BLUE1="${CSI}48;5;18m" | |
| BLUE0="${CSI}48;5;17m" | |
| PURPLE="${CSI}48;5;57m" | |
| ORANGE_TEXT="${CSI}38;5;202m" | |
| BLUE1_TEXT="${CSI}38;5;33m" | |
| BLUE2_TEXT="${CSI}38;5;45m" | |
| BLUE3_TEXT="${CSI}38;5;21m" | |
| BLUE_TEXT="${CSI}38;2;58;150;221m" # #3a96dd | |
| GREEN1_TEXT="${CSI}38;5;34m" | |
| GREEN2_TEXT="${CSI}38;5;40m" | |
| GREEN3_TEXT="${CSI}38;5;46m" | |
| RED_TEXT="${CSI}38;5;124m" | |
| RED1_TEXT="${CSI}38;5;88m" | |
| RED2_TEXT="${CSI}38;5;160m" | |
| RED3_TEXT="${CSI}38;5;196m" | |
| PURPLE_TEXT="${CSI}38;5;63m" | |
| PINK_TEXT="${CSI}38;5;205m" | |
| PINK1_TEXT="${CSI}38;5;198m" | |
| PINK2_TEXT="${CSI}38;5;163m" | |
| PINK3_TEXT="${CSI}38;5;128m" | |
| YELLOW1_TEXT="${CSI}38;5;11m" | |
| YELLOW2_TEXT="${CSI}38;5;229m" | |
| # ANSI Colors Bright | |
| PLEX_ORANGE_B="${CSI}48;5;166;97;1m" # DarkOrange3 #d75f00 | |
| PLEX_ORANGE_SUBDUED_B="${CSI}48;2;171;120;10;38;2;255;255;255;1m" | |
| RED_B="${CSI}48;5;88;1m" | |
| PLUM_B="${CSI}48;5;89;1m" | |
| PINK_B="${CSI}48;5;205;1m" # HotPink #ff5faf | |
| PINK1_B="${CSI}48;5;198;1m" # DeepPink1 #ff0087 | |
| PINK2_B="${CSI}48;5;163;1m" # Magenta3 #d700af | |
| PINK3_B="${CSI}48;5;128;1m" # DarkViolet #af00d7 | |
| GREEN1_B="${CSI}48;5;22;1m" # DarkGreen #005f00 | |
| GREEN2_B="${CSI}48;5;28;1m" # Green4 #008700 | |
| GREEN3_B="${CSI}48;5;46;1m" # Green1 #00ff00 | |
| BLUE_B="${CSI}48;5;21;1m" | |
| BLUE2_B="${CSI}48;5;19;1m" | |
| BLUE1_B="${CSI}48;5;18;1m" | |
| BLUE0_B="${CSI}48;5;17;1m" | |
| PURPLE_B="${CSI}48;5;57;1m" | |
| ORANGE_TEXT_B="${CSI}38;5;202;1m" # OrangeRed1 #ff5f00 | |
| BLUE1_TEXT_B="${CSI}38;5;33;1m" | |
| BLUE2_TEXT_B="${CSI}38;5;45;1m" | |
| GREEN1_TEXT_B="${CSI}38;5;34;1m" | |
| GREEN2_TEXT_B="${CSI}38;5;40;1m" | |
| GREEN3_TEXT_B="${CSI}38;5;46;1m" | |
| RED1_TEXT_B="${CSI}38;5;88;1m" # DarkRed #870000 | |
| RED2_TEXT_B="${CSI}38;5;160;1m" # Red3 #d70000 | |
| RED3_TEXT_B="${CSI}38;5;196;1m" # Red1 #ff0000 | |
| PURPLE_TEXT_B="${CSI}38;5;63;1m" | |
| PINK_TEXT_B="${CSI}38;5;205;1m" | |
| PINK1_TEXT_B="${CSI}38;5;198;1m" | |
| PINK2_TEXT_B="${CSI}38;5;163;1m" | |
| PINK3_TEXT_B="${CSI}38;5;128;1m" | |
| YELLOW1_TEXT_B="${CSI}38;5;11;1m" # Yellow (SYSTEM) #ffff00 | |
| YELLOW2_TEXT_B="${CSI}38;5;229;1m" # Wheat1 #ffffaf | |
| PLUM_TEXT_B="${CSI}38;5;89;1m" | |
| # Pastel colors | |
| # | |
| # ESC[38;2;⟨R⟩;⟨G⟩;⟨B⟩m where R, G, B are integers from 0⋯255 | |
| SOFT_PINK_TEXT_B="${CSI}38;2;255;173;173;1m" | |
| LIGHT_PEACH_TEXT_B="${CSI}38;2;255;214;165;1m" | |
| PASTEL_YELLOW_TEXT_B="${CSI}38;2;253;255;182;1m" | |
| _TEXT_B="${CSI}38;2;202;255;191;1m" | |
| TRON_BLUE_TEXT_B="${CSI}38;2;155;246;255;1m" | |
| _TEXT_B="${CSI}38;2;160;196;255;1m" | |
| _TEXT_B="${CSI}38;2;189;178;255;1m" | |
| _TEXT_B="${CSI}38;2;255;198;255;1m" | |
| C0_TEXT_B="${CSI}38;2;255;173;173;1m" | |
| C1_TEXT_B="${CSI}38;2;255;214;165;1m" | |
| C2_TEXT_B="${CSI}38;2;253;255;182;1m" | |
| C3_TEXT_B="${CSI}38;2;202;255;191;1m" | |
| C4_TEXT_B="${CSI}38;2;155;246;255;1m" | |
| C5_TEXT_B="${CSI}38;2;160;196;255;1m" | |
| C6_TEXT_B="${CSI}38;2;189;178;255;1m" | |
| C7_TEXT_B="${CSI}38;2;255;198;255;1m" | |
| PLEX_ORANGE_SUBDUED_B="${CSI}48;2;171;120;10;38;2;255;255;255;1m" |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
My WIP ANSI color library is also here (it's a partial copy from my Python module, and a refactor is pending):
ansi_colors.sh