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[48;2;1;22;39m [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[48;2;1;22;39m [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"); +--- + +
-
-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";
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 +