// Lithosbase — Demo guidata
// Interactive tour over a frozen mock of the app/catalog.
// 7 routes: intro, step-1..5, finish.

// ============== i18n ==============
const DEMO_I18N = {
  it: {
    banner: "Stai esplorando la demo · Laboratorio Rossi · sola lettura",
    bannerSkip: "Salta al finale",
    bannerExit: "Esci",
    stepLabel: (n) => `PASSO ${n} / 05`,
    prev: "Indietro",
    next: "Prossimo",
    finish: "Finale",
    introEyebrow: "Tour interattivo · 5 minuti",
    introH1a: "Esplora Lithosbase senza ",
    introH1accent: "registrarti",
    introH1b: ".",
    introBody: 'Ambiente demo in sola lettura del workspace "Laboratorio Rossi". Materiali, movimenti, catalogo e team reali — solo per guardare. Cinque passi guidati. Esci quando vuoi.',
    introStart: "Inizia il tour",
    introBack: "Torna al sito",
    tourSections: ["Stock","Movimenti","Catalogo","Team","Export"],
    finaleEyebrow: "Tour completato",
    finaleH1a: "Hai visto come ",
    finaleH1accent: "funziona",
    finaleH1b: ". Vuoi provare con i tuoi dati?",
    finaleBody: "Crea il tuo workspace e importa lo stock esistente da un CSV. Due minuti. Niente carta di credito, niente periodo di prova a tempo.",
    finaleCreate: "Crea il tuo workspace",
    finaleRestart: "Rifai il tour",
    finaleExit: "torna al sito",
    steps: [
      { title: "Stock in tempo reale.", body: "Tutto il magazzino in una sola tabella. Ogni materiale ha SKU, dimensioni, soglia e status. Le righe sotto soglia sono evidenziate — niente fogli Excel da chiudere la sera.", bullets: ["SKU auto-generato (modificabile)","Soglie e alert per categoria","Sotto soglia in giallo, esaurito in rosso"] },
      { title: "Un movimento, in due gesti.", body: "Carico, scarico o taglio. Apri il modulo, scegli il materiale, conferma. L'operatore registra dal telefono — le mani sporche non sono un problema, i bottoni sono grandi.", bullets: ["Carichi e scarichi firmati per operatore","Taglio lastra → offcut tracciato come figlio","Note libere, foto opzionale"] },
      { title: "Catalogo pubblico, dietro il tuo nome.", body: "Un URL pulito per ogni laboratorio. I clienti vedono i tuoi marmi — non Lithosbase. Disponibilità sincronizzata con il magazzino: se è esaurito, sparisce.", bullets: ["lithosbase.app/c/laboratorio-rossi","Toggle pubblico/privato per singolo materiale","Form contatto integrato"] },
      { title: "Tre ruoli. Permessi espliciti.", body: "Owner, Admin, Operatore. Inviti via email con scadenza. Ogni movimento è firmato — quando manca una lastra, si sa chi l'ha presa.", bullets: ["Owner imposta il workspace","Admin gestisce team e categorie","Operatore registra carichi e scarichi"] },
      { title: "Export per chiunque ti serva.", body: "Excel per il commercialista. PDF per il cliente. CSV per importare in altri gestionali. Filtri per data, categoria, operatore — esci esattamente quello che ti chiedono.", bullets: ["Stock attuale o storico filtrato","Excel, PDF, CSV","Inviato per email o scaricato"] },
    ],
  },
  en: {
    banner: "You're exploring the demo · Stone Workshop · read-only",
    bannerSkip: "Skip to end",
    bannerExit: "Exit",
    stepLabel: (n) => `STEP ${n} / 05`,
    prev: "Back",
    next: "Next",
    finish: "Finish",
    introEyebrow: "Interactive tour · 5 minutes",
    introH1a: "Explore Lithosbase without ",
    introH1accent: "signing up",
    introH1b: ".",
    introBody: 'Read-only demo of the "Stone Workshop" workspace. Real materials, movements, catalog and team — just for browsing. Five guided steps. Exit whenever you want.',
    introStart: "Start the tour",
    introBack: "Back to site",
    tourSections: ["Stock","Movements","Catalog","Team","Export"],
    finaleEyebrow: "Tour complete",
    finaleH1a: "You've seen how it ",
    finaleH1accent: "works",
    finaleH1b: ". Want to try it with your data?",
    finaleBody: "Create your workspace and import your existing stock from a CSV. Two minutes. No credit card, no time-limited trial.",
    finaleCreate: "Create your workspace",
    finaleRestart: "Restart the tour",
    finaleExit: "back to site",
    steps: [
      { title: "Real-time stock.", body: "Your entire warehouse in a single table. Every material has a SKU, dimensions, threshold and status. Low-stock rows are highlighted — no more spreadsheets to close in the evening.", bullets: ["Auto-generated SKU (editable)","Thresholds and alerts per category","Low stock in yellow, out of stock in red"] },
      { title: "A movement, in two taps.", body: "Load, unload or cut. Open the form, pick the material, confirm. The operator records from their phone — dirty hands aren't a problem, the buttons are big.", bullets: ["Loads and unloads signed by operator","Slab cut → offcut tracked as child","Free notes, optional photo"] },
      { title: "Public catalog, under your name.", body: "A clean URL for every workshop. Clients see your marble — not Lithosbase. Availability synced with your stock: if it's out, it disappears.", bullets: ["lithosbase.app/c/stone-workshop","Public/private toggle per material","Integrated contact form"] },
      { title: "Three roles. Explicit permissions.", body: "Owner, Admin, Operator. Email invites with expiry. Every movement is signed — when a slab is missing, you know who took it.", bullets: ["Owner configures the workspace","Admin manages team and categories","Operator records loads and unloads"] },
      { title: "Export for whoever needs it.", body: "Excel for your accountant. PDF for your client. CSV for other systems. Filter by date, category, operator — export exactly what they ask for.", bullets: ["Current stock or filtered history","Excel, PDF, CSV","Sent by email or downloaded"] },
    ],
  },
  es: {
    banner: "Estás explorando la demo · Laboratorio Rossi · solo lectura",
    bannerSkip: "Saltar al final",
    bannerExit: "Salir",
    stepLabel: (n) => `PASO ${n} / 05`,
    prev: "Atrás",
    next: "Siguiente",
    finish: "Final",
    introEyebrow: "Tour interactivo · 5 minutos",
    introH1a: "Explora Lithosbase sin ",
    introH1accent: "registrarte",
    introH1b: ".",
    introBody: 'Demo de solo lectura del workspace "Laboratorio Rossi". Materiales, movimientos, catálogo y equipo reales — solo para mirar. Cinco pasos guiados. Sal cuando quieras.',
    introStart: "Iniciar el tour",
    introBack: "Volver al sitio",
    tourSections: ["Stock","Movimientos","Catálogo","Equipo","Exportar"],
    finaleEyebrow: "Tour completado",
    finaleH1a: "Has visto cómo ",
    finaleH1accent: "funciona",
    finaleH1b: ". ¿Quieres probarlo con tus datos?",
    finaleBody: "Crea tu workspace e importa el stock existente desde un CSV. Dos minutos. Sin tarjeta de crédito, sin período de prueba.",
    finaleCreate: "Crea tu workspace",
    finaleRestart: "Repetir el tour",
    finaleExit: "volver al sitio",
    steps: [
      { title: "Stock en tiempo real.", body: "Todo el almacén en una sola tabla. Cada material tiene SKU, dimensiones, umbral y estado. Las filas por debajo del umbral están resaltadas.", bullets: ["SKU auto-generado (editable)","Umbrales y alertas por categoría","Bajo umbral en amarillo, agotado en rojo"] },
      { title: "Un movimiento, en dos pasos.", body: "Carga, descarga o corte. Abre el formulario, elige el material, confirma. El operador registra desde el móvil — las manos sucias no son problema.", bullets: ["Cargas y descargas firmadas por operador","Corte de losa → retazo rastreado como hijo","Notas libres, foto opcional"] },
      { title: "Catálogo público, bajo tu nombre.", body: "Una URL limpia para cada laboratorio. Los clientes ven tus mármoles, no Lithosbase. Disponibilidad sincronizada con el stock.", bullets: ["lithosbase.app/c/laboratorio-rossi","Toggle público/privado por material","Formulario de contacto integrado"] },
      { title: "Tres roles. Permisos explícitos.", body: "Owner, Admin, Operador. Invitaciones por email con caducidad. Cada movimiento está firmado.", bullets: ["Owner configura el workspace","Admin gestiona equipo y categorías","Operador registra cargas y descargas"] },
      { title: "Exportar para quien lo necesite.", body: "Excel para el contable. PDF para el cliente. CSV para otros sistemas. Filtros por fecha, categoría, operador.", bullets: ["Stock actual o historial filtrado","Excel, PDF, CSV","Enviado por email o descargado"] },
    ],
  },
  de: {
    banner: "Sie erkunden die Demo · Steinwerkstatt · nur lesen",
    bannerSkip: "Zum Ende springen",
    bannerExit: "Verlassen",
    stepLabel: (n) => `SCHRITT ${n} / 05`,
    prev: "Zurück",
    next: "Weiter",
    finish: "Ende",
    introEyebrow: "Interaktive Tour · 5 Minuten",
    introH1a: "Erkunden Sie Lithosbase ohne ",
    introH1accent: "Registrierung",
    introH1b: ".",
    introBody: 'Schreibgeschützte Demo des Workspaces "Steinwerkstatt". Echte Materialien, Bewegungen, Katalog und Team — nur zum Ansehen. Fünf geführte Schritte. Verlassen Sie jederzeit.',
    introStart: "Tour starten",
    introBack: "Zurück zur Website",
    tourSections: ["Lager","Bewegungen","Katalog","Team","Export"],
    finaleEyebrow: "Tour abgeschlossen",
    finaleH1a: "Sie haben gesehen, wie es ",
    finaleH1accent: "funktioniert",
    finaleH1b: ". Möchten Sie es mit Ihren Daten ausprobieren?",
    finaleBody: "Erstellen Sie Ihren Workspace und importieren Sie den Bestand aus einer CSV-Datei. Zwei Minuten. Keine Kreditkarte, keine zeitlich begrenzte Testphase.",
    finaleCreate: "Workspace erstellen",
    finaleRestart: "Tour wiederholen",
    finaleExit: "zurück zur Website",
    steps: [
      { title: "Echtzeit-Lagerbestand.", body: "Ihr gesamtes Lager in einer einzigen Tabelle. Jedes Material hat eine SKU, Abmessungen, Schwellenwert und Status.", bullets: ["Auto-generierte SKU (bearbeitbar)","Schwellenwerte und Warnungen pro Kategorie","Niedrig in Gelb, Ausverkauft in Rot"] },
      { title: "Eine Bewegung, zwei Schritte.", body: "Einlagern, auslagern oder schneiden. Formular öffnen, Material wählen, bestätigen. Der Bediener erfasst vom Telefon aus.", bullets: ["Eingänge und Ausgänge vom Bediener signiert","Plattenschnitt → Reststück als Kind verfolgt","Freie Notizen, optionales Foto"] },
      { title: "Öffentlicher Katalog, unter Ihrem Namen.", body: "Eine saubere URL für jede Werkstatt. Kunden sehen Ihren Marmor — nicht Lithosbase. Verfügbarkeit mit dem Lager synchronisiert.", bullets: ["lithosbase.app/c/steinwerkstatt","Öffentlich/Privat-Schalter pro Material","Integriertes Kontaktformular"] },
      { title: "Drei Rollen. Explizite Berechtigungen.", body: "Owner, Admin, Operator. E-Mail-Einladungen mit Ablaufdatum. Jede Bewegung ist signiert.", bullets: ["Owner konfiguriert den Workspace","Admin verwaltet Team und Kategorien","Operator erfasst Ein- und Ausgänge"] },
      { title: "Export für jeden Bedarf.", body: "Excel für den Buchhalter. PDF für den Kunden. CSV für andere Systeme. Filter nach Datum, Kategorie, Operator.", bullets: ["Aktueller Bestand oder gefilterter Verlauf","Excel, PDF, CSV","Per E-Mail gesendet oder heruntergeladen"] },
    ],
  },
  fr: {
    banner: "Vous explorez la démo · Atelier Rossi · lecture seule",
    bannerSkip: "Passer à la fin",
    bannerExit: "Quitter",
    stepLabel: (n) => `ÉTAPE ${n} / 05`,
    prev: "Précédent",
    next: "Suivant",
    finish: "Fin",
    introEyebrow: "Tour interactif · 5 minutes",
    introH1a: "Explorez Lithosbase sans ",
    introH1accent: "vous inscrire",
    introH1b: ".",
    introBody: 'Démo en lecture seule du workspace "Atelier Rossi". Matériaux, mouvements, catalogue et équipe réels — pour regarder uniquement. Cinq étapes guidées. Quittez quand vous voulez.',
    introStart: "Démarrer le tour",
    introBack: "Retour au site",
    tourSections: ["Stock","Mouvements","Catalogue","Équipe","Export"],
    finaleEyebrow: "Tour terminé",
    finaleH1a: "Vous avez vu comment ça ",
    finaleH1accent: "fonctionne",
    finaleH1b: ". Vous voulez l'essayer avec vos données ?",
    finaleBody: "Créez votre workspace et importez le stock existant depuis un CSV. Deux minutes. Pas de carte bancaire, pas d'essai limité dans le temps.",
    finaleCreate: "Créer votre workspace",
    finaleRestart: "Recommencer le tour",
    finaleExit: "retour au site",
    steps: [
      { title: "Stock en temps réel.", body: "Tout votre entrepôt en un seul tableau. Chaque matériau a un SKU, des dimensions, un seuil et un statut. Les lignes sous le seuil sont mises en évidence.", bullets: ["SKU auto-généré (modifiable)","Seuils et alertes par catégorie","Sous le seuil en jaune, épuisé en rouge"] },
      { title: "Un mouvement, en deux gestes.", body: "Chargement, déchargement ou découpe. Ouvrez le formulaire, choisissez le matériau, confirmez. L'opérateur enregistre depuis son téléphone.", bullets: ["Entrées et sorties signées par l'opérateur","Découpe de dalle → chute tracée comme enfant","Notes libres, photo optionnelle"] },
      { title: "Catalogue public, sous votre nom.", body: "Une URL propre pour chaque atelier. Les clients voient vos marbres — pas Lithosbase. Disponibilité synchronisée avec le stock.", bullets: ["lithosbase.app/c/atelier-rossi","Bascule public/privé par matériau","Formulaire de contact intégré"] },
      { title: "Trois rôles. Permissions explicites.", body: "Owner, Admin, Opérateur. Invitations par email avec expiration. Chaque mouvement est signé.", bullets: ["Owner configure le workspace","Admin gère l'équipe et les catégories","Opérateur enregistre les entrées et sorties"] },
      { title: "Export pour tous vos besoins.", body: "Excel pour le comptable. PDF pour le client. CSV pour d'autres systèmes. Filtres par date, catégorie, opérateur.", bullets: ["Stock actuel ou historique filtré","Excel, PDF, CSV","Envoyé par email ou téléchargé"] },
    ],
  },
  tr: {
    banner: "Demoyu keşfediyorsunuz · Rossi Atölyesi · salt okunur",
    bannerSkip: "Sona atla",
    bannerExit: "Çık",
    stepLabel: (n) => `ADIM ${n} / 05`,
    prev: "Geri",
    next: "İleri",
    finish: "Son",
    introEyebrow: "İnteraktif tur · 5 dakika",
    introH1a: "Lithosbase'i ",
    introH1accent: "kayıt olmadan",
    introH1b: " keşfedin.",
    introBody: '"Rossi Atölyesi" çalışma alanının salt okunur demosu. Gerçek malzemeler, hareketler, katalog ve ekip — sadece göz atmak için. Beş rehberli adım. İstediğinizde çıkın.',
    introStart: "Turu başlat",
    introBack: "Siteye geri dön",
    tourSections: ["Stok","Hareketler","Katalog","Ekip","Dışa Aktar"],
    finaleEyebrow: "Tur tamamlandı",
    finaleH1a: "Nasıl ",
    finaleH1accent: "çalıştığını",
    finaleH1b: " gördünüz. Kendi verilerinizle denemek ister misiniz?",
    finaleBody: "Çalışma alanınızı oluşturun ve mevcut stoğu CSV'den içe aktarın. İki dakika. Kredi kartı yok, süreli deneme yok.",
    finaleCreate: "Çalışma alanı oluştur",
    finaleRestart: "Turu tekrarla",
    finaleExit: "siteye geri dön",
    steps: [
      { title: "Gerçek zamanlı stok.", body: "Tüm deponuz tek bir tabloda. Her malzemenin SKU'su, boyutları, eşiği ve durumu var. Eşik altındaki satırlar vurgulanır.", bullets: ["Otomatik oluşturulan SKU (düzenlenebilir)","Kategori başına eşikler ve uyarılar","Düşük stok sarı, tükendi kırmızı"] },
      { title: "Bir hareket, iki adımda.", body: "Yükleme, boşaltma veya kesme. Formu açın, malzemeyi seçin, onaylayın. Operatör telefondan kaydeder.", bullets: ["Operatör tarafından imzalanan yüklemeler ve boşaltmalar","Levha kesimi → artık parça çocuk olarak takip edilir","Serbest notlar, isteğe bağlı fotoğraf"] },
      { title: "Adınız altında halka açık katalog.", body: "Her atölye için temiz bir URL. Müşteriler marmerlerinizi görür — Lithosbase'i değil. Kullanılabilirlik stokla senkronize.", bullets: ["lithosbase.app/c/rossi-atolyesi","Malzeme başına genel/özel geçiş","Entegre iletişim formu"] },
      { title: "Üç rol. Açık izinler.", body: "Owner, Admin, Operatör. Son kullanma tarihli e-posta davetleri. Her hareket imzalıdır.", bullets: ["Owner çalışma alanını yapılandırır","Admin ekibi ve kategorileri yönetir","Operatör yükleme ve boşaltmaları kaydeder"] },
      { title: "İhtiyaç duyan herkes için dışa aktarma.", body: "Muhasebeci için Excel. Müşteri için PDF. Diğer sistemler için CSV. Tarih, kategori, operatöre göre filtreler.", bullets: ["Mevcut stok veya filtrelenmiş geçmiş","Excel, PDF, CSV","E-posta ile gönderildi veya indirildi"] },
    ],
  },
};

