/* SCOS-ops : visuel propre a ops (checklist / SOP), AU-DESSUS du socle scos-ui
 * (tokens.css + components.css). Ne redefinit jamais .field, .btn-*, .seg, .badge,
 * .ed-table : ces classes viennent de components.css. Monochrome encre/papier ;
 * la seule couleur autorisee est la semantique d'etat (--ok pour le fait, etc.).
 * Accessible 40-60 : corps >= 15px, cibles tactiles >= 44px. */

body.ops-app {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  background: var(--paper-soft);
  font-family: var(--sans);
  color: var(--ink);
}
body.ops-app > #scos-shell { flex: 0 0 auto; }

.ops-main {
  flex: 1 1 auto;
  width: 100%;
  max-width: var(--page-max);
  margin: 0 auto;
  padding: 24px var(--gutter) 64px;
  box-sizing: border-box;
}

/* ---------------------------------------------------------- barre de contexte */
.ops-bar {
  background: var(--paper);
  border: 1px solid var(--rule-soft);
  padding: 16px;
  margin-bottom: 22px;
}
.ops-bar-row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 16px;
}
.ops-field { min-width: 200px; }
.ops-field select,
.ops-field input {
  min-height: var(--field-h);
}
.ops-tabs { margin-left: auto; align-self: flex-end; }

/* ---------------------------------------------------------- etat erreur */
.ops-error {
  border: 1px solid var(--crit);
  background: var(--paper);
  padding: 22px;
  margin-bottom: 22px;
}
.ops-error h2 { font-size: var(--fs-lead); margin: 0 0 8px; }
.ops-error p { margin: 0 0 14px; color: var(--ink-mid); }

.ops-h2 {
  font-size: var(--fs-lead);
  font-weight: 800;
  margin: 0 0 16px;
}

/* ---------------------------------------------------------- vue oujourd'hui */
.ops-cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 18px;
}
.ops-card {
  background: var(--paper);
  border: 1px solid var(--rule-soft);
  border-top: 3px solid var(--ink);
  padding: 18px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.ops-card.is-done { border-top-color: var(--ok); }

.ops-card-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
}
.ops-card-title { display: flex; flex-direction: column; gap: 6px; }
.ops-card-title h3 { margin: 0; font-size: 17px; font-weight: 800; }
.ops-tag {
  display: inline-block;
  font-size: 12px;
  font-weight: 700;
  color: var(--ink-mid);
  border: 1px solid var(--rule-soft);
  padding: 2px 8px;
  align-self: flex-start;
}
.ops-tag .be { color: var(--ink-dim); margin-left: 4px; font-weight: 500; }
.ops-progress {
  font-family: var(--sans-en);
  font-variant-numeric: tabular-nums;
  font-size: 16px;
  font-weight: 800;
  white-space: nowrap;
}
.ops-stamp {
  font-size: 13px;
  font-weight: 700;
  color: var(--ok);
  margin: 0;
}
.ops-stamp .be { color: var(--ok); opacity: 0.7; margin-left: 4px; font-weight: 500; }
.ops-when { font-family: var(--sans-en); font-weight: 500; color: var(--ink-mid); }

.ops-checklist {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}
.ops-checklist li {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 0;
  border-bottom: 1px solid var(--rule-soft);
  min-height: var(--tap-min);
}
.ops-checklist li:last-child { border-bottom: 0; }
.ops-checklist input[type="checkbox"] {
  width: 24px;
  height: 24px;
  flex: none;
  accent-color: var(--ink);
  cursor: pointer;
}
.ops-checklist input[type="checkbox"]:focus-visible {
  outline: var(--focus-w) solid var(--ink);
  outline-offset: 2px;
}
.ops-checklist label {
  font-size: var(--fs-body);
  line-height: 1.45;
  cursor: pointer;
}
.ops-checklist input:checked + label {
  color: var(--ink-mid);
  text-decoration: line-through;
}
.ops-checklist input:disabled + label { cursor: default; }

.ops-card-actions {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}
.ops-card-msg { flex: 1 1 100%; min-height: 0; }

/* ---------------------------------------------------------- vue gestion */
.ops-manage-grid {
  display: grid;
  grid-template-columns: minmax(320px, 420px) 1fr;
  gap: 28px;
  align-items: start;
}
@media (max-width: 900px) {
  .ops-manage-grid { grid-template-columns: 1fr; }
}

