/* Estudio · sistema de diseno (handoff Claude Design, paleta calida arcilla/hueso). */
:root{
  /* --muted oscurecido de #87847A a #6A675D para alcanzar contraste AA (>=4.5:1) sobre
     paper, bone y deep: se usa en texto pequeno (10-13px) por toda la app (metadatos,
     etiquetas de KPI, estados) que antes quedaba ~3.3:1, ilegible al sol en el celular. */
  --bone:#F3F1EA; --paper:#FCFBF7; --deep:#EFEBE0; --ink:#2B2926; --muted:#6A675D;
  --hair:#E7E3D8; --line2:#DCD7CA; --red:#C96442; --blue:#6E7F63; --yellow:#C79A4E;
  --accent:#C96442; --r:11px;
  /* UNA sola declaracion de la voz tipografica. Antes se declaraba aqui (Newsreader /
     Hanken / Space Mono) y se volvia a declarar 1300 lineas abajo con otras fuentes; la
     segunda ganaba por cascada, asi que lo que se leia aqui no era lo que se veia en
     pantalla. El handoff no usa monospace: las etiquetas van en Instrument Sans en
     mayusculas con letter-spacing. */
  --serif:'Cormorant Garamond',Georgia,serif;
  --sans:'Instrument Sans',system-ui,sans-serif;
  --mono:'Instrument Sans',system-ui,sans-serif;
}
*{ box-sizing:border-box; }
/* Enlace de salto: oculto hasta enfocarlo con Tab; deja saltar el chat/nav e ir al contenido. */
.skip-link{ position:fixed; left:10px; top:-60px; z-index:100; background:var(--accent,#C96442); color:#fff; padding:10px 16px; border-radius:9px; font-size:14px; text-decoration:none; box-shadow:0 8px 24px -8px rgba(0,0,0,.4); transition:top .15s ease; }
.skip-link:focus{ top:10px; }
html,body{ margin:0; }
/* Foco visible solo para navegacion por teclado (accesibilidad). */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible,.chip:focus-visible,.tab:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
button:disabled{ opacity:.6; cursor:default; }
body{ font-family:var(--sans); background:var(--bone); color:var(--ink); -webkit-font-smoothing:antialiased; font-size:15px; }
button,input,select,textarea{ font-family:inherit; color:inherit; }
::-webkit-scrollbar{ width:10px; height:10px; }
::-webkit-scrollbar-thumb{ background:#d9d1c0; border:3px solid var(--bone); border-radius:9px; }
@keyframes rise{ from{ opacity:0; transform:translateY(10px); } to{ opacity:1; transform:none; } }
@keyframes pop{ from{ opacity:0; transform:scale(.96); } to{ opacity:1; transform:none; } }

/* utilidades */
.fx{ display:flex; } .f1{ flex:1; min-width:0; } .col{ flex-direction:column; }
.jb{ justify-content:space-between; } .gap10{ gap:10px; }
.fs16{ font-size:16px; } .fs20{ font-size:20px; } .fw5{ font-weight:500; } .fw6{ font-weight:600; }
.money{ font-variant-numeric:tabular-nums; font-weight:600; }

/* ---------- Login ---------- */
#login{ position:fixed; inset:0; display:none; place-items:center; background:var(--deep); z-index:80; padding:22px; }
#login.show{ display:grid; }
.login-card{ width:min(94vw,380px); background:var(--paper); border:1px solid var(--hair); border-radius:16px; padding:40px 38px; text-align:center; box-shadow:0 30px 80px -40px rgba(43,40,36,.4); }
.login-card .mark{ width:44px; height:44px; margin:0 auto 14px; display:block; }
.login-card h1{ font-family:var(--serif); font-weight:500; font-size:30px; margin:0; }
.login-card .sub{ font-family:var(--mono); font-size:10px; letter-spacing:.22em; text-transform:uppercase; color:var(--muted); margin:6px 0 26px; }
.login-card input{ width:100%; border:1px solid var(--line2); border-radius:9px; background:#FFFDF8; padding:12px 14px; font-size:15px; margin-bottom:12px; outline:none; }
.login-card input:focus{ border-color:var(--accent); background:#fff; }
.login-err{ color:#B0533A; font-size:13px; min-height:18px; }
.auth-switch{ font-size:13px; color:var(--muted); margin-top:6px; }
.auth-switch a{ color:var(--accent); cursor:pointer; text-decoration:underline; }

/* ---------- Aceptar invitacion / recuperar contrasena (mismo peso visual que #login) ---------- */
#invitacion-card{ position:fixed; inset:0; display:none; place-items:center; background:var(--deep); z-index:80; padding:22px; }
#invitacion-card.show{ display:grid; }

/* ---------- Proyectos (public/proyectos.js) ----------
   El color del proyecto entra como --pj y tiñe la barra de avance, el borde de la
   tarjeta y la linea de tiempo: es lo que hace reconocible un proyecto de un vistazo. */
.pj-card{ display:block; text-decoration:none; color:inherit; background:var(--paper); border:1px solid var(--hair);
  border-left:3px solid var(--pj); border-radius:12px; padding:16px 18px; transition:.15s; }
.pj-card:hover{ border-color:var(--pj); box-shadow:0 4px 14px -8px rgba(41,40,36,.3); }
.pj-card-h{ display:flex; align-items:center; gap:9px; margin-bottom:8px; flex-wrap:wrap; }
.pj-ico{ font-size:16px; color:var(--pj); }
.pj-nom{ font-weight:600; font-size:15px; flex:1; min-width:0; }
.pj-desc{ font-size:13px; color:var(--muted); line-height:1.45; margin-bottom:12px; }
.pj-barra{ height:6px; border-radius:99px; background:color-mix(in srgb, var(--ink) 8%, var(--paper)); overflow:hidden; margin:10px 0 8px; }
.pj-barra span{ display:block; height:100%; border-radius:99px; transition:width .25s; }
.pj-meta{ display:flex; gap:12px; flex-wrap:wrap; font-size:12.5px; color:var(--muted); }
.pj-vencidas{ color:#B0533A; font-weight:600; }

.pj-resumen{ display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:14px;
  border:1px solid var(--hair); border-radius:12px; padding:16px 18px; background:var(--paper); }
.pj-r-item{ display:flex; flex-direction:column; gap:3px; }
.pj-r-lbl{ font-family:var(--mono); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); }
.pj-r-val{ font-family:var(--serif); font-size:24px; font-weight:500; line-height:1.1; }

.pj-lista{ border:1px solid var(--hair); border-radius:12px; overflow:hidden; }
.pj-fila{ display:flex; align-items:center; gap:12px; padding:11px 14px; border-bottom:1px solid var(--hair); cursor:pointer; transition:.12s; }
.pj-fila:last-child{ border-bottom:0; }
.pj-fila:hover{ background:var(--deep); }
.pj-fila.hecha .pj-fila-tit{ text-decoration:line-through; color:var(--muted); }
.pj-fila-tit{ flex:1; min-width:0; font-size:14px; }
.pj-fila-meta{ display:flex; align-items:center; gap:10px; font-size:12.5px; white-space:nowrap; }
.pj-check{ flex:0 0 20px; width:20px; height:20px; border-radius:6px; border:1.5px solid var(--line2);
  background:transparent; cursor:pointer; color:#fff; font-size:12px; line-height:1; }
.pj-check.on{ background:#6E7F63; border-color:#6E7F63; }

/* Linea de tiempo: posiciona por fecha sobre el rango del proyecto. No es un Gantt (no
   dibuja dependencias), es "que cae cuando y que se encima". */
.pj-tl{ border:1px solid var(--hair); border-radius:12px; padding:20px 22px 8px; background:var(--paper); overflow-x:auto; }
.pj-tl-eje{ position:relative; height:22px; border-bottom:2px solid var(--hair); margin-bottom:6px; min-width:600px; }
.pj-tl-cabo{ position:absolute; left:0; top:0; font-size:11.5px; color:var(--muted); }
.pj-tl-cabo.der{ left:auto; right:0; }
.pj-tl-hoy{ position:absolute; top:-4px; bottom:-8px; width:2px; background:var(--accent); }
.pj-tl-hoy span{ position:absolute; top:-14px; left:50%; transform:translateX(-50%); font-size:10px; color:var(--accent); font-weight:600; }
.pj-tl-pista{ position:relative; min-height:120px; min-width:600px; padding-top:10px; }
.pj-tl-hito{ position:absolute; top:0; transform:translateX(-50%); max-width:190px; }
.pj-tl-punto{ display:block; width:11px; height:11px; border-radius:50%; background:var(--pj); margin:0 auto 8px; }
.pj-tl-punto.hecho{ background:#6E7F63; }
.pj-tl-punto.vencido{ background:#B0533A; }
.pj-tl-caja{ background:var(--deep); border:1px solid var(--hair); border-radius:9px; padding:8px 10px; }
.pj-tl-fecha{ font-family:var(--mono); font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); margin-bottom:4px; }
.pj-tl-tarea{ font-size:12.5px; line-height:1.35; cursor:pointer; padding:2px 0; }
.pj-tl-tarea:hover{ color:var(--accent); }
.pj-tl-tarea.hecha{ text-decoration:line-through; color:var(--muted); }

/* Caja que contiene al calendario dentro de una pestaña de proyecto: le da el
   position:relative y la altura que .calfull (absolute; inset:0) necesita para no
   desbordarse sobre el resto de la pagina. */
.pj-calbox{ position:relative; height:calc(100vh - 340px); min-height:440px; border:1px solid var(--hair); border-radius:12px; overflow:hidden; }
.pj-calbox .calfull{ border-radius:12px; }

/* Editor de pasos de una plantilla de proyecto. Clases propias (plt-) y NO .pl-*, que ya
   son del editor de lineas de un paquete con otra rejilla. */
.plt-head,.plt-row{ display:grid; grid-template-columns:1fr 130px 80px 110px 30px; gap:8px; align-items:center; }
.plt-head{ font-family:var(--mono); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin-bottom:6px; }
.plt-row{ margin-bottom:8px; }
.plt-row .inp,.plt-row .sel{ padding:8px 10px; font-size:13px; }
@media (max-width:700px){
  .plt-head{ display:none; }
  .plt-row{ grid-template-columns:1fr 1fr; padding:10px; border:1px solid var(--line2); border-radius:10px; }
  .plt-row .inp[data-k="titulo"]{ grid-column:1/3; }
}

.pj-colores{ display:flex; gap:7px; flex-wrap:wrap; padding-top:5px; }
.pj-color{ width:26px; height:26px; border-radius:50%; border:2px solid transparent; cursor:pointer; }
.pj-color.on{ border-color:var(--ink); box-shadow:0 0 0 2px var(--paper) inset; }

/* Etiqueta del proyecto dentro del Calendario general */
.cf-proy{ display:inline-block; padding:1px 6px; border-radius:99px; font-size:10px; font-weight:600;
  background:color-mix(in srgb, var(--pj) 22%, transparent); color:var(--pj); margin-right:4px; }

@media (max-width:620px){
  .pj-resumen{ grid-template-columns:1fr 1fr; }
  .pj-tl-hito{ max-width:150px; }
}

/* ---------- Barra de sesion de soporte (impersonacion) ----------
   Fija arriba y con color propio: si estas dentro de la cuenta de otra persona, eso no
   se puede confundir con tu propia sesion ni un segundo. */
#imp-barra{ position:fixed; top:0; left:0; right:0; z-index:400; display:flex; align-items:center; justify-content:center;
  gap:14px; flex-wrap:wrap; padding:9px 16px; background:#8A4B2F; color:#FCFBF7; font-size:13px; text-align:center;
  box-shadow:0 2px 12px -4px rgba(0,0,0,.4); }
#imp-barra strong{ font-weight:600; }
#imp-barra .btn{ background:rgba(252,251,247,.14); border:1px solid rgba(252,251,247,.4); color:#FCFBF7; }
#imp-barra .btn:hover{ background:rgba(252,251,247,.24); }
body.con-imp{ padding-top:38px; }
@media (max-width:620px){ body.con-imp{ padding-top:62px; } }

/* ---------- Cuestionario de bienvenida (mismo peso visual que #login) ---------- */
#onboarding-quiz{ position:fixed; inset:0; display:none; place-items:center; background:var(--deep); z-index:80; padding:22px; overflow-y:auto; }
#onboarding-quiz.show{ display:grid; }
.quiz-card{ width:min(94vw,560px); text-align:left; max-height:92vh; overflow-y:auto; margin:auto; padding:34px 32px 30px; }
.quiz-card .mark{ margin:0 auto 14px; }
.quiz-card h1{ text-align:center; }
.quiz-card .sub{ text-align:center; margin-bottom:16px; }
.quiz-lead{ font-size:13.5px; color:var(--muted); text-align:center; margin:0 0 22px; }
.quiz-lead:empty{ display:none; }
/* Barra de pasos: reusa .al-wsteps/.al-wstep del wizard del album para que el producto
   hable un solo idioma visual. Aqui solo se centra y se separa. */
.quiz-steps{ justify-content:center; margin:0 0 18px; }
.quiz-steps:empty{ display:none; }
.quiz-q{ margin-bottom:20px; }
.quiz-qt{ font-size:13.5px; font-weight:600; margin-bottom:4px; }
.quiz-ayuda{ font-size:12px; color:var(--muted); margin-bottom:9px; line-height:1.45; }
.quiz-qt + .quiz-opts, .quiz-qt + .quiz-ops{ margin-top:9px; }
.quiz-opts{ display:flex; flex-wrap:wrap; gap:8px; }
.quiz-opt{ font-size:12.5px; font-weight:500; letter-spacing:.01em; padding:8px 14px; border:1px solid var(--line2); background:transparent; color:var(--ink); border-radius:40px; cursor:pointer; transition:.14s; }
.quiz-opt:hover{ border-color:var(--accent); }
.quiz-opt.on{ background:var(--accent); border-color:var(--accent); color:#fff; }
/* Opciones con subtitulo (autonomia, tiempo de entrega): tarjetas apiladas, mismo
   patron que .xarpiepreg-op. Un chip de una linea no aguanta explicar un trade-off. */
.quiz-ops{ display:flex; flex-direction:column; gap:8px; }
.quiz-op{ display:flex; flex-direction:column; gap:2px; text-align:left; padding:11px 14px; border:1px solid var(--line2); border-radius:11px; background:transparent; color:var(--ink); cursor:pointer; transition:.14s; }
.quiz-op:hover{ border-color:var(--accent); }
.quiz-op.on{ border-color:var(--accent); box-shadow:inset 0 0 0 1px var(--accent); background:var(--bone); }
.quiz-op-et{ font-size:13.5px; font-weight:600; }
.quiz-op-det{ font-size:12px; color:var(--muted); line-height:1.45; }
.quiz-ta{ width:100%; border:1px solid var(--line2); border-radius:9px; background:#FFFDF8; padding:12px 14px; font-size:14px; font-family:inherit; resize:vertical; outline:none; }
.quiz-ta:focus{ border-color:var(--accent); background:#fff; }
.quiz-btn{ width:100%; margin-top:14px; }
/* Atras / Saltar: navegacion secundaria, debajo del boton principal y sin competirle. */
.quiz-nav{ display:flex; justify-content:center; gap:10px; margin-top:12px; }
.quiz-nav:empty{ display:none; }
.quiz-espera{ text-align:center; padding:10px 0 4px; }
.quiz-espera p{ font-size:13.5px; color:var(--muted); margin:16px 0 0; }
/* Indeterminada: no sabemos cuanto tarda el modelo, asi que la barra recorre en loop en
   vez de mentir con un porcentaje. */
.quiz-espera-fill{ width:38%; animation:quizEspera 1.4s ease-in-out infinite; }
@keyframes quizEspera{ 0%{ margin-left:0 } 50%{ margin-left:62% } 100%{ margin-left:0 } }
.quiz-saludo p{ font-size:14.5px; line-height:1.62; margin:0 0 12px; }
.quiz-saludo p:last-child{ margin-bottom:0; }
:root[data-theme="dark"] .quiz-ta{ background:#262624; border-color:var(--line2); color:var(--ink); }
:root[data-theme="dark"] .quiz-ta:focus{ background:#2C2C2A; }
@media (prefers-reduced-motion:reduce){ .quiz-espera-fill{ animation:none; width:100%; } }

/* ---------- utilidades varias ---------- */
.muted{ color:var(--muted); }
.link-copy{ display:flex; gap:8px; align-items:center; }
.link-copy input{ flex:1; }
.step-row{ display:grid; grid-template-columns:1fr 70px 90px 116px 28px; gap:8px; align-items:center; margin-bottom:8px; }
.step-row input,.step-row select{ padding:8px 10px; font-size:13px; }
.badge-inactivo{ opacity:.5; }

/* ---------- Shell ---------- */
/* Ancho del riel de Xarpie. Lo pisa el divisor arrastrable (public/app.js) escribiendo
   --chat-w en linea sobre #app; este clamp es el default y el valor al restablecer. */
#app{ display:none; min-height:100vh; --chat-w: clamp(340px, 30vw, 480px); }
#app.show{ display:flex; }

.chatpane{ flex:0 0 clamp(320px,34%,460px); background:var(--deep); border-right:1px solid var(--hair); height:100vh; position:sticky; top:0; padding:24px 26px 22px; display:flex; flex-direction:column; min-width:0; }
.cp-brand{ display:flex; align-items:center; gap:12px; padding-bottom:18px; border-bottom:1px solid var(--hair); }
.mark{ width:40px; height:40px; flex:0 0 40px; }
.cp-logout{ margin-left:auto; background:transparent; border:1px solid var(--line2); border-radius:8px; width:30px; height:30px; cursor:pointer; color:var(--muted); font-size:15px; }
.cp-logout:hover{ background:#E4DFD2; color:var(--ink); }

.greet{ margin-top:18px; padding-bottom:16px; border-bottom:1px solid var(--hair); }
.greetkicker{ font-family:var(--mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); }
.greetname{ font-family:var(--serif); font-weight:500; font-size:31px; letter-spacing:-.012em; line-height:1.04; margin-top:8px; }

.chatscroll{ flex:1; min-height:0; overflow-y:auto; overflow-x:hidden; padding:16px 2px 8px; display:flex; flex-direction:column; gap:16px; }
.brow{ display:flex; }
.brow-ai{ justify-content:flex-start; gap:11px; align-items:flex-start; }
.brow-me{ justify-content:flex-end; }
.ava{ width:27px; height:27px; flex:0 0 27px; border-radius:50%; background:var(--accent); position:relative; margin-top:3px; }
.ava:after{ content:''; position:absolute; width:9px; height:9px; border-radius:50%; background:var(--deep); left:6px; top:6px; }
.bubwrap{ min-width:0; max-width:82%; }
.bub{ padding:13px 16px; font-size:14.5px; line-height:1.55; border-radius:16px; overflow-wrap:anywhere; white-space:pre-wrap; animation:rise .3s ease both; }
.bub-ai{ background:var(--paper); border:1px solid var(--hair); }
.bub-me{ background:#EAE3D5; color:var(--ink); border:1px solid var(--hair); }
.brow-me .bubwrap{ display:flex; justify-content:flex-end; }
.actnote{ font-family:var(--mono); font-size:10.5px; letter-spacing:.04em; color:var(--muted); margin-top:8px; display:flex; align-items:center; gap:7px; }
.actnote:before{ content:''; width:8px; height:8px; background:var(--accent); border-radius:50%; display:inline-block; }
.bub.typing{ color:var(--muted); font-style:italic; }

.chips{ display:flex; flex-wrap:wrap; gap:9px; margin:16px 0 12px; }
.chip{ font-size:12.5px; letter-spacing:.02em; padding:8px 15px; border:1px solid var(--line2); background:var(--paper); border-radius:40px; cursor:pointer; color:var(--ink); transition:.14s; }
.chip:hover{ border-color:#C6C0B0; background:#ECE7DB; }
/* Dos renglones: el texto arriba a todo lo ancho y los botones abajo. Con todo en una
   sola linea, el riel de Xarpie es angosto y los 4 botones se comian el ancho: el campo
   se quedaba en 17px y el texto se leia en vertical, una letra por renglon. */
.composer{ display:flex; flex-wrap:wrap; gap:8px; border:1px solid var(--line2); border-radius:16px; background:var(--paper); padding:10px 10px 8px; align-items:center; }
.composer #chat-send{ margin-left:auto; }
/* El input no muestra outline propio, asi que el foco por teclado se ve en el contenedor. */
.composer:focus-within{ border-color:var(--accent); box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 30%,transparent); }
/* Textarea, no input: pegar una lista de precios o un prompt largo en un campo de una
   sola linea es inusable. Crece solo hasta 200px y de ahi hace scroll (ver
   autoCrecerChat en app.js). Enter envia, Shift+Enter salta de linea. */
/* order:-1 lo sube al primer renglon; flex-basis 100% lo hace ocupar el ancho completo
   y empuja los botones al renglon de abajo. min-width:0 para que pueda encogerse. */
.composer textarea#chat-text{ order:-1; flex:1 1 100%; min-width:0; width:100%; border:0; background:transparent;
  font-family:inherit; font-size:15px; outline:none; padding:4px 2px; resize:none; line-height:1.45;
  max-height:200px; overflow-y:auto; }

/* ---- Xarpie: selector de modo + adjuntar imagen (vision) ---- */
.xarpiemode{ display:flex; gap:6px; margin:2px 0 10px; }
.tm-btn{ flex:0 0 auto; font-size:12px; font-weight:600; letter-spacing:.02em; padding:6px 13px; border:1px solid var(--line2); background:transparent; color:var(--muted); border-radius:40px; cursor:pointer; transition:.14s; }
.tm-btn:hover{ color:var(--ink); }
.tm-btn.on{ background:var(--accent); border-color:var(--accent); color:#fff; }
.cp-attach{ flex:0 0 auto; width:34px; height:34px; display:grid; place-items:center; border:0; background:transparent; color:var(--muted); cursor:pointer; border-radius:9px; transition:.14s; }
.cp-attach:hover{ background:var(--deep); color:var(--ink); }
.cp-attach[hidden]{ display:none; }
.cp-attach#chat-mic.listening{ background:var(--red); color:#fff; animation:mic-pulse 1.4s ease-in-out infinite; }
.cp-attach#chat-inspect.on{ background:var(--accent); color:#fff; }
body.inspeccionando, body.inspeccionando *{ cursor:crosshair !important; }
.insp-overlay{ position:fixed; z-index:9999; pointer-events:none; border:2px solid var(--accent); border-radius:6px; background:color-mix(in srgb, var(--accent) 14%, transparent); }
@keyframes mic-pulse{ 0%,100%{ box-shadow:0 0 0 0 color-mix(in srgb,var(--red) 45%,transparent); } 50%{ box-shadow:0 0 0 7px color-mix(in srgb,var(--red) 0%,transparent); } }
.attach-prev{ display:flex; align-items:center; gap:10px; padding:8px 10px; margin-bottom:8px; border:1px solid var(--line2); border-radius:12px; background:var(--paper); }
.attach-prev[hidden]{ display:none; }
.attach-prev img{ width:40px; height:40px; object-fit:cover; border-radius:7px; flex:0 0 40px; }
.attach-prev img[hidden]{ display:none; }
.attach-doc{ width:40px; height:40px; flex:0 0 40px; display:grid; place-items:center; border-radius:7px; background:var(--accent); color:#fff; font-family:var(--mono); font-size:10px; font-weight:700; letter-spacing:.04em; }
.attach-doc[hidden]{ display:none; }
.attach-name{ flex:1; min-width:0; font-size:12px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.attach-x{ flex:0 0 auto; width:24px; height:24px; border:0; background:transparent; color:var(--muted); cursor:pointer; font-size:13px; border-radius:6px; }
.attach-x:hover{ background:var(--deep); color:var(--ink); }
.bub-img{ display:block; max-width:100%; width:auto; max-height:280px; border-radius:10px; margin-bottom:8px; }
.brow-me .bub-img{ margin-left:auto; }

/* ---------- Content (right) ---------- */
.main{ flex:1; min-width:0; height:100vh; overflow-y:auto; }
.topbar{ position:sticky; top:0; z-index:5; background:rgba(243,241,234,.9); backdrop-filter:blur(10px); border-bottom:1px solid var(--hair); display:flex; align-items:center; gap:2px; padding:7px 20px; flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none; }
.topbar::-webkit-scrollbar{ display:none; }
.tab{ position:relative; flex:0 0 auto; white-space:nowrap; font-size:13px; font-weight:500; letter-spacing:.01em; padding:6px 12px; border-radius:8px; border:1px solid transparent; background:transparent; color:var(--muted); cursor:pointer; transition:.13s; }
.tab:hover{ background:#ECE7DB; color:var(--ink); }
.tab.on{ color:var(--ink); }
.tab.on:after{ content:''; position:absolute; left:12px; right:12px; bottom:1px; height:2px; border-radius:2px; background:var(--accent); }
.tab-cfg{ margin-left:2px; opacity:.5; font-size:14px; padding:6px 9px; }
.tab-cfg:hover{ opacity:1; }
/* Posponer una tarea (activa_desde): ver .posp-menu, definido despues de .usermenu
   porque hereda de esa clase y necesita ganarle el position. */
.posp-wrap{ position:relative; display:inline-flex; }
/* navegacion de dos filas: categorias (topbar) + subpestanas (subbar) */
.navbar{ position:sticky; top:0; z-index:6; }
.navbar .topbar{ position:static; }
.subbar{ display:flex; align-items:center; gap:2px; padding:6px 20px; overflow-x:auto; scrollbar-width:none; background:rgba(239,235,224,.92); backdrop-filter:blur(10px); border-bottom:1px solid var(--hair); }
.subbar::-webkit-scrollbar{ display:none; }
.subbar[hidden]{ display:none; }
.subtab{ flex:0 0 auto; white-space:nowrap; font-size:12.5px; font-weight:500; padding:5px 12px; border-radius:7px; border:1px solid transparent; background:transparent; color:var(--muted); cursor:pointer; transition:.13s; }
.subtab:hover{ background:#E4DFD2; color:var(--ink); }
.subtab.on{ color:var(--accent); background:color-mix(in srgb, var(--accent) 13%, transparent); }
.cp-sess{ font-family:var(--mono); font-size:12px; color:var(--muted); }
.wrap{ max-width:1180px; margin:0 auto; padding:28px 32px 80px; overflow-x:auto; }

.phead{ display:flex; align-items:flex-end; justify-content:space-between; border-bottom:1px solid var(--hair); padding-bottom:16px; margin-bottom:26px; gap:16px; flex-wrap:wrap; }
.ptitle{ font-family:var(--serif); font-weight:500; font-size:36px; letter-spacing:-.01em; line-height:1; }
.peyebrow{ position:relative; padding-left:16px; font-family:var(--mono); font-size:11px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin-bottom:9px; }
.peyebrow:before{ content:''; position:absolute; left:0; top:5px; width:7px; height:7px; border-radius:50%; background:var(--accent); }

/* botones */
.btn{ font-size:13px; font-weight:500; letter-spacing:.04em; padding:10px 18px; border:1px solid var(--line2); border-radius:9px; background:var(--paper); color:var(--ink); cursor:pointer; transition:.14s; }
.btn:hover{ background:#ECE7DB; color:var(--ink); }
.btn-p{ background:var(--accent); border-color:var(--accent); color:#fff; }
.btn-p:hover{ filter:brightness(.94); background:var(--accent); color:#fff; }
.btn-sm{ padding:7px 13px; font-size:12px; }
.btn-gh{ background:transparent; }
.btn-danger{ border-color:#CDA99A; color:#B0533A; background:transparent; }
.btn-danger:hover{ background:#B0533A; border-color:#B0533A; color:#fff; }

/* pills */
.pill{ display:inline-flex; align-items:center; font-size:11.5px; font-weight:500; letter-spacing:.01em; padding:3px 11px; border-radius:999px; border:1px solid transparent; }
.pill-red{ background:#F1DBD0; color:#A2492B; }
.pill-blue{ background:#E1E7DD; color:#4E6350; }
.pill-yellow{ background:#F0E6CA; color:#836327; }
.pill-ink{ background:#E9E5DA; color:#565349; }
.pill-ghost{ background:transparent; color:var(--muted); border-color:var(--line2); }

/* cards / stats */
.card,.stat,.pblock,.settcard{ background:var(--paper); border:1px solid var(--hair); border-radius:var(--r); box-shadow:0 1px 3px rgba(41,40,36,.04); }
.stat{ padding:16px 18px; position:relative; overflow:hidden; }
.statlabel{ font-family:var(--mono); font-size:10px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); }
.statnum{ font-family:var(--serif); font-weight:500; font-size:27px; letter-spacing:-.01em; margin-top:6px; line-height:1; font-variant-numeric:tabular-nums; }
.statbar{ position:absolute; right:15px; top:16px; width:13px; height:13px; border-radius:50%; box-shadow:0 0 0 4px color-mix(in srgb,var(--paper) 60%,transparent); }
.grid3{ display:grid; grid-template-columns:repeat(auto-fit,minmax(132px,1fr)); gap:14px; }
.dash{ display:grid; grid-template-columns:1fr 1fr; gap:16px; align-items:start; }

.pblock-h{ display:flex; align-items:center; justify-content:space-between; padding:12px 15px; border-bottom:1px solid var(--hair); }
.pblock-t{ font-family:var(--mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; font-weight:600; }
.pblock-t .w-count{ margin-left:8px; vertical-align:1px; }
.pbody{ padding:6px 15px 14px; }
/* Secciones colapsables de la ficha de cliente (preferencia por usuario). */
.evrow{ display:flex; align-items:center; gap:12px; padding:11px 0; border-bottom:1px solid var(--hair); }
.evrow:last-child{ border-bottom:0; }
.evtime{ font-family:var(--mono); font-size:12.5px; font-variant-numeric:tabular-nums; width:52px; flex:0 0 52px; color:var(--ink); }
.evname{ font-size:14px; line-height:1.2; }
.evmeta{ font-size:11.5px; color:var(--muted); margin-top:2px; }
.chk{ display:flex; align-items:flex-start; gap:11px; padding:10px 0; border-bottom:1px solid var(--hair); cursor:pointer; }
.chk:last-child{ border-bottom:0; }
.box{ width:18px; height:18px; flex:0 0 18px; border:1.5px solid var(--ink); border-radius:4px; margin-top:1px; display:flex; align-items:center; justify-content:center; transition:.12s; }
.box.done{ background:var(--ink); }
.box.done:after{ content:''; width:9px; height:5px; border-left:2px solid var(--paper); border-bottom:2px solid var(--paper); transform:rotate(-45deg) translateY(-1px); }
.chktext{ font-size:14px; line-height:1.35; }
.chktext.done{ text-decoration:line-through; color:var(--muted); }
.empty{ font-size:13px; color:var(--muted); padding:10px 0; }

/* ===== Editor de contrato a pantalla completa (#/contrato/:id) — recreacion del
   handoff "Editor de Contrato.dc.html": overlay fixed;inset:0 (mismo patron que
   .geditor), paleta oscura PROPIA via --ced-*, panel izquierdo (formulario) +
   panel derecho (documento sobre "papel"), sin iframe -- la vista previa es un
   espejo cliente-side de documents.js#contratoBodyV2, hay que mantenerla igual. ===== */
.ced{
  --ced-bg:#262624; --ced-panel:#30302e; --ced-panel2:#3a3a36; --ced-line:rgba(255,255,255,.09); --ced-line2:rgba(255,255,255,.05);
  --ced-ink:#f5f4ee; --ced-ink2:#bdbbb0; --ced-ink3:#84827b; --ced-accent:#d97757; --ced-accent2:#bd5d3a; --ced-ok:#93a986; --ced-gold:#cfa15e; --ced-red:#c9605a;
  --ced-serif:'Cormorant Garamond',Georgia,serif;
  --ced-paper:#f4efe9; --ced-paperink:#221d19; --ced-papermut:#6a6158; --ced-paperline:rgba(34,29,25,.14);
  position:fixed; inset:0; z-index:40; display:flex; flex-direction:column; background:var(--ced-bg);
  font-family:'Instrument Sans',var(--sans); color:var(--ced-ink); -webkit-font-smoothing:antialiased;
}
.ced button{ font-family:inherit; cursor:pointer; border:none; background:none; color:inherit; }
.ced input,.ced textarea{ font-family:inherit; }
.ced .ced-serif{ font-family:var(--ced-serif); font-weight:500; line-height:1; }
.ced .ced-label{ text-transform:uppercase; letter-spacing:.16em; font-size:10px; font-weight:600; color:var(--ced-ink3); }

/* cabecera */
.ced-top{ display:flex; align-items:center; gap:16px; padding:16px 26px; border-bottom:1px solid var(--ced-line); flex:none; flex-wrap:wrap; }
.ced-iconbtn{ width:38px; height:38px; border-radius:100px; border:1px solid var(--ced-line); display:flex; align-items:center; justify-content:center; color:var(--ced-ink2); transition:.14s; flex:none; font-size:16px; }
.ced-iconbtn:hover{ border-color:var(--ced-ink3); color:var(--ced-ink); }
.ced-thead{ display:flex; flex-direction:column; gap:3px; }
.ced-tnum{ font-family:var(--ced-serif); font-size:24px; font-weight:600; line-height:1; }
.ced-tsub{ font-size:12px; color:var(--ced-ink3); }
.ced-stpill{ display:inline-flex; align-items:center; gap:7px; padding:6px 13px; border-radius:100px; font-size:12px; font-weight:600; white-space:nowrap; }
.ced-st-borrador{ background:rgba(189,187,176,.14); color:var(--ced-ink2); }
.ced-st-enviado{ background:rgba(217,119,87,.16); color:var(--ced-accent); }
.ced-st-falta{ background:rgba(207,161,94,.16); color:var(--ced-gold); }
.ced-st-activo{ background:rgba(147,169,134,.16); color:var(--ced-ok); }
.ced-st-vencido{ background:rgba(201,96,90,.16); color:var(--ced-red); }
.ced-dot{ width:7px; height:7px; border-radius:100px; display:inline-block; background:currentColor; }
.ced-spread{ margin-left:auto; display:flex; align-items:center; gap:10px; flex-wrap:wrap; position:relative; }
.ced-btn{ display:inline-flex; align-items:center; gap:8px; padding:11px 18px; border-radius:100px; font-size:13px; font-weight:600; transition:.16s; border:1px solid var(--ced-line); color:var(--ced-ink); white-space:nowrap; }
.ced-btn:hover{ border-color:var(--ced-ink3); }
.ced-btn:disabled{ opacity:.5; cursor:not-allowed; }
.ced-btn.accent{ background:var(--ced-accent); border-color:var(--ced-accent); color:#fff; }
.ced-btn.accent:hover{ background:var(--ced-accent2); }
.ced-btn.sm{ padding:8px 14px; font-size:12.5px; }
.ced-savestate{ font-size:11px; color:var(--ced-ink3); white-space:nowrap; }

/* panel flotante (Firmantes/Configuracion/Acciones) -- mismo patron abrir/cerrar/
   click-afuera/Escape que .usermenu, con paleta --ced-* en vez de la del CRM. */
.ced-panel{ position:absolute; top:100%; right:0; margin-top:8px; width:290px; background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:14px; padding:16px; box-shadow:0 20px 50px -20px rgba(0,0,0,.5); z-index:5; }
.ced-panel-t{ font-family:var(--ced-serif); font-size:16px; font-weight:600; margin:0 0 12px; }
.ced-prow{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:9px 0; border-bottom:1px solid var(--ced-line2); font-size:13px; }
.ced-prow:last-child{ border-bottom:0; }
.ced-prow .pn{ font-weight:600; }
.ced-prow .ps{ color:var(--ced-ink3); font-size:11.5px; margin-top:2px; }
.ced-prow .ps.ok{ color:var(--ced-ok); }
.ced-pact{ width:100%; text-align:left; padding:9px 4px; font-size:13px; border-radius:8px; transition:.14s; }
.ced-pact:hover{ background:var(--ced-panel2); }
.ced-pact.danger:hover{ color:var(--ced-red); }
.ced-psep{ height:1px; background:var(--ced-line2); margin:6px 0; }
.ced-toggle{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:10px 0; }
.ced-toggle .tt{ font-size:13px; font-weight:600; }
.ced-toggle .ts{ font-size:11px; color:var(--ced-ink3); margin-top:2px; }
.ced-sw2{ width:38px; height:22px; border-radius:100px; background:var(--ced-line); position:relative; transition:.2s; flex:none; }
.ced-sw2:after{ content:""; position:absolute; top:2px; left:2px; width:18px; height:18px; border-radius:100px; background:var(--ced-ink); transition:.2s; }
.ced-sw2.on{ background:var(--ced-accent); }
.ced-sw2.on:after{ left:18px; background:#fff; }

/* cuerpo: 2 paneles */
.ced-body{ flex:1; min-height:0; display:flex; }
.ced-editor{ width:46%; max-width:620px; min-width:400px; flex:none; overflow-y:auto; border-right:1px solid var(--ced-line); padding:26px 30px 60px; }
.ced-sec{ margin-bottom:30px; }
.ced-sechd{ display:flex; align-items:center; gap:10px; margin-bottom:16px; }
.ced-sechd .n{ width:22px; height:22px; border-radius:100px; background:var(--ced-panel); border:1px solid var(--ced-line); display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:700; color:var(--ced-ink2); flex:none; }
.ced-sechd h3{ font-family:var(--ced-serif); font-size:19px; font-weight:600; margin:0; }
.ced-grid2{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.ced-field{ display:flex; flex-direction:column; gap:7px; margin-bottom:14px; }
.ced-field label{ font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--ced-ink3); font-weight:600; }
.ced-inp{ background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:11px; padding:12px 14px; font-size:14px; color:var(--ced-ink); outline:none; transition:.14s; width:100%; }
.ced-inp:focus{ border-color:rgba(217,119,87,.55); }
.ced-inp::placeholder{ color:var(--ced-ink3); }
.ced-static{ background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:11px; padding:12px 14px; font-size:14px; color:var(--ced-ink); }
.ced-static a{ color:var(--ced-accent); text-decoration:none; font-size:12px; font-weight:600; }
.ced-static a:hover{ text-decoration:underline; }
.ced-money{ position:relative; }
.ced-money .cur{ position:absolute; left:14px; top:50%; transform:translateY(-50%); color:var(--ced-ink3); font-size:14px; }
.ced-money .ced-inp{ padding-left:28px; font-family:var(--ced-serif); font-size:20px; font-weight:600; }

/* plantillas */
.ced-tplsec{ margin:-4px 0 26px; padding-bottom:26px; border-bottom:1px solid var(--ced-line); }
.ced-tplgrid{ display:grid; grid-template-columns:repeat(2,1fr); gap:10px; }
.ced-tpl{ position:relative; text-align:left; background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:13px; padding:14px 15px; transition:.14s; cursor:pointer; }
.ced-tpl:hover{ border-color:var(--ced-ink3); }
.ced-tpl.on{ border-color:var(--ced-accent); background:rgba(217,119,87,.07); }
.ced-tpl .tn{ font-family:var(--ced-serif); font-size:17px; font-weight:600; line-height:1.1; padding-right:20px; }
.ced-tpl .td{ font-size:11.5px; color:var(--ced-ink3); margin-top:5px; line-height:1.45; max-height:32px; overflow:hidden; }
.ced-tpl .tmeta{ font-size:11px; color:var(--ced-ink2); margin-top:9px; display:flex; gap:10px; }
.ced-tpl .cbadge{ position:absolute; top:12px; right:12px; font-size:8.5px; letter-spacing:.12em; text-transform:uppercase; font-weight:700; color:var(--ced-gold); }
.ced-tpl.on .tick{ position:absolute; top:11px; right:11px; color:var(--ced-accent); }
.ced-tpldel{ position:absolute; bottom:11px; right:11px; color:var(--ced-ink3); opacity:0; transition:.14s; }
.ced-tpl:hover .ced-tpldel{ opacity:1; }
.ced-tpldel:hover{ color:var(--ced-accent); }
.ced-tplnew{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px; border:1px dashed var(--ced-line); border-radius:13px; padding:14px; color:var(--ced-ink2); font-size:13px; font-weight:600; transition:.14s; min-height:96px; width:100%; }
.ced-tplnew:hover{ border-color:var(--ced-accent); color:var(--ced-accent); }
.ced-tplsave{ display:flex; gap:10px; margin-top:10px; }
.ced-tplsave .ced-inp{ flex:1; }
.ced-tplbar{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-top:12px; padding:12px 14px; background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:13px; }
.ced-tplbar .bn{ font-family:var(--ced-serif); font-size:16px; font-weight:600; display:flex; align-items:center; gap:9px; }
.ced-tplbar .pencil{ color:var(--ced-ink3); }
.ced-tplbar .pencil:hover{ color:var(--ced-accent); }
.ced-tpldirty{ display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:600; color:var(--ced-gold); }
.ced-tplbar .acts{ margin-left:auto; display:flex; gap:8px; }
.ced-chiprow{ display:flex; gap:8px; flex-wrap:wrap; }
.ced-pctchip{ padding:9px 15px; border-radius:100px; border:1px solid var(--ced-line); font-size:13px; font-weight:600; color:var(--ced-ink2); transition:.14s; }
.ced-pctchip.on{ background:var(--ced-accent); border-color:var(--ced-accent); color:#fff; }
.ced-pctchip:not(.on):hover{ border-color:var(--ced-ink3); color:var(--ced-ink); }

.ced-calcbox{ background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:14px; padding:4px 16px; margin-top:14px; }
.ced-calcrow{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:13px 0; border-bottom:1px solid var(--ced-line2); font-size:13.5px; }
.ced-calcrow:last-child{ border-bottom:none; }
.ced-calcrow .cl{ color:var(--ced-ink2); }
.ced-calcrow .cv{ font-family:var(--ced-serif); font-size:18px; font-weight:600; }
.ced-calcrow.tot .cv{ color:var(--ced-accent); }

/* servicios */
.ced-svc{ display:flex; align-items:center; gap:10px; margin-bottom:9px; transition:.14s; }
.ced-svc.dragging{ opacity:.4; }
.ced-handle{ color:var(--ced-ink3); cursor:grab; flex:none; display:flex; padding:4px; touch-action:none; }
.ced-chk{ width:22px; height:22px; border-radius:7px; border:1.5px solid var(--ced-ink3); flex:none; display:flex; align-items:center; justify-content:center; transition:.14s; color:transparent; font-size:13px; }
.ced-chk.on{ background:var(--ced-accent); border-color:var(--ced-accent); color:#fff; }
.ced-svc .ced-inp{ flex:1; }
.ced-svc.off .ced-inp{ color:var(--ced-ink3); text-decoration:line-through; }
.ced-del{ width:34px; height:34px; border-radius:9px; border:1px solid var(--ced-line); display:flex; align-items:center; justify-content:center; color:var(--ced-ink3); flex:none; transition:.14s; font-size:14px; }
.ced-del:hover{ border-color:var(--ced-accent); color:var(--ced-accent); }
.ced-hint{ font-size:12px; color:var(--ced-ink3); margin-top:10px; line-height:1.5; }
.ced-addbtn{ display:inline-flex; align-items:center; gap:8px; margin-top:12px; padding:10px 16px; border-radius:100px; border:1px dashed var(--ced-line); font-size:13px; font-weight:600; color:var(--ced-ink2); transition:.14s; }
.ced-addbtn:hover{ border-color:var(--ced-accent); color:var(--ced-accent); }

/* clausulas */
.ced-clause{ display:flex; gap:12px; padding:12px 0; border-bottom:1px solid var(--ced-line2); }
.ced-clause:last-child{ border-bottom:none; }
.ced-clause .ct{ flex:1; font-size:13.5px; line-height:1.55; color:var(--ced-ink2); }
.ced-clause.off .ct{ color:var(--ced-ink3); opacity:.6; }
.ced-clause .ced-chk{ margin-top:1px; }
.ced-addclause{ display:flex; gap:10px; margin-top:14px; }
.ced-addclause .ced-inp{ flex:1; }
.ced-notice{ background:var(--ced-panel); border:1px solid var(--ced-line); border-radius:13px; padding:16px; font-size:13px; line-height:1.6; color:var(--ced-ink2); }
.ced-notice p{ margin:0 0 12px; }

/* panel derecho: preview */
.ced-preview{ flex:1; min-width:0; overflow-y:auto; background:repeating-linear-gradient(45deg,#211f1d,#211f1d 12px,#232120 12px,#232120 24px); padding:34px; }
.ced-previewbar{ display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:20px; }
.ced-paper{ max-width:640px; margin:0 auto; background:var(--ced-paper); color:var(--ced-paperink); border-radius:4px; box-shadow:0 30px 80px -30px rgba(0,0,0,.6); padding:56px 58px 50px; }
.ced-pbrand{ display:flex; align-items:center; justify-content:space-between; gap:16px; padding-bottom:20px; border-bottom:1px solid var(--ced-paperline); }
.ced-pbrand .pn{ font-family:var(--ced-serif); font-size:22px; font-weight:600; line-height:1.05; }
.ced-pbrand img{ display:block; max-height:32px; margin-bottom:6px; }
.ced-pbrand .pe{ font-size:9.5px; letter-spacing:.2em; text-transform:uppercase; color:var(--ced-papermut); margin-top:5px; }
.ced-pbrand .pmeta{ text-align:right; font-size:11px; color:var(--ced-papermut); line-height:1.7; }
.ced-ptitle{ font-family:var(--ced-serif); font-size:34px; font-weight:600; line-height:1.05; margin:30px 0 6px; }
.ced-pparties{ font-size:13.5px; line-height:1.7; color:#453e37; }
.ced-pparties b{ color:var(--ced-paperink); font-weight:600; }
.ced-plabel{ font-size:10px; letter-spacing:.18em; text-transform:uppercase; color:var(--ced-papermut); font-weight:700; margin:32px 0 12px; }
.ced-psvc{ display:flex; align-items:flex-start; gap:11px; padding:8px 0; font-size:14px; border-bottom:1px solid rgba(34,29,25,.07); }
.ced-psvc:last-child{ border-bottom:none; }
.ced-psvc .pc{ color:var(--ced-accent); flex:none; margin-top:2px; }
.ced-ptable{ border:1px solid var(--ced-paperline); border-radius:8px; overflow:hidden; }
.ced-ptrow{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:14px 18px; border-bottom:1px solid rgba(34,29,25,.08); font-size:14px; }
.ced-ptrow:last-child{ border-bottom:none; }
.ced-ptrow .pl{ color:#453e37; }
.ced-ptrow .pl small{ display:block; color:var(--ced-papermut); font-size:11.5px; margin-top:2px; }
.ced-ptrow .pv{ font-family:var(--ced-serif); font-size:19px; font-weight:600; }
.ced-ptrow.grand{ background:rgba(217,119,87,.08); }
.ced-ptrow.grand .pv{ color:var(--ced-accent2); font-size:22px; }
.ced-pclause{ font-size:12.5px; line-height:1.75; color:#453e37; margin-bottom:10px; display:flex; gap:9px; }
.ced-pclause .pcn{ font-weight:700; color:var(--ced-paperink); flex:none; }
.ced-psign{ display:grid; grid-template-columns:1fr 1fr; gap:40px; margin-top:44px; }
.ced-psignbox{ border-top:1px solid var(--ced-paperink); padding-top:10px; }
.ced-psignbox img{ display:block; max-height:48px; margin-bottom:4px; }
.ced-psignbox .snm{ font-size:13px; font-weight:600; }
.ced-psignbox .sst{ font-size:11px; color:var(--ced-papermut); margin-top:2px; }
.ced-psignbox.done .snm{ font-family:var(--ced-serif); font-style:italic; font-size:22px; font-weight:500; }
.ced-psignbox.done .sst{ color:var(--ced-ok); font-weight:600; }
.ced-pfoot{ text-align:center; font-size:11px; color:var(--ced-papermut); margin-top:34px; }

@media (max-width:1080px){
  .ced-body{ flex-direction:column; }
  .ced-editor{ width:100%; max-width:none; min-width:0; border-right:none; border-bottom:1px solid var(--ced-line); }
  .ced-preview{ padding:22px; }
  .ced-paper{ padding:40px 32px; }
}
.dz-sw{ width:28px; height:28px; border-radius:50%; border:2px solid transparent; cursor:pointer; padding:0; }
.dz-sw.on{ border-color:var(--ink); box-shadow:0 0 0 2px var(--paper), 0 0 0 3px var(--ink); }
.dz-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:8px; }
.dz-card{ border:1px solid var(--line2); border-radius:10px; background:var(--paper); cursor:pointer; padding:0; height:64px; display:flex; align-items:center; justify-content:center; overflow:hidden; font-size:11px; color:var(--muted); text-align:center; }
.dz-card.on{ border-color:var(--accent); box-shadow:inset 0 0 0 1px var(--accent); }
.dz-card img{ width:100%; height:100%; object-fit:cover; }
.dz-card-add{ font-size:12px; }

/* tables */
.table{ width:100%; border-collapse:collapse; background:var(--paper); border:1px solid var(--hair); border-radius:var(--r); overflow:hidden; }
.table th{ text-align:left; font-family:var(--mono); font-size:10px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); font-weight:400; padding:13px 16px; border-bottom:1px solid var(--hair); }
.table td{ padding:14px 16px; border-bottom:1px solid var(--hair); font-size:14px; vertical-align:middle; }
.trow{ cursor:pointer; transition:.1s; }
.trow:hover{ background:#F1EEE5; }
.trow:last-child td{ border-bottom:0; }
.tname{ font-weight:600; }
.tsub{ font-size:12px; color:var(--muted); margin-top:2px; }
.docnum{ font-family:var(--mono); font-size:12px; letter-spacing:.14em; text-transform:uppercase; color:var(--accent); }

.toolbar{ display:flex; gap:12px; align-items:center; margin-bottom:18px; flex-wrap:wrap; }
.search{ flex:1; min-width:200px; display:flex; align-items:center; gap:10px; border:1px solid var(--line2); border-radius:10px; background:var(--paper); padding:9px 15px; }
.search input{ border:0; background:transparent; outline:none; font-size:14px; flex:1; }
.search .navdot{ width:11px; height:11px; flex:0 0 11px; border:1.5px solid #C6C0B0; border-radius:50%; }
.fchips{ display:flex; gap:8px; flex-wrap:wrap; }
.fchips[hidden]{ display:none; }
.fchip{ font-size:12px; letter-spacing:.05em; text-transform:uppercase; padding:8px 14px; border:1px solid var(--line2); border-radius:8px; background:var(--paper); cursor:pointer; color:var(--muted); }
.fchip.on{ background:var(--accent); color:#fff; border-color:var(--accent); }

/* modal */
.ov{ position:fixed; inset:0; background:rgba(43,41,38,.42); display:none; align-items:center; justify-content:center; z-index:60; padding:24px; }
.ov.show{ display:flex; animation:pop .18s ease both; }
.modal{ width:520px; max-width:100%; max-height:90vh; overflow-y:auto; background:var(--paper); border:1px solid var(--line2); border-radius:16px; animation:pop .2s ease both; }
.modalwide{ width:600px; }
/* Editor de paquete: lleva una tabla de elementos (concepto + entregable + 3 numeros)
   que no cabe en 600px sin quedar apretada. */
.modalxl{ width:920px; }

/* ---------- Editor de paquete: lineas con precio y costo ---------- */
.pl-head,.pl-row{ display:grid; grid-template-columns:1fr 136px 62px 92px 92px 86px 30px; gap:8px; align-items:center; }
.pl-head.nocosto,.pl-row.nocosto{ grid-template-columns:1fr 136px 62px 92px 86px 30px; }
.pl-head{ font-family:var(--mono); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin-bottom:6px; }
.pl-row{ margin-bottom:8px; }
.pl-row .inp,.pl-row .sel{ padding:8px 10px; font-size:13px; }
.pl-sub{ text-align:right; font-size:13px; color:var(--muted); font-variant-numeric:tabular-nums; }
.pl-chips{ display:flex; flex-wrap:wrap; gap:6px; margin-bottom:12px; }
.pl-chips .chip{ padding:6px 12px; font-size:12px; }
.pl-calc{ margin-top:18px; padding:14px 16px; border:1px solid var(--hair); border-radius:12px; background:color-mix(in srgb, var(--ink) 3%, var(--paper)); }
.pl-crow{ display:flex; justify-content:space-between; align-items:center; gap:12px; padding:5px 0; font-size:13.5px; }
/* Sin esto el [hidden] no surte efecto: una regla de autor con display gana contra la
   hoja del navegador, y las filas ocultas se seguian viendo. */
.pl-crow[hidden]{ display:none; }
.pl-crow .money{ font-variant-numeric:tabular-nums; }
.pl-crow.tot{ border-top:1px solid var(--hair); margin-top:8px; padding-top:11px; font-weight:600; font-size:15px; }
.pl-crow.tot .v{ color:var(--accent); font-variant-numeric:tabular-nums; }
.pl-money{ position:relative; display:inline-block; }
.pl-money .cur{ position:absolute; left:11px; top:50%; transform:translateY(-50%); color:var(--muted); font-size:13px; pointer-events:none; }
.pl-money .inp{ width:150px; padding-left:24px; text-align:right; font-size:15px; font-weight:600; }
.pl-derivados{ margin-top:12px; padding:10px 14px; border-radius:10px; background:var(--bone); font-size:13px; color:var(--muted); }
.pl-derivados .flabel{ display:inline; margin-right:6px; }
@media (max-width:760px){
  .pl-head{ display:none; }
  .pl-row,.pl-row.nocosto{ grid-template-columns:1fr 1fr; gap:6px; padding:10px; border:1px solid var(--line2); border-radius:10px; }
  .pl-row .inp[data-k="concepto"]{ grid-column:1/3; }
  .pl-sub{ text-align:left; }
}
.modalxl{ width:960px; max-width:96vw; }
.mhead{ display:flex; align-items:center; justify-content:space-between; padding:20px 24px; border-bottom:1px solid var(--hair); }
.mtitle{ font-family:var(--serif); font-weight:500; font-size:22px; }
.x{ width:30px; height:30px; border:1px solid var(--line2); border-radius:8px; background:transparent; cursor:pointer; font-size:15px; line-height:1; color:var(--ink); }
.x:hover{ background:#ECE7DB; }
.mbody{ padding:22px 24px; }
.field{ margin-bottom:16px; }
.flabel{ font-family:var(--mono); font-size:11px; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); margin-bottom:6px; display:block; }
.inp,.sel,.ta{ width:100%; font-size:14px; padding:10px 12px; border:1px solid var(--line2); border-radius:9px; background:#FFFDF8; outline:none; }
.inp:focus,.sel:focus,.ta:focus{ background:#fff; border-color:var(--accent); }
.ta{ resize:vertical; min-height:76px; }
.frow{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.mfoot{ display:flex; gap:10px; align-items:center; padding:18px 24px; border-top:1px solid var(--hair); }
.paybox{ background:#F6F3EB; border:1px solid var(--hair); border-radius:10px; padding:16px; margin-top:4px; }
.payline{ display:flex; justify-content:space-between; font-size:13px; padding:6px 0; border-bottom:1px solid var(--hair); }
.payline:last-child{ border-bottom:0; }
.paybig{ display:flex; justify-content:space-between; align-items:baseline; padding-top:10px; }

.settcard{ padding:28px 30px; max-width:680px; }

/* toast */
#toast{ position:fixed; left:50%; bottom:34px; transform:translateX(-50%) translateY(14px); background:var(--ink); color:var(--paper); padding:13px 22px; border-radius:10px; font-size:14px; z-index:90; display:flex; align-items:center; gap:11px; opacity:0; pointer-events:none; transition:.25s; }
#toast.show{ opacity:1; transform:translateX(-50%) translateY(0); }
#toast:before{ content:''; width:9px; height:9px; background:var(--accent); border-radius:50%; }

/* FAB del asistente (solo movil) */
#fab{ display:none; position:fixed; right:20px; bottom:20px; z-index:55; background:var(--accent); color:#fff; border:0; border-radius:30px; padding:13px 20px; font-size:14px; cursor:pointer; box-shadow:0 12px 30px -8px rgba(43,40,36,.45); align-items:center; gap:8px; }

/* Backdrop del chat de Xarpie en movil: oscurece el CRM detras y cierra al tocar.
   Fuera de movil nunca se muestra (el chat es una columna fija, no un overlay). */
.cp-backdrop{ display:none; }

@media (max-width:860px){
  .chatpane{ position:fixed; left:0; top:0; z-index:70; width:min(92vw,420px); height:100vh; transform:translateX(-100%); transition:transform .24s ease; box-shadow:14px 0 40px -20px rgba(0,0,0,.4); }
  .chatpane.open{ transform:translateX(0); }
  #app.show{ display:block; }
  .main{ height:100vh; }
  #fab{ display:flex; }
  .dash{ grid-template-columns:1fr; }
  .frow{ grid-template-columns:1fr; }
  .cp-sess{ display:none; }
  /* Señal de que la barra de pestañas se desliza: sin esto, Dinero/Sitio/Marketing
     quedan fuera de pantalla a la derecha y el usuario no sabe que existen. */
  .navbar{ position:sticky; }
  .navbar::after{ content:''; position:absolute; top:0; right:0; bottom:0; width:26px; pointer-events:none; background:linear-gradient(to right, transparent, var(--bone) 78%); z-index:7; }
  .cp-backdrop.show{ display:block; position:fixed; inset:0; z-index:69; background:rgba(43,41,38,.42); animation:pop .18s ease both; }
}
/* Boton de cerrar el chat de Xarpie (visible en movil, dentro de la cabecera del panel). */
.cp-close{ display:none; }
@media (max-width:860px){
  .cp-close{ display:grid; place-items:center; margin-left:8px; width:30px; height:30px; flex:0 0 30px; border:1px solid var(--line2); border-radius:8px; background:transparent; color:var(--muted); cursor:pointer; font-size:15px; line-height:1; }
  .cp-close:hover{ background:#E4DFD2; color:var(--ink); }
}

/* ---------- Editor de la pagina publica (landing) ---------- */
.lp-editor{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.05fr); gap:22px; align-items:start; }
.lp-panel{ display:flex; flex-direction:column; gap:16px; min-width:0; }
.lp-card-sec{ max-width:none; padding:20px 22px; }
.lp-status{ font-size:13px; color:var(--muted); }
.lp-status .pill{ margin-right:6px; }
.lp-domain{ font-size:13px; color:var(--muted); white-space:nowrap; }
.lp-tpls{ display:flex; flex-wrap:wrap; gap:8px; margin-top:6px; }
.lp-tpl{ padding:8px 14px; border:1px solid var(--line2); border-radius:8px; background:#FFFDF8; font-size:13px; cursor:pointer; }
.lp-tpl.on{ border-color:var(--accent); background:#fff; color:var(--accent); font-weight:600; }
.lp-color{ width:100%; height:38px; padding:2px; border:1px solid var(--line2); border-radius:9px; background:#fff; cursor:pointer; }
.lp-blk{ border:1px solid var(--hair); border-radius:11px; margin-bottom:12px; overflow:hidden; background:#fff; }
.lp-blk-h{ display:flex; align-items:center; justify-content:space-between; padding:9px 14px; background:var(--bone); border-bottom:1px solid var(--hair); }
.lp-blk-t{ font-weight:600; font-size:13.5px; }
.lp-blk-actions{ display:flex; gap:4px; }
.lp-mini{ width:26px; height:26px; border:1px solid var(--line2); background:#FFFDF8; border-radius:7px; cursor:pointer; font-size:12px; color:var(--muted); }
.lp-mini:disabled{ opacity:.4; cursor:default; }
.lp-mini-x:hover{ border-color:var(--red); color:var(--red); }
.lp-blk-body{ padding:16px 14px; }
.lp-blk-body .field:last-child{ margin-bottom:0; }
.lp-note{ font-size:12.5px; margin:4px 0 0; }
.lp-addwrap{ display:flex; gap:8px; margin-top:6px; }
.lp-addwrap .sel{ flex:1; }
.lp-items{ display:flex; flex-direction:column; gap:8px; }
.lp-item{ display:flex; gap:6px; align-items:center; }
.lp-item .inp{ padding:8px 10px; font-size:13px; }
.lp-item-x{ border:0; background:transparent; cursor:pointer; color:var(--muted); font-size:13px; padding:4px; }
.lp-item-x:hover{ color:var(--red); }
.lp-thumbs{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.lp-thumb{ position:relative; width:64px; height:64px; border-radius:8px; overflow:hidden; border:1px solid var(--hair); }
.lp-thumb.lp-thumb-lg{ width:120px; height:80px; }
.lp-thumb img{ width:100%; height:100%; object-fit:cover; }
.lp-thumb-x{ position:absolute; top:2px; right:2px; background:rgba(0,0,0,.55); color:#fff; width:20px; height:20px; border-radius:50%; border:0; line-height:1; cursor:pointer; font-size:11px; }
/* Galeria con texto alternativo (SEO de imagenes): la miniatura crece para dejar
   espacio a un input chico debajo, en vez del cuadrado fijo sin texto. */
.lp-thumbs-alt .lp-thumb{ width:96px; height:auto; overflow:visible; border:0; display:flex; flex-direction:column; gap:4px; }
.lp-thumbs-alt .lp-thumb img{ width:96px; height:64px; border-radius:8px; border:1px solid var(--hair); }
.lp-thumb-alt{ width:96px; font-size:10.5px; padding:5px 7px; }
.lp-add-img{ border:1px dashed var(--line2); background:#FFFDF8; border-radius:8px; padding:0 14px; height:64px; min-width:70px; cursor:pointer; font-size:12.5px; color:var(--muted); }
.lp-add-img:hover{ border-color:var(--accent); color:var(--accent); }
/* Galeria digital (fotos del evento, CRM y portal comparten el mismo grid). */
.gal-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(96px, 1fr)); gap:8px; }
.gal-tile{ position:relative; aspect-ratio:1; border-radius:8px; overflow:hidden; border:1px solid var(--hair); background:var(--hair); }
.gal-tile img{ width:100%; height:100%; object-fit:cover; display:block; }
.gal-tile-x{ position:absolute; top:4px; right:4px; background:rgba(0,0,0,.6); color:#fff; width:22px; height:22px; border-radius:50%; border:0; line-height:1; cursor:pointer; font-size:12px; }
.lp-savebar{ position:sticky; bottom:0; display:flex; align-items:center; justify-content:flex-end; gap:14px; padding:12px 0 4px; background:var(--bone); }
.lp-dirty{ font-size:12.5px; color:var(--yellow); font-weight:600; }
.lp-previewwrap{ position:sticky; top:18px; border:1px solid var(--hair); border-radius:12px; overflow:hidden; background:#fff; }
.lp-preview-top{ font-family:var(--mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); padding:10px 14px; border-bottom:1px solid var(--hair); background:var(--paper); }
.lp-preview{ width:100%; height:calc(100vh - 150px); min-height:520px; border:0; display:block; background:#fff; }
@media (max-width:980px){
  .lp-editor{ grid-template-columns:1fr; }
  .lp-previewwrap{ position:static; }
  .lp-preview{ height:70vh; }
}

/* ---------- Disponibilidad semanal (Citas) ---------- */
.ci-day{ display:grid; grid-template-columns:110px 1fr; gap:12px; align-items:start; padding:10px 0; border-bottom:1px solid var(--hair); }
.ci-day:last-child{ border-bottom:0; }
.ci-day-n{ font-weight:600; font-size:14px; padding-top:8px; }
.ci-ranges{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.ci-range{ display:flex; align-items:center; gap:6px; background:var(--paper); border:1px solid var(--hair); border-radius:9px; padding:5px 8px; }
.ci-range .inp{ width:auto; padding:6px 8px; font-size:13px; }
.ci-a{ color:var(--muted); font-size:13px; }
.ci-none{ font-size:13px; padding-top:8px; }
.ci-add{ white-space:nowrap; }
@media (max-width:560px){ .ci-day{ grid-template-columns:1fr; gap:6px; } .ci-day-n{ padding-top:0; } }

/* ---------- Ficha del cliente ---------- */
.lp-back{ display:inline-block; color:var(--muted); text-decoration:none; font-size:13px; cursor:pointer; }
.lp-back:hover{ color:var(--accent); }
.cl-inforow{ display:flex; justify-content:space-between; gap:12px; padding:9px 0; border-bottom:1px solid var(--hair); font-size:14px; }
.cl-inforow:last-child{ border-bottom:0; }
.cl-notas{ padding:10px 0 2px; border-top:1px solid var(--hair); margin-top:2px; }
.cl-notas div:last-child{ white-space:pre-wrap; font-size:14px; margin-top:4px; }
.cl-ev{ padding:14px 0; border-bottom:1px solid var(--hair); }
.cl-ev:last-child{ border-bottom:0; }
.cl-ev-money{ display:flex; justify-content:space-between; align-items:baseline; gap:10px; margin-top:8px; font-size:13px; }
.cl-entregables{ display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:10px; }
.cl-addpay{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-top:14px; padding-top:14px; border-top:1px solid var(--hair); }
.cl-addpay[hidden]{ display:none; }
.cl-addpay .inp{ width:110px; } .cl-addpay .sel{ width:auto; flex:1; min-width:120px; }
.cl-addtask{ display:flex; gap:8px; align-items:center; margin-top:12px; padding-top:12px; border-top:1px solid var(--hair); }

/* Checklist de servicios del contrato (Fase 2): activable/editable/reordenable. */
.cd-serv-row{ display:flex; align-items:center; gap:8px; padding:5px 0; }
.cd-serv-row.dragging{ opacity:.4; }
.cd-serv-drag{ cursor:grab; color:var(--muted); font-size:13px; line-height:1; flex:0 0 auto; user-select:none; }
.cd-serv-row .cd-serv-activo{ flex:0 0 auto; width:16px; height:16px; }
.cd-serv-row .cd-serv-texto{ flex:1; min-width:0; }
.cd-serv-rm{ flex:0 0 auto; width:26px; height:26px; border:1px solid var(--line2); background:transparent; border-radius:7px; color:var(--muted); cursor:pointer; font-size:12px; }
.cd-serv-rm:hover{ border-color:var(--red); color:var(--red); }
.cl-addtask .inp{ flex:1; }

/* ================= Widget "Habitos diarios" (checklist + racha) ================= */
.hab-rachas{ display:flex; gap:18px; margin-bottom:12px; }
.hab-r{ display:flex; flex-direction:column; }
.hab-r b{ font-family:var(--serif); font-size:22px; font-weight:600; line-height:1.1; }
.hab-r span{ font-size:11px; color:var(--muted); margin-top:2px; }
.hab-strip{ display:flex; gap:4px; margin-bottom:14px; }
.hab-dot{ width:100%; height:9px; border-radius:3px; background:var(--hair); }
.hab-dot-ok{ background:var(--accent); }
.hab-dot-no{ background:var(--red); opacity:.55; }
.hab-dot-finde{ background:transparent; border:1px dashed var(--hair); }
.hab-dot-na{ background:var(--hair); opacity:.4; }
.hab-lista{ display:flex; flex-direction:column; gap:2px; }
.hab-item{ display:flex; align-items:center; gap:9px; padding:7px 0; cursor:pointer; }
.hab-item input[type="checkbox"]{ width:18px; height:18px; flex:0 0 auto; accent-color:var(--accent); cursor:pointer; }
.hab-t{ flex:1; font-size:14px; }
.hab-item:has(input:checked) .hab-t{ color:var(--muted); text-decoration:line-through; }
.hab-badge{ flex:0 0 auto; }
.hab-x{ opacity:0; flex:0 0 auto; width:26px; height:26px; padding:0; }
.hab-item:hover .hab-x{ opacity:1; }

/* ================= Menu de usuario (sidebar) ================= */
.cp-brand{ position:relative; }
.cp-menu{ margin-left:auto; background:transparent; border:1px solid var(--line2); border-radius:8px; width:30px; height:30px; cursor:pointer; color:var(--muted); font-size:14px; line-height:1; }
.cp-menu:hover{ background:#E4DFD2; color:var(--ink); }
.usermenu{ position:absolute; top:44px; right:0; z-index:75; width:230px; background:var(--paper); border:1px solid var(--line2); border-radius:12px; box-shadow:0 18px 44px -20px rgba(43,40,36,.5); padding:6px; animation:pop .16s ease both; }
.usermenu[hidden]{ display:none; }
/* Menu de "posponer" de una tarea. Reusa .usermenu, pero TIENE que ir despues de
   ella (misma especificidad: gana la ultima) y en position:fixed, porque la tarjeta
   .widget tiene overflow:hidden y recortaria un menu absolute. Las coordenadas las
   calcula el JS desde el boton (ver renderWUrgente). */
.posp-menu{ position:fixed; top:auto; right:auto; width:160px; }
.um-head{ padding:10px 12px 12px; border-bottom:1px solid var(--hair); margin-bottom:6px; }
.um-name{ font-weight:600; font-size:14px; }
.um-role{ font-family:var(--mono); font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); margin-top:4px; }
.um-item{ display:block; width:100%; text-align:left; background:transparent; border:0; border-radius:8px; padding:10px 12px; font-size:13.5px; color:var(--ink); cursor:pointer; }
.um-item:hover{ background:#ECE7DB; }
.um-danger{ color:#B0533A; }
.um-danger:hover{ background:#F1DBD0; }
.um-sep{ height:1px; background:var(--hair); margin:6px 4px; }

/* Control segmentado (tema en Preferencias) */
.seg{ display:flex; gap:6px; background:var(--bone); border:1px solid var(--line2); border-radius:10px; padding:4px; }
.seg-btn{ flex:1; text-align:center; background:transparent; border:0; border-radius:7px; padding:9px 8px; font-size:13px; color:var(--muted); cursor:pointer; display:flex; align-items:center; justify-content:center; gap:7px; }
.seg-btn.on{ background:var(--paper); color:var(--ink); font-weight:600; box-shadow:0 1px 3px rgba(41,40,36,.12); }
.seg-ico{ width:15px; height:15px; }

/* ================= Tema oscuro (gris neutro, estilo Claude) ================= */
:root{ color-scheme:light; }
/* Gris oscuro casi neutro (apenas tibio), no marron: como el dark de Claude.
   Bloque UNICO del tema oscuro. Antes habia dos (este y otro ~700 lineas abajo) y el
   segundo pisaba ink/muted/blue/yellow: leer este no te decia de que color era la app.
   Los valores de abajo son los que YA se veian (los del bloque que ganaba), fusionados
   aqui sin cambiar un solo pixel. */
:root[data-theme="dark"]{
  color-scheme:dark;
  --bone:#262624; --paper:#30302E; --deep:#1F1E1D;
  --ink:#f5f4ee; --muted:#bdbbb0;
  --hair:#3A3A37; --line2:#4A4A44;
  --red:#D97757; --accent:#D97757;
  --ok:#93a986; --blue:#8fb0d4; --yellow:#cfa15e; --gold:#cfa15e;
}
/* superficies con color fijo (inputs, hovers) que no salen de una variable */
:root[data-theme="dark"] .inp,
:root[data-theme="dark"] .sel,
:root[data-theme="dark"] .ta{ background:#262624; border-color:var(--line2); color:var(--ink); }
:root[data-theme="dark"] .inp:focus,
:root[data-theme="dark"] .sel:focus,
:root[data-theme="dark"] .ta:focus{ background:#2C2C2A; }
:root[data-theme="dark"] .login-card input{ background:#262624; border-color:var(--line2); color:var(--ink); }
:root[data-theme="dark"] .login-card input:focus{ background:#2C2C2A; }
:root[data-theme="dark"] .btn:hover{ background:#3A3A37; color:var(--ink); }
:root[data-theme="dark"] .x:hover,
:root[data-theme="dark"] .cp-menu:hover,
:root[data-theme="dark"] .um-item:hover{ background:#3A3A37; }
:root[data-theme="dark"] .um-danger:hover{ background:#3E2E2A; }
:root[data-theme="dark"] .trow:hover{ background:#2C2C2A; }
:root[data-theme="dark"] .paybox{ background:#2A2A28; }
:root[data-theme="dark"] .search .navdot{ border-color:#5E5E57; }
:root[data-theme="dark"] ::-webkit-scrollbar-thumb{ background:#41413C; border-color:var(--bone); }
/* editor de la landing (usa fondos claros fijos) */
:root[data-theme="dark"] .lp-tpl,
:root[data-theme="dark"] .lp-color,
:root[data-theme="dark"] .lp-mini,
:root[data-theme="dark"] .lp-add-img{ background:#262624; }
:root[data-theme="dark"] .lp-blk,
:root[data-theme="dark"] .lp-previewwrap,
:root[data-theme="dark"] .lp-preview{ background:var(--paper); }
/* pills: fondo tenue del mismo tinte y texto claro */
:root[data-theme="dark"] .pill-red{ background:#3A2A25; color:#E9A385; }
:root[data-theme="dark"] .pill-blue{ background:#29332C; color:#A7C199; }
:root[data-theme="dark"] .pill-yellow{ background:#33311F; color:#E0C589; }
:root[data-theme="dark"] .pill-ink{ background:#34342F; color:#B8B7AF; }
/* barra de navegacion y superficies claras que faltaban en oscuro */
:root[data-theme="dark"] .topbar{ background:rgba(31,30,29,.85); }
:root[data-theme="dark"] .subbar{ background:rgba(24,23,22,.9); }
:root[data-theme="dark"] .subtab:hover{ background:#302E2A; }
:root[data-theme="dark"] .bub-me{ background:#3A3A37; border-color:var(--line2); color:var(--ink); }
:root[data-theme="dark"] .chip:hover{ background:#3A3A37; border-color:#5A5A52; }
:root[data-theme="dark"] .tab:hover{ background:#3A3A37; }
:root[data-theme="dark"] .cp-logout:hover{ background:#3A3A37; }
/* tarjetas KPI enriquecidas del Panel */
.statsub{ font-family:var(--mono); font-size:10px; letter-spacing:.04em; color:var(--muted); margin-top:7px; }
.statsub-alert{ color:var(--red); }
.kpigrid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:12px; }
.nextwed{ display:flex; align-items:center; gap:16px; background:var(--paper); border:1px solid var(--hair); border-left:3px solid var(--accent); border-radius:var(--r); padding:14px 18px; margin-bottom:16px; box-shadow:0 1px 3px rgba(41,40,36,.04); }
.nw-badge{ font-family:var(--serif); font-weight:500; font-size:22px; line-height:1; color:var(--accent); min-width:56px; text-align:center; font-variant-numeric:tabular-nums; }
.nw-t{ font-family:var(--serif); font-weight:500; font-size:19px; letter-spacing:-.01em; }
.nw-m{ font-family:var(--mono); font-size:11px; letter-spacing:.03em; color:var(--muted); margin-top:4px; }

/* ================= Onboarding del estudio nuevo ================= */
.onb-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:12px; }
.onb-step{ display:flex; align-items:center; gap:14px; text-align:left; width:100%; padding:14px 16px; border:1px solid var(--line2); border-radius:11px; background:var(--paper); cursor:pointer; transition:.13s; }
.onb-step:hover{ border-color:var(--accent); background:#ECE7DB; }
.onb-ico{ width:38px; height:38px; flex:0 0 38px; display:grid; place-items:center; border-radius:9px; background:var(--bone); color:var(--accent); font-size:18px; }
.onb-t{ display:block; font-weight:600; font-size:14px; }
.onb-d{ display:block; font-size:12px; color:var(--muted); margin-top:2px; }
:root[data-theme="dark"] .onb-step:hover{ background:#3A3A37; }

/* ================= Panel configurable por widgets ================= */
/* 4 columnas con spans: chico=1 (cuarto), mediano=2 (mitad, el ancho historico de
   w-med), grande=4 (completo, el historico w-full). Cero regresion en los no migrados. */
.wgrid{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:16px; align-items:start; }
.widget{ background:var(--paper); border:1px solid var(--hair); border-radius:var(--r); box-shadow:0 1px 3px rgba(41,40,36,.04); overflow:hidden; min-width:0; }
.w-ch{ grid-column:span 1; }
.w-med{ grid-column:span 2; }
.w-full{ grid-column:span 4; }
.w-head{ display:flex; align-items:center; gap:8px; padding:12px 15px; border-bottom:1px solid var(--hair); }
.w-title{ font-family:var(--mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; font-weight:600; }
.w-count{ font-family:var(--mono); font-size:11px; font-weight:600; color:var(--muted); background:var(--bone); border-radius:999px; padding:1px 8px; min-width:20px; text-align:center; }
.w-count:empty{ display:none; }
.w-count.wc-red{ color:#A2492B; background:#F1DBD0; }
.w-body{ padding:6px 15px 14px; }
.w-body .kpigrid{ padding-top:8px; }
/* Controles SIEMPRE visibles pero discretos: tenues en reposo, se acentuan al pasar
   el mouse por la tarjeta o al enfocarlos con teclado. Sin modo edicion. */
.w-drag{ cursor:grab; color:var(--muted); font-size:14px; line-height:1; display:inline-block; user-select:none; opacity:.22; transition:opacity .13s; touch-action:none; }
.widget:hover .w-drag, .w-drag:focus-visible{ opacity:.75; }
.w-menu{ width:24px; height:24px; flex:0 0 24px; border:1px solid transparent; background:transparent; border-radius:7px; color:var(--muted); cursor:pointer; font-size:15px; line-height:1; opacity:.35; transition:.13s; }
.w-quick ~ .w-menu{ margin-left:2px; }
.w-head > .w-menu:first-of-type, .w-count ~ .w-menu{ margin-left:auto; }
.widget:hover .w-menu, .w-menu:focus-visible{ opacity:1; border-color:var(--line2); }
.w-menu:hover{ color:var(--ink); }
.widget.dragging{ opacity:.45; }

/* Popover del menu de tarjeta (tamano / configurar / subir-bajar / quitar) */
.w-pop{ position:fixed; z-index:220; min-width:210px; background:var(--paper); border:1px solid var(--line2); border-radius:11px; box-shadow:0 10px 30px rgba(20,20,18,.18); padding:8px; }
.w-pop-tams{ display:flex; gap:4px; margin-bottom:6px; }
.w-pop-tam{ flex:1; font-size:12px; font-weight:600; padding:7px 6px; border:1px solid var(--line2); background:transparent; color:var(--muted); border-radius:8px; cursor:pointer; transition:.13s; }
.w-pop-tam.on{ color:var(--accent); border-color:var(--accent); }
.w-pop-item{ display:block; width:100%; text-align:left; font-size:13px; padding:8px 10px; border:0; background:transparent; border-radius:8px; color:var(--ink); cursor:pointer; }
.w-pop-item:hover{ background:var(--bone); }
.w-pop-rm:hover{ color:var(--red); }

/* Tarjeta fantasma "+ Agregar widget" al final de la rejilla */
.w-add-card{ grid-column:span 1; min-height:64px; display:flex; align-items:center; justify-content:center; gap:8px;
  border:1.5px dashed var(--line2); border-radius:var(--r); background:transparent; color:var(--muted);
  font-size:13px; cursor:pointer; opacity:.6; transition:.15s; }
.w-add-card:hover{ opacity:1; border-color:var(--accent); color:var(--accent); }
.w-add-plus{ font-size:17px; line-height:1; }

/* Boton(es) de accion rapida en el encabezado del widget (crear tarea, cita, cotizacion...).
   margin-left:auto en el PRIMERO empuja al grupo entero a la derecha, igual que w-rm; se
   ocultan en modo edicion (mismo espacio que ocupa w-rm ahi) para no duplicar controles. */
.w-quick{ width:24px; height:24px; flex:0 0 24px; display:inline-flex; align-items:center; justify-content:center; border:1px solid var(--line2); background:transparent; border-radius:7px; color:var(--muted); cursor:pointer; font-size:14px; line-height:1; }
.w-quick:first-of-type{ margin-left:auto; }
.w-quick + .w-quick{ margin-left:2px; }
.w-quick:hover{ border-color:var(--accent); color:var(--accent); background:color-mix(in srgb, var(--accent) 8%, transparent); }

/* Clase generica para cualquier fila/tarjeta/barra de widget que navega a su origen al
   hacer clic (ficha de cliente, evento, vista filtrada...). Mismo tratamiento visual que
   ya usaban wed-row/ses-row: se generaliza para todos los widgets nuevos. */
.wed-row, .ses-row, .w-click{ cursor:pointer; border-radius:8px; margin:0 -8px; padding-left:8px; padding-right:8px; }
.wed-row:hover, .ses-row:hover, .w-click:hover{ background:#F1EEE5; }
:root[data-theme="dark"] .w-click:hover{ background:#2C2C2A; }
/* KPI y barras de progreso clicables: mismo hover, pero sin el margen negativo (ya
   tienen su propio padding de tarjeta/fila). */
.stat.w-click{ cursor:pointer; margin:0; transition:.13s; }
.stat.w-click:hover{ background:#F1EEE5; box-shadow:0 1px 3px rgba(41,40,36,.08); }
:root[data-theme="dark"] .stat.w-click:hover{ background:#2C2C2A; }
.barrow.w-click{ cursor:pointer; margin:0 -8px; padding-left:8px; padding-right:8px; }
.barrow.w-click:hover{ background:#F1EEE5; }
:root[data-theme="dark"] .barrow.w-click:hover{ background:#2C2C2A; }
.pill.w-click{ cursor:pointer; border:1px solid transparent; }
.pill.w-click:hover{ filter:brightness(.95); text-decoration:underline; }

/* selector "agregar widget" */
.wadd-grid{ display:grid; grid-template-columns:1fr; gap:10px; }
.man-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:10px; }
/* .wadd-item nacio como <button>; al reusarlo como <a> hay que apagar el estilo
   de enlace del navegador para que no salga azul y subrayado. */
a.wadd-item, a.wadd-item:hover{ color:inherit; text-decoration:none; }
a.wadd-item .wadd-d{ line-height:1.45; }
.wadd-item{ display:flex; align-items:center; gap:14px; text-align:left; width:100%; padding:14px 16px; border:1px solid var(--line2); border-radius:11px; background:var(--paper); cursor:pointer; transition:.13s; }
.wadd-item:hover{ border-color:var(--accent); background:#ECE7DB; }
.wadd-ico{ width:38px; height:38px; flex:0 0 38px; display:grid; place-items:center; border-radius:9px; background:var(--bone); color:var(--accent); font-size:18px; }
.wadd-t{ font-weight:600; font-size:14px; }
.wadd-d{ font-size:12px; color:var(--muted); margin-top:2px; }

/* widget: proximas bodas + sesiones (clickeables) */
.wed-row,.ses-row{ cursor:pointer; border-radius:8px; margin:0 -8px; padding-left:8px; padding-right:8px; }
.wed-row:hover,.ses-row:hover{ background:#F1EEE5; }
.wed-badge{ font-family:var(--mono); font-size:12px; font-weight:700; color:var(--accent); min-width:44px; flex:0 0 44px; text-align:center; }

/* widget: ingresos (grafica estilo bolsa) */
.ing-top{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; padding:8px 2px 12px; }
.ing-total{ font-family:var(--serif); font-weight:500; font-size:28px; line-height:1; font-variant-numeric:tabular-nums; }
.ing-sub{ font-family:var(--mono); font-size:10px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); margin-top:6px; }
.ing-chg{ font-family:var(--mono); font-size:13px; font-weight:700; text-align:right; display:flex; flex-direction:column; align-items:flex-end; }
.ing-chg.up{ color:var(--blue); }
.ing-chg.down{ color:var(--red); }
.ing-chg-sub{ font-weight:400; font-size:9.5px; letter-spacing:.04em; text-transform:uppercase; color:var(--muted); margin-top:3px; }
.ing-chart{ width:100%; }
.ing-svg{ width:100%; height:170px; display:block; }
.ing-base{ stroke:var(--hair); stroke-width:1; stroke-dasharray:2 4; }
.ing-x{ fill:var(--muted); font-family:var(--mono); font-size:9px; text-anchor:middle; }
.ing-segs{ display:flex; gap:6px; margin-top:10px; }
.ing-seg{ flex:1; font-size:12px; font-weight:600; padding:7px 10px; border:1px solid var(--line2); background:transparent; color:var(--muted); border-radius:8px; cursor:pointer; transition:.13s; }
.ing-seg:hover{ color:var(--ink); }
.ing-seg.on{ background:var(--accent); border-color:var(--accent); color:#fff; }

/* ---------- widget: Pendientes (unificado, design handoff) ----------
   .pendw vive DENTRO de .w-body (que ya trae padding:6px 15px 14px y .widget ya trae
   fondo/borde/radio/overflow:hidden) -- por eso NO repite card ni titulo (el de .w-head
   ya dice "Pendientes"), y se expande con margen negativo para que sus filas y divisores
   lleguen borde a borde como en el handoff. Los popovers (.pendw-pop) son position:fixed
   posicionados desde JS (igual que wlAbrirMenu en widgets.js): .widget tiene
   overflow:hidden, asi que un popover position:absolute normal se recortaria.
   Tokens propios (--card/--ink2/--line/--acc/--tint/--hov/--sunk/--ok/--warn) resueltos
   desde las variables globales del tema -- sin redeclarar --ink (se hereda tal cual de
   :root, ya coincide pixel a pixel con el handoff en los dos temas). */
.pendw{
  --card:var(--paper); --ink2:var(--muted); --line:var(--hair); --acc:var(--accent); --warn:var(--yellow);
  --tint:rgba(201,100,66,.1); --hov:rgba(0,0,0,.035); --sunk:rgba(0,0,0,.035);
  margin:-6px -15px -14px; display:flex; flex-direction:column; color:var(--ink); position:relative;
  font-family:var(--sans);
}
/* --acc/--warn/--ok crudos no dan 4.5:1 como TEXTO sobre --tint/--sunk (medido: 3.3-3.4:1
   en los dos temas) -- son tonos pensados para fondos solidos grandes (botones), no texto
   chico sobre un tinte. --acctxt/--warntxt/--oktxt son los mismos tonos ajustados que ya
   usa el resto de la app para esto (.pill-red/.pill-yellow/.pill-blue, lineas ~325-328 y
   844-847): texto propio por tema, no el acento crudo. */
:root:not([data-theme="dark"]) .pendw{ --ok:#4E6350; --acctxt:#A2492B; --warntxt:#836327; --oktxt:#4E6350; }
:root[data-theme="dark"] .pendw{
  --ok:#93a986;
  --tint:rgba(217,119,87,.16); --hov:rgba(255,255,255,.05); --sunk:rgba(0,0,0,.22);
  --acctxt:#E9A385; --warntxt:#E0C589; --oktxt:#A7C199;
}
.pendw *{ box-sizing:border-box; }

.pendw-hd{ display:flex; align-items:center; gap:8px; padding:11px 15px 10px; flex-wrap:wrap; }
.widget[data-tam="mediano"] .pendw-hd, .widget[data-tam="grande"] .pendw-hd{ padding:13px 18px 11px; }
.pendw-tot{ font-size:11px; font-weight:600; color:var(--ink2); white-space:nowrap; }
.pendw-sp{ flex:1; min-width:0; }
.pendw-ic{ width:28px; height:28px; border-radius:11px; display:flex; align-items:center; justify-content:center; color:var(--ink2); border:1px solid transparent; flex:none; transition:.12s; background:none; }
.pendw-ic:hover{ background:var(--hov); color:var(--ink); }
.pendw-ic.on{ border-color:var(--line); color:var(--acc); }
.pendw-vs{ display:flex; gap:2px; padding:3px; border-radius:12px; background:var(--sunk); flex:none; }
.pendw-vs button{ height:24px; padding:0 8px; border-radius:9px; font-size:11px; font-weight:600; color:var(--ink2); display:flex; align-items:center; gap:5px; transition:.12s; background:none; border:none; cursor:pointer; }
.pendw-vs button:hover{ color:var(--ink); }
.pendw-vs button.on{ background:var(--acc); color:#fff; }
.pendw-src{ display:flex; align-items:center; gap:8px; height:30px; padding:0 11px; border-radius:11px; border:1px solid var(--line); background:var(--sunk); color:var(--ink2); flex:1; min-width:0; max-width:210px; }
.pendw-src input{ flex:1; min-width:0; background:none; border:none; outline:none; color:var(--ink); font-size:12px; }
.pendw-src input::placeholder{ color:var(--ink2); }
.pendw-pill{ display:inline-flex; align-items:center; gap:4px; height:19px; padding:0 7px; border-radius:11px; font-size:10px; font-weight:600; background:var(--sunk); color:var(--ink2); flex:none; white-space:nowrap; }
.pendw-pill.red{ background:var(--tint); color:var(--acctxt); }
.pendw-pill.gold{ background:rgba(207,161,94,.16); color:var(--warntxt); }
.pendw-pill.ok{ background:rgba(147,169,134,.16); color:var(--oktxt); }

/* selector: riel (grande) / tabs con scroll (mediano) / desplegable (chico) */
.pendw-sel{ padding:0 15px 11px; }
.widget[data-tam="mediano"] .pendw-sel, .widget[data-tam="grande"] .pendw-sel{ padding:0 18px 12px; }
.pendw-tabs{ display:flex; gap:5px; overflow-x:auto; padding-bottom:2px; scrollbar-width:none; -webkit-mask-image:linear-gradient(to right,#000 90%,transparent); mask-image:linear-gradient(to right,#000 90%,transparent); }
.pendw-tabs::-webkit-scrollbar{ display:none; }
.pendw-tab{ flex:none; height:28px; padding:0 11px; border-radius:11px; font-size:12px; color:var(--ink2); display:inline-flex; align-items:center; gap:6px; white-space:nowrap; transition:.12s; background:none; border:none; cursor:pointer; }
.pendw-tab .k{ font-size:10.5px; opacity:.7; font-variant-numeric:tabular-nums; }
.pendw-tab:hover{ color:var(--ink); }
.pendw-tab.on{ background:var(--tint); color:var(--acctxt); font-weight:600; }
.pendw-tab.on .k{ opacity:1; }
.pendw-nat{ width:100%; height:34px; border-radius:11px; border:1px solid var(--line); background:var(--sunk); color:var(--ink); font-size:12.5px; font-weight:600; padding:0 11px; display:flex; align-items:center; gap:8px; cursor:pointer; }
.pendw-nat .cv{ color:var(--ink2); font-weight:400; font-size:11px; }
.pendw-2p{ display:grid; grid-template-columns:180px 1fr; border-top:1px solid var(--line); flex:1; min-height:0; }
.pendw-rail{ border-right:1px solid var(--line); padding:8px 8px 12px; }
.pendw-ri{ display:flex; align-items:center; gap:9px; width:100%; padding:9px 10px; border-radius:11px; font-size:12.5px; color:var(--ink2); margin-bottom:2px; transition:.12s; background:none; border:none; cursor:pointer; text-align:left; }
.pendw-ri .bar{ width:2px; height:14px; border-radius:2px; background:transparent; flex:none; }
.pendw-ri .n{ flex:1; }
.pendw-ri .k{ font-size:11px; font-variant-numeric:tabular-nums; opacity:.8; }
.pendw-ri:hover{ background:var(--hov); color:var(--ink); }
.pendw-ri.on{ background:var(--tint); color:var(--acctxt); font-weight:600; }
.pendw-ri.on .bar{ background:var(--acc); }
.pendw-mdiv{ height:1px; background:var(--line); margin:7px 3px; }
.pendw-load{ margin-top:10px; padding:10px; border-radius:11px; background:var(--sunk); }
.pendw-load .ll{ font-size:9px; letter-spacing:.14em; text-transform:uppercase; font-weight:600; color:var(--ink2); margin-bottom:8px; }
.pendw-lr{ display:flex; align-items:baseline; justify-content:space-between; gap:8px; font-size:11px; color:var(--ink2); padding:3px 0; }
.pendw-lr b{ font-family:var(--serif); font-size:16px; font-weight:600; color:var(--ink); }
.pendw-lr b.hot{ color:var(--acctxt); }

/* filas */
.pendw-body{ flex:1; min-height:0; border-top:1px solid var(--line); }
.pendw-2p .pendw-body{ border-top:none; }
.pendw-gh{ display:flex; align-items:center; gap:9px; padding:9px 15px; background:var(--sunk); font-size:9.5px; letter-spacing:.13em; text-transform:uppercase; font-weight:600; color:var(--ink2); border-bottom:1px solid var(--line); }
.widget[data-tam="mediano"] .pendw-gh, .widget[data-tam="grande"] .pendw-gh{ padding:9px 18px; }
.pendw-gh .gk{ margin-left:auto; letter-spacing:0; text-transform:none; font-size:10.5px; opacity:.8; }
.pendw-r{ display:flex; align-items:center; gap:10px; padding:10px 15px; border-bottom:1px solid var(--line); position:relative; transition:.12s; }
.widget[data-tam="mediano"] .pendw-r, .widget[data-tam="grande"] .pendw-r{ padding:10px 18px; }
.pendw-r:hover{ background:var(--hov); }
.pendw-r.pinned{ background:var(--tint); }
.pendw-r.gone{ opacity:.42; }
.pendw.dense .pendw-r{ padding-top:6px; padding-bottom:6px; }
.pendw-rm{ flex:1; min-width:0; }
.pendw-rt{ font-size:12.5px; font-weight:600; line-height:1.3; display:flex; align-items:center; gap:6px; min-width:0; flex-wrap:wrap; row-gap:4px; }
.pendw-rt .tx{ flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pendw-rt .pendw-pill{ flex:none; }
.pendw-r.gone .pendw-rt .tx{ text-decoration:line-through; color:var(--ink2); }
.pendw-rt .pin-ic{ color:var(--acc); flex:none; }
.pendw-rs{ font-size:11px; color:var(--ink2); margin-top:3px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pendw-cat{ font-size:9.5px; font-weight:600; letter-spacing:.12em; text-transform:uppercase; color:var(--ink2); opacity:.7; flex:none; width:56px; }
.pendw-st{ height:28px; border-radius:11px; border:1px solid var(--line); background:var(--sunk); color:var(--ink); font-size:11.5px; padding:0 8px; flex:none; outline:none; }
.pendw-st:focus{ border-color:var(--acc); }
.pendw-go{ height:28px; padding:0 11px; border-radius:11px; background:var(--acc); color:#fff; font-size:11.5px; font-weight:600; display:inline-flex; align-items:center; flex:none; transition:.12s; border:none; cursor:pointer; }
.pendw-go:hover{ filter:brightness(.92); }
.pendw-go.ghost{ background:transparent; border:1px solid var(--line); color:var(--ink2); }
.pendw-go.ghost:hover{ border-color:var(--acc); color:var(--acc); }
.pendw-sla{ width:3px; align-self:stretch; border-radius:2px; flex:none; min-height:24px; }
.pendw-note{ padding:0 15px 11px; display:flex; gap:8px; }
.widget[data-tam="mediano"] .pendw-note, .widget[data-tam="grande"] .pendw-note{ padding:0 18px 11px; }
.pendw-note input{ flex:1; min-width:0; height:30px; border-radius:11px; border:1px solid var(--line); background:var(--sunk); color:var(--ink); font-size:12px; padding:0 11px; outline:none; }
.pendw-note input:focus{ border-color:var(--acc); }
.pendw-nt{ font-size:11px; color:var(--ink2); margin-top:4px; display:flex; gap:6px; align-items:baseline; }
.pendw-nt .q{ color:var(--acc); font-weight:600; flex:none; }

/* popover generico: kebab por fila, filtros ⚙, desplegable de categoria en chico.
   position:fixed + top/left puestos por JS (pendwAbrirPop en app.js) -- .widget tiene
   overflow:hidden y un position:absolute normal se recortaria contra el borde de la
   tarjeta, asi que se monta en document.body: eso lo saca del subarbol de .pendw, y con
   el las variables --card/--line/etc que .pendw resuelve para si mismo. Se resuelven
   otra vez aqui, identicas, para que el popover sea autosuficiente sin importar donde
   cuelgue en el DOM. */
.pendw-pop{
  --card:var(--paper); --ink2:var(--muted); --line:var(--hair); --acc:var(--accent); --warn:var(--yellow);
  --tint:rgba(201,100,66,.1); --hov:rgba(0,0,0,.035); --sunk:rgba(0,0,0,.035);
  position:fixed; z-index:60; width:206px; background:var(--card); border:1px solid var(--line); border-radius:12px; padding:5px; box-shadow:0 18px 44px -14px rgba(0,0,0,.5); color:var(--ink); font-family:var(--sans);
}
:root:not([data-theme="dark"]) .pendw-pop{ --ok:#4E6350; --acctxt:#A2492B; --warntxt:#836327; --oktxt:#4E6350; }
:root[data-theme="dark"] .pendw-pop{
  --ok:#93a986; --acctxt:#E9A385; --warntxt:#E0C589; --oktxt:#A7C199;
  --tint:rgba(217,119,87,.16); --hov:rgba(255,255,255,.05); --sunk:rgba(0,0,0,.22);
}
.pendw-pop-item{ display:flex; align-items:center; gap:9px; width:100%; padding:8px 9px; border-radius:9px; font-size:12.5px; color:var(--ink); transition:.12s; background:none; border:none; cursor:pointer; text-align:left; }
.pendw-pop-item:hover{ background:var(--hov); }
.pendw-pop-item .n{ flex:1; }
.pendw-pop-item .k{ font-size:11px; color:var(--ink2); font-variant-numeric:tabular-nums; }
.pendw-pop-item.on{ background:var(--tint); color:var(--acctxt); }
.pendw-pop-item.on .k{ color:var(--acctxt); }
.pendw-pop-date{ display:flex; gap:6px; padding:5px 4px 3px; }
.pendw-pop-date input{ flex:1; min-width:0; height:30px; border-radius:9px; border:1px solid var(--line); background:var(--sunk); color:var(--ink); font-size:11.5px; padding:0 8px; outline:none; }
.pendw-pop-label{ font-size:9.5px; font-weight:600; letter-spacing:.15em; text-transform:uppercase; color:var(--ink2); margin:6px 4px 7px; }
.pendw-pop-group{ padding-bottom:9px; margin-bottom:9px; border-bottom:1px solid var(--line); }
.pendw-pop-group:last-child{ border-bottom:none; margin-bottom:0; padding-bottom:0; }
.pendw-pop-step{ display:flex; align-items:center; gap:2px; background:var(--sunk); border-radius:9px; padding:3px; margin:0 4px; }
.pendw-pop-step button{ width:26px; height:24px; border-radius:7px; display:flex; align-items:center; justify-content:center; color:var(--ink2); font-size:14px; font-weight:600; background:none; border:none; cursor:pointer; }
.pendw-pop-step button:hover{ background:var(--hov); color:var(--ink); }
.pendw-pop-step .sv{ flex:1; text-align:center; font-size:11.5px; font-weight:600; font-variant-numeric:tabular-nums; }
.pendw-tg{ width:34px; height:20px; border-radius:11px; background:var(--sunk); position:relative; flex:none; margin-left:auto; transition:.15s; border:none; cursor:pointer; padding:0; }
.pendw-tg.on{ background:var(--ok); }
.pendw-tg::after{ content:""; position:absolute; top:2px; left:2px; width:16px; height:16px; border-radius:50%; background:#fff; transition:.15s; }
.pendw-tg.on::after{ transform:translateX(14px); }

/* kanban (grande, vista "Tablero", entregas) */
.pendw-kb{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:1px; background:var(--line); border-top:1px solid var(--line); }
.pendw-kc{ background:var(--card); padding:11px 11px 14px; min-height:180px; }
.pendw-kh{ display:flex; align-items:center; gap:7px; font-size:9.5px; letter-spacing:.13em; text-transform:uppercase; font-weight:600; color:var(--ink2); margin-bottom:10px; }
.pendw-kh .k{ margin-left:auto; letter-spacing:0; font-size:10.5px; opacity:.8; }
.pendw-kt{ border:1px solid var(--line); border-radius:11px; padding:9px 10px; margin-bottom:7px; transition:.12s; width:100%; display:block; background:none; cursor:pointer; text-align:left; }
.pendw-kt:hover{ border-color:var(--acc); }
.pendw-kt .t{ font-size:12px; font-weight:600; line-height:1.3; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--ink); }
.pendw-kt .m{ font-size:10.5px; color:var(--ink2); margin-top:3px; display:flex; align-items:center; gap:6px; }
.pendw-kt .bt{ height:3px; border-radius:2px; background:var(--sunk); margin-top:7px; overflow:hidden; }
.pendw-ke{ font-size:11px; color:var(--ink2); opacity:.6; padding:6px 2px; }

/* pie / vacio / deshacer */
.pendw-ft{ display:flex; align-items:center; gap:10px; padding:11px 15px; border-top:1px solid var(--line); }
.widget[data-tam="mediano"] .pendw-ft, .widget[data-tam="grande"] .pendw-ft{ padding:11px 18px; }
.pendw-ft span{ font-size:11px; color:var(--ink2); }
.pendw-ft button{ background:none; border:none; cursor:pointer; }
.pendw-ft b{ font-size:11.5px; font-weight:600; color:var(--acc); }
.pendw-empty{ padding:30px 20px; text-align:center; color:var(--ink2); display:flex; flex-direction:column; align-items:center; gap:11px; }
.pendw-empty .ec{ width:44px; height:44px; border-radius:50%; background:rgba(147,169,134,.16); color:var(--ok); display:flex; align-items:center; justify-content:center; }
.pendw-empty .et{ font-family:var(--serif); font-size:20px; font-weight:600; color:var(--ink); }
.pendw-empty p{ margin:0; font-size:12px; line-height:1.55; max-width:260px; }
.pendw-toast{ position:absolute; left:14px; right:14px; bottom:14px; z-index:30; display:flex; align-items:center; gap:10px; padding:10px 12px; border-radius:12px; background:var(--card); border:1px solid var(--line); box-shadow:0 16px 36px -12px rgba(0,0,0,.5); }
.pendw-toast .tt{ flex:1; min-width:0; font-size:12px; color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pendw-toast button{ font-size:11.5px; font-weight:600; color:var(--acc); flex:none; background:none; border:none; cursor:pointer; }

/* widget: recomendaciones */
.reco{ padding:12px 0; border-bottom:1px solid var(--hair); }
.reco:last-of-type{ border-bottom:0; }
.reco-h{ display:flex; align-items:center; justify-content:space-between; gap:10px; }
.reco-t{ font-weight:600; font-size:14px; }
.reco-cli{ font-family:var(--mono); font-size:11px; color:var(--muted); margin-top:3px; }
.reco-why{ font-size:12.5px; color:var(--ink); line-height:1.45; margin-top:6px; }
.reco-xarpie{ margin-top:8px; }

/* widget: tendencias / noticias */
.trend{ padding:12px 0; border-bottom:1px solid var(--hair); }
.trend-h{ margin-bottom:6px; }
.trend-t{ font-family:var(--serif); font-weight:500; font-size:16px; line-height:1.2; }
.trend-d{ font-size:12.5px; color:var(--muted); line-height:1.5; margin-top:5px; }

/* widget: barras horizontales (conversion por canal, mix de paquetes) y barra de
   progreso (salud de correos) reusan el mismo componente chico. */
.barrow{ padding:8px 0; border-bottom:1px solid var(--hair); }
.barrow:last-child{ border-bottom:0; }
.barrow-top{ display:flex; justify-content:space-between; align-items:baseline; font-size:13px; margin-bottom:5px; gap:10px; }
.barrow-lbl{ font-weight:500; text-transform:capitalize; }
.barrow-val{ color:var(--muted); font-variant-numeric:tabular-nums; white-space:nowrap; }
.barrow-track{ height:6px; border-radius:3px; background:var(--hair); overflow:hidden; }
.barrow-fill{ height:100%; border-radius:3px; background:var(--accent); }

@media (max-width:860px){
  /* Movil: 2 columnas; chico = media pantalla, mediano/grande = completa. */
  .wgrid{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .w-ch{ grid-column:span 1; }
  .w-med,.w-full{ grid-column:span 2; }
  .w-add-card{ grid-column:span 2; }
  /* Sin drag tactil en v1: el handle se atenua; reordenar = Subir/Bajar del menu ⋯. */
  .w-drag{ opacity:.15; }
}

:root[data-theme="dark"] .wed-row:hover,
:root[data-theme="dark"] .ses-row:hover{ background:#2C2C2A; }
:root[data-theme="dark"] .w-count{ background:var(--bone); }
:root[data-theme="dark"] .w-count.wc-red{ background:#3A2A25; color:#E9A385; }
:root[data-theme="dark"] .wadd-item:hover{ background:#3A3A37; }

/* ---- Bandeja de Xarpie (acciones escenificadas) ---- */
.acc-card{ background:var(--paper); border:1px solid var(--hair); border-radius:var(--r); padding:14px 16px; margin-bottom:12px; box-shadow:0 1px 3px rgba(41,40,36,.04); }
.acc-alto{ border-left:3px solid var(--red); }
.acc-h{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.acc-tipo{ font-family:var(--mono); font-size:10.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); }
.acc-cuando{ margin-left:auto; font-family:var(--mono); font-size:10.5px; color:var(--muted); }
.acc-t{ font-weight:600; font-size:15px; margin-top:9px; }
.acc-cli{ font-size:12.5px; color:var(--muted); margin-top:2px; }
.acc-brief{ margin-top:10px; padding:9px 12px; background:var(--deep); border-radius:9px; }
.acc-brief-t{ font-family:var(--mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); margin-bottom:5px; }
.acc-hecho{ font-size:13px; line-height:1.5; }
.acc-cuerpo{ width:100%; margin-top:10px; min-height:74px; font-size:13.5px; line-height:1.5; }
.acc-cuerpo[readonly]{ background:var(--bone); color:var(--ink); border-color:var(--hair); }
.acc-botones{ display:flex; gap:8px; margin-top:10px; align-items:center; flex-wrap:wrap; }
.btn-wa{ background:#1FAF5E; border-color:#1FAF5E; color:#fff !important; text-decoration:none; display:inline-flex; align-items:center; }
.btn-wa:hover{ background:#188C4B; border-color:#188C4B; color:#fff; }
:root[data-theme="dark"] .acc-cuerpo[readonly]{ background:#262624; }
:root[data-theme="dark"] .btn-wa{ background:#1FAF5E; border-color:#1FAF5E; }

/* ---- Modo aprendiz: tira "que hice / donde lo encuentras" (Preferencias > xarpie_transparencia) ---- */
.xarpie-efectos{ display:flex; flex-direction:column; gap:7px; margin-top:9px; }
.xarpie-efecto{ display:flex; align-items:center; gap:8px; font-size:12.5px; line-height:1.4; color:var(--muted); }
.xarpie-efecto-ico{ flex:0 0 auto; color:var(--ok); font-weight:700; }
.xarpie-efecto-txt{ flex:1; min-width:0; }
.xarpie-efecto-txt b{ color:var(--ink); font-weight:600; }
.xarpie-efecto-link{ flex:0 0 auto; font-size:11.5px; padding:5px 13px; border-radius:100px; border:1px solid var(--line2); background:var(--paper); color:var(--ink); cursor:pointer; transition:.14s; white-space:nowrap; }
.xarpie-efecto-link:hover{ border-color:var(--accent); background:var(--deep); }

/* ---- Diseños: grid de piezas graficas con preview escalada en iframe ---- */
.dzgrid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(250px,1fr)); gap:18px; }
.dzcard{ border:1px solid var(--line2); border-radius:14px; overflow:hidden; background:var(--paper); }
/* El iframe se pinta a tamaño real y se encoge con transform: asi el diseño ve su ancho
   verdadero (1080px) y los px del HTML significan lo que deben. */
.dzcard-prev{ position:relative; overflow:hidden; background:#fff; margin:0 auto; }
.dzv-frame{ border:0; transform-origin:top left; position:absolute; top:0; left:0; pointer-events:none; }
.dzcard-pie{ padding:10px 12px 4px; display:flex; flex-direction:column; gap:2px; font-size:13px; }
.dzcard-pie .muted{ font-size:11.5px; }
.dzcard-btns{ display:flex; gap:6px; padding:8px 12px 12px; flex-wrap:wrap; }
.dzv-wrap{ position:relative; overflow:hidden; background:#fff; border-radius:10px; border:1px solid var(--line2); margin:0 auto; }

/* ---- Cambios propuestos (Bandeja): el diff antes -> despues de datos de un cliente ---- */
.cpx{ border:1px solid var(--line2); border-radius:12px; padding:12px 14px; margin-bottom:10px; background:var(--paper); }
.cpx-head{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; margin-bottom:8px; }
.cpx-motivo{ font-size:12px; color:var(--muted); }
.cpx-body{ display:flex; flex-direction:column; gap:5px; }
.cpx-fila{ display:flex; align-items:baseline; gap:8px; font-size:13px; flex-wrap:wrap; }
.cpx-campo{ flex:0 0 auto; min-width:104px; color:var(--muted); font-size:12px; text-transform:uppercase; letter-spacing:.04em; }
.cpx-antes{ text-decoration:line-through; color:var(--muted); }
.cpx-flecha{ color:var(--muted); }
.cpx-desp{ color:var(--ink); font-weight:600; }
/* notas no reemplaza: se agrega. Se pinta distinto para que no se lea como sustitucion. */
.cpx-add{ color:var(--ink); white-space:pre-wrap; }
.cpx-conflicto{ margin-top:8px; font-size:12.5px; color:var(--warn, #b8860b); line-height:1.45; }
.cpx-btns{ display:flex; gap:8px; margin-top:10px; flex-wrap:wrap; }

/* Progreso en vivo dentro de la burbuja mientras Xarpie trabaja: que herramienta esta
   usando ahora. Desaparece al llegar el render definitivo de la respuesta. */
.xarpie-progreso{ font-size:11.5px; color:var(--muted); margin-bottom:6px; display:flex; align-items:center; gap:6px; }
.xarpie-progreso::before{ content:""; width:6px; height:6px; border-radius:50%; background:var(--accent); flex:0 0 auto; animation:xarpiePulso 1s ease-in-out infinite; }
@keyframes xarpiePulso{ 0%,100%{ opacity:.25; } 50%{ opacity:1; } }

/* ---- Historial de Xarpie: chips de referencia, herramientas de burbuja, modal de historial ---- */
.bubrefs{ display:flex; flex-wrap:wrap; gap:6px; margin-top:9px; }
.bubrefs .pill{ cursor:pointer; border:1px solid var(--line2); background:var(--paper); transition:.14s; }
.bubrefs .pill:hover{ background:var(--deep); color:var(--ink); }
.bubtools{ display:flex; gap:10px; margin-top:7px; }
.bubtool{ font-family:var(--mono); font-size:10.5px; letter-spacing:.03em; color:var(--muted); background:transparent; border:0; cursor:pointer; padding:0; }
.bubtool:hover{ color:var(--ink); text-decoration:underline; }
.hist-msg{ padding:10px 0; border-bottom:1px solid var(--hair); }
.hist-msg:last-child{ border-bottom:0; }
.hist-meta{ font-family:var(--mono); font-size:10.5px; letter-spacing:.03em; color:var(--muted); margin-bottom:4px; }
.hist-user .hist-meta{ color:var(--accent); }
.hist-texto{ font-size:13.5px; line-height:1.55; white-space:pre-wrap; }

/* ---- Calendario (Agenda): navegacion, vista mes, vista semana, drag-and-drop ---- */
.cal-nav{ display:flex; align-items:center; gap:8px; margin-bottom:14px; }
.cal-grid{ border:1px solid var(--hair); border-radius:var(--r); overflow:hidden; background:var(--paper); }
.cal-head{ display:grid; grid-template-columns:repeat(7,1fr); border-bottom:1px solid var(--hair); }
.cal-head-d{ padding:8px 10px; font-family:var(--mono); font-size:10.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); text-align:center; }
.cal-body{ display:grid; grid-template-columns:repeat(7,1fr); }
.cal-celda{ min-height:104px; padding:6px 6px 8px; border-right:1px solid var(--hair); border-bottom:1px solid var(--hair); cursor:pointer; transition:background .12s; }
.cal-celda:hover{ background:var(--deep); }
.cal-body .cal-celda:nth-child(7n){ border-right:0; }
.cal-fuera{ opacity:.4; }
.cal-fuera:hover{ opacity:.7; }
.cal-hoy{ background:color-mix(in srgb, var(--accent) 9%, var(--paper)); }
.cal-numero{ font-family:var(--mono); font-size:12px; color:var(--muted); margin-bottom:5px; }
.cal-hoy .cal-numero{ color:var(--accent); font-weight:700; }
.cal-evs{ display:flex; flex-direction:column; gap:3px; }
.cal-chip{ font-size:11px; padding:3px 7px; border-radius:6px; background:color-mix(in srgb, var(--cal-c) 16%, var(--paper)); color:var(--ink); border-left:3px solid var(--cal-c); cursor:grab; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cal-chip:active{ cursor:grabbing; }
.cal-chip-h{ font-family:var(--mono); font-size:10px; color:var(--muted); }
/* Iconito para distinguir tareas (✓) y sesiones (◈) de los eventos de un vistazo. */
.cal-chip-ic{ font-size:9px; margin-right:3px; color:var(--cal-c); }
.cal-chip-sesion{ border-left-style:dashed; }
.cal-chip-tarea{ cursor:grab; }
.cal-chip-sesion{ cursor:pointer; }
/* Punto de color para la leyenda de tipos y el modal de dia. */
.cal-legend-dot{ width:9px; height:9px; border-radius:50%; flex:0 0 9px; display:inline-block; margin-right:2px; }
.cal-legend{ display:flex; flex-wrap:wrap; gap:4px 14px; font-size:11.5px; color:var(--muted); margin-top:8px; align-items:center; }
.cal-legend span.lg{ display:inline-flex; align-items:center; gap:5px; }
.cal-mas{ font-size:10.5px; color:var(--muted); padding:2px 7px; cursor:pointer; }
.cal-mas:hover{ color:var(--ink); text-decoration:underline; }
.cal-dragover{ background:color-mix(in srgb, var(--accent) 14%, var(--paper)) !important; }

.cal-sem{ border:1px solid var(--hair); border-radius:var(--r); overflow:hidden; background:var(--paper); }
.cal-sem-head{ display:grid; grid-template-columns:56px repeat(7,1fr); border-bottom:1px solid var(--hair); }
.cal-sem-hcol{ }
.cal-sem-hd{ padding:8px 6px; text-align:center; font-family:var(--mono); font-size:10.5px; letter-spacing:.04em; text-transform:uppercase; color:var(--muted); border-left:1px solid var(--hair); }
.cal-sem-num{ display:block; font-family:var(--serif); font-size:16px; color:var(--ink); margin-top:2px; }
.cal-sem-hd.cal-hoy{ color:var(--accent); background:color-mix(in srgb, var(--accent) 9%, var(--paper)); }
.cal-sem-hd.cal-hoy .cal-sem-num{ color:var(--accent); }
.cal-sem-body{ display:grid; grid-template-columns:56px repeat(7,1fr); max-height:70vh; overflow-y:auto; }
.cal-sem-horas{ border-right:1px solid var(--hair); }
.cal-sem-hora{ font-family:var(--mono); font-size:10px; color:var(--muted); padding:2px 6px; box-sizing:border-box; border-bottom:1px solid var(--hair); }
.cal-sem-col{ position:relative; border-left:1px solid var(--hair); }
.cal-sem-franja{ border-bottom:1px solid var(--hair); box-sizing:border-box; cursor:pointer; }
.cal-sem-franja:hover{ background:var(--deep); }
.cal-sem-evs{ position:absolute; inset:0; pointer-events:none; }
.cal-sem-ev{ position:absolute; left:3px; right:3px; padding:3px 6px; border-radius:6px; background:color-mix(in srgb, var(--cal-c) 18%, var(--paper)); color:var(--ink); border-left:3px solid var(--cal-c); font-size:11px; line-height:1.3; overflow:hidden; cursor:grab; pointer-events:auto; box-shadow:0 1px 3px rgba(41,40,36,.08); }
.cal-sem-ev:active{ cursor:grabbing; }
.cal-sem-ev-h{ font-family:var(--mono); font-size:9.5px; color:var(--muted); display:block; }

:root[data-theme="dark"] .cal-celda:hover,
:root[data-theme="dark"] .cal-sem-franja:hover{ background:#2C2C2A; }
:root[data-theme="dark"] .cal-hoy,
:root[data-theme="dark"] .cal-sem-hd.cal-hoy{ background:#33291F; }
:root[data-theme="dark"] .cal-dragover{ background:#3A3020 !important; }

/* ---- Calendario: filtro, dias bloqueados, indicador de saldo, resize de duracion ---- */
.cal-saldo{ display:inline-block; width:7px; height:7px; border-radius:50%; background:var(--red); margin-right:5px; vertical-align:middle; flex:0 0 7px; }
.cal-bloq{ font-size:10.5px; padding:2px 7px; border-radius:6px; background:repeating-linear-gradient(45deg, color-mix(in srgb, var(--muted) 22%, var(--paper)), color-mix(in srgb, var(--muted) 22%, var(--paper)) 6px, transparent 6px, transparent 12px); color:var(--muted); border:1px solid var(--line2); cursor:pointer; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cal-bloq:hover{ color:var(--ink); }
.cal-celda.cal-bloqueado{ background:color-mix(in srgb, var(--muted) 7%, var(--paper)); }
.cal-col-bloqueada{ background:repeating-linear-gradient(45deg, color-mix(in srgb, var(--muted) 8%, transparent), color-mix(in srgb, var(--muted) 8%, transparent) 8px, transparent 8px, transparent 16px); }
.cal-hd-bloq{ display:block; font-family:var(--sans); font-size:9px; letter-spacing:0; text-transform:none; color:var(--muted); margin-top:2px; cursor:pointer; }
.cal-hd-bloq:hover{ color:var(--ink); text-decoration:underline; }
.cal-sem-ev{ display:flex; align-items:baseline; flex-wrap:wrap; }
.cal-resize{ position:absolute; left:0; right:0; bottom:0; height:8px; cursor:ns-resize; touch-action:none; }
.cal-resize:hover{ background:color-mix(in srgb, var(--cal-c) 55%, transparent); border-radius:0 0 6px 6px; }

/* ---- Calendario: carril "sin hora" (eventos sin hora o fuera del rango 6-23) ---- */
.cal-sem-allday{ display:grid; border-bottom:1px solid var(--hair); background:var(--deep); }
.cal-allday-lbl{ font-family:var(--mono); font-size:9px; letter-spacing:.03em; text-transform:uppercase; color:var(--muted); display:flex; align-items:center; justify-content:flex-end; padding:6px; }
.cal-allday-col{ border-left:1px solid var(--hair); padding:5px; display:flex; flex-direction:column; gap:3px; min-height:26px; }
.cal-allday-ev{ font-size:11px; padding:3px 7px; border-radius:6px; background:color-mix(in srgb, var(--cal-c) 16%, var(--paper)); color:var(--ink); border-left:3px solid var(--cal-c); cursor:grab; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cal-allday-ev:active{ cursor:grabbing; }

/* iOS hace auto-zoom al enfocar un campo con font-size < 16px. En movil subimos los
   controles de formulario a 16px para evitar ese salto molesto (el desktop queda igual). */
@media (max-width:640px){
  .inp, .sel, .ta,
  .login-card input,
  .quiz-ta,
  .search input,
  .composer textarea#chat-text,
  .lp-item .inp,
  .ci-range .inp{ font-size:16px; }
}

/* ================= Tablero de Pendientes (Lista / Tabla / Kanban / Calendario) ================= */
/* Controles compactos de la barra (auto-ancho, a diferencia de .inp/.sel que ocupan 100%). */
.sel-sm{ width:auto; padding:7px 11px; font-size:12.5px; }
.inp-sm{ padding:7px 11px; font-size:13px; }
.tv-filtros{ gap:8px; }
.tv-filtros .search input{ font-size:13px; }
.tv-check{ display:inline-flex; align-items:center; gap:6px; font-size:12.5px; color:var(--muted); white-space:nowrap; cursor:pointer; }
.tv-check input{ accent-color:var(--accent); }

/* Vista LISTA: reutiliza .card + filas .chk. Agrupacion opcional con encabezados. */
.tareas-lista{ padding:2px 20px; }
.tarea-fila{ gap:11px; }
.tgrupo{ margin-bottom:18px; }
.tgrupo-h{ display:flex; align-items:center; gap:8px; font-family:var(--mono); font-size:11px; letter-spacing:.07em; text-transform:uppercase; color:var(--muted); font-weight:600; margin:2px 2px 8px; }
.tgrupo-dot{ width:9px; height:9px; border-radius:50%; flex:0 0 9px; }

/* Vista TABLA: cabeceras ordenables, scroll horizontal propio (el body nunca scrollea). */
.tabla-scroll{ overflow-x:auto; padding:0; }
.ttabla{ width:100%; border-collapse:collapse; min-width:660px; }
.ttabla th{ text-align:left; font-family:var(--mono); font-size:10px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); font-weight:400; padding:12px 14px; border-bottom:1px solid var(--hair); white-space:nowrap; }
.ttabla td{ padding:10px 14px; border-bottom:1px solid var(--hair); font-size:13.5px; vertical-align:middle; white-space:nowrap; }
.ttabla tbody tr:last-child td{ border-bottom:0; }
.ttabla .trow{ cursor:default; }
.tsort{ cursor:pointer; user-select:none; }
.tsort:hover{ color:var(--ink); }
.tcell-tit{ cursor:pointer; font-weight:500; white-space:normal; min-width:180px; }
.tcell-tit:hover{ color:var(--accent); }
.trow-done .tcell-tit{ text-decoration:line-through; color:var(--muted); }
.tlink{ cursor:pointer; color:var(--accent); }
.tlink:hover{ text-decoration:underline; }
.tnota{ color:var(--muted); font-weight:700; }
.ttabla .box{ cursor:pointer; }

/* Vista KANBAN: columnas en fila (scroll-x), tarjetas arrastrables. */
.kanban{ display:flex; gap:14px; overflow-x:auto; padding-bottom:10px; align-items:flex-start; }
.kcol{ flex:0 0 284px; max-width:300px; background:var(--deep); border:1px solid var(--hair); border-radius:12px; display:flex; flex-direction:column; max-height:calc(100vh - 250px); }
.kcol-h{ display:flex; align-items:center; gap:8px; padding:12px 14px; font-family:var(--mono); font-size:11px; letter-spacing:.05em; text-transform:uppercase; font-weight:600; color:var(--ink); border-bottom:1px solid var(--hair); }
.kcol-dot{ width:9px; height:9px; border-radius:50%; flex:0 0 9px; }
.kcol-body{ padding:10px; display:flex; flex-direction:column; gap:8px; overflow-y:auto; min-height:70px; }
.kcol-body.kdrop{ background:color-mix(in srgb, var(--accent) 9%, transparent); outline:2px dashed var(--accent); outline-offset:-5px; border-radius:8px; }
.ktarj{ background:var(--paper); border:1px solid var(--hair); border-radius:9px; padding:10px 11px; cursor:grab; box-shadow:0 1px 2px rgba(41,40,36,.05); }
.ktarj:active{ cursor:grabbing; }
.ktarj.dragging{ opacity:.45; }
.ktarj-tit{ font-size:13.5px; line-height:1.3; margin-bottom:7px; }
.ktarj-done .ktarj-tit{ text-decoration:line-through; color:var(--muted); }
.ktarj-meta{ display:flex; gap:6px; flex-wrap:wrap; }
.ktarj-sub{ font-size:11.5px; color:var(--muted); margin-top:7px; }
.kvacio{ color:var(--muted); font-size:12px; text-align:center; padding:8px 0; opacity:.45; }
.kadd{ border:1px dashed var(--line2); background:transparent; color:var(--muted); border-radius:8px; padding:8px 10px; font-size:12.5px; cursor:pointer; text-align:left; width:100%; }
.kadd:hover{ border-color:var(--accent); color:var(--accent); }
.kadd-box{ background:var(--paper); border:1px solid var(--line2); border-radius:8px; padding:8px; }

/* Vista CALENDARIO: reutiliza .cal-grid; chip de tarea completada se atenua. */
.tareas-view .cal-chip-tarea.chip-done{ opacity:.5; text-decoration:line-through; }
.tsinfecha{ margin-top:16px; }

/* Densidad compacta (toggle). Reduce el aire en filas, celdas y tarjetas. */
.dens-compacto .chk{ padding:6px 0; }
.dens-compacto .ttabla td{ padding:6px 14px; }
.dens-compacto .ktarj{ padding:7px 9px; }
.dens-compacto .ktarj-tit{ margin-bottom:5px; }
.dens-compacto .ktarj-sub{ margin-top:5px; }

/* Overrides de tema oscuro para las superficies con color propio del tablero. */
:root[data-theme="dark"] .ktarj{ background:#2C2C2A; }
:root[data-theme="dark"] .kadd-box{ background:#2C2C2A; }
:root[data-theme="dark"] .kcol-body.kdrop{ background:color-mix(in srgb, var(--accent) 16%, transparent); }

/* ================= Galería de entrega (estudio + portal comparten el lightbox) ================= */
/* Lightbox inmersivo */
.lbx{ position:fixed; inset:0; z-index:200; background:rgba(18,17,15,.95); display:flex; flex-direction:column; animation:lbxIn .16s ease; }
@keyframes lbxIn{ from{ opacity:0; } to{ opacity:1; } }
.lbx-stage{ flex:1; display:flex; align-items:center; justify-content:center; position:relative; min-height:0; padding:14px; }
.lbx-img{ max-width:100%; max-height:100%; object-fit:contain; border-radius:4px; box-shadow:0 12px 48px rgba(0,0,0,.55); user-select:none; -webkit-user-drag:none; }
.lbx-x{ position:absolute; top:14px; right:16px; z-index:2; width:44px; height:44px; border:0; border-radius:50%; background:rgba(255,255,255,.12); color:#fff; font-size:24px; cursor:pointer; }
.lbx-x:hover{ background:rgba(255,255,255,.24); }
.lbx-nav{ position:absolute; top:50%; transform:translateY(-50%); width:52px; height:52px; border:0; border-radius:50%; background:rgba(255,255,255,.1); color:#fff; font-size:30px; line-height:1; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.lbx-nav:hover{ background:rgba(255,255,255,.24); }
.lbx-prev{ left:14px; } .lbx-next{ right:14px; }
.lbx-bar{ display:flex; align-items:center; justify-content:space-between; padding:12px 18px 16px; color:#fff; }
.lbx-count{ font-family:var(--mono); font-size:12px; letter-spacing:.06em; opacity:.85; }
.lbx-actions{ display:flex; gap:8px; }
.lbx-btn{ width:40px; height:40px; border:0; border-radius:50%; background:rgba(255,255,255,.12); color:#fff; font-size:17px; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.lbx-btn:hover{ background:rgba(255,255,255,.24); }
.lbx-btn.on, .lbx-fav.on{ background:var(--accent); }
@media(max-width:640px){ .lbx-nav{ width:42px; height:42px; font-size:24px; } }

/* Resumen de galería en el detalle del evento */
.gal-resumen{ display:flex; align-items:center; gap:14px; }
.gal-resumen-cover{ width:64px; height:64px; flex:0 0 64px; border-radius:10px; background-size:cover; background-position:center; border:1px solid var(--hair); }
.gal-resumen-vacia{ display:flex; align-items:center; justify-content:center; color:var(--muted); font-size:22px; background:var(--deep); }

/* Panel de galería del estudio: dropzone, progreso, grid masonry */
.gal-drop{ border:2px dashed var(--line2); border-radius:14px; padding:26px 20px; text-align:center; cursor:pointer; transition:.14s; background:var(--paper); }
.gal-drop:hover, .gal-drop:focus-visible{ border-color:var(--accent); outline:none; }
.gal-drop.drag{ border-color:var(--accent); background:color-mix(in srgb, var(--accent) 7%, var(--paper)); }
.gal-drop-ico{ font-size:26px; color:var(--accent); }
.gal-drop-t{ margin-top:6px; font-size:15px; }
.gal-drop-link{ color:var(--accent); text-decoration:underline; }
.gal-prog{ margin-top:12px; }
.gal-prog-bar{ height:6px; border-radius:99px; background:var(--deep); overflow:hidden; }
.gal-prog-fill{ height:100%; background:var(--accent); transition:width .2s; }
.gal-masonry{ column-gap:8px; column-count:2; }
@media(min-width:600px){ .gal-masonry{ column-count:3; } }
@media(min-width:900px){ .gal-masonry{ column-count:4; } }
@media(min-width:1300px){ .gal-masonry{ column-count:5; } }
.gal-item{ position:relative; break-inside:avoid; margin:0 0 8px; border-radius:9px; overflow:hidden; border:1px solid var(--hair); cursor:zoom-in; background:var(--deep); }
.gal-item img{ width:100%; display:block; }
.gal-fav-badge{ position:absolute; top:8px; left:9px; color:#fff; font-size:14px; text-shadow:0 1px 3px rgba(0,0,0,.55); }
.gal-item-acts{ position:absolute; top:6px; right:6px; display:flex; gap:5px; opacity:0; transition:.14s; }
.gal-item:hover .gal-item-acts{ opacity:1; }
.gal-act{ width:28px; height:28px; border:0; border-radius:7px; background:rgba(0,0,0,.52); color:#fff; font-size:14px; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.gal-act:hover{ background:rgba(0,0,0,.78); }
.gal-act-del:hover{ background:var(--red); }
.gal-oculta img{ opacity:.38; }
.gal-oculta-badge{ position:absolute; top:8px; left:9px; background:rgba(0,0,0,.6); color:#fff; font-size:10px; letter-spacing:.06em; text-transform:uppercase; padding:3px 7px; border-radius:6px; z-index:3; }
.gal-sec-sel{ position:absolute; left:6px; bottom:6px; z-index:3; font-size:11px; padding:3px 6px; border-radius:7px; border:0; background:rgba(0,0,0,.55); color:#fff; opacity:0; transition:.14s; max-width:calc(100% - 12px); }
.gal-item:hover .gal-sec-sel, .gal-sec-sel:focus{ opacity:1; }
/* Seleccion multiple: la palomita solo aparece al pasar el mouse, PERO una foto ya
   seleccionada la muestra siempre — si no, al mover el cursor no queda ni rastro de que
   fotos estan marcadas y el "mover a seccion" se vuelve a ciegas. */
.gal-check{ position:absolute; right:6px; bottom:6px; z-index:3; width:24px; height:24px; padding:0; border:1.5px solid rgba(255,255,255,.85); border-radius:50%; background:rgba(0,0,0,.42); color:transparent; font-size:12px; line-height:1; cursor:pointer; opacity:0; transition:.14s; display:flex; align-items:center; justify-content:center; }
.gal-item:hover .gal-check, .gal-check:focus-visible{ opacity:1; }
.gal-item.gal-sel .gal-check{ opacity:1; background:var(--accent); border-color:var(--accent); color:#fff; }
.gal-item.gal-sel{ border-color:var(--accent); box-shadow:0 0 0 2px var(--accent); }
/* "+" para inventar una seccion: mismo chip pero de borde punteado, para que se lea como
   "hueco por llenar" y no como un filtro mas de la fila. */
.fchip-mas{ border-style:dashed; padding-left:12px; padding-right:12px; font-size:14px; line-height:1; }
.fchip-mas:hover{ border-color:var(--accent); color:var(--accent); }
/* Barra de acciones de la seleccion: pegajosa arriba del grid para que siga a la vista
   cuando el fotografo lleva 200 fotos scrolleadas. */
#g-bulk.on{ position:sticky; top:8px; z-index:6; display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:12px; padding:9px 13px; border:1px solid var(--accent); border-radius:10px; background:var(--paper); box-shadow:0 2px 10px rgba(41,40,36,.09); }
/* ===== Galería · pestaña Actividad — qué pasa DESPUÉS de entregar =====
   Recrea la pantalla "Actividad" del handoff (Panel del Fotografo) con el vocabulario que
   ya existe en el CRM: .kpigrid+.stat para las tarjetas, .dash para las dos columnas y
   .pblock para los paneles. Solo se añade aquí lo que el sistema no tenía: las barras de
   visitas por día y las filas con miniatura. Prefijo gact- (gal-act ya son los botones
   del tile de la cuadrícula). */
.gact-seg{ width:max-content; max-width:100%; margin:-10px 0 18px; }
.gact-aviso{ font-size:12.5px; color:var(--muted); background:var(--bone); border:1px solid var(--hair); border-radius:10px; padding:11px 14px; margin-bottom:16px; }
.gact-spark{ display:flex; align-items:flex-end; gap:4px; height:78px; }
.gact-spark-col{ flex:1; height:100%; display:flex; align-items:flex-end; }
.gact-spark-bar{ width:100%; border-radius:4px 4px 2px 2px; background:var(--accent); min-height:3px; }
/* Un día sin visitas se dibuja como pista completa muy tenue, no como barra de altura
   cero: así se lee "ese día no entró nadie" y no "falta el dato". Tiene que quedar MUY por
   debajo del acento o los días vacíos parecen los que más tráfico tuvieron. */
.gact-spark-bar.vacio{ background:var(--hair); opacity:.28; border-radius:4px; }
.gact-row{ display:flex; align-items:center; gap:12px; padding:9px 0; border-bottom:1px solid var(--hair); }
.gact-row:last-child{ border-bottom:0; }
.gact-th{ width:44px; height:44px; flex:0 0 44px; object-fit:cover; border-radius:8px; background:var(--deep); }
.gact-n{ flex:0 0 auto; font-family:var(--serif); font-weight:600; font-size:19px; font-variant-numeric:tabular-nums; }
/* Miniaturas de tamaño fijo (no grid con 1fr): con dos o tres favoritas, una rejilla
   elástica las estira hasta que parecen otra cosa. */
.gact-favs{ display:flex; flex-wrap:wrap; gap:8px; }
.gact-fav{ width:84px; height:84px; object-fit:cover; border-radius:8px; background:var(--deep); }

/* Tarjetas de galería en la ficha del cliente */
.cl-gal-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(148px,1fr)); gap:12px; }
.cl-gal-card{ text-align:left; border:1px solid var(--hair); border-radius:12px; overflow:hidden; background:var(--paper); cursor:pointer; padding:0; }
.cl-gal-card:hover{ border-color:var(--accent); }
.cl-gal-cover{ aspect-ratio:4/3; background-size:cover; background-position:center; background-color:var(--deep); display:flex; align-items:center; justify-content:center; color:var(--muted); font-size:24px; }
.cl-gal-info{ padding:9px 11px; }
.cl-gal-t{ font-size:13.5px; font-weight:500; }

/* ================= Dashboard CEO (sección Dinero) ================= */
.ceo-bar{ align-items:center; }
.ceo-kpis{ display:grid; grid-template-columns:repeat(6,1fr); gap:10px; margin-bottom:16px; }
@media(max-width:1100px){ .ceo-kpis{ grid-template-columns:repeat(3,1fr); } }
@media(max-width:560px){ .ceo-kpis{ grid-template-columns:repeat(2,1fr); } }
.ceo-kpi{ position:relative; background:var(--paper); border:1px solid var(--hair); border-radius:var(--r); padding:14px 15px 15px; overflow:hidden; box-shadow:0 1px 3px rgba(41,40,36,.04); }
.ceo-kpi-bar{ position:absolute; left:0; top:0; bottom:0; width:3px; }
.ceo-kpi-l{ font-family:var(--mono); font-size:10px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); }
.ceo-kpi-n{ font-family:var(--serif); font-size:25px; font-weight:500; margin-top:7px; line-height:1; }
.ceo-kpi-s{ font-size:11.5px; color:var(--muted); margin-top:8px; line-height:1.3; }
.ceo-kpi.alerta{ background:color-mix(in srgb, var(--red) 5%, var(--paper)); }
.ceo-d{ font-family:var(--mono); font-weight:700; font-size:11px; }
.ceo-d.up{ color:var(--blue); } .ceo-d.down{ color:var(--red); }
.ceo-gauge{ height:10px; border-radius:99px; background:var(--deep); overflow:hidden; }
.ceo-gauge-fill{ height:100%; background:linear-gradient(90deg,var(--yellow),var(--blue)); border-radius:99px; transition:width .35s; }
.ceo-minis{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.ceo-mini{ text-align:center; padding:13px 8px; border:1px solid var(--hair); border-radius:10px; }
.ceo-mini-n{ font-family:var(--serif); font-size:23px; font-weight:500; }
.ceo-estac{ display:flex; align-items:flex-end; gap:4px; height:82px; padding-top:8px; }
.ceo-estac-col{ flex:1; display:flex; flex-direction:column; align-items:center; gap:5px; justify-content:flex-end; }
.ceo-estac-bar{ width:100%; max-width:15px; background:var(--blue); border-radius:3px 3px 0 0; }
.ceo-estac-l{ font-size:9px; color:var(--muted); }
.ceo-alerta{ display:flex; gap:10px; align-items:flex-start; padding:10px 0; border-bottom:1px solid var(--hair); font-size:13.5px; line-height:1.4; }
.ceo-alerta:last-child{ border-bottom:0; }
.ceo-alerta-dot{ width:7px; height:7px; border-radius:50%; background:var(--yellow); margin-top:6px; flex:0 0 7px; }
.ceo-link{ cursor:pointer; border-radius:6px; margin:0 -8px; padding-left:8px; padding-right:8px; }
.ceo-link:hover{ background:#F1EEE5; }
:root[data-theme="dark"] .ceo-link:hover{ background:#2C2C2A; }

/* ===== Editor de diseño de la galería (#/galeria-diseno/:id) — recreación del handoff
   "Editor de Galeria.dc.html": rail de 392px con tarjetas visuales + canvas con mockup
   de navegador/teléfono mostrando la vista previa real en vivo. Paleta propia (fija,
   estilo herramienta de diseño), con un ajuste minimo para modo oscuro del CRM. ===== */
.geditor{
  --ge-bg:#faf9f6; --ge-canvas:#e7e4dd; --ge-ink:#191714; --ge-ink2:#7a736a; --ge-ink3:#a89f93;
  --ge-line:rgba(25,23,20,.12); --ge-line2:rgba(25,23,20,.06); --ge-accent:#a85d3e;
  --ge-serif:'Cormorant Garamond',Georgia,serif;
  position:fixed; inset:0; z-index:40; display:flex; background:var(--ge-canvas);
  font-family:'Instrument Sans',var(--sans); color:var(--ge-ink); -webkit-font-smoothing:antialiased;
}
:root[data-theme="dark"] .geditor{ --ge-bg:#232220; --ge-canvas:#18171533; --ge-ink:#f0ece4; --ge-ink2:#a49c90; --ge-ink3:#6f675c; --ge-line:rgba(240,236,228,.14); --ge-line2:rgba(240,236,228,.07); --ge-canvas:#161513; }
.geditor button{ font-family:inherit; cursor:pointer; border:none; background:none; color:inherit; }
.geditor input,.geditor textarea{ font-family:inherit; }
.geditor .ge-serif{ font-family:var(--ge-serif); font-weight:500; line-height:1; }
.geditor .ge-label{ text-transform:uppercase; letter-spacing:.2em; font-size:10px; font-weight:600; color:var(--ge-ink3); }

/* rail */
.ge-rail{ width:392px; flex:none; background:var(--ge-bg); border-right:1px solid var(--ge-line2); display:flex; flex-direction:column; height:100%; }
.ge-railtop{ padding:22px 26px 20px; border-bottom:1px solid var(--ge-line2); }
.ge-crumb{ display:flex; align-items:center; gap:8px; color:var(--ge-ink2); font-size:12.5px; font-weight:500; margin-bottom:16px; background:none; padding:0; }
.ge-crumb:hover{ color:var(--ge-ink); }
.ge-crumb .ge-bk{ width:28px; height:28px; border-radius:8px; border:1px solid var(--ge-line); display:flex; align-items:center; justify-content:center; font-size:15px; flex:none; }
.ge-galname{ font-family:var(--ge-serif); font-size:26px; font-weight:600; line-height:1.08; margin:0 0 12px; color:var(--ge-ink); }
.ge-statusrow{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.ge-pill{ display:inline-flex; align-items:center; gap:7px; padding:6px 12px; border-radius:100px; font-size:11.5px; font-weight:600; letter-spacing:.02em; }
.ge-pill.draft{ background:rgba(168,93,62,.1); color:#8a4a30; }
:root[data-theme="dark"] .ge-pill.draft{ color:#e0a081; }
.ge-pill.pub{ background:rgba(74,110,80,.12); color:#3c6042; }
:root[data-theme="dark"] .ge-pill.pub{ color:#8fbf96; }
.ge-pill .ge-dot{ width:6px; height:6px; border-radius:100px; background:currentColor; }
.ge-railacts{ display:flex; gap:8px; margin-top:16px; }
.ge-rbtn{ flex:1; padding:11px; border-radius:100px; font-size:13px; font-weight:600; border:1px solid var(--ge-line); transition:.18s; text-align:center; color:var(--ge-ink); }
.ge-rbtn:hover{ border-color:var(--ge-ink); }
.ge-rbtn:disabled{ opacity:.5; cursor:not-allowed; }
.ge-rbtn.primary{ background:var(--ge-ink); color:var(--ge-bg); border-color:var(--ge-ink); }
.ge-rbtn.primary:hover{ opacity:.88; }
.ge-savestate{ font-size:11px; color:var(--ge-ink3); margin-top:10px; text-align:center; height:14px; }
.ge-railscroll{ flex:1; overflow-y:auto; padding:6px 26px 40px; }
.ge-sec{ padding:22px 0; border-bottom:1px solid var(--ge-line2); }
.ge-sec:last-child{ border-bottom:0; }
.ge-sechd{ display:flex; align-items:center; gap:9px; margin-bottom:16px; }
.ge-sechd .ge-n{ font-family:var(--ge-serif); font-size:19px; font-weight:600; }
.ge-sechd .ge-ix{ width:20px; height:20px; border-radius:6px; background:rgba(25,23,20,.05); display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:600; color:var(--ge-ink2); flex:none; }
.ge-field{ margin-bottom:16px; }
.ge-field:last-child{ margin-bottom:0; }
.ge-flabel{ font-size:12px; font-weight:600; color:var(--ge-ink2); margin-bottom:9px; display:flex; justify-content:space-between; }
.ge-flabel .ge-v{ color:var(--ge-ink); font-weight:600; }
.ge-seg{ display:flex; gap:3px; background:rgba(25,23,20,.05); border-radius:11px; padding:3px; }
.ge-segbtn{ flex:1; padding:9px 6px; border-radius:8px; font-size:12.5px; font-weight:600; color:var(--ge-ink2); transition:.16s; text-align:center; white-space:nowrap; }
.ge-segbtn:hover{ color:var(--ge-ink); }
.ge-segbtn.on{ background:var(--ge-bg); color:var(--ge-ink); box-shadow:0 1px 3px rgba(0,0,0,.1); }
.ge-swrow{ display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
.ge-sw{ width:34px; height:34px; border-radius:100px; position:relative; transition:.15s; border:2px solid transparent; flex:none; }
.ge-sw:hover{ transform:scale(1.08); }
.ge-sw.on{ box-shadow:0 0 0 2px var(--ge-bg),0 0 0 4px var(--ge-ink); }
.ge-swcustom{ width:30px; height:30px; border-radius:100px; border:1px solid var(--ge-line); padding:0; }
.ge-cards{ display:grid; grid-template-columns:repeat(3,1fr); gap:8px; }
.ge-card{ border:1px solid var(--ge-line); border-radius:12px; padding:13px 11px; cursor:pointer; transition:.15s; text-align:left; background:none; display:block; width:100%; }
.ge-card:hover{ border-color:var(--ge-ink3); }
.ge-card.on{ border-color:var(--ge-ink); background:rgba(25,23,20,.02); box-shadow:inset 0 0 0 1px var(--ge-ink); }
.ge-card .ge-ct{ font-size:13px; font-weight:600; margin-bottom:2px; color:var(--ge-ink); }
.ge-card .ge-cs{ font-size:11px; color:var(--ge-ink2); }
.ge-card .ge-prev{ height:30px; border-radius:6px; margin-bottom:9px; display:flex; align-items:center; justify-content:center; font-size:15px; overflow:hidden; background:linear-gradient(150deg,#2a2620,#151310); color:#efe9df; }
.ge-card .ge-prev.ge-pf-editorial{ font-family:'Cormorant Garamond',serif; font-style:italic; }
.ge-card .ge-prev.ge-pf-modern{ font-family:'Instrument Sans',sans-serif; font-weight:700; letter-spacing:-.02em; }
.ge-card .ge-prev.ge-pf-romantic{ font-family:'Newsreader',serif; font-style:italic; }
.ge-card .ge-prev.ge-pf-portal-moderna{ font-family:'Playfair Display',Georgia,serif; font-weight:600; }
.ge-card .ge-prev.ge-cv-full{ background:linear-gradient(150deg,#3b342b,#151310); }
.ge-card .ge-prev.ge-cv-framed{ background:#151310; padding:5px; }
.ge-card .ge-prev.ge-cv-framed .ge-fr{ width:100%; height:100%; border:1px solid rgba(239,233,223,.4); background:linear-gradient(150deg,#3b342b,#1c1812); }
.ge-card .ge-prev.ge-cv-minimal{ background:#151310; font-family:'Cormorant Garamond',serif; font-style:italic; font-size:13px; }
.ge-card .ge-prev.ge-cv-split{ background:#151310; padding:0; overflow:hidden; }
.ge-card .ge-prev.ge-cv-split .ge-c4a{ width:42%; background:linear-gradient(150deg,#3b342b,#1c1812); }
.ge-card .ge-prev.ge-cv-split .ge-c4b{ flex:1; display:flex; align-items:center; justify-content:center; font-family:'Cormorant Garamond',serif; font-style:italic; font-size:12px; color:#efe9df; }
.ge-card .ge-prev.ge-cv-bottom{ background:linear-gradient(150deg,#3b342b,#151310); align-items:flex-end; justify-content:flex-start; padding:0; }
.ge-card .ge-prev.ge-cv-bottom .ge-c5t{ padding:4px 8px; font-family:'Cormorant Garamond',serif; font-style:italic; font-size:12px; }
.ge-card .ge-prev.ge-cv-postcard{ background:#151310; flex-direction:column; padding:0; gap:0; }
.ge-card .ge-prev.ge-cv-postcard .ge-c6i{ flex:1; width:100%; background:linear-gradient(150deg,#3b342b,#1c1812); }
.ge-card .ge-prev.ge-cv-postcard .ge-c6b{ height:12px; display:flex; align-items:center; justify-content:center; font-family:'Cormorant Garamond',serif; font-style:italic; font-size:9px; color:#efe9df; }
.ge-toggle{ display:flex; align-items:center; justify-content:space-between; padding:13px 0; gap:12px; }
.ge-toggle+.ge-toggle{ border-top:1px solid var(--ge-line2); }
.ge-toggle .ge-tt{ font-size:13.5px; font-weight:600; }
.ge-toggle .ge-ts{ font-size:11.5px; color:var(--ge-ink2); margin-top:1px; }
.ge-sw2{ width:42px; height:25px; border-radius:100px; background:rgba(25,23,20,.15); position:relative; transition:.2s; flex:none; }
.ge-sw2:after{ content:""; position:absolute; top:3px; left:3px; width:19px; height:19px; border-radius:100px; background:#fff; transition:.2s; box-shadow:0 1px 3px rgba(0,0,0,.2); }
.ge-sw2.on{ background:var(--ge-ink); }
.ge-sw2.on:after{ left:20px; }
.ge-sub{ margin-top:10px; padding-left:2px; }
.ge-note{ width:100%; border:1px solid var(--ge-line); border-radius:12px; padding:13px; font-size:16px; line-height:1.55; color:var(--ge-ink); resize:vertical; min-height:82px; outline:none; font-family:'Cormorant Garamond',serif; font-style:italic; background:var(--ge-bg); box-sizing:border-box; }
.ge-note:focus{ border-color:var(--ge-ink); }
.ge-txt{ width:100%; border:1px solid var(--ge-line); border-radius:10px; padding:11px 13px; font-size:13.5px; outline:none; background:var(--ge-bg); color:var(--ge-ink); box-sizing:border-box; }
.ge-txt:focus{ border-color:var(--ge-ink); }

/* canvas */
.ge-canvas{ flex:1; background:var(--ge-canvas); display:flex; flex-direction:column; min-width:0; height:100%; }
.ge-canvastop{ display:flex; align-items:center; justify-content:space-between; padding:16px 26px; gap:16px; flex-wrap:wrap; }
.ge-ctlabel{ display:flex; align-items:center; gap:9px; color:var(--ge-ink2); font-size:12px; font-weight:600; }
.ge-ctlabel .ge-lv{ width:7px; height:7px; border-radius:100px; background:#4a6e50; box-shadow:0 0 0 3px rgba(74,110,80,.2); flex:none; }
.ge-segdark{ display:flex; gap:3px; background:rgba(25,23,20,.07); border-radius:11px; padding:3px; }
.ge-segdark .ge-segbtn{ padding:8px 16px; flex:none; }
.ge-stagewrap{ flex:1; display:flex; align-items:center; justify-content:center; padding:6px 26px 30px; min-height:0; }
.ge-browser{ width:100%; max-width:1120px; height:100%; background:#fff; border-radius:16px 16px 14px 14px; box-shadow:0 40px 90px -40px rgba(0,0,0,.4); display:flex; flex-direction:column; overflow:hidden; border:1px solid rgba(0,0,0,.08); }
.ge-bbar{ height:44px; flex:none; display:flex; align-items:center; gap:14px; padding:0 16px; background:#f2efe9; border-bottom:1px solid var(--ge-line2); }
.ge-dots{ display:flex; gap:7px; }
.ge-dots i{ width:11px; height:11px; border-radius:100px; background:#d6d0c6; display:block; }
.ge-url{ flex:1; background:#fff; border-radius:8px; height:26px; display:flex; align-items:center; padding:0 12px; font-size:12px; color:var(--ge-ink2); gap:7px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }
.ge-bbody{ flex:1; min-height:0; overflow:hidden; position:relative; }
.ge-bbody iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; }
.ge-phonewrap{ height:100%; display:flex; align-items:center; justify-content:center; }
.ge-phoneframe{ width:390px; max-width:100%; height:min(100%,780px); border-radius:34px; background:#111; padding:12px; box-shadow:0 40px 90px -40px rgba(0,0,0,.5); display:flex; box-sizing:border-box; }
.ge-phoneframe .ge-bbody{ border-radius:24px; background:#fff; flex:1; min-width:0; }
@media (max-width:1000px){
  .geditor{ flex-direction:column; }
  .ge-rail{ width:100%; height:auto; max-height:56vh; border-right:0; border-bottom:1px solid var(--ge-line2); }
  .ge-canvas{ height:auto; flex:1; }
}

/* ============================================================================
   CALENDARIO (rediseño, handoff design_handoff_calendario) — overlay de pantalla
   completa, mismo patron que .ced/.geditor (position:fixed;inset:0;z-index:40,
   namespace propio de variables). Oscuro FIJO como .ced (no cambia con el tema
   claro/oscuro de la app: es el mismo patron editorial oscuro en los 3 handoffs).
   Todo clase estructural va prefijada cf- para no chocar con .btn/.modal/.label/
   .inp/.detail/.scrim/etc que ya son clases globales de esta app; los modificadores
   de estado cortos (on/off/today/wknd/blocked/sel/done/dragging/conflict/short/out/
   hasSel/danger/accent/ico/warn) se quedan sin prefijo pero SIEMPRE compuestos con
   una clase cf- (nunca sueltos), igual que .ced-prow.ok / .ced-pact.danger.
   ============================================================================ */
/* .calfull sigue el mismo patron que .aled (editor de albumes, ver esa nota mas abajo):
   position:absolute;inset:0 anclado a #view (no position:fixed a la ventana completa),
   asi el chat de Xarpie -que vive a la izquierda de #view, no debajo- nunca queda tapado.
   Las reglas compartidas (.main columna flex, #view:has(...) sin max-width/padding,
   .main:has(...) sin scroll propio) estan declaradas UNA vez junto a .aled y las
   extienden ambos selectores. */
.calfull{
  --cal-bg:#262624; --cal-panel:#30302e; --cal-panel2:#383835;
  --cal-line:rgba(255,255,255,.09); --cal-line2:rgba(255,255,255,.05);
  --cal-ink:#f5f4ee; --cal-ink2:#bdbbb0; --cal-ink3:#84827b;
  --cal-accent:#d97757; --cal-accent2:#bd5d3a; --cal-ok:#93a986; --cal-gold:#cfa15e; --cal-warn:#d2694f;
  --cal-serif:'Cormorant Garamond',Georgia,serif;
  position:absolute; inset:0; z-index:40; display:flex; flex-direction:column;
  background:var(--cal-bg); color:var(--cal-ink); font-family:'Instrument Sans',var(--sans);
  -webkit-font-smoothing:antialiased; overflow:hidden; padding:20px 22px 0;
  container-type:inline-size; /* los breakpoints del calendario son por su propio ancho, no el de la ventana -- el chat de Xarpie se lo puede comer */
}
.calfull button{ font-family:inherit; cursor:pointer; border:none; background:none; color:inherit; text-align:left; }
.calfull input,.calfull textarea,.calfull select{ font-family:inherit; }
.calfull select.cf-inp{ appearance:none; background-image:linear-gradient(45deg,transparent 50%,var(--cal-ink3) 50%),linear-gradient(135deg,var(--cal-ink3) 50%,transparent 50%); background-position:calc(100% - 15px) 50%,calc(100% - 10px) 50%; background-size:5px 5px,5px 5px; background-repeat:no-repeat; padding-right:30px; }
.cf-label{ text-transform:uppercase; letter-spacing:.2em; font-size:10px; font-weight:600; color:var(--cal-ink3); }

/* ---- header / alta rapida / filtros ---- */
.cf-hd{ display:flex; align-items:flex-end; justify-content:space-between; gap:18px; flex-wrap:wrap; flex:none; padding-bottom:14px; }
.cf-eyebrow{ text-transform:uppercase; letter-spacing:.2em; font-size:10px; font-weight:600; color:var(--cal-accent); }
.cf-htitle{ font-family:var(--cal-serif); font-size:34px; font-weight:600; letter-spacing:-.01em; line-height:1; margin:8px 0 0; }
.cf-hsub{ font-size:11.5px; color:var(--cal-ink3); margin-top:6px; display:flex; align-items:center; gap:9px; flex-wrap:wrap; }
.cf-warnpill{ color:var(--cal-warn); font-weight:600; display:inline-flex; align-items:center; gap:5px; }
.cf-hright{ display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.cf-nav{ display:inline-flex; align-items:center; gap:2px; border:1px solid var(--cal-line); border-radius:100px; padding:3px; }
.cf-nav button{ height:29px; padding:0 10px; border-radius:100px; color:var(--cal-ink2); display:inline-flex; align-items:center; justify-content:center; font-size:12.5px; font-weight:600; transition:.14s; }
.cf-nav button:hover{ background:rgba(255,255,255,.07); color:var(--cal-ink); }
.cf-seg{ display:inline-flex; background:var(--cal-panel); border:1px solid var(--cal-line); border-radius:100px; padding:3px; gap:2px; }
.cf-seg button{ height:29px; padding:0 14px; border-radius:100px; font-size:12.5px; font-weight:600; color:var(--cal-ink3); transition:.14s; }
.cf-seg button:hover{ color:var(--cal-ink); }
.cf-seg button.on{ background:var(--cal-accent); color:#fff; }
.cf-btn{ display:inline-flex; align-items:center; gap:7px; height:35px; padding:0 15px; border-radius:100px; border:1px solid var(--cal-line); font-size:12.5px; font-weight:600; color:var(--cal-ink); transition:.14s; white-space:nowrap; }
.cf-btn:hover{ border-color:var(--cal-ink3); }
.cf-btn.accent{ background:var(--cal-accent); border-color:var(--cal-accent); color:#fff; }
.cf-btn.accent:hover{ background:var(--cal-accent2); }
.cf-btn.ico{ width:35px; padding:0; justify-content:center; }
.cf-btn.sm{ height:28px; padding:0 11px; font-size:11.5px; }
.cf-search{ display:inline-flex; align-items:center; gap:8px; height:35px; padding:0 13px; border-radius:100px; border:1px solid var(--cal-line); background:var(--cal-panel); color:var(--cal-ink3); transition:.14s; min-width:180px; }
.cf-search:focus-within{ border-color:var(--cal-accent); }
.cf-search input{ background:none; border:none; outline:none; color:var(--cal-ink); font-size:12.5px; width:100%; }
.cf-search input::placeholder{ color:var(--cal-ink3); }
.cf-search button{ color:var(--cal-ink3); display:flex; }
.cf-qadd{ display:flex; align-items:center; gap:9px; flex:none; margin-bottom:12px; background:var(--cal-panel); border:1px solid var(--cal-line); border-radius:100px; padding:0 6px 0 15px; height:40px; transition:.14s; }
.cf-qadd:focus-within{ border-color:var(--cal-accent); }
.cf-qadd input{ flex:1; background:none; border:none; outline:none; color:var(--cal-ink); font-size:13.5px; }
.cf-qadd input::placeholder{ color:var(--cal-ink3); }
.cf-qhint{ font-size:10.5px; color:var(--cal-ink3); white-space:nowrap; }
.cf-filters{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; flex:none; padding-bottom:12px; border-bottom:1px solid var(--cal-line); }
.cf-fchip{ display:inline-flex; align-items:center; gap:7px; height:28px; padding:0 11px; border-radius:100px; border:1px solid var(--cal-line); font-size:11.5px; font-weight:600; color:var(--cal-ink3); transition:.14s; }
.cf-fchip:hover{ color:var(--cal-ink); border-color:var(--cal-ink3); }
.cf-fchip.on{ color:var(--cal-ink); border-color:transparent; background:rgba(255,255,255,.07); }
.cf-fchip.warn{ color:var(--cal-warn); border-color:rgba(210,105,79,.4); }
.cf-fdot{ width:8px; height:8px; border-radius:100px; flex:none; }
.cf-fn{ font-variant-numeric:tabular-nums; opacity:.6; font-size:11px; }
.cf-fsep{ width:1px; height:19px; background:var(--cal-line); margin:0 3px; }

/* ---- body: riel / grid principal / detalle ---- */
.cf-body{ flex:1; min-height:0; display:flex; gap:14px; padding:14px 0 18px; }
.cf-rail{ width:214px; flex:none; display:flex; flex-direction:column; gap:12px; overflow-y:auto; }
.cf-rcard{ background:var(--cal-panel); border:1px solid var(--cal-line); border-radius:15px; padding:13px; }
.cf-rtitle{ font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--cal-ink3); font-weight:600; margin-bottom:11px; display:flex; align-items:center; justify-content:space-between; }
.cf-rtitle button{ color:var(--cal-ink3); display:flex; }
.cf-rtitle button:hover{ color:var(--cal-ink); }
.cf-mini{ display:grid; grid-template-columns:repeat(7,1fr); gap:1px; }
.cf-mh{ font-size:8.5px; color:var(--cal-ink3); text-align:center; font-weight:600; padding-bottom:5px; }
.cf-mid{ aspect-ratio:1; border-radius:6px; display:flex; flex-direction:column; align-items:center; justify-content:center; font-size:10.5px; font-variant-numeric:tabular-nums; color:var(--cal-ink2); transition:.12s; gap:1px; position:relative; }
.cf-mid:hover{ background:rgba(255,255,255,.08); color:var(--cal-ink); }
.cf-mid.out{ color:var(--cal-ink3); opacity:.45; }
.cf-mid.today{ background:var(--cal-accent); color:#fff; font-weight:700; }
.cf-mid.inview{ background:rgba(255,255,255,.07); }
.cf-mdd{ width:3px; height:3px; border-radius:100px; background:var(--cal-accent); }
.cf-mid.today .cf-mdd{ background:#fff; }
.cf-callist{ display:flex; flex-direction:column; gap:2px; }
.cf-calrow{ display:flex; align-items:center; gap:9px; padding:7px 6px; border-radius:8px; font-size:12px; transition:.12s; width:100%; }
.cf-calrow:hover{ background:rgba(255,255,255,.05); }
.cf-cbox{ width:14px; height:14px; border-radius:4px; flex:none; border:1.5px solid; display:flex; align-items:center; justify-content:center; color:#221f1c; }
.cf-cnm{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cf-calrow.off{ color:var(--cal-ink3); }
.cf-cn{ font-size:10.5px; color:var(--cal-ink3); font-variant-numeric:tabular-nums; }
.cf-avrow{ display:flex; align-items:baseline; justify-content:space-between; gap:8px; padding:6px 0; font-size:12px; color:var(--cal-ink2); border-bottom:1px solid var(--cal-line2); }
.cf-avrow:last-child{ border-bottom:none; }
.cf-avrow b{ font-family:var(--cal-serif); font-size:17px; font-weight:600; color:var(--cal-ink); }
.cf-freelist{ display:flex; flex-wrap:wrap; gap:5px; margin-top:9px; }
.cf-freechip{ font-size:11px; font-weight:600; color:var(--cal-ok); border:1px solid rgba(147,169,134,.35); border-radius:100px; padding:4px 9px; transition:.12s; }
.cf-freechip:hover{ background:rgba(147,169,134,.14); }
.cf-main{ flex:1; min-width:0; display:flex; flex-direction:column; background:var(--cal-panel); border:1px solid var(--cal-line); border-radius:16px; overflow:hidden; }

/* ---- mes ---- */
.cf-mhead{ display:grid; grid-template-columns:var(--mc,repeat(7,1fr)); flex:none; border-bottom:1px solid var(--cal-line); }
.cf-mhead div{ padding:11px; font-size:9.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--cal-ink3); font-weight:600; text-align:center; }
.cf-mcells{ flex:1; min-height:0; display:grid; grid-template-columns:var(--mc,repeat(7,1fr)); grid-auto-rows:1fr; overflow-y:auto; }
.cf-mcell{ min-height:98px; padding:6px; border-top:1px solid var(--cal-line2); border-right:1px solid var(--cal-line2); display:flex; flex-direction:column; gap:3px; overflow:hidden; transition:.12s; }
.cf-mcell.lastcol{ border-right:none; }
.cf-mcell.firstrow{ border-top:none; }
.cf-mcell:hover{ background:rgba(255,255,255,.022); }
.cf-mcell.out{ background:rgba(0,0,0,.16); }
.cf-mcell.out .cf-mnum{ color:var(--cal-ink3); opacity:.6; }
.cf-mcell.wknd{ background:rgba(207,161,94,.03); }
.cf-mcell.blocked{ background:repeating-linear-gradient(45deg,rgba(210,105,79,.09) 0 7px,transparent 7px 14px); }
.cf-mctop{ display:flex; align-items:center; justify-content:space-between; gap:6px; }
.cf-mnum{ width:24px; height:24px; border-radius:100px; display:flex; align-items:center; justify-content:center; font-size:12px; font-weight:600; color:var(--cal-ink2); font-variant-numeric:tabular-nums; transition:.12s; }
.cf-mnum:hover{ background:rgba(255,255,255,.09); color:var(--cal-ink); }
.cf-mnum.today{ background:var(--cal-accent); color:#fff; }
.cf-mdots{ display:flex; gap:3px; }
.cf-mchip{ display:flex; align-items:center; gap:5px; padding:3px 6px; border-radius:6px; font-size:11px; line-height:1.25; border-left:2.5px solid; overflow:hidden; white-space:nowrap; transition:.12s; width:100%; }
.cf-mchip:hover{ filter:brightness(1.35); }
.cf-mchip.done{ opacity:.5; }
.cf-ctime{ font-size:9.5px; font-variant-numeric:tabular-nums; opacity:.75; flex:none; }
.cf-ctxt{ overflow:hidden; text-overflow:ellipsis; }
.cf-mmore{ font-size:10px; color:var(--cal-ink3); font-weight:600; padding:1px 6px; }
.cf-mmore:hover{ color:var(--cal-accent); }

/* ---- semana / dia ---- */
.cf-wwrap{ flex:1; min-height:0; display:flex; flex-direction:column; }
.cf-wbody{ flex:1; min-height:0; overflow-y:auto; }
.cf-wtop{ position:sticky; top:0; z-index:12; background:var(--cal-panel); }
.cf-wrow{ display:grid; grid-template-columns:var(--wc); }
.cf-whead{ border-bottom:1px solid var(--cal-line); background:var(--cal-panel); }
.cf-wgut{ border-right:1px solid var(--cal-line2); }
.cf-wdh{ padding:9px 6px 10px; text-align:center; border-right:1px solid var(--cal-line2); display:flex; flex-direction:column; gap:2px; align-items:center; transition:.12s; position:relative; }
.cf-wdh:last-child{ border-right:none; }
.cf-wdh:hover{ background:rgba(255,255,255,.03); }
.cf-wdn{ font-size:9px; letter-spacing:.15em; text-transform:uppercase; color:var(--cal-ink3); font-weight:600; }
.cf-wdd{ font-family:var(--cal-serif); font-size:22px; font-weight:600; line-height:1; width:30px; height:30px; border-radius:100px; display:flex; align-items:center; justify-content:center; }
.cf-wdh.today .cf-wdn{ color:var(--cal-accent); }
.cf-wdh.today .cf-wdd{ background:var(--cal-accent); color:#fff; font-size:19px; }
.cf-wdh.wknd{ background:rgba(207,161,94,.03); }
.cf-bmark{ position:absolute; top:5px; right:6px; font-size:8.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--cal-warn); font-weight:700; }
.cf-wad{ border-bottom:1px solid var(--cal-line); background:#2b2b29; }
.cf-wadlbl{ padding:8px 7px; border-right:1px solid var(--cal-line2); display:flex; flex-direction:column; gap:3px; align-items:flex-start; }
.cf-l1{ font-size:8.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--cal-ink3); font-weight:600; white-space:nowrap; }
.cf-wadlbl button{ font-size:10px; color:var(--cal-accent); font-weight:600; white-space:nowrap; }
.cf-wadc{ padding:5px; border-right:1px solid var(--cal-line2); display:flex; flex-direction:column; gap:3px; min-width:0; }
.cf-wadc:last-child{ border-right:none; }
.cf-adchip{ display:flex; align-items:center; gap:5px; padding:3px 6px; border-radius:6px; font-size:11px; line-height:1.25; border-left:2.5px solid; white-space:nowrap; overflow:hidden; transition:.12s; width:100%; }
.cf-adchip:hover{ filter:brightness(1.35); }
.cf-adchip.done{ opacity:.5; }
.cf-adchip span{ overflow:hidden; text-overflow:ellipsis; }
.cf-wtimed{ position:relative; min-height:100%; }
.cf-wtimes{ border-right:1px solid var(--cal-line2); }
.cf-thr{ height:var(--hh); position:relative; }
.cf-thr span{ position:absolute; top:-7px; right:8px; font-size:10px; color:var(--cal-ink3); font-variant-numeric:tabular-nums; letter-spacing:.03em; }
.cf-thr:first-child span{ top:2px; }
.cf-wcol{ position:relative; border-right:1px solid var(--cal-line2); background-image:linear-gradient(to bottom,var(--cal-line2) 1px,transparent 1px); background-size:100% var(--hh); }
.cf-wcol:last-child{ border-right:none; }
.cf-wcol.wknd{ background-color:rgba(207,161,94,.025); }
.cf-wcol.today{ background-color:rgba(217,119,87,.045); }
.cf-wcol.blocked{ background-image:repeating-linear-gradient(45deg,rgba(210,105,79,.07) 0 8px,transparent 8px 16px),linear-gradient(to bottom,var(--cal-line2) 1px,transparent 1px); }
.cf-ev{ position:absolute; border-radius:7px; padding:4px 7px; font-size:11px; line-height:1.25; overflow:hidden; border-left:2.5px solid; display:flex; flex-direction:column; gap:1px; transition:filter .12s; min-height:19px; cursor:grab; user-select:none; z-index:3; }
.cf-ev:hover{ filter:brightness(1.35); z-index:6; }
.cf-ev.sel{ outline:1.5px solid var(--cal-ink); outline-offset:-1px; z-index:7; }
.cf-ev.conflict{ box-shadow:inset 0 0 0 1.5px var(--cal-warn); }
.cf-ev.dragging{ cursor:grabbing; opacity:.85; z-index:20; box-shadow:0 10px 26px -8px rgba(0,0,0,.7); }
.cf-evt{ font-size:9.5px; font-variant-numeric:tabular-nums; opacity:.8; display:flex; align-items:center; gap:4px; }
.cf-evn{ font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cf-ev.short{ flex-direction:row; align-items:center; gap:6px; padding:2px 7px; }
.cf-evrz{ position:absolute; left:0; right:0; bottom:0; height:7px; cursor:ns-resize; }
.cf-evrz::after{ content:""; position:absolute; left:50%; transform:translateX(-50%); bottom:2px; width:16px; height:2px; border-radius:2px; background:rgba(255,255,255,.3); opacity:0; transition:.12s; }
.cf-ev:hover .cf-evrz::after{ opacity:1; }
.cf-buf{ position:absolute; border-radius:5px; background:repeating-linear-gradient(45deg,rgba(255,255,255,.09) 0 5px,transparent 5px 10px); pointer-events:none; z-index:1; }
.cf-nowl{ position:absolute; left:0; right:0; height:1.5px; background:var(--cal-accent); z-index:9; pointer-events:none; }
.cf-nowl::before{ content:""; position:absolute; left:-4px; top:-3px; width:8px; height:8px; border-radius:100px; background:var(--cal-accent); }

/* ---- lista lateral de vista Dia ---- */
.cf-dayview{ flex:1; min-height:0; display:grid; grid-template-columns:1fr 248px; }
.cf-daylist{ border-left:1px solid var(--cal-line); display:flex; flex-direction:column; min-height:0; background:rgba(0,0,0,.1); }
.cf-dlhd{ padding:13px 15px 11px; border-bottom:1px solid var(--cal-line2); flex:none; }
.cf-dlt{ font-family:var(--cal-serif); font-size:18px; font-weight:600; margin-top:4px; }
.cf-dlbody{ flex:1; min-height:0; overflow-y:auto; padding:11px; }
.cf-dlgroup{ margin-bottom:14px; }
.cf-dlgl{ font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--cal-ink3); font-weight:600; margin:0 4px 8px; }
.cf-dli{ display:flex; align-items:flex-start; gap:8px; padding:8px 9px; border-radius:9px; border:1px solid var(--cal-line); margin-bottom:6px; transition:.12s; width:100%; }
.cf-dli:hover{ border-color:var(--cal-ink3); }
.cf-dli.sel{ border-color:var(--cal-accent); background:rgba(217,119,87,.07); }
.cf-dli.done .cf-dlin{ text-decoration:line-through; color:var(--cal-ink3); }
.cf-dlb{ width:3px; align-self:stretch; border-radius:100px; flex:none; min-height:24px; }
.cf-dlm{ flex:1; min-width:0; }
.cf-dlin{ font-size:12px; font-weight:600; line-height:1.35; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cf-dlmeta{ font-size:10.5px; color:var(--cal-ink3); margin-top:2px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cf-dlchk{ width:18px; height:18px; border-radius:100px; border:1.5px solid var(--cal-line); display:flex; align-items:center; justify-content:center; color:transparent; flex:none; transition:.12s; margin-top:1px; }
.cf-dlchk:hover{ border-color:var(--cal-ok); color:var(--cal-ok); }
.cf-dli.done .cf-dlchk{ background:var(--cal-ok); border-color:var(--cal-ok); color:#1d1b17; }
.cf-dlempty{ font-size:12px; color:var(--cal-ink3); padding:8px 4px; line-height:1.5; }

/* ---- panel de detalle ---- */
.cf-detail{ width:290px; flex:none; background:var(--cal-panel); border:1px solid var(--cal-line); border-radius:16px; display:flex; flex-direction:column; overflow:hidden; }
.cf-dhd{ padding:15px 16px 14px; border-bottom:1px solid var(--cal-line2); display:flex; align-items:flex-start; gap:10px; flex:none; }
.cf-dbar{ width:3px; align-self:stretch; border-radius:100px; flex:none; }
.cf-dm{ flex:1; min-width:0; }
.cf-dt{ font-family:var(--cal-serif); font-size:19px; font-weight:600; line-height:1.15; margin-top:3px; }
.cf-xb{ width:28px; height:28px; border-radius:9px; border:1px solid var(--cal-line); display:flex; align-items:center; justify-content:center; color:var(--cal-ink2); flex:none; }
.cf-xb:hover{ border-color:var(--cal-ink3); color:var(--cal-ink); }
.cf-dbody{ flex:1; min-height:0; overflow-y:auto; padding:15px 16px 20px; }
.cf-fgrp{ margin-bottom:14px; }
.cf-flbl{ display:block; font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--cal-ink3); font-weight:600; margin-bottom:6px; }
.cf-inp{ width:100%; background:rgba(0,0,0,.22); border:1px solid var(--cal-line); border-radius:9px; padding:8px 11px; font-size:12.5px; color:var(--cal-ink); outline:none; transition:.14s; }
.cf-inp:focus{ border-color:var(--cal-accent); }
.cf-inp:disabled{ opacity:.55; cursor:not-allowed; }
textarea.cf-inp{ resize:vertical; min-height:54px; line-height:1.5; }
.cf-two{ display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.cf-typegrid{ display:flex; flex-wrap:wrap; gap:5px; }
.cf-tpill{ display:inline-flex; align-items:center; gap:6px; padding:5px 9px; border-radius:100px; border:1px solid var(--cal-line); font-size:11px; font-weight:600; color:var(--cal-ink3); transition:.12s; }
.cf-tpill:hover{ color:var(--cal-ink); }
.cf-tpill.on{ color:var(--cal-ink); border-color:transparent; }
.cf-tgl{ width:37px; height:21px; border-radius:100px; background:rgba(255,255,255,.12); position:relative; transition:.16s; flex:none; }
.cf-tgl.on{ background:var(--cal-ok); }
.cf-tgl::after{ content:""; position:absolute; top:2.5px; left:2.5px; width:16px; height:16px; border-radius:100px; background:#fff; transition:.16s; }
.cf-tgl.on::after{ transform:translateX(16px); }
.cf-trow{ display:flex; align-items:center; justify-content:space-between; gap:10px; font-size:12.5px; padding:2px 0; }
.cf-warnbox{ display:flex; gap:9px; padding:11px 12px; border-radius:11px; background:rgba(210,105,79,.12); border:1px solid rgba(210,105,79,.3); margin-bottom:14px; font-size:11.5px; line-height:1.5; color:#f0cfc4; }
.cf-warnbox b{ color:#fff; display:block; margin-bottom:2px; font-size:12px; }
.cf-dacts{ display:flex; flex-wrap:wrap; gap:6px; padding-top:6px; border-top:1px solid var(--cal-line2); margin-top:4px; }
.cf-dact{ flex:1; min-width:calc(50% - 3px); justify-content:center; height:32px; padding:0 9px; border-radius:9px; border:1px solid var(--cal-line); font-size:11px; font-weight:600; color:var(--cal-ink2); display:inline-flex; align-items:center; gap:5px; transition:.12s; }
.cf-dact:hover{ border-color:var(--cal-ink3); color:var(--cal-ink); }
.cf-dact.danger:hover{ border-color:var(--cal-accent); color:var(--cal-accent); }
.cf-dnone{ flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; padding:26px 20px; color:var(--cal-ink3); gap:12px; overflow-y:auto; }
.cf-di{ width:44px; height:44px; border-radius:100px; border:1px dashed var(--cal-line); display:flex; align-items:center; justify-content:center; }
.cf-dnone p{ font-size:12px; line-height:1.55; margin:0; }
.cf-dnstats{ width:100%; display:flex; flex-direction:column; gap:6px; margin-top:4px; }
.cf-dnstat{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:8px 11px; border:1px solid var(--cal-line); border-radius:10px; font-size:11.5px; color:var(--cal-ink2); }
.cf-dnstat b{ font-family:var(--cal-serif); font-size:17px; font-weight:600; color:var(--cal-ink); }
.cf-kbd{ display:inline-flex; align-items:center; justify-content:center; min-width:18px; height:18px; padding:0 5px; border-radius:5px; border:1px solid var(--cal-line); background:rgba(0,0,0,.25); font-size:10px; font-weight:700; color:var(--cal-ink2); font-family:ui-monospace,monospace; }

/* ---- modal de ajustes ---- */
.cf-scrim{ position:fixed; inset:0; background:rgba(0,0,0,.62); backdrop-filter:blur(3px); display:flex; align-items:center; justify-content:center; z-index:61; padding:26px; }
.cf-modal{ width:600px; max-width:100%; max-height:88vh; overflow-y:auto; background:var(--cal-panel); border:1px solid var(--cal-line); border-radius:19px; box-shadow:0 40px 100px -30px rgba(0,0,0,.8); }
.cf-mhd{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; padding:22px 24px 16px; border-bottom:1px solid var(--cal-line2); position:sticky; top:0; background:var(--cal-panel); z-index:2; }
.cf-mhd h3{ font-family:var(--cal-serif); font-size:25px; font-weight:600; margin:5px 0 0; }
.cf-mbody{ padding:20px 24px 24px; }
.cf-sgroup{ padding-bottom:18px; margin-bottom:18px; border-bottom:1px solid var(--cal-line2); }
.cf-sgroup:last-child{ border-bottom:none; margin-bottom:0; padding-bottom:0; }
.cf-sgl{ font-size:9.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--cal-accent); font-weight:600; margin-bottom:14px; }
.cf-srow{ display:flex; align-items:center; justify-content:space-between; gap:16px; padding:9px 0; }
.cf-sinfo{ min-width:0; }
.cf-sinfo b{ font-size:13px; font-weight:600; display:block; }
.cf-sinfo span{ font-size:11px; color:var(--cal-ink3); line-height:1.45; display:block; margin-top:2px; }
.cf-sctl{ flex:none; }
.cf-seg2{ display:inline-flex; background:rgba(0,0,0,.25); border:1px solid var(--cal-line); border-radius:9px; padding:3px; gap:2px; }
.cf-seg2 button{ padding:6px 11px; border-radius:7px; font-size:11.5px; font-weight:600; color:var(--cal-ink3); transition:.12s; white-space:nowrap; }
.cf-seg2 button.on{ background:var(--cal-accent); color:#fff; }
.cf-stepper{ display:inline-flex; align-items:center; gap:2px; background:rgba(0,0,0,.25); border:1px solid var(--cal-line); border-radius:9px; padding:3px; }
.cf-stepper button{ width:27px; height:26px; border-radius:6px; display:flex; align-items:center; justify-content:center; color:var(--cal-ink2); font-size:14px; font-weight:600; }
.cf-stepper button:hover{ background:rgba(255,255,255,.08); color:var(--cal-ink); }
.cf-sv{ min-width:54px; text-align:center; font-size:12px; font-weight:600; font-variant-numeric:tabular-nums; }
.cf-calcfg{ display:flex; align-items:center; gap:11px; padding:10px 12px; border:1px solid var(--cal-line); border-radius:11px; margin-bottom:8px; }
.cf-swatches{ display:flex; gap:5px; }
.cf-csw{ width:19px; height:19px; border-radius:100px; border:2px solid transparent; transition:.12s; }
.cf-csw.on{ border-color:var(--cal-ink); }
.cf-cname2{ flex:1; min-width:0; font-size:12.5px; font-weight:600; }
.cf-mono{ font-family:ui-monospace,'SF Mono',Menlo,monospace; font-size:11.5px; color:var(--cal-ink2); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cf-urlrow{ display:flex; align-items:center; gap:10px; padding:11px 13px; border:1px solid var(--cal-line); border-radius:11px; background:rgba(0,0,0,.22); }
.cf-copyb{ padding:6px 11px; border-radius:8px; border:1px solid var(--cal-line); font-size:11px; font-weight:600; color:var(--cal-ink2); flex:none; }
.cf-copyb:hover{ border-color:var(--cal-accent); color:var(--cal-accent); }
.cf-klist{ display:grid; grid-template-columns:1fr 1fr; gap:7px 18px; }
.cf-krow{ display:flex; align-items:center; justify-content:space-between; gap:10px; font-size:12px; color:var(--cal-ink2); padding:3px 0; }
.cf-loading{ display:flex; align-items:center; justify-content:center; height:100%; color:var(--cal-ink3); font-size:13px; }

/* @container y no @media: el ancho real del calendario es el de #view, que ahora
   comparte la ventana con el chat de Xarpie (clamp(380px,40%,560px), ajustable arrastrando
   #cp-resize) -- el ancho de LA VENTANA ya no predice el espacio que le queda al calendario. */
@container (max-width:1320px){ .cf-rail{ display:none; } }
@container (max-width:1120px){
  .cf-dayview{ grid-template-columns:1fr; }
  .cf-daylist{ display:none; }
  .cf-body{ position:relative; }
  .cf-detail{ position:absolute; right:0; bottom:0; top:auto; width:min(340px,100%); max-height:78%; z-index:30; box-shadow:0 24px 60px -18px rgba(0,0,0,.8); }
  .cf-detail:not(.hasSel){ display:none; }
}

/* ============================================================================
   REDISEÑO "PANEL DEL ESTUDIO" (Claude Design) — PARTE 1: CARCASA
   Refina el shell (riel de Xarpie + navegación + tipografía) a la paleta Claude
   oscura y a Cormorant Garamond / Instrument Sans. Todo por tokens, así que
   respeta el toggle claro/oscuro. Los CUERPOS de cada sección se rediseñan en
   la Parte 2 (tiles/hero/KPIs/tablas); acá sólo la carcasa.

   Los tokens que esta parte redefinía (tipografía y paleta oscura) se subieron a su
   declaración única del principio del archivo: se veían igual, pero había que leer dos
   sitios lejanos para saber de qué color y con qué letra era la app.
   ============================================================================ */
:root[data-theme="dark"] #app.show{ background:radial-gradient(120% 80% at 0% 0%, #2d2c29, var(--bone) 60%); }

/* ---- Riel de Xarpie (permanente, más ancho, sobre el degradado) ---- */
.chatpane{ flex:0 0 clamp(380px,40%,560px); background:transparent; padding:30px 34px 26px; }
.cp-brand{ align-items:flex-start; gap:15px; border-bottom:none; padding-bottom:0; }
.cp-menu{ width:40px; height:40px; border-radius:11px; border:1px solid var(--line2); font-size:16px; }

.greet{ margin-top:30px; padding-bottom:0; border-bottom:none; }
.greetkicker{ font-family:var(--sans); text-transform:uppercase; letter-spacing:.2em; font-size:10px; font-weight:600; color:var(--muted); }
.greetname{ font-family:var(--serif); font-size:40px; font-weight:600; letter-spacing:-.01em; line-height:1.02; margin-top:8px; }

.chatscroll{ margin-top:22px; gap:16px; }
/* Xarpie responde en texto plano con avatar (como Claude); tú, en burbuja. */
.ava{ width:30px; height:30px; flex:0 0 30px; background:#2b241d; border:1px solid var(--line2); }
.ava:after{ width:11px; height:11px; left:7px; top:7px; background:var(--accent); }
.bub{ font-size:14px; line-height:1.64; border-radius:18px; }
.bub-ai{ background:transparent; border:none; padding:3px 2px 0 0; }
.bub-me{ background:var(--paper); border:1px solid var(--line2); border-top-right-radius:6px; }

.chips{ gap:8px; margin:16px 0 12px; }
.chip{ background:transparent; border:1px solid var(--line2); border-radius:100px; padding:9px 15px; font-size:12.5px; }
.chip:hover{ border-color:var(--accent); background:transparent; color:var(--ink); }

.composer{ border-radius:22px; padding:9px 10px 10px; }
.xarpiemode{ gap:6px; }
.tm-btn{ border-radius:100px; }

/* ---- Navegación: topnav de píldoras (subrayado activo) + subnav ---- */
.topbar{ padding:20px 40px 20px; gap:6px; background:var(--bone); backdrop-filter:none; }
.navbar .topbar{ position:static; }
.tab{ padding:8px 16px; border-radius:100px; font-size:14px; }
.tab:hover{ background:transparent; color:var(--ink); }
.tab.on:after{ left:50%; right:auto; transform:translateX(-50%); width:20px; bottom:-19px; }
.subbar{ padding:11px 40px; gap:4px; background:var(--bone); backdrop-filter:none; }
.subtab{ padding:7px 15px; border-radius:100px; font-size:13px; }

/* ---- Contenido: ancho completo con aire (como el diseño), título serif grande ---- */
.wrap{ max-width:none; padding:34px 40px 70px; margin:0; }
.phead{ margin-bottom:30px; }
.ptitle{ font-size:44px; }
.peyebrow{ font-family:var(--sans); font-weight:600; letter-spacing:.14em; }

@media (max-width:900px){
  .chatpane{ flex-basis:auto; }
  .topbar,.subbar,.wrap{ padding-left:20px; padding-right:20px; }
}

/* ============================================================================
   REDISEÑO "PANEL DEL ESTUDIO" (Claude Design) — PARTE 2: CUERPOS DE SECCIÓN
   Refina el vocabulario de componentes COMPARTIDO que usan las 8 secciones
   (KPIs, tarjetas, botones, pills, chips, segmentos, buscador). Como cada
   cuerpo se arma con estos mismos bloques, esto rediseña todas las secciones a
   la vez, sin reescribir la lógica de cada vista. Todo por tokens → respeta el
   toggle claro/oscuro.
   ============================================================================ */

/* --- Tile de KPI: el punto de la esquina pasa a ser BORDE SUPERIOR de color
       (= estado), que es la firma del handoff. Toca Panel, Bodas, Dinero,
       fichas de cliente y todo kpiCard() de una sola vez. --- */
.stat{ padding:17px 18px 15px; border-radius:14px; }
.statbar{ left:0; right:0; top:0; width:auto; height:3px; border-radius:14px 14px 0 0; box-shadow:none; }
.statlabel{ letter-spacing:.14em; }
.statnum{ font-size:31px; margin-top:9px; }

/* --- Tarjetas y paneles: radio más suave, dentro del rango 14–20px del handoff. --- */
.card,.pblock,.widget,.settcard,.acc-card{ border-radius:16px; }
.wadd-item,.paybox{ border-radius:14px; }

/* --- Todo lo "botón / chip / control" es cápsula (border-radius:100px),
       otra firma del handoff. --- */
.btn,.btn-sm,.btn-wa{ border-radius:100px; }
.fchip{ border-radius:100px; }
.search{ border-radius:100px; padding-left:18px; padding-right:18px; }
.seg,.seg-btn{ border-radius:100px; }
.ing-seg{ border-radius:100px; }
.x{ border-radius:100px; }

/* --- El buscador y los inputs de filtro heredan la cápsula sin perder foco. --- */
.search:focus-within{ border-color:var(--accent); }

/* ============================================================================
   "EL FOCO" — hero fijo arriba del Panel del dia. Ranking priorizado (tareas,
   leads, entregas, oportunidades, bandeja, cobros) de un motor de reglas
   determinista (sin IA). No es parte de la grilla de widgets reordenable.
   ============================================================================ */
.foco-hero{ background:var(--paper); border:1px solid var(--hair); border-radius:18px; padding:22px 24px 6px; margin-bottom:26px; box-shadow:0 1px 3px rgba(41,40,36,.04); }
.foco-head{ margin-bottom:12px; }
.foco-eyebrow{ display:block; font-family:var(--sans); font-weight:600; font-size:10.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--accent); margin-bottom:4px; }
.foco-title{ font-family:var(--serif); font-weight:500; font-size:24px; letter-spacing:-.01em; }
.foco-list{ display:flex; flex-direction:column; }
.foco-item{ display:flex; align-items:center; gap:14px; padding:14px 0; border-bottom:1px solid var(--hair); }
.foco-item:last-child{ border-bottom:0; }
.foco-ico{ flex:0 0 34px; width:34px; height:34px; display:grid; place-items:center; border-radius:50%; background:var(--bone); font-size:15px; color:var(--accent); }
.foco-body{ flex:1; min-width:0; }
.foco-titulo{ font-weight:600; font-size:14.5px; line-height:1.3; }
.foco-porque{ font-size:12.5px; color:var(--muted); margin-top:3px; line-height:1.4; }
/* Fila de perfil (una pregunta de Xarpie): las opciones van DEBAJO del texto y no en la
   columna de acciones, donde cabe un boton pero no cuatro. La fila se alinea arriba
   porque con los chips deja de ser de una sola linea. */
.foco-item:has(.foco-ops){ align-items:flex-start; }
.foco-item:has(.foco-ops) .foco-ico{ margin-top:2px; }
.foco-ops{ display:flex; flex-wrap:wrap; gap:7px; margin-top:10px; }
.foco-op{ font-size:12.5px; font-weight:500; padding:7px 13px; border:1px solid var(--line2); border-radius:100px; background:transparent; color:var(--ink); cursor:pointer; transition:.14s; }
.foco-op:hover:not(:disabled){ border-color:var(--accent); color:var(--accent); }
.foco-op:disabled{ opacity:.5; cursor:default; }
.foco-op.on{ background:var(--accent); border-color:var(--accent); color:#fff; opacity:1; }
.foco-ico-perfil{ color:var(--blue); }
.foco-monto{ flex:0 0 auto; font-family:var(--serif); font-weight:600; font-size:17px; font-variant-numeric:tabular-nums; }
.foco-btn{ flex:0 0 auto; font-size:12.5px; padding:8px 16px; border-radius:100px; border:1px solid var(--line2); background:var(--paper); color:var(--ink); cursor:pointer; transition:.14s; white-space:nowrap; text-decoration:none; display:inline-flex; align-items:center; }
.foco-btn:hover{ border-color:var(--accent); background:var(--deep); }
.foco-btn:disabled{ opacity:.55; cursor:default; }
.foco-btn-resolver{ border-color:color-mix(in srgb, var(--ok) 55%, var(--line2)); color:var(--ok); }
.foco-btn-resolver:hover{ border-color:var(--ok); background:color-mix(in srgb, var(--ok) 12%, var(--paper)); }
.foco-acciones{ flex:0 0 auto; display:flex; align-items:center; gap:7px; }
.foco-ayuda{ flex:0 0 auto; width:30px; height:30px; display:grid; place-items:center; border-radius:100px; border:1px solid var(--line2); background:transparent; color:var(--muted); cursor:pointer; transition:.14s; }
.foco-ayuda:hover{ border-color:var(--accent); color:var(--accent); background:var(--deep); }
/* Menu de "mas acciones": reusa por completo .usermenu/.um-item/.um-danger
   (mismo fondo/borde/sombra/animacion/foco de teclado que el menu de usuario) --
   solo se ajusta la posicion para colgar del boton circular en vez del avatar. */
.foco-menu-wrap{ position:relative; flex:0 0 auto; }
.foco-menu{ top:36px; right:0; width:190px; }

@media (max-width:640px){
  .foco-item{ flex-wrap:wrap; }
  .foco-acciones{ margin-left:48px; }
}

/* Selector de cliente con busqueda en vivo + alta rapida (Generar contrato / Generar recibo) */
.cp-drop{ position:absolute; top:100%; left:0; right:0; margin-top:6px; z-index:40; background:var(--paper); border:1px solid var(--line2); border-radius:12px; box-shadow:0 18px 44px -20px rgba(43,40,36,.5); padding:6px; max-height:280px; overflow-y:auto; animation:pop .16s ease both; }
.cp-drop[hidden]{ display:none; }
.cp-opt{ display:block; padding:9px 12px; border-radius:8px; cursor:pointer; }
.cp-opt:hover{ background:#ECE7DB; }
.cp-opt-nuevo{ color:var(--accent); font-weight:600; border-bottom:1px solid var(--hair); margin-bottom:4px; padding-bottom:10px; }
.cp-opt-sub{ font-size:11.5px; color:var(--muted); margin-top:1px; }
:root[data-theme="dark"] .cp-opt:hover{ background:#33322D; }

/* ---- Mini calendario del panel (widget) ----
   Rejilla compacta: cada dia se representa con puntos de color (mismos colores que la
   Agenda via calColor), no con chips, para que quepa en el ancho de un widget. Tres
   tamanos: mini (solo rejilla), mediano (rejilla + lista) y grande (2 columnas). */
.mc-head{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:10px; }
.mc-nav{ display:flex; gap:4px; flex:0 0 auto; }
.mc-title{ font-weight:600; font-size:13px; text-transform:capitalize; text-align:right; }

.mc-wrap.grande{ display:grid; grid-template-columns:minmax(240px,340px) 1fr; gap:18px; align-items:start; }

.mc-dow{ display:grid; grid-template-columns:repeat(7,1fr); gap:2px; margin-bottom:4px; }
.mc-dow span{ text-align:center; font-size:10px; font-weight:600; letter-spacing:.06em; color:var(--muted); }
.mc-grid{ display:grid; grid-template-columns:repeat(7,1fr); gap:2px; }
.mc-strip{ display:grid; grid-template-columns:repeat(7,1fr); gap:3px; }

.mc-day{ position:relative; min-height:34px; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
  border:1px solid transparent; background:transparent; border-radius:7px; cursor:pointer; padding:3px 2px; transition:.12s; }
.mc-strip .mc-day{ min-height:48px; }
.mc-day:hover{ background:var(--hair); }
.mc-day:focus-visible{ outline:2px solid var(--accent); outline-offset:1px; }
.mc-day .mc-dw{ font-size:9px; font-weight:600; letter-spacing:.05em; color:var(--muted); line-height:1; }
.mc-day .mc-n{ font-size:11.5px; font-variant-numeric:tabular-nums; color:var(--ink); line-height:1; }
.mc-day.out .mc-n{ opacity:.3; }
.mc-day.hoy{ border-color:var(--accent); }
.mc-day.hoy .mc-n{ font-weight:700; color:var(--accent); }
.mc-day.mc-sel{ background:var(--accent); border-color:var(--accent); }
.mc-day.mc-sel .mc-n,.mc-day.mc-sel .mc-dw{ color:#fff; opacity:1; }
.mc-day.bloq{ background-image:repeating-linear-gradient(45deg, transparent, transparent 3px, var(--hair) 3px, var(--hair) 6px); }
.mc-dots{ display:flex; gap:2px; height:5px; align-items:center; justify-content:center; }
.mc-dots i{ width:4px; height:4px; border-radius:50%; display:block; }
.mc-day.mc-sel .mc-dots i{ box-shadow:0 0 0 1px rgba(255,255,255,.6); }

.mc-listwrap{ margin-top:12px; }
.mc-wrap.grande .mc-listwrap{ margin-top:0; }
.mc-listhead{ display:flex; align-items:center; justify-content:space-between; gap:8px;
  font-size:11px; font-weight:600; letter-spacing:.05em; text-transform:uppercase; color:var(--muted);
  padding-bottom:6px; border-bottom:1px solid var(--hair); margin-bottom:2px; }
.mc-clear{ border:0; background:transparent; color:var(--muted); cursor:pointer; font-size:12px; line-height:1; padding:2px 5px; border-radius:5px; }
.mc-clear:hover{ background:var(--hair); color:var(--ink); }
/* Scroll dentro de la lista: el widget NO crece, la lista se desplaza. */
.mc-list{ overflow-y:auto; overscroll-behavior:contain; }
.mc-list.mediano{ max-height:158px; }
.mc-list.grande{ max-height:300px; }
.mc-item{ padding:6px 2px; }

.mc-foot{ display:flex; align-items:center; gap:8px; margin-top:12px; }
.mc-foot .mc-segs{ flex:1; margin-top:0; }
.mc-tams{ display:flex; gap:2px; flex:0 0 auto; }
.mc-tam{ border:1px solid var(--line2); background:transparent; color:var(--muted); cursor:pointer;
  width:26px; height:26px; border-radius:7px; font-size:11px; line-height:1; transition:.13s; }
.mc-tam:hover{ color:var(--ink); }
.mc-tam.on{ color:var(--accent); border-color:var(--accent); }
@media (max-width:760px){ .mc-wrap.grande{ grid-template-columns:1fr; gap:12px; } }

/* ==================================================================
   BASES DE DATOS DEL USUARIO (bases.js)
   ================================================================== */
.db-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 14px; }
.db-card { display: flex; gap: 12px; align-items: center; text-align: left; padding: 16px; border: 1px solid var(--hair); border-radius: 12px; background: var(--paper); cursor: pointer; transition: border-color .15s ease, transform .15s ease; }
.db-card:hover { border-color: var(--accent); transform: translateY(-1px); }
.db-card-ico { font-size: 22px; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--accent) 8%, var(--paper)); border-radius: 10px; flex: none; }
.db-card-t { font-weight: 600; }

.db-mini-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 4px 0 10px; }
.db-chips { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.db-chip-union { font-size: 10px; color: var(--muted); text-transform: uppercase; }
.db-vista-body { min-width: 0; }
.db-meta .pill { font-size: 10px; }

.db-tabla-wrap { overflow-x: auto; }
.db-tabla th { white-space: nowrap; }

/* ---- Vista calendario: rejilla de 7 columnas con las filas del mes ---- */
.db-cal-head { font-size:12.5px; color:var(--muted); margin-bottom:8px; text-transform:capitalize; }
.db-cal { display:grid; grid-template-columns:repeat(7,1fr); gap:3px; }
.db-cal-dow { font-size:10.5px; color:var(--muted); text-align:center; padding:3px 0; text-transform:uppercase; letter-spacing:.06em; }
.db-cal-dia { min-height:70px; border:1px solid var(--line2); border-radius:7px; padding:4px; overflow:hidden; }
.db-cal-vacio { border-color:transparent; }
.db-cal-n { font-size:11px; color:var(--muted); margin-bottom:3px; }
.db-cal-item { font-size:11px; background:var(--deep); border-radius:4px; padding:2px 5px; margin-bottom:2px; cursor:pointer; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.db-cal-item:hover { background:var(--accent); color:#fff; }
.db-cal-mas { font-size:10.5px; color:var(--muted); padding-left:4px; }

/* ---- Vista galeria: tarjetas con portada desde una columna de archivos ---- */
.db-gal { display:grid; grid-template-columns:repeat(auto-fill,minmax(160px,1fr)); gap:12px; }
.db-gal-card { border:1px solid var(--line2); border-radius:10px; overflow:hidden; cursor:pointer; background:var(--paper); }
.db-gal-card:hover { border-color:var(--accent); }
.db-gal-img { aspect-ratio:4/3; background:var(--deep); display:flex; align-items:center; justify-content:center; overflow:hidden; }
.db-gal-img img { width:100%; height:100%; object-fit:cover; }
.db-gal-sin { font-size:28px; opacity:.35; }
.db-gal-pie { padding:8px 10px; display:flex; flex-direction:column; gap:2px; font-size:12.5px; }
.db-gal-pie .muted { font-size:11.5px; }

/* ---- Vista linea de tiempo: una barra por fila entre su inicio y su fin ---- */
.db-lt-head { display:flex; font-size:11px; color:var(--muted); margin-bottom:6px; }
.db-lt-fila { display:flex; align-items:center; gap:10px; padding:3px 0; cursor:pointer; }
.db-lt-fila:hover .db-lt-barra { background:var(--accent); }
.db-lt-et { flex:0 0 34%; max-width:34%; font-size:12.5px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.db-lt-pista { position:relative; flex:1; height:16px; background:var(--deep); border-radius:8px; }
.db-lt-barra { position:absolute; top:3px; height:10px; min-width:6px; border-radius:5px; background:var(--line2); }

/* ---- Opciones de presentacion de la tabla (config.tabla de la vista) ---- */
/* Alto de fila: compacta / normal / alta. Aplica al contenido, no al padding del th. */
.db-tabla.db-alto-compacta td { height:30px; padding-top:2px; padding-bottom:2px; }
.db-tabla.db-alto-normal td { height:40px; }
.db-tabla.db-alto-alta td { height:64px; vertical-align:top; padding-top:9px; }
/* Por default una celda no envuelve (una tabla con textos largos se vuelve ilegible);
   con wrap activo el texto fluye en varias lineas. */
.db-tabla td { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:420px; }
.db-tabla.db-wrap td { white-space:normal; overflow:visible; text-overflow:clip; }
/* Columnas congeladas: se quedan fijas al hacer scroll lateral. El fondo es obligatorio
   o el contenido de las columnas de atras se transparenta encima al desplazar. */
.db-tabla .db-sticky { position:sticky; z-index:2; background:var(--paper); }
.db-tabla thead .db-sticky { z-index:3; }
.db-tabla .db-sticky::after { content:""; position:absolute; top:0; right:0; bottom:0; width:1px; background:var(--line2); }
/* Pie con los contadores por columna. */
.db-tabla tfoot .db-pie td { font-size:12px; color:var(--ink); border-top:1px solid var(--line2); white-space:nowrap; }
.db-pie-et { color:var(--muted); font-size:11px; text-transform:uppercase; letter-spacing:.04em; margin-right:5px; }
.db-celda { cursor: pointer; min-width: 90px; }
.db-celda:hover { background: color-mix(in srgb, var(--accent) 6%, transparent); }
.db-celda-titulo { cursor: pointer; }
.db-celda-titulo:hover .tname { color: var(--accent); }
.db-inp-celda { width: 100%; min-width: 90px; }

.db-pop-op { position: fixed; z-index: 260; max-height: 260px; overflow: auto; }
.db-pop-buscar { position: fixed; z-index: 260; width: 320px; padding: 10px; }
.db-buscar-res { max-height: 260px; overflow: auto; margin-top: 8px; }

.db-multi { display: flex; flex-wrap: wrap; gap: 8px 14px; }
.db-multi-op { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }
.db-rel-x { border: 0; background: none; cursor: pointer; color: var(--muted); font-size: 10px; padding: 0 2px; }
.db-rel-x:hover { color: var(--red); }
.db-rel-box { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.db-ro { padding: 8px 0; }

.db-esq-row { display: flex; gap: 8px; align-items: center; margin: 8px 0; flex-wrap: wrap; }
.db-picker-base { padding: 12px 0; border-bottom: 1px solid var(--hair); }
.db-picker-base:last-of-type { border-bottom: 0; }
.db-tablero .kcol { min-width: 190px; }
@media (max-width: 860px) {
  .db-cards { grid-template-columns: 1fr 1fr; }
  .db-pop-buscar { width: calc(100vw - 32px); left: 16px !important; }
}
.db-sys-cols { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px 0; }
.db-sys-cols .pill { font-size: 11px; opacity: .8; }

/* --- Config visual de columnas (iconos por tipo, colores/emojis por opcion) estilo Notion --- */
.db-th-cfg { cursor: pointer; user-select: none; }
.db-th-cfg:hover { color: var(--accent); }
.db-th-ico { opacity: .7; font-size: 11px; margin-right: 1px; }
.db-th-add { cursor: pointer; color: var(--muted); font-weight: 700; text-align: center; width: 32px; }
.db-th-add:hover { color: var(--accent); }
.db-op-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 5px; vertical-align: middle; }
.db-cfg-pop { width: 300px; padding: 12px; z-index: 250; }
.db-cfg-top { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; }
.db-cfg-ico { width: 34px; height: 34px; flex: none; border: 1px solid var(--line2); border-radius: 9px; background: transparent; font-size: 16px; cursor: pointer; color: var(--ink); }
.db-cfg-ico:hover { border-color: var(--accent); }
.db-cfg-f { margin-bottom: 11px; }
.db-cfg-f > label { display: block; font-size: 10.5px; color: var(--muted); margin-bottom: 4px; text-transform: uppercase; letter-spacing: .05em; }
.db-cfg-f select.sel-sm { width: 100%; }
.db-cfg-acts { display: flex; align-items: center; gap: 6px; margin-top: 14px; }
/* Panel "Opciones de tabla" del configurador de vista. */
.db-cv-det { border: 1px solid var(--line2); border-radius: 10px; padding: 10px 12px; margin-top: 4px; }
.db-cv-det > summary { cursor: pointer; font-size: 12px; color: var(--muted); font-weight: 600; }
.db-cv-cols { display: flex; flex-direction: column; gap: 5px; max-height: 240px; overflow-y: auto; margin-top: 6px; }
.db-cv-col { display: flex; align-items: center; gap: 6px; font-size: 12.5px; }
/* Editor de formula: chips de columnas + chuleta de sintaxis. */
.db-form-chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.db-form-chips .pill { cursor: pointer; font-size: 11px; padding: 2px 7px; }
.db-form-chips .pill:hover { border-color: var(--accent); color: var(--accent); }
.db-form-ayuda { margin: 8px 0 0; padding: 7px 8px; background: var(--paper2, rgba(0, 0, 0, .03)); border-radius: 7px; font-size: 10.5px; line-height: 1.55; color: var(--muted); white-space: pre-wrap; font-family: ui-monospace, Menlo, monospace; }
/* Valor calculado (rollup / formula) dentro del panel de fila: se ve, no se edita. */
.db-calc-val { padding: 8px 10px; border: 1px dashed var(--line2); border-radius: 8px; color: var(--muted); }
.db-op-row { display: flex; gap: 6px; align-items: center; margin: 6px 0; }
.db-op-emoji { width: 30px; height: 30px; flex: none; border: 1px solid var(--line2); border-radius: 8px; background: transparent; cursor: pointer; font-size: 14px; color: var(--muted); }
.db-op-emoji:hover { border-color: var(--accent); color: var(--ink); }
.db-op-sw { width: 22px; height: 22px; flex: none; border: 1px solid rgba(0, 0, 0, .18); border-radius: 50%; cursor: pointer; padding: 0; }
.db-op-x { border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 11px; padding: 2px 4px; }
.db-op-x:hover { color: var(--red); }
.db-emoji-pop { width: 288px; padding: 10px; z-index: 400; }
.db-emoji-grid { display: grid; grid-template-columns: repeat(8, 1fr); gap: 2px; max-height: 196px; overflow: auto; }
.db-emoji-b { font-size: 18px; border: 0; background: none; cursor: pointer; border-radius: 6px; padding: 4px 0; line-height: 1; }
.db-emoji-b:hover { background: var(--bone); }
.db-emoji-foot { display: flex; gap: 6px; margin-top: 8px; align-items: center; }
.db-color-pop { width: 186px; padding: 12px; z-index: 400; }
.db-sw-row { display: flex; flex-wrap: wrap; gap: 7px; }
.db-sw { width: 24px; height: 24px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; padding: 0; }
.db-sw.on { box-shadow: 0 0 0 2px var(--paper), 0 0 0 4px var(--ink); }
.db-sw-custom { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--muted); margin-top: 12px; cursor: pointer; }
.db-sw-custom input[type=color] { width: 28px; height: 24px; padding: 0; border: 1px solid var(--line2); border-radius: 6px; background: none; cursor: pointer; }

/* --- Fase 2: icono (page icon) por fila + icono/color por base --- */
.db-fila-ico { margin-right: 6px; font-size: .95em; line-height: 1; display: inline-block; }
.db-fila-ico.editable { cursor: pointer; border-radius: 5px; padding: 0 2px; margin-right: 4px; }
.db-fila-ico.editable:hover { background: var(--bone); }
.db-fila-ico.vacio { color: var(--muted); opacity: 0; transition: opacity .12s; }
tr:hover .db-fila-ico.vacio, .db-fila:hover .db-fila-ico.vacio, .db-ktarj:hover .db-fila-ico.vacio { opacity: .45; }
/* Icono de fila en la cabecera del panel de fila */
.db-fila-ico-btn { width: 44px; height: 44px; flex: none; border: 1px solid var(--line2); border-radius: 11px; background: transparent; font-size: 22px; cursor: pointer; color: var(--ink); display: flex; align-items: center; justify-content: center; }
.db-fila-ico-btn.editable:hover { border-color: var(--accent); }
.db-fila-ico-btn.vacio { color: var(--muted); }
.db-fila-ico-btn[disabled] { cursor: default; opacity: .6; }
/* Icono/color de base en el modal de creacion */
.db-base-ico-btn, .db-base-color-btn { width: 100%; height: 40px; border: 1px solid var(--line2); border-radius: 10px; background: transparent; cursor: pointer; font-size: 18px; color: var(--ink); display: flex; align-items: center; justify-content: center; }
.db-base-ico-btn:hover, .db-base-color-btn:hover { border-color: var(--accent); }
.db-base-color-btn { color: var(--muted); font-size: 14px; }
/* Icono/color de base en el encabezado de la pagina de la base */
.db-base-ico-h { border: 0; background: none; cursor: pointer; font: inherit; padding: 0 2px; color: inherit; border-radius: 8px; }
.db-base-ico-h:hover { background: var(--bone); }
.db-base-color-h { font-size: 14px; }
/* Fase 3: tipo persona (avatar con iniciales) */
.db-persona { display: inline-flex; align-items: center; gap: 6px; }
.db-persona-av { width: 20px; height: 20px; border-radius: 50%; background: color-mix(in srgb, var(--accent) 22%, var(--paper)); color: var(--accent); font-size: 9px; font-weight: 700; letter-spacing: .02em; display: inline-flex; align-items: center; justify-content: center; flex: none; }
/* Fase 3: fecha con rango (dos date inputs) + checkbox de config */
.db-rango-fechas { display: flex; align-items: center; gap: 8px; }
.db-rango-fechas .inp { flex: 1; min-width: 0; }
.db-cfg-check { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--ink); cursor: pointer; }
/* Fase 3: tipo archivos/foto (miniaturas en celda + editor en el panel de fila) */
.db-arch-thumbs { display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.db-arch-thumb { width: 30px; height: 30px; object-fit: cover; border-radius: 5px; border: 1px solid var(--line2); flex: none; }
.db-arch-mas { font-size: 11px; color: var(--muted); }
.db-arch-edit { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.db-arch-cell { position: relative; width: 68px; height: 68px; }
.db-arch-cell img { width: 100%; height: 100%; object-fit: cover; border-radius: 9px; border: 1px solid var(--line2); }
.db-arch-x { position: absolute; top: -6px; right: -6px; width: 20px; height: 20px; border-radius: 50%; border: 0; background: var(--ink); color: var(--paper); font-size: 11px; cursor: pointer; line-height: 1; }
.db-arch-add { border: 1px dashed var(--line2); background: transparent; color: var(--muted); border-radius: 9px; height: 68px; min-width: 68px; padding: 0 12px; cursor: pointer; font-size: 12px; }
.db-arch-add:hover { border-color: var(--accent); color: var(--accent); }
.db-arch-add[disabled] { opacity: .6; cursor: default; }

/* ==================================================================
   DISENADOR DE ALBUM (album-engine.js + vista album-diseno)
   ================================================================== */
.aeng-cell{ box-sizing:border-box; }
.aeng-cell.aeng-empty .aeng-drop{ position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  border:1px dashed var(--hair); color:var(--muted); font-size:12px; background:color-mix(in srgb,var(--accent) 4%,transparent); }
.aeng-cell.aeng-sel{ outline:2px solid var(--accent); outline-offset:-2px; z-index:5; }
.aeng-cell.al-over{ outline:2px solid var(--blue); outline-offset:-2px; }
.aeng-img{ pointer-events:none; }

/* Se ancla a .main (la columna del CRM), NO al viewport. Antes era
   `position:fixed; inset:56px 0 0 0`, que daba por hechas dos cosas falsas: que la barra
   de navegacion mide 56px (mide 74 cuando las pestanas se van a dos renglones, asi que el
   editor se le montaba encima y la recortaba) y que a la izquierda no hay nada (hay 432px
   de chat de Xarpie, que quedaba tapado). Anclado a .main las dos medidas salen solas del
   layout y no hay numero que mantener.
   Para que quede DEBAJO de la nav sin escribir su alto, .main pasa a columna flex y el
   editor va en el hueco que sobra (.main > #view crece). Se probo antes midiendo la nav
   desde JS y publicandola en una variable, pero eso obliga a acertarle a cada momento en
   que la nav cambia de alto (breakpoint, menu personalizable, fuentes que cargan tarde) y
   cualquier aviso que se escape deja al editor tapando la nav otra vez. */
.aled{ position:absolute; inset:0; display:flex; background:var(--bone); z-index:40; }
.main{ display:flex; flex-direction:column; }
/* flex:1 0 auto y no 1 1 auto: crecer para llenar la columna SI, pero encogerse no —
   con shrink activo una pagina larga se comprimiria y se cortaria por dentro en vez de
   dejar scrollear a .main, que es como se ha comportado siempre. */
.main > #view{ flex:1 0 auto; position:relative; }
/* Con el editor montado, #view deja de ser el contenedor de pagina (ancho maximo y
   margenes) y se vuelve el marco del editor: si no, el album quedaria en una caja de
   1180px con franjas a los lados. */
.main > #view:has(.aled), .main > #view:has(.calfull){ max-width:none; padding:0; overflow:visible; }
/* Mientras el editor esta montado la columna no scrollea: es de alto completo y lo unico
   que quedaria por debajo es el padding vacio de .wrap. */
.main:has(.aled), .main:has(.calfull){ overflow:hidden; }
.al-railtoggle{ display:none; }
.al-railbg{ display:none; }
@media (max-width:900px){
  /* En telefono si se come la nav: la pantalla no alcanza para las dos cosas. */
  .aled{ inset:0; }
  /* El rail pasa a drawer lateral (el apilado en columna dejaba el canvas fuera de pantalla). */
  .al-rail{ position:fixed; left:0; top:0; bottom:0; z-index:60; transform:translateX(-100%); transition:transform .22s ease; box-shadow:12px 0 34px -18px rgba(0,0,0,.4); width:min(88vw,360px); }
  .al-rail.open{ transform:translateX(0); }
  .al-railtoggle{ display:inline-block; }
  .al-railbg.show{ display:block; position:fixed; inset:0; z-index:55; background:rgba(43,41,38,.42); }
  .al-spreadbar{ gap:10px; }
  .al-cellbar.on{ flex-wrap:wrap; padding:8px 12px; gap:8px; }
}
.al-rail{ width:360px; flex:none; border-right:1px solid var(--hair); background:var(--paper); display:flex; flex-direction:column; }
.al-railtop{ padding:16px 18px 12px; border-bottom:1px solid var(--hair); }
.al-crumb{ border:0; background:none; color:var(--muted); font-size:13px; cursor:pointer; padding:0; display:flex; align-items:center; gap:4px; }
.al-crumb:hover{ color:var(--ink); }
.al-bk{ font-size:18px; }
.al-title{ width:100%; border:0; background:none; font-family:var(--serif,Newsreader,Georgia,serif); font-size:22px; color:var(--ink); margin:8px 0 4px; padding:2px 0; }
.al-title:focus{ outline:0; border-bottom:1px solid var(--accent); }
.al-statusrow{ display:flex; gap:8px; }
.al-pill{ font-size:12px; color:var(--muted); }
.al-save{ font-size:12px; color:var(--sage,#6E7F63); margin-top:6px; min-height:16px; }
.al-railscroll{ flex:1; overflow-y:auto; padding:6px 18px 40px; }
.al-sec{ padding:16px 0; border-bottom:1px solid var(--hair); }
.al-sec:last-child{ border-bottom:0; }
.al-sechd{ display:flex; align-items:center; gap:9px; margin-bottom:12px; }
.al-ix{ width:20px; height:20px; border-radius:50%; background:var(--bone); border:1px solid var(--hair); color:var(--muted); font-size:11px; display:flex; align-items:center; justify-content:center; }
.al-n{ font-family:var(--serif,Newsreader,Georgia,serif); font-size:15px; }
.al-hint{ font-size:12px; color:var(--muted); margin-top:8px; }
/* El layout de .al-pool (carrusel de una fila) vive mas abajo, junto a .al-poolzone: es
   el unico lugar donde esta franja se dibuja. Aqui solo queda el aspecto de CADA foto. */
.al-poto{ position:relative; aspect-ratio:1; border-radius:6px; overflow:hidden; cursor:grab; border:1px solid var(--hair); }
.al-poto img{ width:100%; height:100%; object-fit:cover; display:block; }
.al-poto.usada{ opacity:.5; }
/* Poolbar Fundy: acciones, filtro, orden, vista. */
.al-poolactions{ display:flex; gap:6px; margin-bottom:8px; flex-wrap:wrap; }
/* Progreso de la subida dentro del rail: reusa .gal-prog-* de la galeria, para que subir
   fotos se vea igual en los dos lados. */
.al-addprog{ margin:0 0 10px; }
.al-tb-sm{ font-size:12px; padding:4px 9px; }
/* "Armar con Xarpie" es la accion principal del rail: da el mejor resultado (mira las fotos)
   y por eso se distingue del auto-diseño determinista, que queda como la alternativa rapida. */
.al-tb-xarpie{ background:var(--accent); border-color:var(--accent); color:#fff; }
.al-tb-xarpie:hover:not(:disabled){ filter:brightness(1.08); }
.al-poolbar{ display:flex; gap:6px; align-items:center; margin-bottom:8px; }
.al-select-sm{ padding:5px 8px; font-size:12px; flex:1; min-width:0; }
.al-ib-sm{ width:26px; height:26px; font-size:13px; flex:none; }
.al-ib-sm.on{ color:var(--accent); border-color:var(--accent); }
.al-fbadge{ display:inline-flex; align-items:center; justify-content:center; min-width:15px; height:15px; margin-left:5px; border-radius:8px; background:var(--accent); color:#fff; font-size:10px; padding:0 3px; }
.al-fbadge[hidden]{ display:none; }
.al-filterpanel{ border:1px solid var(--hair); border-radius:9px; padding:10px; margin-bottom:10px; background:var(--paper); }
.al-frow{ display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.al-fheart{ border:1px solid var(--hair); background:var(--bone); color:var(--muted); border-radius:8px; width:30px; height:26px; cursor:pointer; font-size:14px; }
.al-fheart.on{ color:#fff; background:var(--accent); border-color:var(--accent); }
.al-fstars{ display:flex; gap:2px; }
.al-fstar{ border:0; background:none; color:var(--line2); font-size:18px; cursor:pointer; padding:0 2px; }
.al-fstar.on{ color:var(--yellow); }
/* Estrellas y corazon sobre el thumbnail (hover). */
.al-poto-meta{ position:absolute; left:0; right:0; bottom:0; display:none; align-items:center; justify-content:space-between; gap:4px; padding:3px 5px; background:linear-gradient(transparent, rgba(21,19,16,.75)); }
.al-poto:hover .al-poto-meta{ display:flex; }
.al-pheart{ border:0; background:none; color:rgba(255,255,255,.55); font-size:13px; cursor:pointer; padding:0; }
.al-pheart.on{ color:var(--accent); }
.al-pstars{ display:flex; }
.al-pstar{ border:0; background:none; color:rgba(255,255,255,.45); font-size:12px; cursor:pointer; padding:0 1px; }
.al-pstar.on{ color:var(--yellow); }
/* Spreadbar: configuracion del spread actual bajo la toolbar. */
.al-spreadbar{ display:flex; align-items:center; gap:14px; padding:9px 20px; border-bottom:1px solid var(--hair); background:var(--paper); flex-wrap:wrap; }
.al-spreadbar[hidden]{ display:none; }
.al-sblbl{ font-size:12px; color:var(--muted); }
.al-sw-sm{ width:20px; height:20px; }
.al-swcustom{ width:24px; height:24px; padding:0; border:1px solid var(--hair); border-radius:50%; background:none; cursor:pointer; }
.al-swcustom::-webkit-color-swatch-wrapper{ padding:2px; }
.al-swcustom::-webkit-color-swatch{ border:0; border-radius:50%; }
.al-sldr{ display:flex; align-items:center; gap:7px; font-size:12px; color:var(--muted); }
.al-sldr input[type=range]{ width:90px; accent-color:var(--accent); }
.al-txtedit{ z-index:9; border:2px solid var(--accent); border-radius:2px; background:rgba(252,251,247,.92); padding:1%; resize:none; outline:none; white-space:pre-wrap; box-sizing:border-box; }
/* Edicion libre de celda: overlay con handles de resize + pill de mover (en el host, no
   recortado por el overflow de la celda). */
.aeng-editov{ outline:2px solid var(--accent); outline-offset:-1px; }
.aeng-handle{ position:absolute; width:12px; height:12px; background:#fff; border:2px solid var(--accent); border-radius:2px; transform:translate(-50%,-50%); z-index:8; }
.aeng-h-nw,.aeng-h-se{ cursor:nwse-resize; }
.aeng-h-ne,.aeng-h-sw{ cursor:nesw-resize; }
.aeng-h-n,.aeng-h-s{ cursor:ns-resize; }
.aeng-h-e,.aeng-h-w{ cursor:ew-resize; }
.aeng-move{ position:absolute; left:50%; top:0; transform:translate(-50%,-150%); background:var(--accent); color:#fff; border-radius:12px; padding:3px 10px; font-size:12px; cursor:move; z-index:9; white-space:nowrap; box-shadow:0 2px 8px rgba(43,41,38,.3); user-select:none; }
/* Guia de imantado: aparece solo mientras se arrastra y solo cuando engancho. Es una
   linea de 1px sin sombra a proposito -- tiene que leerse como una regla de alineacion,
   no como parte del diseno del album. */
.aeng-guiaiman{ position:absolute; background:var(--accent); opacity:.85; pointer-events:none; z-index:10; }
/* Popover de configuracion de guias. */
.al-guias-pop{ position:absolute; top:calc(100% + 6px); right:0; z-index:60; width:250px; background:var(--paper); border:1px solid var(--hair); border-radius:12px; box-shadow:0 14px 40px rgba(43,41,38,.22); padding:12px 14px; }
.al-gph{ font-family:var(--serif,Newsreader,Georgia,serif); font-size:15px; margin-bottom:10px; }
.al-grow{ display:flex; align-items:center; gap:7px; font-size:13px; padding:5px 0; color:var(--ink); }
.al-grow input[type=checkbox]{ flex:none; }
.al-gnum{ width:52px; margin-left:auto; padding:3px 6px; border:1px solid var(--hair); border-radius:6px; background:var(--bone); font-size:13px; text-align:right; }
.al-gph2{ font-size:11px; color:var(--muted); margin-top:8px; line-height:1.4; }
.al-fitseg{ display:inline-flex; gap:4px; }
.al-locked{ position:absolute; inset:0; z-index:8; display:flex; align-items:flex-start; justify-content:flex-end; padding:10px; background:rgba(43,41,38,.06); pointer-events:auto; cursor:not-allowed; }
.al-locked span{ font-size:12px; background:rgba(43,41,38,.75); color:#fff; padding:4px 10px; border-radius:14px; }
.al-lockbadge{ position:absolute; top:4px; right:6px; font-size:11px; }
/* Seccion Album del rail: resumen con mini portada. */
.al-rescover{ aspect-ratio:16/10; border-radius:8px; display:flex; align-items:center; justify-content:center; padding:14px; text-align:center; }
.al-rescover span{ font-family:var(--serif,Newsreader,Georgia,serif); font-size:14px; line-height:1.3; }
/* Wizard "Opciones del album" (3 pasos). */
.al-wsteps{ display:flex; gap:14px; margin-bottom:16px; flex-wrap:wrap; }
.al-wstep{ display:flex; align-items:center; gap:7px; font-size:13px; color:var(--muted); }
.al-wstep i{ font-style:normal; width:22px; height:22px; border-radius:50%; border:1px solid var(--hair); display:flex; align-items:center; justify-content:center; font-size:11px; background:var(--bone); }
.al-wstep.on{ color:var(--ink); font-weight:600; }
.al-wstep.on i{ background:var(--accent); border-color:var(--accent); color:#fff; }
.al-wstep.done i{ background:var(--blue); border-color:var(--blue); color:#fff; }
.alw-presets{ display:grid; grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); gap:8px; }
.alw-preset{ text-align:left; border:1px solid var(--hair); border-radius:10px; background:var(--paper); padding:11px 13px; cursor:pointer; display:flex; flex-direction:column; gap:3px; }
.alw-preset b{ font-size:13.5px; font-weight:600; }
.alw-preset span{ font-size:11.5px; color:var(--muted); }
.alw-preset.on{ border-color:var(--accent); box-shadow:0 0 0 1px var(--accent); }
.alw-cpool{ display:flex; gap:6px; flex-wrap:wrap; max-height:120px; overflow-y:auto; }
.alw-cfoto{ width:46px; height:46px; border-radius:6px; overflow:hidden; border:2px solid transparent; padding:0; background:var(--bone); cursor:pointer; font-size:9px; color:var(--muted); }
.alw-cfoto img{ width:100%; height:100%; object-fit:cover; display:block; }
.alw-cfoto.on{ border-color:var(--accent); }
.alw-cover-preview{ flex:0 0 190px; }
.alw-cpv{ width:190px; aspect-ratio:1; border-radius:6px; display:flex; align-items:center; justify-content:center; padding:14px; text-align:center; position:relative; overflow:hidden; box-shadow:0 6px 22px rgba(43,41,38,.18); }
.alw-cpv img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; opacity:.85; }
.alw-cpv span{ position:relative; font-family:var(--serif,Newsreader,Georgia,serif); font-size:15px; line-height:1.3; text-shadow:0 1px 8px rgba(0,0,0,.25); }
.alw-rev .payline{ display:flex; justify-content:space-between; padding:7px 0; border-bottom:1px solid var(--hair); font-size:13.5px; }
.al-poto .al-badge{ position:absolute; top:3px; right:3px; background:var(--blue); color:#fff; font-size:10px; width:15px; height:15px; border-radius:50%; display:flex; align-items:center; justify-content:center; }
.al-segs{ display:flex; gap:6px; flex-wrap:wrap; margin-bottom:10px; }
.al-seg{ font-size:12px; padding:3px 10px; border-radius:20px; border:1px solid var(--hair); background:var(--bone); color:var(--muted); cursor:pointer; }
.al-seg.on{ color:var(--accent); border-color:var(--accent); }
.al-tpls{ display:grid; grid-template-columns:repeat(4,1fr); gap:7px; }
.al-tpl{ aspect-ratio:2/1; border:1px solid var(--hair); border-radius:5px; background:var(--bone); cursor:pointer; padding:3px; position:relative; }
.al-tpl.on{ border-color:var(--accent); box-shadow:0 0 0 1px var(--accent); }
.al-tplprev{ position:absolute; inset:3px; }
.al-tplprev i{ position:absolute; background:color-mix(in srgb,var(--sage) 45%,var(--paper)); border-radius:1px; }
.al-select,.al-txt{ width:100%; padding:9px 11px; border:1px solid var(--hair); border-radius:8px; background:var(--paper); color:var(--ink); font-size:13.5px; }
.al-swrow{ display:flex; gap:8px; margin-top:8px; }
.al-sw{ width:26px; height:26px; border-radius:50%; border:2px solid var(--hair); cursor:pointer; }
.al-sw.on{ border-color:var(--accent); box-shadow:0 0 0 2px var(--paper),0 0 0 3px var(--accent); }

.al-main{ flex:1; display:flex; flex-direction:column; min-width:0; }
.al-canvastop{ display:flex; align-items:center; justify-content:space-between; gap:16px; padding:10px 20px; border-bottom:1px solid var(--hair); flex-wrap:wrap; }
.al-ctleft{ display:flex; align-items:center; gap:14px; min-width:0; }
.al-navspread{ display:flex; align-items:center; gap:6px; font-size:14px; }
#al-spreadn{ min-width:88px; text-align:center; color:var(--muted); font-size:13px; white-space:nowrap; }
.al-undogrp{ display:flex; gap:4px; padding-left:14px; border-left:1px solid var(--hair); }
.al-ib:disabled{ opacity:.32; cursor:default; }
.al-ib:disabled:hover{ border-color:var(--hair); color:inherit; }
/* Botones agrupados (Guías + config) y CTA primaria. Se cualifican con .al-toolbar para
   ganarle a .al-tb (declarado despues en el archivo). */
.al-guiaswrap{ display:inline-flex; position:relative; }
.al-toolbar .al-tb-split{ border-top-right-radius:0; border-bottom-right-radius:0; }
.al-toolbar .al-tb-caret{ border-top-left-radius:0; border-bottom-left-radius:0; border-left:0; padding:6px 8px; font-size:10px; }
.al-toolbar .al-tb-p{ background:var(--accent); border-color:var(--accent); color:#fff; }
.al-toolbar .al-tb-p:hover{ border-color:var(--accent); filter:brightness(1.05); }
.al-ib{ width:30px; height:30px; border-radius:8px; border:1px solid var(--hair); background:var(--paper); cursor:pointer; font-size:16px; color:var(--ink); }
.al-ib:hover{ border-color:var(--accent); }
.al-toolbar{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
/* Sin esto el grupo de proporcion se comprime hasta dejar el select en "1∨" y parte
   "Enviar al cliente" en dos renglones: un control que no deja leer su propio valor no
   sirve de nada. No encoge, y si no cabe la barra baja de renglon. */
.al-toolbar .al-prop{ flex:none; gap:6px; }
.al-toolbar .al-prop .al-select{ width:auto; min-width:74px; }
.al-toolbar .al-tb{ white-space:nowrap; }
.al-tb{ font-size:13px; padding:6px 12px; border-radius:8px; border:1px solid var(--hair); background:var(--paper); color:var(--ink); cursor:pointer; }
.al-tb.on{ color:var(--accent); border-color:var(--accent); }
.al-tb:hover{ border-color:var(--accent); }
.al-stage{ flex:1; display:flex; align-items:center; justify-content:center; padding:20px; overflow:hidden; background:color-mix(in srgb,var(--ink) 4%,var(--bone)); }
.al-spread{ box-shadow:0 10px 40px rgba(43,41,38,.18); }
.al-cellbar{ min-height:0; display:none; align-items:center; gap:14px; padding:0 20px; }
.al-cellbar.on{ display:flex; min-height:48px; border-top:1px solid var(--hair); }
.al-zoom{ font-size:13px; color:var(--muted); display:flex; align-items:center; gap:8px; }
/* Mismo peso visual que .al-zoom: son los dos controles con etiqueta de la barra. */
.al-prop{ font-size:13px; color:var(--muted); display:flex; align-items:center; gap:8px; }
.al-strip{ display:flex; gap:10px; align-items:center; padding:14px 20px; border-top:1px solid var(--hair); overflow-x:auto; background:var(--paper); }
/* ---------- Editor de albumes sin rail: fotos abajo, vistas a pantalla completa ---------- */
/* La cabecera pasa de columna (en el rail) a fila: el titulo ya no puede ocupar el 100%. */
.al-ctleft .al-title{ width:auto; max-width:230px; margin:0; font-size:18px; }
.al-ctleft .al-crumb{ white-space:nowrap; max-width:170px; overflow:hidden; text-overflow:ellipsis; display:block; }
.al-ctleft .al-save{ margin-top:0; }
.al-ctleft{ flex-wrap:wrap; gap:10px; }

/* Envuelve stage+cellbar+poolzone. position:relative para que .al-vistasfull (absoluta,
   inset:0) cubra EXACTAMENTE esta zona sin depender del alto de al-canvastop (que
   cambia con el ancho de la ventana: ya nos mordio medirlo a mano una vez). */
.al-editarea{ flex:1; display:flex; flex-direction:column; min-height:0; position:relative; }

/* Segunda vuelta: la primera version de esta franja era una REJILLA que envolvia a
   varias filas -- con muchas fotos del evento eso las amontonaba visualmente (el reporte
   con la captura). Ahora es un CARRUSEL de una sola fila: no hay "muchas filas" que
   puedan amontonarse, hay una que se desplaza a los lados. Por eso .al-poolzone ya no
   necesita el tope fijo de la version anterior (max-height:38vh): con una sola fila su
   alto ya esta acotado por diseno, sin importar cuantas fotos tenga el evento. */
.al-poolzone{ border-top:1px solid var(--hair); background:var(--paper); padding:12px 20px 14px; display:flex; flex-direction:column; gap:8px; flex:0 0 auto; }
.al-poolzone .al-poolbar{ margin-bottom:0; flex-wrap:wrap; }
.al-poolgap{ flex:1; }
/* Contenedor del carrusel: las flechas se superponen a los bordes de la tira, no ocupan
   su propio espacio -- asi no le restan ancho a las fotos. */
.al-poolstrip{ position:relative; }
.al-poolnav{ position:absolute; top:0; bottom:0; z-index:5; width:34px; border:0; cursor:pointer; display:flex; align-items:center; justify-content:center; font-size:18px; color:var(--ink); background:linear-gradient(var(--dir,to right), var(--paper) 30%, transparent); }
.al-poolnav-l{ left:0; --dir:to right; }
.al-poolnav-r{ right:0; --dir:to left; }
.al-poolnav:hover{ color:var(--accent); }
/* Una sola fila que se desplaza a los lados (scroll horizontal), NO una rejilla que
   envuelve. El tamano lo elige el usuario en el toolbar del pool, y como es una sola
   fila, cambiar --poto cambia el alto del carrusel Y el de las fotos con el mismo
   control: no hace falta uno aparte para cada cosa. */
.al-poolzone .al-pool{ display:flex; flex-wrap:nowrap; align-items:flex-start; gap:8px; overflow-x:auto; overflow-y:hidden; padding-bottom:2px; }
.al-poto{ flex:none; width:var(--poto,130px); height:var(--poto,130px); }
.al-pool.tam-s{ --poto:86px; }
.al-pool.tam-m{ --poto:130px; }
.al-pool.tam-l{ --poto:190px; }
/* Con las fotos grandes las estrellas dejan de esconderse tras el hover: calificar es
   justo lo que se viene a hacer aqui, y un control invisible no se usa. */
.al-pool.tam-l .al-poto-meta{ display:flex; }
/* "Ver proporcion real" (▤): cada foto conserva SU aspecto en vez del recorte cuadrado.
   Antes esto era un mosaico de 2 columnas (columns:2) que no tenia sentido dentro de un
   carrusel de una fila. Aqui el alto queda fijo (=--poto, igual que el modo recortado) y
   el ANCHO lo decide la imagen: object-fit:contain dentro de una caja cuadrada, asi la
   foto no se deforma y el carrusel no pierde su alineacion de una sola fila. */
.al-pool.prop .al-poto img{ object-fit:contain; background:color-mix(in srgb, var(--ink) 5%, transparent); }

/* Popover chico que sigue quedando: ⚙ Álbum. Mismo molde que .al-guias-pop. */
.al-pop-wrap{ position:relative; display:inline-flex; }
.al-pop{ position:absolute; top:calc(100% + 6px); left:0; z-index:60; width:330px; max-height:min(70vh,560px); overflow-y:auto; background:var(--paper); border:1px solid var(--hair); border-radius:12px; box-shadow:0 14px 40px rgba(43,41,38,.22); padding:14px; }
.al-pop[hidden]{ display:none; }

/* ---------- Vistas: pantalla completa, NO un popover ---------- */
/* Cubre .al-editarea entera (stage+cellbar+poolzone), dejando la barra de arriba
   (al-canvastop) visible y usable -- el boton que la cierra vive ahi mismo. */
.al-vistasfull{ position:absolute; inset:0; z-index:50; background:var(--bone); display:flex; flex-direction:column; }
.al-vistasfull[hidden]{ display:none; }
.al-vf-head{ display:flex; align-items:center; justify-content:space-between; gap:16px; padding:14px 20px; border-bottom:1px solid var(--hair); flex:none; }
.al-vf-body{ flex:1; min-height:0; overflow-y:auto; padding:20px; }
/* Familias (Clasica/Con principal/...) dentro de la pantalla de plantillas. */
.al-vf-body .al-segs{ flex-wrap:wrap; margin-bottom:16px; }
/* Galeria de plantillas GRANDE: cada tarjeta trae un renderThumb de 300px con las fotos
   REALES de este pliego ya puestas (ver pintarTplsGrande) -- comparar de verdad, no
   adivinar por un icono abstracto. */
.al-tplgrid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:20px; }
.al-tplcard{ display:flex; flex-direction:column; gap:8px; align-items:center; background:none; border:2px solid transparent; border-radius:12px; padding:10px; cursor:pointer; }
.al-tplcard:hover{ border-color:var(--line2); }
.al-tplcard.on{ border-color:var(--accent); }
.al-tplcardprev{ border-radius:6px; overflow:hidden; box-shadow:0 2px 10px rgba(43,41,38,.14); }
.al-tplcardname{ font-size:12.5px; color:var(--muted); }
/* "Ajustado a las fotos": columna angosta para elegir fotos (izquierda) + resultados a la
   derecha, con mas aire (columnas anchas: son pocas variantes, no 22 plantillas). */
.al-ajust{ display:grid; grid-template-columns:280px 1fr; gap:24px; align-items:start; height:100%; }
.al-ajust-side{ position:sticky; top:0; }
.al-ajust-resumen{ font-size:13px; color:var(--muted); margin-bottom:12px; line-height:1.5; }
.al-ajust-resumen b{ color:var(--ink); }
.al-ajust-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:6px; max-height:60vh; overflow-y:auto; }
.al-ajustfoto{ position:relative; aspect-ratio:1; border-radius:6px; overflow:hidden; border:2px solid transparent; padding:0; cursor:pointer; background:none; }
.al-ajustfoto img{ width:100%; height:100%; object-fit:cover; display:block; }
.al-ajustfoto.on{ border-color:var(--accent); }
.al-ajustfoto.on img{ opacity:.55; }
.al-ajustcheck{ position:absolute; inset:0; display:flex; align-items:center; justify-content:center; color:#fff; font-size:22px; text-shadow:0 1px 4px rgba(0,0,0,.5); }
.al-ajust-resultados{ display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:20px; align-content:start; }
.al-ajust-resultados .al-tplcardprev{ background:var(--paper); }
@media (max-width:900px){ .al-ajust{ grid-template-columns:1fr; } .al-ajust-side{ position:static; } }
/* Mosaico de "Todos los pliegos": reusa .al-strip (el mismo motor de dibujo de siempre),
   solo que en rejilla grande y llenando la pantalla en vez de tira horizontal chica. */
.al-strip.grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); align-items:start; align-content:start; gap:20px; padding:0; border-top:0; background:transparent; }
.al-strip.grid .al-sthumb{ width:100%; }
.al-sthumb{ position:relative; flex:none; cursor:pointer; border:2px solid transparent; border-radius:4px; padding:2px; }
.al-sthumb.on{ border-color:var(--accent); }
.al-sthost{ box-shadow:0 1px 3px rgba(43,41,38,.15); border-radius:2px; overflow:hidden; }
.al-sn{ position:absolute; bottom:4px; left:6px; font-size:10px; color:#fff; background:rgba(43,41,38,.6); padding:1px 5px; border-radius:8px; }
.al-addspread{ flex:none; height:58px; padding:0 16px; border:1px dashed var(--hair); border-radius:8px; background:var(--bone); color:var(--muted); cursor:pointer; font-size:13px; }
.al-addspread:hover{ border-color:var(--accent); color:var(--accent); }

/* ============================================================================
   CHAT COMO SUPERFICIE PRINCIPAL (F1)
   El chat deja de ser una columna lateral y pasa a ser la parte ancha; el CRM
   queda a la derecha con un ancho de trabajo real. Va al FINAL del archivo a
   proposito: .chatpane esta definida dos veces (lineas 57 y 1233) y gana la
   ultima, asi que editar el bloque base no se veria.
   Todo lo de escritorio va dentro de min-width:861px para NO pisar el cajon
   movil (@media max-width:860px, linea 441), que se declara antes y perderia.
   ============================================================================ */
@media (min-width:861px){
  /* INVERTIDO (2026-08-03): antes el chat crecia para llenar todo lo que sobrara y el CRM
     tomaba un ancho fijo. En una pantalla de 1512px eso dejaba el chat en ~900px: una
     columna de conversacion mas ancha que el CRM entero. Ahora el chat tiene un ancho
     PROPIO (arrastrable, --chat-w) y el CRM es el que crece.
     El ancho vive en una variable de #app para que el divisor lo mueva sin tocar reglas. */
  .chatpane{ flex:0 0 var(--chat-w); min-width:0; border-right:none; }
  .main{ flex:1 1 auto; min-width:0; }

  /* El divisor. 5px de ancho visual pero 11px de zona agarrable (::before lo extiende a
     los lados): un objetivo de 5px es de los que se fallan al primer intento. */
  .cp-resize{ flex:0 0 5px; position:relative; cursor:col-resize; background:transparent;
              border-left:1px solid var(--hair); touch-action:none; z-index:5; }
  .cp-resize::before{ content:""; position:absolute; inset:0 -3px; }
  /* La barrita solo aparece al acercarse o al arrastrar: en reposo es una linea, como antes. */
  .cp-resize::after{ content:""; position:absolute; left:1px; top:50%; width:3px; height:38px;
                     margin-top:-19px; border-radius:3px; background:var(--line2); opacity:0;
                     transition:opacity .15s; }
  .cp-resize:hover::after, .cp-resize:focus-visible::after, .cp-resize.arrastrando::after{ opacity:1; }
  .cp-resize:focus-visible{ outline:2px solid var(--accent); outline-offset:-2px; }
  .cp-resize.arrastrando::after{ background:var(--accent); }
  /* Durante el arrastre: sin seleccion de texto accidental y el cursor no cambia al pasar
     sobre el contenido. */
  #app.redimensionando{ user-select:none; cursor:col-resize; }
  #app.redimensionando iframe{ pointer-events:none; }

  /* Colapsar chat/CRM (public/app.js: montarColapsoPaneles). Dos botones diminutos
     SOBRE el propio divisor -- ya vive exactamente en el limite entre los dos bloques,
     asi que no hace falta un lugar nuevo, y al ser flex items ambos se recolocan solos
     cuando un lado llega a flex-basis 0 (el divisor termina pegado al borde visible). */
  .cp-collapse{
    position:absolute; left:50%; transform:translateX(-50%);
    width:22px; height:22px; border-radius:50%; padding:0;
    display:flex; align-items:center; justify-content:center;
    background:var(--deep); border:1px solid var(--hair); color:var(--muted);
    font-size:14px; line-height:1; cursor:pointer; z-index:6;
    opacity:.5; transition:opacity .15s, color .15s, border-color .15s;
  }
  .cp-collapse:hover, .cp-collapse:focus-visible{ opacity:1; color:var(--ink); border-color:var(--accent); }
  .cp-collapse:focus-visible{ outline:2px solid var(--accent); outline-offset:1px; }
  #cp-collapse-chat{ top:calc(50% - 27px); }
  #cp-collapse-crm{ top:calc(50% + 5px); }

  /* El bloque colapsado se va a flex-basis 0 (y padding/borde a 0, para que no le quede
     un pixel de aire); el otro pasa a ocupar todo. La barra de arrastre no aplica cuando
     no hay nada que arrastrar (el pointerdown/keydown de montarDivisorChat ya lo ignoran
     en codigo; esto es solo la senal visual). */
  #app.chat-colapsado .chatpane{ flex:0 0 0; min-width:0; padding:0; border:0; overflow:hidden; }
  #app.crm-colapsado .chatpane{ flex:1 1 auto; }
  #app.crm-colapsado .main{ flex:0 0 0; min-width:0; overflow:hidden; }
  #app.chat-colapsado .cp-resize::after, #app.crm-colapsado .cp-resize::after{ display:none; }

  /* Riel de lectura: el texto no se estira a 900px aunque el chat sea ancho.
     Se hace con padding y no tocando el HTML, para no mover el DOM del chat. */
  .chatpane .greet,
  .chatpane .chatscroll,
  .chatpane .chips,
  .chatpane .xarpiemode,
  .chatpane .attach-prev,
  .chatpane .composer{ padding-inline: max(0px, calc((100% - 780px) / 2)); }
  /* La marca sigue pegada al borde: es cabecera, no lectura. */
}

/* El modal vivia en z-index 60, POR DEBAJO del cajon del chat (70) y del menu
   de usuario (75): en telefono, el boton WhatsApp de una burbuja abria un modal
   invisible detras del chat. 78 lo deja encima de ambos y debajo del login (80)
   y del toast (90). */
.ov{ z-index:78; }

/* La banda 861-900 estaba rota: el bloque de 900px dejaba .chatpane con
   flex-basis:auto mientras el cajon movil solo entra a 860. Se alinea a 860
   para que solo haya dos estados, escritorio y telefono. */
@media (min-width:861px) and (max-width:900px){
  .chatpane{ flex-basis:auto; }
}

@media (max-width:860px){
  /* En telefono el chat es un cajon superpuesto, no una columna: no hay nada que
     redimensionar y el divisor solo estorbaria al scroll. */
  .cp-resize{ display:none; }
  /* En telefono el chat es la pantalla: mas aire util para el texto. */
  .chatpane{ padding:18px 16px 14px; }
  /* Y OPACO. La linea 1233 lo dejo en background:transparent, que en escritorio esta bien
     (el degradado de #app.show se ve detras) pero como cajon superpuesto dejaba leer el
     CRM POR DEBAJO del chat, con los dos textos encimados. Se veia solo al abrirlo a mano;
     ahora que el chat abre al arrancar, se veria siempre. */
  .chatpane{ background:var(--deep); }
}

/* Con el CRM en columna angosta, las 12 categorias ya no caben en una linea: la barra
   necesitaba 1107px y tenia 566, asi que 7 quedaban fuera de vista. Y como .topbar
   esconde su scrollbar (scrollbar-width:none), no habia ni una pista de que hubiera mas.
   Se deja envolver en varias lineas: ocupa un poco mas de alto, pero todo se ve y se
   alcanza de un clic, que es lo que se espera de una nav que ahora es un atajo. */
@media (min-width:861px){
  /* row-gap 5 y no 1: con las filas pegadas, el subrayado del tab activo (bottom:1px)
     caia en el hueco y parecia el subrayado del tab de ABAJO. */
  .topbar{ flex-wrap:wrap; overflow-x:visible; row-gap:5px; padding:7px 14px; }
  /* Mas apretadas: con el ancho de trabajo del CRM, en tamano normal se iban a 3 filas
     (150px de alto permanente robados al contenido). Asi caben en 2. */
  .topbar .tab{ padding:5px 9px; font-size:12.5px; }
  /* El guion del tab activo esta pensado para colgar bajo una nav de UNA fila
     (bottom:-19px, linea 1267): con dos filas caia en la de abajo y parecia marcar el tab
     equivocado. Se sube para que quede bajo SU tab, conservando el guion centrado. */
  .topbar .tab.on:after{ bottom:-4px; }
}

/* ---- Widgets fuera de su rejilla (fijados sobre el chat, y mas adelante el chat) ----
   .wgrid es un grid y .w-ch/.w-med/.w-full son `grid-column: span N`: fuera de esa rejilla
   quedan en no-op, asi que la franja usa columna simple y anula el span. */
.wpins{ display:flex; flex-direction:column; gap:10px; margin:14px 0 4px; flex:0 0 auto; max-height:46vh; overflow-y:auto; }
.wpins .widget, .wsuelto{ grid-column:auto; width:100%; }
/* Consultas por CONTENEDOR y no por viewport: la tarjeta puede vivir en una columna
   angosta aunque la pantalla sea ancha. */
.wsuelto{ container-type:inline-size; }
.wsuelto .w-head{ cursor:default; }
.wsuelto-btn{ font-size:11.5px; padding:2px 8px; width:auto; height:auto; border-radius:7px; }
/* En telefono la franja no puede comerse la conversacion: mas baja que en escritorio. */
@media (max-width:860px){ .wpins{ max-height:34vh; margin:10px 0 2px; } }
/* Tarjetas que Xarpie pinta dentro de su respuesta.
   OJO CON LA CAJA: .brow es un flex en FILA (ava + bubwrap). Al colgar aqui un tercer hijo
   sin mas, se convertia en una COLUMNA de 2px de ancho y 1300 de alto: una astilla
   invisible que ademas inflaba el scroll y hacia parecer que el chat estaba vacio.
   flex-basis:100% + flex-wrap en el .brow lo bajan a su propio renglon, a lo ancho. */
.brow-conwidgets{ flex-wrap:wrap; }
.browwidgets{ flex:0 0 100%; min-width:0; display:flex; flex-direction:column; gap:10px; margin:10px 0 2px 40px; }
.browwidgets .widget{ grid-column:auto; width:auto; max-width:100%; }
@media (max-width:860px){ .browwidgets{ margin-left:0; } }

/* ---- Panel derecho apilable ----
   En escritorio va EN EL FLUJO: no tapa nada, empuja. Por eso no es un dialogo y no
   atrapa el foco. En telefono se superpone y ahi si (ver panelSync). */
.wpanel{ display:flex; flex-direction:column; background:var(--paper); border-left:1px solid var(--hair); height:100vh; overflow:hidden; }
.wpanel[hidden]{ display:none; }
.wpanel-head{ display:flex; align-items:center; gap:8px; padding:12px 14px; border-bottom:1px solid var(--hair); flex:0 0 auto; }
.wpanel-title{ font-family:var(--serif); font-size:18px; font-weight:500; margin:0; flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.wpanel-title:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; border-radius:4px; }
.wpanel-btn{ flex:0 0 30px; width:30px; height:30px; display:grid; place-items:center; border:1px solid var(--line2); border-radius:8px; background:transparent; color:var(--muted); cursor:pointer; font-size:14px; }
.wpanel-btn:hover{ background:var(--bone); color:var(--ink); }
.wpanel-btn[hidden]{ display:none; }
.wpanel-body{ flex:1; overflow-y:auto; padding:14px; }
.wpanel-body .widget{ grid-column:auto; width:auto; }
.wpanel-backdrop{ display:none; }

@media (min-width:861px){
  .wpanel{ flex:0 0 clamp(360px,28%,520px); min-width:0; }
}
@media (max-width:860px){
  /* Se superpone. z-index 66: por encima del contenido y por DEBAJO del cajon del chat
     (70) y su backdrop (69), para no romper el chat cuando los dos estan abiertos. */
  .wpanel{ position:fixed; inset:0 0 0 auto; width:min(94vw,460px); z-index:66; box-shadow:-14px 0 40px -20px rgba(0,0,0,.5); }
  .wpanel-backdrop:not([hidden]){ display:block; position:fixed; inset:0; z-index:65; background:rgba(43,41,38,.42); }
}

/* ---- Pregunta de Xarpie con opciones ---- */
.xarpiepreg{ flex:0 0 100%; min-width:0; margin:12px 0 2px 40px; border:1px solid var(--line2); border-radius:14px; padding:14px 16px; background:var(--paper); }
.xarpiepreg-q{ font-size:14.5px; font-weight:500; margin-bottom:12px; }
.xarpiepreg-ops{ display:flex; flex-direction:column; gap:8px; }
.xarpiepreg-op{ display:flex; flex-direction:column; gap:2px; text-align:left; padding:10px 13px; border:1px solid var(--line2); border-radius:10px; background:transparent; color:var(--ink); cursor:pointer; transition:.13s; }
.xarpiepreg-op:hover:not(:disabled){ border-color:var(--accent); background:var(--bone); }
.xarpiepreg-op:disabled{ cursor:default; opacity:.55; }
.xarpiepreg-op.elegida{ border-color:var(--accent); background:var(--bone); opacity:1; }
.xarpiepreg-et{ font-size:13.5px; font-weight:500; }
.xarpiepreg-det{ font-size:12px; color:var(--muted); }
.xarpiepreg-pie{ font-size:11.5px; color:var(--muted); margin-top:10px; }
@media (max-width:860px){ .xarpiepreg{ margin-left:0; } }

/* Pulgar arriba/abajo al pie de una respuesta de Xarpie. Discretos a proposito: se ven al
   pasar el mouse por la burbuja, no compiten con el contenido. */
.xarpie-senal { display: flex; gap: 4px; margin-top: 3px; opacity: 0; transition: opacity .15s; }
.brow:hover .xarpie-senal, .xarpie-senal:focus-within { opacity: 1; }
.xarpie-senal-b { border: 0; background: transparent; cursor: pointer; padding: 2px 5px; border-radius: 6px; font-size: 12px; line-height: 1; filter: grayscale(1); opacity: .55; }
.xarpie-senal-b:hover { filter: none; opacity: 1; background: var(--paper2, rgba(0, 0, 0, .04)); }
/* Nav agrupado: las categorias con subsecciones abren un dropdown en vez de una
   segunda fila. .nav-menu va DESPUES de .usermenu (misma especificidad, gana la
   ultima) y en position:fixed, porque .topbar tiene overflow-x:auto y recortaria
   un menu absolute. Las coordenadas las calcula pintarNav desde el boton. */
.nav-wrap{ position:relative; display:inline-flex; flex:0 0 auto; }
.nav-caret{ font-size:10px; opacity:.55; margin-left:2px; }
.nav-menu{ position:fixed; top:auto; right:auto; width:200px; }
.nav-menu .um-item.on{ color:var(--accent); font-weight:600; }
/* Galerias: rejilla con portada grande. Columnas anchas (260px min) para que la
   foto se lea como foto y no como miniatura de lista. */
.gal-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:20px; }
.gal-card{ text-align:left; border:0; background:transparent; padding:0; cursor:pointer; color:inherit; font:inherit; }
.gal-cover{ position:relative; aspect-ratio:4/3; border-radius:12px; overflow:hidden; background:var(--deep); border:1px solid var(--line2); }
.gal-cover img{ width:100%; height:100%; object-fit:cover; display:block; transition:transform .3s ease; }
.gal-card:hover .gal-cover img{ transform:scale(1.04); }
.gal-cover-vacia{ width:100%; height:100%; display:grid; place-items:center; color:var(--muted); font-size:12.5px; }
.gal-badge{ position:absolute; top:10px; left:10px; }
.gal-info{ padding:10px 2px 0; }
.gal-nombre{ font-size:15px; font-weight:600; line-height:1.25; }
.gal-meta{ font-size:12.5px; color:var(--muted); margin-top:2px; }
.gal-nums{ display:flex; flex-wrap:wrap; gap:10px; font-size:12px; color:var(--muted); margin-top:6px; }

/* ============================================================================
   MEDIDOR DE USO DE XARPIE
   Barra fija al pie del riel. Muestra TRES cosas juntas a proposito: mensajes
   (la cuota que de verdad se agota), tokens (el volumen) y costo (lo que se
   gasta). Cualquiera de las tres sola enganaria -- el plan topa por MENSAJES,
   asi que los tokens no "se acaban"; y el costo sin el conteo no dice cuando
   te vas a quedar sin cupo.
   ============================================================================ */
.xarpie-medidor{ display:flex; align-items:center; gap:9px; width:100%; margin-top:9px;
  padding:7px 10px; border:1px solid var(--hair); border-radius:10px;
  background:transparent; cursor:pointer; text-align:left; font-family:var(--sans);
  color:var(--muted); font-size:11px; line-height:1.2; }
.xarpie-medidor:hover{ border-color:var(--line2); color:var(--ink); }
.xarpie-medidor:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
/* La barra de progreso: solo la cuota de mensajes, que es lo unico que tiene tope. */
.tm-barra{ flex:0 0 62px; height:4px; border-radius:4px; background:var(--line2); overflow:hidden; }
.tm-relleno{ height:100%; border-radius:4px; background:var(--accent); transition:width .3s ease; }
.tm-relleno.alto{ background:var(--yellow); }
/* Rojo PROPIO y no var(--red): en el tema oscuro --red y --accent son el mismo #D97757
   (styles.css:594), asi que el estado "sin cupo" se veia identico al de 1% usado -- la
   alarma no alarmaba. Este rojo es claramente mas rojo que la terracota de la marca. */
.tm-relleno.tope{ background:#d64545; }
.xarpie-medidor.en-tope .tm-cuota{ color:#d64545; }
.tm-cuota{ font-variant-numeric:tabular-nums; color:var(--ink); font-weight:600; }
.tm-sep{ opacity:.35; }
.tm-costo{ margin-left:auto; font-variant-numeric:tabular-nums; }
/* Sin tope (plan pro): no hay barra que llenar, se dice y ya. */
.xarpie-medidor.sin-tope .tm-barra{ display:none; }
@media (max-width:860px){
  /* En telefono se conserva (se pidio SIEMPRE visible) pero mas apretado: con el teclado
     arriba el alto es lo escaso, y una linea de ~26px cabe sin empujar al composer. */
  .xarpie-medidor{ margin-top:7px; padding:5px 8px; font-size:10.5px; gap:7px; }
  .tm-barra{ flex-basis:46px; }
}
/* Galerias: la tarjeta dejo de ser <button> (no se pueden anidar botones): la
   portada es el boton de abrir y las acciones van aparte, debajo. */
.gal-abrir{ display:block; width:100%; text-align:left; border:0; background:transparent; padding:0; cursor:pointer; color:inherit; font:inherit; }
.gal-acc{ display:flex; align-items:center; gap:8px; margin-top:10px; padding:0 2px; }
.gal-menu-wrap{ position:relative; display:inline-flex; margin-left:auto; }
.gal-mas{ line-height:1; padding:6px 10px; }
/* Igual que .posp-menu y .nav-menu: va despues de .usermenu (misma especificidad,
   gana la ultima) y en fixed, porque la tarjeta lo recortaria. */
.gal-menu{ position:fixed; top:auto; right:auto; width:190px; }

/* Armador de filtros con grupos (2 niveles) y orden multinivel. */
.db-fgrupo{ margin-bottom:6px; }
.db-fgrupo-caja{ border:1px solid var(--hair); border-radius:9px; padding:8px 9px; }
/* El nexo ("donde" / el selector Y-O) va en columna fija: sin ancho comun las filas
   quedan escalonadas y cuesta leer que condicion pertenece a que grupo. */
.db-fc-nexo{ flex:0 0 68px; font-size:11.5px; color:var(--muted); }
.db-fc-nexo .sel-sm{ width:100%; }
.db-fc-entre{ padding:5px 0 5px 2px; font-size:11.5px; color:var(--muted); }
.db-fc-entre .sel-sm{ width:68px; }

/* ================= Configurar vista de base (panel de dos columnas) =================
   El modal viejo era un scroll plano de 600px: 8 secciones apiladas, las que no aplicaban
   al tipo se ocultaban con display:none (saltos sin explicacion) y las columnas se
   controlaban en dos lugares distintos. Aqui: riel de secciones con contadores, un pane a
   la vez, columnas unificadas y una tira de vista previa fija arriba del pie.
   --cvp-tint / --cvp-alerta son locales porque en tema oscuro --red y --accent son el
   MISMO color (#D97757): un aviso pintado con --red seria invisible sobre el acento. */
:root{ --cvp-tint:rgba(201,100,66,.09); --cvp-sup:rgba(43,40,36,.035); --cvp-alerta:#B3492A; }
:root[data-theme="dark"]{ --cvp-tint:rgba(217,119,87,.15); --cvp-sup:rgba(255,255,255,.045); --cvp-alerta:#E8A48C; }

.cvp-modal{ width:940px; max-width:96vw; }
.cvp{ display:grid; grid-template-columns:216px minmax(0,1fr); min-height:400px; }
.cvp-riel{ display:flex; flex-direction:column; gap:2px; padding:14px 10px; border-right:1px solid var(--hair); background:var(--cvp-sup); }
.cvp-tab{ display:grid; grid-template-columns:1fr auto; align-items:center; gap:2px 8px; text-align:left; width:100%;
  border:0; border-radius:9px; background:transparent; padding:9px 11px; cursor:pointer; color:var(--ink); }
.cvp-tab:hover{ background:var(--cvp-tint); }
.cvp-tab.on{ background:var(--cvp-tint); box-shadow:inset 2px 0 0 var(--accent); }
.cvp-tab-nom{ font-size:13.5px; font-weight:600; }
.cvp-tab-sub{ grid-column:1; font-size:11px; color:var(--muted); line-height:1.35; }
.cvp-tab-b{ grid-row:1; grid-column:2; font-family:var(--mono); font-size:10px; color:var(--muted);
  background:var(--paper); border:1px solid var(--line2); border-radius:20px; padding:1px 7px; white-space:nowrap; }
.cvp-tab.on .cvp-tab-b{ color:var(--accent); border-color:var(--accent); }
.cvp-alerta{ display:inline-grid; place-items:center; width:15px; height:15px; border-radius:50%;
  background:var(--cvp-alerta); color:var(--paper); font-size:10px; font-weight:700; vertical-align:1px; }

.cvp-pane{ padding:20px 24px; max-height:min(58vh,520px); overflow-y:auto; }

/* --- selector de tipo de vista --- */
.cvp-tipos{ display:grid; grid-template-columns:repeat(auto-fill,minmax(158px,1fr)); gap:8px; margin-top:8px; }
.cvp-tipo{ display:flex; flex-direction:column; gap:3px; text-align:left; padding:11px 12px; cursor:pointer;
  border:1px solid var(--line2); border-radius:10px; background:transparent; color:var(--ink); }
.cvp-tipo:hover{ border-color:var(--accent); }
.cvp-tipo.on{ border-color:var(--accent); background:var(--cvp-tint); }
.cvp-tipo-ic{ font-size:15px; line-height:1.1; color:var(--accent); }
.cvp-tipo-nom{ font-size:13px; font-weight:600; }
.cvp-tipo-desc{ font-size:11px; color:var(--muted); line-height:1.4; }

.cvp-aviso{ margin-top:14px; padding:10px 12px; border-radius:9px; font-size:12.5px; line-height:1.5;
  border:1px solid var(--cvp-alerta); color:var(--cvp-alerta); background:var(--cvp-sup); }
.cvp-req{ font-family:var(--mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase;
  color:var(--cvp-alerta); border:1px solid currentColor; border-radius:20px; padding:0 5px; margin-left:4px; }
.cvp-vacio{ padding:16px; border:1px dashed var(--line2); border-radius:10px; font-size:13px; color:var(--muted); text-align:center; }

/* --- filtros y orden --- */
.cvp-grupo{ border:1px solid var(--line2); border-radius:10px; padding:10px 11px; background:var(--cvp-sup); }
.cvp-entre{ padding:7px 0 7px 4px; }
.cvp-cond{ display:flex; gap:7px; align-items:center; flex-wrap:wrap; margin:6px 0; }
.cvp-nexo{ flex:0 0 78px; }
.cvp-nexo-fijo{ font-size:11.5px; color:var(--muted); }
.cvp-conj{ width:100%; }
.cvp-entre .cvp-conj{ width:78px; }
.cvp-x{ margin-left:auto; color:var(--muted); }
.cvp-x:hover{ color:var(--cvp-alerta); }

/* --- columnas unificadas (ver + orden + ancho + pie) --- */
.cvp-colhead{ display:flex; gap:8px; align-items:center; padding:0 2px 7px; border-bottom:1px solid var(--hair);
  font-family:var(--mono); font-size:9.5px; letter-spacing:.09em; text-transform:uppercase; color:var(--muted); }
.cvp-colhead-ver{ width:26px; }
.cvp-cols{ display:flex; flex-direction:column; }
.cvp-col{ display:flex; gap:8px; align-items:center; padding:7px 2px; border-bottom:1px solid var(--hair); }
.cvp-col:last-child{ border-bottom:0; }
.cvp-col.es-titulo{ background:var(--cvp-tint); border-radius:8px 8px 0 0; padding-left:6px; padding-right:6px; }
.cvp-col-ver{ width:26px; display:grid; place-items:center; }
.cvp-col-ver input[type="checkbox"]{ width:16px; height:16px; accent-color:var(--accent); cursor:pointer; }
.cvp-fijo{ color:var(--accent); font-size:11px; cursor:help; }
.cvp-col-nom{ display:flex; align-items:center; gap:7px; font-size:13px; }
.cvp-col-ic{ color:var(--muted); font-size:12px; width:15px; text-align:center; }
.cvp-col-mov{ width:56px; display:flex; gap:2px; justify-content:flex-end; }
.cvp-col-mov .btn{ padding:2px 6px; }

/* --- tira de vista previa (corre la consulta de verdad mientras configuras) --- */
.cvp-prev{ display:flex; align-items:center; gap:10px; padding:10px 24px;
  border-top:1px solid var(--hair); background:var(--cvp-sup); }
.cvp-prev-et{ flex:0 0 auto; font-family:var(--mono); font-size:9.5px; letter-spacing:.09em;
  text-transform:uppercase; color:var(--muted); }
.cvp-prev-txt{ flex:1; min-width:0; font-size:12.5px; color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cvp-prev-txt.es-vacio{ color:var(--muted); }
.cvp-prev-txt.es-error{ color:var(--cvp-alerta); }

@media (max-width:760px){
  .cvp{ grid-template-columns:1fr; }
  .cvp-riel{ flex-direction:row; overflow-x:auto; border-right:0; border-bottom:1px solid var(--hair); padding:10px; }
  .cvp-tab{ flex:0 0 auto; grid-template-columns:auto; }
  .cvp-tab-sub{ display:none; }
  .cvp-tab-b{ grid-row:auto; grid-column:auto; }
  .cvp-pane{ padding:16px; }
  .cvp-prev{ padding:10px 16px; }
}

/* Selector de tamano dentro del panel de configuracion de una tarjeta */
.wcfg-tams{ display:flex; gap:6px; }
.wcfg-tam{ flex:1; padding:9px 10px; font-size:13px; cursor:pointer; color:var(--ink);
  border:1px solid var(--line2); border-radius:9px; background:transparent; }
.wcfg-tam:hover{ border-color:var(--accent); }
.wcfg-tam.on{ border-color:var(--accent); background:var(--cvp-tint); color:var(--accent); font-weight:600; }

/* ---------- Proyectos: equipo (etapas, notas, conversacion, archivos) ---------- */
/* Editor de columnas del tablero. Rejilla propia y no .plt-row: ese es el editor de
   pasos de plantilla y tiene 5 columnas, no 3. */
.et-row{ display:grid; grid-template-columns:1fr auto 30px; gap:8px; align-items:center; margin-bottom:8px; }
.et-row .inp{ padding:8px 10px; font-size:13px; }

.pj-notas{ display:grid; gap:14px; }
.pj-nota{ border:1px solid var(--line2); border-radius:12px; padding:12px 14px; background:var(--paper); }
.pj-nota-h{ display:flex; gap:8px; align-items:center; }
.pj-nota-tit{ flex:1; border:0; background:transparent; font:inherit; font-weight:600; font-size:15px; color:var(--ink); padding:2px 0; }
.pj-nota-tit:focus{ outline:none; }
.pj-nota-txt{ width:100%; border:0; background:transparent; font:inherit; font-size:14px; line-height:1.55; color:var(--ink);
  resize:vertical; min-height:90px; padding:6px 0; }
.pj-nota-txt:focus{ outline:none; }
.pj-nota-pie{ font-size:11.5px; border-top:1px solid var(--line2); padding-top:8px; margin-top:4px; }

/* Conversacion */
.pj-comp{ display:flex; gap:8px; align-items:flex-end; margin-bottom:16px; }
.pj-comp .ta{ flex:1; min-height:56px; }
.pj-hilo{ display:grid; gap:12px; }
.pj-com{ border-left:2px solid var(--line2); padding:2px 0 2px 12px; }
.pj-com-h{ display:flex; gap:8px; align-items:center; font-size:12.5px; flex-wrap:wrap; }
.pj-com-txt{ font-size:14px; line-height:1.55; white-space:pre-wrap; margin-top:3px; }

/* Archivos y enlaces */
.pj-arch{ display:grid; gap:2px; }
.pj-arch-item{ display:flex; gap:10px; align-items:center; padding:9px 4px; border-bottom:1px solid var(--line2); }
.pj-arch-ico{ font-size:15px; }
.pj-arch-nom{ color:var(--ink); text-decoration:none; font-size:14px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pj-arch-nom:hover{ text-decoration:underline; }
.pj-arch-meta{ margin-left:auto; font-size:11.5px; white-space:nowrap; }

/* Hilo dentro del modal de tarea */
.tarea-hilo{ border-top:1px solid var(--line2); margin-top:16px; padding-top:14px; }
.tarea-hilo-h{ font-family:var(--mono); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin-bottom:8px; }

@media (max-width:640px){
  .et-row{ grid-template-columns:1fr 30px; }
  .et-row label{ grid-column:1/3; }
  .pj-arch-meta{ display:none; }
}

/* ---------- Pestana "Ajustes" de la galeria ---------- */
/* Reusa los controles del editor de diseno (.ge-toggle / .ge-sw2 / .ge-sub) en vez de
   inventar un switch nuevo, pero mapeando las variables --ge-* a la paleta del CRM: aqui
   estamos DENTRO del panel, no en el editor de pantalla completa, y con los colores del
   editor se veria como un injerto. Cuando el editor entre como pestana (fase 4) los dos
   bloques van a compartir el mismo aspecto sin tocar nada. */
.gset{ max-width:640px; --ge-ink:var(--ink); --ge-ink2:var(--muted); --ge-ink3:var(--muted); --ge-line:var(--line2); --ge-line2:var(--hair); --ge-bg:var(--paper); }
.gset .ge-toggle+.ge-toggle{ border-top:1px solid var(--hair); }
/* El off del switch esta hardcodeado a un alfa de tinta oscura, que en tema oscuro
   desaparece contra el fondo. Aqui se le da un valor que funciona en los dos. */
:root[data-theme="dark"] .gset .ge-sw2{ background:rgba(240,236,228,.18); }
.gset .ge-sw2[disabled]{ opacity:.5; cursor:default; }

/* ---------- Editor de diseno EMBEBIDO en la pestana Diseño ---------- */
/* .geditor sigue siendo `position:fixed; inset:0` para #/portal-diseno, que comparte esa
   clase (app.js). Aqui se le quita el anclaje al viewport con una clase modificadora y se
   ancla a #view, igual que .aled y .calfull: el motivo esta escrito arriba en el comentario
   de esas dos -- fixed tapa el chat de Xarpie (432px a la izquierda) y la barra de navegacion,
   cuyo alto cambia. Anclado a #view las dos medidas salen solas del layout. */
.gal-full{ position:relative; }
/* `.main > #view` es `flex:1 0 auto` (shrink 0) a proposito: las paginas largas crecen y scrollea
   `.main`. Aqui manda lo contrario — el editor tiene que CABER para que sus dos columnas scrolleen
   por dentro. Sin `flex-shrink:1` + `min-height:0`, #view crecia a 1881px dentro de un .main de
   900px con overflow:hidden: nada scrolleaba y el resto quedaba recortado sin aviso. */
.main > #view.gal-full{ max-width:none; padding:0; overflow:hidden; display:flex; flex-direction:column; flex:1 1 auto; min-height:0; }
.main:has(#view.gal-full){ overflow:hidden; }
.gal-full .phead, .gal-full .seg{ margin-left:32px; margin-right:32px; }
.gal-full .phead{ padding-top:28px; }
.gal-full .phead, .gal-full .seg{ flex:0 0 auto; }
.gal-full #g-tabbody{ position:relative; flex:1 1 auto; min-height:0; }
.geditor.ge-embebido{ position:relative; inset:auto; z-index:auto; height:100%; container-type:inline-size; }

/* El ancho util aqui es menor que la ventana (el chat se lleva su parte), asi que el rail
   adelgaza y, si aun asi no cabe, se apila. Por @container y no @media a proposito: lo que
   manda es el ancho del PANEL, no el de la pantalla -- y ademas asi estas reglas no alcanzan
   a #/portal-diseno, que no declara contenedor. */
@container (max-width:1120px){ .ge-embebido .ge-rail{ width:340px; } }
@container (max-width:900px){
  .ge-embebido{ flex-direction:column; overflow:auto; }
  .ge-embebido .ge-rail{ width:100%; height:auto; border-right:0; border-bottom:1px solid var(--ge-line2); }
  .ge-embebido .ge-canvas{ min-height:60vh; }
}

/* Caja de encuadre de la portada: ES la vista previa del recorte, no un control aparte. */
.ge-foco{ width:100%; border-radius:12px; background-size:cover; background-position:50% 50%;
  background-color:var(--ge-canvas); border:1px solid var(--ge-line); cursor:grab; touch-action:none;
  outline:none; transition:box-shadow .15s; }
.ge-foco:focus-visible{ box-shadow:0 0 0 2px var(--ge-accent); }
.ge-foco.arrastrando{ cursor:grabbing; }
.ge-foco.vacio{ background-image:none; }

/* Selector de portada */
.portada-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(120px,1fr)); gap:10px; }
.portada-op{ position:relative; padding:0; border:2px solid transparent; border-radius:10px; overflow:hidden; background:none; cursor:pointer; aspect-ratio:1; }
.portada-op img{ width:100%; height:100%; object-fit:cover; display:block; }
.portada-op.on{ border-color:var(--accent); }
.portada-op-tag{ position:absolute; left:6px; bottom:6px; background:var(--accent); color:#fff; font-size:10.5px; padding:2px 7px; border-radius:100px; }

/* Que foto es la portada, visible SIEMPRE en el grid (no solo en hover, que en tablet ni
   siquiera existe). Mismo tratamiento que .gal-oculta-badge. */
.gal-portada-badge{ position:absolute; left:8px; bottom:8px; background:var(--accent); color:#fff; font-size:10.5px; padding:2px 8px; border-radius:100px; }
@media (hover:none){ .gal-item-acts{ opacity:1 !important; } }

/* Ordenar la galeria y arrastrar para reordenar. */
.gal-orden{ display:flex; align-items:center; gap:8px; }
.gal-orden .inp-sm{ height:32px; padding:0 26px 0 10px; font-size:13px; width:auto; }
.gal-orden-hint{ margin:2px 0 12px; }
/* Para arrastrar hace falta `touch-action:none`, o el navegador se queda el gesto para hacer
   scroll y el pointermove nunca llega. Pero en una pantalla tactil el grid ES casi todo
   fotos: ponerlo ahi dejaria la galeria sin forma de scrollear. Asi que el arrastre es de
   raton/lapiz, y en tactil se reordena con los criterios y el boton de aleatorio, que no
   necesitan gesto. Un long-press dedicado seria lo correcto el dia que alguien lo pida. */
@media (pointer:fine){ .gal-masonry.gal-reordenable .gal-item{ touch-action:none; } }
.gal-item.gal-arrastrando{ opacity:.55; cursor:grabbing; outline:2px solid var(--acc); outline-offset:1px; }
.ga-peligro .ge-tt{ color:#B0533A; }

/* El menu unico de configuracion, colgado del engrane de la nav. Vive como hijo de <body>
   y se posiciona con coordenadas de viewport, igual que .nav-menu: dentro de .navbar
   quedaria recortado por su overflow-x y por debajo de cualquier editor a pantalla
   completa. Va DESPUES de .usermenu (misma especificidad, gana el ultimo) para poder
   cambiar position sin subir el selector, como ya hacen .posp-menu y .nav-menu. */
.usermenu.cfg-menu{ position:fixed; top:auto; right:auto; width:230px; z-index:80; }

/* Iconos (design_handoff_iconos). `vertical-align:-.14em` alinea el trazo con la linea base
   del texto que lo acompaña: sin esto, un icono a la izquierda de una etiqueta se ve
   flotando alto. `flex:none` evita que un icono se aplaste dentro de un boton flex cuando
   la etiqueta es larga. */
.ico{ display:inline-block; vertical-align:-.14em; flex:none; }

/* ===== Marca Xarpen (design_handoff_marca) =====
   Los tokens del handoff vienen con :root = OSCURO; aqui :root es CLARO y el oscuro va bajo
   [data-theme="dark"], asi que estan invertidos a proposito. No es una variacion de la marca:
   son los mismos dos valores de su tabla, colgados del interruptor que este proyecto ya usa.
   El unico token que cambia entre temas es el acento, que es el color del punto. */
:root{
  --xarpen-ink:#2a2520; --xarpen-ink-2:#6a6158;
  --xarpen-accent:#bd5d3a; --xarpen-surface:#f4efe9;
}
:root[data-theme="dark"]{
  --xarpen-ink:#f5f4ee; --xarpen-ink-2:#bdbbb0;
  --xarpen-accent:#d97757; --xarpen-surface:#262624;
}
/* Sobre fotografia: todo blanco, SIN acento (el punto terracota se pierde contra piel y
   vestido) y velo obligatorio debajo. */
.xarpen-on-photo{ --xarpen-ink:#ffffff; --xarpen-accent:#ffffff; position:relative; }
.xarpen-on-photo::before{ content:""; position:absolute; inset:0; background:rgba(38,38,36,.42); }

/* El logo no define color propio: hereda la tinta de la marca. El padding ES el area de
   respeto (Ø/8) y no se recorta aunque apriete -- lo pone xarpenLockup() en linea junto con
   el hueco, porque los dos se derivan de Ø. */
.xarpen-logo{ display:inline-flex; align-items:center; color:var(--xarpen-ink); }
.xarpen-logo__txt{ display:flex; flex-direction:column; justify-content:center; min-width:0; }
.xarpen-logo__name{ font-family:var(--sans), "Instrument Sans", system-ui, sans-serif; font-weight:600; letter-spacing:-.045em; line-height:1; }
.xarpen-logo__slogan{ font-family:var(--sans), "Instrument Sans", system-ui, sans-serif; font-weight:500; letter-spacing:.24em; text-transform:uppercase; color:var(--xarpen-ink-2); margin-top:.5em; }
/* La linea del propio estudio bajo el nombre. No es parte de la marca: por eso va en ink-2,
   con el tracking del CRM y no el del wordmark. */
.xarpen-logo__sub{ font-family:var(--sans), system-ui, sans-serif; font-size:10px; font-weight:500; letter-spacing:.12em; text-transform:uppercase; color:var(--xarpen-ink-2); margin-top:4px; line-height:1.25; overflow:hidden; text-overflow:ellipsis; }
.xarpen-logo--apilado{ flex-direction:column; text-align:center; }
.xarpen-logo--apilado .xarpen-logo__txt{ align-items:center; }
.xarpen-mark{ flex:none; display:block; }

/* Estado "procesando": gira SOLO la variante abierta, nunca la maestra. */
@keyframes xarpen-spin{ to{ transform:rotate(360deg); } }
.xarpen-mark--procesando circle:nth-child(1){ animation:xarpen-spin 6s linear infinite; transform-origin:50% 50%; }
.xarpen-mark--procesando circle:nth-child(2){ animation:xarpen-spin 4s linear infinite reverse; transform-origin:50% 50%; }
@media (prefers-reduced-motion: reduce){ .xarpen-mark--procesando circle{ animation:none; } }

/* ===== Xarpen · pulso de enfoque =====
   El parpadeo viaja del centro hacia afuera: punto, anillo de foco, medio y ruido. Es lo que
   el isotipo YA significa segun su handoff ("el desenfoque resolviendose"), puesto en el
   tiempo.

   NO se usa `filter: blur()` aunque el efecto se llame enfoque: el handoff lista los
   desenfoques (y las sombras, los degradados y rotar la maestra) entre "lo que rompe el
   sistema". El enfoque se consigue con el propio vocabulario de la marca -- opacidad y una
   escala minima -- y cada anillo vuelve EXACTAMENTE a su opacidad de especificacion (.3/.6/1),
   que es lo que hace `--op`.

   Los anillos se eligen por su radio y no por :nth-child a proposito: asi la misma regla vale
   para la maestra (4 formas) y para la compacta (3), sin contar hijos. */
/* Cada forma ARRANCA apagada y sube hasta su destello, en vez de partir de su opacidad
   final: el punto y el anillo de foco ya valen 1, asi que un pulso 1 -> 1 -> 1 no se ve y el
   parpadeo empezaba invisible justo en el centro, que es donde tiene que empezar. Medido con
   la Web Animations API antes de corregirlo. El fotograma final vuelve a `--op`, la opacidad
   de especificacion, para no dejar la marca fuera de norma cuando termina. */
@keyframes xarpen-pulso{
  0%   { opacity:calc(var(--op) * .18); transform:scale(.9); }
  45%  { opacity:1; transform:scale(1.04); }
  100% { opacity:var(--op); transform:scale(1); }
}
.xarpen-mark--enfoque circle{
  /* transform-box:fill-box hace que el origen sea el centro de CADA circulo y no el del SVG;
     sin el, la escala los desplaza en diagonal. */
  transform-box:fill-box; transform-origin:center;
  /* `backwards` y NO `both`: durante el retardo aplica el fotograma 0 (apagado, que es lo
     que hace que la onda arranque en el centro), y AL TERMINAR devuelve el mando al
     atributo `opacity` del propio SVG. Con `both` el ultimo fotograma se queda pegado, y
     si la animacion no llega a correr -- pestaña en segundo plano -- la marca se queda al
     18%, casi invisible. Asi la opacidad de especificacion vive en un solo sitio. */
  animation:xarpen-pulso .62s cubic-bezier(.22,.61,.36,1) backwards;
}
.xarpen-mark--enfoque circle[r="3"] { --op:1;  animation-delay:0ms; }
.xarpen-mark--enfoque circle[r="9"] { --op:1;  animation-delay:70ms; }
.xarpen-mark--enfoque circle[r="15"]{ --op:.6; animation-delay:140ms; }
.xarpen-mark--enfoque circle[r="21"]{ --op:.3; animation-delay:210ms; }
/* Una sola pasada por evento. Un logo latiendo sin parar en un CRM es ruido, no marca; el
   unico estado que si es continuo es "procesando", y para eso el handoff ya tiene su propia
   variante (la abierta, que gira). */
@media (prefers-reduced-motion: reduce){
  .xarpen-mark--enfoque circle{ animation:none; }
}

/* El avatar de cada respuesta del agente: el isotipo, en lugar del circulo con punto que
   habia. Se limpian el fondo y el ::after del blob viejo; el SVG hereda la tinta. */
.ava{ background:none; border:0; border-radius:0; color:var(--xarpen-ink); display:flex; align-items:center; justify-content:center; }
.ava::after{ content:none !important; }
