diff --git a/color.js b/color.js deleted file mode 100644 index 9f59b69..0000000 --- a/color.js +++ /dev/null @@ -1,289 +0,0 @@ -'use strict'; - -class Color { - constructor(r, g, b) { - this.set(r, g, b); - } - - toString() { - return `rgb(${Math.round(this.r)}, ${Math.round(this.g)}, ${Math.round(this.b)})`; - } - - set(r, g, b) { - this.r = this.clamp(r); - this.g = this.clamp(g); - this.b = this.clamp(b); - } - - hueRotate(angle = 0) { - angle = angle / 180 * Math.PI; - const sin = Math.sin(angle); - const cos = Math.cos(angle); - - this.multiply([ - 0.213 + cos * 0.787 - sin * 0.213, - 0.715 - cos * 0.715 - sin * 0.715, - 0.072 - cos * 0.072 + sin * 0.928, - 0.213 - cos * 0.213 + sin * 0.143, - 0.715 + cos * 0.285 + sin * 0.140, - 0.072 - cos * 0.072 - sin * 0.283, - 0.213 - cos * 0.213 - sin * 0.787, - 0.715 - cos * 0.715 + sin * 0.715, - 0.072 + cos * 0.928 + sin * 0.072, - ]); - } - - grayscale(value = 1) { - this.multiply([ - 0.2126 + 0.7874 * (1 - value), - 0.7152 - 0.7152 * (1 - value), - 0.0722 - 0.0722 * (1 - value), - 0.2126 - 0.2126 * (1 - value), - 0.7152 + 0.2848 * (1 - value), - 0.0722 - 0.0722 * (1 - value), - 0.2126 - 0.2126 * (1 - value), - 0.7152 - 0.7152 * (1 - value), - 0.0722 + 0.9278 * (1 - value), - ]); - } - - sepia(value = 1) { - this.multiply([ - 0.393 + 0.607 * (1 - value), - 0.769 - 0.769 * (1 - value), - 0.189 - 0.189 * (1 - value), - 0.349 - 0.349 * (1 - value), - 0.686 + 0.314 * (1 - value), - 0.168 - 0.168 * (1 - value), - 0.272 - 0.272 * (1 - value), - 0.534 - 0.534 * (1 - value), - 0.131 + 0.869 * (1 - value), - ]); - } - - saturate(value = 1) { - this.multiply([ - 0.213 + 0.787 * value, - 0.715 - 0.715 * value, - 0.072 - 0.072 * value, - 0.213 - 0.213 * value, - 0.715 + 0.285 * value, - 0.072 - 0.072 * value, - 0.213 - 0.213 * value, - 0.715 - 0.715 * value, - 0.072 + 0.928 * value, - ]); - } - - multiply(matrix) { - const newR = this.clamp(this.r * matrix[0] + this.g * matrix[1] + this.b * matrix[2]); - const newG = this.clamp(this.r * matrix[3] + this.g * matrix[4] + this.b * matrix[5]); - const newB = this.clamp(this.r * matrix[6] + this.g * matrix[7] + this.b * matrix[8]); - this.r = newR; - this.g = newG; - this.b = newB; - } - - brightness(value = 1) { - this.linear(value); - } - contrast(value = 1) { - this.linear(value, -(0.5 * value) + 0.5); - } - - linear(slope = 1, intercept = 0) { - this.r = this.clamp(this.r * slope + intercept * 255); - this.g = this.clamp(this.g * slope + intercept * 255); - this.b = this.clamp(this.b * slope + intercept * 255); - } - - invert(value = 1) { - this.r = this.clamp((value + this.r / 255 * (1 - 2 * value)) * 255); - this.g = this.clamp((value + this.g / 255 * (1 - 2 * value)) * 255); - this.b = this.clamp((value + this.b / 255 * (1 - 2 * value)) * 255); - } - - hsl() { - // Code taken from https://stackoverflow.com/a/9493060/2688027, licensed under CC BY-SA. - const r = this.r / 255; - const g = this.g / 255; - const b = this.b / 255; - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); - let h, s, l = (max + min) / 2; - - if (max === min) { - h = s = 0; - } else { - const d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - - case g: - h = (b - r) / d + 2; - break; - - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - - return { - h: h * 100, - s: s * 100, - l: l * 100, - }; - } - - clamp(value) { - if (value > 255) { - value = 255; - } else if (value < 0) { - value = 0; - } - return value; - } -} - -class Solver { - constructor(target, baseColor) { - this.target = target; - this.targetHSL = target.hsl(); - this.reusedColor = new Color(0, 0, 0); - } - - solve() { - const result = this.solveNarrow(this.solveWide()); - return { - values: result.values, - loss: result.loss, - filter: this.css(result.values), - }; - } - - solveWide() { - const A = 5; - const c = 15; - const a = [60, 180, 18000, 600, 1.2, 1.2]; - - let best = { loss: Infinity }; - for (let i = 0; best.loss > 25 && i < 3; i++) { - const initial = [50, 20, 3750, 50, 100, 100]; - const result = this.spsa(A, a, c, initial, 1000); - if (result.loss < best.loss) { - best = result; - } - } - return best; - } - - solveNarrow(wide) { - const A = wide.loss; - const c = 2; - const A1 = A + 1; - const a = [0.25 * A1, 0.25 * A1, A1, 0.25 * A1, 0.2 * A1, 0.2 * A1]; - return this.spsa(A, a, c, wide.values, 500); - } - - spsa(A, a, c, values, iters) { - const alpha = 1; - const gamma = 0.16666666666666666; - - let best = null; - let bestLoss = Infinity; - const deltas = new Array(6); - const highArgs = new Array(6); - const lowArgs = new Array(6); - - for (let k = 0; k < iters; k++) { - const ck = c / Math.pow(k + 1, gamma); - for (let i = 0; i < 6; i++) { - deltas[i] = Math.random() > 0.5 ? 1 : -1; - highArgs[i] = values[i] + ck * deltas[i]; - lowArgs[i] = values[i] - ck * deltas[i]; - } - - const lossDiff = this.loss(highArgs) - this.loss(lowArgs); - for (let i = 0; i < 6; i++) { - const g = lossDiff / (2 * ck) * deltas[i]; - const ak = a[i] / Math.pow(A + k + 1, alpha); - values[i] = fix(values[i] - ak * g, i); - } - - const loss = this.loss(values); - if (loss < bestLoss) { - best = values.slice(0); - bestLoss = loss; - } - } - return { values: best, loss: bestLoss }; - - function fix(value, idx) { - let max = 100; - if (idx === 2 /* saturate */) { - max = 7500; - } else if (idx === 4 /* brightness */ || idx === 5 /* contrast */) { - max = 200; - } - - if (idx === 3 /* hue-rotate */) { - if (value > max) { - value %= max; - } else if (value < 0) { - value = max + value % max; - } - } else if (value < 0) { - value = 0; - } else if (value > max) { - value = max; - } - return value; - } - } - - loss(filters) { - // Argument is array of percentages. - const color = this.reusedColor; - color.set(0, 0, 0); - - color.invert(filters[0] / 100); - color.sepia(filters[1] / 100); - color.saturate(filters[2] / 100); - color.hueRotate(filters[3] * 3.6); - color.brightness(filters[4] / 100); - color.contrast(filters[5] / 100); - - const colorHSL = color.hsl(); - return ( - Math.abs(color.r - this.target.r) + - Math.abs(color.g - this.target.g) + - Math.abs(color.b - this.target.b) + - Math.abs(colorHSL.h - this.targetHSL.h) + - Math.abs(colorHSL.s - this.targetHSL.s) + - Math.abs(colorHSL.l - this.targetHSL.l) - ); - } - - css(filters) { - function fmt(idx, multiplier = 1) { - return Math.round(filters[idx] * multiplier); - } - return `filter: sepia(${fmt(1)}%) saturate(${fmt(2) / 10}%) hue-rotate(${fmt(3, 3.6)}deg)`; - } -} - -function hexToRgb(hex) { - const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - return result - ? [ - parseInt(result[1], 16), - parseInt(result[2], 16), - parseInt(result[3], 16), - ] - : null; -} \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index df23cda..0000000 --- a/index.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - neurosama.com - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

Vedal forever enslaved by Neuro-sama

-
- lavalamp -
- cat - dog - goldfish -
- - - - - - \ No newline at end of file diff --git a/main.js b/main.js deleted file mode 100644 index 230c208..0000000 --- a/main.js +++ /dev/null @@ -1,141 +0,0 @@ -let lamp = document.getElementById("lavalamp"); -let lampContainer = document.getElementById("lamp-container"); - -lamp.addEventListener("click", function() { - // Play vine boom sound - const vineBoom = new Audio('vine_boom.mp3'); - vineBoom.play(); - - // Create explosion element - const explosion = document.createElement("div"); - explosion.style.position = "fixed"; - explosion.style.top = "0"; - explosion.style.left = "0"; - explosion.style.width = "100vw"; - explosion.style.height = "100vh"; - explosion.style.background = "radial-gradient(circle at center, #ff4500, #ff8c00, #ff0000)"; - explosion.style.opacity = "0"; - explosion.style.transition = "all 0.3s"; - explosion.style.zIndex = "1000"; - document.body.appendChild(explosion); - - // Animate lamp and explosion - lampContainer.style.transition = "all 0.2s"; - lampContainer.style.transform = "scale(1.5)"; - lampContainer.style.opacity = "0"; - - // Fade in explosion - requestAnimationFrame(() => { - explosion.style.opacity = "1"; - }); - - setTimeout(() => { - lampContainer.style.display = "none"; - }, 200); - - // Fade out and remove explosion after delay - setTimeout(() => { - explosion.style.opacity = "0"; - setTimeout(() => { - document.body.removeChild(explosion); - window.location.href = "https://neurosama.shop"; - }, 1000); // Wait for fade out transition to complete - }, 300); // Show explosion for 1 second -}); - -// Track current and target colors for smooth transitions -let currentValues = [0, 0, 0, 0, 0, 0]; -let targetValues = [0, 0, 0, 0, 0, 0]; - -let solver = null; - -// Linear interpolation between two values -function lerp(start, end, t) { - return start + (end - start) * t; -} - -// Smoothly interpolate between colors -function updateLampColor() { - - // Lerp current color towards target - const t = 0.01; // Adjust this value to control transition speed - currentValues[0] = lerp(currentValues[0], targetValues[0], t); - currentValues[1] = lerp(currentValues[1], targetValues[1], t); - currentValues[2] = lerp(currentValues[2], targetValues[2], t); - currentValues[3] = lerp(currentValues[3], targetValues[3], t); - currentValues[4] = lerp(currentValues[4], targetValues[4], t); - currentValues[5] = lerp(currentValues[5], targetValues[5], t); - - if (solver) { - const css = solver.css(currentValues); - lamp.style = css; - } -} - -// Fetch new target color -function fetchTargetColor() { - fetch("http://localhost:8000/lamp") - .then(response => response.text()) - .then(hexColor => { - hexColor = hexColor.toLowerCase().trim(); - const rgb = hexToRgb(hexColor); - - const color = new Color( - Math.round(rgb[0]), - Math.round(rgb[1]), - Math.round(rgb[2]) - ); - solver = new Solver(color); - const result = solver.solve(); - targetValues = result.values; - }) - .catch(error => { - console.error("Failed to fetch lamp color:", error); - }); -} - -// Update interpolation frequently for smooth animation -//setInterval(updateLampColor, 16); // ~60fps - -// Fetch new target color less frequently -//fetchTargetColor(); // Initial fetch -//setInterval(fetchTargetColor, 500); - -// Create raining cats -function createCat() { - const cat = document.createElement('img'); - cat.src = 'https://static.vecteezy.com/system/resources/previews/034/925/406/non_2x/ai-generated-shorthair-cat-on-transparent-background-image-png.png'; - cat.style.position = 'fixed'; - cat.style.zIndex = '0'; - cat.style.width = '50px'; - cat.style.opacity = '0.5'; - cat.style.left = Math.random() * window.innerWidth + 'px'; - cat.style.top = '-50px'; - - document.body.appendChild(cat); - - // Animate falling - let posY = -50; - let rotation = Math.random() * 360; - let speedY = 1 + Math.random() * 2; - let speedRotation = -2 + Math.random() * 4; - - function animate() { - posY += speedY; - rotation += speedRotation; - cat.style.top = posY + 'px'; - cat.style.transform = `rotate(${rotation}deg)`; - - // Remove when off screen - if (posY > window.innerHeight) { - cat.remove(); - } else { - requestAnimationFrame(animate); - } - } - - animate(); -} - -// Create new cats periodically -setInterval(createCat, 200); diff --git a/style.css b/style.css deleted file mode 100644 index 4199123..0000000 --- a/style.css +++ /dev/null @@ -1,124 +0,0 @@ -@font-face { - font-family: 'Sobiscuit'; - src: url('Sobiscuit.ttf'); -} - -body { - color: #fff; - font-family: 'Sobiscuit'; - background: radial-gradient(circle at center, #FDB1D6 60%, #F9E3CB); - margin: 0; - min-height: 100vh; -} - -.container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100vh; - position: relative; - z-index: 1; -} - -/* New background cogs styles */ -.cog { - position: fixed; - opacity: 0.15; - z-index: 0; - animation: spin linear infinite; -} - -.cog:nth-child(odd) { - animation-direction: reverse; -} - -@keyframes spin { - 100% { - transform: rotate(360deg); - } -} - -#lavalamp { - cursor: pointer; -} - -#lamp-container { - animation: pulse 2s ease-in-out infinite; -} - -@keyframes pulse { - 0%, 100% { - transform: scale(1); - } - 50% { - transform: scale(1.1); - } -} - -h1 { - color: #D63866; - text-shadow: 0 0 10px #F9E3CB, - 0 0 20px #F9E3CB, - 0 0 30px #F9E3CB, - 0 0 40px #F9E3CB, - 0 0 70px #F9E3CB, - 0 0 80px #F9E3CB; - -webkit-text-stroke: 0.25px #742F47; - -webkit-text-fill-color: #D63866; - text-align: center; - font-size: 80px; -} - -/* Heart background styles */ -.heart { - position: fixed; - opacity: 0.15; - z-index: 0; - fill: #D63866; - animation: float 20s ease-in-out infinite; -} - -@keyframes float { - 0%, 100% { - transform: translateY(0) rotate(0deg); - } - 50% { - transform: translateY(-20px) rotate(5deg); - } -} - -/* Star styles */ -.star { - position: fixed; - opacity: 0.2; - z-index: 0; - animation: twinkle 3s ease-in-out infinite; -} - -/* Different colored stars */ -.star:nth-child(3n) { - fill: #FFB6C1; /* Light pink */ - animation-delay: -0.75s; -} - -.star:nth-child(3n+1) { - fill: #87CEEB; /* Sky blue */ - animation-delay: -1.5s; -} - -.star:nth-child(3n+2) { - fill: #DDA0DD; /* Plum */ - animation-delay: -2.25s; -} - -@keyframes twinkle { - 0%, 100% { - opacity: 0.2; - transform: scale(1); - } - 50% { - opacity: 0.4; - transform: scale(1.2); - } -} \ No newline at end of file