.ops-editor,
.ops-templates {
  background: var(--paper);
  border: 1px solid var(--rule-soft);
  padding: 22px;
}
.ops-editor .field { margin-bottom: 16px; }

.ops-items { border: 0; padding: 0; margin: 0 0 8px; }
.ops-items legend {
  font-size: var(--fs-label);
  font-weight: 700;
  padding: 0;
  margin-bottom: 8px;
}
.ops-items legend .form-hint { font-weight: 500; margin-left: 6px; }
.ops-items-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 10px;
}
.ops-item-row { display: flex; gap: 8px; }
.ops-item-input {
  flex: 1 1 auto;
  min-height: var(--field-h);
  border: 1px solid var(--rule-soft);
  background: var(--paper);
  padding: 0 12px;
  font-family: var(--sans);
  font-size: var(--fs-body);
  color: var(--ink);
}
.ops-item-input:focus {
  outline: var(--focus-w) solid var(--ink);
  outline-offset: -2px;
}
.ops-item-rm { flex: 0 0 auto; min-height: var(--field-h); }
.ops-add { width: 100%; }

.ops-editor-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 18px;
}
.ops-danger { color: var(--crit); border-color: var(--crit); }
.ops-danger:hover { background: var(--paper-soft); }

/* Lignes de la table cliquables (ouverture dans l'editeur). */
.ops-tpl-row { cursor: pointer; }
.ops-tpl-row:focus-visible {
  outline: var(--focus-w) solid var(--ink);
  outline-offset: -3px;
}

/* ---------------------------------------------------------- vue stock */
.ops-stock-grid {
  display: grid;
  grid-template-columns: minmax(300px, 380px) 1fr;
  gap: 28px;
  align-items: start;
}
@media (max-width: 900px) {
  .ops-stock-grid { grid-template-columns: 1fr; }
}

/* Formulaire de creation : champs unite/seuil/quantite sur une rangee. */
.ops-item-form-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}
.ops-item-form-row .field { margin-bottom: 16px; }
.ops-item-form .form-hint { margin-top: 10px; }
#item-form input[type="number"] {
  min-height: var(--field-h);
  font-variant-numeric: tabular-nums;
}

/* Quantite courante + unite dans la colonne chiffree. */
.ops-qty {
  font-family: var(--sans-en);
  font-variant-numeric: tabular-nums;
  font-weight: 800;
}
.ops-unit { color: var(--ink-dim); font-size: 13px; font-weight: 500; }

/* Ligne sous le seuil : bord d'accent semantique, lecture immediate. */
.ops-stock-row.is-low td:first-child {
  box-shadow: inset 3px 0 0 var(--warn);
}
.ops-stock-row.is-low .ops-qty { color: var(--warn); }

/* Boutons de mouvement rapide : cibles tactiles, sur une rangee. */
.ops-stock-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}
.ops-move-btn {
  min-width: 48px;
  min-height: var(--tap-min);
  font-variant-numeric: tabular-nums;
}
.ops-stock-msg { flex: 1 1 100%; min-height: 0; }

/* ---------------------------------------------------------- vue planning */
#view-plan {
  display: flex;
  flex-direction: column;
  gap: 28px;
}
.ops-coverage,
.ops-week,
.ops-staff {
  background: var(--paper);
  border: 1px solid var(--rule-soft);
  padding: 22px;
}
.ops-coverage-head .form-hint,
.ops-week-head .form-hint { margin-top: 0; }
.ops-week-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}
.ops-week-head .ops-h2 { margin-bottom: 0; }
#week-range {
  font-family: var(--sans-en);
  font-variant-numeric: tabular-nums;
  color: var(--ink-mid);
}

