/* ===========================================================================
 * LIVEDATA OS · os-modules.css
 * Stili consolidati dei moduli-demo (prima inline nei rispettivi .php).
 * Usa le variabili tema di os.css → caricare DOPO os.css. Dark/light automatico.
 * =========================================================================== */

/* ── OVERVIEW · hero-vis ─────────────────────────────────────────────── */
/* ── hero-vis · responsive + taratura tema ──────────────────────────────
     Colori tutti su var() del tuo tema → dark/light automatico.
     --hv-intensity regola glow/scan/particelle (letto dal JS). ─────────── */
  .ov__vis{ --hv-intensity:1; position:relative; }
  .ov__vis .hero-vis{
    width:100%; height:auto; display:block; overflow:visible;
    max-width:520px; margin-inline:auto;
  }
  /* Tema chiaro: attenua i bagliori. In LIVEDATA OS il tema vive su
     body[data-theme="light"] (os.js), quindi l'override si aggancia lì. */
  body[data-theme="light"] .ov__vis{ --hv-intensity:.68; }

  /* Responsive: il grid .ov (2 col → stack) è gestito dal tuo style.css.
     Qui solo il dimensionamento del disegno e la densità dell'HUD. */
  @media (max-width:900px){
    .ov__vis .hero-vis{ max-width:460px; }
  }
  @media (max-width:640px){
    .ov__vis .hero-vis{ max-width:380px; }
    .ov__vis .hero-vis [data-el="hud"]{ display:none; }  /* meno rumore su mobile */
  }
  @media (prefers-reduced-motion:reduce){
    .ov__vis .hero-vis{ /* engine serve un frame statico composto */ }
  }

