/* ============================================================
   MODULO SERVIZI — catalogo di ciò che si vende.
   Densità informativa prima della decorazione: chi usa questa
   schermata configura progetti tutto il giorno e deve poter
   confrontare otto servizi senza scorrere.
   ============================================================ */

/* ---- Barra strumenti ---- */
.sv-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
.sv-search{display:flex;align-items:center;gap:7px;background:var(--card);border:1px solid var(--border);
  border-radius:10px;padding:8px 12px;font-size:13px;width:300px;max-width:100%;}
.sv-search:focus-within{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft);}
.sv-search svg{width:14px;height:14px;color:var(--muted);flex-shrink:0;}
.sv-search input{border:none;outline:none;background:transparent;font-size:13px;width:100%;
  color:var(--text);font-family:inherit;}
.sv-search .sv-clear{width:18px;height:18px;border-radius:50%;border:none;background:var(--track);
  color:var(--muted);display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;}
.sv-search .sv-clear svg{width:10px;height:10px;}
.sv-spacer{margin-left:auto;}

/* ---- Tabella densa ---- */
.sv-table{width:100%;border-collapse:collapse;font-size:13px;}
.sv-table th{text-align:left;font-size:10.5px;text-transform:uppercase;letter-spacing:.3px;
  color:var(--muted);font-weight:700;padding:8px 10px;border-bottom:1px solid var(--border);white-space:nowrap;}
.sv-table td{padding:9px 10px;border-bottom:1px solid var(--border);vertical-align:middle;}
.sv-table tr:last-child td{border-bottom:none;}
.sv-table tbody tr{cursor:pointer;}
.sv-table tbody tr:hover{background:var(--hover);}
.sv-table th.num,.sv-table td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;}
.sv-table th.sortable{cursor:pointer;}
.sv-table th.sortable:hover{color:var(--text);}
.sv-table th .sv-sortmark{opacity:.55;font-weight:700;}
.sv-name{font-weight:700;font-size:13.5px;display:flex;align-items:center;gap:8px;}
.sv-name-sub{font-size:11.5px;color:var(--muted);margin-top:3px;max-width:52ch;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sv-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.sv-price b{font-weight:700;}
.sv-price span{display:block;font-size:11px;color:var(--muted);font-weight:600;margin-top:2px;}
.sv-row-archived{opacity:.55;}

/* Margine: la barra è il dato, la percentuale la conferma. Sotto soglia
   cambia colore perché è una decisione da prendere, non un'informazione. */
.sv-margin{display:flex;flex-direction:column;gap:4px;min-width:104px;}
.sv-margin-top{display:flex;align-items:baseline;justify-content:space-between;gap:8px;}
.sv-margin-pct{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;}
.sv-margin-abs{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums;}
.sv-bar{height:5px;border-radius:5px;background:var(--track);overflow:hidden;}
.sv-bar>i{display:block;height:100%;border-radius:5px;background:var(--primary);}
.sv-margin.ok .sv-margin-pct{color:var(--primary-dark);}
.sv-margin.low .sv-margin-pct{color:var(--red-dark);}
.sv-margin.low .sv-bar>i{background:var(--red);}
.sv-flag{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:700;
  background:var(--red-soft);color:var(--red-dark);border-radius:6px;padding:2px 7px;white-space:nowrap;}
.sv-flag svg{width:11px;height:11px;}

/* ---- Vista a griglia ---- */
.sv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(288px,1fr));gap:12px;}
.sv-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:15px 16px;cursor:pointer;display:flex;flex-direction:column;gap:10px;}
.sv-card:hover{border-color:var(--primary);}
.sv-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;}
.sv-card-title{font-size:14px;font-weight:700;letter-spacing:-.2px;}
.sv-card-desc{font-size:12px;color:var(--muted);line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.sv-card-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;}
.sv-card-stat .k{font-size:10px;text-transform:uppercase;letter-spacing:.3px;color:var(--muted);font-weight:700;}
.sv-card-stat .v{font-size:13.5px;font-weight:700;margin-top:2px;font-variant-numeric:tabular-nums;}
.sv-card-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;
  border-top:1px solid var(--border);padding-top:10px;font-size:11.5px;color:var(--muted);font-weight:600;}

/* ---- Intestazione del pannello ---- */
.sv-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;}
.sv-head-main{min-width:0;}
.sv-head-title{display:flex;align-items:center;gap:10px;font-size:19px;font-weight:700;letter-spacing:-.3px;}
.sv-head-title input{font-size:19px;font-weight:700;letter-spacing:-.3px;border:1px solid transparent;
  background:transparent;border-radius:8px;padding:3px 7px;margin:-3px -7px;font-family:inherit;
  color:var(--text);width:min(520px,60vw);}