const _demoLocale = (() => {
  try {
    const l = new URLSearchParams(window.location.search).get('locale') || 'it';
    return DEMO_I18N[l] ? l : 'it';
  } catch { return 'it'; }
})();
const T = DEMO_I18N[_demoLocale];

const Icon = ({ name, size = 18, ...rest }) => (
  <img src={`/demo-static/assets/icons/${name}.svg`} width={size} height={size} alt="" {...rest} />
);

// ============== Step config ==============
const STEPS = [
  {
    id: "step-1",
    num: "01",
    title: T.steps[0].title,
    body: T.steps[0].body,
    bullets: T.steps[0].bullets,
    scene: "stock",
    spotlight: { selector: ".scene-stock", inset: 0 },
    tooltipPos: { left: "32px", top: "180px" },
    arrow: "left",
  },
  {
    id: "step-2",
    num: "02",
    title: T.steps[1].title,
    body: T.steps[1].body,
    bullets: T.steps[1].bullets,
    scene: "movements",
    spotlight: null,
    tooltipPos: { right: "32px", top: "120px" },
    arrow: "right",
  },
  {
    id: "step-3",
    num: "03",
    title: T.steps[2].title,
    body: T.steps[2].body,
    bullets: T.steps[2].bullets,
    scene: "catalog",
    spotlight: { selector: ".scene-catalog .mock-cat-grid", inset: 0 },
    tooltipPos: { right: "32px", top: "120px" },
    arrow: "right",
  },
  {
    id: "step-4",
    num: "04",
    title: T.steps[3].title,
    body: T.steps[3].body,
    bullets: T.steps[3].bullets,
    scene: "team",
    spotlight: { selector: ".scene-team .mock-table", inset: 0 },
    tooltipPos: { left: "32px", top: "180px" },
    arrow: "left",
  },
  {
    id: "step-5",
    num: "05",
    title: T.steps[4].title,
    body: T.steps[4].body,
    bullets: T.steps[4].bullets,
    scene: "export",
    spotlight: { selector: ".scene-export .mock-export-card:last-child", inset: 0 },
    tooltipPos: { left: "32px", top: "120px" },
    arrow: "left",
  },
];

