Innovations

The Modern Migration — Landing Page

Full marketing landing page for a WordPress-to-modern-stack migration service

Preview

Source

tsx
"use client";

import { useEffect } from "react";
import { motion } from "framer-motion";
import {
  ArrowRight,
  Check,
  X,
  Shield,
  Timer,
  DollarSign,
  AlertTriangle,
  ChevronDown,
  TrendingDown,
  Wrench,
  Zap,
} from "lucide-react";

// ─── Design tokens ────────────────────────────────────────────────────────────
const C = {
  bg:       "#0B0B0B",
  surface:  "#141414",
  surface2: "#1C1C1C",
  border:   "#252525",
  text:     "#F0F0F0",
  muted:    "#7A7A7A",
  green:    "#00E87C",
  greenDim: "rgba(0,232,124,0.10)",
  red:      "#FF4040",
  redDim:   "rgba(255,64,64,0.10)",
  yellow:   "#F5C400",
};

// ─── Nav ──────────────────────────────────────────────────────────────────────
function Nav() {
  return (
    <nav
      style={{
        background: C.bg,
        borderBottom: `1px solid ${C.border}`,
        position: "sticky",
        top: 0,
        zIndex: 50,
      }}
    >
      <div
        style={{
          maxWidth: "1100px",
          margin: "0 auto",
          padding: "0 24px",
          height: "60px",
          display: "flex",
          alignItems: "center",
          justifyContent: "space-between",
        }}
      >
        <span
          style={{
            fontFamily: "'Syne', system-ui",
            fontWeight: 800,
            fontSize: "1rem",
            color: C.text,
            letterSpacing: "-0.01em",
          }}
        >
          The Modern Migration
        </span>
        <a
          href="#pricing"
          style={{
            display: "inline-flex",
            alignItems: "center",
            gap: "6px",
            background: C.green,
            color: C.bg,
            fontWeight: 700,
            fontSize: "0.8rem",
            padding: "8px 16px",
            borderRadius: "6px",
            textDecoration: "none",
          }}
        >
          See Pricing →
        </a>
      </div>
    </nav>
  );
}

