/* Mid sections — about, why-choose, services, process. */

/* ─────────────────────────────────────────────────────────────────
   ABOUT — image, stats grid, CTAs
   ───────────────────────────────────────────────────────────────── */
function About() {
  return (
    <section id="about" className="relative py-24 md:py-32" style={{ borderTop: "1px solid var(--border)" }}>
      <div className="max-w-7xl mx-auto px-6">
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 420px), 1fr))", gap: "4rem", alignItems: "center" }}>
          <Reveal y={20}>
            <div style={{ position: "relative" }}>
              <img
                src="images/about-studio.jpg"
                alt="Axious Creative Studio workspace"
                loading="lazy" decoding="async"
                style={{ width: "100%", borderRadius: 20, display: "block", border: "1px solid var(--border)" }}
              />
              <div style={{ position: "absolute", bottom: -18, right: 24, background: "var(--bg-card)", borderRadius: 14, padding: "12px 18px", border: "1px solid var(--border)", display: "flex", alignItems: "center", gap: 10, boxShadow: "0 4px 20px rgba(0,0,0,0.08)" }}>
                <div style={{ fontSize: 22, fontWeight: 800, color: "var(--accent)", fontFamily: "'Crimson Text', serif", lineHeight: 1 }}>5.0★</div>
                <div>
                  <div style={{ fontSize: 11, fontWeight: 700, color: "var(--text)", lineHeight: 1.2 }}>Google Rating</div>
                  <div style={{ fontSize: 10, color: "var(--text-muted)", marginTop: 2 }}>40+ businesses</div>
                </div>
              </div>
            </div>
          </Reveal>

          <Reveal y={20} delay={0.15}>
            <div>
              <SectionHead label="Who We Are" title="Axious Creative Studio" />
              <p style={{ fontSize: 17, lineHeight: 1.75, color: "var(--text-secondary)", marginTop: "1rem" }}>
                A <strong style={{ color: "var(--accent)", fontWeight: 700 }}>5-star rated</strong> web design studio based in Cape Town — building 100% custom-coded websites from scratch. No WordPress, no templates. Every project hand-built for speed, SEO, and complete design freedom.
              </p>
              <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1.5rem 2.5rem", margin: "2rem 0 2.25rem" }}>
                {[
                  { num: "40+", label: "Websites Built" },
                  { num: "5.0★", label: "Google Rating" },
                  { num: "7 days", label: "Avg. Delivery" },
                  { num: "R2,499", label: "Starting Price" },
                ].map((s, i) => (
                  <div key={i}>
                    <div style={{ fontSize: 30, fontWeight: 800, color: "var(--accent)", fontFamily: "'Crimson Text', serif", lineHeight: 1, letterSpacing: "-0.02em" }}>{s.num}</div>
                    <div style={{ fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.12em", color: "var(--text-muted)", marginTop: 4, fontFamily: "'Roboto Mono', monospace" }}>{s.label}</div>
                  </div>
                ))}
              </div>
              <div style={{ display: "flex", gap: 12, flexWrap: "wrap" }}>
                <a href="#packages" style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "0.75rem 1.5rem", borderRadius: 9999, background: "var(--accent)", color: "#fff", fontWeight: 700, fontSize: 13, letterSpacing: "0.07em", textTransform: "uppercase", textDecoration: "none" }}>
                  View Packages
                </a>
                <a href="#work" style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "0.75rem 1.5rem", borderRadius: 9999, border: "1.5px solid var(--border)", color: "var(--text)", fontWeight: 700, fontSize: 13, letterSpacing: "0.07em", textTransform: "uppercase", textDecoration: "none" }}>
                  Our Work
                </a>
              </div>
            </div>
          </Reveal>
        </div>
      </div>
    </section>
  );
}

/* ─────────────────────────────────────────────────────────────────
   WHY CHOOSE — editorial benefit rows
   ───────────────────────────────────────────────────────────────── */