// ============== Frozen mock scenes ==============
const SceneSidebar = ({ active }) => (
  <aside className="mock-side">
    <div className="ws-mark" />
    {[
      ["dashboard","home","Dashboard"],
      ["items","package","Materials"],
      ["movements","arrow-up-down","Movements"],
      ["stock","layers","Stock"],
      ["export","download","Export"],
      ["team","users","Team"],
    ].map(([id, ic, l]) => (
      <div key={id} className={`nav-item ${active === id ? "active" : ""}`}>
        <span className="ic" />
        <span>{l}</span>
      </div>
    ))}
  </aside>
);

const SceneTop = ({ crumb }) => (
  <div className="mock-top">
    <span>{crumb[0]}</span> / <span>{crumb[1]}</span>
    <span className="search" />
  </div>
);

const SceneStock = () => (
  <div className="mock-app scene-stock">
    <SceneSidebar active="stock" />
    <SceneTop crumb={["Workspace","Stock"]} />
    <main className="mock-main">
      <div className="mock-h">
        <div>
          <h2>Stock</h2>
          <div className="sub">48 materials · 320 sqm total · 3 below threshold</div>
        </div>
        <div style={{display:"flex", gap:8}}>
          <span className="cta" style={{background:"transparent", color:"var(--fg)", border:"1px solid var(--border-strong)"}}><Icon name="download" size={14}/> Export</span>
        </div>
      </div>
      <div className="mock-table">
        <div className="mock-table-head">
          <span>SKU</span><span>Material</span><span style={{textAlign:"right"}}>Threshold</span><span style={{textAlign:"right"}}>Stock</span><span>Status</span>
        </div>
        {[
          { sku:"LB-A38", name:"Carrara Bianco", cat:"Marble", sw:"#EFECE5", th:"5.00", st:"12.48", k:"ok", l:"Available" },
          { sku:"LB-N12", name:"Nero Marquina",  cat:"Marble", sw:"#1c1917", th:"4.00", st:"3.92",  k:"low",l:"Low stock" },
          { sku:"LB-G07", name:"Calacatta Oro",  cat:"Marble", sw:"#F5F0E6", th:"4.00", st:"0.00",  k:"err",l:"Out of stock" },
          { sku:"LB-V21", name:"Verde Alpi",     cat:"Marble", sw:"#1a2e22", th:"4.00", st:"8.20",  k:"ok", l:"Available" },
          { sku:"LB-R03", name:"Rosso Levanto",  cat:"Marble", sw:"#5b1d18", th:"4.00", st:"5.40",  k:"ok", l:"Available" },
          { sku:"LB-T11", name:"Travertino",     cat:"Travertine", sw:"#E8DFCB", th:"5.00", st:"9.60", k:"ok", l:"Available" },
          { sku:"LB-K05", name:"Cement Ceramic", cat:"Ceramics", sw:"#8a8783", th:"4.00", st:"2.40", k:"low", l:"Low stock" },
        ].map(r => (
          <div key={r.sku} className="mock-table-row" style={r.k !== "ok" ? { background: "color-mix(in srgb, var(--warning-soft) 24%, transparent)" } : {}}>
            <span className="mono">{r.sku}</span>
            <span className="swatch-row">
              <span className="sw" style={{background: r.sw}} />
              <span>{r.name}</span>
            </span>
            <span className="num">{r.th}</span>
            <span className="num" style={{color: r.k === "ok" ? "var(--fg)" : r.k === "low" ? "var(--warning)" : "var(--error)"}}>{r.st} sqm</span>
            <span className={`pill ${r.k}`}>{r.l}</span>
          </div>
        ))}
      </div>
    </main>
  </div>
);

