diff --git a/public/fonts/Monocraft-Black-Italic.ttf b/public/fonts/Monocraft-Black-Italic.ttf new file mode 100644 index 0000000..8b627d3 Binary files /dev/null and b/public/fonts/Monocraft-Black-Italic.ttf differ diff --git a/public/fonts/Monocraft-Black.ttf b/public/fonts/Monocraft-Black.ttf new file mode 100644 index 0000000..6823545 Binary files /dev/null and b/public/fonts/Monocraft-Black.ttf differ diff --git a/public/fonts/Monocraft-Bold-Italic.ttf b/public/fonts/Monocraft-Bold-Italic.ttf new file mode 100644 index 0000000..7af457b Binary files /dev/null and b/public/fonts/Monocraft-Bold-Italic.ttf differ diff --git a/public/fonts/Monocraft-Bold.ttf b/public/fonts/Monocraft-Bold.ttf new file mode 100644 index 0000000..3a6d627 Binary files /dev/null and b/public/fonts/Monocraft-Bold.ttf differ diff --git a/public/fonts/Monocraft-ExtraLight-Italic.ttf b/public/fonts/Monocraft-ExtraLight-Italic.ttf new file mode 100644 index 0000000..a8efafe Binary files /dev/null and b/public/fonts/Monocraft-ExtraLight-Italic.ttf differ diff --git a/public/fonts/Monocraft-ExtraLight.ttf b/public/fonts/Monocraft-ExtraLight.ttf new file mode 100644 index 0000000..9ded8f6 Binary files /dev/null and b/public/fonts/Monocraft-ExtraLight.ttf differ diff --git a/public/fonts/Monocraft-Italic.ttf b/public/fonts/Monocraft-Italic.ttf new file mode 100644 index 0000000..b858d8a Binary files /dev/null and b/public/fonts/Monocraft-Italic.ttf differ diff --git a/public/fonts/Monocraft-Light-Italic.ttf b/public/fonts/Monocraft-Light-Italic.ttf new file mode 100644 index 0000000..8231578 Binary files /dev/null and b/public/fonts/Monocraft-Light-Italic.ttf differ diff --git a/public/fonts/Monocraft-Light.ttf b/public/fonts/Monocraft-Light.ttf new file mode 100644 index 0000000..fcf46ae Binary files /dev/null and b/public/fonts/Monocraft-Light.ttf differ diff --git a/public/fonts/Monocraft-SemiBold-Italic.ttf b/public/fonts/Monocraft-SemiBold-Italic.ttf new file mode 100644 index 0000000..cfef1d7 Binary files /dev/null and b/public/fonts/Monocraft-SemiBold-Italic.ttf differ diff --git a/public/fonts/Monocraft-SemiBold.ttf b/public/fonts/Monocraft-SemiBold.ttf new file mode 100644 index 0000000..9bb06d6 Binary files /dev/null and b/public/fonts/Monocraft-SemiBold.ttf differ diff --git a/public/fonts/Monocraft.ttf b/public/fonts/Monocraft.ttf new file mode 100644 index 0000000..4e80aa9 Binary files /dev/null and b/public/fonts/Monocraft.ttf differ diff --git a/src/pages/shell.astro b/src/pages/shell.astro index 4d3d2db..c1ae14e 100644 --- a/src/pages/shell.astro +++ b/src/pages/shell.astro @@ -102,8 +102,31 @@ import TerminalBorder from "@components/TerminalBorder.astro"; } } + function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + var maxLines = 15; - var terminal: string[] = ["Coming soon!"]; + 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; @@ -129,29 +152,276 @@ import TerminalBorder from "@components/TerminalBorder.astro"; output.innerHTML = text; } - function runCommand(cmd: string) { - write(`$ ${cmd}`); - console.log(`$ ${cmd}`); - console.log(terminal); - switch (cmd) { - case "": - break; - case "clear": - terminal = []; - break; - case "test": - write('testing "trying to get more info"...'); - write('test "trying to get more info" failed'); - write("executed 1 test, 0 succeeded, 1 failed"); - break; - case "thing": - break; - case "thing": - break; - default: - write(`${cmd}: command not found`); - break; + 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(); } diff --git a/src/styles/fonts/Monocraft.css b/src/styles/fonts/Monocraft.css new file mode 100644 index 0000000..34fd24a --- /dev/null +++ b/src/styles/fonts/Monocraft.css @@ -0,0 +1,108 @@ +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-ExtraLight.ttf") format("truetype"); + font-weight: 100; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-ExtraLight-Italic.ttf") format("truetype"); + font-weight: 100; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-ExtraLight.ttf") format("truetype"); + font-weight: 200; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-ExtraLight-Italic.ttf") format("truetype"); + font-weight: 200; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Light-Italic.ttf") format("truetype"); + font-weight: 300; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft.ttf") format("truetype"); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Italic.ttf") format("truetype"); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft.ttf") format("truetype"); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Italic.ttf") format("truetype"); + font-weight: 500; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-SemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-SemiBold-Italic.ttf") format("truetype"); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Bold-Italic.ttf") format("truetype"); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Black.ttf") format("truetype"); + font-weight: 800; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Black-Italic.ttf") format("truetype"); + font-weight: 800; + font-style: italic; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Black.ttf") format("truetype"); + font-weight: 900; + font-style: normal; +} +@font-face { + font-family: "Monocraft"; + src: url("/fonts/Monocraft-Black-Italic.ttf") format("truetype"); + font-weight: 900; + font-style: italic; +} diff --git a/src/styles/terminal.css b/src/styles/terminal.css index c108e19..58da91d 100644 --- a/src/styles/terminal.css +++ b/src/styles/terminal.css @@ -1,5 +1,13 @@ @import url("@styles/fonts/JetBrainsMono.css"); +@font-face { + font-family: 'Monocraft'; + src: url('/fonts/Monocraft.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + :root { --primary: #54d7a9; --secondary: #9b7eca; @@ -8,6 +16,7 @@ --text: #ffffff; --alt: #999999; --background: #000000; + --font: "Jetbrains Mono", monospace; } * { @@ -18,7 +27,7 @@ html { background-color: var(--background); color: var(--text); - font-family: "Jetbrains Mono", monospace; + font-family: var(--font); user-select: none; }