<?php $user = posix_getpwuid(fileowner(__FILE__))["name"]; ?>
<!-- HTML HEADER -->
<!DOCTYPE html>
<html lang="en">
<head>
<title>~<?=$user?> on envs.net</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="<?=$user?>">
<meta name="robots" content="noindex,nofollow">
<meta name="description" content="~<?=$user?> on envs.net" />
<meta name="keywords" content="<?=$user?>" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/scsaver@latest/src/scsaver.css" />
<link rel="stylesheet" href="files/css/style.css" />
</head>
<!-- dark/light-mode -->
<body id="body" class="dark-mode">
<terminal id="termeditor" class="onedark"></terminal>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/scsaver@latest/dist/scsaver.js"></script>
<script>
function getRandomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
function pickRandomItem() {
return arguments[getRandomInteger(0, arguments.length - 1)];
}
function getRandomCharacter() {
const characterSet =
'<>=123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$#@!&+%ゔゖユぅたガなろィづガヘ⁞びフゾッヤヲォえ”‱‰゛‽ぎだゥねたぱトハヲ‵’テるユタぱのどニペケ‥ゃ⁌どへバ※0⁁ネホゅら‖';
const randomIndex = getRandomInteger(0, characterSet.length - 1);
return characterSet[randomIndex];
}
function animateLoop(callback, delay) {
let lastTimestamp = Date.now();
function loop() {
if (Date.now() - lastTimestamp >= delay) {
callback();
lastTimestamp = Date.now();
}
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
}
class Character {
constructor() {
this.element = document.createElement('span');
this.update();
}
update() {
this.element.textContent = getRandomCharacter();
}
}
class CharacterTrail {
constructor(charactersList = [], options) {
this.charactersList = charactersList;
this.options = Object.assign(
{ size: 10, offset: 0 }, options
);
this.trail = [];
this.move();
}
iterate(callback) {
this.trail.forEach((character, index) => {
let isLast = (index === this.trail.length - 1);
if (character) callback(character, index, isLast);
});
}
move() {
this.trail = [];
let { offset, size } = this.options;
for (let i = 0; i < size; ++i) {
let character = this.charactersList[offset + i - size + 1];
this.trail.push(character);
}
this.options.offset =
(offset + 1) % (this.charactersList.length + size - 1);
}
}
class Raindrop {
constructor({ container, row }) {
this.element = document.createElement('p');
this.create(row);
if (container) {
container.appendChild(this.element);
}
this.fall();
}
create(row = 20) {
let fragment = document.createDocumentFragment();
let characters = [];
for (let i = 0; i < row; ++i) {
let char = new Character();
fragment.appendChild(char.element);
characters.push(char);
if (Math.random() < 0.5) {
animateLoop(() => char.update(), getRandomInteger(1000, 5000));
}
}
this.trail = new CharacterTrail(characters, {
size: getRandomInteger(10, 30), offset: getRandomInteger(0, 100)
});
this.element.appendChild(fragment);
}
fall() {
let trail = this.trail;
let length = trail.trail.length;
let delay = getRandomInteger(10, 100);
animateLoop(() => {
trail.move();
trail.iterate((char, index, isLast) => {
char.element.style = `
color: hsl(136, 100%, ${85 / length * (index + 1)}%)
`;
if (isLast) {
char.update();
char.element.style = `
color: hsl(136, 100%, 85%);
text-shadow:
0 0 .5em #fff,
0 0 .5em currentColor;
`;
}
});
}, delay);
}
}
</script>
<script>
class TextScramble {
constructor(el) {
this.el = el;
this.chars = '!<>-_\\/[]{}—=+*^?#________';
this.update = this.update.bind(this);
}
setText(newText) {
const oldText = this.el.innerText;
const length = Math.max(oldText.length, newText.length);
const promise = new Promise(resolve => this.resolve = resolve);
this.queue = [];
for (let i = 0; i < length; i++) {
const from = oldText[i] || '';
const to = newText[i] || '';
const start = Math.floor(Math.random() * 40);
const end = start + Math.floor(Math.random() * 40);
this.queue.push({ from, to, start, end });
}
cancelAnimationFrame(this.frameRequest);
this.frame = 0;
this.update();
return promise;
}
update() {
let output = '';
let complete = 0;
for (let i = 0, n = this.queue.length; i < n; i++) {
let { from, to, start, end, char } = this.queue[i];
if (this.frame >= end) {
complete++;
output += to;
} else if (this.frame >= start) {
if (!char || Math.random() < 0.28) {
char = this.randomChar();
this.queue[i].char = char;
}
output += `<span class="dud">${char}</span>`;
} else {
output += from;
}
}
this.el.innerHTML = output;
if (complete === this.queue.length) {
this.resolve();
} else {
this.frameRequest = requestAnimationFrame(this.update);
this.frame++;
}
}
randomChar() {
return this.chars[Math.floor(Math.random() * this.chars.length)];
}}
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/typed.js/2.0.8/typed.min.js"></script>
<script src="files/js/script.js"></script>
</body>
</html>