diff --git a/kittens/tui/progress.py b/kittens/tui/progress.py new file mode 100644 index 000000000..4d252d8c6 --- /dev/null +++ b/kittens/tui/progress.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPLv3 Copyright: 2021, Kovid Goyal + + +from .operations import styled + + +def render_progress_bar(frac: float, width: int = 80) -> str: + if frac >= 1: + return styled('๐Ÿฌ‹' * width, fg='green') + if frac <= 0: + return styled('๐Ÿฌ‹' * width, dim=True) + w = frac * width + overhang = w - int(w) + filled = '๐Ÿฌ‹' * int(w) + if overhang < 0.2: + needs_break = True + elif overhang < 0.8: + filled += '๐Ÿฌƒ' + needs_break = False + else: + if len(filled) < width - 1: + filled += '๐Ÿฌ‹' + needs_break = True + else: + filled += '๐Ÿฌƒ' + needs_break = False + ans = styled(filled, fg='blue') + unfilled = '' + if width > len(filled): + if needs_break: + unfilled += '๐Ÿฌ‡' + filler = width - len(filled) - len(unfilled) + if filler > 0: + unfilled += '๐Ÿฌ‹' * filler + if unfilled: + ans += styled(unfilled, dim=True) + return ans diff --git a/kittens/tui/spinners.py b/kittens/tui/spinners.py new file mode 100644 index 000000000..81fab576e --- /dev/null +++ b/kittens/tui/spinners.py @@ -0,0 +1,531 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPLv3 Copyright: 2021, Kovid Goyal + +from time import monotonic +from typing import Dict, Sequence + +from kitty.typing import TypedDict + + +class SpinnerDef(TypedDict): + interval: int + frames: Sequence[str] + + +# Spinner definitions are from +# https://raw.githubusercontent.com/sindresorhus/cli-spinners/main/spinners.json +spinners: Dict[str, SpinnerDef] = { # {{{ + "dots": { + "interval": 80, + "frames": ["โ ‹", "โ ™", "โ น", "โ ธ", "โ ผ", "โ ด", "โ ฆ", "โ ง", "โ ‡", "โ "] + }, + "dots2": { + "interval": 80, + "frames": ["โฃพ", "โฃฝ", "โฃป", "โขฟ", "โกฟ", "โฃŸ", "โฃฏ", "โฃท"] + }, + "dots3": { + "interval": 80, + "frames": ["โ ‹", "โ ™", "โ š", "โ ž", "โ –", "โ ฆ", "โ ด", "โ ฒ", "โ ณ", "โ “"] + }, + "dots4": { + "interval": + 80, + "frames": + ["โ „", "โ †", "โ ‡", "โ ‹", "โ ™", "โ ธ", "โ ฐ", "โ  ", "โ ฐ", "โ ธ", "โ ™", "โ ‹", "โ ‡", "โ †"] + }, + "dots5": { + "interval": + 80, + "frames": [ + "โ ‹", "โ ™", "โ š", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ ฒ", "โ ด", "โ ฆ", "โ –", "โ ’", "โ ", + "โ ", "โ ’", "โ “", "โ ‹" + ] + }, + "dots6": { + "interval": + 80, + "frames": [ + "โ ", "โ ‰", "โ ™", "โ š", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ ฒ", "โ ด", "โ ค", "โ „", "โ „", + "โ ค", "โ ด", "โ ฒ", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ š", "โ ™", "โ ‰", "โ " + ] + }, + "dots7": { + "interval": + 80, + "frames": [ + "โ ˆ", "โ ‰", "โ ‹", "โ “", "โ ’", "โ ", "โ ", "โ ’", "โ –", "โ ฆ", "โ ค", "โ  ", "โ  ", + "โ ค", "โ ฆ", "โ –", "โ ’", "โ ", "โ ", "โ ’", "โ “", "โ ‹", "โ ‰", "โ ˆ" + ] + }, + "dots8": { + "interval": + 80, + "frames": [ + "โ ", "โ ", "โ ‰", "โ ™", "โ š", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ ฒ", "โ ด", "โ ค", "โ „", + "โ „", "โ ค", "โ  ", "โ  ", "โ ค", "โ ฆ", "โ –", "โ ’", "โ ", "โ ", "โ ’", "โ “", "โ ‹", + "โ ‰", "โ ˆ", "โ ˆ" + ] + }, + "dots9": { + "interval": 80, + "frames": ["โขน", "โขบ", "โขผ", "โฃธ", "โฃ‡", "โกง", "โก—", "โก"] + }, + "dots10": { + "interval": 80, + "frames": ["โข„", "โข‚", "โข", "โก", "โกˆ", "โก", "โก "] + }, + "dots11": { + "interval": 100, + "frames": ["โ ", "โ ‚", "โ „", "โก€", "โข€", "โ  ", "โ ", "โ ˆ"] + }, + "dots12": { + "interval": + 80, + "frames": [ + "โข€โ €", "โก€โ €", "โ „โ €", "โข‚โ €", "โก‚โ €", "โ …โ €", "โขƒโ €", "โกƒโ €", "โ โ €", "โข‹โ €", "โก‹โ €", + "โ โ ", "โข‹โ ", "โก‹โ ", "โ โ ‰", "โ ‹โ ‰", "โ ‹โ ‰", "โ ‰โ ™", "โ ‰โ ™", "โ ‰โ ฉ", "โ ˆโข™", "โ ˆโก™", + "โขˆโ ฉ", "โก€โข™", "โ „โก™", "โข‚โ ฉ", "โก‚โข˜", "โ …โก˜", "โขƒโ จ", "โกƒโข", "โ โก", "โข‹โ  ", "โก‹โข€", + "โ โก", "โข‹โ ", "โก‹โ ", "โ โ ‰", "โ ‹โ ‰", "โ ‹โ ‰", "โ ‰โ ™", "โ ‰โ ™", "โ ‰โ ฉ", "โ ˆโข™", "โ ˆโก™", + "โ ˆโ ฉ", "โ €โข™", "โ €โก™", "โ €โ ฉ", "โ €โข˜", "โ €โก˜", "โ €โ จ", "โ €โข", "โ €โก", "โ €โ  ", "โ €โข€", + "โ €โก€" + ] + }, + "dots8Bit": { + "interval": + 80, + "frames": [ + "โ €", "โ ", "โ ‚", "โ ƒ", "โ „", "โ …", "โ †", "โ ‡", "โก€", "โก", "โก‚", "โกƒ", "โก„", + "โก…", "โก†", "โก‡", "โ ˆ", "โ ‰", "โ Š", "โ ‹", "โ Œ", "โ ", "โ Ž", "โ ", "โกˆ", "โก‰", + "โกŠ", "โก‹", "โกŒ", "โก", "โกŽ", "โก", "โ ", "โ ‘", "โ ’", "โ “", "โ ”", "โ •", "โ –", + "โ —", "โก", "โก‘", "โก’", "โก“", "โก”", "โก•", "โก–", "โก—", "โ ˜", "โ ™", "โ š", "โ ›", + "โ œ", "โ ", "โ ž", "โ Ÿ", "โก˜", "โก™", "โกš", "โก›", "โกœ", "โก", "โกž", "โกŸ", "โ  ", + "โ ก", "โ ข", "โ ฃ", "โ ค", "โ ฅ", "โ ฆ", "โ ง", "โก ", "โกก", "โกข", "โกฃ", "โกค", "โกฅ", + "โกฆ", "โกง", "โ จ", "โ ฉ", "โ ช", "โ ซ", "โ ฌ", "โ ญ", "โ ฎ", "โ ฏ", "โกจ", "โกฉ", "โกช", + "โกซ", "โกฌ", "โกญ", "โกฎ", "โกฏ", "โ ฐ", "โ ฑ", "โ ฒ", "โ ณ", "โ ด", "โ ต", "โ ถ", "โ ท", + "โกฐ", "โกฑ", "โกฒ", "โกณ", "โกด", "โกต", "โกถ", "โกท", "โ ธ", "โ น", "โ บ", "โ ป", "โ ผ", + "โ ฝ", "โ พ", "โ ฟ", "โกธ", "โกน", "โกบ", "โกป", "โกผ", "โกฝ", "โกพ", "โกฟ", "โข€", "โข", + "โข‚", "โขƒ", "โข„", "โข…", "โข†", "โข‡", "โฃ€", "โฃ", "โฃ‚", "โฃƒ", "โฃ„", "โฃ…", "โฃ†", + "โฃ‡", "โขˆ", "โข‰", "โขŠ", "โข‹", "โขŒ", "โข", "โขŽ", "โข", "โฃˆ", "โฃ‰", "โฃŠ", "โฃ‹", + "โฃŒ", "โฃ", "โฃŽ", "โฃ", "โข", "โข‘", "โข’", "โข“", "โข”", "โข•", "โข–", "โข—", "โฃ", + "โฃ‘", "โฃ’", "โฃ“", "โฃ”", "โฃ•", "โฃ–", "โฃ—", "โข˜", "โข™", "โขš", "โข›", "โขœ", "โข", + "โขž", "โขŸ", "โฃ˜", "โฃ™", "โฃš", "โฃ›", "โฃœ", "โฃ", "โฃž", "โฃŸ", "โข ", "โขก", "โขข", + "โขฃ", "โขค", "โขฅ", "โขฆ", "โขง", "โฃ ", "โฃก", "โฃข", "โฃฃ", "โฃค", "โฃฅ", "โฃฆ", "โฃง", + "โขจ", "โขฉ", "โขช", "โขซ", "โขฌ", "โขญ", "โขฎ", "โขฏ", "โฃจ", "โฃฉ", "โฃช", "โฃซ", "โฃฌ", + "โฃญ", "โฃฎ", "โฃฏ", "โขฐ", "โขฑ", "โขฒ", "โขณ", "โขด", "โขต", "โขถ", "โขท", "โฃฐ", "โฃฑ", + "โฃฒ", "โฃณ", "โฃด", "โฃต", "โฃถ", "โฃท", "โขธ", "โขน", "โขบ", "โขป", "โขผ", "โขฝ", "โขพ", + "โขฟ", "โฃธ", "โฃน", "โฃบ", "โฃป", "โฃผ", "โฃฝ", "โฃพ", "โฃฟ" + ] + }, + "line": { + "interval": 130, + "frames": ["-", "\\", "|", "/"] + }, + "line2": { + "interval": 100, + "frames": ["โ ‚", "-", "โ€“", "โ€”", "โ€“", "-"] + }, + "pipe": { + "interval": 100, + "frames": ["โ”ค", "โ”˜", "โ”ด", "โ””", "โ”œ", "โ”Œ", "โ”ฌ", "โ”"] + }, + "simpleDots": { + "interval": 400, + "frames": [". ", ".. ", "...", " "] + }, + "simpleDotsScrolling": { + "interval": 200, + "frames": [". ", ".. ", "...", " ..", " .", " "] + }, + "star": { + "interval": 70, + "frames": ["โœถ", "โœธ", "โœน", "โœบ", "โœน", "โœท"] + }, + "star2": { + "interval": 80, + "frames": ["+", "x", "*"] + }, + "flip": { + "interval": 70, + "frames": ["_", "_", "_", "-", "`", "`", "'", "ยด", "-", "_", "_", "_"] + }, + "hamburger": { + "interval": 100, + "frames": ["โ˜ฑ", "โ˜ฒ", "โ˜ด"] + }, + "growVertical": { + "interval": 120, + "frames": ["โ–", "โ–ƒ", "โ–„", "โ–…", "โ–†", "โ–‡", "โ–†", "โ–…", "โ–„", "โ–ƒ"] + }, + "growHorizontal": { + "interval": 120, + "frames": ["โ–", "โ–Ž", "โ–", "โ–Œ", "โ–‹", "โ–Š", "โ–‰", "โ–Š", "โ–‹", "โ–Œ", "โ–", "โ–Ž"] + }, + "balloon": { + "interval": 140, + "frames": [" ", ".", "o", "O", "@", "*", " "] + }, + "balloon2": { + "interval": 120, + "frames": [".", "o", "O", "ยฐ", "O", "o", "."] + }, + "noise": { + "interval": 100, + "frames": ["โ–“", "โ–’", "โ–‘"] + }, + "bounce": { + "interval": 120, + "frames": ["โ ", "โ ‚", "โ „", "โ ‚"] + }, + "boxBounce": { + "interval": 120, + "frames": ["โ––", "โ–˜", "โ–", "โ–—"] + }, + "boxBounce2": { + "interval": 100, + "frames": ["โ–Œ", "โ–€", "โ–", "โ–„"] + }, + "triangle": { + "interval": 50, + "frames": ["โ—ข", "โ—ฃ", "โ—ค", "โ—ฅ"] + }, + "arc": { + "interval": 100, + "frames": ["โ—œ", "โ— ", "โ—", "โ—ž", "โ—ก", "โ—Ÿ"] + }, + "circle": { + "interval": 120, + "frames": ["โ—ก", "โŠ™", "โ— "] + }, + "squareCorners": { + "interval": 180, + "frames": ["โ—ฐ", "โ—ณ", "โ—ฒ", "โ—ฑ"] + }, + "circleQuarters": { + "interval": 120, + "frames": ["โ—ด", "โ—ท", "โ—ถ", "โ—ต"] + }, + "circleHalves": { + "interval": 50, + "frames": ["โ—", "โ—“", "โ—‘", "โ—’"] + }, + "squish": { + "interval": 100, + "frames": ["โ•ซ", "โ•ช"] + }, + "toggle": { + "interval": 250, + "frames": ["โŠถ", "โŠท"] + }, + "toggle2": { + "interval": 80, + "frames": ["โ–ซ", "โ–ช"] + }, + "toggle3": { + "interval": 120, + "frames": ["โ–ก", "โ– "] + }, + "toggle4": { + "interval": 100, + "frames": ["โ– ", "โ–ก", "โ–ช", "โ–ซ"] + }, + "toggle5": { + "interval": 100, + "frames": ["โ–ฎ", "โ–ฏ"] + }, + "toggle6": { + "interval": 300, + "frames": ["แ€", "แ€"] + }, + "toggle7": { + "interval": 80, + "frames": ["โฆพ", "โฆฟ"] + }, + "toggle8": { + "interval": 100, + "frames": ["โ—", "โ—Œ"] + }, + "toggle9": { + "interval": 100, + "frames": ["โ—‰", "โ—Ž"] + }, + "toggle10": { + "interval": 100, + "frames": ["ใŠ‚", "ใŠ€", "ใЁ"] + }, + "toggle11": { + "interval": 50, + "frames": ["โง‡", "โง†"] + }, + "toggle12": { + "interval": 120, + "frames": ["โ˜—", "โ˜–"] + }, + "toggle13": { + "interval": 80, + "frames": ["=", "*", "-"] + }, + "arrow": { + "interval": 100, + "frames": ["โ†", "โ†–", "โ†‘", "โ†—", "โ†’", "โ†˜", "โ†“", "โ†™"] + }, + "arrow2": { + "interval": 80, + "frames": ["โฌ†๏ธ ", "โ†—๏ธ ", "โžก๏ธ ", "โ†˜๏ธ ", "โฌ‡๏ธ ", "โ†™๏ธ ", "โฌ…๏ธ ", "โ†–๏ธ "] + }, + "arrow3": { + "interval": 120, + "frames": ["โ–นโ–นโ–นโ–นโ–น", "โ–ธโ–นโ–นโ–นโ–น", "โ–นโ–ธโ–นโ–นโ–น", "โ–นโ–นโ–ธโ–นโ–น", "โ–นโ–นโ–นโ–ธโ–น", "โ–นโ–นโ–นโ–นโ–ธ"] + }, + "bouncingBar": { + "interval": + 80, + "frames": [ + "[ ]", "[= ]", "[== ]", "[=== ]", "[ ===]", "[ ==]", + "[ =]", "[ ]", "[ =]", "[ ==]", "[ ===]", "[====]", + "[=== ]", "[== ]", "[= ]" + ] + }, + "bouncingBall": { + "interval": + 80, + "frames": [ + "( โ— )", "( โ— )", "( โ— )", "( โ— )", "( โ—)", + "( โ— )", "( โ— )", "( โ— )", "( โ— )", "(โ— )" + ] + }, + "smiley": { + "interval": 200, + "frames": ["๐Ÿ˜„ ", "๐Ÿ˜ "] + }, + "monkey": { + "interval": 300, + "frames": ["๐Ÿ™ˆ ", "๐Ÿ™ˆ ", "๐Ÿ™‰ ", "๐Ÿ™Š "] + }, + "hearts": { + "interval": 100, + "frames": ["๐Ÿ’› ", "๐Ÿ’™ ", "๐Ÿ’œ ", "๐Ÿ’š ", "โค๏ธ "] + }, + "clock": { + "interval": + 100, + "frames": [ + "๐Ÿ•› ", "๐Ÿ• ", "๐Ÿ•‘ ", "๐Ÿ•’ ", "๐Ÿ•“ ", "๐Ÿ•” ", "๐Ÿ•• ", "๐Ÿ•– ", "๐Ÿ•— ", "๐Ÿ•˜ ", "๐Ÿ•™ ", + "๐Ÿ•š " + ] + }, + "earth": { + "interval": 180, + "frames": ["๐ŸŒ ", "๐ŸŒŽ ", "๐ŸŒ "] + }, + "material": { + "interval": + 17, + "frames": [ + "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–" + ] + }, + "moon": { + "interval": 80, + "frames": ["๐ŸŒ‘ ", "๐ŸŒ’ ", "๐ŸŒ“ ", "๐ŸŒ” ", "๐ŸŒ• ", "๐ŸŒ– ", "๐ŸŒ— ", "๐ŸŒ˜ "] + }, + "runner": { + "interval": 140, + "frames": ["๐Ÿšถ ", "๐Ÿƒ "] + }, + "pong": { + "interval": + 80, + "frames": [ + "โ–โ ‚ โ–Œ", "โ–โ ˆ โ–Œ", "โ– โ ‚ โ–Œ", "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", "โ– โ   โ–Œ", "โ– โ ‚ โ–Œ", "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", "โ– โ   โ–Œ", "โ– โก€ โ–Œ", "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", "โ– โ ˆ โ–Œ", "โ– โ ‚โ–Œ", "โ– โ  โ–Œ", + "โ– โก€โ–Œ", "โ– โ   โ–Œ", "โ– โ ‚ โ–Œ", "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", "โ– โ   โ–Œ", "โ– โก€ โ–Œ", "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", "โ– โ ˆ โ–Œ", "โ– โ ‚ โ–Œ", "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", "โ–โ   โ–Œ" + ] + }, + "shark": { + "interval": + 120, + "frames": [ + "โ–|\\____________โ–Œ", "โ–_|\\___________โ–Œ", "โ–__|\\__________โ–Œ", + "โ–___|\\_________โ–Œ", "โ–____|\\________โ–Œ", "โ–_____|\\_______โ–Œ", + "โ–______|\\______โ–Œ", "โ–_______|\\_____โ–Œ", "โ–________|\\____โ–Œ", + "โ–_________|\\___โ–Œ", "โ–__________|\\__โ–Œ", "โ–___________|\\_โ–Œ", + "โ–____________|\\โ–Œ", "โ–____________/|โ–Œ", "โ–___________/|_โ–Œ", + "โ–__________/|__โ–Œ", "โ–_________/|___โ–Œ", "โ–________/|____โ–Œ", + "โ–_______/|_____โ–Œ", "โ–______/|______โ–Œ", "โ–_____/|_______โ–Œ", + "โ–____/|________โ–Œ", "โ–___/|_________โ–Œ", "โ–__/|__________โ–Œ", + "โ–_/|___________โ–Œ", "โ–/|____________โ–Œ" + ] + }, + "dqpb": { + "interval": 100, + "frames": ["d", "q", "p", "b"] + }, + "weather": { + "interval": + 100, + "frames": [ + "โ˜€๏ธ ", "โ˜€๏ธ ", "โ˜€๏ธ ", "๐ŸŒค ", "โ›…๏ธ ", "๐ŸŒฅ ", "โ˜๏ธ ", "๐ŸŒง ", "๐ŸŒจ ", "๐ŸŒง ", + "๐ŸŒจ ", "๐ŸŒง ", "๐ŸŒจ ", "โ›ˆ ", "๐ŸŒจ ", "๐ŸŒง ", "๐ŸŒจ ", "โ˜๏ธ ", "๐ŸŒฅ ", "โ›…๏ธ ", "๐ŸŒค ", + "โ˜€๏ธ ", "โ˜€๏ธ " + ] + }, + "christmas": { + "interval": 400, + "frames": ["๐ŸŒฒ", "๐ŸŽ„"] + }, + "grenade": { + "interval": + 80, + "frames": [ + "ุŒ ", "โ€ฒ ", " ยด ", " โ€พ ", " โธŒ", " โธŠ", " |", " โŽ", " โ•", + " เทด ", " โ“", " ", " ", " " + ] + }, + "point": { + "interval": 125, + "frames": ["โˆ™โˆ™โˆ™", "โ—โˆ™โˆ™", "โˆ™โ—โˆ™", "โˆ™โˆ™โ—", "โˆ™โˆ™โˆ™"] + }, + "layer": { + "interval": 150, + "frames": ["-", "=", "โ‰ก"] + }, + "betaWave": { + "interval": + 80, + "frames": [ + "ฯฮฒฮฒฮฒฮฒฮฒฮฒ", "ฮฒฯฮฒฮฒฮฒฮฒฮฒ", "ฮฒฮฒฯฮฒฮฒฮฒฮฒ", "ฮฒฮฒฮฒฯฮฒฮฒฮฒ", "ฮฒฮฒฮฒฮฒฯฮฒฮฒ", "ฮฒฮฒฮฒฮฒฮฒฯฮฒ", + "ฮฒฮฒฮฒฮฒฮฒฮฒฯ" + ] + }, + "fingerDance": { + "interval": 160, + "frames": ["๐Ÿค˜ ", "๐ŸคŸ ", "๐Ÿ–– ", "โœ‹ ", "๐Ÿคš ", "๐Ÿ‘† "] + }, + "fistBump": { + "interval": + 80, + "frames": [ + "๐Ÿคœ\u3000\u3000\u3000\u3000๐Ÿค› ", "๐Ÿคœ\u3000\u3000\u3000\u3000๐Ÿค› ", + "๐Ÿคœ\u3000\u3000\u3000\u3000๐Ÿค› ", "\u3000๐Ÿคœ\u3000\u3000๐Ÿค›\u3000 ", + "\u3000\u3000๐Ÿคœ๐Ÿค›\u3000\u3000 ", "\u3000๐Ÿคœโœจ๐Ÿค›\u3000\u3000 ", + "๐Ÿคœ\u3000โœจ\u3000๐Ÿค›\u3000 " + ] + }, + "soccerHeader": { + "interval": + 80, + "frames": [ + " ๐Ÿง‘โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ " + ] + }, + "mindblown": { + "interval": + 160, + "frames": [ + "๐Ÿ˜ ", "๐Ÿ˜ ", "๐Ÿ˜ฎ ", "๐Ÿ˜ฎ ", "๐Ÿ˜ฆ ", "๐Ÿ˜ฆ ", "๐Ÿ˜ง ", "๐Ÿ˜ง ", "๐Ÿคฏ ", "๐Ÿ’ฅ ", "โœจ ", + "\u3000 ", "\u3000 ", "\u3000 " + ] + }, + "speaker": { + "interval": 160, + "frames": ["๐Ÿ”ˆ ", "๐Ÿ”‰ ", "๐Ÿ”Š ", "๐Ÿ”‰ "] + }, + "orangePulse": { + "interval": 100, + "frames": ["๐Ÿ”ธ ", "๐Ÿ”ถ ", "๐ŸŸ  ", "๐ŸŸ  ", "๐Ÿ”ถ "] + }, + "bluePulse": { + "interval": 100, + "frames": ["๐Ÿ”น ", "๐Ÿ”ท ", "๐Ÿ”ต ", "๐Ÿ”ต ", "๐Ÿ”ท "] + }, + "orangeBluePulse": { + "interval": 100, + "frames": ["๐Ÿ”ธ ", "๐Ÿ”ถ ", "๐ŸŸ  ", "๐ŸŸ  ", "๐Ÿ”ถ ", "๐Ÿ”น ", "๐Ÿ”ท ", "๐Ÿ”ต ", "๐Ÿ”ต ", "๐Ÿ”ท "] + }, + "timeTravel": { + "interval": + 100, + "frames": [ + "๐Ÿ•› ", "๐Ÿ•š ", "๐Ÿ•™ ", "๐Ÿ•˜ ", "๐Ÿ•— ", "๐Ÿ•– ", "๐Ÿ•• ", "๐Ÿ•” ", "๐Ÿ•“ ", "๐Ÿ•’ ", "๐Ÿ•‘ ", + "๐Ÿ• " + ] + }, + "aesthetic": { + "interval": + 80, + "frames": [ + "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", "โ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", "โ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑ", "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑ", "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑ", "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐ", "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ" + ] + } +} # }}} + + +class Spinner: + + def __init__(self, name: str = 'dots'): + definition = spinners[name] + self.interval = definition['interval'] / 1000 + self.frames = definition['frames'] + self.current_frame = -1 + self.last_change_at = -self.interval + + def __call__(self) -> str: + now = monotonic() + if now - self.last_change_at >= self.interval: + self.last_change_at = now + self.current_frame = (self.current_frame + 1) % len(self.frames) + return self.frames[self.current_frame]