this repo has no description

Compare changes

Choose any two refs to compare.

chigiri.avif

This is a binary file and will not be displayed.

+23
index.css
···
width: clamp(200px, 20%, 20%);
}
+
& .credits {
+
font-size: xx-small;
+
}
+
& h2 {
margin-top: 10px;
margin-bottom: 10px;
···
fill: hsl(145deg, 78%, 48%);
}
}
+
+
.oomfs {
+
display: flex;
+
flex-direction: row;
+
}
+
+
.oomf {
+
padding: 10px;
+
}
+
+
.oomf-img {
+
transition: transform 0.3s ease;
+
margin: 2px;
+
max-width: 5rem;
+
+
&:hover {
+
transform: scale(1.1);
+
}
+
}
+60 -11
index.html
···
<!DOCTYPE html>
<html lang="en">
+
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
···
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans">
<link rel="stylesheet" href="/style.css">
<link rel="stylesheet" href="/index.css">
+
<script defer data-domain="nel.pet" src="https://plausible.nel.pet/js/script.outbound-links.js"></script>
+
<script defer src="oneko.js"></script>
+
<script defer src="yougonnabenoseyhuh.js"></script>
</head>
+
<body>
+
<div id="oneko"></div>
<header class="page-header">
<nav>
<a href="/" class="nav-item"><b>Home</b></a>
-
<a href="/projects/projects.html" class="nav-item">Projects</a>
+
<a href="/projects/" class="nav-item">Projects</a>
</nav>
</header>
<main class="page-main">
-
-
<img class="pfp" src="lil_nelly_cropped.jpg" alt="nelind profile picture">
+
+
<img class="pfp" alt="nel profile picture">
+
<p class="credits">picture by the wonderful <a href="https://www.instagram.com/draco_draws/">dracodraws</a></p>
<h2>Nel / Nelind<br>(She/They)</h2>
<p>Self Hosting โ€ข Rust โ€ข Web Dev</p>
<p>Fabric/Quilt โ€ข Spigot/Paper </p>
-
<p>Conlanging โ€ข Lingustics</p>
+
<p>Conlanging โ€ข Linguistics</p>
<section class="card" style="--card-colour: var(--colour-green)">
<header class="card-header">
···
</header>
<div class="card-body">
<p>
-
Im a nerdy lil goober from Denmark who likes to dable in Minecraft modding and plugin development,
-
I do self hosting of several services (including this here website!) in my homelab and I write some Rust here and there. <br>
-
I'm also a massive lingustics nerd (yay autism) and do conlanging every now and then.
+
Im a nerdy girl from Denmark who likes to dable in Minecraft modding and plugin development,
+
I do self hosting of several services (including this here website!) in my homelab and I write some
+
Rust here and there. <br>
+
I'm also a massive lingustics nerd (yay autism) and do conlanging every now and then. <br>
+
And lastly i'm one of the lead staff (owners) and dev over at <a
+
href="https://discord.gg/rNwfwrbTKF"> Pridecentral SMP</a> come join us if you want!
</p>
<div class="socials">
<p>You can find me on various platforms here:</p>
<div class="socials-links">
<a rel="me" href="https://tech.lgbt/@karbir">
-
<svg class="socials-logo mastodon-logo" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg>
+
<svg class="socials-logo mastodon-logo" xmlns="http://www.w3.org/2000/svg" height="1em"
+
viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
+
<path
+
d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z" />
+
</svg>
</a>
<a href="https://github.com/nelind3">
-
<svg class="socials-logo github-logo" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 496 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
+
<svg class="socials-logo github-logo" xmlns="http://www.w3.org/2000/svg" height="1em"
+
viewBox="0 0 496 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
+
<path
+
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" />
+
</svg>
</a>
<a href="https://modrinth.com/user/Nelind">
-
<svg class="socials-logo modrinth-logo" xmlns="http://www.w3.org/2000/svg" width="512" height="514" viewBox="0 0 512 514" data-v-826e3f53=""><path fill="var(--color-brand)" fill-rule="evenodd" d="M503.16 323.56c11.39-42.09 12.16-87.65.04-132.8C466.57 54.23 326.04-26.8 189.33 9.78 83.81 38.02 11.39 128.07.69 230.47h43.3c10.3-83.14 69.75-155.74 155.76-178.76 106.3-28.45 215.38 28.96 253.42 129.67l-42.14 11.27c-19.39-46.85-58.46-81.2-104.73-95.83l-7.74 43.84c36.53 13.47 66.16 43.84 77 84.25 15.8 58.89-13.62 119.23-67 144.26l11.53 42.99c70.16-28.95 112.31-101.86 102.34-177.02l41.98-11.23a210.18 210.18 0 0 1-3.86 84.16l42.61 15.49Z" clip-rule="evenodd"></path><path fill="var(--color-brand)" d="M321.99 504.22C185.27 540.8 44.75 459.77 8.11 323.24A257.556 257.556 0 0 1 0 275.46h43.27c1.09 11.91 3.2 23.89 6.41 35.83 3.36 12.51 7.77 24.46 13.11 35.78l38.59-23.15c-3.25-7.5-5.99-15.32-8.17-23.45-24.04-89.6 29.2-181.7 118.92-205.71 17-4.55 34.1-6.32 50.8-5.61L255.19 133c-10.46.05-21.08 1.42-31.66 4.25-66.22 17.73-105.52 85.7-87.78 151.84 1.1 4.07 2.38 8.04 3.84 11.9l49.35-29.61-14.87-39.43 46.6-47.87 58.9-12.69 17.05 20.99-27.15 27.5-23.68 7.45-16.92 17.39 8.29 23.07s16.79 17.84 16.82 17.85l23.72-6.31 16.88-18.54 36.86-11.67 10.98 24.7-38.03 46.63-63.73 20.18-28.58-31.82-49.82 29.89c25.54 29.08 63.94 45.23 103.75 41.86l11.53 42.99c-59.41 7.86-117.44-16.73-153.49-61.91l-38.41 23.04c50.61 66.49 138.2 99.43 223.97 76.48 61.74-16.52 109.79-58.6 135.81-111.78l42.64 15.5c-30.89 66.28-89.84 118.94-166.07 139.34Z"></path></svg>
+
<svg class="socials-logo modrinth-logo" xmlns="http://www.w3.org/2000/svg" width="512"
+
height="514" viewBox="0 0 512 514" data-v-826e3f53="">
+
<path fill="var(--color-brand)" fill-rule="evenodd"
+
d="M503.16 323.56c11.39-42.09 12.16-87.65.04-132.8C466.57 54.23 326.04-26.8 189.33 9.78 83.81 38.02 11.39 128.07.69 230.47h43.3c10.3-83.14 69.75-155.74 155.76-178.76 106.3-28.45 215.38 28.96 253.42 129.67l-42.14 11.27c-19.39-46.85-58.46-81.2-104.73-95.83l-7.74 43.84c36.53 13.47 66.16 43.84 77 84.25 15.8 58.89-13.62 119.23-67 144.26l11.53 42.99c70.16-28.95 112.31-101.86 102.34-177.02l41.98-11.23a210.18 210.18 0 0 1-3.86 84.16l42.61 15.49Z"
+
clip-rule="evenodd"></path>
+
<path fill="var(--color-brand)"
+
d="M321.99 504.22C185.27 540.8 44.75 459.77 8.11 323.24A257.556 257.556 0 0 1 0 275.46h43.27c1.09 11.91 3.2 23.89 6.41 35.83 3.36 12.51 7.77 24.46 13.11 35.78l38.59-23.15c-3.25-7.5-5.99-15.32-8.17-23.45-24.04-89.6 29.2-181.7 118.92-205.71 17-4.55 34.1-6.32 50.8-5.61L255.19 133c-10.46.05-21.08 1.42-31.66 4.25-66.22 17.73-105.52 85.7-87.78 151.84 1.1 4.07 2.38 8.04 3.84 11.9l49.35-29.61-14.87-39.43 46.6-47.87 58.9-12.69 17.05 20.99-27.15 27.5-23.68 7.45-16.92 17.39 8.29 23.07s16.79 17.84 16.82 17.85l23.72-6.31 16.88-18.54 36.86-11.67 10.98 24.7-38.03 46.63-63.73 20.18-28.58-31.82-49.82 29.89c25.54 29.08 63.94 45.23 103.75 41.86l11.53 42.99c-59.41 7.86-117.44-16.73-153.49-61.91l-38.41 23.04c50.61 66.49 138.2 99.43 223.97 76.48 61.74-16.52 109.79-58.6 135.81-111.78l42.64 15.5c-30.89 66.28-89.84 118.94-166.07 139.34Z">
+
</path>
+
</svg>
</a>
</div>
</div>
</div>
</section>
+
<section class="card" style="--card-colour: var(--colour-red)">
+
<header class="card-header">
+
<h3>Oomfies and Pookies &lt3</h3>
+
</header>
+
<div class="card-body oomfs">
+
<div class="oomf">
+
<p>Starsshineforme (zizi)</p>
+
<a href="https://starsshineforme.straw.page/">
+
<img class="oomf-img" src="chigiri.avif" alt="chigiri image to reprecent starsshineforme">
+
</a>
+
</div>
+
+
<div class="oomf">
+
<p>Sluggishghost (spence)</p>
+
<a href="https://sluggishghost.straw.page/">
+
<img class="oomf-img" src="kunigami.webp" alt="kunigami image to reprecent sluggishghost">
+
</a>
+
</div>
+
+
</div>
+
</section>
+
</main>
</body>
-
</html>
+
+
</html>
kunigami.webp

