aboutsummaryrefslogtreecommitdiffstats
path: root/index.php
diff options
context:
space:
mode:
authorsillylaird <sillyfanboy@gmail.com>2026-09-03 00:33:59 +0000
committersillylaird <sillyfanboy@gmail.com>2026-09-03 00:33:59 +0000
commit898b52edcb47bcb3e9d6106e74ca73e74ea01e70 (patch)
tree85c6ee5ad58b860144551184d4cf86b560c62b91 /index.php
downloadwww-main.tar.gz
www-main.zip
import live www.sillylaird.ca webrootHEADmain
Diffstat (limited to '')
-rw-r--r--index.php506
1 files changed, 506 insertions, 0 deletions
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..2b05f32
--- /dev/null
+++ b/index.php
@@ -0,0 +1,506 @@
+<?php
+// Language redirect: ?lang=zh|jp|en bounces to the matching variant.
+if (isset($_GET['lang'])) {
+ $l = $_GET['lang'];
+ if ($l === 'zh') { header('Location: /index_zh.php'); exit; }
+ if ($l === 'jp') { header('Location: /index_jp.php'); exit; }
+ header('Location: /'); exit;
+}
+
+require_once __DIR__ . '/partials/i18n.php';
+require_once __DIR__ . '/partials/site_status.php';
+require_once __DIR__ . '/partials/recent_static.php';
+require_once __DIR__ . '/partials/asset_version.php';
+
+$lang = _i18n_lang();
+$htmlLang = ['en' => 'en', 'ja' => 'ja', 'zh' => 'zh'][$lang];
+// EN canonical is "/" (root). JP/ZH live at /index_{jp,zh}.php.
+$selfPath = ['en' => '/', 'ja' => '/index_jp.php', 'zh' => '/index_zh.php'][$lang];
+$selfUrl = 'https://www.sillylaird.ca' . $selfPath;
+$h = fn(string $k) => htmlspecialchars(t($k), ENT_QUOTES, 'UTF-8');
+
+$personJson = [
+ '@context' => 'https://schema.org',
+ '@type' => 'Person',
+ 'name' => t('home.person.name'),
+ 'alternateName' => 'SillyLaird',
+ 'url' => $selfUrl,
+ 'image' => 'https://www.sillylaird.ca/assets/img/lain.png',
+ 'sameAs' => [
+ 'https://blog.sillylaird.ca/',
+ 'https://www.last.fm/user/SillyLaird',
+ 'https://github.com/SillyLaird',
+ 'https://radio.sillylaird.ca/',
+ 'gemini://sillylaird.ca',
+ 'gopher://sillylaird.ca',
+ ],
+ 'jobTitle' => t('home.person.jobtitle'),
+ 'description' => t('home.person.desc'),
+];
+$siteJson = [
+ '@context' => 'https://schema.org',
+ '@type' => 'WebSite',
+ 'name' => t('home.site.name'),
+ 'url' => $selfUrl,
+];
+
+?>
+<!doctype html>
+<html lang="<?= $htmlLang ?>">
+
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <title><?= $h('home.title') ?></title>
+ <meta name="keywords" content="sillylaird, laird lonergan, personal homepage, 90s web, dot ca" />
+<?php
+ // OG/Twitter/canonical/hreflang/favicon/feed boilerplate is shared.
+ // Homepage EN canonical is the root "/", so override the URL fields.
+ $meta = [
+ 'lang' => $lang,
+ 'title' => t('home.title'),
+ 'desc' => t('home.desc'),
+ 'base' => 'index',
+ 'self_url' => $selfUrl,
+ 'en_url' => 'https://www.sillylaird.ca/',
+ 'x_default' => 'https://www.sillylaird.ca/',
+ ];
+ include __DIR__ . '/partials/head_meta.php';
+?>
+
+ <script type="application/ld+json">
+<?= json_encode($personJson, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) ?>
+ </script>
+ <script type="application/ld+json">
+<?= json_encode($siteJson, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) ?>
+ </script>
+
+ <link rel="preload" href="/assets/img/lain.png" as="image" type="image/png" />
+ <link rel="preload" href="<?= htmlspecialchars(asset_v('assets/css/site.css'), ENT_QUOTES) ?>" as="style" />
+ <link rel="preconnect" href="https://blog.sillylaird.ca/" crossorigin />
+ <link rel="preconnect" href="https://guestbook.sillylaird.ca" crossorigin />
+ <link rel="preconnect" href="https://radio.sillylaird.ca" crossorigin />
+<?php if ($lang !== 'en'): ?>
+ <link rel="preconnect" href="https://uploads.sillylaird.ca" crossorigin />
+<?php endif; ?>
+ <link rel="stylesheet" href="<?= htmlspecialchars(asset_v('assets/css/fonts.css'), ENT_QUOTES) ?>" />
+ <link rel="stylesheet" href="<?= htmlspecialchars(asset_v('assets/css/site.css'), ENT_QUOTES) ?>" />
+ <link rel="stylesheet" href="<?= htmlspecialchars(asset_v('assets/css/skeleton.css'), ENT_QUOTES) ?>" />
+ <noscript>
+ <style>.js-loading,.js-only{display:none !important}</style>
+ </noscript>
+</head>
+
+<body>
+ <a class="skip-link" href="#main"><?= $h('common.skip') ?></a>
+ <?php include 'partials/header.php'; ?>
+
+ <main id="main" class="wrap home-wrap">
+ <div class="home-layout">
+ <aside class="home-sidebar" aria-label="<?= $h('home.sidebar_nav') ?>">
+ <nav class="home-side-nav">
+ <h2><?= $h('home.sidebar_index') ?></h2>
+ <a href="#home"><?= $h('home.sidebar_top') ?></a>
+ <a href="#contact"><?= $h('home.contact') ?></a>
+ <a href="#vibe"><?= $h('home.sidebar_vibe') ?></a>
+ <a href="#updates"><?= $h('home.updates') ?></a>
+ <a href="#guestbook-home"><?= $h('home.guestbook') ?></a>
+ <a href="#network"><?= $h('home.sidebar_network') ?></a>
+ <a href="/map/"><?= $h('home.sidebar_map') ?></a>
+ <a href="/startpage/"><?= $h('home.sidebar_startpage') ?></a>
+ <a href="/gaming/collection/"><?= $h('home.card_collection') ?></a>
+ </nav>
+ <nav class="home-protocol-nav" aria-label="<?= $h('home.sidebar_altnets_aria') ?>">
+ <h3><?= $h('home.sidebar_altnets') ?></h3>
+ <div class="protocol-pills protocol-pills--sidebar">
+ <a class="protocol-pill protocol-pill--gemini"
+ href="gemini://sillylaird.ca"
+ target="_blank"
+ rel="noopener noreferrer"
+ title="Open the Gemini capsule">Gemini</a>
+ <a class="protocol-pill protocol-pill--gopher"
+ href="gopher://sillylaird.ca"
+ target="_blank"
+ rel="noopener noreferrer"
+ title="Open the Gopher hole">Gopher</a>
+ <a class="protocol-pill protocol-pill--tor"
+ href="http://xyb4zkpbnssz2kgiklg5vfbepbnblykgfvemwadvufwzfcrjny46q6qd.onion/"
+ title="Open the Tor onion service">Tor</a>
+ <a class="protocol-pill protocol-pill--i2p"
+ href="http://sillylaird.i2p/"
+ title="Open the I2P site">I2P</a>
+ </div>
+ </nav>
+<?php
+ $vibeCfg = file_exists(__DIR__ . '/vibe.php') ? require __DIR__ . '/vibe.php' : [];
+ $vibeDesc = trim((string)($vibeCfg['description'] ?? ''));
+ $vibeUrl = trim((string)($vibeCfg['url'] ?? ''));
+ $vibeUpdated = trim((string)($vibeCfg['updated'] ?? ''));
+ if ($vibeDesc !== '' || $vibeUrl !== ''):
+?>
+ <div class="home-vibe-widget" aria-label="Current vibe">
+ <h3>Current vibe</h3>
+<?php if ($vibeDesc !== ''): ?>
+ <p><?= htmlspecialchars($vibeDesc, ENT_QUOTES, 'UTF-8') ?></p>
+<?php endif; ?>
+<?php if ($vibeUrl !== ''): ?>
+ <a href="<?= htmlspecialchars($vibeUrl, ENT_QUOTES, 'UTF-8') ?>" target="_blank" rel="noopener noreferrer">Open vibe →</a>
+<?php endif; ?>
+<?php if ($vibeUpdated !== ''): ?>
+ <time datetime="<?= htmlspecialchars($vibeUpdated, ENT_QUOTES, 'UTF-8') ?>">Updated <?= htmlspecialchars($vibeUpdated, ENT_QUOTES, 'UTF-8') ?></time>
+<?php endif; ?>
+ </div>
+<?php endif; ?>
+<?php
+ $changelogEntry = latest_changelog_entry();
+ if ($changelogEntry):
+ $changelogBlurb = trim((string)($changelogEntry['text'] ?? ''));
+ $changelogDate = trim((string)($changelogEntry['display_date'] ?? $changelogEntry['date'] ?? ''));
+ $changelogIso = trim((string)($changelogEntry['date'] ?? ''));
+?>
+ <div class="home-changelog-widget home-sidebar-widget" aria-label="Latest changelog">
+ <h3><?= $h('home.changelog') ?></h3>
+<?php if ($changelogBlurb !== ''): ?>
+ <p><?= htmlspecialchars($changelogBlurb, ENT_QUOTES, 'UTF-8') ?></p>
+<?php endif; ?>
+ <a href="/changelog/">Full changelog →</a>
+<?php if ($changelogDate !== ''): ?>
+ <time<?= $changelogIso !== '' ? ' datetime="' . htmlspecialchars($changelogIso, ENT_QUOTES) . '"' : '' ?>>Updated <?= htmlspecialchars($changelogDate, ENT_QUOTES, 'UTF-8') ?></time>
+<?php endif; ?>
+ </div>
+<?php endif; ?>
+ </aside>
+
+ <div class="home-content stack">
+ <section id="home" aria-labelledby="home-title">
+ <header class="home-hero">
+ <div class="home-hero-brand h-card">
+ <data class="p-name" value="Laird Lonergan (SillyLaird)"></data>
+ <data class="p-nickname" value="SillyLaird"></data>
+ <data class="u-url" value="https://www.sillylaird.ca/"></data>
+ <button type="button"
+ class="home-hero-avatar-wrap"
+ id="lain-avatar-btn"
+ aria-label="<?= $h('home.lain_alt') ?> — click for a surprise"
+ data-secret-1="<?= $h('home.lain_secret_1') ?>"
+ data-secret-2="<?= $h('home.lain_secret_2') ?>"
+ data-secret-3="<?= $h('home.lain_secret_3') ?>">
+ <img class="home-hero-avatar u-photo"
+ src="/assets/img/lain.png"
+ alt="<?= $h('home.lain_alt') ?>"
+ width="72"
+ height="72"
+ decoding="async" />
+ </button>
+ <div class="home-hero-text">
+ <h1 id="home-title"><?= $h('home.h1') ?></h1>
+ <p class="home-tagline" aria-label="<?= $h('home.tagline') ?>">
+ <span class="home-tagline-text"><?= $h('home.tagline') ?></span>
+ </p>
+ </div>
+ </div>
+ <?php render_site_update_status('site-status-row home-status-row'); ?>
+ <p class="muted home-welcome">
+ <?= $h('home.welcome') ?>
+ </p>
+ </header>
+
+ <div class="start-here" aria-label="<?= $h('home.where_start') ?>">
+ <h2 class="section-accent-title start-here-title"><?= $h('home.where_start') ?></h2>
+ <div class="start-card-grid">
+ <a class="start-card start-card--now" href="/now/">
+ <span class="start-card-icon" aria-hidden="true">⏱</span>
+ <strong><?= $h('home.card_now') ?></strong>
+ <span><?= $h('home.card_now_desc') ?></span>
+ </a>
+ <a class="start-card start-card--blog" href="https://blog.sillylaird.ca/" target="_blank" rel="noopener noreferrer">
+ <span class="start-card-icon" aria-hidden="true">📝</span>
+ <strong><?= $h('home.card_blog') ?></strong>
+ <span><?= $h('home.card_blog_desc') ?></span>
+ </a>
+ <a class="start-card start-card--journal" href="/journal/">
+ <span class="start-card-icon" aria-hidden="true">📓</span>
+ <strong><?= $h('home.card_journal') ?></strong>
+ <span><?= $h('home.card_journal_desc') ?></span>
+ </a>
+ <a class="start-card start-card--gaming" href="/gaming/">
+ <span class="start-card-icon" aria-hidden="true">🎮</span>
+ <strong><?= $h('home.card_gaming') ?></strong>
+ <span><?= $h('home.card_gaming_desc') ?></span>
+ </a>
+ <a class="start-card start-card--collection" href="/gaming/collection/">
+ <span class="start-card-icon" aria-hidden="true">📼</span>
+ <strong><?= $h('home.card_collection') ?></strong>
+ <span><?= $h('home.card_collection_desc') ?></span>
+ </a>
+ <a class="start-card start-card--projects" href="/map/">
+ <span class="start-card-icon" aria-hidden="true">🕸️</span>
+ <strong>My projects</strong>
+ <span>Micro Heyaoi, radio, mirrors, and every corner of the network.</span>
+ </a>
+ </div>
+ </div>
+
+ <div class="start-here" id="contact" aria-label="<?= $h('home.contact') ?>">
+ <h2 class="section-accent-title start-here-title" id="contact-title"><?= $h('home.contact') ?></h2>
+ <address class="contact-address">
+ <ul class="contact-list">
+ <li><strong>Email:</strong> <a href="mailto:m@sillylaird.ca">m@sillylaird.ca</a></li>
+ <li><strong>XMPP:</strong> <a href="xmpp:m@sillylaird.ca">m@sillylaird.ca</a></li>
+ </ul>
+
+ <details class="contact-darkweb">
+ <summary>Dark web / alternate addresses</summary>
+ <ul class="contact-list contact-list--compact">
+<?php if ($lang === 'en'): ?>
+ <li>Tor email: <a href="mailto:m@xyb4zkpbnssz2kgiklg5vfbepbnblykgfvemwadvufwzfcrjny46q6qd.onion">m@[onion]</a></li>
+ <li>I2P email: <a href="mailto:m@sillylaird.i2p">m@[i2p]</a></li>
+<?php else: ?>
+ <li>Tor email: <a href="mailto:m@xyb4zkpbnssz2kgiklg5vfbepbnblykgfvemwadvufwzfcrjny46q6qd.onion">m@Onion Domain</a></li>
+ <li>I2P email: <a href="mailto:m@sillylaird.i2p">m@I2P Domain</a></li>
+<?php endif; ?>
+ <li>XMPP alt: <a href="xmpp:sillylaird@xmpp.jp">sillylaird@xmpp.jp</a></li>
+ <li>XMPP alt: <a href="xmpp:sillylaird@paranoid.network">sillylaird@paranoid.network</a></li>
+ </ul>
+ </details>
+ </address>
+
+ <blockquote>
+ "The Internet Is Serious Business" —
+ <a href="http://lolwut.info/comp/4chan/serious-business.html" target="_blank" rel="noopener noreferrer">lolwut.info</a>
+ </blockquote>
+
+ <p><?= $h('home.pronunciation') ?></p>
+ <div class="audio-wrap">
+ <audio controls src="/Laird.mp3" preload="none" aria-label="Pronunciation of Laird"></audio>
+ </div>
+ </div>
+ </section>
+
+<?php
+ // Music nests inside the vibe card via the partial's $vibe_section_extra hook.
+ ob_start();
+?>
+ <div id="music" class="vibe-music" aria-labelledby="music-title">
+ <h3 id="music-title" class="network-subtitle"><?= $h('home.music') ?></h3>
+
+ <div class="media-widgets">
+ <div id="lastfm-now" class="lastfm-now-widget" aria-live="polite" aria-label="<?= $h('home.now_playing') ?>">
+ <div class="retro-loading js-loading"><?= $h('home.lastfm_loading') ?></div>
+ </div>
+
+ <div id="radio-widget" class="radio-now-widget" aria-live="polite">
+ <div class="retro-loading js-loading"><?= $h('home.radio_loading') ?>...</div>
+ </div>
+ </div>
+
+ <h4 class="media-subheading"><?= $h('home.recent_tracks') ?></h4>
+ <p class="muted media-profile-link">Last.fm: <a href="https://www.last.fm/user/SillyLaird" target="_blank" rel="noopener noreferrer">SillyLaird</a></p>
+ <div id="lastfm-list">
+ <div class="retro-loading js-loading"><?= $h('home.lastfm_loading') ?></div>
+ </div>
+ <noscript>
+ <p><a href="https://www.last.fm/user/SillyLaird">View recent tracks on Last.fm</a> · <a href="https://radio.sillylaird.ca/">Radio</a></p>
+ </noscript>
+ </div>
+<?php
+ $vibe_section_extra = ob_get_clean();
+ $vibe_section_title = t('home.vibe');
+ include 'partials/partials_vibe.php';
+ $vibe_section_extra = null;
+?>
+
+ <section id="updates" aria-labelledby="updates-title">
+ <h2 id="updates-title" class="section-accent-title"><?= $h('home.updates') ?></h2>
+ <div class="updates-groups">
+ <div class="updates-group updates-panel">
+ <h3 id="blog-title" class="network-subtitle"><?= $h('home.blog') ?></h3>
+ <p>
+ <a href="https://blog.sillylaird.ca/" target="_blank" rel="noopener noreferrer"><?= $h('home.blog_visit') ?></a>
+ &middot;
+ <a href="https://blog.sillylaird.ca/feed.xml.php" rel="alternate noopener" type="application/rss+xml" title="Subscribe via RSS">RSS</a>
+ </p>
+ <div id="blog-list" aria-live="polite"><?php render_recent_blog(2); ?></div>
+ <noscript>
+ <p><a href="https://blog.sillylaird.ca/">See all posts on the blog</a></p>
+ </noscript>
+ </div>
+
+ <div class="updates-group updates-panel updates-panel--changelog">
+ <h3 id="changelog-title" class="network-subtitle changelog-title"><?= $h('home.changelog') ?></h3>
+ <p>
+ <a href="https://www.sillylaird.ca/changelog/"><?= $h('home.changelog_visit') ?></a>
+ &middot;
+ <a href="https://www.sillylaird.ca/changelog/feed.xml.php" rel="alternate noopener" type="application/atom+xml" title="Subscribe via Atom">Atom</a>
+ </p>
+ <div id="changelog-list" aria-live="polite"><?php render_recent_changelog(2); ?></div>
+ <noscript>
+ <p><a href="https://www.sillylaird.ca/changelog/">See full changelog</a></p>
+ </noscript>
+ </div>
+ </div>
+ </section>
+
+ <section id="guestbook-home" aria-labelledby="guestbook-title">
+ <h2 id="guestbook-title" class="section-accent-title"><?= $h('home.guestbook') ?></h2>
+ <p><a href="/guestbook.php" target="_blank" rel="noopener noreferrer"><?= $h('home.guestbook_open') ?></a></p>
+ <div class="guestbook-panels stack">
+ <div class="guestbook-panel guestbook-panel--comments">
+ <div class="guestbook-panel-head">
+ <h3 class="guestbook-panel-title"><?= $h('home.guestbook_comments') ?></h3>
+ <button class="reset-button" id="guestbook-comments-reload" type="button" aria-label="<?= $h('home.guestbook_reload') ?>"><?= $h('home.guestbook_reload') ?></button>
+ </div>
+ <div id="guestbook-comments-inline" class="guestbook-comments-inline stack" aria-live="polite">
+ <div class="retro-loading js-loading"><?= $h('home.guestbook_loading') ?>...</div>
+ </div>
+ <noscript>
+ <p><a href="/guestbook.php">View the full guestbook</a></p>
+ </noscript>
+ </div>
+
+ <details class="guestbook-panel guestbook-panel--form">
+ <summary class="guestbook-panel-title"><?= $h('home.guestbook_form') ?></summary>
+ <div class="guestbook-panel-head">
+ <button class="reset-button" id="guestbook-form-refresh" type="button" aria-label="<?= $h('home.refresh_form') ?>"><?= $h('home.refresh_form') ?></button>
+ </div>
+ <div class="iframe-clip">
+ <iframe src="https://guestbook.sillylaird.ca/form.php" class="embed-frame guestbook-form-frame"
+ id="guestbook-form-iframe" title="Guestbook Comment Form" loading="lazy"
+ sandbox="allow-scripts allow-forms allow-same-origin allow-popups"
+ referrerpolicy="no-referrer"></iframe>
+ </div>
+ </details>
+ </div>
+ </section>
+
+ <?php
+ // Cache VPN SVG once per request.
+ static $_vpnLogoSvg = null;
+ if ($_vpnLogoSvg === null) {
+ $_vpnLogoSvg = @file_get_contents(__DIR__ . '/assets/img/nordvpn.svg') ?: '';
+ }
+ // Flag images instead of emoji: regional-indicator emoji render as
+ // plain letters (e.g. "CA") on Windows, so images are the only way
+ // to guarantee a flag on every OS/browser.
+ $countryLinks = [
+ 'en' => [
+ ['https://www.canada.ca/en.html', 'canada.png', 'Canada'],
+ ['https://english.www.gov.cn/', 'china.png', 'China'],
+ ['https://www.japan.go.jp/', 'japan.png', 'Japan'],
+ ],
+ 'ja' => [
+ ['https://www.canada.ca/en.html', 'canada.png', 'カナダ'],
+ ['https://english.www.gov.cn/', 'china.png', '中国'],
+ ['https://www.japan.go.jp/', 'japan.png', '日本'],
+ ],
+ 'zh' => [
+ ['https://www.canada.ca/en.html', 'canada.png', '加拿大'],
+ ['https://english.www.gov.cn/', 'china.png', '中国'],
+ ['https://www.japan.go.jp/', 'japan.png', '日本'],
+ ],
+ ];
+ $cLinks = $countryLinks[$lang] ?? $countryLinks['en'];
+ $sponsorAlt = [
+ 'en' => ['BuyVM — KVM VPS Hosting', 'Encyclopedia Dramatica', 'EFF free speech badge'],
+ 'ja' => ['BuyVM', 'EDramatica', 'EFF free speech badge'],
+ 'zh' => ['BuyVM', 'EDramatica', 'EFF free speech badge'],
+ ];
+ $sAlt = $sponsorAlt[$lang] ?? $sponsorAlt['en'];
+ ?>
+ <section id="network" aria-labelledby="network-title" class="network-section">
+ <h2 id="network-title" class="section-accent-title"><?= $h('home.network') ?></h2>
+
+ <details class="network-subsection network-collapsible" id="friends" open>
+ <summary class="network-subsection-summary">
+ <h3 id="friends-title" class="network-subtitle"><?= $h('home.friends') ?></h3>
+ </summary>
+ <div class="network-subsection-body">
+ <div class="friends-groups">
+ <div class="friends-group">
+ <h4 class="friends-group-title">Personal sites</h4>
+ <ul class="friends-list">
+ <li><a href="https://kfarwell.org/" target="_blank" rel="noopener noreferrer">Kyle Farwell</a></li>
+ <li><a href="http://lolwut.info/" target="_blank" rel="noopener noreferrer">lolwut</a></li>
+ <li><a href="http://shystudios.us/" target="_blank" rel="noopener noreferrer">Shy Studios</a></li>
+ <li><a href="https://risingthumb.xyz/" target="_blank" rel="noopener noreferrer">risingthumb</a></li>
+ <li><a href="https://moddedbear.com/" target="_blank" rel="noopener noreferrer">bear</a></li>
+ <li><a href="https://djlain.com/" target="_blank" rel="noopener noreferrer">djlain</a></li>
+ <li><a href="https://jameswilson.io" target="_blank" rel="noopener noreferrer">JdotW</a></li>
+ </ul>
+ </div>
+
+ <div class="friends-group">
+ <h4 class="friends-group-title">Kans3n</h4>
+ <ul class="friends-list">
+ <li><a href="https://kans3n.codeberg.page/" target="_blank" rel="noopener noreferrer">Codeberg</a></li>
+ </ul>
+ </div>
+
+ <div class="friends-group">
+ <h4 class="friends-group-title">Creators / streams</h4>
+ <ul class="friends-list">
+ <li><a href="https://www.webtoons.com/en/canvas/chronicles-of-the-pumpkin-prince/list?title_no=546563" target="_blank" rel="noopener noreferrer">MrsDinklepuss (WebToon)</a></li>
+ <li><a href="https://www.twitch.tv/chefnegative" target="_blank" rel="noopener noreferrer">ChefNegative (Twitch)</a></li>
+ </ul>
+ </div>
+
+ <div class="friends-group">
+ <h4 class="friends-group-title">Archived</h4>
+ <ul class="friends-list">
+ <li><a href="https://web.archive.org/web/20230325061748/https://urof.net/" target="_blank" rel="noopener noreferrer">urof (archive)</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </details>
+
+ <div class="network-subsection" id="games" aria-labelledby="games-title">
+ <h3 id="games-title" class="network-subtitle"><?= $h('home.games') ?></h3>
+ <ul class="tile-grid tile-grid--labeled">
+ <li class="tile--wide"><a class="tile-card tile-card--game" href="/gaming/runescape/"><img src="/assets/img/runescape.png" alt="RuneScape" loading="lazy" decoding="async" width="160" height="64"><span class="tile-label">RuneScape</span></a></li>
+ <li class="tile--wide"><a class="tile-card tile-card--game" href="/gaming/specialforce/"><img src="/assets/img/soldierfront.png" alt="SpecialForce" loading="lazy" decoding="async" width="160" height="64"><span class="tile-label">SpecialForce</span></a></li>
+ <li class="tile--wide"><a class="tile-card tile-card--game" href="/gaming/stepmania/"><img src="/assets/img/stepmania.png" alt="StepMania" loading="lazy" decoding="async" width="160" height="64"><span class="tile-label">StepMania</span></a></li>
+ <li class="tile--wide"><a class="tile-card tile-card--game" href="/gaming/multibox/"><img src="/assets/img/multibox.png" alt="Multibox" loading="lazy" decoding="async" width="160" height="64"><span class="tile-label">Multibox</span></a></li>
+ </ul>
+ </div>
+
+ <details class="network-subsection network-collapsible" id="countries">
+ <summary class="network-subsection-summary">
+ <h3 id="countries-title" class="network-subtitle"><?= $h('home.countries') ?></h3>
+ </summary>
+ <div class="network-subsection-body">
+ <ul class="tile-grid tile-grid--three country-links">
+<?php foreach ($cLinks as $country): ?>
+ <li class="tile--wide">
+ <a class="country-card" href="<?= htmlspecialchars($country[0], ENT_QUOTES) ?>" target="_blank" rel="noopener noreferrer">
+ <img class="country-emoji" src="<?= htmlspecialchars(asset_v('assets/img/' . $country[1]), ENT_QUOTES) ?>" alt="" aria-hidden="true" loading="lazy" decoding="async" height="36" />
+ <span><?= htmlspecialchars($country[2], ENT_QUOTES) ?></span>
+ </a>
+ </li>
+<?php endforeach; ?>
+ </ul>
+ </div>
+ </details>
+
+ <details class="network-subsection network-collapsible" id="buttons">
+ <summary class="network-subsection-summary">
+ <h3 id="buttons-title" class="network-subtitle">Buttons</h3>
+ </summary>
+ <div class="network-subsection-body">
+ <ul class="tile-grid tile-grid--three tile-grid--labeled">
+ <li class="tile--wide"><a class="tile-card tile-card--button" href="https://buyvm.net/" target="_blank" rel="noopener noreferrer"><img src="/assets/img/buyvm.png" alt="BuyVM" loading="lazy" decoding="async" width="320" height="128"><span class="tile-label">BuyVM</span></a></li>
+ <li class="tile--wide"><a class="tile-card tile-card--button" href="https://edramatica.com/Main_Page" target="_blank" rel="noopener noreferrer"><img src="/assets/img/edramatica.png" alt="EDramatica" loading="lazy" decoding="async" width="320" height="128"><span class="tile-label">EDramatica</span></a></li>
+ <li class="tile--wide"><a class="tile-card tile-card--button vendor-link" href="https://nordvpn.com/" target="_blank" rel="noopener noreferrer"><span class="vendor-logo" role="img" aria-label="NordVPN"><?= $_vpnLogoSvg ?></span><span class="tile-label">NordVPN</span></a></li>
+ <li class="tile--wide"><a class="tile-card tile-card--button eff-badge" href="https://www.eff.org/issues/free-speech" target="_blank" rel="noopener noreferrer"><img src="/assets/img/rib_bar_red.png" alt="EFF Free Speech Online" loading="lazy" decoding="async" width="160" height="64"><span class="tile-label">EFF</span></a></li>
+ </ul>
+ </div>
+ </details>
+ </section>
+ </div>
+ </div>
+ </main>
+
+ <?php include 'partials/footer.php'; ?>
+</body>
+
+</html>