const WHY_BENEFITS = [
  { stat: "R2,499", title: "Affordable Pricing", desc: "Website packages starting from R2,499 — transparent, all-inclusive pricing with no hidden fees. Pay a deposit to start, balance only on delivery." },
  { stat: "5.0★", title: "5-Star Rated Studio", desc: "Over 40 South African businesses built and launched. Every project is backed by a written service agreement and dedicated aftercare support." },
  { stat: "24/7", title: "Your Own Client Portal", desc: "Log in to your personal portal to track project milestones, view live website performance analytics, and make payments online — any time." },
  { stat: "90+", title: "Built for Google", desc: "Every website ships scoring 90+ on Google PageSpeed. SSL secured, mobile-first, and structured for SEO dominance from day one." },
  { stat: "0", title: "Zero Templates Used", desc: "100% hand-coded React — no WordPress, no Wix, no page builders. You own a bespoke digital asset built exactly for your business." },
  { stat: "SA", title: "South African Support", desc: "Cape Town-based team available on WhatsApp and email. Same-day responses, local market understanding, and nationwide service." },
];

function WhyChoose() {
  return (
    <section id="why-choose" className="relative py-24 md:py-32" style={{ background: "var(--bg)", borderTop: "1px solid var(--border)" }}>
      <div className="max-w-5xl mx-auto px-6">
        <SectionHead label="Why Invest Professionally" title="Why businesses choose Axious." sub="From affordable pricing to a dedicated client portal — here is everything you get when you build with us." />
        <div className="mt-12" style={{ borderTop: "1px solid var(--border)" }}>
          {WHY_BENEFITS.map((b, i) => (
            <Reveal key={i} y={12}>
              <div
                style={{ display: "grid", gridTemplateColumns: "5.5rem 1fr", gap: "1.5rem 2rem", padding: "1.75rem 0.75rem", borderBottom: "1px solid var(--border)", alignItems: "start", transition: "background 0.18s ease", borderRadius: 8, marginLeft: "-0.75rem", marginRight: "-0.75rem", cursor: "default" }}
                onMouseEnter={e => e.currentTarget.style.background = "rgba(249,115,22,0.025)"}
                onMouseLeave={e => e.currentTarget.style.background = "transparent"}
              >
                <div style={{ fontSize: 30, fontWeight: 800, color: "var(--accent)", fontFamily: "'Crimson Text', serif", lineHeight: 1, letterSpacing: "-0.02em", paddingTop: 3 }}>{b.stat}</div>
                <div>
                  <h3 style={{ fontSize: 16, fontWeight: 700, color: "var(--text)", margin: "0 0 6px" }}>{b.title}</h3>
                  <p style={{ fontSize: 14, color: "var(--text-muted)", lineHeight: 1.7, margin: 0 }}>{b.desc}</p>
                </div>
              </div>
            </Reveal>
          ))}
        </div>
        <Reveal y={16} delay={0.2}>
          <div style={{ marginTop: "2.5rem", display: "flex", gap: 12, flexWrap: "wrap" }}>
            <a href="#packages" style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "0.75rem 1.5rem", borderRadius: 9999, background: "var(--accent)", color: "#fff", fontWeight: 700, fontSize: 13, letterSpacing: "0.07em", textTransform: "uppercase", textDecoration: "none" }}>
              Start Your Project
            </a>
            <a href="#packages" style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "0.75rem 1.5rem", borderRadius: 9999, border: "1.5px solid var(--border)", color: "var(--text)", fontWeight: 700, fontSize: 13, letterSpacing: "0.07em", textTransform: "uppercase", textDecoration: "none" }}>
              View Packages
            </a>
          </div>
        </Reveal>
      </div>
    </section>
  );
}

/* ─────────────────────────────────────────────────────────────────
   SERVICES — grid with cursor-following spotlight + reveal-on-hover detail.
   ───────────────────────────────────────────────────────────────── */
