summaryrefslogtreecommitdiff
path: root/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'index.html')
-rw-r--r--index.html276
1 files changed, 276 insertions, 0 deletions
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..e083029
--- /dev/null
+++ b/index.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html>
+<html lang="en"><head>
+<link rel="icon" type="image/jpeg" href="assets/favicon.jpg">
+<meta charset="UTF-8">
+<link rel="stylesheet" href="justifiedGallery.css">
+<title>FAGGOOTTTTT</title>
+<style>
+ :root {
+ --pad: 1.5rem;
+ --gap: 24px; /* space between the page edge and the terminals: same on top and sides */
+ --term-w: 100%;
+ --term-h: 80vh;
+ --term-overlay: rgba(55, 45, 65, 0.6);
+ --term-border: #1a3a4a;
+ }
+
+ html, body {
+ margin: 0;
+ padding: 0;
+ background: rgb(2, 1, 3);
+ }
+
+ body {
+ font-family: ui-monospace, 'JetBrains Mono', 'Fira Code', Consolas, 'Courier New', monospace;
+ font-size: 14px;
+ color: #eee;
+ min-height: 100vh;
+ box-sizing: border-box;
+ padding: var(--gap);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ gap: 24px;
+ overflow-x: hidden;
+ }
+
+ img {
+ max-width: 100%;
+ height: auto;
+ }
+
+ a {
+ color: #6cf;
+ text-decoration: none;
+ transition: color 0.15s ease;
+ }
+
+ a:hover {
+ color: #9df;
+ }
+
+ /* both terminals share the exact same size and padding (top == left) */
+ .terminal {
+ position: relative;
+ flex: 0 0 auto;
+ width: var(--term-w);
+ height: var(--term-h);
+ box-sizing: border-box;
+ padding: var(--pad);
+ border: 2px solid var(--term-border);
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.35);
+ overflow: hidden;
+ }
+
+ .faggif {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ max-width: none;
+ object-fit: fill;
+ z-index: 0;
+ pointer-events: none;
+ }
+
+ .background-square {
+ position: absolute;
+ inset: 0;
+ background-color: var(--term-overlay);
+ z-index: 1;
+ pointer-events: none;
+ }
+
+ .terminal-content {
+ position: relative;
+ z-index: 2;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ }
+
+ .prompt {
+ margin-bottom: 0.9rem;
+ white-space: nowrap;
+ }
+ .prompt .user { color: #fff; }
+ .prompt .path { color: #fff; }
+
+ /* fastfetch layout */
+ .fetch {
+ display: flex;
+ gap: 1.25rem;
+ align-items: flex-start;
+ }
+
+ .logo {
+ flex: 0 0 auto;
+ width: min(40%, 60vh);
+ display: block;
+ }
+
+ .info {
+ flex: 1;
+ min-width: 0;
+ line-height: 1.7;
+ }
+
+ .terminal-content > .title {
+ margin-bottom: 0.9rem;
+ }
+
+ .title {
+ font-size: 1.1rem;
+ font-weight: bold;
+ color: #fff;
+ }
+
+ .sep {
+ color: #fff;
+ overflow: hidden;
+ white-space: nowrap;
+ margin-bottom: 0.4rem;
+ }
+
+ .row {
+ display: flex;
+ gap: 0.6em;
+ overflow-wrap: anywhere;
+ }
+
+ .key {
+ color: #fff;
+ font-weight: bold;
+ flex: 0 0 auto;
+ }
+
+ .info a {
+ color: #fff;
+ text-decoration: underline;
+ text-underline-offset: 3px;
+ }
+ .info a:hover {
+ color: #bbb;
+ }
+
+ .note {
+ color: #888;
+ margin-top: 0.6rem;
+ }
+
+ .footer {
+ padding: var(--gap) 0;
+ text-align: center;
+ font-size: 12px;
+ color: #1f1c24; /* barely lighter than the page bg */
+ user-select: none;
+ }
+
+ /* image that sits between the terminals */
+ .middle-img {
+ flex: 0 1 auto;
+ max-width: 220px;
+ align-self: center;
+ }
+</style>
+</head>
+<body>
+ <script src="scripts/oneko.js" data-cat="assets/oneko.gif"></script>
+
+ <div class="terminal">
+ <img class="faggif" src="assets/fagotni.gif" alt="if you are seeing this something went horribly wrong">
+ <div class="background-square"></div>
+ <div class="terminal-content">
+ <div class="prompt"><span class="user">david@faggot-chan</span>:<span class="path">~</span>$ fastfetch</div>
+ <div class="fetch">
+ <img class="logo" src="assets/bweeeeghg.jpg" alt="">
+ <div class="info">
+ <div class="title">FAGGOOTTTTT</div>
+ <div class="sep">---------------</div>
+ <div class="row"><span class="key">gf twitter</span><a href="https://x.com/FlatchestMoe">FlatchestMoe</a></div>
+ <div class="row"><span class="key">twitter</span><a href="https://x.com/david_eldios_8">david_eldios_8</a></div>
+ <div class="row"><span class="key">github</span><a href="https://github.com/davideldios7/">github/davideldios7</a></div>
+ <div class="row"><span class="key">git</span><a href="https://git.faggot-chan.online">git.faggot-chan</a></div>
+ <div class="row"><span class="key">jellyfin</span><a href="https://jelly.faggot-chan.online">jelly.faggot-chan</a></div>
+ <div id="status"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <img class="middle-img" src="assets/hiissssssss.png" alt="">
+
+ <div class="terminal">
+ <div class="background-square"></div>
+ <div class="terminal-content">
+ <div class="title">all my twitter bookmarks!!!!!</div>
+ <div id="gallery-container">
+ <div id="gallery"></div>
+ </div>
+ <div class="note">(some aren't teto, i still have to cleanup and name them)</div>
+ </div>
+ </div>
+ <div class="footer">i vibecoded all of this</div>
+
+ <dialog id="clickfunction">
+ <div id="clickfunction-inner">
+ <button id="clickfunction-close" aria-label="Close">×</button>
+ <img id="clickfunction-img" src="" alt="">
+ <div id="clickfunction-desc"></div>
+ </div>
+ </dialog>
+<script src="scripts/justifiedgallery.js"></script>
+<script>
+(async () => {
+ const box = document.getElementById('status');
+ if (!box) return;
+ try {
+ const r = await fetch('status/status.json', { cache: 'no-store' });
+ if (!r.ok) return;
+ const d = await r.json();
+ const h = d.host;
+
+ const row = (k, v) => {
+ const el = document.createElement('div');
+ el.className = 'row';
+ const a = document.createElement('span');
+ a.className = 'key';
+ a.textContent = k;
+ const b = document.createElement('span');
+ b.textContent = v;
+ el.append(a, b);
+ box.append(el);
+ };
+
+ const sep = document.createElement('div');
+ sep.className = 'sep';
+ sep.textContent = '---------------';
+ box.append(sep);
+
+ const days = Math.floor(h.uptime / 86400);
+ const hrs = Math.floor((h.uptime % 86400) / 3600);
+ const mins = Math.floor((h.uptime % 3600) / 60);
+ row('uptime', days > 0 ? `${days}d ${hrs}h` : `${hrs}h ${mins}m`);
+ row('kernel', h.kernel);
+ row('memory', `${(h.mem_used_mib / 1024).toFixed(1)} / ${(h.mem_total_mib / 1024).toFixed(1)} GiB`);
+ row('disk', `${h.disk_used_gib} / ${h.disk_total_gib} GiB`);
+
+ box.append(sep.cloneNode(true));
+ for (const s of d.services) {
+ row(s.name, s.up ? (s.ms !== null ? `\u25CF ${s.ms}ms` : '\u25CF up') : '\u25CB down');
+ }
+
+ const age = Math.max(0, Math.round((Date.now() / 1000 - d.updated) / 60));
+ const when = age < 60 ? `${age} min ago` : `${Math.floor(age / 60)}h ago`;
+ row('updated', age > 120 ? `${when} (stale)` : when);
+ } catch (e) {
+ /* no status.json yet: just don't show the rows */
+ }
+})();
+</script>
+
+
+
+</body></html>