:root{--bg:#0f1115;--card:#171a21;--border:#262b36;--text:#e5e7eb;--muted:#9ca3af;--accent:#8abc1d}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",sans-serif;background:var(--bg);color:var(--text)}.topbar{display:flex;justify-content:space-between;align-items:center;padding:14px 24px;background:var(--card);border-bottom:1px solid var(--border)}.topbar nav{display:flex;gap:16px;align-items:center}.topbar a,.link-button{color:var(--accent);text-decoration:none}.inline-form{display:inline;margin:0}.link-button{background:none;border:0;padding:0;cursor:pointer;font:inherit}main{padding:24px;max-width:1440px;margin:0 auto}.login-page{display:flex;align-items:center;justify-content:center;min-height:100vh}.login-box{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:32px;width:340px;display:flex;flex-direction:column;gap:14px}.login-box label{display:flex;flex-direction:column;gap:6px;font-size:14px;color:var(--muted)}input,select{background:#0f1115;border:1px solid var(--border);color:var(--text);border-radius:8px;padding:9px 10px;font-size:14px}.login-box button,.filters button,.btn-secondary{background:var(--accent);color:#111;border:0;border-radius:8px;padding:10px 14px;font-weight:700;cursor:pointer;text-decoration:none;text-align:center}.btn-secondary{background:transparent;border:1px solid var(--border);color:var(--muted)}.error{color:#f87171}.success{color:#4ade80}.filters{display:flex;gap:10px;margin-bottom:18px;flex-wrap:wrap;align-items:center}.table-wrap{overflow-x:auto;border-radius:10px}.leads-table{width:100%;border-collapse:collapse;background:var(--card)}.leads-table th,.leads-table td{padding:10px 12px;border-bottom:1px solid var(--border);text-align:left;font-size:13px;vertical-align:top}.leads-table th{color:var(--muted);background:#1d212b}.leads-table small{color:var(--muted)}.leads-table .empty{text-align:center;padding:30px}.status-select,.note-input{width:100%;min-width:130px}.note-input{margin-top:6px}.pagination{display:flex;gap:6px;margin-top:16px;flex-wrap:wrap}.pagination a{padding:6px 10px;border:1px solid var(--border);border-radius:6px;color:var(--text);text-decoration:none}.pagination a.active{background:var(--accent);border-color:var(--accent);color:#111}
.sale-value-cell{text-align:right;white-space:nowrap;font-weight:600;color:#4ade80}
.sale-value-cell.is-empty{color:var(--muted);font-weight:400}
.confirm-dialog-form .hint{color:#fbbf24}
.confirm-dialog{background:var(--card);color:var(--text);border:1px solid var(--border);border-radius:12px;padding:0;width:340px;max-width:90vw}
.confirm-dialog::backdrop{background:rgba(0,0,0,.6)}
.confirm-dialog-form{display:flex;flex-direction:column;gap:12px;padding:22px}
.confirm-dialog-form h3{margin:0;font-size:16px}
.confirm-dialog-form p{margin:0;font-size:13px}
.confirm-dialog-form label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
/* El display:flex de arriba gana sobre el [hidden] del navegador; hay que restaurarlo. */
.confirm-dialog-form [hidden]{display:none}

/* Campo de contraseña con botón de ver/ocultar */
.password-field{position:relative;display:block}
.password-field input{width:100%;padding-right:42px}
/* Doble clase a propósito: `.login-box button` (0,1,1) le ganaba y lo pintaba de verde. */
.password-field .password-toggle{position:absolute;top:0;right:0;height:100%;width:38px;display:flex;align-items:center;justify-content:center;background:none;border:0;padding:0;cursor:pointer;border-radius:0 8px 8px 0}
.password-toggle img{width:18px;height:18px;display:block;opacity:.65;transition:opacity .15s ease}
.password-toggle:hover img,.password-toggle[aria-pressed="true"] img{opacity:1}
.password-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.confirm-dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:6px}
@media(max-width:700px){.topbar{align-items:flex-start;gap:12px}.topbar nav{flex-wrap:wrap}main{padding:16px}}

/* ============================================================
   Capa de refinamiento visual. Solo agrega o ajusta apariencia:
   no cambia estructura, clases de datos ni contratos con el JS.
   ============================================================ */

:root{
  --surface:#1b1f28;          /* Realce sobre --card para cabeceras y controles */
  --accent-soft:rgba(138,188,29,.14);
  --accent-hover:#9ed321;
  --ring:rgba(138,188,29,.45);
  --radius:10px;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px -12px rgba(0,0,0,.6);
  --s-nuevo:#38bdf8; --s-contactado:#22d3ee; --s-cotizado:#fbbf24;
  --s-negociacion:#a78bfa; --s-ganado:#4ade80; --s-perdido:#f87171;
}

/* --- Foco visible y consistente en todo el panel --- */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--ring);outline-offset:2px
}
input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:none}
input,select,textarea{transition:border-color .15s ease,box-shadow .15s ease}