const SceneMovements = () => (
  <div className="mock-app scene-movements">
    <SceneSidebar active="movements" />
    <SceneTop crumb={["Workspace","Movements"]} />
    <main className="mock-main">
      <div className="mock-h">
        <div>
          <h2>Movements</h2>
          <div className="sub">186 movements · signed by operator</div>
        </div>
        <div className="cta"><Icon name="plus" size={14} style={{filter:"brightness(0) invert(1)"}}/> Record</div>
      </div>
      <div className="mock-table">
        <div className="mock-table-head" style={{gridTemplateColumns:"110px 90px 1fr 100px 80px"}}>
          <span>Date</span><span>Type</span><span>Material</span><span style={{textAlign:"right"}}>Qty</span><span>Operator</span>
        </div>
        {[
          ["14 May · 14:32","LOAD","Carrara Bianco","+6 slabs","Andrea","ok"],
          ["14 May · 11:08","UNLOAD","Nero Marquina","−2 slabs","Marco","err"],
          ["14 May · 09:44","CUT","Calacatta Oro","→ 3 pcs","Elena","acc"],
          ["13 May · 16:21","LOAD","Verde Alpi","+12 slabs","Andrea","ok"],
          ["13 May · 10:55","UNLOAD","Travertino","−5 slabs","Giulio","err"],
        ].map(([d,t,m,q,o,k], i) => (
          <div key={i} className="mock-table-row" style={{gridTemplateColumns:"110px 90px 1fr 100px 80px"}}>
            <span className="mono">{d}</span>
            <span className={`pill ${k === "acc" ? "" : k}`} style={k==="acc"?{background:"var(--accent-soft)", color:"var(--accent-strong)"}:{}}>{t}</span>
            <span>{m}</span>
            <span className="num">{q}</span>
            <span style={{color:"var(--fg-muted)"}}>{o}</span>
          </div>
        ))}
      </div>
    </main>

    {/* Centered modal */}
    <div style={{
      position:"absolute", top:"50%", left:"calc(50% + 110px)", transform:"translate(-50%, -50%)",
      width: 480,
      background: "var(--surface)",
      border: "1px solid var(--border)",
      borderRadius: 20,
      boxShadow: "0 32px 64px -12px rgba(0,0,0,0.30)",
      padding: 28,
      zIndex: 5,
    }}>
      <div style={{display:"flex", alignItems:"center", justifyContent:"space-between", marginBottom:18}}>
        <h3 style={{margin:0, font:"700 19px/1.2 var(--font-sans)", letterSpacing:"-0.015em", color:"var(--fg)"}}>New movement</h3>
        <div style={{width:32, height:32, borderRadius:7, background:"var(--surface-2)"}}/>
      </div>
      <div style={{display:"flex", flexDirection:"column", gap:14}}>
        <div>
          <div style={{font:"500 10.5px/1 var(--font-sans)", letterSpacing:"0.08em", textTransform:"uppercase", color:"var(--fg-muted)", marginBottom:6}}>Material</div>
          <div style={{height:40, borderRadius:8, border:"1px solid var(--border-strong)", padding:"0 12px", display:"flex", alignItems:"center", justifyContent:"space-between", background:"var(--surface)"}}>
            <span style={{font:"500 13px/1 var(--font-sans)", color:"var(--fg)"}}>LB-A38 · Carrara Bianco</span>
            <Icon name="chevron-down" size={12}/>
          </div>
        </div>
        <div style={{display:"grid", gridTemplateColumns:"1fr 1fr", gap:10}}>
          <div>
            <div style={{font:"500 10.5px/1 var(--font-sans)", letterSpacing:"0.08em", textTransform:"uppercase", color:"var(--fg-muted)", marginBottom:6}}>Type</div>
            <div style={{display:"grid", gridTemplateColumns:"1fr 1fr", gap:4, padding:4, background:"var(--surface-2)", borderRadius:8}}>
              <div style={{padding:"7px 0", textAlign:"center", borderRadius:6, background:"var(--success)", color:"var(--success-soft)", font:"700 12px/1 var(--font-sans)"}}>Load</div>
              <div style={{padding:"7px 0", textAlign:"center", borderRadius:6, font:"600 12px/1 var(--font-sans)", color:"var(--fg-muted)"}}>Unload</div>
            </div>
          </div>
          <div>
            <div style={{font:"500 10.5px/1 var(--font-sans)", letterSpacing:"0.08em", textTransform:"uppercase", color:"var(--fg-muted)", marginBottom:6}}>Quantity</div>
            <div style={{height:40, borderRadius:8, border:"1px solid var(--border-strong)", padding:"0 12px", display:"flex", alignItems:"center", background:"var(--surface)"}}>
              <span style={{fontFamily:"var(--font-mono)", fontSize:14, color:"var(--fg)"}}>6 slabs</span>
            </div>
          </div>
        </div>
        <div style={{display:"flex", justifyContent:"flex-end", gap:8, marginTop:6, paddingTop:14, borderTop:"1px solid var(--border)"}}>
          <div style={{height:38, padding:"0 14px", display:"flex", alignItems:"center", borderRadius:8, color:"var(--fg-muted)", font:"600 13px/1 var(--font-sans)"}}>Cancel</div>
          <div style={{height:38, padding:"0 18px", display:"flex", alignItems:"center", borderRadius:8, background:"var(--success)", color:"var(--success-soft)", font:"700 13px/1 var(--font-sans)"}}>Record</div>
        </div>
      </div>
    </div>
  </div>
);

