import { useState, useEffect, useRef } from "react";
/* ── Win98 panel helpers ─────────────────────────────── */
const win98Panel = {
background: "#c0c0c0",
boxShadow:
"inset -1px -1px #0a0a0a, inset 1px 1px #fff, inset -2px -2px #808080, inset 2px 2px #dfdfdf",
};
const win98Sunken = {
background: "#fff",
boxShadow:
"inset 1px 1px #0a0a0a, inset -1px -1px #fff, inset 2px 2px #808080, inset -2px -2px #dfdfdf",
};
const win98Button = {
background: "#c0c0c0",
boxShadow:
"inset -1px -1px #0a0a0a, inset 1px 1px #fff, inset -2px -2px #808080, inset 2px 2px #dfdfdf",
border: "none",
padding: "2px 8px",
cursor: "pointer",
fontFamily: '"Comic Neue", "Comic Sans MS", cursive',
fontSize: "11px",
};
/* ── Title bar ───────────────────────────────────────── */
function TitleBar({ title, icon }: { title: string; icon?: string }) {
return (
{icon && {icon} }
{title}
{["_", "□", "✕"].map((c, i) => (
{c}
))}
);
}
/* ── Window wrapper ──────────────────────────────────── */
function Win98Window({
title,
icon,
children,
style,
}: {
title: string;
icon?: string;
children: React.ReactNode;
style?: React.CSSProperties;
}) {
return (
);
}
/* ── Hit counter ─────────────────────────────────────── */
function HitCounter({ count }: { count: number }) {
const digits = String(count).padStart(7, "0").split("");
return (
{digits.map((d, i) => (
{d}
))}
);
}
/* ── Blinking text ───────────────────────────────────── */
function Blink({ children, color = "#ff00ff" }: { children: React.ReactNode; color?: string }) {
const [vis, setVis] = useState(true);
useEffect(() => {
const id = setInterval(() => setVis((v) => !v), 600);
return () => clearInterval(id);
}, []);
return (
{children}
);
}
/* ── Marquee ─────────────────────────────────────────── */
function Marquee({ text, color = "#ffff00" }: { text: string; color?: string }) {
const ref = useRef(null);
const innerRef = useRef(null);
const [offset, setOffset] = useState(0);
useEffect(() => {
let raf: number;
let pos = 0;
const tick = () => {
if (ref.current && innerRef.current) {
const containerW = ref.current.offsetWidth;
const textW = innerRef.current.offsetWidth;
pos -= 1.2;
if (pos < -textW) pos = containerW;
setOffset(pos);
}
raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
return () => cancelAnimationFrame(raf);
}, []);
return (
{text}
);
}
/* ── Music player ────────────────────────────────────── */
function MusicPlayer() {
const [playing, setPlaying] = useState(false);
const [track, setTrack] = useState(0);
const tracks = [
{ title: "Numa Numa - O-Zone", dur: "3:28" },
{ title: "All Star - Smash Mouth", dur: "3:15" },
{ title: "Never Gonna Give You Up", dur: "3:33" },
{ title: "Dragostea Din Tei", dur: "3:39" },
];
return (
♪ NOW PLAYING ♪
{tracks[track].title}
{playing ? "▶ PLAYING" : "⏸ PAUSED"} — {tracks[track].dur}
{[
{ lbl: "⏮", act: () => setTrack((t) => (t - 1 + tracks.length) % tracks.length) },
{ lbl: playing ? "⏸" : "▶", act: () => setPlaying((p) => !p) },
{ lbl: "⏹", act: () => { setPlaying(false); } },
{ lbl: "⏭", act: () => setTrack((t) => (t + 1) % tracks.length) },
].map(({ lbl, act }, i) => (
{lbl}
))}
{tracks.map((t, i) => (
{ setTrack(i); setPlaying(true); }}
style={{
cursor: "pointer",
color: i === track ? "#00ff00" : "#555",
padding: "1px 0",
}}
>
{i === track ? "▶" : " "} {i + 1}. {t.title}
))}
);
}
/* ── Guestbook ───────────────────────────────────────── */
const initialEntries = [
{ name: "xXdarkangel99Xx", msg: "OMG ur site is so kewl!!!! add me on MSN!!! ^_^", date: "2003-08-14" },
{ name: "StarlightDreamer", msg: "I luv ur backgrounds!! Where did u get them??", date: "2003-08-12" },
{ name: "TechnoWizard2000", msg: "FIRST!!! great site lol ur the best", date: "2003-08-11" },
{ name: "pinkbutterfli", msg: "added ur button 2 my site!! link me back plz :3", date: "2003-08-09" },
];
function Guestbook() {
const [entries, setEntries] = useState(initialEntries);
const [name, setName] = useState("");
const [msg, setMsg] = useState("");
const [signed, setSigned] = useState(false);
const submit = () => {
if (!name.trim() || !msg.trim()) return;
setEntries([{ name, msg, date: "2003-08-15" }, ...entries]);
setName("");
setMsg("");
setSigned(true);
};
return (
{signed && (
✓ ENTRY ADDED!! TY 4 SIGNING!!!
)}
setName(e.target.value)}
style={{ ...win98Sunken, width: "100%", padding: "2px 4px", fontFamily: '"Comic Neue", cursive', fontSize: "11px", boxSizing: "border-box", marginBottom: 3 }}
/>
{entries.map((e, i) => (
{e.name}
{e.msg}
{e.date}
))}
);
}
/* ── Badge ───────────────────────────────────────────── */
function Badge({ text, bg, fg }: { text: string; bg: string; fg: string }) {
return (
{text}
);
}
/* ── Blog post ───────────────────────────────────────── */
function BlogPost({
date,
title,
mood,
music,
children,
imgUrl,
imgAlt,
}: {
date: string;
title: string;
mood: string;
music: string;
children: React.ReactNode;
imgUrl?: string;
imgAlt?: string;
}) {
return (
🌡 Mood: {mood}
🎵 Listening: {music}
{imgUrl && (
{imgAlt}
)}
{children}
);
}
/* ── Meme card ───────────────────────────────────────── */
function MemeCard({ topText, bottomText, imgUrl, alt }: { topText: string; bottomText: string; imgUrl: string; alt: string }) {
return (
{topText}
{bottomText}
);
}
/* ── Photo gallery ───────────────────────────────────── */
function PhotoGallery() {
const [selected, setSelected] = useState(null);
const photos = [
{ url: "https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=200&h=150&fit=crop&auto=format", cap: "my kitteh Mr. Whiskers!!" },
{ url: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=200&h=150&fit=crop&auto=format", cap: "mountains r so pretty" },
{ url: "https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=200&h=150&fit=crop&auto=format", cap: "morning coffee b4 school" },
{ url: "https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?w=200&h=150&fit=crop&auto=format", cap: "yellow flowers = happiness" },
{ url: "https://images.unsplash.com/photo-1501854140801-50d01698950b?w=200&h=150&fit=crop&auto=format", cap: "camping last summer!!" },
{ url: "https://images.unsplash.com/photo-1518791841217-8f162f1912da?w=200&h=150&fit=crop&auto=format", cap: "another cat lol ^_^" },
];
return (
{photos.map((p, i) => (
setSelected(p)}
style={{
cursor: "pointer",
border: "2px solid #808080",
padding: 2,
background: "#fff",
transition: "border-color 0.1s",
}}
onMouseEnter={(e) => (e.currentTarget.style.borderColor = "#ff00ff")}
onMouseLeave={(e) => (e.currentTarget.style.borderColor = "#808080")}
>
{p.cap}
))}
{selected && (
setSelected(null)}
style={{
position: "fixed",
inset: 0,
background: "rgba(0,0,0,0.85)",
zIndex: 9999,
display: "flex",
alignItems: "center",
justifyContent: "center",
cursor: "pointer",
}}
>
{selected.cap}
[click anywhere to close]
)}
);
}
/* ── About Me sidebar ────────────────────────────────── */
function AboutMe() {
return (
~*~ aetherbiome ~*~
aka: cosmic_cat_gurl
{[
["age", "17 (VIRGO!!)"],
["location", "somewhere, USA"],
["status", "single *hint hint*"],
["aim", "cosmiccat2003"],
["fav band", "Linkin Park ♥"],
["fav movie", "The Matrix"],
["fav food", "pizza + ramen"],
["pets", "2 cats 1 frog"],
].map(([k, v]) => (
{k}:
{v}
))}
♥ UNDER CONSTRUCTION ♥
);
}
/* ── Links / web ring ────────────────────────────────── */
function FriendLinks() {
const links = [
"xXshadowkingXx",
"glitterberry99",
"techno_witch",
"pikachu_forever",
"darkrose_dreams",
"neon_butterfly",
];
return (
{links.map((l) => (
➤ {l}.geocities.com
))}
♦ WEB RING ♦
◄ Prev
Random
Next ►
);
}
/* ── Main App ────────────────────────────────────────── */
export default function App() {
const [hitCount] = useState(1337842);
const [activeTab, setActiveTab] = useState<"blog" | "photos" | "memes">("blog");
/* tiled star background */
const starBg: React.CSSProperties = {
minHeight: "100vh",
background: `
radial-gradient(1px 1px at 10% 20%, rgba(255,255,255,0.9) 0%, transparent 100%),
radial-gradient(1px 1px at 30% 65%, rgba(255,255,255,0.7) 0%, transparent 100%),
radial-gradient(1px 1px at 50% 15%, rgba(255,255,255,0.8) 0%, transparent 100%),
radial-gradient(1px 1px at 70% 45%, rgba(255,255,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 85% 80%, rgba(255,255,255,0.9) 0%, transparent 100%),
radial-gradient(2px 2px at 20% 85%, rgba(255,200,255,0.8) 0%, transparent 100%),
radial-gradient(2px 2px at 60% 35%, rgba(200,200,255,0.7) 0%, transparent 100%),
radial-gradient(2px 2px at 90% 10%, rgba(255,255,200,0.8) 0%, transparent 100%),
#000033
`,
fontFamily: '"Comic Neue", "Comic Sans MS", cursive',
padding: "8px",
boxSizing: "border-box",
};
const tabStyle = (tab: typeof activeTab): React.CSSProperties => ({
...win98Button,
padding: "3px 10px",
fontSize: "12px",
fontWeight: tab === activeTab ? "bold" : "normal",
background: tab === activeTab ? "#fff" : "#c0c0c0",
boxShadow:
tab === activeTab
? "inset 1px 1px #0a0a0a, inset -1px -1px #fff"
: win98Button.boxShadow as string,
});
return (
{/* ── Marquee ── */}
{/* ── Header disclaimer window ── */}
{["OPTIMISED FOR DESKTOP USE", "MAY CONTAIN FLASHING IMAGES", "ACCESSIBILITY NOT GUARANTEED"].map((s) => (
{s}
))}
{/* ── Site title banner ── */}
★ AETHERBIOME ★
~ a place 4 my thots + vibes + stuff ~
✨
✨
⭐
⭐
{/* ── Main layout ── */}
{/* ── Left sidebar ── */}
u r visitor #:
since jan 1 2003!!
{/* ── Main content ── */}
{/* Tab bar */}
{(["blog", "photos", "memes"] as const).map((tab) => (
setActiveTab(tab)}>
{tab === "blog" ? "📝 BLOG" : tab === "photos" ? "📸 PHOTOS" : "😂 MEMES"}
))}
{/* Blog tab */}
{activeTab === "blog" && (
ok so u guys wont BELIEVE what happened at school today!!! so basically i was sitting in math class (ugh mr. henderson is THE WORST btw) and my friend ashley passes me this note and its like "josh likes u!!" and i literally almost DIED lmaoooo 😭😭
anyway afterwards we went to the mall and i got this SUPER cute hoodie from hot topic it has a Invader Zim design on it and its black w/ purple stars so basically its perfect lol
also i updated my layout!! new background = stars because space is so mysterious and deep like my soul lol jk jk. comment if u like it!!
p.s. if ur reading this josh please stop its creepy thx 😤
took this quiz called "what kind of anime character r u" and got mysterious lone wolf which is SO accurate its kinda scary lol
mr whiskers sat on my homework AGAIN while i was trying to study for the history test. honestly he is the most chaotic creature alive and i love him
current obsessions: FLCL | Ghost in the Shell | DDR (got an A on Butterfly finally!!)
ok so ive been thinking about this a LOT. what if we are literally living in a simulation right now?? like the Matrix but real?? because think about it — deja vu is literally a glitch in the matrix (they say this in the movie!!) and i have deja vu ALL THE TIME
also my friend told me about this book called simulacra and simulation by baudrillard and neo literally has it in the movie so im gonna try to read it even tho it sounds hard lol
anyway if ur a robot reading this: HELLO ROBOT
)}
{/* Photos tab */}
{activeTab === "photos" && (
)}
{/* Memes tab */}
{activeTab === "memes" && (
WARNING: EXTREMELY DANK CONTENT AHEAD
{" "}— not 4 the faint of heart!!
► MEME OF THE WEEK: "All your base are belong to us" — still funny. will always be funny. if u dont know this meme we cant be friends.
)}
{/* ── Right sidebar ── */}
"We are the music makers, and we are the dreamers of dreams."
— Willy Wonka
{[
["eating", "ramen + pocky"],
["reading", "sandman vol 3"],
["watching", "FLCL (rewatch)"],
["playing", "Kingdom Hearts"],
["mood", "chaotic neutral"],
["aim status", "away (brb)"],
].map(([k, v]) => (
{k}:
{v}
))}
{[
"#ff00ff", "#00ffff", "#ffff00", "#ff6600",
"#00ff00", "#800080", "#000080", "#008080",
].map((c) => (
))}
{/* ── Footer ── */}
© 2003 aetherbiome — all wrongs reserved | no hotlinking!! | best viewed 800×600
✨ thx 4 visiting!! ✨
);
}
/* ── Poll widget ─────────────────────────────────────── */
function Poll() {
const options = [
{ label: "Linkin Park", votes: 42 },
{ label: "Avril Lavigne", votes: 28 },
{ label: "Evanescence", votes: 35 },
{ label: "Good Charlotte", votes: 19 },
];
const [voted, setVoted] = useState(null);
const [counts, setCounts] = useState(options.map((o) => o.votes));
const total = counts.reduce((a, b) => a + b, 0);
const vote = (i: number) => {
if (voted !== null) return;
setVoted(i);
setCounts((c) => c.map((v, idx) => (idx === i ? v + 1 : v)));
};
return (
fav early 2000s artist??
{options.map((o, i) => (
vote(i)}
style={{
cursor: voted === null ? "pointer" : "default",
color: voted === i ? "#800080" : "#000",
fontWeight: voted === i ? "bold" : "normal",
textDecoration: voted === null ? "underline" : "none",
}}
>
{o.label}
{voted !== null && (
{Math.round((counts[i] / (total + (voted === i ? 1 : 0))) * 100)}%
)}
{voted !== null && (
a + b, 0)) * 100}%`,
background: i === voted ? "#800080" : "#000080",
}}
/>
)}
))}
{voted === null && (
click to vote!!
)}
{voted !== null && (
voted!! ty!! ✓
)}
);
}