// ─── Hero ─────────────────────────────────────────────────────────────────────
function Hero() {
  return (
    <section
      style={{
        background: C.bg,
        minHeight: "92vh",
        display: "flex",
        alignItems: "center",
        position: "relative",
        overflow: "hidden",
        padding: "80px 24px",
      }}
    >
      {/* Grid background */}
      <div
        style={{
          position: "absolute",
          inset: 0,
          backgroundImage: `linear-gradient(${C.border} 1px, transparent 1px), linear-gradient(90deg, ${C.border} 1px, transparent 1px)`,
          backgroundSize: "60px 60px",
          opacity: 0.6,
          pointerEvents: "none",
        }}
      />
      {/* Green glow */}
      <div
        style={{
          position: "absolute",
          bottom: "-150px",
          right: "-50px",
          width: "700px",
          height: "700px",
          background: `radial-gradient(circle, ${C.green}14 0%, transparent 65%)`,
          pointerEvents: "none",
        }}
      />

      <div style={{ maxWidth: "1100px", margin: "0 auto", position: "relative", zIndex: 1 }}>
        {/* Badge */}
        <motion.div
          initial={{ opacity: 0, y: -12 }}
          animate={{ opacity: 1, y: 0 }}
          transition={{ duration: 0.5 }}
          style={{
            display: "inline-flex",
            alignItems: "center",
            gap: "8px",
            background: C.greenDim,
            border: `1px solid ${C.green}45`,
            borderRadius: "100px",
            padding: "6px 16px",
            marginBottom: "32px",
          }}
        >
          <span
            style={{
              width: "7px",
              height: "7px",
              borderRadius: "50%",
              background: C.green,
              display: "block",
              boxShadow: `0 0 8px ${C.green}`,
            }}
          />
          <span
            style={{
              fontSize: "0.72rem",
              fontWeight: 700,
              letterSpacing: "0.12em",
              textTransform: "uppercase",
              color: C.green,
            }}
          >
            Now accepting new clients
          </span>
        </motion.div>

        {/* Headline */}
        <motion.h1
          initial={{ opacity: 0, y: 28 }}
          animate={{ opacity: 1, y: 0 }}
          transition={{ duration: 0.7, delay: 0.1 }}
          style={{
            fontFamily: "'Syne', system-ui",
            fontWeight: 800,
            fontSize: "clamp(2.6rem, 5.5vw, 5rem)",
            lineHeight: 1.04,
            color: C.text,
            marginBottom: "24px",
            maxWidth: "860px",
            letterSpacing: "-0.03em",
          }}
        >
          Your{" "}
          <span style={{ position: "relative", display: "inline-block" }}>
            <span style={{ color: C.muted }}>WordPress</span>
            <motion.span
              initial={{ scaleX: 0 }}
              animate={{ scaleX: 1 }}
              transition={{ duration: 0.45, delay: 0.9, ease: "easeInOut" }}
              style={{
                position: "absolute",
                top: "52%",
                left: "-2px",
                right: "-2px",
                height: "3px",
                background: C.red,
                transformOrigin: "left",
                borderRadius: "2px",
              }}
            />
          </span>{" "}
          site is costing
          <br />
          you customers.{" "}
          <em style={{ color: C.green, fontStyle: "italic" }}>Fix it in 10 days.</em>
        </motion.h1>

        {/* Subhead */}
        <motion.p
          initial={{ opacity: 0, y: 18 }}
          animate={{ opacity: 1, y: 0 }}
          transition={{ duration: 0.6, delay: 0.3 }}
          style={{
            fontSize: "clamp(1rem, 1.8vw, 1.2rem)",
            color: C.muted,
            maxWidth: "580px",
            lineHeight: 1.75,
            marginBottom: "40px",
          }}
        >
          We migrate small business websites off WordPress onto a modern stack
          that loads instantly, costs $0/month to host, and never breaks from
          plugin updates again.
        </motion.p>

        {/* CTAs */}
        <motion.div
          initial={{ opacity: 0, y: 16 }}
          animate={{ opacity: 1, y: 0 }}
          transition={{ duration: 0.6, delay: 0.45 }}
          style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}
        >
          <a
            href="#pricing"
            style={{
              display: "inline-flex",
              alignItems: "center",
              gap: "8px",
              background: C.green,
              color: C.bg,
              padding: "14px 28px",
              borderRadius: "8px",
              fontWeight: 700,
              fontSize: "0.95rem",
              textDecoration: "none",
              boxShadow: `0 0 28px ${C.green}30`,
            }}
          >
            See Pricing <ArrowRight size={16} />
          </a>
          <a
            href="#how-it-works"
            style={{
              display: "inline-flex",
              alignItems: "center",
              gap: "8px",
              border: `1px solid ${C.border}`,
              color: C.text,
              padding: "14px 28px",
              borderRadius: "8px",
              fontWeight: 600,
              fontSize: "0.95rem",
              textDecoration: "none",
            }}
          >
            How It Works
          </a>
        </motion.div>

        {/* Stats row */}
        <motion.div
          initial={{ opacity: 0 }}
          animate={{ opacity: 1 }}
          transition={{ duration: 0.6, delay: 0.65 }}
          style={{
            display: "flex",
            gap: "48px",
            marginTop: "64px",
            paddingTop: "40px",
            borderTop: `1px solid ${C.border}`,
            flexWrap: "wrap",
          }}
        >
          {[
            { val: "10", pre: "", suf: "", lbl: "Day turnaround" },
            { val: "0", pre: "$", suf: "", lbl: "Monthly hosting" },
            { val: "15", pre: "", suf: "x", lbl: "Faster on average" },
            { val: "100", pre: "", suf: "%", lbl: "Satisfaction guarantee" },
          ].map((s) => (
            <div key={s.lbl}>
              <div
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 800,
                  fontSize: "2.2rem",
                  color: C.green,
                  letterSpacing: "-0.02em",
                }}
              >
                {s.pre}{s.val}{s.suf}
              </div>
              <div style={{ fontSize: "0.78rem", color: C.muted, marginTop: "2px" }}>{s.lbl}</div>
            </div>
          ))}
        </motion.div>
      </div>
    </section>
  );
}

// ─── Pain Points ──────────────────────────────────────────────────────────────
const painPoints = [
  { Icon: Timer, title: "Painfully Slow", body: "Your site takes 4–8 seconds to load. 53% of visitors leave if a page takes over 3 seconds. You're losing money every day." },
  { Icon: Shield, title: "Security Nightmares", body: "WordPress powers 40% of the web — which makes it the #1 target for hackers. Outdated plugins are open doors." },
  { Icon: DollarSign, title: "Expensive Hosting", body: "You're paying $30–$150/month for hosting that still can't keep your site fast. Modern sites host for free. Literally $0." },
  { Icon: AlertTriangle, title: "Plugin Roulette", body: "Every update is a gamble. One plugin conflict and your site goes white. You shouldn't need 30 plugins to run a business site." },
  { Icon: TrendingDown, title: "Tanking Your SEO", body: "Google ranks fast sites higher. Your bloated WordPress install is dragging your rankings down while competitors pass you." },
  { Icon: Wrench, title: "Constant Maintenance", body: "Core updates, theme updates, plugin patches, backups, security scans — you started a business, not an IT department." },
];