/* ── METODO · scroll-linked ─────────────────────────────────────────────── */
/* ── METODO scroll-linked v2 · Tavola Tecnica ──────────────────────────────
     Consiglio: spostare in os.css. Il JS de-duplica il blocco se re-iniettato. */
  .mtd{margin-top:30px}
  .mtd__wrap{display:grid;grid-template-columns:240px 1fr;gap:48px}     /* NIENTE align-items: la colonna rail si stira → spazio per il follow */

  .mtd-rail{position:relative}
  .mtd-rail__inner{padding-left:6px;will-change:transform}              /* JS: translateY di follow */
  .mtd-track{position:relative}
  .mtd-axis{position:absolute;left:7px;width:1px;background:var(--line-2)}
  .mtd-fill{position:absolute;left:6px;width:3px;background:var(--accent-lit);height:0}
  .mtd-dot{position:absolute;left:1px;top:0;width:14px;height:14px;border-radius:50%;background:var(--live);z-index:2}
  .mtd-dot::before{content:"";position:absolute;inset:-5px;border-radius:50%;background:var(--live);filter:blur(5px);opacity:.5}

  .mtd-sts{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:40px;position:relative;z-index:1}
  .mtd-st{display:flex;align-items:center;gap:13px;margin:0}
  .mtd-st__node{position:relative;width:15px;height:15px;flex:none;border-radius:50%;
    border:1.3px solid var(--accent-lit);background:var(--bg);transition:border-color .35s var(--ease)}
  .mtd-st__node::after{content:"";position:absolute;inset:3.5px;border-radius:50%;background:var(--accent-lit);opacity:0;transition:opacity .35s var(--ease)}
  .mtd-st.is-on .mtd-st__node::after{opacity:1}
  .mtd-st__lbl{font-family:var(--f-mono);font-size:11px;letter-spacing:.08em;color:var(--text-faint);
    white-space:nowrap;transition:color .35s var(--ease)}
  .mtd-st.is-on .mtd-st__lbl{color:var(--accent-lit)}
  .mtd-st.is-cur .mtd-st__lbl{color:var(--text)}

  .mtd-readout{margin-top:26px;padding-top:18px;border-top:1px solid var(--line-2);max-width:218px}
  .mtd-readout__ix{display:block;font-size:10px;letter-spacing:.14em;color:var(--accent-lit);margin-bottom:9px}
  .mtd-readout__p{margin:0;font-size:13px;line-height:1.5;color:var(--text-dim);min-height:3em}

  .mtd-steps{list-style:none;margin:0;padding:0}
  .mtd-step{min-height:52vh;display:flex;flex-direction:column;justify-content:center;
    border-top:1px solid var(--line-2);border-left:2px solid transparent;
    padding:32px 0 32px 22px;transition:border-color .4s var(--ease)}
  .mtd-step:first-child{border-top:0}
  .mtd-step__ix{font-family:var(--f-mono);font-size:11px;letter-spacing:.14em;color:var(--accent-lit);margin-bottom:14px}
  .mtd-step__h{font-family:'Space Grotesk',var(--f-sans,sans-serif);font-size:clamp(22px,2.6vw,32px);letter-spacing:-.01em;margin:0 0 14px;color:var(--text)}
  .mtd-step__p{margin:0;font-size:15px;line-height:1.6;color:var(--text-dim);max-width:54ch}
  .mtd-step__princ{margin-top:18px;padding:12px 15px;border-left:2px solid color-mix(in srgb,var(--live) 45%, transparent);
    background:color-mix(in srgb,var(--live) 6%, transparent);font-size:13.5px;line-height:1.5;color:var(--text-dim);max-width:54ch}
  .mtd-step__princ b{display:block;font-family:var(--f-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--live);margin-bottom:5px}

  /* Focus della fase in lettura — solo desktop, solo con JS attivo.
     Doppio segnale robusto: dim delle altre (!important, per vincere override
     esterni tipo il breakpoint >1200px) + barra-accento sulla attiva (sempre visibile). */
  @media (min-width:821px){
    .mtd.is-live .mtd-step{opacity:.32!important;transition:opacity .5s var(--ease),border-color .4s var(--ease)}
    .mtd.is-live .mtd-step.is-on{opacity:1!important;border-left-color:var(--accent-lit)}
  }

  /* mobile: niente rail, lista pulita e leggibile (nessun dim) */
  @media (max-width:820px){
    .mtd__wrap{grid-template-columns:1fr;gap:0}
    .mtd-rail{display:none}
    .mtd-step{min-height:auto;padding:26px 0 26px 18px}
  }

  @media (prefers-reduced-motion:reduce){
    .mtd-dot,.mtd-fill{display:none}
    .mtd-st__lbl{color:var(--text-dim)}
  }
  html.no-js .mtd .mtd-step,
  html.ld-stuck .mtd .mtd-step{opacity:1!important}

