@font-face { font-family:'Fira Sans'; font-style:normal; font-weight:400; font-display:swap; src:url(/font?f=fira-sans-400-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:'Fira Sans'; font-style:normal; font-weight:400; font-display:swap; src:url(/font?f=fira-sans-400-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; }
@font-face { font-family:'Fira Sans'; font-style:normal; font-weight:500; font-display:swap; src:url(/font?f=fira-sans-500-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:'Fira Sans'; font-style:normal; font-weight:500; font-display:swap; src:url(/font?f=fira-sans-500-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; }
@font-face { font-family:'Fira Sans'; font-style:normal; font-weight:600; font-display:swap; src:url(/font?f=fira-sans-600-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:'Fira Sans'; font-style:normal; font-weight:600; font-display:swap; src:url(/font?f=fira-sans-600-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; }
@font-face { font-family:'Fira Sans'; font-style:normal; font-weight:700; font-display:swap; src:url(/font?f=fira-sans-700-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:'Fira Sans'; font-style:normal; font-weight:700; font-display:swap; src:url(/font?f=fira-sans-700-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; }
@font-face { font-family:'Fira Sans'; font-style:normal; font-weight:800; font-display:swap; src:url(/font?f=fira-sans-800-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:'Fira Sans'; font-style:normal; font-weight:800; font-display:swap; src:url(/font?f=fira-sans-800-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; }

* { box-sizing:border-box; }
/* la scrollbar occupa sempre il suo spazio: header, briciole e contenuto
   sono centrati con max-width, quindi senza questo si spostano di colpo
   quando il player timelapse allunga la pagina durante il caricamento */
/* l'attributo hidden deve vincere sempre: altrimenti un elemento con
   display:flex resta visibile anche quando lo si nasconde */
[hidden] { display:none !important; }
html { scrollbar-gutter: stable; }
body { margin:0; font-family:"Fira Sans",system-ui,-apple-system,Segoe UI,Roboto,sans-serif; }
/* pulsanti e campi non ereditano il carattere della pagina: senza, resterebbero col
   carattere di sistema in mezzo a Fira Sans */
button, input, select, textarea { font-family:inherit; }
a { text-decoration:none; }
a:hover { opacity:.8; }

/* HEADER: una capsula di vetro sospesa (logo e comandi) e sotto le briciole
   in una pillola. Resta sticky ma e' trasparente: il contenuto scorre sotto e
   si vede fra le due, sfocato dal vetro. pointer-events:none sull'header e
   auto sui suoi pezzi, altrimenti il vuoto trasparente ruberebbe i clic. */
header { position:sticky; top:0; z-index:50; padding:14px 24px 0; pointer-events:none; }
header > .hinner { pointer-events:auto; position:relative; max-width:1452px; margin:0 auto;
         height:70px; padding:0 18px; border-radius:24px;
         display:flex; align-items:center; justify-content:space-between; gap:18px; }
.hleft { flex:1 1 0; min-width:0; display:flex; align-items:center; }
.logo { display:inline-flex; align-items:center; flex-shrink:0; text-decoration:none;
        transition:opacity .15s; }
.logo:hover { opacity:.85; }
.logo-svg { height:34px; width:auto; display:block; overflow:visible; }
.logo-svg text { fill:#f4f6f8; }
.logo-svg path { fill:#34e08a; filter:drop-shadow(0 0 6px rgba(52,224,138,.55)); }
/* le briciole: una pillola di vetro sotto la capsula. Non in home, dove direbbero
   solo «Home» (2026-10-01): li' la mappa sale subito sotto la capsula */
.subbar { pointer-events:none; max-width:1452px; margin:12px auto 0; padding:0 6px;
          display:flex; }
.crumbs { display:inline-flex; align-items:center; flex-wrap:wrap; font-size:13.5px;
          font-weight:600; color:rgba(236,241,246,.5); word-break:break-word; }
header .crumbs { pointer-events:auto; padding:7px 15px; border-radius:999px;
          background:rgba(14,17,22,.55); border:1px solid rgba(255,255,255,.1);
          backdrop-filter:blur(18px) saturate(160%);
          -webkit-backdrop-filter:blur(18px) saturate(160%); }
.crumbs a { color:rgba(236,241,246,.9); }
.crumbs a:hover { color:#34e08a; opacity:1; }
/* .crumbs e' un flex: gli spazi dentro <span> / </span> vengono mangiati,
   quindi la barra va staccata col padding o resta appiccicata ai nomi */
.crumbs span { color:rgba(236,241,246,.42); padding:0 7px; }
.crumb-home { display:inline-flex; align-items:center; gap:7px; }
.crumbs .crumb-home span { color:inherit; padding:0; }
.homeic { width:16px; height:16px; color:#34e08a; display:block; flex-shrink:0; }

/* MAIN */
main { padding:26px 24px 40px; max-width:1500px; margin:0 auto; }

/* BUTTONS */
.btn { display:inline-block; border:0; padding:7px 12px; font-size:13px; cursor:pointer; }

/* SECTION / DAY TITLES */
h2.sec { display:flex; align-items:center; gap:10px; font-size:22px; font-weight:800;
         letter-spacing:-.01em; color:#f4f6f8; margin:34px 0 16px; }
.sec-n { font-size:12.5px; font-weight:800; letter-spacing:0; padding:3px 10px;
         border-radius:12px; color:rgba(236,241,246,.85); background:rgba(255,255,255,.1);
         border:1px solid rgba(255,255,255,.14); font-variant-numeric:tabular-nums; }
h2.day { font-size:15px; font-weight:700; color:#f4f6f8;
         margin:24px 0 12px; padding-bottom:8px;
         border-bottom:1px solid rgba(255,255,255,.08);
         display:flex; align-items:center; gap:10px; }

/* FOLDER CARDS */
.dirs { display:grid; gap:10px;
        grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); }
.dir { display:flex; align-items:center; gap:12px; padding:14px;
       position:relative; cursor:pointer;
       transition:border-color .15s, background .15s; }
.dir .nm b a::after { content:''; position:absolute; inset:0; }
.dir .btn { position:relative; z-index:1; }
.dir .ic { font-size:26px; }
.dir .nm { flex:1; min-width:0; }
.dir .nm b { display:block; word-break:break-word; color:#e8eaed; }
.dir .nm small { color:#555b66; font-size:12px; }
/* verde come «indirizzo esatto»: per chi apre la scheda e' un'informazione
   positiva (lavoro finito), non un avviso */
.ci-concluso { margin-right:4px; font-size:10.5px; font-weight:700; letter-spacing:.05em;
            text-transform:uppercase; padding:2px 9px; border-radius:20px;
            color:#2ad675; background:rgba(42,214,117,.10);
            border:1px solid rgba(42,214,117,.30); white-space:nowrap; }

/* CAMERA CARDS (home): in alto l'ultima foto del cantiere con lo stato in una
   pillola, sotto nome, peso e ora dell'ultimo caricamento, poi i comandi.
   Tutta la card e' il link (a::after sul nome), i pulsanti le stanno sopra. */
.camgrid { display:grid; gap:20px;
           grid-template-columns:repeat(auto-fill,minmax(290px,1fr)); }
.camcard { position:relative; display:flex; flex-direction:column; border-radius:28px;
           padding:10px 10px 16px; cursor:pointer;
           transition:transform .18s ease, border-color .18s, box-shadow .18s; }
.camcard:hover { transform:translateY(-4px); border-color:rgba(52,224,138,.45);
           box-shadow:inset 0 1px 0 rgba(255,255,255,.3),0 0 0 1px rgba(52,224,138,.22),
                      0 30px 60px -22px rgba(34,196,124,.45); }
.cc-cov { position:relative; aspect-ratio:16/9; border-radius:20px; overflow:hidden;
          background:linear-gradient(160deg,#1c222b,#0d1015); }
.cc-cov img { width:100%; height:100%; object-fit:cover; display:block;
              transition:transform .6s ease; }
.camcard:hover .cc-cov img { transform:scale(1.045); }
.cc-cov::after { content:''; position:absolute; inset:0; pointer-events:none;
          background:linear-gradient(180deg,rgba(0,0,0,.28),rgba(0,0,0,0) 36%,
                     rgba(0,0,0,0) 70%,rgba(0,0,0,.3)); }
.cc-vuota { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; }
.cc-vuota .camic { width:34px; height:34px; color:rgba(236,241,246,.35); }
/* stato: pillola di vetro sulla foto */
.cc-st { position:absolute; left:10px; top:10px; z-index:1; display:flex; align-items:center;
         gap:7px; height:28px; padding:0 12px 0 10px; border-radius:14px; font-size:12px;
         font-weight:700; color:#fff; background:rgba(12,14,18,.5);
         border:1px solid rgba(255,255,255,.16);
         backdrop-filter:blur(14px) saturate(160%);
         -webkit-backdrop-filter:blur(14px) saturate(160%); }
.cc-st i { width:8px; height:8px; border-radius:50%; flex-shrink:0; background:#8a92a0; }
.cc-st.ok i { background:#34e08a; box-shadow:0 0 0 3px rgba(52,224,138,.25); }
.cc-st.ko i { background:#ff5a52; box-shadow:0 0 0 3px rgba(255,90,82,.25); }
/* cantiere concluso: la camera e' stata smontata apposta, non e' un guasto.
   Blu, non grigio: il grigio vuol dire gia' «mai caricato». E non l'indigo della
   mappa pubblica, che li' vuol dire «in corso», cioe' il contrario */
.cc-st.done i { background:#5b9dff; box-shadow:0 0 0 3px rgba(91,157,255,.28); }
.cc-vid { position:absolute; right:10px; top:10px; z-index:1; width:28px; height:28px;
          border-radius:50%; display:flex; align-items:center; justify-content:center;
          color:#fff; background:rgba(12,14,18,.5); border:1px solid rgba(255,255,255,.16);
          backdrop-filter:blur(14px); -webkit-backdrop-filter:blur(14px); }
.cc-vid svg { width:11px; height:11px; margin-left:2px; display:block; }
.cc-bd { display:flex; flex-direction:column; flex:1; min-width:0; padding:14px 8px 0; }
.camcard .nm { min-width:0; }
.camcard .nm b { display:block; color:#f4f6f8; font-size:16.5px; font-weight:800;
                 letter-spacing:-.01em; line-height:1.25; white-space:nowrap;
                 overflow:hidden; text-overflow:ellipsis; }
.camcard .nm b a { color:inherit; }
.camcard .nm b a::after { content:''; position:absolute; inset:0; border-radius:28px; }
.cc-mt { display:flex; align-items:center; flex-wrap:wrap; gap:6px 8px; margin-top:5px;
         font-size:13px; font-weight:600; color:rgba(236,241,246,.58);
         font-variant-numeric:tabular-nums; }
.cc-mt .sep { width:3px; height:3px; border-radius:50%; background:rgba(236,241,246,.35); }
.camcard-last { display:inline-flex; align-items:center; gap:5px; }
.camcard-last svg { width:14px; height:14px; flex-shrink:0; }
.camcard-last.stale { color:#ffb35c; }   /* fermo oltre soglia: risalta */
/* concluso: bandierina e data nel blu della pillola «Concluso» (Antonio, 2026-10-20: «dato
   che è ultimato») */
.camcard-last.fine { color:#5b9dff; }
.cam-btns { position:relative; z-index:1; display:flex; align-items:center; gap:8px;
            margin-top:auto; padding-top:16px; }
.cam-btns:empty { display:none; }
.cam-btns .tl-ctl { display:inline-flex; align-items:center; gap:8px; }
/* tutti i pulsanti della card alla stessa altezza */
.cam-btns .btn { height:36px; box-sizing:border-box; display:inline-flex; align-items:center;
                 justify-content:center; gap:7px; padding:0 15px; font-size:13px; }
/* 3 classi: .btn.sm (piu' avanti nel CSS) rimetteva il padding e schiacciava l'icona */
.cam-btns .btn.tl-btn { width:36px; padding:0; }
.cam-btns .btn.tl-btn.tl-lbl { width:auto; padding:0 15px; }
.cam-btns .tlic { width:15px; height:15px; display:block; flex-shrink:0; }
.cam-btns .tl-mini { display:inline-block; width:12px; height:12px; flex-shrink:0;
            border:2px solid rgba(255,255,255,.3); border-top-color:#34e08a;
            border-radius:50%; animation:spin .8s linear infinite; }
.cam-btns .btn.camdel { margin-left:auto; width:36px; padding:0; }

/* PHOTO GRID */
.grid { display:grid; gap:8px;
        grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); }
.cell { overflow:hidden; transition:border-color .15s; }
.cell .ph { width:100%; aspect-ratio:16/9; object-fit:cover; display:block;
            background:#1e2228; cursor:zoom-in; }
.cell .cap { display:flex; justify-content:space-between; align-items:center;
             gap:6px; padding:5px 8px; font-size:12px; color:#555b66; }
.empty { color:#555b66; text-align:center; padding:36px 0; }

/* LIGHTBOX */
#lb { position:fixed; inset:0; background:rgba(0,0,0,.96); z-index:100;
      display:none; flex-direction:column; }
#lb.on { display:flex; }
#lb .bar { display:flex; justify-content:space-between; align-items:center;
           gap:10px; padding:10px 16px; color:#e8eaed; font-size:14px; }
#lb .stage { flex:1; display:flex; align-items:center; justify-content:center;
             overflow:hidden; position:relative; }
#lb img { max-width:100%; max-height:100%; object-fit:contain; }
#lb .nav { position:absolute; top:50%; transform:translateY(-50%);
           background:rgba(255,255,255,.08); color:#e8eaed; border:0;
           cursor:pointer; font-size:30px; padding:12px 18px;
           transition:background .15s; }
#lb .nav:hover { background:rgba(42,214,117,.25); color:#2ad675; }
#lb #prev { left:14px; }
#lb #next { right:14px; }
#lb .dl, #lb .x,
#vlb .dl, #vlb .x { background:rgba(255,255,255,.08); color:#e8eaed; border:0;
           padding:7px 12px; font-size:14px; cursor:pointer;
           display:inline-flex; align-items:center; gap:7px; text-decoration:none;
           transition:background .15s, color .15s; }
/* le icone della barra (al posto di ⬇ 🗑 ✕, dal 2026-10-01: niente emoji) */
.lbic { width:15px; height:15px; flex:none; display:block; }
#lb .dl:hover, #lb .x:hover,
#vlb .dl:hover, #vlb .x:hover { background:rgba(42,214,117,.2); color:#2ad675; }

/* TIMELAPSE PLAYER */
#tlwrap { display:flex; gap:24px; align-items:center; margin-bottom:24px; }
/* flex:0 1 (cedevole) e non 0 0: su schermi stretti il player restava rigido a
   720px e schiacciava la colonna info a ~200px, facendo sforare l'indirizzo e il
   suo badge fuori dallo schermo. Ora cede lui. */
#tlp { position:relative; overflow:hidden; flex:0 1 auto;
       width:min(720px,100%); min-width:0; }
#tlloading { position:absolute; inset:0; display:flex; flex-direction:column;
             align-items:center; justify-content:center; background:#1e2228;
             color:#555b66; font-size:13px; gap:10px; pointer-events:none;
             z-index:2; }
#tlloading .tl-spinner { width:28px; height:28px; border:3px solid #2a2d35;
             border-top-color:#2ad675; border-radius:50%;
             animation:spin .8s linear infinite; }
@keyframes spin { to { transform:rotate(360deg); } }
#tlloading.done { display:none; }
#tlimg { width:100%; aspect-ratio:16/9; object-fit:cover; display:block; }
/* cantieri di soli video: stesso riquadro del player, ma con un fotogramma
   fermo invece dell'animazione */
.tlposter { width:100%; aspect-ratio:16/9; object-fit:cover; display:block; }
.tlposter-tag { position:absolute; left:10px; bottom:10px; z-index:2;
                font-size:11px; font-weight:700; letter-spacing:.03em;
                color:#e8eaed; background:rgba(14,16,20,.62);
                padding:3px 9px; border-radius:20px; }
#tlinfo { flex:1 1 260px; min-width:0; }
#tlbar { display:flex; align-items:center; gap:10px; padding:8px 12px;
         color:#e8eaed; font-size:13px; }
#tlplay { border:0; font-size:17px; cursor:pointer; line-height:1.4;
          font-weight:700; transition:opacity .15s; }
#tlplay:hover { opacity:.8; }
#tlcnt { min-width:60px; color:#555b66; }
#tlspeed { display:flex; gap:4px; }
.tlfps { background:transparent; border:1px solid #2a2d35; padding:2px 8px;
         font-size:12px; cursor:pointer; transition:border-color .15s, color .15s; }
.tlfps:hover { border-color:#2ad675; color:#2ad675; }
.tlfps[data-sel] { font-weight:700; }
#tlspeedlbl { color:#555b66; font-size:12px; }

/* VIDEO CARDS */
.vcells { display:grid; gap:8px;
          grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); }
.vcell { overflow:hidden; transition:border-color .15s; }
.vthumb { width:100%; aspect-ratio:16/9; background:#0e1014;
         position:relative; overflow:hidden; display:flex;
          align-items:center; justify-content:center; font-size:38px;
          cursor:pointer; color:#2ad675; transition:color .15s; }
.vthumb:hover .vplay { color:#1fb85e; }
/* il triangolo sta sopra il fotogramma: serve un disco scuro dietro,
   altrimenti su un frame chiaro sparisce */
.vposter { position:absolute; inset:0; width:100%; height:100%;
           object-fit:cover; display:block; }
.vplay { position:relative; z-index:1; display:flex; align-items:center; justify-content:center;
         width:46px; height:46px; border-radius:50%; color:#e8eaed;
         background:rgba(14,16,20,.55); backdrop-filter:blur(2px);
         text-indent:3px; transition:color .15s, background .15s; }
.vcell .cap { display:flex; justify-content:space-between; align-items:center;
              gap:6px; padding:5px 8px; font-size:12px; color:#555b66; }
.vcell .cap .vname { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }

/* VIDEO LIGHTBOX */
#vlb { position:fixed; inset:0; background:rgba(0,0,0,.96); z-index:100;
       display:none; flex-direction:column; }
#vlb.on { display:flex; }
#vlb .bar { display:flex; justify-content:space-between; align-items:center;
            gap:10px; padding:10px 16px; color:#e8eaed; font-size:14px; }
#vlb .stage { flex:1; display:flex; align-items:center; justify-content:center;
              overflow:hidden; padding:12px; }
#vlb video { max-width:100%; max-height:100%; outline:none; border-radius:6px; }

/* DANGER BUTTON (delete) */
.btn.danger:hover { border-color:#c0392b; }

/* CAMPI DELLA SCHEDA E DELLE IMPOSTAZIONI */
/* «Demo attiva» nelle Impostazioni: l'interruttore staccato dal resto */
.ci-toggle { margin:2px 0 14px; padding-bottom:14px; border-bottom:1px solid #22262e; }
.ci-toggle .ci-vidnote { margin:7px 0 0; }
.ci-input { padding:7px 10px; font-size:14px; width:100%; }
.ci-input:focus { outline:none; }
/* la videocamera delle uscite (ICON_RIPRESE, al posto dell'emoji) */
.ripic { width:15px; height:15px; vertical-align:-3px; margin-right:6px; flex:none; }
.pdfic { width:14px; height:14px; vertical-align:-2px; margin-right:6px; }
.ci-vidnote { font-size:12px; color:#8a92a0; margin-top:8px; line-height:1.55; }
.ci-vidnote strong { color:#e8eaed; }
/* le uscite fatte, una data per riga, nel riquadro «Modifica cantiere» */
.ci-uscita-row { display:flex; align-items:center; gap:8px; margin-bottom:8px; }
.ci-uscita-row .ci-input { flex:1; }
.ci-uscita-del { display:inline-flex; align-items:center; justify-content:center; flex:none;
                 width:30px; height:30px; padding:0; border:0; border-radius:50%;
                 background:none; color:#6b7380; cursor:pointer; }
.ci-uscita-del svg { width:15px; height:15px; }
.ci-uscita-del:hover { color:#ff6d64; background:rgba(255,90,82,.10); }
.ci-checkline { display:flex; align-items:center; gap:9px; color:#e8eaed;
                font-size:14px; margin-bottom:12px; cursor:pointer; user-select:none; }
.ci-checkline input[type=checkbox] { appearance:none; -webkit-appearance:none;
                width:20px; height:20px; flex-shrink:0; margin:0; cursor:pointer;
                border:1px solid var(--glass-bd); border-radius:6px;
                background:rgba(255,255,255,.04); position:relative;
                transition:background .15s, border-color .15s; }
.ci-checkline input[type=checkbox]:hover { border-color:var(--glass-bd-hi); }
.ci-checkline input[type=checkbox]:checked { background:linear-gradient(135deg,#2ad675,#22c78f);
                border-color:transparent; box-shadow:0 2px 8px rgba(42,214,117,.35); }
.ci-checkline input[type=checkbox]:checked::after { content:''; position:absolute;
                left:6.5px; top:2.5px; width:4px; height:9px; border:solid #05130b;
                border-width:0 2.5px 2.5px 0; transform:rotate(45deg); }
.ci-checkline input[type=checkbox]:focus-visible { outline:2px solid #2ad675; outline-offset:2px; }

/* COMANDI DELL'HEADER */
/* logo e pulsanti prendono la stessa larghezza (flex 1 1 0 tutti e due): cosi'
   la pillola del disco sta al centro della capsula. Niente min-width:0 qui: se
   lo spazio manca, i pulsanti non si stringono sotto la pillola, e' lei a spostarsi */
.hactions { display:flex; align-items:center; gap:10px; flex:1 1 0;
            justify-content:flex-end; }

/* HEADER DISK WIDGET: anello + GB usati, in una pillola al centro della capsula */
.hdisk { display:flex; align-items:center; gap:10px; flex-shrink:0; height:44px;
         padding:0 18px 0 8px; border-radius:22px;
         background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.12);
         box-shadow:inset 0 1px 0 rgba(255,255,255,.18); }
.hring { width:30px; height:30px; flex-shrink:0; display:block; }
.hring circle { fill:none; stroke-width:3.2; }
.hring .t { stroke:rgba(255,255,255,.14); }
.hring .v { stroke:#34e08a; stroke-linecap:round; }
.hring .v.warn   { stroke:#ffb35c; }
.hring .v.danger { stroke:#ff5a52; }
.hdisk b { font-size:13.5px; font-weight:700; color:#f4f6f8; white-space:nowrap; }
.hdisk span { font-size:13px; font-weight:600; color:rgba(236,241,246,.6); white-space:nowrap; }
/* su telefono la capsula non ha posto per la pillola (logo e quattro pulsanti la
   riempiono): lo spazio disco sta in cima alle Impostazioni, e solo li' si vede */
.disco-tel { display:none; }
/* PULSANTI HEADER: tondi, di vetro */
.hbtn { width:44px; height:44px; flex-shrink:0; border-radius:50%; padding:0;
        background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.12);
        box-shadow:inset 0 1px 0 rgba(255,255,255,.2); color:rgba(236,241,246,.82);
        cursor:pointer; display:flex; align-items:center; justify-content:center;
        text-decoration:none; line-height:1; font-family:inherit;
        transition:background .15s, border-color .15s, color .15s, opacity .15s; }
.hbtn:hover { background:rgba(255,255,255,.14); border-color:rgba(255,255,255,.22); opacity:1; }
.hbtn svg { width:19px; height:19px; display:block; flex:none; }
.addcam { color:#34e08a; }
.gear:hover { color:#34e08a; }
.logout:hover { color:#ff6d64; }
/* cestino nell'header: a riposo e' solo l'icona rossa, cosi' si legge subito
   cos'e'; al passaggio del mouse il bottone si allarga e mostra i dati che
   prima stavano nella card in fondo alla home. Sta PRIMA dell'ingranaggio,
   quindi allargandosi spinge a sinistra il "+" e lascia fermi gli altri. */
.htrash { color:#ff6d64; width:auto; min-width:44px; padding:0 12px; border-radius:22px; }
.htrash:hover, .htrash:focus-visible {
        background:rgba(255,90,82,.14); border-color:rgba(255,90,82,.4); color:#ff8078; opacity:1; }
.htrash-info { max-width:0; margin-left:0; opacity:0; overflow:hidden;
        white-space:nowrap; font-size:12px; font-weight:600; color:#ffc4be;
        font-variant-numeric:tabular-nums;
        transition:max-width .28s ease, opacity .18s ease, margin-left .28s ease; }
.htrash:hover .htrash-info, .htrash:focus-visible .htrash-info {
        max-width:320px; margin-left:8px; opacity:1; }
.htrash.vuoto { color:rgba(255,109,100,.45); }
/* sotto i 1200px il bottone allargato ruberebbe spazio alla pillola del disco,
   che dal centro si sposterebbe: li' i dati restano nel tooltip (title), che
   c'e' sempre. Sotto i 900px la pillola tiene solo anello e percentuale, se no
   logo, disco e quattro pulsanti non ci starebbero (i GB restano nel tooltip). */
@media (max-width:1200px) {
  .htrash:hover .htrash-info, .htrash:focus-visible .htrash-info {
        max-width:0; margin-left:0; opacity:0; }
}
@media (max-width:900px) {
  .hdisk b { display:none; }
  .hdisk { padding-right:14px; }
}
@media (prefers-reduced-motion:reduce) { .htrash-info { transition:none; } }

/* ELIMINA CANTIERE (card home) */
.btn.camdel { padding:5px 8px; display:inline-flex; align-items:center; }
.trashic { width:15px; height:15px; display:block; }

/* UPLOAD ZIP (cartelle anno) */
.zipup { display:flex; align-items:center; gap:12px; flex-wrap:wrap;
         margin-bottom:20px; }
.zipmsg { font-size:13px; color:#b0b8c4; font-weight:600; }
.zipup .btn { display:inline-flex; align-items:center; gap:7px; }
.upic { width:14px; height:14px; }
.zipbar-wrap { flex-basis:100%; border:1px solid #2a2d35; height:14px; overflow:hidden; }
.zipbar { height:100%; width:0; transition:width .2s; }
.zipbar.indet { width:100%;
                background:linear-gradient(90deg,#163a25,#2ad675,#163a25);
                background-size:200% 100%; animation:zipind 1.1s linear infinite; }
@keyframes zipind { from { background-position:200% 0; }
                    to { background-position:-200% 0; } }

/* MAPPA DEI CANTIERI (in cima alla home) */
/* isolation: Leaflet mette i suoi comandi a z-index 1000 e, senza un contesto
   proprio, scorrendo finirebbero SOPRA l'header */
.mapwrap { position:relative; border-radius:30px; overflow:hidden; isolation:isolate;
           border:1px solid rgba(255,255,255,.12); background:#15181d;
           box-shadow:0 34px 80px -30px rgba(0,0,0,.9); }
/* luce sul bordo e angoli in ombra: sopra le tile, sotto i segnaposto */
.mapwrap::after { content:''; position:absolute; inset:0; border-radius:inherit; z-index:450;
           pointer-events:none;
           box-shadow:inset 0 1px 0 rgba(255,255,255,.22), inset 0 0 90px rgba(0,0,0,.5); }
/* la mappa e' il primo blocco della home: il titolo non ha bisogno del margine
   che separa una sezione dall'altra, basta il padding di main */
main > h2.sec:first-child { margin-top:0; }
.mapwrap + h2.sec { margin-top:38px; }
/* l'altezza arriva da Impostazioni > Mappa come variabile CSS: uno style
   inline scavalcherebbe la regola mobile qui sotto */
#tlmap { height:var(--map-h,420px); width:100%; background:#15181d; }
.map-attr { position:absolute; right:16px; bottom:14px; z-index:500;
            color:rgba(236,241,246,.72); font-size:10.5px; font-weight:600;
            padding:4px 10px; border-radius:10px; background:rgba(10,12,16,.5);
            backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px); pointer-events:none; }
/* zoom: una pillola di vetro (i CSS di Leaflet arrivano prima di questi) */
.mapwrap .leaflet-control-zoom { margin:18px 0 0 18px; border:1px solid rgba(255,255,255,.14) !important;
            border-radius:22px; overflow:hidden; box-shadow:0 12px 30px -10px rgba(0,0,0,.7);
            background:rgba(14,17,22,.55); backdrop-filter:blur(18px) saturate(160%);
            -webkit-backdrop-filter:blur(18px) saturate(160%); }
.mapwrap .leaflet-bar a { width:44px; height:42px; line-height:42px; background:transparent;
            color:#f4f6f8; border-bottom:1px solid rgba(255,255,255,.14);
            font:500 21px/42px system-ui,-apple-system,sans-serif; }
.mapwrap .leaflet-bar a:last-child { border-bottom:0; }
.mapwrap .leaflet-bar a:hover { background:rgba(255,255,255,.12); color:#fff; }
.mapwrap .leaflet-bar a.leaflet-disabled { background:transparent; color:rgba(236,241,246,.3); }
/* segnaposto: l'ultima foto in una cornice bianca con la punta, il numero dei
   file in una pillola verde. La punta tocca il punto esatto (iconAnchor in
   basso al centro, in MAP_JS) */
.mp { position:relative; width:62px; height:70px; cursor:pointer; transform-origin:50% 100%;
      transition:transform .12s; }
.mp-ph { width:62px; height:62px; border-radius:19px; overflow:hidden; border:3px solid #fff;
         box-shadow:0 12px 26px -6px rgba(0,0,0,.8); background:#222730; }
.mp-ph img { width:100%; height:100%; object-fit:cover; display:block; }
.mp::after, .mp-stack::after { content:''; position:absolute; left:50%; bottom:0;
         transform:translateX(-50%); border:8px solid transparent;
         border-top-color:#fff; border-bottom:0; }
.mp-vuota { display:block; width:100%; height:100%;
            background:linear-gradient(160deg,#3a4049,#222730); }
.mp-n { position:absolute; top:-9px; right:-12px; min-width:24px; height:24px; padding:0 8px;
        border-radius:12px; background:linear-gradient(180deg,#5ee9a6,#22c47c); color:#03140b;
        font-size:11.5px; font-weight:800; line-height:20px; text-align:center;
        border:2px solid #fff; box-shadow:0 4px 10px rgba(0,0,0,.4);
        font-variant-numeric:tabular-nums; }
.mp-nome { position:absolute; top:80px; left:50%; transform:translateX(-50%); white-space:nowrap;
           font-size:12px; font-weight:700; color:#fff; padding:5px 11px; border-radius:12px;
           background:rgba(14,17,22,.62); border:1px solid rgba(255,255,255,.14);
           backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); pointer-events:none; }
/* Leaflet posiziona le icone con un transform inline: lo zoom al passaggio va
   sul contenuto, altrimenti non avrebbe effetto */
.leaflet-marker-icon:hover { z-index:9999 !important; }
.leaflet-marker-icon:hover .mp, .leaflet-marker-icon:hover .mp-stack { transform:scale(1.07); }
/* grappolo: le foto dei cantieri vicini una sull'altra, col numero */
.mp-cluster { background:transparent; }
.mp-stack { position:relative; width:62px; height:70px; cursor:pointer;
            transform-origin:50% 100%; transition:transform .12s; }
.mp-sk { position:absolute; left:0; top:0; width:62px; height:62px; border-radius:19px;
         overflow:hidden; border:3px solid #fff; background:#2a2f38;
         box-shadow:0 10px 22px -6px rgba(0,0,0,.75); }
.mp-sk img { width:100%; height:100%; object-fit:cover; display:block; }
.mp-sk.s1 { transform:rotate(-10deg) translate(-9px,3px); }
.mp-sk.s2 { transform:rotate(9deg) translate(9px,2px); }
.mp-sk.s1 img, .mp-sk.s2 img { filter:brightness(.78); }
.mp-sn { position:absolute; top:-9px; right:-12px; z-index:1; min-width:24px; height:24px;
          padding:0 8px; border-radius:12px; box-sizing:border-box;
          /* lo stile dell'etichetta col nome (.mp-nome), scelta di Antonio del
             2026-10-01: vetro scuro, numero bianco, filo chiaro sul bordo. Cosi' quanti
             cantieri ci sono non si confonde col numero verde delle foto, e come
             l'etichetta non cambia col colore del cliente. Prima e' stato il negativo
             del numero delle foto (fondo nero e numero verde): non gli piaceva */
          background:rgba(14,17,22,.62); color:#fff; border:1px solid rgba(255,255,255,.14);
          backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px);
          font-size:12px; font-weight:700; line-height:22px; text-align:center;
          font-variant-numeric:tabular-nums; }
.leaflet-container { font:inherit; background:#15181d; }
/* filtri sul livello di base (MAPPA_STILI[...]["filtro"]): OpenStreetMap coi suoi
   colori ma al buio, e il satellite appena scurito per stare col vetro */
.tl-notte { filter:invert(1) hue-rotate(180deg) brightness(.92) contrast(.88) saturate(.95); }
.tl-scurito { filter:brightness(.8) saturate(1.05); }
.tl-grigio { filter:grayscale(1) contrast(1.06) brightness(1.03); }
/* nessun cantiere con una posizione: l'avviso al centro della mappa (MAP_JS) */
.mp-nessuno { position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:500;
              max-width:calc(100% - 40px); text-align:center; pointer-events:none;
              padding:10px 18px; border-radius:18px; font-size:13.5px; font-weight:600;
              color:#f4f6f8; background:rgba(14,17,22,.66); border:1px solid rgba(255,255,255,.14);
              -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px); }
/* «Riposiziona»: una pillola di vetro in basso a sinistra (MAP_JS) */
.mapwrap .leaflet-bottom.leaflet-left { margin:0 0 14px 16px; }
.mp-torna { display:inline-flex; align-items:center; gap:7px; height:38px; padding:0 15px 0 12px;
            margin:0 !important; border-radius:19px; cursor:pointer; color:#f4f6f8;
            font:700 13px system-ui,-apple-system,sans-serif;
            background:rgba(14,17,22,.62); border:1px solid rgba(255,255,255,.14);
            backdrop-filter:blur(18px) saturate(160%); -webkit-backdrop-filter:blur(18px) saturate(160%);
            box-shadow:0 12px 30px -10px rgba(0,0,0,.7); }
.mp-torna:hover { background:rgba(30,36,44,.72); }
.mp-torna svg { width:16px; height:16px; fill:none; stroke:#34e08a; stroke-width:2;
                stroke-linecap:round; display:block; }
/* i cantieri fuori dal riquadro (MAP_JS, dal 2026-10-01): un pallino sul bordo con la
   freccia verso dove sono, come sulla mappa pubblica. Vicini sul bordo diventano uno
   solo, col numero; il pallino resta dritto e gira solo la freccia */
.mp-bordi { position:absolute; inset:0; z-index:650; pointer-events:none; overflow:hidden; }
.mp-bordo { position:absolute; width:0; height:0; padding:0; margin:0; border:0;
            background:none; pointer-events:auto; cursor:pointer; }
.mp-bordo i { position:absolute; left:0; top:0; transform:translate(-50%,-50%);
              min-width:16px; height:16px; padding:0 4px; box-sizing:border-box;
              display:flex; align-items:center; justify-content:center;
              border-radius:999px; border:2px solid #fff; font-style:normal;
              background:linear-gradient(180deg,#5ee9a6,#22c47c); color:#03140b;
              font:800 10px/1 system-ui, -apple-system, sans-serif;
              box-shadow:0 1px 6px rgba(0,0,0,.55); transition:transform .12s; }
.mp-bordo i:not(:empty) { min-width:20px; height:20px; }
.mp-bordo b { position:absolute; width:0; height:0; border-left:7px solid #22c47c;
              border-top:5px solid transparent; border-bottom:5px solid transparent;
              filter:drop-shadow(0 1px 1px rgba(0,0,0,.45)); }
.mp-bordo:hover i, .mp-bordo:focus-visible i { transform:translate(-50%,-50%) scale(1.18); }
.mp-bordo:focus-visible { outline:none; }

/* ESITO GEOCODIFICA (scheda cantiere + tab Mappa) */
.ci-geo { font-size:11px; font-weight:700; letter-spacing:.02em; padding:1px 7px;
          border-radius:20px; white-space:nowrap; }
/* il punto interrogativo solo dove c'e' un tooltip: sul verde non c'e' niente da dire */
.ci-geo.vaga, .ci-geo.ko { cursor:help; }
.ci-geo.ok { color:#2ad675; background:rgba(42,214,117,.10);
             border:1px solid rgba(42,214,117,.30); }
.ci-geo.vaga { color:#e0a03a; background:rgba(224,160,58,.10);
               border:1px solid rgba(224,160,58,.30); }
.ci-geo.ko { color:#e0554f; background:rgba(224,85,79,.10);
             border:1px solid rgba(224,85,79,.30); }
.geo-ric { color:#7d8492; font-size:12px; }
/* Aspetto della mappa: i campi e «Salva» nella stessa riga; sotto, se spuntata, la
   riga della mappa dei timelapse terminati, coi campi in colonna con quelli sopra.
   Su telefono una colonna, e «Salva» in fondo (dal 2026-10-01, Antonio) */
.aspetto-griglia { display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)) auto;
                   gap:14px; align-items:end; margin-top:14px; }
.aspetto-griglia .aspetto-tutta { grid-column:1 / -1; margin:2px 0 0; }
.geo-none { color:#5b616c; }

/* TAB MAPPA (impostazioni) */
.geo-riepilogo { color:#b0b8c4; font-size:13.5px; margin-bottom:14px; }
.geo-riepilogo strong { color:#e8eaed; }
.geo-tabwrap { overflow-x:auto; margin-bottom:16px; }
.geo-tab { width:100%; border-collapse:collapse; font-size:13px; }
.geo-tab th { text-align:left; font-size:11px; text-transform:uppercase;
              letter-spacing:.07em; color:#6b727e; font-weight:700;
              padding:0 12px 8px 0; border-bottom:1px solid #2a2d35; }
.geo-tab td { padding:9px 12px 9px 0; border-bottom:1px solid #22262e;
              color:#c8ced8; vertical-align:middle; }
.geo-tab tr:last-child td { border-bottom:0; }
.geo-coord { color:#6b727e; font-variant-numeric:tabular-nums; white-space:nowrap; }
/* ANTEPRIMA DELLA MAPPA NEL SITO (lo script, di Lynx e dei clienti): si vede il
   riquadro come sul sito, non a tutto schermo */
.ant-wrap { margin:0 auto; padding-bottom:24px; }   /* dentro <main>, che ha gia' i suoi margini */
.ant-barra { display:flex; align-items:center; gap:18px; flex-wrap:wrap; margin:18px 0 16px; }
.ant-gruppo { display:flex; align-items:center; gap:8px; }
.ant-lbl { font-size:11px; text-transform:uppercase; letter-spacing:.07em; color:#6b727e;
           font-weight:700; }
.ant-w, .ant-s { height:30px; box-sizing:border-box; padding:0 13px; border-radius:20px;
           border:1px solid #2a2d35; background:rgba(255,255,255,.03); color:#b0b8c4;
           font-size:12.5px; font-weight:600; cursor:pointer;
           transition:border-color .15s, background .15s, color .15s; }
.ant-w:hover, .ant-s:hover { border-color:#3a3f48; color:#e8eaed; }
.ant-w.on, .ant-s.on { border-color:rgba(42,214,117,.55); background:rgba(42,214,117,.10);
           color:#e8eaed; }
.ant-misura { font-size:12px; color:#6b727e; font-variant-numeric:tabular-nums; }
/* la finta pagina del sito attorno al riquadro */
.ant-pagina { border-radius:16px; padding:28px; background:#0f1217;
              border:1px solid #22262e; transition:background .2s; }
.ant-pagina.chiara { background:#f2f4f7; border-color:#dfe3e9; }
.ant-pagina .ant-finto { height:12px; border-radius:6px; background:rgba(255,255,255,.06);
              margin:0 auto 20px; max-width:340px; }
.ant-pagina.chiara .ant-finto { background:rgba(0,0,0,.07); }
.ant-pagina .ant-finto.corto { max-width:190px; margin-top:20px; margin-bottom:0; }
#ant-box { margin:0 auto; transition:max-width .2s; }
.ant-nota { color:#8a92a0; font-size:12.5px; line-height:1.6; margin-top:16px; }
.ant-nota strong { color:#e8eaed; }
.ant-codbox { margin-top:12px; background:#14171d; border:1px solid #22262e;
           border-radius:10px; padding:12px; }
.ant-codtop { display:flex; align-items:center; justify-content:space-between; gap:12px;
           margin-bottom:8px; }
.ant-codtop span { font-size:11px; text-transform:uppercase; letter-spacing:.07em;
           color:#6b727e; font-weight:700; }
/* il riquadro colorato del codice (.cod, lo stesso della scheda) dentro la cornice
   dell'anteprima: senza sfondo e bordo suoi, se no e' una scatola dentro l'altra.
   Va a capo da solo: una barra laterale su un codice da copiare e' solo un fastidio */
.ant-codbox .cod { background:none; border:0; padding:2px 2px 0; }
/* TOAST: la conferma di cio' che si e' appena fatto. Il testo NON arriva
   dall'URL (sarebbe scrivibile da chiunque): l'indirizzo porta solo un codice
   e la frase sta qui. */
.toast { position:fixed; left:50%; bottom:28px; transform:translate(-50%, 14px);
         display:flex; align-items:center; gap:10px; z-index:200;
         padding:12px 18px; border-radius:999px; color:#e8eaed; font-size:13.5px;
         font-weight:600; opacity:0; transition:opacity .18s, transform .18s; pointer-events:none;
         max-width:calc(100vw - 32px); }
.toast.on { opacity:1; transform:translate(-50%, 0); }
.toast .toast-ic { width:20px; height:20px; border-radius:50%; flex-shrink:0;
         display:flex; align-items:center; justify-content:center;
         background:linear-gradient(135deg,#2ad675,#22c78f); color:#06130c; }
.toast .toast-ic svg { width:12px; height:12px; }
@media (max-width:640px) { .toast { bottom:16px; font-size:13px; padding:11px 15px; } }
/* SCHEDA DEMO */
.demo-stato { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:13px;
              color:#b0b8c4; margin:-2px 0 16px; }
.demo-griglia { display:grid; grid-template-columns:repeat(auto-fit, minmax(220px, 1fr));
                gap:12px; margin-top:6px; }
/* l'accesso della demo: i tre campi e «Salva» nella stessa riga, a destra (dal
   2026-10-01, Antonio); su telefono uno sotto l'altro */
.demo-griglia.accesso { grid-template-columns:repeat(3, minmax(0, 1fr)) auto; align-items:end; }
.demo-foto { font-size:12.5px; color:#8a92a0; margin-top:5px; }   /* testo semplice: va a capo come una frase */
.demo-foto strong { color:#e8eaed; font-weight:600; }
/* nelle pagine dei cantieri demo, sul timelapse: le foto sono generate, e chi prova
   TimeLynx lo deve sapere (dal 2026-10-02, richiesta di Antonio). Solo per l'account
   demo: la mette handle_browse */
.tl-demo-foto { position:relative; }
.tl-ai { position:absolute; right:12px; bottom:12px; z-index:3; display:flex;
         align-items:center; gap:6px; padding:4px 11px 4px 9px; border-radius:999px;
         background:rgba(10,12,16,.66); color:#fff; font-size:12px; font-weight:600;
         line-height:18px; letter-spacing:.02em; white-space:nowrap; pointer-events:none;
         -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px); }
.tl-ai svg { display:block; flex:none; width:13px; height:13px; }
/* l'ultima foto del cantiere demo, grande come le caselle dei Timelapse aggiunti */
.demo-thumb { width:104px; height:62px; border-radius:8px; object-fit:cover; flex-shrink:0;
              display:block; background:#181b21; border:1px solid #2a2d35; box-sizing:border-box; }
.demo-thumb.vuota { display:flex; align-items:center; justify-content:center;
                    font-size:10.5px; color:#4a505c; }
/* i campi del cantiere demo in griglia (tre per riga), i pulsanti sotto su una
   riga loro; dentro Modifica «Togli tutte le foto» sta a destra, lontano da Salva */
.pf-edit > .demo-griglia { flex:1 1 100%; margin-top:0; }
.pf-edit > .demo-griglia + .field-act { flex:1 1 100%; }
.pf-edit .demo-svuota { margin-left:auto; }
.pf-row .zipbar-wrap { margin-top:12px; }
.pf-row .zipmsg:empty { display:none; }
.pf-row .zipmsg { margin-top:6px; }
/* LAVORI FINITI della mappa pubblica (tab Mappa > Script).
   Una riga per lavoro, come l'elenco utenti: a sinistra chi e', al centro le
   tre foto, a destra i comandi — tutti alti 30px, allineati. */
.pf-lista { display:flex; flex-direction:column; }
.pf-row { padding:14px 0; border-bottom:1px solid #22262e; }
.pf-row:first-child { padding-top:4px; }
.pf-row:last-child { border-bottom:0; }
.pf-main { display:flex; align-items:center; gap:18px; flex-wrap:wrap; }
.pf-info { flex:1 1 240px; min-width:0; }
/* l'etichetta dell'indirizzo sotto il nome, non accanto: cosi' partono tutte
   dallo stesso punto, qualunque sia la lunghezza del nome (Antonio, 2026-10-01) */
.pf-top { display:flex; flex-direction:column; align-items:flex-start; gap:6px; }
.pf-titolo { font-size:14.5px; font-weight:700; color:#e8eaed; }
.pf-via { color:#b0b8c4; font-size:12.5px; margin-top:5px; display:flex; gap:8px;
          align-items:center; flex-wrap:wrap; }
/* le tre caselle foto */
.pf-slots { display:flex; gap:10px; flex-shrink:0; }
.pf-slotbox { margin:0; text-align:center; position:relative; }
/* la X per togliere la foto: sempre visibile (su telefono non c'e' l'hover),
   discreta finche' non ci passi sopra */
.pf-x { position:absolute; top:-6px; right:-6px; width:20px; height:20px; padding:0;
        border-radius:50%; border:1px solid #2a2d35; background:#1a1d23; color:#8a92a0;
        cursor:pointer; display:flex; align-items:center; justify-content:center;
        transition:background .15s, color .15s, border-color .15s; }
.pf-x svg { width:11px; height:11px; }
.pf-x:hover { background:#2a0f0f; color:#e05555; border-color:#c0392b; }
.pf-x:focus-visible { outline:2px solid #2ad675; outline-offset:2px; }
.pf-slot { width:104px; height:62px; border-radius:8px; cursor:pointer; overflow:hidden;
           background:#181b21; border:1px solid #2a2d35; box-sizing:border-box;
           display:flex; align-items:center; justify-content:center; position:relative;
           transition:border-color .15s; }
.pf-slot:hover { border-color:#2ad675; }
.pf-slot img { width:100%; height:100%; object-fit:cover; display:block; }
/* l'input resta raggiungibile da tastiera: nascosto alla vista, non al focus */
.pf-slot input[type=file] { position:absolute; width:1px; height:1px; opacity:0;
           padding:0; border:0; overflow:hidden; clip:rect(0 0 0 0); }
.pf-slot:focus-within { border-color:#2ad675; box-shadow:0 0 0 2px rgba(42,214,117,.25); }
.pf-slot.pieno { background-size:cover; background-position:center; }
.pf-slot.pieno .pf-vuota { display:none; }
.pf-vuota { color:#4a505c; font-size:22px; line-height:1; }
.pf-slot:hover .pf-vuota { color:#2ad675; }
.pf-fase { display:block; font-size:10px; text-transform:uppercase; letter-spacing:.07em;
           color:#6b727e; margin-top:6px; }
/* comandi della riga */
.pf-act { display:flex; align-items:center; gap:8px; flex-shrink:0; }
.pf-act form { margin:0; }
.pf-switch { display:inline-flex; align-items:center; gap:9px; height:30px; box-sizing:border-box;
             padding:0 13px 0 10px; border:1px solid #2a2d35; border-radius:20px;
             background:rgba(255,255,255,.03); cursor:pointer; user-select:none;
             transition:border-color .15s, background .15s; }
.pf-switch:hover { border-color:#3a3f48; }
.pf-switch input { position:absolute; opacity:0; width:1px; height:1px; margin:0; }
.pf-track { width:30px; height:16px; border-radius:20px; background:#3a3f48; flex-shrink:0;
            position:relative; transition:background .15s; }
.pf-track::after { content:''; position:absolute; top:2px; left:2px; width:12px; height:12px;
            border-radius:50%; background:#8a92a0; transition:transform .15s, background .15s; }
.pf-switch input:checked + .pf-track { background:rgba(42,214,117,.32); }
.pf-switch input:checked + .pf-track::after { transform:translateX(14px); background:#2ad675; }
.pf-switch input:focus-visible + .pf-track { outline:2px solid #2ad675; outline-offset:2px; }
.pf-switch-lbl { font-size:12.5px; font-weight:600; color:#8a92a0; }
.pf-switch input:checked ~ .pf-switch-lbl { color:#e8eaed; }
/* modifica di nome e via, dentro la riga */
.pf-edit { display:flex; flex-wrap:wrap; gap:12px; align-items:flex-end; margin:14px 0 2px; }
.pf-edit .field { flex:1 1 220px; }
/* scheda Script: i pulsanti a sinistra, le opzioni della mappa (totali e
   sfocatura) a destra; su telefono le opzioni vanno a capo, sempre a destra */
.if-azioni { flex-wrap:wrap; align-items:center; }
.if-opzioni { margin-left:auto; display:flex; flex-wrap:wrap; align-items:center;
              justify-content:flex-end; gap:8px 14px; }
/* l'etichetta del menu si accende come quella dell'interruttore quando la
   sfocatura e' attiva */
.if-sfoc { display:flex; align-items:center; gap:9px; }
.if-sfoc .ci-input { width:auto; padding-right:28px; }
.if-sfoc.on .pf-switch-lbl { color:#e8eaed; }
.pf-vuoto { color:#6b727e; font-size:13px; font-style:italic; padding:4px 0 12px; }
/* aggiungi un lavoro */
.pf-nuovo { border-top:1px solid #22262e; margin-top:8px; padding-top:18px; }
.pf-nuovo-tit { font-size:12.5px; font-weight:700; color:#e8eaed; margin-bottom:13px; }
.pf-form { display:flex; flex-direction:column; gap:16px; }
.pf-campi { display:flex; flex-wrap:wrap; gap:12px; }
.pf-campi .field { flex:1 1 240px; }
.pf-nuove { display:flex; gap:14px; flex-wrap:wrap; }
.pf-nuova { display:flex; flex-direction:column; align-items:center; font-size:12px;
            cursor:pointer; position:relative; }
.pf-nuova .pf-slot { width:112px; height:68px; }
.pf-nuova .pf-file-nome { display:block; max-width:112px; margin-top:3px; font-size:10.5px;
            color:#2ad675; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
            text-align:center; }
/* nome del cantiere cliccabile: porta alla sua pagina */
.geo-nome { color:#e8eaed; text-decoration:none; font-weight:600; }
.geo-nome:hover { color:#2ad675; }
/* ubicazione modificabile direttamente nella tabella */
.geo-edit { display:flex; gap:6px; align-items:center; margin:0; min-width:260px; }
.geo-edit .ci-input { flex:1; min-width:0; padding:6px 9px; font-size:13px; }
.geo-edit .btn { flex-shrink:0; }

.geo-azioni { display:flex; gap:10px; flex-wrap:wrap; margin-bottom:16px; }

/* BARRA "SVUOTA CESTINO" (radice del cestino, solo sadmin) */
.trashbar { display:flex; align-items:center; gap:18px; flex-wrap:wrap;
            border:1px solid #3a1a1a; padding:14px 18px; margin-bottom:22px; }
.trashbar-txt { flex:1; min-width:180px; color:#e8eaed; font-size:14px;
                line-height:1.45; }
.trashbar .btn { flex-shrink:0; }

/* SETTINGS PAGE */
/* sotto le briciole lo stesso spazio che c'e' sopra (Antonio, 2026-10-21: «troppo spazio
   tra il menù e il breadcrumb»; prima 46px): il main ha 26px in cima e le briciole 12 dalla
   capsula, quindi -14. Sul telefono 16 e 10, quindi -6 */
.settings-wrap { max-width:980px; margin:-14px auto 20px; }
.tabbar { display:flex; margin-bottom:22px; border-bottom:1px solid #2a2d35; }
.tab { background:transparent; border:0; font-size:14px; font-weight:600; cursor:pointer;
       transition:color .15s, border-color .15s; }
.tab.active { border-bottom-color:#2ad675; }
.tabpanel { animation:tabfade .2s ease; }
@keyframes tabfade { from { opacity:0; transform:translateY(4px); }
                     to { opacity:1; transform:none; } }
.settings-card { padding:28px 32px; margin-bottom:20px; }
/* riquadri che si aprono e si chiudono (Il mio account, Aggiungi un utente,
   Aspetto della mappa: dal 2026-10-01, Antonio). Sono <details> (apribile_html):
   niente JavaScript, e partono chiusi, tranne «Avanzate» (dal 2026-10-21). La freccia
   gira quando sono aperti */
.apribile > summary { display:flex; align-items:center; gap:12px; cursor:pointer;
                      list-style:none; user-select:none; -webkit-tap-highlight-color:transparent; }
.apribile > summary::-webkit-details-marker { display:none; }
.apribile > summary > h3, .apribile > summary > h4 { flex:1; margin:0; }
.apribile[open] > summary { margin-bottom:22px; }
.uadd.apribile[open] > summary { margin-bottom:14px; }
.apri-ic { width:18px; height:18px; flex:none; color:#8a92a0;
           transition:transform .2s ease, color .15s; }
.apribile > summary:hover .apri-ic { color:#e8eaed; }
.apribile[open] > summary .apri-ic { transform:rotate(180deg); }
.apribile > summary:focus { outline:none; }
.apribile > summary:focus-visible { outline:2px solid #2ad675; outline-offset:4px; border-radius:6px; }
@media (prefers-reduced-motion:reduce) { .apri-ic { transition:none; } }
.settings-card h3 { font-size:12px; text-transform:uppercase;
                    letter-spacing:.09em; margin:0 0 22px; font-weight:700; }
.settings-field { display:flex; flex-direction:column; align-items:flex-start;
                  gap:10px; }
.settings-field label { color:#b0b8c4; font-size:14px; }
.settings-field .settings-select { min-width:200px; }
.settings-select { padding:7px 12px; font-size:14px; cursor:pointer; }
.settings-select:focus { outline:none; }
.settings-note { color:#555b66; font-size:13px; line-height:1.6;
                 margin-top:6px; padding-top:18px; border-top:1px solid #2a2d35; }

/* LOGIN PAGE: il timelapse del cantiere demo scorre a tutto schermo dietro una
   card di vetro (le fasi le carica LOGIN_JS; parte quando sono arrivate).
   Le stesse classi servono la paginetta /appt, che resta senza foto.
   La pagina non scorre (dal 2026-10-21, Antonio: «se è fisso è meglio»): .lg e'
   fissa e grande quanto la finestra. Prima era alta 100dvh, che nella web app
   dell'iPhone risultava piu' alta dello schermo: la pagina scorreva e «© Lynx»
   finiva sotto il bordo. Se la card non ci sta (telefono girato) scorre solo il
   suo riquadro, e la card resta raggiungibile tutta */
html:has(> body.pagina-login) { overflow:hidden; overscroll-behavior:none; scrollbar-gutter:auto; }
body.pagina-login { overflow:hidden; overscroll-behavior:none; }
.lg { position:fixed; inset:0; overflow:hidden; }
.lg-bg { position:fixed; inset:0; z-index:0; overflow:hidden; background:#07090d; }
.lg-tl { position:absolute; inset:-3%; }
.lg-tl img { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block; }
.lg-tl .lg-f, .lg-tl .lg-f12 { opacity:0; }
.lg.go .lg-tl { animation:lgkb 26s ease-in-out infinite alternate; }
.lg.go .lg-f { animation:lgta 12s linear infinite backwards; }
.lg.go .lg-f12 { animation:lgtb 12s linear infinite backwards; animation-delay:8.25s; }
/* la fase 1 sta ferma sotto; ogni fase entra sopra la precedente e resta finche'
   la successiva non l'ha coperta; l'ultima tiene di piu' e sfuma nella prima */
@keyframes lgta { 0% { opacity:0; } 2.5% { opacity:1; } 8.75% { opacity:1; }
                  8.76% { opacity:0; } 100% { opacity:0; } }
@keyframes lgtb { 0% { opacity:0; } 2.5% { opacity:1; } 29% { opacity:1; }
                  31.25% { opacity:0; } 100% { opacity:0; } }
@keyframes lgkb { from { transform:scale(1.02); } to { transform:scale(1.1) translate(-1.2%,-1%); } }
.lg-scrim { position:absolute; inset:0;
  background:radial-gradient(ellipse 46% 62% at 50% 50%,rgba(4,6,10,.18),rgba(4,6,10,.62) 70%,rgba(4,6,10,.8)),
             linear-gradient(180deg,rgba(4,6,10,.45),rgba(4,6,10,0) 26%,rgba(4,6,10,0) 62%,rgba(4,6,10,.88)); }
.login-wrap { position:relative; z-index:1; display:flex; align-items:center; justify-content:center;
              min-height:100vh; min-height:100dvh; padding:24px 20px; }
/* nel login il riquadro e' quello fisso di .lg; le zone sicure dell'iPhone (status
   bar, barra in fondo, i lati col telefono girato) restano libere. La card sta al
   centro coi margini automatici e non con justify-content: cosi', se non ci sta,
   si scorre dall'inizio e non resta tagliata in alto */
.lg .login-wrap { position:absolute; inset:0; min-height:0; overflow-y:auto;
  overscroll-behavior:contain; flex-direction:column; justify-content:flex-start;
  padding:calc(env(safe-area-inset-top) + 24px) calc(env(safe-area-inset-right) + 20px)
          calc(env(safe-area-inset-bottom) + 96px) calc(env(safe-area-inset-left) + 20px); }
.lg .login-card { flex:none; margin:auto 0; }
.login-card { position:relative; width:100%; max-width:440px; border-radius:34px;
              padding:42px 40px 34px; }
.login-logo { display:flex; justify-content:center; margin-bottom:10px; }
.login-logo .logo-svg { height:44px; width:auto; }
.login-sub  { text-align:center; color:rgba(236,241,246,.7); font-size:14.5px; font-weight:500;
              margin-bottom:28px; }
.login-err  { color:#ffc2bd; font-size:13.5px; font-weight:600; text-align:center; margin:0 0 16px;
              padding:10px 14px; border-radius:14px; background:rgba(255,90,82,.14);
              border:1px solid rgba(255,90,82,.35); }
.login-field { position:relative; margin-bottom:14px; }
/* 16px: con meno, iOS ingrandisce la pagina appena si tocca il campo */
.login-input { display:block; width:100%; height:52px; padding:0 16px; border-radius:16px;
               font-size:16px; color:#f4f6f8; font-family:inherit; outline:none;
               background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.15);
               box-shadow:inset 0 1px 2px rgba(0,0,0,.3); }
.login-input::placeholder { color:rgba(236,241,246,.5); }
.login-input:focus { background:rgba(255,255,255,.1); border-color:rgba(52,224,138,.8);
               box-shadow:0 0 0 4px rgba(52,224,138,.18),inset 0 1px 2px rgba(0,0,0,.3); }
/* nella pagina di login i campi hanno l'icona a sinistra */
.lg .login-input { height:56px; padding:0 50px; border-radius:17px; }
.lgic { position:absolute; left:17px; top:50%; transform:translateY(-50%); z-index:1;
        width:19px; height:19px; color:rgba(236,241,246,.55); pointer-events:none; display:block; }
.login-field:focus-within > .lgic { color:#6ff0ae; }
.login-card .pw-eye { right:9px; width:40px; height:40px; justify-content:center;
                      border-radius:12px; color:rgba(236,241,246,.6); }
.login-card .pw-eye .eyeic { width:19px; height:19px; }
.lg-go { margin-top:22px; width:100%; height:56px; border-radius:17px; display:flex;
         align-items:center; justify-content:center; gap:10px; font-size:16px;
         font-weight:800; letter-spacing:.01em; }
.lg-go .goic { width:19px; height:19px; display:block; }
.lg-foot { position:absolute; left:0; right:0; bottom:calc(env(safe-area-inset-bottom) + 28px);
           z-index:1; padding:0 calc(env(safe-area-inset-right) + 32px) 0
           calc(env(safe-area-inset-left) + 32px);
           display:flex; align-items:center; justify-content:space-between; gap:16px;
           pointer-events:none; }
.lg-chip { display:flex; align-items:center; gap:12px; padding:10px 18px 10px 10px;
           border-radius:22px; }
.lg-pl { width:30px; height:30px; border-radius:50%; display:flex; align-items:center;
         justify-content:center; background:rgba(255,255,255,.16); color:#fff; flex-shrink:0; }
.lg-pl svg { width:13px; height:13px; margin-left:2px; display:block; }
.lg-chip b { display:block; font-size:13px; font-weight:700; color:#f4f6f8; }
.lg-chip small { display:block; font-size:12px; color:rgba(236,241,246,.66); margin-top:1px; }
.lg-bar { width:150px; height:4px; border-radius:4px; background:rgba(255,255,255,.18);
          overflow:hidden; margin-left:6px; }
.lg-bar i { display:block; height:100%; width:0; border-radius:4px;
            background:linear-gradient(90deg,#34e08a,#9df5c6); }
.lg.go .lg-bar i { animation:lgbar 12s linear infinite; }
@keyframes lgbar { from { width:0; } to { width:100%; } }
/* i credits portano al nostro sito; il piede non prende i clic, il link si' */
.lg-cr { pointer-events:auto; font-size:12.5px; font-weight:600; color:rgba(236,241,246,.66);
         text-decoration:none; }
.lg-cr:hover { color:#34e08a; opacity:1; }
.appt-lbl { display:block; text-align:left; font-size:12px; color:rgba(236,241,246,.6); margin-bottom:6px; }
@media (prefers-reduced-motion:reduce) {
  .lg.go .lg-tl, .lg.go .lg-f, .lg.go .lg-f12, .lg.go .lg-bar i { animation:none; }
  .camcard, .camcard .cc-cov img { transition:none; }
  .camcard:hover { transform:none; }
  .camcard:hover .cc-cov img { transform:none; }
}

/* FTP LOG */
.ftplog { margin-top:8px; max-height:420px; overflow-y:auto;
          border:1px solid #2a2d35; border-radius:8px; }
.ftprow { display:flex; align-items:baseline; gap:10px; padding:7px 12px;
          font-size:12px; border-bottom:1px solid #1c2026; }
.ftprow:last-child { border-bottom:0; }
.ftprow.danger { background:#1a0e0e; }
.ftprow .ft-time { color:#555b66; white-space:nowrap; font-variant-numeric:tabular-nums; }
.ftprow .ft-geo  { color:#b0b8c4; white-space:nowrap; min-width:120px; }
.ftprow .ft-ip   { color:#555b66; white-space:nowrap; font-size:11px; }
.ftprow .ft-act  { flex:1; color:#2ad675; font-weight:600; min-width:0;
                   overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ftprow .ft-act.login  { color:#e0b341; }   /* login: giallo */
.ftprow .ft-act.upload { color:#2ad675; }   /* caricamento: verde */
.ftprow .ft-act.other  { color:#e05555; }   /* eliminazione / altro: rosso */
.ftprow .ft-file { color:#555b66; font-weight:400; }
/* REGISTRO ACCESSI (Impostazioni › Accessi): le righe del registro FTP, con chi
   ed esito. Verde chi e' entrato, giallo una password sbagliata, rosso un IP non
   consentito o un blocco per troppi tentativi */
.acc-row .acc-chi { color:#e8eaed; font-weight:600; white-space:nowrap; }
.acc-row .acc-chi.vuoto { color:#6b727e; font-weight:400; font-style:italic; }
.acc-row .acc-esito { font-weight:600; white-space:nowrap; }
.acc-row .acc-esito.ok { color:#2ad675; }
.acc-row .acc-esito.password, .acc-row .acc-esito.ruolo { color:#e0b341; }
.acc-row .acc-esito.ip, .acc-row .acc-esito.bloccato { color:#e05555; }
.acc-row .acc-disp { color:#8a92a0; white-space:nowrap; margin-left:auto; }
.ftplog-empty { padding:18px; text-align:center; color:#555b66; font-size:13px; }
.ftp-pager { display:flex; align-items:center; gap:10px; margin-top:14px; }
.ftp-pageinfo { font-size:12px; color:#555b66; }
.ftp-pagesel { padding:4px 8px; font-size:12px; }

/* MAIL ALERT */
/* TOGGLE iOS-style */
.toggle-row { display:flex; align-items:center; justify-content:space-between;
              gap:18px; margin-bottom:16px; color:#b0b8c4; font-size:14px;
              line-height:1.4; }
.switch { position:relative; display:inline-block; width:46px; height:26px;
          flex-shrink:0; }
.switch input { position:absolute; opacity:0; width:0; height:0; }
.slider { position:absolute; inset:0; cursor:pointer; background:#2a2d35;
          border-radius:26px; transition:background .25s; }
.slider:before { content:''; position:absolute; height:20px; width:20px;
          left:3px; top:3px; background:#e8eaed; border-radius:50%;
          transition:transform .25s, background .25s;
          box-shadow:0 1px 3px rgba(0,0,0,.4); }
.switch input:checked + .slider { background:#2ad675; }
.switch input:checked + .slider:before { transform:translateX(20px); background:#0a2615; }
.switch input:focus-visible + .slider { outline:2px solid #2ad675; outline-offset:2px; }
.mail-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
             gap:14px; }
.mail-field { display:flex; flex-direction:column; gap:5px; }
.mail-field label { color:#555b66; font-size:12px; }
.mail-btns { display:flex; align-items:center; gap:12px; margin-top:18px; }
.mail-testmsg { font-size:13px; }

/* UTENTI */
/* le etichette dei ruoli tutte uguali (dal 2026-10-21, Antonio: «han tutte dimensioni
   diverse, non mi piace»): stessa larghezza e altezza, testo al centro, a pillola. Il
   nome accanto ha una larghezza minima, cosi' nell'elenco stanno in colonna */
.user-badge { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0;
              box-sizing:border-box; min-width:104px; height:22px; padding:0 10px;
              border-radius:999px; font-size:10px; font-weight:700; letter-spacing:.07em;
              text-transform:uppercase; line-height:1; white-space:nowrap; }
.urow-name, .riceve-nome { min-width:96px; }
/* i colori dei ruoli (dal 2026-10-21, Antonio): super admin rosso, admin viola,
   rivenditore verde, cliente blu. Il viola e' l'indigo #422ec1 dei cantieri «in corso»
   della mappa pubblica (fino al 20 era del cliente; l'admin era verde, il rivenditore
   ciano). Le lettere piu' chiare del bordo, se no sul fondo scuro non si leggono */
.user-badge.admin { background:rgba(66,46,193,.2); color:#aa9dff; border:1px solid #422ec1; }
.user-badge.demo  { background:#1a1f27; color:#7a828e; border:1px solid #2a2d35; }
.user-badge.sys   { background:#1a1f27; color:#7a828e; border:1px solid #2a2d35;
                    min-width:0; }   /* «FTP» davanti a una frase: resta corta */
.user-badge.cliente { background:rgba(45,136,255,.14); color:#6fb2ff;
                      border:1px solid rgba(45,136,255,.5); }
/* utente 'cliente': sola visione del proprio cantiere, niente download */
.role-cliente .hdisk, .role-cliente .htrash,
.role-cliente a[href^='/dl?'], .role-cliente a[href^='/zip?'],
.role-cliente a.tl-dl,
.role-cliente #lbdl, .role-cliente #vlbdl,
.role-cliente #lbdel, .role-cliente #vlbdel,
.role-cliente .zipup { display:none !important; }
/* campo password con occhio */
.pw-field { position:relative; display:flex; align-items:center; flex:1; min-width:180px; }
.pw-field input { width:100%; padding-right:40px; }
.pw-eye { position:absolute; right:6px; top:50%; transform:translateY(-50%);
          background:none; border:0; padding:4px; cursor:pointer; color:#555b66;
          display:flex; align-items:center; }
.pw-eye:hover, .pw-eye.on { color:#2ad675; }
.pw-eye .eyeic { width:18px; height:18px; }
/* la password attuale della demo: sembra un campo, ma e' un testo (vedi _demo_pw_attuale) */
.pw-valore { display:flex; align-items:center; box-sizing:border-box; height:38px;
             padding:0 40px 0 12px; overflow:hidden; white-space:nowrap; cursor:pointer;
             user-select:all; }
.pw-valore.vuota { color:#8a92a0; cursor:default; user-select:none; padding-right:12px; }
/* ---------- SEZIONE UTENTI ----------
   niente tondo con l'iniziale (tolto il 2026-10-21, Antonio: «è sempre l'iniziale ed
   è inutile»): il nome e l'etichetta col colore del ruolo bastano */
.acct { display:flex; align-items:center; gap:14px; margin-bottom:20px; }
.acct-id { display:flex; flex-direction:column; align-items:flex-start; gap:6px; }
.acct-name { font-size:17px; font-weight:700; color:#e8eaed; line-height:1; }
/* riga di campi con etichetta sopra: tutti della stessa altezza */
.field-row { display:flex; flex-wrap:wrap; align-items:flex-end; gap:12px 14px; }
/* lo spazio fra etichetta e campo e' il margine dell'etichetta, non un gap: i
   gestori di password (LastPass) infilano accanto al campo un elemento alto zero,
   e col gap diventava un pezzo in piu' della colonna, 6px di troppo, che nella
   riga allineata in basso faceva salire solo quel campo rispetto agli altri */
.field { display:flex; flex-direction:column; flex:1 1 190px; min-width:0; }
.field > .field-lbl { margin-bottom:6px; }
.field-lbl { font-size:12px; font-weight:600; color:#8a92a0; }
.field-act { display:flex; gap:8px; flex:0 0 auto; }
.field .pw-field { min-width:0; }
/* LA NUVOLETTA ROSSA sotto un campo che non va (dal 2026-10-21, Antonio): la regola della
   password non sta piu' scritta sotto i campi, compare solo quando non e' rispettata
   (avvisoCampo in USERS_JS). Sta fuori dal flusso: non sposta niente, e i clic passano */
.field { position:relative; }
.campo-avviso { position:absolute; left:0; top:calc(100% + 10px); z-index:30;
  width:max-content; max-width:min(300px, calc(100vw - 48px)); box-sizing:border-box;
  padding:8px 12px; border-radius:10px; background:#d93a35; color:#fff; font-size:13px;
  font-weight:600; line-height:1.35; letter-spacing:0; text-transform:none;
  box-shadow:0 10px 30px -8px rgba(0,0,0,.7); pointer-events:none;
  animation:campo-avviso .18s ease-out; }
.campo-avviso::before { content:''; position:absolute; left:18px; top:-5px; width:10px;
  height:10px; background:inherit; border-radius:2px; transform:rotate(45deg); }
@keyframes campo-avviso { from { opacity:0; transform:translateY(-4px); } }
.ci-input[aria-invalid=true], .ci-input[aria-invalid=true]:focus {
  border-color:rgba(255,90,82,.85); box-shadow:0 0 0 3px rgba(255,90,82,.18); }
@media (prefers-reduced-motion:reduce) { .campo-avviso { animation:none; } }
.u-msg { font-size:12.5px; margin-top:9px; }
.u-msg:empty { display:none; }
.u-msg.ok  { color:#2ad675; }
.u-msg.err { color:#e0554f; }
.ulist { display:flex; flex-direction:column; }
.urow { padding:12px 0; border-bottom:1px solid #22262e; }
.urow:first-child { padding-top:2px; }
.urow:last-child { border-bottom:0; }
.urow-main { display:flex; align-items:center; gap:12px; min-height:34px; }
.urow-id { flex:1; min-width:0; display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.urow-name { font-size:14.5px; font-weight:700; color:#e8eaed; }
.urow-cam { font-size:12px; color:#8a92a0; }
.urow-tu { font-size:11px; color:#6b727e; }
.urow-act { display:flex; align-items:center; gap:8px; flex-shrink:0; }
.urow-lock { display:inline-flex; align-items:center; gap:6px; font-size:12px; color:#6b727e; }
.lockic { width:14px; height:14px; }
/* il modulo di reimpostazione sotto il nome */
.urow-pw, .urow-cams-form { margin:14px 0 4px; }
.urow-act:empty { display:none; }
/* la mappa sul sito di un cliente: l'interruttore nella riga, prima dei pulsanti */
.urow-mappa { display:flex; margin:0 6px 0 0; }
/* voce «Mappa» nelle impostazioni del cliente */
.mc-intro { color:#b0b8c4; font-size:14px; line-height:1.6; margin:0 0 16px; }
.mc-on { display:inline-block; font-size:11px; font-weight:700; letter-spacing:.02em;
         text-transform:none; padding:1px 9px; border-radius:20px; margin-left:8px;
         vertical-align:1px; color:#2ad675; border:1px solid rgba(42,214,117,.35);
         background:rgba(42,214,117,.1); }
.mc-domini { display:flex; flex-wrap:wrap; gap:12px; align-items:flex-end; margin:20px 0 4px; }
.mc-domini .field { flex:1 1 260px; }
.mc-nuovo { display:flex; align-items:center; justify-content:space-between; gap:14px 18px;
            flex-wrap:wrap; margin-top:18px; padding-top:16px; border-top:1px solid #22262e; }
.mc-nuovo > div { flex:1 1 300px; }
.mc-nuovo strong { display:block; color:#e8eaed; font-size:13.5px; margin-bottom:3px; }
.mc-nuovo span { color:#8a92a0; font-size:13px; line-height:1.5; }
/* il codice da incollare (codice_colorato_html): un attributo per riga coi colori
   di un editor, tutto visibile. Rientro «appeso»: una riga che va a capo
   (l'indirizzo, lo style) prosegue piu' in dentro, non sotto il tag */
.cod { margin:0; padding:14px 16px; border-radius:14px; background:#0b0e13;
       border:1px solid rgba(255,255,255,.09); color:#c9d1d9;
       font:500 12.5px/1.7 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
       white-space:pre-wrap; overflow-wrap:anywhere; word-break:normal; }
.cod .cod-r { display:block; padding-left:4ch; text-indent:-4ch; }
.cod .cod-r.in { text-indent:-2ch; }
.cod .c-t { color:#7ee0a8; }
.cod .c-a { color:#8ab4ff; }
.cod .c-p { color:#6b727e; }
.cod .c-v { color:#f2c48d; }
/* le scelte della mappa sul sito del cliente: titolo e spiegazione a sinistra,
   l'interruttore a destra, e tutta la riga lo accende */
.mc-sez { margin-top:22px; padding-top:18px; border-top:1px solid #22262e; }
.mc-sez strong { display:block; color:#e8eaed; font-size:13.5px; margin-bottom:3px; }
.mc-sez > span { color:#8a92a0; font-size:13px; line-height:1.5; }
.mc-opz { display:grid; gap:8px; margin-top:12px; }
.mc-op { display:flex; align-items:center; justify-content:space-between; gap:16px;
         padding:11px 14px; border-radius:14px; border:1px solid #2a2d35;
         background:rgba(255,255,255,.025); cursor:pointer; transition:border-color .15s; }
.mc-op:hover { border-color:#3a3f48; }
.mc-op-t b { display:block; font-size:13.5px; color:#e8eaed; }
.mc-op-t span { display:block; font-size:12.5px; color:#8a92a0; line-height:1.45; margin-top:1px; }
.mc-op .pf-switch { height:auto; padding:0; border:0; background:none; }
.mc-op .pf-track { width:38px; height:22px; }
.mc-op .pf-track::after { width:18px; height:18px; }
.mc-op .pf-switch input:checked + .pf-track::after { transform:translateX(16px); }
/* branding: il colore del numero, con l'anteprima del segnaposto accanto */
.mc-brand { display:flex; align-items:center; flex-wrap:wrap; gap:12px 18px; margin-top:12px; }
.mc-colore { display:inline-flex; align-items:center; gap:10px; font-size:13.5px;
             font-weight:600; color:#e8eaed; cursor:pointer; }
.mc-colore input { width:46px; height:34px; padding:0; border:1px solid #2a2d35;
                   border-radius:10px; background:none; cursor:pointer; }
.mc-colore input::-webkit-color-swatch-wrapper { padding:3px; }
.mc-colore input::-webkit-color-swatch { border:0; border-radius:7px; }
.mc-colore input::-moz-color-swatch { border:0; border-radius:7px; }
.mc-prova { display:inline-flex; align-items:center; gap:9px; color:#8a92a0; font-size:12.5px; }
.mc-prova .mp-n { position:static; display:inline-block; }
/* il riquadro coi contatti del commerciale */
.mc-dialog { border:1px solid rgba(255,255,255,.14); border-radius:24px; padding:26px 28px 22px;
             width:min(420px, calc(100vw - 32px)); background:#14181e; color:#e8eaed;
             box-shadow:0 30px 80px -20px rgba(0,0,0,.85); }
.mc-dialog::backdrop { background:rgba(4,6,10,.6); -webkit-backdrop-filter:blur(4px);
                       backdrop-filter:blur(4px); }
.mc-dialog h4 { margin:0 0 6px; font-size:17px; }
.mc-dialog p { margin:0 0 16px; color:#b0b8c4; font-size:14px; }
.mc-persona { font-size:15px; font-weight:700; margin:26px 0 10px; }  /* staccato dalla frase
   sopra (Antonio): il margine si fonde coi 16px del paragrafo, quindi conta il piu' grande */
.mc-contatto { display:flex; align-items:center; gap:10px; padding:10px 12px; margin-bottom:8px;
               border-radius:14px; border:1px solid #2a2d35; background:rgba(255,255,255,.03);
               color:#e8eaed; text-decoration:none; font-size:14px; }
.mc-contatto:hover { border-color:rgba(42,214,117,.45); }
.mc-contatto svg { width:18px; height:18px; color:#34e08a; flex-shrink:0; }
.mc-dialog .field-act { margin-top:14px; justify-content:flex-end; }
/* cantieri di un cliente: l'avviso «nessun cantiere» sotto il nome, pillole da
   spuntare nei moduli */
.urow-cams { flex-basis:100%; display:flex; flex-wrap:wrap; gap:5px; }
.cam-field { flex-basis:100%; }
.cam-picks { display:flex; flex-wrap:wrap; gap:7px; }
.urow-cams-form .cam-picks { margin:9px 0 14px; }
.cam-picks-vuoto { font-size:12.5px; color:#6b727e; }
.cam-pick { position:relative; cursor:pointer; user-select:none; }
.cam-pick input { position:absolute; opacity:0; width:1px; height:1px; margin:0; }
.cam-pick span { display:inline-flex; align-items:center; gap:7px; height:30px;
                 box-sizing:border-box; padding:0 12px 0 9px; border-radius:20px;
                 border:1px solid #2a2d35; background:rgba(255,255,255,.03);
                 color:#b0b8c4; font-size:12.5px; font-weight:600; white-space:nowrap;
                 transition:border-color .15s, background .15s, color .15s; }
.cam-pick span::before { content:''; width:14px; height:14px; box-sizing:border-box;
                 border:1.5px solid #5b616c; border-radius:4px; flex-shrink:0;
                 display:inline-flex; align-items:center; justify-content:center;
                 font-size:10px; font-weight:800; line-height:1; color:#05130b; }
.cam-pick:hover span { border-color:#3a3f48; color:#e8eaed; }
.cam-pick input:checked + span { border-color:rgba(42,214,117,.55);
                 background:rgba(42,214,117,.10); color:#e8eaed; }
.cam-pick input:checked + span::before { content:'✓'; background:#2ad675;
                 border-color:#2ad675; }
.cam-pick input:focus-visible + span { outline:2px solid #2ad675; outline-offset:2px; }
.uadd { border-top:1px solid #2a2d35; margin-top:10px; padding-top:20px; }
.uadd h4 { margin:0 0 14px; font-size:13px; font-weight:700; color:#e8eaed; }
/* super admin in rosso (dal 2026-10-01, richiesta di Antonio): prima era verde come
   l'admin e non si distingueva */
.user-badge.sadmin { background:#2a1414; color:#ff6d64; border:1px solid #7a2e2a; }
.ftp-info { display:flex; align-items:center; gap:9px; margin-top:20px; padding-top:16px;
            border-top:1px solid #22262e; font-size:12.5px; color:#6b727e; }
.ftp-info strong { color:#b0b8c4; }
/* ---------- RIVENDITORI (dal 2026-10-20) ----------
   il ruolo in verde (dal 2026-10-21; prima ciano): vedi i colori dei ruoli in UTENTI */
.user-badge.rivenditore { background:#142a1c; color:#2ad675; border:1px solid #2a5a3c; }
/* il rivenditore scarica come un admin, ma non elimina niente: nemmeno dal visore */
.role-rivenditore #lbdel, .role-rivenditore #vlbdel,
.role-rivenditore .hdisk, .role-rivenditore .htrash,
.role-rivenditore .zipup { display:none !important; }
/* nella riga di un utente: di chi e' cliente, quanti clienti ha un rivenditore e il
   suo utente FTP */
.urow-di, .urow-info { font-size:12px; color:#8a92a0; white-space:nowrap; }
.urow-di b { color:#2ad675; font-weight:600; }
.urow-ftp { font-size:10.5px; font-weight:700; letter-spacing:.03em; white-space:nowrap;
            padding:1px 8px; border-radius:10px; color:#8a92a0; border:1px dashed #3a3f48; }
.urow-ftp.on { color:#b0b8c4; border:1px solid #2a2d35; background:rgba(255,255,255,.03); }
.urow-riv { max-width:320px; margin:0 0 14px; }
.riv-nota { flex-basis:100%; margin-top:0; }
.riv-ftp { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-weight:600;
           color:#e8eaed; }
/* nei cantieri di un rivenditore, quelli creati dal suo FTP: suoi comunque, spuntati e
   fermi, con FTP accanto al nome */
.cam-pick.ftp { cursor:default; }
.cam-pick.ftp span { opacity:.8; }
.cam-pick.ftp:hover span { border-color:rgba(42,214,117,.55); color:#e8eaed; }
.cam-pick i { font-style:normal; font-size:9.5px; font-weight:800; letter-spacing:.06em;
              padding:2px 5px; border-radius:6px; color:#2ad675;
              background:rgba(42,214,117,.16); }
/* le due righe sotto un modulo: la regola delle password, cosa riceve la mail */
.field-nota { font-size:12.5px; color:#8a92a0; line-height:1.5; margin-top:9px; }
.field-nota:empty { display:none; }
.urow-cams-form > .field-nota { margin:4px 0 0; }
.acct-posta { margin-bottom:22px; padding-bottom:20px; border-bottom:1px solid #22262e; }
.acct-posta .field { flex:1 1 280px; }
/* Attivita' FTP: gli utenti FTP (chi amministra) e l'accesso del rivenditore */
.ftpu-lista { display:flex; flex-direction:column; }
.ftpu-riga { display:flex; align-items:center; gap:10px 16px; flex-wrap:wrap;
             padding:11px 0; border-bottom:1px solid #22262e; font-size:13.5px; }
.ftpu-riga:first-child { padding-top:0; }
.ftpu-riga:last-child { border-bottom:0; }
.ftpu-nome { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; color:#e8eaed;
             min-width:170px; }
.ftpu-chi { flex:1; color:#b0b8c4; min-width:0; }
.ftp-stato { font-size:12px; font-weight:600; color:#e0b341; white-space:nowrap; }
.ftp-stato.on { color:#2ad675; }
.ftp-stato.ko { color:#e05555; }
/* i dati da mettere nelle camere: etichetta a sinistra, valore e «Copia» a destra,
   come i dati della scheda del cantiere */
.ftpa-dati { display:grid; grid-template-columns:max-content minmax(0,1fr);
             gap:10px 28px; align-items:center; margin:0 0 8px; }
.ftpa-dati dt { font-size:12.5px; font-weight:600; color:#8a92a0; }
.ftpa-dati dd { margin:0; display:flex; align-items:center; gap:10px; min-height:38px;
                min-width:0; color:#e8eaed; font-size:14px; }
.ftpa-dati code { font-size:14px; color:#e8eaed; user-select:all; overflow-wrap:anywhere; }
.ftpa-dati .pw-field { flex:0 1 240px; min-width:0; }
.ftpa-copia { flex:none; }
.ftprow .ft-user { font-size:11px; font-weight:700; white-space:nowrap; color:#2ad675;
                   min-width:96px; }
.ftprow .ft-user.lynx { color:#8a92a0; font-weight:600; }
/* Alert email: tre card e un «Salva»; chi riceve gli avvisi dei cantieri */
.mail-salva { display:flex; justify-content:flex-end; margin:-4px 0 20px; }
/* un campo solo nella griglia: non a tutta larghezza */
.mail-grid.uno { grid-template-columns:minmax(0,460px); }
.mail-grid.uno.stretta { grid-template-columns:minmax(0,220px); }
.riceve-lista { display:flex; flex-direction:column; margin-top:10px; }
.riceve-riga { display:flex; align-items:center; gap:8px 12px; flex-wrap:wrap;
               padding:9px 0; border-bottom:1px solid #22262e; font-size:13.5px; }
.riceve-riga:last-child { border-bottom:0; }
.riceve-nome { font-weight:700; color:#e8eaed; }
.riceve-mail { color:#b0b8c4; flex:1; min-width:0; overflow-wrap:anywhere; }
.riceve-mail.manca { color:#e0b341; }
.riceve-cosa { color:#8a92a0; font-size:12.5px; white-space:nowrap; }
.riceve-avviso { margin-top:10px; padding:10px 14px; border-radius:14px; font-size:13px;
                 color:#f0c45a; background:rgba(224,179,65,.09);
                 border:1px solid rgba(224,179,65,.35); }
/* ---------- CONTROLLI UNIFORMI IN TUTTE LE SCHEDE DI IMPOSTAZIONI ----------
   campi, menu e pulsanti misuravano 32, 34 e 29-31 px: in una riga non si
   allineava niente. Ora un'altezza sola per i controlli normali e una per i
   piccoli. Solo dentro .settings-card: il resto della galleria non cambia. */
.settings-card .ci-input,
.settings-card .settings-select { height:38px; box-sizing:border-box; }
.settings-card .btn:not(.sm) { height:38px; box-sizing:border-box; padding:0 18px;
        display:inline-flex; align-items:center; justify-content:center; white-space:nowrap; }
.settings-card .btn.sm { height:30px; box-sizing:border-box; padding:0 11px;
        display:inline-flex; align-items:center; justify-content:center; white-space:nowrap; }
/* l'icona dopo la parola («Carica» / «Aggiorna»): mentre carica, gira */
.btn .btn-ic { width:14px; height:14px; flex:none; margin-left:7px; }
.btn[disabled] .btn-ic { animation:spin .9s linear infinite; }
@media (prefers-reduced-motion:reduce) { .btn[disabled] .btn-ic { animation:none; } }
.settings-card .geo-edit .ci-input { height:30px; }

/* ===================== VETRO LIQUIDO (dal 2026-09-29) =====================
   Superfici di vetro smerigliato col riflesso sul bordo, pulsanti a pillola,
   luce colorata sullo sfondo: senza colore sotto, il vetro sembra solo grigio.
   Token in :root, da li' si tara. Prima c'era il «glass sobrio» (in git). */
:root {
  color-scheme:dark;
  --glass-bg:linear-gradient(160deg,rgba(255,255,255,.12),rgba(255,255,255,.035) 42%,rgba(255,255,255,.06));
  --glass-bd:rgba(255,255,255,.12);
  --glass-bd-hi:rgba(52,224,138,.55);
  --glass-blur:blur(26px) saturate(170%);
  --glass-sh:inset 0 1px 0 rgba(255,255,255,.28),inset 0 -1px 0 rgba(255,255,255,.04),
             0 24px 60px -26px rgba(0,0,0,.75);
  --glass-luce:linear-gradient(135deg,rgba(255,255,255,.55),rgba(255,255,255,.06) 30%,
             rgba(255,255,255,0) 58%,rgba(255,255,255,.22));
  --grn:linear-gradient(180deg,#5ee9a6,#22c47c);
}
/* niente sfondo su html: cosi' quello del body si estende a tutta la finestra
   (con uno sfondo proprio, html fermerebbe il body dove finisce il contenuto) */
body {
  color:#f4f6f8;
  background:
    radial-gradient(900px 520px at 6% -6%, rgba(52,224,138,.16), transparent 65%),
    radial-gradient(760px 480px at 100% 10%, rgba(90,140,255,.10), transparent 70%),
    radial-gradient(820px 560px at 10% 90%, rgba(255,170,90,.08), transparent 70%),
    radial-gradient(900px 600px at 92% 98%, rgba(52,224,138,.07), transparent 70%),
    linear-gradient(#07090d, #07090d) #07090d;
  background-attachment:fixed;
}
/* la barra in alto del telefono (dal 2026-10-21): Safari, da iOS 26, la colora col
   colore di fondo del body, e prima era quasi nera sopra l'alone verde. Il colore di
   fondo diventa il verde scuro dell'alone (COLORE_BARRA in tlviews), ma nella pagina
   non si vede: sopra c'e' sempre lo strato #07090d. In cima la pagina sfuma da quello
   stesso verde, quindi barra e pagina si continuano senza scalino. Solo nel browser:
   nella web app installata la status bar e' trasparente e sotto c'e' gia' la pagina */
@media (display-mode:browser) and (pointer:coarse) {
  body:not(.pagina-login) { background-color:#0e2524; }
  body:not(.pagina-login)::before { content:''; position:fixed; top:0; left:0; right:0;
    height:110px; z-index:40; pointer-events:none; background-color:#0e2524;
    -webkit-mask-image:linear-gradient(#000, rgba(0,0,0,.5) 45%, transparent);
            mask-image:linear-gradient(#000, rgba(0,0,0,.5) 45%, transparent); }
}
a { color:#34e08a; }
/* superfici a vetro */
header > .hinner, .camcard, .dir, .cell, .vcell, .settings-card, .scheda.sola, #tlp,
.login-card, .lg-chip {
  background:var(--glass-bg), rgba(255,255,255,.015);
  backdrop-filter:var(--glass-blur); -webkit-backdrop-filter:var(--glass-blur);
  border:1px solid var(--glass-bd);
  box-shadow:var(--glass-sh);
}
header > .hinner { background:var(--glass-bg), rgba(12,15,20,.5); }
.login-card { background:var(--glass-bg), rgba(10,13,18,.3);
  backdrop-filter:blur(30px) saturate(175%); -webkit-backdrop-filter:blur(30px) saturate(175%);
  border-color:rgba(255,255,255,.14);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.42),inset 0 -1px 0 rgba(255,255,255,.06),
             0 40px 90px -20px rgba(0,0,0,.65); }
/* il riflesso: un bordo di luce piu' viva in alto a sinistra */
header > .hinner::before, .camcard::before, .login-card::before, .settings-card::before {
  content:''; position:absolute; inset:-1px; border-radius:inherit; padding:1px;
  background:var(--glass-luce); pointer-events:none;
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude; }
.settings-card { position:relative; border-radius:26px; }
.settings-card h3 { color:#34e08a; }
.scheda.sola { border-radius:22px; }
.dir { border-radius:18px; }
.dir .nm b a::after { border-radius:18px; }
.dir .ic .camic { width:24px; height:24px; color:#34e08a; }
.cell, .vcell { border-radius:16px; background:rgba(255,255,255,.04); box-shadow:none;
  backdrop-filter:none; -webkit-backdrop-filter:none; border-color:rgba(255,255,255,.08); }
.dir:hover, .cell:hover, .vcell:hover {
  border-color:var(--glass-bd-hi); background:rgba(52,224,138,.07);
}
/* pulsanti: pillole */
.btn { border-radius:999px; background:var(--grn); color:#03140b; font-weight:700;
       box-shadow:0 8px 20px -10px rgba(34,196,124,.85), inset 0 1px 0 rgba(255,255,255,.5);
       transition:filter .15s, background .15s, border-color .15s, color .15s, opacity .15s; }
.btn:hover { opacity:1; filter:brightness(1.07); }
.btn.sm { padding:5px 13px; font-size:12.5px; }
.btn.grey { background:rgba(255,255,255,.08); color:#f4f6f8; border:1px solid rgba(255,255,255,.13);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14); }
.btn.grey:hover { background:rgba(255,255,255,.14); border-color:rgba(255,255,255,.22); color:#fff;
  filter:none; }
.btn.danger { background:rgba(255,90,82,.10); color:#ff8078;
  border:1px solid rgba(255,90,82,.35); box-shadow:none; }
.btn.danger:hover { background:rgba(255,90,82,.18); color:#ffa29b; filter:none; }
.btn.camdel { background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.13);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14); justify-content:center; }
.btn.camdel:hover { background:rgba(255,90,82,.16); border-color:rgba(255,90,82,.45); filter:none; }
.trashic { color:#ff6d64; }
.btn.camdel:hover .trashic { color:#ff8a82; }
.btn[disabled] { filter:none; cursor:default; }
/* player timelapse */
#tlp { border-radius:22px; }
#tlbar { background:rgba(10,12,16,.55); border-top:1px solid rgba(255,255,255,.1); }
#tlplay { background:var(--grn); color:#03140b; border-radius:999px; padding:4px 16px; }
.tlfps { border-radius:999px; border-color:rgba(255,255,255,.14); color:rgba(236,241,246,.6); }
.tlfps[data-sel] { background:var(--grn); color:#03140b; border-color:transparent; }
/* campi e menu */
.ci-input, .settings-select { background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.13);
  border-radius:12px; color:#f4f6f8; }
.ci-input:focus, .settings-select:focus { border-color:rgba(52,224,138,.7);
  box-shadow:0 0 0 3px rgba(52,224,138,.15); }
select option { background:#14171d; color:#f4f6f8; }
/* schede delle impostazioni: un controllo segmentato di vetro largo quanto le
   card sotto (richiesta di Antonio), le schede tutte uguali. Se non ci stanno in
   una riga vanno a capo e ogni riga si riempie di nuovo (su telefono scorrono). */
.tabbar { flex-wrap:wrap; gap:4px; width:100%; padding:5px;
  border:1px solid rgba(255,255,255,.1); border-radius:18px; background:rgba(255,255,255,.045);
  backdrop-filter:blur(18px); -webkit-backdrop-filter:blur(18px); }
.tab { flex:1 1 0; text-align:center; white-space:nowrap; border-radius:13px;
  padding:9px 16px; border-bottom:0; margin-bottom:0; color:rgba(236,241,246,.62); }
.tab:hover { color:#f4f6f8; background:rgba(255,255,255,.06); }
.tab.active { color:#8ff5c0; background:rgba(52,224,138,.14);
  box-shadow:inset 0 0 0 1px rgba(52,224,138,.32); }
/* il contorno del browser (azzurro) compariva al clic: resta solo da tastiera, verde */
.tab:focus { outline:none; }
.tab:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:1px; }
/* lightbox */
#lb .bar, #vlb .bar {
  background:rgba(14,17,22,.55);
  backdrop-filter:var(--glass-blur); -webkit-backdrop-filter:var(--glass-blur);
  border-bottom:1px solid rgba(255,255,255,.1);
}
#lb .dl, #lb .x, #vlb .dl, #vlb .x, #lb .nav { border-radius:999px; }
/* avvisi, cestino, barre di caricamento */
.toast { background:rgba(18,22,28,.72); border:1px solid rgba(255,255,255,.14);
  backdrop-filter:blur(20px) saturate(160%); -webkit-backdrop-filter:blur(20px) saturate(160%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 18px 40px -12px rgba(0,0,0,.6); }
.trashbar { border-radius:20px; background:rgba(255,90,82,.08); border-color:rgba(255,90,82,.3);
  backdrop-filter:blur(18px); -webkit-backdrop-filter:blur(18px); }
.zipbar-wrap { background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.12); border-radius:999px; }
.zipbar { background:var(--grn); }

/* SOUNDTRACK (dal 2026-10-10, rifatta su richiesta di Antonio): in testata titolo,
   totali e «Carica file»; sotto i documenti (catalogo, categorie e altri testi,
   una riga ciascuno) e una riga per brano col Play tondo,
   titolo e carattere dal catalogo, il peso e tre icone (scarica, link, elimina) */
.st-testa { display:flex; align-items:center; gap:10px 14px; flex-wrap:wrap; }
.settings-card .st-testa h3 { margin:0; }
.st-tot { color:#8a92a0; font-size:13px; margin-left:auto; font-variant-numeric:tabular-nums; }
.st-carica-btn { display:inline-flex; align-items:center; gap:7px; cursor:pointer; }
.st-carica-btn svg { width:15px; height:15px; }
.st-nota { color:#8a92a0; font-size:12.5px; line-height:1.55; margin:10px 0 16px; }
.st-nota code { font-size:12px; color:#c9cfd8; background:rgba(255,255,255,.06);
  padding:1px 6px; border-radius:6px; }
.st-documento { display:flex; align-items:center; gap:10px 12px; flex-wrap:wrap; padding:8px 12px;
  margin-bottom:10px; border-radius:14px; background:rgba(255,255,255,.04);
  border:1px solid rgba(255,255,255,.08); color:#b0b8c4; font-size:13px; }
.st-doc-t { flex:1 1 220px; }
.st-doc-t b { color:#e8eaed; }
.st-documento .st-doc { width:28px; height:28px; }
.settings-card[data-zipbox] > .zipbar-wrap { margin:8px 0 2px; }
.settings-card[data-zipbox] > .zipmsg:empty { display:none; }
.st-riga { display:flex; align-items:center; gap:14px; padding:11px 4px;
  border-bottom:1px solid rgba(255,255,255,.06); }
.st-riga:last-child { border-bottom:0; }
.st-play { flex:0 0 auto; width:40px; height:40px; padding:0; border-radius:50%; cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center; color:#34e08a;
  background:rgba(52,224,138,.10); border:1px solid rgba(52,224,138,.40);
  transition:background .15s, transform .1s; }
.st-play:hover { background:rgba(52,224,138,.20); }
.st-play:active { transform:scale(.95); }
.st-play svg { width:15px; height:15px; display:block; }
.st-i-play svg { margin-left:2px; }       /* il triangolo sembra al centro spostato un filo */
.st-i-pausa, .st-gira { display:none; }
.st-riga.suona .st-i-play, .st-riga.carica .st-i-play { display:none; }
.st-riga.suona .st-i-pausa { display:block; }
.st-riga.carica .st-gira { display:block; width:16px; height:16px; border-radius:50%;
  border:2px solid rgba(52,224,138,.25); border-top-color:#34e08a; animation:spin .8s linear infinite; }
.st-riga.errore .st-play { color:#ff8a82; background:rgba(255,90,82,.10); border-color:rgba(255,90,82,.45); }
.st-riga.attiva .st-titolo { color:#34e08a; }
.st-doc { flex:0 0 auto; width:40px; height:40px; display:inline-flex; align-items:center;
  justify-content:center; color:#8a92a0; }
.st-doc svg { width:18px; height:18px; }
.st-info { flex:1 1 auto; min-width:0; }
.st-titolo { font-size:14px; font-weight:600; color:#e8eaed; white-space:nowrap; overflow:hidden;
  text-overflow:ellipsis; }
.st-det { font-size:12px; color:#8a92a0; margin-top:3px; white-space:nowrap; overflow:hidden;
  text-overflow:ellipsis; }
.st-suona { display:none; align-items:center; gap:10px; margin-top:8px; }
.st-riga.attiva .st-suona { display:flex; }
.st-barra { flex:1 1 auto; height:6px; border-radius:3px; background:rgba(255,255,255,.10);
  cursor:pointer; overflow:hidden; }
.st-pieno { width:0; height:100%; background:var(--grn); border-radius:3px; }
.st-tempo { flex:0 0 auto; min-width:78px; text-align:right; font-size:11.5px; color:#8a92a0;
  font-variant-numeric:tabular-nums; }
.st-peso { flex:0 0 auto; min-width:64px; text-align:right; font-size:12px; color:#8a92a0;
  font-variant-numeric:tabular-nums; }
.st-act { flex:0 0 auto; display:flex; align-items:center; gap:6px; }
.settings-card .st-act .st-ic { width:32px; height:32px; padding:0; display:inline-flex;
  align-items:center; justify-content:center; }
.st-act .st-ic svg { width:15px; height:15px; }
.st-act .st-ic:not(.camdel) { background:rgba(255,255,255,.08); color:#e8eaed;
  border:1px solid rgba(255,255,255,.13); box-shadow:inset 0 1px 0 rgba(255,255,255,.14); }
.st-act .st-ic:not(.camdel):hover { background:rgba(255,255,255,.15);
  border-color:rgba(255,255,255,.24); filter:none; }
.st-vuoto { color:#8a92a0; font-size:13px; padding:14px 0; }
@media (max-width:640px) {
  .st-tot { margin-left:0; flex:1 1 auto; }
  .st-riga { flex-wrap:wrap; gap:8px 12px; }
  .st-info { flex:1 1 calc(100% - 56px); }
  .st-peso { min-width:0; margin-left:52px; text-align:left; }
  .st-act { margin-left:auto; }
}

/* SCHEDA DEL CANTIERE (dal 2026-10-20, rifatta su richiesta di Antonio): accanto al
   player il nome con «Modifica», una riga con periodo e foto, i dati in un elenco e
   «Carica ZIP» in fondo a destra; la modifica in un riquadro, sul telefono a tutto
   schermo. Sta fuori dai pezzi di CSS che finiscono nella mappa firmata dei clienti
   (PLAYER_CSS): #tlwrap e #tlinfo qui si ritoccano soltanto */
#tlwrap { align-items:flex-start; }
.scheda { position:relative; }
.scheda.sola { padding:22px 26px; margin-bottom:24px; }
.sc-testa { display:flex; align-items:center; gap:12px; }
.sc-nome { flex:1 1 auto; min-width:0; margin:0; font-size:28px; font-weight:800;
  letter-spacing:-.03em; line-height:1.1; color:#f4f6f8; overflow-wrap:anywhere; }
.sc-modifica { flex:0 0 auto; display:inline-flex; align-items:center; gap:7px; }
.sc-modifica svg { width:14px; height:14px; flex:none; }
.sc-meta { margin:9px 0 0; font-size:14px; line-height:1.5; color:#8a92a0; }
.sc-meta b { color:#e8eaed; font-weight:600; }
.sc-fatti { display:grid; grid-template-columns:96px minmax(0,1fr); gap:10px 16px;
  margin:18px 0 0; padding-top:18px; border-top:1px solid rgba(255,255,255,.08);
  font-size:14.5px; line-height:1.45; }
.sc-fatti dt { color:#8a92a0; }
.sc-fatti dd { margin:0; min-width:0; color:#e8eaed; overflow-wrap:anywhere; }
.sc-fatti dd b { font-weight:600; }
.sc-num { font-variant-numeric:tabular-nums; letter-spacing:.02em; }
.sc-unito { white-space:nowrap; }
.sc-tardi { color:#f5b84a; }
.sc-vuota { margin:18px 0 0; padding-top:18px; border-top:1px solid rgba(255,255,255,.08);
  color:#7b8390; font-size:13.5px; line-height:1.5; }
/* l'indirizzo da correggere: colorato, col punto d'informazione, e un clic lo spiega */
.sc-via { display:inline; padding:0; border:0; background:none; font:inherit; color:inherit;
  text-align:left; cursor:pointer; text-decoration:underline dotted;
  text-decoration-thickness:1.5px; text-underline-offset:4px; }
.sc-via.vaga { color:#f5b84a; }
.sc-via.ko { color:#ff7b72; }
.sc-via:hover { filter:brightness(1.15); }
.sc-via:focus { outline:none; }
.sc-via:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:3px; border-radius:4px; }
.sc-via .infoic { width:15px; height:15px; margin-left:6px; vertical-align:-2px; }
.sc-pop { position:absolute; z-index:20; left:0; right:0; max-width:380px; padding:14px 16px 15px;
  border-radius:16px; background:rgba(22,27,35,.97); border:1px solid rgba(255,255,255,.16);
  box-shadow:0 22px 48px -12px rgba(0,0,0,.7); font-size:13.5px; line-height:1.5; color:#cfd5dd; }
.sc-pop-t { display:flex; align-items:center; gap:8px; margin-bottom:6px; font-size:14px; }
.sc-pop.vaga .sc-pop-t { color:#f5b84a; }
.sc-pop.ko .sc-pop-t { color:#ff7b72; }
.spilloic { width:16px; height:16px; flex:none; }
.sc-pop p { margin:0; }
.sc-pop .sc-pop-ric { margin-top:8px; color:#8a92a0; }
.sc-pop .sc-pop-ric b { color:#eef1f5; font-weight:600; }
.sc-pop .btn { margin-top:12px; }
/* gli allegati: pillole col nome del file */
.sc-allegati { display:flex; flex-wrap:wrap; gap:8px; }
.sc-chip { display:inline-flex; align-items:center; max-width:100%; padding:5px 12px 5px 10px;
  border-radius:999px; background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.12);
  color:#eef1f5; font-size:13px; font-weight:600; text-decoration:none; }
.sc-chip:hover { border-color:rgba(52,224,138,.45); color:#8ff5c0; }
.sc-chip .pdfic { flex:none; }
.sc-chip span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* «Carica ZIP Reolink» in fondo a destra: il messaggio a sinistra, la barra sotto */
.sc-azioni { margin-top:18px; padding-top:16px; border-top:1px solid rgba(255,255,255,.08); }
.sc-azioni .zipup { justify-content:flex-end; margin:0; }
.sc-azioni .zipmsg { margin-right:auto; }
.sc-azioni .zipmsg:empty { display:none; }
/* il riquadro «Modifica cantiere»: la pagina sotto si scurisce e non scorre */
html:has(.sc-dlg[open]) { overflow:hidden; }
.sc-dlg { width:min(660px, calc(100vw - 32px)); max-width:none; padding:0;
  max-height:calc(100vh - 48px); max-height:calc(100dvh - 48px);
  border-radius:24px; border:1px solid rgba(255,255,255,.14); background:#141922;
  color:#f4f6f8; box-shadow:0 30px 80px rgba(0,0,0,.6); overflow:hidden; }
.sc-dlg[open] { display:flex; flex-direction:column; }
.sc-dlg::backdrop { background:rgba(3,5,8,.64);
  -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); }
.sc-dlg form { display:flex; flex-direction:column; flex:1 1 auto; min-height:0; margin:0; }
.sc-dlg-testa { display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:20px 24px 14px; }
.sc-dlg-testa h2 { margin:0; font-size:20px; font-weight:800; letter-spacing:-.01em; }
.sc-x { width:38px; height:38px; padding:0; flex:none; border-radius:50%; cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center;
  border:1px solid rgba(255,255,255,.14); background:rgba(255,255,255,.06); color:#d6dbe2; }
.sc-x:hover { background:rgba(255,255,255,.12); color:#fff; }
.sc-x svg { width:16px; height:16px; }
.sc-dlg-corpo { flex:1 1 auto; min-height:0; overflow:auto; overscroll-behavior:contain;
  display:grid; align-content:start; gap:16px; padding:4px 24px 10px; }
.sc-campo { display:grid; gap:6px; min-width:0; }
.sc-lbl { font-size:12.5px; font-weight:600; color:#8a92a0; }
.sc-nota { font-size:12.5px; line-height:1.45; color:#7b8390; }
.sc-due { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:12px; }
.sc-dlg .ci-input { height:42px; box-sizing:border-box; padding:0 13px; font-size:15px; }
.sc-dlg .btn { display:inline-flex; align-items:center; justify-content:center; gap:6px;
  white-space:nowrap; }
.sc-file { display:flex; align-items:center; gap:11px; padding:9px 10px 9px 13px;
  border-radius:14px; background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.08); }
.sc-file > .pdfic { width:18px; height:18px; margin:0; flex:none; color:#8a92a0; }
.sc-file-t { flex:1 1 auto; min-width:0; display:grid; }
.sc-file-t b { font-size:13.5px; font-weight:600; color:#eef1f5; }
.sc-file-t small { font-size:12px; color:#7b8390; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.sc-file.scelto .sc-file-t small { color:#8ff5c0; }
.sc-file label.btn { flex:none; cursor:pointer; }
.sc-file label.btn:focus-within { outline:2px solid rgba(52,224,138,.7); outline-offset:2px; }
.sc-nascosto { position:absolute; width:1px; height:1px; margin:-1px; padding:0; border:0;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }
.sc-interruttore { display:grid; gap:7px; padding-top:14px; border-top:1px solid rgba(255,255,255,.08); }
.sc-interruttore .pf-switch { justify-self:start; height:34px; }
.sc-interruttore .pf-switch-lbl { font-size:13.5px; }
.sc-prom { border-top:1px solid rgba(255,255,255,.08); }
.sc-prom > summary { display:flex; align-items:center; gap:8px; padding:13px 0 4px;
  cursor:pointer; list-style:none; user-select:none; font-size:14px; font-weight:600;
  color:#dfe4ea; -webkit-tap-highlight-color:transparent; }
.sc-prom > summary::-webkit-details-marker { display:none; }
.sc-prom > summary .ripic { margin:0; color:#8a92a0; }
.sc-prom > summary small { font-size:12.5px; font-weight:400; color:#7b8390; }
.sc-prom > summary::after { content:''; margin-left:auto; width:7px; height:7px;
  border:solid #8a92a0; border-width:0 2px 2px 0; transform:translateY(-2px) rotate(45deg);
  transition:transform .15s; }
.sc-prom[open] > summary::after { transform:translateY(2px) rotate(-135deg); }
.sc-prom-corpo { display:grid; gap:12px; padding:12px 0 4px; }
.sc-prom-corpo .ci-checkline, .sc-prom-corpo .ci-vidnote { margin:0; }
.sc-prom-corpo .ci-uscita-row:last-child { margin-bottom:2px; }
.sc-prom-corpo .sc-uscita-piu { justify-self:start; }
.sc-errore { margin:6px 24px 0; padding:9px 12px; border-radius:12px; font-size:13px;
  color:#ffb3ad; background:rgba(255,90,82,.10); border:1px solid rgba(255,90,82,.3); }
.sc-dlg-piede { display:flex; justify-content:flex-end; gap:10px; margin-top:6px;
  padding:14px 24px 20px; border-top:1px solid rgba(255,255,255,.08); }
.sc-dlg-piede .btn { min-width:104px; height:40px; padding:0 18px; font-size:14px; }
@media (max-width:640px) {
  .sc-nome { font-size:22px; }
  .btn.sm.sc-modifica { width:38px; height:38px; padding:0; justify-content:center; }
  .sc-modifica span { display:none; }
  .sc-modifica svg { width:16px; height:16px; }
  .sc-meta { font-size:13.5px; }
  .sc-fatti { grid-template-columns:84px minmax(0,1fr); gap:9px 12px; font-size:14px; }
  .sc-pop { max-width:none; }
  /* dentro un timelapse (anno, mese) il telefono tiene solo l'intestazione, nome e prima
     riga: le informazioni intere stanno nella sua pagina (Antonio, 2026-10-21). Su
     computer restano dappertutto: c'e' posto */
  .scheda.sotto .sc-fatti, .scheda.sotto .sc-vuota, .scheda.sotto .sc-pop,
  .scheda.sotto .btn.sc-modifica { display:none; }
  /* sul telefono il riquadro prende tutto lo schermo, sotto la barra di iPhone */
  .sc-dlg { width:100%; height:100%; max-height:none; margin:0; inset:0;
    border:0; border-radius:0; background:#0d1117; }
  .sc-dlg-testa { padding:calc(env(safe-area-inset-top) + 12px) 18px 12px; }
  .sc-dlg-corpo { padding:4px 18px 10px; }
  .sc-due { grid-template-columns:1fr; }
  /* lo stato del promemoria sotto il titolo: accanto non ci sta */
  .sc-prom > summary { flex-wrap:wrap; row-gap:2px; }
  .sc-prom > summary small { order:3; flex:1 0 100%; padding-left:23px; }
  .sc-errore { margin:6px 18px 0; }
  .sc-dlg-piede { padding:12px 18px calc(env(safe-area-inset-bottom) + 14px); }
  .sc-dlg-piede .btn { flex:1 1 0; }
}

/* REALTIME: la diretta della camera sopra la foto del player (dal 2026-10-20). Sta
   fuori dai pezzi di CSS che finiscono nella mappa firmata dei clienti (PLAYER_CSS) */
.rt-modo { position:absolute; top:12px; left:12px; z-index:4; display:flex; gap:2px;
  padding:3px; border-radius:999px; background:rgba(10,12,16,.55);
  border:1px solid rgba(255,255,255,.16);
  backdrop-filter:blur(14px) saturate(1.4); -webkit-backdrop-filter:blur(14px) saturate(1.4); }
.rt-b { display:inline-flex; align-items:center; gap:7px; padding:6px 14px; border:0;
  border-radius:999px; background:transparent; color:rgba(236,241,246,.78);
  font:inherit; font-size:13px; font-weight:600; line-height:1.2; cursor:pointer; }
.rt-b:hover { color:#fff; }
.rt-b[aria-pressed=true] { background:rgba(255,255,255,.92); color:#0b0e13; }
.rt-b:focus { outline:none; }
.rt-b:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:1px; }
.rt-pallino { width:8px; height:8px; border-radius:50%; background:#ff453a; flex:0 0 auto; }
.rt-video { position:absolute; left:0; top:0; z-index:1; width:100%; aspect-ratio:16/9;
  object-fit:cover; background:#000; }
#tlp.rt-on #tlimg { filter:brightness(.4) saturate(.6); }
#tlp.rt-on #tlbar > :not(#rtbar):not(#tlgrande) { display:none; }
#rtbar { display:none; flex:1 1 auto; align-items:center; gap:9px; min-height:32px; }
#tlp.rt-on #rtbar { display:flex; }
#rtbar .rt-pallino { background:#8a92a0; }
#tlp.rt-diretta #rtbar .rt-pallino { background:#ff453a; animation:rt-batte 1.6s ease-in-out infinite; }
@keyframes rt-batte { 50% { box-shadow:0 0 0 4px rgba(255,69,58,.28); } }
#rtresta { margin-left:auto; color:rgba(236,241,246,.6); font-variant-numeric:tabular-nums; }
#rtvelo { position:absolute; left:0; top:0; z-index:3; width:100%; aspect-ratio:16/9;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:10px;
  padding:0 28px; box-sizing:border-box; text-align:center; color:#f4f6f8; }
#rtvelo .tl-spinner { display:none; width:28px; height:28px; border:3px solid rgba(255,255,255,.18);
  border-top-color:#2ad675; border-radius:50%; animation:spin .8s linear infinite; }
#rtvelo.gira .tl-spinner { display:block; }
#rtmsg { font-size:16px; font-weight:700; text-shadow:0 1px 8px rgba(0,0,0,.6); }
#rtnota { max-width:440px; font-size:13px; color:rgba(236,241,246,.8);
  text-shadow:0 1px 6px rgba(0,0,0,.6); }
#rtnota:empty { display:none; }
#rtmsg:empty { display:none; }
/* la pausa allo scadere (LIVE_DURATA): l'ultimo fotogramma scurito e «Riattiva» al centro */
.rt-video.fermo { filter:brightness(.35) saturate(.6); }
#rtvelo.pausa { background:rgba(7,9,13,.3); }
#rtvelo.pausa #rtazione { padding:12px 28px; font-size:15px; font-weight:700; }
/* la demo: l'ora della «camera» in alto a destra, che scorre come quella che le
   camere vere scrivono sul video */
.rt-osd { position:absolute; top:13px; right:14px; z-index:2; display:none; pointer-events:none;
  font:600 13px/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-variant-numeric:tabular-nums; letter-spacing:.03em; color:#fff;
  text-shadow:0 0 2px #000, 0 1px 3px rgba(0,0,0,.85); }
#tlp.rt-diretta .rt-osd { display:block; }
/* «Avanzate» in Elaborazione (dal 2026-10-21, Antonio): i video, e il Realtime con
   l'account Reolink, separati da un filo; un solo «Salva» in fondo. Autodelete e durata
   hanno la stessa larghezza, e stanno in colonna */
.av-gruppo h4 { margin:0 0 14px; font-size:13px; font-weight:700; color:#e8eaed; }
.av-gruppo + .av-gruppo { margin-top:24px; padding-top:22px; border-top:1px solid #2a2d35; }
.av-gruppo .field.corto { flex:0 1 190px; }
.av-nota { margin-top:12px; font-size:13px; line-height:1.55; color:#8a92a0; }
.av-salva { display:flex; justify-content:flex-end; margin-top:22px; }
@media (prefers-reduced-motion: reduce) {
  #tlp.rt-diretta #rtbar .rt-pallino { animation:none; }
}
@media (max-width:640px) {
  .rt-modo { top:8px; left:8px; }
  .rt-osd { top:11px; right:10px; font-size:11px; }
  .rt-b { padding:5px 11px; font-size:12px; }
  #rtvelo { padding:0 16px; gap:8px; }
  #rtmsg { font-size:15px; }
  #rtnota { font-size:12px; }
}

/* PLAYER INGRANDITO (dal 2026-10-21, Antonio: «un tasto per fare espandere
   l'anteprima del timelapse e del realtime»). Il pulsante sta in fondo a destra nella
   barra. Su computer il player si apre in un riquadro grande al centro; sul telefono,
   e con la finestra bassa (telefono girato), a tutto schermo su nero. E' lo stesso
   player, spostato e ingrandito: timelapse e diretta non si fermano. La misura la
   calcola GRANDE_JS: la foto 16:9 piu' la barra, la piu' grande che entra. Sta fuori
   dai pezzi di CSS della mappa firmata dei clienti (PLAYER_CSS) */
#tlgrande { flex:none; margin-left:auto; display:inline-flex; align-items:center;
  justify-content:center; width:32px; height:32px; padding:0; border-radius:50%;
  border:1px solid rgba(255,255,255,.14); background:transparent;
  color:rgba(236,241,246,.8); cursor:pointer;
  transition:border-color .15s, color .15s, background .15s; }
#tlgrande:hover { border-color:#2ad675; color:#2ad675; }
#tlgrande:focus { outline:none; }
#tlgrande:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:2px; }
#tlgrande svg { width:16px; height:16px; display:block; }
#tlgrande .tl-riduci, #tlp.tl-grande #tlgrande .tl-ingrandisci { display:none; }
#tlp.tl-grande #tlgrande .tl-riduci { display:block; }
#tlchiudi { display:none; }
/* il contatore su una riga sola. Sui telefoni stretti, col pulsante in piu', «fps»
   non ci sta: via la scritta (i tre numeri accanto al play si capiscono da soli),
   altrimenti con quattro cifre («1234 / 9442») il contatore andava a capo */
#tlcnt { white-space:nowrap; }
@media (max-width:400px) {
  #tlbar { gap:8px; }
  #tlspeedlbl { display:none; }
}
@media (max-width:340px) {
  #tlbar { gap:6px; padding-left:10px; padding-right:10px; }
  .tlfps { padding-left:6px; padding-right:6px; }
}
.tl-fondo { position:fixed; inset:0; z-index:110; opacity:0; transition:opacity .24s ease;
  background:rgba(4,6,9,.8);
  -webkit-backdrop-filter:blur(16px) saturate(120%); backdrop-filter:blur(16px) saturate(120%);
  padding:calc(env(safe-area-inset-top) + 32px) calc(env(safe-area-inset-right) + 32px)
          calc(env(safe-area-inset-bottom) + 32px) calc(env(safe-area-inset-left) + 32px);
  touch-action:none; }
.tl-fondo.su { opacity:1; }
/* dietro, la pagina non scorre */
html.tl-grande-su { overflow:hidden; overscroll-behavior:none; }
#tlp.tl-grande { position:fixed; z-index:111; margin:0; max-width:none; min-width:0;
  flex:none; transform-origin:0 0; touch-action:none;
  box-shadow:0 40px 110px -20px rgba(0,0,0,.9); }
#tlp.tl-grande #tlchiudi { position:absolute; top:12px; right:12px; z-index:6; display:flex;
  align-items:center; justify-content:center; width:40px; height:40px; padding:0;
  border-radius:50%; border:1px solid rgba(255,255,255,.2); background:rgba(10,12,16,.55);
  color:#f4f6f8; cursor:pointer;
  -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px); }
#tlp.tl-grande #tlchiudi:hover { background:rgba(10,12,16,.78); }
#tlp.tl-grande #tlchiudi:focus { outline:none; }
#tlp.tl-grande #tlchiudi:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:2px; }
#tlchiudi svg { width:15px; height:15px; display:block; }
/* la demo: l'ora della «camera» si sposta a sinistra della X */
#tlp.tl-grande .rt-osd { top:26px; right:66px; }
/* il contatore e «fps» piu' chiari: qui la barra sta sul nero, o sopra la foto */
#tlp.tl-grande #tlcnt, #tlp.tl-grande #tlspeedlbl, #tlp.tl-grande #rtresta {
  color:rgba(236,241,246,.68); }
/* in pausa, ingrandito: la foto vera sopra l'anteprima da 540 (GRANDE_JS) */
.tl-nitida { position:absolute; left:0; top:0; z-index:1; width:100%; aspect-ratio:16/9;
  object-fit:cover; display:block; opacity:0; transition:opacity .2s; pointer-events:none; }
.tl-nitida.pronta { opacity:1; }
#tlp.rt-on .tl-nitida { display:none; }
/* nel riquadro grande del computer, anche i testi della diretta piu' grandi */
@media (min-width:641px) and (min-height:501px) {
  #tlp.tl-grande #rtmsg { font-size:20px; }
  #tlp.tl-grande #rtnota { max-width:520px; font-size:14.5px; }
}
/* telefono, o finestra bassa: a tutto schermo, su nero, coi comandi piu' grandi */
@media (max-width:640px), (max-height:500px) {
  .tl-fondo { background:#000; -webkit-backdrop-filter:none; backdrop-filter:none;
    padding:env(safe-area-inset-top) env(safe-area-inset-right)
            env(safe-area-inset-bottom) env(safe-area-inset-left); }
  #tlp.tl-grande { border:0; border-radius:0; box-shadow:none; background:#000; }
  #tlp.tl-grande #tlbar { background:#000; border-top:0; padding:10px 12px; }
  #tlp.tl-grande #tlgrande { width:36px; height:36px; }
}
/* telefono girato: la barra sta sopra la foto, che cosi' prende tutta l'altezza */
@media (max-height:500px) {
  #tlp.tl-grande #tlbar { position:absolute; left:0; right:0; bottom:0; z-index:4;
    padding:30px 16px 10px; text-shadow:0 1px 3px rgba(0,0,0,.8);
    background:linear-gradient(rgba(0,0,0,0), rgba(0,0,0,.55) 45%, rgba(0,0,0,.85)); }
  #tlp.tl-grande .tlfps:not([data-sel]), #tlp.tl-grande #tlgrande {
    background:rgba(10,12,16,.55); border-color:rgba(255,255,255,.22); }
  #tlp.tl-grande .tl-ai { bottom:66px; }
}
@media (prefers-reduced-motion:reduce) { .tl-fondo, .tl-nitida { transition:none; } }

/* ===================== MOBILE / PWA ===================== */
/* i comandi della mappa in home col carattere della galleria: le loro regole stanno nel
   pezzo di CSS che finisce anche nella mappa firmata dei clienti (MAPPA_CSS), che resta
   col carattere di sistema, per non far scaricare niente ai visitatori del loro sito */
.mapwrap .leaflet-bar a, .mp-torna, .mp-bordo i { font-family:inherit; }

@media (max-width:640px) {
  .tl-ai { right:8px; bottom:8px; padding:3px 9px 3px 7px; font-size:11px; }
  /* lavori finiti: info, foto e comandi uno sotto l'altro */
  .pf-main { gap:12px; }
  .pf-info, .pf-slots, .pf-act { flex-basis:100%; }
  .pf-slots { overflow-x:auto; padding-bottom:2px; }
  .pf-act { justify-content:space-between; }
  .pf-nuove { gap:10px; }
  .pf-nuova .pf-slot { width:96px; height:58px; }
  #tlmap { height:min(var(--map-h,420px),280px); }  /* su telefono non deve rubare tutto */
  .mapwrap { border-radius:24px; }
  .mapwrap + h2.sec { margin-top:28px; }
  /* i pulsanti dello zoom un po' piu' piccoli che su computer (Antonio, 2026-10-01:
     «di poco»): 38x36 invece di 44x42 */
  .mapwrap .leaflet-control-zoom { margin:14px 0 0 14px; border-radius:19px; }
  .mapwrap .leaflet-bar a { width:38px; height:36px; line-height:36px; font-size:19px; }
  .mp-nome { display:none; }          /* le etichette si sovrappongono: resta il tocco */
  header { padding:10px 10px 0; }
  header > .hinner { height:60px; padding:0 8px 0 18px; gap:10px; border-radius:22px; }
  .logo-svg { height:27px; }
  .hbtn { width:42px; height:42px; }
  .htrash { min-width:42px; padding:0 11px; }
  .hdisk { display:none; }            /* niente posto: il disco sta in cima alle Impostazioni */
  .disco-tel { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:0 0 14px;
               padding:10px 16px 10px 10px; border-radius:18px; font-size:13px;
               background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.12); }
  .disco-tel b { font-weight:700; color:#f4f6f8; }
  .disco-tel span { color:rgba(236,241,246,.62); font-weight:600; }
  .hactions { gap:6px; }
  header .subbar { margin-top:10px; padding:0 4px; }
  .crumbs { font-size:13px; }
  main { padding:16px 13px 30px; }
  h2.sec { font-size:20px; margin:26px 0 12px; }
  h2.day { margin:18px 0 9px; }
  /* griglie: anteprime più piccole, cartelle/camere a colonna singola */
  .grid { grid-template-columns:repeat(auto-fill,minmax(106px,1fr)); gap:6px; }
  .vcells { grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); }
  .dirs, .camgrid { grid-template-columns:1fr; }
  /* player timelapse: impilato (anteprima sopra, info sotto) con più respiro */
  #tlwrap { flex-direction:column; align-items:stretch; gap:22px; margin-bottom:26px; }
  #tlp { margin-bottom:2px; }
  /* flex:0 0 auto: in colonna la base di 260px pensata per la larghezza diventava
     un'altezza minima, ~40px vuoti sotto le info; e l'ultimo margine non serve */
  #tlinfo { flex:0 0 auto; min-width:0; padding-top:2px; }
  #tlinfo > :last-child { margin-bottom:0; }
  /* impostazioni */
  .settings-wrap { margin:-6px auto 12px; }
  .settings-card { padding:18px 15px; border-radius:12px; }
  /* in «Avanzate» anche le due tendine a tutta larghezza, come i campi accanto */
  .av-gruppo .field.corto { flex:1 1 100%; }
  .settings-card h3 { margin-bottom:16px; }
  .tabbar { gap:0; flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .tab { padding:10px 13px; font-size:13px; white-space:nowrap; }
  /* la scheda di un cantiere senza anteprima: la card a se' */
  .scheda.sola { padding:16px 15px; }
  /* utenti: i pulsanti vanno sotto il nome, che altrimenti resta schiacciato, e
     prendono tutta la riga in colonne pari; quello che non ci sta va a capo intero,
     e il cestino resta tondo (dal 2026-10-01: prima andavano a capo a meta' e
     restavano storti, «fa schifo», Antonio). La base 0 fa colonne uguali, il
     nowrap impedisce che una scritta si spezzi in due righe dentro il pulsante */
  .urow-main { flex-wrap:wrap; row-gap:11px; }
  .urow-id { flex-basis:100%; }
  .urow-act { margin-left:0; flex:1 1 100%; min-width:0; flex-wrap:wrap; gap:8px; }
  .urow-act > * { flex:1 1 0; }
  .urow-act > .camdel, .urow-act > .urow-lock { flex:0 0 auto; }
  .urow-act .urow-mappa { margin:0; }
  .urow-act .urow-mappa .pf-switch { flex:1; justify-content:center; }
  /* .btn.sm: la stessa forza di «.settings-card .btn.sm», che li vuole da 30 */
  .urow-act .btn.sm, .urow-act .pf-switch { height:36px; white-space:nowrap; }
  .urow-act .btn.sm.camdel { width:36px; padding:0; }
  .urow-pw, .urow-cams-form { margin-left:0; }
  .demo-griglia.accesso { grid-template-columns:1fr; }
  .aspetto-griglia { grid-template-columns:1fr; }
  .aspetto-griglia .field-act { order:9; }
  .demo-griglia.accesso .field-act { justify-self:start; }
  .apribile[open] > summary { margin-bottom:16px; }
  .uadd.apribile[open] > summary { margin-bottom:12px; }
  /* log FTP: l'azione va a capo su riga stretta */
  .ftprow { flex-wrap:wrap; gap:3px 10px; }
  .ftprow .ft-act { flex-basis:100%; order:5; }
  .ftprow .ft-user { min-width:0; }
  /* i dati FTP del rivenditore: l'etichetta sopra, valore e «Copia» sotto, a tutta
     larghezza (accanto, il nome del server andava a capo a meta') */
  .ftpa-dati { grid-template-columns:minmax(0,1fr); gap:0; }
  .ftpa-dati dt { margin-top:12px; }
  .ftpa-dati dt:first-child { margin-top:0; }
  .ftpa-dati dd { justify-content:space-between; }
  .ftpu-nome { min-width:0; flex-basis:100%; }
  .riceve-mail { flex-basis:100%; order:5; padding-left:40px; }
  .urow-riv { flex-basis:100%; }
  /* lightbox foto/video */
  #lb .bar, #vlb .bar { padding:9px 11px; font-size:13px; gap:7px; }
  #lbcap, #vlbcap { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
  #lb .dl, #lb .x, #vlb .dl, #vlb .x { padding:6px 9px; font-size:13px; }
  #lb .nav { font-size:24px; padding:8px 11px; }
  #lb #prev { left:6px; } #lb #next { right:6px; }
  /* login: la card sta al centro come su computer (in basso, a foglio, non
     piaceva ad Antonio); sotto resta il posto per i credits */
  .lg .login-wrap { padding:calc(env(safe-area-inset-top) + 24px) calc(env(safe-area-inset-right) + 14px)
                            calc(env(safe-area-inset-bottom) + 64px) calc(env(safe-area-inset-left) + 14px); }
  .login-card { padding:26px 20px 22px; border-radius:32px; }
  .login-logo .logo-svg { height:38px; }
  .login-sub { margin-bottom:22px; }
  /* i credits in basso a destra come su computer, sopra la barra di iPhone */
  .lg-foot { bottom:calc(env(safe-area-inset-bottom) + 20px);
             padding:0 calc(env(safe-area-inset-right) + 20px) 0 calc(env(safe-area-inset-left) + 20px);
             justify-content:flex-end; }
  .lg-chip { display:none; }
  /* vetro piu' leggero su telefono: lo sfocato resta solo su header e login
     (pochi elementi); card e celle diventano piu' coprenti, senza blur */
  .dir, .camcard, .cell, .vcell, .settings-card, .scheda.sola, #tlp, .tabbar,
  #lb .bar, #vlb .bar { backdrop-filter:none; -webkit-backdrop-filter:none; }
  .camcard, .settings-card, .dir, .scheda.sola {
    background:linear-gradient(160deg,rgba(255,255,255,.1),rgba(255,255,255,.03) 45%,
               rgba(255,255,255,.05)), rgba(20,24,31,.82); }
}
/* schermi bassi (telefono girato, finestre basse): la card si stringe e il riquadro
   del timelapse in basso a sinistra non c'e', cosi' tutto sta nello schermo senza
   scorrere; resta «© Lynx», nell'angolo, dove la card non arriva */
@media (max-height:560px) {
  .lg .login-wrap { padding-top:calc(env(safe-area-inset-top) + 12px);
                    padding-bottom:calc(env(safe-area-inset-bottom) + 12px); }
  .lg .login-card { padding:18px 24px 16px; border-radius:26px; }
  .lg .login-logo { margin-bottom:14px; }
  .lg .login-logo .logo-svg { height:30px; }
  .lg .login-sub { display:none; }
  .lg .login-err { margin-bottom:10px; padding:8px 12px; }
  .lg .login-field { margin-bottom:10px; }
  .lg .login-input { height:46px; }
  .lg .lg-go { margin-top:14px; height:48px; }
  .lg-chip { display:none; }
  .lg-foot { bottom:calc(env(safe-area-inset-bottom) + 14px); justify-content:flex-end; }
}
/* RIQUADRI PICCOLI (dal 2026-10-21): «Aggiungi Timelapse» e la guida «Installa
   l'app». L'aspetto di «Modifica cantiere» (.sc-dlg), ma restano un riquadro anche sul
   telefono: un campo solo, o una guida da tenere aperta mentre si tocca Safari */
.sc-dlg.compatto { width:min(460px, calc(100vw - 24px)); }
.nc-dlg .sc-errore { margin:0; }
@media (max-width:640px) {
  /* fit-content e non auto: con inset:0, auto lo stirerebbe a tutto schermo */
  .sc-dlg.compatto { width:calc(100vw - 24px); height:-webkit-fit-content; height:fit-content;
    max-height:calc(100dvh - 32px);
    margin:auto; inset:0; border:1px solid rgba(255,255,255,.14); border-radius:24px;
    background:#141922; }
  .sc-dlg.compatto .sc-dlg-testa { padding:18px 18px 12px; }
  .sc-dlg.compatto .sc-dlg-piede { padding:12px 18px 16px; }
  /* col campo da scrivere, in alto: la tastiera del telefono non lo copre */
  .sc-dlg.compatto.in-alto { margin:calc(env(safe-area-inset-top) + 14px) auto auto; }
}

/* INSTALLA L'APP (dal 2026-10-21, Antonio): nel login e nelle Impostazioni, solo sul
   telefono e solo nel browser, mai nella web app installata (INSTALLA_JS). Android la
   installa col suo riquadro; l'iPhone non lo permette, e c'e' la guida coi passi */
.lg-installa { pointer-events:auto; display:inline-flex; align-items:center; gap:10px;
  height:40px; padding:0 16px 0 6px; margin-right:auto; border-radius:999px; cursor:pointer;
  font:inherit; font-size:13.5px; font-weight:700; color:#f4f6f8;
  border:1px solid rgba(255,255,255,.16); background:rgba(12,15,20,.5);
  -webkit-backdrop-filter:blur(18px) saturate(160%); backdrop-filter:blur(18px) saturate(160%); }
.lg-installa:hover { border-color:rgba(52,224,138,.55); }
.lg-installa:focus { outline:none; }
.lg-installa:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:2px; }
.ins-ic { width:28px; height:28px; border-radius:8px; display:block; flex:none; }
.ins-card { display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.ins-card .ins-ic { width:46px; height:46px; border-radius:12px; }
.ins-card-t { flex:1 1 200px; min-width:0; }
.ins-card-t b { display:block; font-size:15px; color:#f4f6f8; }
.ins-card-t span { display:block; margin-top:3px; font-size:13px; line-height:1.45; color:#8a92a0; }
.ins-dlg .sc-dlg-testa { justify-content:flex-start; gap:14px; }
.ins-dlg .sc-dlg-testa .sc-x { margin-left:auto; align-self:flex-start; }
.ins-dlg .sc-dlg-testa .ins-ic { width:46px; height:46px; border-radius:12px; }
.ins-sotto { margin:4px 0 0; font-size:13px; line-height:1.4; color:#8a92a0; }
.ins-passi { list-style:none; margin:0; padding:0; display:grid; gap:15px; counter-reset:passo; }
.ins-passi li { display:grid; grid-template-columns:28px minmax(0,1fr); gap:12px; align-items:start;
  font-size:14.5px; line-height:1.55; color:#e8eaed; counter-increment:passo; }
.ins-passi li::before { content:counter(passo); width:28px; height:28px; border-radius:50%;
  display:flex; align-items:center; justify-content:center; font-size:13px; font-weight:800;
  color:#03140b; background:var(--grn); }
.ins-passi b { font-weight:700; color:#fff; }
.ins-passi small { display:block; margin-top:4px; font-size:12.5px; line-height:1.45; color:#8a92a0; }
/* i pulsanti di Safari come li si vede in basso: bianchi su un quadratino scuro */
/* i margini negativi in verticale: la riga col pulsante resta alta come le altre */
.ins-k { display:inline-flex; align-items:center; justify-content:center; width:26px; height:26px;
  margin:-4px 1px; vertical-align:-8px; border-radius:8px; color:#fff;
  background:rgba(255,255,255,.1); border:1px solid rgba(255,255,255,.18); }
.ins-k svg { width:15px; height:15px; display:block; }
/* l'interruttore «Apri come app web», acceso, col verde di iOS */
.ins-sw { display:inline-block; position:relative; width:30px; height:18px; margin:0 1px;
  vertical-align:-4px; border-radius:999px; background:#34c759; }
.ins-sw::after { content:''; position:absolute; top:2px; right:2px; width:14px; height:14px;
  border-radius:50%; background:#fff; }
.ins-altro p { margin:0 0 12px; font-size:14.5px; line-height:1.55; color:#e8eaed; }
.ins-url { display:flex; align-items:center; gap:10px; padding:7px 7px 7px 13px;
  border-radius:14px; background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.1); }
.ins-url code { flex:1; min-width:0; overflow-wrap:anywhere; font-size:13.5px; color:#e8eaed;
  user-select:all; }

/* ORDINA I TIMELAPSE (home, dal 2026-10-21, Antonio: «tastino in stile, sobrio,
   elegante»), a destra del titolo «Timelapse»: per data di aggiunta (di partenza),
   stato, grandezza e nome, e la freccia per la direzione. Solo nella pagina: non si
   salva (ORDINA_JS) */
/* filtri e ordine stanno a destra del titolo; il margine negativo: la riga del
   titolo resta alta com'era */
.sec-strumenti { margin:-4px 0 -4px auto; display:inline-flex; align-items:center; gap:12px; }
/* z-index: lo sfocato fa della pillola un livello a se', e senza le card dopo le
   passerebbero sopra col menu aperto (sotto l'header, che e' a 50) */
.ordina { position:relative; z-index:30; display:inline-flex;
  align-items:center; height:34px; padding:2px; border-radius:999px; font-size:13px;
  font-weight:600;
  letter-spacing:0; background:rgba(14,17,22,.55); border:1px solid rgba(255,255,255,.1);
  -webkit-backdrop-filter:blur(18px) saturate(160%); backdrop-filter:blur(18px) saturate(160%); }
.ordina button { font:inherit; color:rgba(236,241,246,.82); background:transparent; border:0;
  cursor:pointer; }
.ordina button:hover { color:#fff; }
.ordina button:focus { outline:none; }
.ordina button:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:1px; }
.ord-scelta { display:inline-flex; align-items:center; gap:6px; height:28px; padding:0 8px 0 13px;
  border-radius:999px; white-space:nowrap; }
.ord-scelta:hover, .ord-dir:hover { background:rgba(255,255,255,.07); }
.ord-scelta svg { width:13px; height:13px; opacity:.65; transition:transform .2s; }
.ord-scelta[aria-expanded=true] svg { transform:rotate(180deg); }
.ord-dir { position:relative; width:30px; height:28px; border-radius:999px; display:inline-flex;
  align-items:center; justify-content:center; }
.ord-dir::before { content:''; position:absolute; left:-1px; top:7px; bottom:7px; width:1px;
  background:rgba(255,255,255,.13); }
.ord-dir svg { width:15px; height:15px; transition:transform .22s; }
.ord-dir[data-dir=asc] svg { transform:rotate(180deg); }
.ord-menu { position:absolute; right:0; top:calc(100% + 8px); z-index:20; min-width:206px;
  padding:6px; border-radius:16px; background:rgba(16,19,25,.94);
  border:1px solid rgba(255,255,255,.12); box-shadow:0 18px 50px -12px rgba(0,0,0,.85);
  -webkit-backdrop-filter:blur(24px) saturate(160%); backdrop-filter:blur(24px) saturate(160%); }
.ord-menu button { display:flex; align-items:center; gap:10px; width:100%; height:38px;
  padding:0 12px; border-radius:10px; text-align:left; font-size:13.5px; font-weight:600; }
.ord-menu button:hover, .ord-menu button:focus-visible { background:rgba(255,255,255,.08);
  outline:none; }
.ord-menu svg { width:15px; height:15px; flex:none; color:#34e08a; visibility:hidden; }
.ord-menu button[aria-checked=true] { color:#fff; }
.ord-menu button[aria-checked=true] svg { visibility:visible; }
@media (max-width:640px) {
  .ordina { height:32px; font-size:12.5px; }
  .ord-scelta { height:26px; padding:0 7px 0 11px; }
  .ord-dir { height:26px; width:28px; }
}
/* i telefoni piu' stretti (320): il titolo e il selettore stanno ancora in una riga */
@media (max-width:360px) {
  h2.sec:has(.ordina) { gap:7px; }
  .ordina { font-size:12px; }
  .ord-scelta { gap:4px; padding:0 5px 0 9px; }
  .ord-dir { width:26px; }
}
@media (prefers-reduced-motion:reduce) { .ord-scelta svg, .ord-dir svg { transition:none; } }
/* FILTRI DELLA HOME (dal 2026-10-21, Antonio: «solo desktop… tag per filtrare i
   cantieri, sempre belli»), a sinistra dell'ordine: Attivo, Fermo e Concluso, coi
   colori della pillola sulle card e quanti sono. Se ne accendono anche due o tre;
   senza nessuno acceso si vedono tutti. Solo nella pagina, come l'ordine (ORDINA_JS) */
.filtri { display:inline-flex; align-items:center; gap:6px; }
.filtro { --fc:138,146,160; display:inline-flex; align-items:center; gap:8px; height:34px;
  padding:0 6px 0 13px; border-radius:999px; font:inherit; font-size:13px; font-weight:600;
  letter-spacing:0; color:rgba(236,241,246,.82); cursor:pointer;
  background:rgba(14,17,22,.55); border:1px solid rgba(255,255,255,.1);
  -webkit-backdrop-filter:blur(18px) saturate(160%); backdrop-filter:blur(18px) saturate(160%);
  transition:background-color .18s, border-color .18s, color .18s; }
.filtro.ok { --fc:52,224,138; }
.filtro.ko { --fc:255,90,82; }
.filtro.done { --fc:91,157,255; }
.filtro i { width:8px; height:8px; border-radius:50%; flex-shrink:0; background:rgb(var(--fc));
  transition:box-shadow .18s; }
.filtro b { min-width:22px; height:22px; padding:0 7px; border-radius:999px;
  display:inline-flex; align-items:center; justify-content:center; font-size:11.5px;
  font-weight:700; font-variant-numeric:tabular-nums; color:rgba(236,241,246,.75);
  background:rgba(255,255,255,.08); transition:background-color .18s, color .18s; }
.filtro:hover:not(:disabled) { color:#fff; background:rgba(36,41,50,.62);
  border-color:rgba(255,255,255,.2); }
.filtro:focus { outline:none; }
.filtro:focus-visible { outline:2px solid rgba(52,224,138,.7); outline-offset:2px; }
.filtro[aria-pressed=true] { color:#fff; background:rgba(var(--fc),.17);
  border-color:rgba(var(--fc),.6); }
.filtro[aria-pressed=true]:hover:not(:disabled) { background:rgba(var(--fc),.24);
  border-color:rgba(var(--fc),.6); }
.filtro[aria-pressed=true] i { box-shadow:0 0 0 3px rgba(var(--fc),.28); }
.filtro[aria-pressed=true] b { color:#fff; background:rgba(var(--fc),.3); }
.filtro:disabled { opacity:.38; cursor:default; }
/* solo su computer: sul telefono la riga del titolo ha posto per l'ordine e basta */
@media (max-width:900px) { .filtri { display:none; } }
@media (prefers-reduced-motion:reduce) { .filtro, .filtro i, .filtro b { transition:none; } }

@media (display-mode:standalone) {
  /* da PWA installata: la capsula scende sotto la status bar iOS */
  header { padding-top:calc(env(safe-area-inset-top) + 10px); }
}