/* --- Barra superior --- */
/* min-height y no height: en móvil el nav se envuelve y la barra debe poder crecer. */
.topbar{position:sticky;top:0;z-index:20;box-shadow:var(--shadow);min-height:56px}
.topbar h1{font-size:17px;letter-spacing:.2px;margin:0}
.topbar h1::before{content:"";display:inline-block;width:8px;height:8px;margin-right:9px;border-radius:50%;background:var(--accent);vertical-align:middle}
.topbar a:hover,.link-button:hover{color:var(--accent-hover);text-decoration:underline}

/* --- Filtros como tarjeta --- */
.filters{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:14px}
.filters button{transition:background .15s ease,transform .1s ease}
.filters button:hover{background:var(--accent-hover)}
.filters button:active{transform:translateY(1px)}
.btn-secondary:hover{border-color:var(--accent);color:var(--text)}

/* --- Tabla --- */
.table-wrap{border:1px solid var(--border);box-shadow:var(--shadow)}
/* top:0 y no la altura de .topbar: overflow-x:auto vuelve a .table-wrap un contenedor
   de scroll propio, así que el sticky se resuelve contra él y no contra el viewport. */
.leads-table th{position:sticky;top:0;z-index:10;background:var(--surface);font-size:11px;
  text-transform:uppercase;letter-spacing:.6px;font-weight:700;white-space:nowrap}
.leads-table tbody tr{transition:background .12s ease}
.leads-table tbody tr:hover{background:rgba(255,255,255,.025)}
.leads-table tbody tr:last-child td{border-bottom:0}
.leads-table td{vertical-align:top}

/* --- Columna de contacto --- */
.contact-cell{display:table-cell;min-width:170px}
.contact-name{display:block;font-weight:600;margin-bottom:2px}
.contact-link{display:block;color:var(--muted);text-decoration:none;font-size:12px;
  max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.contact-link:hover{color:var(--accent)}
.contact-empty{color:var(--muted)}

/* --- Estado como píldora de color --- */
.status-select{appearance:none;-webkit-appearance:none;border-radius:999px;font-weight:600;
  padding:7px 26px 7px 12px;cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);
  background-position:calc(100% - 14px) 50%,calc(100% - 9px) 50%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat}
.status-select[data-status="nuevo"]{color:var(--s-nuevo);border-color:var(--s-nuevo)}
.status-select[data-status="contactado"]{color:var(--s-contactado);border-color:var(--s-contactado)}
.status-select[data-status="cotizado"]{color:var(--s-cotizado);border-color:var(--s-cotizado)}
.status-select[data-status="negociacion"]{color:var(--s-negociacion);border-color:var(--s-negociacion)}
.status-select[data-status="ganado"]{color:var(--s-ganado);border-color:var(--s-ganado)}
.status-select[data-status="perdido"]{color:var(--s-perdido);border-color:var(--s-perdido)}
.status-select option{background:var(--card);color:var(--text)}