function PainPoints() {
  return (
    <section style={{ background: C.surface, padding: "96px 24px" }}>
      <div style={{ maxWidth: "1100px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{ textAlign: "center", marginBottom: "56px" }}
        >
          <span
            style={{
              fontSize: "0.72rem",
              fontWeight: 700,
              letterSpacing: "0.14em",
              textTransform: "uppercase",
              color: C.red,
            }}
          >
            Sound familiar?
          </span>
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(1.8rem, 3.5vw, 3rem)",
              color: C.text,
              marginTop: "12px",
              lineHeight: 1.1,
              letterSpacing: "-0.025em",
            }}
          >
            WordPress was built for 2010.
            <br />
            Your customers live in 2026.
          </h2>
        </motion.div>

        <div
          style={{
            display: "grid",
            gridTemplateColumns: "repeat(auto-fit, minmax(280px, 1fr))",
            gap: "1px",
            background: C.border,
            borderRadius: "16px",
            overflow: "hidden",
          }}
        >
          {painPoints.map(({ Icon, title, body }, i) => (
            <motion.div
              key={title}
              initial={{ opacity: 0, y: 20 }}
              whileInView={{ opacity: 1, y: 0 }}
              viewport={{ once: true }}
              transition={{ duration: 0.5, delay: i * 0.07 }}
              style={{ background: C.surface, padding: "32px 28px" }}
            >
              <div
                style={{
                  width: "44px",
                  height: "44px",
                  background: C.redDim,
                  border: `1px solid ${C.red}30`,
                  borderRadius: "10px",
                  display: "flex",
                  alignItems: "center",
                  justifyContent: "center",
                  marginBottom: "16px",
                }}
              >
                <Icon size={20} color={C.red} />
              </div>
              <h3
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 700,
                  fontSize: "1rem",
                  color: C.text,
                  marginBottom: "10px",
                }}
              >
                {title}
              </h3>
              <p style={{ fontSize: "0.875rem", color: C.muted, lineHeight: 1.72 }}>
                {body}
              </p>
            </motion.div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── Comparison ───────────────────────────────────────────────────────────────
const beforeList = [
  "4–8 second load times",
  "$30–$150/mo hosting",
  "Constant plugin updates",
  "Vulnerable to attacks",
  "Breaks randomly",
  "Poor mobile scores",
  "Needs ongoing maintenance",
];
const afterList = [
  "Under 1 second load times",
  "$0/mo hosting",
  "No plugins needed",
  "Virtually unhackable",
  "Nothing to break",
  "Perfect mobile scores",
  "Set it and forget it",
];

function Comparison() {
  return (
    <section style={{ background: C.bg, padding: "96px 24px" }}>
      <div style={{ maxWidth: "1100px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{ textAlign: "center", marginBottom: "56px" }}
        >
          <span
            style={{
              fontSize: "0.72rem",
              fontWeight: 700,
              letterSpacing: "0.14em",
              textTransform: "uppercase",
              color: C.muted,
            }}
          >
            The difference
          </span>
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(1.8rem, 3.5vw, 3rem)",
              color: C.text,
              marginTop: "12px",
              letterSpacing: "-0.025em",
            }}
          >
            Old stack vs. your new reality
          </h2>
        </motion.div>

        <div
          style={{
            display: "grid",
            gridTemplateColumns: "1fr 1fr",
            gap: "2px",
            background: C.border,
            borderRadius: "16px",
            overflow: "hidden",
          }}
        >
          {/* Before */}
          <motion.div
            initial={{ opacity: 0, x: -24 }}
            whileInView={{ opacity: 1, x: 0 }}
            viewport={{ once: true }}
            transition={{ duration: 0.6 }}
            style={{ background: C.surface, padding: "40px" }}
          >
            <div
              style={{
                display: "flex",
                alignItems: "center",
                gap: "10px",
                marginBottom: "28px",
                paddingBottom: "20px",
                borderBottom: `1px solid ${C.border}`,
              }}
            >
              <X size={16} color={C.red} />
              <span
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 700,
                  fontSize: "1rem",
                  color: C.muted,
                }}
              >
                Your WordPress Site
              </span>
            </div>
            {beforeList.map((item, i) => (
              <div
                key={i}
                style={{
                  display: "flex",
                  alignItems: "center",
                  gap: "12px",
                  padding: "11px 0",
                  borderBottom: `1px solid ${C.border}`,
                }}
              >
                <div
                  style={{
                    width: "18px",
                    height: "18px",
                    borderRadius: "50%",
                    background: C.redDim,
                    border: `1px solid ${C.red}35`,
                    display: "flex",
                    alignItems: "center",
                    justifyContent: "center",
                    flexShrink: 0,
                  }}
                >
                  <X size={9} color={C.red} />
                </div>
                <span style={{ fontSize: "0.875rem", color: C.muted }}>{item}</span>
              </div>
            ))}
          </motion.div>

          {/* After */}
          <motion.div
            initial={{ opacity: 0, x: 24 }}
            whileInView={{ opacity: 1, x: 0 }}
            viewport={{ once: true }}
            transition={{ duration: 0.6, delay: 0.1 }}
            style={{
              background: C.surface,
              padding: "40px",
              position: "relative",
              overflow: "hidden",
            }}
          >
            <div
              style={{
                position: "absolute",
                top: 0,
                right: 0,
                width: "240px",
                height: "240px",
                background: `radial-gradient(circle at top right, ${C.green}10, transparent 65%)`,
                pointerEvents: "none",
              }}
            />
            <div
              style={{
                display: "flex",
                alignItems: "center",
                gap: "10px",
                marginBottom: "28px",
                paddingBottom: "20px",
                borderBottom: `1px solid ${C.border}`,
                position: "relative",
              }}
            >
              <Check size={16} color={C.green} />
              <span
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 700,
                  fontSize: "1rem",
                  color: C.text,
                }}
              >
                After Migration
              </span>
            </div>
            {afterList.map((item, i) => (
              <div
                key={i}
                style={{
                  display: "flex",
                  alignItems: "center",
                  gap: "12px",
                  padding: "11px 0",
                  borderBottom: `1px solid ${C.border}`,
                  position: "relative",
                }}
              >
                <div
                  style={{
                    width: "18px",
                    height: "18px",
                    borderRadius: "50%",
                    background: C.greenDim,
                    border: `1px solid ${C.green}45`,
                    display: "flex",
                    alignItems: "center",
                    justifyContent: "center",
                    flexShrink: 0,
                  }}
                >
                  <Check size={9} color={C.green} />
                </div>
                <span style={{ fontSize: "0.875rem", color: C.text }}>{item}</span>
              </div>
            ))}
          </motion.div>
        </div>
      </div>
    </section>
  );
}

