init commit

This commit is contained in:
bckelley
2024-10-31 15:14:36 -05:00
commit 6383b52083
8 changed files with 526 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
node_modules/
.env
bckelleyResume.docx
app.js
package*
+12
View File
@@ -0,0 +1,12 @@
# Terminal Portfolio
A simple Express.js application for a terminal portfolio.
## Installation
Clone the repository and run:
```bash
npm install
npm start
```
+131
View File
@@ -0,0 +1,131 @@
body {
margin: 0;
padding: 15px 20px;
min-height: 99%;
width: 100%;
min-width: 550px;
color: #519975;
background: #211D1B;
font-family: cursor, monospace;
overflow-x: hidden;
}
::selection {
color: #211830;
background-color: #519975;
}
::-moz-selection {
color: #211830;
background-color: #519975;
}
textarea {
left: -1000px;
position: absolute;
}
b {
font-weight: bold;
text-decoration: underline;
}
/* Cursor Start */
.cursor {
font-size: 12px;
color: #73ABAD;
background-color: #73ABAD;
position: relative;
opacity: 1;
height: 1.5em;
width: 10px;
max-width: 10px;
transform: translateY(4px);
overflow: hidden;
text-indent: -5px;
display: inline-block;
text-decoration: blink;
animation: blinker 1s linear infinite;
}
@keyframes blinker {
50% {
opacity: 0;
}
}
#command {
cursor: text;
height: 50px;
color: #73ABAD;
}
#liner {
line-height: 1.3em;
margin-top: -2px;
animation: show 0.5s ease forwards;
animation-delay: 1.2s;
opacity: 0;
}
#liner::before {
color: #519975;
content: "visitor@bckelley.com:~$";
}
#liner.password::before {
content: "Password:";
}
@keyframes show {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* Cursor End */
p {
display: block;
line-height: 1.3em;
margin: 0;
overflow: hidden;
white-space: nowrap;
margin: 0;
letter-spacing: 0.05em;
animation: typing 0.5s steps(30, end);
}
.no-animation {
animation: typing 0 steps(30, end);
}
.margin {
margin-left: 20px;
}
@keyframes typing {
from {
width: 0;
}
to {
width: 100%;
}
}
.index {
color: #DCDCCC;
}
.color2 {
color: #B89076;
}
.command {
color: #73ABAD;
text-shadow: 0 0 5px #73ABAD;
}
.error {
color: #B89076;
}
.white {
color: #fff;
}
.inherit,
a {
color: #9C8394;
}
a {
text-decoration: inherit;
}
a:hover {
background: #73ABAD;
color: #211830;
}
a:focus {
outline: 0;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+46
View File
@@ -0,0 +1,46 @@
<!DOCTYPE html>
<html>
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-6364M55Q6C"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-6364M55Q6C');
</script>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>bckelley | Terminal</title>
<link rel="stylesheet" type="text/css" media="screen" href="../css/style.css" />
<link rel="icon" type="image/x-icon" href="./favicon.ico" />
</head>
<body>
<div id="terminal">
<a id="before"></a>
</div>
<div id="command" onclick="$('texter').focus();">
<textarea
type="text"
id="texter"
onkeyup="typeIt(this, event)"
onkeydown="typeIt(this, event);
moveIt(this.value.length, event)"
onkeypress="typeIt(this, event);"
autofocus
></textarea>
<div id="liner">
<span id="typer"></span><b class="cursor" id="cursor"></b>
</div>
</div>
<script src="../js/caret.js"></script>
<script src="../js/commands.js"></script>
<script src="../js/main.js"></script>
</body>
</html>
+38
View File
@@ -0,0 +1,38 @@
function $(elid) {
return document.getElementById(elid);
}
var cursor;
window.onload = init;
function init() {
cursor = $("cursor");
cursor.style.left = "0px";
}
function nl2br(txt) {
return txt.replace(/\n/g, '');
}
function typeIt(from, e) {
e = e || window.event;
var w = $("typer");
var tw = from.value;
if (!pw){
w.innerHTML = nl2br(tw);
}
}
function moveIt(count, e) {
e = e || window.event;
var keycode = e.keyCode || e.which;
if (keycode == 37 && parseInt(cursor.style.left) >= (0 - ((count - 1) * 10))) {
cursor.style.left = parseInt(cursor.style.left) - 10 + "px";
} else if (keycode == 39 && (parseInt(cursor.style.left) + 10) <= 0) {
cursor.style.left = parseInt(cursor.style.left) + 10 + "px";
}
}
function alert(txt) {
console.log(txt);
}
+101
View File
@@ -0,0 +1,101 @@
var youtube = "";
var twitter = "";
var instagram = "";
var threads = "";
var github = "https://github.com/bckelley/";
var linkedin = "https://www.linkedin.com/in/bckelley2/";
var password = "phpRulez";
var email = 'mailto:admin@bradonckelley.me';
whois = [
"<br>",
"Hey! My name is Bradon 👋 and I am a back-end developer with a passion for PHP and technology.",
"I have 12 of experience and have worked on projects like my SimplePHPDB which can read about on github.",
"You can connect with me on linkedin or check out my work on github",
"<br>"
];
whoami = [
"<br>",
"The paradox of “Who am I?” is a labyrinth with no map, yet we tirelessly",
"explore its winding paths. Each step reveals a new facet of ourselves, a",
"reflection in the ever-shifting mirror of experience. And so, the journey",
"becomes the answer, the quest for self-discovery a tapestry woven from the",
"threads of existence.",
"<br>"
];
social = [
"<br>",
(youtube !== "") ? 'youtube <a href="' + youtube + '" target="_blank">youtube/' + "</a>" : '',
(twitter !== "") ? 'twitter <a href="' + twitter + '" target="_blank">twitter/' + '</a>' : '',
(linkedin !== "") ? 'linkedin <a href="' + linkedin + '" target="_blank">linkedin/bckelley' + "</a>" : '',
(instagram !== "") ? 'instagram <a href="' + instagram + '" target="_blank">instagram/' + '</a>' : '',
(threads !== "") ? 'threads <a href="' + threads + '" target="_blank">threads/' + '</a>' : '',
(github !== "") ? 'github <a href="' + github + '" target="_blank">github/bckelley' + "</a>" : '',
"<br>"
];
secret = [
"<br>",
"<span class=\"command\">sudo</span> We trust you have received the usual lecture from the local",
" System Administrator. It usually boils down to these three things: ",
" #1) Respect the privacy of others. ",
" #2) Think before you type. ",
" #3) With great power comes great responsibility. ",
"<br>"
];
projects = [
"<br>",
"Still curating... most projects are offline, on GitHub, or confidential.",
(github !== "") ? '[ github/todo-list ]: <a href="' + github + 'todo-list' +'" target="_blank">github/bckelley/todo-list' + "</a>" : '',
(github !== "") ? '[ github/RouteEaseMVC ]: <a href="' + github + 'RouteEaseMVC' + '" target="_blank">github/bckelley/TouteEaseMVC' + "</a>" : '',
(github !== "") ? '[ github/SimplePHPDB ]: <a href="' + github + 'SimplePHPDB' + '" target="_blank">github/bckelley/SimplePHPDB' + "</a>" : '',
// (github !== "") ? '[ github/ ]: <a href="' + github + '' +'" target="_blank">github/bckelley/' + "</a>" : '',
"<br>"
];
help = [
"<br>",
'<span class="command">whois</span> Who is bckelley?',
'<span class="command">whoami</span> Who are you?',
(youtube !== "")?'<span class="command">video</span> View YouTube videos': '',
'<span class="command">social</span> Display social networks',
'<span class="command">secret</span> Find the password',
'<span class="command">projects</span> View coding projects',
'<span class="command">history</span> View command history',
'<span class="command">help</span> You obviously already know what this does',
'<span class="command">email</span> Do not email me',
'<span class="command">clear</span> Clear terminal',
'<span class="command">banner</span> Display the header',
"<br>",
];
license = [
'<br>',
'<span class="index"><p xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/"><a property="dct:title" rel="cc:attributionURL" href="https://github.com/bckelley/terminal-portfolio">bckelley Terminal Portfolio</a> by <a rel="cc:attributionURL dct:creator" property="cc:attributionName" href="https://github.com/bckelley">bckelley</a> is licensed under <br> <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International <img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nc.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nd.svg?ref=chooser-v1" alt=""></a></p>'
];
banner = [
'<span class="index">Bradon Kelley (BK) Not A Corporation. All rights reserved.</span>',
' ',
' ,dPYb, ,dPYb, ,dPYb, ,dPYb, ',
' IP\'`Yb IP\'`Yb IP\'`Yb IP\'`Yb ',
' I8 8I I8 8I I8 8I I8 8I ',
' I8 8\' I8 8bgg, I8 8\' I8 8\' ',
' I8 dP ,gggg, I8 dP" "8 ,ggg, I8 dP I8 dP ,ggg, gg gg ',
' I8dP 88gg dP" "Yb I8d8bggP" i8" "8i I8dP I8dP i8" "8i I8 8I ',
' I8P 8I i8\' I8P\' "Yb, I8, ,8I I8P I8P I8, ,8I I8, ,8I ',
' ,d8b, ,8I ,d8,_ _,d8 `Yb, `YbadP\' ,d8b,_ ,d8b,_ `YbadP\' ,d8b, ,d8I ',
' 8P\'"Y88P"\' P""Y8888PP88P Y8888P"Y8888P\'"Y888P\'"Y88888P"Y888P""Y88P"888 ',
' ,d8I\' ',
' ,dP\'8I ',
' ,8" 8I ',
' I8 8I ',
' `8, ,8I ',
' `Y8P\' ',
'<span class="color2">Welcome to my interactive web terminal.</span>',
'<span class="color2">For a list of available commands, type</span> <span class="command">\'help\'</span><span class="color2">.</span>',
];
+193
View File
@@ -0,0 +1,193 @@
var before = document.getElementById("before");
var liner = document.getElementById("liner");
var command = document.getElementById("typer");
var textarea = document.getElementById("texter");
var terminal = document.getElementById("terminal");
var git = 0;
var pw = false;
let pwd = false;
var commands = [];
setTimeout(function() {
loopLines(banner, "", 80);
textarea.focus();
}, 100);
window.addEventListener("keyup", enterKey);
console.log(
"%cYou hacked my password!😠",
"color: #04ff00; font-weight: bold; font-size: 24px;"
);
console.log("%cPassword: '" + password + "' - I wonder what it does?🤔", "color: grey");
//init
textarea.value = "";
command.innerHTML = textarea.value;
function enterKey(e) {
if (e.keyCode == 181) {
document.location.reload(true);
}
if (pw) {
let et = "*";
let w = textarea.value.length;
command.innerHTML = et.repeat(w);
if (textarea.value === password) {
pwd = true;
}
if (pwd && e.keyCode == 13) {
loopLines(secret, "color2 margin", 120);
command.innerHTML = "";
textarea.value = "";
pwd = false;
pw = false;
liner.classList.remove("password");
} else if (e.keyCode == 13) {
addLine("Wrong password", "error", 0);
command.innerHTML = "";
textarea.value = "";
pw = false;
liner.classList.remove("password");
}
} else {
if (e.keyCode == 13) {
commands.push(command.innerHTML);
git = commands.length;
addLine("visitor@bckelley.com:~$ " + command.innerHTML, "no-animation", 0);
commander(command.innerHTML.toLowerCase());
command.innerHTML = "";
textarea.value = "";
}
if (e.keyCode == 38 && git != 0) {
git -= 1;
textarea.value = commands[git];
command.innerHTML = textarea.value;
}
if (e.keyCode == 40 && git != commands.length) {
git += 1;
if (commands[git] === undefined) {
textarea.value = "";
} else {
textarea.value = commands[git];
}
command.innerHTML = textarea.value;
}
}
}
function commander(cmd) {
switch (cmd.toLowerCase()) {
case "help":
loopLines(help, "color2 margin", 80);
break;
case "whois":
loopLines(whois, "color2 margin", 80);
break;
case "whoami":
loopLines(whoami, "color2 margin", 80);
break;
case "video":
addLine("Opening YouTube...", "color2", 80);
newTab(youtube);
break;
case "sudo":
addLine("Oh no, you're not admin...", "color2", 80);
setTimeout(function() {
window.open('https://youtu.be/uRGljemfwUE?si=V-SJLK5v-Dj9FIE3');
}, 1000);
break;
case "social":
loopLines(social, "color2 margin", 80);
break;
case "secret":
liner.classList.add("password");
pw = true;
break;
case "projects":
loopLines(projects, "color2 margin", 80);
break;
case "password":
addLine("<span class=\"inherit\"> Lol! You're joking, right? You\'re gonna have to try harder than that!😂</span>", "error", 100);
break;
case "history":
addLine("<br>", "", 0);
loopLines(commands, "color2", 80);
addLine("<br>", "command", 80 * commands.length + 50);
break;
case "email":
addLine(`Opening <a href="${email}">${email}</a>...`, "color2", 80);
newTab(email);
break;
case "clear":
setTimeout(function() {
terminal.innerHTML = '<a id="before"></a>';
before = document.getElementById("before");
}, 1);
break;
case "banner":
loopLines(banner, "", 80);
break;
// socials
case "youtube":
addLine("Opening YouTube...", "color2", 80);
newTab(youtube);
break;
case "twitter":
addLine("Opening Twitter...", "color2", 0);
newTab(twitter);
break;
case "linkedin":
addLine("Opening LinkedIn...", "color2", 0);
newTab(linkedin);
break;
case "instagram":
addLine("Opening Instagram...", "color2", 0);
newTab(instagram);
break;
case "github":
addLine("Opening GitHub...", "color2", 0);
newTab(github);
break;
case "license":
loopLines(license, "", 80);
break;
default:
addLine("<span class=\"inherit\">Command not found. For a list of commands, type <span class=\"command\">'help'</span>.</span>", "error", 100);
break;
}
}
function newTab(link) {
setTimeout(function() {
window.open(link, "_blank");
}, 500);
}
function addLine(text, style, time) {
var t = "";
for (let i = 0; i < text.length; i++) {
if (text.charAt(i) == " " && text.charAt(i + 1) == " ") {
t += "&nbsp;&nbsp;";
i++;
} else {
t += text.charAt(i);
}
}
setTimeout(function() {
var next = document.createElement("p");
next.innerHTML = t;
next.className = style;
before.parentNode.insertBefore(next, before);
window.scrollTo(0, document.body.offsetHeight);
}, time);
}
function loopLines(name, style, time) {
name.forEach(function(item, index) {
addLine(item, style, index * time);
});
}