/* =========================================================
   Livello presenza — i due utenti nel "file"
   Vedi docs/superpowers/specs/2026-08-08-figma-presence-design.md
   ========================================================= */

:root {
  /* Stessa glide del resto del sito: il cursore di Matteo deve muoversi
     con la stessa fisica delle card e della navbar, altrimenti si legge
     come un elemento estraneo incollato sopra. */
  --presence-ease: cubic-bezier(0.32, 0.72, 0, 1);

  /* Scostamento della PUNTA del pennino dall'angolo alto-sinistro
     dell'asset (assets/pennino.svg, viewBox 0 0 146 57 — width/height
     dell'<img> combaciano 1:1, nessuna scala di mezzo). Misurato dal
     bounding box del corpo della matita (getBBox() del path col fill
     bianco che va dalla punta al corpo, non l'altro path bianco che e'
     la gomma): x 5.4..39.0, y 6.2..39.8 — la matita e' in diagonale con
     la punta in basso a sinistra, a circa (7, 39). Il commento
     precedente ("nessuno scostamento, la punta sta in alto a sinistra")
     era sbagliato — correzioni B1. Se pennino.svg cambia, rimisurare. */
  /* La mano chiusa, per tutto cio' che si prende e si sposta. Una sola
     definizione: la usano sia about-me.css (grab/grabbing) sia la regola
     piu' sotto per i riquadri cliccabili che ci stanno dentro. */
  --cursore-mano: url("../assets/Cursor-mano.svg") 12 15, grab;

  --presence-cursor-tip-x: 7;
  --presence-cursor-tip-y: 39;

  /* MANOPOLA — dimensione del cursore di Matteo (pennino + etichetta).
     A 1 l'asset e' alla sua misura nativa, 146x57, che dal vivo risulta
     ingombrante rispetto al resto della pagina. Cambiando questo valore
     si scalano INSIEME l'immagine e lo scostamento della punta qui
     sopra: e' l'unico modo di rimpicciolire il cursore senza far
     scollare la punta dal tratto che disegna. Non toccare le due
     misure della punta per aggiustare la dimensione: si rompe la
     calibrazione.

     Il valore e' calibrato sulla FRECCETTA del visitatore, cosi' i due
     utenti hanno cursori della stessa taglia invece che uno grande il
     doppio dell'altro: la freccia disegnata in assets/Cursor.svg misura
     14.4x16px, la matita in assets/pennino.svg 33.6x37.4px, e 0.44 le
     porta alla stessa altezza. */
  --presence-cursor-scale: 0.44;

  /* Il riquadro della sola matita dentro l'asset: serve a ritagliarla
     via dall'etichetta, che viene ridisegnata come testo vero (vedi
     .presence__cursor-name). Scalare tutto insieme rendeva l'etichetta
     illeggibile a queste dimensioni. */
  --presence-pen-box: 46;
}

/* Il cursore del visitatore e' quello di sistema, ridisegnato: la
   proprieta' CSS `cursor` la compone il sistema operativo, quindi ha
   ritardo ZERO. Un <div> che insegue il mouse in JavaScript e' sempre
   un fotogramma indietro e si vede subito che e' finto.
   Il numero dopo l'URL e' il punto attivo (la punta della freccia).

   Sotto .js e non su `body` nudo: senza JavaScript il secondo utente
   (Matteo) non esiste mai, quindi una freccia da Figma senza nessuno con
   cui condividere il file sarebbe solo un cursore strano — e il vincolo
   di progetto vuole il sito identico alla versione attuale senza JS.
   La classe .js viene impostata nell'inline script in <head>, prima del
   primo paint (stesso meccanismo di `.js [data-reveal]` in page.css),
   quindi non c'e' nessun lampo del cursore di sistema al caricamento. */
.js body {
  cursor: url("../assets/Cursor.svg") 6 4, auto;
}

/* Link e bottoni: gia' pointer di default (i link lo sono nativamente,
   i bottoni del sito lo sono gia' via .btn/.photo-stack__nav/
   .photo-stack__play in button.css e photo-carousel.css). Restano fuori
   dal gate perche' non cambiano nulla senza il cursore personalizzato:
   gate inutile e' solo rumore. */
a,
button {
  cursor: pointer;
}

/* Input e textarea: cursore di testo, gia' il default nativo del
   browser — stesso motivo, fuori dal gate. */
input,
textarea {
  cursor: text;
}

/* Label e [role="button"]: qui invece il pointer NON e' il default del
   browser (una <label> nuda resta a freccia). La regola ha senso solo
   come compenso al cursore personalizzato del body — senza .js deve
   restare la freccia di sistema, come oggi, quindi va sotto lo stesso
   gate. */
.js label,
.js [role="button"] {
  cursor: pointer;
}