const SceneCatalog = () => (
  <div className="mock-app scene-catalog">
    <SceneSidebar active="" />
    <SceneTop crumb={["Public","Catalog"]} />
    <main className="mock-main">
      <div className="mock-h">
        <div>
          <h2>Stone Workshop</h2>
          <div className="sub" style={{fontFamily:"var(--font-mono)"}}>lithosbase.app/c/stone-workshop</div>
        </div>
        <span className="cta" style={{background:"transparent", color:"var(--fg)", border:"1px solid var(--border-strong)"}}>Public preview <Icon name="external-link" size={12}/></span>
      </div>

      <div style={{display:"flex", gap:8, marginBottom:16, flexWrap:"wrap"}}>
        {["All","Marble","Granite","Quartz","Travertine","Ceramics"].map((c,i) => (
          <span key={c} style={{
            padding:"5px 12px", borderRadius:999, font:"500 12px/1 var(--font-sans)",
            background: i===0 ? "var(--fg)" : "var(--surface)",
            color: i===0 ? "var(--bg)" : "var(--fg-muted)",
            border: i===0 ? "1px solid var(--fg)" : "1px solid var(--border)",
          }}>{c}</span>
        ))}
      </div>

      <div className="mock-cat-grid">
        {[
          ["Carrara Bianco","320 × 160","#F5F4F1","#D9D6CE","ok"],
          ["Verde Alpi","290 × 150","#1a2e22","#3d5a44","ok"],
          ["Nero Marquina","280 × 140","#1c1917","#44403c","ok"],
          ["Calacatta Oro","310 × 155","#F5F0E6","#C9B585","out"],
          ["Travertino","320 × 155","#E8DFCB","#BFB29A","ok"],
          ["Rosso Levanto","260 × 140","#5b1d18","#a04638","ok"],
          ["Granito Nero","300 × 160","#101010","#2a2a2a","ok"],
          ["Quarzo Calacatta","330 × 160","#F2EFE9","#D4CFC1","ok"],
        ].map(([n,d,c1,c2,st]) => (
          <div key={n} className="mock-cat-card">
            <div className="sw" style={{background:`linear-gradient(135deg, ${c1}, ${c2})`}}/>
            <div className="meta">
              <div className="name">{n}</div>
              <div className="dim">{d}</div>
              <div style={{display:"flex", alignItems:"center", justifyContent:"space-between", marginTop:6, paddingTop:6, borderTop:"1px solid var(--border)"}}>
                <span style={{font:"600 9px/1 var(--font-sans)", letterSpacing:"0.06em", textTransform:"uppercase", color: st === "ok" ? "var(--success)" : "var(--error)"}}>
                  ● {st === "ok" ? "Available" : "Out of stock"}
                </span>
                <span style={{fontFamily:"var(--font-mono)", fontSize:10, color:"var(--fg-muted)"}}>3</span>
              </div>
            </div>
          </div>
        ))}
      </div>
    </main>
  </div>
);

