/* ===========================================================================
   TEMAS
   ---------------------------------------------------------------------------
   El panel tiene dos pieles: oscura (la de siempre, y la de por defecto) y
   clara. Se eligen con `data-tema` en <html>: "oscuro" | "claro" | "auto".
   Con "auto" manda el sistema operativo.

   Regla para tocar estilos aquí abajo: NUNCA se escribe un color literal.
   Todo pasa por una variable, o la piel clara se rompe en cuanto alguien
   añade una regla nueva. Las variables «semánticas» (--sombra, --overlay,
   --hover, --on-accent, --term-bg, --marcado) existen justo para eso: hay
   colores que no son simplemente «el mismo tono más claro» al cambiar de
   piel y necesitan su propio valor por tema.
   ========================================================================= */

:root, :root[data-tema="oscuro"] {
  color-scheme: dark;
  --bg: #0e1013;
  --bg2: #14171c;
  --panel: #191d24;
  --panel2: #1f242d;
  --border: #2a303c;
  --text: #e8eaf0;
  --muted: #8b93a7;
  --accent: #d97757;
  --accent-dim: #b35f43;
  --accent-hover: #e28465;
  /* texto que va ENCIMA del color de acento (botón primario) */
  --on-accent: #16100c;
  --blue: #7aa2f7;
  --ok: #4ade80;
  --err: #f87171;
  --warn: #fbbf24;
  --amarillo: #eab308;
  /* fondos derivados: se usan como realce sin inventar tonos sueltos */
  --accent-suave: rgba(217, 119, 87, .12);
  --accent-suave2: rgba(217, 119, 87, .18);
  --blue-suave: rgba(122, 162, 247, .14);
  --err-suave: rgba(248, 113, 113, .12);
  --hover: rgba(255, 255, 255, .03);
  --overlay: rgba(0, 0, 0, .55);
  --sombra: 0 12px 34px rgba(0, 0, 0, .5);
  --sombra-sm: 0 8px 30px rgba(0, 0, 0, .45);
  --sombra-arriba: 0 -8px 30px rgba(0, 0, 0, .4);
  --term-bg: #0a0c0f;
  --term-fg: #e8eaf0;
  --burbuja: #24354a;
  --burbuja-borde: #33507a;
  /* bloques de código, editores y cuadros de plan: un fondo aparte, ni el del
     panel ni el del fondo general */
  --codigo: #11141a;
  --realce: #1d2330;          /* degradado suave del fondo del login */
  --warn-fondo: #3a2d14;
  --warn-borde: #6b5518;
  --on-err: #2b0d0d;          /* texto encima del color de error */
}

:root[data-tema="claro"] {
  color-scheme: light;
  --bg: #ffffff;
  --bg2: #f5f6f8;
  --panel: #eceef2;
  --panel2: #e2e5eb;
  --border: #d3d7e0;
  --text: #1b1f27;
  --muted: #5f6878;
  --accent: #c25a36;
  --accent-dim: #a2472a;
  --accent-hover: #a2472a;
  --on-accent: #ffffff;
  --blue: #2f5fd0;
  --ok: #128a3d;
  --err: #c92f2f;
  --warn: #a16207;
  --amarillo: #a16207;
  --accent-suave: rgba(194, 90, 54, .12);
  --accent-suave2: rgba(194, 90, 54, .2);
  --blue-suave: rgba(47, 95, 208, .12);
  --err-suave: rgba(201, 47, 47, .1);
  --hover: rgba(0, 0, 0, .04);
  --overlay: rgba(20, 24, 33, .45);
  --sombra: 0 12px 34px rgba(15, 20, 30, .18);
  --sombra-sm: 0 8px 24px rgba(15, 20, 30, .14);
  --sombra-arriba: 0 -8px 24px rgba(15, 20, 30, .12);
  /* El terminal se queda oscuro también en claro: es una consola, y con fondo
     blanco los colores ANSI del propio Claude Code se vuelven ilegibles. */
  --term-bg: #0a0c0f;
  --term-fg: #e8eaf0;
  --burbuja: #dce7f7;
  --burbuja-borde: #a9c2e6;
  --codigo: #f2f3f6;
  --realce: #e9ecf3;
  --warn-fondo: #fdf3d6;
  --warn-borde: #e0c069;
  --on-err: #ffffff;
}

/* «auto»: la piel la decide el sistema. Se repite la paleta clara bajo la
   media query porque las variables no se pueden aplicar condicionalmente de
   otra forma sin JavaScript en cada repintado. */
@media (prefers-color-scheme: light) {
  :root[data-tema="auto"] {
    color-scheme: light;
    --bg: #ffffff;
    --bg2: #f5f6f8;
    --panel: #eceef2;
    --panel2: #e2e5eb;
    --border: #d3d7e0;
    --text: #1b1f27;
    --muted: #5f6878;
    --accent: #c25a36;
    --accent-dim: #a2472a;
    --accent-hover: #a2472a;
    --on-accent: #ffffff;
    --blue: #2f5fd0;
    --ok: #128a3d;
    --err: #c92f2f;
    --warn: #a16207;
    --amarillo: #a16207;
    --accent-suave: rgba(194, 90, 54, .12);
    --accent-suave2: rgba(194, 90, 54, .2);
    --blue-suave: rgba(47, 95, 208, .12);
    --err-suave: rgba(201, 47, 47, .1);
    --hover: rgba(0, 0, 0, .04);
    --overlay: rgba(20, 24, 33, .45);
    --sombra: 0 12px 34px rgba(15, 20, 30, .18);
    --sombra-sm: 0 8px 24px rgba(15, 20, 30, .14);
    --sombra-arriba: 0 -8px 24px rgba(15, 20, 30, .12);
    --burbuja: #dce7f7;
    --burbuja-borde: #a9c2e6;
    --codigo: #f2f3f6;
    --realce: #e9ecf3;
    --warn-fondo: #fdf3d6;
    --warn-borde: #e0c069;
    --on-err: #ffffff;
  }
}

:root {
  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  /* alturas de control: todo lo que convive en una fila mide lo mismo */
  --ctl-h: 38px;
  --ctl-h-sm: 30px;
  --topbar-h: 48px;
  --rail-w: 52px;
  --tabbar-h: 0px;
}

* { box-sizing: border-box; }
html, body { height: 100%; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, sans-serif;
}
.hidden { display: none !important; }
.spacer { flex: 1; }
.mono { font-family: var(--mono); }
.muted { color: var(--muted); }
.small { font-size: 12px; }
code { font-family: var(--mono); background: var(--panel2); padding: 1px 5px; border-radius: 4px; font-size: 12px; word-break: break-all; }

button { cursor: pointer; font: inherit; }
input, textarea, select {
  font: inherit;
  color: var(--text);
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px 10px;
  outline: none;
}
input:focus, textarea:focus, select:focus { border-color: var(--accent); }
textarea { resize: vertical; }
/* misma altura exacta para inputs y selects (el select medía menos) */
input:not([type=checkbox]):not([type=radio]):not([type=file]), select {
  height: var(--ctl-h);
  max-width: 100%;
}
select { padding-right: 8px; }

.primary-btn {
  background: var(--accent);
  color: var(--on-accent);
  font-weight: 600;
  border: none;
  border-radius: 8px;
  padding: 0 16px;
  min-height: var(--ctl-h);
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
.primary-btn:hover { background: var(--accent-hover); }
.primary-btn.small, .ghost-btn.small { min-height: var(--ctl-h-sm); padding: 0 12px; font-size: 13px; }
.ghost-btn {
  background: transparent;
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 0 12px;
  min-height: var(--ctl-h);
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
.ghost-btn:hover { border-color: var(--accent); color: var(--accent); }
.mini-btn {
  background: transparent;
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 6px;
  width: var(--ctl-h-sm); height: var(--ctl-h-sm);
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 14px; white-space: nowrap; line-height: 1; padding: 0;
}
/* filas que mezclan escalas: todo a la altura del control grande */
.files-toolbar > *, .res-head > button, .rt-head > button,
.gh-head > button, .ob-head > button, .ob-editor-head > button,
.field .row > button, .field .row > label, .card > .row > button,
.modal-actions > button, .res-card-head > button, .gh-pr-actions > *,
.mcp-form-actions > button, .tfa-actions > button, .ob-side-foot > * {
  min-height: var(--ctl-h);
}
.files-toolbar > .mini-btn, .res-head > .mini-btn, .rt-head > .mini-btn,
.gh-head > .mini-btn, .ob-head > .mini-btn, .ob-editor-head > .mini-btn,
.field .row > .mini-btn, .card > .row > .mini-btn, .res-card-head > .mini-btn,
.ob-side-foot > .mini-btn {
  width: var(--ctl-h); height: var(--ctl-h);
}
.mini-btn:hover { border-color: var(--accent); }
.mini-btn.danger:hover { border-color: var(--err); color: var(--err); }

/* Los ↻ del panel. Cuadrados aunque sean `ghost-btn`, para que no parezcan otra
   acción con texto, y girando mientras dura la recarga: son de red, y un botón
   que no acusa el clic se pulsa cuatro veces. */
.refrescar { flex: 0 0 auto; width: var(--ctl-h-sm); padding: 0; font-size: 15px; line-height: 1; }
.girando { animation: girar-refresco .9s linear infinite; opacity: .7; }
@keyframes girar-refresco { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .girando { animation: none; }
}

/* ---------- auth ---------- */
.auth-view {
  position: fixed; inset: 0;
  display: flex; align-items: center; justify-content: center;
  background: radial-gradient(1200px 600px at 50% -10%, var(--realce) 0%, var(--bg) 60%);
}
.auth-card {
  width: 360px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 16px;
  padding: 36px 32px;
  text-align: center;
  box-shadow: var(--sombra);
}
.auth-logo { font-size: 40px; }
.auth-card h1 { margin: 8px 0 4px; font-size: 22px; }
.auth-card h1 span { color: var(--accent); font-weight: 400; }
.auth-hint { color: var(--muted); margin: 0 0 20px; }
.auth-card form { display: flex; flex-direction: column; gap: 10px; }
.auth-card button {
  background: var(--accent); border: none; border-radius: 8px;
  padding: 10px; color: var(--on-accent); font-weight: 700;
}
.auth-error { color: var(--err); min-height: 18px; margin: 12px 0 0; font-size: 13px; }

/* ---------- layout ---------- */
.app { display: flex; flex-direction: column; height: 100vh; }
.topbar {
  height: 48px; flex: 0 0 48px;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 16px;
  background: var(--bg2);
  border-bottom: 1px solid var(--border);
}
/* La marca es un <button> para llegar al inicio con el teclado, pero no debe
   parecerlo: sin fondo, sin borde y con el mismo texto de siempre. */
.brand {
  font-size: 15px; background: none; border: 0; padding: 0;
  color: inherit; font-family: inherit; cursor: pointer;
}
.brand strong { color: var(--accent); }
/* Solo con ratón: en táctil el `:hover` se queda pegado tras el toque y la
   marca se quedaría subrayada para siempre. */
@media (hover: hover) {
  .brand:hover:not(:disabled) strong { text-decoration: underline; text-underline-offset: 3px; }
}
/* En un perfil recortado el inicio no existe: deja de ser pulsable, pero se ve
   igual (es la identidad del panel, no un control que sobre). */
.brand:disabled { cursor: default; opacity: 1; }

/* ---------- inicio (el resumen del ✴️) ---------- */
#view-inicio.active { display: block; overflow-y: auto; }
.ini-wrap { max-width: 1100px; margin: 0 auto; padding: 20px; }
.ini-head { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; }
.ini-head h2 { margin: 0; }
/* `auto-fill` y no `auto-fit`: con dos tarjetas cortas, `auto-fit` las estira a
   media pantalla cada una y el tablero queda desierto. */
.ini-grid {
  display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fill, minmax(310px, 1fr));
  align-items: start;
}
.ini-card {
  background: var(--bg2); border: 1px solid var(--border); border-radius: 12px;
  padding: 14px 16px 12px;
}
.ini-card-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.ini-card-head h3 { margin: 0; font-size: 14px; }
.ini-card-body { display: flex; flex-direction: column; gap: 2px; }
.ini-row {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; width: 100%;
  padding: 6px 8px; border-radius: 8px; font-size: 13px; text-align: left;
  background: none; border: 0; color: var(--text); font-family: inherit;
}
.ini-row.pulsable { cursor: pointer; }
.ini-row.pulsable:hover { background: var(--panel); }
.ini-marca { flex: 0 0 auto; }
/* El nombre se recorta y el detalle se queda: sin esto un título largo empuja
   la hora o el grupo fuera de la tarjeta. */
/* `min-width` en el nombre: es lo que hace que el chip de conversación baje a
   una segunda línea en vez de dejar el asunto en tres letras. */
.ini-row-txt { flex: 1 1 auto; min-width: 9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ini-row-det { flex: 0 0 auto; color: var(--muted); font-size: 12px; }
.ini-row .cal-enlace { flex: 0 0 auto; max-width: 100%; }
.ini-card-body .muted.small { padding: 4px 8px; }
.ini-uso { padding: 6px 8px 0; }

@media (max-width: 820px) {
  .ini-wrap { padding: 12px 10px 20px; }
  .ini-grid { grid-template-columns: 1fr; gap: 10px; }
  .ini-head h2 { font-size: 18px; }
  #iniCuando { display: none; }
}
.topbar-right { display: flex; align-items: center; gap: 12px; }
.conn-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--err); display: inline-block; }
.conn-dot.ok { background: var(--ok); }
.cost-badge { color: var(--muted); font-size: 12px; font-family: var(--mono); }

.body { flex: 1; display: flex; min-height: 0; }
.rail {
  width: 52px; flex: 0 0 52px;
  background: var(--bg2);
  border-right: 1px solid var(--border);
  display: flex; flex-direction: column; align-items: center;
  padding-top: 10px; gap: 6px;
}
.rail-btn {
  width: 38px; height: 38px;
  border: none; border-radius: 10px;
  background: transparent; font-size: 17px;
  opacity: .55;
}
.rail-btn:hover { background: var(--panel2); opacity: 1; }
.rail-btn.active { background: var(--panel2); opacity: 1; box-shadow: inset 0 0 0 1px var(--accent); }

.view { flex: 1; min-width: 0; display: none; }
.view.active { display: flex; }

/* ---------- chat ---------- */
#view-chat.active { display: flex; }
.chat-list {
  width: 270px; flex: 0 0 270px;
  border-right: 1px solid var(--border);
  background: var(--bg2);
  display: flex; flex-direction: column;
}
.chat-list-head {
  padding: 12px 14px;
  display: flex; align-items: center; justify-content: space-between;
  color: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: .08em;
}
.head-btns { display: flex; gap: 6px; }
.git-actions { display: inline-flex; gap: 4px; }
.repo-chips {
  display: flex; gap: 6px; flex-wrap: wrap;
  padding: 6px 14px; border-bottom: 1px solid var(--border); background: var(--bg2);
}
.repo-chip {
  display: inline-flex; align-items: center; gap: 6px;
  background: transparent; color: var(--text);
  border: 1px solid var(--border); border-radius: 20px;
  padding: 3px 10px; font-size: 12px; cursor: pointer;
}
.repo-chip:hover { border-color: var(--accent); }
.repo-chip.active { border-color: var(--accent); color: var(--accent); background: var(--panel); }
.repo-chip-branch { color: var(--muted); font-family: var(--mono); font-size: 11px; }
.session-list { overflow-y: auto; flex: 1; padding: 0 8px 12px; }
.session-item {
  padding: 9px 10px; border-radius: 8px; cursor: pointer;
  display: flex; align-items: center; gap: 8px;
  border: 1px solid transparent;
}
.session-item:hover { background: var(--panel); }
.session-item.active { background: var(--panel); border-color: var(--border); }
.session-item .title {
  flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px;
}
.session-item .gw-tag { font-size: 11px; }
.chat-list-foot {
  padding: 8px 14px; border-top: 1px solid var(--border);
  color: var(--muted); font-size: 12px;
}
.chat-list-foot label { display: flex; align-items: center; gap: 6px; cursor: pointer; }
.group-head {
  display: flex; align-items: center; gap: 6px;
  padding: 8px 8px 4px; cursor: pointer;
  color: var(--muted); font-size: 11.5px; text-transform: uppercase; letter-spacing: .06em;
}
.group-head:hover { color: var(--text); }
.group-arrow { width: 12px; }
.sess-menu-btn {
  background: transparent; border: none; color: var(--muted);
  font-size: 14px; padding: 0 2px; border-radius: 4px; display: none;
}
.session-item:hover .sess-menu-btn { display: inline-block; }
.sess-menu-btn:hover { color: var(--accent); }
.ctx-menu {
  position: fixed; z-index: 60; min-width: 180px;
  background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  box-shadow: var(--sombra); overflow: hidden;
}
.ctx-item { padding: 9px 14px; cursor: pointer; font-size: 13px; }
.ctx-item:hover { background: var(--panel2); }
.ctx-badge {
  font-size: 11.5px; font-family: var(--mono); color: var(--muted);
  border: 1px solid var(--border); border-radius: 20px; padding: 2px 9px; white-space: nowrap;
}
.ctx-badge.warn { color: var(--warn); border-color: var(--warn); }
.ctx-badge.err { color: var(--err); border-color: var(--err); }
.session-item .run-dot {
  width: 7px; height: 7px; border-radius: 50%; background: var(--accent);
  animation: pulse 1.2s infinite;
}
@keyframes pulse { 50% { opacity: .3; } }