const SERVICES = [
  {
    code: "01",
    title: "Custom websites",
    blurb: "Hand-coded React or Astro — no Wix, no Wordpress. Designed for your brand, not a template.",
    bullets: ["5–25 page builds", "Mobile-first", "SSR + edge cache"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><path d="M4 8h24v18H4z M4 14h24" stroke="currentColor" strokeWidth="1.8"/><circle cx="7" cy="11" r="0.9" fill="currentColor"/><circle cx="10" cy="11" r="0.9" fill="currentColor"/><circle cx="13" cy="11" r="0.9" fill="currentColor"/></svg>
    ),
  },
  {
    code: "02",
    title: "E-commerce",
    blurb: "Yoco, PayFast, Stripe — wired with inventory, shipping, abandoned-cart and South-African tax.",
    bullets: ["Multi-currency", "Shopify + custom", "POS sync"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><path d="M6 9h20l-2 13H8L6 9zm0 0L4 4H1" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/><circle cx="12" cy="27" r="1.5" stroke="currentColor" strokeWidth="1.8"/><circle cx="22" cy="27" r="1.5" stroke="currentColor" strokeWidth="1.8"/></svg>
    ),
  },
  {
    code: "03",
    title: "AI chat & ops",
    blurb: "GPT-powered assistants tied to your booking, quotes and CRM — answers in seconds, books in one tap.",
    bullets: ["WhatsApp integration", "Lead capture", "Auto-quote"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><path d="M5 7h22v15H13l-6 5v-5H5V7z" stroke="currentColor" strokeWidth="1.8" strokeLinejoin="round"/><circle cx="12" cy="14.5" r="1.2" fill="currentColor"/><circle cx="16" cy="14.5" r="1.2" fill="currentColor"/><circle cx="20" cy="14.5" r="1.2" fill="currentColor"/></svg>
    ),
  },
  {
    code: "04",
    title: "Client portals",
    blurb: "Logged-in dashboards for invoices, files, bookings, support — your brand, your data.",
    bullets: ["Auth + roles", "Stripe / PayFast", "Audit logs"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><rect x="4" y="6" width="24" height="20" rx="2" stroke="currentColor" strokeWidth="1.8"/><path d="M4 12h24M9 19h6M9 22h10" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"/></svg>
    ),
  },
  {
    code: "05",
    title: "SEO & growth",
    blurb: "Local + technical SEO with monthly reports. Page-one Cape Town listings for the keywords that pay.",
    bullets: ["Core web vitals", "Schema markup", "Backlink outreach"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><path d="M4 25l7-9 5 5 8-12 4 5" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/><circle cx="11" cy="16" r="1.2" fill="currentColor"/><circle cx="16" cy="21" r="1.2" fill="currentColor"/><circle cx="24" cy="9" r="1.2" fill="currentColor"/></svg>
    ),
  },
  {
    code: "06",
    title: "POS systems",
    blurb: "Cloud point-of-sale, hardware install + staff training. Live inventory across all your stores.",
    bullets: ["Restaurants / retail", "Offline-first", "Hardware kit"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><rect x="5" y="4" width="22" height="16" rx="2" stroke="currentColor" strokeWidth="1.8"/><path d="M9 24h14l-2 4H11l-2-4z" stroke="currentColor" strokeWidth="1.8" strokeLinejoin="round"/><circle cx="16" cy="12" r="3" stroke="currentColor" strokeWidth="1.8"/></svg>
    ),
  },
  {
    code: "07",
    title: "Axious Smart Chat",
    blurb: "WhatsApp Business API chatbots that sell, book and support 24/7 — on the channel your clients already use.",
    bullets: ["WhatsApp API verified", "AI-powered replies", "Broadcasts & CRM sync"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><path d="M16 3C8.83 3 3 8.83 3 16c0 2.33.63 4.52 1.73 6.41L3 29l6.73-1.7A12.9 12.9 0 0016 29c7.17 0 13-5.83 13-13S23.17 3 16 3z" stroke="currentColor" strokeWidth="1.8" strokeLinejoin="round"/><circle cx="11" cy="16" r="1.2" fill="currentColor"/><circle cx="16" cy="16" r="1.2" fill="currentColor"/><circle cx="21" cy="16" r="1.2" fill="currentColor"/></svg>
    ),
  },
  {
    code: "08",
    title: "Business email",
    blurb: "Professional @yourdomain.co.za mailboxes, email marketing campaigns and branded signatures for your whole team.",
    bullets: ["@yourdomain mailboxes", "Campaign manager", "Mobile sync + calendar"],
    icon: (
      <svg viewBox="0 0 32 32" fill="none" width="22" height="22"><rect x="3" y="6" width="26" height="20" rx="2.5" stroke="currentColor" strokeWidth="1.8"/><path d="M3 9l13 9 13-9" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"/></svg>
    ),
  },
];