const SceneTeam = () => (
  <div className="mock-app scene-team">
    <SceneSidebar active="team" />
    <SceneTop crumb={["Admin","Team"]} />
    <main className="mock-main">
      <div className="mock-h">
        <div>
          <h2>Team</h2>
          <div className="sub">4 active members · 1 pending invite</div>
        </div>
        <div className="cta"><Icon name="plus" size={14} style={{filter:"brightness(0) invert(1)"}}/> Invite</div>
      </div>
      <div className="mock-table">
        {[
          ["AR","Andrea Rossi","andrea@stone-workshop.com","Owner","owner"],
          ["MC","Marco Conti","marco@stone-workshop.com","Admin","admin"],
          ["EF","Elena Ferrari","elena@stone-workshop.com","Operator","op"],
          ["GP","Giulio Pini","giulio@stone-workshop.com","Operator","op"],
        ].map(([i,n,e,r,cls]) => (
          <div key={e} className="mock-team-row">
            <div className="avatar">{i}</div>
            <div className="who">
              <div className="name">{n}</div>
              <div className="email">{e}</div>
            </div>
            <span className={`role ${cls}`}>{r}</span>
          </div>
        ))}
      </div>

      <div style={{marginTop:16}}>
        <div style={{font:"500 10.5px/1 var(--font-sans)", letterSpacing:"0.08em", textTransform:"uppercase", color:"var(--fg-muted)", marginBottom:10}}>Pending invites</div>
        <div className="mock-table" style={{padding:14}}>
          <div className="mock-team-row" style={{padding:"6px 8px", borderTop:"none"}}>
            <div className="avatar" style={{background:"transparent", border:"1px dashed var(--border-strong)", color:"var(--fg-muted)"}}>?</div>
            <div className="who">
              <div className="name">giulio@stone-workshop.com</div>
              <div className="email">Invited 2 days ago · expires in 5 days</div>
            </div>
            <span className="role op">Operator</span>
          </div>
        </div>
      </div>
    </main>
  </div>
);