// ─── Speed ────────────────────────────────────────────────────────────────────
function SpeedBar({ pct, color, delay }: { pct: number; color: string; delay: number }) {
  return (
    <div
      style={{
        height: "12px",
        background: C.surface2,
        borderRadius: "100px",
        overflow: "hidden",
        width: "100%",
      }}
    >
      <motion.div
        initial={{ width: 0 }}
        whileInView={{ width: `${pct}%` }}
        viewport={{ once: true }}
        transition={{ duration: 0.9, delay, ease: "easeOut" }}
        style={{ height: "100%", background: color, borderRadius: "100px" }}
      />
    </div>
  );
}

function Speed() {
  const bars = [
    { label: "Typical WordPress Site", value: 6.2, max: 7, color: C.red, delay: 0.1 },
    { label: "After Migration", value: 0.4, max: 7, color: C.green, delay: 0.5 },
  ];

  return (
    <section style={{ background: C.surface, padding: "96px 24px" }}>
      <div style={{ maxWidth: "800px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{ textAlign: "center", marginBottom: "56px" }}
        >
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(1.8rem, 3.5vw, 3rem)",
              color: C.text,
              marginBottom: "8px",
              letterSpacing: "-0.025em",
            }}
          >
            See the speed difference
          </h2>
          <p style={{ color: C.muted }}>Average page load time comparison</p>
        </motion.div>

        <div style={{ display: "flex", flexDirection: "column", gap: "36px" }}>
          {bars.map((bar) => (
            <div key={bar.label}>
              <div
                style={{
                  display: "flex",
                  justifyContent: "space-between",
                  alignItems: "baseline",
                  marginBottom: "12px",
                }}
              >
                <span style={{ fontSize: "0.9rem", color: C.muted }}>{bar.label}</span>
                <motion.span
                  initial={{ opacity: 0 }}
                  whileInView={{ opacity: 1 }}
                  viewport={{ once: true }}
                  transition={{ delay: bar.delay + 0.6 }}
                  style={{
                    fontFamily: "'Syne', system-ui",
                    fontWeight: 800,
                    fontSize: "1.6rem",
                    color: bar.color,
                    letterSpacing: "-0.02em",
                  }}
                >
                  {bar.value}s
                </motion.span>
              </div>
              <SpeedBar pct={(bar.value / bar.max) * 100} color={bar.color} delay={bar.delay} />
            </div>
          ))}
        </div>

        <motion.div
          initial={{ opacity: 0, y: 16 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.5, delay: 0.8 }}
          style={{
            marginTop: "40px",
            background: C.greenDim,
            border: `1px solid ${C.green}28`,
            borderRadius: "12px",
            padding: "20px 24px",
            display: "flex",
            alignItems: "center",
            gap: "14px",
          }}
        >
          <Zap size={22} color={C.green} style={{ flexShrink: 0 }} />
          <span style={{ fontSize: "0.9rem", color: C.text, lineHeight: 1.6 }}>
            <strong style={{ color: C.green }}>15x faster</strong> — that's the difference
            between a visitor who converts and one who bounces.
          </span>
        </motion.div>
      </div>
    </section>
  );
}