This is a binary file and will not be displayed.

lil_nelly_cropped.jpg

This is a binary file and will not be displayed.

oneko.gif

This is a binary file and will not be displayed.

+285
oneko.js
···
+
// oneko.js: https://github.com/adryd325/oneko.js
+
// petable version from https://github.com/tylxr59/oneko.js
+
+
(function oneko() {
+
const isReducedMotion =
+
window.matchMedia(`(prefers-reduced-motion: reduce)`) === true ||
+
window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true;
+
+
if (isReducedMotion) return;
+
+
const nekoEl = document.createElement("div");
+
+
let nekoPosX = 32;
+
let nekoPosY = 32;
+
+
let mousePosX = 0;
+
let mousePosY = 0;
+
+
let frameCount = 0;
+
let idleTime = 0;
+
let idleAnimation = null;
+
let idleAnimationFrame = 0;
+
+
// up neko speed from default 10
+
const nekoSpeed = 15;
+
const spriteSets = {
+
idle: [[-3, -3]],
+
alert: [[-7, -3]],
+
scratchSelf: [
+
[-5, 0],
+
[-6, 0],
+
[-7, 0],
+
],
+
scratchWallN: [
+
[0, 0],
+
[0, -1],
+
],
+
scratchWallS: [
+
[-7, -1],
+
[-6, -2],
+
],
+
scratchWallE: [
+
[-2, -2],
+
[-2, -3],
+
],
+
scratchWallW: [
+
[-4, 0],
+
[-4, -1],
+
],
+
tired: [[-3, -2]],
+
sleeping: [
+
[-2, 0],
+
[-2, -1],
+
],
+
N: [
+
[-1, -2],
+
[-1, -3],
+
],
+
NE: [
+
[0, -2],
+
[0, -3],
+
],
+
E: [
+
[-3, 0],
+
[-3, -1],
+
],
+
SE: [
+
[-5, -1],
+
[-5, -2],
+
],
+
S: [
+
[-6, -3],
+
[-7, -2],
+
],
+
SW: [
+
[-5, -3],
+
[-6, -1],
+
],
+
W: [
+
[-4, -2],
+
[-4, -3],
+
],
+
NW: [
+
[-1, 0],
+
[-1, -1],
+
],
+
};
+
+
function init() {
+
nekoEl.id = "oneko";
+
nekoEl.ariaHidden = true;
+
nekoEl.style.width = "32px";
+
nekoEl.style.height = "32px";
+
nekoEl.style.position = "fixed";
+
nekoEl.style.pointerEvents = "auto";
+
nekoEl.style.imageRendering = "pixelated";
+
nekoEl.style.left = `${nekoPosX - 16}px`;
+
nekoEl.style.top = `${nekoPosY - 16}px`;
+
nekoEl.style.zIndex = Number.MAX_VALUE;
+
+
// Personal edit: Fetch gif from root not relative path
+
let nekoFile = "/oneko.gif"
+
const curScript = document.currentScript
+
if (curScript && curScript.dataset.cat) {
+
nekoFile = curScript.dataset.cat
+
}
+
nekoEl.style.backgroundImage = `url(${nekoFile})`;
+
+
document.body.appendChild(nekoEl);
+
+
document.addEventListener("mousemove", function (event) {
+
mousePosX = event.clientX;
+
mousePosY = event.clientY;
+
});
+
+
window.requestAnimationFrame(onAnimationFrame);
+
}
+
+
let lastFrameTimestamp;
+
+
function onAnimationFrame(timestamp) {
+
// Stops execution if the neko element is removed from DOM
+
if (!nekoEl.isConnected) {
+
return;
+
}
+
if (!lastFrameTimestamp) {
+
lastFrameTimestamp = timestamp;
+
}
+
if (timestamp - lastFrameTimestamp > 100) {
+
lastFrameTimestamp = timestamp
+
frame()
+
}
+
window.requestAnimationFrame(onAnimationFrame);
+
}
+
+
function setSprite(name, frame) {
+
const sprite = spriteSets[name][frame % spriteSets[name].length];
+
nekoEl.style.backgroundPosition = `${sprite[0] * 32}px ${sprite[1] * 32}px`;
+
}
+
+
function resetIdleAnimation() {
+
idleAnimation = null;
+
idleAnimationFrame = 0;
+
}
+
+
function idle() {
+
idleTime += 1;
+
+
// every ~ 20 seconds
+
if (
+
idleTime > 10 &&
+
Math.floor(Math.random() * 200) == 0 &&
+
idleAnimation == null
+
) {
+
let avalibleIdleAnimations = ["sleeping", "scratchSelf"];
+
if (nekoPosX < 32) {
+
avalibleIdleAnimations.push("scratchWallW");
+
}
+
if (nekoPosY < 32) {
+
avalibleIdleAnimations.push("scratchWallN");
+
}
+
if (nekoPosX > window.innerWidth - 32) {
+
avalibleIdleAnimations.push("scratchWallE");
+
}
+
if (nekoPosY > window.innerHeight - 32) {
+
avalibleIdleAnimations.push("scratchWallS");
+
}
+
idleAnimation =
+
avalibleIdleAnimations[
+
Math.floor(Math.random() * avalibleIdleAnimations.length)
+
];
+
}
+
+
switch (idleAnimation) {
+
case "sleeping":
+
if (idleAnimationFrame < 8) {
+
setSprite("tired", 0);
+
break;
+
}
+
setSprite("sleeping", Math.floor(idleAnimationFrame / 4));
+
if (idleAnimationFrame > 192) {
+
resetIdleAnimation();
+
}
+
break;
+
case "scratchWallN":
+
case "scratchWallS":
+
case "scratchWallE":
+
case "scratchWallW":
+
case "scratchSelf":
+
setSprite(idleAnimation, idleAnimationFrame);
+
if (idleAnimationFrame > 9) {
+
resetIdleAnimation();
+
}
+
break;
+
default:
+
setSprite("idle", 0);
+
return;
+
}
+
idleAnimationFrame += 1;
+
}
+
+
function explodeHearts() {
+
const parent = nekoEl.parentElement;
+
const rect = nekoEl.getBoundingClientRect();
+
const scrollLeft = window.scrollX || document.documentElement.scrollLeft;
+
const scrollTop = window.scrollY || document.documentElement.scrollTop;
+
const centerX = rect.left + rect.width / 2 + scrollLeft;
+
const centerY = rect.top + rect.height / 2 + scrollTop;
+
+
for (let i = 0; i < 10; i++) {
+
const heart = document.createElement('div');
+
heart.className = 'heart';
+
heart.textContent = 'โค';
+
const offsetX = (Math.random() - 0.5) * 50;
+
const offsetY = (Math.random() - 0.5) * 50;
+
heart.style.left = `${centerX + offsetX - 16}px`;
+
heart.style.top = `${centerY + offsetY - 16}px`;
+
heart.style.transform = `translate(-50%, -50%) rotate(${Math.random() * 360}deg)`;
+
parent.appendChild(heart);
+
+
setTimeout(() => {
+
parent.removeChild(heart);
+
}, 1000);
+
}
+
}
+
+
const style = document.createElement('style');
+
style.innerHTML = `
+
@keyframes heartBurst {
+
0% { transform: scale(0); opacity: 1; }
+
100% { transform: scale(1); opacity: 0; }
+
}
+
.heart {
+
position: absolute;
+
font-size: 2em;
+
animation: heartBurst 1s ease-out;
+
animation-fill-mode: forwards;
+
color: #ab9df2;
+
}
+
`;
+
+
document.head.appendChild(style);
+
nekoEl.addEventListener('click', explodeHearts);
+
+
function frame() {
+
frameCount += 1;
+
const diffX = nekoPosX - mousePosX;
+
const diffY = nekoPosY - mousePosY;
+
const distance = Math.sqrt(diffX ** 2 + diffY ** 2);
+
+
if (distance < nekoSpeed || distance < 48) {
+
idle();
+
return;
+
}
+
+
idleAnimation = null;
+
idleAnimationFrame = 0;
+
+
if (idleTime > 1) {
+
setSprite("alert", 0);
+
// count down after being alerted before moving
+
idleTime = Math.min(idleTime, 7);
+
idleTime -= 1;
+
return;
+
}
+
+
let direction;
+
direction = diffY / distance > 0.5 ? "N" : "";
+
direction += diffY / distance < -0.5 ? "S" : "";
+
direction += diffX / distance > 0.5 ? "W" : "";
+
direction += diffX / distance < -0.5 ? "E" : "";
+
setSprite(direction, frameCount);
+
+
nekoPosX -= (diffX / distance) * nekoSpeed;
+
nekoPosY -= (diffY / distance) * nekoSpeed;
+
+
nekoPosX = Math.min(Math.max(16, nekoPosX), window.innerWidth - 16);
+
nekoPosY = Math.min(Math.max(16, nekoPosY), window.innerHeight - 16);
+
+
nekoEl.style.left = `${nekoPosX - 16}px`;
+
nekoEl.style.top = `${nekoPosY - 16}px`;
+
}
+
+
init();
+
})();
pretty_nelly.png

