name: mythic-naturecore description: "Use this plugin when the user wants a cinematic mythic-naturecore landing page — the 'Reverie' template: a scroll-linked zoom-through-a-portal hero with mirrored opening curtains, a layered world background, mouse-parallax 3D depth, and an elegant Viaoda-Libre/Imprima serif+sans pairing. Invoke for 'naturecore landing', 'portal scroll page', 'Reverie', 'cinematic parallax hero', or when the user references the Mythic Naturecore template." version: 0.1.0 od: mode: prototype surface: web scenario: design preview: type: html entry: example.html design_system: requires: false
Mythic Naturecore — "Reverie" Cinematic Parallax Landing
Produce a high-fidelity, premium interactive landing page named "Reverie". A complete, rendered reference implementation ships beside this skill at example.html — start from it. Copy example.html, then adjust copy and imagery only; do not rewrite the scroll/parallax math or invent a new visual language. The seed already encodes the exact fonts, asset map, scroll timeline, parallax magnitudes, and entrance sequence below.
The native spec asks for React + TypeScript + Tailwind + inline styles; the bundled seed is vanilla HTML/CSS/JS with the framework features mapped down (no useScroll/useTransform/Framer — a passive scroll listener writes scrollProgress, a requestAnimationFrame loop writes inline transform, a mousemove handler drives the magnetic parallax). When the user explicitly asks for a React/Vite project, port the seed faithfully: same tokens, same layer structure, same math.
This is the authoritative build brief. The named curve constants, magnitudes, scroll heights, and asset URLs are locked.
Stack & fonts
- Default output: the single self-contained
example.htmlseed. - Fonts via Google Fonts
<link>:- Headings:
'Viaoda Libre', serif. - Body, nav links, captions:
'Imprima', sans-serif(also the body default).
- Headings:
Global reset
html, body { margin: 0; padding: 0; background: #0a0608; scroll-behavior: auto; }
html { scrollbar-gutter: stable; } /* prevent layout shift */
body { font-family: 'Imprima', sans-serif; }
@keyframes bobUp { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
Asset map — LOCKED (large stable CDN stills, kept REMOTE)
Define these exact constants at the top of the script. These are big background stills on a stable CDN (res.cloudinary.com); per the inline-vs-remote rule they stay remote — do NOT re-host, swap the host, or inline them.
PORTAL_BG = https://plugin-assets.open-design.ai/plugins/mythic-naturecore/portal_bg_mu60k9-78f20d.webp
CURTAIN_LEFT = https://plugin-assets.open-design.ai/plugins/mythic-naturecore/curtain_left_cdht6q-c85f2f.webp
CURTAIN_RIGHT= https://plugin-assets.open-design.ai/plugins/mythic-naturecore/curtain_right_a9bn3i-1ca8f6.webp
WORLD_BG = https://plugin-assets.open-design.ai/plugins/mythic-naturecore/world_bg_jzzcn1-dfd909.webp
// Cards MUST remain in this exact order (Card 3, Card 1, Card 2):
CARD_IMAGES = [
https://plugin-assets.open-design.ai/plugins/mythic-naturecore/card_3_nbwm25-de0132.webp, // Card 3
https://plugin-assets.open-design.ai/plugins/mythic-naturecore/card_2_wr6al6-b3a8c5.webp, // Card 1
https://plugin-assets.open-design.ai/plugins/mythic-naturecore/card_1_jz8otj-096be2.webp // Card 2
]
Math helpers — LOCKED
easeInOut(t) = t < 0.5 ? 2*t*t : -1 + (4 - 2*t)*t
lerp(a,b,t) = a + (b - a) * t
clamp(v,min,max) = Math.max(min, Math.min(max, v))
MAG = { world: 6, portal: 7, curtainL: 14, curtainR: 14 }
Scroll + mouse system
- Page height is exactly
480vh(#scroll-root); inside it a single sticky#stagespans100vh(position: sticky; top: 0; overflow: hidden). scrollProgress∈[0,1]=clamp(scrollY / (scrollRootHeight - innerHeight), 0, 1), written by a passivescrolllistener.useIsMobile()⇒ amatchMedia('(max-width: 767px)')flag.- Mouse parallax: normalize
rx,ry∈[-1,1]from cursor vs viewport center. ArequestAnimationFrametick()lerps current→target with step0.07every frame (kills frame-rate stutter), then writes inline transforms.
Animation timeline (applied every frame)
- World (
WORLD_BG):scalelerp1 → 1.18;transform = scale(s) translate3d(rx*6px, ry*6px, 0). - Portal (
PORTAL_BG,transform-origin: 52% 38%, above world):scalelerp1 → 7.5(immersive zoom-through);opacity = clamp(1 - (p - 0.65)/0.2, 0, 1);transform = scale(s) translate3d(rx*7px, ry*7px, 0). - Curtain Left (
CURTAIN_LEFT): opening offset 62% left, scrolls further to 150% viaeased:totalShift = 62 + easeInOut(p)*88. Scroll scale lerp1 → 1.3.transform = translateX(calc(-totalShift% + rx*14px)) translateY(ry*14*0.3px) scale(scrollScale) translateZ(0). - Curtain Right (
CURTAIN_RIGHT): symmetric mirror — same buttranslateX(calc(+totalShift% + rx*14px)).
Entrance sequence
Curtains start fully closed (translateX(0)); after 100ms they open to the 62% resting offset; UI fades in after 600ms (opacity + 20px slide-up, 0.9s ease, hero delayed ~300ms). After 2200ms disable the entry CSS transitions so mouse parallax has zero lag.
Layout & components
Navigation (position: absolute; top:0; z-index:50)
- Padding
18px 20pxmobile /22px 48pxdesktop. - Desktop (≥768px): split nav — left links
Worlds · Atelier · Immersions, center SVG star logo (M14 2l2.09 6.42H23l-5.45 …in a 28×28 viewport), right linksCraft · Codex · Connect. - Mobile (<768px): centered star logo,
Exploreon the left,Connecton the right. - Links: uppercase,
12px, letter-spacing0.12em, white, opacity0.9, no underline.
Scene 1 — Hero (z-index: 46)
- Opacity fades out:
clamp(1 - scrollProgress/0.22, 0, 1). Entrance: slide up 20px on mount,0.9s easeopacity, ~300ms delay. - Mobile (<768px): centered column, dark-brown text
#3b1a0a. HeadingFALL › INTO REVERIE(Viaoda Libre). Subheading max-width280px. One card withCARD_IMAGES[0]+ white play button + "View Reel". - Tablet (768–1099px): centered column, dark-brown text. All 3 cards in a row — Card 3 (
CARD_IMAGES[0], Play+"View Reel"), Card 1 (CARD_IMAGES[1], "32 World Patrons" large serif), Card 2 (CARD_IMAGES[2], Play+"View Reel"). - Desktop (≥1100px): split-screen, white text.
- Left (
top:46%; left:60px): titleFALL › INTO REVERIE, subheading, max-width440px. - Right (
top:50%; right:40px): row of 3 cards158×158, radius28px, bottom gradient label withbackdropFilter: blur(6px)and gradientrgba(0,0,0,0.72) 0% → rgba(0,0,0,0.18) 60% → transparent 100%, play icon or patron metric overlay.
- Left (
Slider dots (bottom-left, 60px; centered on mobile)
4 pill indicators: first wide (28px, opacity 1), other three thin (14px, lower opacity), white.
Scroll cue (bottom: 36px, centered; hidden on mobile)
Uppercase "Descend" 10px, letter-spacing 0.22em, rgba(255,255,255,0.6); chevron SVG inside a 34×34 round border animated bobUp 1.8s ease-in-out infinite.
Scene 2 — CTA "Forge Beyond" (z-index: 46)
- Opacity fades in:
clamp((scrollProgress - 0.68)/0.16, 0, 1); centered vertical flex, interactive only when visible. - Heading
FORGE BEYOND THE REAL(Viaoda Libre, clamp38px → 78px,#fff, letter-spacing0.03em, line-height1.05, shadow0 2px 20px rgba(0,0,0,0.4)). - Paragraph (Imprima): "Singular voyages to astonishing destinations, shaped for those who seek beauty beyond the ordinary and the known." —
20pxdesktop /14pxmobile, max-width480pxdesktop /260pxmobile, line-height1.6,rgba(255,255,255,0.82).
Color rules — hard
Cinematic naturecore palette: near-black base #0a0608, warm dark-brown mobile text #3b1a0a, white desktop text, translucent white captions. Keep the serif/sans pairing (Viaoda Libre + Imprima). Do not introduce neon, purple, or flat material accents — the mood is dim, organic, painterly.
Responsive
≥1100pxdesktop split-screen white-text hero;768–1099pxtablet centered 3-card row;<768pxmobile centered single-card dark-brown hero, mobile nav, dots centered, scroll cue hidden.