/* Couverture : table heure / planifie / affluence / barre comparative. */
.ops-coverage-table { width: 100%; }
.ops-cov-hour {
  font-family: var(--sans-en);
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  white-space: nowrap;
}
.ops-cov-planned { font-weight: 800; }
.ops-cov-barcol { width: 40%; min-width: 180px; }
.ops-cov-bar {
  position: relative;
  height: 14px;
  background: var(--paper-soft);
  border: 1px solid var(--rule-soft);
}
.ops-cov-fill {
  height: 100%;
  background: var(--ink);
  transition: width 0.2s ease;
}
/* Heure avec affluence mais sans personnel planifie : sous-staffee. */
.ops-cov-row.is-under .ops-cov-planned { color: var(--crit); }
.ops-cov-bar.is-under { border-color: var(--crit); }
.ops-cov-bar.is-under .ops-cov-fill { background: var(--crit); }
.ops-cov-warn {
  display: inline-block;
  margin-top: 4px;
  font-size: 12px;
  font-weight: 700;
  color: var(--crit);
}
.ops-cov-warn .be { color: var(--crit); opacity: 0.7; margin-left: 4px; font-weight: 500; }

/* Formulaire de creation d'un creneau : sur une rangee. */
.ops-shift-form,
.ops-staff-form {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 12px;
  margin-bottom: 18px;
}
.ops-shift-form .field,
.ops-staff-form .field { margin-bottom: 0; min-width: 130px; }
.ops-shift-form-act,
.ops-staff-form-act { align-self: flex-end; }
.ops-shift-form .form-msg,
.ops-staff-form .form-msg { flex: 1 1 100%; min-height: 0; }
.ops-staff-form .form-hint { flex: 1 1 100%; margin-top: 0; }
.ops-shift-form input[type="time"] {
  min-height: var(--field-h);
  font-variant-numeric: tabular-nums;
}

/* Grille hebdo : une ligne par membre, une colonne par jour. */
.ops-week-table { width: 100%; }
.ops-week-day { text-align: center; font-size: 13px; }
.ops-week-date {
  font-family: var(--sans-en);
  font-variant-numeric: tabular-nums;
  font-weight: 500;
  color: var(--ink-dim);
}
.ops-week-staff { font-weight: 700; white-space: nowrap; }
.ops-week-cell {
  vertical-align: top;
  min-width: 96px;
}
.ops-week-cell:empty::after {
  content: "·";
  color: var(--ink-dim);
}

/* Etiquette d'un creneau dans une cellule de la grille. */
.ops-shift-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 0 0 4px;
  padding: 3px 6px;
  border: 1px solid var(--rule-soft);
  border-left: 3px solid var(--ink);
  background: var(--paper);
  font-size: 12px;
  white-space: nowrap;
}
.ops-shift-chip.is-done { border-left-color: var(--ok); }
.ops-shift-chip.is-cancelled {
  border-left-color: var(--ink-dim);
  opacity: 0.6;
}
.ops-shift-chip.is-cancelled .ops-shift-time { text-decoration: line-through; }
.ops-shift-time {
  font-family: var(--sans-en);
  font-variant-numeric: tabular-nums;
  font-weight: 700;
}
.ops-shift-rm {
  border: 0;
  background: none;
  color: var(--ink-mid);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
}
.ops-shift-rm:hover { color: var(--crit); }
.ops-shift-rm:focus-visible {
  outline: var(--focus-w) solid var(--ink);
  outline-offset: 1px;
}

/* Table de gestion du personnel. */
.ops-staff-table { width: 100%; }
.ops-staff-msg { display: block; min-height: 0; }

/* Stock visuel (caméra) : groupes d'apparence + variation. La couleur reste dans
   la donnée (vert = hausse, rouge = baisse), chrome monochrome par ailleurs. */
.ops-sv-zone { margin-bottom: 12px; }
.ops-sv-zonehead { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin-bottom: 8px; }
.ops-sv-zone .sv-up { color: #1a7f37; }
.ops-sv-zone .sv-down { color: #b3261e; }
.ops-sv-zone .sv-name { width: 100%; box-sizing: border-box; }
.ops-sv-zone .sv-name-err { outline: 2px solid #b3261e; }

/* Alertes opérationnelles : carte avec pastille de sévérité (couleur dans la donnée :
   rouge = rupture/vide, orange = bas/manquant/offline ; chrome monochrome ailleurs). */
.ops-alert { display: flex; align-items: center; gap: 12px; }
.ops-alert-txt { flex: 1; min-width: 0; }
.ops-alert-sev { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.ops-alert-high .ops-alert-sev { background: #b3261e; }
.ops-alert-med .ops-alert-sev { background: #c77700; }
.ops-alert-dismiss { flex: none; }
