- Home
- Skills
- Frontend & Web Apps
- Cinematic Landing Page Engine
More screenshots
Works with the AI tools you already use
Cinematic Landing Page Engine
Generates scroll-driven cinematic landing pages — full React or vanilla code, not just design specs.
$29
Cinematic Landing Page Engine
Example session with this skill installed
Build me a cinematic landing page for Notely, an AI meeting-notes app
launching its waitlist. Tone: restrained/luxury, like an Apple product
page. Stack: React + Tailwind + Framer Motion. Sections: hero, one-line
value prop, 3 features, social proof logos, final CTA.
- Read your context and instructions
- Compiled the cinematic landing page
- Generated the app files
I built NotelyLanding.jsx using the cinematic beat structure: cold open →
establishing statement → 3 staggered feature reveals → understated proof
beat → climax CTA. Tone is restrained/luxury — expo-out easing
(cubic-bezier(0.16, 1, 0.3, 1)), 0.6–1.4s durations, 5–10% background
parallax drift on the hero. Every animated element ships a
prefers-reduced-motion fallback via useReducedMotion(), and the parallax
transform is scoped to desktop only.
import { motion, useReducedMotion, useScroll, useTransform } from "framer-motion";
import { useRef } from "react";
const EASE = [0.16, 1, 0.3, 1]; // restrained/luxury signature curve
function Reveal({ children, delay = 0, y = 24, className = "" }) {
const reduceMotion = useReducedMotion();
return (
<motion.div
className={className}
initial={reduceMotion ? false : { opacity: 0, y }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.2 }}
transition={{ duration: 0.7, ease: EASE, delay }}
>
{children}
</motion.div>
);
}
function ParallaxHero({ children }) {
const ref = useRef(null);
const { scrollYProgress } = useScroll({ target: ref, offset: ["start start", "end start"] });
const y = useTransform(scrollYProgress, [0, 1], [0, 120]);
const opacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
return (
<section ref={ref} className="relative h-screen overflow-hidden bg-[#0A0A0B]">
<motion.div style={{ y }} className="absolute inset-0 -z-10 bg-gradient-to-b from-[#141416] to-[#0A0A0B]" />
<motion.div style={{ opacity }} className="relative z-10 flex h-full items-center justify-center">
{children}
</motion.div>
</section>
);
}
function TextReveal({ text, className = "" }) {
const words = text.split(" ");
return (
<motion.h1
className={className}
initial="hidden"
whileInView="show"
viewport={{ once: true, amount: 0.5 }}
variants={{ show: { transition: { staggerChildren: 0.05 } } }}
>
{words.map((word, i) => (
<motion.span
key={i}
className="inline-block mr-[0.25em]"
variants={{ hidden: { opacity: 0, y: 16 }, show: { opacity: 1, y: 0 } }}
transition={{ duration: 0.5, ease: EASE }}
>
{word}
</motion.span>
))}
</motion.h1>
);
}
const container = {
hidden: {},
show: { transition: { staggerChildren: 0.09 } },
};
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0, transition: { duration: 0.6, ease: EASE } },
};
function StaggerGroup({ children, className = "" }) {
const reduceMotion = useReducedMotion();
return (
<motion.div
className={className}
variants={reduceMotion ? undefined : container}
initial={reduceMotion ? false : "hidden"}
whileInView={reduceMotion ? undefined : "show"}
viewport={{ once: true, amount: 0.2 }}
>
{children}
</motion.div>
);
}
export default function NotelyLanding() {
return (
<main className="bg-[#FAFAF8] text-[#0A0A0B]">
{/* Cold open */}
<ParallaxHero>
<div className="text-center px-6">
<TextReveal
text="Notely remembers so you don't have to."
className="text-white text-5xl md:text-7xl font-medium tracking-tight"
/>
<Reveal delay={0.9}>
<button className="mt-10 px-8 py-3 rounded-full bg-white text-[#0A0A0B] text-sm tracking-wide">
Join the waitlist
</button>
</Reveal>
</div>
</ParallaxHero>
{/* Establishing beat */}
<section className="py-40 max-w-2xl mx-auto px-6 text-center">
<Reveal>
<p className="text-2xl md:text-3xl leading-relaxed text-[#1a1a1a]">
Every meeting, every idea, every follow-up — captured automatically,
organized without a single tag.
</p>
</Reveal>
</section>
{/* Rising beats */}
<StaggerGroup className="py-32 grid md:grid-cols-3 gap-12 max-w-5xl mx-auto px-6">
{[
{ title: "Listens", body: "Transcribes every meeting in the background." },
{ title: "Connects", body: "Links related notes across weeks automatically." },
{ title: "Surfaces", body: "Resurfaces the right note exactly when you need it." },
].map((f) => (
<motion.div key={f.title} variants={item}>
<h3 className="text-xl font-medium mb-2">{f.title}</h3>
<p className="text-[#555]">{f.body}</p>
</motion.div>
))}
</StaggerGroup>
{/* Proof beat — understated, low motion */}
<section className="py-24 border-t border-[#eee]">
<Reveal y={8}>
<p className="text-center text-sm tracking-widest uppercase text-[#999]">
Trusted in early access by teams at
</p>
<div className="flex justify-center gap-12 mt-8 opacity-60 text-sm">
<span>Arclight</span><span>Fieldnote</span><span>Loam</span>
</div>
</Reveal>
</section>
{/* Climax */}
<section className="py-48 text-center px-6">
<Reveal>
<h2 className="text-4xl md:text-6xl font-medium tracking-tight mb-8">
Your memory, kept.
</h2>
<button className="px-10 py-4 rounded-full bg-[#0A0A0B] text-white text-sm tracking-wide">
Join the waitlist
</button>
</Reveal>
</section>
</main>
);
}
Next steps: drop in real feature copy and logo assets, wire the waitlist
buttons to your form handler, and if you want a punchier feel instead of
restrained/luxury, swap EASE to cubic-bezier(0.65, 0, 0.35, 1) and bump
the y-offsets from 20–24px to 40–80px per the kinetic/tech direction.
cinematic-landing-page-engine-app.zip
ZIP · project files
Example file from a real run - the skill writes it into your workspace.
Connects securely to your tools. The creator never sees your data.
What you get
About this skill
Most "landing page" skills hand you a moodboard or a Tailwind starter. This one ships a directed motion system — a beat structure (cold open → rising beats → climax) so your page's energy actually builds instead of every section fading up the same way — plus production code in either React + Tailwind + Framer Motion or vanilla HTML/CSS/JS + GSAP (zero-dependency IntersectionObserver fallback included).
What's inside:
Intake workflow that pins down tone (restrained/luxury, kinetic/tech, or editorial/film) before any code is written A motion system: one signature easing curve + duration scale per project, so pacing feels directed, not assembled Ready-to-use components: scroll reveal wrapper, staggered groups, scroll-linked parallax hero, word-stagger headline reveal Full typography scales and color-grading rules per tonal direction Built-in accessibility: every animated element ships a prefers-reduced-motion fallback, and parallax is clamped on mobile — most competing skills skip this entirely A pre-delivery self-check checklist so nothing ships half-finished
Works with Claude Code, Cursor, Codex CLI, Gemini CLI, and any SKILL.md-compatible agent.
How to install
Works the same in every agent - Claude, Cursor, Codex, Copilot and 20+ more.
- 1
Download the ZIP
Free skills download straight away. Paid skills unlock right after purchase.
- 2
Unzip into your skills folder
Every agent reads skills from one folder on your machine. Drop the unzipped folder in there.
- 3
Ask your agent to use it
Restart the agent if it was already running. It picks the skill up automatically - no config needed.
Skills folder by agent
Click the path to copy it. Create the folder if it does not exist yet.
Reviews
No reviews yet
Be one of the first to try it. Every listed skill passes our trust checks below.
Security scanned
Passed our 8-point scan before listing
Fresh listing
Recently published to Agensi
30-day refund
Not a fit? Get your money back
Trust & safety
Security scanned
Verified clean 25 days ago
- Passed all security checks, Safe to install