Upload files to "/"
Initial Commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
deploy_dangrubb.net.sh
|
254
index.html
Normal file
254
index.html
Normal file
@ -0,0 +1,254 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en" >
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>dangrubb.net</title>
|
||||
<link rel="icon" href="/src/img/favicon.ico" type="image/x-icon">
|
||||
<link rel="icon" href="/src/img/favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="./style.css">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<!-- partial:index.partial.html -->
|
||||
<div class="bard">
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -2em;
|
||||
--glitch-hue-1: -16deg;
|
||||
--glitch-x-2: 2em;
|
||||
--glitch-hue-2: 13deg;
|
||||
|
||||
background-position: 0 -0em;
|
||||
height: 5em;
|
||||
animation-name: glitch-9;
|
||||
animation-duration: 9000ms;
|
||||
animation-delay: 2s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -1em;
|
||||
--glitch-hue-1: -42deg;
|
||||
--glitch-x-2: -6em;
|
||||
--glitch-hue-2: -23deg;
|
||||
|
||||
background-position: 0 -5em;
|
||||
height: 3em;
|
||||
animation-name: glitch-5;
|
||||
animation-duration: 5000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -10em;
|
||||
--glitch-hue-1: -42deg;
|
||||
--glitch-x-2: -9em;
|
||||
--glitch-hue-2: 45deg;
|
||||
|
||||
background-position: 0 -8em;
|
||||
height: 3em;
|
||||
animation-name: glitch-7;
|
||||
animation-duration: 7000ms;
|
||||
animation-delay: 0s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -6em;
|
||||
--glitch-hue-1: -11deg;
|
||||
--glitch-x-2: 2em;
|
||||
--glitch-hue-2: 29deg;
|
||||
|
||||
background-position: 0 -11em;
|
||||
height: 5em;
|
||||
animation-name: glitch-8;
|
||||
animation-duration: 8000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: 0em;
|
||||
--glitch-hue-1: 42deg;
|
||||
--glitch-x-2: 2em;
|
||||
--glitch-hue-2: -28deg;
|
||||
|
||||
background-position: 0 -16em;
|
||||
height: 5em;
|
||||
animation-name: glitch-6;
|
||||
animation-duration: 6000ms;
|
||||
animation-delay: 0s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -3em;
|
||||
--glitch-hue-1: -45deg;
|
||||
--glitch-x-2: -5em;
|
||||
--glitch-hue-2: -15deg;
|
||||
|
||||
background-position: 0 -21em;
|
||||
height: 2em;
|
||||
animation-name: glitch-7;
|
||||
animation-duration: 7000ms;
|
||||
animation-delay: 0s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -5em;
|
||||
--glitch-hue-1: 35deg;
|
||||
--glitch-x-2: 9em;
|
||||
--glitch-hue-2: 35deg;
|
||||
|
||||
background-position: 0 -23em;
|
||||
height: 2em;
|
||||
animation-name: glitch-6;
|
||||
animation-duration: 6000ms;
|
||||
animation-delay: 0s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: 10em;
|
||||
--glitch-hue-1: 39deg;
|
||||
--glitch-x-2: -8em;
|
||||
--glitch-hue-2: 24deg;
|
||||
|
||||
background-position: 0 -25em;
|
||||
height: 6em;
|
||||
animation-name: glitch-7;
|
||||
animation-duration: 7000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -6em;
|
||||
--glitch-hue-1: -46deg;
|
||||
--glitch-x-2: -3em;
|
||||
--glitch-hue-2: 18deg;
|
||||
|
||||
background-position: 0 -31em;
|
||||
height: 6em;
|
||||
animation-name: glitch-10;
|
||||
animation-duration: 10000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -8em;
|
||||
--glitch-hue-1: -37deg;
|
||||
--glitch-x-2: -6em;
|
||||
--glitch-hue-2: 15deg;
|
||||
|
||||
background-position: 0 -37em;
|
||||
height: 1em;
|
||||
animation-name: glitch-9;
|
||||
animation-duration: 9000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -1em;
|
||||
--glitch-hue-1: 16deg;
|
||||
--glitch-x-2: 2em;
|
||||
--glitch-hue-2: 25deg;
|
||||
|
||||
background-position: 0 -38em;
|
||||
height: 2em;
|
||||
animation-name: glitch-5;
|
||||
animation-duration: 5000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: 5em;
|
||||
--glitch-hue-1: 32deg;
|
||||
--glitch-x-2: 10em;
|
||||
--glitch-hue-2: -3deg;
|
||||
|
||||
background-position: 0 -40em;
|
||||
height: 2em;
|
||||
animation-name: glitch-9;
|
||||
animation-duration: 9000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: 10em;
|
||||
--glitch-hue-1: -26deg;
|
||||
--glitch-x-2: 6em;
|
||||
--glitch-hue-2: -45deg;
|
||||
|
||||
background-position: 0 -42em;
|
||||
height: 4em;
|
||||
animation-name: glitch-6;
|
||||
animation-duration: 6000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -7em;
|
||||
--glitch-hue-1: -45deg;
|
||||
--glitch-x-2: -8em;
|
||||
--glitch-hue-2: 45deg;
|
||||
|
||||
background-position: 0 -46em;
|
||||
height: 3em;
|
||||
animation-name: glitch-5;
|
||||
animation-duration: 5000ms;
|
||||
animation-delay: 2s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: 4em;
|
||||
--glitch-hue-1: 40deg;
|
||||
--glitch-x-2: -8em;
|
||||
--glitch-hue-2: 29deg;
|
||||
|
||||
background-position: 0 -49em;
|
||||
height: 3em;
|
||||
animation-name: glitch-6;
|
||||
animation-duration: 6000ms;
|
||||
animation-delay: 1s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: -4em;
|
||||
--glitch-hue-1: 26deg;
|
||||
--glitch-x-2: -6em;
|
||||
--glitch-hue-2: -3deg;
|
||||
|
||||
background-position: 0 -52em;
|
||||
height: 6em;
|
||||
animation-name: glitch-10;
|
||||
animation-duration: 10000ms;
|
||||
animation-delay: 0s;
|
||||
"></div>
|
||||
|
||||
<div class="strip" style="
|
||||
--glitch-x-1: 6em;
|
||||
--glitch-hue-1: 43deg;
|
||||
--glitch-x-2: -1em;
|
||||
--glitch-hue-2: -1deg;
|
||||
|
||||
background-position: 0 -58em;
|
||||
height: 4em;
|
||||
animation-name: glitch-8;
|
||||
animation-duration: 8000ms;
|
||||
animation-delay: 0s;
|
||||
"></div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
dangrubb.net
|
||||
</p>
|
||||
<p>
|
||||
<a target="_parent" href="https://ai.dangrubb.net">ai</a>
|
||||
<a target="_parent" href="https://ghost.dangrubb.net">blog</a>
|
||||
<a target="_parent" href="https://pi.dangrubb.net/jellyfin">media</a>
|
||||
<a target="_parent" href="https://pi.dangrubb.net/nextcloud">storage</a>
|
||||
<a target="_parent" href="https://dangrubb.net/cv">cv</a>
|
||||
<a target="_parent" href="https://pi.dangrubb.net/dangit">git</a></p>
|
||||
<div class="debug">
|
||||
<div class="code"></div>
|
||||
</div>
|
||||
<!-- partial -->
|
||||
<script src="./script.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
129
script.js
Normal file
129
script.js
Normal file
@ -0,0 +1,129 @@
|
||||
"use strict";
|
||||
const random = (min, max) => {
|
||||
return Math.round(Math.random() * (max - min)) + min;
|
||||
};
|
||||
const getKeyFrames = (name, glitchPercentageDuration, steps = 3, tick = 0.1) => {
|
||||
const percentageStep = 100 / steps;
|
||||
const keyframes = [];
|
||||
// First keyframe
|
||||
const baseKeys = [0];
|
||||
for (let i = 1; i < steps; i++) {
|
||||
const p = i * percentageStep;
|
||||
baseKeys.push(p);
|
||||
baseKeys.push(p + glitchPercentageDuration);
|
||||
}
|
||||
// Last keyframe
|
||||
baseKeys.push(100);
|
||||
keyframes.push({
|
||||
keys: baseKeys,
|
||||
css: {
|
||||
transform: "none",
|
||||
filter: "hue-rotate(0) drop-shadow(0 0 0 transparent)" // Hack to force animation in Safari
|
||||
}
|
||||
});
|
||||
for (let i = 1; i < steps; i++) {
|
||||
const p = i * percentageStep;
|
||||
// Blue / red shadow
|
||||
const color = Math.random() > 0.5 ? "rgb(255 0 0 / 0.1)" : "rgb(0 0 255 / 0.1)";
|
||||
const shadowX = random(-4, 4);
|
||||
const shadowY = random(-4, 4);
|
||||
keyframes.push({
|
||||
keys: [p + tick, p + glitchPercentageDuration - tick],
|
||||
css: {
|
||||
transform: `translateX(var(--glitch-x-${i}))`,
|
||||
filter: `hue-rotate(var(--glitch-hue-${i})) drop-shadow(${shadowX}px ${shadowY}px 0 ${color})`
|
||||
}
|
||||
});
|
||||
}
|
||||
const css = keyframes
|
||||
.map((keyframe) => {
|
||||
const keys = keyframe.keys
|
||||
.map((key) => `${key.toFixed(2)}%`)
|
||||
.join(",\n ");
|
||||
const content = Object.entries(keyframe.css)
|
||||
.map(([key, value]) => ` ${key}: ${value};`)
|
||||
.join("\n ");
|
||||
return [keys, "{", content, "}"].join("\n ");
|
||||
})
|
||||
.join("\n\n ");
|
||||
return `@keyframes ${name} {\n ${css}\n}`;
|
||||
};
|
||||
const getStripHTML = (top, stripHeight) => {
|
||||
const duration = random(5, 10);
|
||||
const name = `glitch-${duration}`;
|
||||
return `<div
|
||||
class="strip"
|
||||
style="
|
||||
--glitch-x-1: ${random(-10, 10)}em;
|
||||
--glitch-hue-1: ${random(-50, 50)}deg;
|
||||
--glitch-x-2: ${random(-10, 10)}em;
|
||||
--glitch-hue-2: ${random(-50, 50)}deg;
|
||||
|
||||
background-position: 0 -${top}em;
|
||||
height: ${stripHeight}em;
|
||||
animation-name: ${name};
|
||||
animation-duration: ${duration * 1000}ms;
|
||||
animation-delay: ${random(0, 2)}s;
|
||||
"
|
||||
></div>`;
|
||||
};
|
||||
const getGlitchHTML = (height) => {
|
||||
let i = 0;
|
||||
const html = [];
|
||||
while (1) {
|
||||
const stripHeight = random(1, 6);
|
||||
if (i + stripHeight < height) {
|
||||
const strip = getStripHTML(i, stripHeight);
|
||||
html.push(strip);
|
||||
}
|
||||
else {
|
||||
// Last strip
|
||||
const strip = getStripHTML(i, height - i);
|
||||
html.push(strip);
|
||||
break;
|
||||
}
|
||||
i = i + stripHeight;
|
||||
}
|
||||
return html;
|
||||
};
|
||||
/*
|
||||
|
||||
If you want to generate new CSS/HTML dinamically,
|
||||
uncomment the code below.
|
||||
|
||||
*/
|
||||
// const html = getGlitchHTML(62);
|
||||
// // HTML
|
||||
// const $glitch = document.querySelector(".bard") as HTMLElement;
|
||||
// $glitch.innerHTML = html.join("\n");
|
||||
// // CSS
|
||||
// const css = [5,6,7,8,9,10].map((n) => {
|
||||
// const glitchDurationMS = 500;
|
||||
// const glitchPercentageDuration = (glitchDurationMS * 100) / (n * 1000);
|
||||
// return getKeyFrames(`glitch-${n}`, glitchPercentageDuration);
|
||||
// });
|
||||
// // Add generated CSS to the page
|
||||
// const $style = document.createElement("style");
|
||||
// $style.innerHTML = css.join("\n");
|
||||
// document.head.appendChild($style);
|
||||
// // ----- Debug -------------- //
|
||||
// // Not used for the animation //
|
||||
// const $code = document.querySelector(".code");
|
||||
// const escape = (html) => {
|
||||
// return html
|
||||
// .replace(/&/g, "&")
|
||||
// .replace(/</g, "<")
|
||||
// .replace(/>/g, ">")
|
||||
// .replace(/"/g, """)
|
||||
// .replace(/'/g, "'");
|
||||
// };
|
||||
// $code.innerHTML = `
|
||||
// <div class="column">
|
||||
// <div class="heading">HTML</div>
|
||||
// <pre>${escape(html.join("\n\n"))}</pre>
|
||||
// </div>
|
||||
// <div class="column">
|
||||
// <div class="heading">CSS</div>
|
||||
// <pre>${css.join("\n\n")}</pre>
|
||||
// </div>
|
||||
// `;
|
Reference in New Issue
Block a user