Mythic Naturecore
Landing Pageheropage_type: hero2026-05-14
Recreate a high-fidelity, premium interactive landing page named "Reverie" using React, TypeScript, and a combination of Tailwind CSS and inline styles. The project must have a smooth, hardware-accelerated scroll-linked animation system, 3D/parallax mouse-tracking effects, responsive layouts, and elegant micro-animations.
- Typography & Global Styles
- Fonts:
- Load the following Google Fonts:
- Headers:
'Viaoda Libre', serif(elegant serif font). - Body, nav links, and captions:
'Imprima', sans-serif(clean, sleek sans-serif font).
- Headers:
- Load the following Google Fonts:
- Global Reset & Base CSS:
html, body { margin: 0; padding: 0; background: #0a0608; scroll-behavior: auto; }- Body font should default to
'Imprima', sans-serif. - Add
scrollbar-gutter: stable;to thehtmltag to prevent layout shifts. - Include an animation utility:
@keyframes bobUp { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
- Assets Asset Mapping
Define these exact asset constants at the top of the file:
const PORTAL_BG = 'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779974947/portal_bg_mu60k9.png';
const CURTAIN_LEFT = 'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779975070/curtain_left_cdht6q.png';
const CURTAIN_RIGHT = 'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779975071/curtain_right_a9bn3i.png';
const WORLD_BG = 'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779975077/world_bg_jzzcn1.jpg';
// The cards MUST remain in this exact order (Card 3, Card 1, Card 2)
const CARD_IMAGES = [
'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779975070/card_3_nbwm25.jpg',
'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779975070/card_2_wr6al6.jpg', // Representing Card 1
'https://res.cloudinary.com/dsdhxhhqh/image/upload/v1779975070/card_1_jz8otj.jpg', // Representing Card 2
];
- State Management & Mathematical Helpers
- Math Utilities:
- Easing curve:
easeInOut(t) = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t - Linear Interpolation:
lerp(a, b, t) = a + (b - a) * t - Constraint:
clamp(val, min, max) = Math.max(min, Math.min(max, val))
- Easing curve:
- Parallax Magnitudes:
MAG.world = 6,MAG.portal = 7,MAG.curtainL = 14,MAG.curtainR = 14
- Hook for Responsiveness:
- Implement a
useIsMobile()hook responding to media query max-width of767pxto dynamically update layouts.
- Implement a
- Scroll Tracking:
- The page height must be exactly
480vh. Inside, a single sticky container spans100vh. - Calculate normalized
scrollProgressfrom0to1by reading window scroll position relative to the scrollable height.
- The page height must be exactly
- Smooth Mouse Tracking (Parallax):
- Normalize coordinates
rx,rybetween-1and1relative to the center of the viewport. - Implement a
requestAnimationFramerender loop (tick) to smoothly interpolate current position towards target cursor position (lerp step speed:0.07) to eliminate frame-rate stutters.
- Normalize coordinates
- Entrance Animation Delays:
- On mount, transition curtains open after
100ms, fade UI in after600ms. Disable entry CSS transitions after2200msso mouse movement doesn't experience lag or delay.
- On mount, transition curtains open after
- Animation Timelines (Scroll & Mouse Parallax)
Apply these precise styling updates in the render loop on every frame:
- World Layer (
WORLD_BG):- Scale: Lerps from
1(at start) to1.18(at maximum scroll). - Parallax:
transform = scale(${scale}) translate3d(${rx * 6}px, ${ry * 6}px, 0)
- Scale: Lerps from
- Portal Frame (
PORTAL_BG):- Scale: Lerps from
1to7.5(creating an immersive zoom-through effect). - Origin:
52% 38% - Opacity: Starts at
1, fades out after65%scroll:clamp(1 - (scrollProgress - 0.65) / 0.2, 0, 1) - Parallax:
transform = scale(${scale}) translate3d(${rx * 7}px, ${ry * 7}px, 0)
- Scale: Lerps from
- Curtain Left (
CURTAIN_LEFT):- Initial Opening Offset:
62%shift left. - Scroll Offset: Moves further leftward up to
150%as eased progress goes0to1. - Curtain Scroll Scale: Lerps from
1to1.3. - Parallax & GPU Layer:
transform = translateX(calc(-${totalShift}% + ${rx * 14}px)) translateY(${ry * 14 * 0.3}px) scale(${curtainScrollScale}) translateZ(0)
- Initial Opening Offset:
- Curtain Right (
CURTAIN_RIGHT):- Symmetrically mirrors Curtain Left.
- Parallax & GPU Layer:
transform = translateX(calc(${totalShift}% + ${rx * 14}px)) translateY(${ry * 14 * 0.3}px) scale(${curtainScrollScale}) translateZ(0)
- Layout & Components
Navigation Bar
- Position: Absolute at the top,
zIndex: 50. Responsive padding:18px 20px(mobile),22px 48px(desktop). - Desktop (>=768px): Split navigation.
- Left side: Links
Worlds,Atelier,Immersions. - Center: SVG Star Logo (clean star shape in path
M14 2l2.09 6.42H23l-5.45 ...inside a28x28viewport). - Right side: Links
Craft,Codex,Connect.
- Left side: Links
- Mobile (<768px): Centered star logo with an
Explorelink on the left and aConnectlink on the right. - Link Styling: uppercase,
12px, letter spacing0.12em, white color with0.9opacity, no text decoration.
Scene 1: Hero Section (Entrance)
- Opacity: Fades out smoothly on scroll:
clamp(1 - scrollProgress / 0.22, 0, 1). - Entrance Transition: Slide upward by
20pxon mount with opacity transition0.9s easedelayed by300ms. - Responsive Layout:
- Mobile (<768px): Center-aligned vertical column. Text is dark brown (
#3b1a0a). Heading:FALL › INTO REVERIE(Viaoda Libre). Subheading paragraph (max-width280px). Below it, displays a single card with imageCARD_IMAGES[0], showing a rounded white play button icon and "View Reel". - Tablet (768px - 1099px): Center-aligned column. Text is dark brown (
#3b1a0a). Headline and paragraph (max-width400px). Shows all 3 cards in a horizontal row:- Card 3: Image
CARD_IMAGES[0], Play button + "View Reel" - Card 1: Image
CARD_IMAGES[1], "32 World Patrons" in large elegant text - Card 2: Image
CARD_IMAGES[2], Play button + "View Reel"
- Card 3: Image
- Desktop (>=1100px): Split-screen horizontal layout. Text is white.
- Left Container: Aligned to the left (top
46%, left60px). Title:FALL › INTO REVERIE(Viaoda Libre). Subheading paragraph. Max-width440px. - Right Container: Aligned to the right (top
50%, right40px). Row of 3 card containers (158px x 158px) with rounded corners (28px), bottom linear gradient, glassmorphic bottom blur (backdropFilter: 'blur(6px)'), play icon buttons or patron metrics overlay.
- Left Container: Aligned to the left (top
- Mobile (<768px): Center-aligned vertical column. Text is dark brown (
- Card Interactive Styling:
- Backdrop blur filter on bottom labels:
backdropFilter: 'blur(6px)', linear gradient to toprgba(0,0,0,0.72) 0%, rgba(0,0,0,0.18) 60%, transparent 100%.
- Backdrop blur filter on bottom labels:
- Slider Dots (Bottom Left):
- Absolutely positioned at bottom left (
60pxdesktop, centered mobile). - Renders 4 horizontal pill indicators: first indicator is wide (
28px), other three are thin (14px), colored in white with opacities.
- Absolutely positioned at bottom left (
- Scroll Cue (Descend):
- Absolutely positioned at
bottom: 36px, centered horizontally. Hidden on mobile. - Text: uppercase "Descend" in
10px, letter-spacing0.22em, colorrgba(255,255,255,0.6). - Icon: A chevron SVG surrounded by a
34px x 34pxround circular border animated with thebobUp 1.8s ease-in-out infinitebounce animation.
- Absolutely positioned at
Scene 2: Call to Action (Forge Beyond)
- Opacity: Fades in on scroll:
clamp((scrollProgress - 0.68) / 0.16, 0, 1). - Layout: Centered vertical flex container (
zIndex: 46), active only when opacity is visible. - Content:
- Centered text wrapper.
- Heading:
FORGE BEYOND THE REAL(Viaoda Libre, size clamp38pxto78px, color#ffffff, letter spacing0.03em, line-height1.05, elegant text shadow0 2px 20px rgba(0,0,0,0.4)). - Paragraph:
Singular voyages to astonishing destinations, shaped for those who seek beauty beyond the ordinary and the known.(Imprima, size20pxdesktop /14pxmobile, max-width480pxdesktop /260pxmobile, line-height1.6, colorrgba(255,255,255,0.82)).