diff --git a/Makefile b/Makefile index 48149a9..adf36b9 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ OUT_DIR = dist OUTPUT = $(OUT_DIR)/beddu.sh SRC_DIR = src DEMO_DIR = demo +YEAR = $(shell date +%Y) +IP = $(shell curl -s ipinfo.io/ip) # Find all direct subdirectories of src and sort them alphabetically SUBDIRS = $(sort $(dir $(wildcard $(SRC_DIR)/*/))) @@ -70,10 +72,11 @@ $(OUTPUT): $(ALL_SRC_FILES) @echo '# shellcheck disable=all' >> $(OUTPUT) @echo '#' >> $(OUTPUT) @echo '# beddu.sh - A lightweight bash framework for interactive scripts and pretty output' >> $(OUTPUT) - @echo '# https://github.com/mjsarfatti/beddu' >> $(OUTPUT) - @echo '#' >> $(OUTPUT) @echo '# Version: $(shell git describe --tags --dirty)' >> $(OUTPUT) - @echo '# Generated on: $(shell date)' >> $(OUTPUT) + @echo '#' >> $(OUTPUT) + @echo '# Copyright © $(YEAR) Manuele Sarfatti' >> $(OUTPUT) + @echo '# Licensed under the MIT license' >> $(OUTPUT) + @echo '# See https://github.com/mjsarfatti/beddu' >> $(OUTPUT) @# Process each file, stripping comments, empty lines, and source lines @for file in $(ALL_SRC_FILES); do \ echo "" >> $(OUTPUT); \ diff --git a/README.md b/README.md index 5f7c874..facdb86 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,15 @@ A lightweight bash framework for interactive scripts with pretty output. ## Overview -**Beddu** is a minimalist bash library that makes your terminal scripts more interactive and visually appealing. It provides easy-to-use functions for colorful text, spinners, progress indicators, and user interaction. +**Beddu** is a minimalist bash library that makes your terminal scripts more interactive and visually appealing. It provides easy-to-use and intuitive functions for colorful text, spinners, progress indicators, and user interaction. + +Your scripts will look something like this: + +![Example](./demo/carbon.png) + +And you will easily be able to build things like: + +[![asciicast](https://asciinema.org/a/E4frqYZFk3XR38UkGYs5ASnKC.svg)](https://asciinema.org/a/E4frqYZFk3XR38UkGYs5ASnKC) ## Features @@ -22,7 +30,7 @@ Clone the repository or download `beddu.sh` to your project: # Clone the repository git clone https://github.com/mjsarfatti/beddu.git -# Or download just the script +# Or just download the compiled script curl -O https://raw.githubusercontent.com/mjsarfatti/beddu/main/beddu.sh ``` @@ -59,7 +67,7 @@ pen 39 "ANSI color code 39 (light blue)" pen bold red "Bold red text" # Inline -echo "This is $(pen yellow "yellow"), and this is $(pen bold "bold")" +pen "This is $(pen yellow "yellow"), and this is $(pen bold "bold")" ``` ### Interactive Functions @@ -94,7 +102,7 @@ pen "You selected: $color" # Show a progress spinner spin "Working on it..." sleep 2 -check "Done!" +check "Done!" # Automatically stops and replaces the spinner # Replace lines dynamically pen "This will be replaced..." @@ -103,7 +111,7 @@ repen "Processing started..." sleep 1 repen spin "Almost done..." # Let's add a spinner for good measure sleep 1 -check "Task completed!" # We can directly `check` or `error` after a `spin` call - the message will always replace the spin line +check "Task completed!" # We can directly `check`, `warn`, or `throw` after a `spin` call - the message will always replace the spin line ``` ## Demo @@ -111,7 +119,7 @@ check "Task completed!" # We can directly `check` or `error` after a `spin` call To see it in action paste the following command in your terminal: ```bash -curl -s https://raw.githubusercontent.com/mjsarfatti/beddu/main/demo.sh | bash +curl -s https://raw.githubusercontent.com/mjsarfatti/beddu/main/demo/demo.sh | bash ``` ## Function Reference @@ -119,9 +127,9 @@ curl -s https://raw.githubusercontent.com/mjsarfatti/beddu/main/demo.sh | bash ### Text Formatting - `pen [OPTIONS] TEXT` - Output formatted text - - `-n` - No newline after output (must be the first option if used) + - `-n` - No newline after output - `bold`, `italic`, `underline` - Text styles - - `red`, `green`, `blue`, etc. - Color names + - `black`, `red`, `green`, `yellow`, `blue`, `purple`, `cyan`, `white`, `grey`, `gray` - Color names - `0-255` - ANSI color codes ### User Interaction @@ -134,25 +142,21 @@ curl -s https://raw.githubusercontent.com/mjsarfatti/beddu/main/demo.sh | bash ### Progress Indicators -- `spin MESSAGE` - Show animated spinner -- `check MESSAGE` - Show success indicator (if called right after a spinner, replaces that line) -- `error MESSAGE` - Show error indicator (if called right after a spinner, replaces that line) -- `repen [OPTIONS] MESSAGE` - Like `pen`, but replace the previous line - - `-n` - No newline after output (must be the first option if used) - - `spin`, `check`, `error` - If passed, use this function to print the message - - `bold`, `italic`, `underline` - Text styles - - `red`, `green`, `blue`, etc. - Color names - - `0-255` - ANSI color codes +- `spin MESSAGE` - Show an animated spinner +- `check MESSAGE` - Show a success message (if called right after a spinner, it stops and replaces it) +- `warn MESSAGE` - Show a warning message (if called right after a spinner, it stops and replaces it) +- `throw MESSAGE` - Show an error message (if called right after a spinner, it stops and replaces it) +- `repen [OPTIONS] MESSAGE` - Like `pen`, but replace the previous line (it accepts all the same options) ## FAQ ### Q: It doesn't work on my computer? -A: **Beddu** requires bash v4+. If your bash version checks out, please file an issue! +A: **Beddu** requires bash v4+. If you are on a mac, you probably want to `brew install bash`. If your bash version checks out, please file an issue! ### Q: Can you add feature X? -A: Most likely, not. This is meant to be a _minimal_ toolkit to quickly jot down simple interactive scripts, nothing more. If you are looking for something more complete check out [Gum](https://github.com/charmbracelet/gum) (bash), [Inquire](https://github.com/mikaelmello/inquire) (Rust) or [Enquirer](https://github.com/enquirer/enquirer) (Node). +A: Most likely, not (but never say never). This is meant to be a _minimal_ toolkit to quickly jot down simple interactive scripts, nothing more. If you are looking for something more complete check out [Gum](https://github.com/charmbracelet/gum) (bash), [Inquire](https://github.com/mikaelmello/inquire) (Rust), [Enquirer](https://github.com/enquirer/enquirer) (Node) or [Awesome Bash](https://github.com/awesome-lists/awesome-bash). ## License diff --git a/demo/carbon.png b/demo/carbon.png new file mode 100644 index 0000000..3e9a4e1 Binary files /dev/null and b/demo/carbon.png differ diff --git a/demo/carbon.sh b/demo/carbon.sh new file mode 100755 index 0000000..09a425e --- /dev/null +++ b/demo/carbon.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +. beddu.sh + +line +pen purple "Hello, I'm your IP helper, here to help you will all your IP needs." +line + +choose action "What would you like to do?" "Get my IP" "Get my location" + +case "$action" in + "Get my IP") + run --out ip curl ipinfo.io/ip + line; pen "Your IP is $ip" + ;; + "Get my location") + run --out location curl -s ipinfo.io/loc + line; pen "Your coordinates are $location" + ;; +esac + diff --git a/demo/demo.cast b/demo/demo.cast new file mode 100644 index 0000000..85d35cf --- /dev/null +++ b/demo/demo.cast @@ -0,0 +1,661 @@ +{"version": 2, "width": 105, "height": 22, "timestamp": 1746969298, "env": {"SHELL": "/bin/zsh", "TERM": "screen-256color"}} +[0.0, "o", "\u001b[?1l\u001b>"] +[0.000285, "o", "\u001b[?2004l"] +[0.001299, "o", "\r\r\n"] +[0.017559, "o", "\u001b]0;clear | beddu\u0007"] +[0.021847, "o", "\u001b[H\u001b[J"] +[0.022301, "o", "\u001b[1m\u001b[3m%\u001b[23m\u001b[1m\u001b[0m \r \r"] +[0.032618, "o", "\u001b]0;beddu\u0007"] +[0.07348, "o", "\r\u001b[0m\u001b[23m\u001b[24m\u001b[J\r\n\u001b[1m\ud83d\udcc1 \u001b[0m\u001b[1m\u001b[36m~/beddu\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m\ud83d\udc7e \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[101C\u001b[1A\u001b[1B\u001b[101D"] +[0.073552, "o", "\u001b[?1h\u001b="] +[0.073733, "o", "\u001b[?2004h"] +[0.084579, "o", "\r\r\u001bM\u001bM\u001b[0m\u001b[23m\u001b[24m\u001b[J\r\n\u001b[1m\ud83d\udcc1 \u001b[0m\u001b[1m\u001b[36m~/beddu\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m\ud83d\udc7e \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[101C\u001b[1A\u001b[1B\u001b[101D"] +[0.100007, "o", "\r\r\u001bM\u001bM\u001b[0m\u001b[23m\u001b[24m\u001b[J\r\n\u001b[1m\ud83d\udcc1 \u001b[0m\u001b[1m\u001b[36m~/beddu\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m\ud83d\udc7e \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[101C\u001b[1A\u001b[1B\u001b[101D"] +[1.231819, "o", "."] +[1.234367, "o", "\b\u001b[32m.\u001b[39m"] +[1.234658, "o", "\b\u001b[32m.\u001b[39m\u001b[90m/demo/demo.sh\u001b[39m\u001b[13D"] +[1.631811, "o", "\b\u001b[32m.\u001b[32m/\u001b[39m"] +[1.637327, "o", "\b\b\u001b[39m\u001b[4m.\u001b[39m\u001b[4m/\u001b[24m"] +[2.454336, "o", "\u001b[39md\u001b[39me\u001b[39mm\u001b[39mo\u001b[39m/\u001b[39md\u001b[39me\u001b[39mm\u001b[39mo\u001b[39m.\u001b[39ms\u001b[39mh"] +[2.460739, "o", "\u001b[14D\u001b[24m\u001b[32m.\u001b[24m\u001b[32m/\u001b[32md\u001b[32me\u001b[32mm\u001b[32mo\u001b[32m/\u001b[32md\u001b[32me\u001b[32mm\u001b[32mo\u001b[32m.\u001b[32ms\u001b[32mh\u001b[39m"] +[3.205022, "o", "\u001b[?1l\u001b>"] +[3.205347, "o", "\u001b[?2004l"] +[3.206581, "o", "\r\r\n"] +[3.222789, "o", "\u001b]0;./demo/demo.sh | beddu\u0007"] +[3.384969, "o", "\u001b[?25l\r\n"] +[3.385143, "o", "\u001b[38;5;99m\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\u001b[0m\r\n"] +[3.385273, "o", "\u001b[38;5;99m\u2551 \u2551\u001b[0m\r\n"] +[3.38535, "o", "\u001b[38;5;99m\u2551 \u2551\u001b[0m\r\n"] +[3.385457, "o", "\u001b[38;5;99m\u2551 \u001b[0m"] +[3.385546, "o", "\u001b[38;5;219mBeddu.sh Demo\u001b[0m"] +[3.385618, "o", "\u001b[38;5;99m \u2551\u001b[0m\r\n"] +[3.385691, "o", "\u001b[38;5;99m\u2551 \u2551\u001b[0m\r\n"] +[3.385759, "o", "\u001b[38;5;99m\u2551 \u2551\u001b[0m\r\n"] +[3.38584, "o", "\u001b[38;5;99m\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u001b[0m\r\n"] +[3.385875, "o", "\r\n\r\n\r\n"] +[3.386451, "o", "\u001b[?25l"] +[3.386643, "o", "\u001b[36m\u28f7 \u001b[0m"] +[3.386838, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[3.386891, "o", "\u001b[A"] +[3.386952, "o", "\r"] +[3.387016, "o", "\u001b[36m\u28f7 \u001b[0m"] +[3.387169, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[3.495369, "o", "\u001b[A\r"] +[3.495676, "o", "\u001b[36m\u28ef \u001b[0m"] +[3.496143, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[3.608671, "o", "\u001b[A\r"] +[3.609011, "o", "\u001b[36m\u28df \u001b[0m"] +[3.609519, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[3.721203, "o", "\u001b[A\r"] +[3.721467, "o", "\u001b[36m\u287f \u001b[0m"] +[3.721755, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[3.834076, "o", "\u001b[A\r"] +[3.834409, "o", "\u001b[36m\u28bf \u001b[0m"] +[3.834856, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[3.945917, "o", "\u001b[A\r"] +[3.94604, "o", "\u001b[36m\u28fb \u001b[0m"] +[3.946273, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[4.055835, "o", "\u001b[A\r"] +[4.056153, "o", "\u001b[36m\u28fd \u001b[0m"] +[4.056598, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[4.167802, "o", "\u001b[A\r"] +[4.168027, "o", "\u001b[36m\u28fe \u001b[0m"] +[4.168313, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[4.279213, "o", "\u001b[A\r"] +[4.279657, "o", "\u001b[36m\u28f7 \u001b[0m"] +[4.279832, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[4.391846, "o", "\u001b[A\r"] +[4.391936, "o", "\u001b[36m\u28ef \u001b[0m"] +[4.392484, "o", "\u001b[38;5;219mLoading text formatting...\u001b[0m\r\n"] +[4.5093, "o", "\u001b[A\r\u001b[2K"] +[4.509505, "o", "\u001b[38;5;219m\u001b[3m-- Text formatting --\u001b[0m\r\n"] +[4.509549, "o", "\r\n"] +[4.509625, "o", "\u001b[1mThis text is bold\u001b[0m\r\n"] +[4.509688, "o", "\u001b[3mThis text is italic\u001b[0m\r\n"] +[4.509731, "o", "\u001b[4mThis text is underlined\u001b[0m\r\n\r\n"] +[4.509742, "o", "\r\n"] +[4.510995, "o", "\u001b[?25l"] +[4.511244, "o", "\u001b[36m\u28f7 \u001b[0m"] +[4.511464, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[4.511528, "o", "\u001b[A"] +[4.511544, "o", "\r"] +[4.511674, "o", "\u001b[36m\u28f7 \u001b[0m"] +[4.511862, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[4.617161, "o", "\u001b[A\r"] +[4.617432, "o", "\u001b[36m\u28ef \u001b[0m"] +[4.617982, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[4.724975, "o", "\u001b[A\r"] +[4.725218, "o", "\u001b[36m\u28df \u001b[0m"] +[4.725578, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[4.833768, "o", "\u001b[A\r"] +[4.833989, "o", "\u001b[36m\u287f \u001b[0m"] +[4.834258, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[4.941369, "o", "\u001b[A\r"] +[4.941675, "o", "\u001b[36m\u28bf \u001b[0m"] +[4.942112, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[5.048443, "o", "\u001b[A\r"] +[5.04879, "o", "\u001b[36m\u28fb \u001b[0m"] +[5.049186, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[5.161044, "o", "\u001b[A\r"] +[5.16138, "o", "\u001b[36m\u28fd \u001b[0m"] +[5.16186, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[5.269353, "o", "\u001b[A\r"] +[5.269697, "o", "\u001b[36m\u28fe \u001b[0m"] +[5.270177, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[5.381365, "o", "\u001b[A\r"] +[5.381712, "o", "\u001b[36m\u28f7 \u001b[0m"] +[5.382154, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[5.491486, "o", "\u001b[A\r"] +[5.491841, "o", "\u001b[36m\u28ef \u001b[0m"] +[5.492311, "o", "\u001b[38;5;219mLoading basic colors...\u001b[0m\r\n"] +[5.638173, "o", "\u001b[A\r\u001b[2K"] +[5.638357, "o", "\u001b[38;5;219m\u001b[3m-- Basic colors --\u001b[0m\r\n\r\n"] +[5.638472, "o", "\u001b[31mRed text\u001b[0m\r\n"] +[5.638559, "o", "\u001b[32mGreen text\u001b[0m\r\n"] +[5.638603, "o", "\u001b[33mYellow text\u001b[0m\r\n"] +[5.638655, "o", "\u001b[34mBlue text\u001b[0m\r\n"] +[5.638672, "o", "\u001b[35mPurple text\u001b[0m\r\n"] +[5.638679, "o", "\u001b[36mCyan text\u001b[0m\r\n"] +[5.638773, "o", "\u001b[37mWhite text\u001b[0m\r\n"] +[5.638784, "o", "\u001b[90mGrey text\u001b[0m\r\n"] +[5.638847, "o", "\u001b[30mBlack text \u001b[0m"] +[5.638901, "o", "\u001b[3m[Black text - might not be visible]\u001b[0m\r\n"] +[5.638911, "o", "\r\n\r\n"] +[5.639928, "o", "\u001b[?25l"] +[5.64016, "o", "\u001b[36m\u28f7 \u001b[0m"] +[5.640349, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[5.6404, "o", "\u001b[A"] +[5.640409, "o", "\r"] +[5.640539, "o", "\u001b[36m\u28f7 \u001b[0m"] +[5.640687, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[5.750254, "o", "\u001b[A\r"] +[5.75062, "o", "\u001b[36m\u28ef \u001b[0m"] +[5.75103, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[5.862261, "o", "\u001b[A\r"] +[5.862505, "o", "\u001b[36m\u28df \u001b[0m"] +[5.862812, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[5.976077, "o", "\u001b[A\r"] +[5.976417, "o", "\u001b[36m\u287f \u001b[0m"] +[5.976867, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.083764, "o", "\u001b[A\r"] +[6.084433, "o", "\u001b[36m\u28bf \u001b[0m"] +[6.084712, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.197221, "o", "\u001b[A\r"] +[6.197562, "o", "\u001b[36m\u28fb \u001b[0m"] +[6.19797, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.307838, "o", "\u001b[A\r"] +[6.308056, "o", "\u001b[36m\u28fd \u001b[0m"] +[6.308263, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.419183, "o", "\u001b[A\r"] +[6.419402, "o", "\u001b[36m\u28fe \u001b[0m"] +[6.419678, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.530816, "o", "\u001b[A\r"] +[6.531134, "o", "\u001b[36m\u28f7 \u001b[0m"] +[6.531584, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.64333, "o", "\u001b[A\r"] +[6.643528, "o", "\u001b[36m\u28ef \u001b[0m"] +[6.643909, "o", "\u001b[38;5;219mLoading ANSI 256 colors...\u001b[0m\r\n"] +[6.766203, "o", "\u001b[A\r\u001b[2K"] +[6.766455, "o", "\u001b[38;5;219m\u001b[3m-- ANSI 256 colors (examples) --\u001b[0m\r\n"] +[6.766479, "o", "\r\n"] +[6.766678, "o", "\u001b[38;5;39mLight blue text (39)\u001b[0m\r\n"] +[6.766789, "o", "\u001b[38;5;208mOrange text (208)\u001b[0m\r\n"] +[6.76689, "o", "\u001b[38;5;82mLight green text (82)\u001b[0m\r\n"] +[6.766954, "o", "\r\n\r\n"] +[6.768576, "o", "\u001b[?25l"] +[6.7689, "o", "\u001b[36m\u28f7 \u001b[0m"] +[6.769109, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[6.769167, "o", "\u001b[A"] +[6.76918, "o", "\r"] +[6.769294, "o", "\u001b[36m\u28f7 \u001b[0m"] +[6.76946, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[6.876427, "o", "\u001b[A\r"] +[6.87663, "o", "\u001b[36m\u28ef \u001b[0m"] +[6.876992, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[6.988223, "o", "\u001b[A\r"] +[6.988585, "o", "\u001b[36m\u28df \u001b[0m"] +[6.989075, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.099866, "o", "\u001b[A\r"] +[7.100415, "o", "\u001b[36m\u287f \u001b[0m"] +[7.100918, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.208787, "o", "\u001b[A\r"] +[7.209151, "o", "\u001b[36m\u28bf \u001b[0m"] +[7.209457, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.317381, "o", "\u001b[A\r"] +[7.317741, "o", "\u001b[36m\u28fb \u001b[0m"] +[7.31805, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.427906, "o", "\u001b[A\r"] +[7.428256, "o", "\u001b[36m\u28fd \u001b[0m"] +[7.428734, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.538201, "o", "\u001b[A\r"] +[7.538561, "o", "\u001b[36m\u28fe \u001b[0m"] +[7.53904, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.648669, "o", "\u001b[A\r"] +[7.648999, "o", "\u001b[36m\u28f7 \u001b[0m"] +[7.649461, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.761927, "o", "\u001b[A\r"] +[7.762283, "o", "\u001b[36m\u28ef \u001b[0m"] +[7.76274, "o", "\u001b[38;5;219mLoading combined formatting...\u001b[0m\r\n"] +[7.897195, "o", "\u001b[A\r\u001b[2K"] +[7.897401, "o", "\u001b[38;5;219m\u001b[3m-- Combined formatting --\u001b[0m\r\n\r\n"] +[7.897483, "o", "\u001b[1m\u001b[34mThis text is bold and blue\u001b[0m\r\n"] +[7.89758, "o", "\u001b[1m\u001b[3m\u001b[31mThis text is bold, italic and red\u001b[0m\r\n"] +[7.897682, "o", "\u001b[4m\u001b[32mThis text is underlined and green\u001b[0m\r\n"] +[7.897803, "o", "\u001b[1m\u001b[38;5;39mThis text is bold and light blue (ANSI 256 color 39)\u001b[0m\r\n"] +[7.897911, "o", "\u001b[3m\u001b[38;5;208mThis text is italic and orange (ANSI 256 color 208)\u001b[0m\r\n"] +[7.897991, "o", "\u001b[31mThis is red \u001b[0m"] +[7.898067, "o", "\u001b[32mand this is green, \u001b[0m"] +[7.898125, "o", "all on the same line!\u001b[0m\r\n"] +[7.901862, "o", "And this is \u001b[33myellow\u001b[0m, and this is \u001b[35mpurple\u001b[0m\u001b[0m\r\n\r\n\r\n"] +[7.903143, "o", "\u001b[?25l"] +[7.903396, "o", "\u001b[36m\u28f7 \u001b[0m"] +[7.903614, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[7.903726, "o", "\u001b[A\r"] +[7.903812, "o", "\u001b[36m\u28f7 \u001b[0m"] +[7.903983, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.013344, "o", "\u001b[A\r"] +[8.013565, "o", "\u001b[36m\u28ef \u001b[0m"] +[8.013896, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.122468, "o", "\u001b[A\r"] +[8.122885, "o", "\u001b[36m\u28df \u001b[0m"] +[8.1235, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.233768, "o", "\u001b[A\r"] +[8.234148, "o", "\u001b[36m\u287f \u001b[0m"] +[8.235294, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.345054, "o", "\u001b[A\r"] +[8.345377, "o", "\u001b[36m\u28bf \u001b[0m"] +[8.345749, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.456155, "o", "\u001b[A\r"] +[8.456477, "o", "\u001b[36m\u28fb \u001b[0m"] +[8.45693, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.567833, "o", "\u001b[A\r"] +[8.568132, "o", "\u001b[36m\u28fd \u001b[0m"] +[8.568491, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.676613, "o", "\u001b[A\r"] +[8.676975, "o", "\u001b[36m\u28fe \u001b[0m"] +[8.677349, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.785602, "o", "\u001b[A\r"] +[8.785937, "o", "\u001b[36m\u28f7 \u001b[0m"] +[8.786417, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[8.897249, "o", "\u001b[A\r"] +[8.897436, "o", "\u001b[36m\u28ef \u001b[0m"] +[8.897611, "o", "\u001b[38;5;219mLoading output utilities...\u001b[0m\r\n"] +[9.028447, "o", "\u001b[A\r\u001b[2K"] +[9.02865, "o", "\u001b[38;5;219m\u001b[3m-- Output utilities --\u001b[0m\r\n"] +[9.028718, "o", "\r\n"] +[9.028766, "o", "\u001b[32m\u2713 \u001b[0m"] +[9.028818, "o", "Task completed successfully!\u001b[0m\r\n"] +[9.02891, "o", "\u001b[31m\u2717 \u001b[0m"] +[9.028971, "o", "Operation failed.\u001b[0m\r\n"] +[9.029007, "o", "\r\n\r\n"] +[9.030059, "o", "\u001b[?25l"] +[9.030338, "o", "\u001b[36m\u28f7 \u001b[0m"] +[9.030546, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.030612, "o", "\u001b[A"] +[9.030655, "o", "\r"] +[9.030764, "o", "\u001b[36m\u28f7 \u001b[0m"] +[9.030947, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.136624, "o", "\u001b[A\r"] +[9.136841, "o", "\u001b[36m\u28ef \u001b[0m"] +[9.137117, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.248429, "o", "\u001b[A\r\u001b[36m\u28df \u001b[0m"] +[9.249129, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.361925, "o", "\u001b[A\r"] +[9.362247, "o", "\u001b[36m\u287f \u001b[0m"] +[9.362707, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.472351, "o", "\u001b[A\r"] +[9.472689, "o", "\u001b[36m\u28bf \u001b[0m"] +[9.473157, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.584616, "o", "\u001b[A\r"] +[9.584859, "o", "\u001b[36m\u28fb \u001b[0m"] +[9.585155, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.694786, "o", "\u001b[A\r"] +[9.695137, "o", "\u001b[36m\u28fd \u001b[0m"] +[9.695608, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.807245, "o", "\u001b[A\r"] +[9.807618, "o", "\u001b[36m\u28fe \u001b[0m"] +[9.808091, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[9.915446, "o", "\u001b[A\r"] +[9.91577, "o", "\u001b[36m\u28f7 \u001b[0m"] +[9.916225, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[10.028684, "o", "\u001b[A\r"] +[10.029024, "o", "\u001b[36m\u28ef \u001b[0m"] +[10.02948, "o", "\u001b[38;5;219mStarting interactive experience...\u001b[0m\r\n"] +[10.1574, "o", "\u001b[A\r\u001b[2K"] +[10.157616, "o", "\u001b[38;5;219m\u001b[3m-- Interactive functions --\u001b[0m\r\n"] +[10.1577, "o", "\r\n"] +[10.159843, "o", "\u001b[?25h"] +[10.159928, "o", "\u001b[34m? \u001b[0mHow can I call you?\u001b[0m\r\n\u001b[34m\u276f \u001b[0m"] +[12.22436, "o", "G"] +[12.386994, "o", "i"] +[12.469145, "o", "o"] +[12.567543, "o", "r"] +[12.75488, "o", "g"] +[12.822131, "o", "i"] +[12.882642, "o", "o"] +[13.596111, "o", "\r\n"] +[13.599242, "o", "Hello, \u001b[1m\u001b[36mGiorgio\u001b[0m\u001b[0m\r\n\r\n"] +[13.601329, "o", "\u001b[?25l"] +[13.601456, "o", "\u001b[34m? \u001b[0mWhat is your favorite color?\u001b[0m\u001b[90m[\u2191\u2193]\u001b[0m\u001b[0m\r\n"] +[13.601589, "o", "\u001b[34m\u25cf \u001b[0m"] +[13.601647, "o", "Red\u001b[0m\r\n"] +[13.601731, "o", "\u001b[90m\u25cc Green\u001b[0m\r\n"] +[13.601809, "o", "\u001b[90m\u25cc Blue\u001b[0m\r\n"] +[14.941155, "o", "\u001b[3A\u001b[J"] +[14.941338, "o", "\u001b[90m\u25cc Red\u001b[0m\r\n"] +[14.941458, "o", "\u001b[34m\u25cf \u001b[0m"] +[14.941592, "o", "Green\u001b[0m\r\n"] +[14.941686, "o", "\u001b[90m\u25cc Blue\u001b[0m\r\n"] +[15.599151, "o", "\u001b[3A\u001b[J"] +[15.599341, "o", "\u001b[90m\u25cc Red\u001b[0m\r\n"] +[15.599421, "o", "\u001b[90m\u25cc Green\u001b[0m\r\n"] +[15.599525, "o", "\u001b[34m\u25cf \u001b[0m"] +[15.599605, "o", "Blue\u001b[0m\r\n"] +[15.971608, "o", "\u001b[3A\u001b[J"] +[15.971812, "o", "\u001b[34m\u25cf \u001b[0m"] +[15.97184, "o", "Red\u001b[0m\r\n"] +[15.971927, "o", "\u001b[90m\u25cc Green\u001b[0m\r\n"] +[15.972007, "o", "\u001b[90m\u25cc Blue\u001b[0m\r\n"] +[16.406184, "o", "\u001b[3A\u001b[J"] +[16.406341, "o", "\u001b[90m\u25cc Red\u001b[0m\r\n"] +[16.406454, "o", "\u001b[34m\u25cf \u001b[0m"] +[16.406524, "o", "Green\u001b[0m\r\n"] +[16.406614, "o", "\u001b[90m\u25cc Blue\u001b[0m\r\n"] +[16.997455, "o", "\u001b[3A\u001b[J"] +[16.997594, "o", "\u001b[90m\u25cc Red\u001b[0m\r\n"] +[16.997669, "o", "\u001b[90m\u25cc Green\u001b[0m\r\n"] +[16.997758, "o", "\u001b[34m\u25cf \u001b[0m"] +[16.997814, "o", "Blue\u001b[0m\r\n"] +[17.302131, "o", "\u001b[3A\u001b[J"] +[17.302338, "o", "\u001b[90m\u25cc Red\u001b[0m\r\n"] +[17.302427, "o", "\u001b[34m\u25cf \u001b[0m"] +[17.302484, "o", "Green\u001b[0m\r\n"] +[17.302567, "o", "\u001b[90m\u25cc Blue\u001b[0m\r\n"] +[17.664985, "o", "Nice choice, \u001b[1m\u001b[32mGreen\u001b[0m\u001b[0m\r\n\r\n"] +[17.667269, "o", "\u001b[?25h"] +[17.667428, "o", "\u001b[34m? \u001b[0mWould you like to continue with the demo?\u001b[0m\u001b[90m [Y/n]\u001b[0m\r\n\u001b[34m\u276f \u001b[0m"] +[19.581509, "o", "y"] +[20.405176, "o", "\r\n"] +[20.405413, "o", "\u001b[A\r\u001b[2K"] +[20.405587, "o", "\u001b[34m\u276f \u001b[0m"] +[20.405662, "o", "yes\u001b[0m\r\n"] +[20.4091, "o", "OK, let's \u001b[1m\u001b[32mcontinue\u001b[0m!\u001b[0m\r\n\r\n"] +[20.40929, "o", "\r\n"] +[20.410842, "o", "\u001b[?25l"] +[20.411155, "o", "\u001b[36m\u28f7 \u001b[0m"] +[20.411393, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[20.411485, "o", "\u001b[A\r"] +[20.411626, "o", "\u001b[36m\u28f7 \u001b[0m"] +[20.411813, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[20.521328, "o", "\u001b[A\r"] +[20.521606, "o", "\u001b[36m\u28ef \u001b[0m"] +[20.52198, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[20.630695, "o", "\u001b[A\r"] +[20.630975, "o", "\u001b[36m\u28df \u001b[0m"] +[20.631315, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[20.742145, "o", "\u001b[A\r"] +[20.74244, "o", "\u001b[36m\u287f \u001b[0m"] +[20.742836, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[20.853264, "o", "\u001b[A\r"] +[20.853639, "o", "\u001b[36m\u28bf \u001b[0m"] +[20.853891, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[20.965158, "o", "\u001b[A\r"] +[20.96542, "o", "\u001b[36m\u28fb \u001b[0m"] +[20.965794, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[21.07707, "o", "\u001b[A\r"] +[21.077414, "o", "\u001b[36m\u28fd \u001b[0m"] +[21.07786, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[21.188185, "o", "\u001b[A\r"] +[21.188408, "o", "\u001b[36m\u28fe \u001b[0m"] +[21.188698, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[21.299217, "o", "\u001b[A\r"] +[21.299558, "o", "\u001b[36m\u28f7 \u001b[0m"] +[21.30002, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[21.411842, "o", "\u001b[A\r"] +[21.412188, "o", "\u001b[36m\u28ef \u001b[0m"] +[21.412643, "o", "\u001b[38;5;219mLoading output manipulation...\u001b[0m\r\n"] +[21.539898, "o", "\u001b[A\r\u001b[2K"] +[21.540104, "o", "\u001b[38;5;219m\u001b[3m-- Output manipulation --\u001b[0m\r\n"] +[21.540178, "o", "\r\n"] +[21.540229, "o", "This line will be replaced in 1 second...\u001b[0m\r\n"] +[22.550416, "o", "\u001b[A\r\u001b[2K"] +[22.550658, "o", "Processing your request...\u001b[0m\r\n"] +[23.56305, "o", "\u001b[A\r\u001b[2K"] +[23.564866, "o", "\u001b[?25l"] +[23.565206, "o", "\u001b[36m\u28f7 \u001b[0m"] +[23.565351, "o", "Still working on it...\u001b[0m\r\n"] +[23.565439, "o", "\u001b[A"] +[23.565499, "o", "\r"] +[23.565605, "o", "\u001b[36m\u28f7 \u001b[0m"] +[23.565742, "o", "Still working on it...\u001b[0m\r\n"] +[23.677092, "o", "\u001b[A\r"] +[23.677437, "o", "\u001b[36m\u28ef \u001b[0m"] +[23.67768, "o", "Still working on it...\u001b[0m\r\n"] +[23.785686, "o", "\u001b[A\r"] +[23.786019, "o", "\u001b[36m\u28df \u001b[0m"] +[23.786257, "o", "Still working on it...\u001b[0m\r\n"] +[23.894341, "o", "\u001b[A\r"] +[23.894489, "o", "\u001b[36m\u287f \u001b[0m"] +[23.894664, "o", "Still working on it...\u001b[0m\r\n"] +[24.002808, "o", "\u001b[A\r"] +[24.003149, "o", "\u001b[36m\u28bf \u001b[0m"] +[24.003394, "o", "Still working on it...\u001b[0m\r\n"] +[24.110584, "o", "\u001b[A\r"] +[24.110907, "o", "\u001b[36m\u28fb \u001b[0m"] +[24.111152, "o", "Still working on it...\u001b[0m\r\n"] +[24.22186, "o", "\u001b[A\r"] +[24.222258, "o", "\u001b[36m\u28fd \u001b[0m"] +[24.222512, "o", "Still working on it...\u001b[0m\r\n"] +[24.335421, "o", "\u001b[A\r"] +[24.335714, "o", "\u001b[36m\u28fe \u001b[0m"] +[24.335844, "o", "Still working on it...\u001b[0m\r\n"] +[24.447364, "o", "\u001b[A\r"] +[24.447654, "o", "\u001b[36m\u28f7 \u001b[0m"] +[24.447847, "o", "Still working on it...\u001b[0m\r\n"] +[24.559868, "o", "\u001b[A\r"] +[24.560143, "o", "\u001b[36m\u28ef \u001b[0m"] +[24.560318, "o", "Still working on it...\u001b[0m\r\n"] +[24.669816, "o", "\u001b[A\r"] +[24.670157, "o", "\u001b[36m\u28df \u001b[0m"] +[24.670284, "o", "Still working on it...\u001b[0m\r\n"] +[24.777773, "o", "\u001b[A\r"] +[24.778005, "o", "\u001b[36m\u287f \u001b[0m"] +[24.778132, "o", "Still working on it...\u001b[0m\r\n"] +[24.888348, "o", "\u001b[A\r"] +[24.888567, "o", "\u001b[36m\u28bf \u001b[0m"] +[24.888713, "o", "Still working on it...\u001b[0m\r\n"] +[24.999353, "o", "\u001b[A\r"] +[24.999712, "o", "\u001b[36m\u28fb \u001b[0m"] +[24.999949, "o", "Still working on it...\u001b[0m\r\n"] +[25.111897, "o", "\u001b[A\r"] +[25.112261, "o", "\u001b[36m\u28fd \u001b[0m"] +[25.112499, "o", "Still working on it...\u001b[0m\r\n"] +[25.219947, "o", "\u001b[A\r"] +[25.220311, "o", "\u001b[36m\u28fe \u001b[0m"] +[25.220578, "o", "Still working on it...\u001b[0m\r\n"] +[25.332202, "o", "\u001b[A\r"] +[25.332556, "o", "\u001b[36m\u28f7 \u001b[0m"] +[25.332878, "o", "Still working on it...\u001b[0m\r\n"] +[25.443467, "o", "\u001b[A\r"] +[25.443739, "o", "\u001b[36m\u28ef \u001b[0m"] +[25.443919, "o", "Still working on it...\u001b[0m\r\n"] +[25.553081, "o", "\u001b[A\r"] +[25.553448, "o", "\u001b[36m\u28df \u001b[0m"] +[25.553683, "o", "Still working on it...\u001b[0m\r\n"] +[25.695101, "o", "\u001b[?25h\u001b[A"] +[25.695283, "o", "\r\u001b[2K"] +[25.695304, "o", "\u001b[32m\u2713 \u001b[0m"] +[25.695375, "o", "Task completed successfully!\u001b[0m\r\n"] +[25.696643, "o", "\u001b[?25l"] +[25.696918, "o", "\u001b[36m\u28f7 \u001b[0m"] +[25.697065, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[25.697137, "o", "\u001b[A\r"] +[25.697276, "o", "\u001b[36m\u28f7 \u001b[0m"] +[25.697388, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[25.806826, "o", "\u001b[A\r"] +[25.807091, "o", "\u001b[36m\u28ef \u001b[0m"] +[25.807277, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[25.915302, "o", "\u001b[A\r"] +[25.915656, "o", "\u001b[36m\u28df \u001b[0m"] +[25.9159, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.028032, "o", "\u001b[A\r"] +[26.028391, "o", "\u001b[36m\u287f \u001b[0m"] +[26.02864, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.14057, "o", "\u001b[A\r"] +[26.142814, "o", "\u001b[36m\u28bf \u001b[0mPerforming an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.253427, "o", "\u001b[A\r"] +[26.253836, "o", "\u001b[36m\u28fb \u001b[0m"] +[26.254004, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.365478, "o", "\u001b[A\r"] +[26.365846, "o", "\u001b[36m\u28fd \u001b[0m"] +[26.366095, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.479185, "o", "\u001b[A\r"] +[26.479529, "o", "\u001b[36m\u28fe \u001b[0m"] +[26.479788, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.590706, "o", "\u001b[A\r"] +[26.590908, "o", "\u001b[36m\u28f7 \u001b[0m"] +[26.590996, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.698197, "o", "\u001b[A\r"] +[26.698418, "o", "\u001b[36m\u28ef \u001b[0m"] +[26.698571, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.80843, "o", "\u001b[A\r"] +[26.808771, "o", "\u001b[36m\u28df \u001b[0m"] +[26.809014, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[26.919915, "o", "\u001b[A\r"] +[26.920234, "o", "\u001b[36m\u287f \u001b[0m"] +[26.920494, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.032128, "o", "\u001b[A\r"] +[27.03235, "o", "\u001b[36m\u28bf \u001b[0m"] +[27.032498, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.145439, "o", "\u001b[A\r"] +[27.14579, "o", "\u001b[36m\u28fb \u001b[0m"] +[27.146031, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.253593, "o", "\u001b[A\r"] +[27.253962, "o", "\u001b[36m\u28fd \u001b[0m"] +[27.254254, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.366164, "o", "\u001b[A\r"] +[27.366492, "o", "\u001b[36m\u28fe \u001b[0m"] +[27.366745, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.47774, "o", "\u001b[A\r"] +[27.478084, "o", "\u001b[36m\u28f7 \u001b[0m"] +[27.478331, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.588146, "o", "\u001b[A\r"] +[27.588498, "o", "\u001b[36m\u28ef \u001b[0m"] +[27.588744, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.700591, "o", "\u001b[A\r"] +[27.700934, "o", "\u001b[36m\u28df \u001b[0m"] +[27.701178, "o", "Performing an operation that will fail (ask me how I know)\u001b[0m\r\n"] +[27.826685, "o", "\u001b[?25h"] +[27.826897, "o", "\u001b[A\r\u001b[2K"] +[27.82697, "o", "\u001b[31m\u2717 \u001b[0mOperation failed\u001b[0m\r\n\r\n"] +[27.827015, "o", "\r\n"] +[27.828399, "o", "\u001b[?25l"] +[27.828646, "o", "\u001b[36m\u28f7 \u001b[0m"] +[27.828864, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[27.828918, "o", "\u001b[A"] +[27.828952, "o", "\r"] +[27.829052, "o", "\u001b[36m\u28f7 \u001b[0m"] +[27.829218, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[27.936974, "o", "\u001b[A\r"] +[27.93733, "o", "\u001b[36m\u28ef \u001b[0m"] +[27.937835, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.050146, "o", "\u001b[A\r"] +[28.050501, "o", "\u001b[36m\u28df \u001b[0m"] +[28.050965, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.163514, "o", "\u001b[A\r"] +[28.163874, "o", "\u001b[36m\u287f \u001b[0m"] +[28.164334, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.273652, "o", "\u001b[A\r"] +[28.273906, "o", "\u001b[36m\u28bf \u001b[0m"] +[28.274274, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.38584, "o", "\u001b[A\r"] +[28.386244, "o", "\u001b[36m\u28fb \u001b[0m"] +[28.386719, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.498779, "o", "\u001b[A\r"] +[28.499063, "o", "\u001b[36m\u28fd \u001b[0m"] +[28.499435, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.611319, "o", "\u001b[A\r"] +[28.611701, "o", "\u001b[36m\u28fe \u001b[0m"] +[28.612164, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.724585, "o", "\u001b[A\r"] +[28.724928, "o", "\u001b[36m\u28f7 \u001b[0m"] +[28.725342, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.833225, "o", "\u001b[A\r"] +[28.833461, "o", "\u001b[36m\u28ef \u001b[0m"] +[28.833762, "o", "\u001b[38;5;219mLoading `run` utility...\u001b[0m\r\n"] +[28.948516, "o", "\u001b[A\r\u001b[2K"] +[28.948782, "o", "\u001b[38;5;219m\u001b[3m-- Run command output control --\u001b[0m\r\n"] +[28.94883, "o", "\r\n"] +[28.950346, "o", "\u001b[?25l"] +[28.950594, "o", "\u001b[36m\u28f7 \u001b[0m"] +[28.950718, "o", "Downloading file...\u001b[0m\r\n"] +[28.950792, "o", "\u001b[A"] +[28.95084, "o", "\r"] +[28.950939, "o", "\u001b[36m\u28f7 \u001b[0m"] +[28.951056, "o", "Downloading file...\u001b[0m\r\n"] +[29.062607, "o", "\u001b[A\r"] +[29.062807, "o", "\u001b[36m\u28ef \u001b[0m"] +[29.062915, "o", "Downloading file...\u001b[0m\r\n"] +[29.173853, "o", "\u001b[A\r"] +[29.174128, "o", "\u001b[36m\u28df \u001b[0m"] +[29.174325, "o", "Downloading file...\u001b[0m\r\n"] +[29.28708, "o", "\u001b[A\r"] +[29.287443, "o", "\u001b[36m\u287f \u001b[0m"] +[29.287693, "o", "Downloading file...\u001b[0m\r\n"] +[29.396325, "o", "\u001b[A\r"] +[29.396677, "o", "\u001b[36m\u28bf \u001b[0m"] +[29.396914, "o", "Downloading file...\u001b[0m\r\n"] +[29.505051, "o", "\u001b[A\r"] +[29.505412, "o", "\u001b[36m\u28fb \u001b[0m"] +[29.505748, "o", "Downloading file...\u001b[0m\r\n"] +[29.613414, "o", "\u001b[A\r"] +[29.613763, "o", "\u001b[36m\u28fd \u001b[0m"] +[29.613991, "o", "Downloading file...\u001b[0m\r\n"] +[29.722113, "o", "\u001b[A\r"] +[29.722324, "o", "\u001b[36m\u28fe \u001b[0m"] +[29.722485, "o", "Downloading file...\u001b[0m\r\n"] +[29.828694, "o", "\u001b[A\r"] +[29.829056, "o", "\u001b[36m\u28f7 \u001b[0m"] +[29.829316, "o", "Downloading file...\u001b[0m\r\n"] +[29.937254, "o", "\u001b[A\r"] +[29.937625, "o", "\u001b[36m\u28ef \u001b[0m"] +[29.938082, "o", "Downloading file...\u001b[0m\r\n"] +[30.050215, "o", "\u001b[A\r"] +[30.05057, "o", "\u001b[36m\u28df \u001b[0m"] +[30.050892, "o", "Downloading file...\u001b[0m\r\n"] +[30.159173, "o", "\u001b[A\r"] +[30.159544, "o", "\u001b[36m\u287f \u001b[0m"] +[30.159786, "o", "Downloading file...\u001b[0m\r\n"] +[30.267467, "o", "\u001b[A\r"] +[30.267843, "o", "\u001b[36m\u28bf \u001b[0m"] +[30.268086, "o", "Downloading file...\u001b[0m\r\n"] +[30.379684, "o", "\u001b[A\r"] +[30.380069, "o", "\u001b[36m\u28fb \u001b[0m"] +[30.380312, "o", "Downloading file...\u001b[0m\r\n"] +[30.488246, "o", "\u001b[A\r"] +[30.488598, "o", "\u001b[36m\u28fd \u001b[0m"] +[30.488853, "o", "Downloading file...\u001b[0m\r\n"] +[30.597551, "o", "\u001b[A\r"] +[30.597789, "o", "\u001b[36m\u28fe \u001b[0m"] +[30.597964, "o", "Downloading file...\u001b[0m\r\n"] +[30.705662, "o", "\u001b[A\r"] +[30.705889, "o", "\u001b[36m\u28f7 \u001b[0m"] +[30.70601, "o", "Downloading file...\u001b[0m\r\n"] +[30.81551, "o", "\u001b[A\r"] +[30.815712, "o", "\u001b[36m\u28ef \u001b[0m"] +[30.815797, "o", "Downloading file...\u001b[0m\r\n"] +[30.922973, "o", "\u001b[A\r"] +[30.923188, "o", "\u001b[36m\u28df \u001b[0m"] +[30.92333, "o", "Downloading file...\u001b[0m\r\n"] +[31.03108, "o", "\u001b[A\r"] +[31.031282, "o", "\u001b[36m\u287f \u001b[0m"] +[31.031404, "o", "Downloading file...\u001b[0m\r\n"] +[31.139248, "o", "\u001b[A\r"] +[31.139459, "o", "\u001b[36m\u28bf \u001b[0m"] +[31.139623, "o", "Downloading file...\u001b[0m\r\n"] +[31.250968, "o", "\u001b[A\r"] +[31.2513, "o", "\u001b[36m\u28fb \u001b[0m"] +[31.251466, "o", "Downloading file...\u001b[0m\r\n"] +[31.365945, "o", "\u001b[A\r"] +[31.366099, "o", "\u001b[36m\u28fd \u001b[0m"] +[31.366191, "o", "Downloading file...\u001b[0m\r\n"] +[31.470746, "o", "\u001b[A\r"] +[31.471275, "o", "\u001b[36m\u28fe \u001b[0m"] +[31.47161, "o", "Downloading file...\u001b[0m\r\n"] +[31.584159, "o", "\u001b[A\r"] +[31.584519, "o", "\u001b[36m\u28f7 \u001b[0m"] +[31.584766, "o", "Downloading file...\u001b[0m\r\n"] +[31.692833, "o", "\u001b[A\r"] +[31.693173, "o", "\u001b[36m\u28ef \u001b[0m"] +[31.693413, "o", "Downloading file...\u001b[0m\r\n"] +[31.804107, "o", "\u001b[A\r"] +[31.804616, "o", "\u001b[36m\u28df \u001b[0m"] +[31.804958, "o", "Downloading file...\u001b[0m\r\n"] +[31.915255, "o", "\u001b[A\r"] +[31.915623, "o", "\u001b[36m\u287f \u001b[0m"] +[31.915861, "o", "Downloading file...\u001b[0m\r\n"] +[32.028383, "o", "\u001b[A\r"] +[32.02875, "o", "\u001b[36m\u28bf \u001b[0m"] +[32.028991, "o", "Downloading file...\u001b[0m\r\n"] +[32.214042, "o", "\u001b[?25h"] +[32.214256, "o", "\u001b[A\r\u001b[2K"] +[32.214326, "o", "\u001b[32m\u2713 \u001b[0mDownload complete!\u001b[0m\r\n\r\n"] +[32.21443, "o", " % Total % Received % Xferd Average Speed Time Time Time Current\r\n Dload Upload Total Spent Left Speed\r\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 11.6M 0 48817 0 0 90221 0 0:02:15 --:--:-- 0:02:15 90068\r 37 11.6M 37 4431k 0 0 2895k 0 0:00:04 0:00:01 0:00:03 2894k\r 77 11.6M 77 9295k 0 0 3671k 0 0:00:03 0:00:02 0:00:01 3669k\r100 11.6M 100 11.6M 0 0 3842k 0 0:00:03 0:00:03 --:--:-- 3842k\u001b[0m\r\n"] +[32.214482, "o", "\r\n"] +[32.217046, "o", "\u001b[?25h"] +[32.217145, "o", "\u001b[34m? \u001b[0mWould you like to remove the downloaded file?\u001b[0m\u001b[90m [Y/n]\u001b[0m\r\n\u001b[34m\u276f \u001b[0m"] +[34.281672, "o", "\r\n"] +[34.281859, "o", "\u001b[A\r\u001b[2K"] +[34.282102, "o", "\u001b[34m\u276f \u001b[0m"] +[34.282224, "o", "yes\u001b[0m\r\n"] +[34.290823, "o", "\u001b[32m\u2713 \u001b[0m"] +[34.290898, "o", "File removed!\u001b[0m\r\n\r\n"] +[34.291067, "o", "\u001b[1m\u001b[32mAll done!\u001b[0m\r\n\r\n"] +[34.292404, "o", "\u001b[1m\u001b[3m%\u001b[23m\u001b[1m\u001b[0m \r \r"] +[34.309529, "o", "\u001b]0;beddu\u0007"] +[34.352482, "o", "\r\u001b[0m\u001b[23m\u001b[24m\u001b[J\r\n\u001b[1m\ud83d\udcc1 \u001b[0m\u001b[1m\u001b[36m~/beddu\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m\ud83d\udc7e \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[90C\u001b[1A\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m31.1s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1B\u001b[101D"] +[34.352552, "o", "\u001b[?1h\u001b="] +[34.352722, "o", "\u001b[?2004h"] +[34.363332, "o", "\r\r\u001bM\u001bM\u001b[0m\u001b[23m\u001b[24m\u001b[J\r\n\u001b[1m\ud83d\udcc1 \u001b[0m\u001b[1m\u001b[36m~/beddu\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m\ud83d\udc7e \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[90C\u001b[1A\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m31.1s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1B\u001b[101D"] +[34.378546, "o", "\r\r\u001bM\u001bM\u001b[0m\u001b[23m\u001b[24m\u001b[J\r\n\u001b[1m\ud83d\udcc1 \u001b[0m\u001b[1m\u001b[36m~/beddu\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m\ud83d\udc7e \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[90C\u001b[1A\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m31.1s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1B\u001b[101D"] +[36.372321, "o", "\r\n"] diff --git a/dist/beddu.sh b/dist/beddu.sh index ccedc60..75acc7b 100755 --- a/dist/beddu.sh +++ b/dist/beddu.sh @@ -2,10 +2,11 @@ # shellcheck disable=all # # beddu.sh - A lightweight bash framework for interactive scripts and pretty output -# https://github.com/mjsarfatti/beddu +# Version: v0.0.8-dirty # -# Version: v0.0.8 -# Generated on: Sun May 11 14:19:38 CEST 2025 +# Copyright © 2025 Manuele Sarfatti +# Licensed under the MIT license +# See https://github.com/mjsarfatti/beddu readonly _q='?' readonly _a='❯' @@ -125,7 +126,7 @@ repen() { pen "$@" } -trap spop EXIT INT TERM +trap "spop; show_cursor" EXIT INT TERM _spinner_pid="" _frame_duration="${_spinner_frame_duration:-0.1}" spin() { @@ -220,7 +221,7 @@ choose() { local count=${#options[@]} prompt=$( pen -n blue "${_q:-?} " - pen -n "${2}" + pen -n "${2} " pen gray "[↑↓]" ) hide_cursor diff --git a/src/01.core/pen.sh b/src/01.core/pen.sh index 046f78e..ef28dba 100644 --- a/src/01.core/pen.sh +++ b/src/01.core/pen.sh @@ -14,8 +14,7 @@ readonly BEDDU_PEN_LOADED=true # italic: Italic text # underline: Underline text # black|red|green|yellow|blue|purple|cyan|white|grey|gray: Color text -# [0-9]: ANSI 256 color number -# *: Any other text is printed as is +# [0-255]: ANSI 256 color number # Examples: # pen "Hello, world!" # pen -n "Hello, world!"