function ServiceCard({ s }) {
  const ref = useRef(null);
  const [pos, setPos] = useState({ x: -200, y: -200, hovered: false });
  const onMove = (e) => {
    const r = ref.current.getBoundingClientRect();
    setPos({ x: e.clientX - r.left, y: e.clientY - r.top, hovered: true });
  };
  const onLeave = () => setPos((p) => ({ ...p, hovered: false }));
  return (
    <div
      ref={ref}
      onMouseMove={onMove}
      onMouseLeave={onLeave}
      className="group relative overflow-hidden p-7 md:p-8"
      style={{
        background: "var(--bg-card)",
        border: "1px solid var(--border)",
        borderRadius: 20,
        transition: `transform 0.5s ${EASE_OUT}, border-color 0.35s ease, box-shadow 0.5s ease`,
        transform: pos.hovered ? "translateY(-3px)" : "translateY(0)",
        borderColor: pos.hovered ? "rgba(249,115,22,0.4)" : "var(--border)",
        boxShadow: pos.hovered ? "0 30px 60px -30px rgba(249,115,22,0.18)" : "0 0 0 rgba(0,0,0,0)",
      }}
    >
      {/* spotlight */}
      <div
        aria-hidden
        style={{
          position: "absolute",
          inset: 0,
          opacity: pos.hovered ? 1 : 0,
          background: `radial-gradient(280px circle at ${pos.x}px ${pos.y}px, rgba(249,115,22,0.10), transparent 65%)`,
          transition: "opacity 0.35s ease",
          pointerEvents: "none",
        }}
      />
      <div className="relative flex items-start justify-between">
        <div style={{ color: "var(--accent)", fontFamily: "'Roboto Mono', monospace", fontSize: 11.5, letterSpacing: "0.16em" }}>{s.code}</div>
        <div
          style={{
            color: "var(--accent)",
            transform: pos.hovered ? "rotate(-5deg) scale(1.08)" : "rotate(0) scale(1)",
            transition: `transform 0.5s ${EASE_SPRING}`,
          }}
        >
          {s.icon}
        </div>
      </div>
      <h3 className="relative mt-6" style={{ fontFamily: "'Crimson Text', Georgia, serif", fontWeight: 400, fontSize: 28, letterSpacing: "-0.015em" }}>
        {s.title}
      </h3>
      <p className="relative mt-3" style={{ color: "var(--text-secondary)", fontSize: 15, lineHeight: 1.55 }}>
        {s.blurb}
      </p>
      <ul className="relative mt-5 space-y-1.5" style={{ fontFamily: "'Roboto Mono', monospace", fontSize: 12, letterSpacing: "0.04em" }}>
        {s.bullets.map((b, i) => (
          <li
            key={i}
            style={{
              color: "var(--text-secondary)",
              transform: pos.hovered ? "translateX(2px)" : "translateX(0)",
              transition: `transform 0.4s ${EASE_OUT} ${i * 0.04}s, color 0.3s ease`,
            }}
          >
            <span style={{ color: "var(--accent)", marginRight: 8 }}>—</span>{b}
          </li>
        ))}
      </ul>
      <div className="relative mt-7 flex items-center justify-between">
        <a href="#services" className="inline-flex items-center gap-1.5 text-[12px] tracking-[0.08em] uppercase font-bold" style={{ fontFamily: "'Roboto Mono', monospace", color: "var(--accent)" }}>
          Explore
          <svg width="12" height="12" viewBox="0 0 24 24" fill="none" style={{ transform: pos.hovered ? "translateX(4px)" : "translateX(0)", transition: `transform 0.35s ${EASE_OUT}` }}>
            <path d="M5 12h14M13 5l7 7-7 7" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round"/>
          </svg>
        </a>
      </div>
    </div>
  );
}