.sv-head-title input:hover{border-color:var(--border);}
.sv-head-title input:focus{outline:none;border-color:var(--primary);background:var(--card);box-shadow:0 0 0 3px var(--primary-soft);}
.sv-head-meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:9px;}
.sv-head-actions{display:flex;align-items:center;gap:6px;flex-shrink:0;}

/* ---- Blocchi del pannello ---- */
.sv-block{border:1px solid var(--border);border-radius:12px;padding:14px 16px;margin-bottom:14px;background:var(--card);}
.sv-block-head{display:flex;align-items:center;gap:9px;justify-content:space-between;margin-bottom:12px;}
.sv-block-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;}
.sv-block-title svg{width:15px;height:15px;color:var(--primary-dark);}
.sv-block-title .cnt{font-size:11px;font-weight:700;color:var(--muted);background:var(--bg);
  border:1px solid var(--border);border-radius:6px;padding:1px 7px;}
.sv-hint{font-size:11.5px;color:var(--muted);line-height:1.5;margin:0 0 12px 0;}
.sv-hint strong{color:var(--text);font-weight:700;}
.sv-hint.tight{margin-bottom:0;}

/* Filtri dentro un blocco del pannello: stessi chip della pagina, senza il
   margine che serve solo quando stanno sopra una tabella. */
.sv-filters{margin-bottom:0;gap:6px;}
.sv-filters .qf-chip{padding:4px 10px;font-size:11.5px;gap:5px;}
.qf-count{font-size:10.5px;font-weight:700;color:var(--muted);background:var(--bg);
  border-radius:20px;padding:0 6px;font-variant-numeric:tabular-nums;}
.qf-chip.active .qf-count{background:rgba(255,255,255,.28);color:var(--on-accent);}

/* ---- Editor degli step ---- */
.sv-step{border:1px solid var(--border);border-radius:11px;margin-bottom:8px;background:var(--card);}
.sv-step.recurring{background:var(--field);}
.sv-step.drag-over{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft);}
.sv-step-head{display:grid;grid-template-columns:16px 26px minmax(0,1fr) 146px 62px 62px 76px 58px;
  align-items:center;gap:8px;padding:8px 10px;}
/* Aperti, gli step diventano blocchi alti e uno finiva dove cominciava il
   successivo. La riga del titolo prende un fondo piu' caldo: fa da testata e
   dice a colpo d'occhio dove ricomincia il conto. Da chiusi non serve, sono
   gia' righe separate. */
.sv-step.open{margin-bottom:12px;}
.sv-step.open > .sv-step-head{background:var(--hover);border-radius:10px 10px 0 0;}
.sv-grip{width:14px;height:14px;color:var(--dim);cursor:grab;}
.sv-num{width:24px;height:24px;border-radius:50%;background:var(--primary-soft);color:var(--primary-dark);
  display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;}
.sv-step-title{min-width:0;border:1px solid transparent;background:transparent;border-radius:8px;
  padding:5px 8px;font-size:13px;font-weight:600;font-family:inherit;color:var(--text);width:100%;}
.sv-step-title:hover{border-color:var(--border);}
.sv-step-title:focus{outline:none;border-color:var(--primary);background:var(--card);}
.sv-num-input{width:100%;border:1px solid var(--border);border-radius:8px;padding:5px 7px;font-size:12.5px;
  font-family:inherit;text-align:right;font-variant-numeric:tabular-nums;background:var(--field);color:var(--text);}
.sv-num-input:focus{outline:none;border-color:var(--primary);background:var(--card);}
.sv-unit{position:relative;}
.sv-unit::after{content:attr(data-unit);position:absolute;right:8px;top:50%;transform:translateY(-50%);
  font-size:10.5px;color:var(--muted);font-weight:600;pointer-events:none;}
.sv-unit .sv-num-input{padding-right:22px;}
.sv-unit.wide .sv-num-input{text-align:left;padding-right:34px;}
.sv-step-flags{display:flex;align-items:center;justify-content:flex-end;gap:4px;}
.sv-flag-icon{width:22px;height:22px;border-radius:6px;display:flex;align-items:center;justify-content:center;
  background:var(--track);color:var(--muted);flex-shrink:0;}
