/* Tutto il CSS del sito, in blocchi: i nomi "css/..." nelle intestazioni sono
   quelli dei vecchi file da cui veniva, montati una volta da css/build.sh. Lo
   script non c'e' piu': si modifica qui. */

/* ===== css/base/tokens.css ===== */
/* token, reset e navigazione: condivisi da index, training e progetti */
:root{
  color-scheme:light;
  /* La palette. Un colore scelto dal backend si salva come var(--cN): la casella,
     non l'esadecimale. Cambiare un colore qui ridipinge tutto il sito.
     Le caselle sono nove, e sono anche in PALETTES dentro lib/design.php: se se ne
     aggiunge una, va aggiunta di la' o il backend non la offre. */
  --c1:#050505; --c2:#FFFF00; --c3:#0000FF; --c4:#F9F9F9;
  --c5:#FF0000; --c6:#FF8800; --c7:#FFBB00; --c8:#FF88BB;
  --c9:#1E1E1E;
  --accent:var(--c3);
  /* grigi caldi, non neutri: il fondo deve sembrare carta, non schermo */
  --gray2:hsl(38 20% 96.0%); --gray3:hsl(38 18% 93.5%); --gray4:hsl(38 16% 90.5%);
  --gray5:hsl(38 14% 87.0%); --gray6:hsl(38 12% 83.0%); --gray8:hsl(36 10% 70.0%);
  --gray9:hsl(35 8% 52.0%); --gray10:hsl(34 8% 46.0%); --gray11:hsl(32 9% 36.0%);
  --gray12:hsl(30 12% 12.0%);
  --sheet:hsl(40 33% 97.5%);          /* i fogli non sono bianco puro */
  --root-background:var(--gray4);
  /* Il raggio dei componenti: uno solo, cosi' tutto il sito si ammorbidisce o
     si irrigidisce da qui. Sotto i 4px non si vede, sopra gli 8 diventa uno
     stile. Le forme del segno (tondo, rombo) non passano di qui: quelle sono
     disegno, non superficie. */
  --radius:6px;
  /* La riga del menu di sezione: 18px di testo piu' i 2px di padding che le
     frecce si portano sopra e sotto. La usano la rail e il filtro in alto a
     destra, che devono cadere sulla stessa linea: sta scritta qui una volta,
     se no una delle due la indovina e sbaglia di due pixel. */
  --menu-riga:22px;
}

/* ===== css/base/fonts.css ===== */
/* Archivo (Omnibus-Type, OFL), variabile 100-900 in un solo file, servita da qui:
   niente richieste a fonts.gstatic.com. Due sottoinsiemi, il browser scarica solo quello che serve. */