/* --- Celda de notas: última nota + editor con guardado explícito --- */
.note-col{min-width:230px}
.note-cell{min-width:230px}
.note-last{margin:0 0 8px;font-size:12px;color:var(--muted);line-height:1.45;
  padding-left:9px;border-left:2px solid var(--accent);
  /* Una nota larga no debe estirar la fila: se recorta a 3 líneas. */
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
.note-last.is-empty{border-left-color:var(--border);font-style:italic;opacity:.65}
/* Campo y botón en línea: mantiene la fila compacta con 25 leads por página. */
.note-editor{display:flex;align-items:flex-start;gap:6px}
.note-input{flex:1 1 auto;display:block;width:100%;min-width:0;min-height:34px;height:34px;
  resize:none;font:inherit;font-size:13px;line-height:1.4;background:var(--bg);
  border:1px solid var(--border);color:var(--text);border-radius:8px;padding:7px 10px}
.note-input::placeholder{color:var(--muted)}
.note-save{flex:0 0 auto;background:var(--accent);color:#111;border:0;border-radius:7px;padding:0 13px;
  height:34px;font-weight:700;font-size:12px;cursor:pointer;white-space:nowrap;
  transition:background .15s ease,opacity .15s ease}
.note-save:hover:not(:disabled){background:var(--accent-hover)}
.note-save:active:not(:disabled){transform:translateY(1px)}
/* Deshabilitado sigue siendo legible: comunica "hay un botón" y que espera texto. */
.note-save:disabled{background:transparent;border:1px solid var(--border);color:var(--muted);cursor:not-allowed}
.note-feedback{display:block;margin-top:5px;font-size:11.5px;color:var(--muted);line-height:1.3}
/* Sin mensaje no ocupa alto, para no reservar espacio muerto en las 25 filas de la página. */
.note-feedback:empty{display:none}
.note-feedback[data-tone="success"]{color:var(--s-ganado)}
.note-feedback[data-tone="error"]{color:var(--s-perdido)}
.note-feedback[data-tone="pending"]{color:var(--accent)}

/* --- Paginación --- */
.pagination a:hover:not(.active){border-color:var(--accent);color:var(--accent)}

/* --- Diálogo --- */
.confirm-dialog{box-shadow:var(--shadow)}
.confirm-dialog-form h3{padding-bottom:10px;border-bottom:1px solid var(--border)}
#scd-confirm{background:var(--accent);color:#111;border:0;border-radius:8px;padding:9px 16px;font-weight:700;cursor:pointer}
#scd-confirm:hover{background:var(--accent-hover)}

@media(max-width:700px){
  .leads-table th{position:static}
  .note-cell,.note-col{min-width:200px}
}
@media(prefers-reduced-motion:reduce){
  *{transition:none!important;animation:none!important}
}


/* El folio es el identificador que se dicta por teléfono: resalta de un vistazo. */
.leads-table tbody td:first-child strong{color:var(--accent);letter-spacing:.3px}

/* --- Enlace del folio hacia el detalle --- */
.folio-link{text-decoration:none}
.folio-link:hover strong{text-decoration:underline}

/* --- Detalle del lead --- */
.lead-detail{max-width:1100px}
.back-link{display:inline-block;margin-bottom:14px;color:var(--accent);text-decoration:none;font-size:14px}
.back-link:hover{color:var(--accent-hover);text-decoration:underline}
.detail-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:14px}
.detail-head h2{margin:0;font-size:24px;color:var(--accent);letter-spacing:.3px}
.status-chip{border:1px solid var(--border);border-radius:999px;padding:4px 12px;font-size:13px;font-weight:600}
.status-chip[data-status="nuevo"]{color:var(--s-nuevo);border-color:var(--s-nuevo)}
.status-chip[data-status="contactado"]{color:var(--s-contactado);border-color:var(--s-contactado)}
.status-chip[data-status="cotizado"]{color:var(--s-cotizado);border-color:var(--s-cotizado)}
.status-chip[data-status="negociacion"]{color:var(--s-negociacion);border-color:var(--s-negociacion)}
.status-chip[data-status="ganado"]{color:var(--s-ganado);border-color:var(--s-ganado)}
.status-chip[data-status="perdido"]{color:var(--s-perdido);border-color:var(--s-perdido)}
.detail-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0 0 18px;
  background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:14px}
.detail-summary dt,.detail-list dt{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);font-weight:700}
.detail-summary dd{margin:4px 0 0;font-size:14px}
.detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:18px;align-items:start}
.detail-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow)}
.detail-card h3{margin:0 0 14px;padding-bottom:10px;border-bottom:1px solid var(--border);font-size:15px}
.detail-list{margin:0;display:flex;flex-direction:column}
.detail-list>div{display:grid;grid-template-columns:150px 1fr;gap:10px;padding:8px 0;border-bottom:1px solid var(--border)}
.detail-list>div:last-child{border-bottom:0}
.detail-list dt{align-self:center}
.detail-list dd{margin:0;font-size:13px;overflow-wrap:anywhere}
.detail-list dd.is-empty{color:var(--muted)}
.classification-form{display:flex;flex-direction:column;gap:14px}
.classification-form label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
.classification-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.classification-actions button{background:var(--accent);color:#111;border:0;border-radius:8px;padding:10px 16px;font-weight:700;cursor:pointer}
.classification-actions button:hover:not(:disabled){background:var(--accent-hover)}
.classification-actions button:disabled{opacity:.6;cursor:wait}
.classification-actions .note-feedback{margin-top:0}


@media(max-width:700px){.detail-list>div{grid-template-columns:1fr;gap:4px}}