.sv-flag-icon svg{width:12px;height:12px;}
.sv-flag-icon.on{background:var(--primary-soft);color:var(--primary-dark);}
.sv-flag-icon.warn{background:var(--amber-soft);color:var(--amber-dark);}
.sv-step-body{border-top:1px solid var(--border);padding:12px 14px 13px 52px;display:flex;flex-direction:column;gap:12px;}
.sv-field{display:flex;flex-direction:column;gap:5px;}
.sv-field > label{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.3px;color:var(--muted);
  display:flex;align-items:center;gap:5px;}
.sv-field input[type=text],.sv-field textarea{border:1px solid var(--border);border-radius:8px;
  font-family:inherit;background:var(--field);color:var(--text);resize:vertical;}
.sv-field input[type=text]:focus,.sv-field textarea:focus{outline:none;border-color:var(--primary);background:var(--card);}
/* Nello stesso form convivevano tre altezze: tendine 37px, campi di testo
   31px, campi numerici 27px. Si allineano tutti alla tendina, che e' il
   controllo piu' alto e quello che non si puo' rimpicciolire. Il padding
   destro resta alle regole di .sv-unit, che ci mettono l'unita' di misura. */
.sv-field input[type=text],.sv-field textarea,.sv-field .sv-num-input{
  padding-top:8px;padding-bottom:8px;padding-left:10px;font-size:13px;min-height:37px;}
/* Dentro lo step si usa la scala compatta, quella degli aselect "sm". */
.sv-step-body .sv-field input[type=text],.sv-step-body .sv-field textarea,
.sv-step-body .sv-field .sv-num-input{
  padding-top:6px;padding-bottom:6px;padding-left:9px;font-size:12.5px;min-height:31px;}
.sv-field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
/* Righe e campi di un blocco: lo spazio verticale sta qui, non in tre stili
   in linea ripetuti. Dentro lo step ci pensa gia' il gap del contenitore. */
.sv-block > .sv-field-row,.sv-block > .sv-field{margin-bottom:12px;}
.sv-block > .sv-field-row:last-child,.sv-block > .sv-field:last-child{margin-bottom:0;}
.sv-chiplist{display:flex;flex-wrap:wrap;gap:6px;align-items:center;}
.sv-chip{display:inline-flex;align-items:center;gap:6px;background:var(--bg);border:1px solid var(--border);
  border-radius:20px;padding:4px 9px;font-size:11.5px;font-weight:600;}
.sv-chip button{border:none;background:transparent;padding:0;display:flex;color:var(--muted);}
.sv-chip button:hover{color:var(--red-dark);}
.sv-chip svg{width:11px;height:11px;}
.sv-chip.sel{background:var(--primary-soft);border-color:var(--primary-mid);color:var(--primary-dark);}
.sv-chip.pick{cursor:pointer;}
.sv-chip.pick:hover{border-color:var(--primary);}
.sv-chip.req::after{content:'obbligatorio';font-size:9.5px;font-weight:700;text-transform:uppercase;
  letter-spacing:.3px;color:var(--red-dark);}
.sv-add{border:1.5px dashed var(--border);border-radius:10px;padding:9px;background:transparent;
  color:var(--muted);font-size:12.5px;font-weight:600;display:flex;align-items:center;justify-content:center;
  gap:6px;width:100%;}
.sv-add:hover{border-color:var(--primary);color:var(--primary-dark);}
.sv-add svg{width:14px;height:14px;}
.sv-inline-add{display:flex;gap:7px;align-items:center;}
.sv-inline-add input{flex:1;min-width:0;border:1px solid var(--border);border-radius:8px;padding:7px 9px;
  font-size:12.5px;font-family:inherit;background:var(--field);}
.sv-inline-add input:focus{outline:none;border-color:var(--primary);background:var(--card);}

/* Nota sotto un campo: spiega la conseguenza di una scelta, non ripete
   l'etichetta, quindi sta staccata e in grigio. */
.sv-field-note{font-size:11px;color:var(--muted);line-height:1.5;}

/* Interruttore + stato in chiaro: il toggle da solo non dice mai cosa
   succede quando e' spento. */
.sv-switchline{display:flex;align-items:center;gap:9px;padding:3px 0 1px 0;}
.sv-switch-state{font-size:12.5px;font-weight:600;color:var(--muted);}
.sv-switch-state.on{color:var(--primary-dark);}