/* ---------- La mano che afferra, ridisegnata ----------
   Il sito ridisegna gia' la freccia (Cursor.svg, qui sopra) e lascia al
   browser il cursore di testo, che e' gia' giusto: restava la mano, ed
   era l'unico cursore di sistema rimasto in mezzo a cursori disegnati.

   E' una mano CHIUSA, non un dito che indica: queste foto si prendono e
   si spostano, non si premono, e un pugno e' cio' che si fa con una cosa
   che si sta trascinando.

   Cursor-mano.svg e' costruito come Cursor.svg — nero pieno, bordo
   bianco, la stessa ombra portata — cosi' i due sembrano usciti dallo
   stesso file. Il bordo bianco e' appena piu' marcato: questa mano vive
   SULLE FOTO, dove un contorno sottile si perde sui punti chiari.

   Il disegno arriva da Figma, dato dal committente, e il file e' usato
   COM'E': 24x24, che e' gia' una misura buona per un cursore (la freccia
   e' 24x25). Non c'e' niente da adattare — se un giorno lo si
   risostituisse con un export a piena risoluzione, quello si' andrebbe
   ridotto: sopra i 128px Chrome ignora il cursore e rimette quello di
   sistema.

   Lo scarto 12 15 e' il centro del palmo, non una punta: una mano
   afferra con il palmo. La freccia usa 6 4, che e' la sua punta.

   Va messo QUI e non solo dove sta `cursor: grab` (about-me.css): la
   foto trascinabile ha dentro di se' il riquadro cliccabile
   [role="button"], che sta sopra e vincerebbe con la manina di sistema —
   il cursore lo decide l'elemento sotto il puntatore, e quello e' il
   figlio. */
.js .about__photo-inner,
.js .photo-stack__frames {
  cursor: var(--cursore-mano);
}

/* ---------- Il livello ----------
   absolute con altezza ZERO, ancorato all'origine del documento: i figli
   sono posizionati in coordinate documento e scorrono con la pagina da
   soli, senza che nessuno li riallinei.

   Prima era `fixed` con un mondo traslato di -scrollY da JavaScript, per
   evitare che un livello alto quanto la pagina la allungasse (e quindi
   allungasse se stesso: un anello di retroazione). Ma quella
   compensazione e' per forza di cose UN FOTOGRAMMA INDIETRO rispetto allo
   scorrimento nativo, e i disegni "fluttuavano" visibilmente sopra il
   contenuto mentre si scrollava. L'altezza zero risolve il problema
   originale senza pagare quel prezzo: il livello non ha dimensione
   propria, quindi non allunga nulla, e non c'e' piu' niente da
   compensare. */
.presence {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 0;
  pointer-events: none;
}

/* L'INCHIOSTRO STA SOTTO. Regola del committente: «non devi MAI disegnare
   sui miei lavori, thumb o testi — ogni disegno deve stare sotto questi
   elementi».

   z-index negativo, non 0: un elemento posizionato con z-index 0 o auto
   viene comunque dipinto SOPRA il contenuto in flusso, perche' finisce
   nel livello dei discendenti posizionati. Solo il negativo lo porta
   sotto — sopra lo sfondo della pagina, sotto tutto il resto.

   Le regole di posizionamento restano, e non sono ridondanti: il testo
   non ha uno sfondo, quindi un segno dietro le lettere si vedrebbe lo
   stesso. L'ordine dei livelli e' la garanzia per cio' che e' opaco (le
   thumb, il modulo dei contatti, le foto), dove basta da solo. */
.presence--inchiostro {
  z-index: -1;
}

/* IL CURSORE STA SOPRA IL CONTENUTO, MA SOTTO LA NAVBAR.

   Sopra il contenuto perche' non e' contenuto: e' una persona, e nei file
   condivisi i cursori stanno sopra la tela.

   Sotto la navbar (200) perche' la navbar non e' tela: e' l'interfaccia
   del sito, sta fissa in alto e vale piu' di chiunque ci passi sotto.
   Prima stava a 250 e ci passava sopra — «la freccina di Matteo va sopra
   la navbar, cosa che non deve mai succedere». */
.presence--cursore {
  z-index: 150;
}

/* Il cursore esce di scena oltre il bordo della finestra: essendo ora nel
   flusso del documento, senza questo si porterebbe dietro una barra di
   scorrimento orizzontale. `clip` e non `hidden` perche' hidden creerebbe
   un contenitore di scorrimento, con effetti collaterali sul resto della
   pagina; clip taglia e basta. */
html,
body {
  overflow-x: clip;
}

/* Semplice contenitore: le coordinate documento le portano i figli. */
.presence__world {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 0;
}

/* ---------- Il cursore di Matteo ---------- */

.presence__cursor {
  position: absolute;
  top: 0;
  left: 0;
  /* Si sottrae lo scostamento della punta (vedi --presence-cursor-tip-*
     qui sopra) cosi' e' la PUNTA del pennino, non l'angolo dell'asset, a
     cadere esattamente sul punto tracciato. */
  transform: translate3d(
    calc(
      (var(--presence-cursor-x, 0) -
        var(--presence-cursor-tip-x) * var(--presence-cursor-scale)) * 1px
    ),
    calc(
      (var(--presence-cursor-y, 0) -
        var(--presence-cursor-tip-y) * var(--presence-cursor-scale)) * 1px
    ),
    0
  );
  opacity: 0;
  transition: opacity 220ms var(--presence-ease);
  will-change: transform;
}

