Initial commit — Singular Particular Space v1

Homepage (site/index.html): integration-v14 promoted, Writings section
integrated with 33 pieces clustered by type (stories/essays/miscellany),
Writings welcome lightbox, content frame at 98% opacity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-27 12:09:22 +02:00
commit 5422131782
359 changed files with 117437 additions and 0 deletions

View File

@@ -0,0 +1,528 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--
DRAFT: Starfield Celestial v4 (The Infinite Night Market)
AUTHOR: Gemini (Designer Agent)
DATE: 2026-03-26
DESCRIPTION:
The "CELESTIAL" pivot: Constellation lines REMOVED per user request.
Focus shifts to "Visible Personality" of nodes and a more atmospheric,
dense star field that feels like a place rather than a UI.
NEW IN THIS VERSION:
- NO CONSTELLATION LINES: The connections are now felt, not seen.
- STAR NODE PERSONALITIES v2:
- Writings (Beacon): Pulsing cross-hair glow.
- Videos (Binary): Orbiting secondary spark.
- Music (Pulsar): Rapid-flicker rhythmic aura.
- Images (Flora): Concentric mint-glow rings (Bioluminescent Moss).
- Playlists (Hearth): Warm amber flame flicker.
- Watchlists (Nebula Point): Soft purple gas cloud halo.
- ToolsnToys (Spark): Sharp, prismatic star-spike.
- Creatorlists (Flow): Trailing mint-green comet dust.
- BOLDER NEBULAE: 6 overlapping washes (Orchid, Paradise, Toucan, Teal, Pink, Purple).
- VAST CELESTIAL FIELD: 3 depth layers, 8-color distribution, rare "Mega Stars" (3px).
- LUSH RUINS SKYLINE: Vertical bioluminescent stripes (Orchid/Mint) on silhouettes.
- TEXT BUMP: 16px star labels (desktop), 13px billboard nav.
AESTHETIC: Vaporwave Ruins + Mad Max Rainforest + Fairy Fire.
-->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Singular Particular Space | Starfield Celestial v4</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Emoji&family=Space+Grotesk:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
:root {
/* The Void */
--bg-void: #04060b;
--bg-deep: #060a14;
--bg-warm: #0d1320;
/* The Fire */
--fire-amber: #e8943a;
--fire-coral: #d4654a;
--paradise: #ff7f3f;
/* The Magic */
--orchid: #c558d9;
--fairy-pink: #f472b6;
--toucan-gold: #ffcf40;
--mint-glow: #86efac;
--neon-teal: #2ac4b3;
--waterfall: #3fbfaf;
--cosmic-purple: #4a1d6e;
/* The Tech Ghost */
--phosphor: #00ff41;
/* The Human */
--text-warm: #e8d5b8;
--text-muted: #6a7a8a;
}
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Space Grotesk', system-ui, -apple-system, sans-serif;
background: var(--bg-void);
color: var(--text-warm);
overflow: hidden;
min-height: 100vh;
}
/* ── CRT Ghost ── */
body::after {
content: '';
position: fixed;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 0, 0, 0.04) 2px,
rgba(0, 0, 0, 0.04) 4px
);
pointer-events: none;
z-index: 9999;
}
/* ── Zone 1: Star Map ── */
#star-zone {
position: relative;
width: 100%; height: 100vh;
overflow: hidden;
background: radial-gradient(circle at 50% 50%, #080c18 0%, var(--bg-void) 100%);
}
#nebula-canvas, #star-canvas {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
}
#nebula-canvas { z-index: 0; }
#star-canvas { z-index: 1; }
/* ── Star Nodes (Personality Layer) ── */
.star-node {
position: absolute;
z-index: 10;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
cursor: pointer;
transform: translate(-50%, -50%);
outline: none;
border: none;
background: none;
padding: 0;
font-family: inherit;
}
.star-visual {
position: relative;
width: 40px; height: 40px;
display: flex; align-items: center; justify-content: center;
}
.star-dot {
width: 8px; height: 8px;
border-radius: 50%;
background: #fff;
transition: width 150ms ease, height 150ms ease, box-shadow 150ms ease, background 150ms ease;
box-shadow: 0 0 6px rgba(255,255,255,0.8);
z-index: 5;
}
.star-label {
font-size: 16px;
font-weight: 500;
color: var(--text-muted);
letter-spacing: 0.04em;
text-transform: lowercase;
white-space: nowrap;
opacity: 0;
transition: opacity 200ms ease, color 150ms ease;
pointer-events: none;
user-select: none;
}
.star-node:hover .star-label,
.star-node:focus .star-label,
.star-node.current .star-label { opacity: 1; color: var(--text-warm); }
/* Star Bloom (The Campfire Follows You) */
.star-node:hover .star-dot,
.star-node:focus .star-dot,
.star-node.current .star-dot {
width: 20px; height: 20px;
background: var(--fire-amber) !important;
box-shadow: 0 0 12px var(--fire-amber) !important;
}
/* Personality 1: Writings (The Beacon) */
.star-node[data-star="writings"] .star-dot { background: var(--star-blue, #a0c4ff); box-shadow: 0 0 8px #a0c4ff; }
.star-node[data-star="writings"] .star-visual::before {
content: ''; position: absolute; width: 1px; height: 100%; background: var(--orchid); opacity: 0.15;
animation: beacon-pulse 4s ease-in-out infinite;
}
.star-node[data-star="writings"] .star-visual::after {
content: ''; position: absolute; width: 100%; height: 1px; background: var(--orchid); opacity: 0.15;
animation: beacon-pulse 4s ease-in-out infinite;
}
@keyframes beacon-pulse { 0%, 100% { opacity: 0.05; } 50% { opacity: 0.25; } }
/* Personality 2: Videos (The Binary) */
.star-node[data-star="videos"] .star-dot { background: var(--fire-coral); box-shadow: 0 0 8px var(--fire-coral); }
.star-node[data-star="videos"] .star-visual::before {
content: ''; position: absolute; width: 4px; height: 4px; border-radius: 50%;
background: #fff; opacity: 0.6;
animation: binary-orbit 3s linear infinite;
}
@keyframes binary-orbit {
from { transform: rotate(0deg) translateX(12px) rotate(0deg); }
to { transform: rotate(360deg) translateX(12px) rotate(-360deg); }
}
/* Personality 3: Music (The Pulsar) */
.star-node[data-star="music"] .star-dot { background: var(--neon-teal); box-shadow: 0 0 8px var(--neon-teal); }
.star-node[data-star="music"] .star-visual::before {
content: ''; position: absolute; inset: 0; border: 1px solid var(--neon-teal); border-radius: 50%;
animation: pulsar-aura 2s ease-out infinite;
}
@keyframes pulsar-aura { 0% { transform: scale(0.2); opacity: 0.6; } 100% { transform: scale(1.2); opacity: 0; } }
/* Personality 4: Images (The Flora) */
.star-node[data-star="images"] .star-dot { background: var(--mint-glow); box-shadow: 0 0 8px var(--mint-glow); }
.star-node[data-star="images"] .star-visual::before {
content: '✿'; position: absolute; color: var(--mint-glow); font-size: 10px; top: -12px; opacity: 0.4;
}
.star-node[data-star="images"] .star-visual::after {
content: '✿'; position: absolute; color: var(--mint-glow); font-size: 10px; bottom: -12px; opacity: 0.4;
}
/* Personality 5: Playlists (The Hearth) */
.star-node[data-star="playlists"] .star-dot { background: var(--toucan-gold); box-shadow: 0 0 10px var(--toucan-gold); }
.star-node[data-star="playlists"] .star-visual::before {
content: ''; position: absolute; width: 24px; height: 24px; border-radius: 50%;
background: radial-gradient(circle, var(--fire-amber) 0%, transparent 70%);
animation: hearth-glow 3s ease-in-out infinite;
}
@keyframes hearth-glow { 0%, 100% { opacity: 0.1; transform: scale(0.8); } 50% { opacity: 0.3; transform: scale(1.1); } }
/* Personality 6: Watchlists (The Nebula Point) */
.star-node[data-star="watchlists"] .star-dot { background: var(--orchid); box-shadow: 0 0 8px var(--orchid); }
.star-node[data-star="watchlists"] .star-visual::before {
content: ''; position: absolute; width: 30px; height: 20px; border-radius: 50%;
background: rgba(197, 88, 217, 0.1); filter: blur(4px);
}
/* Personality 7: ToolsnToys (The Spark) */
.star-node[data-star="toolsntoys"] .star-dot { background: var(--fairy-pink); box-shadow: 0 0 10px var(--fairy-pink); }
.star-node[data-star="toolsntoys"] .star-visual::before {
content: '+'; position: absolute; color: var(--fairy-pink); font-size: 18px; top: -14px; opacity: 0.5;
}
/* Personality 8: Creatorlists (The Flow) */
.star-node[data-star="creatorlists"] .star-dot { background: var(--waterfall); box-shadow: 0 0 8px var(--waterfall); }
.star-node[data-star="creatorlists"] .star-visual::before {
content: ':::'; position: absolute; color: var(--waterfall); left: 24px; font-size: 10px; opacity: 0.4; letter-spacing: 2px;
}
/* ── Transition Zone: Skyline ── */
#transition-zone {
position: relative;
width: 100%; height: 75vh;
background: linear-gradient(to bottom,
var(--bg-void) 0%,
#080a14 30%,
#0d0e1a 60%,
var(--bg-warm) 100%);
overflow: hidden;
}
#skyline {
position: absolute;
bottom: 0; left: 0;
width: 100%; height: 70%;
display: flex; align-items: flex-end; justify-content: center;
}
.building {
background: #05070c;
flex-shrink: 0;
position: relative;
border-top: 1px solid rgba(232, 148, 58, 0.05);
}
.building.bio-orchid::before {
content: ''; position: absolute; top: 10%; left: 0; width: 2px; height: 35%;
background: var(--orchid); box-shadow: 0 0 6px var(--orchid); opacity: 0.12;
}
.building.bio-mint::after {
content: ''; position: absolute; top: 20%; right: 0; width: 1px; height: 45%;
background: var(--mint-glow); box-shadow: 0 0 6px var(--mint-glow); opacity: 0.1;
}
.billboard-nav {
position: absolute;
top: -2px; left: 50%;
transform: translate(-50%, -100%);
padding: 3px 10px;
font-size: 13px; font-weight: 500;
border: 1px solid;
background: rgba(4, 6, 11, 0.95);
white-space: nowrap;
text-decoration: none;
transition: all 150ms ease;
}
.bb-teal { color: var(--neon-teal); border-color: rgba(42,196,179,0.25); }
.bb-amber { color: var(--fire-amber); border-color: rgba(232,148,58,0.25); }
.bb-orchid{ color: var(--orchid); border-color: rgba(197,88,217,0.25); }
.bb-pink { color: var(--fairy-pink); border-color: rgba(244,114,182,0.25); }
.bb-gold { color: var(--toucan-gold);border-color: rgba(255,207,64,0.25); }
.billboard-nav:hover {
color: #fff; background: var(--fire-amber); border-color: var(--fire-amber);
}
/* ── Lightbox: Campfire Note ── */
#lightbox-overlay {
position: fixed; inset: 0;
background: rgba(0, 0, 0, 0.85);
z-index: 10000;
display: flex; align-items: center; justify-content: center;
}
#lightbox-overlay.hidden { display: none; }
#lightbox {
background: var(--bg-warm);
border: 1px solid var(--fire-amber);
border-top: 2px solid var(--phosphor);
border-radius: 4px;
padding: 40px;
max-width: 500px; width: 90%;
text-align: center;
position: relative;
}
#lightbox::after {
content: ''; position: absolute; inset: 6px;
border: 1px solid rgba(197, 88, 217, 0.12);
pointer-events: none; border-radius: 2px;
}
#lightbox p {
font-size: 16px; line-height: 1.7;
color: var(--text-warm); margin-bottom: 24px;
}
.nav-hint {
font-size: 14px; color: var(--text-muted);
margin-bottom: 30px; display: block;
}
#lightbox-enter {
padding: 10px 32px;
font-size: 14px; font-weight: 600;
color: var(--bg-void); background: var(--fire-amber);
border: none; border-radius: 4px; cursor: pointer;
transition: opacity 150ms;
}
#lightbox-enter:hover { opacity: 0.9; }
</style>
</head>
<body>
<div id="star-zone">
<canvas id="nebula-canvas"></canvas>
<canvas id="star-canvas"></canvas>
</div>
<div id="transition-zone">
<div id="skyline"></div>
</div>
<div id="lightbox-overlay" class="hidden">
<div id="lightbox">
<p>Hello traveller, welcome to a singular, particular space. Feel free to explore this little pocket of the universe. It's an adventure, bring snacks. Happy wanderings, Myster Wizzard</p>
<span class="nav-hint">click stars to explore &middot; arrow keys to navigate &middot; escape to return</span>
<button id="lightbox-enter">Enter</button>
</div>
</div>
<script>
(function() {
'use strict';
const STARS = [
{ id: 'writings', label: 'Writings', x: 25, y: 18 },
{ id: 'videos', label: 'Videos', x: 68, y: 15 },
{ id: 'music', label: 'Music', x: 12, y: 42 },
{ id: 'images', label: 'Images', x: 55, y: 35 },
{ id: 'playlists', label: 'Playlists', x: 78, y: 48 },
{ id: 'watchlists', label: 'Watchlists', x: 22, y: 65 },
{ id: 'toolsntoys', label: 'ToolsnToys', x: 50, y: 72 },
{ id: 'creatorlists', label: 'Creatorlists', x: 75, y: 70 }
];
const nebulaCanvas = document.getElementById('nebula-canvas');
const starCanvas = document.getElementById('star-canvas');
const nCtx = nebulaCanvas.getContext('2d');
const sCtx = starCanvas.getContext('2d');
let bgStars = [];
function resize() {
nebulaCanvas.width = starCanvas.width = window.innerWidth;
nebulaCanvas.height = starCanvas.height = window.innerHeight;
drawNebulae();
initStars();
}
function drawNebulae() {
nCtx.clearRect(0, 0, nebulaCanvas.width, nebulaCanvas.height);
const w = nebulaCanvas.width, h = nebulaCanvas.height;
// BOLDER washes: Orchid, Paradise, Toucan, Teal, Pink, Purple
const washes = [
{ x: 0.2, y: 0.25, r: 0.5, c: 'rgba(197, 88, 217, 0.08)' }, // Orchid
{ x: 0.8, y: 0.15, r: 0.6, c: 'rgba(255, 127, 63, 0.06)' }, // Paradise
{ x: 0.5, y: 0.6, r: 0.5, c: 'rgba(255, 207, 64, 0.05)' }, // Toucan
{ x: 0.1, y: 0.7, r: 0.5, c: 'rgba(42, 196, 179, 0.07)' }, // Teal
{ x: 0.7, y: 0.8, r: 0.4, c: 'rgba(244, 114, 182, 0.06)' }, // Fairy Pink
{ x: 0.4, y: 0.1, r: 0.4, c: 'rgba(74, 29, 110, 0.08)' } // Purple
];
washes.forEach(wash => {
const grad = nCtx.createRadialGradient(
wash.x * w, wash.y * h, 0,
wash.x * w, wash.y * h, wash.r * w
);
grad.addColorStop(0, wash.c);
grad.addColorStop(1, 'transparent');
nCtx.fillStyle = grad;
nCtx.fillRect(0, 0, w, h);
});
}
function initStars() {
bgStars = [];
const colorPool = [
'200,210,230', // Cool White
'240,220,190', // Warm White
'140,180,230', // Pale Blue
'255,207,64', // Toucan Gold
'244,114,182', // Fairy Pink
'197,88,217', // Orchid
'134,239,172', // Mint Green
'212,101,74' // Coral
];
const count = window.innerWidth < 480 ? 250 : 450;
for (let i = 0; i < count; i++) {
const r = Math.random() < 0.05 ? 2.5 + Math.random() : (Math.random() < 0.7 ? 0.4 + Math.random() : 1.2 + Math.random());
bgStars.push({
x: Math.random() * starCanvas.width,
y: Math.random() * starCanvas.height,
r: r,
color: colorPool[Math.floor(Math.random() * colorPool.length)],
opacity: 0.3 + Math.random() * 0.5,
speed: 0.4 + Math.random() * 0.8,
phase: Math.random() * Math.PI * 2
});
}
}
function draw(time) {
sCtx.clearRect(0, 0, starCanvas.width, starCanvas.height);
const t = time * 0.001;
bgStars.forEach(s => {
const a = s.opacity + Math.sin(t * s.speed + s.phase) * 0.2;
sCtx.beginPath();
sCtx.arc(s.x, s.y, s.r, 0, Math.PI * 2);
sCtx.fillStyle = `rgba(${s.color}, ${Math.max(0.1, Math.min(1, a))})`;
sCtx.fill();
});
requestAnimationFrame(draw);
}
// Nodes
const starZone = document.getElementById('star-zone');
STARS.forEach(s => {
const btn = document.createElement('button');
btn.className = 'star-node';
btn.dataset.star = s.id;
btn.style.left = s.x + '%';
btn.style.top = s.y + '%';
btn.innerHTML = `<div class="star-visual"><span class="star-dot"></span></div><span class="star-label">${s.label}</span>`;
starZone.appendChild(btn);
});
// Skyline
function initSkyline() {
const skyline = document.getElementById('skyline');
const bbColors = ['bb-teal', 'bb-amber', 'bb-orchid', 'bb-pink', 'bb-gold'];
const winColors = ['#e8943a', '#2ac4b3', '#c558d9', '#f472b6', '#00ff41'];
for (let i = 0; i < 42; i++) {
const b = document.createElement('div');
b.className = 'building';
const bio = Math.random();
if (bio > 0.9) b.classList.add('bio-orchid');
else if (bio > 0.8) b.classList.add('bio-mint');
const w = 20 + Math.random() * 50;
const h = 50 + Math.random() * 300;
b.style.width = w + 'px';
b.style.height = h + 'px';
b.style.marginRight = '2px';
if (h > 100) {
for (let j = 0; j < Math.floor(h/30); j++) {
if (Math.random() > 0.6) continue;
const win = document.createElement('div');
const wc = winColors[Math.floor(Math.random()*winColors.length)];
win.style.cssText = `position:absolute; width:2px; height:2px; background:${wc}; opacity:${0.1 + Math.random()*0.2}; left:${Math.random()*w}px; top:${20+j*25}px;`;
b.appendChild(win);
}
}
if (Math.random() > 0.85) {
const bb = document.createElement('a');
bb.className = 'billboard-nav ' + bbColors[Math.floor(Math.random()*bbColors.length)];
bb.textContent = 'SIGNAL';
bb.href = '#';
b.appendChild(bb);
}
skyline.appendChild(b);
}
}
// Lightbox
const overlay = document.getElementById('lightbox-overlay');
if (!localStorage.getItem('sp-welcomed')) overlay.classList.remove('hidden');
document.getElementById('lightbox-enter').onclick = () => {
overlay.classList.add('hidden');
localStorage.setItem('sp-welcomed', 'true');
};
window.onresize = resize;
resize();
initSkyline();
requestAnimationFrame(draw);
})();
</script>
</body>
</html>