/* ---- Righe elenco generiche del pannello ---- */
.sv-row{display:flex;align-items:flex-start;gap:11px;padding:10px 0;border-top:1px solid var(--border);}
.sv-row:first-child{border-top:none;}
.sv-row-main{flex:1;min-width:0;}
.sv-row-title{font-size:13px;font-weight:600;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
.sv-row-sub{font-size:11.5px;color:var(--muted);margin-top:3px;line-height:1.45;}
.sv-row-actions{display:flex;gap:2px;flex-shrink:0;}
.sv-row-icon{width:26px;height:26px;border-radius:8px;background:var(--primary-soft);color:var(--primary-dark);
  display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.sv-row-icon svg{width:13px;height:13px;}
.sv-row-icon.mute{background:var(--track);color:var(--muted);}

/* ---- Conto economico ---- */
.sv-econ{display:flex;flex-direction:column;}
.sv-econ-row{display:flex;align-items:baseline;justify-content:space-between;gap:14px;
  padding:9px 0;border-top:1px solid var(--border);font-size:13px;}
.sv-econ-row:first-child{border-top:none;}
.sv-econ-row .k{color:var(--muted);}
.sv-econ-row .k small{display:block;font-size:11px;margin-top:2px;}
.sv-econ-row .v{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap;}
.sv-econ-row.total{border-top:2px solid var(--border);font-size:14px;}
.sv-econ-row.total .k{color:var(--text);font-weight:700;}
.sv-econ-row.neg .v{color:var(--red-dark);}
.sv-warn{display:flex;align-items:flex-start;gap:9px;background:var(--red-soft);color:var(--red-dark);border-radius:10px;
  padding:10px 13px;font-size:12px;font-weight:600;line-height:1.5;margin-top:12px;}
.sv-warn svg{width:15px;height:15px;flex-shrink:0;margin-top:1px;}
.sv-slider{width:100%;-webkit-appearance:none;appearance:none;height:5px;border-radius:5px;
  background:var(--track);outline:none;margin:10px 0 4px 0;}
.sv-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:18px;height:18px;
  border-radius:50%;background:var(--primary);border:3px solid var(--card);box-shadow:0 1px 4px rgba(46,33,25,.25);cursor:pointer;}
.sv-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--primary);
  border:3px solid var(--card);box-shadow:0 1px 4px rgba(46,33,25,.25);cursor:pointer;}
.sv-slider-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;}
.sv-slider-head .k{font-size:11.5px;font-weight:700;color:var(--muted);}
.sv-slider-head .v{font-size:16px;font-weight:700;font-variant-numeric:tabular-nums;}
.sv-slider-scale{display:flex;justify-content:space-between;font-size:10.5px;color:var(--muted);font-weight:600;}

/* ---- Automazioni ---- */
.sv-auto{display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-top:1px solid var(--border);}
.sv-auto:first-child{border-top:none;}
.sv-auto-main{flex:1;min-width:0;}
.sv-auto-title{font-size:13px;font-weight:600;}
.sv-auto-sub{font-size:11.5px;color:var(--muted);margin-top:3px;line-height:1.5;}

/* ---- Storico utilizzi ---- */
.sv-dev{display:flex;align-items:center;gap:8px;min-width:130px;}
.sv-dev-bar{position:relative;flex:1;height:6px;border-radius:6px;background:var(--track);overflow:hidden;}
.sv-dev-bar i{position:absolute;top:0;bottom:0;background:var(--primary);}
.sv-dev-bar i.over{background:var(--red);}
.sv-dev-val{font-size:11.5px;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap;}
.sv-dev-val.over{color:var(--red-dark);}
.sv-dev-val.under{color:var(--primary-dark);}

/* ---- Anteprima "Applica a progetto" ---- */
.sv-prev{border:1px solid var(--border);border-radius:11px;overflow:hidden;}
.sv-prev-row{display:grid;grid-template-columns:24px minmax(0,1fr) 118px 128px 52px;align-items:center;
  gap:10px;padding:9px 12px;border-top:1px solid var(--border);font-size:12.5px;}