function Services() {
  return (
    <section id="services" className="relative py-24 md:py-32">
      <div className="max-w-7xl mx-auto px-6">
        <SectionHead label="Services / 01" title="Everything your brand needs, in one studio." sub="From the first wireframe to the live AI assistant that handles your inbox, we build the whole stack — no agency relay." />
        <Stagger as="div" step={0.08} y={28} className="mt-14 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5">
          {SERVICES.map((s) => <TiltCard key={s.code} strength={7}><ServiceCard s={s} /></TiltCard>)}
        </Stagger>
      </div>
    </section>
  );
}

function SectionHead({ label, title, sub, align = "left" }) {
  return (
    <div className={align === "center" ? "text-center mx-auto" : ""} style={{ maxWidth: align === "center" ? 760 : 800 }}>
      <Reveal y={10}>
        <div style={{ fontFamily: "'Roboto Mono', monospace", fontSize: 11.5, letterSpacing: "0.16em", textTransform: "uppercase", color: "var(--text-muted)" }}>
          <span style={{ color: "var(--accent)" }}>◆</span> &nbsp;{label}
        </div>
      </Reveal>
      <h2 className="mt-5" style={{ fontFamily: "'Crimson Text', Georgia, serif", fontSize: "clamp(2rem, 4.4vw, 3.6rem)", lineHeight: 1.08, letterSpacing: "-0.025em", fontWeight: 400, overflow: "hidden" }}>
        <LineReveal lines={title.includes("\n") ? title.split("\n") : [title]} delay={0.05} stagger={0.1} />
      </h2>
      {sub && (
        <BlurReveal delay={0.2} duration={0.8}>
          <p className="mt-5" style={{ color: "var(--text-secondary)", fontSize: "clamp(1rem, 1.2vw, 1.125rem)", lineHeight: 1.6, maxWidth: 620 }}>
            {sub}
          </p>
        </BlurReveal>
      )}
    </div>
  );
}

/* ─────────────────────────────────────────────────────────────────
   PROCESS — sticky vertical timeline that reveals as you scroll.
   Framer: useScroll({offset: ["start end", "end start"]}) → useTransform.
   ───────────────────────────────────────────────────────────────── */
const STEPS = [
  { n: "01", title: "Discovery call", body: "30-minute deep-dive on the business, the audience, the competition. Comes back as a written brief." },
  { n: "02", title: "Brand + wireframes", body: "Black-and-white blueprints first — structure before colour. We iterate fast on Figma." },
  { n: "03", title: "Hi-fi design", body: "Pixel-perfect screens with motion specs. You approve every screen before code." },
  { n: "04", title: "Hand-coded build", body: "React or Astro, written from scratch. Live preview links update daily." },
  { n: "05", title: "Launch + grow", body: "We migrate DNS, set SEO, train your team and stay on call for the first 30 days." },
];

