diff --git a/assets/Bongo.gif b/assets/Bongo.gif new file mode 100644 index 0000000..74185b1 Binary files /dev/null and b/assets/Bongo.gif differ diff --git a/assets/hoyooooo.wav b/assets/hoyooooo.wav new file mode 100644 index 0000000..654d37a Binary files /dev/null and b/assets/hoyooooo.wav differ diff --git a/assets/jaxoff_logo.png b/assets/jaxoff_logo.png new file mode 100644 index 0000000..f8b7c15 Binary files /dev/null and b/assets/jaxoff_logo.png differ diff --git a/assets/star_favicon.ico b/assets/star_favicon.ico new file mode 100644 index 0000000..8fd8b3b Binary files /dev/null and b/assets/star_favicon.ico differ diff --git a/css/custom.css b/css/custom.css deleted file mode 100644 index 7d3bcdf..0000000 --- a/css/custom.css +++ /dev/null @@ -1,72 +0,0 @@ -body { - text-align: center; -} - -.palette { -display: flex; -flex-wrap: wrap; -justify-content: center; -margin-bottom: 40px; -} - -.color { -width: 150px; -height: 150px; -display: flex; -align-items: center; -justify-content: center; -color: white; -border-radius: 10px; -margin: 10px; -} - -.light { - color: black; -} - -a { -color: #F5A9B8; -text-decoration: none; -transition: color 0.3s; -} - -a:hover { -color: #5BCEFA; -} - -a:visited { - color: #5BCEFA; -} - -.popup { -display: none; -position: fixed; -top: 50%; -left: 50%; -transform: translate(-50%, -50%); -padding: 20px; -background-color: #040404; -color: white; -border-radius: 10px; -border-color: #fff; -z-index: 1000; -} - -.logo { - width: 5vw; - margin: 0 auto; - display: block; - margin-top: 3em; -} - -.fa-link { - color: #545454; -} - -.jax { - color: #a8c5db; -} - -.overlay { - color: #6D51E3; -} diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000..9f45c1e --- /dev/null +++ b/css/styles.css @@ -0,0 +1,274 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +:root { + --primary-pink: #F5A9B8; + --primary-blue: #5BCFFA; + --white: #FFFFFF; + --dark-bg: #161618; + --gray-blue: #A8C5DB; + --dark-blue: #12354B; + --dark-teal: #12404B; + + --card-bg: rgba(22, 22, 24, 0.85); + --card-border: rgba(91, 207, 250, 0.15); + --card-hover-border: rgba(245, 169, 184, 0.25); + + --shadow-sm: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1); +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, Roboto, Oxygen, Ubuntu, sans-serif; + background-color: var(--dark-bg); + color: var(--white); + min-height: 100vh; + line-height: 1.6; + overflow-x: hidden; +} + +.background-canvas { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; + pointer-events: none; +} + +.main-container { + max-width: 1200px; + margin: 0 auto; + padding: 1rem 1.5rem; + position: relative; +} + +.header { + text-align: center; + padding: 4rem 0 2rem; + margin-bottom: 3rem; + position: relative; +} + +.back-button { + position: absolute; + top: 2rem; + left: 0; + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.75rem 1.5rem; + background: rgba(18, 53, 75, 0.3); + border: 1px solid rgba(91, 207, 250, 0.2); + border-radius: 12px; + color: var(--primary-blue); + text-decoration: none; + font-weight: 600; + transition: border-color 0.2s ease; + z-index: 10; +} + +.back-button:hover { + border-color: var(--primary-blue); +} + +.logo-wrapper { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 2rem; + width: 100%; + height: auto; +} + +.logo { + width: 360px; + height: auto; + object-fit: contain; +} + +.page-title { + font-size: 3.5rem; + font-weight: 800; + background: linear-gradient(135deg, #F5A9B8, #5BCFFA); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin-bottom: 1rem; + letter-spacing: -0.5px; +} + +.page-subtitle { + font-size: 1.25rem; + color: var(--gray-blue); + max-width: 700px; + margin: 0 auto; + opacity: 0.9; + line-height: 1.8; +} + +.bongo { + height: 1.5em; + width: auto; +} + +.footer { + text-align: center; + padding: 3rem 0 1rem; + border-top: 1px solid rgba(91, 207, 250, 0.1); + position: relative; +} + +.footer::before { + content: ''; + position: absolute; + top: -1px; + left: 50%; + transform: translateX(-50%); + width: 100px; + height: 2px; + background: linear-gradient(135deg, #F5A9B8, #5BCFFA); +} + +.footer-text { + font-size: 1.25rem; + color: var(--gray-blue); + margin-bottom: 1rem; +} + +.footer a { + color: rgba(168, 197, 219, 0.6); +} + +.heart { + color: var(--primary-pink); + display: inline-block; + margin: 0 0.25rem; +} + +.copyright { + color: rgba(168, 197, 219, 0.6); + font-size: 0.875rem; +} + +.error { + text-align: center; + padding: 3rem; + color: var(--primary-pink); + background: rgba(245, 169, 184, 0.1); + border-radius: 12px; + border: 1px solid rgba(245, 169, 184, 0.2); +} + +@media (max-width: 768px) { + .main-container { + padding: 1rem; + } + + .header { + padding: 3rem 0 1.5rem; + } + + .back-button { + position: relative; + top: auto; + left: auto; + margin-bottom: 2rem; + } + + .page-title { + font-size: 2.5rem; + } + + .page-subtitle { + font-size: 1.1rem; + } + + .logo { + width: 240 px; + height: auto; + } +} + +@media (max-width: 480px) { + .page-title { + font-size: 2rem; + } + + .logo { + width: 200px; + height: auto; + } + + .back-button { + padding: 0.5rem 1rem; + font-size: 0.875rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .artist-card, + .social-link, + .back-button { + transition: none !important; + } + +} + +body { + text-align: center; +} + +.palette { +display: flex; +flex-wrap: wrap; +justify-content: center; +margin-bottom: 40px; +} + +.color { +width: 150px; +height: 150px; +display: flex; +align-items: center; +justify-content: center; +color: white; +border-radius: 10px; +margin: 10px; +} + +.light { + color: black; +} + +.popup { +display: none; +position: fixed; +top: 50%; +left: 50%; +transform: translate(-50%, -50%); +padding: 20px; +background-color: #040404; +color: white; +border-radius: 10px; +border-color: #fff; +z-index: 1000; +} + +.jax { + color: #a8c5db; +} + +.overlay { + color: white; +} + +.outline { + outline: 1px solid white; +} \ No newline at end of file diff --git a/images/logo.png b/images/logo.png deleted file mode 100644 index 1551c26..0000000 Binary files a/images/logo.png and /dev/null differ diff --git a/index.html b/index.html index 38d1db2..68bf709 100644 --- a/index.html +++ b/index.html @@ -1,86 +1,142 @@ - - - - - - Wow, so many pwetty colours owo - - - - - - - - -

These are the colours I use!

-

Base Colours

-
-
Trans Pink
#F5A9B8
-
Trans Blue
#5BCFFA
-
Trans White
#FFFFFF
-
Text Colour
#F2F5F4
-
Background Colour
#161618
-
- -

Jax' Colours

-
-
Skin
#A8C5DB
-
Tongue
#40397B
-
Dyed Hair
#F5A9B8
-
Natural Hair
#12354B
-
Eyes
#105522
-
Freckles
#12404B
-
- -

Overlay Colours

-
-
#C6F940
-
#6D51E3
-
#1D1E68
-
#255872
-
#FF5E9E
-
#FF95DA
-
#FFF8C8
-
#FF7B7C
-
#1D435C
-
#D47FBC
-
- - - - + + + + + + + + + + + + + 11twink Colours + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + Zurück zu 11tw.ink + + +
+ + + +
+ +

11twink Colours

+
+ + + + + + +

Base Colours

+
+
Trans Pink
#F5A9B8
+
Trans Blue
#5BCFFA
+
Trans White
#FFFFFF
+
Text Colour
#F2F5F4
+
Background Colour
#161618
+
+ + + + +

Jax' Colours

+
+
Skin
#A8C5DB
+
Tongue
#40397B
+
Dyed Hair
#F5A9B8
+
Natural Hair
#12354B
+
Eyes
#105522
+
Freckles
#12404B
+
+ + + + +

Overlay Colours

+
+
#C6F940
+
#6D51E3
+
#1D1E68
+
#255872
+
#FF5E9E
+
#FF95DA
+
#FFF8C8
+
#FF7B7C
+
#1D435C
+
#D47FBC
+
+ + + + + + + \ No newline at end of file diff --git a/js/background.js b/js/background.js new file mode 100644 index 0000000..91c4bf6 --- /dev/null +++ b/js/background.js @@ -0,0 +1,119 @@ +(() => { + document.addEventListener("DOMContentLoaded", () => { + const canvas = document.getElementById("backgroundCanvas"); + if (!canvas) return; + + if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; + + const ctx = canvas.getContext("2d", { alpha: true, desynchronized: true }); + + const isMobile = window.matchMedia("(max-width: 768px)").matches; + const DPR_CAP = Math.min(1.5, isMobile ? 1.0 : 1.25); + + const getOrbCount = () => { + const baseCount = Math.floor((window.innerWidth * window.innerHeight) / 40000); + return Math.min(Math.max(baseCount, isMobile ? 15 : 25), isMobile ? 30 : 50); + }; + + const R_MIN = isMobile ? 3 : 4; + const R_MAX = isMobile ? 8 : 12; + const SPEED = isMobile ? 0.08 : 0.12; + + const PINK = [245, 169, 184]; + const BLUE = [91, 207, 250]; + + let w = 0, h = 0, dpr = 1; + let orbs = []; + let raf = 0; + let last = 0; + + function resize() { + w = window.innerWidth; + h = window.innerHeight; + + dpr = Math.min(DPR_CAP, window.devicePixelRatio || 1); + canvas.width = Math.floor(w * dpr); + canvas.height = Math.floor(h * dpr); + canvas.style.width = w + "px"; + canvas.style.height = h + "px"; + + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + createOrbs(); + last = 0; + } + + function createOrbs() { + const count = getOrbCount(); + orbs = new Array(count); + + for (let i = 0; i < count; i++) { + const r = Math.random() * (R_MAX - R_MIN) + R_MIN; + const color = Math.random() > 0.5 ? PINK : BLUE; + orbs[i] = { + x: Math.random() * w, + y: Math.random() * h, + r, + a: Math.random() * 0.15 + 0.4, + vx: (Math.random() - 0.5) * SPEED, + vy: (Math.random() - 0.5) * SPEED, + color: color + }; + } + } + + function step() { + ctx.clearRect(0, 0, w, h); + + for (let i = 0; i < orbs.length; i++) { + const o = orbs[i]; + o.x += o.vx; + o.y += o.vy; + + const margin = o.r * 3; + if (o.x < -margin) o.x = w + margin; + else if (o.x > w + margin) o.x = -margin; + if (o.y < -margin) o.y = h + margin; + else if (o.y > h + margin) o.y = -margin; + + ctx.beginPath(); + ctx.arc(o.x, o.y, o.r, 0, Math.PI * 2); + ctx.fillStyle = `rgba(${o.color[0]}, ${o.color[1]}, ${o.color[2]}, ${o.a})`; + ctx.fill(); + } + } + + function tick(now) { + if (document.hidden) { + raf = 0; + return; + } + + if (!last) last = now; + if (now - last >= 16) { + last = now; + step(); + } + + raf = requestAnimationFrame(tick); + } + + let resizeTimer; + window.addEventListener("resize", () => { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(resize, 150); + }, { passive: true }); + + document.addEventListener("visibilitychange", () => { + if (document.hidden) { + cancelAnimationFrame(raf); + raf = 0; + } else if (!raf) { + last = 0; + raf = requestAnimationFrame(tick); + } + }); + + resize(); + raf = requestAnimationFrame(tick); + }); +})(); \ No newline at end of file