diff --git a/.gitignore b/.gitignore index 1650b132b..5d5166b9c 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ pnpm-debug.log* code/**/target target + +# local editor settings (use global VS Code settings instead) +.vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9b4b908c9..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "editor.defaultFormatter": "esbenp.prettier-vscode", - "[mdx]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - } -} diff --git a/Cargo.lock b/Cargo.lock index dfcbe4659..e3d07cc97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,8 +1314,8 @@ name = "hello-ratatui" version = "0.1.0" dependencies = [ "color-eyre", - "crossterm 0.28.1", - "ratatui 0.29.0", + "crossterm 0.29.0", + "ratatui 0.30.0", ] [[package]] diff --git a/package-lock.json b/package-lock.json index d9680870a..37ac85cb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "remark-svgbob": "^1.1.1", "sharp": "^0.33.5", "starlight-links-validator": "0.14.1", + "tachyonfx-renderer": "^0.3.0", "tailwindcss": "^4.1.14", "toml": "^3.0.0", "tree-sitter": "0.22.1", @@ -11068,6 +11069,12 @@ "node": ">=18" } }, + "node_modules/tachyonfx-renderer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tachyonfx-renderer/-/tachyonfx-renderer-0.3.0.tgz", + "integrity": "sha512-q1f9nbYfPWAjH78scfUtWPRnO80fTu7QVqEfdIARTpNZqaKprLNVDKLiD+Pz7dhK/H/wnKy4RJGx73tcCSTXfg==", + "license": "MIT" + }, "node_modules/tailwindcss": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", diff --git a/package.json b/package.json index 61c65b029..4d4b139d8 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "format": "npm run _format -- --write", "format:check": "npm run _format -- --check", "preinstall": "npx playwright install", - "test": "vitest" + "test": "vitest", + "generate:ansi-code": "bash src/utils/generateAnsiCode.sh" }, "dependencies": { "@astro-community/astro-embed-youtube": "^0.5.6", @@ -37,6 +38,7 @@ "remark-svgbob": "^1.1.1", "sharp": "^0.33.5", "starlight-links-validator": "0.14.1", + "tachyonfx-renderer": "^0.3.0", "tailwindcss": "^4.1.14", "toml": "^3.0.0", "tree-sitter": "0.22.1", diff --git a/src/assets/code-example.ts b/src/assets/code-example.ts new file mode 100644 index 000000000..6eb2ebb7f --- /dev/null +++ b/src/assets/code-example.ts @@ -0,0 +1,28 @@ +export const ANSI_CODE = `\x1b[48;2;1;22;39m \x1b[0m  +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234muse\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mratatui\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mstyle\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mStylize\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234muse\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mratatui\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mwidgets\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m{\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mBlock\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m,\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m Paragraph\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m}\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mfn\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mmain\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m->\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;173;219;103mResult\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m<\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m,\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;173;219;103mBox\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m<\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mdyn\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mstd\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235merror\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mError\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m>\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m>\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m{\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mratatui\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mrun\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m|\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;215;219;224mterminal\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m|\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m{\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m terminal\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mdraw\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m|\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;215;219;224mframe\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m|\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m{\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mlet\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m block\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;127;219;202m=\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mBlock\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mbordered\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mtitle\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;217;245;221m"\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;236;196;141mWelcome\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;217;245;221m"\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mlet\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m greeting\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;127;219;202m=\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mParagraph\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mnew\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;217;245;221m"\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;236;196;141mHello,\x1b[48;2;1;22;39m Ratatui!\x1b[48;2;1;22;39m 🐭\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;217;245;221m"\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mcentered\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255myellow\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mblock\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mblock\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m frame\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255mrender_widget\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mgreeting\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m,\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m frame\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m.\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;130;170;255marea\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m}\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;127;219;202m?\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mstd\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mthread\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235msleep\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mstd\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mtime\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mDuration\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;199;146;234m::\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235mfrom_secs\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;247;140;108m5\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m;\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;173;219;103mOk\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m(\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m}\x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m)\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m\x1b[48;2;1;22;39m\x1b[38;2;214;222;235m}\x1b[0m\x1b\x1b[48;2;1;22;39m\x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b[48;2;1;22;39m \x1b\x1b[0m +\x1b[48;2;1;22;39m \x1b[0m  +`; diff --git a/src/components/CodeEffects.astro b/src/components/CodeEffects.astro new file mode 100644 index 000000000..11b79bc34 --- /dev/null +++ b/src/components/CodeEffects.astro @@ -0,0 +1,51 @@ +--- +// TachyonFX Code Animation + +import { readFile } from "fs/promises"; +import RatatuiVersion from "./RatatuiVersion.astro"; +import CopyButton from "./CopyButton.astro"; +import CodeExampleLabel from "./CodeExampleLabel.astro"; + +// Read file at build time +const code = await readFile("./code/tutorials/quickstart-ratatui/src/main.rs", "utf-8"); +--- + +
+ + +
+ +
+ + diff --git a/src/components/CodeExampleLabel.astro b/src/components/CodeExampleLabel.astro new file mode 100644 index 000000000..be4a62a6e --- /dev/null +++ b/src/components/CodeExampleLabel.astro @@ -0,0 +1,24 @@ +--- +// Footer label for landing page code sample +--- + +
+ (Rendered by{" "} + Ratzilla + {" "} + with{" "} + + WebAssembly) +
diff --git a/src/components/RatatuiVersion.astro b/src/components/RatatuiVersion.astro index adec565d2..14262b9d7 100644 --- a/src/components/RatatuiVersion.astro +++ b/src/components/RatatuiVersion.astro @@ -10,6 +10,6 @@ const version = await getRatatuiVersion("./code/tutorials/quickstart-ratatui/Car href=`https://github.com/ratatui/ratatui/releases/tag/ratatui-v0.30.0` target="_blank" > - 0.30.0 + 0.30.0 diff --git a/src/components/ScrambleCode.astro b/src/components/ScrambleCode.astro deleted file mode 100644 index 27c9c84c8..000000000 --- a/src/components/ScrambleCode.astro +++ /dev/null @@ -1,186 +0,0 @@ ---- -import { readFile } from "fs/promises"; -import { codeToHtml } from "shiki"; -import RatatuiVersion from "./RatatuiVersion.astro"; -import CopyButton from "./CopyButton.astro"; - -interface Props { - lang?: string; - class?: string; -} - -const { lang = "rust", class: className = "" } = Astro.props; - -// Read file at build time -const code = await readFile("./code/tutorials/quickstart-ratatui/src/main.rs", "utf-8"); - -// Pre-render syntax highlighted HTML with Night Owl theme -const highlightedHtml = await codeToHtml(code, { - lang: lang, - theme: "night-owl", -}); ---- - -
- - -
-
-
- - - - diff --git a/src/components/ShowcaseCard.astro b/src/components/ShowcaseCard.astro index a6be96599..8687bfef8 100644 --- a/src/components/ShowcaseCard.astro +++ b/src/components/ShowcaseCard.astro @@ -18,8 +18,8 @@ try { ---
diff --git a/src/components/ShowcaseCards.astro b/src/components/ShowcaseCards.astro index 33e6c612a..bf4a1e872 100644 --- a/src/components/ShowcaseCards.astro +++ b/src/components/ShowcaseCards.astro @@ -11,7 +11,7 @@ const projects: ShowcaseProject[] = [ owner: "alemidev", repo: "scope-tui", url: "https://github.com/alemidev/scope-tui", - description: "A simple oscilloscope/vectorscope/spectroscope for your terminal", + description: "A simple oscilloscope / vectorscope / spectroscope for your terminal", media: "https://cdn.alemi.dev/scope-tui-oscilloscope-music.webm", alt: "scope-tui demo", }, diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 5a2a73b3d..0a5220789 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -23,7 +23,7 @@ import CompanyLogos from "@components/CompanyLogos.astro"; import RandomDots from "@components/RandomDots.astro"; import Features from "@components/Features.astro"; import ScrambleText from "@components/ScrambleText.astro"; -import ScrambleCode from "@components/ScrambleCode.astro"; +import CodeEffects from "@components/CodeEffects.astro"; import RatatuiVersion from "@components/RatatuiVersion.astro"; import ShowcaseCards from "@components/ShowcaseCards.astro"; import TutorialVideos from "@components/TutorialVideos.astro"; @@ -47,7 +47,7 @@ import ThemeSwitch from "@components/ThemeSwitch.astro"; />
-
+
@@ -65,8 +65,8 @@ import ThemeSwitch from "@components/ThemeSwitch.astro";
-

Cook up delicious

-

terminal user interfaces.

+

Cook up delicious

+

terminal user interfaces.

Ratatui is a Rust library for building fast, lightweight, and rich terminal user interfaces

@@ -88,13 +88,13 @@ import ThemeSwitch from "@components/ThemeSwitch.astro";
- +
-
+

Trusted by @@ -112,7 +112,7 @@ import ThemeSwitch from "@components/ThemeSwitch.astro";

-
+
@@ -125,7 +125,7 @@ import ThemeSwitch from "@components/ThemeSwitch.astro";
-
+
@@ -138,7 +138,7 @@ import ThemeSwitch from "@components/ThemeSwitch.astro";
-
+
@@ -147,7 +147,7 @@ import ThemeSwitch from "@components/ThemeSwitch.astro";
-
+

Ready to start cooking?

Join thousands of {`{rats}`} cooking up the next generation of terminal applications.

diff --git a/src/utils/generateAnsiCode.sh b/src/utils/generateAnsiCode.sh new file mode 100755 index 000000000..e23a62145 --- /dev/null +++ b/src/utils/generateAnsiCode.sh @@ -0,0 +1,137 @@ +#!/bin/bash +# Use this script to generate ANSI code from the INPUT_FILE. +# Execute it via npm run generate:ansi-code. + +set -euo pipefail + +PROJECT_ROOT=$(git rev-parse --show-toplevel) +INPUT_FILE="${PROJECT_ROOT}/code/tutorials/quickstart-ratatui/src/main.rs" +OUTPUT_FILE="${PROJECT_ROOT}/src/assets/code-example.ts" +THEME="night-owlish" +TARGET_WIDTH=64 #Line width excluding padding + +require_bat() { + if ! command -v bat >/dev/null 2>&1; then + echo "Error: 'bat' is not installed or not on PATH. Please install 'bat' to generate the ANSI code snippet." >&2 + exit 1 + fi + + if ! bat --list-themes | grep -q "^${THEME}$"; then + echo "Error: bat theme '${THEME}' is not available. Install or configure the '${THEME}' theme before running this script." >&2 + exit 1 + fi +} + +bat_highlight() { + bat --theme="$THEME" --color=always --decorations=never "$INPUT_FILE" +} + +# Pad lines to fixed line width of 66 with background color +pad_lines_with_bg() { + while IFS= read -r line; do + original="$line" + # Strip ANSI codes for width calculation + stripped=$(echo "$line" | sed 's/\x1b\[[0-9;]*m//g') + # Get display width + line_len=$(echo -n "$stripped" | wc -L) + + if [ "$line_len" -lt "$TARGET_WIDTH" ]; then + padding=$((TARGET_WIDTH - line_len)) + pad_str=$(printf "%${padding}s" "") + echo "${original}\\x1b[48;2;1;22;39m${pad_str}\\x1b[0m" + else + echo "${original}\\x1b[0m" + fi + done +} + +add_blank_line() { + local position="$1" + local pattern="$2" + local blank_line='\x1b[48;2;1;22;39m \x1b[0m' + + case "$position" in + before) + sed "/${pattern}/i\\${blank_line}" + ;; + after) + sed "/${pattern}/a\\${blank_line}" + ;; + around) + sed "/${pattern}/{i\\${blank_line} +a\\${blank_line} +}" + ;; + esac +} + +apply_blank_line_rules() { + local input="$1" + local output="$input" + + # Array of position:pattern pairs + local rules=( + "before:use.*::" + "after:fn.*main" + "after:let.*block" + "before:frame.*render" + "around:std.*thread.*sleep" + "after:Ok" + ) + + for rule in "${rules[@]}"; do + local position="${rule%%:*}" + local pattern="${rule#*:}" + output=$(echo "$output" | add_blank_line "$position" "$pattern") + done + + echo "$output" +} + +add_prefix_to_brackets() { + sed 's/\[/\\x1b\[/g' +} + +add_background_to_spaces() { + sed 's/ /\\x1b[48;2;1;22;39m&/g' +} + +add_background_to_codes() { + sed 's/\\x1b\[38;2/\\x1b[48;2;1;22;39m\\x1b[38;2/g' +} + +add_blank_lines() { + # Add top blank lines with background color \x1b[48;2;1;22;39m + sed '1i\\x1b[48;2;1;22;39m \x1b[0m' | \ + # Add bottom blank line with background color \x1b[48;2;1;22;39m + sed '$a\\x1b[48;2;1;22;39m \x1b[0m' | \ + # Add background color \x1b[48;2;1;22;39m to all remaining blank lines + sed 's/^$/\\x1b[48;2;1;22;39m \\x1b[0m/' +} + +add_side_margins() { + sed '/./ s/^/\\x1b[48;2;1;22;39m \\x1b[0m/' +} + +build_ansi_code() { + { + echo -n 'export const ANSI_CODE = `' + local content=$(bat_highlight | pad_lines_with_bg) + content=$(apply_blank_line_rules "$content") + echo "$content" \ + | add_prefix_to_brackets \ + | add_background_to_spaces \ + | add_background_to_codes \ + | add_blank_lines \ + | add_side_margins + echo '`;' + } > "$OUTPUT_FILE" +} + +main() { + require_bat + build_ansi_code +} + +main +