A neon-soaked, scroll-driven web experience built with GSAP, ScrollTrigger, and Lenis. This project blends full-screen video sectors, procedural SVG grid visuals, reactive audio, and cinematic preload transitions into a single interactive "city-grid" journey.
Exploration is a static frontend demo (no build step) with:
- an initial scroll lock + audio consent gateway
- a timed preloader sequence with counter/progress bar
- smooth scroll orchestration via Lenis
- section-based cyber headers animated by GSAP + ScrollTrigger
- smart video preloading/playback with IntersectionObserver
- scroll-reactive glitch audio layers
- dynamic footer SVG draw animation (DrawSVGPlugin fallback included)
- Page boots in locked mode via
setupInitialScrollLock(). - User clicks
STARTin the audio enable panel. - Click SFX plays, preloader opens, counter advances
000 -> 100. - Background music fades in (volume set to
0.5). - At preload completion:
- scroll lock is removed
- geometric SVG grid is generated
- GSAP/Lenis animation systems start
- section scroll audio logic is activated
isInitialScrollLockedblocks wheel, touchmove, and key-based scrolling.- Removed only after user interaction, helping with autoplay/audio compliance and controlled first impression.
- Preloader interval runs every
50msuntil100. .gradient-revealis animated upward for a cinematic "boot" reveal..preloaderfades out and is hidden when startup completes.
- Lenis controls vertical smoothing.
lenis.on("scroll", ScrollTrigger.update)keeps GSAP triggers in sync.- GSAP ticker drives Lenis RAF for consistent timing.
setupSmartSectionVideoPlayback()uses two IntersectionObservers:- one observer "prewarms" nearby videos
- one observer toggles active playback based on viewport proximity
- Offscreen videos pause and drop playback rate to reduce load.
video3mute state adapts to mobile media query.
Each section has its own timeline recipe:
- unique entry direction/skew/rotation for title lines
- accent line scale-in
- kicker/meta reveal
- looping neon text-shadow pulse
This yields distinct moods per sector while keeping a shared visual language.
- Current section is inferred from
scrollYbuckets. - Matching loop (
scrollSound1/2/3) plays while scrolling. - Sounds stop shortly after scrolling ends (
150mstimeout). - Background music loops independently.
- Grid lines are generated dynamically in
setupGeometricBackground(). - Footer SVG is fetched and injected at runtime.
- If
DrawSVGPluginexists, path drawing uses plugin animation. - Fallback mode uses
strokeDasharray/strokeDashoffsetdraw simulation.
- HTML5 (semantic sections + media elements)
- CSS3 (neon gradients, blend modes, responsive breakpoints)
- JavaScript (vanilla)
- GSAP
- ScrollTrigger
- Lenis
- DrawSVGPlugin (optional enhancement with graceful fallback)
All libraries are self-hosted in project root:
gsap.min.jsScrollTrigger.min.jslenis.min.jsDrawSVGPlugin.min.js
index.html-> structure, media elements, sections, footer host, script wiringexploration.css-> full visual system, responsive rules, cyber stylingexploration.js-> preload flow, audio controls, scroll lock, GSAP timelines, observersassets/audio/-> click/preloader/glitch loops/background soundtrackassets/images/-> section videos (desktop/mobile variants), SVG assetsassets/fonts/->PPSupplyMonotypeface
No install required.
- Open this folder.
- Serve with any static server.
- Open
index.htmlin browser. - Click
STARTto unlock the full audio-visual sequence.
Example:
python3 -m http.server 8080Then visit http://localhost:8080.
- Video preloading is staged to avoid loading all heavy media at once.
- Playback only runs near viewport to reduce decode pressure.
- Motion/audio experience is intentionally richer on desktop.
- Mobile breakpoints simplify typography/layout and tune media behavior.
- Demo: Sylenia Inc.
- Sound design/music credit in footer:
@LXSTNGHT
If you want, this README can be extended with deployment snippets (Netlify/Vercel/static hosting), accessibility checklist, or a "how to swap sector videos + sounds" modding guide.