summaryrefslogtreecommitdiff
path: root/old_stuff/src/pages/shell.astro
diff options
context:
space:
mode:
authorKyren223 <contact@kyren.codes>2026-10-06 20:46:31 +0300
committerKyren223 <contact@kyren.codes>2026-10-06 20:46:31 +0300
commitba1be9573ef20d6424ae987257a1c727c47d4b53 (patch)
treee59ef56f19142215070d0516a9b3a110d15557b6 /old_stuff/src/pages/shell.astro
parentea056b6e080669ba4b6f16c2757b4e2e88ea0553 (diff)
Initial setup for website rewrite
Diffstat (limited to 'old_stuff/src/pages/shell.astro')
-rw-r--r--old_stuff/src/pages/shell.astro438
1 files changed, 438 insertions, 0 deletions
diff --git a/old_stuff/src/pages/shell.astro b/old_stuff/src/pages/shell.astro
new file mode 100644
index 0000000..c1ae14e
--- /dev/null
+++ b/old_stuff/src/pages/shell.astro
@@ -0,0 +1,438 @@
+---
+import Terminal from "@layouts/Terminal.astro";
+import TerminalBorder from "@components/TerminalBorder.astro";
+---
+
+<Terminal path="/bin/bash">
+ <TerminalBorder header="Bash" extra="h-[62%] mt-[0.625vw] mb-[1.5625vw]">
+ <div id="output" class="flex flex-col"></div>
+ </TerminalBorder>
+ <TerminalBorder header="Shell" extra="font-['JetBrains_Mono']">
+ <pre>$ </pre>
+ <p id="input" contenteditable="true" spellcheck="false">
+ npm run buil<span>d</span>after
+ </p>
+ <input class="absolute opacity-0 w-0 h-0 p-0 m-0" autofocus />
+ </TerminalBorder>
+</Terminal>
+<script>
+ var prevCursor = -1;
+ var prevSelectionEnd = -1;
+ var swapped = false;
+ function getCursorText(inputElement) {
+ const text = inputElement.value;
+
+ const oCursorPos = inputElement.selectionStart;
+ const oSelectionEnd = inputElement.selectionEnd;
+
+ var cursorPos = oCursorPos;
+ var selectionEnd = oSelectionEnd;
+
+ if (
+ prevCursor != -1 &&
+ oCursorPos != oSelectionEnd &&
+ (prevSelectionEnd != oSelectionEnd ||
+ (prevSelectionEnd == oSelectionEnd &&
+ prevCursor == oCursorPos &&
+ swapped))
+ ) {
+ cursorPos = oSelectionEnd;
+ selectionEnd = oCursorPos;
+ prevSelectionEnd = oSelectionEnd;
+ swapped = true;
+ } else {
+ swapped = false;
+ }
+
+ prevCursor = oCursorPos;
+
+ var beforeCursor = text.substring(0, cursorPos);
+ var afterCursor = text.substring(cursorPos + 1);
+ var cursorChar = text[cursorPos] || "&nbsp;";
+ var selectedText = "";
+
+ if (selectionEnd > cursorPos) {
+ selectedText = text.substring(cursorPos + 1, selectionEnd);
+ afterCursor = text.substring(oSelectionEnd);
+ beforeCursor = text.substring(0, cursorPos);
+ } else if (selectionEnd < cursorPos) {
+ cursorChar = text[cursorPos - 1] || "&nbsp;";
+ selectedText = text.substring(selectionEnd, cursorPos - 1);
+ afterCursor = text.substring(cursorPos);
+ beforeCursor = text.substring(0, oCursorPos);
+ }
+
+ return {
+ beforeCursor,
+ afterCursor,
+ cursorChar,
+ selectedText,
+ swapped,
+ };
+ }
+
+ const output = document.getElementById("output")!!;
+ const fakeInput = document.getElementById("input")!!;
+ const input = document.querySelector("input")!!;
+ const cursorStyle =
+ "background-color: var(--text); color: var(--background);";
+ const visualStyle =
+ "background-color: var(--primary); color: var(--background);";
+
+ function updateShell() {
+ var { beforeCursor, afterCursor, cursorChar, selectedText, swapped } =
+ getCursorText(input);
+
+ input.focus();
+
+ const cursor = `<span style="${cursorStyle}">${cursorChar}</span>`;
+ const visual = `<span style="${visualStyle}">${selectedText}</span>`;
+
+ if (swapped) {
+ fakeInput.innerHTML = `${beforeCursor}${visual}${cursor}${afterCursor}`;
+ } else {
+ fakeInput.innerHTML = `${beforeCursor}${cursor}${visual}${afterCursor}`;
+ }
+
+ if (input.value.length >= 97) {
+ input.value = "";
+ updateShell();
+ write("segmentation fault (core dumped)");
+ updateTerminal();
+ }
+ }
+
+ function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+
+ var maxLines = 15;
+ var terminal: string[] = [];
+ const rootDirs = [
+ "bin",
+ "boot",
+ "dev",
+ "etc",
+ "home",
+ "lib",
+ "lib64",
+ "lost+found",
+ "nix",
+ "proc",
+ "root",
+ "run",
+ "srv",
+ "sys",
+ "tmp",
+ "usr",
+ "var",
+ ];
+
+ function write(line: string) {
+ const maxChars = 98;
+
+ while (line.length > maxChars) {
+ terminal.push(line.slice(0, maxChars));
+ line = line.slice(maxChars);
+ }
+
+ terminal.push(line);
+
+ while (terminal.length > maxLines) {
+ terminal.shift();
+ }
+ }
+
+ function updateTerminal() {
+ var text = "";
+ for (let i = 0; i < terminal.length; i++) {
+ text += `<p>${terminal[i] == "" ? "&nbsp;" : terminal[i]}</p>`;
+ }
+
+ output.innerHTML = text;
+ }
+
+ var isSudo = false;
+ var rootPassword = "123";
+ var leftPasswordTries = 0;
+ var sudoCommand = "";
+ const knownCommands = [
+ "clear",
+ "test",
+ "whoami",
+ "pwd",
+ "sudo",
+ "rm",
+ "emacs",
+ "set",
+ ];
+
+ async function runCommand(input: string) {
+ if (leftPasswordTries != 0) {
+ if (input == rootPassword) {
+ // await sleep(1000);
+ leftPasswordTries = 0
+ isSudo = true;
+ runCommand(sudoCommand);
+ isSudo = false;
+ sudoCommand = "";
+ } else if (leftPasswordTries == 1) {
+ // await sleep(1000);
+ write("sudo: 3 incorrect password attempts");
+ leftPasswordTries -= 1;
+ sudoCommand = "";
+ } else {
+ // await sleep(1000);
+ write("Sorry, try again.");
+ write("[sudo] password for root:");
+ leftPasswordTries -= 1;
+ }
+ updateTerminal();
+ return;
+ }
+
+ if (!isSudo) {
+ write(`$ ${input}`);
+ console.log(`$ ${input}`);
+ }
+
+ var args = input.split(" ").slice(1);
+ var cmd = input.split(" ")[0];
+
+ if (cmd == "") return;
+
+ if (args.length == 0) {
+ switch (cmd) {
+ case "clear":
+ terminal = [];
+ break;
+
+ case "test":
+ if (isSudo) {
+ write('running "trying to get more info"...');
+ updateTerminal();
+ await sleep(1000);
+ write("fetching notes...");
+ updateTerminal();
+ await sleep(2000);
+ write(
+ "I love the look with 'set theme catppuccin', especially with the minecraft font!",
+ );
+ write("Been using it for a while in emacs");
+ updateTerminal();
+ await sleep(100);
+ write('test "trying to get more info" succeeded');
+ updateTerminal();
+ await sleep(100);
+ write("executed 1 test, 1 succeeded, 0 failed");
+ } else {
+ write('running "trying to get more info"...');
+ updateTerminal();
+ await sleep(1000);
+ write('test "trying to get more info" failed');
+ updateTerminal();
+ await sleep(100);
+ write("executed 1 test, 0 succeeded, 1 failed");
+ }
+ break;
+
+ case "whoami":
+ write("sandbox");
+ break;
+ case "pwd":
+ write("/home/sandbox");
+ break;
+
+ case "sudo":
+ write(`Usage: sudo [COMMAND]`);
+ break;
+
+ case "emacs":
+ write(`emacs: command not found`);
+ write(`The command 'emacs' is not available, but there is a similar command:`);
+ write(`- vim`);
+ write(`- nvim`);
+ break;
+
+ default:
+ if (knownCommands.includes(cmd)) {
+ write(`${cmd}: missing operand`);
+ write(`Try '${cmd} --help' for more information.`);
+ } else {
+ write(`${cmd}: command not found`);
+ }
+ break;
+ }
+ } else if (cmd == "rm") {
+ if (args.length == 2 && (args[0] == "-rf" || args[0] == "-fr")) {
+ if (args[1] == "/") {
+ write("rm: it is dangerous to operate recursively on '/'");
+ write(
+ "rm: use --no-preserve-root to override this failsafe",
+ );
+ } else if (args[1] == "." || args[1] == "..") {
+ write(
+ `rm: refusing to remove '.' or '..' directory: skipping '${args[1]}'`,
+ );
+ } else {
+ if (!args[1].startsWith("/")) {
+ args[1] = "/" + args[1];
+ }
+ write(`rm: cannot remove '${args[1]}': Permission denied`);
+ }
+ } else if (
+ args.length == 3 &&
+ (args[0] == "-rf" || args[0] == "-fr") &&
+ args[2] == "--no-preserve-root"
+ ) {
+ for (const dir of rootDirs) {
+ await sleep(30);
+ write(`rm: cannot remove '/${dir}': Permission denied`);
+ updateTerminal();
+ }
+ } else if (args.length == 1 && args[0] == "--help") {
+ write(`Usage: rm [OPTION]... [FILE]...`);
+ write(`Remove (unlink) the FILE(s).`);
+ } else {
+ write(`${cmd}: unrecognized options '${args.join(" ")}'`);
+ write(`Try '${cmd} --help' for more information.`);
+ }
+ } else if (cmd == "sudo") {
+ if (isSudo) {
+ if (knownCommands.includes(args[0])) {
+ runCommand(args.join(" "));
+ } else {
+ write(`${cmd}: ${args[0]}: command not found`);
+ }
+ isSudo = false;
+ } else {
+ sudoCommand = input;
+ leftPasswordTries = 3;
+ write("[sudo] password for root:");
+ }
+ } else if (cmd == "set" && args.length == 2 && args[0] == "font") {
+ var unknown = false;
+ switch (args[1]) {
+ case "default":
+ window.setTheme({
+ font: "Jetbrains Mono",
+ });
+ break;
+
+ case "minecraft":
+ window.setTheme({
+ font: "Monocraft",
+ });
+ break;
+
+ default:
+ unknown = true;
+ break;
+ }
+ if (unknown) {
+ write(`${cmd}: unknown ${args[0]} '${args[1]}'`);
+ } else {
+ write(`${cmd}: ${args[0]} set to '${args[1]}'`);
+ }
+ } else if (cmd == "set" && args.length == 2 && args[0] == "theme") {
+ var unknown = false;
+ switch (args[1]) {
+ case "default":
+ window.setTheme({
+ primary: "#54d7a9",
+ secondary: "#9b7eca",
+ accent: "#7ed4fb",
+ extra: "#8fcc75",
+ text: "#ffffff",
+ alt: "#999999",
+ background: "#000000",
+ });
+ break;
+
+ case "catppuccin":
+ window.setTheme({
+ primary: "#94e2d5",
+ secondary: "#b4befe",
+ accent: "#74c7ec",
+ extra: "#a6e3a1",
+ text: "#cdd6f4",
+ alt: "#585b70",
+ background: "#1e1e2e",
+ });
+ break;
+
+ case "invisible":
+ case "hide":
+ case "black":
+ case "dark":
+ window.setTheme({
+ primary: "#000000",
+ secondary: "#000000",
+ accent: "#000000",
+ extra: "#000000",
+ text: "#000000",
+ alt: "#000000",
+ background: "#000000",
+ });
+ break;
+
+ case "blind":
+ case "sun":
+ case "light":
+ case "white":
+ case "flashbang":
+ case "flashlight":
+ window.setTheme({
+ primary: "#009399",
+ secondary: "#440b8e",
+ accent: "#177282",
+ extra: "#40a02b",
+ text: "#000000",
+ alt: "#4d4d4d",
+ background: "#ffffff",
+ });
+ break;
+
+ case "banana":
+ window.setTheme({
+ primary: "#ffdd44",
+ secondary: "#9b7eca",
+ accent: "#7ed4fb",
+ extra: "#000000",
+ text: "#ffffff",
+ alt: "#999999",
+ background: "#000000",
+ });
+ break;
+
+ default:
+ unknown = true;
+ break;
+ }
+ if (unknown) {
+ write(`${cmd}: unknown ${args[0]} '${args[1]}'`);
+ } else {
+ write(`${cmd}: ${args[0]} set to '${args[1]}'`);
+ }
+ } else {
+ if (knownCommands.includes(cmd)) {
+ write(`${cmd}: unrecognized options '${args.join(" ")}'`);
+ } else {
+ write(`${cmd}: command not found`);
+ }
+ }
+
+ updateTerminal();
+ }
+
+ input.addEventListener("keydown", function (event) {
+ if (event.key === "Enter") {
+ event.preventDefault();
+ runCommand(input.value);
+ input.value = "";
+ updateShell();
+ }
+ });
+
+ setInterval(updateShell, 50);
+</script>