[READ-ONLY] Mirror of https://github.com/bombshell-dev/docs. bomb.sh/docs
0

Configure Feed

Select the types of activity you want to include in your feed.

docs: add tty docs section with API reference

Paul Valladares (Jul 8, 2026, 9:35 PM -0600) 35428dd8 3860be3c

+1950 -15
+38 -1
astro.config.mjs
··· 4 4 import ecTwoSlash from "expressive-code-twoslash"; 5 5 import topics from "starlight-sidebar-topics"; 6 6 import starlightMarkdown from "starlight-markdown"; 7 + import mermaid from "astro-mermaid"; 8 + import { fileURLToPath } from "node:url"; 9 + 10 + const docsRoot = fileURLToPath(new URL(".", import.meta.url)); 7 11 8 12 const site = "https://bomb.sh/docs/"; 9 13 ··· 21 25 } 22 26 }, 23 27 integrations: [ 28 + mermaid({ autoTheme: true }), 24 29 starlight({ 25 30 title: "Bombshell", 26 31 logo: { ··· 40 45 cursorColor: 'rgba(255 0 210)' 41 46 } 42 47 }, 43 - plugins: [ecTwoSlash()], 48 + plugins: [ecTwoSlash({ 49 + twoslashOptions: { 50 + compilerOptions: { 51 + module: 99, 52 + moduleResolution: 100, 53 + baseUrl: docsRoot, 54 + paths: { 55 + "@bomb.sh/tty": ["node_modules/@bomb.sh/tty/esm/mod.d.ts"], 56 + }, 57 + }, 58 + }, 59 + })], 44 60 }, 45 61 editLink: { 46 62 baseUrl: "https://github.com/bombshell-dev/docs/edit/main/", ··· 123 139 icon: "right-caret", 124 140 link: "/tab/", 125 141 items: [], 142 + }, 143 + { 144 + label: "TTY", 145 + id: "tty", 146 + icon: "seti:config", 147 + link: "/tty/basics/getting-started", 148 + items: [ 149 + { label: "Basics", autogenerate: { directory: "tty/basics" } }, 150 + { label: "Guides", autogenerate: { directory: "tty/guides" } }, 151 + { 152 + label: "API", 153 + items: [ 154 + { label: "Overview", link: "/tty/api/" }, 155 + { label: "Ops", link: "/tty/api/ops" }, 156 + { label: "Term", link: "/tty/api/term" }, 157 + { label: "Input", link: "/tty/api/input" }, 158 + { label: "Settings", link: "/tty/api/settings" }, 159 + { label: "Termcodes", link: "/tty/api/termcodes" }, 160 + ], 161 + }, 162 + ], 126 163 }, 127 164 ]), 128 165 ],
+5 -2
package.json
··· 16 16 "dependencies": { 17 17 "@astrojs/starlight": "^0.37.1", 18 18 "@bomb.sh/args": "^0.3.1", 19 - "@clack/core": "^1.4.0", 20 - "@clack/prompts": "^1.5.0", 19 + "@bomb.sh/tty": "^0.8.0", 20 + "@clack/core": "^1.4.3", 21 + "@clack/prompts": "^1.7.0", 21 22 "@types/node": "^22.19.3", 22 23 "@webcontainer/api": "^1.6.1", 23 24 "@webcontainer/snapshot": "^0.1.0", ··· 26 27 "@xterm/xterm": "^6.0.0", 27 28 "arktype": "^2.2.0", 28 29 "astro": "^5.16.6", 30 + "astro-mermaid": "^2.1.0", 29 31 "expressive-code-twoslash": "^0.5.3", 32 + "mermaid": "^11.16.0", 30 33 "sharp": "^0.33.5", 31 34 "starlight-markdown": "^0.1.5", 32 35 "starlight-sidebar-topics": "^0.6.2"
+849 -11
pnpm-lock.yaml
··· 14 14 '@bomb.sh/args': 15 15 specifier: ^0.3.1 16 16 version: 0.3.1 17 + '@bomb.sh/tty': 18 + specifier: ^0.8.0 19 + version: 0.8.0 17 20 '@clack/core': 18 - specifier: ^1.4.0 19 - version: 1.4.0 21 + specifier: ^1.4.3 22 + version: 1.4.3 20 23 '@clack/prompts': 21 - specifier: ^1.5.0 22 - version: 1.5.0 24 + specifier: ^1.7.0 25 + version: 1.7.0 23 26 '@types/node': 24 27 specifier: ^22.19.3 25 28 version: 22.19.3 ··· 44 47 astro: 45 48 specifier: ^5.16.6 46 49 version: 5.16.6(@types/node@22.19.3)(rollup@4.55.1)(typescript@5.8.2) 50 + astro-mermaid: 51 + specifier: ^2.1.0 52 + version: 2.1.0(astro@5.16.6(@types/node@22.19.3)(rollup@4.55.1)(typescript@5.8.2))(mermaid@11.16.0) 47 53 expressive-code-twoslash: 48 54 specifier: ^0.5.3 49 55 version: 0.5.3(@expressive-code/core@0.41.5)(expressive-code@0.41.5)(typescript@5.8.2) 56 + mermaid: 57 + specifier: ^11.16.0 58 + version: 11.16.0 50 59 sharp: 51 60 specifier: ^0.33.5 52 61 version: 0.33.5 ··· 74 83 version: 4.80.0(@cloudflare/workers-types@4.20260405.1) 75 84 76 85 packages: 86 + 87 + '@antfu/install-pkg@1.1.0': 88 + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} 77 89 78 90 '@ark/schema@0.56.0': 79 91 resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} ··· 135 147 136 148 '@bomb.sh/args@0.3.1': 137 149 resolution: {integrity: sha512-CwxKrfgcorUPP6KfYD59aRdBYWBTsfsxT+GmoLVnKo5Tmyoqbpo0UNcjngRMyU+6tiPbd18RuIYxhgAn44wU/Q==} 150 + 151 + '@bomb.sh/tty@0.8.0': 152 + resolution: {integrity: sha512-tEE0mtqnEp2uJt4kQS5AjdghCD5KN4BobqHOlfhaiNyrigxFBKk61XkDy//4D7V/AejrTvubh44B4NV35lsnxw==} 153 + engines: {node: '>= 22'} 154 + 155 + '@braintree/sanitize-url@7.1.2': 156 + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} 138 157 139 158 '@capsizecss/unpack@3.0.1': 140 159 resolution: {integrity: sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==} 141 160 engines: {node: '>=18'} 142 161 143 - '@clack/core@1.4.0': 144 - resolution: {integrity: sha512-7Wctjq6f7c1CPz8sPpkwUnz8yRgVANkpNupb81q432FjcJg4l+Sw7XANdNSdWfAKq0IHI0JTcUeK5dxs/HrGPw==} 162 + '@chevrotain/types@11.1.2': 163 + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} 164 + 165 + '@clack/core@1.4.3': 166 + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} 145 167 engines: {node: '>= 20.12.0'} 146 168 147 - '@clack/prompts@1.5.0': 148 - resolution: {integrity: sha512-wKh+wTjmrUoUdkZg8KpJO5X+p9PWV+KE9mePseq9UYWkukgTKsGS47RRL2HstwVcvDQH+PenrPJWII8+MfiiyA==} 169 + '@clack/prompts@1.7.0': 170 + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} 149 171 engines: {node: '>= 20.12.0'} 150 172 151 173 '@cloudflare/kv-asset-handler@0.4.2': ··· 572 594 '@expressive-code/plugin-text-markers@0.41.5': 573 595 resolution: {integrity: sha512-0DSiTsjWFEz6/iuLOGNNy2GaeCW41OwnVJMKx1tS+XKeQxAL89UkZP3egWNzxjWNHNMzEv3ZWWWYqbonEQlv/Q==} 574 596 597 + '@iconify/types@2.0.0': 598 + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 599 + 600 + '@iconify/utils@3.1.4': 601 + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} 602 + 575 603 '@img/colour@1.0.0': 576 604 resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} 577 605 engines: {node: '>=18'} ··· 855 883 '@mdx-js/mdx@3.1.1': 856 884 resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} 857 885 886 + '@mermaid-js/parser@1.2.0': 887 + resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} 888 + 858 889 '@msgpack/msgpack@3.1.3': 859 890 resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==} 860 891 engines: {node: '>= 18'} ··· 1082 1113 '@swc/helpers@0.5.18': 1083 1114 resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} 1084 1115 1116 + '@types/d3-array@3.2.2': 1117 + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} 1118 + 1119 + '@types/d3-axis@3.0.6': 1120 + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} 1121 + 1122 + '@types/d3-brush@3.0.6': 1123 + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} 1124 + 1125 + '@types/d3-chord@3.0.6': 1126 + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} 1127 + 1128 + '@types/d3-color@3.1.3': 1129 + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} 1130 + 1131 + '@types/d3-contour@3.0.6': 1132 + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} 1133 + 1134 + '@types/d3-delaunay@6.0.4': 1135 + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} 1136 + 1137 + '@types/d3-dispatch@3.0.7': 1138 + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} 1139 + 1140 + '@types/d3-drag@3.0.7': 1141 + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} 1142 + 1143 + '@types/d3-dsv@3.0.7': 1144 + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} 1145 + 1146 + '@types/d3-ease@3.0.2': 1147 + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} 1148 + 1149 + '@types/d3-fetch@3.0.7': 1150 + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} 1151 + 1152 + '@types/d3-force@3.0.10': 1153 + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} 1154 + 1155 + '@types/d3-format@3.0.4': 1156 + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} 1157 + 1158 + '@types/d3-geo@3.1.0': 1159 + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} 1160 + 1161 + '@types/d3-hierarchy@3.1.7': 1162 + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} 1163 + 1164 + '@types/d3-interpolate@3.0.4': 1165 + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} 1166 + 1167 + '@types/d3-path@3.1.1': 1168 + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} 1169 + 1170 + '@types/d3-polygon@3.0.2': 1171 + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} 1172 + 1173 + '@types/d3-quadtree@3.0.6': 1174 + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} 1175 + 1176 + '@types/d3-random@3.0.4': 1177 + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} 1178 + 1179 + '@types/d3-scale-chromatic@3.1.0': 1180 + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} 1181 + 1182 + '@types/d3-scale@4.0.9': 1183 + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} 1184 + 1185 + '@types/d3-selection@3.0.11': 1186 + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} 1187 + 1188 + '@types/d3-shape@3.1.8': 1189 + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} 1190 + 1191 + '@types/d3-time-format@4.0.3': 1192 + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} 1193 + 1194 + '@types/d3-time@3.0.4': 1195 + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} 1196 + 1197 + '@types/d3-timer@3.0.2': 1198 + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} 1199 + 1200 + '@types/d3-transition@3.0.9': 1201 + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} 1202 + 1203 + '@types/d3-zoom@3.0.8': 1204 + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} 1205 + 1206 + '@types/d3@7.4.3': 1207 + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} 1208 + 1085 1209 '@types/debug@4.1.12': 1086 1210 resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 1087 1211 ··· 1094 1218 '@types/fontkit@2.0.8': 1095 1219 resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} 1096 1220 1221 + '@types/geojson@7946.0.16': 1222 + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} 1223 + 1097 1224 '@types/hast@3.0.4': 1098 1225 resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 1099 1226 ··· 1121 1248 '@types/sax@1.2.7': 1122 1249 resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} 1123 1250 1251 + '@types/trusted-types@2.0.7': 1252 + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} 1253 + 1124 1254 '@types/unist@2.0.11': 1125 1255 resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} 1126 1256 ··· 1135 1265 '@ungap/structured-clone@1.3.0': 1136 1266 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 1137 1267 deprecated: Potential CWE-502 - Update to 1.3.1 or higher 1268 + 1269 + '@upsetjs/venn.js@2.0.0': 1270 + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} 1138 1271 1139 1272 '@webcontainer/api@1.6.1': 1140 1273 resolution: {integrity: sha512-2RS2KiIw32BY1Icf6M1DvqSmcon9XICZCDgS29QJb2NmF12ZY2V5Ia+949hMKB3Wno+P/Y8W+sPP59PZeXSELg==} ··· 1209 1342 peerDependencies: 1210 1343 astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 1211 1344 1345 + astro-mermaid@2.1.0: 1346 + resolution: {integrity: sha512-fFRUN0BTZh+DZhDiLyblXoO26XqJ1Rr+qK3JGgSu7OBspKHDm59jkztg/aHsrdo1vO/tIq/+xhP/vgT8Mp92XA==} 1347 + peerDependencies: 1348 + '@mermaid-js/layout-elk': ^0.2.0 1349 + astro: '>=4' 1350 + mermaid: ^10.0.0 || ^11.0.0 1351 + peerDependenciesMeta: 1352 + '@mermaid-js/layout-elk': 1353 + optional: true 1354 + 1212 1355 astro@5.16.6: 1213 1356 resolution: {integrity: sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==} 1214 1357 engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} ··· 1313 1456 resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} 1314 1457 engines: {node: '>=16'} 1315 1458 1459 + commander@7.2.0: 1460 + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 1461 + engines: {node: '>= 10'} 1462 + 1463 + commander@8.3.0: 1464 + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} 1465 + engines: {node: '>= 12'} 1466 + 1316 1467 common-ancestor-path@1.0.1: 1317 1468 resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} 1318 1469 ··· 1322 1473 cookie@1.1.1: 1323 1474 resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 1324 1475 engines: {node: '>=18'} 1476 + 1477 + cose-base@1.0.3: 1478 + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} 1479 + 1480 + cose-base@2.2.0: 1481 + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} 1325 1482 1326 1483 crossws@0.3.5: 1327 1484 resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} ··· 1353 1510 resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} 1354 1511 engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} 1355 1512 1513 + cytoscape-cose-bilkent@4.1.0: 1514 + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} 1515 + peerDependencies: 1516 + cytoscape: ^3.2.0 1517 + 1518 + cytoscape-fcose@2.2.0: 1519 + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} 1520 + peerDependencies: 1521 + cytoscape: ^3.2.0 1522 + 1523 + cytoscape@3.34.0: 1524 + resolution: {integrity: sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==} 1525 + engines: {node: '>=0.10'} 1526 + 1527 + d3-array@2.12.1: 1528 + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} 1529 + 1530 + d3-array@3.2.4: 1531 + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} 1532 + engines: {node: '>=12'} 1533 + 1534 + d3-axis@3.0.0: 1535 + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} 1536 + engines: {node: '>=12'} 1537 + 1538 + d3-brush@3.0.0: 1539 + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} 1540 + engines: {node: '>=12'} 1541 + 1542 + d3-chord@3.0.1: 1543 + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} 1544 + engines: {node: '>=12'} 1545 + 1546 + d3-color@3.1.0: 1547 + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} 1548 + engines: {node: '>=12'} 1549 + 1550 + d3-contour@4.0.2: 1551 + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} 1552 + engines: {node: '>=12'} 1553 + 1554 + d3-delaunay@6.0.4: 1555 + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} 1556 + engines: {node: '>=12'} 1557 + 1558 + d3-dispatch@3.0.1: 1559 + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} 1560 + engines: {node: '>=12'} 1561 + 1562 + d3-drag@3.0.0: 1563 + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} 1564 + engines: {node: '>=12'} 1565 + 1566 + d3-dsv@3.0.1: 1567 + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} 1568 + engines: {node: '>=12'} 1569 + hasBin: true 1570 + 1571 + d3-ease@3.0.1: 1572 + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} 1573 + engines: {node: '>=12'} 1574 + 1575 + d3-fetch@3.0.1: 1576 + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} 1577 + engines: {node: '>=12'} 1578 + 1579 + d3-force@3.0.0: 1580 + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} 1581 + engines: {node: '>=12'} 1582 + 1583 + d3-format@3.1.2: 1584 + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} 1585 + engines: {node: '>=12'} 1586 + 1587 + d3-geo@3.1.1: 1588 + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} 1589 + engines: {node: '>=12'} 1590 + 1591 + d3-hierarchy@3.1.2: 1592 + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} 1593 + engines: {node: '>=12'} 1594 + 1595 + d3-interpolate@3.0.1: 1596 + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} 1597 + engines: {node: '>=12'} 1598 + 1599 + d3-path@1.0.9: 1600 + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} 1601 + 1602 + d3-path@3.1.0: 1603 + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} 1604 + engines: {node: '>=12'} 1605 + 1606 + d3-polygon@3.0.1: 1607 + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} 1608 + engines: {node: '>=12'} 1609 + 1610 + d3-quadtree@3.0.1: 1611 + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} 1612 + engines: {node: '>=12'} 1613 + 1614 + d3-random@3.0.1: 1615 + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} 1616 + engines: {node: '>=12'} 1617 + 1618 + d3-sankey@0.12.3: 1619 + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} 1620 + 1621 + d3-scale-chromatic@3.1.0: 1622 + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} 1623 + engines: {node: '>=12'} 1624 + 1625 + d3-scale@4.0.2: 1626 + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} 1627 + engines: {node: '>=12'} 1628 + 1629 + d3-selection@3.0.0: 1630 + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} 1631 + engines: {node: '>=12'} 1632 + 1633 + d3-shape@1.3.7: 1634 + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} 1635 + 1636 + d3-shape@3.2.0: 1637 + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} 1638 + engines: {node: '>=12'} 1639 + 1640 + d3-time-format@4.1.0: 1641 + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} 1642 + engines: {node: '>=12'} 1643 + 1644 + d3-time@3.1.0: 1645 + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} 1646 + engines: {node: '>=12'} 1647 + 1648 + d3-timer@3.0.1: 1649 + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} 1650 + engines: {node: '>=12'} 1651 + 1652 + d3-transition@3.0.1: 1653 + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} 1654 + engines: {node: '>=12'} 1655 + peerDependencies: 1656 + d3-selection: 2 - 3 1657 + 1658 + d3-zoom@3.0.0: 1659 + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} 1660 + engines: {node: '>=12'} 1661 + 1662 + d3@7.9.0: 1663 + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} 1664 + engines: {node: '>=12'} 1665 + 1666 + dagre-d3-es@7.0.14: 1667 + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} 1668 + 1669 + dayjs@1.11.21: 1670 + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} 1671 + 1356 1672 debug@4.4.3: 1357 1673 resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 1358 1674 engines: {node: '>=6.0'} ··· 1367 1683 1368 1684 defu@6.1.4: 1369 1685 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1686 + 1687 + delaunator@5.1.0: 1688 + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} 1370 1689 1371 1690 dequal@2.0.3: 1372 1691 resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} ··· 1413 1732 resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 1414 1733 engines: {node: '>= 4'} 1415 1734 1735 + dompurify@3.4.11: 1736 + resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==} 1737 + 1416 1738 domutils@3.2.2: 1417 1739 resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 1418 1740 ··· 1439 1761 1440 1762 es-module-lexer@1.7.0: 1441 1763 resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1764 + 1765 + es-toolkit@1.49.0: 1766 + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} 1442 1767 1443 1768 esast-util-from-estree@2.0.0: 1444 1769 resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} ··· 1545 1870 1546 1871 h3@1.15.4: 1547 1872 resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} 1873 + 1874 + hachure-fill@0.5.2: 1875 + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} 1548 1876 1549 1877 hast-util-embedded@3.0.0: 1550 1878 resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} ··· 1621 1949 i18next@23.16.8: 1622 1950 resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} 1623 1951 1952 + iconv-lite@0.6.3: 1953 + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1954 + engines: {node: '>=0.10.0'} 1955 + 1624 1956 import-meta-resolve@4.2.0: 1625 1957 resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} 1626 1958 1627 1959 inline-style-parser@0.2.7: 1628 1960 resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} 1629 1961 1962 + internmap@1.0.1: 1963 + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} 1964 + 1965 + internmap@2.0.3: 1966 + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} 1967 + engines: {node: '>=12'} 1968 + 1630 1969 iron-webcrypto@1.2.1: 1631 1970 resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} 1632 1971 ··· 1671 2010 resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1672 2011 hasBin: true 1673 2012 2013 + katex@0.16.47: 2014 + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} 2015 + hasBin: true 2016 + 2017 + khroma@2.1.0: 2018 + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} 2019 + 1674 2020 kleur@3.0.3: 1675 2021 resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1676 2022 engines: {node: '>=6'} ··· 1683 2029 resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} 1684 2030 engines: {node: '>= 8'} 1685 2031 2032 + layout-base@1.0.2: 2033 + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} 2034 + 2035 + layout-base@2.0.1: 2036 + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} 2037 + 2038 + lodash-es@4.18.1: 2039 + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} 2040 + 1686 2041 longest-streak@3.1.0: 1687 2042 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1688 2043 ··· 1701 2056 1702 2057 markdown-table@3.0.4: 1703 2058 resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 2059 + 2060 + marked@16.4.2: 2061 + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} 2062 + engines: {node: '>= 20'} 2063 + hasBin: true 1704 2064 1705 2065 mdast-util-definitions@6.0.0: 1706 2066 resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} ··· 1762 2122 mdn-data@2.12.2: 1763 2123 resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 1764 2124 2125 + mermaid@11.16.0: 2126 + resolution: {integrity: sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==} 2127 + 1765 2128 micromark-core-commonmark@2.0.3: 1766 2129 resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 1767 2130 ··· 1955 2318 parse5@7.3.0: 1956 2319 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 1957 2320 2321 + path-data-parser@0.1.0: 2322 + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} 2323 + 1958 2324 path-to-regexp@6.3.0: 1959 2325 resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 1960 2326 ··· 1978 2344 picomatch@4.0.4: 1979 2345 resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} 1980 2346 engines: {node: '>=12'} 2347 + 2348 + points-on-curve@0.2.0: 2349 + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} 2350 + 2351 + points-on-path@0.2.1: 2352 + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} 1981 2353 1982 2354 postcss-nested@6.2.0: 1983 2355 resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} ··· 2091 2463 2092 2464 retext@9.0.0: 2093 2465 resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} 2466 + 2467 + robust-predicates@3.0.3: 2468 + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} 2094 2469 2095 2470 rollup@4.55.1: 2096 2471 resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} 2097 2472 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2098 2473 hasBin: true 2099 2474 2475 + roughjs@4.6.6: 2476 + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} 2477 + 2478 + rw@1.3.3: 2479 + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} 2480 + 2481 + safer-buffer@2.1.2: 2482 + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2483 + 2100 2484 sax@1.4.3: 2101 2485 resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} 2102 2486 ··· 2181 2565 style-to-object@1.0.14: 2182 2566 resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} 2183 2567 2568 + stylis@4.4.0: 2569 + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} 2570 + 2184 2571 supports-color@10.2.2: 2185 2572 resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 2186 2573 engines: {node: '>=18'} ··· 2207 2594 trough@2.2.0: 2208 2595 resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 2209 2596 2597 + ts-dedent@2.3.0: 2598 + resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} 2599 + engines: {node: '>=6.10'} 2600 + 2210 2601 tsconfck@3.1.6: 2211 2602 resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} 2212 2603 engines: {node: ^18 || >=20} 2604 + deprecated: unmaintained 2213 2605 hasBin: true 2214 2606 peerDependencies: 2215 2607 typescript: ^5.0.0 ··· 2367 2759 util-deprecate@1.0.2: 2368 2760 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2369 2761 2762 + uuid@14.0.1: 2763 + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} 2764 + hasBin: true 2765 + 2370 2766 vfile-location@5.0.3: 2371 2767 resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 2372 2768 ··· 2536 2932 resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 2537 2933 2538 2934 snapshots: 2935 + 2936 + '@antfu/install-pkg@1.1.0': 2937 + dependencies: 2938 + package-manager-detector: 1.6.0 2939 + tinyexec: 1.0.2 2539 2940 2540 2941 '@ark/schema@0.56.0': 2541 2942 dependencies: ··· 2665 3066 2666 3067 '@bomb.sh/args@0.3.1': {} 2667 3068 3069 + '@bomb.sh/tty@0.8.0': {} 3070 + 3071 + '@braintree/sanitize-url@7.1.2': {} 3072 + 2668 3073 '@capsizecss/unpack@3.0.1': 2669 3074 dependencies: 2670 3075 fontkit: 2.0.4 2671 3076 2672 - '@clack/core@1.4.0': 3077 + '@chevrotain/types@11.1.2': {} 3078 + 3079 + '@clack/core@1.4.3': 2673 3080 dependencies: 2674 3081 fast-wrap-ansi: 0.2.0 2675 3082 sisteransi: 1.0.5 2676 3083 2677 - '@clack/prompts@1.5.0': 3084 + '@clack/prompts@1.7.0': 2678 3085 dependencies: 2679 - '@clack/core': 1.4.0 3086 + '@clack/core': 1.4.3 2680 3087 fast-string-width: 3.0.2 2681 3088 fast-wrap-ansi: 0.2.0 2682 3089 sisteransi: 1.0.5 ··· 2921 3328 dependencies: 2922 3329 '@expressive-code/core': 0.41.5 2923 3330 3331 + '@iconify/types@2.0.0': {} 3332 + 3333 + '@iconify/utils@3.1.4': 3334 + dependencies: 3335 + '@antfu/install-pkg': 1.1.0 3336 + '@iconify/types': 2.0.0 3337 + import-meta-resolve: 4.2.0 3338 + 2924 3339 '@img/colour@1.0.0': {} 2925 3340 2926 3341 '@img/sharp-darwin-arm64@0.33.5': ··· 3131 3546 transitivePeerDependencies: 3132 3547 - supports-color 3133 3548 3549 + '@mermaid-js/parser@1.2.0': 3550 + dependencies: 3551 + '@chevrotain/types': 11.1.2 3552 + 3134 3553 '@msgpack/msgpack@3.1.3': {} 3135 3554 3136 3555 '@oslojs/encoding@1.1.0': {} ··· 3291 3710 dependencies: 3292 3711 tslib: 2.8.1 3293 3712 3713 + '@types/d3-array@3.2.2': {} 3714 + 3715 + '@types/d3-axis@3.0.6': 3716 + dependencies: 3717 + '@types/d3-selection': 3.0.11 3718 + 3719 + '@types/d3-brush@3.0.6': 3720 + dependencies: 3721 + '@types/d3-selection': 3.0.11 3722 + 3723 + '@types/d3-chord@3.0.6': {} 3724 + 3725 + '@types/d3-color@3.1.3': {} 3726 + 3727 + '@types/d3-contour@3.0.6': 3728 + dependencies: 3729 + '@types/d3-array': 3.2.2 3730 + '@types/geojson': 7946.0.16 3731 + 3732 + '@types/d3-delaunay@6.0.4': {} 3733 + 3734 + '@types/d3-dispatch@3.0.7': {} 3735 + 3736 + '@types/d3-drag@3.0.7': 3737 + dependencies: 3738 + '@types/d3-selection': 3.0.11 3739 + 3740 + '@types/d3-dsv@3.0.7': {} 3741 + 3742 + '@types/d3-ease@3.0.2': {} 3743 + 3744 + '@types/d3-fetch@3.0.7': 3745 + dependencies: 3746 + '@types/d3-dsv': 3.0.7 3747 + 3748 + '@types/d3-force@3.0.10': {} 3749 + 3750 + '@types/d3-format@3.0.4': {} 3751 + 3752 + '@types/d3-geo@3.1.0': 3753 + dependencies: 3754 + '@types/geojson': 7946.0.16 3755 + 3756 + '@types/d3-hierarchy@3.1.7': {} 3757 + 3758 + '@types/d3-interpolate@3.0.4': 3759 + dependencies: 3760 + '@types/d3-color': 3.1.3 3761 + 3762 + '@types/d3-path@3.1.1': {} 3763 + 3764 + '@types/d3-polygon@3.0.2': {} 3765 + 3766 + '@types/d3-quadtree@3.0.6': {} 3767 + 3768 + '@types/d3-random@3.0.4': {} 3769 + 3770 + '@types/d3-scale-chromatic@3.1.0': {} 3771 + 3772 + '@types/d3-scale@4.0.9': 3773 + dependencies: 3774 + '@types/d3-time': 3.0.4 3775 + 3776 + '@types/d3-selection@3.0.11': {} 3777 + 3778 + '@types/d3-shape@3.1.8': 3779 + dependencies: 3780 + '@types/d3-path': 3.1.1 3781 + 3782 + '@types/d3-time-format@4.0.3': {} 3783 + 3784 + '@types/d3-time@3.0.4': {} 3785 + 3786 + '@types/d3-timer@3.0.2': {} 3787 + 3788 + '@types/d3-transition@3.0.9': 3789 + dependencies: 3790 + '@types/d3-selection': 3.0.11 3791 + 3792 + '@types/d3-zoom@3.0.8': 3793 + dependencies: 3794 + '@types/d3-interpolate': 3.0.4 3795 + '@types/d3-selection': 3.0.11 3796 + 3797 + '@types/d3@7.4.3': 3798 + dependencies: 3799 + '@types/d3-array': 3.2.2 3800 + '@types/d3-axis': 3.0.6 3801 + '@types/d3-brush': 3.0.6 3802 + '@types/d3-chord': 3.0.6 3803 + '@types/d3-color': 3.1.3 3804 + '@types/d3-contour': 3.0.6 3805 + '@types/d3-delaunay': 6.0.4 3806 + '@types/d3-dispatch': 3.0.7 3807 + '@types/d3-drag': 3.0.7 3808 + '@types/d3-dsv': 3.0.7 3809 + '@types/d3-ease': 3.0.2 3810 + '@types/d3-fetch': 3.0.7 3811 + '@types/d3-force': 3.0.10 3812 + '@types/d3-format': 3.0.4 3813 + '@types/d3-geo': 3.1.0 3814 + '@types/d3-hierarchy': 3.1.7 3815 + '@types/d3-interpolate': 3.0.4 3816 + '@types/d3-path': 3.1.1 3817 + '@types/d3-polygon': 3.0.2 3818 + '@types/d3-quadtree': 3.0.6 3819 + '@types/d3-random': 3.0.4 3820 + '@types/d3-scale': 4.0.9 3821 + '@types/d3-scale-chromatic': 3.1.0 3822 + '@types/d3-selection': 3.0.11 3823 + '@types/d3-shape': 3.1.8 3824 + '@types/d3-time': 3.0.4 3825 + '@types/d3-time-format': 4.0.3 3826 + '@types/d3-timer': 3.0.2 3827 + '@types/d3-transition': 3.0.9 3828 + '@types/d3-zoom': 3.0.8 3829 + 3294 3830 '@types/debug@4.1.12': 3295 3831 dependencies: 3296 3832 '@types/ms': 2.1.0 ··· 3305 3841 dependencies: 3306 3842 '@types/node': 22.19.3 3307 3843 3844 + '@types/geojson@7946.0.16': {} 3845 + 3308 3846 '@types/hast@3.0.4': 3309 3847 dependencies: 3310 3848 '@types/unist': 3.0.3 ··· 3333 3871 dependencies: 3334 3872 '@types/node': 22.19.3 3335 3873 3874 + '@types/trusted-types@2.0.7': 3875 + optional: true 3876 + 3336 3877 '@types/unist@2.0.11': {} 3337 3878 3338 3879 '@types/unist@3.0.3': {} ··· 3346 3887 3347 3888 '@ungap/structured-clone@1.3.0': {} 3348 3889 3890 + '@upsetjs/venn.js@2.0.0': 3891 + optionalDependencies: 3892 + d3-selection: 3.0.0 3893 + d3-transition: 3.0.1(d3-selection@3.0.0) 3894 + 3349 3895 '@webcontainer/api@1.6.1': {} 3350 3896 3351 3897 '@webcontainer/snapshot@0.1.0': ··· 3403 3949 dependencies: 3404 3950 astro: 5.16.6(@types/node@22.19.3)(rollup@4.55.1)(typescript@5.8.2) 3405 3951 rehype-expressive-code: 0.41.5 3952 + 3953 + astro-mermaid@2.1.0(astro@5.16.6(@types/node@22.19.3)(rollup@4.55.1)(typescript@5.8.2))(mermaid@11.16.0): 3954 + dependencies: 3955 + astro: 5.16.6(@types/node@22.19.3)(rollup@4.55.1)(typescript@5.8.2) 3956 + import-meta-resolve: 4.2.0 3957 + mdast-util-to-string: 4.0.0 3958 + mermaid: 11.16.0 3959 + unist-util-visit: 5.0.0 3406 3960 3407 3961 astro@5.16.6(@types/node@22.19.3)(rollup@4.55.1)(typescript@5.8.2): 3408 3962 dependencies: ··· 3589 4143 3590 4144 commander@11.1.0: {} 3591 4145 4146 + commander@7.2.0: {} 4147 + 4148 + commander@8.3.0: {} 4149 + 3592 4150 common-ancestor-path@1.0.1: {} 3593 4151 3594 4152 cookie-es@1.2.2: {} 3595 4153 3596 4154 cookie@1.1.1: {} 4155 + 4156 + cose-base@1.0.3: 4157 + dependencies: 4158 + layout-base: 1.0.2 4159 + 4160 + cose-base@2.2.0: 4161 + dependencies: 4162 + layout-base: 2.0.1 3597 4163 3598 4164 crossws@0.3.5: 3599 4165 dependencies: ··· 3627 4193 dependencies: 3628 4194 css-tree: 2.2.1 3629 4195 4196 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.0): 4197 + dependencies: 4198 + cose-base: 1.0.3 4199 + cytoscape: 3.34.0 4200 + 4201 + cytoscape-fcose@2.2.0(cytoscape@3.34.0): 4202 + dependencies: 4203 + cose-base: 2.2.0 4204 + cytoscape: 3.34.0 4205 + 4206 + cytoscape@3.34.0: {} 4207 + 4208 + d3-array@2.12.1: 4209 + dependencies: 4210 + internmap: 1.0.1 4211 + 4212 + d3-array@3.2.4: 4213 + dependencies: 4214 + internmap: 2.0.3 4215 + 4216 + d3-axis@3.0.0: {} 4217 + 4218 + d3-brush@3.0.0: 4219 + dependencies: 4220 + d3-dispatch: 3.0.1 4221 + d3-drag: 3.0.0 4222 + d3-interpolate: 3.0.1 4223 + d3-selection: 3.0.0 4224 + d3-transition: 3.0.1(d3-selection@3.0.0) 4225 + 4226 + d3-chord@3.0.1: 4227 + dependencies: 4228 + d3-path: 3.1.0 4229 + 4230 + d3-color@3.1.0: {} 4231 + 4232 + d3-contour@4.0.2: 4233 + dependencies: 4234 + d3-array: 3.2.4 4235 + 4236 + d3-delaunay@6.0.4: 4237 + dependencies: 4238 + delaunator: 5.1.0 4239 + 4240 + d3-dispatch@3.0.1: {} 4241 + 4242 + d3-drag@3.0.0: 4243 + dependencies: 4244 + d3-dispatch: 3.0.1 4245 + d3-selection: 3.0.0 4246 + 4247 + d3-dsv@3.0.1: 4248 + dependencies: 4249 + commander: 7.2.0 4250 + iconv-lite: 0.6.3 4251 + rw: 1.3.3 4252 + 4253 + d3-ease@3.0.1: {} 4254 + 4255 + d3-fetch@3.0.1: 4256 + dependencies: 4257 + d3-dsv: 3.0.1 4258 + 4259 + d3-force@3.0.0: 4260 + dependencies: 4261 + d3-dispatch: 3.0.1 4262 + d3-quadtree: 3.0.1 4263 + d3-timer: 3.0.1 4264 + 4265 + d3-format@3.1.2: {} 4266 + 4267 + d3-geo@3.1.1: 4268 + dependencies: 4269 + d3-array: 3.2.4 4270 + 4271 + d3-hierarchy@3.1.2: {} 4272 + 4273 + d3-interpolate@3.0.1: 4274 + dependencies: 4275 + d3-color: 3.1.0 4276 + 4277 + d3-path@1.0.9: {} 4278 + 4279 + d3-path@3.1.0: {} 4280 + 4281 + d3-polygon@3.0.1: {} 4282 + 4283 + d3-quadtree@3.0.1: {} 4284 + 4285 + d3-random@3.0.1: {} 4286 + 4287 + d3-sankey@0.12.3: 4288 + dependencies: 4289 + d3-array: 2.12.1 4290 + d3-shape: 1.3.7 4291 + 4292 + d3-scale-chromatic@3.1.0: 4293 + dependencies: 4294 + d3-color: 3.1.0 4295 + d3-interpolate: 3.0.1 4296 + 4297 + d3-scale@4.0.2: 4298 + dependencies: 4299 + d3-array: 3.2.4 4300 + d3-format: 3.1.2 4301 + d3-interpolate: 3.0.1 4302 + d3-time: 3.1.0 4303 + d3-time-format: 4.1.0 4304 + 4305 + d3-selection@3.0.0: {} 4306 + 4307 + d3-shape@1.3.7: 4308 + dependencies: 4309 + d3-path: 1.0.9 4310 + 4311 + d3-shape@3.2.0: 4312 + dependencies: 4313 + d3-path: 3.1.0 4314 + 4315 + d3-time-format@4.1.0: 4316 + dependencies: 4317 + d3-time: 3.1.0 4318 + 4319 + d3-time@3.1.0: 4320 + dependencies: 4321 + d3-array: 3.2.4 4322 + 4323 + d3-timer@3.0.1: {} 4324 + 4325 + d3-transition@3.0.1(d3-selection@3.0.0): 4326 + dependencies: 4327 + d3-color: 3.1.0 4328 + d3-dispatch: 3.0.1 4329 + d3-ease: 3.0.1 4330 + d3-interpolate: 3.0.1 4331 + d3-selection: 3.0.0 4332 + d3-timer: 3.0.1 4333 + 4334 + d3-zoom@3.0.0: 4335 + dependencies: 4336 + d3-dispatch: 3.0.1 4337 + d3-drag: 3.0.0 4338 + d3-interpolate: 3.0.1 4339 + d3-selection: 3.0.0 4340 + d3-transition: 3.0.1(d3-selection@3.0.0) 4341 + 4342 + d3@7.9.0: 4343 + dependencies: 4344 + d3-array: 3.2.4 4345 + d3-axis: 3.0.0 4346 + d3-brush: 3.0.0 4347 + d3-chord: 3.0.1 4348 + d3-color: 3.1.0 4349 + d3-contour: 4.0.2 4350 + d3-delaunay: 6.0.4 4351 + d3-dispatch: 3.0.1 4352 + d3-drag: 3.0.0 4353 + d3-dsv: 3.0.1 4354 + d3-ease: 3.0.1 4355 + d3-fetch: 3.0.1 4356 + d3-force: 3.0.0 4357 + d3-format: 3.1.2 4358 + d3-geo: 3.1.1 4359 + d3-hierarchy: 3.1.2 4360 + d3-interpolate: 3.0.1 4361 + d3-path: 3.1.0 4362 + d3-polygon: 3.0.1 4363 + d3-quadtree: 3.0.1 4364 + d3-random: 3.0.1 4365 + d3-scale: 4.0.2 4366 + d3-scale-chromatic: 3.1.0 4367 + d3-selection: 3.0.0 4368 + d3-shape: 3.2.0 4369 + d3-time: 3.1.0 4370 + d3-time-format: 4.1.0 4371 + d3-timer: 3.0.1 4372 + d3-transition: 3.0.1(d3-selection@3.0.0) 4373 + d3-zoom: 3.0.0 4374 + 4375 + dagre-d3-es@7.0.14: 4376 + dependencies: 4377 + d3: 7.9.0 4378 + lodash-es: 4.18.1 4379 + 4380 + dayjs@1.11.21: {} 4381 + 3630 4382 debug@4.4.3: 3631 4383 dependencies: 3632 4384 ms: 2.1.3 ··· 3636 4388 character-entities: 2.0.2 3637 4389 3638 4390 defu@6.1.4: {} 4391 + 4392 + delaunator@5.1.0: 4393 + dependencies: 4394 + robust-predicates: 3.0.3 3639 4395 3640 4396 dequal@2.0.3: {} 3641 4397 ··· 3673 4429 dependencies: 3674 4430 domelementtype: 2.3.0 3675 4431 4432 + dompurify@3.4.11: 4433 + optionalDependencies: 4434 + '@types/trusted-types': 2.0.7 4435 + 3676 4436 domutils@3.2.2: 3677 4437 dependencies: 3678 4438 dom-serializer: 2.0.0 ··· 3692 4452 error-stack-parser-es@1.0.5: {} 3693 4453 3694 4454 es-module-lexer@1.7.0: {} 4455 + 4456 + es-toolkit@1.49.0: {} 3695 4457 3696 4458 esast-util-from-estree@2.0.0: 3697 4459 dependencies: ··· 3879 4641 ufo: 1.6.1 3880 4642 uncrypto: 0.1.3 3881 4643 4644 + hachure-fill@0.5.2: {} 4645 + 3882 4646 hast-util-embedded@3.0.0: 3883 4647 dependencies: 3884 4648 '@types/hast': 3.0.4 ··· 4080 4844 dependencies: 4081 4845 '@babel/runtime': 7.28.4 4082 4846 4847 + iconv-lite@0.6.3: 4848 + dependencies: 4849 + safer-buffer: 2.1.2 4850 + 4083 4851 import-meta-resolve@4.2.0: {} 4084 4852 4085 4853 inline-style-parser@0.2.7: {} 4854 + 4855 + internmap@1.0.1: {} 4856 + 4857 + internmap@2.0.3: {} 4086 4858 4087 4859 iron-webcrypto@1.2.1: {} 4088 4860 ··· 4117 4889 dependencies: 4118 4890 argparse: 2.0.1 4119 4891 4892 + katex@0.16.47: 4893 + dependencies: 4894 + commander: 8.3.0 4895 + 4896 + khroma@2.1.0: {} 4897 + 4120 4898 kleur@3.0.3: {} 4121 4899 4122 4900 kleur@4.1.5: {} 4123 4901 4124 4902 klona@2.0.6: {} 4903 + 4904 + layout-base@1.0.2: {} 4905 + 4906 + layout-base@2.0.1: {} 4907 + 4908 + lodash-es@4.18.1: {} 4125 4909 4126 4910 longest-streak@3.1.0: {} 4127 4911 ··· 4141 4925 4142 4926 markdown-table@3.0.4: {} 4143 4927 4928 + marked@16.4.2: {} 4929 + 4144 4930 mdast-util-definitions@6.0.0: 4145 4931 dependencies: 4146 4932 '@types/mdast': 4.0.4 ··· 4327 5113 mdn-data@2.0.28: {} 4328 5114 4329 5115 mdn-data@2.12.2: {} 5116 + 5117 + mermaid@11.16.0: 5118 + dependencies: 5119 + '@braintree/sanitize-url': 7.1.2 5120 + '@iconify/utils': 3.1.4 5121 + '@mermaid-js/parser': 1.2.0 5122 + '@types/d3': 7.4.3 5123 + '@upsetjs/venn.js': 2.0.0 5124 + cytoscape: 3.34.0 5125 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0) 5126 + cytoscape-fcose: 2.2.0(cytoscape@3.34.0) 5127 + d3: 7.9.0 5128 + d3-sankey: 0.12.3 5129 + dagre-d3-es: 7.0.14 5130 + dayjs: 1.11.21 5131 + dompurify: 3.4.11 5132 + es-toolkit: 1.49.0 5133 + katex: 0.16.47 5134 + khroma: 2.1.0 5135 + marked: 16.4.2 5136 + roughjs: 4.6.6 5137 + stylis: 4.4.0 5138 + ts-dedent: 2.3.0 5139 + uuid: 14.0.1 4330 5140 4331 5141 micromark-core-commonmark@2.0.3: 4332 5142 dependencies: ··· 4710 5520 parse5@7.3.0: 4711 5521 dependencies: 4712 5522 entities: 6.0.1 5523 + 5524 + path-data-parser@0.1.0: {} 4713 5525 4714 5526 path-to-regexp@6.3.0: {} 4715 5527 ··· 4725 5537 4726 5538 picomatch@4.0.4: {} 4727 5539 5540 + points-on-curve@0.2.0: {} 5541 + 5542 + points-on-path@0.2.1: 5543 + dependencies: 5544 + path-data-parser: 0.1.0 5545 + points-on-curve: 0.2.0 5546 + 4728 5547 postcss-nested@6.2.0(postcss@8.5.6): 4729 5548 dependencies: 4730 5549 postcss: 8.5.6 ··· 4919 5738 retext-stringify: 4.0.0 4920 5739 unified: 11.0.5 4921 5740 5741 + robust-predicates@3.0.3: {} 5742 + 4922 5743 rollup@4.55.1: 4923 5744 dependencies: 4924 5745 '@types/estree': 1.0.8 ··· 4950 5771 '@rollup/rollup-win32-x64-msvc': 4.55.1 4951 5772 fsevents: 2.3.3 4952 5773 5774 + roughjs@4.6.6: 5775 + dependencies: 5776 + hachure-fill: 0.5.2 5777 + path-data-parser: 0.1.0 5778 + points-on-curve: 0.2.0 5779 + points-on-path: 0.2.1 5780 + 5781 + rw@1.3.3: {} 5782 + 5783 + safer-buffer@2.1.2: {} 5784 + 4953 5785 sax@1.4.3: {} 4954 5786 4955 5787 semver@7.7.3: {} ··· 5087 5919 dependencies: 5088 5920 inline-style-parser: 0.2.7 5089 5921 5922 + stylis@4.4.0: {} 5923 + 5090 5924 supports-color@10.2.2: {} 5091 5925 5092 5926 svgo@4.0.0: ··· 5111 5945 trim-lines@3.0.1: {} 5112 5946 5113 5947 trough@2.2.0: {} 5948 + 5949 + ts-dedent@2.3.0: {} 5114 5950 5115 5951 tsconfck@3.1.6(typescript@5.8.2): 5116 5952 optionalDependencies: ··· 5232 6068 ufo: 1.6.1 5233 6069 5234 6070 util-deprecate@1.0.2: {} 6071 + 6072 + uuid@14.0.1: {} 5235 6073 5236 6074 vfile-location@5.0.3: 5237 6075 dependencies:
+1 -1
scripts/generate-docs-index.ts
··· 103 103 const lines = [ 104 104 '# Bombshell Documentation', 105 105 '', 106 - '> Effortlessly build beautiful command-line apps. Docs for Clack, Args, and Tab.', 106 + '> Effortlessly build beautiful command-line apps. Docs for Clack, Args, Tab, and TTY.', 107 107 '', 108 108 `Canonical docs: ${BASE_URL}/`, 109 109 '',
src/assets/tty/keyboard-key-events.gif

This is a binary file and will not be displayed.

src/assets/tty/keyboard-pointer-events.gif

This is a binary file and will not be displayed.

+44
src/content/docs/tty/api/index.mdx
··· 1 + --- 2 + title: API Overview 3 + description: Overview of the @bomb.sh/tty public API 4 + --- 5 + 6 + `@bomb.sh/tty` exports five modules from a single entry point. Everything is available from `@bomb.sh/tty`: 7 + 8 + ```ts twoslash 9 + import { 10 + open, text, close, snapshot, rgba, fit, grow, percent, fixed, 11 + createTerm, 12 + createInput, 13 + settings, alternateBuffer, cursor, mouseTracking, 14 + } from "@bomb.sh/tty"; 15 + ``` 16 + 17 + ## Modules 18 + 19 + | Module | Description | 20 + |---|---| 21 + | [Ops](/docs/tty/api/ops) | UI directive builders: `open`, `text`, `close`, sizing, colors, transitions | 22 + | [Term](/docs/tty/api/term) | Renderer: `createTerm`, `render`, pointer events, layout info | 23 + | [Input](/docs/tty/api/input) | Input parser: `createInput`, `scan`, keyboard/mouse/resize events | 24 + | [Settings](/docs/tty/api/settings) | Terminal mode helpers: alternate buffer, cursor, mouse tracking | 25 + | [Termcodes](/docs/tty/api/termcodes) | Low-level ANSI escape sequence bytes | 26 + 27 + ## Typical app structure 28 + 29 + 1. Apply [settings](/docs/tty/api/settings) to stdout (alternate buffer, cursor, mouse) 30 + 2. Create a [term](/docs/tty/api/term) and [input](/docs/tty/api/input) instance 31 + 3. Set stdin to raw mode 32 + 4. On each frame: build [ops](/docs/tty/api/ops) → `term.render()` → write `output` 33 + 5. On stdin data: `input.scan()` → handle events 34 + 6. If `renderResult.animating`, schedule another frame 35 + 7. On exit: revert settings and restore terminal state 36 + 37 + ## Deno-only exports 38 + 39 + The Deno source tree includes `@bomb.sh/tty/validate` with runtime op validation (`validate`, `assert`, `validated`). This subpath is not in the published npm `exports` map for v0.8.0. 40 + 41 + ## Next steps 42 + 43 + - [Getting Started](/docs/tty/basics/getting-started) 44 + - [Examples](/docs/tty/guides/examples)
+127
src/content/docs/tty/api/input.mdx
··· 1 + --- 2 + title: Input 3 + description: Terminal input parser API for @bomb.sh/tty 4 + --- 5 + 6 + import { Aside } from '@astrojs/starlight/components'; 7 + 8 + The input module decodes raw terminal bytes into structured events. All parsing logic lives in WASM. The TypeScript layer is a thin wrapper. 9 + 10 + ## createInput(options?) 11 + 12 + Creates an input parser instance. 13 + 14 + ```ts twoslash 15 + import { createInput } from "@bomb.sh/tty"; 16 + 17 + async function main() { 18 + let input = await createInput({ escLatency: 25 }); 19 + } 20 + ``` 21 + 22 + ### InputOptions 23 + 24 + | Option | Type | Default | Description | 25 + |---|---|---|---| 26 + | `escLatency` | `number` | `25` | Milliseconds to wait before resolving a lone ESC as the Escape key | 27 + | `terminfo` | `Uint8Array` | xterm defaults | Compiled terminfo binary for terminal-specific sequences | 28 + 29 + <Aside type="note"> 30 + Lower `escLatency` feels snappier but risks misinterpreting multi-byte sequences on slow connections. Vim's `ttimeoutlen` defaults to 100ms; ncurses `ESCDELAY` defaults to 1000ms. 31 + </Aside> 32 + 33 + ## input.scan(bytes?) 34 + 35 + Feed raw bytes from stdin and return parsed events. Call with no arguments to flush a pending ESC after the latency period. 36 + 37 + ```ts twoslash 38 + import { createInput } from "@bomb.sh/tty"; 39 + 40 + async function main() { 41 + let input = await createInput({ escLatency: 25 }); 42 + 43 + process.stdin.setRawMode(true); 44 + let timer: ReturnType<typeof setTimeout> | undefined; 45 + 46 + process.stdin.on("data", (buf) => { 47 + clearTimeout(timer); 48 + 49 + let { events, pending } = input.scan(new Uint8Array(buf)); 50 + 51 + for (let event of events) { 52 + console.log(event); 53 + } 54 + 55 + if (pending) { 56 + timer = setTimeout(() => { 57 + let flush = input.scan(); 58 + for (let event of flush.events) { 59 + console.log(event); 60 + } 61 + }, pending.delay); 62 + } 63 + }); 64 + } 65 + ``` 66 + 67 + ### ScanResult 68 + 69 + | Property | Type | Description | 70 + |---|---|---| 71 + | `events` | `InputEvent[]` | Events produced from this scan | 72 + | `pending` | `{ delay: number }` | Present when a lone ESC is buffered. Re-call `scan()` after `delay` ms | 73 + 74 + ## Event types 75 + 76 + ### Keyboard events 77 + 78 + | Type | Description | 79 + |---|---| 80 + | `keydown` | Key was pressed | 81 + | `keyrepeat` | Key auto-repeat (Kitty enhancement level 2+) | 82 + | `keyup` | Key was released (Kitty enhancement level 2+) | 83 + 84 + All keyboard events include: 85 + 86 + | Property | Type | Description | 87 + |---|---|---| 88 + | `key` | `string` | Key value (e.g. `"a"`, `"Enter"`, `"ArrowUp"`) | 89 + | `code` | `KeyCode` | Physical key identity (US PC-101 layout) | 90 + | `text` | `string?` | Typed character, if applicable | 91 + | `shifted` | `string?` | Shifted character variant | 92 + | `alt`, `ctrl`, `shift` | `true?` | Modifier keys held | 93 + 94 + ### Mouse events 95 + 96 + | Type | Description | 97 + |---|---| 98 + | `mousedown` | Button pressed (`left`, `right`, `middle`) | 99 + | `mouseup` | Button released | 100 + | `mousemove` | Movement while button held | 101 + | `wheel` | Scroll wheel (`direction: "up"` \| `"down"`) | 102 + 103 + Mouse events include `x` and `y` coordinates (0-based) and optional modifiers. 104 + 105 + ### Other events 106 + 107 + | Type | Description | 108 + |---|---| 109 + | `resize` | Terminal resized. Returns `{ width, height }` | 110 + | `cursor` | DSR cursor position report. Returns `{ row, column }` (1-based) | 111 + 112 + Pointer events (`pointerenter`, `pointerleave`, `pointerclick`) are produced by the [renderer](/docs/tty/api/term), not the input parser. 113 + 114 + ## Supported protocols 115 + 116 + The parser recognizes: 117 + 118 + - VT/ANSI escape sequences 119 + - UTF-8 codepoints 120 + - Mouse protocols (VT200, SGR, urxvt) 121 + - Progressive keyboard protocol (via [settings](/docs/tty/api/settings)) 122 + - Partial sequence reassembly across read boundaries 123 + 124 + ## Next steps 125 + 126 + - [Settings API](/docs/tty/api/settings) (enable mouse tracking and keyboard protocols) 127 + - [Term API](/docs/tty/api/term) (pointer hit testing on the render side)
+168
src/content/docs/tty/api/ops.mdx
··· 1 + --- 2 + title: Ops 3 + description: UI directive builders for @bomb.sh/tty 4 + --- 5 + 6 + import { Aside } from '@astrojs/starlight/components'; 7 + 8 + The ops module provides builders for describing terminal UI as a flat array of directives. Each frame is a complete snapshot. Build ops, pass them to [`term.render()`](/docs/tty/api/term), and write the output bytes. 9 + 10 + ## Building a frame 11 + 12 + ```ts twoslash 13 + import { close, open, rgba, text, grow } from "@bomb.sh/tty"; 14 + 15 + let ops = [ 16 + open("root", { 17 + layout: { width: grow(), height: grow(), direction: "ttb" }, 18 + }), 19 + open("panel", { 20 + layout: { padding: { left: 1, right: 1, top: 1, bottom: 1 } }, 21 + border: { color: rgba(0, 255, 0), left: 1, right: 1, top: 1, bottom: 1 }, 22 + cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, 23 + }), 24 + text("Hello, World!"), 25 + close(), 26 + close(), 27 + ]; 28 + ``` 29 + 30 + ## open(id, props?) 31 + 32 + Opens a layout element. Every element needs a unique string `id` for pointer hit-testing and layout queries. 33 + 34 + ### Layout 35 + 36 + | Property | Type | Description | 37 + |---|---|---| 38 + | `width` | `SizingAxis` | Horizontal sizing (`fit`, `grow`, `percent`, `fixed`) | 39 + | `height` | `SizingAxis` | Vertical sizing | 40 + | `padding` | `{ left?, right?, top?, bottom? }` | Inner padding in cells | 41 + | `gap` | `number` | Gap between children | 42 + | `direction` | `"ltr"` \| `"ttb"` | Child layout direction | 43 + | `alignX` | `"left"` \| `"center"` \| `"right"` | Horizontal alignment | 44 + | `alignY` | `"top"` \| `"center"` \| `"bottom"` | Vertical alignment | 45 + 46 + ### Style 47 + 48 + | Property | Type | Description | 49 + |---|---|---| 50 + | `bg` | `number` | Background color (packed RGBA via `rgba()`) | 51 + | `cornerRadius` | `{ tl?, tr?, bl?, br? }` | Rounded corners | 52 + | `border` | `{ color, bg?, left?, right?, top?, bottom? }` | Border sides (number or `{ width, color?, bg? }`) | 53 + | `clip` | `{ horizontal?, vertical? }` | Clip overflowing content | 54 + 55 + ### Floating 56 + 57 + | Property | Type | Description | 58 + |---|---|---| 59 + | `floating.x`, `floating.y` | `number` | Position offset | 60 + | `floating.expand` | `{ width?, height? }` | Expand floating bounds | 61 + | `floating.attachTo` | `"none"` \| `"parent"` \| `"element"` \| `"root"` | Attachment target | 62 + | `floating.attachPoints` | `{ element?, parent? }` | Anchor points | 63 + | `floating.pointerCaptureMode` | `"capture"` \| `"passthrough"` | Pointer event capture | 64 + | `floating.clipTo` | `"none"` \| `"attached-parent"` | Clip to attached parent | 65 + | `floating.zIndex` | `number` | Stacking order | 66 + 67 + ### Transitions 68 + 69 + ```ts twoslash 70 + import { open, rgba } from "@bomb.sh/tty"; 71 + 72 + open("sidebar", { 73 + layout: { width: { type: "fixed", value: 20 } }, 74 + bg: rgba(30, 30, 40), 75 + transition: { 76 + duration: 0.3, 77 + easing: "easeInOut", 78 + properties: ["width", "bg"], 79 + }, 80 + }); 81 + ``` 82 + 83 + | Property | Type | Description | 84 + |---|---|---| 85 + | `duration` | `number` | Duration in seconds | 86 + | `easing` | `"linear"` \| `"easeIn"` \| `"easeOut"` \| `"easeInOut"` | Easing function | 87 + | `properties` | `TransitionProperty[]` | Properties to animate | 88 + | `interactive` | `boolean` | Allow interaction during transition | 89 + 90 + Transition properties: `"x"`, `"y"`, `"position"`, `"width"`, `"height"`, `"size"`, `"bg"`, `"overlay"`, `"borderColor"`, `"borderWidth"`, `"all"`. 91 + 92 + ## text(content, props?) 93 + 94 + Renders a text node inside the current open element. 95 + 96 + | Property | Type | Description | 97 + |---|---|---| 98 + | `color` | `number` | Foreground color | 99 + | `bg` | `number` | Background color | 100 + | `fontSize` | `number` | Font size | 101 + | `fontId` | `number` | Font identifier | 102 + | `wrap` | `number` | Wrap width | 103 + | `attrs` | `number` | Text attributes (bold, italic, etc.) | 104 + 105 + ## close() 106 + 107 + Closes the current open element. Ops must be properly nested. Every `open` needs a matching `close`. 108 + 109 + ## snapshot(ops) 110 + 111 + Pre-packs an op array into a reusable snapshot op. Useful when part of the UI is static across frames. 112 + 113 + ```ts twoslash 114 + import { close, open, snapshot, text, grow } from "@bomb.sh/tty"; 115 + 116 + let chrome = snapshot([ 117 + open("header", { layout: { width: grow(), height: { type: "fixed", value: 1 } } }), 118 + text("My App"), 119 + close(), 120 + ]); 121 + 122 + // Each frame: [chrome, ...dynamicOps] 123 + ``` 124 + 125 + ## rgba(r, g, b, a?) 126 + 127 + Packs an RGBA color into a 32-bit integer. Alpha defaults to 255. 128 + 129 + ```ts twoslash 130 + import { rgba } from "@bomb.sh/tty"; 131 + 132 + rgba(255, 0, 0); // red 133 + rgba(0, 255, 0, 128); // semi-transparent green 134 + ``` 135 + 136 + ## Sizing helpers 137 + 138 + ```ts twoslash 139 + import { fit, grow, percent, fixed } from "@bomb.sh/tty"; 140 + 141 + fit(); // shrink to content 142 + fit(10, 40); // fit with min/max 143 + grow(); // expand to fill available space 144 + grow(5, 50); // grow with min/max 145 + percent(0.5); // 50% of parent 146 + fixed(20); // exactly 20 cells 147 + ``` 148 + 149 + ## Types 150 + 151 + | Type | Description | 152 + |---|---| 153 + | `Op` | Union of all directive types | 154 + | `OpenElement` | Element opened by `open()` | 155 + | `Text` | Text node | 156 + | `CloseElement` | Element closed by `close()` | 157 + | `SizingAxis` | `{ type: "fit" \| "grow" \| "percent" \| "fixed", ... }` | 158 + | `Transition` | Transition configuration | 159 + | `BorderSide` | `number` or `{ width, color?, bg? }` | 160 + 161 + <Aside type="note"> 162 + `pack()` is also exported for low-level wire-format packing. Most applications use `open`/`text`/`close` and let `term.render()` handle packing internally. 163 + </Aside> 164 + 165 + ## Next steps 166 + 167 + - [Term API](/docs/tty/api/term) (rendering ops to the terminal) 168 + - [Examples](/docs/tty/guides/examples) (transitions and layout demos)
+142
src/content/docs/tty/api/settings.mdx
··· 1 + --- 2 + title: Settings 3 + description: Terminal mode helpers for @bomb.sh/tty 4 + --- 5 + 6 + The settings module provides composable terminal mode changes. Each setting produces `apply` and `revert` byte sequences you write to stdout. 7 + 8 + ## `Setting` 9 + 10 + Every setting helper returns: 11 + 12 + ```ts 13 + interface Setting { 14 + apply: Uint8Array; 15 + revert: Uint8Array; 16 + } 17 + ``` 18 + 19 + Write `apply` on startup and `revert` on exit to restore the terminal. 20 + 21 + ## `settings(...sequence)` 22 + 23 + Compose multiple settings into one. Revert runs in reverse order. 24 + 25 + ```ts twoslash 26 + import { 27 + alternateBuffer, 28 + cursor, 29 + mouseTracking, 30 + settings, 31 + } from "@bomb.sh/tty"; 32 + 33 + let tty = settings( 34 + alternateBuffer(), 35 + cursor(false), 36 + mouseTracking(), 37 + ); 38 + 39 + process.stdout.write(tty.apply); 40 + 41 + // on exit: 42 + process.stdout.write(tty.revert); 43 + ``` 44 + 45 + ## `alternateBuffer(options?)` 46 + 47 + Switch to the alternate screen buffer. 48 + 49 + | Option | Type | Default | Description | 50 + |---|---|---|---| 51 + | `clear` | `boolean` | `true` | Clear the alternate buffer on entry | 52 + 53 + ```ts twoslash 54 + import { alternateBuffer } from "@bomb.sh/tty"; 55 + 56 + alternateBuffer(); // enter, clear 57 + alternateBuffer({ clear: false }); // enter, preserve contents 58 + ``` 59 + 60 + Revert switches back to the main screen with scrollback intact. 61 + 62 + ## `cursor(visible)` 63 + 64 + Show or hide the terminal cursor (DEC private mode 25). 65 + 66 + ```ts twoslash 67 + import { cursor } from "@bomb.sh/tty"; 68 + 69 + cursor(false); // hide 70 + cursor(true); // show 71 + ``` 72 + 73 + ## `saveCursorPosition()` 74 + 75 + Save and restore cursor position using DECSC (`ESC 7`) / DECRC (`ESC 8`). 76 + 77 + ```ts twoslash 78 + import { saveCursorPosition } from "@bomb.sh/tty"; 79 + 80 + let pos = saveCursorPosition(); 81 + process.stdout.write(pos.apply); 82 + // ... render ... 83 + process.stdout.write(pos.revert); 84 + ``` 85 + 86 + ## `progressiveInput(level)` 87 + 88 + Enable the progressive keyboard enhancement protocol. 89 + 90 + ```ts twoslash 91 + import { progressiveInput } from "@bomb.sh/tty"; 92 + 93 + progressiveInput(2); // Kitty enhancement level 2+ 94 + ``` 95 + 96 + Revert sends `CSI <u` to disable the protocol. 97 + 98 + ## `mouseTracking()` 99 + 100 + Enable SGR mouse reporting (modes 1003 and 1006). Required for pointer hit testing with [`term.render()`](/docs/tty/api/term). 101 + 102 + ```ts twoslash 103 + import { mouseTracking } from "@bomb.sh/tty"; 104 + 105 + let mouse = mouseTracking(); 106 + process.stdout.write(mouse.apply); 107 + ``` 108 + 109 + Pair with the [input parser](/docs/tty/api/input) to receive mouse events from stdin. 110 + 111 + ## Typical lifecycle 112 + 113 + ```ts twoslash 114 + import { 115 + alternateBuffer, 116 + cursor, 117 + mouseTracking, 118 + settings, 119 + createTerm, 120 + createInput, 121 + } from "@bomb.sh/tty"; 122 + 123 + async function main() { 124 + let tty = settings(alternateBuffer(), cursor(false), mouseTracking()); 125 + process.stdout.write(tty.apply); 126 + 127 + let term = await createTerm({ width: 80, height: 24 }); 128 + let input = await createInput(); 129 + 130 + process.stdin.setRawMode(true); 131 + 132 + // ... app loop ... 133 + 134 + process.stdin.setRawMode(false); 135 + process.stdout.write(tty.revert); 136 + } 137 + ``` 138 + 139 + ## Next steps 140 + 141 + - [Termcodes API](/docs/tty/api/termcodes) (low-level escape sequences) 142 + - [Getting Started](/docs/tty/basics/getting-started) (full quick start)
+172
src/content/docs/tty/api/term.mdx
··· 1 + --- 2 + title: Term 3 + description: Terminal renderer API for @bomb.sh/tty 4 + --- 5 + 6 + import { Aside } from '@astrojs/starlight/components'; 7 + 8 + The term module creates a WASM-backed renderer that converts UI ops into ANSI escape sequences. 9 + 10 + ## createTerm(options) 11 + 12 + Creates a renderer instance. Both dimensions are required. 13 + 14 + ```ts twoslash 15 + import { createTerm } from "@bomb.sh/tty"; 16 + 17 + async function main() { 18 + let term = await createTerm({ width: 80, height: 24 }); 19 + } 20 + ``` 21 + 22 + | Option | Type | Description | 23 + |---|---|---| 24 + | `width` | `number` | Terminal width in columns | 25 + | `height` | `number` | Terminal height in rows | 26 + 27 + Returns a `Term` with a single `render()` method. 28 + 29 + ## term.render(ops, options?) 30 + 31 + Renders a frame and returns the result. 32 + 33 + ```ts twoslash 34 + import { close, createTerm, open, text, grow } from "@bomb.sh/tty"; 35 + 36 + async function main() { 37 + let term = await createTerm({ width: 80, height: 24 }); 38 + 39 + let { output, events, info, errors, animating } = term.render([ 40 + open("root", { layout: { width: grow(), height: grow() } }), 41 + text("Hello"), 42 + close(), 43 + ]); 44 + 45 + process.stdout.write(output); 46 + } 47 + ``` 48 + 49 + ### RenderOptions 50 + 51 + | Option | Type | Description | 52 + |---|---|---| 53 + | `pointer` | `{ x, y, down }` | Pointer position and button state for hit testing | 54 + | `deltaTime` | `number` | Seconds since last frame (for transitions). Auto-computed if omitted | 55 + | `mode` | `"line"` | Render into a line region instead of full screen | 56 + | `row` | `number` | Starting row for line mode (1-based, DSR format) | 57 + 58 + ### Pointer detection 59 + 60 + Pass pointer state to get hit-testing events alongside output: 61 + 62 + ```ts twoslash 63 + import { close, createTerm, fixed, grow, open, text } from "@bomb.sh/tty"; 64 + 65 + async function main() { 66 + let term = await createTerm({ width: 80, height: 24 }); 67 + 68 + let { output, events } = term.render( 69 + [ 70 + open("root", { layout: { width: grow(), height: grow(), direction: "ltr" } }), 71 + open("sidebar", { layout: { width: fixed(20), height: grow() } }), 72 + text("Sidebar"), 73 + close(), 74 + open("main", { layout: { width: grow(), height: grow() } }), 75 + text("Main content"), 76 + close(), 77 + close(), 78 + ], 79 + { pointer: { x: 5, y: 2, down: false } }, 80 + ); 81 + 82 + for (let event of events) { 83 + // { type: "pointerenter", id: "sidebar" } 84 + // { type: "pointerleave", id: "sidebar" } 85 + // { type: "pointerclick", id: "main" } 86 + } 87 + } 88 + ``` 89 + 90 + ### RenderResult 91 + 92 + | Property | Type | Description | 93 + |---|---|---| 94 + | `output` | `Uint8Array` | ANSI bytes to write to stdout | 95 + | `events` | `PointerEvent[]` | Pointer enter/leave/click events | 96 + | `info` | `RenderInfo` | Element bounds lookup | 97 + | `errors` | `ClayError[]` | Layout errors from Clay | 98 + | `animating` | `boolean` | `true` when transitions are still running | 99 + 100 + ### RenderInfo.get(id) 101 + 102 + Returns element bounds for a given id, or `undefined` if not found: 103 + 104 + ```ts twoslash 105 + import { close, createTerm, open, text, grow } from "@bomb.sh/tty"; 106 + 107 + async function main() { 108 + let term = await createTerm({ width: 80, height: 24 }); 109 + let { info } = term.render([ 110 + open("root", { layout: { width: grow(), height: grow() } }), 111 + text("Hello"), 112 + close(), 113 + ]); 114 + let bounds = info.get("root")?.bounds; 115 + } 116 + ``` 117 + 118 + ### PointerEvent 119 + 120 + | Type | Shape | 121 + |---|---| 122 + | `pointerenter` | `{ type: "pointerenter", id: string }` | 123 + | `pointerleave` | `{ type: "pointerleave", id: string }` | 124 + | `pointerclick` | `{ type: "pointerclick", id: string }` | 125 + 126 + ### ClayError 127 + 128 + Layout errors include a `type` and `message`. Known error types: 129 + 130 + - `TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED` 131 + - `ARENA_CAPACITY_EXCEEDED` 132 + - `ELEMENTS_CAPACITY_EXCEEDED` 133 + - `TEXT_MEASUREMENT_CAPACITY_EXCEEDED` 134 + - `DUPLICATE_ID` 135 + - `FLOATING_CONTAINER_PARENT_NOT_FOUND` 136 + - `PERCENTAGE_OVER_1` 137 + - `INTERNAL_ERROR` 138 + - `UNBALANCED_OPEN_CLOSE` 139 + - `CLIP_DEPTH_EXCEEDED` 140 + 141 + ## Frame loop with transitions 142 + 143 + When using transitions, gate your render loop on `animating`: 144 + 145 + ```ts twoslash 146 + import { close, createTerm, open, text, grow } from "@bomb.sh/tty"; 147 + 148 + async function main() { 149 + let term = await createTerm({ width: 80, height: 24 }); 150 + 151 + function frame() { 152 + let { output, animating } = term.render([ 153 + open("root", { layout: { width: grow(), height: grow() } }), 154 + text("Animating..."), 155 + close(), 156 + ]); 157 + process.stdout.write(output); 158 + if (animating) setTimeout(frame, 16); 159 + } 160 + 161 + frame(); 162 + } 163 + ``` 164 + 165 + <Aside type="note"> 166 + Line mode (`mode: "line"`) renders into a region of the main screen scrollback instead of the alternate buffer. See the [inline regions example](https://github.com/bombshell-dev/tty/blob/main/examples/inline-regions/index.ts). 167 + </Aside> 168 + 169 + ## Next steps 170 + 171 + - [Ops API](/docs/tty/api/ops) (building UI directives) 172 + - [Input API](/docs/tty/api/input) (parsing stdin events)
+76
src/content/docs/tty/api/termcodes.mdx
··· 1 + --- 2 + title: Termcodes 3 + description: Low-level ANSI escape sequence builders for @bomb.sh/tty 4 + --- 5 + 6 + import { Aside } from '@astrojs/starlight/components'; 7 + 8 + The termcodes module provides low-level escape sequence builders. Each function returns a `Uint8Array` you can write directly to stdout. 9 + 10 + <Aside type="tip"> 11 + Prefer the [settings helpers](/docs/tty/api/settings) for common terminal mode changes. Use termcodes when you need custom sequences or sequences not covered by settings. 12 + </Aside> 13 + 14 + ## ESC(str) 15 + 16 + Encode a plain escape sequence. Prepends `ESC` (`\x1b`) to the given string. 17 + 18 + ```ts twoslash 19 + import { ESC } from "@bomb.sh/tty"; 20 + 21 + process.stdout.write(ESC("7")); // save cursor (DECSC) 22 + ``` 23 + 24 + ## CSI(str) 25 + 26 + Encode a Control Sequence Introducer command. Prepends `ESC[` to the given string. 27 + 28 + ```ts twoslash 29 + import { CSI } from "@bomb.sh/tty"; 30 + 31 + process.stdout.write(CSI("2J")); // clear screen 32 + ``` 33 + 34 + ## DSR() 35 + 36 + Request cursor position via Device Status Report. Sends `CSI 6n`. The terminal responds with a Cursor Position Report (`CSI row ; column R`) where row and column are 1-based. 37 + 38 + ```ts twoslash 39 + import { DSR } from "@bomb.sh/tty"; 40 + 41 + process.stdout.write(DSR()); 42 + ``` 43 + 44 + The response is parsed as a `cursor` event by the [input parser](/docs/tty/api/input). Used by the [inline regions example](https://github.com/bombshell-dev/tty/blob/main/examples/inline-regions/index.ts) to place animated output in scrollback. 45 + 46 + ## SHOWCURSOR() / HIDECURSOR() 47 + 48 + Show or hide the cursor (DEC private mode 25, DECTCEM). 49 + 50 + ```ts twoslash 51 + import { HIDECURSOR, SHOWCURSOR } from "@bomb.sh/tty"; 52 + 53 + process.stdout.write(HIDECURSOR()); 54 + process.stdout.write(SHOWCURSOR()); 55 + ``` 56 + 57 + Equivalent to [`cursor(false)`](/docs/tty/api/settings) / [`cursor(true)`](/docs/tty/api/settings). 58 + 59 + ## ALTSCREEN(options?) / MAINSCREEN() 60 + 61 + Switch between main and alternate screen buffers. 62 + 63 + ```ts twoslash 64 + import { ALTSCREEN, MAINSCREEN } from "@bomb.sh/tty"; 65 + 66 + process.stdout.write(ALTSCREEN()); // enter, clear 67 + process.stdout.write(ALTSCREEN({ clear: false })); // enter, preserve 68 + process.stdout.write(MAINSCREEN()); // return to main screen 69 + ``` 70 + 71 + Equivalent to [`alternateBuffer()`](/docs/tty/api/settings) / its revert sequence. 72 + 73 + ## Next steps 74 + 75 + - [Settings API](/docs/tty/api/settings) (composable terminal mode helpers) 76 + - [Getting Started](/docs/tty/basics/getting-started)
+208
src/content/docs/tty/basics/getting-started.mdx
··· 1 + --- 2 + title: Getting Started 3 + description: Learn how to get started with @bomb.sh/tty 4 + --- 5 + 6 + import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'; 7 + 8 + `@bomb.sh/tty` is a low-level, platform-independent terminal renderer and event parser for JavaScript. Use it directly to build full-screen or inline terminal UIs, or as the foundation for your own framework. 9 + 10 + ## Features 11 + 12 + - **Declarative terminal UI:** Flexbox-like layout powered by [Clay](https://github.com/nicbarker/clay), with borders, colors, floating elements, scroll containers, and pointer hit-testing 13 + - **Zero I/O:** Never reads stdin or writes stdout. Feed bytes in, get bytes and events back 14 + - **Runs everywhere:** The entire engine is compiled to WebAssembly with no native dependencies for consumers 15 + 16 + ## When to use it 17 + 18 + Reach for `@bomb.sh/tty` when you need a **rendering engine** for terminal UI: layout, styling, diffing, and input parsing, without committing to a particular app framework or I/O model. 19 + 20 + ### Good fits 21 + 22 + - **Full-screen applications:** Dashboards, tools, and games that take over the alternate screen buffer with layouts, borders, mouse hover, and keyboard input (see the [2048](/docs/tty/guides/examples) and [keyboard](/docs/tty/guides/examples) demos) 23 + - **Inline animated output:** Spinners, progress bars, or live status regions embedded in normal scrollback without switching to a full-screen mode (see [inline regions](/docs/tty/guides/examples)) 24 + - **Rich, structured output:** Diff views, panels, sidebars, and multi-pane layouts where hand-written ANSI becomes unmaintainable 25 + - **Interactive layouts with pointer support:** Hover states, clickable regions, and drag-style interactions driven by terminal mouse reporting 26 + - **Animated UI:** Transitions on width, color, position, and other properties with efficient cell-level diffing between frames 27 + - **Custom TUI frameworks:** Zero I/O means you wire stdin/stdout (or any byte stream) yourself; the engine stays a pure compute layer you can embed in Node, Deno, Bun, or the browser 28 + 29 + ### When to pick something else 30 + 31 + - **One-shot CLI prompts** (text input, selects, confirms): use [`@clack/prompts`](/docs/clack/basics/getting-started); it targets a different problem and uses Node's built-in `tty` module, not this package 32 + - **Component-based UI with state and bindings:** use `@clack/ui`, which is built on `@bomb.sh/tty` and handles the higher-level framework concerns for you 33 + 34 + ## Requirements 35 + 36 + Node >= 22. Also works in Deno, Bun, and browsers. 37 + 38 + ## Installation 39 + 40 + <Tabs> 41 + <TabItem label="npm" icon="seti:npm"> 42 + ```bash 43 + npm install @bomb.sh/tty 44 + ``` 45 + </TabItem> 46 + <TabItem label="pnpm" icon="pnpm"> 47 + ```bash 48 + pnpm add @bomb.sh/tty 49 + ``` 50 + </TabItem> 51 + <TabItem label="Yarn" icon="seti:yarn"> 52 + ```bash 53 + yarn add @bomb.sh/tty 54 + ``` 55 + </TabItem> 56 + </Tabs> 57 + 58 + ## Core concepts 59 + 60 + **Frames as snapshots.** Each frame is a complete, independent UI description. Build an array of ops (`open`, `text`, `close`), pass it to `term.render()`, and write the returned ANSI bytes to stdout. The renderer carries layout and diff state between frames, not a persistent component tree. 61 + 62 + **Zero I/O boundary.** You own stdin/stdout. `@bomb.sh/tty` is pure computation: one WASM call per frame on the output side, and a byte-stream parser on the input side. 63 + 64 + **Efficient output.** Clay runs layout, walks render commands into a cell buffer, and diffs against the previous frame. Only changed cells produce ANSI escape sequences. 65 + 66 + ## Architecture 67 + 68 + ### Output 69 + 70 + ```mermaid 71 + flowchart LR 72 + subgraph ts [TypeScript] 73 + Ops["UI ops"] 74 + Stdout["stdout.write"] 75 + end 76 + subgraph wasm [WASM] 77 + Clay["Clay layout"] 78 + Diff["Cell diff"] 79 + Esc["Escape bytes"] 80 + end 81 + Ops -->|"Uint32Array"| Clay 82 + Clay --> Diff 83 + Diff --> Esc 84 + Esc -->|"ANSI bytes"| Stdout 85 + ``` 86 + 87 + ### Input 88 + 89 + ```mermaid 90 + flowchart LR 91 + subgraph ts [TypeScript] 92 + Stdin["stdin.read"] 93 + Events["InputEvent[]"] 94 + end 95 + subgraph wasm [WASM] 96 + Parse["Trie match"] 97 + Decode["UTF-8 / mouse / ESC"] 98 + end 99 + Stdin -->|"raw bytes"| Parse 100 + Parse --> Decode 101 + Decode --> Events 102 + ``` 103 + 104 + Raw bytes are fed into a WASM parser that recognizes VT/ANSI escape sequences, UTF-8 codepoints, and mouse protocols. Partial sequences that arrive across read boundaries are reassembled automatically. A lone ESC byte is held for a configurable latency window (default 25ms) before being emitted. 105 + 106 + ## Quick start: rendering 107 + 108 + To render this: 109 + 110 + ``` 111 + ╭───────────────╮ 112 + │ Hello, World! │ 113 + ╰───────────────╯ 114 + ``` 115 + 116 + ```ts twoslash 117 + import { close, createTerm, grow, open, rgba, text } from "@bomb.sh/tty"; 118 + 119 + async function main() { 120 + let term = await createTerm({ width: 80, height: 24 }); 121 + 122 + let { output } = term.render([ 123 + open("root", { 124 + layout: { width: grow(), height: grow(), direction: "ttb" }, 125 + }), 126 + open("greeting", { 127 + layout: { padding: { left: 1, right: 1, top: 1, bottom: 1 } }, 128 + border: { 129 + color: rgba(0, 255, 0), 130 + left: 1, right: 1, top: 1, bottom: 1, 131 + }, 132 + cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 }, 133 + }), 134 + text("Hello, World!"), 135 + close(), 136 + close(), 137 + ]); 138 + 139 + process.stdout.write(output); 140 + } 141 + ``` 142 + 143 + ## Quick start: input 144 + 145 + ```ts twoslash 146 + import { createInput } from "@bomb.sh/tty"; 147 + 148 + async function main() { 149 + let input = await createInput({ escLatency: 25 }); 150 + 151 + process.stdin.setRawMode(true); 152 + let timer: ReturnType<typeof setTimeout> | undefined; 153 + 154 + process.stdin.on("data", (buf) => { 155 + clearTimeout(timer); 156 + 157 + let { events, pending } = input.scan(new Uint8Array(buf)); 158 + 159 + for (let event of events) { 160 + console.log(event); 161 + } 162 + 163 + if (pending) { 164 + timer = setTimeout(() => { 165 + let flush = input.scan(); 166 + for (let event of flush.events) { 167 + console.log(event); 168 + } 169 + }, pending.delay); 170 + } 171 + }); 172 + } 173 + ``` 174 + 175 + ## Quick start: terminal modes 176 + 177 + Use composable settings to enter alternate buffer mode, hide the cursor, and enable mouse tracking: 178 + 179 + ```ts twoslash 180 + import { 181 + alternateBuffer, 182 + cursor, 183 + mouseTracking, 184 + settings, 185 + } from "@bomb.sh/tty"; 186 + 187 + let tty = settings(alternateBuffer(), cursor(false), mouseTracking()); 188 + process.stdout.write(tty.apply); 189 + 190 + // on exit: 191 + process.stdout.write(tty.revert); 192 + ``` 193 + 194 + ## Demos 195 + 196 + The input parser decodes raw terminal bytes into structured events. Here you can see each key event as the string "hello world" is typed: 197 + 198 + ![Keyboard events demo](/src/assets/tty/keyboard-key-events.gif) 199 + 200 + Hover styles applied to UI elements in response to pointer state. Clay drives hit testing, so you don't need manual coordinate math: 201 + 202 + ![Pointer events demo](/src/assets/tty/keyboard-pointer-events.gif) 203 + 204 + ## Next steps 205 + 206 + 1. Explore [runnable examples](/docs/tty/guides/examples) on GitHub 207 + 2. Read the [Ops API](/docs/tty/api/ops) for layout and styling directives 208 + 3. Join our [Discord community](https://bomb.sh/chat) for support and discussions
+120
src/content/docs/tty/guides/examples.mdx
··· 1 + --- 2 + title: Examples 3 + description: Runnable @bomb.sh/tty demos and what to learn from each 4 + --- 5 + 6 + import { Aside } from '@astrojs/starlight/components'; 7 + 8 + The best way to learn `@bomb.sh/tty` after the [getting started guide](/docs/tty/basics/getting-started) is to run the demos in the [tty repository](https://github.com/bombshell-dev/tty). Each one is a small app that shows how the pieces fit together: render loop, input parsing, terminal modes, transitions. 9 + 10 + <Aside type="note"> 11 + Examples are **not** shipped in the npm package. Clone the repo to run them. They also require a **real terminal**. They won't run in the browser-based Clack WebContainer on this site. 12 + </Aside> 13 + 14 + ## Get set up 15 + 16 + ```bash 17 + git clone https://github.com/bombshell-dev/tty.git 18 + cd tty 19 + make # build the WASM bundle 20 + node examples/keyboard/index.ts 21 + ``` 22 + 23 + <Aside type="note"> 24 + Requires **Node >= 22** or **Deno**. Run all commands from the repository root (`tty/`), not from inside `examples/`. 25 + </Aside> 26 + 27 + ## Which demo should I run? 28 + 29 + | Demo | Start here if you want to… | Key APIs | 30 + |---|---|---| 31 + | [Keyboard](#keyboard) | Wire up input, pointer hover, and terminal modes | [`createInput`](/docs/tty/api/input), [`settings`](/docs/tty/api/settings), [`render` pointer option](/docs/tty/api/term) | 32 + | [Transitions](#transitions) | Animate layout and color between frames | [`open` transitions](/docs/tty/api/ops), [`animating`](/docs/tty/api/term) | 33 + | [Inline regions](#inline-regions) | Draw animated output in scrollback, not full-screen | [`render` line mode](/docs/tty/api/term), [`DSR`](/docs/tty/api/termcodes) | 34 + | [2048](#2048) | See everything combined in a real app | ops, term, input, settings | 35 + | [Diff](#diff) | Highlight per-glyph in a layout | [`text` `bg`](/docs/tty/api/ops) | 36 + 37 + **Suggested order:** keyboard → transitions → inline regions → 2048. Diff is a focused layout exercise you can skip until you need it. 38 + 39 + ## Keyboard 40 + 41 + [`examples/keyboard/index.ts`](https://github.com/bombshell-dev/tty/blob/main/examples/keyboard/index.ts) 42 + 43 + ```bash 44 + node examples/keyboard/index.ts 45 + ``` 46 + 47 + This is the best first demo. It shows the full loop most apps follow: 48 + 49 + 1. Apply [terminal settings](/docs/tty/api/settings) (alternate buffer, hidden cursor, mouse tracking) 50 + 2. Create a [term](/docs/tty/api/term) and feed [pointer state](/docs/tty/api/term) each frame 51 + 3. Parse stdin through [`createInput`](/docs/tty/api/input) and dispatch events 52 + 4. Revert settings on exit 53 + 54 + Type on the keyboard to see decoded key events. Move the mouse to see hover styles. Clay handles hit testing, so you don't need manual coordinate math. 55 + 56 + ![Keyboard events demo](/src/assets/tty/keyboard-key-events.gif) 57 + 58 + ![Pointer events demo](/src/assets/tty/keyboard-pointer-events.gif) 59 + 60 + ## Transitions 61 + 62 + [`examples/transitions/sidebar.ts`](https://github.com/bombshell-dev/tty/blob/main/examples/transitions/sidebar.ts) · [`examples/transitions/notecards.ts`](https://github.com/bombshell-dev/tty/blob/main/examples/transitions/notecards.ts) 63 + 64 + ```bash 65 + node examples/transitions/sidebar.ts 66 + node examples/transitions/notecards.ts 67 + ``` 68 + 69 + Change layout or style properties between frames and attach a [`transition`](/docs/tty/api/ops) to elements. Gate your render loop on [`animating`](/docs/tty/api/term) so you only redraw while motion is in progress. 70 + 71 + The sidebar demo animates width with keyboard shortcuts. Notecards interpolates layout and background color. 72 + 73 + {/* TODO: add transitions-sidebar.gif (record `node examples/transitions/sidebar.ts`) */} 74 + {/* TODO: add transitions-notecards.gif (record `node examples/transitions/notecards.ts`) */} 75 + 76 + ## Inline regions 77 + 78 + [`examples/inline-regions/index.ts`](https://github.com/bombshell-dev/tty/blob/main/examples/inline-regions/index.ts) 79 + 80 + ```bash 81 + node examples/inline-regions/index.ts 82 + ``` 83 + 84 + Renders spinners, progress bars, and small animations into **normal scrollback** instead of taking over the screen. Uses [`DSR`](/docs/tty/api/termcodes) to query cursor position and [`render` in line mode](/docs/tty/api/term) to update a fixed region. 85 + 86 + Reach for this pattern when you want live output inside a regular CLI workflow (build logs, install progress, status lines) without switching to the alternate buffer. 87 + 88 + {/* TODO: add inline-regions.gif (record `node examples/inline-regions/index.ts`) */} 89 + 90 + ## 2048 91 + 92 + [`examples/2048/index.ts`](https://github.com/bombshell-dev/tty/blob/main/examples/2048/index.ts) 93 + 94 + ```bash 95 + node examples/2048/index.ts 96 + ``` 97 + 98 + A complete game combining transitions, keyboard focus, pointer clicks, live resize, and an fps counter. Good reference once you understand the basics. 99 + 100 + **Controls:** arrows or `wasd` to move · `Tab`/`Shift+Tab` for focus · `Enter`/`Space` to activate · `n` new game · `u` undo · `q` or `Ctrl+C` to quit 101 + 102 + {/* TODO: add 2048.gif (record `node examples/2048/index.ts`) */} 103 + 104 + ## Diff 105 + 106 + [`examples/diff/index.ts`](https://github.com/bombshell-dev/tty/blob/main/examples/diff/index.ts) 107 + 108 + ```bash 109 + node examples/diff/index.ts 110 + ``` 111 + 112 + A code-review diff view with per-glyph `bg` highlighting on [`text`](/docs/tty/api/ops) nodes. Useful if you're building structured, read-only output rather than interactive UI. 113 + 114 + {/* TODO: add diff.gif (record `node examples/diff/index.ts`) */} 115 + 116 + ## Next steps 117 + 118 + - [Getting Started](/docs/tty/basics/getting-started) (install, architecture, quick starts) 119 + - [Term API](/docs/tty/api/term) (render loop and pointer events) 120 + - [Input API](/docs/tty/api/input) (stdin event parsing)