// ─── What's Included ──────────────────────────────────────────────────────────
const included = [
  { num: "01", title: "Full Site Migration", body: "Every page, image, and piece of content moved to a modern framework. Your site looks the same (or better) — it just runs 10x faster." },
  { num: "02", title: "Free Hosting Setup", body: "We deploy your new site on enterprise-grade infrastructure that costs you $0/month. Cancel your old hosting and keep the savings." },
  { num: "03", title: "Simple Content Editing", body: "We connect a clean, easy-to-use content system so you can update text and images without touching code. No WordPress dashboard. No plugins." },
  { num: "04", title: "DNS, Domain & SSL", body: "We handle every technical detail — domain transfer, DNS records, SSL certificate. You don't lift a finger." },
  { num: "05", title: "30 Days of Support", body: "Questions after launch? We've got you covered for a full month. Plus a recorded walkthrough so you always have a reference." },
  { num: "06", title: "Done in 10 Business Days", body: "No 8-week timelines. No endless back-and-forth. We migrate your site in under two weeks — guaranteed." },
];

function Included() {
  return (
    <section id="how-it-works" style={{ background: C.bg, padding: "96px 24px" }}>
      <div style={{ maxWidth: "1100px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{ marginBottom: "56px" }}
        >
          <span
            style={{
              fontSize: "0.72rem",
              fontWeight: 700,
              letterSpacing: "0.14em",
              textTransform: "uppercase",
              color: C.muted,
            }}
          >
            What's included
          </span>
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(1.8rem, 3.5vw, 3rem)",
              color: C.text,
              marginTop: "12px",
              letterSpacing: "-0.025em",
            }}
          >
            Everything handled.
            <br />
            Nothing for you to figure out.
          </h2>
        </motion.div>

        <div
          style={{
            display: "grid",
            gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))",
            gap: "1px",
            background: C.border,
            borderRadius: "16px",
            overflow: "hidden",
          }}
        >
          {included.map(({ num, title, body }, i) => (
            <motion.div
              key={num}
              initial={{ opacity: 0, y: 20 }}
              whileInView={{ opacity: 1, y: 0 }}
              viewport={{ once: true }}
              transition={{ duration: 0.5, delay: i * 0.08 }}
              style={{ background: C.bg, padding: "32px 28px" }}
            >
              <div
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 800,
                  fontSize: "2.8rem",
                  color: C.green,
                  opacity: 0.35,
                  lineHeight: 1,
                  marginBottom: "14px",
                }}
              >
                {num}
              </div>
              <h3
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 700,
                  fontSize: "1rem",
                  color: C.text,
                  marginBottom: "10px",
                }}
              >
                {title}
              </h3>
              <p style={{ fontSize: "0.85rem", color: C.muted, lineHeight: 1.72 }}>
                {body}
              </p>
            </motion.div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── Pricing ──────────────────────────────────────────────────────────────────
const plans = [
  {
    name: "Stack Upgrade",
    price: "$1,997",
    note: "One-time payment",
    featured: false,
    badge: null as string | null,
    features: [
      "Full site migration (up to 10 pages)",
      "Same design, modern stack",
      "$0/mo hosting setup",
      "Simple CMS for content edits",
      "DNS, domain & SSL handled",
      "30 days post-launch support",
      "Video walkthrough",
    ],
    cta: "Get Started",
  },
  {
    name: "Migration + Refresh",
    price: "$3,497",
    note: "One-time payment",
    featured: true,
    badge: "Most Popular",
    features: [
      "Everything in Stack Upgrade",
      "Up to 20 pages",
      "Visual design refresh",
      "Mobile-first optimization",
      "SEO audit + meta setup",
      "Contact form & integrations",
      "60 days post-launch support",
    ],
    cta: "Get Started",
  },
  {
    name: "Full Transformation",
    price: "$5,997+",
    note: "Custom scope",
    featured: false,
    badge: null as string | null,
    features: [
      "Everything in Refresh",
      "Unlimited pages",
      "Complete redesign",
      "Custom functionality",
      "Advanced integrations",
      "90 days priority support",
      "Quarterly check-in call",
    ],
    cta: "Let's Talk",
  },
];

