307 lines
7.5 KiB
HTML
307 lines
7.5 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>shellgod.icu</title>
|
||
<link href="https://cdn.jsdelivr.net/npm/@fontsource/fira-code@5.1.0/400.min.css" rel="stylesheet">
|
||
<style>
|
||
:root {
|
||
--bg: #050c05;
|
||
--panel-bg: #0e150c;
|
||
--border: #00e639;
|
||
--text: #00e639;
|
||
--text-dim: #ffffff;
|
||
--text-bright: #00ff99;
|
||
--gray: #a9d0b4;
|
||
--font: 'Fira Code', 'Courier New', monospace;
|
||
--glow: 0 0 8px rgba(0, 255, 65, 0.25);
|
||
--radius: 10px;
|
||
--transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
||
}
|
||
|
||
* {
|
||
box-sizing: border-box;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
body {
|
||
background: var(--bg);
|
||
color: var(--text);
|
||
font-family: var(--font);
|
||
min-height: 100vh;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
padding: 24px;
|
||
line-height: 1.5;
|
||
< !-- text-transform: uppercase;
|
||
-->
|
||
}
|
||
|
||
.layout {
|
||
width: 100%;
|
||
max-width: 680px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 16px;
|
||
}
|
||
|
||
/* Base Panel Style */
|
||
.panel {
|
||
background: var(--panel-bg);
|
||
border-radius: var(--radius);
|
||
border-color: var(--bg);
|
||
padding: 20px;
|
||
position: relative;
|
||
transition: border-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
|
||
|
||
/* Animation Initial State */
|
||
opacity: 0;
|
||
transform: translateY(20px);
|
||
animation: panelFadeIn 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
|
||
}
|
||
|
||
/* Staggered Animation Delays */
|
||
.panel:first-child {
|
||
animation-delay: 0.1s;
|
||
}
|
||
|
||
.contact-panel {
|
||
animation-delay: 0.3s;
|
||
}
|
||
|
||
/* Unified hover effect for both .panel and .contact-panel */
|
||
.panel:hover {
|
||
|
||
border-color: var(--text-bright);
|
||
box-shadow: 0 0 12px rgba(0, 230, 57, 0.3);
|
||
color: var(--text-bright);
|
||
}
|
||
|
||
.prompt {
|
||
font-size: 0.9rem;
|
||
margin-bottom: 18px;
|
||
color: var(--text);
|
||
letter-spacing: 0.5px;
|
||
display: flex;
|
||
align-items: center;
|
||
flex-wrap: wrap;
|
||
gap: 8px;
|
||
transition: color 0.3s ease;
|
||
}
|
||
|
||
.cursor {
|
||
display: inline-block;
|
||
width: 8px;
|
||
height: 1em;
|
||
background: var(--text);
|
||
margin-left: 4px;
|
||
animation: blink 1s step-end infinite;
|
||
transition: background-color 0.3s ease;
|
||
}
|
||
|
||
.panel:hover .cursor {
|
||
background-color: var(--text-bright);
|
||
}
|
||
|
||
@keyframes blink {
|
||
|
||
0%,
|
||
100% {
|
||
opacity: 1;
|
||
}
|
||
|
||
50% {
|
||
opacity: 0;
|
||
}
|
||
}
|
||
|
||
@keyframes panelFadeIn {
|
||
to {
|
||
opacity: 1;
|
||
transform: translateY(0);
|
||
}
|
||
}
|
||
|
||
.section-title {
|
||
font-size: 0.75rem;
|
||
color: var(--text-dim);
|
||
margin-bottom: 14px;
|
||
padding-left: 2px;
|
||
letter-spacing: 2px;
|
||
border-left: 0px solid var(--text-dim);
|
||
}
|
||
|
||
.links {
|
||
display: grid;
|
||
gap: 8px;
|
||
}
|
||
|
||
.link {
|
||
display: flex;
|
||
align-items: center;
|
||
padding: 10px 12px;
|
||
background: rgba(0, 255, 65, 0.02);
|
||
border: 0px solid rgba(0, 255, 65, 0.08);
|
||
border-radius: var(--radius);
|
||
color: var(--text);
|
||
text-decoration: none;
|
||
transition: var(--transition);
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.link::before {
|
||
content: '>';
|
||
margin-right: 10px;
|
||
color: var(--text-dim);
|
||
font-weight: bold;
|
||
transition: var(--transition);
|
||
}
|
||
|
||
.link:hover {
|
||
background: rgba(0, 255, 65, 0.08);
|
||
border-color: var(--text);
|
||
transform: translateX(4px);
|
||
}
|
||
|
||
.link:hover::before {
|
||
color: var(--text-bright);
|
||
}
|
||
|
||
.link:focus-visible {
|
||
outline: 2px solid var(--text-bright);
|
||
outline-offset: 2px;
|
||
}
|
||
|
||
.label {
|
||
font-weight: 500;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
.url {
|
||
margin-left: auto;
|
||
color: var(--gray);
|
||
font-size: 0.75rem;
|
||
white-space: nowrap;
|
||
padding-left: 8px;
|
||
transition: var(--transition);
|
||
}
|
||
|
||
.link:hover .url {
|
||
color: var(--text-dim);
|
||
}
|
||
|
||
.contact-panel .prompt {
|
||
margin-bottom: 14px;
|
||
}
|
||
|
||
/* Hide URLs specifically in the contacts panel */
|
||
.contact-panel .url {
|
||
display: none;
|
||
}
|
||
|
||
.footer {
|
||
text-align: center;
|
||
font-size: 0.7rem;
|
||
color: #a9d0b4;
|
||
margin-top: 8px;
|
||
letter-spacing: 1px;
|
||
}
|
||
|
||
@media (max-width: 600px) {
|
||
body {
|
||
padding: 16px;
|
||
}
|
||
|
||
.panel {
|
||
padding: 16px;
|
||
}
|
||
|
||
.url {
|
||
display: none;
|
||
}
|
||
|
||
.prompt {
|
||
font-size: 0.85rem;
|
||
}
|
||
}
|
||
</style>
|
||
</head>
|
||
|
||
<body>
|
||
<div class="layout">
|
||
<!-- Services Panel -->
|
||
<div class="panel">
|
||
<div class="prompt">❯ bx ~/scr/welcome.sh<span class="cursor"></span></div>
|
||
<div class="links" id="services-container"></div>
|
||
</div>
|
||
|
||
<!-- Contacts Panel -->
|
||
<div class="panel contact-panel">
|
||
<div class="prompt">❯ ls ~/contacts </div>
|
||
<div class="links" id="contacts-container"></div>
|
||
</div>
|
||
|
||
<div class="footer">
|
||
shellgod.icu • <span id="year"></span> • all systems operational
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
(function () {
|
||
document.getElementById('year').textContent = new Date().getFullYear();
|
||
|
||
const services = [
|
||
{label: "lbnt.wiki", url: "https://wiki.lbnt.shellgod.icu"},
|
||
{label: "file sharing", url: "https://files.shellgod.icu"},
|
||
{label: "git server", url: "https://git.shellgod.icu"},
|
||
{label: "search without spying", url: "https://search.shellgod.icu/"},
|
||
{label: "draw ur thinking", url: "https://exdw.shellgod.icu/"}
|
||
];
|
||
|
||
const contacts = [
|
||
{label: "text me via simplex", url: "https://smp8.simplex.im/a#fLY8c1DUreljqVyoZ1kFU6CTIEz4FlOClUw6739Kye4"},
|
||
{label: "text me via matrix", url: "https://matrix.to/#/@shellgod:shellgod.icu"},
|
||
{label: "my matrix channel", url: "https://matrix.to/#/#frikinlarpin:shellgod.icu"},
|
||
{label: "register on matrix server", url: "https://app.element.io/#/register"}
|
||
];
|
||
|
||
function createLink(item, index, baseDelay) {
|
||
const a = document.createElement('a');
|
||
a.href = item.url;
|
||
a.target = "_blank";
|
||
a.rel = "noopener noreferrer";
|
||
a.className = "link fade-in";
|
||
a.style.animationDelay = `${baseDelay + (index * 70)}ms`;
|
||
a.style.opacity = '0'; // Start hidden for JS animation
|
||
a.style.transform = 'translateY(10px)';
|
||
a.style.transition = `opacity 0.4s ease ${baseDelay + (index * 70)}ms, transform 0.4s ease ${baseDelay + (index * 70)}ms`;
|
||
|
||
// Trigger reflow or use timeout to apply transition
|
||
setTimeout(() => {
|
||
a.style.opacity = '1';
|
||
a.style.transform = 'translateY(0)';
|
||
}, 50);
|
||
|
||
const domain = item.url.replace(/^https?:\/\//, '').replace(/\/$/, '');
|
||
a.innerHTML = `<span class="label">${item.label}</span><span class="url">${domain}</span>`;
|
||
return a;
|
||
}
|
||
|
||
const svcContainer = document.getElementById('services-container');
|
||
const contactContainer = document.getElementById('contacts-container');
|
||
|
||
// Adjust base delays to match panel entrance
|
||
services.forEach((s, i) => svcContainer.appendChild(createLink(s, i, 300)));
|
||
contacts.forEach((c, i) => contactContainer.appendChild(createLink(c, i, 600)));
|
||
})();
|
||
</script>
|
||
</body>
|
||
|
||
</html>
|