Complete docs

This commit is contained in:
Manuele Sarfatti 2025-05-11 16:11:30 +02:00
parent f53afe80c9
commit 76e2ad7db7
7 changed files with 718 additions and 29 deletions

View file

@ -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); \

View file

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

BIN
demo/carbon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

21
demo/carbon.sh Executable file
View file

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

661
demo/demo.cast Normal file
View file

@ -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"]

9
dist/beddu.sh vendored
View file

@ -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() {

View file

@ -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!"