.chat-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.chat-empty { flex: 1; display: flex; align-items: center; justify-content: center; }
.chat-empty-inner { text-align: center; max-width: 420px; color: var(--muted); }
.chat-empty-inner .big { font-size: 44px; }
.chat-empty-inner h2 { color: var(--text); }
.chat-panel { flex: 1; display: flex; flex-direction: column; min-height: 0; }
.chat-head {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px; border-bottom: 1px solid var(--border);
}
.chat-title {
  flex: 1; background: transparent; border: 1px solid transparent; font-weight: 600; font-size: 15px;
  padding: 4px 8px;
}
.chat-title:hover, .chat-title:focus { border-color: var(--border); background: var(--bg2); }
.chat-head-actions { display: flex; align-items: center; gap: 8px; }
.chat-cwd { color: var(--muted); font-size: 11px; font-family: var(--mono); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.messages { flex: 1; overflow-y: auto; padding: 18px 20px; }
.msg { max-width: 880px; margin: 0 auto 14px; }
.msg-user {
  background: var(--burbuja);
  border: 1px solid var(--burbuja-borde);
  border-radius: 12px 12px 4px 12px;
  padding: 10px 14px;
  margin-left: 15%;
  white-space: pre-wrap;
  word-break: break-word;
}
.msg-assistant { line-height: 1.6; }
.msg-assistant .md > :first-child { margin-top: 0; }
.msg-assistant .md > :last-child { margin-bottom: 0; }
.msg-assistant pre {
  background: var(--codigo); border: 1px solid var(--border); border-radius: 8px;
  padding: 10px 12px; overflow-x: auto; font-size: 13px; font-family: var(--mono);
}
.msg-assistant code { font-size: 13px; }
.msg-assistant p code, .msg-assistant li code { background: var(--panel2); }
.msg-assistant.sub { opacity: .65; padding-left: 18px; border-left: 2px solid var(--border); }
.msg-live { color: var(--text); opacity: .9; }
.msg-live::after { content: '▍'; color: var(--accent); animation: pulse 1s infinite; }

.tool-chip {
  border: 1px solid var(--border); border-radius: 8px; background: var(--panel);
  margin: 6px 0; max-width: 880px; font-size: 13px;
}
.tool-chip summary {
  cursor: pointer; padding: 7px 10px; list-style: none;
  display: flex; align-items: center; gap: 8px; color: var(--muted);
}
.tool-chip summary::-webkit-details-marker { display: none; }
.tool-chip .tool-name { color: var(--blue); font-family: var(--mono); font-weight: 600; }
.tool-chip .tool-hint { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; font-family: var(--mono); font-size: 12px; }
.tool-chip pre {
  margin: 0; padding: 8px 10px; border-top: 1px solid var(--border);
  font-family: var(--mono); font-size: 12px; white-space: pre-wrap; word-break: break-word;
  max-height: 300px; overflow-y: auto; color: var(--muted);
}
.tool-chip.error .tool-name { color: var(--err); }
.thinking-chip summary { color: var(--muted); font-style: italic; }

.result-line {
  color: var(--muted); font-size: 12px; font-family: var(--mono);
  border-top: 1px dashed var(--border); padding-top: 6px; margin: 10px auto 18px; max-width: 880px;
}
.result-line.error { color: var(--err); }
.notice-line { color: var(--warn); font-size: 12.5px; text-align: center; margin: 10px 0; }
/* Aviso de la conversación importada a la que le falta el principio. Va en
   caja y con el botón en su propia línea: suelto dentro del párrafo partía la
   última frase por la mitad y no parecía pulsable. */
.historial-corte {
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  max-width: 880px; margin: 10px auto 16px; padding: 10px 14px;
  border: 1px dashed var(--border); border-radius: 10px;
}
.historial-corte button { flex: 0 0 auto; }
.error-line { color: var(--err); font-size: 13px; margin: 10px auto; max-width: 880px; white-space: pre-wrap; }

.composer { border-top: 1px solid var(--border); padding: 10px 14px 12px; background: var(--bg2); }
.perm-bar {
  background: var(--warn-fondo); border: 1px solid var(--warn-borde); color: var(--warn);
  border-radius: 8px; padding: 8px 12px; margin-bottom: 8px; font-size: 13px;
}
/* ---- el compositor y el ancho que le toque ----
   La fila lleva hasta siete controles (📎 🎤 🔍 📱 🏛 ⚙ ➤) alrededor de la caja
   de texto, y esa caja era la única que encogía: en el móvil se quedaba en unos
   30 px y escribir «hola» pintaba una letra por línea, en vertical.
   `flex-wrap` + una base con mínimo lo arreglan en TODOS los anchos, y no solo
   en el del móvil, porque el compositor también vive prestado en la columna de
   chat del correo, del calendario y de WhatsApp, que es estrecha por diseño.
   Cuando la caja no cabe con los botones, la fila se parte y cada cosa se ve
   entera. */
.composer-row {
  display: flex; flex-wrap: wrap; gap: 8px; row-gap: 8px; align-items: flex-end;
  max-width: 920px; margin: 0 auto; position: relative;
}
/* ---------- barra de rama del compositor ----------
   Réplica de la barra que Claude Code web pone encima de la caja de escribir:
   de un vistazo, en qué repo y en qué rama está trabajando la conversación,
   cuánto lleva cambiado y el botón para abrir el PR.

   Va DENTRO de `.composer` y por encima de `#attachChips`, así que comparte el
   mismo ancho que la caja de texto (`max-width: 920px`) y sube y baja con el
   compositor cuando se pliega la botonera en el móvil. */
.branch-bar {
  position: relative;
  display: flex; align-items: center; gap: 8px;
  max-width: 920px; margin: 0 auto 8px;
  background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  padding: 6px 8px 6px 12px; font-size: 12.5px;
  min-width: 0;
}
.branch-bar .spacer { flex: 1 1 auto; min-width: 0; }
.branch-bar-repo, .branch-bar-name {
  background: transparent; border: 0; padding: 0; cursor: pointer;
  color: var(--text); font-size: 12.5px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  max-width: 40%;
}
.branch-bar-repo { font-weight: 600; flex: 0 1 auto; }
.branch-bar-name { color: var(--muted); font-size: 12px; flex: 0 1 auto; }
.branch-bar-repo:hover, .branch-bar-name:hover { color: var(--accent); }
.branch-bar-stat {
  font-family: var(--mono); font-size: 11.5px; white-space: nowrap;
  background: var(--panel2); border-radius: 6px; padding: 2px 7px; flex: 0 0 auto;
}
.branch-bar-stat .mas { color: var(--ok); }
.branch-bar-stat .menos { color: var(--err); }
.branch-bar-state {
  font-size: 11.5px; white-space: nowrap; color: var(--muted); flex: 0 0 auto;
}
.branch-bar-state.aviso { color: var(--warn); }
.branch-bar-cta { display: inline-flex; align-items: stretch; flex: 0 0 auto; }
/* El ⌄ es la mitad derecha del mismo botón: se pegan quitando el borde de en
   medio y redondeando solo por fuera, como en la captura. */
.branch-bar-cta > .ghost-btn:first-child {
  border-top-right-radius: 0; border-bottom-right-radius: 0;
}
.branch-bar-more {
  border-top-left-radius: 0; border-bottom-left-radius: 0; border-left: 0;
  padding-left: 7px; padding-right: 7px;
}
/* `.branch-bar-menu` y `.ac-menu` tienen la MISMA especificidad y `.ac-menu`
   está definida más abajo, así que ganaba ella y el menú se pegaba al borde
   izquierdo. Con `.branch-bar` delante hay una clase más y cae del lado del ⌄,
   que es donde se pulsa. */
.branch-bar .branch-bar-menu {
  left: auto; right: 0; min-width: 250px; max-width: min(340px, 90vw);
}
/* La insignia 🌿 de la cabecera devuelve la barra si se cerró con la ✕. */
#gitBadge { cursor: pointer; }

@media (max-width: 820px) {
  /* En el móvil la barra se parte en dos líneas antes que exprimir el nombre de
     la rama hasta lo ilegible: la identidad (repo · rama · ±) arriba y los
     botones abajo. Y se pliega con la botonera, como el resto del compositor. */
  .branch-bar { flex-wrap: wrap; row-gap: 6px; padding: 6px 8px; }
  .branch-bar-repo, .branch-bar-name { max-width: 100%; }
  .branch-bar .spacer { flex-basis: 100%; height: 0; }
  .branch-bar-cta { flex: 1 1 auto; }
  .branch-bar-cta > .ghost-btn:first-child { flex: 1 1 auto; }
  body.botonera-plegada #branchBar { display: none !important; }
}

.ac-menu {
  position: absolute; bottom: calc(100% + 6px); left: 0; right: 54px;
  background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  max-height: 260px; overflow-y: auto; z-index: 20;
  box-shadow: var(--sombra-arriba);
}
.ac-item {
  padding: 7px 12px; cursor: pointer; display: flex; gap: 10px; align-items: baseline;
  font-size: 13px;
}
.ac-item.sel, .ac-item:hover { background: var(--panel2); }
.ac-item .ac-label { font-family: var(--mono); color: var(--text); }
.ac-item.sel .ac-label { color: var(--accent); }
.ac-item .ac-hint { color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#composerInput {
  /* `min-width` es lo que fuerza el salto de línea en vez de la caja de una
     letra: un flex item sin mínimo encoge hasta desaparecer. */
  flex: 1 1 200px; min-width: 150px;
  min-height: 40px; max-height: 200px; overflow-y: auto;
  border-radius: 10px;
}
.send-btn, .stop-btn {
  height: 40px; width: 46px; border-radius: 10px; border: none; font-size: 16px;
  background: var(--accent); color: var(--on-accent);
}
.stop-btn { background: var(--err); color: var(--on-err); }
/* Enviar mientras el agente trabaja: el mensaje no sale ahora, espera turno.
   Se marca en el propio botón para que no parezca que se ha perdido. */
.send-btn.queued { background: transparent; color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
.composer-opts {
  display: flex; gap: 14px; align-items: center; max-width: 920px; margin: 8px auto 0;
  color: var(--muted); font-size: 12px; flex-wrap: wrap;
}
.composer-opts label { display: flex; align-items: center; gap: 6px; }
.composer-opts label.grow { flex: 1; min-width: 180px; }
.composer-opts select, .composer-opts input {
  padding: 0 8px; font-size: 12px; border-radius: 6px; height: var(--ctl-h-sm);
}
.composer-opts input { flex: 1; font-family: var(--mono); }

/* ---------- archivos ---------- */
#view-files.active { display: flex; flex-direction: column; }
.files-toolbar {
  display: flex; gap: 8px; align-items: center;
  padding: 10px 14px; border-bottom: 1px solid var(--border); background: var(--bg2);
}
.fs-path { flex: 3; font-family: var(--mono); font-size: 13px; }
.upload-label { position: relative; overflow: hidden; }
.fs-list { flex: 1; overflow-y: auto; padding: 8px 14px; }
.fs-row {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 10px; border-radius: 8px; cursor: pointer;
}
.fs-row:hover { background: var(--panel); }
.fs-row .icon { width: 20px; text-align: center; }
.fs-row .name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fs-row .meta { color: var(--muted); font-size: 12px; font-family: var(--mono); }
.fs-row .actions { display: none; gap: 6px; }
.fs-row:hover .actions { display: flex; }
.fs-editor { position: absolute; inset: 48px 0 0 52px; background: var(--bg); display: flex; flex-direction: column; z-index: 5; }
.fs-editor-head {
  display: flex; gap: 8px; align-items: center; padding: 10px 14px;
  border-bottom: 1px solid var(--border); background: var(--bg2);
  font-family: var(--mono); font-size: 13px;
}
#fsEditorText { flex: 1; border: none; border-radius: 0; background: var(--codigo); font-family: var(--mono); font-size: 13px; padding: 14px; }

/* ---------- terminal ---------- */
#view-term.active { display: flex; flex-direction: column; }
.term-toolbar {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px; border-bottom: 1px solid var(--border); background: var(--bg2);
}
.term-tabs { display: flex; gap: 6px; flex: 1; overflow-x: auto; }
#termEnvWrap {
  display: flex; align-items: center; gap: 6px;
  font-size: 12px; color: var(--muted); white-space: nowrap;
}
#termEnvWrap select { max-width: 180px; }
.term-tab {
  display: flex; align-items: center; gap: 8px;
  border: 1px solid var(--border); border-radius: 8px;
  padding: 5px 10px; font-size: 13px; cursor: pointer; white-space: nowrap;
  background: transparent; color: var(--text);
}
.term-tab.active { border-color: var(--accent); color: var(--accent); }
.term-tab .close { opacity: .6; }
.term-tab .close:hover { opacity: 1; color: var(--err); }
.term-host { flex: 1; position: relative; background: var(--term-bg); min-height: 0; }
.term-instance { position: absolute; inset: 8px; }
/* El fondo de la terminal es oscuro en los dos temas, así que su cartel no
   puede usar el gris del tema claro: no se leería. */
.term-empty {
  position: absolute; inset: 0; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 14px; text-align: center;
  color: #8b93a7;
}
.term-empty code { background: #1f242d; color: #e8eaf0; }

/* ---------- recursos ---------- */
#view-res.active { display: block; overflow-y: auto; }
.res-wrap { max-width: 900px; margin: 0 auto; padding: 20px; }
.res-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.res-tabs { display: flex; gap: 6px; }
.res-tab {
  background: transparent; color: var(--text);
  border: 1px solid var(--border); border-radius: 8px; padding: 0 14px; font-size: 13px;
  min-height: var(--ctl-h); display: inline-flex; align-items: center;
}
.res-tab.active { border-color: var(--accent); color: var(--accent); background: var(--panel); }
.res-hint { margin: 12px 2px; }
.res-body { display: flex; flex-direction: column; gap: 10px; }
.res-card {
  background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  padding: 12px 14px;
}
.res-card.clickable { cursor: pointer; }
.res-card.clickable:hover { border-color: var(--accent); }
.res-card-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.res-badge {
  font-size: 11px; border: 1px solid var(--border); border-radius: 20px;
  padding: 1px 9px; color: var(--muted);
}
.res-badge.ok { color: var(--ok); border-color: var(--ok); }
.res-badge.warn { color: var(--warn); border-color: var(--warn); }
.res-desc { color: var(--muted); font-size: 13px; margin-top: 5px; }
.res-path { color: var(--muted); opacity: .7; font-size: 11px; margin-top: 6px; }
.res-empty { color: var(--muted); padding: 30px 0; text-align: center; }

/* ---------- skills (propuestas del agente y gestión) ---------- */
.res-tab.has-pending { border-color: var(--warn); color: var(--warn); }
.res-badge.auto { color: var(--accent); border-color: var(--accent); }
.skill-section {
  margin: 18px 2px 2px; font-size: 13px; color: var(--muted);
  text-transform: uppercase; letter-spacing: .06em; font-weight: 600;
}
.skill-section:first-child { margin-top: 4px; }
.skill-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.skill-badges { display: inline-flex; gap: 6px; flex-wrap: wrap; vertical-align: middle; }
.res-card.skill-card { border-left: 3px solid transparent; }
.res-card.skill-card:has(.res-badge.warn) { border-left-color: var(--warn); }
/* las descripciones de las skills integradas son larguísimas: se recortan */
.skill-card .res-desc {
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden;
}
.check-label {
  display: inline-flex; align-items: center; gap: 8px;
  color: var(--text) !important; cursor: pointer;
}
.check-label input { width: auto; margin: 0; }
.env-skills {
  display: flex; flex-wrap: wrap; gap: 6px 14px;
  max-height: 170px; overflow-y: auto;
  border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px;
}
.env-skills .check-label { font-size: 12px; }

/* ---------- panel Outlook (Microsoft 365) ---------- */
#view-mail.active { display: flex; }
.ml-side {
  flex: 0 0 var(--ml-side-w, 230px); width: var(--ml-side-w, 230px); min-width: 0;
  background: var(--bg2);
  display: flex; flex-direction: column;
}
.ml-account { margin: 6px 8px; max-width: calc(100% - 16px); }

/* Divisor arrastrable. Se pinta fino pero se agarra ancho: 1px de línea es
   imposible de coger con el ratón. */
.ml-sep {
  flex: 0 0 5px; cursor: col-resize; position: relative;
  background: var(--border); background-clip: content-box;
  border-left: 2px solid transparent; border-right: 2px solid transparent;
}
.ml-sep:hover, .ml-sep.arrastrando { background-color: var(--accent); }
body.ml-resizing { cursor: col-resize; user-select: none; }

/* Árbol de carpetas: filas compactas de una línea, al estilo de Outlook. NO se
   reutiliza .session-item, que es la tarjeta de una conversación y aquí queda
   enorme. */
.ml-folders { flex: 1; overflow-y: auto; padding: 0 6px 12px; }
.ml-folder {
  display: flex; align-items: center; gap: 6px;
  padding: 3px 6px; min-height: 26px; font-size: 12.5px;
  border-radius: 4px; cursor: pointer; color: var(--text);
}
.ml-folder:hover { background: var(--panel); }
.ml-folder.active { background: var(--panel); color: var(--accent); }
.ml-folder.drop-target { background: var(--accent-suave2); outline: 1px dashed var(--accent); }
.ml-folder-tw {
  flex: 0 0 13px; width: 13px; text-align: center;
  color: var(--muted); font-size: 9px; line-height: 1;
}
.ml-folder-nombre { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Cabecera de la cuenta a la que pertenecen las unidades de debajo. Solo sale
   con «Todas las cuentas»: sin ella, dos «Mi unidad» seguidas no se distinguen. */
.ml-grupo-cuenta {
  padding: 8px 6px 2px; font-size: 10.5px; font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ml-folder.unread .ml-folder-nombre { font-weight: 600; }
.ml-folder-n { flex: 0 0 auto; color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
.ml-folder-menu {
  flex: 0 0 auto; background: none; border: 0; color: var(--muted);
  font-size: 13px; padding: 0 2px; border-radius: 3px; display: none;
}
.ml-folder:hover .ml-folder-menu { display: block; }
.ml-folder-menu:hover { color: var(--accent); }

/* Barra de selección múltiple */
.ml-selbar {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  padding: 7px 12px; border-bottom: 1px solid var(--border); background: var(--panel);
}
.ml-selbar .ghost-btn[disabled] { opacity: .4; pointer-events: none; }
.ml-item-check { flex: 0 0 auto; margin-right: 2px; }
.ml-item.picked { background: var(--accent-suave); }
.ml-item.dragging { opacity: .45; }

/* Panel del chat, a la derecha del lector */
.ml-chat {
  flex: 0 0 var(--ml-chat-w, 380px); width: var(--ml-chat-w, 380px);
  min-width: 0; display: flex; flex-direction: column; overflow: hidden;
}
.ml-chat > .chat-main { flex: 1; min-width: 0; min-height: 0; }
.ml-chat-head {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 10px; border-bottom: 1px solid var(--border);
  background: var(--bg2); font-size: 12px; color: var(--muted); flex: 0 0 auto;
}
.ml-linked {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 6px 10px; margin-bottom: 10px; border-radius: 6px;
  background: var(--panel); font-size: 12px;
}
.ml-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.ml-head {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 12px; border-bottom: 1px solid var(--border);
}
.ml-head input[type="search"] { flex: 1; min-width: 120px; }
.ml-filters {
  display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
  padding: 10px 12px; border-bottom: 1px solid var(--border); background: var(--bg2);
}
.ml-filters label { font-size: 12px; display: flex; gap: 5px; align-items: center; }
.ml-filters input[type="text"], .ml-filters input[type="date"] { width: 130px; }
.ml-check { white-space: nowrap; }
/* `relative` para que el detalle flotante del calendario (y las columnas del
   móvil) se posicionen contra el área de paneles y no contra la ventana. */
.ml-panes { flex: 1; min-height: 0; display: flex; position: relative; }
.ml-list {
  flex: 0 0 var(--ml-list-w, 330px); width: var(--ml-list-w, 330px);
  min-width: 0; overflow-y: auto;
}
.ml-loadmore { padding: 10px; text-align: center; }
/* Pestañas de la vista de Microsoft 365: se reutiliza `.res-tab` tal cual. */
.m365-tabs { padding: 8px 12px; border-bottom: 1px solid var(--border); align-items: center; }
.m365-body { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.m365-body.hidden { display: none; }
/* Sin panel de chat, la lista puede respirar más. */
.ml-list-ancha { flex: 0 0 var(--ml-list-w, 330px); }
.ml-file-icon { flex: 0 0 auto; }
/* Autocompletado de destinatarios. Reutiliza `.ac-menu`, pero aquella está
   posicionada para el compositor del chat (se abre HACIA ARRIBA y anclada a su
   fila); dentro del modal hay que anclarla aquí y abrirla hacia abajo, o se
   pinta fuera de la pantalla. */
/* Menú de origen del 📎. Se ancla al compositor y se abre hacia arriba, como
   el autocompletado de `@`. */
.attach-menu { left: 8px; right: auto; min-width: 220px; }
.mc-dest { position: relative; }
.mc-dest .ac-menu {
  top: calc(100% + 4px); bottom: auto; left: 0; right: 0;
  box-shadow: var(--sombra-sm);
}
#mcCuerpo { width: 100%; font-family: inherit; font-size: 13px; line-height: 1.5; resize: vertical; }
.ml-area-falta { color: var(--warn); }

/* ---- vistas del calendario ---- */
.cal-ancho { flex: 1 1 auto !important; width: auto !important; }
.cal-card {
  background: var(--panel); border: 1px solid var(--border); border-left: 3px solid var(--accent);
  border-radius: 6px; padding: 5px 8px; margin-bottom: 6px; cursor: pointer; font-size: 12px;
}
.cal-card:hover { background: var(--panel2); }
.cal-card.cancelada { opacity: .55; text-decoration: line-through; }
.cal-card.dragging { opacity: .45; }
.cal-card-hora { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
.cal-card-asunto { font-weight: 500; }
.cal-card-meta { color: var(--muted); font-size: 11px; }
/* ---- vínculo cita ↔ conversación ----
   La cita adjuntada a una conversación lo dice desde el calendario y lleva a
   ella de un clic. En la lista y en las tarjetas va compacto (💬 + nombre);
   en el detalle, con su etiqueta delante. El nombre se recorta: hay
   conversaciones que se llaman como una frase entera. */
.cal-enlaces {
  display: flex; flex-wrap: wrap; gap: 4px 6px; align-items: center;
  margin-top: 4px; min-width: 0;
}
.cal-enlaces.compacto { gap: 3px 4px; margin-top: 3px; }
.cal-enlaces-et { color: var(--muted); font-size: 12px; }
.cal-enlace {
  display: inline-flex; align-items: center; max-width: 100%;
  background: var(--accent-suave); color: var(--accent);
  border: 1px solid var(--accent-dim); border-radius: 999px;
  padding: 1px 9px; font-size: 11px; line-height: 17px; cursor: pointer;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cal-enlace:hover { border-color: var(--accent); background: var(--panel2); }
/* En el detalle la fila tiene su propio hueco (se repinta sola al adjuntar). */
.cal-enlaces-hueco:not(:empty) { margin: 0 0 10px; }
.cal-enlaces-hueco .cal-enlace { font-size: 12px; line-height: 20px; padding: 2px 10px; }
@media (pointer: coarse) {
  /* Con el dedo, un chip de 17 px no se acierta sin abrir la reunión por error. */
  .cal-enlace { line-height: 24px; padding: 2px 11px; font-size: 12px; }
}

.cal-col-head {
  padding: 6px 8px; font-size: 12px; color: var(--muted);
  border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; gap: 6px;
}
.drop-target { background: var(--accent-suave); outline: 1px dashed var(--accent); }
/* Soltar ficheros DEL ORDENADOR en el explorador de la nube. Se marca el
   contenedor entero —no una fila— porque el destino es la carpeta abierta. */
.ml-list.drop-target { outline: 2px dashed var(--accent); outline-offset: -6px; background: var(--accent-suave); }

/* Kanban: una columna por día */
.cal-kanban { display: flex; gap: 8px; padding: 10px; overflow-x: auto; height: 100%; align-items: flex-start; }
.cal-col { flex: 0 0 200px; background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; }
.cal-col-body { padding: 8px; min-height: 120px; max-height: calc(100vh - 260px); overflow-y: auto; }

/* Semana: rejilla horaria */
.cal-semana { display: flex; overflow: auto; height: 100%; padding-bottom: 10px; }
.cal-horas { flex: 0 0 54px; }
.cal-hora { position: relative; border-top: 1px solid var(--border); font-size: 10px; color: var(--muted); padding-left: 4px; }
.cal-dia { flex: 1 1 0; min-width: 110px; border-left: 1px solid var(--border); }
.cal-lienzo { position: relative; }
.cal-linea { position: absolute; left: 0; right: 0; border-top: 1px solid var(--border); opacity: .5; }
.cal-card-abs { position: absolute; left: 3px; right: 3px; margin: 0; overflow: hidden; }
/* En Semana la tarjeta mide lo que DURA la reunión: media hora son unos pocos
   píxeles y el chip de la conversación taparía el asunto. Ahí el vínculo se ve
   al abrirla; en Agenda y Kanban, que no van por altura, sí se pinta. */
.cal-card-abs .cal-enlaces { display: none; }

/* Mes */
/* `minmax(0, 1fr)` y no `1fr`: con `1fr` el mínimo es el contenido, y un
   asunto largo sin partir ensanchaba la columna hasta descuadrar el mes
   entero (en el móvil se salía de la pantalla). */
.cal-mes { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 1px; background: var(--border); height: 100%; overflow-y: auto; }
.cal-mes > .cal-col-head { background: var(--bg2); border-bottom: 0; justify-content: center; }
.cal-celda { background: var(--bg); min-height: 92px; padding: 4px; font-size: 11px; }
.cal-celda.fuera { opacity: .4; }
.cal-celda-num { color: var(--muted); font-size: 11px; margin-bottom: 2px; }
.cal-mini {
  background: var(--panel); border-left: 2px solid var(--accent); border-radius: 3px;
  padding: 2px 4px; margin-bottom: 2px; cursor: pointer;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cal-mini.cancelada { opacity: .55; text-decoration: line-through; }
.ml-nueva { margin-top: 6px; }
.ml-nueva summary { cursor: pointer; color: var(--accent); font-size: 13px; margin-bottom: 8px; }
.ml-imgaviso {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 10px; margin-bottom: 10px; border-radius: 6px;
  background: var(--panel); font-size: 12px; color: var(--muted);
}
.ml-item {
  padding: 9px 12px; border-bottom: 1px solid var(--border);
  cursor: pointer; font-size: 13px;
}
.ml-item:hover { background: var(--bg2); }
.ml-item.active { background: var(--bg2); border-left: 3px solid var(--accent); }
.ml-item.unread .ml-subject { font-weight: 600; }
.ml-item-top { display: flex; justify-content: space-between; gap: 8px; }
.ml-from { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ml-date { color: var(--muted); font-size: 11px; flex: 0 0 auto; }
.ml-subject { margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ml-preview { color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ml-reader { flex: 1; min-width: 0; overflow-y: auto; padding: 16px 20px 40px; }
.ml-read-subject { margin: 0 0 8px; font-size: 17px; }
.ml-read-meta { color: var(--muted); font-size: 12px; margin-bottom: 10px; }
.ml-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
.ml-attachments { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.ml-attachment {
  font-size: 12px; padding: 3px 8px; border: 1px solid var(--border);
  border-radius: 6px; text-decoration: none;
}
/* Transcripción de una nota de voz adjunta. Ocupa la fila entera porque es
   texto para leer, no una pastilla más entre los adjuntos. */
.ml-transcripcion {
  flex: 1 0 100%; margin-top: 6px; padding: 8px 10px;
  border-left: 3px solid var(--accent); background: var(--panel);
  border-radius: 0 6px 6px 0; font-size: 13px; white-space: pre-wrap;
}
/* El cuerpo viene de fuera: se acota para que un correo con estilos raros no
   descuadre el panel entero. */
.ml-body {
  border-top: 1px solid var(--border); padding-top: 12px;
  font-size: 14px; line-height: 1.5; overflow-x: auto; max-width: 100%;
}
.ml-body img, .ml-body table { max-width: 100%; height: auto; }
.ml-modal-row { display: flex; gap: 8px; align-items: center; margin-bottom: 10px; }
.ml-modal-row input[type="search"] { flex: 1; }
.ml-modal-results { max-height: 46vh; overflow-y: auto; border: 1px solid var(--border); border-radius: 8px; }
.ml-pick {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 8px 10px; border-bottom: 1px solid var(--border); cursor: pointer;
}
.ml-pick:last-child { border-bottom: 0; }
.ml-pick:hover { background: var(--bg2); }
.ml-pick-txt { flex: 1; min-width: 0; }
/* Barra de vuelta del móvil (una por pestaña de Microsoft 365). En escritorio
   no existe: allí las columnas se ven a la vez y no hay dónde «volver». */
.m365-nav { display: none; }

/* Pantallas intermedias (tablet en horizontal, ventanas a media pantalla):
   siguen siendo cuatro columnas, pero más estrechas de salida o no cabe el
   lector. Los divisores siguen funcionando y el ancho elegido a mano manda. */
@media (min-width: 821px) and (max-width: 1180px) {
  .ml-side { flex-basis: var(--ml-side-w, 180px); width: var(--ml-side-w, 180px); }
  .ml-list { flex-basis: var(--ml-list-w, 260px); width: var(--ml-list-w, 260px); }
  .ml-chat { flex-basis: var(--ml-chat-w, 320px); width: var(--ml-chat-w, 320px); }
  .ml-reader { padding: 14px 14px 40px; }
}

/* Borrador de correo en el chat */
.mail-draft {
  border: 1px solid var(--border); border-left: 3px solid var(--accent);
  border-radius: 8px; padding: 10px 12px; margin: 8px 0; background: var(--bg2);
}
.mail-draft-head { font-size: 12px; color: var(--muted); }
.mail-draft-meta { font-size: 12px; color: var(--muted); margin-top: 2px; }
.mail-draft-subject { font-weight: 600; margin: 6px 0; }
.mail-draft-body {
  white-space: pre-wrap; font-family: inherit; font-size: 13px;
  max-height: 240px; overflow-y: auto; margin: 0 0 8px;
}
.mail-draft-actions { display: flex; gap: 6px; }

/* ---------- panel GitHub ---------- */
#view-github.active { display: flex; }
.gh-repolist {
  width: 250px; flex: 0 0 250px;
  border-right: 1px solid var(--border); background: var(--bg2);
  display: flex; flex-direction: column;
}
.gh-detail { flex: 1; min-width: 0; display: flex; flex-direction: column; overflow-y: auto; position: relative; }
.gh-panel { padding: 16px 20px 40px; }
.gh-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.gh-head h2 { margin: 0; font-size: 18px; }
.gh-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 12px; }
@media (max-width: 1000px) { .gh-grid { grid-template-columns: 1fr; } }
.gh-out {
  background: var(--codigo); border: 1px solid var(--border); border-radius: 8px;
  padding: 8px 12px; font-family: var(--mono); font-size: 12px; white-space: pre-wrap;
  max-height: 140px; overflow-y: auto; margin-bottom: 8px; color: var(--ok);
}
.gh-out.err { color: var(--err); }
.gh-files { max-height: 220px; overflow-y: auto; font-size: 12.5px; }
.gh-file { display: flex; gap: 10px; padding: 2px 0; }
.gh-file-status { color: var(--warn); width: 24px; flex: 0 0 24px; }
.gh-branches { max-height: 240px; overflow-y: auto; margin-top: 8px; }
.gh-branch {
  display: flex; align-items: center; justify-content: space-between;
  padding: 4px 6px; border-radius: 6px; font-size: 13px;
}
.gh-branch:hover { background: var(--panel2); }
.gh-branch.current { color: var(--accent); }
.gh-branch-actions { display: flex; gap: 4px; }
.gh-commits { max-height: 240px; overflow-y: auto; font-size: 12.5px; }
.gh-commit { display: flex; gap: 8px; padding: 3px 0; align-items: baseline; flex-wrap: wrap; }
.gh-commit-hash { color: var(--blue); flex: 0 0 60px; }
.gh-commit-subject { flex: 1; min-width: 200px; }
.gh-pr {
  border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; margin-bottom: 8px;
}
.gh-pr-head a { color: var(--blue); text-decoration: none; font-weight: 600; }
.gh-pr-head a:hover { text-decoration: underline; }
.gh-pr-actions { display: flex; gap: 8px; margin-top: 8px; align-items: center; }
.gh-pr-actions select { padding: 4px 8px; font-size: 12px; }
.danger-text { color: var(--err); border-color: var(--err); }

/* ---- panel GitHub: información y control ampliados ---- */

/* Cinta de datos de un vistazo bajo la cabecera del repo. Se envuelve sola, así
   que en el móvil se apila en vez de salirse. */
.gh-stats {
  display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px;
}
.gh-stat {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--panel2); border-radius: 6px; padding: 3px 9px;
  font-size: 12px; white-space: nowrap;
}
.gh-stat b { font-weight: 600; }
.gh-stat.aviso { color: var(--warn); }
.gh-stat.mal { color: var(--err); }
.gh-stat.bien { color: var(--ok); }

/* Las cabeceras de tarjeta del panel de GitHub llevan controles a la derecha
   (un select, un botón) y usan `.spacer` para empujarlos. Eso solo funciona si
   el h3 es flex, y se hace SOLO aquí: `.card h3` a secas lo comparten media
   docena de vistas y cambiarlo para todas sería tocar lo que ya está bien. */
.gh-panel .card h3 { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; row-gap: 6px; }
/* Los botones de la cabecera llevan emoji + palabra: sin esto, «🔄 Al día» se
   parte en dos renglones y descuadra la fila entera. */
.gh-head > button { white-space: nowrap; }
.gh-mini-select { padding: 3px 6px; font-size: 12px; }
.gh-check { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); }

/* Un fichero cambiado es pulsable (abre su diff) y lleva su propia papelera. */
.gh-file { cursor: pointer; border-radius: 6px; padding: 2px 6px; align-items: center; }
.gh-file:hover { background: var(--panel2); }
.gh-file .gh-file-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gh-file .mini-btn { visibility: hidden; }
.gh-file:hover .mini-btn { visibility: visible; }
/* En pantalla táctil no hay «hover»: el botón se queda escondido para siempre. */
@media (pointer: coarse) { .gh-file .mini-btn { visibility: visible; } }

.gh-commit { cursor: pointer; border-radius: 6px; padding: 3px 6px; }
.gh-commit:hover { background: var(--panel2); }

/* Detalle desplegable de un PR: checks, revisiones y tamaño. */
.gh-pr-extra { margin-top: 8px; border-top: 1px solid var(--border); padding-top: 8px; font-size: 12.5px; }
.gh-pr-body {
  white-space: pre-wrap; color: var(--muted); font-size: 12.5px;
  max-height: 160px; overflow-y: auto; margin: 6px 0;
}
.gh-checks { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.gh-check-chip {
  display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px;
  border: 1px solid var(--border); border-radius: 20px; padding: 2px 9px;
  text-decoration: none; color: var(--text); max-width: 100%;
}
.gh-check-chip span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gh-check-chip.ok { border-color: var(--ok); color: var(--ok); }
.gh-check-chip.mal { border-color: var(--err); color: var(--err); }
.gh-check-chip.curso { border-color: var(--warn); color: var(--warn); }

.gh-runs { max-height: 300px; overflow-y: auto; }
.gh-run {
  display: flex; align-items: center; gap: 8px; padding: 5px 6px;
  border-radius: 6px; font-size: 12.5px;
}
.gh-run:hover { background: var(--panel2); }
.gh-run-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gh-run a { color: var(--blue); text-decoration: none; }
.gh-run a:hover { text-decoration: underline; }

/* El diff se lee en monoespaciada y con las líneas enteras: nada de partirlas,
   que en un parche cambia lo que se está leyendo. Se desliza en horizontal. */
.gh-diff {
  background: var(--codigo); border: 1px solid var(--border); border-radius: 8px;
  padding: 10px 12px; font-size: 12px; line-height: 1.45;
  max-height: 60vh; overflow: auto; white-space: pre; margin: 8px 0 0;
}
.gh-diff .mas { color: var(--ok); }
.gh-diff .menos { color: var(--err); }
.gh-diff .cabecera { color: var(--blue); }
.gh-diff .trozo { color: var(--muted); }

@media (max-width: 820px) {
  .gh-stats { gap: 5px; }
  .gh-diff { font-size: 11.5px; max-height: 52vh; }
}

/* ---------- cola de mensajes (escribir mientras el agente piensa) ---------- */
.queue-bar {
  display: flex; flex-direction: column; gap: 4px;
  max-width: 920px; margin: 0 auto 8px;
}
.queue-head {
  display: flex; align-items: center; gap: 8px;
  font-size: 12px; color: var(--muted);
}
.queue-item {
  display: flex; align-items: center; gap: 8px;
  border: 1px dashed var(--border); border-radius: 10px; background: var(--panel);
  padding: 4px 10px; font-size: 12.5px;
}
/* El texto pendiente no puede empujar el compositor: una línea y elipsis. */
.queue-item .queue-text {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--text);
}
.queue-item .queue-origen { color: var(--muted); font-size: 11px; }

/* ---------- adjuntos del chat ---------- */
.attach-chips {
  display: flex; gap: 6px; flex-wrap: wrap;
  max-width: 920px; margin: 0 auto 8px;
}
.attach-chip {
  display: inline-flex; align-items: center; gap: 6px;
  border: 1px solid var(--border); border-radius: 20px; background: var(--panel);
  padding: 3px 10px; font-size: 12px;
}
.attach-chip.pending { opacity: .6; }
.attach-x {
  background: none; border: none; color: var(--muted); cursor: pointer; font-size: 11px; padding: 0;
}
.attach-x:hover { color: var(--err); }
/* Acción dentro del chip (transcribir a mano). No es «quitar», así que no
   hereda el rojo del ✕. */
.attach-do {
  background: none; border: none; color: var(--muted); cursor: pointer; font-size: 11px; padding: 0;
}
.attach-do:hover:not(:disabled) { color: var(--accent); }
.attach-do:disabled { cursor: default; }
.attach-btn { height: 40px; width: 34px; flex: 0 0 34px; }
/* El micrófono grabando: el latido es la única señal de que la pestaña te está
   oyendo, así que conviene que no pase desapercibida. */
.attach-btn.grabando { color: var(--err); animation: latido 1.2s ease-in-out infinite; }
@keyframes latido { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
/* La transcripción dentro del chip no debe empujar el compositor: se recorta. */
.attach-chip .muted { max-width: 340px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chat-panel.dropping { outline: 2px dashed var(--accent); outline-offset: -6px; }

/* ---------- rutinas ---------- */
#view-routines.active { display: block; overflow-y: auto; }
.rt-wrap { max-width: 900px; margin: 0 auto; padding: 20px; }
.rt-head { display: flex; align-items: center; gap: 10px; }
.rt-head h2 { margin: 0; }
.rt-list { display: flex; flex-direction: column; gap: 10px; margin-top: 14px; }
.rt-enabled-label { display: flex; align-items: center; gap: 8px; color: var(--text) !important; }
.rt-history summary { cursor: pointer; color: var(--muted); font-size: 12px; margin-top: 6px; }

/* ---------- gestor MCP / entornos ---------- */
.res-card.dimmed { opacity: .55; }
.mcp-form h3 { margin: 0 0 10px; color: var(--accent); font-size: 14px; }
.mcp-form-actions { display: flex; gap: 8px; margin-top: 4px; }
.env-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px; }
.env-form { border-top: 1px solid var(--border); padding-top: 12px; margin-bottom: 12px; }

/* Resumen del perfil en «nueva conversación desde un perfil»: lo que va a
   montar antes de crearla (repos con su rama, grupo, workspace, modelo…). */
.env-start-resumen {
  display: flex; flex-direction: column; gap: 4px;
  background: var(--panel2); border: 1px solid var(--border);
  border-radius: 8px; padding: 8px 10px; margin-bottom: 12px; font-size: 12.5px;
}
.env-start-row { display: flex; gap: 8px; align-items: baseline; }
.env-start-k { flex: 0 0 108px; color: var(--muted); }
.env-start-v { flex: 1; min-width: 0; word-break: break-word; font-family: var(--mono); font-size: 12px; }

/* ---------- ajustes ---------- */
#view-settings.active { display: block; overflow-y: auto; }
.settings { max-width: 860px; margin: 0 auto; padding: 24px 20px 60px; }
.settings h2 { margin: 0 0 14px; }
/* Pestañas de Ajustes: cada tarjeta lleva `data-aj` con la suya y el JS enseña
   solo las de la pestaña activa. Mismo aspecto que las de Recursos. */
.aj-tabs {
  display: flex; gap: 6px; flex-wrap: wrap; margin: 0 0 18px;
  position: sticky; top: 0; z-index: 2; padding: 6px 0 10px; background: var(--bg);
}
.aj-tab {
  background: transparent; color: var(--text); cursor: pointer;
  border: 1px solid var(--border); border-radius: 8px; padding: 0 12px; font-size: 13px;
  min-height: var(--ctl-h); display: inline-flex; align-items: center; gap: 6px;
}
.aj-tab:hover { border-color: var(--accent); }
.aj-tab.active { border-color: var(--accent); color: var(--accent); background: var(--panel); }
.aj-tab-badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px; font-size: 11px;
  background: var(--amarillo); color: var(--bg); font-weight: 600;
}
.settings .card[data-aj] { display: none; }
.settings .card[data-aj].aj-visible { display: block; }
/* Actualizaciones: la tabla de agentes y las novedades de los catálogos. */
.tabla-act { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.tabla-act th, .tabla-act td { padding: 7px 10px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--border); }
.tabla-act th { color: var(--muted); font-weight: 600; background: var(--panel2); position: sticky; top: 0; z-index: 1; }
.tabla-act td.ver { font-family: var(--mono); white-space: nowrap; }
.tabla-act .act-que { display: block; color: var(--muted); font-size: 11.5px; margin-top: 2px; max-width: 34em; }
.tabla-act .act-origen { color: var(--muted); font-size: 11px; }
.act-estado { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11.5px; border: 1px solid var(--border); white-space: nowrap; }
.act-estado.ok { color: var(--ok); border-color: var(--ok); }
.act-estado.pendiente { color: var(--amarillo); border-color: var(--amarillo); }
.act-estado.curso { color: var(--accent); border-color: var(--accent); }
.act-estado.err { color: var(--err); border-color: var(--err); }
.tabla-act .act-acciones { display: flex; gap: 6px; flex-wrap: wrap; }
.act-novedad { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
.act-novedad .mono { font-size: 12px; }
.act-fuente { margin: 10px 0 4px; font-size: 13px; }
.act-fuente strong { color: var(--accent); }
@media (max-width: 820px) {
  .aj-tabs { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
  .aj-tabs::-webkit-scrollbar { display: none; }
  .aj-tab { flex: 0 0 auto; }
  .tabla-act .act-que { max-width: 18em; white-space: normal; }
}
.card {
  background: var(--panel); border: 1px solid var(--border); border-radius: 12px;
  padding: 18px 20px; margin-bottom: 18px;
}
.card h3 { margin: 0 0 12px; font-size: 15px; color: var(--accent); }
.field { margin-bottom: 12px; display: flex; flex-direction: column; gap: 5px; }
.field label { color: var(--muted); font-size: 12.5px; }
.field .row { display: flex; gap: 8px; align-items: center; }
.field .row input { flex: 1; }
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }
@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } }
.hint { color: var(--muted); font-size: 12px; white-space: nowrap; }
.save-msg { margin-left: 10px; font-size: 13px; color: var(--ok); }
.save-msg.err { color: var(--err); }
.card textarea { width: 100%; }
.sys-info { font-size: 12.5px; color: var(--muted); line-height: 1.8; }

.gw { border-top: 1px solid var(--border); padding: 14px 0; }
.gw-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.gw-status { font-size: 12px; font-family: var(--mono); color: var(--muted); }
.gw-status.ok { color: var(--ok); }
.gw-status.err { color: var(--err); }

.switch { position: relative; display: inline-block; width: 36px; height: 20px; }
.switch input { display: none; }
.switch span {
  position: absolute; inset: 0; border-radius: 20px; background: var(--border); transition: .15s;
}
.switch span::after {
  content: ''; position: absolute; width: 14px; height: 14px; border-radius: 50%;
  background: var(--text); top: 3px; left: 3px; transition: .15s;
}
.switch input:checked + span { background: var(--accent); }
.switch input:checked + span::after { left: 19px; }

/* ---------- modal ---------- */
.modal { position: fixed; inset: 0; background: var(--overlay); display: flex; align-items: center; justify-content: center; z-index: 50; }
.modal-card {
  width: 520px; max-width: 92vw; background: var(--panel);
  border: 1px solid var(--border); border-radius: 14px; padding: 22px;
}
.modal-card h3 { margin: 0 0 10px; }
.perm-tool { font-family: var(--mono); color: var(--blue); font-weight: 600; }
.perm-input {
  background: var(--codigo); border: 1px solid var(--border); border-radius: 8px;
  padding: 10px; font-size: 12px; max-height: 220px; overflow: auto; white-space: pre-wrap; word-break: break-all;
}
.modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 14px; flex-wrap: wrap; }

::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 6px; }
::-webkit-scrollbar-track { background: transparent; }

/* ---------- seguridad: 2FA, sesiones y accesos ---------- */
.sec-sub { margin: 18px 0 8px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.4px; color: var(--muted); border-top: 1px solid var(--border); padding-top: 14px; }
.danger-btn { background: transparent; color: var(--err); border: 1px solid var(--err); border-radius: 8px; padding: 7px 14px; cursor: pointer; font-size: 13px; }
.danger-btn:hover { background: var(--err-suave); }
.tfa-setup { display: flex; gap: 18px; flex-wrap: wrap; align-items: flex-start; margin: 10px 0; }
.tfa-qr svg { width: 180px; height: 180px; background: #fff; border-radius: 8px; padding: 4px; }
.tfa-side { flex: 1; min-width: 240px; display: flex; flex-direction: column; gap: 8px; }
.tfa-secret { display: inline-block; padding: 6px 10px; font-size: 13px; letter-spacing: 1px; }
.tfa-recovery { background: var(--panel2); border: 1px solid var(--border); border-radius: 8px; padding: 12px; font-size: 14px; letter-spacing: 1px; line-height: 1.8; }
.tfa-actions { margin-top: 10px; display: flex; gap: 8px; }
.auth-sessions { display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; }
.auth-session-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; background: var(--panel2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px; }
.auth-session-info strong { font-size: 13px; color: var(--text, #e6e9ef); }
.auth-log { display: flex; flex-direction: column; gap: 3px; max-height: 220px; overflow-y: auto; margin-top: 4px; }
.auth-log-row { display: grid; grid-template-columns: 150px 1fr auto; gap: 10px; font-size: 12px; padding: 2px 0; }
.log-ok { color: var(--ok); }
.log-bad { color: var(--err); }

/* ---------- Obsidian ---------- */
#view-obsidian.active { display: flex; }
.ob-setup-wrap { flex: 1; overflow-y: auto; display: flex; justify-content: center; padding: 40px 20px; }
.ob-setup { max-width: 640px; width: 100%; text-align: center; }
.ob-setup .big { font-size: 42px; }
.ob-setup .card { text-align: left; margin-top: 14px; }
.ob-main { flex: 1; min-width: 0; display: flex; }
#obMain.hidden, #obNotConfigured.hidden { display: none; }
.ob-side {
  width: 260px; flex: 0 0 260px;
  border-right: 1px solid var(--border); background: var(--bg2);
  display: flex; flex-direction: column;
}
.ob-tree { flex: 1; overflow-y: auto; }
.ob-note { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ob-file { opacity: 0.55; cursor: default; }
.ob-side-foot { display: flex; gap: 6px; padding: 8px; border-top: 1px solid var(--border); }
.ob-side-foot input { flex: 1; min-width: 0; }
.ob-detail { flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; padding: 14px 18px; }
.ob-head { display: flex; align-items: center; gap: 8px; }
.ob-head h2 { margin: 0; font-size: 18px; }
.ob-sync-msg { min-height: 18px; margin: 4px 0 8px; }
.ob-sync-msg.err { color: var(--err); }
.ob-settings { margin-bottom: 10px; }
.ob-editor { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.ob-editor-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.ob-textarea {
  flex: 1; resize: none; background: var(--panel); color: var(--text, #e6e9ef);
  border: 1px solid var(--border); border-radius: 8px; padding: 12px 14px;
  font-size: 13.5px; line-height: 1.6; outline: none;
}
.ob-textarea:focus { border-color: var(--accent-dim); }
.ob-preview {
  flex: 1; overflow-y: auto; background: var(--panel);
  border: 1px solid var(--border); border-radius: 8px; padding: 14px 18px; line-height: 1.6;
}
.ob-preview a[href^="#wiki:"] { color: var(--accent); text-decoration: none; border-bottom: 1px dashed var(--accent-dim); }
.ob-preview h1, .ob-preview h2, .ob-preview h3 { margin: 0.7em 0 0.35em; }
.ob-preview p { margin: 0.4em 0; }

/* ---------- ficheros descargables en el chat ---------- */
.file-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 2px; }
.file-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px; border-radius: 999px; text-decoration: none;
  background: var(--panel2); border: 1px solid var(--border);
  color: var(--accent); font-size: 12px; cursor: pointer;
}
.file-chip:hover { border-color: var(--accent); background: var(--accent-suave); }
.file-chip-name { color: var(--text, #e6e9ef); font-family: var(--mono); }
.file-chip-size { color: var(--muted); }

/* ---------- panel de tareas y subagentes ---------- */
.tasks-bar { border: 1px solid var(--border); border-radius: 8px; margin: 0 0 8px; background: var(--panel); overflow: hidden; }
.tasks-bar-head { display: flex; align-items: center; gap: 8px; padding: 7px 12px; cursor: pointer; font-size: 13px; user-select: none; }
.tasks-bar-head:hover { background: var(--panel2); }
.tasks-toggle { width: 12px; color: var(--muted); }
#tasksSummary { color: var(--text, #e6e9ef); }
.tasks-list { border-top: 1px solid var(--border); max-height: 240px; overflow-y: auto; }
.task-row { display: grid; grid-template-columns: auto auto 1fr auto auto; align-items: center; gap: 8px; padding: 6px 12px; border-bottom: 1px solid var(--border); }
.task-kill { background: transparent; border: 1px solid var(--border); color: var(--muted); border-radius: 6px; width: 22px; height: 22px; line-height: 1; cursor: pointer; font-size: 12px; padding: 0; }
.task-kill:hover:not(:disabled) { border-color: var(--err); color: var(--err); }
.task-kill:disabled { opacity: 0.5; cursor: default; }
.task-row:last-child { border-bottom: none; }
.task-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted, #8b93a2); flex: none; }
.task-dot.run { background: var(--accent); animation: pulse 1.4s ease-in-out infinite; }
.task-dot.ok { background: var(--ok); }
.task-dot.bad { background: var(--err); }
.task-dot.wait { background: var(--amarillo); }
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
.task-ico { font-size: 14px; }
.task-main { min-width: 0; }
.task-title { font-size: 13px; color: var(--text, #e6e9ef); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.task-sub { font-size: 11.5px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.task-meta { font-size: 11px; color: var(--muted); white-space: nowrap; }

/* subagentes anidados bajo su Task */
.tool-chip.task-chip > summary { color: var(--accent); }
.subagent-body { margin: 6px 0 2px; padding: 6px 0 2px 10px; border-left: 2px solid var(--accent-dim); display: flex; flex-direction: column; gap: 6px; }
.subagent-body .msg-assistant { font-size: 13px; }

/* badge de límites de suscripción */
.limits-badge { background: var(--panel2); border: 1px solid var(--border); color: var(--text, #e6e9ef); border-radius: 999px; padding: 3px 10px; font-size: 12px; cursor: pointer; }
.limits-badge:hover { border-color: var(--accent); }
.limits-badge.warn { border-color: var(--amarillo); color: var(--amarillo); }
.limits-badge.danger { border-color: var(--err); color: var(--err); }

/* ---------- modales de preguntas y plan ---------- */
.modal-wide { width: 640px; }
.question-body { max-height: 60vh; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; margin-top: 6px; }
.question-block { border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; background: var(--panel2); }
.question-header { display: inline-block; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--accent); background: var(--accent-suave); border-radius: 999px; padding: 2px 9px; margin-bottom: 8px; }
.question-text { font-size: 14px; margin-bottom: 10px; color: var(--text, #e6e9ef); }
.question-opts { display: flex; flex-direction: column; gap: 6px; }
.question-opt { display: flex; align-items: flex-start; gap: 9px; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; cursor: pointer; }
.question-opt:hover { border-color: var(--accent-dim); }
.question-opt input { margin-top: 3px; accent-color: var(--accent); }
.question-opt-txt { flex: 1; min-width: 0; }
.question-opt-label { font-size: 13.5px; color: var(--text, #e6e9ef); }
.question-opt-desc { font-size: 12px; color: var(--muted); margin-top: 2px; }
.question-other { width: 100%; margin-top: 4px; background: var(--panel); border: 1px solid var(--border); border-radius: 6px; padding: 5px 8px; color: var(--text, #e6e9ef); font-size: 13px; }
.plan-body { max-height: 55vh; overflow-y: auto; background: var(--codigo); border: 1px solid var(--border); border-radius: 8px; padding: 12px 16px; line-height: 1.6; }
.plan-body h1, .plan-body h2, .plan-body h3 { margin: 0.6em 0 0.3em; }
.plan-feedback { width: 100%; margin-top: 10px; background: var(--panel2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; color: var(--text, #e6e9ef); font-size: 13px; resize: vertical; box-sizing: border-box; }

/* ---------- popover de límites de suscripción ---------- */
.limits-wrap { position: relative; }
.limits-popover {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 60;
  width: 300px; background: var(--panel); border: 1px solid var(--border);
  border-radius: 12px; padding: 14px; box-shadow: var(--sombra);
  display: flex; flex-direction: column; gap: 10px;
}
.limits-title { margin: 0; font-size: 13px; }
.limits-gauge { display: flex; flex-direction: column; gap: 5px; }
.limits-gauge-head { display: flex; justify-content: space-between; font-size: 12.5px; color: var(--text, #e6e9ef); }
.limits-pct { font-family: var(--mono); }
.limits-track { height: 8px; background: var(--panel2); border-radius: 999px; overflow: hidden; }
.limits-fill { height: 100%; border-radius: 999px; transition: width .3s ease; }
.limits-fill.ok { background: var(--ok); }
.limits-fill.warn { background: var(--amarillo); }
.limits-fill.danger { background: var(--err); }
.limits-reset { font-size: 11.5px; color: var(--muted); }
.limits-note { display: flex; flex-direction: column; gap: 3px; font-size: 12px; border-top: 1px solid var(--border); padding-top: 8px; }
.limits-status { font-size: 12.5px; }
.limits-ts { margin-top: 2px; }
.limits-popover .ghost-btn.small { align-self: flex-start; padding: 4px 10px; font-size: 12px; }
/* Salud: una línea por problema con su ✕ a la derecha. El texto es un error
   ajeno y puede ser larguísimo, así que parte por palabras en vez de estirar
   el popover; el ✕ no se encoge nunca. */
.salud-cab { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.salud-cab .ghost-btn.small { align-self: auto; }
.salud-fila { display: flex; align-items: flex-start; gap: 6px; }
.salud-txt { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.salud-x { flex: 0 0 auto; padding: 0 6px; min-height: 22px; line-height: 1; }
/* Pestañas del popover: las tres del `/usage` del terminal (plan, contexto,
   sesión). Van con los mismos tokens que el resto para que no se note el
   añadido — es una tira de texto sobre una línea, sin caja propia. */
.limits-tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--border); margin: -2px 0 0; }
.limits-tab {
  flex: 1; background: none; border: 0; border-bottom: 2px solid transparent;
  color: var(--muted); font: inherit; font-size: 12px; padding: 5px 2px 6px;
  cursor: pointer; border-radius: 0;
}
.limits-tab:hover { color: var(--text, #e6e9ef); }
.limits-tab.active { color: var(--text, #e6e9ef); border-bottom-color: var(--accent); }
/* El cuerpo repite el reparto del popover para que las tres pestañas dejen los
   mismos huecos que había antes de existir. */
.limits-body { display: flex; flex-direction: column; gap: 10px; }
.limits-row { display: flex; justify-content: space-between; gap: 10px; font-size: 12px; }
.limits-row-k { color: var(--muted); flex: none; }
.limits-row-v {
  font-family: var(--mono); font-size: 11.5px; text-align: right;
  word-break: break-all; min-width: 0;
}

/* ---------- Python persistente ---------- */
.py-installed { margin-top: 8px; }
.py-installed summary { cursor: pointer; }
#pyInstalled { max-height: 200px; overflow-y: auto; margin-top: 6px; display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 2px 14px; color: var(--muted); }
#pyStatus { margin-top: 6px; }

/* ---------- detalle de tareas y trabajos ---------- */
.task-row { cursor: pointer; }
.task-row:hover { background: var(--panel2); }
.task-row.open { background: var(--panel2); }
.task-detail {
  padding: 10px 14px 12px 40px; border-bottom: 1px solid var(--border);
  background: var(--bg); display: flex; flex-direction: column; gap: 4px; cursor: default;
}
.task-kv { display: grid; grid-template-columns: 150px 1fr; gap: 10px; font-size: 12.5px; }
.task-k { color: var(--muted); }
.task-v { color: var(--text); word-break: break-word; font-family: var(--mono); font-size: 12px; }
.task-log {
  margin: 8px 0 0; max-height: 260px; overflow: auto;
  background: var(--bg); border: 1px solid var(--border); border-radius: 6px;
  padding: 8px 10px; font-size: 11.5px; line-height: 1.5; white-space: pre-wrap; word-break: break-word;
}
.task-detail-foot { display: flex; gap: 8px; margin-top: 6px; }
.danger-text { color: var(--err); }

/* ---------- entrega de ficheros en el chat ---------- */
.files-block {
  align-self: flex-start; max-width: 90%;
  background: var(--panel); border: 1px solid var(--accent-dim); border-left: 3px solid var(--accent);
  border-radius: 10px; padding: 10px 14px; margin: 4px 0;
}
.files-head { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text); margin-bottom: 2px; }
.files-block .file-chips { margin-bottom: 0; }

/* ---------- arrastrar conversaciones entre grupos ---------- */
.session-item.dragging { opacity: .45; }
.group-head.drop-target {
  background: var(--accent-suave2);
  outline: 1px dashed var(--accent);
  border-radius: 6px; color: var(--text);
}
.repo-chip-x {
  margin-left: 4px; color: var(--muted); font-size: 11px;
  padding: 0 2px; border-radius: 4px;
}
.repo-chip-x:hover { color: var(--err); background: var(--err-suave); }
.drag-hint { margin-top: 6px; font-size: 10.5px; line-height: 1.35; color: var(--muted); opacity: .75; }

/* ---------- repos en rutinas ---------- */
.rt-repos { display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; }
.rt-repo-row {
  display: flex; align-items: center; gap: 8px;
  background: var(--panel2); border: 1px solid var(--border);
  border-radius: 8px; padding: 6px 10px; font-size: 12.5px;
}
.rt-repo-name { font-family: var(--mono); }
.rt-repo-meta { color: var(--muted); font-size: 11.5px; }

/* ---------- detalle de rutina e historial de ejecuciones ---------- */
.rt-wrap { max-width: 1100px; }
.rt-name-btn {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--text); font-weight: 600; font-size: 14px;
}
.rt-name-btn:hover { color: var(--accent); text-decoration: underline; }
.link-btn {
  background: none; border: 0; padding: 0; margin-top: 6px; cursor: pointer;
  color: var(--accent); font-size: 12px;
}
.link-btn:hover { text-decoration: underline; }
.res-badge.run { color: var(--accent); border-color: var(--accent); }

.rt-detail .rt-head { margin-bottom: 14px; }
.rt-detail .rt-head h2 { font-size: 18px; }
.rt-detail-grid { display: grid; grid-template-columns: 300px 1fr; gap: 14px; align-items: start; }
.rt-detail-side { display: flex; flex-direction: column; gap: 12px; }
.rt-detail-main { display: flex; flex-direction: column; gap: 12px; }
.rt-detail .card h3 { margin: 0 0 10px; font-size: 13px; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }
.rt-state-line { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.rt-ok { color: var(--ok); font-size: 12.5px; }
.rt-meta-row { display: flex; justify-content: space-between; gap: 10px; font-size: 12.5px; padding: 3px 0; }
.rt-meta-k { color: var(--muted); }
.rt-meta-v { text-align: right; }
.rt-prompt {
  white-space: pre-wrap; word-break: break-word; font-size: 12.5px; line-height: 1.5;
  background: var(--panel2); border: 1px solid var(--border); border-radius: 8px;
  padding: 10px 12px; max-height: 340px; overflow: auto;
}
.rt-run-tabs { display: flex; gap: 6px; margin-bottom: 10px; flex-wrap: wrap; }
.rt-run-tab {
  background: none; border: 1px solid transparent; color: var(--muted);
  padding: 3px 10px; border-radius: 999px; cursor: pointer; font-size: 12px;
}
.rt-run-tab:hover { color: var(--text); }
.rt-run-tab.active { background: var(--panel2); border-color: var(--border); color: var(--text); }
.rt-runs { display: flex; flex-direction: column; gap: 6px; max-height: 460px; overflow: auto; }
.rt-run { border: 1px solid var(--border); border-radius: 8px; background: var(--panel2); }
.rt-run-head {
  display: flex; align-items: center; gap: 10px; padding: 7px 10px;
  cursor: pointer; font-size: 12.5px;
}
.rt-run-head:hover { background: var(--hover); }
.rt-run-icon { width: 16px; }
.rt-run-dur { color: var(--muted); font-size: 11.5px; }
.rt-run-kind {
  font-size: 10px; letter-spacing: .05em; color: var(--muted);
  border: 1px solid var(--border); border-radius: 999px; padding: 1px 8px;
}
.rt-run-kind.manual { color: var(--accent); border-color: var(--accent); }
.rt-run-kind.missed { color: var(--warn); border-color: var(--warn); }
.rt-run-body { padding: 0 10px 10px; border-top: 1px solid var(--border); }
.rt-run-detail {
  white-space: pre-wrap; word-break: break-word; font-size: 12px; line-height: 1.5;
  color: var(--text); margin: 8px 0; max-height: 260px; overflow: auto;
}
@media (max-width: 900px) { .rt-detail-grid { grid-template-columns: 1fr; } }
.rt-detail-side .rt-repo-row { flex-direction: column; align-items: flex-start; gap: 2px; }

/* =====================================================================
   DISEÑO RESPONSIVE
   Escritorio: barra lateral de iconos + panel de lista + contenido.
   Móvil (≤820px): la barra de iconos pasa abajo (alcance del pulgar), los
   paneles de lista (conversaciones, repos, notas) se convierten en un cajón
   deslizante y el contenido ocupa toda la pantalla. Ninguna función se
   esconde: todo lo que había en escritorio sigue accesible.
   ===================================================================== */

.only-mobile { display: none !important; }
.drawer-backdrop { display: none; }

/* --- alto real en móvil: 100vh miente cuando aparece la barra del navegador --- */
@supports (height: 100dvh) {
  .app { height: 100dvh; }
}

@media (max-width: 820px) {
  :root { --tabbar-h: 58px; --ctl-h: 42px; --ctl-h-sm: 36px; }

  .only-mobile { display: inline-flex !important; }
  .only-mobile.hidden { display: none !important; }

  /* nada de zoom automático al enfocar un campo en iOS */
  input, select, textarea { font-size: 16px; }
  .composer-opts select, .composer-opts input { font-size: 16px; }

  /* ---- barra superior ---- */
  .topbar { padding: 0 10px; gap: 8px; }
  .topbar-left { display: flex; align-items: center; gap: 8px; min-width: 0; }
  .brand { font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .brand-tail { display: none; }
  .topbar-right { gap: 8px; }
  #costBadge { display: none; }

  /* ---- barra de iconos abajo ---- */
  .body { padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px)); }
  .rail {
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 46;
    width: auto; flex: none; height: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
    flex-direction: row; align-items: center; gap: 2px;
    /* `safe` para que, si los iconos no caben, se corte por el final y no por
       el principio (con `center` a secas el primero queda fuera de alcance). */
    justify-content: center;
    justify-content: safe center;
    padding: 0 4px env(safe-area-inset-bottom, 0px);
    border-right: none; border-top: 1px solid var(--border);
    overflow-x: auto; scrollbar-width: none;
  }
  .rail::-webkit-scrollbar { display: none; }
  /* Once vistas no caben a 42px en un móvil: el icono se ajusta al ancho de
     pantalla (y si aun así sobran, la barra se desliza). Antes 💰 y ⚙️ se
     quedaban fuera de la pantalla, sin forma de llegar a ellas. */
  .rail-btn {
    flex: 0 0 auto;
    width: clamp(30px, 8vw, 42px); height: 42px;
    font-size: clamp(15px, 4.6vw, 20px); border-radius: 12px;
  }

  /* ---- paneles laterales como cajón deslizante ---- */
  .chat-list, .gh-repolist, .ob-side, .gr-side {
    position: fixed; top: var(--topbar-h); left: 0; z-index: 47;
    bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
    width: min(85vw, 330px); flex: none;
    transform: translateX(-102%); transition: transform .22s ease;
    box-shadow: var(--sombra);
  }
  body.drawer-open .chat-list, body.drawer-open .gh-repolist, body.drawer-open .ob-side,
  body.drawer-open .gr-side {
    transform: none;
  }
  .drawer-backdrop {
    display: block; position: fixed; inset: var(--topbar-h) 0 0; z-index: 46;
    background: var(--overlay); opacity: 0; pointer-events: none; transition: opacity .22s;
  }
  body.drawer-open .drawer-backdrop { opacity: 1; pointer-events: auto; }
  .drag-hint { display: none; }

  /* ---- chat ---- */
  .chat-head { flex-wrap: wrap; padding: 6px 10px; gap: 6px; }
  /* El título comparte línea con el ⌃ de plegar; antes se llevaba la fila
     entera él solo. */
  .chat-title { flex: 1 1 auto; min-width: 0; font-size: 15px; }
  #chatHeadToggle { flex: 0 0 auto; order: 1; }
  /* se reparten en varias líneas: en móvil nada de acciones escondidas */
  .chat-head-actions { width: 100%; flex-wrap: wrap; gap: 6px; order: 2; }
  .chat-cwd { display: none; }

  /* ===== plegar la cabecera y la botonera (SOLO móvil) =====
     El problema del móvil no era el diseño de cada pieza, sino cuántas hay:
     título, fila de acciones, chips de repos y adjuntos, caja de escribir y
     fila de botones. Con todo desplegado a la conversación le quedaban dos
     dedos de pantalla. Nada de esto se esconde por su cuenta: son dos botones
     y su estado se recuerda (ver `uiEstado` en app.js).

     Por defecto los chips van en UNA línea que se desliza en horizontal. Antes
     iban con `flex-wrap` y tres adjuntos ocupaban tres renglones altos, que es
     justo lo que se veía en la captura del móvil. */
  .repo-chips {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    padding: 6px 10px; gap: 6px;
  }
  .repo-chips::-webkit-scrollbar { display: none; }
  .repo-chips > * { flex: 0 0 auto; max-width: 70vw; }
  .repo-chip { white-space: nowrap; overflow: hidden; }

  body.cabecera-plegada .chat-head-actions,
  body.cabecera-plegada #repoChips { display: none !important; }

  /* Botonera plegada: sin los adjuntos, la caja de escribir y el ➤ caben en la
     misma línea y se recupera un renglón entero de alto. */
  body.botonera-plegada .composer-row .attach-btn,
  body.botonera-plegada .composer-row #optsBtn { display: none !important; }
  body.botonera-plegada #composerInput { flex: 1 1 150px; order: 0; }

  .messages { padding: 14px 12px; }
  .msg-user { margin-left: 0; }
  .msg { margin-bottom: 12px; }
  .composer { padding: 8px 10px calc(8px + env(safe-area-inset-bottom, 0px)); }
  .composer-row { gap: 6px; row-gap: 8px; }
  /* En el móvil la caja de texto se lleva SIEMPRE la primera línea entera y los
     botones bajan a la segunda: cabiendo justo, la fila se partía por donde le
     tocaba y los iconos quedaban repartidos entre las dos líneas. */
  #composerInput { font-size: 16px; order: -1; flex: 1 1 100%; }
  /* Enviar va al final de la fila de botones: es la esquina que se pulsa sin
     mirar, y el resto de la línea queda para los adjuntos. */
  .send-btn, .stop-btn { width: 46px; height: 44px; margin-left: auto; }
  .attach-btn { height: 44px; }
  /* las opciones (modelo, esfuerzo, permisos, entorno, CWD) se pliegan */
  .composer-opts { display: none; gap: 8px 12px; }
  .composer-opts.open { display: flex; }
  .composer-opts label { flex: 1 1 46%; justify-content: space-between; }
  .composer-opts label.grow { flex: 1 1 100%; }
  .tasks-list { max-height: 200px; }
  .task-row { grid-template-columns: auto auto 1fr auto; row-gap: 2px; }

  /* ---- archivos ---- */
  .files-toolbar { flex-wrap: wrap; padding: 8px 10px; }
  .fs-path { flex: 1 1 100%; order: -1; }
  .fs-list { padding: 6px 8px; }
  .fs-row { padding: 10px 8px; gap: 8px; }
  .fs-row .meta { display: none; }
  .fs-editor { inset: var(--topbar-h) 0 calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px)) 0; }
  .fs-editor-head { flex-wrap: wrap; }
  #fsEditorPath { flex: 1 1 100%; word-break: break-all; }

  /* ---- terminal ---- */
  .term-toolbar { padding: 6px 8px; }
  .term-instance { inset: 4px; }
  .term-keys {
    display: flex !important; gap: 6px; padding: 6px 8px;
    overflow-x: auto; background: var(--bg2); border-top: 1px solid var(--border);
    scrollbar-width: none;
  }
  .term-keys::-webkit-scrollbar { display: none; }
  .term-keys button {
    flex: none; min-width: 46px; height: 38px;
    background: var(--panel2); color: var(--text);
    border: 1px solid var(--border); border-radius: 8px; font-size: 13px;
  }
  .term-keys button:active { border-color: var(--accent); color: var(--accent); }

  /* ---- GitHub ---- */
  .gh-panel { padding: 12px 12px 30px; }
  .gh-head { flex-wrap: wrap; }
  .gh-head h2 { font-size: 16px; }
  .gh-commit-hash { flex-basis: auto; }

  /* ---- Obsidian ---- */
  .ob-detail { padding: 10px 12px; }
  .ob-head { flex-wrap: wrap; }
  .ob-head h2 { font-size: 16px; }
  .ob-setup-wrap { padding: 20px 12px; }

  /* ---- recursos, rutinas y ajustes ---- */
  .res-wrap, .rt-wrap { padding: 14px 12px 30px; }
  .settings { padding: 16px 12px 40px; }
  .res-head { gap: 8px; }
  .res-tabs { overflow-x: auto; scrollbar-width: none; }
  .res-tabs::-webkit-scrollbar { display: none; }
  .res-card-head { gap: 6px; }
  .rt-head h2 { font-size: 17px; }
  .rt-run-tabs { overflow-x: auto; flex-wrap: nowrap; scrollbar-width: none; }
  .hint { white-space: normal; }
  .auth-log-row { grid-template-columns: 1fr; gap: 0; padding: 6px 0; border-bottom: 1px solid var(--border); }
  .auth-session-row { flex-wrap: wrap; }
  .tfa-qr svg { width: 150px; height: 150px; }

  /* ---- modales como hoja inferior ---- */
  .modal { align-items: flex-end; }
  .modal-card {
    width: 100%; max-width: 100%; max-height: 88vh; overflow-y: auto;
    border-radius: 16px 16px 0 0; padding: 18px 16px calc(18px + env(safe-area-inset-bottom, 0px));
  }
  .modal-actions > button { flex: 1 1 auto; }
  .limits-popover {
    position: fixed !important; left: 8px; right: 8px; top: calc(var(--topbar-h) + 6px);
    width: auto !important; max-height: 70vh; overflow-y: auto;
  }
  .ctx-menu { min-width: 200px; }
  .ctx-item { padding: 12px 14px; }

  /* ---- login ---- */
  .auth-card { width: 100%; max-width: 380px; margin: 0 12px; padding: 28px 20px; }
}

/* pantallas muy estrechas */
@media (max-width: 380px) {
  .rail-btn { height: 38px; }
  .topbar { padding: 0 8px; }
}

/* móvil en horizontal: la barra inferior roba demasiado alto */
@media (max-width: 900px) and (max-height: 480px) {
  :root { --tabbar-h: 46px; }
  .rail-btn { height: 34px; font-size: 16px; }
}

/* ---- dispositivos táctiles: nada dependiente de :hover ---- */
@media (pointer: coarse) {
  .sess-menu-btn { display: inline-block; font-size: 18px; padding: 0 6px; }
  /* Sin ratón no hay :hover: el menú de la carpeta se queda siempre visible o
     sería inalcanzable. */
  .ml-folder-menu { display: block; font-size: 16px; padding: 0 6px; }
  .ml-folder { min-height: 34px; }
  .fs-row .actions { display: flex; }
  .session-item { padding: 11px 10px; }
  .group-head { padding: 10px 8px 6px; }
  .ctx-item { padding: 12px 14px; }
  .repo-chip { padding: 6px 12px; }
  .file-chip { padding: 7px 12px; }
  .rt-run-head { padding: 10px; }
}

/* --- remates responsive detectados en la auditoría --- */
.grid2 > *, .field { min-width: 0; }
.gh-head > div:first-child { min-width: 0; }
#ghRepoName { word-break: break-word; }

@media (max-width: 820px) {
  .chat-title { font-size: 16px; }
  .limits-badge { min-height: 34px; }
  .sess-menu-btn { min-width: 36px; min-height: 36px; }
  .attach-btn { width: 40px; flex: 0 0 40px; }
  .gh-head > div:first-child { flex: 1 1 100%; }
  .head-btns { gap: 4px; }
}

@media (max-width: 820px) {
  .field .row, .card > .row { flex-wrap: wrap; }
  .field .row > input, .card > .row > input { flex: 1 1 160px; }
  .settings .card { padding: 14px 12px; }
  .settings h2 { font-size: 20px; }
}
#ghRepoMeta { word-break: break-all; }
@media (pointer: coarse) { .repo-chip { min-height: 34px; } }

/* misma altura también para los botones "small" que conviven con los grandes */
.files-toolbar > .small, .res-head > .small, .rt-head > .small, .gh-head > .small,
.ob-head > .small, .ob-editor-head > .small, .field .row > .small,
.card > .row > .small, .modal-actions > .small, .res-card-head > .small {
  min-height: var(--ctl-h);
}
/* la tira de opciones del compositor va en escala pequeña, toda igual */
.composer-opts select,
.composer-opts input:not([type=checkbox]):not([type=radio]) { height: var(--ctl-h-sm); }

/* la cabecera del panel lateral no debe empujar sus botones fuera */
.chat-list-head { gap: 8px; }
.chat-list-head > span:first-child {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.head-btns { flex: none; }
/* en escritorio los botones de cabecera van en escala compacta (caben los 4) */
.head-btns { gap: 5px; }
.head-btns .mini-btn { width: 28px; height: 28px; }
@media (max-width: 820px) { .head-btns .mini-btn { width: 36px; height: 36px; } }

/* mientras se escribe en el móvil, la barra inferior se aparta */
@media (max-width: 820px) {
  body.typing .rail { display: none; }
  body.typing .body { padding-bottom: 0; }
  body.typing .chat-list, body.typing .gh-repolist, body.typing .ob-side,
  body.typing .gr-side { bottom: 0; }
}

/* pantallas intermedias (tablet, móvil en horizontal, ventanas estrechas):
   las cabeceras se reparten en varias líneas en vez de empujar el ancho */
.chat-head { flex-wrap: wrap; }
.chat-title { flex: 1 1 220px; min-width: 0; }
.chat-head-actions { flex-wrap: wrap; }
.files-toolbar { flex-wrap: wrap; }
.chat-main, .gh-detail, .ob-detail { min-width: 0; }

/* pantalla muy baja y táctil (móvil en horizontal): las opciones del
   compositor y las teclas de terminal, igual que en vertical */
@media (max-height: 520px) and (pointer: coarse) {
  #optsBtn { display: inline-flex !important; }
  #termKeys { display: flex !important; }
  #termKeys.hidden { display: none !important; }
  .composer-opts { display: none; }
  .composer-opts.open { display: flex; }
}
/* el rótulo del panel cabe entero junto a sus 4 botones */
.chat-list-head { font-size: 11px; letter-spacing: .04em; padding: 12px 10px; }

/* ---------- importar / exportar conversaciones de Claude Code ---------- */
.imp-tabs { display: flex; gap: 6px; margin: 12px 0; flex-wrap: wrap; }
.imp-tab {
  background: transparent; color: var(--muted); border: 1px solid var(--border);
  border-radius: 8px; padding: 0 12px; min-height: var(--ctl-h-sm); font-size: 12.5px;
  display: inline-flex; align-items: center;
}
.imp-tab.active { color: var(--accent); border-color: var(--accent); background: var(--panel2); }
.imp-pane { margin-top: 4px; }
.imp-list { display: flex; flex-direction: column; gap: 6px; max-height: 320px; overflow-y: auto; }
.imp-row {
  display: flex; align-items: center; gap: 10px;
  border: 1px solid var(--border); border-radius: 8px; background: var(--panel2); padding: 8px 10px;
}
.imp-row-main { flex: 1; min-width: 0; }
.imp-row-title { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.imp-row-meta { color: var(--muted); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.imp-help { font-size: 13px; line-height: 1.6; max-height: 340px; overflow-y: auto; }
.imp-help p { margin: 0 0 10px; }
.imp-help pre {
  background: var(--codigo); border: 1px solid var(--border); border-radius: 8px;
  padding: 8px 10px; font-family: var(--mono); font-size: 12px; overflow-x: auto;
}
#impMsg.err { color: var(--err); }
#expMsg.err { color: var(--err); }

/* ---------- sesiones de Claude Code web ---------- */
.cloud-status { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.err-text { color: var(--err); }
.res-badge.ok { color: var(--ok); border-color: var(--ok); }
.cloud-badge { cursor: pointer; border-color: var(--accent); color: var(--accent); background: transparent; }
.cloud-badge:hover { background: var(--accent-suave); }

/* ---- desplegable con buscador (catálogos largos: OpenRouter) ---- */
.ss { position: relative; display: block; min-width: 0; }
.ss select { display: none; }
.ss-btn {
  display: flex; align-items: center; gap: 8px; width: 100%; height: var(--ctl-h);
  background: var(--bg2); color: var(--text);
  border: 1px solid var(--border); border-radius: 8px;
  padding: 8px 10px; text-align: left; font: inherit;
}
.ss-btn:hover { border-color: var(--accent-dim); }
.ss-btn:focus-visible { border-color: var(--accent); outline: none; }
.ss-val { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ss-val.missing { color: var(--warn); }
.ss-caret { color: var(--muted); font-size: 11px; flex: none; }
.ss-pop {
  position: fixed; z-index: 70; display: flex; flex-direction: column;
  max-height: 340px; background: var(--panel);
  border: 1px solid var(--border); border-radius: 10px;
  box-shadow: var(--sombra); overflow: hidden;
}
.ss-search {
  border: none; border-bottom: 1px solid var(--border); border-radius: 0;
  background: var(--panel2); height: var(--ctl-h); flex: none;
}
.ss-search:focus { border-color: var(--border); border-bottom-color: var(--accent); }
.ss-list { overflow-y: auto; padding: 4px 0; }
.ss-group {
  padding: 6px 12px 3px; font-size: 11px; text-transform: uppercase;
  letter-spacing: .04em; color: var(--muted);
}
.ss-item {
  padding: 6px 12px; cursor: pointer; font-size: 13px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ss-item.sel, .ss-item:hover { background: var(--panel2); }
.ss-item.cur { color: var(--accent); }
.ss-empty { padding: 12px; color: var(--muted); font-size: 13px; text-align: center; }

/* la tira de opciones del compositor va en escala pequeña: el buscador la sigue */
.composer-opts .ss { max-width: 280px; }
.composer-opts .ss-btn {
  height: var(--ctl-h-sm); font-size: 12px; padding: 0 8px; border-radius: 6px;
}
@media (max-width: 820px) {
  /* mismo antizoom de iOS que el resto de campos */
  .composer-opts .ss-btn, .ss-search { font-size: 16px; }
}

/* ---- tipos de uso ---- */
.mode-cards { display: grid; gap: 10px; margin: 14px 0 4px; }
.mode-card {
  display: grid; grid-template-columns: 34px 1fr; grid-template-rows: auto auto auto;
  gap: 2px 12px; text-align: left; width: 100%;
  background: var(--bg2); color: var(--text);
  border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px;
}
.mode-card:hover, .mode-card:focus-visible { border-color: var(--accent); outline: none; }
.mode-card.preferida { border-color: var(--accent-dim); }
.mc-icon { grid-row: 1 / span 3; align-self: center; font-size: 22px; text-align: center; }
.mc-label { font-weight: 600; }
.mc-hint { color: var(--muted); font-size: 12px; }
.mc-meta { color: var(--faint, var(--muted)); font-size: 11px; font-family: var(--mono); opacity: .85; }

.mode-badge {
  background: transparent; color: var(--accent); border: 1px solid var(--accent-dim);
  border-radius: 999px; padding: 2px 10px; font-size: 12px; line-height: 1.6;
  white-space: nowrap; flex: none;
}
.mode-badge:hover { background: var(--accent-suave); }

.mode-rows { display: grid; gap: 10px; margin-bottom: 14px; }
.mode-row {
  display: grid; grid-template-columns: 28px 1.1fr 1.6fr .9fr; gap: 10px; align-items: end;
  background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px;
}
.mode-row .field { margin-bottom: 0; }
.mr-icon { font-size: 18px; text-align: center; padding-bottom: 8px; }
@media (max-width: 820px) {
  .mode-row { grid-template-columns: 28px 1fr; }
  .mode-row .field { grid-column: 2; }
}

/* ---- buscador y selección de conversaciones ---- */
.chat-search { display: flex; gap: 6px; align-items: center; padding: 6px 10px 0; }
.chat-search input {
  flex: 1; min-width: 0; height: var(--ctl-h-sm); font-size: 12px; border-radius: 6px;
}
.chat-search input::-webkit-search-cancel-button { display: none; }

.select-bar {
  display: flex; align-items: center; gap: 6px; padding: 6px 10px;
  border-bottom: 1px solid var(--border); background: var(--panel2);
  font-size: 12px; color: var(--muted);
}
.select-bar .sel-all { display: flex; align-items: center; gap: 6px; white-space: nowrap; }
.select-bar .mini-btn[disabled] { opacity: .35; cursor: default; }
.select-bar .mini-btn.danger:not([disabled]):hover { color: var(--err); border-color: var(--err); }
.mini-btn.active { color: var(--accent); border-color: var(--accent); }

.sess-check { flex: none; margin: 0 2px 0 0; accent-color: var(--accent); }
.session-item.picked { background: var(--accent-suave); }
.sess-sec {
  padding: 8px 12px 3px; font-size: 11px; text-transform: uppercase;
  letter-spacing: .04em; color: var(--muted);
}
.sess-empty { padding: 14px 12px; color: var(--muted); font-size: 12px; text-align: center; }
.sess-hit { display: flex; flex-direction: column; gap: 1px; min-width: 0; flex: 1; }
.sess-hit .title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sess-snippet {
  color: var(--muted); font-size: 11px; line-height: 1.35;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

/* ---- grafos de conocimiento ---- */
.modal-card.wide { max-width: 760px; width: 92vw; max-height: 88vh; overflow-y: auto; }
.graph-h4 { margin: 18px 0 8px; font-size: .95rem; color: var(--text); }
.graph-new { border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; background: var(--bg2); }
.graph-targets { display: flex; flex-direction: column; gap: 6px; }
.graph-target { display: flex; align-items: center; gap: 8px; font-size: 13px; }
.graph-target input { accent-color: var(--accent); flex: none; }
.graph-target .mono { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.graph-list { display: flex; flex-direction: column; gap: 8px; }
.graph-card {
  border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px;
  background: var(--panel2); display: flex; flex-direction: column; gap: 4px;
}
.graph-card-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.graph-name { font-weight: 600; }
.graph-actions { display: flex; gap: 6px; margin-top: 6px; flex-wrap: wrap; }
/* .mini-btn es cuadrado y de ancho fijo (pensado para un icono suelto): estos
   llevan texto, así que se dimensionan por su contenido o se solapan. */
.graph-actions .mini-btn {
  width: auto; min-width: var(--ctl-h-sm); padding: 0 10px; gap: 5px; font-size: 12px;
}
.graph-actions .mini-btn.danger:hover { color: var(--err); border-color: var(--err); }
/* grafos ya construidos que se han encontrado en el despliegue */
.graph-found { border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin-top: 18px; }
.graph-found-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.graph-found-head .graph-h4 { margin: 0; }
.graph-found-head .mini-btn { width: auto; padding: 0 10px; gap: 5px; font-size: 12px; flex: none; }
.graph-found-list { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.graph-found-list .mono { overflow-wrap: anywhere; }
.repo-chip.graph-chip { border-color: var(--blue); color: var(--blue); }
.repo-chip.graph-chip:hover { background: var(--blue-suave); }

/* Aviso enmarcado (graphify sin instalar y similares). Existía en el HTML sin
   estilo propio: se veía como texto suelto en medio del panel. */
.callout {
  border: 1px solid var(--border); border-left: 3px solid var(--muted);
  border-radius: 8px; padding: 10px 14px; margin-bottom: 14px; background: var(--bg2);
}
.callout p { margin: 0 0 8px; font-size: 13px; }
.callout.warn { border-left-color: var(--warn); }

/* ---------- vista Graphify (lista + detalle) ---------- */
#view-graphs.active { display: flex; }
.gr-side {
  width: 250px; flex: 0 0 250px;
  border-right: 1px solid var(--border); background: var(--bg2);
  display: flex; flex-direction: column;
}
.gr-detail { flex: 1; min-width: 0; overflow-y: auto; }
.gr-panel { padding: 16px 20px 40px; max-width: 900px; }
.gr-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 6px; }
.gr-head h2 { margin: 0; font-size: 18px; }
.gr-panel .card { margin-top: 14px; }
.gr-panel .graph-actions { margin-top: 12px; }
.gr-target {
  display: flex; align-items: center; gap: 10px;
  padding: 5px 0; font-size: 13px; border-bottom: 1px solid var(--border);
}
.gr-target > .mono { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gr-target .mini-btn { flex: 0 0 auto; }
.gr-informe { max-height: 60vh; overflow-y: auto; font-size: 13px; }
.gr-informe table { width: 100%; border-collapse: collapse; }
.gr-informe td, .gr-informe th { border-bottom: 1px solid var(--border); padding: 3px 6px; text-align: left; }

/* ---- selección múltiple en el explorador de archivos ---- */
.fs-check { flex: none; margin-right: 6px; accent-color: var(--accent); }
.fs-row.picked { background: var(--accent-suave); }
.files-toolbar > .mini-btn.active { color: var(--accent); border-color: var(--accent); }
#fsSelectBar .mini-btn { width: auto; min-width: var(--ctl-h-sm); padding: 0 10px; font-size: 12px; }

/* ---- ordenación y detalle en el explorador ---- */
.fs-sort { display: flex; align-items: center; gap: 6px; color: var(--muted); font-size: 12px; white-space: nowrap; }
/* el selector lo envuelve el buscador de desplegables: se estiliza el botón */
.fs-sort .ss { min-width: 118px; }
.fs-sort .ss-btn { font-size: 12px; }
.fs-row .meta.size { width: 78px; text-align: right; flex: none; }
.fs-row .meta.when { width: 116px; text-align: right; flex: none; }
.fs-info { display: flex; flex-direction: column; gap: 2px; margin: 10px 0 4px; }
.fs-info-row {
  display: flex; gap: 12px; padding: 5px 0; border-bottom: 1px solid var(--border);
  font-size: 13px; align-items: baseline;
}
.fs-info-row:last-of-type { border-bottom: none; }
.fs-info-row .k { width: 120px; flex: none; color: var(--muted); }
.fs-info-row .v { flex: 1; min-width: 0; word-break: break-all; font-size: 12px; }
@media (max-width: 820px) {
  .fs-row .meta.when { display: none; }   /* en móvil no cabe: queda en el detalle */
  /* se va la palabra «Ordenar», pero el selector se queda: sin él no habría
     forma de ordenar desde el móvil */
  .fs-sort { font-size: 0; gap: 0; }
  .fs-sort select { font-size: 12px; }
}

/* las tres salidas del reinicio no caben en una línea en pantallas estrechas */
.reset-actions { flex-wrap: wrap; gap: 8px; }
@media (max-width: 560px) {
  .reset-actions { flex-direction: column-reverse; align-items: stretch; }
  .reset-actions button { width: 100%; }
}

/* ---------- vista de consumo (OpenRouter y Antigravity) ---------- */

/* Las cifras de dinero y tokens se comparan en vertical, así que van a la
   derecha y en monoespaciada: alineadas se leen de un vistazo. */
.gasto-linea { display: flex; justify-content: space-between; gap: 12px; padding: 3px 0; font-size: 13px; }
.gasto-linea strong { font-family: var(--mono); font-weight: 600; }
.gasto-linea strong.danger { color: var(--err); }
/* Estado de una sede de Ollama: conectada en verde, apagada en gris. Es el
   mismo par de colores que los puntos de conexión del resto del panel. */
.gasto-linea strong.ok { color: var(--ok); }
.gasto-linea strong.muted { color: var(--muted); font-weight: 500; }

.table-scroll { overflow-x: auto; max-height: 460px; overflow-y: auto; }
.tabla-gasto { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.tabla-gasto th, .tabla-gasto td { padding: 6px 10px; text-align: left; white-space: nowrap; }
.tabla-gasto th {
  position: sticky; top: 0; z-index: 1;
  background: var(--panel2); color: var(--muted);
  font-weight: 600; border-bottom: 1px solid var(--border);
}
.tabla-gasto td { border-bottom: 1px solid var(--border); }
.tabla-gasto tbody tr:hover td { background: var(--panel2); }
.tabla-gasto th.num, .tabla-gasto td.num { text-align: right; font-family: var(--mono); }

.card.aviso { border-left: 3px solid var(--amarillo); }

/* ===========================================================================
   CORREO Y CALENDARIO EN EL MÓVIL
   ---------------------------------------------------------------------------
   El problema que resuelve este bloque: en el móvil las cuatro columnas de
   Outlook (carpetas · lista · lector · chat) se apilaban una debajo de otra.
   Al abrir un correo, o el chat de un evento, el contenido nuevo aparecía
   POR DEBAJO de la lista y había que desplazarse a ciegas para encontrarlo.

   Solución: en el móvil solo se ve UNA columna cada vez, como en Outlook o
   Gmail. `data-m365-pane` en <body> dice cuál: lista | detalle | chat. Las
   carpetas pasan a ser el cajón lateral de ☰, igual que en las demás vistas.

   Nada de esto toca al escritorio: todo va dentro de la media query.
   ========================================================================= */

@media (max-width: 820px) {
  /* El lateral de buzones se comporta como el cajón del resto del panel. La
     regla de arriba (.chat-list, .gh-repolist, .ob-side) le da posición,
     transición y sombra; aquí solo se le suma a esa familia. */
  .ml-side {
    position: fixed; top: var(--topbar-h); left: 0; z-index: 47;
    bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
    width: min(85vw, 320px); flex: none;
    transform: translateX(-102%); transition: transform .22s ease;
    box-shadow: var(--sombra);
  }
  body.drawer-open .ml-side { transform: none; }
  body.typing .ml-side { bottom: 0; }

  /* Arrastrar anchos no tiene sentido con una sola columna. */
  .ml-sep { display: none !important; }

  /* --- una columna cada vez --- */
  .ml-panes { position: relative; display: block; flex: 1 1 auto; min-height: 0; }
  .ml-panes > .ml-list,
  .ml-panes > .ml-reader,
  .ml-panes > .ml-chat {
    position: absolute; inset: 0;
    width: auto; max-width: none; flex: none;
    max-height: none; overflow-y: auto;
    border-bottom: 0;
  }
  .ml-panes > .ml-list, .ml-panes > .ml-reader { display: none; }
  .ml-panes > .ml-chat { display: none; overflow: hidden; }

  body[data-m365-pane="lista"]   .ml-panes > .ml-list   { display: block; }
  body[data-m365-pane="detalle"] .ml-panes > .ml-reader { display: block; }
  body[data-m365-pane="chat"]    .ml-panes > .ml-chat   { display: flex; }
  /* `.hidden` sigue mandando por encima de todo lo anterior (el chat vive
     escondido hasta que se pide, y el lector del calendario también). */
  .ml-panes > .hidden { display: none !important; }

  /* --- barra de vuelta --- */
  .m365-nav {
    display: flex; align-items: center; gap: 8px;
    padding: 6px 10px; border-bottom: 1px solid var(--border);
    background: var(--bg2); flex: 0 0 auto;
  }
  .m365-nav.hidden { display: none !important; }
  .m365-nav-titulo {
    flex: 1; min-width: 0; font-size: 13px; font-weight: 600;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .m365-volver { flex: 0 0 auto; }

  /* Leyendo un correo o hablando con el agente, las barras de la bandeja
     (pestañas, buscador, filtros, selección) solo roban pantalla: se van y
     vuelven al pulsar «‹ Bandeja». */
  body:not([data-m365-pane="lista"]) .m365-tabs,
  body:not([data-m365-pane="lista"]) .m365-body > .ml-head,
  body:not([data-m365-pane="lista"]) .m365-body > .ml-filters,
  body:not([data-m365-pane="lista"]) .m365-body > .ml-selbar { display: none !important; }

  /* --- cabeceras y filtros: nada de barras que empujan a lo ancho --- */
  .m365-tabs { overflow-x: auto; flex-wrap: nowrap; scrollbar-width: none; padding: 6px 8px; }
  .m365-tabs::-webkit-scrollbar { display: none; }
  .m365-tabs .res-tab { flex: 0 0 auto; }
  #m365Areas, #mlScope, #spScope, #calScope { display: none; }

  .ml-head { flex-wrap: wrap; gap: 6px; padding: 8px 10px; }
  .ml-head input[type="search"] { flex: 1 1 100%; order: -1; }
  .ml-head > button, .ml-head > select { flex: 0 0 auto; }
  .ml-filters { padding: 8px 10px; gap: 8px; }
  .ml-filters label { flex: 1 1 46%; }
  .ml-filters input[type="text"], .ml-filters input[type="date"] { width: 100%; min-width: 0; }
  .ml-selbar { padding: 8px 10px; gap: 6px; }
  .ml-selbar .ghost-btn { flex: 1 1 auto; }

  /* --- lector --- */
  .ml-reader { padding: 12px 12px 40px; }
  .ml-read-subject { font-size: 16px; }
  .ml-actions .ghost-btn, .ml-actions .primary-btn { flex: 1 1 auto; }
  .ml-body { font-size: 14px; }
  /* Un correo con tabla ancha desplazaba la pantalla entera hacia los lados. */
  .ml-body { overflow-x: auto; -webkit-overflow-scrolling: touch; }

  /* --- calendario --- */
  .cal-kanban { padding: 8px; gap: 8px; }
  .cal-col { flex: 0 0 78vw; max-width: 300px; }
  .cal-col-body { max-height: none; }
  .cal-semana { min-width: 0; }
  .cal-horas { flex: 0 0 42px; }
  .cal-dia { min-width: 84px; }
  /* La cabecera del chat prestado sobra: la barra de vuelta ya dice de qué
     conversación se trata y trae el «‹» para salir. */
  .ml-chat > .ml-chat-head { display: none; }

  .cal-mes { min-width: 520px; }          /* debajo de esto el mes es ilegible */
  .cal-celda { min-height: 66px; }
  .ml-panes > .ml-list.cal-ancho { overflow: auto; }
}

/* El calendario en horizontal: la rejilla de semana necesita todo el alto. */
@media (max-width: 900px) and (max-height: 520px) and (pointer: coarse) {
  .cal-col { flex: 0 0 46vw; }
}

/* ===========================================================================
   DETALLE FLOTANTE DEL CALENDARIO
   ---------------------------------------------------------------------------
   En Kanban / Semana / Mes la rejilla ocupa todo el ancho, así que el panel de
   detalle no cabe al lado. Antes se ocultaba: al pulsar una reunión se cargaba
   el detalle en un contenedor invisible y no pasaba nada visible. Ahora se
   asoma flotando sobre la rejilla, como el «peek» de Outlook.
   ========================================================================= */
.cal-flotante {
  position: absolute; top: 8px; right: 8px; bottom: 8px; z-index: 8;
  width: min(400px, 46vw);
  background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
  box-shadow: var(--sombra); padding: 14px 16px 20px;
}
.cal-flotante-cerrar {
  position: absolute; top: 6px; right: 8px;
  background: none; border: 0; color: var(--muted); font-size: 18px; line-height: 1;
  padding: 4px 6px; border-radius: 6px;
}
.cal-flotante-cerrar:hover { color: var(--accent); background: var(--panel); }
@media (max-width: 820px) {
  /* En el móvil el detalle es una columna más, no un flotante. */
  .ml-panes > .ml-reader.cal-flotante {
    position: absolute; inset: 0; width: auto;
    border: 0; border-radius: 0; box-shadow: none; padding: 12px 12px 40px;
  }
}

/* ===========================================================================
   ETIQUETAS DE COLORES (las «categorías» de Outlook)
   ---------------------------------------------------------------------------
   Una categoría es un NOMBRE con un color. El nombre viaja con el correo o la
   reunión; el color sale de la tabla del buzón (o, si esa conexión no tiene
   permiso para leerla, del color guardado en este navegador).

   El color concreto llega SIEMPRE desde JavaScript en variables en línea
   (--cat-color y sus derivados con transparencia), porque no se sabe de
   antemano: aquí solo está la forma.
   ========================================================================= */

.cat-chips { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.cat-chips.en-linea { display: inline-flex; vertical-align: middle; }
.ml-subject + .cat-chips, .ml-preview + .cat-chips { margin-top: 4px; }

.cat-chip {
  display: inline-flex; align-items: center; gap: 5px; max-width: 100%;
  padding: 0 8px; border-radius: 999px;
  font-size: 11px; line-height: 18px; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
  color: var(--text);
  background: var(--cat-fondo, var(--panel2));
  border: 1px solid var(--cat-borde, var(--border));
}
.cat-chip .cat-punto {
  flex: 0 0 auto; width: 8px; height: 8px; border-radius: 50%;
  background: var(--cat-color, var(--muted));
}
/* Chip pulsable (quitar la etiqueta desde el lector) */
.cat-chip.quitable { cursor: pointer; }
.cat-chip.quitable:hover { border-color: var(--cat-color, var(--accent)); }
.cat-chip .cat-x { color: var(--muted); font-size: 11px; margin-left: 1px; }
.cat-chip.quitable:hover .cat-x { color: var(--err); }

/* Franja de color a la izquierda de la fila / tarjeta: el vistazo rápido de
   Outlook. Va en box-shadow y no en border para no pelearse con el borde de
   «seleccionado» ni descuadrar el ancho. */
.ml-item.con-cat { box-shadow: inset 4px 0 0 var(--cat-color); }
.cal-card.con-cat { border-left-color: var(--cat-color); }
.cal-mini.con-cat { border-left-color: var(--cat-color); }

/* Señales de la fila: adjuntos, importancia y seguimiento. Antes solo se veía
   «leído / sin leer», y con la bandeja llena eso no basta para orientarse. */
.ml-marcas { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; }
.ml-marca { font-size: 11px; line-height: 1; }
.ml-marca.imp { color: var(--err); font-weight: 700; }
.ml-marca.flag { color: var(--warn); }
.ml-marca.snooze { color: var(--blue); }

/* --- firmas de correo --- */
.mc-firma-campo .row { align-items: center; }
.mc-firma-campo .row > .ss, .mc-firma-campo .row > select { flex: 1; min-width: 0; }
.mc-firma-preview {
  margin-top: 8px; padding: 10px 12px; font-size: 13px;
  border: 1px dashed var(--border); border-radius: 8px; background: var(--bg2);
  max-height: 180px; overflow-y: auto;
}
.mc-firma-preview img { max-width: 100%; height: auto; }

.firma-layout { display: flex; gap: 14px; margin-top: 12px; align-items: flex-start; }
.firma-lista {
  flex: 0 0 190px; width: 190px;
  border: 1px solid var(--border); border-radius: 10px; background: var(--bg2);
  display: flex; flex-direction: column; overflow: hidden;
}
.firma-lista-head {
  display: flex; align-items: center; gap: 8px; padding: 8px 10px;
  border-bottom: 1px solid var(--border); font-size: 11px; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
}
.firma-lista-head > span:first-child { flex: 1; }
.firma-items { max-height: 260px; overflow-y: auto; padding: 4px; }
.firma-item {
  display: flex; align-items: center; gap: 6px;
  padding: 7px 8px; border-radius: 7px; cursor: pointer; font-size: 13px;
}
.firma-item:hover { background: var(--panel2); }
.firma-item.active { background: var(--panel2); color: var(--accent); }
.firma-item-nombre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.firma-edit { flex: 1; min-width: 0; }
.firma-barra {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  padding: 6px; border: 1px solid var(--border); border-bottom: none;
  border-radius: 8px 8px 0 0; background: var(--bg2);
}
.firma-barra button {
  min-width: 28px; height: 26px; padding: 0 7px; font-size: 12px;
  background: none; color: var(--text); border: 1px solid transparent;
  border-radius: 6px; cursor: pointer;
}
.firma-barra button:hover { background: var(--panel2); border-color: var(--border); }
.firma-barra button.active { color: var(--accent); border-color: var(--accent-dim); }
.firma-editor, .firma-html {
  width: 100%; min-height: 150px; max-height: 320px; overflow-y: auto;
  padding: 10px 12px; font-size: 13px;
  border: 1px solid var(--border); border-radius: 0 0 8px 8px; background: var(--panel);
  color: var(--text);
}
.firma-editor:focus, .firma-html:focus { outline: none; border-color: var(--accent-dim); }
.firma-editor img { max-width: 100%; height: auto; }
.firma-editor a { color: var(--blue); }

.firma-asignaciones { display: flex; flex-direction: column; gap: 6px; }
.firma-asig-fila {
  display: grid; grid-template-columns: minmax(140px, 1.4fr) 1fr 1fr;
  gap: 10px; align-items: center;
}
.firma-asig-cab { font-size: 11px; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); }
.firma-asig-buzon {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px;
}
@media (max-width: 720px) {
  .firma-layout { flex-direction: column; }
  .firma-lista { flex: none; width: 100%; }
  .firma-asig-fila { grid-template-columns: 1fr; gap: 4px; }
  .firma-asig-cab { display: none; }
}

/* --- correos pospuestos (lateral) --- */
.ml-pospuestos { border-top: 1px solid var(--border); padding: 8px 6px 10px; }
.ml-pospuesto {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 6px; border-radius: 7px; font-size: 12.5px;
}
.ml-pospuesto:hover { background: var(--panel2); }
.ml-pospuesto-txt { flex: 1; min-width: 0; cursor: pointer; }
.ml-pospuesto-asunto {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ml-pospuesto .mini-btn { flex: 0 0 auto; }
.posponer-menu .cat-menu-nueva .row { gap: 6px; }
.posponer-menu input[type="datetime-local"] {
  flex: 1; min-width: 0; height: var(--ctl-h-sm); font-size: 12.5px;
}
.ml-item.marcado { background: color-mix(in srgb, var(--warn) 8%, transparent); }
@supports not (background: color-mix(in srgb, red 8%, transparent)) {
  .ml-item.marcado { background: var(--bg2); }
}

/* --- selector de etiquetas --- */
.cat-menu {
  position: fixed; z-index: 60; min-width: 250px; max-width: min(340px, 94vw);
  max-height: min(60vh, 420px); overflow-y: auto;
  background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  box-shadow: var(--sombra); padding: 6px;
}
.cat-menu-head {
  padding: 6px 8px 8px; font-size: 11px; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
}
.cat-opcion {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 8px; border-radius: 7px; cursor: pointer; font-size: 13px;
}
.cat-opcion:hover { background: var(--panel2); }
.cat-opcion input { flex: 0 0 auto; margin: 0; accent-color: var(--cat-color, var(--accent)); }
.cat-opcion .cat-punto {
  flex: 0 0 auto; width: 11px; height: 11px; border-radius: 3px;
  background: var(--cat-color, var(--muted));
}
.cat-opcion .cat-nombre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cat-menu-nueva { border-top: 1px solid var(--border); margin-top: 6px; padding: 8px; }
.cat-menu-nueva .row { display: flex; gap: 6px; align-items: center; }
.cat-menu-nueva input[type="text"] { flex: 1; min-width: 0; height: var(--ctl-h-sm); font-size: 13px; }
.cat-paleta { display: flex; flex-wrap: wrap; gap: 5px; margin: 8px 0; }
.cat-color {
  width: 20px; height: 20px; border-radius: 5px; cursor: pointer;
  border: 2px solid transparent; background: var(--cat-color);
}
.cat-color.sel { border-color: var(--text); }
.cat-menu-aviso { padding: 6px 8px; font-size: 11.5px; color: var(--muted); }
.cat-menu-pie { display: flex; gap: 6px; padding: 6px 2px 2px; }
.cat-menu-pie button { flex: 1; }

/* ---------- desplegable de grupos y de carpetas del servidor ---------- */
/* Reutiliza la caja de .cat-menu: es el mismo objeto de interfaz (un menú
   flotante anclado a un botón), solo cambia lo que lista. */
.grp-menu { min-width: 280px; max-width: min(420px, 94vw); }
.grp-buscador { border-top: none; margin-top: 0; padding: 0 6px 8px; }
.grp-buscador input { width: 100%; height: var(--ctl-h-sm); font-size: 13px; }
.grp-lista { max-height: min(46vh, 320px); overflow-y: auto; }
.grp-opcion { justify-content: space-between; gap: 10px; }
.grp-opcion .cat-nombre { flex: 1; min-width: 0; }
.grp-opcion.actual { color: var(--accent); }
.grp-actual { text-transform: none; letter-spacing: 0; color: var(--accent); }
.grp-opcion.grp-nueva { color: var(--ok); }
.ruta-menu .grp-lista .cat-nombre { font-family: var(--mono); font-size: 12.5px; }
.ruta-atajos { display: flex; flex-wrap: wrap; gap: 5px; padding: 0 6px 8px; }
.ruta-atajos button { font-size: 11.5px; }

/* Campo de formulario con desplegable al lado (grupo, carpeta…) */
.grp-campo { display: flex; gap: 6px; align-items: center; }
.grp-campo > input { flex: 1; min-width: 0; }
.grp-campo-btn {
  flex: 0 0 auto; width: 32px; height: var(--ctl-h, 34px);
  background: var(--panel2); color: var(--text);
  border: 1px solid var(--border); border-radius: 8px; cursor: pointer;
}
.grp-campo-btn:hover { border-color: var(--accent-dim); color: var(--accent); }

/* Filtro por etiqueta en el lateral (debajo de las carpetas) */
.ml-cats { border-top: 1px solid var(--border); padding: 8px 6px 12px; }
.ml-cats-head {
  display: flex; align-items: center; gap: 6px;
  padding: 0 6px 6px; font-size: 11px; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
}
.ml-cats-head .mini-btn { width: 22px; height: 22px; font-size: 12px; }
.ml-cat-fila {
  display: flex; align-items: center; gap: 7px;
  padding: 4px 6px; min-height: 26px; border-radius: 4px;
  cursor: pointer; font-size: 12.5px;
}
.ml-cat-fila:hover { background: var(--panel); }
.ml-cat-fila.active { background: var(--panel); color: var(--text); box-shadow: inset 3px 0 0 var(--cat-color); }
.ml-cat-fila .cat-punto {
  flex: 0 0 auto; width: 10px; height: 10px; border-radius: 3px; background: var(--cat-color);
}
.ml-cat-fila .cat-nombre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ml-cat-vacio { padding: 4px 8px; font-size: 11.5px; color: var(--muted); }
@media (pointer: coarse) {
  .ml-cat-fila { min-height: 34px; }
  .cat-opcion { padding: 10px 8px; }
  .cat-color { width: 26px; height: 26px; }
}

/* ---------- etiqueta de color de una conversación y de un grupo ---------- */
.session-item.con-cat { box-shadow: inset 4px 0 0 var(--cat-color); }
.group-head.con-cat { box-shadow: inset 4px 0 0 var(--cat-color); }
.sess-etiqueta {
  flex: 0 0 auto; display: inline-flex; align-items: center; gap: 4px;
  padding: 0 7px; border-radius: 999px; font-size: 10.5px; line-height: 16px;
  color: var(--text); background: var(--cat-fondo); border: 1px solid var(--cat-borde);
  max-width: 110px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Botón de color de un grupo de conversaciones. Discreto: solo aparece al
   pasar por encima (o siempre, si no hay ratón). */
.group-head { position: relative; }
.group-nombre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.grupo-color-btn {
  flex: 0 0 auto; background: none; border: 0; color: var(--muted);
  font-size: 12px; line-height: 1; padding: 2px 4px; border-radius: 5px;
  opacity: 0; transition: opacity .12s;
}
.group-head:hover .grupo-color-btn { opacity: .75; }
.grupo-color-btn:hover { opacity: 1 !important; background: var(--panel2); }
@media (pointer: coarse) { .grupo-color-btn { opacity: .6; padding: 6px 8px; } }

/* En la rejilla de la semana las tarjetas tienen la altura de la reunión: los
   chips no caben y solo estorban. Ahí basta con la franja de color. */
.cal-card-abs .cat-chips { display: none; }

/* ---------- WhatsApp ----------
   La vista reutiliza el layout del correo (.ml-side │ .ml-list │ .ml-reader │
   .ml-chat) sin tocarlo: aquí solo va lo suyo, que es el hilo de burbujas. */

.wa-cuenta { padding: 10px 12px; border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: 6px; }
.wa-cuenta .primary-btn { align-self: flex-start; }
.wa-estado { display: flex; align-items: center; gap: 8px; font-size: 13px; }
.wa-punto { width: 9px; height: 9px; border-radius: 50%; background: var(--muted); flex: 0 0 auto; }
.wa-punto.ok { background: var(--ok); }
.wa-punto.warn { background: var(--warn); }
.wa-punto.bad, .wa-punto.off { background: var(--err); }
.wa-punto.off { background: var(--muted); }
.wa-badge-bot { margin-left: 6px; font-size: 11px; }

/* Los filtros son <button> y no <div> como las carpetas del correo (son
   acciones, no un árbol): hay que quitarles el cromo del botón y que ocupen
   el ancho de la barra, o quedarían escalonados y de anchos distintos. */
#waFiltros .ml-folder {
  width: 100%; background: none; border: 0; font: inherit; text-align: left;
}
#waFiltros .ml-folder:hover { background: var(--panel); }
#waFiltros .ml-folder.active { background: var(--panel); color: var(--accent); }

/* Hilo de burbujas. Lo mío a la derecha, lo del otro a la izquierda: es la
   convención de cualquier cliente de mensajería y no hace falta más pista. */
.wa-hilo {
  display: flex; flex-direction: column; gap: 8px;
  padding: 12px 4px; max-height: calc(100vh - 320px); overflow-y: auto;
}
.wa-burbuja {
  align-self: flex-start; max-width: min(78%, 620px);
  background: var(--panel2); border: 1px solid var(--border);
  border-radius: 12px 12px 12px 4px;
  /* El hueco de la derecha es para el ⌄ de las acciones, que va dentro de la
     burbuja: sin él se sienta encima de la primera línea del mensaje. */
  padding: 8px 26px 8px 11px;
}
.wa-burbuja.mia {
  align-self: flex-end; background: var(--accent-suave); border-color: var(--accent-dim);
  border-radius: 12px 12px 4px 12px;
}
.wa-autor { font-size: 12px; font-weight: 600; color: var(--accent); margin-bottom: 3px; }
.wa-cita {
  border-left: 3px solid var(--accent-dim); padding: 2px 8px; margin-bottom: 5px;
  font-size: 12px; color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* `pre-wrap` y no `pre`: los mensajes traen sus saltos de línea, pero una URL
   larga no debe ensanchar la columna entera. */
.wa-texto { white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; }
.wa-transcripcion {
  margin-top: 6px; padding: 6px 8px; border-radius: 8px;
  background: var(--bg2); font-size: 13px; font-style: italic; color: var(--muted);
  white-space: pre-wrap; overflow-wrap: anywhere;
}
/* La fila de acciones del adjunto va DEBAJO de la vista previa y en pequeño:
   con la foto delante, el nombre del fichero es letra pequeña, no el mensaje. */
.wa-media { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12px; margin-top: 5px; color: var(--muted); }
.wa-media-nombre { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.wa-media-link { color: var(--blue); text-decoration: none; font-size: 12px; }
.wa-media-link:hover { text-decoration: underline; }
.wa-media-error { color: var(--err); font-size: 12px; margin-top: 4px; }

/* Vista previa dentro de la burbuja. Los topes de alto son para que una foto
   vertical no ocupe la pantalla entera y haya que hacer scroll para leer el
   mensaje siguiente; a tamaño completo se ve en el visor. */
.wa-vista { margin: 2px 0; }
.wa-img {
  max-width: 100%; max-height: 280px; display: block;
  border-radius: 10px; background: var(--bg2); cursor: zoom-in;
}
.wa-img.sticker { max-height: 130px; background: none; cursor: zoom-in; }
.wa-video { max-width: 100%; max-height: 320px; display: block; border-radius: 10px; background: #000; }
.wa-audio { display: flex; align-items: center; gap: 6px; }
.wa-audio audio { flex: 1; min-width: 0; height: 34px; }
.wa-vel { flex: none; min-width: 38px; }

/* Visor a pantalla completa (foto, vídeo, audio, PDF y texto). Por encima de
   los modales (.modal es z-index 50): se abre desde el hilo, y si algún día se
   abre desde dentro de un modal tiene que quedar delante, no detrás.

   Aquí SÍ hay negro y blanco literales, y es la excepción a la regla de arriba:
   un visor de fotos va oscuro en las dos pieles —como cualquier galería— porque
   lo que tiene que mandar es la imagen, no el tema del panel. Con `--overlay`
   (que es translúcido y aclara en la piel clara) se vería el hilo por debajo. */
.visor {
  position: fixed; inset: 0; z-index: 120;
  background: rgba(0, 0, 0, .88);
  display: flex; flex-direction: column;
}
.visor-barra {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 10px 14px; background: rgba(0, 0, 0, .35); color: #fff;
}
.visor-barra .spacer { flex: 1; }
.visor-barra .ghost-btn { color: #fff; border-color: rgba(255, 255, 255, .35); background: transparent; }
.visor-barra .ghost-btn:hover { background: rgba(255, 255, 255, .12); }
.visor-nombre { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 60vw; }
.visor-cuerpo {
  flex: 1; min-height: 0; display: flex; align-items: center; justify-content: center;
  padding: 14px; overflow: auto;
}
.visor-img, .visor-video { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: 6px; }
.visor-pdf { width: min(1100px, 96vw); height: 100%; border: 0; border-radius: 6px; background: #fff; }
.visor-texto {
  width: min(1100px, 96vw); max-height: 100%; overflow: auto; align-self: stretch;
  background: var(--bg2); color: var(--text); border-radius: 8px; padding: 14px;
  font-family: var(--mono, monospace); font-size: 13px; white-space: pre-wrap; overflow-wrap: anywhere;
}
.visor-aviso { color: #fff; font-size: 14px; text-align: center; }
.visor-nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 44px; height: 64px; border: 0; border-radius: 8px; cursor: pointer;
  background: rgba(255, 255, 255, .12); color: #fff; font-size: 30px; line-height: 1;
}
.visor-nav:hover { background: rgba(255, 255, 255, .22); }
.visor-nav.prev { left: 10px; }
.visor-nav.next { right: 10px; }
.wa-pie { margin-top: 4px; font-size: 11px; color: var(--muted); text-align: right; }

/* `relative` para que el menú de adjuntar (.ac-menu, que es absoluto) se
   ancle a la caja de escribir y no al primer contenedor posicionado.
   `wrap` + un mínimo en la caja, por lo mismo que en el compositor del chat:
   📎, 🎤 y «📤 Enviar» son fijos y la caja era la única que encogía, así que en
   el móvil se quedaba en un par de centímetros. Cuando no caben todos en una
   línea, la caja se lleva la suya entera. */
.wa-escribir {
  display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end;
  padding: 10px 0 0; border-top: 1px solid var(--border); position: relative;
}
.wa-escribir .attach-menu { left: auto; right: 8px; bottom: calc(100% + 6px); min-width: 220px; }
.wa-escribir textarea {
  flex: 1 1 200px; min-width: 150px; resize: vertical; min-height: 42px;
  background: var(--panel2); color: var(--text);
  border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; font: inherit;
}
@media (max-width: 820px) {
  /* La caja arriba y los botones debajo, con Enviar a la derecha: es la fila
     que se pulsa con el pulgar. */
  .wa-escribir textarea { flex: 1 1 100%; }
  .wa-escribir .primary-btn { margin-left: auto; }
}

/* Aviso de la tarjeta de Ajustes: vincular por Baileys tiene consecuencias
   reales para el número, así que se ve antes de pulsar nada. */
.wa-aviso {
  border: 1px solid var(--warn); border-radius: 8px;
  background: rgba(251, 191, 36, .10); padding: 10px 12px; margin: 8px 0 14px;
  font-size: 13px; line-height: 1.5;
}
.wa-qr { display: flex; justify-content: center; padding: 14px; background: #fff; border-radius: 10px; min-height: 200px; }
.wa-qr svg { width: 100%; max-width: 260px; height: auto; }
.wa-codigo {
  margin-top: 12px; text-align: center; font-family: var(--mono, monospace);
  font-size: 26px; letter-spacing: 5px; padding: 10px; background: var(--panel2); border-radius: 8px;
}
.wa-tab { padding-top: 12px; }
.wa-draft-body { width: 100%; resize: vertical; background: var(--bg2); color: var(--text);
  border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; font: inherit; }

@media (max-width: 820px) {
  /* Igual que en Microsoft 365: leyendo un chat, el buscador de arriba solo
     roba pantalla. Aquí la .ml-head cuelga de .ml-main, no de .m365-body. */
  body:not([data-m365-pane="lista"]) #view-whatsapp .ml-head { display: none !important; }
  .wa-hilo { max-height: none; }
  .wa-burbuja { max-width: 88%; }
}

/* Cuadro de «chat nuevo»: los dos campos, uno debajo del otro y a todo lo
   ancho. En una fila, el del nombre queda tan estrecho que no se lee ni su
   propio placeholder. */
#waNuevo input { width: 100%; margin-bottom: 8px; }
#waNuevo .ml-modal-results { margin-bottom: 8px; }

/* Acciones de un mensaje (responder, reaccionar, reenviar…). El ⌄ vive en la
   esquina de la burbuja y solo se ve al pasar por encima, como en la app: con
   uno visible en cada mensaje el hilo se convierte en una lista de botones. En
   táctil no hay «encima», así que ahí se ve siempre. */
.wa-burbuja { position: relative; }
.wa-menu-btn {
  position: absolute; top: 2px; right: 4px;
  border: 0; background: none; color: var(--muted); cursor: pointer;
  font-size: 15px; line-height: 1; padding: 2px 4px; border-radius: 6px;
  opacity: 0; transition: opacity .12s;
}
.wa-burbuja:hover .wa-menu-btn, .wa-menu-btn:focus-visible { opacity: 1; }
.wa-menu-btn:hover { background: var(--hover); color: var(--text); }
@media (hover: none) {
  .wa-menu-btn { opacity: .65; }
}

/* Fila de reacciones rápidas, arriba del menú del mensaje. */
.wa-react-fila { display: flex; gap: 2px; padding: 6px 8px; border-bottom: 1px solid var(--border); }
.wa-react-btn {
  border: 0; background: none; cursor: pointer; font-size: 19px; line-height: 1;
  padding: 4px 5px; border-radius: 8px;
}
.wa-react-btn:hover { background: var(--hover); transform: scale(1.15); }
.wa-react-btn.puesta { background: var(--accent-suave2); }

/* Reacciones puestas, colgando de la burbuja. */
.wa-reacciones { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 5px; }
.wa-reaccion {
  border: 1px solid var(--border); background: var(--bg2); color: var(--text);
  border-radius: 999px; padding: 1px 7px; font-size: 12px; cursor: pointer; line-height: 1.6;
}
.wa-reaccion.mia { border-color: var(--accent-dim); background: var(--accent-suave); }

/* Barra de mensajes fijados, sobre el hilo. */
.wa-fijado {
  display: flex; align-items: center; gap: 6px;
  padding: 6px 10px; margin-top: 8px;
  background: var(--accent-suave); border-left: 3px solid var(--accent-dim); border-radius: 6px;
}
.wa-fijado-texto {
  flex: 1; min-width: 0; text-align: left; border: 0; background: none; cursor: pointer;
  color: var(--text); font: inherit; font-size: 13px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.wa-burbuja.resaltada { outline: 2px solid var(--accent); }

/* «Respondiendo a…» / «Editando», encima de la caja de escribir. */
.wa-contexto {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 10px; margin-top: 8px; font-size: 12px;
  background: var(--bg2); border-left: 3px solid var(--accent); border-radius: 6px;
}
.wa-contexto-tipo { color: var(--accent); font-weight: 600; flex: none; }
.wa-contexto-texto { flex: 1; min-width: 0; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Barra de grabación: sustituye a la caja de escribir mientras dura. */
.wa-grabando {
  display: flex; align-items: center; gap: 8px; font-size: 13px;
  padding: 10px 0 0; border-top: 1px solid var(--border);
}
.wa-grabando .spacer { flex: 1; }
.wa-rec-punto {
  width: 10px; height: 10px; border-radius: 50%; background: var(--err);
  animation: waLatido 1s ease-in-out infinite;
}
.wa-rec-tiempo { font-family: var(--mono, monospace); }
@keyframes waLatido { 50% { opacity: .25; } }

/* Modo «escoger mensajes»: la burbuja entera es la diana, así que necesita
   sitio para la casilla y una señal clara de estar marcada. */
.wa-burbuja.seleccionable { cursor: pointer; padding-left: 32px; position: relative; }
.wa-burbuja.seleccionable.mia { padding-left: 11px; padding-right: 32px; }
.wa-check { position: absolute; left: 10px; top: 10px; margin: 0; cursor: pointer; }
.wa-burbuja.seleccionable.mia .wa-check { left: auto; right: 10px; }
.wa-burbuja.marcada { outline: 2px solid var(--accent); background: var(--accent-suave); }
.wa-selbar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 10px 0 0; border-top: 1px solid var(--border); font-size: 13px;
}
.wa-selbar .spacer { flex: 1; }


/* Editor de texto del explorador de archivos de la nube. Es un textarea a
   secas a propósito: para una nota, un CSV o un fichero de configuración basta,
   y un editor de código completo aquí solo añadiría peso a la carga inicial. */
.ml-editor {
  width: 100%;
  min-height: 40vh;
  resize: vertical;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 13px;
  line-height: 1.5;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg2);
  color: var(--text);
}

.ml-detalles {
  margin-top: 12px;
  border-top: 1px solid var(--border);
  padding-top: 8px;
}

.ml-detalles > summary {
  cursor: pointer;
  color: var(--muted);
  font-size: 13px;
}

/* Barra de acciones en lote de las tareas y trabajos en segundo plano. */
.tasks-bar-head .spacer { flex: 1; }
.tasks-bar-head .ghost-btn { padding: 2px 8px; font-size: 12px; }
.tasks-selbar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 7px 12px; border-top: 1px solid var(--border);
  background: var(--panel2); font-size: 12.5px;
}
.tasks-selbar .spacer { flex: 1; }
/* En modo selección la fila gana una columna a la izquierda para la casilla. */
.task-row.seleccionable { grid-template-columns: auto auto auto 1fr auto auto; }
.task-row.marcada { background: var(--accent-suave); }
.task-check { margin: 0; cursor: pointer; }

/* Panel global de tareas de la barra superior. */
.tareas-filtros { flex-wrap: wrap; }
/* Los tres botones viajan juntos: si envuelven, envuelven en bloque y no se
   queda uno suelto en una línea para él solo. */
.tareas-acciones { display: flex; gap: 6px; flex: 0 0 auto; }
.tareas-filtros .spacer { flex: 1; }
.tareas-lista { max-height: 46vh; overflow-y: auto; }
.tareas-lista .task-row { grid-template-columns: auto auto auto 1fr auto; }
.tareas-lista .task-row:hover { background: var(--panel2); }
.tarea-sesion { color: var(--muted); font-size: 11.5px; }
#tareasBadge.con-curso { border-color: var(--accent); color: var(--accent); }

/* Ajustes → Sistema: tabla de procesos y de caché de ficheros. Reaprovechan
   `.tabla-gasto`; aquí solo va lo propio de una fila de proceso, que lleva dos
   líneas (qué es y su línea de comando entera, que puede ser larguísima). */
.proc-cmd { max-width: 520px; }
.proc-etiqueta { font-weight: 600; }
.proc-cmd .small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tabla-gasto td .mini-btn { margin-left: 4px; }