/* ── CAPACITÀ · pipeline demonstrator ─────────────────────────────────────────────── */
/* ── DIMOSTRAZIONE PIPELINE · Tavola Tecnica ───────────────────────────────
     Consiglio: spostare in os.css. Il JS de-duplica questo blocco se il modulo
     viene re-iniettato dallo swap SPA. Tutto su token del tema (dark/light). */
  .cap-pipe{position:relative;margin-top:34px;border:1px solid var(--line-2);
    background:color-mix(in srgb,var(--bg) 82%, transparent);padding:20px 22px 16px}
  .cap-pipe .tick{position:absolute;width:8px;height:8px;border:1px solid var(--accent-lit);opacity:.5}
  .cap-pipe .tick.tl{top:-1px;left:-1px;border-right:0;border-bottom:0}
  .cap-pipe .tick.tr{top:-1px;right:-1px;border-left:0;border-bottom:0}
  .cap-pipe .tick.bl{bottom:-1px;left:-1px;border-right:0;border-top:0}
  .cap-pipe .tick.br{bottom:-1px;right:-1px;border-left:0;border-top:0}

  .cap-pipe__head{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:16px}
  .cap-tabs{display:flex;gap:6px;flex-wrap:wrap}
  .cap-chip{font-family:var(--f-mono);font-size:11.5px;letter-spacing:.06em;color:var(--text-dim);
    background:transparent;border:1px solid var(--line-2);padding:7px 13px;border-radius:0;cursor:pointer;
    transition:color .18s,border-color .18s,background .18s}
  .cap-chip:hover{color:var(--accent-lit);border-color:var(--accent-lit)}
  .cap-chip.is-on{color:var(--bg);background:var(--accent-lit);border-color:var(--accent-lit)}
  .cap-replay{display:inline-flex;align-items:center;gap:7px;font-family:var(--f-mono);font-size:11px;letter-spacing:.06em;
    color:var(--text-faint);background:transparent;border:1px solid transparent;padding:6px 8px;cursor:pointer;transition:color .18s}
  .cap-replay:hover{color:var(--accent-lit)} .cap-replay svg{width:15px;height:15px}

  .cap-req{display:flex;align-items:baseline;gap:12px;padding:11px 14px;border-left:2px solid var(--accent-lit);
    background:color-mix(in srgb,var(--accent) 6%, transparent)}
  .cap-req__lbl{font-size:9.5px;letter-spacing:.18em;color:var(--text-faint);flex:none}
  .cap-req__txt{color:var(--text);font-size:15px;line-height:1.4}

  .cap-spine{margin:12px 0 4px}
  .cap-spine svg{width:100%;height:auto;max-height:46px;overflow:visible;display:block}
  .cap-st__glow{opacity:0;filter:blur(5px)}
  .cap-st__core{transition:fill .3s}

  .cap-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;background:var(--line-2);
    border:1px solid var(--line-2);margin-top:2px}
  .cap-col{background:var(--bg);padding:14px 15px;min-height:132px}
  .cap-col__h{font-family:var(--f-mono);font-size:11px;letter-spacing:.12em;color:var(--text-dim);
    text-transform:uppercase;margin-bottom:12px;display:flex;align-items:baseline;gap:7px}
  .cap-col__h b{color:var(--accent-lit);font-weight:600}
  .cap-col__h .mono{color:var(--text-faint);font-size:8.5px;letter-spacing:.1em}

  .cap-fact{display:flex;align-items:center;gap:8px;padding:5px 0;font-size:13px;border-bottom:1px dashed color-mix(in srgb,var(--line-2) 60%, transparent)}
  .cap-fact:last-child{border-bottom:0}
  .cap-fact__k{color:var(--text-faint);font-family:var(--f-mono);font-size:10.5px;letter-spacing:.04em;min-width:64px}
  .cap-fact__v{color:var(--text);flex:1}
  .cap-src{font-family:var(--f-mono);font-size:8px;letter-spacing:.08em;padding:2px 6px;border:1px solid;white-space:nowrap}
  .cap-src[data-src="DICHIARATO"]{color:var(--text-dim);border-color:var(--line-2)}
  .cap-src[data-src="RILEVATO"]{color:var(--accent-lit);border-color:color-mix(in srgb,var(--accent-lit) 45%, transparent)}
  .cap-src[data-src="DERIVATO"]{color:var(--text-faint);border-color:var(--line-2);border-style:dashed}

  .cap-rule{display:flex;flex-wrap:wrap;align-items:center;gap:7px;padding:7px 0;font-size:12.5px}
  .cap-rule__r{font-family:var(--f-mono);font-size:11px;color:var(--text-dim);background:color-mix(in srgb,var(--line-2) 40%, transparent);padding:2px 7px}
  .cap-rule__arrow{color:var(--text-faint)}
  .cap-rule__o{color:var(--accent-lit);font-size:12.5px}

  .cap-tool{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;padding:7px 0}
  .cap-tool__t{font-family:var(--f-mono);font-size:11px;color:var(--text-dim)}
  .cap-tool__t span{color:var(--text-faint)}
  .cap-tool__res{font-family:var(--f-mono);font-size:11px;color:var(--live);letter-spacing:.04em;white-space:nowrap}
  .cap-tool.is-bad .cap-tool__res{color:var(--text-faint)}

  .cap-esito{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px;padding:12px 14px;
    border:1px solid color-mix(in srgb,var(--live) 34%, transparent);background:color-mix(in srgb,var(--live) 7%, transparent)}
  .cap-esito__lbl{font-size:9.5px;letter-spacing:.18em;color:var(--text-faint);flex:none}
  .cap-esito__txt{color:var(--text);font-size:14px;flex:1}
  .cap-esito__tag{font-size:8.5px;letter-spacing:.12em;color:var(--live);border:1px solid color-mix(in srgb,var(--live) 40%, transparent);padding:3px 8px}
  .cap-panel.is-guard .cap-esito{border-color:color-mix(in srgb,var(--accent-lit) 40%, transparent);background:color-mix(in srgb,var(--accent) 8%, transparent)}
  .cap-panel.is-guard .cap-esito__tag{color:var(--accent-lit);border-color:color-mix(in srgb,var(--accent-lit) 45%, transparent)}

  .cap-pipe__hint{margin-top:14px;font-size:10px;letter-spacing:.06em;color:var(--text-faint);text-align:center}

  /* ── reveal in cascata (ordine pipeline) ── */
  .cap-panel .rvx{opacity:0;transform:translateY(9px);
    transition:opacity .5s var(--ease),transform .5s var(--ease);transition-delay:calc(var(--i,0)*72ms)}
  .cap-panel.is-live .rvx{opacity:1;transform:none}

  /* ── spina animata (impulso + accensione stazioni), sincronizzata al reveal ── */
  .cap-panel .cap-spine__pulse{opacity:0}
  .cap-panel.is-live .cap-spine__pulse{animation:capFlow 1.75s var(--ease) forwards}
  @keyframes capFlow{
    0%{opacity:0;transform:translateX(0)} 7%{opacity:1;transform:translateX(0)}
    30%{transform:translateX(200px)} 40%{transform:translateX(200px)}
    68%{transform:translateX(400px)} 80%{transform:translateX(400px)}
    94%{opacity:1;transform:translateX(400px)} 100%{opacity:0;transform:translateX(400px)}
  }
  .cap-panel.is-live .cap-st.s1 .cap-st__glow{animation:capLit .6s var(--ease) .08s both}
  .cap-panel.is-live .cap-st.s2 .cap-st__glow{animation:capLit .6s var(--ease) .60s both}
  .cap-panel.is-live .cap-st.s3 .cap-st__glow{animation:capLit .6s var(--ease) 1.18s both}
  .cap-panel.is-live .cap-st.s1 .cap-st__core{animation:capCore .6s var(--ease) .08s both}
  .cap-panel.is-live .cap-st.s2 .cap-st__core{animation:capCore .6s var(--ease) .60s both}
  .cap-panel.is-live .cap-st.s3 .cap-st__core{animation:capCore .6s var(--ease) 1.18s both}
  @keyframes capLit{0%{opacity:0}45%{opacity:.85}100%{opacity:.5}}
  @keyframes capCore{0%{r:3}45%{r:4.4}100%{r:3}}

  /* ── responsive: sotto la spina impila, spina nascosta su mobile stretto ── */
  @media (max-width:820px){
    .cap-cols{grid-template-columns:1fr}
    .cap-spine{display:none}
    .cap-panel .rvx{transition-delay:calc(var(--i,0)*40ms)}
  }
  @media (max-width:560px){
    .cap-pipe{padding:16px 15px 12px}
    .cap-tool{justify-content:flex-start}
  }

  /* ── reduced-motion: tutto statico, niente impulso ── */
  @media (prefers-reduced-motion:reduce){
    .cap-panel .rvx{opacity:1;transform:none;transition:none}
    .cap-panel .cap-spine__pulse{display:none}
    .cap-st__glow{opacity:.5}
  }

  /* ── failsafe: se il JS non parte (.no-js) o è bloccato (.ld-stuck),
     la traccia resta comunque leggibile (coerente col failsafe .rv). ── */
  html.no-js .cap-panel .rvx,
  html.ld-stuck .cap-panel .rvx{opacity:1!important;transform:none!important}
  html.no-js .cap-st__glow,
  html.ld-stuck .cap-st__glow{opacity:.5}