.presence__cursor[data-state="hidden"] {
  opacity: 0;
}

.presence__cursor.is-visible {
  opacity: 1;
}

/* Ritaglio: dell'asset si tiene solo la matita, l'etichetta che porta
   con se' viene scartata e ridisegnata sotto come testo. */
.presence__cursor-pen {
  display: block;
  width: calc(var(--presence-pen-box) * var(--presence-cursor-scale) * 1px);
  height: calc(var(--presence-pen-box) * var(--presence-cursor-scale) * 1px);
  overflow: hidden;
  /* Il perno e' la PUNTA della matita, non il centro del riquadro: una
     penna si inclina attorno al punto in cui tocca il foglio. Le due
     frazioni sono la punta (7, 39) rapportata al riquadro ritagliato. */
  transform-origin: calc(7 / var(--presence-pen-box) * 100%)
    calc(39 / var(--presence-pen-box) * 100%);
  transform: rotate(calc(var(--presence-cursor-rot, 0) * 1deg));
  /* Lenta di proposito: e' un'occhiata, non un puntamento. Se seguisse il
     mouse da vicino sembrerebbe una lancetta invece di una mano che si
     gira. */
  transition: transform 420ms var(--presence-ease);
}

@media (prefers-reduced-motion: reduce) {
  .presence__cursor-pen {
    transition: none;
  }
}

.presence__cursor img {
  display: block;
  /* Si scala l'immagine, non il contenitore con un transform: cosi' la
     scala non entra in conflitto con il translate3d che posiziona il
     cursore, e resta una sola trasformazione da comporre. */
  width: calc(146px * var(--presence-cursor-scale));
  height: calc(57px * var(--presence-cursor-scale));
}

/* L'etichetta col nome e' testo vero, non parte dell'immagine: cosi'
   resta leggibile anche con la matita rimpicciolita alla taglia della
   freccetta, e usa la tipografia del sito invece di un testo
   rasterizzato dentro l'SVG. Sta accanto alla matita, spostata in basso
   come nei cursori condivisi di Figma. */
.presence__cursor-name {
  position: absolute;
  left: calc(var(--presence-pen-box) * var(--presence-cursor-scale) * 1px);
  top: calc(28px * var(--presence-cursor-scale));
  padding: 2px var(--space-2);
  border-radius: 6px;
  background: var(--color-blue);
  color: var(--color-white);
  font-family: var(--font-family-base);
  font-size: var(--font-size-caption);
  font-weight: var(--font-weight-bold);
  line-height: 1.4;
  white-space: nowrap;
}

/* ---------- Inchiostro volante ----------
   Ogni disegno e' un elemento a se': cosi puo' essere agganciato,
   riposizionato e rimosso singolarmente, senza toccare gli altri. */
.presence__ink-item {
  position: absolute;
  top: 0;
  left: 0;
  /* --ink-rot e' l'inclinazione con cui il disegno e' stato appoggiato sul
     foglio: la imposta piazzaDisegno una volta sola e non cambia piu'.
     Non e' un'animazione — vedi il commento sulla rotazione li'. */
  transform: translate3d(
      calc(var(--ink-x, 0) * 1px),
      calc(var(--ink-y, 0) * 1px),
      0
    )
    rotate(calc(var(--ink-rot, 0) * 1deg));
  /* I disegni devono poter ricevere l'hover: sono l'unica fonte del
     punteggio (piano 2). Il livello che li contiene resta trasparente
     ai clic, loro no. */
  pointer-events: auto;
}

/* I fondali delle sezioni (js/presence/fondali.js) sono gli unici
   disegni che non sono segni: sono composizioni disegnate su misura per
   un pezzo di pagina — attorno al form dei contatti, attorno al bottone
   del curriculum. Non deve raccogliere il puntatore — gli altri disegni si', sono
   piccoli e ci si passa sopra apposta; questo copre mezza schermata, e
   lasciarglielo fare vorrebbe dire una lastra invisibile fra il
   visitatore e la pagina. */
.presence__sfondo {
  pointer-events: none;
}

/* Nessuno spazio in cui stare senza finire addosso a qualcosa: succede
   su una finestra molto stretta. Si nasconde invece di stare sopra una
   thumb — e torna da solo appena c'e' di nuovo posto (vedi
   scansaGliInvadenti in js/presence/posizionamento.js). */
.presence__ink-item.is-senza-posto {
  opacity: 0;
  pointer-events: none;
  transition: opacity 200ms var(--presence-ease);
}

.presence__ink-item svg {
  display: block;
  overflow: visible;
}

@media (prefers-reduced-motion: reduce) {
  .presence__cursor {
    transition: none;
  }
}
