Install
openclaw skills install million-dollar-landing-pageTransform a generic SaaS landing page into a high-converting, visually premium product that makes visitors feel like they've landed on a million-dollar compa...
openclaw skills install million-dollar-landing-pageTransforms a functional-but-forgettable SaaS landing page into a site that converts. Three distinct layers, applied in order:
Battle-tested on a production SaaS launch — every pattern here drove real conversions.
This framework applies to any product or service. The examples below span multiple industries on purpose — read the structure, not the domain.
Structure every page to answer two questions first:
Then run PAS:
Walk in the customer's shoes. Identify their real struggle — not the surface complaint but the underlying frustration.
The pattern: "[Customer role] didn't start [their thing] to deal with [your problem domain]. But [the reality they face]."
Examples across industries:
Press the wound. Make the severity real. Don't just name the problem — make them feel it.
Stack the friction. List the steps they have to take without you. Make each one land.
Examples:
One sentence. Concrete. Fast. No jargon.
The pattern: "[Product] gives you [the outcome they want] without [the thing they hate doing]."
Examples:
Pattern: Action + Benefit — short, punchy, specific. One idea per headline.
Structure options:
[Action]. — e.g. "One-Click Deploy."[What] + [Where/Who] + [How fast]. — e.g. "Your AI agent. Every platform. 30 minutes."[Consequence of not acting]. — e.g. "Every day without an AI assistant is a missed opportunity, not a conversation."[Outcome] + [No pain]. — e.g. "More clients. No cold outreach."Avoid:
The test: read it to someone. If they can't tell you what you do and why it matters in one sentence, rewrite.
After writing the copy, do a mandatory second pass:
Before: "Our platform provides businesses with the tools they need to create and deploy AI-powered chatbots across multiple messaging platforms without requiring extensive technical knowledge."
After: "Deploy an AI agent on every platform your customers use. No dev work."
Before: "We offer comprehensive accounting and bookkeeping services designed to help small business owners manage their financial obligations more effectively and with less stress."
After: "We handle your books so you never think about them again."
The rule works the same for every industry. Fewer words = more trust = more conversions.
A guarantee differentiates you from competitors and eliminates purchase risk. It is the single most underused element on landing pages.
Formula: [Time/money promise] + [what they get] + [what happens if you don't deliver]
Examples:
Place the guarantee immediately before the final CTA. It's the last objection remover before the click.
The comparison table is your most powerful sales section. Rules:
Your customer did not start their business, take up their hobby, or take on their role to deal with the problem you solve. That's the universal truth.
Every piece of copy should speak to someone who:
Frame the product as: "We handle [the hard thing], you get [the outcome]."
Adapt to any audience:
This design system uses one dominant dark background + one brand accent for all CTAs and active states. The radial glows use the brand accent plus one or two complementary tones for depth. Adapt all of these to match the product's brand.
| Token | cr8claw value | Your value | Usage |
|---|---|---|---|
| Background | #050810 | Replace with your dark base | Page background |
| Brand accent | #f97316 (orange) | Your primary brand color | CTAs, active states, links |
| Glow left | rgba(124,58,237,0.14) (purple) | Complementary to your accent | Hero radial glow (left edge) |
| Glow right | rgba(249,115,22,0.11) (orange) | Your brand accent, low opacity | Hero radial glow (right edge) |
| Glow bottom | rgba(59,130,246,0.09) (blue) | Cool contrast tone | Footer/bottom radial glow |
| Glass surface | rgba(255,255,255,0.05) | Keep as-is | Cards, header, modals |
| Border | rgba(255,255,255,0.07–0.14) | Keep as-is | Card edges |
Rule: The background should feel like deep space — almost black, with faint atmospheric color. Glows should be subtle (opacity 0.08–0.15), never loud.
Layer these radial gradients on the root element for depth. Swap the RGBA colors to match your brand:
background:
radial-gradient(ellipse at 8% 50%, <left-glow-color> 0%, transparent 55%),
radial-gradient(ellipse at 92% 8%, <right-glow-color> 0%, transparent 50%),
radial-gradient(ellipse at 50% 100%, <bottom-glow-color> 0%, transparent 50%),
<base-background>;
Add .dot-grid class for the subtle background dot pattern.
Display font: Sora (Google Fonts) — headings, brand name
Body font: DM Sans (Google Fonts) — body copy, UI labels
Mono font: JetBrains Mono — terminal, code blocks, step numbers
next/font setup:
import { Sora, DM_Sans, JetBrains_Mono } from 'next/font/google'
export const fontDisplay = Sora({ subsets: ['latin'], variable: '--font-display', weight: ['400','600','700','800','900'] })
export const fontSans = DM_Sans({ subsets: ['latin'], variable: '--font-sans' })
export const fontMono = JetBrains_Mono({ subsets: ['latin'], variable: '--font-mono' })
Tailwind config:
fontFamily: {
display: ['var(--font-display)', 'sans-serif'],
sans: ['var(--font-sans)', 'sans-serif'],
mono: ['var(--font-mono)', 'monospace'],
}
See resources/design-tokens.css for the full set. Key classes:
.glass — card surfaces, header, modals.glass-raised — elevated cards (hover state, modals).dot-grid — background dot pattern overlay.gradient-border — brand-accent-to-complementary gradient border on hover (update colors in design-tokens.css to match your palette).card-dark / .card-dark-solid — opaque dark cards for dashboards.text-shimmer — animated gradient text.marquee-track — infinite horizontal scroll.cursor-blink — terminal cursor blinkAdd to tailwind.config.js:
animation: {
'fade-up': 'fade-up 0.6s ease both',
'logo-breathe': 'logo-breathe 3.5s ease-in-out infinite',
'pulse-glow': 'pulse-glow 2.5s ease-in-out infinite',
},
keyframes: {
'fade-up': { '0%': { opacity: '0', transform: 'translateY(20px)' }, '100%': { opacity: '1', transform: 'translateY(0)' } },
'logo-breathe': { '0%,100%': { transform: 'scale(1)' }, '50%': { transform: 'scale(1.06)' } },
'pulse-glow': { '0%,100%': { boxShadow: '0 0 20px <brand-accent-rgba-0.3>' }, '50%': { boxShadow: '0 0 35px <brand-accent-rgba-0.55>' } },
},
Drop-in components in resources/:
| Component | File | Purpose |
|---|---|---|
CursorGlow | cursor-glow.tsx | Mouse-tracking brand-color radial gradient overlay (update color to match brand accent) |
ScrollProgress | scroll-progress.tsx | Right-edge scroll depth indicator bar |
ScrollReveal | scroll-reveal.tsx | Framer Motion fade-in-up on scroll (any direction) |
Marquee | marquee.tsx | Infinite horizontal scroll — use for platforms, client logos, features, integrations, anything that benefits from a "wall of proof" |
TerminalSteps | terminal-steps.tsx | Animated dark terminal — use for the Agitate section: list the painful steps the user has to take without your product |
Install dependency:
npm install framer-motion
[Sticky glass header — logo + nav]
[Hero — min-h-[90vh] flex items-center]
[grid lg:grid-cols-[3fr_2fr]]
[Left: badge → headline (variable font sizes) → subhead → CTA row]
[Right: glass card mockup of product UI]
[Platform/logo marquee strip — fades at edges]
Hero stagger: Sequenced animation-delay on each element:
<div className="animate-fade-up opacity-0" >[badge]</div>
<div className="animate-fade-up opacity-0 [animation-delay:80ms]" >[headline]</div>
<div className="animate-fade-up opacity-0 [animation-delay:160ms]">[subhead]</div>
<div className="animate-fade-up opacity-0 [animation-delay:240ms]">[CTAs]</div>
Every major section:
<ScrollReveal> for on-scroll entrytext-[brand-accent]/70 text-sm font-semibold uppercase tracking-widest (use your brand accent color, e.g. text-orange-400/70, text-blue-400/70)font-display text-4xl md:text-5xl font-black text-whitetext-white/60 text-lg max-w-2xlglass rounded-2xl p-61. Viewport meta — must be in <head>:
<meta name="viewport" content="width=device-width, initial-scale=1">
2. iOS Safari auto-zoom prevention
Any input/select/textarea with font-size < 16px triggers iOS auto-zoom on focus. Fix:
input, select, textarea { font-size: 16px; }
In Tailwind: always use text-base or larger on form elements.
3. Horizontal overflow Belt-and-suspenders approach — CSS alone isn't always sufficient:
html, body { overflow-x: hidden; max-width: 100vw; }
Also add overflow-hidden on root page wrapper and min-w-0 on flex/grid children.
4. Wide tables and comparison grids
<div className="overflow-x-auto -mx-4 px-4">
<table className="min-w-[640px] w-full">...</table>
</div>
5. Grid children can overflow
CSS Grid children can push past their column. Always add min-w-0:
<div className="grid lg:grid-cols-2">
<div className="min-w-0">...</div>
<div className="min-w-0">...</div>
</div>
Always mobile-first:
| Element | Mobile | Tablet | Desktop |
|---|---|---|---|
| Hero headline | text-4xl | md:text-6xl | lg:text-7xl |
| Section headline | text-3xl | md:text-4xl | lg:text-5xl |
| Body | text-base | — | — |
Never write text-7xl without a mobile fallback.
Minimum 44×44px on all interactive elements:
className="min-h-[44px] min-w-[44px]"
w-60 hidden lg:flex flex-col fixed inset-y-0 left-0border-l-2 border-[brand] text-[brand-light] bg-[brand]/10 — use your brand accent colorlg:hidden / hidden lg:flexlg:pl-60 to offset for the fixed sidebarAlways include both prefixed and unprefixed versions:
backdrop-filter: blur(24px) saturate(180%);
-webkit-backdrop-filter: blur(24px) saturate(180%);
prefers-reduced-motionIn CSS:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
design-tokens.css) — swap orange values to your brand colornext/font — or substitute display/body fonts that match the brand toneCursorGlow (update accent color) and ScrollProgress to root layout<ScrollReveal>Marquee strip after hero — populate with platforms, logos, integrations, or social proof that fits the productTerminalSteps to the Agitate section — list the painful steps without the productanimation-delay) to entry elementsmin-w-0 on all grid childrenoverflow-x-auto containerfont-size ≥ 16px| Thing | Where |
|---|---|
| Names/logos in marquee | items prop on <Marquee> in marquee.tsx |
| Terminal steps copy | STEPS array in terminal-steps.tsx |
| Comparison table rows | comparisonRows in your page component |
| Radial gradient accent colors | Background style on root <div> |
| Brand accent color | Replace orange-500 / #f97316 globally |
| Guarantee copy | Just before final CTA section |
| Scroll animation direction | direction prop on <ScrollReveal> |