const SceneExport = () => (
  <div className="mock-app scene-export">
    <SceneSidebar active="export" />
    <SceneTop crumb={["Workspace","Export"]} />
    <main className="mock-main">
      <div className="mock-h">
        <div>
          <h2>Export</h2>
          <div className="sub">Export current stock or filtered history.</div>
        </div>
      </div>

      <div className="mock-export-grid">
        <div>
          <div className="mock-export-card" style={{marginBottom:12}}>
            <h4>What to export</h4>
            <div className="mock-export-tile on">
              <div className="ic" />
              <div>
                <div className="t">Current stock</div>
                <div className="d">Active materials, quantities, thresholds.</div>
              </div>
              <div className="chk" />
            </div>
            <div className="mock-export-tile">
              <div className="ic" />
              <div>
                <div className="t">Movement history</div>
                <div className="d">Loads, unloads, cuts — signed.</div>
              </div>
              <div className="chk" style={{background:"transparent", border:"1px solid var(--border-strong)"}} />
            </div>
          </div>
          <div className="mock-export-card">
            <h4>Filters</h4>
            <div style={{display:"grid", gridTemplateColumns:"1fr 1fr", gap:10, marginBottom:10}}>
              <div style={{height:40, borderRadius:8, border:"1px solid var(--border-strong)", padding:"0 12px", display:"flex", alignItems:"center", justifyContent:"space-between", background:"var(--surface)"}}>
                <span style={{font:"500 12.5px/1 var(--font-sans)"}}>Category · All</span>
                <Icon name="chevron-down" size={11}/>
              </div>
              <div style={{height:40, borderRadius:8, border:"1px solid var(--border-strong)", padding:"0 12px", display:"flex", alignItems:"center", justifyContent:"space-between", background:"var(--surface)"}}>
                <span style={{font:"500 12.5px/1 var(--font-sans)"}}>Operator · All</span>
                <Icon name="chevron-down" size={11}/>
              </div>
            </div>
            <h4 style={{marginTop:14}}>Format</h4>
            <div style={{display:"grid", gridTemplateColumns:"1fr 1fr 1fr", gap:6, padding:4, background:"var(--surface-2)", borderRadius:10}}>
              <div style={{padding:"10px 0", textAlign:"center", borderRadius:7, background:"var(--surface)", boxShadow:"0 1px 2px rgba(0,0,0,0.06), 0 0 0 1px var(--border)", font:"700 12px/1 var(--font-sans)", color:"var(--fg)"}}>XLSX</div>
              <div style={{padding:"10px 0", textAlign:"center", borderRadius:7, font:"600 12px/1 var(--font-sans)", color:"var(--fg-muted)"}}>PDF</div>
              <div style={{padding:"10px 0", textAlign:"center", borderRadius:7, font:"600 12px/1 var(--font-sans)", color:"var(--fg-muted)"}}>CSV</div>
            </div>
          </div>
        </div>

        <div className="mock-export-card">
          <h4>Export preview</h4>
          <div className="summary">
            <div className="name">Current stock<span style={{color:"var(--fg-muted)"}}>.xlsx</span></div>
            <div className="row"><span>Estimated rows</span><span className="v">48</span></div>
            <div className="row"><span>Period</span><span className="v">Now</span></div>
            <div className="row" style={{borderBottom:"none"}}><span>Size</span><span className="v">~24 KB</span></div>
            <div className="download">
              <Icon name="download" size={14} style={{filter:"brightness(0) invert(1)"}}/>
              Download
            </div>
            <div style={{textAlign:"center", font:"400 11px/1.4 var(--font-sans)", color:"var(--fg-muted)"}}>
              Or email to <span style={{fontFamily:"var(--font-mono)", color:"var(--fg)"}}>andrea@…workshop.com</span>
            </div>
          </div>
        </div>
      </div>
    </main>
  </div>
);

const SCENE_MAP = {
  stock: SceneStock,
  movements: SceneMovements,
  catalog: SceneCatalog,
  team: SceneTeam,
  export: SceneExport,
};

// ============== Intro / Finale ==============
const Intro = ({ onStart, onExit }) => (
  <div className="demo-intro" data-screen-label="Demo / 01 Intro">
    <div className="demo-intro-inner">
      <span className="eyebrow">{T.introEyebrow}</span>
      <h1>{T.introH1a}<span className="accent">{T.introH1accent}</span>{T.introH1b}</h1>
      <p>{T.introBody}</p>
      <div className="ctas">
        <button className="btn btn-primary" onClick={onStart}>
          {T.introStart} <Icon name="arrow-right" size={14} style={{filter:"brightness(0) invert(1)"}}/>
        </button>
        <button className="btn btn-secondary" onClick={onExit}>
          {T.introBack}
        </button>
      </div>
      <div style={{display:"flex", gap:24, marginTop:12, font:"500 12px/1 var(--font-sans)", color:"var(--fg-muted)", flexWrap:"wrap", justifyContent:"center"}}>
        {T.tourSections.map((s, i) => (
          <span key={s} style={{display:"inline-flex", alignItems:"center", gap:6}}>
            <span style={{fontFamily:"var(--font-mono)", color:"var(--accent)", letterSpacing:"0.08em"}}>{String(i + 1).padStart(2,"0")}</span>
            {s}
          </span>
        ))}
      </div>
    </div>
  </div>
);

