summaryrefslogtreecommitdiff
path: root/src/pages/shell.astro
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-02-03 12:38:42 +0200
committerKyren223 <Kyren223@proton.me>2025-02-03 12:38:42 +0200
commit9bf686be2fd865d89adc49bd4d9722d676785aee (patch)
treee841bf6bceea1b109f8c76c0c1bb855bc954da6c /src/pages/shell.astro
parent634360ca0bf976b397df89e7654d7c3141049cc0 (diff)
Added new shell visuals (does nothing atm)
Diffstat (limited to 'src/pages/shell.astro')
-rw-r--r--src/pages/shell.astro112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/pages/shell.astro b/src/pages/shell.astro
new file mode 100644
index 0000000..1a207c0
--- /dev/null
+++ b/src/pages/shell.astro
@@ -0,0 +1,112 @@
+---
+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 class="flex flex-col">
+ <p>$ ls -lah -t --color=auto ~/blogs</p>
+ <p>"/home/kyren/blogs": No such file or directory (os error 2)</p>
+ <p>&nbsp;</p>
+ <p>ls -lah -t --color=auto ~/blogs</p>
+ <p>ls -lah -t --color=auto ~/blogs</p>
+ </div>
+ </TerminalBorder>
+ <TerminalBorder header="Shell" extra="font-['JetBrains_Mono'] w-full">
+ <span class="pr-2">$</span>
+ <p id="terminal" 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 terminal = document.getElementById("terminal")!!;
+ 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) {
+ terminal.innerHTML = `${beforeCursor}${visual}${cursor}${afterCursor}`;
+ } else {
+ terminal.innerHTML = `${beforeCursor}${cursor}${visual}${afterCursor}`;
+ }
+ }
+
+ input.addEventListener("keydown", function (event) {
+ if (event.key === "Enter") {
+ event.preventDefault();
+ // const inputText = input.value;
+ input.value = "";
+ updateShell();
+ }
+ });
+
+ setInterval(updateShell, 50);
+</script>