function Pricing() {
  return (
    <section id="pricing" style={{ background: C.surface, padding: "96px 24px" }}>
      <div style={{ maxWidth: "1100px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{ textAlign: "center", marginBottom: "56px" }}
        >
          <span
            style={{
              fontSize: "0.72rem",
              fontWeight: 700,
              letterSpacing: "0.14em",
              textTransform: "uppercase",
              color: C.muted,
            }}
          >
            Simple pricing
          </span>
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(1.8rem, 3.5vw, 3rem)",
              color: C.text,
              marginTop: "12px",
              marginBottom: "10px",
              letterSpacing: "-0.025em",
            }}
          >
            Choose your path forward
          </h2>
          <p style={{ color: C.muted }}>One-time investment. No subscriptions. No hidden fees.</p>
        </motion.div>

        <div
          style={{
            display: "grid",
            gridTemplateColumns: "repeat(auto-fit, minmax(280px, 1fr))",
            gap: "20px",
            alignItems: "start",
          }}
        >
          {plans.map((plan, i) => (
            <motion.div
              key={plan.name}
              initial={{ opacity: 0, y: 28 }}
              whileInView={{ opacity: 1, y: 0 }}
              viewport={{ once: true }}
              transition={{ duration: 0.5, delay: i * 0.1 }}
              style={{
                background: plan.featured ? C.bg : C.surface2,
                border: plan.featured
                  ? `2px solid ${C.green}`
                  : `1px solid ${C.border}`,
                borderRadius: "14px",
                padding: "36px",
                position: "relative",
                boxShadow: plan.featured ? `0 0 48px ${C.green}15` : "none",
              }}
            >
              {plan.badge && (
                <div
                  style={{
                    position: "absolute",
                    top: "-13px",
                    left: "50%",
                    transform: "translateX(-50%)",
                    background: C.yellow,
                    color: "#0B0B0B",
                    fontWeight: 700,
                    fontSize: "0.68rem",
                    letterSpacing: "0.1em",
                    textTransform: "uppercase",
                    padding: "4px 14px",
                    borderRadius: "100px",
                    whiteSpace: "nowrap",
                  }}
                >
                  ⭐ {plan.badge}
                </div>
              )}

              <h3
                style={{
                  fontFamily: "'Syne', system-ui",
                  fontWeight: 700,
                  fontSize: "0.95rem",
                  color: plan.featured ? C.green : C.muted,
                  marginBottom: "16px",
                  letterSpacing: "0.01em",
                }}
              >
                {plan.name}
              </h3>

              <div style={{ marginBottom: "4px" }}>
                <span
                  style={{
                    fontFamily: "'Syne', system-ui",
                    fontWeight: 800,
                    fontSize: "2.8rem",
                    color: C.text,
                    letterSpacing: "-0.03em",
                  }}
                >
                  {plan.price}
                </span>
              </div>
              <div style={{ fontSize: "0.78rem", color: C.muted, marginBottom: "28px" }}>
                {plan.note}
              </div>

              <div style={{ display: "flex", flexDirection: "column", gap: "10px", marginBottom: "32px" }}>
                {plan.features.map((feat) => (
                  <div key={feat} style={{ display: "flex", alignItems: "flex-start", gap: "10px" }}>
                    <div
                      style={{
                        marginTop: "2px",
                        width: "16px",
                        height: "16px",
                        borderRadius: "50%",
                        background: C.greenDim,
                        border: `1px solid ${C.green}45`,
                        display: "flex",
                        alignItems: "center",
                        justifyContent: "center",
                        flexShrink: 0,
                      }}
                    >
                      <Check size={9} color={C.green} />
                    </div>
                    <span style={{ fontSize: "0.85rem", color: C.text, lineHeight: 1.5 }}>
                      {feat}
                    </span>
                  </div>
                ))}
              </div>

              <button
                style={{
                  width: "100%",
                  padding: "13px",
                  background: plan.featured ? C.green : "transparent",
                  color: plan.featured ? C.bg : C.text,
                  border: plan.featured ? "none" : `1px solid ${C.border}`,
                  borderRadius: "8px",
                  fontWeight: 700,
                  fontSize: "0.9rem",
                  cursor: "pointer",
                  fontFamily: "inherit",
                  letterSpacing: "0.01em",
                }}
              >
                {plan.cta}
              </button>
            </motion.div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── Guarantee ────────────────────────────────────────────────────────────────
function Guarantee() {
  return (
    <section style={{ background: C.bg, padding: "80px 24px" }}>
      <div style={{ maxWidth: "800px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, scale: 0.97 }}
          whileInView={{ opacity: 1, scale: 1 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{
            border: `1px solid ${C.border}`,
            borderRadius: "16px",
            padding: "44px 48px",
            display: "flex",
            gap: "28px",
            alignItems: "flex-start",
          }}
        >
          <div
            style={{
              width: "52px",
              height: "52px",
              background: C.greenDim,
              border: `1px solid ${C.green}38`,
              borderRadius: "12px",
              display: "flex",
              alignItems: "center",
              justifyContent: "center",
              flexShrink: 0,
            }}
          >
            <Shield size={24} color={C.green} />
          </div>
          <div>
            <h2
              style={{
                fontFamily: "'Syne', system-ui",
                fontWeight: 800,
                fontSize: "1.5rem",
                color: C.text,
                marginBottom: "12px",
                letterSpacing: "-0.02em",
              }}
            >
              The "No Risk" Guarantee
            </h2>
            <p style={{ color: C.muted, lineHeight: 1.78, fontSize: "0.95rem" }}>
              If your new site isn't noticeably faster, easier to manage, and cheaper to
              run within 30 days of launch — we'll roll you back to WordPress at no cost.
              We've never had to. But the option is yours.
            </p>
          </div>
        </motion.div>
      </div>
    </section>
  );
}

// ─── FAQ ──────────────────────────────────────────────────────────────────────
const faqs = [
  {
    q: "Will my site look different after migration?",
    a: "Only if you want it to. The Stack Upgrade tier keeps your existing design exactly as-is — we just rebuild it on a faster foundation. The Refresh and Transformation tiers include design improvements.",
  },
  {
    q: "How can hosting actually be $0?",
    a: "Modern static and edge-deployed sites are incredibly efficient. Platforms like Vercel and Cloudflare offer generous free tiers that cover most small business sites. No catch — it's a fundamental shift in how websites are served.",
  },
  {
    q: "Can I still edit my content after migration?",
    a: "Absolutely. We set up a simple content management system that lets you update text and images through a clean interface. It's actually easier to use than the WordPress dashboard. No plugins, no updates, no complexity.",
  },
  {
    q: "What about my forms, email signups, and integrations?",
    a: "All handled. Contact forms, email integrations, analytics tracking — everything gets migrated or replaced with modern equivalents that work better and don't require plugins to function.",
  },
  {
    q: "What if something goes wrong?",
    a: "We keep your old WordPress site intact until you're completely satisfied with the new one. You're never without a working website. Plus our 30-day guarantee means you can always roll back.",
  },
  {
    q: "Why only 10 business days?",
    a: "We've built a streamlined migration system. Unlike agencies who quote months because they're juggling dozens of projects, we focus on a small number of migrations at a time and use modern tooling that dramatically speeds up the process.",
  },
];

function FAQ() {
  return (
    <section style={{ background: C.surface, padding: "96px 24px" }}>
      <div style={{ maxWidth: "760px", margin: "0 auto" }}>
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.6 }}
          style={{ textAlign: "center", marginBottom: "48px" }}
        >
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(1.8rem, 3.5vw, 3rem)",
              color: C.text,
              letterSpacing: "-0.025em",
            }}
          >
            Common questions
          </h2>
        </motion.div>

        <div
          style={{
            border: `1px solid ${C.border}`,
            borderRadius: "14px",
            overflow: "hidden",
          }}
        >
          {faqs.map((faq, i) => (
            <motion.details
              key={i}
              initial={{ opacity: 0 }}
              whileInView={{ opacity: 1 }}
              viewport={{ once: true }}
              transition={{ duration: 0.4, delay: i * 0.05 }}
              style={{
                background: C.surface,
                borderBottom: i < faqs.length - 1 ? `1px solid ${C.border}` : "none",
              }}
            >
              <summary
                style={{
                  display: "flex",
                  justifyContent: "space-between",
                  alignItems: "center",
                  gap: "16px",
                  padding: "20px 24px",
                  cursor: "pointer",
                  listStyle: "none",
                  userSelect: "none",
                }}
              >
                <span style={{ fontWeight: 600, color: C.text, fontSize: "0.9rem" }}>
                  {faq.q}
                </span>
                <ChevronDown size={15} color={C.muted} style={{ flexShrink: 0 }} />
              </summary>
              <div
                style={{
                  padding: "0 24px 20px",
                  color: C.muted,
                  fontSize: "0.875rem",
                  lineHeight: 1.78,
                }}
              >
                {faq.a}
              </div>
            </motion.details>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── Final CTA ────────────────────────────────────────────────────────────────
function FinalCTA() {
  return (
    <section style={{ background: C.bg, padding: "120px 24px" }}>
      <div style={{ maxWidth: "760px", margin: "0 auto", textAlign: "center" }}>
        <motion.div
          initial={{ opacity: 0, y: 28 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.7 }}
        >
          <h2
            style={{
              fontFamily: "'Syne', system-ui",
              fontWeight: 800,
              fontSize: "clamp(2rem, 4.5vw, 4rem)",
              color: C.text,
              lineHeight: 1.06,
              marginBottom: "20px",
              letterSpacing: "-0.03em",
            }}
          >
            Your website should work{" "}
            <em style={{ color: C.green, fontStyle: "italic" }}>for you</em>,<br />
            not against you.
          </h2>
          <p
            style={{
              color: C.muted,
              fontSize: "1.05rem",
              maxWidth: "480px",
              margin: "0 auto 40px",
              lineHeight: 1.7,
            }}
          >
            Get a free speed audit and see exactly what's slowing you down.
          </p>
          <a
            href="#"
            style={{
              display: "inline-flex",
              alignItems: "center",
              gap: "10px",
              background: C.green,
              color: C.bg,
              padding: "16px 36px",
              borderRadius: "8px",
              fontWeight: 700,
              fontSize: "1rem",
              textDecoration: "none",
              boxShadow: `0 0 40px ${C.green}25`,
            }}
          >
            Get Your Free Site Audit <ArrowRight size={18} />
          </a>
        </motion.div>
      </div>
    </section>
  );
}

// ─── Footer ───────────────────────────────────────────────────────────────────
function Footer() {
  return (
    <footer
      style={{
        background: C.surface,
        borderTop: `1px solid ${C.border}`,
        padding: "28px 24px",
      }}
    >
      <div
        style={{
          maxWidth: "1100px",
          margin: "0 auto",
          display: "flex",
          alignItems: "center",
          justifyContent: "space-between",
          flexWrap: "wrap",
          gap: "12px",
        }}
      >
        <span
          style={{
            fontFamily: "'Syne', system-ui",
            fontWeight: 700,
            color: C.muted,
            fontSize: "0.85rem",
          }}
        >
          © 2026 The Modern Migration
        </span>
        <a
          href="mailto:[email protected]"
          style={{ color: C.muted, fontSize: "0.85rem", textDecoration: "none" }}
        >
          [email protected]
        </a>
      </div>
    </footer>
  );
}

// ─── Root ─────────────────────────────────────────────────────────────────────
export default function ModernMigration() {
  useEffect(() => {
    const link = document.createElement("link");
    link.rel = "stylesheet";
    link.href =
      "https://fonts.googleapis.com/css2?family=Syne:wght@700;800&family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;1,9..40,400&display=swap";
    document.head.appendChild(link);
    document.body.style.background = C.bg;
    return () => {
      try {
        document.head.removeChild(link);
      } catch {}
      document.body.style.background = "";
    };
  }, []);

  return (
    <div
      style={{
        fontFamily: "'DM Sans', system-ui, sans-serif",
        WebkitFontSmoothing: "antialiased",
      }}
    >
      <Nav />
      <Hero />
      <PainPoints />
      <Comparison />
      <Speed />
      <Included />
      <Pricing />
      <Guarantee />
      <FAQ />
      <FinalCTA />
      <Footer />
    </div>
  );
}
Claude Code Instructions

CLI Install

npx innovations add modern-migration

Where to use it

Use this full-page landing page for a WordPress migration service. It's self-contained with its own dark color system (electric green accents, near-black background) and loads Syne + DM Sans from Google Fonts. In Astro (src/pages/index.astro): import ModernMigration from '../components/innovations/experiments/modern-migration'; <ModernMigration client:load /> In Next.js (app/page.tsx): 'use client'; import ModernMigration from '@/components/innovations/experiments/modern-migration'; export default function Page() { return <ModernMigration />; } Customization: - Edit the C object at the top to retheme (green accent, background, surface colors) - Update copy in each data array: painPoints, beforeList/afterList, included, plans, faqs - Swap the Google Fonts URL in useEffect to change typefaces - Anchor IDs (#pricing, #how-it-works) are already wired in the Nav CTAs