I don't remember what I did, my brain hurts... time to goon to Furina
This commit is contained in:
parent
ee66b2fce9
commit
f6d5d8ae08
|
|
@ -10,7 +10,8 @@
|
||||||
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
||||||
|
|
||||||
<!-- SEO Meta Tags -->
|
<!-- SEO Meta Tags -->
|
||||||
<meta name="description" content="A collection of the 88x31 pixel buttons featured across Clove Twilight's site — grab one and link back.">
|
<meta name="description"
|
||||||
|
content="A collection of the 88x31 pixel buttons featured across Clove Twilight's site — grab one and link back.">
|
||||||
<meta name="keywords" content="Clove Twilight, c.stupid.cat, 88x31, buttons, web buttons, personal">
|
<meta name="keywords" content="Clove Twilight, c.stupid.cat, 88x31, buttons, web buttons, personal">
|
||||||
<meta name="author" content="doughmination">
|
<meta name="author" content="doughmination">
|
||||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||||
|
|
@ -28,7 +29,8 @@
|
||||||
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta property="og:site_name" content="c.stupid.cat">
|
<meta property="og:site_name" content="c.stupid.cat">
|
||||||
<meta property="og:title" content="Clove Twilight">
|
<meta property="og:title" content="Clove Twilight">
|
||||||
<meta property="og:description" content="A collection of the 88x31 pixel buttons featured across Clove Twilight's site — grab one and link back.">
|
<meta property="og:description"
|
||||||
|
content="A collection of the 88x31 pixel buttons featured across Clove Twilight's site — grab one and link back.">
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:url" content="https://c.stupid.cat/88x31">
|
<meta property="og:url" content="https://c.stupid.cat/88x31">
|
||||||
<meta property="og:locale" content="en_GB">
|
<meta property="og:locale" content="en_GB">
|
||||||
|
|
@ -37,7 +39,8 @@
|
||||||
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:title" content="Clove Twilight">
|
<meta name="twitter:title" content="Clove Twilight">
|
||||||
<meta name="twitter:description" content="A collection of the 88x31 pixel buttons featured across Clove Twilight's site — grab one and link back.">
|
<meta name="twitter:description"
|
||||||
|
content="A collection of the 88x31 pixel buttons featured across Clove Twilight's site — grab one and link back.">
|
||||||
|
|
||||||
<!-- Prefetch other pages for faster navigation -->
|
<!-- Prefetch other pages for faster navigation -->
|
||||||
<link rel="prefetch" href="/">
|
<link rel="prefetch" href="/">
|
||||||
|
|
@ -73,48 +76,69 @@
|
||||||
<div class="button-page">
|
<div class="button-page">
|
||||||
<main class="button-wall" aria-label="88x31 buttons">
|
<main class="button-wall" aria-label="88x31 buttons">
|
||||||
<!-- coding / web -->
|
<!-- coding / web -->
|
||||||
<a href="https://doughmination.co.uk" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/doughmination.png" alt="Doughmination" loading="eager"></a>
|
<a href="https://doughmination.co.uk" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://git.gay/doughmination" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/gitgay.png" alt="Git Gay" loading="lazy"></a>
|
src="/assets/88x31/doughmination.png" alt="Doughmination" loading="eager"></a>
|
||||||
<a href="https://code.visualstudio.com" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/vscbutton.png" alt="Made with Visual Studio Code" loading="lazy"></a>
|
<a href="https://git.gay/doughmination" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/gitgay.png" alt="Git Gay" loading="lazy"></a>
|
||||||
|
<a href="https://code.visualstudio.com" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/vscbutton.png" alt="Made with Visual Studio Code" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/htmldream.png" alt="I dream in HTML" loading="lazy">
|
<img src="/assets/88x31/htmldream.png" alt="I dream in HTML" loading="lazy">
|
||||||
<a href="https://validator.w3.org/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/valid-html5.png" alt="Valid HTML5" loading="lazy"></a>
|
<a href="https://validator.w3.org/" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://jigsaw.w3.org/css-validator/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/valid-css.png" alt="Valid CSS" loading="lazy"></a>
|
src="/assets/88x31/valid-html5.png" alt="Valid HTML5" loading="lazy"></a>
|
||||||
<a href="https://yesterweb.org/no-to-web3/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/noweb32.png" alt="Keep the web free" loading="lazy"></a>
|
<a href="https://jigsaw.w3.org/css-validator/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/valid-css.png" alt="Valid CSS" loading="lazy"></a>
|
||||||
|
<a href="https://yesterweb.org/no-to-web3/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/noweb32.png" alt="Keep the web free" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/nft.png" alt="No NFTs, no thanks" loading="lazy">
|
<img src="/assets/88x31/nft.png" alt="No NFTs, no thanks" loading="lazy">
|
||||||
<img src="/assets/88x31/nowebp.png" alt="No WEBp" loading="lazy">
|
<img src="/assets/88x31/nowebp.png" alt="No WEBp" loading="lazy">
|
||||||
<!-- software / os -->
|
<!-- software / os -->
|
||||||
<a href="https://www.linux.org/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/linux.png" alt="Made on GNU/Linux" loading="lazy"></a>
|
<a href="https://www.linux.org/" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://www.mozilla.org/firefox/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/firefox.png" alt="Firefox" loading="lazy"></a>
|
src="/assets/88x31/linux.png" alt="Made on GNU/Linux" loading="lazy"></a>
|
||||||
|
<a href="https://www.mozilla.org/firefox/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/firefox.png" alt="Firefox" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/no-chrome.png" alt="Anything but Chrome" loading="lazy">
|
<img src="/assets/88x31/no-chrome.png" alt="Anything but Chrome" loading="lazy">
|
||||||
<a href="https://support.apple.com/en-gb/121552" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/macbutton.png" alt="Made on a Mac" loading="lazy"></a>
|
<a href="https://support.apple.com/en-gb/121552" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://www.win-rar.com/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/winrar4.png" alt="WinRAR" loading="lazy"></a>
|
src="/assets/88x31/macbutton.png" alt="Made on a Mac" loading="lazy"></a>
|
||||||
<a href="https://microslop.com/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/microslop.png" alt="Stop Microsoft" loading="lazy"></a>
|
<a href="https://www.win-rar.com/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/winrar4.png" alt="WinRAR" loading="lazy"></a>
|
||||||
|
<a href="https://microslop.com/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/microslop.png" alt="Stop Microsoft" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/dark-mode.png" alt="Made for dark mode" loading="lazy">
|
<img src="/assets/88x31/dark-mode.png" alt="Made for dark mode" loading="lazy">
|
||||||
<!-- pride / identity -->
|
<!-- pride / identity -->
|
||||||
<a href="https://valerie.vg/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/estrogen.png" alt="Powered by estrogen" loading="lazy"></a>
|
<a href="https://valerie.vg/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/estrogen.png" alt="Powered by estrogen" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/transnow.png" alt="Trans rights now" loading="lazy">
|
<img src="/assets/88x31/transnow.png" alt="Trans rights now" loading="lazy">
|
||||||
<img src="/assets/88x31/queerpride.png" alt="Queer pride" loading="lazy">
|
<img src="/assets/88x31/queerpride.png" alt="Queer pride" loading="lazy">
|
||||||
<img src="/assets/88x31/girlsnow.png" alt="Girls Now" loading="lazy">
|
<img src="/assets/88x31/girlsnow.png" alt="Girls Now" loading="lazy">
|
||||||
<img src="/assets/88x31/skirt.png" alt="Let boys wear skirts" loading="lazy">
|
<img src="/assets/88x31/skirt.png" alt="Let boys wear skirts" loading="lazy">
|
||||||
<img src="/assets/88x31/cutesocks.png" alt="I wear cute socks!" loading="lazy">
|
<img src="/assets/88x31/cutesocks.png" alt="I wear cute socks!" loading="lazy">
|
||||||
<!-- causes -->
|
<!-- causes -->
|
||||||
<a href="https://archive.org/details/zines-anti-fascism" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/antifa.png" alt="No fascism, no bigotry" loading="lazy"></a>
|
<a href="https://archive.org/details/zines-anti-fascism" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://www.youtube.com/watch?v=7AQbhes-Ntw" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/meltice.png" alt="Melt ICE" loading="lazy"></a>
|
src="/assets/88x31/antifa.png" alt="No fascism, no bigotry" loading="lazy"></a>
|
||||||
<a href="https://www.map.org.uk/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/palestine.png" alt="Free Palestine" loading="lazy"></a>
|
<a href="https://www.youtube.com/watch?v=7AQbhes-Ntw" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://u24.gov.ua/" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/ukraine.png" alt="Slava Ukraini" loading="lazy"></a>
|
src="/assets/88x31/meltice.png" alt="Melt ICE" loading="lazy"></a>
|
||||||
|
<a href="https://www.map.org.uk/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/palestine.png" alt="Free Palestine" loading="lazy"></a>
|
||||||
|
<a href="https://u24.gov.ua/" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/ukraine.png" alt="Slava Ukraini" loading="lazy"></a>
|
||||||
<!-- misc -->
|
<!-- misc -->
|
||||||
<a href="/discord"><img src="/assets/88x31/discord.png" alt="Discord" loading="lazy"></a>
|
<a href="/discord"><img src="/assets/88x31/discord.png" alt="Discord" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/bestvieweddesktop.png" alt="Best viewed on desktop" loading="lazy">
|
<img src="/assets/88x31/bestvieweddesktop.png" alt="Best viewed on desktop" loading="lazy">
|
||||||
<img src="/assets/88x31/killmenow.png" alt="Kill me now" loading="lazy">
|
<img src="/assets/88x31/killmenow.png" alt="Kill me now" loading="lazy">
|
||||||
<a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/no.png" alt="Don't click here, no!" loading="lazy"></a>
|
<a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ" target="_blank" rel="noopener noreferrer"><img
|
||||||
<a href="https://www.minecraft.net" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/minecraft.png" alt="Minecraft" loading="lazy"></a>
|
src="/assets/88x31/no.png" alt="Don't click here, no!" loading="lazy"></a>
|
||||||
|
<a href="https://www.minecraft.net" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/minecraft.png" alt="Minecraft" loading="lazy"></a>
|
||||||
<!-- anime -->
|
<!-- anime -->
|
||||||
<img src="/assets/88x31/pokemon.png" alt="Pokémon" loading="lazy">
|
<img src="/assets/88x31/pokemon.png" alt="Pokémon" loading="lazy">
|
||||||
<a href="https://www.youtube.com/watch?v=VEj0cuqVJ-I" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/caramelldansen.png" alt="Caramelldansen" loading="lazy"></a>
|
<a href="https://www.youtube.com/watch?v=VEj0cuqVJ-I" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/caramelldansen.png" alt="Caramelldansen" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/blink.png" alt="Anime blink" loading="lazy">
|
<img src="/assets/88x31/blink.png" alt="Anime blink" loading="lazy">
|
||||||
<a href="https://www.youtube.com/watch?v=_-2dIuV34cs" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/miku.png" alt="This site is Miku approved" loading="lazy"></a>
|
<a href="https://www.youtube.com/watch?v=_-2dIuV34cs" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/miku.png" alt="This site is Miku approved" loading="lazy"></a>
|
||||||
<img src="/assets/88x31/tummy.png" alt="Anime tummy supporter" loading="lazy">
|
<img src="/assets/88x31/tummy.png" alt="Anime tummy supporter" loading="lazy">
|
||||||
<a href="https://www.youtube.com/watch?v=9lNZ_Rnr7Jc" target="_blank" rel="noopener noreferrer"><img src="/assets/88x31/badapple.png" alt="Bad Apple!!" loading="lazy"></a>
|
<a href="https://www.youtube.com/watch?v=9lNZ_Rnr7Jc" target="_blank" rel="noopener noreferrer"><img
|
||||||
|
src="/assets/88x31/badapple.png" alt="Bad Apple!!" loading="lazy"></a>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,8 @@
|
||||||
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
||||||
|
|
||||||
<!-- SEO Meta Tags -->
|
<!-- SEO Meta Tags -->
|
||||||
<meta name="description" content="Cool people Clove Twilight knows — friends, mutuals, and creators worth checking out, with links to their sites.">
|
<meta name="description"
|
||||||
|
content="Cool people Clove Twilight knows — friends, mutuals, and creators worth checking out, with links to their sites.">
|
||||||
<meta name="keywords" content="Clove Twilight, c.stupid.cat, friends, cool people, mutuals, links">
|
<meta name="keywords" content="Clove Twilight, c.stupid.cat, friends, cool people, mutuals, links">
|
||||||
<meta name="author" content="doughmination">
|
<meta name="author" content="doughmination">
|
||||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||||
|
|
@ -41,7 +42,8 @@
|
||||||
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta property="og:site_name" content="c.stupid.cat">
|
<meta property="og:site_name" content="c.stupid.cat">
|
||||||
<meta property="og:title" content="Clove Twilight">
|
<meta property="og:title" content="Clove Twilight">
|
||||||
<meta property="og:description" content="Cool people Clove Twilight knows — friends, mutuals, and creators worth checking out, with links to their sites.">
|
<meta property="og:description"
|
||||||
|
content="Cool people Clove Twilight knows — friends, mutuals, and creators worth checking out, with links to their sites.">
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:url" content="https://c.stupid.cat/cool-people">
|
<meta property="og:url" content="https://c.stupid.cat/cool-people">
|
||||||
<meta property="og:locale" content="en_GB">
|
<meta property="og:locale" content="en_GB">
|
||||||
|
|
@ -50,19 +52,8 @@
|
||||||
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:title" content="Clove Twilight">
|
<meta name="twitter:title" content="Clove Twilight">
|
||||||
<meta name="twitter:description" content="Cool people Clove Twilight knows — friends, mutuals, and creators worth checking out, with links to their sites.">
|
<meta name="twitter:description"
|
||||||
|
content="Cool people Clove Twilight knows — friends, mutuals, and creators worth checking out, with links to their sites.">
|
||||||
<style>
|
|
||||||
.friends-disclaimer {
|
|
||||||
margin: 2.5rem auto 0;
|
|
||||||
max-width: 60ch;
|
|
||||||
text-align: center;
|
|
||||||
font-size: .8rem;
|
|
||||||
line-height: 1.5;
|
|
||||||
opacity: .6;
|
|
||||||
}
|
|
||||||
.friends-disclaimer a { color: inherit; text-decoration: underline; }
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- Prefetch other pages for faster navigation -->
|
<!-- Prefetch other pages for faster navigation -->
|
||||||
<link rel="prefetch" href="/">
|
<link rel="prefetch" href="/">
|
||||||
|
|
@ -89,26 +80,23 @@
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="hub friends-wrap">
|
<main class="hub friends-wrap">
|
||||||
<header class="hub-header">
|
<header class="hub-header">
|
||||||
<h1>Cool People</h1>
|
<h1>Cool People</h1>
|
||||||
<p class="tagline">This is where people I know can be put up on my site, click their profiles for their
|
<p class="tagline">This is where people I know can be put up on my site, click their profiles for their
|
||||||
pages</p>
|
pages</p>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<!-- Cards are rendered by friends.js from the FRIENDS config -->
|
<div id="friends-discord"></div>
|
||||||
<div id="friends-root"></div>
|
|
||||||
|
|
||||||
<p class="friends-disclaimer">
|
<p class="friends-disclaimer">
|
||||||
Presence data is served by
|
Presence data is served by
|
||||||
<a href="https://restful.doughmination.uk" target="_blank" rel="noopener">Doughmination Restful</a>.
|
<a href="https://restful.doughmination.uk" target="_blank" rel="noopener">Doughmination Restful</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</main>
|
||||||
|
|
||||||
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
||||||
<!-- discord.js exposes window.PresenceCard, used by friends.js for the cards -->
|
|
||||||
<script src="/js/discord.js"></script>
|
<script src="/js/discord.js"></script>
|
||||||
<script src="/js/friends.js"></script>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -41,36 +41,43 @@
|
||||||
src: url('/assets/fonts/8Bit.woff2') format('woff2');
|
src: url('/assets/fonts/8Bit.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN Jellybean';
|
font-family: 'DDN Jellybean';
|
||||||
src: url('/assets/fonts/Jellybean.woff2') format('woff2');
|
src: url('/assets/fonts/Jellybean.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN Medieval';
|
font-family: 'DDN Medieval';
|
||||||
src: url('/assets/fonts/Medieval.woff2') format('woff2');
|
src: url('/assets/fonts/Medieval.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN Modern';
|
font-family: 'DDN Modern';
|
||||||
src: url('/assets/fonts/Modern.woff2') format('woff2');
|
src: url('/assets/fonts/Modern.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN Sakura';
|
font-family: 'DDN Sakura';
|
||||||
src: url('/assets/fonts/Sakura.woff2') format('woff2');
|
src: url('/assets/fonts/Sakura.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN Tempo';
|
font-family: 'DDN Tempo';
|
||||||
src: url('/assets/fonts/Tempo.woff2') format('woff2');
|
src: url('/assets/fonts/Tempo.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN Vampyre';
|
font-family: 'DDN Vampyre';
|
||||||
src: url('/assets/fonts/Vampyre.woff2') format('woff2');
|
src: url('/assets/fonts/Vampyre.woff2') format('woff2');
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DDN gg sans';
|
font-family: 'DDN gg sans';
|
||||||
src: url('/assets/fonts/gg%20sans.woff2') format('woff2');
|
src: url('/assets/fonts/gg%20sans.woff2') format('woff2');
|
||||||
|
|
|
||||||
955
css/main.css
955
css/main.css
File diff suppressed because it is too large
Load Diff
|
|
@ -7,7 +7,8 @@ html[data-flavor="frappe"] {
|
||||||
--rosewater: #f2d5cf;
|
--rosewater: #f2d5cf;
|
||||||
--flamingo: #eebebe;
|
--flamingo: #eebebe;
|
||||||
--pink: #f4b8e4;
|
--pink: #f4b8e4;
|
||||||
--accent-rgb: 244, 184, 228; /* live accent default = theme pink */
|
--accent-rgb: 244, 184, 228;
|
||||||
|
/* live accent default = theme pink */
|
||||||
--mauve: #ca9ee6;
|
--mauve: #ca9ee6;
|
||||||
--red: #e78284;
|
--red: #e78284;
|
||||||
--maroon: #ea999c;
|
--maroon: #ea999c;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@ html[data-flavor="latte"] {
|
||||||
--rosewater: #dc8a78;
|
--rosewater: #dc8a78;
|
||||||
--flamingo: #dd7878;
|
--flamingo: #dd7878;
|
||||||
--pink: #ea76cb;
|
--pink: #ea76cb;
|
||||||
--accent-rgb: 234, 118, 203; /* live accent default = theme pink */
|
--accent-rgb: 234, 118, 203;
|
||||||
|
/* live accent default = theme pink */
|
||||||
--mauve: #8839ef;
|
--mauve: #8839ef;
|
||||||
--red: #d20f39;
|
--red: #d20f39;
|
||||||
--maroon: #e64553;
|
--maroon: #e64553;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@ html[data-flavor="macchiato"] {
|
||||||
--rosewater: #f4dbd6;
|
--rosewater: #f4dbd6;
|
||||||
--flamingo: #f0c6c6;
|
--flamingo: #f0c6c6;
|
||||||
--pink: #f5bde6;
|
--pink: #f5bde6;
|
||||||
--accent-rgb: 245, 189, 230; /* live accent default = theme pink */
|
--accent-rgb: 245, 189, 230;
|
||||||
|
/* live accent default = theme pink */
|
||||||
--mauve: #c6a0f6;
|
--mauve: #c6a0f6;
|
||||||
--red: #ed8796;
|
--red: #ed8796;
|
||||||
--maroon: #ee99a0;
|
--maroon: #ee99a0;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@ html[data-flavor="mocha"] {
|
||||||
--rosewater: #f5e0dc;
|
--rosewater: #f5e0dc;
|
||||||
--flamingo: #f2cdcd;
|
--flamingo: #f2cdcd;
|
||||||
--pink: #f5c2e7;
|
--pink: #f5c2e7;
|
||||||
--accent-rgb: 245, 194, 231; /* live accent default = theme pink */
|
--accent-rgb: 245, 194, 231;
|
||||||
|
/* live accent default = theme pink */
|
||||||
--mauve: #cba6f7;
|
--mauve: #cba6f7;
|
||||||
--red: #f38ba8;
|
--red: #f38ba8;
|
||||||
--maroon: #eba0ac;
|
--maroon: #eba0ac;
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,10 @@
|
||||||
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
||||||
|
|
||||||
<!-- SEO Meta Tags -->
|
<!-- SEO Meta Tags -->
|
||||||
<meta name="description" content="What Clove Twilight has been coding lately — a live contribution heatmap and WakaTime coding stats.">
|
<meta name="description"
|
||||||
<meta name="keywords" content="Clove Twilight, c.stupid.cat, dev info, coding stats, WakaTime, contributions, developer">
|
content="What Clove Twilight has been coding lately — a live contribution heatmap and WakaTime coding stats.">
|
||||||
|
<meta name="keywords"
|
||||||
|
content="Clove Twilight, c.stupid.cat, dev info, coding stats, WakaTime, contributions, developer">
|
||||||
<meta name="author" content="doughmination">
|
<meta name="author" content="doughmination">
|
||||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||||
|
|
||||||
|
|
@ -35,7 +37,8 @@
|
||||||
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta property="og:site_name" content="c.stupid.cat">
|
<meta property="og:site_name" content="c.stupid.cat">
|
||||||
<meta property="og:title" content="Clove Twilight">
|
<meta property="og:title" content="Clove Twilight">
|
||||||
<meta property="og:description" content="What Clove Twilight has been coding lately — a live contribution heatmap and WakaTime coding stats.">
|
<meta property="og:description"
|
||||||
|
content="What Clove Twilight has been coding lately — a live contribution heatmap and WakaTime coding stats.">
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:url" content="https://c.stupid.cat/dev-info">
|
<meta property="og:url" content="https://c.stupid.cat/dev-info">
|
||||||
<meta property="og:locale" content="en_GB">
|
<meta property="og:locale" content="en_GB">
|
||||||
|
|
@ -44,7 +47,8 @@
|
||||||
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:title" content="Clove Twilight">
|
<meta name="twitter:title" content="Clove Twilight">
|
||||||
<meta name="twitter:description" content="What Clove Twilight has been coding lately — a live contribution heatmap and WakaTime coding stats.">
|
<meta name="twitter:description"
|
||||||
|
content="What Clove Twilight has been coding lately — a live contribution heatmap and WakaTime coding stats.">
|
||||||
|
|
||||||
<!-- Prefetch other pages for faster navigation -->
|
<!-- Prefetch other pages for faster navigation -->
|
||||||
<link rel="prefetch" href="/">
|
<link rel="prefetch" href="/">
|
||||||
|
|
@ -85,71 +89,116 @@
|
||||||
<summary class="section-title">Tech Stack</summary>
|
<summary class="section-title">Tech Stack</summary>
|
||||||
<div class="dev-info" role="region" aria-label="Tech stack">
|
<div class="dev-info" role="region" aria-label="Tech stack">
|
||||||
<!-- Languages -->
|
<!-- Languages -->
|
||||||
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/python')" role="img" aria-label="Python"></span>
|
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/python')" role="img"
|
||||||
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/openjdk')" role="img" aria-label="Java"></span>
|
aria-label="Python"></span>
|
||||||
<span class="tech-icon pink" style="--si:url('https://cdn.simpleicons.org/javascript')" role="img" aria-label="JavaScript"></span>
|
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/openjdk')" role="img"
|
||||||
<span class="tech-icon peach" style="--si:url('https://cdn.simpleicons.org/typescript')" role="img" aria-label="TypeScript"></span>
|
aria-label="Java"></span>
|
||||||
<span class="tech-icon yellow" style="--si:url('https://cdn.simpleicons.org/gnubash')" role="img" aria-label="Bash Script"></span>
|
<span class="tech-icon pink" style="--si:url('https://cdn.simpleicons.org/javascript')" role="img"
|
||||||
|
aria-label="JavaScript"></span>
|
||||||
|
<span class="tech-icon peach" style="--si:url('https://cdn.simpleicons.org/typescript')" role="img"
|
||||||
|
aria-label="TypeScript"></span>
|
||||||
|
<span class="tech-icon yellow" style="--si:url('https://cdn.simpleicons.org/gnubash')" role="img"
|
||||||
|
aria-label="Bash Script"></span>
|
||||||
|
|
||||||
<!-- Markup, Styling & Docs -->
|
<!-- Markup, Styling & Docs -->
|
||||||
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/html5')" role="img" aria-label="HTML5"></span>
|
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/html5')" role="img"
|
||||||
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/css')" role="img" aria-label="CSS"></span>
|
aria-label="HTML5"></span>
|
||||||
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/markdown')" role="img" aria-label="Markdown"></span>
|
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/css')" role="img"
|
||||||
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/latex')" role="img" aria-label="LaTeX"></span>
|
aria-label="CSS"></span>
|
||||||
|
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/markdown')" role="img"
|
||||||
|
aria-label="Markdown"></span>
|
||||||
|
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/latex')" role="img"
|
||||||
|
aria-label="LaTeX"></span>
|
||||||
|
|
||||||
<!-- Frontend — Frameworks & Libraries -->
|
<!-- Frontend — Frameworks & Libraries -->
|
||||||
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/react')" role="img" aria-label="React"></span>
|
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/react')" role="img"
|
||||||
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/vuedotjs')" role="img" aria-label="Vue.js"></span>
|
aria-label="React"></span>
|
||||||
<span class="tech-icon rosewater" style="--si:url('https://cdn.simpleicons.org/nextdotjs')" role="img" aria-label="Next JS"></span>
|
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/vuedotjs')" role="img"
|
||||||
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/ejs')" role="img" aria-label="EJS"></span>
|
aria-label="Vue.js"></span>
|
||||||
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/electron')" role="img" aria-label="Electron.js"></span>
|
<span class="tech-icon rosewater" style="--si:url('https://cdn.simpleicons.org/nextdotjs')" role="img"
|
||||||
|
aria-label="Next JS"></span>
|
||||||
|
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/ejs')" role="img"
|
||||||
|
aria-label="EJS"></span>
|
||||||
|
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/electron')" role="img"
|
||||||
|
aria-label="Electron.js"></span>
|
||||||
|
|
||||||
<!-- Frontend — Styling -->
|
<!-- Frontend — Styling -->
|
||||||
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/tailwindcss')" role="img" aria-label="TailwindCSS"></span>
|
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/tailwindcss')" role="img"
|
||||||
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/bootstrap')" role="img" aria-label="Bootstrap"></span>
|
aria-label="TailwindCSS"></span>
|
||||||
|
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/bootstrap')" role="img"
|
||||||
|
aria-label="Bootstrap"></span>
|
||||||
|
|
||||||
<!-- Backend -->
|
<!-- Backend -->
|
||||||
<span class="tech-icon pink" style="--si:url('https://cdn.simpleicons.org/nodedotjs')" role="img" aria-label="NodeJS"></span>
|
<span class="tech-icon pink" style="--si:url('https://cdn.simpleicons.org/nodedotjs')" role="img"
|
||||||
<span class="tech-icon green" style="--si:url('https://cdn.simpleicons.org/express')" role="img" aria-label="Express.js"></span>
|
aria-label="NodeJS"></span>
|
||||||
<span class="tech-icon peach" style="--si:url('https://cdn.simpleicons.org/fastapi')" role="img" aria-label="FastAPI"></span>
|
<span class="tech-icon green" style="--si:url('https://cdn.simpleicons.org/express')" role="img"
|
||||||
<span class="tech-icon maroon" style="--si:url('https://cdn.simpleicons.org/jsonwebtokens')" role="img" aria-label="JWT"></span>
|
aria-label="Express.js"></span>
|
||||||
<span class="tech-icon rosewater" style="--si:url('https://cdn.simpleicons.org/wordpress')" role="img" aria-label="WordPress"></span>
|
<span class="tech-icon peach" style="--si:url('https://cdn.simpleicons.org/fastapi')" role="img"
|
||||||
|
aria-label="FastAPI"></span>
|
||||||
|
<span class="tech-icon maroon" style="--si:url('https://cdn.simpleicons.org/jsonwebtokens')" role="img"
|
||||||
|
aria-label="JWT"></span>
|
||||||
|
<span class="tech-icon rosewater" style="--si:url('https://cdn.simpleicons.org/wordpress')" role="img"
|
||||||
|
aria-label="WordPress"></span>
|
||||||
|
|
||||||
<!-- Databases -->
|
<!-- Databases -->
|
||||||
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/postgresql')" role="img" aria-label="Postgres"></span>
|
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/postgresql')" role="img"
|
||||||
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/mysql')" role="img" aria-label="MySQL"></span>
|
aria-label="Postgres"></span>
|
||||||
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/sqlite')" role="img" aria-label="SQLite"></span>
|
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/mysql')" role="img"
|
||||||
<span class="tech-icon green" style="--si:url('https://cdn.simpleicons.org/redis')" role="img" aria-label="Redis"></span>
|
aria-label="MySQL"></span>
|
||||||
|
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/sqlite')" role="img"
|
||||||
|
aria-label="SQLite"></span>
|
||||||
|
<span class="tech-icon green" style="--si:url('https://cdn.simpleicons.org/redis')" role="img"
|
||||||
|
aria-label="Redis"></span>
|
||||||
|
|
||||||
<!-- Package Managers & Build Tools -->
|
<!-- Package Managers & Build Tools -->
|
||||||
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/npm')" role="img" aria-label="NPM"></span>
|
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/npm')" role="img"
|
||||||
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/pnpm')" role="img" aria-label="PNPM"></span>
|
aria-label="NPM"></span>
|
||||||
<span class="tech-icon maroon" style="--si:url('https://cdn.simpleicons.org/vite')" role="img" aria-label="Vite"></span>
|
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/pnpm')" role="img"
|
||||||
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/nodemon')" role="img" aria-label="Nodemon"></span>
|
aria-label="PNPM"></span>
|
||||||
<span class="tech-icon green" style="--si:url('https://cdn.simpleicons.org/gradle')" role="img" aria-label="Gradle"></span>
|
<span class="tech-icon maroon" style="--si:url('https://cdn.simpleicons.org/vite')" role="img"
|
||||||
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/eslint')" role="img" aria-label="ESLint"></span>
|
aria-label="Vite"></span>
|
||||||
|
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/nodemon')" role="img"
|
||||||
|
aria-label="Nodemon"></span>
|
||||||
|
<span class="tech-icon green" style="--si:url('https://cdn.simpleicons.org/gradle')" role="img"
|
||||||
|
aria-label="Gradle"></span>
|
||||||
|
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/eslint')" role="img"
|
||||||
|
aria-label="ESLint"></span>
|
||||||
|
|
||||||
<!-- Version Control & CI/CD -->
|
<!-- Version Control & CI/CD -->
|
||||||
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/git')" role="img" aria-label="Git"></span>
|
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/git')" role="img"
|
||||||
<span class="tech-icon sky" style="--si:url('https://cdn.simpleicons.org/github')" role="img" aria-label="GitHub"></span>
|
aria-label="Git"></span>
|
||||||
<span class="tech-icon maroon" style="--si:url('https://cdn.simpleicons.org/githubactions')" role="img" aria-label="GitHub Actions"></span>
|
<span class="tech-icon sky" style="--si:url('https://cdn.simpleicons.org/github')" role="img"
|
||||||
<span class="tech-icon rosewater" style="--si:url('https://cdn.simpleicons.org/gitea')" role="img" aria-label="Gitea"></span>
|
aria-label="GitHub"></span>
|
||||||
|
<span class="tech-icon maroon" style="--si:url('https://cdn.simpleicons.org/githubactions')" role="img"
|
||||||
|
aria-label="GitHub Actions"></span>
|
||||||
|
<span class="tech-icon rosewater" style="--si:url('https://cdn.simpleicons.org/gitea')" role="img"
|
||||||
|
aria-label="Gitea"></span>
|
||||||
|
|
||||||
<!-- Infrastructure & Deployment -->
|
<!-- Infrastructure & Deployment -->
|
||||||
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/docker')" role="img" aria-label="Docker"></span>
|
<span class="tech-icon lavender" style="--si:url('https://cdn.simpleicons.org/docker')" role="img"
|
||||||
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/nginx')" role="img" aria-label="Nginx"></span>
|
aria-label="Docker"></span>
|
||||||
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/cloudflare')" role="img" aria-label="Cloudflare"></span>
|
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/nginx')" role="img"
|
||||||
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/vercel')" role="img" aria-label="Vercel"></span>
|
aria-label="Nginx"></span>
|
||||||
|
<span class="tech-icon sapphire" style="--si:url('https://cdn.simpleicons.org/cloudflare')" role="img"
|
||||||
|
aria-label="Cloudflare"></span>
|
||||||
|
<span class="tech-icon mauve" style="--si:url('https://cdn.simpleicons.org/vercel')" role="img"
|
||||||
|
aria-label="Vercel"></span>
|
||||||
|
|
||||||
<!-- Dev Tools & Utilities -->
|
<!-- Dev Tools & Utilities -->
|
||||||
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/vscodium')" role="img" aria-label="VSCodium"></span>
|
<span class="tech-icon blue" style="--si:url('https://cdn.simpleicons.org/vscodium')" role="img"
|
||||||
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/insomnia')" role="img" aria-label="Insomnia"></span>
|
aria-label="VSCodium"></span>
|
||||||
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/ffmpeg')" role="img" aria-label="FFmpeg"></span>
|
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/insomnia')" role="img"
|
||||||
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/inkscape')" role="img" aria-label="Inkscape"></span>
|
aria-label="Insomnia"></span>
|
||||||
|
<span class="tech-icon teal" style="--si:url('https://cdn.simpleicons.org/ffmpeg')" role="img"
|
||||||
|
aria-label="FFmpeg"></span>
|
||||||
|
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/inkscape')" role="img"
|
||||||
|
aria-label="Inkscape"></span>
|
||||||
|
|
||||||
<!-- Hardware / IoT -->
|
<!-- Hardware / IoT -->
|
||||||
<span class="tech-icon pink" style="--si:url('https://cdn.simpleicons.org/arduino')" role="img" aria-label="Arduino"></span>
|
<span class="tech-icon pink" style="--si:url('https://cdn.simpleicons.org/arduino')" role="img"
|
||||||
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/raspberrypi')" role="img" aria-label="Raspberry Pi"></span>
|
aria-label="Arduino"></span>
|
||||||
|
<span class="tech-icon red" style="--si:url('https://cdn.simpleicons.org/raspberrypi')" role="img"
|
||||||
|
aria-label="Raspberry Pi"></span>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
@ -159,43 +208,64 @@
|
||||||
<dl class="hw-list">
|
<dl class="hw-list">
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>CPU</dt>
|
<dt>CPU</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/Pk62FT/amd-ryzen-9-9950x3d-43-ghz-16-core-processor-100-100000719wof">AMD Ryzen 9 9950x3d 4.3 GHz 16-Core Processor</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/Pk62FT/amd-ryzen-9-9950x3d-43-ghz-16-core-processor-100-100000719wof">AMD
|
||||||
|
Ryzen 9 9950x3d 4.3 GHz 16-Core Processor</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>GPU</dt>
|
<dt>GPU</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/GtXJ7P/xfx-speedster-merc-310-black-edition-radeon-rx-7900-xtx-24-gb-video-card-rx-79xmercb9">XFX Speedster MERC 310 Black Edition Radeon RX 7900 XTX 24 GB Video Card</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/GtXJ7P/xfx-speedster-merc-310-black-edition-radeon-rx-7900-xtx-24-gb-video-card-rx-79xmercb9">XFX
|
||||||
|
Speedster MERC 310 Black Edition Radeon RX 7900 XTX 24 GB Video Card</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>RAM</dt>
|
<dt>RAM</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/LWVmP6/corsair-vengeance-64-gb-2-x-32-gb-ddr5-6000-cl40-memory-cmk64gx5m2b6000z40">Corsair Vengeance 64 GB (2 x 32 GB) DDR5-6000 CL40 Memory</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/LWVmP6/corsair-vengeance-64-gb-2-x-32-gb-ddr5-6000-cl40-memory-cmk64gx5m2b6000z40">Corsair
|
||||||
|
Vengeance 64 GB (2 x 32 GB) DDR5-6000 CL40 Memory</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Storage</dt>
|
<dt>Storage</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/YPKscf/acer-predator-gm7-1-tb-m2-2280-pcie-40-x4-nvme-solid-state-drive-bl9bwwr118">2x 1TB NVMe</a> + <a class="hw-item" href="https://uk.pcpartpicker.com/product/fmfhP6/seagate-exos-x14-12-tb-35-7200-rpm-internal-hard-drive-st12000nm0008">10TB HDD</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/YPKscf/acer-predator-gm7-1-tb-m2-2280-pcie-40-x4-nvme-solid-state-drive-bl9bwwr118">2x
|
||||||
|
1TB NVMe</a> + <a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/fmfhP6/seagate-exos-x14-12-tb-35-7200-rpm-internal-hard-drive-st12000nm0008">10TB
|
||||||
|
HDD</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Motherboard</dt>
|
<dt>Motherboard</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/Q8KnTW/gigabyte-b850m-aorus-elite-wifi6e-ice-micro-atx-am5-motherboard-b850m-aorus-elite-wifi6e-ice">Gigabyte B850M AORUS ELITE WIFI6E ICE Micro ATX AM5 Motherboard</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/Q8KnTW/gigabyte-b850m-aorus-elite-wifi6e-ice-micro-atx-am5-motherboard-b850m-aorus-elite-wifi6e-ice">Gigabyte
|
||||||
|
B850M AORUS ELITE WIFI6E ICE Micro ATX AM5 Motherboard</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Cooling</dt>
|
<dt>Cooling</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/YXFmP6/thermalright-aqua-elite-v3-6617-cfm-liquid-cpu-cooler-aqua-elite-360-white-v3">Thermalright Aqua Elite V3 66.17 CFM Liquid CPU Cooler</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/YXFmP6/thermalright-aqua-elite-v3-6617-cfm-liquid-cpu-cooler-aqua-elite-360-white-v3">Thermalright
|
||||||
|
Aqua Elite V3 66.17 CFM Liquid CPU Cooler</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Keyboard</dt>
|
<dt>Keyboard</dt>
|
||||||
<dd><a class="hw-item" href="https://en.akkogear.com/product/sakura-miku-5108b-plus-mechanical-keyboard/">Akko Sakura Miku 5108B Plus</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://en.akkogear.com/product/sakura-miku-5108b-plus-mechanical-keyboard/">Akko
|
||||||
|
Sakura Miku 5108B Plus</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Mouse</dt>
|
<dt>Mouse</dt>
|
||||||
<dd><a class="hw-item" href="https://www.logitechg.com/en-gb/shop/p/g502-x-plus-wireless-lightforce.910-006163">Logitech G502 X Gaming Lightspeed Wireless</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://www.logitechg.com/en-gb/shop/p/g502-x-plus-wireless-lightforce.910-006163">Logitech
|
||||||
|
G502 X Gaming Lightspeed Wireless</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Monitor(s)</dt>
|
<dt>Monitor(s)</dt>
|
||||||
<dd><a class="hw-item" href="https://uk.pcpartpicker.com/product/XpVfrH/gigabyte-g34wqcp-340-3440-x-1440-180-hz-curved-monitor-g34wqcp">Gigabyte G34WQCP 34.0" 3440 x 1440 180 Hz Curved Monitor</a></dd>
|
<dd><a class="hw-item"
|
||||||
|
href="https://uk.pcpartpicker.com/product/XpVfrH/gigabyte-g34wqcp-340-3440-x-1440-180-hz-curved-monitor-g34wqcp">Gigabyte
|
||||||
|
G34WQCP 34.0" 3440 x 1440 180 Hz Curved Monitor</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Headphones</dt>
|
<dt>Headphones</dt>
|
||||||
<dd><a class="hw-item" href="https://m.yowu.com/product/detail?sku=3588">Yowu Cat Ear Headphones Hatsune Miku NX</a></dd>
|
<dd><a class="hw-item" href="https://m.yowu.com/product/detail?sku=3588">Yowu Cat Ear Headphones
|
||||||
|
Hatsune Miku NX</a></dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Microphone</dt>
|
<dt>Microphone</dt>
|
||||||
|
|
@ -203,7 +273,8 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>OS</dt>
|
<dt>OS</dt>
|
||||||
<dd><a class="hw-item" href="https://archlinux.org/download/">Arch Linux</a> | <a class="hw-item" href="https://www.microsoft.com/en-us/software-download/windows11">Windows 11</a></dd>
|
<dd><a class="hw-item" href="https://archlinux.org/download/">Arch Linux</a> | <a class="hw-item"
|
||||||
|
href="https://www.microsoft.com/en-us/software-download/windows11">Windows 11</a></dd>
|
||||||
</div>
|
</div>
|
||||||
</dl>
|
</dl>
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -236,7 +307,8 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Arch btw</dt>
|
<dt>Arch btw</dt>
|
||||||
<dd>Daily driver is Arch Linux: rolling release, built up from the ground exactly how I like it.</dd>
|
<dd>Daily driver is Arch Linux: rolling release, built up from the ground exactly how I like it.
|
||||||
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="hw-row">
|
<div class="hw-row">
|
||||||
<dt>Debian Pro</dt>
|
<dt>Debian Pro</dt>
|
||||||
|
|
|
||||||
|
|
@ -76,14 +76,14 @@
|
||||||
<main class="presence-stage">
|
<main class="presence-stage">
|
||||||
<div class="presence-intro">
|
<div class="presence-intro">
|
||||||
<h1>Discord</h1>
|
<h1>Discord</h1>
|
||||||
<p>What fae is up to, live via Lanyard.</p>
|
<p>What fae is up to, live via Doughmination Restful.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="discord"></div>
|
<div id="my-discord"></div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
||||||
<script src="/js/discord.js" data-user="1464890289922641993"></script>
|
<script src="/js/discord.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -118,8 +118,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
||||||
<script src="/js/guestbook.js"
|
<script src="/js/guestbook.js" data-api="https://guestbook.doughmination.uk"
|
||||||
data-api="https://guestbook.doughmination.uk"
|
|
||||||
data-turnstile-key="0x4AAAAAAB08ZhSxKn5rAD3d"></script>
|
data-turnstile-key="0x4AAAAAAB08ZhSxKn5rAD3d"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|
|
||||||
186
js/discord.js
186
js/discord.js
|
|
@ -1,3 +1,14 @@
|
||||||
|
// main.js — merged Discord presence module (formerly discord.js + friends.js).
|
||||||
|
//
|
||||||
|
// Part 1: the PresenceCard factory (window.PresenceCard) + the owner's own
|
||||||
|
// card, auto-mounted on #my-discord with a hardcoded DUID.
|
||||||
|
// Part 2: the friends/alts grid, auto-mounted on #friends-discord, built
|
||||||
|
// from the FRIENDS list using the same factory.
|
||||||
|
//
|
||||||
|
// HTML usage:
|
||||||
|
// <div id="my-discord"></div> -> single full presence card (owner)
|
||||||
|
// <div id="friends-discord"></div> -> friend/alt grid of mini cards
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
@ -123,6 +134,12 @@
|
||||||
card.dataset.status = "offline";
|
card.dataset.status = "offline";
|
||||||
card.hidden = false;
|
card.hidden = false;
|
||||||
}
|
}
|
||||||
|
// Optional @username sub-row for ID-less placeholder cards (e.g. dead alts
|
||||||
|
// whose display name differs from their actual username). render() will
|
||||||
|
// overwrite this with the live username if/when real API data comes in.
|
||||||
|
if (opts.fallbackUser) {
|
||||||
|
userEl.textContent = "@" + opts.fallbackUser;
|
||||||
|
}
|
||||||
|
|
||||||
// ---- wishlist (revealed by the star) ------------------------------------
|
// ---- wishlist (revealed by the star) ------------------------------------
|
||||||
// Items come straight from the Doughmination Restful API (j.data.wishlist):
|
// Items come straight from the Doughmination Restful API (j.data.wishlist):
|
||||||
|
|
@ -351,11 +368,11 @@
|
||||||
const CONNECTION_URLS = {
|
const CONNECTION_URLS = {
|
||||||
tiktok: function (n) { return "https://tiktok.com/@" + n; },
|
tiktok: function (n) { return "https://tiktok.com/@" + n; },
|
||||||
ebay: function (n) { return "https://www.ebay.com/usr/" + n; },
|
ebay: function (n) { return "https://www.ebay.com/usr/" + n; },
|
||||||
instagram: function (n) {return "https://www.instagram.com/" + n; },
|
instagram: function (n) { return "https://www.instagram.com/" + n; },
|
||||||
xbox: function (n) {return "https://www.xbox.com/en-GB/play/user/" + n; },
|
xbox: function (n) { return "https://www.xbox.com/en-GB/play/user/" + n; },
|
||||||
github: function (n) { return "https://github.com/" + n; },
|
github: function (n) { return "https://github.com/" + n; },
|
||||||
roblox: function (n, id) { return "https://www.roblox.com/users/" + id + "/profile";},
|
roblox: function (n, id) { return "https://www.roblox.com/users/" + id + "/profile"; },
|
||||||
epicgames: function (n, id) {return "https://store.epicgames.com/u/" + id; },
|
epicgames: function (n, id) { return "https://store.epicgames.com/u/" + id; },
|
||||||
twitter: function (n) { return "https://twitter.com/" + n; },
|
twitter: function (n) { return "https://twitter.com/" + n; },
|
||||||
twitch: function (n) { return "https://twitch.tv/" + n; },
|
twitch: function (n) { return "https://twitch.tv/" + n; },
|
||||||
youtube: function (n, id) { return "https://youtube.com/channel/" + id; },
|
youtube: function (n, id) { return "https://youtube.com/channel/" + id; },
|
||||||
|
|
@ -829,7 +846,162 @@
|
||||||
// Expose the factory so other pages (e.g. /cool-people) can build cards.
|
// Expose the factory so other pages (e.g. /cool-people) can build cards.
|
||||||
window.PresenceCard = createPresenceCard;
|
window.PresenceCard = createPresenceCard;
|
||||||
|
|
||||||
// Auto-mount the standalone card whenever its #discord placeholder exists,
|
// ---- the owner's own DUID, hardcoded so #my-discord never needs a query
|
||||||
// preserving the original /discord page behaviour exactly.
|
// string / data attribute to know who to show. ----------------------------
|
||||||
if (document.getElementById("discord")) createPresenceCard({});
|
var MY_DISCORD_USER_ID = "1464890289922641993";
|
||||||
|
|
||||||
|
// Auto-mount the standalone card whenever its placeholder exists.
|
||||||
|
// #my-discord is the current mount point (see homepage / discord page).
|
||||||
|
// #discord is kept for backwards compatibility with older markup.
|
||||||
|
var myMount = document.getElementById("my-discord");
|
||||||
|
if (myMount) {
|
||||||
|
createPresenceCard({ mount: myMount, userId: MY_DISCORD_USER_ID });
|
||||||
|
} else if (document.getElementById("discord")) {
|
||||||
|
createPresenceCard({});
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
(function friends() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Each friend is rendered as a full — but smaller — presence card, built by
|
||||||
|
// the shared factory above (window.PresenceCard). Cards pull live
|
||||||
|
// presence (status, activity, badges, banner, bio, connections, wishlist…)
|
||||||
|
// from the same Doughmination Restful API the main card uses.
|
||||||
|
// NOTE: now lives in the same file as the factory (formerly discord.js),
|
||||||
|
// so load order is no longer a concern — this IIFE just runs second.
|
||||||
|
|
||||||
|
var FRIENDS = [
|
||||||
|
{
|
||||||
|
title: "Fiancée",
|
||||||
|
members: [
|
||||||
|
{ name: "Aria", tier: "wife", discordId: "1305215902685597797", link: null }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Close Friends",
|
||||||
|
members: [
|
||||||
|
{ name: "Ari", tier: "close", discordId: "1474568910736199825", link: "https://a.stupid.cat" },
|
||||||
|
// { name: "Lilly", tier: "close", discordId: "908055723659898902", link: null }, // Currently commented out as she's blocked me and idk if I should keep her displayed </3
|
||||||
|
{ name: "Ria", tier: "close", discordId: "1513506390088618145", link: null },
|
||||||
|
{ name: "Camilla", tier: "close", discordId: "1110542429838397471", link: "https://cammy-the-cat.com" },
|
||||||
|
{ name: "Saphie", tier: "close", discordId: "527709099186716673", link: null }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Friends",
|
||||||
|
members: [
|
||||||
|
{ name: "Fin", tier: "friend", discordId: "867818211574808607", link: null },
|
||||||
|
{ name: "Meme", tier: "friend", discordId: "812998699667161098", link: null },
|
||||||
|
{ name: "N", tier: "friend", discordId: "639399972407869450", link: null },
|
||||||
|
{ name: "Lylla", tier: "friend", discordId: "1009889543878611016", link: null },
|
||||||
|
{ name: "Simon", tier: "friend", discordId: "758466783354814514", link: null }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Other Peeps",
|
||||||
|
subtitle: "You can request to be added here!",
|
||||||
|
members: [
|
||||||
|
{ name: "furi", tier: "known", discordId: "781445370177126401", link: "https://furina.is-a.dev" },
|
||||||
|
{ name: "pokemon", tier: "known", discordId: "784443338627612673", link: "https://devmatei.com/" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Alts",
|
||||||
|
subtitle: "My other accounts, dead or alive",
|
||||||
|
members: [
|
||||||
|
{ name: "J", user: "real_serial_designationj", img: "/assets/alts/j.png", tier: "active-alt", discordId: "1500197577336033301", link: null },
|
||||||
|
{ name: "Uzi", user: "theuzidoorman", img: "/assets/alts/uzi.png", tier: "active-alt", discordId: "526626867973849123", link: null },
|
||||||
|
{ name: "Clove Twilight", user: "clovetwilight3", img: "/assets/alts/clovetwilight3.png", tier: "dead-alt", discordId: null, link: null },
|
||||||
|
{ name: "estrogenhrt", user: "estrogenhrt", img: "/assets/alts/estrogenhrt.png", tier: "dead-alt", discordId: "1025770042245251122", link: null },
|
||||||
|
{ name: "Clove <3", img: "/assets/alts/clove.png", tier: "dead-alt", discordId: "1125844710511104030", link: null },
|
||||||
|
{ name: "Clove ⛤", user: "greenirisluna", img: "/assets/alts/butterfly.png", tier: "dead-alt", discordId: "514994021970739201", link: null },
|
||||||
|
{ name: "Mrow", user: "arisgayasswife", img: "/assets/alts/mrow.png", tier: "dead-alt", discordId: "219480349053288450", link: null }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var FRIEND_POLL_MS = 60000; // re-poll each live friend once a minute
|
||||||
|
|
||||||
|
var root = document.getElementById("friends-discord");
|
||||||
|
if (!root) return;
|
||||||
|
|
||||||
|
// title → URL-safe anchor id, e.g. "Close Friends" -> "close-friends"
|
||||||
|
function slugify(str) {
|
||||||
|
return String(str == null ? "" : str)
|
||||||
|
.toLowerCase()
|
||||||
|
.trim()
|
||||||
|
.replace(/[^a-z0-9]+/g, "-")
|
||||||
|
.replace(/^-+|-+$/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
var make = window.PresenceCard;
|
||||||
|
if (typeof make !== "function") {
|
||||||
|
console.error("friends.js: window.PresenceCard is missing — load /js/discord.js before /js/friends.js");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- render ---------------------------------------------------------
|
||||||
|
FRIENDS.forEach(function (group) {
|
||||||
|
var section = document.createElement("section");
|
||||||
|
section.className = "section";
|
||||||
|
section.id = slugify(group.title); // anchor target, e.g. #alts
|
||||||
|
// gg sans (Discord's font) as the default for the whole friends widget —
|
||||||
|
// group headers, subtitles and the cards inside — over the page's Comic Code.
|
||||||
|
section.style.fontFamily = "'DDN gg sans', sans-serif";
|
||||||
|
|
||||||
|
var h2 = document.createElement("h2");
|
||||||
|
h2.className = "section-title";
|
||||||
|
h2.textContent = group.title;
|
||||||
|
section.appendChild(h2);
|
||||||
|
|
||||||
|
if (group.subtitle) {
|
||||||
|
var sub = document.createElement("p");
|
||||||
|
sub.className = "section-subtitle";
|
||||||
|
sub.textContent = group.subtitle;
|
||||||
|
section.appendChild(sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
var grid = document.createElement("div");
|
||||||
|
grid.className = "friend-grid";
|
||||||
|
|
||||||
|
group.members.forEach(function (m) {
|
||||||
|
// placeholder slot — the factory replaces it with the finished card
|
||||||
|
var slot = document.createElement("div");
|
||||||
|
grid.appendChild(slot);
|
||||||
|
|
||||||
|
// Always show the friendly name; for ID-less (dead alt) entries that
|
||||||
|
// also have a stored `user`, show that as the @username sub-row too.
|
||||||
|
if (typeof make === "function") {
|
||||||
|
make({
|
||||||
|
mount: slot,
|
||||||
|
userId: m.discordId || null, // null → static placeholder card (dead alts)
|
||||||
|
mini: true, // smaller styling + keeps page accent local
|
||||||
|
pollMs: FRIEND_POLL_MS,
|
||||||
|
tier: m.tier || null,
|
||||||
|
link: m.link || null,
|
||||||
|
fallbackName: m.name, // shown instantly + kept if the API has no data
|
||||||
|
fallbackUser: (!m.discordId && m.user) ? m.user : null,
|
||||||
|
fallbackImg: m.img || null
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// hard fallback: at least show the name if the factory didn't load
|
||||||
|
slot.className = "presence-card is-mini" + (m.tier ? " tier-" + m.tier : "");
|
||||||
|
slot.dataset.status = "offline";
|
||||||
|
slot.textContent = m.name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
section.appendChild(grid);
|
||||||
|
root.appendChild(section);
|
||||||
|
});
|
||||||
|
|
||||||
|
// ---- jump to anchor (sections are built after page load) ------------
|
||||||
|
function scrollToHash() {
|
||||||
|
var id = (location.hash || "").slice(1);
|
||||||
|
if (!id) return;
|
||||||
|
var target = document.getElementById(id);
|
||||||
|
if (target) target.scrollIntoView();
|
||||||
|
}
|
||||||
|
scrollToHash();
|
||||||
|
window.addEventListener("hashchange", scrollToHash);
|
||||||
})();
|
})();
|
||||||
140
js/friends.js
140
js/friends.js
|
|
@ -1,140 +0,0 @@
|
||||||
(function friends() {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
// Each friend is rendered as a full — but smaller — presence card, built by
|
|
||||||
// the shared factory in discord.js (window.PresenceCard). Cards pull live
|
|
||||||
// presence (status, activity, badges, banner, bio, connections, wishlist…)
|
|
||||||
// from the same Doughmination Restful API the /discord card uses.
|
|
||||||
// NOTE: discord.js must be loaded BEFORE this file (see cool-people/index.html).
|
|
||||||
|
|
||||||
var FRIENDS = [
|
|
||||||
{
|
|
||||||
title: "Fiancée",
|
|
||||||
members: [
|
|
||||||
{ name: "Aria", tier: "wife", discordId: "1305215902685597797", link: null }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Close Friends",
|
|
||||||
members: [
|
|
||||||
// { name: "Lilly", tier: "close", discordId: "908055723659898902", link: null },
|
|
||||||
{ name: "Ria", tier: "close", discordId: "1513506390088618145", link: null },
|
|
||||||
{ name: "Camilla", tier: "close", discordId: "1110542429838397471", link: "https://cammy-the-cat.com" },
|
|
||||||
{ name: "Saphie", tier: "close", discordId: "527709099186716673", link: null },
|
|
||||||
{ name: "Ari", tier: "close", discordId: "1474568910736199825", link: "https://a.stupid.cat" }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Friends",
|
|
||||||
members: [
|
|
||||||
{ name: "Fin", tier: "friend", discordId: "867818211574808607", link: null },
|
|
||||||
{ name: "Meme", tier: "friend", discordId: "812998699667161098", link: null },
|
|
||||||
{ name: "N", tier: "friend", discordId: "639399972407869450", link: null },
|
|
||||||
{ name: "Lylla", tier: "friend", discordId: "1009889543878611016", link: null },
|
|
||||||
{ name: "Simon", tier: "friend", discordId: "758466783354814514", link: null }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Other Peeps",
|
|
||||||
subtitle: "You can request to be added here!",
|
|
||||||
members: [
|
|
||||||
{ name: "furi", tier: "known", discordId: "781445370177126401", link: "https://furina.is-a.dev"},
|
|
||||||
{ name: "pokemon", tier: "known", discordId: "784443338627612673", link: "https://devmatei.com/" }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Alts",
|
|
||||||
subtitle: "My other accounts, dead or alive",
|
|
||||||
members: [
|
|
||||||
{ name: "J", img: "/assets/alts/j.png", tier: "active-alt", discordId: "1500197577336033301", link: null},
|
|
||||||
{ name: "Uzi", img: "/assets/alts/uzi.png", tier: "active-alt", discordId: "526626867973849123", link: null },
|
|
||||||
{ name: "clovetwilight3", img: "/assets/alts/clovetwilight3.png", tier: "dead-alt", discordId: null, link: null },
|
|
||||||
{ name: "estrogenhrt", img: "/assets/alts/estrogenhrt.png", tier: "dead-alt", discordId: null, link: null },
|
|
||||||
{ name: "Clove <3", img: "/assets/alts/clove.png", tier: "dead-alt", discordId: "1125844710511104030", link: null},
|
|
||||||
{ name: "Clove ⛤", img: "/assets/alts/butterfly.png", tier: "dead-alt", discordId: "514994021970739201", link: null },
|
|
||||||
{ name: "Mrow", img: "/assets/alts/mrow.png", tier: "dead-alt", discordId: "219480349053288450", link: null }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
var FRIEND_POLL_MS = 60000; // re-poll each live friend once a minute
|
|
||||||
|
|
||||||
var root = document.getElementById("friends-root");
|
|
||||||
if (!root) return;
|
|
||||||
|
|
||||||
// title → URL-safe anchor id, e.g. "Close Friends" -> "close-friends"
|
|
||||||
function slugify(str) {
|
|
||||||
return String(str == null ? "" : str)
|
|
||||||
.toLowerCase()
|
|
||||||
.trim()
|
|
||||||
.replace(/[^a-z0-9]+/g, "-")
|
|
||||||
.replace(/^-+|-+$/g, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
var make = window.PresenceCard;
|
|
||||||
if (typeof make !== "function") {
|
|
||||||
console.error("friends.js: window.PresenceCard is missing — load /js/discord.js before /js/friends.js");
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---- render ---------------------------------------------------------
|
|
||||||
FRIENDS.forEach(function (group) {
|
|
||||||
var section = document.createElement("section");
|
|
||||||
section.className = "section";
|
|
||||||
section.id = slugify(group.title); // anchor target, e.g. #alts
|
|
||||||
// gg sans (Discord's font) as the default for the whole friends widget —
|
|
||||||
// group headers, subtitles and the cards inside — over the page's Comic Code.
|
|
||||||
section.style.fontFamily = "'DDN gg sans', sans-serif";
|
|
||||||
|
|
||||||
var h2 = document.createElement("h2");
|
|
||||||
h2.className = "section-title";
|
|
||||||
h2.textContent = group.title;
|
|
||||||
section.appendChild(h2);
|
|
||||||
|
|
||||||
if (group.subtitle) {
|
|
||||||
var sub = document.createElement("p");
|
|
||||||
sub.className = "section-subtitle";
|
|
||||||
sub.textContent = group.subtitle;
|
|
||||||
section.appendChild(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
var grid = document.createElement("div");
|
|
||||||
grid.className = "friend-grid";
|
|
||||||
|
|
||||||
group.members.forEach(function (m) {
|
|
||||||
// placeholder slot — the factory replaces it with the finished card
|
|
||||||
var slot = document.createElement("div");
|
|
||||||
grid.appendChild(slot);
|
|
||||||
|
|
||||||
if (typeof make === "function") {
|
|
||||||
make({
|
|
||||||
mount: slot,
|
|
||||||
userId: m.discordId || null, // null → static placeholder card (dead alts)
|
|
||||||
mini: true, // smaller styling + keeps page accent local
|
|
||||||
pollMs: FRIEND_POLL_MS,
|
|
||||||
tier: m.tier || null,
|
|
||||||
link: m.link || null,
|
|
||||||
fallbackName: m.name, // shown instantly + kept if the API has no data
|
|
||||||
fallbackImg: m.img || null
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// hard fallback: at least show the name if the factory didn't load
|
|
||||||
slot.className = "presence-card is-mini" + (m.tier ? " tier-" + m.tier : "");
|
|
||||||
slot.dataset.status = "offline";
|
|
||||||
slot.textContent = m.name;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
section.appendChild(grid);
|
|
||||||
root.appendChild(section);
|
|
||||||
});
|
|
||||||
|
|
||||||
// ---- jump to anchor (sections are built after page load) ------------
|
|
||||||
function scrollToHash() {
|
|
||||||
var id = (location.hash || "").slice(1);
|
|
||||||
if (!id) return;
|
|
||||||
var target = document.getElementById(id);
|
|
||||||
if (target) target.scrollIntoView();
|
|
||||||
}
|
|
||||||
scrollToHash();
|
|
||||||
window.addEventListener("hashchange", scrollToHash);
|
|
||||||
})();
|
|
||||||
|
|
@ -152,7 +152,7 @@
|
||||||
if (global.turnstile && typeof global.turnstile.getResponse === "function") {
|
if (global.turnstile && typeof global.turnstile.getResponse === "function") {
|
||||||
return global.turnstile.getResponse() || "";
|
return global.turnstile.getResponse() || "";
|
||||||
}
|
}
|
||||||
} catch (_) {}
|
} catch (_) { }
|
||||||
// Fallback: the widget injects a hidden input named cf-turnstile-response
|
// Fallback: the widget injects a hidden input named cf-turnstile-response
|
||||||
var input = document.querySelector('[name="cf-turnstile-response"]');
|
var input = document.querySelector('[name="cf-turnstile-response"]');
|
||||||
return input ? input.value : "";
|
return input ? input.value : "";
|
||||||
|
|
@ -221,7 +221,7 @@
|
||||||
if (counterEl) counterEl.textContent = "0 / 500";
|
if (counterEl) counterEl.textContent = "0 / 500";
|
||||||
try {
|
try {
|
||||||
if (global.turnstile && global.turnstile.reset) global.turnstile.reset();
|
if (global.turnstile && global.turnstile.reset) global.turnstile.reset();
|
||||||
} catch (_) {}
|
} catch (_) { }
|
||||||
await loadEntries();
|
await loadEntries();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("[guestbook] submit failed", err);
|
console.error("[guestbook] submit failed", err);
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@
|
||||||
return THEMES[theme] || THEMES.rainbow;
|
return THEMES[theme] || THEMES.rainbow;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MONTHS = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
|
const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||||
|
|
||||||
// track in-flight fetch per container so re-renders cancel cleanly
|
// track in-flight fetch per container so re-renders cancel cleanly
|
||||||
const controllers = new WeakMap();
|
const controllers = new WeakMap();
|
||||||
|
|
@ -160,7 +160,7 @@
|
||||||
if (palette[i]) root.style.setProperty("--contrib-" + i, palette[i]);
|
if (palette[i]) root.style.setProperty("--contrib-" + i, palette[i]);
|
||||||
}
|
}
|
||||||
if (opts.colors) {
|
if (opts.colors) {
|
||||||
for (const k of [0,1,2,3,4]) {
|
for (const k of [0, 1, 2, 3, 4]) {
|
||||||
if (opts.colors[k]) root.style.setProperty("--contrib-" + k, opts.colors[k]);
|
if (opts.colors[k]) root.style.setProperty("--contrib-" + k, opts.colors[k]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@
|
||||||
"vc:" + namespace + ":" + key,
|
"vc:" + namespace + ":" + key,
|
||||||
JSON.stringify({ count, session: token })
|
JSON.stringify({ count, session: token })
|
||||||
);
|
);
|
||||||
} catch (_) {}
|
} catch (_) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchCount(namespace, key) {
|
async function fetchCount(namespace, key) {
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,8 @@
|
||||||
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
||||||
|
|
||||||
<!-- SEO Meta Tags -->
|
<!-- SEO Meta Tags -->
|
||||||
<meta name="description" content="What Clove Twilight is listening to — live now-playing track, synced lyrics, and recent plays from Last.fm.">
|
<meta name="description"
|
||||||
|
content="What Clove Twilight is listening to — live now-playing track, synced lyrics, and recent plays from Last.fm.">
|
||||||
<meta name="keywords" content="Clove Twilight, c.stupid.cat, music, now playing, Last.fm, lyrics, scrobbles">
|
<meta name="keywords" content="Clove Twilight, c.stupid.cat, music, now playing, Last.fm, lyrics, scrobbles">
|
||||||
<meta name="author" content="doughmination">
|
<meta name="author" content="doughmination">
|
||||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||||
|
|
@ -39,7 +40,8 @@
|
||||||
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta property="og:site_name" content="c.stupid.cat">
|
<meta property="og:site_name" content="c.stupid.cat">
|
||||||
<meta property="og:title" content="Clove Twilight">
|
<meta property="og:title" content="Clove Twilight">
|
||||||
<meta property="og:description" content="What Clove Twilight is listening to — live now-playing track, synced lyrics, and recent plays from Last.fm.">
|
<meta property="og:description"
|
||||||
|
content="What Clove Twilight is listening to — live now-playing track, synced lyrics, and recent plays from Last.fm.">
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:url" content="https://c.stupid.cat/music">
|
<meta property="og:url" content="https://c.stupid.cat/music">
|
||||||
<meta property="og:locale" content="en_GB">
|
<meta property="og:locale" content="en_GB">
|
||||||
|
|
@ -48,7 +50,8 @@
|
||||||
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:title" content="Clove Twilight">
|
<meta name="twitter:title" content="Clove Twilight">
|
||||||
<meta name="twitter:description" content="What Clove Twilight is listening to — live now-playing track, synced lyrics, and recent plays from Last.fm.">
|
<meta name="twitter:description"
|
||||||
|
content="What Clove Twilight is listening to — live now-playing track, synced lyrics, and recent plays from Last.fm.">
|
||||||
|
|
||||||
<!-- Prefetch other pages for faster navigation -->
|
<!-- Prefetch other pages for faster navigation -->
|
||||||
<link rel="prefetch" href="/">
|
<link rel="prefetch" href="/">
|
||||||
|
|
@ -82,7 +85,8 @@
|
||||||
|
|
||||||
<!-- now playing -->
|
<!-- now playing -->
|
||||||
<a class="mdc" id="dc-link">
|
<a class="mdc" id="dc-link">
|
||||||
<img class="mdc-art" id="dc-art" alt="" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
|
<img class="mdc-art" id="dc-art" alt=""
|
||||||
|
src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
|
||||||
<div class="mdc-meta">
|
<div class="mdc-meta">
|
||||||
<span class="mdc-state" id="dc-state">Connecting…</span>
|
<span class="mdc-state" id="dc-state">Connecting…</span>
|
||||||
<span class="mdc-title" id="dc-title">—</span>
|
<span class="mdc-title" id="dc-title">—</span>
|
||||||
|
|
@ -99,9 +103,13 @@
|
||||||
<!-- lyrics -->
|
<!-- lyrics -->
|
||||||
<div class="sec-row" id="lyrics-section">
|
<div class="sec-row" id="lyrics-section">
|
||||||
<h2 class="sec-title">Lyrics</h2>
|
<h2 class="sec-title">Lyrics</h2>
|
||||||
<button class="ly-lock is-locked" id="ly-lock" type="button" aria-pressed="true" hidden><span class="ly-bars" aria-hidden="true"><i></i><i></i><i></i><i></i></span><span class="ly-lock-label">Synced</span></button>
|
<button class="ly-lock is-locked" id="ly-lock" type="button" aria-pressed="true" hidden><span
|
||||||
|
class="ly-bars" aria-hidden="true"><i></i><i></i><i></i><i></i></span><span
|
||||||
|
class="ly-lock-label">Synced</span></button>
|
||||||
|
</div>
|
||||||
|
<div class="lyrics is-empty" id="lyrics">
|
||||||
|
<p class="ly-note">Waiting for a track…</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="lyrics is-empty" id="lyrics"><p class="ly-note">Waiting for a track…</p></div>
|
|
||||||
|
|
||||||
<!-- recently played -->
|
<!-- recently played -->
|
||||||
<h2 class="sec-title" id="recently-played">Recently played</h2>
|
<h2 class="sec-title" id="recently-played">Recently played</h2>
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,8 @@
|
||||||
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
|
||||||
|
|
||||||
<!-- SEO Meta Tags -->
|
<!-- SEO Meta Tags -->
|
||||||
<meta name="description" content="Explore the projects Clove Twilight actively builds and contributes to, from web apps to Discord bots.">
|
<meta name="description"
|
||||||
|
content="Explore the projects Clove Twilight actively builds and contributes to, from web apps to Discord bots.">
|
||||||
<meta name="keywords" content="Clove Twilight, c.stupid.cat, projects, portfolio, developer, open source">
|
<meta name="keywords" content="Clove Twilight, c.stupid.cat, projects, portfolio, developer, open source">
|
||||||
<meta name="author" content="doughmination">
|
<meta name="author" content="doughmination">
|
||||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||||
|
|
@ -28,7 +29,8 @@
|
||||||
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta property="og:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta property="og:site_name" content="c.stupid.cat">
|
<meta property="og:site_name" content="c.stupid.cat">
|
||||||
<meta property="og:title" content="Clove Twilight">
|
<meta property="og:title" content="Clove Twilight">
|
||||||
<meta property="og:description" content="Explore the projects Clove Twilight actively builds and contributes to, from web apps to Discord bots.">
|
<meta property="og:description"
|
||||||
|
content="Explore the projects Clove Twilight actively builds and contributes to, from web apps to Discord bots.">
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:url" content="https://c.stupid.cat/projects">
|
<meta property="og:url" content="https://c.stupid.cat/projects">
|
||||||
<meta property="og:locale" content="en_GB">
|
<meta property="og:locale" content="en_GB">
|
||||||
|
|
@ -37,7 +39,8 @@
|
||||||
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
<meta name="twitter:image" content="https://c.stupid.cat/assets/favicon/favicon.png">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:title" content="Clove Twilight">
|
<meta name="twitter:title" content="Clove Twilight">
|
||||||
<meta name="twitter:description" content="Explore the projects Clove Twilight actively builds and contributes to, from web apps to Discord bots.">
|
<meta name="twitter:description"
|
||||||
|
content="Explore the projects Clove Twilight actively builds and contributes to, from web apps to Discord bots.">
|
||||||
|
|
||||||
<!-- Prefetch other pages for faster navigation -->
|
<!-- Prefetch other pages for faster navigation -->
|
||||||
<link rel="prefetch" href="/">
|
<link rel="prefetch" href="/">
|
||||||
|
|
@ -89,7 +92,8 @@
|
||||||
<span class="project-card-title">Ghostwire</span>
|
<span class="project-card-title">Ghostwire</span>
|
||||||
<span class="project-card-status closed">Closed Source</span>
|
<span class="project-card-status closed">Closed Source</span>
|
||||||
</div>
|
</div>
|
||||||
<p class="project-card-bio">The private security bot and brains behind everything major in Girls.</p>
|
<p class="project-card-bio">The private security bot and brains behind everything major in
|
||||||
|
Girls.</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
@ -100,7 +104,8 @@
|
||||||
<span class="project-card-title">GayBot</span>
|
<span class="project-card-title">GayBot</span>
|
||||||
<span class="project-card-status">Open Source</span>
|
<span class="project-card-status">Open Source</span>
|
||||||
</div>
|
</div>
|
||||||
<p class="project-card-bio">A Discord bot for LGBTQIA+ servers — keyword emoji reactions, identity profiles, lookups, and a few fun extras.</p>
|
<p class="project-card-bio">A Discord bot for LGBTQIA+ servers — keyword emoji reactions,
|
||||||
|
identity profiles, lookups, and a few fun extras.</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
@ -140,7 +145,8 @@
|
||||||
<span class="project-card-title">Mod Update Checker</span>
|
<span class="project-card-title">Mod Update Checker</span>
|
||||||
<span class="project-card-status">Open Source</span>
|
<span class="project-card-status">Open Source</span>
|
||||||
</div>
|
</div>
|
||||||
<p class="project-card-bio is-placeholder">Add a short description for Mod Update Checker here.</p>
|
<p class="project-card-bio is-placeholder">Add a short description for Mod Update Checker here.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
@ -162,7 +168,8 @@
|
||||||
<span class="project-card-title">Widget-v2 Script</span>
|
<span class="project-card-title">Widget-v2 Script</span>
|
||||||
<span class="project-card-status">Open Source</span>
|
<span class="project-card-status">Open Source</span>
|
||||||
</div>
|
</div>
|
||||||
<p class="project-card-bio is-placeholder">Add a short description for Widget-v2 Script here.</p>
|
<p class="project-card-bio is-placeholder">Add a short description for Widget-v2 Script here.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
@ -48,6 +49,7 @@
|
||||||
<link rel="prefetch" href="/music">
|
<link rel="prefetch" href="/music">
|
||||||
<link rel="prefetch" href="/88x31">
|
<link rel="prefetch" href="/88x31">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<header class="nav">
|
<header class="nav">
|
||||||
|
|
@ -76,4 +78,5 @@
|
||||||
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
<script src="/js/core.js" data-cat="/assets/oneko/classics/classic.png"></script>
|
||||||
<script src="/js/selfies.js"></script>
|
<script src="/js/selfies.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
Loading…
Reference in New Issue