function Process() {
  const ref = useRef(null);
  const [progress, setProgress] = useState(0);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const onScroll = () => {
      const r = el.getBoundingClientRect();
      const vh = window.innerHeight;
      // 0 when top of section enters bottom of viewport, 1 when bottom leaves top
      const total = r.height + vh;
      const passed = Math.min(Math.max(vh - r.top, 0), total);
      setProgress(Math.min(1, passed / total));
    };
    onScroll();
    window.addEventListener("scroll", onScroll, { passive: true });
    return () => window.removeEventListener("scroll", onScroll);
  }, []);

  return (
    <section id="process" ref={ref} className="relative py-24 md:py-32" style={{ background: "#0b0b0c", color: "#fff" }}>
      <div className="max-w-7xl mx-auto px-6 grid grid-cols-1 lg:grid-cols-12 gap-12">
        <div className="lg:col-span-5">
          <div style={{ position: "sticky", top: 120 }}>
            <Reveal y={14}>
              <div style={{ fontFamily: "'Roboto Mono', monospace", fontSize: 11.5, letterSpacing: "0.16em", textTransform: "uppercase", color: "rgba(255,255,255,0.55)" }}>
                <span style={{ color: "var(--accent)" }}>◆</span>&nbsp; Process / 02
              </div>
            </Reveal>
            <Reveal y={20} delay={0.1}>
              <h2 className="mt-5" style={{ fontFamily: "'Crimson Text', Georgia, serif", fontSize: "clamp(2rem, 4.4vw, 3.6rem)", lineHeight: 1.05, letterSpacing: "-0.025em", fontWeight: 400 }}>
                Five weeks.<br />Five honest steps.
              </h2>
            </Reveal>
            <Reveal y={18} delay={0.2}>
              <p className="mt-6" style={{ color: "rgba(255,255,255,0.6)", fontSize: 17, lineHeight: 1.6, maxWidth: 460 }}>
                No black-box agencies, no surprise invoices. You see the work as it happens — and you approve every milestone before we move on.
              </p>
            </Reveal>
            <Reveal y={18} delay={0.28}>
              <div className="mt-8 flex items-center gap-4">
                <div style={{ width: 64, height: 64, borderRadius: "50%", background: "linear-gradient(135deg, #f97316, #ea580c)", display: "grid", placeItems: "center", color: "#fff", fontFamily: "'Crimson Text', Georgia, serif", fontSize: 26 }}>
                  E
                </div>
                <div>
                  <div style={{ fontSize: 14, fontWeight: 600 }}>Elvis Mthembu</div>
                  <div style={{ fontSize: 12, color: "rgba(255,255,255,0.5)", fontFamily: "'Roboto Mono', monospace" }}>Founder &amp; Lead Developer</div>
                </div>
              </div>
            </Reveal>
          </div>
        </div>

        <div className="lg:col-span-7 relative">
          {/* spine */}
          <div aria-hidden style={{ position: "absolute", left: 13, top: 8, bottom: 8, width: 2, background: "rgba(255,255,255,0.08)", borderRadius: 2 }} />
          <div aria-hidden style={{ position: "absolute", left: 13, top: 8, width: 2, height: `${progress * 100}%`, background: "linear-gradient(180deg, #f97316, #ea580c)", borderRadius: 2, transition: "height 0.2s linear" }} />
          <ol className="space-y-10 relative">
            {STEPS.map((s, i) => (
              <ProcessStep key={s.n} step={s} index={i} progress={progress} />
            ))}
          </ol>
        </div>
      </div>
    </section>
  );
}

function ProcessStep({ step, index, progress }) {
  const ref = useRef(null);
  const [inView, setInView] = useState(false);
  useEffect(() => {
    if (!ref.current) return;
    const io = new IntersectionObserver((es) => es.forEach((e) => setInView(e.isIntersecting)), { rootMargin: "-40% 0px -40% 0px" });
    io.observe(ref.current);
    return () => io.disconnect();
  }, []);
  return (
    <li ref={ref} className="relative pl-14">
      <span
        aria-hidden
        style={{
          position: "absolute", left: 0, top: 4,
          width: 28, height: 28, borderRadius: "50%",
          background: inView ? "var(--accent)" : "#1a1a1c",
          border: `1px solid ${inView ? "var(--accent)" : "rgba(255,255,255,0.12)"}`,
          display: "grid", placeItems: "center",
          transition: `all 0.5s ${EASE_OUT}`,
          boxShadow: inView ? "0 0 0 6px rgba(249,115,22,0.18)" : "none",
        }}
      >
        <span style={{ width: 6, height: 6, borderRadius: "50%", background: inView ? "#fff" : "rgba(255,255,255,0.3)" }} />
      </span>
      <Reveal y={16}>
        <div style={{ fontFamily: "'Roboto Mono', monospace", fontSize: 11, letterSpacing: "0.16em", color: "rgba(255,255,255,0.45)" }}>STEP {step.n}</div>
        <h3 className="mt-2" style={{ fontFamily: "'Crimson Text', Georgia, serif", fontSize: 28, fontWeight: 400, letterSpacing: "-0.02em" }}>{step.title}</h3>
        <p className="mt-3 max-w-md" style={{ color: "rgba(255,255,255,0.6)", fontSize: 15.5, lineHeight: 1.6 }}>{step.body}</p>
      </Reveal>
    </li>
  );
}

Object.assign(window, { Services, ServiceCard, SectionHead, Process, ProcessStep });
