/* ═══════════════════════════════════════════
   PLANS.CSS — Plans espace client (Bloc 3)
   ═══════════════════════════════════════════ */
.plans-etat { padding:10px 14px; border-radius:8px; font-size:13px; font-weight:600; margin-bottom:14px; }
.plans-etat.signe   { background:var(--green-soft); color:var(--green); }
.plans-etat.attente { background:var(--blue-soft); color:var(--blue); }

.plan-fichier {
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:8px 12px; border:1px solid var(--border); border-radius:8px; margin-bottom:6px; font-size:13px;
}
.plan-fichier a { color:var(--blue); text-decoration:none; font-weight:600; word-break:break-all; }
.plan-fichier a:hover { text-decoration:underline; }
.plans-vide { font-size:13px; color:var(--text-muted); padding:6px 2px; }

.lien-mini.danger { color:var(--red); }

/* Liens 3D par salle */
.teva-ligne {
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:8px 12px; border:1px solid var(--border); border-radius:8px; margin-bottom:6px; font-size:13px;
}
.teva-url { font-size:12px; margin-top:2px; }
.teva-url a { color:var(--blue); word-break:break-all; }
.teva-add { display:flex; gap:6px; margin-top:8px; align-items:center; flex-wrap:wrap; }
.teva-add .form-input { flex:1; min-width:120px; }
.teva-add .btn { white-space:nowrap; }

/* Actions fichiers (remplacer/supprimer) & liens (modifier/retirer) */
.plan-fichier-actions, .teva-actions { display:flex; gap:12px; align-items:center; white-space:nowrap; flex-shrink:0; }
.plan-fichier-actions .lien-mini input[type="file"] { display:none; }
.teva-ligne-edit { flex-wrap:wrap; }
.teva-ligne-edit .form-input { flex:1; min-width:130px; }
.teva-ligne-edit .btn { white-space:nowrap; }

