diff options
Diffstat (limited to 'index.php')
| -rw-r--r-- | index.php | 506 |
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> + · + <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> + · + <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> |