.sv-prev-row:first-child{border-top:none;}
.sv-prev-row.blocked{background:var(--red-soft);box-shadow:inset 3px 0 0 var(--red);}
.sv-prev-row.milestone{background:var(--primary-soft);box-shadow:inset 3px 0 0 var(--primary);}
.sv-prev-key{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:700;color:var(--muted);}
.sv-prev-title{min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sv-prev-sub{font-size:11px;color:var(--muted);font-weight:500;margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sv-prev-dates{font-size:11.5px;color:var(--muted);font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;}
.sv-prev-role{font-size:11.5px;font-weight:600;display:flex;align-items:center;gap:6px;min-width:0;}
.sv-prev-role span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sv-prev-hours{text-align:right;font-size:11.5px;font-weight:700;font-variant-numeric:tabular-nums;}

/* ---- Stato del salvataggio automatico ----
   Sta nell'intestazione e non chiede niente: e' un'informazione, non una
   decisione. Resta grigio finche' va tutto bene e diventa rosso solo se
   qualcosa non e' arrivato al server. */
.sv-save-state{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:600;
  color:var(--muted);white-space:nowrap;}
.sv-save-state svg{width:12px;height:12px;flex-shrink:0;}
.sv-save-state.attesa,.sv-save-state.salvataggio{color:var(--primary-dark);}
.sv-save-state.salvataggio svg{animation:svspin 1s linear infinite;}
@keyframes svspin{to{transform:rotate(360deg);}}
.sv-save-state.errore,.sv-save-state.senzaNome{color:var(--red-dark);}
.sv-save-state.errore svg,.sv-save-state.senzaNome svg{color:var(--red-dark);}
.sv-save-state button{border:none;background:transparent;padding:0 0 0 4px;font:inherit;
  color:var(--primary-dark);text-decoration:underline;}

/* ---- Tabella ruoli ---- */
.sv-role-row{display:grid;grid-template-columns:minmax(0,1fr) 108px 92px;align-items:center;gap:12px;
  padding:9px 0;border-top:1px solid var(--border);}
.sv-role-row:first-child{border-top:none;}
.sv-role-name{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:600;min-width:0;}
.sv-role-use{font-size:11.5px;color:var(--muted);font-weight:600;text-align:right;white-space:nowrap;}

@media(max-width:1080px){
  .sv-step-head{grid-template-columns:16px 26px minmax(0,1fr) auto auto;row-gap:8px;}
  .sv-step-head .sv-role-cell{grid-column:3;}
  .sv-step-head .sv-unit{grid-column:auto;}
  .sv-prev-row{grid-template-columns:24px minmax(0,1fr) 110px;}
  .sv-prev-role,.sv-prev-hours{display:none;}
}
@media(max-width:760px){
  .sv-field-row{grid-template-columns:1fr;}
  .sv-search{width:100%;}
}

/* ---- Servizi: le misure che stavano nel markup ---- */
.sv-ink-primary{color:var(--primary-dark);}
.sv-ink-red{color:var(--red-dark);}
.sv-prev-row.on-field{background:var(--field);}
.sv-num-sm{width:22px;height:22px;font-size:10.5px;}
.sv-listbody{padding:6px 10px;}
.sv-pager{display:flex;gap:9px;justify-content:center;}
.sv-permonth{font-size:11px;color:var(--muted);display:block;}
.sv-permonth-in{font-size:11px;font-weight:600;color:var(--muted);}
.sv-headmeta{margin-top:7px;}
.sv-nosteps{text-align:center;padding:14px 0;}
.sv-msnum{text-align:right;flex-shrink:0;}
.sv-msval{font-weight:700;}
.sv-mspct{font-size:11.5px;color:var(--muted);font-weight:600;}
.sv-stepacts{display:flex;gap:2px;}
.sv-stepcost{font-size:14px;font-weight:700;padding-top:5px;}
.sv-steprole{font-size:11.5px;font-weight:600;color:var(--muted);}
.sv-off{opacity:.5;}
.sv-emptybig{padding:34px 18px;}
.sv-empty26{padding:26px 12px;}
.sv-projname{font-size:13px;}
.sv-warn.good{background:var(--primary-soft);color:var(--primary-dark);}
.sv-rowmain{display:flex;align-items:center;gap:10px;}
.sv-kpilabel{flex:1;}
.sv-kpitarget{width:130px;text-align:left;}
.sv-econrec{margin-top:14px;padding-top:12px;border-top:1px dashed var(--border);}
.sv-bargap{margin-top:7px;}
.sv-rolenum{text-align:right;flex-shrink:0;min-width:92px;}
.sv-note{font-size:11.5px;color:var(--muted);display:flex;gap:7px;align-items:flex-start;margin-top:4px;}
.sv-noteico{width:14px;height:14px;flex-shrink:0;margin-top:1px;}

.sv-drawerico{width:19px;height:19px;color:var(--primary-dark);}
.sv-drawersub{font-size:12px;color:var(--muted);}
.sv-emptypad24{padding:24px;}
.sv-prevcard{background:var(--field);box-shadow:none;border:1px solid var(--border);padding:14px 16px;}
.sv-prevnote{font-size:12px;color:var(--muted);margin:8px 0 0 0;}
.sv-rolesw{background:var(--tint,var(--primary));}