@font-face{
  font-family:Archivo;font-style:normal;font-weight:100 900;font-display:swap;
  src:url(archivo-latin.woff2) format("woff2");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:Archivo;font-style:normal;font-weight:100 900;font-display:swap;
  src:url(archivo-latin-ext.woff2) format("woff2");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
:root{ --font:Archivo,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",sans-serif }

/* ===== css/base/reset.css ===== */

*,*::before,*::after{box-sizing:border-box;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
html,body{background:var(--root-background)}
/* La grandezza del testo scelta in Settings: uno zoom sulle pagine di lettura
   (elenchi, scritti, Now), non sulle sfere, che le misure le leggono per
   muovere le cartelle e con lo zoom sbaglierebbero i conti. */
html[data-testo=small] :is(.listPage,.sheet,main.now){zoom:.9}
html[data-testo=large] :is(.listPage,.sheet,main.now){zoom:1.12}
body{font-family:var(--font);color:var(--gray12)}
::selection{background:var(--accent);color:#fff}
h1,h2,h3{font-weight:500}
h1,h2,h3,p{margin:0}
a{color:inherit;text-decoration:none;cursor:pointer}

button{padding:0;background:transparent;font-family:inherit;border:0}
.vh{clip-path:inset(50%);height:1px;overflow:hidden;white-space:nowrap;width:1px;position:absolute}

/* ===== css/base/view-transitions.css ===== */
/* ---------- passaggio da una pagina all'altra ----------
   Una dissolvenza: quella che lasci se ne va, quella che arriva compare. La fa
   il browser da solo, niente librerie e niente finti caricamenti — basta che le
   due pagine dichiarino di volersi passare la mano. Dove non è supportato (per
   ora Firefox) il link funziona come sempre, solo senza dissolvenza. */
@view-transition{navigation:auto}
::view-transition-group(root){animation-duration:340ms}
@media (prefers-reduced-motion:reduce){ @view-transition{navigation:none} }

/* ---------- avanti e indietro fra le sezioni ----------
   Le pagine sono una fila e il passaggio lo dice: chi esce se ne va dalla parte
   da cui sei arrivato, chi entra arriva dall'altra. Il verso lo scrive la rail
   sull'<html> un attimo prima di cambiare pagina (vedi verso_script() in
   components/rail.php); senza verso — un link qualunque, il tasto indietro —
   resta la dissolvenza di prima.

   Il movimento e' due centesimi di schermo, non mezzo: deve dire da che parte,
   non spostare la pagina. La rail non partecipa: porta un nome suo, e una
   bussola non scivola via col resto. */
@keyframes vtVia{to{opacity:0;transform:translateX(var(--vt-via,0))}}
@keyframes vtQua{from{opacity:0;transform:translateX(var(--vt-qua,0))}}

html[data-verso=avanti]{--vt-via:-2%; --vt-qua:2%}
html[data-verso=indietro]{--vt-via:2%; --vt-qua:-2%}

html[data-verso]::view-transition-old(root){animation:vtVia 300ms cubic-bezier(.2,.7,.2,1) both}
html[data-verso]::view-transition-new(root){animation:vtQua 300ms cubic-bezier(.2,.7,.2,1) both}

/* ---------- dentro e fuori da una cartella ----------
   Aprendo una cartella la pagina nuova esce dal rettangolo della cartella e
   cresce fino allo schermo; tornando con la cartellina grigia la pagina se ne
   va stringendosi dentro di lei. Il rettangolo lo misura chi clicca e lo passa
   in --da-t/r/b/l (vedi verso_script() in components/rail.php). */
@keyframes vtEsce{from{clip-path:inset(var(--da-t) var(--da-r) var(--da-b) var(--da-l) round 10px)}
                  to{clip-path:inset(0 0 0 0 round 0)}}
/* il 'from' esplicito serve: da clip-path:none a inset() non c'e' interpolazione, si salta */
@keyframes vtRientra{from{clip-path:inset(0 0 0 0 round 0)} to{clip-path:inset(var(--da-t) var(--da-r) var(--da-b) var(--da-l) round 6px)}}
@keyframes vtDopo{0%,60%{opacity:0}}
html[data-verso=cartella]::view-transition-old(root){animation:none}
html[data-verso=cartella]::view-transition-new(root){animation:vtEsce 520ms cubic-bezier(.2,.8,.2,1) both}
html[data-verso=cartella]::view-transition-new(rail){animation:vtDopo 520ms both}
html[data-verso=casa]::view-transition-new(root){animation:none}
html[data-verso=casa]::view-transition-old(root){animation:vtRientra 440ms cubic-bezier(.6,0,.3,1) both;z-index:1}

/* Fra la home e i side-project: due sfere, una dentro l'altra, e i due gesti
   sono uno lo specchio dell'altro. Il punto e' --o-x/--o-y: dove stava la
   cartella Side-project in home, salvato al click.
   Entrando la home ti viene incontro verso la cartella aperta e svanisce, sopra
   (z-index); sotto i side-project sono gia' vivi e nascono da quel punto con le
   loro molle (sphere.js).
   Tornando i side-project sono gia' rientrati nel punto (sphere.js): restano da
   sfumare, e la home arretra da vicino al suo posto, sforando di un niente,
   mentre la cartella si richiude. La rail non partecipa: e' la stessa. */
@keyframes vtTuffo{to{transform:scale(1.5);opacity:0}}
@keyframes vtSfuma{to{opacity:0}}
@keyframes vtRitorno{from{transform:scale(1.5);opacity:0}}
html[data-verso=dentro]::view-transition-old(root),html[data-verso=fuori]::view-transition-old(root),
html[data-verso=dentro]::view-transition-new(root),html[data-verso=fuori]::view-transition-new(root){
  transform-origin:var(--o-x,50%) var(--o-y,50%);mix-blend-mode:normal}
html[data-verso=dentro]::view-transition-old(root),html[data-verso=fuori]::view-transition-old(root){z-index:1}
html[data-verso=dentro]::view-transition-new(root){animation:none}
html[data-verso=dentro]::view-transition-old(root){animation:vtTuffo 420ms cubic-bezier(.55,0,.85,.35) both}
html[data-verso=fuori]::view-transition-old(root){animation:vtSfuma 160ms ease-out both}
html[data-verso=fuori]::view-transition-new(root){animation:vtRitorno 620ms cubic-bezier(.2,1.12,.35,1) both}
/* di base le due pagine si sommano (plus-lighter): con una ferma sotto e l'altra
   che si ritaglia, la somma imbiancava tutto e la pagina che rientra non si vedeva */
html[data-verso=cartella]::view-transition-old(root),html[data-verso=cartella]::view-transition-new(root),
html[data-verso=casa]::view-transition-old(root),html[data-verso=casa]::view-transition-new(root){mix-blend-mode:normal}

/* ===== css/components/link.css ===== */
/* ---------- il passaggio del mouse sui link ----------
   Uno solo per tutto il sito: un rettangolo che entra da sinistra e copre il
   testo. Il modo non cambia mai, cambiano i colori — ogni posto scrive i suoi.
     --link-rest  il fondo a riposo, di norma niente
     --link-fill  il rettangolo che entra
     --link-ink   il testo quando il rettangolo l'ha raggiunto
   Il link resta di riga e il fondo si spezza con lui (box-decoration-break):
   a fine riga si va a capo e il rettangolo diventa due, uno per riga. Sono due
   fondi sovrapposti, cresce solo quello sopra: niente esce mai dal rettangolo. */
a.inline{
  --link-rest:transparent; --link-fill:var(--accent); --link-ink:var(--sheet);
  padding:0 .1em;text-decoration:none;
  -webkit-box-decoration-break:clone;box-decoration-break:clone;
  background-image:linear-gradient(var(--link-fill) 0 0),linear-gradient(var(--link-rest) 0 0);
  background-repeat:no-repeat;background-size:0 100%,100% 100%;
  /* il testo cambia colore a meta' corsa, quando il rettangolo l'ha superato */
  transition:background-size .2s cubic-bezier(.4,0,.2,1),color 0s linear .08s;
}
a.inline:hover,a.inline:focus-visible{
  background-size:100% 100%,100% 100%;color:var(--link-ink);
}
@media (prefers-reduced-motion:reduce){ a.inline{transition:none} }

/* ===== css/components/tendina.css ===== */
/* La tendina: un pezzo solo, due mestieri.

   In mezzo alla rail è il nome della sezione che si apre sulle cinque pagine;
   in alto a destra è il filtro della pagina che si apre sulle sue viste. Sono
   la stessa cosa — una parola che si apre su un elenco — e da qui in poi si
   vestono allo stesso modo: stesso foglio, stessa ombra, stesso ritmo con cui
   le voci arrivano. Chi la usa aggiunge solo dove si mette.

   È un <details>: aperto e chiuso li sa fare da sé, anche senza javascript, e
   con la tastiera funziona di suo. Il clic fuori e l'Escape li aggiunge
   verso_script() in components/rail.php, per tutte le tendine della pagina. */
/* flex e non un blocco qualunque: dentro un blocco il <summary>, che e' un
   inline-block, si porta dietro la discesa della linea di testo e il <details>
   viene alto 19px invece di 18. Un pixel, ma basta a far cadere il nome della
   rail e il filtro su due righe diverse. Cosi' la scatola e' alta quanto la
   parola, dovunque la tendina venga usata. */
.apre{position:relative;display:flex;align-items:center}

/* La parola. Niente freccetta e niente triangolino: al passaggio si sottolinea,
   e la sottolineatura resta finché il pannello è aperto. */
.qui{
  position:relative;display:inline-block;list-style:none;cursor:pointer;
  color:var(--gray12);font-size:13px;line-height:18px;white-space:nowrap;padding:0 2px;
}
.qui::-webkit-details-marker{display:none}
.qui::after{
  content:"";position:absolute;left:2px;right:2px;bottom:-2px;height:1px;background:currentColor;
  transform:scaleX(0);transform-origin:50%;
  transition:transform 240ms cubic-bezier(.2,.7,.2,1);
}
.qui:hover::after,.qui:focus-visible::after,.apre[open] .qui::after{transform:scaleX(1)}
.qui:focus-visible{outline:none}

/* Il pannello. Il foglio prende il colore della carta, non quello del fondo:
   così si stacca da sé e all'ombra resta poco da fare — un filo di contorno che
   chiude la forma, un velo sotto per dire che è appoggiato. Senza fondo proprio
   i nomi cadrebbero sul contenuto e ci si leggerebbe attraverso. */
.giu{
  position:absolute;top:27px;left:50%;transform:translateX(-50%);z-index:1;
  display:flex;flex-direction:column;align-items:center;gap:2px;
  padding:8px 10px;border-radius:var(--radius);
  background:var(--sheet);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12) 6%, transparent),
             0 1px 2px color-mix(in oklab, var(--gray12) 5%, transparent),
             0 8px 24px -10px color-mix(in oklab, var(--gray12) 10%, transparent);
}
/* Le voci arrivano una dopo l'altra, quaranta millesimi l'una dall'altra: il
   ritardo racconta l'ordine dell'elenco — è lo stesso ritmo dei blocchi del
   Now, e il sito ce l'ha già in mano. */
/* Al passaggio la voce si scurisce e prende un velo di fondo — quattro per
   cento, appena una temperatura diversa: dice dove sei col dito senza diventare
   un bottone. Le righe si allargano quanto il pannello, se no il velo sarebbe
   larga una parola e la colonna ballerebbe da "Text" a "Portfolio". */
.giu .v{
  align-self:stretch;text-align:center;
  color:var(--gray9);font-size:13px;line-height:18px;white-space:nowrap;
  padding:3px 10px;border-radius:4px;
  opacity:0;transform:translateY(-5px);
  transition:opacity 220ms ease-out,transform 220ms cubic-bezier(.2,.7,.2,1),
             color 150ms ease-in-out,background-color 150ms ease-in-out;
}
.apre[open] .giu .v{opacity:1;transform:none;transition-delay:calc(var(--i) * 40ms)}
.giu .v:hover{color:var(--gray12);background:color-mix(in oklab, var(--gray12) 4%, transparent)}
/* La voce dove sei è già scura: niente velo anche lì, se no i due stati si
   confondono e il passaggio non si vede più. */
.giu .v[aria-current]{color:var(--gray12)}

/* col dito i bersagli devono essere piu' grandi di una riga di testo */
@media (pointer:coarse){
  .giu .v{padding:8px 16px}
}

@media (prefers-reduced-motion:reduce){
  .qui::after,.giu .v{transition:none}
  /* niente scaletta: le voci ci sono tutte insieme */
  .apre[open] .giu .v{transition-delay:0s}
}

/* ===== css/components/rail.css ===== */
/* navigazione: testo, uguale su tutte le pagine */
/* Rail: unica navigazione del sito. Un pezzo, tre mestieri:

     in home       il metro scorre e il segno sta fermo al centro
     in uno scritto lo stesso, girato in verticale: segue la lettura
     nelle altre   non c'e' niente da misurare: solo il nome della pagina

   L'asse e' una coppia di numeri, --ax --ay (1 0 disteso, 0 1 in piedi): una
   corsa si scrive una volta sola e vale nei due versi. */

/* La rail non partecipa alla dissolvenza fra le pagine: e' una bussola, e una
   bussola non sfuma — dice dove sei, e lo dice subito. Portando un nome esce dal
   fotogramma comune, e le regole qui sotto tolgono l'incrocio: la vecchia
   sparisce, la nuova c'e' gia'. Due nomi perche' su uno scritto le rail sono due,
   e due elementi con lo stesso nome annullerebbero tutto il passaggio.

   Spente le due immagini resta la cornice, e anche quella va ferma: il gruppo
   interpola misura e posizione fra la rail di prima e quella di dopo, e siccome
   entrando in un dettaglio la rail cambia altezza — sotto l'etichetta sparisce
   lo scambio di vista — la nuova arrivava allargandosi. Sembrava uno zoom. */
.rail{view-transition-name:rail}
.rail[data-axis=y]{view-transition-name:railY}
::view-transition-group(rail),::view-transition-group(railY){animation:none}
::view-transition-old(rail),::view-transition-old(railY){animation:none;opacity:0}
::view-transition-new(rail),::view-transition-new(railY){animation:none;opacity:1}

:root{
  --rail-finestra:230px;   /* quanto metro se ne vede per volta */
  --rail-passo:10px;       /* un trattino piu' il suo vuoto */
}

/* ---------- dove sta nella pagina ----------
   In cima al documento, e scorre via col resto: non copre mai il contenuto.
   Sulle sfere, che non scorrono, resta fissa (html.sfera, in sphere.css); in
   piedi, a sinistra di uno scritto, e' sempre fissa. */
.rail{
  position:absolute;top:28px;left:50%;transform:translateX(-50%);z-index:3;
  display:flex;flex-direction:column;align-items:center;gap:10px;
  --ax:1; --ay:0;
}
.rail[data-axis=y]{
  position:fixed;top:50%;left:28px;transform:translateY(-50%);flex-direction:row;
  --ax:0; --ay:1;
}
@media (max-width:720px){ .rail[data-axis=y]{left:12px} }

/* ---------- la finestra ----------
   Il metro e' lungo quanto tutto il sito, ma se ne vede un pezzo: il resto
   sfuma ai bordi invece di finire di taglio. La sfumatura fa anche il lavoro
   che prima faceva spegnere i trattini sotto il segno — nessuno arriva al
   centro gia' sbiadito, ci arriva pieno e ne esce piano. */
.rail .track{
  position:relative;overflow:hidden;--verso:90deg;
  width:calc(var(--ax) * var(--rail-finestra) + var(--ay) * 18px);
  height:calc(var(--ay) * var(--rail-finestra) + var(--ax) * 18px);
  -webkit-mask:linear-gradient(var(--verso), #0000, #000 20%, #000 80%, #0000);
          mask:linear-gradient(var(--verso), #0000, #000 20%, #000 80%, #0000);
}
.rail[data-axis=y] .track{--verso:180deg}

/* ---------- il metro ----------
   Scorre lui, non il segno. --scorri e' quanto e' gia' passato, in pixel: lo
   scrive stage.js a ogni fotogramma, dove prima scriveva la posizione del
   cerchio. Il mezzo della finestra e' il punto in cui sei. */
.rail .metro{
  position:absolute;left:0;top:0;display:flex;align-items:center;width:max-content;
  gap:calc(var(--rail-passo) - 1px);
  transform:translate(
    calc(var(--ax) * (var(--rail-finestra) / 2 - var(--scorri, 0px))),
    calc(var(--ay) * (var(--rail-finestra) / 2 - var(--scorri, 0px)))
  );
}
.rail[data-axis=y] .metro{flex-direction:column}
.rail .line{
  flex:none;background:var(--gray8);
  width:calc(var(--ax) * 1px + var(--ay) * 11px);
  height:calc(var(--ay) * 1px + var(--ax) * 11px);
}
/* Ogni cinque un trattino intero: i passi si contano senza numerarli, e il
   metro prende un ritmo invece di essere una fila piatta. */
.rail .metro .line:nth-child(5n+1){
  background:var(--gray9);
  width:calc(var(--ax) * 1px + var(--ay) * 18px);
  height:calc(var(--ay) * 1px + var(--ax) * 18px);
}

/* ---------- la forma del segno ----------
   La sceglie Site settings e vale su tutte le rail. Tondo, quadro, arco e
   quarto si fanno col raggio; triangolo e rombo col clip-path.
   Ogni forma dice per intero com'e' fatta — raggio *e* ritaglio: dicendo solo
   la differenza si porterebbe dietro il ritaglio di chi sta piu' su, e dentro
   un <html data-mark-shape=diamond> un quadrato resterebbe un rombo. */
:root,[data-mark-shape]{--mark-radius:9999px; --mark-clip:none}
[data-mark-shape=circle]{--mark-radius:9999px;--mark-clip:none}
[data-mark-shape=square]{--mark-radius:0;--mark-clip:none}
[data-mark-shape=arch]{--mark-radius:50% 50% 0 0;--mark-clip:none}
[data-mark-shape=quarter]{--mark-radius:100% 0 0 0;--mark-clip:none}
[data-mark-shape=triangle]{--mark-radius:0;--mark-clip:polygon(50% 0,100% 100%,0 100%)}
[data-mark-shape=diamond]{--mark-radius:0;--mark-clip:polygon(50% 0,100% 50%,50% 100%,0 50%)}

/* ---------- il segno, fermo al centro ----------
   La forma non si tocca: e' quella scelta in Site settings e resta quella,
   ferma o in corsa. Un rombo che si schiaccia mentre scorri non e' piu' un
   rombo, e il segno e' l'unica cosa che non deve mai cambiare — e' il punto
   fermo su cui si legge tutto il resto. */
.rail .box{
  position:absolute;left:50%;top:50%;width:18px;height:18px;margin:-9px 0 0 -9px;
  background:var(--accent);border-radius:var(--mark-radius);clip-path:var(--mark-clip);
}

/* ---------- l'etichetta sotto la rail ---------- */
.rail .l{font-size:13px;line-height:18px;color:var(--gray11);white-space:nowrap}
.rail[data-axis=y] .l{writing-mode:vertical-rl}

/* ---------- una pagina foglia: now, contatti, credits, privacy, notes ----------
   Niente da scorrere: la rail e' solo il nome della pagina. Il ritorno e' la
   cartellina grigia in alto a sinistra (.casa, in shut.css). */
.rail[data-mode=foglia] .track{
  overflow:visible;width:auto;height:var(--menu-riga);
  display:flex;align-items:center;
  -webkit-mask:none;mask:none;
}
.rail[data-mode=foglia] .nome{
  color:var(--gray12);font-size:13px;line-height:18px;white-space:nowrap;padding:0 2px;
}

/* ===== css/components/views.css ===== */
/* Il filtro della pagina: la stessa tendina del menu di sezione — vedi
   css/components/tendina.css — messa in alto a destra, alla stessa altezza
   della rail. Non sta sotto il nome della sezione: la rail dice dove sei, il
   filtro è un comando della pagina e sta nel suo angolo.

   Sta fuori dal <nav class="rail"> perché dentro non potrebbe puntarsi al bordo
   destro: la rail è centrata, e un figlio si posiziona su di lei. Segue però le
   stesse regole di posizione — dove la rail è fissa è fissa anche lei, dove
   scorre col documento scorre anche lei. */
/* Alto 18px e flex come la .track della rail, non un blocco qualunque: dentro
   la rail la parola sta in una scatola di 18px centrata, qui invece il summary
   e' un inline-block e si appoggerebbe alla linea di base del blocco, cioe' a
   un'altezza decisa dall'interlinea ereditata. Stessa altezza dal bordo, ma le
   due parole non cadevano sulla stessa riga. */
.filtro{
  position:absolute;top:28px;right:28px;z-index:3;
  /* alto quanto la riga del menu di sezione: le due parole devono cadere sulla
     stessa linea. Il flex arriva da .apre, in tendina.css. */
  height:var(--menu-riga);
}

/* L'unica cosa che cambia rispetto alla tendina di mezzo: il pannello si
   appoggia al bordo destro invece di centrarsi sulla parola. In un angolo si
   sta allineati al bordo che si ha vicino — centrato uscirebbe dallo schermo. */
.filtro .giu{left:auto;right:-8px;transform:none}

/* Quanti pezzi ci sono di là: si sceglie sapendo cosa si trova, e una coda da
   un pezzo si legge per quello che è. Cifre a passo fisso, così non ballano. */
.filtro .n{color:var(--gray8);margin-left:5px;font-variant-numeric:tabular-nums}
.filtro .v[aria-current] .n{color:var(--gray9)}

/* "All" non è un'etichetta, è il levare il filtro: una riga lo stacca dalle
   etichette vere. Con due viste pari — Ribbon, List — non serve, e il php non
   la scrive. */
.filtro .riga{
  align-self:stretch;height:1px;margin:2px 0;
  background:color-mix(in oklab, var(--gray12) 8%, transparent);
}

/* Su schermo stretto il filtro resta alla stessa altezza della rail: sono due
   comandi della stessa riga — dove sei al centro, come guardi a destra — e
   spezzarli su due righe li faceva sembrare due cose diverse.

   Si avvicina al bordo, e con un'etichetta lunga si accorcia con i puntini
   invece di allargarsi fino a toccare il nome della sezione. Accorciata resta
   leggibile: il nome per intero e' comunque nel pannello che si apre. */
@media (max-width:640px){
  .filtro{top:28px;right:12px}
  .filtro .giu{right:-6px}
  .filtro .qui{max-width:34vw;overflow:hidden;text-overflow:ellipsis}
}

/* ===== css/components/stage.css ===== */
/* Il nastro dei progetti non c'e' piu': resta il rimando in cima alla pagina
   di un Text ("← Text / Home"). */
.frameNav{display:flex;gap:8px;white-space:nowrap}
.frameNav span{color:var(--gray8)}

/* ===== css/components/slide.css ===== */
/* Delle slide resta solo l'evidenziato, che usano Text, Now e Privacy. */

/* Evidenziato: ==testo== nel backend. Campitura piena dietro le parole, non
   il giallo di serie del browser. Il colore si cambia con --hi. */
mark{background:var(--hi,var(--c6));color:var(--gray12);padding:0 .04em}
/* Un link dentro l'evidenziato: stesso rettangolo di tutto il sito, ma i due
   arancioni al posto dei colori di base. A dipingere e' il link e basta —
   l'evidenziato si toglie di mezzo. Se restassero due fondi sovrapposti, il
   piu' piccolo lascerebbe scoperto un filo del piu' grande: le due caselle
   non tornano mai al pixel. */
mark:has(a.inline){background:none;padding:0}
mark a.inline{
  --link-rest:var(--hi,var(--c6));
  --link-fill:var(--hi-hover,var(--c7));
  --link-ink:var(--gray12);
  padding:0 .04em;
}

/* ===== css/components/contact.css ===== */
/* L'email nella finestra dei contatti: il testo e "Copied" stanno nella stessa
   casella, uno sopra l'altro. Le disposizioni della vecchia slide contatti non
   ci sono piu'. */
.email{display:grid;place-items:center;overflow:hidden}
.email>*{grid-area:1/1}

/* ===== css/components/placeholder.css ===== */
/* segnaposto al posto di foto e video: sostituiscili caricando un file dal backend */
.ph{width:100%;background:var(--gray2);background-image:var(--pattern);background-size:var(--size,12px 12px)}
.dots{--pattern:radial-gradient(var(--c) 34%,transparent 38%);--size:10px 10px}
.lines{--pattern:repeating-linear-gradient(45deg,var(--c) 0 2px,transparent 2px 10px)}
/* tinta piatta: nessuna trama, il colore riempie tutto */
.solid{background:var(--c)}
/* una scritta al posto dell'immagine: qui --c e' il colore del testo, non del fondo */
.ph.text{display:flex;align-items:center;justify-content:center;padding:0 16px;
         color:var(--c);font-size:15px;line-height:1.3;text-align:center;word-break:break-word}

/* ===== css/components/list.css ===== */
/* ---------- elenco: titolo — filo — data ----------
   Usato dagli scritti e dai progetti quando si guardano a elenco invece che a nastro. */
.listPage{padding-top:200px}
.list{
  display:flex;flex-direction:column;gap:28px;
  padding:128px;max-width:960px;margin:0 auto;min-height:calc(100vh - 200px);
}
/* La riga entra con una molla che supera l'arrivo e rientra: la stessa sensazione
   delle molle del nastro, scritta una volta in cubic-bezier invece che integrata
   a ogni fotogramma. Per una cosa che parte, arriva e non torna piu', basta. */
.item{
  display:flex;align-items:center;gap:12px;width:calc(100% + 32px);
  position:relative;overflow:visible;padding:12px;margin:-14px;
  font-size:14px;line-height:28px;
  /* il grigio che iOS sbatte sopra ogni tocco coprirebbe il velo qui sotto */
  -webkit-tap-highlight-color:transparent;
  animation:molla .62s cubic-bezier(.34,1.56,.64,1) var(--d,0s) both;
}
@keyframes molla{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}

/* Il box non e' lo sfondo della riga ma uno strato sotto: cosi' si accende senza
   che il testo debba stare a guardare quale colore ha dietro. Il testo gli sta
   sopra perche' i figli sono posizionati, non per una gara di z-index.

   Il velo e' l'accento, non un grigio: lo stesso colore della copia che rotola e
   della freccia, cosi' passaggio, rotolamento e freccia sono la stessa voce e non
   tre. Mescolato in oklab — con un accento acceso lo sRGB vira sporco.

   Premendo si carica: dall'8% al 20%, di colpo, e rientra morbido. Non arriva
   niente di nuovo, si spinge piu' in la' quel che il passaggio ha gia' acceso. */
.item > *{position:relative}
.item::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:color-mix(in oklab, var(--accent) 8%, transparent);
  border-radius:var(--radius);
  opacity:0;transition:opacity 180ms ease-in-out,background 180ms ease-in-out;
}
@media (hover:hover){ .item:hover::before{opacity:1} }
.item:focus-visible::before{opacity:1}
.item:active::before{background:color-mix(in oklab, var(--accent) 20%, transparent);opacity:1;transition-duration:60ms}

/* Niente anello al fuoco — sostituito, non tolto. Chi gira col tasto tab deve
   vedere dov'e' quanto chi ha il mouse, quindi :focus-visible fa esattamente quel
   che fa il passaggio (velo acceso, nome che rotola) e in piu' lascia il filo
   scuro tirato: il rotolamento e' un movimento e finisce, il filo resta. */
.item:focus-visible{outline:none}
.item .leader::before{
  content:"";position:absolute;bottom:-1px;left:0;height:1px;width:0;
  background:var(--gray12);transition:width 220ms cubic-bezier(.22,1,.36,1);
}
.item:focus-visible .leader::before{width:100%}

/* Il nome dentro una finestra alta una riga esatta, con la sua copia appoggiata
   sotto: al passaggio salgono insieme e la copia prende il posto dell'originale.
   `nowrap` e' il vincolo vero di questo disegno — un titolo che andrebbe a capo
   qui viene tagliato, non mandato sotto.
   `display:block` sull'involucro non e' cosmetico: una trasformazione su un
   elemento inline il browser la ignora, e salirebbe solo la copia. */
.item .name{
  position:relative;display:inline-block;overflow:hidden;white-space:nowrap;
  height:28px;line-height:28px;vertical-align:top;
  font-weight:500;color:var(--gray12);
}
.item .name > span{display:block}
.item .name .eco{position:absolute;left:0;top:100%;color:var(--accent)}
.item .name > span{transition:transform 340ms cubic-bezier(.22,1,.36,1)}
@media (hover:hover){ .item:hover .name > span{transform:translateY(-28px)} }
.item:focus-visible .name > span{transform:translateY(-28px)}

/* La data diventa freccia solo dove si va davvero da qualche parte: sulle righe
   che non portano fuori resta la data e basta. Una freccia e' una promessa. */
.item .date{color:var(--gray9)}
.item .date > span{display:block}
a.item .date{position:relative;display:inline-block;overflow:hidden;height:28px;line-height:28px}
a.item .date::after{
  content:"↗";position:absolute;right:0;top:100%;height:28px;line-height:28px;color:var(--accent);
}
a.item .date > span,a.item .date::after{transition:transform 340ms cubic-bezier(.22,1,.36,1)}
@media (hover:hover){
  a.item:hover .date > span,a.item:hover .date::after{transform:translateY(-28px)}
}
a.item:focus-visible .date > span,a.item:focus-visible .date::after{transform:translateY(-28px)}
/* Il filo non si disegna piu': c'e' gia', lungo quanto deve, e si accende.
   Prima correva da sinistra in un secondo, scurendosi a meta' strada — un gesto
   riconoscibile, e proprio per questo di troppo: la riga ha gia' la molla, il
   velo, il nome che rotola e la freccia. Quattro cose che parlano bastano, e il
   filo puo' tornare a essere un righello. Trecento millisecondi di opacita', e
   arriva insieme alla riga invece di inseguirla per altri quattro decimi. */
.item .leader{flex:1;position:relative}
.item .leader::after{
  content:"";position:absolute;bottom:-1px;height:1px;width:100%;
  background:var(--gray5);
  animation:sfuma .3s ease var(--d,0s) both;
}
@keyframes sfuma{from{opacity:0}to{opacity:1}}
/* intestazione di gruppo dentro un elenco: la usano i credits e i progetti */
.list .group{
  font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--gray9);
  margin-top:36px;padding-bottom:6px;border-bottom:1px solid var(--gray5);
  opacity:0;animation:appear .4s ease var(--d,0s) forwards;
}
.list .group:first-child{margin-top:0}
@keyframes appear{to{opacity:1}}
@media (max-width:720px){ .list{padding:24px 24px 128px;margin:0 8px} }
/* chiesto meno movimento: la riga c'e' gia', posata, e il filo e' gia' tirato */
@media (prefers-reduced-motion:reduce){
  .item,.item .name > span,.item .date > span,a.item .date::after{
    animation:none;transition:none;opacity:1;transform:none;
  }
  .item .leader::after{animation:none;opacity:1}
}

/* ===== css/components/sheet.css ===== */
/* ---------- il foglio: uno scritto di Text, Privacy ---------- */
.sheet{max-width:760px;margin:0 auto;padding:180px 24px 140px}
.sheet .kicker{display:flex;justify-content:space-between;font-size:14px;color:var(--gray11)}
.sheet h1{font-size:48px;letter-spacing:-.02em;margin:14px 0 16px;max-width:16ch}
.sheet .lede{font-size:20px;line-height:1.45;color:var(--gray12);max-width:44ch;margin-bottom:40px}
.sheet .body p{font-size:16px;line-height:1.6;color:var(--gray11);max-width:60ch;margin-top:20px}
.sheet .pager{
  margin-top:64px;padding-top:20px;border-top:1px solid var(--gray8);
  display:flex;justify-content:space-between;gap:24px;font-size:14px;color:var(--gray11);
}
.sheet .pager a:hover{color:var(--gray12)}
@media (max-width:720px){ .sheet{padding:140px 20px 100px} .sheet h1{font-size:34px} }
/* la riga Email dei contatti: a destra il segno del copiare, non la freccia —
   non porta da nessuna parte, copia. Copiato, la data diventa "Copied" in accento. */
a.item[data-copia] .date::after{content:"⧉"}
.item[data-copiato] .date > span{color:var(--accent)}
/* i contatti: l'email grande, si copia cliccandola; sotto i link, uno per riga */
.contatti .email{font-size:clamp(24px, 4vw, 40px);letter-spacing:-.02em;color:var(--gray12);cursor:copy;text-align:left}
.contatti .email:hover{color:var(--accent)}
.contatti .email:focus-visible{outline:2px solid var(--gray9);outline-offset:4px;border-radius:var(--radius)}
.contatti .body p{font-size:20px;color:var(--gray12)}

/* ===== css/components/eyebrow.css ===== */
/* ---------- titoletto di blocco ----------
   Piccolo, spaziato, tutto maiuscolo, grigio: apre i blocchi di Now, privacy e
   pagine di testo. Stessa taglia per la data in fondo. */
.sheet h2{font-size:13px;letter-spacing:.08em;text-transform:uppercase;font-weight:500;
  color:var(--gray9);margin:2.6em 0 .8em}
.sheet h2:first-child{margin-top:0}
.sheet .stamp{font-size:13px;margin-top:3em;color:var(--gray9)}

/* ===== css/components/stagger.css ===== */
/* ---------- entrata in fila ----------
   I blocchi non arrivano tutti insieme: ognuno si accende dopo quello prima,
   45ms alla volta — il ritardo lo scrive il PHP su ogni figlio (--d) e si ferma
   al sedicesimo, oltre l'ultimo aspetterebbe piu' di un secondo. Segue il ritmo
   con cui si legge invece di piombare addosso. Basta la classe `stagger` sul
   contenitore. */
.stagger > *{opacity:0;animation:appear .4s ease var(--d,0s) both}
@media (prefers-reduced-motion:reduce){
  .stagger > *{animation:none;opacity:1}
}

/* ===== css/components/void.css ===== */
/* ---------- sezione vuota: una frase sola, a corpo grande, che scorre ---------- */
.void{position:fixed;inset:0;display:grid;align-content:center;overflow:hidden}
.void .run{
  display:flex;width:max-content;white-space:nowrap;
  color:var(--accent);font-size:120px;line-height:1.1;letter-spacing:-.02em;
  animation:run 30s linear infinite;
}
.void .run span{padding-right:.5em}
/* il nastro è due volte lo stesso testo: a metà corsa ricomincia identico */
@keyframes run{to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){ .void .run{animation:none} }
@media (max-width:720px){ .void .run{font-size:64px} }

/* ===== css/components/feed.css ===== */
/* ---------- i segni su un lavoro del feed ----------
   Sulla foto (photo_card, sulla sfera e in griglia): il numero dei pezzi se e'
   un carosello, un triangolo se e' un video, la puntina se e' fissato. Stessa
   pastiglia scura della x e delle frecce del post, cosi' i segni si somigliano.
   Misure in percentuale della foto: la foto cambia misura con lo zoom e col
   passaggio sfera-griglia, i segni con lei. */
.foto .segno,.foto .pin{
  position:absolute;top:5%;display:grid;place-items:center;
  /* Alto e largo dalla stessa misura, la larghezza della foto: in percentuale
     l'altezza si misurava sull'altezza, e su una foto 4:5 il tondo veniva un
     ovale. Con due cifre si allunga in pastiglia. */
  min-width:calc(var(--w, 200px) * .12);height:calc(var(--w, 200px) * .12);padding:0 4%;
  border-radius:99px;background:hsl(30 12% 12% / .55);color:var(--gray2);
  font-size:calc(var(--w, 200px) * .06);line-height:1;font-variant-numeric:tabular-nums;
}
/* Il numero in una scatola sua, tagliata all'altezza delle cifre: cosi' al
   centro sta il numero, non lo spazio che il font tiene sopra per gli accenti.
   Sul testo nudo della griglia il taglio non ha presa, serve un elemento. */
.foto .segno > span{text-box:trim-both cap alphabetic}
.foto .segno{right:5%}
.foto .pin{left:5%;padding:0}
.foto .pin svg{width:50%;height:auto}
/* il triangolo e' ritagliato, non un carattere: cosi' non dipende dal font ne'
   diventa una emoji colorata su qualche sistema */
.foto .segno[data-tipo=video]{padding:0}
.foto .segno[data-tipo=video]::before{
  content:"";width:35%;height:45%;background:currentColor;
  clip-path:polygon(0 0,100% 50%,0 100%);margin-left:6%;
}

/* ---------- il post: solo il lavoro, su fondo scuro ----------
   <dialog>: il fondo scuro, l'Esc che chiude, il fuoco che resta dentro e la
   pagina dietro resa inerte arrivano dal browser. Non c'e' niente da riscrivere.

   Niente carta intorno e niente parole: il foglio del dialog e' trasparente e
   quel che si vede e' l'immagine. La chiusura e le frecce ci galleggiano sopra. */
.post{
  border:0;padding:0;margin:auto;background:transparent;
  width:min(1240px, 94vw);max-width:94vw;max-height:94vh;overflow:visible;
}
.post::backdrop{background:hsl(30 12% 12% / .88)}
.post:focus{outline:none}   /* il fuoco ci arriva aprendo (sphere.js): non e' un comando da segnare */

/* La x sta nell'angolo dello schermo, non del lavoro: fixed, che dentro un
   dialog in top layer si misura sul viewport. Cosi' non finisce mai sopra il
   media, qualunque forma abbia. */
.post .shut{position:fixed;top:16px;right:16px;z-index:2}
.post .shut button{
  /* grid e place-items: il glifo sta in mezzo al cerchio davvero, invece di
     appoggiarsi alla linea di base come farebbe il testo di un bottone */
  display:grid;place-items:center;
  width:36px;height:36px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:hsl(30 12% 12% / .55);color:var(--gray2);
  transition:background 160ms ease;
}
/* una croce disegnata e non il carattere ×: il glifo cade dove dice il font,
   mai al centro esatto del cerchio */
.post .shut svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}
.post .shut button:hover{background:hsl(30 12% 12% / .8)}
.post .shut button:focus-visible{outline:2px solid var(--gray2);outline-offset:2px}

/* La striscia: i lavori in fila, uno per schermata, e lo scatto in mezzo lo fa
   scroll-snap. Nessun javascript per scorrere — dito, rotella e frecce bastano. */
.strip{
  display:flex;overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  scrollbar-width:none;
}
.strip::-webkit-scrollbar{display:none}
.strip:focus-visible{outline:2px solid var(--gray9);outline-offset:4px}
.shot{flex:0 0 100%;scroll-snap-align:center;display:grid;place-items:center}
/* Dentro un carosello i pezzi hanno tutti la forma del post — quella scelta nel
   backend — e non ognuno la sua: se no scorrendo il riquadro balla, e a ballare
   e' il lavoro. La proporzione la scrive media_tag() sul media, di la'. */
.shot img,.shot video{
  display:block;height:88vh;width:auto;max-width:100%;max-height:88vh;
  object-fit:cover;border-radius:0;
}
/* Su schermo stretto il lavoro si legge in larghezza e intero: alto 88vh e
   ritagliato, di un panorama si vedeva una fetta. */
@media (max-width:640px){
  .shot img,.shot video{
    width:100%;height:auto;max-height:88vh;object-fit:contain;
  }
}

/* Le frecce del carosello: ai due lati, a meta' altezza, sopra il lavoro. In
   fondo alla fila la freccia resta, spenta, invece di sparire e far ballare
   quel che le sta accanto. */
.post .frecce .passo{
  position:absolute;top:50%;translate:0 -50%;z-index:2;
  /* il padding e la line-height arrivano da rail.css, dove la freccia sta in
     una riga di testo: dentro un cerchio vanno azzerati o il glifo si sbilancia */
  display:grid;place-items:center;padding:0;line-height:1;
  width:44px;height:44px;border:0;border-radius:50%;cursor:pointer;
  background:hsl(30 12% 12% / .55);color:var(--gray2);font-size:17px;
  transition:color 160ms ease-in-out,transform 200ms cubic-bezier(.2,.7,.2,1);
}
.post .frecce .passo:focus-visible{outline:2px solid var(--gray9);outline-offset:4px}
.post .frecce .passo[data-spento]{opacity:.28;pointer-events:none}
.post .frecce .passo:hover{background:hsl(30 12% 12% / .8);color:var(--gray2)}
.post .frecce [data-verso=indietro]{left:-8px}
.post .frecce [data-verso=avanti]{right:-8px}
/* al passaggio la freccia si sporge di due pixel dalla parte in cui porta: il
   gesto dell'immagine che sta per arrivare. Il traslare verticale c'e' gia',
   quindi il gesto passa da translate */
.post .frecce [data-verso=avanti]:hover{transform:none;translate:2px -50%}
.post .frecce [data-verso=indietro]:hover{transform:none;translate:-2px -50%}
@media (max-width:640px){
  .post .frecce [data-verso=indietro]{left:4px}
  .post .frecce [data-verso=avanti]{right:4px}
}

@media (prefers-reduced-motion:reduce){
  .strip{scroll-behavior:auto}
  .post .shut button,.post .frecce .passo{transition:none}
}

/* ===== css/components/sphere.css ===== */
/* Le cartelle sulla sfera: la home e i side-project (components/sphere.php,
   assets/sphere.js). */
/* solo le pagine con la sfera: niente scroll, la rotella e' lo zoom */
html.sfera,html.sfera body{height:100%;overflow:hidden;background:var(--sheet)}
html.sfera .rail{position:fixed}
/* la rail qui non segna dove sei: e' una ghiera, si trascina */
html.sfera .rail .track{cursor:ew-resize;touch-action:none}
/* il doppio clic sulla rail cambia vista: non deve anche selezionare i trattini */
.rail{user-select:none;-webkit-user-select:none}

.globo{position:fixed;inset:0;touch-action:none;cursor:grab;user-select:none;-webkit-user-select:none}
.globo:active{cursor:grabbing}

/* Ogni cartella e' messa a mano da JS: left/top a zero, poi transform. */
.cart{
  position:absolute;left:0;top:0;width:var(--w,200px);
  display:flex;flex-direction:column;gap:10px;
  color:var(--gray12);text-decoration:none;will-change:transform,opacity;
  -webkit-user-drag:none;
}
/* aspect-ratio esplicito: un SVG in linea dentro una colonna flex, su Safari, si
   stira se l'altezza la deve indovinare */
.cart svg{display:block;width:100%;height:auto;aspect-ratio:200/160;overflow:visible;pointer-events:none}
.cart > span{font-size:clamp(15px, calc(var(--w,200px) * .11), 26px);line-height:1.1}
.cart:focus-visible{outline:none}
.cart:focus-visible span{text-decoration:underline;text-underline-offset:4px}

/* ---------- la cartella, alla maniera del Finder ----------
   Tutti i colori vengono dall'accento del sito: il fondo e l'incisione sono lo
   stesso arancione un po' piu' scuro, la luce dell'incisione un po' piu' chiaro. */
.cart .dietro{fill:color-mix(in oklab, var(--accent), #000 14%)}
.cart .davanti{fill:var(--accent)}
.cart .filo{stroke:color-mix(in oklab, var(--accent), #fff 35%);stroke-width:1.5;fill:none}
.cart .strati{stroke:color-mix(in oklab, var(--accent), #000 12%);stroke-width:1;fill:none}
.cart use.segno{color:color-mix(in oklab, var(--accent), #000 18%)}
.cart .luce{color:color-mix(in oklab, var(--accent), #fff 30%)}
.cart .foglio{fill:var(--sheet);stroke:color-mix(in oklab, var(--gray12), transparent 88%);stroke-width:1}

/* il davanti si piega dal basso: e' cosi' che la cartella "si apre" */
.cart .fronte{transform-box:fill-box;transform-origin:50% 100%;
  transition:transform .35s cubic-bezier(.3,1.5,.5,1)}
.cart:hover .fronte,.cart:focus-visible .fronte,.cart.su .fronte{transform:skewX(-4deg) scaleY(.95)}

/* il foglio dentro: respira piano, esce al passaggio, salta al click.
   --bob e --su sono registrate, se no non si animano. */
@property --bob{syntax:'<length>';inherits:false;initial-value:0px}
@property --su{syntax:'<length>';inherits:false;initial-value:0px}
.cart .foglio{
  translate:0 calc(var(--bob) + var(--su));
  animation:respira 2.6s ease-in-out infinite alternate;
  animation-delay:calc(var(--k, 0) * -.43s);
  transition:--su .35s cubic-bezier(.3,1.5,.5,1);
}
@keyframes respira{from{--bob:0px} to{--bob:-4px}}
.cart:hover .foglio,.cart:focus-visible .foglio,.cart.su .foglio{--su:-12px}

/* ---------- aprire ----------
   il foglio salta fuori, il davanti si piega, le altre si spengono; poi si
   va alla pagina, normalmente. */
.cart[data-scelta] .foglio{--su:-40px;transition-duration:.3s}
.cart[data-scelta] .fronte{transform:skewX(-8deg) scaleY(.8);transition-duration:.3s}

/* le altre cartelle si spengono mentre si va; in elenco no: sono le icone
   delle righe, e cliccandone una sparivano tutte le altre */
html.apre:not(.inFila) .cart:not([data-scelta]){opacity:0;transition:opacity .25s}

@media (prefers-reduced-motion:reduce){ .cart .foglio{animation:none} }

/* ---------- la vista a elenco ----------
   Doppio clic sulla rail: le cartelle lasciano la sfera e si posano, una dopo
   l'altra, sui .posto delle righe — sono loro le icone. I nomi sotto le
   cartelle si spengono, quelli delle righe si accendono in fila. */
/* Centrato nello spazio sotto la rail, non nello schermo intero: in alto ci
   sono rail e nome (fin verso i 90px), e un elenco lungo gli finiva addosso. */
.elenco{position:fixed;inset:128px 0 56px;margin:auto;width:min(520px, calc(100vw - 32px));height:max-content;
  max-height:calc(100vh - 184px);list-style:none;padding:0;z-index:0}
.elenco li{opacity:0;transition:opacity .2s ease}
/* solo opacita', niente scivolata: le cartelle si posano sul .posto misurato
   all'inizio, e una riga ancora in movimento le faceva atterrare storte */
html.inFila .elenco li{opacity:1;transition-delay:calc(.12s + var(--i) * 30ms)}
.elenco .riga{display:grid;grid-template-columns:44px 1fr auto;align-items:center;gap:16px;
  height:60px;padding:0 12px;border-radius:8px;color:var(--gray12);text-decoration:none;font-size:16px}
/* Il filetto fra due righe: una linea dritta che parte dopo l'icona, come nel
   Finder. Era l'ombra della riga, che e' arrotondata: finiva curva ai due capi
   e toccava le cartelle. Sta sul <li>, non sulla riga, cosi' il velo del
   passaggio (arrotondato) non se lo porta dietro. */
.elenco li{position:relative}
.elenco li + li::before{content:"";position:absolute;top:0;left:68px;right:12px;height:1px;
  background:color-mix(in oklab, var(--gray12), transparent 91%)}
.elenco .riga:hover,.elenco .riga:focus-visible{background:color-mix(in oklab, var(--gray12), transparent 95%);outline:none}
.elenco .posto{width:44px;aspect-ratio:200/160}
.elenco .tipo{font-size:13px;color:var(--gray9)}
html.inFila .cart > span{opacity:0 !important;transition:opacity .15s;pointer-events:none}   /* spento, e non deve coprire la riga accanto */
.cart > span{transition:opacity .25s .15s}
/* la sfera sta sopra l'elenco (le cartelle sono le icone); in fila non prende
   i clic, se non sulle cartelle: il resto della riga resta cliccabile sotto */
.globo{z-index:1}
html.inFila .globo{pointer-events:none}
html.inFila .cart{pointer-events:auto}

/* l'elenco delle app dice di piu': che cosa sono, a che punto, quando */
.elenco.app{width:min(760px, calc(100vw - 32px));overflow:auto}
/* niente barra di scorrimento: a dire dove sei nell'elenco e' la rail (sphere.js) */
.elenco{scrollbar-width:none}
.elenco::-webkit-scrollbar{display:none}
.elenco.app .riga{grid-template-columns:44px 1fr 120px 120px 110px;height:50px}
.elenco.app .posto{aspect-ratio:1;width:36px;justify-self:center}
.elenco .stato,.elenco .quando{font-size:13px;color:var(--gray9)}
.elenco .stato[data-s]{display:flex;align-items:center;gap:6px}
.elenco .stato[data-s]::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--gray8)}
.elenco .stato[data-s=stable]::before,.elenco .stato[data-s=online]::before{background:var(--accent)}
.elenco .quando{text-align:right;font-variant-numeric:tabular-nums}
@media (max-width:640px){ .elenco.app .riga{grid-template-columns:44px 1fr auto} .elenco.app .stato,.elenco.app .quando{display:none} }
/* l'estensione: fa parte del nome, stesso colore — come nel Finder */
.ext{font-style:normal}

/* ---------- le app del Training ----------
   Un quadrato arrotondato del colore del suo tipo (APP_TYPES in
   components/sphere.php), una luce in alto e un'ombra sotto, le iniziali:
   un'icona, non una card. Al passaggio si solleva; al clic salta come nel
   Dock e lo strumento si apre in un'altra scheda. */
.cart.app .icona{width:100%;aspect-ratio:1;border-radius:23%;overflow:hidden;
  display:grid;place-items:center;color:var(--ink, var(--sheet));
  background:linear-gradient(180deg, color-mix(in oklab, #fff, transparent 78%), transparent 55%), var(--c);
  box-shadow:inset 0 1px 0 color-mix(in oklab, #fff, transparent 60%),
             0 8px 22px -12px color-mix(in oklab, var(--gray12), transparent 78%);
  transition:translate .3s cubic-bezier(.3,1.5,.5,1), scale .3s cubic-bezier(.3,1.5,.5,1)}
.cart.app .icona b{font-size:calc(var(--w, 120px) * .4);font-weight:600;letter-spacing:-.05em;line-height:1}
.cart.app .icona img{width:100%;height:100%;object-fit:cover}
.cart.app > span{align-self:center;text-align:center;white-space:nowrap}   /* "Blob Tracking" su una riga: l icona e stretta, il nome no */
.cart.app:hover .icona,.cart.app:focus-visible .icona,.cart.app.su .icona{translate:0 -5%;scale:1.05}
.cart.app[data-scelta] .icona{animation:dock .42s cubic-bezier(.3,0,.5,1)}
@keyframes dock{30%{translate:0 -28%} 55%{translate:0 0} 75%{translate:0 -10%} 100%{translate:0 0}}

@media (prefers-reduced-motion:reduce){ .cart.app[data-scelta] .icona{animation:none} }

/* ---------- le foto del Feed ----------
   La copertina in 4:5, spigoli appena tondi, un'ombra morbida: una foto posata,
   non una cartella. Al passaggio si solleva; al clic il post cresce da li'. */
.cart.foto .icona{position:relative;width:100%;aspect-ratio:4/5;border-radius:4px;overflow:hidden;background:var(--sheet);
  box-shadow:0 10px 28px -16px color-mix(in oklab, var(--gray12), transparent 76%);
  transition:translate .3s cubic-bezier(.3,1.5,.5,1), scale .3s cubic-bezier(.3,1.5,.5,1)}
.cart.foto .icona > img,.cart.foto .icona > video,.cart.foto .icona > .ph{display:block;width:100%;height:100%;object-fit:cover;aspect-ratio:auto;
  -webkit-user-drag:none;user-select:none;pointer-events:none}   /* il gesto e' della sfera, non dell'immagine */
.cart.foto > span{align-self:center;text-align:center;white-space:nowrap}
.cart.foto:hover .icona,.cart.foto:focus-visible .icona,.cart.foto.su .icona{translate:0 -4%;scale:1.03}
/* in griglia ed elenco niente sollevarsi: una foto o un'app che cresce urta le
   vicine. Basta un velo: un filo di opacita' in meno. */
html.inFila .cart.foto .icona,html.inFila .cart.app .icona{translate:none !important;scale:none !important;transition:opacity .2s}
html.inFila .cart.foto:hover .icona,html.inFila .cart.foto.su .icona,
html.inFila .cart.app:hover .icona,html.inFila .cart.app.su .icona{opacity:.8}
html.inFila .cart.foto .icona{border-radius:0;box-shadow:none}

/* la griglia del Feed, come su Instagram: tre colonne di celle 4:5 a filo */
.elenco.foto{display:grid;grid-template-columns:repeat(3, 1fr);gap:4px;overflow:visible;
  /* Larga quanto serve perche' tutte le righe stiano nello spazio sotto la rail:
     una griglia che scorre nascondeva le foto rimaste fuori, e al cambio vista
     sembrava che sparissero. Altezza disponibile / righe = una cella; per 4:5 e
     tre colonne, la larghezza viene da li'. */
  width:min(720px, calc(100vw - 32px), calc((100vh - 184px - (var(--righe) - 1) * 4px) / var(--righe) * .8 * 3 + 8px))}
.elenco.foto li + li::before{display:none}
.elenco.foto .riga{display:block;height:auto;padding:0;border-radius:0}
.elenco.foto .riga:hover,.elenco.foto .riga:focus-visible{background:none}
.elenco.foto .posto{display:block;width:100%;aspect-ratio:4/5}

/* ---------- il file .txt dei contatti ----------
   Un foglio bianco con l'orecchio piegato: sulla sfera fra le cartelle, ma
   non porta a una pagina — apre la finestrella qui sotto. */
.cart.file > span{align-self:center}
.cart.file svg{transition:translate .3s cubic-bezier(.3,1.5,.5,1), rotate .3s cubic-bezier(.3,1.5,.5,1)}
.cart.file .pagina{fill:#fff;stroke:var(--gray6);stroke-width:1.5}
.cart.file .orecchio{fill:var(--gray3);stroke:var(--gray6);stroke-width:1.5;stroke-linejoin:round}
.cart.file .righe{stroke:var(--gray6);stroke-width:4;stroke-linecap:round;fill:none}
.cart.file .ext{fill:var(--accent);font:600 15px var(--font);letter-spacing:.06em}
.cart.file:hover svg,.cart.file:focus-visible svg{translate:0 -6px;rotate:-3deg}
.cart.file[data-scelta] svg{animation:salta .3s cubic-bezier(.3,1.5,.5,1)}
@keyframes salta{40%{translate:0 -14px;rotate:4deg;scale:1.06}}

/* la finestrella: una finestra piccola, come quella di un editor di testo */
dialog.nota{
  margin:auto;padding:0;border:0;width:min(380px, calc(100vw - 32px));
  background:var(--sheet);color:var(--gray12);border-radius:12px;overflow:hidden;
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 88%),
             0 24px 64px -28px color-mix(in oklab, var(--gray12), transparent 78%);
}
dialog.nota::backdrop{background:color-mix(in oklab, var(--gray12), transparent 88%)}
.nota .barra{display:flex;align-items:center;gap:8px;height:38px;padding:0 14px;
  border-bottom:1px solid color-mix(in oklab, var(--gray12), transparent 90%)}
.nota .pallino,.nota .chiudi{width:12px;height:12px;border-radius:50%;background:var(--gray6);flex:none}
.nota .chiudi{background:#FF5F57;cursor:pointer}
.nota .chiudi:focus-visible{outline:2px solid var(--gray9);outline-offset:2px}
.nota .titolo{flex:1;text-align:center;font-size:13px;color:var(--gray11);margin-right:52px}
.nota .dentro{padding:22px 24px 26px}
.nota .dentro p{margin-top:10px;font-size:16px}
.nota .dentro p:first-child{margin-top:0}
.nota .email{font-size:22px}

/* ===== css/components/now.css ===== */
/* ---------- la pagina Now ----------
   Tutto lo schermo di un colore (--now-bg, da Settings) e l'inchiostro suo.
   Il testo entra ingrandendo, come faceva il pannello della vecchia home, e i
   blocchi si accendono uno dopo l'altro. La rail e il ritorno prendono
   l'inchiostro del Now: il grigio, sull'arancione, spariva. */
html.nowPage,html.nowPage body{background:var(--now-bg);min-height:100%}
html.nowPage body{color:var(--now-ink)}
html.nowPage .rail .nome,html.nowPage .casa{color:var(--now-ink)}
html.nowPage .casa{opacity:.75}
html.nowPage .casa:hover{opacity:1}
.nowInside{max-width:56ch;margin:0 auto;padding:22vh 24px;transform-origin:50% 30%;
  animation:nowEntra .6s cubic-bezier(.2,.9,.25,1) both}
@keyframes nowEntra{from{transform:scale(.94)}}
.now p{font-size:20px;line-height:1.5;margin-bottom:1em;text-wrap:pretty}
.now h2{font-size:13px;letter-spacing:.08em;text-transform:uppercase;font-weight:500;opacity:.7;margin:2.4em 0 .8em}
.now h2:first-child{margin-top:0}
.now .nowStamp{font-size:13px;margin-top:3em;opacity:.6}
.nowInside > *{opacity:0;animation:appear .4s ease var(--d,0s) both}
/* I link del Now: il rettangolo c'e' gia' a riposo, bianco, e quello che entra
   e' l'inchiostro della pagina. */
.now a.inline{--link-rest:var(--now-hi,#fff);--link-fill:var(--now-ink);--link-ink:var(--now-hi,#fff);color:var(--gray12)}
.now a.inline:hover,.now a.inline:focus-visible{color:var(--link-ink)}
.now a.inline:focus-visible{outline:2px solid var(--now-ink);outline-offset:2px}
@media (max-width:640px){ .now p{font-size:17px} .nowInside{padding:18vh 20px} }
@media (prefers-reduced-motion:reduce){ .nowInside,.nowInside > *{animation:none;opacity:1} }

/* ===== css/components/spotlight.css ===== */
/* ---------- Cmd+K: la ricerca (assets/spotlight.js) ----------
   Un pannello alla maniera di Spotlight: chiaro, un po' trasparente, sfocato
   dietro, in alto e non al centro — si scrive guardando in su. La riga scelta
   prende l'accento del sito. Si apre crescendo appena, si chiude sfumando. */
dialog.spot{
  margin:14vh auto auto;padding:0;border:0;width:min(640px, calc(100vw - 32px));max-height:72vh;
  display:flex;flex-direction:column;overflow:hidden;border-radius:16px;color:var(--gray12);
  background:color-mix(in oklab, var(--sheet), transparent 12%);
  -webkit-backdrop-filter:blur(28px) saturate(1.6);backdrop-filter:blur(28px) saturate(1.6);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 90%),
             0 24px 64px -28px color-mix(in oklab, var(--gray12), transparent 76%);
  animation:spotEntra .22s cubic-bezier(.2,.9,.25,1);
}
dialog.spot:not([open]){display:none}
dialog.spot[data-via]{opacity:0;scale:.98;transition:opacity .14s, scale .14s}
dialog.spot::backdrop{background:color-mix(in oklab, var(--gray12), transparent 92%)}
@keyframes spotEntra{from{opacity:0;scale:.96;translate:0 -6px}}
.spot .cerca{display:flex;align-items:center;gap:12px;padding:16px 18px;
  border-bottom:1px solid color-mix(in oklab, var(--gray12), transparent 91%)}
.spot .cerca svg{width:22px;flex:none;fill:none;stroke:var(--gray9);stroke-width:2;stroke-linecap:round}
.spot input{flex:1;min-width:0;border:0;background:none;outline:none;font:400 22px/1.2 var(--font);color:var(--gray12)}
.spot input::placeholder{color:var(--gray8)}
.spot input::-webkit-search-cancel-button{display:none}
.spot .ris{list-style:none;margin:0;padding:6px;overflow:auto;scrollbar-width:none}
.spot .ris::-webkit-scrollbar{display:none}
.spot .gr{padding:12px 10px 4px;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--gray9);font-weight:500}
.spot [role=option]{display:flex;align-items:center;gap:12px;padding:7px 10px;border-radius:9px;cursor:pointer}
.spot [role=option][aria-selected=true]{background:var(--accent);color:#fff}
.spot [role=option][aria-selected=true] .s,.spot [role=option][aria-selected=true] .va{color:color-mix(in oklab, #fff, transparent 22%)}
.spot .tx{display:flex;flex-direction:column;min-width:0;flex:1}
.spot .t{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spot .s{font-size:12px;color:var(--gray9);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spot mark{background:none;color:inherit;font-weight:600}
.spot .va{display:grid;color:var(--gray9)}
.spot .va svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.spot .vuoto{padding:22px 12px;color:var(--gray9);font-size:14px;text-align:center}
/* le icone: le stesse cose del sito, in piccolo */
.spot .ic{width:32px;height:26px;flex:none;display:grid;place-items:center}
.spot .ic svg{width:100%;height:100%}
.spot .cartella .d{fill:color-mix(in oklab, var(--accent), #000 14%)}
.spot .cartella .f{fill:var(--accent)}
.spot .app{width:26px;height:26px;margin:0 3px;border-radius:23%;background:var(--accent);color:#fff;font-size:11px;font-weight:600;letter-spacing:-.03em}
/* gli attrezzi (Admin, Notes) e il conto: un'icona a tratto in un quadrato chiaro */
.spot .tool{width:26px;height:26px;margin:0 3px;border-radius:7px;background:var(--gray3);color:var(--gray11);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 90%)}
.spot .tool svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
.spot .calc .t{font-size:24px;font-weight:500;letter-spacing:-.01em}
.spot [aria-selected=true] .tool{background:#fff;color:var(--accent)}
/* sulla riga scelta, arancione, l'icona arancione sparirebbe: si rovescia */
.spot [aria-selected=true] .app{background:#fff;color:var(--accent)}
.spot [aria-selected=true] .cartella .d{fill:color-mix(in oklab, #fff, transparent 35%)}
.spot [aria-selected=true] .cartella .f{fill:#fff}
.spot .foto{width:22px;height:27px;margin:0 5px;border-radius:3px;overflow:hidden;background:var(--gray5)}
.spot .foto img{width:100%;height:100%;object-fit:cover}
.spot .doc svg{width:auto;height:26px}
.spot .doc .p{fill:#fff;stroke:var(--gray8);stroke-width:1.2}
.spot .doc .o{fill:var(--gray4);stroke:var(--gray8);stroke-width:1.2;stroke-linejoin:round}
.spot .doc .r{fill:none;stroke:var(--gray8);stroke-width:1.4;stroke-linecap:round}
.spot .aiuto{display:flex;gap:18px;justify-content:flex-end;padding:10px 16px;margin:0;font-size:12px;color:var(--gray9);
  border-top:1px solid color-mix(in oklab, var(--gray12), transparent 91%)}
.spot .aiuto > span{display:flex;align-items:center;gap:6px}
/* la scritta un pixel piu' giu': centrata in scatola cadeva sopra il centro
   dei tasti, perche' il peso delle minuscole sta in basso */
.spot .aiuto i{font-style:normal;translate:0 .5px}
/* i tasti: piccoli, chiari, con l'ombra sotto di un tasto vero */
.spot kbd{display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 5px;margin-right:-2px;
  border-radius:5px;background:var(--sheet);color:var(--gray11);font:500 11px/1 var(--font);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 88%), 0 1px 0 1px color-mix(in oklab, var(--gray12), transparent 92%)}
.spot kbd + kbd{margin-left:3px}
.spot kbd{cursor:pointer;transition:background .15s, color .15s}
.spot kbd:hover{background:var(--gray3);color:var(--gray12)}
/* premuto: scende di un pixel, l'ombra sotto sparisce, poi torna su */
.spot kbd[data-giu]{animation:premuto .22s cubic-bezier(.3,1.4,.5,1)}
@keyframes premuto{35%{translate:0 1px;background:var(--gray4);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 84%), 0 0 0 1px transparent}}
@media (prefers-reduced-motion:reduce){ .spot kbd[data-giu]{animation:none} }
.spot kbd svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
@media (max-width:640px){ .spot .aiuto{display:none} dialog.spot{margin-top:8vh} }

/* Il bottone della ricerca, in basso a destra su ogni pagina. Serve due volte:
   sul telefono, dove Cmd+K non c'e'; e sul computer finche' la pagina non ha il
   fuoco — appena aperta i tasti li riceve la barra degli indirizzi, e una
   pagina non puo' prenderseli da sola. Discreto: si vede appena, come le
   frecce spente della rail. */
/* L'angolo in basso a destra tiene i tastini in fila: la ricerca e, sulle
   sfere, il cambio di vista (sphere.js). Ognuno si mette nell'angolo e la
   fila si allinea da se', qualunque sia la larghezza della scritta. */
.angoloDx{position:fixed;right:24px;bottom:22px;z-index:5;display:flex;gap:6px}
.spotApri{display:flex;align-items:center;gap:6px;
  padding:6px 9px;border-radius:9px;color:var(--gray9);font:500 12px/1 var(--font);cursor:pointer;
  background:color-mix(in oklab, var(--sheet), transparent 25%);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 90%);
  opacity:.7;transition:opacity .15s, color .15s, translate .2s cubic-bezier(.3,1.5,.5,1)}
.spotApri:hover,.spotApri:focus-visible{opacity:1;color:var(--gray12);translate:0 -1px;outline:none}
.spotApri svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round}
/* Il bottone Admin, in basso a sinistra, solo per chi e' entrato: gemello di
   quello della ricerca, con un pallino acceso davanti — "sei dentro". Sopra di
   lui, al clic, il menu: stesso pannello delle tendine del sito. */
.adminQui{position:fixed;left:24px;bottom:22px;z-index:5}
.adminApri{display:flex;align-items:center;gap:7px;padding:6px 10px;border-radius:9px;color:var(--gray11);font:500 12px/1 var(--font);cursor:pointer;
  background:color-mix(in oklab, var(--sheet), transparent 25%);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 90%);transition:color .15s, translate .2s cubic-bezier(.3,1.5,.5,1)}
.adminApri:hover,.adminApri[aria-expanded=true],.adminApri:focus-visible{color:var(--gray12);translate:0 -1px;outline:none}
.adminApri i{width:7px;height:7px;border-radius:50%;background:#2fb35a;box-shadow:0 0 0 3px color-mix(in oklab, #2fb35a, transparent 80%)}
.menuAdmin{position:absolute;left:0;bottom:calc(100% + 8px);min-width:170px;padding:6px;border-radius:12px;
  background:color-mix(in oklab, var(--sheet), transparent 6%);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 90%), 0 18px 48px -20px color-mix(in oklab, var(--gray12), transparent 76%);
  animation:menuSale .18s cubic-bezier(.2,.9,.25,1);transform-origin:0 100%}
.menuAdmin[hidden]{display:none}
@keyframes menuSale{from{opacity:0;scale:.96;translate:0 4px}}
.menuAdmin a{display:flex;align-items:center;gap:10px;padding:7px 9px;border-radius:7px;font-size:13px;color:var(--gray12);text-decoration:none;outline:none}
.menuAdmin a:hover,.menuAdmin a:focus-visible{background:var(--accent);color:#fff}
.menuAdmin svg{width:15px;height:15px;flex:none;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;opacity:.8}
.menuAdmin hr{border:0;height:1px;margin:5px 6px;background:color-mix(in oklab, var(--gray12), transparent 90%)}
html.nowPage .adminApri{color:var(--now-ink);background:color-mix(in oklab, #fff, transparent 70%)}
@media (max-width:640px){ .adminQui{left:12px;bottom:12px} }
@media (prefers-reduced-motion:reduce){ .menuAdmin{animation:none} }
html.nowPage .spotApri{color:var(--now-ink);background:color-mix(in oklab, #fff, transparent 70%)}
@media (max-width:640px){ .angoloDx{right:12px;bottom:12px} }
@media (prefers-reduced-motion:reduce){ dialog.spot{animation:none} }

/* ===== css/components/notes.css ===== */
/* ---------- gli appunti (notes.php) ----------
   Una finestra sola, a tutto schermo sotto la rail: a sinistra l'elenco, come
   in Note del Mac, a destra il foglio, largo quanto si legge bene. La nota
   aperta prende l'accento. */
html.appunti,html.appunti body{height:100%;overflow:hidden}
/* Larga al massimo 1100px, al centro: a tutto schermo, sui monitor grandi, il
   testo restava una colonna stretta in mezzo a due fasce vuote. Cosi' la finestra
   abbraccia il foglio, come una pagina da scrivere (alla scrivi.la). */
.note{position:fixed;inset:88px 24px 64px;   /* sotto, l'aria per il bottone della ricerca */
  width:min(1100px, calc(100vw - 48px));margin:0 auto;display:grid;grid-template-columns:280px 1fr;
  background:var(--sheet);border-radius:14px;overflow:hidden;
  box-shadow:0 0 0 1px color-mix(in oklab, var(--gray12), transparent 90%),
             0 24px 64px -28px color-mix(in oklab, var(--gray12), transparent 80%)}
.elencoNote{display:flex;flex-direction:column;min-height:0;
  border-right:1px solid color-mix(in oklab, var(--gray12), transparent 91%);background:color-mix(in oklab, var(--gray3), transparent 40%)}
.testaNote{display:flex;gap:8px;padding:12px}
.testaNote input{flex:1;min-width:0;height:32px;padding:0 10px;border:0;border-radius:8px;font:14px var(--font);color:var(--gray12);
  background:color-mix(in oklab, var(--gray12), transparent 94%);outline:none}
.testaNote input:focus{box-shadow:0 0 0 2px color-mix(in oklab, var(--accent), transparent 50%)}
.nuova{width:32px;height:32px;flex:none;border-radius:8px;display:grid;place-items:center;color:var(--gray11);cursor:pointer}
.nuova:hover{background:color-mix(in oklab, var(--gray12), transparent 94%);color:var(--gray12)}
.nuova svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}
#lista{list-style:none;margin:0;padding:0 8px 12px;overflow:auto;scrollbar-width:thin}
#lista button{display:flex;flex-direction:column;gap:3px;width:100%;padding:10px 12px;border-radius:9px;text-align:left;cursor:pointer;color:var(--gray12)}
#lista button:hover{background:color-mix(in oklab, var(--gray12), transparent 95%)}
#lista button[aria-current=true]{background:var(--accent);color:#fff}
#lista .t{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#lista .s{font-size:12px;color:var(--gray9);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#lista .s b{font-weight:500;color:var(--gray11);margin-right:4px}
#lista [aria-current=true] .s,#lista [aria-current=true] .s b{color:color-mix(in oklab, #fff, transparent 20%)}
#lista .niente{padding:16px 12px;font-size:13px;color:var(--gray9)}
.foglioNota{position:relative;display:flex;flex-direction:column;min-height:0}
.barraNota{display:flex;align-items:center;gap:14px;height:44px;padding:0 20px;font-size:12px;color:var(--gray9);
  border-bottom:1px solid color-mix(in oklab, var(--gray12), transparent 93%)}
#stato{margin-left:auto}
.via{font-size:12px;color:var(--gray9);padding:4px 8px;border-radius:6px;cursor:pointer}
.via:hover{color:#c62a1d;background:color-mix(in oklab, #c62a1d, transparent 92%)}
#testo{flex:1;width:100%;max-width:66ch;margin:0 auto;padding:36px 40px 64px;border:0;outline:none;resize:none;background:none;
  font:17px/1.6 var(--font);color:var(--gray12)}
#testo::first-line{font-size:26px;font-weight:600;letter-spacing:-.01em}
.vuotaNota{margin:auto;color:var(--gray9);font-size:15px}
.vuotaNota button{color:var(--accent);text-decoration:underline;text-underline-offset:3px;cursor:pointer}
@media (max-width:760px){
  .note{inset:76px 8px 8px;width:auto;grid-template-columns:1fr;grid-template-rows:38% 1fr}
  .elencoNote{border-right:0;border-bottom:1px solid color-mix(in oklab, var(--gray12), transparent 91%)}
  #testo{padding:20px}
}

/* ===== css/components/shut.css ===== */
/* in alto a sinistra, dove stanno i rimandi dentro un progetto */
.fanShut{
  position:fixed;left:28px;top:28px;z-index:1;
  font-size:13px;line-height:18px;color:var(--gray9);cursor:pointer;
}
@media (max-width:720px){ .fanShut{left:12px} }
.fanShut:hover{color:var(--gray12)}

/* Il ritorno alla home (rail.php, home_folder): in alto a sinistra, sulla riga
   della rail. Nelle pagine e' la cartellina grigia col suo "Back"; nei
   side-project solo "← Back". Scorre via con la pagina come la
   rail, tranne dove la pagina non scorre. */
.casa{position:absolute;left:28px;top:28px;z-index:3;
  display:flex;align-items:center;gap:8px;height:var(--menu-riga);   /* la riga della rail: cade alla stessa altezza */
  font-size:13px;line-height:18px;color:var(--gray9);
  transition:color 160ms ease-in-out}
html.sfera .casa{position:fixed;top:26px}      /* la rail-ghiera e' alta 18, non 22 */
/* Alta quanto le maiuscole del testo e appoggiata sulla stessa linea: piu'
   grande sbordava sopra e sotto le lettere e sembrava calata rispetto alla rail,
   anche con i centri allineati al pixel. */
.casa svg{display:block;width:13px;height:auto;aspect-ratio:200/160;opacity:.35;margin-top:-1px;
  transition:opacity 160ms ease-in-out,translate .25s cubic-bezier(.3,1.5,.5,1)}
/* un colore solo, quello delle frecce spente della rail: si vede appena */
.casa path,.casa rect{fill:currentColor}
.casa:hover{color:var(--gray12)}
.casa:hover svg{opacity:.6;translate:0 -2px}
.casa:focus-visible{outline:2px solid var(--gray9);outline-offset:4px;border-radius:4px}
@media (max-width:720px){ .casa{left:12px} }
