A lot of clean up

This commit is contained in:
Dan 2025-12-31 12:50:21 +00:00
parent d89744f46f
commit 931fa141dc
62 changed files with 447 additions and 993 deletions

View file

@ -7,9 +7,11 @@ if (window.terminal) {
const commands = Object.keys(window.terminal.commands).sort();
commands.forEach((cmd) => {
const desc =
window.terminal.commands[cmd].description || "No description";
window.terminal.print(` ${cmd.padEnd(15)} - ${desc}`);
const desc = window.terminal.commands[cmd].description;
// Skip commands with no description (hidden commands)
if (desc) {
window.terminal.print(` ${cmd.padEnd(15)} - ${desc}`);
}
});
window.terminal.print("");
});
@ -20,13 +22,13 @@ if (window.terminal) {
});
// Echo command
window.terminal.registerCommand(
"echo",
"Echo text to the terminal",
(args) => {
window.terminal.print(args.join(" "));
},
);
// window.terminal.registerCommand(
// "echo",
// "Echo text to the terminal",
// (args) => {
// window.terminal.print(args.join(" "));
// },
// );
// History command
window.terminal.registerCommand("history", "Show command history", () => {

View file

@ -83,13 +83,44 @@ if (window.terminal) {
// ADD YOUR OWN COMMANDS BELOW THIS LINE
// ========================================
// Hidden WOW command (no description = won't show in help)
window.terminal.registerCommand("wow", "", () => {
const audio = new Audio("/audio/wow.mp3");
audio.play().catch((error) => {
window.terminal.printError("Failed to play audio: " + error.message);
});
const art = `
`;
window.terminal.print(art, "success");
});
// Template for new command:
/*
window.terminal.registerCommand('commandname', 'Command description', (args) => {
// args is an array of arguments
// Example: if user types "mycommand hello world"
// args will be ['hello', 'world']
// Print output using:
window.terminal.print('Regular text');
window.terminal.printSuccess('Success message');

View file

@ -1,47 +1,47 @@
// Navigation Commands Module
if (window.terminal) {
// Navigate to URL command
window.terminal.registerCommand("goto", "Navigate to a URL", (args) => {
if (args.length === 0) {
window.terminal.printError("Usage: goto <url>");
window.terminal.print("Examples:");
window.terminal.print(" goto google.com");
window.terminal.print(" goto https://github.com");
return;
}
// window.terminal.registerCommand("goto", "Navigate to a URL", (args) => {
// if (args.length === 0) {
// window.terminal.printError("Usage: goto <url>");
// window.terminal.print("Examples:");
// window.terminal.print(" goto google.com");
// window.terminal.print(" goto https://github.com");
// return;
// }
const url = args[0];
window.terminal.printInfo(`Navigating to ${url}...`);
// const url = args[0];
// window.terminal.printInfo(`Navigating to ${url}...`);
setTimeout(() => {
window.location.href = url.startsWith("http") ? url : `https://${url}`;
}, 500);
});
// setTimeout(() => {
// window.location.href = url.startsWith("http") ? url : `https://${url}`;
// }, 500);
// });
// Open in new tab command
window.terminal.registerCommand("open", "Open URL in new tab", (args) => {
if (args.length === 0) {
window.terminal.printError("Usage: open <url>");
window.terminal.print("Examples:");
window.terminal.print(" open google.com");
window.terminal.print(" open https://github.com");
return;
}
// window.terminal.registerCommand("open", "Open URL in new tab", (args) => {
// if (args.length === 0) {
// window.terminal.printError("Usage: open <url>");
// window.terminal.print("Examples:");
// window.terminal.print(" open google.com");
// window.terminal.print(" open https://github.com");
// return;
// }
const url = args[0];
window.terminal.printInfo(`Opening ${url} in new tab...`);
// const url = args[0];
// window.terminal.printInfo(`Opening ${url} in new tab...`);
const fullUrl = url.startsWith("http") ? url : `https://${url}`;
window.open(fullUrl, "_blank");
});
// const fullUrl = url.startsWith("http") ? url : `https://${url}`;
// window.open(fullUrl, "_blank");
// });
// Reload page command
window.terminal.registerCommand("reload", "Reload the current page", () => {
window.terminal.printInfo("Reloading page...");
setTimeout(() => {
window.location.reload();
}, 500);
});
// window.terminal.registerCommand("reload", "Reload the current page", () => {
// window.terminal.printInfo("Reloading page...");
// setTimeout(() => {
// window.location.reload();
// }, 500);
// });
// PAGE NAVIGATION
@ -57,4 +57,16 @@ if (window.terminal) {
window.location.href = "/audio/";
},
);
window.terminal.registerCommand("blog", "Read my blog posts", () => {
window.location.href = "/blog/";
});
window.terminal.registerCommand(
"now",
"What I'm doing now and tools I use",
() => {
window.location.href = "/now/";
},
);
}

View file

@ -92,8 +92,8 @@ if (window.terminal) {
});
// Greet command
window.terminal.registerCommand("greet", "Greet the user", (args) => {
const name = args.length > 0 ? args.join(" ") : "User";
window.terminal.printSuccess(`Hello, ${name}! Welcome to the terminal.`);
});
// window.terminal.registerCommand("greet", "Greet the user", (args) => {
// const name = args.length > 0 ? args.join(" ") : "User";
// window.terminal.printSuccess(`Hello, ${name}! Welcome to the terminal.`);
// });
}

42
assets/js/konami.js Normal file
View file

@ -0,0 +1,42 @@
// Konami Code Easter Egg
(function () {
const konamiCode = [
"ArrowUp",
"ArrowUp",
"ArrowDown",
"ArrowDown",
"ArrowLeft",
"ArrowRight",
"ArrowLeft",
"ArrowRight",
"KeyB",
"KeyA",
];
let konamiIndex = 0;
// Create audio element
const audio = new Audio("/audio/wow.mp3"); // You'll need to add this audio file
document.addEventListener("keydown", function (e) {
// Check if the pressed key matches the next key in the sequence
if (e.code === konamiCode[konamiIndex]) {
konamiIndex++;
// If we've completed the sequence
if (konamiIndex === konamiCode.length) {
// Play the WOW sound
audio.currentTime = 0; // Reset to start
audio.play();
// Optional: Add some visual feedback
console.log("🎮 Konami Code activated!");
// Reset the sequence
konamiIndex = 0;
}
} else {
// Wrong key, reset the sequence
konamiIndex = 0;
}
});
})();

View file

@ -16,6 +16,16 @@ class TerminalShell {
// Boot sequence
async boot() {
let skipBoot = false;
// Add listener to skip boot sequence on Enter key
const skipBootListener = (e) => {
if (e.key === "Enter") {
skipBoot = true;
}
};
document.addEventListener("keydown", skipBootListener);
const bootMessages = [
" _ _ _____ ______ __",
" | \\ | | ____| _ \\ \\ / /",
@ -39,8 +49,11 @@ class TerminalShell {
"",
"",
];
for (let i = 0; i < bootMessages.length; i++) {
await this.sleep(100);
if (!skipBoot) {
await this.sleep(100);
}
const line = document.createElement("div");
line.className = "output-line boot-line";
line.textContent = bootMessages[i];
@ -49,6 +62,9 @@ class TerminalShell {
this.scrollToBottom();
}
// Remove the skip boot listener
document.removeEventListener("keydown", skipBootListener);
this.printHTML("&nbsp;");
// Get latest post info
@ -71,7 +87,7 @@ class TerminalShell {
);
this.printHTML(
'<span class="warning">This site is under construction. There\'s not much of interest here yet.</span>',
'<span class="warning">This site is under construction. Feel free to look around...</span>',
);
this.inputContainer.classList.remove("hidden");

View file

@ -25,6 +25,11 @@
border-radius: 8px;
}
.blog-header {
text-align: center;
padding-bottom: 20px;
}
// Brand on bezel
&::before {
content: "BLOG TERMINAL";
@ -63,6 +68,40 @@
height: 6px;
}
}
> .window {
z-index: -1;
position: fixed;
top: 0px;
left: 50%;
transform: translateX(250px);
width: 600px;
}
> .blogs-lavalamp {
position: fixed;
bottom: 0px;
left: 50%;
transform: translateX(-550px);
z-index: -1;
.lava-lamp-container {
height: 400px;
width: 180px;
pointer-events: none;
&::before {
opacity: 0.7;
filter: blur(30px);
animation: rotate-beams 7s linear infinite;
}
.lamp-text-shadow,
.lamp-text {
display: none;
}
}
}
}
// CRT screen content area
@ -98,7 +137,11 @@
rgba(255, 255, 255, 0.15) 0%,
transparent 40%
),
radial-gradient(ellipse at center, transparent 0%, rgba(0, 0, 0, 0.3) 100%);
radial-gradient(
ellipse at center,
transparent 0%,
rgba(0, 0, 0, 0.3) 100%
);
pointer-events: none;
z-index: 3;
border-radius: 8px;
@ -152,12 +195,12 @@
font-size: 1.5rem;
}
}
}
p {
font-size: 1rem;
line-height: 1.6;
margin-bottom: 1rem;
}
p {
font-size: 1rem;
line-height: 1.6;
margin-bottom: 1rem;
}
}
@ -225,6 +268,7 @@
background: rgba(255, 153, 0, 0.2);
border-color: rgba(255, 153, 0, 0.5);
color: #ff9900;
text-shadow: 0 0 5px rgba(255, 153, 0, 0.5);
}
}
@ -252,16 +296,6 @@
text-shadow: 0 0 5px rgba(0, 255, 0, 0.5);
white-space: nowrap;
&::before {
content: "[";
margin-right: 2px;
}
&::after {
content: "]";
margin-left: 2px;
}
@include media-down(lg) {
font-size: 0.7rem;
}
@ -306,12 +340,7 @@
font-size: 0.75rem;
color: #0f0;
font-family: monospace;
text-transform: uppercase;
letter-spacing: 0.5px;
&::before {
content: "#";
}
}
}
@ -345,7 +374,11 @@
}
// Headings in content
h2, h3, h4, h5, h6 {
h2,
h3,
h4,
h5,
h6 {
margin-top: 1.5em;
margin-bottom: 0.75em;
color: greenyellow;
@ -406,7 +439,8 @@
}
// Lists
ul, ol {
ul,
ol {
margin: 1em 0;
padding-left: 2em;
@ -586,7 +620,8 @@
flex-wrap: wrap;
li {
a, span {
a,
span {
display: block;
padding: 6px 12px;
background: transparent;
@ -631,7 +666,8 @@
// Disabled state
&.disabled {
a, span {
a,
span {
opacity: 0.3;
cursor: not-allowed;