/* ═══ Fenêtre « Plans espace client » — mise en page épurée ═══ */
#plans-modal-content{ display:flex; flex-direction:column; max-height:92vh; }
.plans-head{ display:flex; align-items:center; padding:15px 20px; border-bottom:1px solid #EEE8DE; flex-shrink:0; }
.plans-head .t{ font-size:16px; font-weight:900; flex:1; }
.plans-head .x{ font-size:18px; color:#9A9284; cursor:pointer; background:none; border:none; padding:0; line-height:1; }
.plans-body{ padding:16px 20px; overflow:auto; flex:1; }
.plans-foot{ display:flex; justify-content:flex-end; gap:9px; padding:14px 20px; border-top:1px solid #EEE8DE; background:#FCFAF6; flex-shrink:0; }
.plans-sect{ margin-top:20px; }
.plans-sect-h{ font-size:10px; font-weight:800; letter-spacing:.7px; text-transform:uppercase; color:#9A9284; margin-bottom:9px; display:flex; align-items:center; gap:7px; }
.plans-sect-h .cnt{ background:#EEE8DE; color:#9A9284; border-radius:20px; padding:0 8px; font-size:10px; }
.plans-sect-h .opt{ text-transform:none; letter-spacing:0; font-weight:600; color:#B7AF9F; }
.plans-add{ border:1px dashed #CFC7B8; background:none; border-radius:9px; padding:9px 12px; font-size:12.5px; font-weight:600; color:#5C4B36; cursor:pointer; display:block; text-align:center; margin-top:2px; width:100%; }
.plans-add:hover{ background:#FAF6EF; }

/* Fichiers & liens : lignes fines encadrées (cohérent avec la maquette) */
.plan-fichier{ display:flex; align-items:center; gap:11px; padding:9px 12px; border:1px solid #EEE8DE; border-radius:10px; margin-bottom:7px; background:#fff; }
.teva-ligne{ display:flex; align-items:center; gap:10px; padding:9px 12px; border:1px solid #EEE8DE; border-radius:10px; margin-bottom:7px; background:#fff; }
.plans-body .form-label{ margin:0; }

/* ═══ Vues 3D internes (.vok → .glb) — Bloc 3B ═══ */
.plan-fichier.vue3d{ border-color:#DCE9DF; background:linear-gradient(0deg,#F7FBF8,#fff); }
.plan-fichier.vue3d a{ color:var(--green); }
.vue3d-ico{ font-size:15px; flex-shrink:0; }
.vue3d-add{ display:flex; gap:6px; margin-top:8px; align-items:center; flex-wrap:wrap; }
.vue3d-add .form-input{ flex:1; min-width:120px; }
.vue3d-add-btn{ white-space:nowrap; cursor:pointer; display:inline-flex; align-items:center; }
.vue3d-add-btn input[type="file"]{ display:none; }

/* ═══ Overlay de progression de la conversion 3D (moderne, pas de popup système) ═══ */
.vue3d-progress-box{ max-width:380px; padding:24px 26px; text-align:left; }
.v3p-title{ font-size:16px; font-weight:900; color:var(--text); }
.v3p-sub{ font-size:12.5px; color:var(--text-muted); margin:4px 0 16px; }
.v3p-steps{ display:flex; flex-direction:column; gap:2px; }
.v3p-step{ display:flex; align-items:center; gap:11px; padding:7px 4px; font-size:13.5px; color:var(--text-muted); transition:color .2s; }
.v3p-dot{ width:16px; height:16px; border-radius:50%; border:2px solid #D8D2C7; flex-shrink:0; position:relative; box-sizing:border-box; transition:all .2s; }
/* étape en cours : cercle bleu qui tourne */
.v3p-step.run{ color:var(--text); font-weight:600; }
.v3p-step.run .v3p-dot{ border-color:var(--accent); border-top-color:transparent; animation:v3p-spin .7s linear infinite; }
/* étape terminée : pastille verte + coche */
.v3p-step.done{ color:var(--text); }
.v3p-step.done .v3p-dot{ border-color:var(--green); background:var(--green); }
.v3p-step.done .v3p-dot::after{ content:''; position:absolute; left:4px; top:1px; width:4px; height:8px; border:solid #fff; border-width:0 2px 2px 0; transform:rotate(45deg); }
@keyframes v3p-spin{ to{ transform:rotate(360deg); } }

/* ═══ Fenêtre de VERDICT du contrôle du dessin (après dépôt d'un .vok) ═══
   Pourquoi une fenêtre et pas un toast : le verdict est la raison même du
   dépôt — le dessinateur pose son .vok pour savoir si son dessin passe. Une
   pastille qui s'efface toute seule au coin de l'écran se rate une fois sur
   deux ; « 2 erreurs sur le dessin » ne peut pas se rater.
   Le bandeau coloré du haut porte l'information au premier coup d'œil, avant
   même la lecture : rouge = à corriger, ambre = à vérifier, vert = ça passe. */
.v3v-box{ max-width:440px; text-align:center; border-top:4px solid var(--border); }
.v3v-box.err{  border-top-color:var(--red); }
.v3v-box.warn{ border-top-color:var(--orange); }
.v3v-box.ok{   border-top-color:var(--green); }
.v3v-box.info{ border-top-color:var(--accent); }
.v3v-ico{ font-size:38px; line-height:1; margin-bottom:10px; }
.v3v-titre{ font-weight:700; font-size:17px; margin-bottom:6px; }
.v3v-box.err  .v3v-titre{ color:var(--red); }
.v3v-box.warn .v3v-titre{ color:var(--orange); }
.v3v-sous{ font-size:13px; color:var(--text-muted); line-height:1.45; }

/* Liste des défauts : le dessinateur sait CE QU'IL DOIT corriger sans ouvrir
   le meuble — c'est le gain du contrôle calculé au dépôt. */
.v3v-liste{ margin-top:14px; text-align:left; background:#FAF9F7; border:1px solid var(--border);
            border-radius:9px; padding:9px 11px; display:flex; flex-direction:column; gap:7px;
            max-height:190px; overflow-y:auto; }
.v3v-ligne{ display:flex; align-items:flex-start; gap:9px; font-size:13px; line-height:1.35; }
.v3v-niv{ width:8px; height:8px; border-radius:50%; flex-shrink:0; margin-top:5px; background:var(--text-muted); }
.v3v-niv.erreur{ background:var(--red); }
.v3v-niv.avertissement{ background:var(--orange); }
.v3v-niv.info{ background:var(--accent); }
.v3v-plus{ font-size:12px; color:var(--text-muted); font-style:italic; padding-left:17px; }

/* ═══ Badge de contrôle dans la liste des vues 3D ═══
   Trois états, jamais deux : « non contrôlé » (gris) n'est pas « conforme »
   (vert). Le gris dit que personne n'a regardé ; le vert qu'on a regardé et
   que tout va bien. Afficher du vert par défaut fabriquerait une fausse
   couverture — précisément ce que ce contrôle traque. */
.ctrl-badge{ flex-shrink:0; font-size:11.5px; font-weight:700; padding:2px 7px; border-radius:20px;
             line-height:1.5; white-space:nowrap; cursor:default; }
.ctrl-badge.ok{   background:var(--green-soft); color:var(--green); }
.ctrl-badge.warn{ background:#FAEEDA; color:var(--orange); }
.ctrl-badge.err{  background:#FBEAE8; color:var(--red); }
.ctrl-badge.nc{   background:#F1EEE9; color:var(--text-muted); font-weight:600; }
