"use client"; import { motion, useInView } from "framer-motion"; import { useEffect, useRef, useState } from "react"; import { landingHowItWorksNarrative } from "../lib/product-narrative"; const demoMessages = landingHowItWorksNarrative.demoMessages; const logTone: Record<(typeof demoMessages)[number]["role"], string> = { system: "text-[var(--muted-strong)]", }; const dotTone: Record<(typeof demoMessages)[number]["role"], string> = { system: "bg-[var(--muted-strong)]", }; const steps = landingHowItWorksNarrative.steps; function DemoPanel() { const anchorRef = useRef(null); const isVisible = useInView(anchorRef, { once: true, amount: 0.4 }); const [visibleCount, setVisibleCount] = useState(0); const logRef = useRef(null); useEffect(() => { if (!isVisible) return; const timers = demoMessages.map((message, index) => window.setTimeout(() => setVisibleCount(index + 1), message.delay), ); return () => timers.forEach((timer) => window.clearTimeout(timer)); }, [isVisible]); useEffect(() => { if (logRef.current) { logRef.current.scrollTop = logRef.current.scrollHeight; } }, [visibleCount]); return (
{demoMessages.slice(0, visibleCount).map((message, index) => ( {message.text} ))} {visibleCount < demoMessages.length && isVisible && (
); } export function HowItWorks() { return (

How It Works

{landingHowItWorksNarrative.heading}

); }