mirror of
https://github.com/samvallad33/vestige.git
synced 2026-07-24 23:41:01 +02:00
The July 14 launch surface, previously uncommitted: - /dashboard/launch raw-WebGPU particle "memory brain" hero (RawVestigeEngine, NeuralWordmark, dendrite sign) + DOM waitlist overlay with share/referral. - Supabase waitlist client + migrations + welcome edge function; legacy waitlist archived under supabase/legacy. - vercel.json deploy config, root-redirect env wiring, base-path config, graph-only route, Playwright launch verifiers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
104 lines
2.9 KiB
Svelte
104 lines
2.9 KiB
Svelte
<script lang="ts">
|
|
// Living neural sign: VESTIGE built from REAL
|
|
// grown dendrites (space colonization on the letterforms) with a quiet bloom.
|
|
// Not glow-on-text.
|
|
import { onMount } from 'svelte';
|
|
import { growSign, type DendriteSign } from '$lib/landing/dendriteGen';
|
|
|
|
let sign = $state<DendriteSign | null>(null);
|
|
let reduced = $state(false);
|
|
|
|
onMount(() => {
|
|
reduced = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;
|
|
// grow the dendrites once after fonts are ready (so glyph metrics are right)
|
|
const grow = () => {
|
|
try {
|
|
sign = growSign();
|
|
} catch (e) {
|
|
console.warn('[neural-sign] grow failed:', e);
|
|
}
|
|
};
|
|
if (document.fonts?.ready) {
|
|
document.fonts.load('900 150px Inter').then(() => document.fonts.ready).then(grow).catch(grow);
|
|
} else {
|
|
grow();
|
|
}
|
|
});
|
|
|
|
</script>
|
|
|
|
<div class="neural-sign" class:reduced aria-label="Vestige">
|
|
{#if sign}
|
|
<svg
|
|
viewBox={`0 0 ${sign.width} ${sign.height}`}
|
|
class="sign-svg"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
aria-hidden="true"
|
|
>
|
|
<defs>
|
|
<filter id="ns-bloom" x="-60%" y="-60%" width="220%" height="220%">
|
|
<feGaussianBlur in="SourceAlpha" stdDeviation="1.6" result="b1" />
|
|
<feColorMatrix in="b1" values="0 0 0 0 .22 0 0 0 0 1 0 0 0 0 .62 0 0 0 1 0" result="g1" />
|
|
<feGaussianBlur in="SourceAlpha" stdDeviation="5" result="b2" />
|
|
<feColorMatrix in="b2" values="0 0 0 0 .13 0 0 0 0 .82 0 0 0 0 1 0 0 0 .85 0" result="g2" />
|
|
<feGaussianBlur in="SourceAlpha" stdDeviation="12" result="b3" />
|
|
<feColorMatrix in="b3" values="0 0 0 0 .70 0 0 0 0 .42 0 0 0 0 1 0 0 0 .6 0" result="g3" />
|
|
<feMerge>
|
|
<feMergeNode in="g3" /><feMergeNode in="g2" /><feMergeNode in="g1" />
|
|
<feMergeNode in="SourceGraphic" />
|
|
</feMerge>
|
|
</filter>
|
|
</defs>
|
|
|
|
<!-- the grown dendrites -->
|
|
<g filter="url(#ns-bloom)">
|
|
<g class="dendrites">
|
|
{#each sign.paths as p (p.d)}
|
|
<path d={p.d} stroke={p.col} stroke-width={p.w} stroke-linecap="round" />
|
|
{/each}
|
|
</g>
|
|
</g>
|
|
</svg>
|
|
{/if}
|
|
</div>
|
|
|
|
<style>
|
|
.neural-sign {
|
|
position: fixed;
|
|
top: clamp(0.1rem, 1vh, 0.8rem);
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
z-index: 3;
|
|
width: min(680px, 94vw);
|
|
pointer-events: none;
|
|
}
|
|
.sign-svg {
|
|
width: 100%;
|
|
height: auto;
|
|
display: block;
|
|
overflow: visible;
|
|
}
|
|
|
|
/* PERF: per-path stroke-dashoffset animation on 5700 paths tanks FPS to ~12
|
|
(SVG dashoffset is not GPU-compositable; full paint per path per frame).
|
|
Instead fade in the WHOLE dendrite group with ONE GPU-compositable opacity
|
|
transition. Static dendrites + one group fade = 120fps. */
|
|
.dendrites {
|
|
animation: ns-grow 1.6s ease-out both;
|
|
}
|
|
@keyframes ns-grow {
|
|
from {
|
|
opacity: 0;
|
|
transform: scale(0.92);
|
|
transform-origin: 50% 30%;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: scale(1);
|
|
}
|
|
}
|
|
|
|
.reduced .dendrites {
|
|
animation: none;
|
|
}
|
|
</style>
|