const Finale = ({ onSignup, onRestart, onExit }) => (
  <div className="demo-finale" data-screen-label="Demo / 07 Finale">
    <div className="demo-finale-inner">
      <span className="eyebrow">{T.finaleEyebrow}</span>
      <h1>{T.finaleH1a}<span className="accent">{T.finaleH1accent}</span>{T.finaleH1b}</h1>
      <p>{T.finaleBody}</p>
      <div className="checkbox-row">
        {[
          [T.tourSections[0],"Real-time"],
          [T.tourSections[1],"Signed"],
          [T.tourSections[2],"Public"],
          ["Team","3 roles"],
          [T.tourSections[4],"Excel + PDF"],
        ].map(([n, s]) => (
          <div key={n} className="item">
            <div className="check"><Icon name="check" size={14}/></div>
            <div className="label">{n}</div>
            <div style={{font:"500 10.5px/1 var(--font-sans)", letterSpacing:"0.06em", textTransform:"uppercase", color:"var(--fg-muted)"}}>{s}</div>
          </div>
        ))}
      </div>
      <div className="ctas">
        <button className="btn btn-primary" onClick={onSignup}>
          {T.finaleCreate} <Icon name="arrow-right" size={14} style={{filter:"brightness(0) invert(1)"}}/>
        </button>
        <button className="btn btn-secondary" onClick={onRestart}>
          {T.finaleRestart}
        </button>
      </div>
      <div style={{fontSize:12, color:"var(--fg-muted)", marginTop:8}}>
        <a onClick={onExit} style={{color:"var(--fg)", borderBottom:"1px solid var(--fg)"}}>{T.finaleExit}</a>
      </div>
    </div>
  </div>
);

// ============== Tour with spotlight + tooltip ==============
const Tour = ({ stepIdx, navTo, finishToSignup }) => {
  const step = STEPS[stepIdx];
  const Scene = SCENE_MAP[step.scene];
  const containerRef = React.useRef(null);
  const [spot, setSpot] = React.useState(null);

  // After scene mounts, locate the spotlight target
  React.useLayoutEffect(() => {
    if (!step.spotlight) { setSpot(null); return; }
    const compute = () => {
      const el = containerRef.current && containerRef.current.querySelector(step.spotlight.selector);
      if (!el || !containerRef.current) { setSpot(null); return; }
      const cRect = containerRef.current.getBoundingClientRect();
      const eRect = el.getBoundingClientRect();
      const pad = step.spotlight.pad || 6;
      setSpot({
        left:   eRect.left - cRect.left - pad,
        top:    eRect.top  - cRect.top  - pad,
        width:  eRect.width  + pad * 2,
        height: eRect.height + pad * 2,
      });
    };
    compute();
    const r = new ResizeObserver(compute);
    r.observe(containerRef.current);
    window.addEventListener("resize", compute);
    return () => { r.disconnect(); window.removeEventListener("resize", compute); };
  }, [stepIdx, step.spotlight]);

  const next = () => {
    if (stepIdx >= STEPS.length - 1) navTo("finish");
    else navTo(STEPS[stepIdx + 1].id);
  };
  const prev = () => {
    if (stepIdx <= 0) navTo("intro");
    else navTo(STEPS[stepIdx - 1].id);
  };

  return (
    <div className="demo-stage" ref={containerRef} data-screen-label={`Demo / ${String(stepIdx + 2).padStart(2,"0")} Step ${step.num}`}>
      <Scene />
      <div className="demo-overlay" />
      {spot && (
        <div className="demo-spotlight" style={{
          left: spot.left, top: spot.top, width: spot.width, height: spot.height,
        }}/>
      )}
      <div
        className={`demo-tooltip arrow-${step.arrow}`}
        style={{
          ...(step.tooltipPos.left  !== undefined ? { left:  step.tooltipPos.left  } : {}),
          ...(step.tooltipPos.right !== undefined ? { right: step.tooltipPos.right } : {}),
          ...(step.tooltipPos.top   !== undefined ? { top:   step.tooltipPos.top   } : {}),
        }}
      >
        <span className="step-num">{T.stepLabel(step.num)}</span>
        <h3>{step.title}</h3>
        <p>{step.body}</p>
        <div style={{display:"flex", flexDirection:"column", gap:6}}>
          {step.bullets.map(b => <div key={b} className="bullet">{b}</div>)}
        </div>
        <div className="controls">
          <span className="nums">{stepIdx + 1}/{STEPS.length}</span>
          <div className="actions">
            <button className="btn btn-ghost" onClick={prev}>
              <Icon name="chevron-left" size={12}/> {T.prev}
            </button>
            <button className="btn btn-primary" onClick={next}>
              {stepIdx >= STEPS.length - 1 ? T.finish : T.next}
              <Icon name="arrow-right" size={12} style={{filter:"brightness(0) invert(1)"}}/>
            </button>
          </div>
        </div>
      </div>
    </div>
  );
};

// ============== Top-level shell ==============
const DemoApp = ({ route, theme, onNav, onJump }) => {
  const navTo = (r) => onNav(r);
  const exit = () => onJump("marketing");
  const finishToSignup = () => onJump("signup");
  const stepIdx = STEPS.findIndex(s => s.id === route);
  const inTour = stepIdx >= 0;
  const progress =
    route === "intro"  ? 0 :
    route === "finish" ? 100 :
    inTour ? ((stepIdx + 1) / STEPS.length) * 100 : 0;

  return (
    <>
      <div className="demo-banner">
        <span className="tag">DEMO</span>
        <span className="label">{T.banner}</span>
        <span className="spacer"/>
        {route !== "finish" && (
          <button className="cta" onClick={() => navTo("finish")}>
            {T.bannerSkip} <Icon name="arrow-right" size={12} style={{filter:"brightness(0) invert(0)"}}/>
          </button>
        )}
        <button className="exit" onClick={exit}>
          <Icon name="x" size={14}/> {T.bannerExit}
        </button>
      </div>
      <div className="demo-progress">
        <div className="fill" style={{ width: progress + "%" }}/>
      </div>

      {route === "intro"  && <Intro onStart={() => navTo("step-1")} onExit={exit}/>}
      {inTour             && <Tour stepIdx={stepIdx} navTo={navTo} finishToSignup={finishToSignup}/>}
      {route === "finish" && <Finale onSignup={finishToSignup} onRestart={() => navTo("intro")} onExit={exit}/>}
    </>
  );
};

window.DemoApp = DemoApp;