/* ── VISIBILITÀ · answer-engine ─────────────────────────────────────────────── */
/* ── VISIBILITÀ · answer-engine · Tavola Tecnica ───────────────────────────
     Consiglio: spostare in os.css. Il JS de-duplica il blocco se re-iniettato. */
  .vis-demo{position:relative;margin-top:34px;border:1px solid var(--line-2);
    background:color-mix(in srgb,var(--bg) 82%, transparent);padding:20px 22px 16px}
  .vis-demo .tick{position:absolute;width:8px;height:8px;border:1px solid var(--accent-lit);opacity:.5}
  .vis-demo .tick.tl{top:-1px;left:-1px;border-right:0;border-bottom:0}
  .vis-demo .tick.tr{top:-1px;right:-1px;border-left:0;border-bottom:0}
  .vis-demo .tick.bl{bottom:-1px;left:-1px;border-right:0;border-top:0}
  .vis-demo .tick.br{bottom:-1px;right:-1px;border-left:0;border-top:0}

  .vis-demo__head{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:16px}
  .vis-tabs{display:flex;gap:6px;flex-wrap:wrap}
  .vis-chip{font-family:var(--f-mono);font-size:11.5px;letter-spacing:.06em;color:var(--text-dim);
    background:transparent;border:1px solid var(--line-2);padding:7px 13px;border-radius:0;cursor:pointer;transition:color .18s,border-color .18s,background .18s}
  .vis-chip:hover{color:var(--accent-lit);border-color:var(--accent-lit)}
  .vis-chip.is-on{color:var(--bg);background:var(--accent-lit);border-color:var(--accent-lit)}
  .vis-replay{display:inline-flex;align-items:center;gap:7px;font-family:var(--f-mono);font-size:11px;letter-spacing:.06em;
    color:var(--text-faint);background:transparent;border:1px solid transparent;padding:6px 8px;cursor:pointer;transition:color .18s}
  .vis-replay:hover{color:var(--accent-lit)} .vis-replay svg{width:15px;height:15px}

  /* sorgente JSON-LD */
  .vis-src{border:1px solid var(--line-2);background:var(--bg)}
  .vis-src__bar{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--line-2)}
  .vis-src__bar .mono{font-size:9.5px;letter-spacing:.16em;color:var(--text-faint)}
  .vis-src__type{color:var(--accent-lit)!important;letter-spacing:.08em!important}
  .vis-json{margin:0;padding:12px 14px;font-family:var(--f-mono);font-size:12px;line-height:1.55;overflow-x:auto;white-space:pre}
  .vis-json .j-k{color:var(--accent-lit)} .vis-json .j-s{color:var(--text)}
  .vis-json .j-n{color:var(--live)} .vis-json .j-p{color:var(--text-faint)}

  /* biforcazione */
  .vis-fork{margin:2px 0 -4px} .vis-fork svg{width:100%;height:auto;max-height:56px;overflow:visible;display:block}
  .vis-out-node__glow{opacity:0;filter:blur(5px)}

  /* due superfici */
  .vis-outs{display:grid;grid-template-columns:1fr 1fr;gap:14px}
  .vis-card{border:1px solid var(--line-2);background:var(--bg);padding:0 0 14px}
  .vis-card__h{display:flex;align-items:center;gap:8px;padding:9px 13px;border-bottom:1px solid var(--line-2)}
  .vis-card__h .mono{font-size:9.5px;letter-spacing:.14em;color:var(--text-dim)}
  .vis-card__tag{margin-left:auto;color:var(--text-faint)!important;letter-spacing:.08em!important}
  .vis-dot{width:7px;height:7px;border-radius:50%;flex:none}
  .vis-dot.g{background:var(--accent-lit)} .vis-dot.a{background:var(--live)}

  /* SERP */
  .serp{padding:12px 15px}
  .serp__crumb{font-family:var(--f-mono);font-size:11px;color:var(--text-faint);margin-bottom:5px}
  .serp__title{display:block;font-size:16px;line-height:1.3;color:var(--accent-lit);text-decoration:none;margin-bottom:6px}
  .serp__title:hover{text-decoration:underline}
  .serp__rate{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-dim);margin-bottom:5px}
  .serp__rate .stars{color:var(--accent-lit);letter-spacing:1px;font-size:11px}
  .serp__rate b{color:var(--text)}
  .serp__desc{font-size:13px;line-height:1.5;color:var(--text-dim)}
  .serp__rich{display:inline-flex;align-items:baseline;gap:8px;margin-top:10px;padding:7px 11px;border:1px solid var(--line-2);
    background:color-mix(in srgb,var(--accent) 6%, transparent);font-size:12px}
  .serp__rich-k{font-family:var(--f-mono);font-size:10px;letter-spacing:.06em;color:var(--accent-lit)}
  .serp__rich-v{color:var(--text-dim)}

  /* AI answer */
  .answ{padding:13px 15px}
  .answ__q{font-family:var(--f-mono);font-size:12.5px;color:var(--text);margin-bottom:11px}
  .answ__caret{color:var(--live)}
  .answ__a{font-size:13.5px;line-height:1.55;color:var(--text-dim);padding-left:12px;border-left:2px solid color-mix(in srgb,var(--live) 45%, transparent)}
  .answ__src{margin-top:11px;font-family:var(--f-mono);font-size:10px;letter-spacing:.04em;color:var(--live)}
  .answ__src-ic{opacity:.8}

  .vis-note{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px;padding:12px 14px;
    border:1px solid color-mix(in srgb,var(--accent-lit) 32%, transparent);background:color-mix(in srgb,var(--accent) 6%, transparent)}
  .vis-note__lbl{font-size:9.5px;letter-spacing:.18em;color:var(--text-faint);flex:none}
  .vis-note__txt{color:var(--text);font-size:14px}

  .vis-legend{margin-top:14px;font-size:10px;letter-spacing:.05em;color:var(--text-faint);text-align:center;display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
  .vis-legend b{color:var(--accent-lit);font-weight:600} .vis-legend .sep{opacity:.5} .vis-legend__end{color:var(--text-faint);opacity:.85}

  /* reveal + animazioni, sincronizzate al reveal */
  .vis-panel .rvx{opacity:0;transform:translateY(9px);transition:opacity .5s var(--ease),transform .5s var(--ease);transition-delay:calc(var(--i,0)*74ms)}
  .vis-panel.is-live .rvx{opacity:1;transform:none}
  .vis-panel .vis-fork__pulse{opacity:0}
  .vis-panel.is-live .vis-fork__pulse.p-g{animation:visForkG 1.15s var(--ease) .18s forwards}
  .vis-panel.is-live .vis-fork__pulse.p-a{animation:visForkA 1.15s var(--ease) .18s forwards}
  @keyframes visForkG{0%{opacity:0;transform:translate(0,0)}14%{opacity:1}100%{opacity:0;transform:translate(-160px,36px)}}
  @keyframes visForkA{0%{opacity:0;transform:translate(0,0)}14%{opacity:1}100%{opacity:0;transform:translate(160px,36px)}}
  .vis-panel.is-live .vis-out-node__glow{animation:visLit .7s var(--ease) 1.1s both}
  @keyframes visLit{0%{opacity:0}45%{opacity:.8}100%{opacity:.5}}

  @media (max-width:820px){
    .vis-outs{grid-template-columns:1fr} .vis-fork{display:none}
    .vis-panel .rvx{transition-delay:calc(var(--i,0)*44ms)}
  }
  @media (max-width:560px){ .vis-demo{padding:16px 15px 12px} .vis-json{font-size:11px} }

  @media (prefers-reduced-motion:reduce){
    .vis-panel .rvx{opacity:1;transform:none;transition:none}
    .vis-panel .vis-fork__pulse{display:none} .vis-out-node__glow{opacity:.5}
  }
  html.no-js .vis-panel .rvx, html.ld-stuck .vis-panel .rvx{opacity:1!important;transform:none!important}
  html.no-js .vis-out-node__glow, html.ld-stuck .vis-out-node__glow{opacity:.5}