This is a binary file and will not be displayed.

+28
projects/index.html
···
+
<!DOCTYPE html>
+
<html lang="en">
+
<head>
+
<meta charset="UTF-8">
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
<title>Nelind - Projects</title>
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans">
+
<link rel="stylesheet" href="/style.css">
+
<link rel="stylesheet" href="projects.css">
+
<script defer data-domain="nel.pet" src="https://plausible.nel.pet/js/script.outbound-links.js"></script>
+
<script defer src="/oneko.js"></script>
+
</head>
+
<body>
+
<div id="oneko"></div>
+
+
<header class="page-header">
+
<nav>
+
<a href="/" class="nav-item">Home</a>
+
<a href="/projects/" class="nav-item"><b>Projects</b></a>
+
</nav>
+
</header>
+
+
<main class="page-main">
+
<h2>Work in progress &lt;3</h2>
+
</main>
+
+
</body>
+
</html>
-25
projects/projects.html
···
-
<!DOCTYPE html>
-
<html lang="en">
-
<head>
-
<meta charset="UTF-8">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>Nelind - Projects</title>
-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans">
-
<link rel="stylesheet" href="/style.css">
-
<link rel="stylesheet" href="projects.css">
-
</head>
-
<body>
-
-
<header class="page-header">
-
<nav>
-
<a href="/" class="nav-item">Home</a>
-
<a href="/projects/projects.html" class="nav-item"><b>Projects</b></a>
-
</nav>
-
</header>
-
-
<main class="page-main">
-
<h2>Work in progress &lt;3</h2>
-
</main>
-
-
</body>
-
</html>
+23
yougonnabenoseyhuh.js
···
+
let howmanytimesyoudidthethingverycool = 0;
+
+
(() => {
+
let localStorage = window.localStorage;
+
let pfpElem = document.getElementsByClassName("pfp")[0];
+
+
if (localStorage.getItem("youdidthethingitwasverycool")) {
+
pfpElem.setAttribute("src", `https://placewaifu.com/image/200?dummyrandtofuckthebrowsercache=${Math.floor(Math.random() * 100)}`);
+
return;
+
} else {
+
pfpElem.setAttribute("src", "pretty_nelly.png");
+
}
+
+
pfpElem.addEventListener("click", (e) => {
+
howmanytimesyoudidthethingverycool++;
+
if (howmanytimesyoudidthethingverycool >= 3) {
+
localStorage.setItem("youdidthethingitwasverycool", true);
+
if (pfpElem.getAttribute("src") === "pretty_nelly.png") {
+
pfpElem.setAttribute("src", `https://placewaifu.com/image/200?dummyrandtofuckthebrowsercache=${Math.floor(Math.random() * 100)}`);
+
}
+
}
+
});
+
})()