/* ═══════════════════════════════════════════════════════════════════════════
   arquitecto.css — Contenido del dashboard de José (Arquitecto)
   ───────────────────────────────────────────────────────────────────────────
   Valores tomados TAL CUAL de references/index/styles.css (HTML/CSS real
   provisto por Victor), no de la imagen del mockup: es la fuente más
   confiable de las dos, y en un punto la contradice — el ícono del KPI es un
   squircle de 13px, no el círculo que se había medido por muestreo de la
   imagen en un commit anterior.

   Sidebar y header NO están acá a propósito: Victor pidió no tocarlos — el
   sidebar sigue siendo el panel único sin divisiones que ya construimos
   ("scroll continuo"), y no el <hr> + bloque .sidebottom separado que trae
   esta referencia, que rompería esa regla.

   Todo bajo el prefijo .qc-dash para no filtrarse al resto de la app ni ser
   afectado por las reglas del bundle.
   ═══════════════════════════════════════════════════════════════════════════ */

.qc-dash { font-size: 13px; }

/* Fondo de página detrás de las tarjetas -- medido en vivo contra el
   <body> real de norden.puntacana.one/dashboard: rgb(5, 9, 18) = #050912
   (coincide exacto con --q-ink, ya extraído de Norden para el resto de la
   app en quantum-theme.css). #qc-arq-app traía bg-gray-50 remapeado por
   dark-mode-overrides.css a #0d1725 -- notablemente más claro/azulado que
   el real. #qc-arq-app es el <div> raíz propio de montarLayout(), id
   exclusivo de este archivo, seguro de apuntar directo. */
/* !important necesario: quantum-theme.css remapea la clase Tailwind
   bg-gray-50 (que #qc-arq-app trae de fábrica) a --q-surface-2 (#0d1725)
   con !important -- ese token es para superficies elevadas (hover, chips),
   no para el fondo de página, que en Norden real es --q-ink (#050912). */
#qc-arq-app { background-color: #f9fafb !important; }

/* Ancho del sidebar -- medido en vivo contra el <aside> real de
   norden.puntacana.one/dashboard (getBoundingClientRect: 240px, clase
   Tailwind w-60). El markup de acá trae w-64 (256px) -- w-60 no existe en
   el bundle Tailwind compilado de este proyecto (se purga si no se usa en
   ningún otro lado), así que cambiar la clase no tendría efecto; se fija
   con una regla propia en vez de tocar el markup. */
/* Borde derecho: separa el sidebar del contenido en claro (blanco sobre
   blanco si no). En oscuro se anula -- el sidebar original nunca tuvo esa
   línea, el fondo casi idéntico entre aside/contenido no la necesitaba. */
#qc-arq-app > aside { width: 240px; border-right: 1px solid #e5e7eb; }
/* Logo del sidebar: negro (Activos de Marca) en claro, blanco original en oscuro --
   pedido de Victor. Alternado por CSS, no JS, para que reaccione al toggle sin re-render. */
.qc-logo-dark { display: none; }
html.dark-mode .qc-logo-light { display: none; }
html.dark-mode .qc-logo-dark { display: block; }
/* Sidebar oscuro: clases Tailwind bg-slate-900/text-slate-700/border-gray-200
   quedaron como default CLARO en el markup (arquitecto.js) -- acá se
   restauran los hex oscuros originales (slate-900/slate-700/slate-300/
   slate-800), gateado por html.dark-mode, mismo mecanismo que el resto de
   .qc-dash. El ítem activo (bg-indigo-600) no cambia entre modos a
   propósito -- ver comentario en ITEM_ACTIVO/ITEM_INACTIVO. */
/* !important en las 4 reglas: quantum-theme.css remapea [class~="text-gray-600"]
   a var(--q-fg-2) con !important (para el resto de la app) -- sin ganarle
   acá, el sidebar oscuro perdía su color slate-300 original y quedaba con
   ese tono genérico en su lugar. Verificado en vivo: sin !important,
   getComputedStyle devolvía var(--q-fg-2) (#8b97ab), no #cbd5e1. */
html.dark-mode #qc-arq-app > aside { background-color: #0f172a !important; color: #fff !important; border-right: none !important; }
html.dark-mode #qc-arq-app > aside > div { border-bottom-color: rgba(51,65,85,.5) !important; }
html.dark-mode #qc-arq-app > aside nav a.text-gray-600 { color: #cbd5e1 !important; }
html.dark-mode #qc-arq-app > aside nav a.text-gray-600:hover { background-color: #1e293b !important; color: #fff !important; }

/* Sin línea en el header -- pedido de Victor, confirmado en vivo contra el
   <header> real de Norden (border-bottom-width: 0px). Se quitaron las
   clases border-b/border-gray-200 del markup (arquitecto.js), pero
   quantum-theme.css tiene una regla global `header[class~="bg-white"]`
   con !important que agrega esa línea a CUALQUIER header con esa clase en
   TODA la app (decisión previa, para el header de la app principal, no
   para este). Se anula solo acá, sin tocar quantum-theme.css ni el resto
   de la app. */
#qc-arq-app header { border-bottom: none !important; }
/* Header con el mismo fondo continuo de la página en claro (#f9fafb, era
   blanco vía la clase Tailwind bg-white) -- probado en vivo y confirmado
   por Victor. Acotado a claro con :not(.dark-mode) -- sin esto, la
   especificidad por ID le ganaría también al fondo de oscuro (--q-ink,
   regla ya existente en quantum-theme.css, sin tocar). */
html:not(.dark-mode) #qc-arq-app header { background-color: #f9fafb !important; }

.qc-dash .heading { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; flex-wrap: wrap; gap: 12px; }
/* Peso 600 (era 700) -- medido en vivo contra el h1 real de
   norden.puntacana.one/dashboard ("Dashboard"): 24px/600, sin letter-
   spacing negativo. Tamaño ya coincidía, se deja igual. */
.qc-dash .heading h1 { font-size: 24px; margin: 0; letter-spacing: -0.035em; font-weight: 600; color: #111827; }
.qc-dash .heading p { margin: 5px 0 0; color: #6b7280; }
/* Antes .qc-dash .date, dentro del saludo del dashboard -- pedido de
   Victor: sube al header persistente (fuera de .qc-dash), a la izquierda
   de la campana. Padding más chico que el original para que entre en la
   fila de íconos del header (11px/15px era para una fila propia). */
/* Bug real encontrado revisando tipografía claro vs oscuro (pedido de
   Victor): el <h1> del header persistente (título de página, "Departamento
   de Arquitectura"/"Higo 2"/"Tour 360° > Higo 2"/etc.) dependía de la regla
   global html.dark-mode h1 de quantum-theme.css para su tamaño/peso (24px/
   600) -- esa regla SOLO existe bajo html.dark-mode, nunca se escribió el
   equivalente claro (el modo claro nunca se había probado antes de esta
   sesión). En claro, el h1 caía a 16px/400 (default de Tailwind/UA) --
   no es un problema de color, es que el tamaño/peso desaparecían por
   completo. Fijo acá, sin depender del modo, para que sea IDÉNTICO en los
   dos (mismo valor 24px/600/line-height 1.25 que ya usa quantum-theme.css
   en oscuro). No toca quantum-theme.css (afectaría toda la app, no solo
   estas páginas) -- el fix queda acotado a este ID. */
#qc-arq-header-titulo { font-size: 24px; font-weight: 600; line-height: 1.25; }
#qc-arq-app header .qc-arq-fecha-header { border: 1px solid #e5e7eb; border-radius: 7px; padding: 7px 12px; display: flex; align-items: center; gap: 8px; color: #6b7280; font-size: 12.5px; white-space: nowrap; }
#qc-arq-app header .qc-arq-fecha-header svg { width: 16px; height: 16px; color: #6b7280; flex-shrink: 0; }

/* Filtro de /dashboard/inbox (Todos/No leídos/Enviados), mismo patrón de
   botón+menú que el filtro de ARIA (ver /Inbox Screenshot 2026-08-31). */
.qc-dash .filtro-correo-btn { width: 38px; height: 38px; border-radius: 7px; border: 1px solid #e5e7eb; background: transparent; color: #6b7280; display: flex; align-items: center; justify-content: center; cursor: pointer; }
.qc-dash .filtro-correo-btn svg { width: 16px; height: 16px; }
.qc-dash .filtro-correo-btn:hover { color: #111827; background: #f3f4f6; }
.qc-dash .filtro-correo-menu { position: absolute; top: calc(100% + 6px); left: 0; background: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; padding: 4px; min-width: 140px; z-index: 20; box-shadow: 0 8px 24px rgba(0,0,0,.12); }
/* El botón de filtro de Tickets vive en la columna derecha del .topgrid,
   pegado al borde derecho del viewport -- left:0 (default, pensado para
   Bandeja, columna izquierda con espacio a la derecha) hacía que el menú
   se desbordara fuera de la pantalla. Confirmado en vivo: el borde
   derecho del menú caía 78px más allá del viewport. Se abre hacia la
   izquierda en vez de hacia la derecha SOLO para Tickets. */
#qc-dash-filtro-wrap-tickets .filtro-correo-menu { left: auto; right: 0; }
.qc-dash .filtro-correo-opcion { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; border: none; background: transparent; color: #374151; font-size: 12px; padding: 8px 10px; border-radius: 5px; cursor: pointer; text-align: left; }
.qc-dash .filtro-correo-opcion:hover { background: #f3f4f6; color: #111827; }
.qc-dash .filtro-correo-opcion svg { width: 13px; height: 13px; color: #2563eb; flex-shrink: 0; }

/* ── KPIs ── */
.qc-dash .kpis { display: grid; grid-template-columns: repeat(5, 1fr); gap: 11px; margin-bottom: 12px; }
/* Gradiente medido en vivo contra una tarjeta ".glass" real de Norden
   (getComputedStyle del backgroundImage): vertical, no diagonal, con stop
   al 24% -- no el linear-gradient(145deg, ...) que había acá. Incluye el
   backdrop-filter real (Norden lo tiene, Quantum no). Borde no tocado a
   propósito -- Victor pidió específicamente el color de fondo. */
.qc-dash .kpi {
  height: 128px; padding: 17px 14px; position: relative;
  border: 1px solid #e5e7eb; border-radius: 8px;
  background: #ffffff;
  backdrop-filter: blur(6px);
}
.qc-dash .kpi em {
  position: absolute; width: 42px; height: 42px; border-radius: 13px;
  display: flex; align-items: center; justify-content: center; font-style: normal;
}
.qc-dash .kpi em svg { width: 22px; height: 22px; }
.qc-dash .kpi.blue em { color: #2563eb; background: #eff6ff; }
.qc-dash .kpi.green em { color: #059669; background: #ecfdf5; }
.qc-dash .kpi.orange em { color: #d97706; background: #fffbeb; }
.qc-dash .kpi.purple em { color: #7c3aed; background: #f5f3ff; }
.qc-dash .kpi.red em { color: #dc2626; background: #fef2f2; }
.qc-dash .kpi > b, .qc-dash .kpi > strong, .qc-dash .kpi > small { display: block; margin-left: 56px; }
/* 24px/500 (era 26px/700) -- medido en vivo contra el número grande de
   una tarjeta KPI real de norden.puntacana.one/dashboard ("0 m³"). */
.qc-dash .kpi > b { font-size: 24px; color: #111827; font-weight: 500; }
/* 12px (heredaba 13px) -- medido contra el label uppercase de una tarjeta
   KPI de Norden ("VOLUMEN HOY"), 12px/500. El peso ya coincidía. */
.qc-dash .kpi > strong { margin-top: 4px; color: #111827; font-weight: 500; font-size: 12px; }
.qc-dash .kpi > small { color: #6b7280; margin-top: 4px; }
.qc-dash .kpi > a, .qc-dash .kpi > span.next {
  position: absolute; bottom: 11px; left: 14px; font-size: 10px; color: #2563eb;
}
.qc-dash .kpi > span.next { color: #9ca3af; }

/* ── Paneles (base compartida) ── */
/* Mismo gradiente real de Norden que .kpi (ver comentario ahí). */
.qc-dash .panel { border: 1px solid #e5e7eb; border-radius: 8px; background: #ffffff; backdrop-filter: blur(6px); overflow: hidden; }
/* "Bandeja de Entrada" y "Tickets" al mismo alto, 5 filas visibles --
   pedido de Victor. flex-direction:column + footer con margin-top:auto
   (ver .panel footer abajo) para que el footer quede SIEMPRE pegado
   abajo -- con solo el min-height, el espacio vacío quedaba DESPUÉS del
   footer (el footer subía junto con el contenido corto) en vez de antes.
   min-height medido en vivo (getBoundingClientRect) con las 2 tarjetas
   llenas de 5 filas: 468.25px. El cálculo a mano anterior (395px, de
   antes del fix de altura de fila de Tickets) había quedado corto --
   Victor reportó que las tarjetas todavía se achicaban al paginar; con
   un min-height menor a la altura real de 5 filas, paginar a menos
   filas SÍ podía angostar la tarjeta por debajo del contenido completo. */
.qc-dash .panel-cinco-filas { min-height: 468.25px; display: flex; flex-direction: column; }
/* "Mis proyectos" se achicaba al paginar a una página con menos de 5
   filas -- pedido de Victor: mantener la altura fija igual que
   Bandeja/Tickets, footer siempre pegado abajo. Cálculo propio (no reusa
   panel-cinco-filas) porque esta tarjeta tiene además la fila .thead que
   las otras dos no tienen. min-height medido en vivo con la tarjeta
   llena de 5 filas: 448.25px (con .thead ya en 12.5px/700 -- ver esa
   regla; cada vez que .thead cambia de tamaño/peso hay que volver a
   medir este valor, ya pasó dos veces: 441.5px con thead en 8px, 446px
   con thead en 11px/400). */
#qc-arq-app #qc-dash-proyectos { min-height: 448.25px; display: flex; flex-direction: column; }
/* Con el menú del filtro de la tarjeta de Bandeja abierto, overflow:hidden
   recortaría el desplegable (position:absolute) -- se habilita visible
   mientras está abierto (clase agregada/quitada por JS al togglear).
   z-index también hace falta: backdrop-filter crea su propio stacking
   context en CADA .panel, así que el z-index del menú (dentro del
   contexto de Bandeja) no alcanza para ganarle a la tarjeta vecina
   (Tickets) -- hay que subir el z-index de la tarjeta ENTERA mientras el
   menú está abierto, no solo el del menú. */
.qc-dash .panel.qc-dash-panel-menu-abierto { overflow: visible; position: relative; z-index: 30; }
/* Peso 500 (era 600) -- medido contra los headers de panel de
   norden.puntacana.one/dashboard ("ENTREGAS EN CURSO" / "REQUIERE
   ATENCIÓN"), 12-13px/500. Tamaño ya coincidía.
   Hallazgo de Victor: los títulos de tarjeta en Norden son ALL CAPS. */
.qc-dash .panel h2 {
  height: 46px; margin: 0; padding: 0 15px; border-bottom: 1px solid #f3f4f6;
  display: flex; align-items: center; justify-content: space-between; font-size: 13px; color: #111827; font-weight: 500;
  text-transform: uppercase;
}
.qc-dash .panel h2 small { font-weight: 400; color: #6b7280; margin-left: 4px; }
.qc-dash .panel h2 a { font-size: 10px; font-weight: 400; color: #2563eb; }
/* 12.5px/500 (era 10px/400) -- medido contra el link "Ver todas" de un
   header de panel real de Norden. */
/* margin-top:auto empuja el footer al fondo DENTRO de un contenedor
   flex-column (panel-cinco-filas / #qc-dash-proyectos) -- en un .panel
   sin flex-column (la mayoría) esta propiedad no hace nada, auto-margin
   solo tiene efecto en flex/grid. */
.qc-dash .panel footer { border-top: 1px solid #f3f4f6; padding: 11px 15px; color: #2563eb; font-size: 12.5px; font-weight: 500; display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: auto; }
/* Paginador de la tarjeta "Bandeja de Entrada" -- pedido de Victor. */
/* Ahora vive DENTRO de .panel footer (a la derecha de "Ir a Inbox"), no en
   su propia línea -- sin padding/border propio, hereda el del footer. */
.qc-dash .paginador-tarjeta { display: flex; align-items: center; gap: 8px; }
.qc-dash .paginador-tarjeta button { background: transparent; border: 1px solid #e5e7eb; color: #2563eb; border-radius: 6px; padding: 5px 10px; font-size: 11px; cursor: pointer; }
.qc-dash .paginador-tarjeta button:hover:not(:disabled) { background: #f3f4f6; }
.qc-dash .paginador-tarjeta button:disabled { color: #d1d5db; border-color: #e5e7eb; cursor: not-allowed; }
.qc-dash .paginador-tarjeta span { color: #6b7280; font-size: 11px; }
.qc-dash .panel .vacio { padding: 28px 15px; text-align: center; color: #9ca3af; font-size: 11px; }

/* ── Fila superior: Bandeja de Entrada / Tickets, lado a lado -- Mis
   Proyectos va debajo, ocupando las dos columnas (pedido de Victor). */
/* Sin align-items:start a propósito -- pedido de Victor: las tarjetas
   mantienen la misma altura (quedan vacías debajo si hay menos de 5
   filas) en vez de achicarse cada una a su propio contenido. El stretch
   por default de CSS Grid hace que ambas columnas igualen la altura de
   la más alta de la fila. */
.qc-dash .topgrid { display: grid; grid-template-columns: 1.5fr 1.5fr; gap: 11px; margin-bottom: 12px; }
.qc-dash .proyectos-fila { margin-bottom: 12px; }

.qc-dash .thead, .qc-dash .project {
  display: grid; grid-template-columns: 1.45fr .65fr .68fr 1.15fr .8fr; gap: 8px; align-items: center;
}
/* Columna "Cliente" -- solo en la lista completa de Mis Proyectos (pedido
   de Victor a nombre de José), no en la tarjeta resumida del Dashboard.
   6 columnas en vez de 5: se le resta a Proyecto/Progreso/Próxima entrega
   lo que ocupa Cliente, misma suma total. */
.qc-dash .thead.con-cliente, .qc-dash .project.con-cliente {
  grid-template-columns: 1.15fr .95fr .55fr .6fr 1fr .75fr;
}
.qc-dash .sin-cliente { color: #6b7280; }
html.dark-mode .qc-dash .sin-cliente { color: #8fa0b8; }
/* Buscador de "Mis proyectos", dentro de la barra h2 (46px, flex,
   space-between) -- reusa .ibx-buscador (Tickets/Bandeja) pero acotado:
   ese flex:1 está pensado para un header de página completa, no para
   compartir 46px con un título de tarjeta. */
.qc-dash .panel.projects h2 .mp-buscador { flex: 0 1 240px; max-width: 240px; height: 30px; }
.qc-dash .panel.projects h2 .mp-buscador input { padding-top: 6px; padding-bottom: 6px; text-transform: none; }
/* Pedido directo de Victor (2026-08-31): uppercase explícito en los
   encabezados de columna. Reemplaza la nota vieja de abajo ("sin
   text-transform, no estaba en la referencia") -- esa medición era
   contra otra fuente en otro momento; ahora es un pedido explícito, no
   una inferencia de mockup. */
/* 12.5px/500 (era 11px/400, luego 700 -- revertido tras feedback de
   Victor: "menos gruesas como el header 'Mis proyectos'"). 500 es el
   peso real de .panel h2 (el título "Mis Proyectos" mismo), no el 700
   de .pname b -- Victor pidió igualar contra el título de la tarjeta,
   no contra el texto en negrita de fila como se había interpretado
   primero. */
.qc-dash .thead { padding: 9px 11px 6px; color: #6b7280; font-size: 12.5px; font-weight: 500; text-transform: uppercase; }
/* Mismo tamaño que .pname small/.ticket div strong -- pedido de Victor:
   aplicar el tamaño/peso de Tickets a TODAS las columnas de Mis proyectos
   (Progreso, Próxima entrega, Última actividad heredan de acá). */
.qc-dash .project { min-height: 63px; padding: 7px 11px; border-top: 1px solid #f3f4f6; font-size: 12.5px; font-weight: 400; cursor: pointer; }
.qc-dash .project:hover { background: rgba(0,0,0,.025); }
/* Se intentó medir contra "Entregas en curso" de Norden (título 17px/500,
   subtítulo 12px/400) pero NO se aplicó -- revertido tras verificación en
   vivo: la columna "Proyecto" de esta grilla de 5 columnas es demasiado
   angosta para ese tamaño (1.45fr de 5), el título envolvía en 2-5 líneas
   y desbordaba encima de la fila siguiente. La lista de Norden usada como
   referencia vive en un layout de una sola columna, mucho más ancho -- el
   tamaño no es transferible tal cual sin rediseñar la grilla. Pendiente:
   discutir con Victor si vale la pena angostar el resto de las columnas
   para poder subir este tamaño, o dejarlo como está. */
/* Mismo tamaño/peso que .ticket div b/strong -- pedido de Victor: "el
   texto dentro de la tarjeta Tickets está de buen tamaño y weight,
   aplicalo a Mis proyectos". No repite el intento anterior (17px, medido
   directo de Norden) que rompía esta grilla de 5 columnas angosta. */
.qc-dash .project small, .qc-dash .pname small { display: block; color: #6b7280; margin-top: 3px; font-size: 12.5px; font-weight: 400; }
.qc-dash .pname { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #111827; font-weight: 400; }
.qc-dash .pname i {
  width: 42px; height: 36px; border-radius: 4px; flex: none; overflow: hidden;
  background: #f3f4f6; color: #9ca3af; display: flex; align-items: center; justify-content: center;
}
.qc-dash .pname i svg { width: 16px; height: 16px; }
.qc-dash .pname img { width: 42px; height: 36px; border-radius: 4px; object-fit: cover; flex: none; display: block; }
.qc-dash .barra { width: 58px; height: 4px; border-radius: 999px; background: #e5e7eb; margin-top: 4px; overflow: hidden; }
.qc-dash .barra > span { display: block; height: 100%; background: linear-gradient(90deg, #3e8cff, #19d48c); }
.qc-dash .barra.completa > span { background: #19d48c; }
.qc-dash .status { display: flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 400; }
.qc-dash .status i { width: 6px; height: 6px; border-radius: 50%; flex: none; }
.qc-dash .status.blue { color: #2563eb; } .qc-dash .status.blue i { background: #3e96ff; }
.qc-dash .status.yellow { color: #b45309; } .qc-dash .status.yellow i { background: #f4b400; }
.qc-dash .status.green { color: #059669; } .qc-dash .status.green i { background: #19d48c; }

/* Bandeja de Entrada */
.qc-dash .mail { min-height: 61px; border-bottom: 1px solid #f3f4f6; padding: 8px 11px; display: grid; grid-template-columns: 32px 1fr auto auto; gap: 9px; align-items: center; }
.qc-dash .mail > i { width: 29px; height: 29px; border-radius: 50%; background: #f5f3ff; color: #7c3aed; display: flex; align-items: center; justify-content: center; }
.qc-dash .mail > i svg { width: 15px; height: 15px; }
.qc-dash .mail div { min-width: 0; }
.qc-dash .mail b, .qc-dash .mail strong, .qc-dash .mail small { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Título/subtítulo/valor medidos contra la lista "Requiere atención" de
   norden.puntacana.one/dashboard (análogo más cercano: ícono + título +
   valor a la derecha). .mail small (preview) no tiene equivalente directo
   en esa lista de Norden -- se deja como estaba. */
.qc-dash .mail b { font-size: 13px; color: #111827; font-weight: 400; }
.qc-dash .mail strong { font-size: 12.5px; font-weight: 400; margin-top: 3px; color: #4b5563; }
.qc-dash .mail small { color: #9ca3af; font-size: 9px; margin-top: 2px; }
.qc-dash .mail > span { font-size: 12px; font-weight: 500; text-align: right; color: #6b7280; white-space: nowrap; }
.qc-dash .mail > button.eliminar-correo { background: transparent; border: none; color: #9ca3af; cursor: pointer; padding: 5px; border-radius: 5px; display: flex; align-items: center; justify-content: center; }
.qc-dash .mail > button.eliminar-correo svg { width: 14px; height: 14px; }
.qc-dash .mail > button.eliminar-correo:hover { color: #ff4c43; background: rgba(255, 76, 67, .12); }

/* Tickets */
.qc-dash .ticket { min-height: 61px; border-bottom: 1px solid #f3f4f6; padding: 8px 11px; display: grid; grid-template-columns: 8px 1fr auto auto; gap: 9px; align-items: center; }
.qc-dash .ticket > i { width: 8px; height: 8px; border-radius: 50%; }
.qc-dash .ticket > i.red { background: #ff4138; } .qc-dash .ticket > i.yellow { background: #f0bd24; }
.qc-dash .ticket > i.green { background: #19d48c; } .qc-dash .ticket > i.blue { background: #438eff; }
/* Misma lógica que .mail div (ver esa regla, min-width:0) -- SIN esto,
   el texto largo con white-space:nowrap desborda la columna del grid en
   vez de recortarse (grid blowout): era la causa real de que la última
   fila de Tickets midiera 107px en vez de ~74px como las demás, y de
   que la línea divisoria entre filas quedara desalineada contra
   Bandeja. Pedido de Victor: usar la misma lógica de Bandeja acá. */
.qc-dash .ticket div { min-width: 0; }
/* Una sola línea con ellipsis, mismo tratamiento que .mail -- pedido de
   Victor: la descripción no debe envolver, para que las filas de
   Bandeja y Tickets mantengan la misma altura y queden alineadas entre
   las dos tarjetas. */
.qc-dash .ticket div b, .qc-dash .ticket div strong, .qc-dash .ticket div small { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Mismo análogo que .mail (lista "Requiere atención" de Norden) -- mismo
   patrón ícono + título + valor a la derecha. font-size de small ahora
   9px (era 8px) -- igual que .mail small, para que la altura de fila
   coincida exacto, no solo aproximada. */
.qc-dash .ticket div b { font-size: 13px; color: #111827; font-weight: 400; }
.qc-dash .ticket div strong { font-size: 12.5px; font-weight: 400; margin-top: 3px; color: #4b5563; }
.qc-dash .ticket div small { font-size: 9px; color: #6b7280; margin-top: 2px; }
.qc-dash .ticket mark { background: #fef3c7; color: #92400e; border-radius: 4px; padding: 2px 5px; font-size: 7px; margin-left: 4px; }
.qc-dash .ticket > span { font-size: 12px; font-weight: 500; color: #6b7280; text-align: right; }
.qc-dash .ticket > span strong { display: block; color: #dc2626; }
.qc-dash .ticket button { background: transparent; border: 1px solid #2563eb; color: #2563eb; border-radius: 5px; padding: 6px 9px; font-size: 8px; cursor: pointer; }

/* ── Fila inferior: Productividad / Bloqueos / Entregables / Actividad ── */
.qc-dash .bottomgrid { display: grid; grid-template-columns: 1.55fr .8fr .9fr .95fr; gap: 11px; }
.qc-dash .productivity, .qc-dash .smallpanel, .qc-dash .activity { min-height: 274px; position: relative; }

.qc-dash .smallpanel > small { display: block; color: #6b7280; padding: 0 14px; }
/* padding-bottom 6 (era 14) -- el <small> descriptivo va pegado debajo. */
.qc-dash .big { display: block; padding: 14px 14px 6px; font-size: 22px; font-weight: 700; color: #111827; }
.qc-dash .redtext { color: #ff3e38; }
/* Lista de tickets bloqueados de la tarjeta Bloqueos -- las filas .pcol-row
   traen padding 9px 0 (el horizontal lo aporta .pcol-list en Mis Proyectos);
   acá lo aporta este wrapper. padding-bottom alto: despeja el footer
   anclado (position:absolute bottom:0 de .smallpanel footer). */
.qc-dash .bloqueos-lista { padding: 6px 14px 46px; }

/* "Mi productividad" del Dashboard -- 2x2 en vez de la fila de 4 del mockup:
   la tarjeta acá es angosta (1.55fr de 4 columnas), 4 en fila no entraba sin
   recortar los labels de 2-3 palabras ("Tiempo prom. de resolución
   (tickets)"). Mismo contenido/orden que el mockup, layout adaptado al
   espacio real disponible. */
.qc-dash .prod2-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px; padding: 14px 14px 4px; }
.qc-dash .prod2-stat b { display: block; font-size: 19px; font-weight: 500; color: #111827; font-variant-numeric: tabular-nums; }
.qc-dash .prod2-stat span { display: block; font-size: 10.5px; color: #6b7280; margin-top: 3px; line-height: 1.3; }
.qc-dash .prod2-delta { display: block; font-size: 10px; margin-top: 3px; color: #6b7280; }
.qc-dash .prod2-delta.verde { color: #059669; }
.qc-dash .prod2-delta.rojo { color: #dc2626; }
.qc-dash .prod2-stat-na b, .qc-dash .prod2-stat-na span, .qc-dash .prod2-stat-na small { color: #9ca3af; }
.qc-dash .prod2-chart { color: #2563eb; padding: 4px 14px 0; }
.qc-dash .prod2-chart svg { width: 100%; height: 46px; display: block; }
.qc-dash .prod2-chart svg circle { fill: currentColor; }

.qc-dash .donut { width: 102px; height: 102px; border-radius: 50%; margin: 9px auto; display: grid; place-items: center; }
/* Anillo más fino (era 64px de agujero = 19px de grosor) -- medido contra
   el mockup real (100px afuera / 70px adentro = 15px), proporción aplicada
   a nuestro tamaño de 102px (pedido de Victor: "el chart circle pie esta
   mas grueso que el del mockup"). Compartido con el donut del Dashboard
   general (tarjetaDona), mismo criterio ahí. */
/* 77px de agujero (era 71px) -- pedido directo de Victor de afinar el
   anillo más allá de lo que medí en el mockup (ring baja de ~15.5px a
   ~12.5px). */
.qc-dash .donut::after { content: ""; width: 77px; height: 77px; grid-area: 1/1; background: #ffffff; border-radius: 50%; }
/* 500 (era 700, bold implícito de <strong>) -- pedido de Victor de
   reducir el weight; consistente con .kpi > b (número grande del
   Dashboard, ya medido y bajado a 500 en su momento). */
.qc-dash .donut strong { grid-area: 1/1; z-index: 2; font-size: 20px; font-weight: 500; text-align: center; color: #111827; }
.qc-dash .donut strong small { display: block; font-size: 8px; color: #6b7280; font-weight: 400; }

.qc-dash .smallpanel ul { list-style: none; padding: 0 14px; margin: 5px 0; font-size: 9.5px; color: #4b5563; line-height: 1.9; }
.qc-dash .smallpanel ul i { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; }
.qc-dash .smallpanel li b { float: right; color: #6b7280; font-weight: 400; }
.qc-dash .smallpanel footer, .qc-dash .activity footer { position: absolute; bottom: 0; left: 0; right: 0; }

.qc-dash .activity p { margin: 0; padding: 8px 11px; border-bottom: 1px solid #f3f4f6; font-size: 10px; display: flex; align-items: center; gap: 8px; }
.qc-dash .activity p svg { width: 14px; height: 14px; flex: none; }
/* Medido contra el panel "Actividad reciente" real de norden.puntacana.one/
   dashboard -- match directo, mismo tipo de panel. */
.qc-dash .activity p b { display: block; color: #111827; font-weight: 400; font-size: 13px; }
.qc-dash .activity p small { display: block; color: #6b7280; margin-top: 2px; font-size: 11.5px; }

/* ═══════════════════════════════════════════════════════════════════════════
   Modo oscuro — Dashboard (José)
   ───────────────────────────────────────────────────────────────────────────
   Restaura EXACTO los valores oscuros de siempre (ya medidos/aprobados por
   Victor arriba), gateado por html.dark-mode -- el mismo mecanismo que ya usa
   quantum-theme.css para el resto de la app. Claro (arriba) pasa a ser el
   default; nada de tipografía/spacing/layout se toca acá, SOLO color/fondo/
   borde/sombra -- restricción explícita de Victor. Un override por cada regla
   que cambió arriba, mismo selector, para no perder especificidad.
   ═══════════════════════════════════════════════════════════════════════════ */
html.dark-mode #qc-arq-app { background-color: #050912 !important; }
html.dark-mode .qc-dash .heading h1 { color: #eef4ff; }
html.dark-mode .qc-dash .heading p { color: #8fa0b8; }
html.dark-mode #qc-arq-app header .qc-arq-fecha-header { border-color: #162b45; color: #aab7c9; }
html.dark-mode #qc-arq-app header .qc-arq-fecha-header svg { color: #8fa0b8; }
html.dark-mode .qc-dash .filtro-correo-btn { border-color: #162b45; color: #8fa0b8; }
html.dark-mode .qc-dash .filtro-correo-btn:hover { color: #eef4ff; background: #0d2036; }
html.dark-mode .qc-dash .filtro-correo-menu { background: #0b1a2c; border-color: #162b45; box-shadow: 0 8px 24px rgba(0,0,0,.35); }
html.dark-mode .qc-dash .filtro-correo-opcion { color: #c2ccda; }
html.dark-mode .qc-dash .filtro-correo-opcion:hover { background: #12203a; color: #eef4ff; }
html.dark-mode .qc-dash .filtro-correo-opcion svg { color: #3e96ff; }
html.dark-mode .qc-dash .kpi { border-color: #162b45; background: linear-gradient(#0c1626 0%, #09111d 24%); }
html.dark-mode .qc-dash .kpi.blue em { color: #3e8cff; background: #17365d; }
html.dark-mode .qc-dash .kpi.green em { color: #19d48c; background: #103c34; }
html.dark-mode .qc-dash .kpi.orange em { color: #f59e0b; background: #3a2b13; }
html.dark-mode .qc-dash .kpi.purple em { color: #9b6cff; background: #2a1d4d; }
html.dark-mode .qc-dash .kpi.red em { color: #ff5148; background: #421b1d; }
html.dark-mode .qc-dash .kpi > b { color: #eef4ff; }
html.dark-mode .qc-dash .kpi > strong { color: #eef4ff; }
html.dark-mode .qc-dash .kpi > small { color: #8fa0b8; }
html.dark-mode .qc-dash .kpi > a, html.dark-mode .qc-dash .kpi > span.next { color: #3e96ff; }
html.dark-mode .qc-dash .kpi > span.next { color: #526176; }
html.dark-mode .qc-dash .panel { border-color: #162b45; background: linear-gradient(#0c1626 0%, #09111d 24%); }
html.dark-mode .qc-dash .panel h2 { border-bottom-color: #112238; color: #eef4ff; }
html.dark-mode .qc-dash .panel h2 small { color: #8fa0b8; }
html.dark-mode .qc-dash .panel h2 a { color: #3e96ff; }
html.dark-mode .qc-dash .panel footer { border-top-color: #112238; color: #3e96ff; }
html.dark-mode .qc-dash .paginador-tarjeta button { border-color: #162b45; color: #3e96ff; }
html.dark-mode .qc-dash .paginador-tarjeta button:hover:not(:disabled) { background: #0d2036; }
html.dark-mode .qc-dash .paginador-tarjeta button:disabled { color: #526176; border-color: #112238; }
html.dark-mode .qc-dash .paginador-tarjeta span { color: #8fa0b8; }
html.dark-mode .qc-dash .panel .vacio { color: #526176; }
html.dark-mode .qc-dash .thead { color: #667991; }
html.dark-mode .qc-dash .project { border-top-color: #112238; }
html.dark-mode .qc-dash .project:hover { background: rgba(255,255,255,.02); }
html.dark-mode .qc-dash .project small, html.dark-mode .qc-dash .pname small { color: #8fa0b8; }
html.dark-mode .qc-dash .pname { color: #eef4ff; }
html.dark-mode .qc-dash .pname i { background: #12203a; color: #526176; }
html.dark-mode .qc-dash .barra { background: #162b45; }
html.dark-mode .qc-dash .status.blue { color: #3e96ff; }
html.dark-mode .qc-dash .status.yellow { color: #f4b400; }
html.dark-mode .qc-dash .status.green { color: #19d48c; }
html.dark-mode .qc-dash .mail { border-bottom-color: #112238; }
html.dark-mode .qc-dash .mail > i { background: #211a42; color: #a37bff; }
html.dark-mode .qc-dash .mail b { color: #eef4ff; }
html.dark-mode .qc-dash .mail strong { color: #c2ccda; }
html.dark-mode .qc-dash .mail small { color: #667991; }
html.dark-mode .qc-dash .mail > span { color: #8fa0b8; }
html.dark-mode .qc-dash .mail > button.eliminar-correo { color: #526176; }
html.dark-mode .qc-dash .ticket { border-bottom-color: #112238; }
html.dark-mode .qc-dash .ticket div b { color: #eef4ff; }
html.dark-mode .qc-dash .ticket div strong { color: #c2ccda; }
html.dark-mode .qc-dash .ticket div small { color: #8fa0b8; }
html.dark-mode .qc-dash .ticket mark { background: #17304d; color: #f4b400; }
html.dark-mode .qc-dash .ticket > span { color: #8fa0b8; }
html.dark-mode .qc-dash .ticket > span strong { color: #ff4c43; }
html.dark-mode .qc-dash .ticket button { border-color: #1e5ca5; color: #3e96ff; }
html.dark-mode .qc-dash .smallpanel > small { color: #8fa0b8; }
html.dark-mode .qc-dash .donut::after { background: #091726; }
html.dark-mode .qc-dash .donut strong { color: #eef4ff; }
html.dark-mode .qc-dash .donut strong small { color: #8fa0b8; }
html.dark-mode .qc-dash .smallpanel ul { color: #c2ccda; }
html.dark-mode .qc-dash .smallpanel li b { color: #8fa0b8; }
html.dark-mode .qc-dash .activity p { border-bottom-color: #112238; }
html.dark-mode .qc-dash .activity p b { color: #eef4ff; }
html.dark-mode .qc-dash .activity p small { color: #8fa0b8; }
html.dark-mode .qc-dash .prod2-stat b { color: #eef4ff; }
html.dark-mode .qc-dash .prod2-stat span { color: #8fa0b8; }
html.dark-mode .qc-dash .prod2-delta { color: #8fa0b8; }
html.dark-mode .qc-dash .prod2-delta.verde { color: #19d48c; }
html.dark-mode .qc-dash .prod2-delta.rojo { color: #ff4c43; }
html.dark-mode .qc-dash .prod2-stat-na b, html.dark-mode .qc-dash .prod2-stat-na span, html.dark-mode .qc-dash .prod2-stat-na small { color: #526176; }
html.dark-mode .qc-dash .prod2-chart { color: #4798ff; }
/* :not(.redtext) -- sin él, esta regla (1 tag + 3 clases) le gana por
   especificidad a .qc-dash .redtext (2 clases) y el titular de Bloqueos
   perdía el rojo en oscuro. Confirmado con sonda antes del fix. */
html.dark-mode .qc-dash .big:not(.redtext) { color: #eef4ff; }

.qc-dash .ticket-detalle { padding: 16px; }
.qc-dash .ticket-detalle h1 { font-size: 18px; margin: 0 0 4px; }
.qc-dash .ticket-detalle .meta { color: #6b7280; font-size: 11px; margin-bottom: 16px; }
.qc-dash .ticket-detalle .descripcion, .qc-dash .ibx-lectura-cuerpo .descripcion { background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; font-size: 12px; color: #374151; margin-bottom: 16px; white-space: pre-wrap; }
/* Detalle de un correo -- mismo layout que el mockup de ARIA: avatar +
   remitente/"Para mí" + fecha. Reusado por el panel de lectura de la
   bandeja de dos paneles (.ibx-lectura-cuerpo, montarInboxSplit) -- por
   eso las reglas están scopeadas a los DOS contenedores, no solo a
   .ticket-detalle (el verCorreo viejo que las originó ya no existe). */
.qc-dash .ticket-detalle .correo-meta, .qc-dash .ibx-lectura-cuerpo .correo-meta { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 10px; }
.qc-dash .ticket-detalle .correo-meta .avatar, .qc-dash .ibx-lectura-cuerpo .correo-meta .avatar { width: 34px; height: 34px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 13px; flex-shrink: 0; }
.qc-dash .ticket-detalle .correo-meta-texto, .qc-dash .ibx-lectura-cuerpo .correo-meta-texto { flex: 1; min-width: 0; }
.qc-dash .ticket-detalle .correo-meta-texto b, .qc-dash .ibx-lectura-cuerpo .correo-meta-texto b { display: block; font-size: 12.5px; color: #111827; font-weight: 600; }
.qc-dash .ticket-detalle .correo-meta-texto small, .qc-dash .ibx-lectura-cuerpo .correo-meta-texto small { display: block; color: #6b7280; font-size: 10.5px; margin-top: 2px; }
.qc-dash .ticket-detalle .correo-fecha, .qc-dash .ibx-lectura-cuerpo .correo-fecha { font-size: 10.5px; color: #6b7280; white-space: nowrap; margin-top: 2px; }
.qc-dash .ticket-detalle .correo-acciones-bar { display: flex; align-items: center; gap: 8px; margin: 16px 0; }
.qc-dash .ticket-detalle .pill-reply { flex: 1; display: flex; align-items: center; justify-content: center; border: 1px solid #e5e7eb; background: #f9fafb; color: #374151; border-radius: 999px; padding: 10px 16px; font-size: 12px; cursor: pointer; }
.qc-dash .ticket-detalle .pill-reply:hover { background: #f3f4f6; color: #111827; }
.qc-dash .ticket-detalle .icon-circle { width: 38px; height: 38px; border-radius: 50%; border: 1px solid #e5e7eb; background: #f9fafb; color: #6b7280; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; padding: 0; }
.qc-dash .ticket-detalle .icon-circle svg { width: 16px; height: 16px; }
.qc-dash .ticket-detalle .icon-circle:hover { color: #111827; background: #f3f4f6; }
.qc-dash .ticket-detalle .icon-circle.peligro:hover { color: #dc2626; border-color: #dc2626; }
.qc-dash .reply { border-bottom: 1px solid #f3f4f6; padding: 10px 0; font-size: 11.5px; color: #374151; }
.qc-dash .reply small { display: block; color: #9ca3af; font-size: 9px; margin-top: 4px; }
/* Hallmark · component: textarea (reply-form) · genre: modern-minimal
 * states: default · hover · focus · active · disabled · error · success
 * contrast: pass (borde/anillo de foco #3e96ff sobre #091827 > 3:1)
 * No se introduce un sistema de tokens nuevo a propósito -- el proyecto
 * ya tiene su propia paleta hex establecida (auditoría Hallmark previa
 * de esta sesión), y este es un fix acotado a un componente, no una
 * migración. Se reusan los mismos hex ya en uso en el resto del archivo.
 * Pedido de Victor: "el campo de texto es muy poco alto" -- min-height
 * 70px -> 150px (2.1x) + resize vertical, y de paso se agregan los
 * estados que faltaban (antes solo tenía un borde estático sin :hover
 * ni :focus-visible -- la auditoría Hallmark anterior de esta sesión ya
 * había marcado la falta de :focus-visible en todo el proyecto como
 * hallazgo Major; este es el primer lugar donde se corrige). */
.qc-dash .reply-form textarea {
  width: 100%;
  min-height: 150px;
  max-height: 360px;
  background: #f9fafb;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  color: #111827;
  padding: 12px 14px;
  font: inherit;
  line-height: 1.5;
  margin-bottom: 8px;
  resize: vertical;
  transition: border-color 120ms ease-out;
}
.qc-dash .reply-form textarea::placeholder { color: #9ca3af; }
.qc-dash .reply-form textarea:hover:not(:disabled) { border-color: #2563eb; }
.qc-dash .reply-form textarea:focus-visible {
  outline: none;
  border-color: #2563eb;
  box-shadow: 0 0 0 3px rgba(37, 99, 235, .18);
}
.qc-dash .reply-form textarea:active:not(:disabled) { border-color: #2563eb; }
.qc-dash .reply-form textarea:disabled { opacity: .5; cursor: not-allowed; background: #f3f4f6; }
.qc-dash .reply-form textarea.is-error { border-color: #dc2626; }
.qc-dash .reply-form textarea.is-error:focus-visible { box-shadow: 0 0 0 3px rgba(220, 38, 38, .18); }
.qc-dash .reply-form textarea.is-success { border-color: #059669; }
.qc-dash .reply-form button, .qc-dash .acciones button { border: 1px solid #2563eb; color: #2563eb; background: transparent; border-radius: 6px; padding: 7px 12px; font-size: 11px; cursor: pointer; margin-right: 6px; }
.qc-dash .reply-form button:focus-visible, .qc-dash .acciones button:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(62, 150, 255, .3); }
.qc-dash .acciones { margin-bottom: 16px; }
.qc-dash .reply-form-footer { display: flex; align-items: center; gap: 8px; margin-top: 8px; }

/* Ícono de clip para adjuntar archivo -- botón cuadrado con bordes
   redondeados, sin texto (antes mostraba el <input type=file> crudo tal
   cual, con el texto nativo del navegador "Choose Files/No file chosen"
   -- hallazgo de Victor). Sin prefijo .qc-dash a propósito: los modales
   de "Nuevo correo"/"Nuevo ticket" (abrirFormularioNuevoCorreo/
   abrirFormularioNuevoTicket) cuelgan directo de document.body, fuera
   del contenedor .qc-dash -- un selector .qc-dash .clip-adjuntar no les
   pegaría. Compartida por los 4 lugares que adjuntan archivo: editor de
   Responder de tickets, respuesta de email, y los dos modales. Pedido de
   Victor: siempre a la derecha del botón de enviar. */
.clip-adjuntar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border-radius: 6px; border: 1px solid #d1d5db;
  color: #6b7280; cursor: pointer; flex-shrink: 0; background: transparent;
}
.clip-adjuntar:hover { color: #111827; background: #f3f4f6; }
.clip-adjuntar svg { width: 15px; height: 15px; }
.clip-adjuntar input { display: none; }
.qc-dash .adjunto-chip { display: inline-flex; align-items: center; gap: 4px; background: #dbeafe; color: #1d4ed8; border-radius: 4px; padding: 3px 8px; font-size: 10px; margin: 2px 4px 2px 0; text-decoration: none; }
.qc-dash .adjunto-aviso { color: #b45309; font-size: 10.5px; margin-top: 6px; }

/* ── Detalle de ticket, rediseño completo (pedido de Victor 2026-08-31,
   mockups /Tickets, /Ticket 2, /responder ChatGPT Image...): botón
   "Editar ticket" -> "Responder" que abre un panel de respuesta colapsable
   arriba del hilo, dos columnas (hilo + detalles/actividad). Tema oscuro
   navy ya establecido en el resto del dashboard -- los mockups usaban
   tarjetas blancas, NO se copia ese tema claro, rompería con el resto de
   la app (KPIs, Bandeja, Tickets, Mis Proyectos, todos oscuros). */
.qc-dash .tk2-volver { color: #2563eb; font-size: 12.5px; text-decoration: none; }
.qc-dash .tk2-volver:hover { text-decoration: underline; }
.qc-dash .tk2-topline { margin-top: 14px; }
.qc-dash .tk2-titlerow { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-top: 4px; }
.qc-dash .tk2-titlerow h1 { font-size: 22px; font-weight: 600; color: #111827; margin: 0; }
.qc-dash .tk2-meta { color: #6b7280; font-size: 12.5px; margin-top: 8px; display: flex; flex-wrap: wrap; gap: 0; }
.qc-dash .tk2-meta span:not(:first-child)::before { content: "•"; margin: 0 8px; color: #d1d5db; }

.qc-dash .tk2-pill { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 6px; font-size: 11px; font-weight: 600; }
.qc-dash .tk2-pill-alta { background: #fee2e2; color: #b91c1c; }
.qc-dash .tk2-pill-media { background: #fef3c7; color: #92400e; }
.qc-dash .tk2-pill-baja { background: #d1fae5; color: #065f46; }

.qc-dash .tk2-acciones { display: flex; gap: 10px; flex-shrink: 0; }
.qc-dash .tk2-btn-responder, .qc-dash .tk2-btn-outline {
  display: inline-flex; align-items: center; gap: 6px; border-radius: 7px; padding: 9px 16px;
  font-size: 13px; font-weight: 500; cursor: pointer; transition: background-color 120ms ease-out;
}
.qc-dash .tk2-btn-responder svg, .qc-dash .tk2-btn-outline svg { width: 15px; height: 15px; }
.qc-dash .tk2-btn-responder { background: #1d4ed8; border: none; color: #fff; }
.qc-dash .tk2-btn-responder:hover:not(:disabled) { background: #2563eb; }
.qc-dash .tk2-btn-outline { background: transparent; border: 1px solid #d1d5db; color: #374151; }
.qc-dash .tk2-btn-outline:hover:not(:disabled) { background: #f3f4f6; color: #111827; }
.qc-dash .tk2-btn-responder:disabled, .qc-dash .tk2-btn-outline:disabled { opacity: .55; cursor: not-allowed; }
.qc-dash .tk2-btn-responder:focus-visible, .qc-dash .tk2-btn-outline:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(37, 99, 235, .3); }

.qc-dash .tk2-grid { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; margin-top: 20px; align-items: start; }

.qc-dash .tk2-editor { background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; margin-bottom: 16px; }
.qc-dash .tk2-editor-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid #f3f4f6; }
.qc-dash .tk2-editor-head b { font-size: 13.5px; color: #111827; font-weight: 600; }
.qc-dash .tk2-editor form.reply-form { padding: 14px 16px 0; margin: 0; }
.qc-dash .tk2-editor form.reply-form textarea { min-height: 100px; margin-bottom: 0; }
/* justify-content:flex-end (era space-between, cuando .tk2-adjuntar vivía
   acá como hijo aparte a la izquierda) -- pedido de Victor: el clip de
   adjuntar pasa a ser un ícono solo, a la DERECHA del botón de enviar, no
   una etiqueta de texto a la izquierda del footer (ver .clip-adjuntar,
   compartida con el resto de los formularios que adjuntan archivo). */
.qc-dash .tk2-editor-footer { display: flex; align-items: center; justify-content: flex-end; gap: 12px; flex-wrap: wrap; padding: 12px 16px 14px; }
.qc-dash .tk2-editor-botones { display: flex; align-items: center; gap: 8px; }
.qc-dash .tk2-editor form.reply-form button.enviar { background: #1d4ed8; border: none; color: #fff; border-radius: 6px; padding: 8px 14px; font-size: 12.5px; cursor: pointer; margin: 0; }
.qc-dash .tk2-editor form.reply-form button.enviar:hover:not(:disabled) { background: #2563eb; }
.qc-dash .tk2-editor form.reply-form button.cancelar { background: transparent; border: 1px solid #d1d5db; color: #374151; border-radius: 6px; padding: 8px 14px; font-size: 12.5px; cursor: pointer; margin: 0; }
.qc-dash .tk2-editor form.reply-form button.cancelar:hover { background: #f3f4f6; color: #111827; }

/* Pedido de Victor: "Mensaje original"/"Mensajes anteriores" quedaba muy
   pegado al botón Enviar -- se agrega más separación arriba y una línea
   divisoria sutil en vez de solo texto flotando. */
.qc-dash .tk2-mensajes-label { color: #9ca3af; font-size: 11px; text-transform: uppercase; letter-spacing: .03em; margin: 10px 0 12px; padding-top: 14px; border-top: 1px solid #e5e7eb; }
/* El editor de email (#qc-mail-reply-wrap) no tenía la clase .tk2-editor
   -- ahí el label quedaba pegado directo contra el footer del form, sin
   ningún margen propio (a diferencia de .tk2-editor, que sí tiene
   margin-bottom:16px). Mismo valor acá para que ambos editores (ticket y
   email) den el mismo aire antes de la línea divisoria de arriba. */
.qc-dash #qc-mail-reply-wrap { margin-bottom: 16px; }

.qc-dash .tk2-msg { background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px 16px; margin-bottom: 10px; }
.qc-dash .tk2-msg-head { display: flex; align-items: flex-start; gap: 10px; }
.qc-dash .tk2-avatar { width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; flex-shrink: 0; }
.qc-dash .tk2-msg-quien { flex: 1; min-width: 0; }
.qc-dash .tk2-msg-quien b { color: #111827; font-size: 13px; font-weight: 600; }
.qc-dash .tk2-creador { display: inline-block; margin-left: 6px; background: #dbeafe; color: #1d4ed8; font-size: 10px; font-weight: 600; padding: 1px 7px; border-radius: 5px; vertical-align: 1px; }
.qc-dash .tk2-msg-fecha { color: #9ca3af; font-size: 11px; white-space: nowrap; flex-shrink: 0; }
.qc-dash .tk2-msg-texto { color: #374151; font-size: 13px; line-height: 1.5; margin-top: 10px; white-space: pre-wrap; }

.qc-dash .tk2-adjunto { display: flex; align-items: center; gap: 10px; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; padding: 8px 12px; margin-top: 10px; }
.qc-dash .tk2-adjunto svg.doc { color: #2563eb; flex-shrink: 0; width: 18px; height: 18px; }
.qc-dash .tk2-adjunto-info { flex: 1; min-width: 0; }
.qc-dash .tk2-adjunto-info b { display: block; color: #111827; font-size: 12px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qc-dash .tk2-adjunto-info small { color: #6b7280; font-size: 10.5px; }
.qc-dash .tk2-adjunto-btn { background: transparent; border: 1px solid #d1d5db; color: #6b7280; width: 28px; height: 28px; border-radius: 6px; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; padding: 0; }
.qc-dash .tk2-adjunto-btn:hover:not(:disabled) { color: #111827; background: #f3f4f6; }
.qc-dash .tk2-adjunto-btn:disabled { opacity: .5; cursor: not-allowed; }
.qc-dash .tk2-adjunto-btn svg { width: 14px; height: 14px; }

.qc-dash .tk2-inicio { text-align: center; color: #9ca3af; font-size: 11px; margin: 16px 0 4px; position: relative; }
.qc-dash .tk2-inicio::before, .qc-dash .tk2-inicio::after { content: ""; position: absolute; top: 50%; width: calc(50% - 76px); height: 1px; background: #e5e7eb; }
.qc-dash .tk2-inicio::before { left: 0; }
.qc-dash .tk2-inicio::after { right: 0; }

.qc-dash .tk2-sidebar { display: flex; flex-direction: column; gap: 16px; }
.qc-dash .tk2-panel { background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px; }
.qc-dash .tk2-panel h3 { font-size: 13px; font-weight: 600; color: #111827; margin: 0 0 14px; }
.qc-dash .tk2-campo { margin-bottom: 14px; }
.qc-dash .tk2-campo:last-child { margin-bottom: 0; }
.qc-dash .tk2-campo label { display: block; color: #6b7280; font-size: 10.5px; text-transform: uppercase; letter-spacing: .03em; margin-bottom: 6px; }
.qc-dash .tk2-campo-valor { display: flex; align-items: center; gap: 8px; color: #111827; font-size: 13px; font-weight: 500; }
.qc-dash .tk2-campo-valor svg { width: 15px; height: 15px; color: #6b7280; flex-shrink: 0; }
.qc-dash .tk2-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
.qc-dash .tk2-dot.verde { background: #19d48c; }
.qc-dash .tk2-dot.gris { background: #9ca3af; }
.qc-dash .tk2-dot.amarillo { background: #f0bd24; }
.qc-dash .tk2-dot.rojo { background: #ff4138; }
.qc-dash .tk2-asignado { display: flex; align-items: center; gap: 8px; }
/* avatarCorreo() (ver JS) sólo trae la clase "avatar" + color inline -- el
   resto de sus propiedades vive scopeado a ".correo-meta .avatar" (verCorreo),
   así que acá hay que declarar el set completo, no solo el tamaño. */
.qc-dash .tk2-asignado .avatar { width: 30px; height: 30px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 11px; flex-shrink: 0; }
.qc-dash .tk2-asignado b { display: block; color: #111827; font-size: 12.5px; font-weight: 500; }
.qc-dash .tk2-asignado small { display: block; color: #6b7280; font-size: 10.5px; }

.qc-dash .tk2-actividad { list-style: none; margin: 0; padding: 0; }
.qc-dash .tk2-actividad li { display: flex; gap: 10px; padding-bottom: 14px; padding-left: 17px; position: relative; }
.qc-dash .tk2-actividad li:last-child { padding-bottom: 0; }
.qc-dash .tk2-actividad li::before { content: ""; position: absolute; left: 0; top: 4px; width: 7px; height: 7px; border-radius: 50%; border: 2px solid #2563eb; background: #ffffff; }
.qc-dash .tk2-actividad-texto b { display: block; color: #374151; font-size: 12px; font-weight: 500; }
.qc-dash .tk2-actividad-texto small { color: #9ca3af; font-size: 10.5px; }

/* ── Bandeja de Entrada, dos paneles (/dashboard/inbox, montarInboxSplit)
   -- pedido de Victor 2026-08-31 (mockup /Emails ChatGPT Image...): lista
   a la izquierda + lectura a la derecha en una sola pantalla. Reusa
   .filtro-correo-* (ya definidas arriba) para el menú de "Filtros", y
   .correo-meta/.descripcion/.reply-form/.adjunto-aviso (definidas en
   .ticket-detalle más arriba) para el panel de lectura -- mismo bloque
   visual que ya usaba el detalle de correo viejo, sin duplicar reglas. ── */
/* Sin padding propio (era 16px) -- #qc-arq-main ya trae el padding real de
   la app; este extra corría a Emails 16px más adentro que Tickets/Mis
   Proyectos/Dashboard, únicas páginas sin este wrapper. */
.qc-dash .ibx { padding: 0; }
.qc-dash .ibx-header { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }
.qc-dash .ibx-header h1 { font-size: 20px; font-weight: 600; color: #111827; margin: 0; margin-right: 4px; }
.qc-dash .ibx-buscador { flex: 1; min-width: 180px; position: relative; display: flex; align-items: center; }
.qc-dash .ibx-buscador svg { position: absolute; left: 11px; width: 15px; height: 15px; color: #9ca3af; pointer-events: none; }
.qc-dash .ibx-buscador input {
  width: 100%; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 7px; color: #111827;
  font: inherit; font-size: 12.5px; padding: 9px 12px 9px 34px; box-sizing: border-box; transition: border-color 120ms ease-out;
}
.qc-dash .ibx-buscador input::placeholder { color: #9ca3af; }
.qc-dash .ibx-buscador input:hover { border-color: #2563eb; }
.qc-dash .ibx-buscador input:focus-visible { outline: none; border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, .18); }
.qc-dash .ibx-btn-outline, .qc-dash .ibx-btn-primario {
  display: inline-flex; align-items: center; gap: 6px; border-radius: 7px; padding: 9px 14px;
  font-size: 12.5px; font-weight: 500; cursor: pointer; white-space: nowrap; transition: background-color 120ms ease-out;
}
.qc-dash .ibx-btn-outline svg, .qc-dash .ibx-btn-primario svg { width: 14px; height: 14px; }
.qc-dash .ibx-btn-outline { background: transparent; border: 1px solid #d1d5db; color: #374151; }
.qc-dash .ibx-btn-outline:hover { background: #f3f4f6; color: #111827; }
.qc-dash .ibx-btn-primario { background: #1d4ed8; border: none; color: #fff; }
.qc-dash .ibx-btn-primario:hover { background: #2563eb; }

/* Sin tabs -- pedido de Victor (captura real de ARIA): ARIA no tiene tabs
   separadas, tiene un solo filtro con 3 opciones (Todos/No leídos/
   Enviados, ver FILTROS_IBX en el JS). Altura compartida entre lista y
   lectura, con scroll interno cada una -- mismo pedido, "que el lado de
   la lista y el lado derecho sean del mismo alto". Antes .ibx-grid tenía
   align-items:start (cada columna a su propia altura); ahora usa el
   stretch por default de Grid, y como las dos columnas comparten la
   misma altura calculada (ver .ibx-lista/.ibx-lectura), el efecto
   práctico es que quedan iguales sin importar cuánto contenido tenga
   cada una. */
.qc-dash .ibx-grid { display: grid; grid-template-columns: 1fr 1.3fr; gap: 14px; transition: opacity 120ms ease-out; }
/* Pedido de Victor: que paginar/cambiar de filtro no se sienta como un
   parpadeo en blanco (mismo espíritu que Gmail: el contenido viejo se
   atenúa un poco mientras llega el nuevo, nunca desaparece del todo).
   Se agrega/saca en JS (montarInboxSplit) mientras corre el fetch. */
.qc-dash .ibx-grid.ibx-cargando { opacity: .55; pointer-events: none; }
/* Pedido de Victor: "prefiero que la altura de las dos tarjetas sea el
   alto completo de mi pantalla" (antes: 640px fijo, quedaba corto en
   pantallas grandes y con espacio libre debajo). calc(100vh - 174px) en
   vez de un píxel fijo -- 182px es lo medido en vivo arriba de la
   grilla (header persistente + "Emails" + buscador/filtros/redactar +
   padding del <main>) más un margen chico de aire abajo. Con esto,
   CUALQUIER pantalla más grande no dejaría espacio vacío ni recorta:
   los paneles crecen exactamente lo que crece 100vh, sin un tope fijo
   que se quede corto -- 182px es constante en todas, solo cambia vh. */
.qc-dash .ibx-lista {
  background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px;
  overflow: hidden; height: calc(100vh - 174px); min-height: 420px; display: flex; flex-direction: column;
}
.qc-dash .ibx-lista-toolbar { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-bottom: 1px solid #f3f4f6; flex-shrink: 0; }
.qc-dash .ibx-check-todos-wrap { display: flex; }
.qc-dash .ibx-toolbar-btn {
  display: inline-flex; align-items: center; gap: 5px; background: transparent; border: none; color: #6b7280;
  font-size: 11.5px; cursor: pointer; padding: 5px 7px; border-radius: 5px;
}
.qc-dash .ibx-toolbar-btn svg { width: 13px; height: 13px; }
.qc-dash .ibx-toolbar-btn:hover:not(:disabled) { background: #f3f4f6; color: #111827; }
.qc-dash .ibx-toolbar-btn:disabled { opacity: .4; cursor: not-allowed; }
.qc-dash .ibx-filas { flex: 1; overflow-y: auto; }
/* Paginador real (pedido de Victor: "la lista de emails no tiene
   paginacion") -- reusa .paginador-tarjeta (mismos botones/estados que
   Bandeja/Tickets/Mis Proyectos del dashboard), fijo al pie de la lista
   como su propia fila flex. Pedido de Victor: a la izquierda el rango+
   total real ("1-25 de 450"), a la derecha los botones -- antes era
   "página X / Y" centrado, sin el total real de correos. */
.qc-dash .ibx-paginador { flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid #f3f4f6; padding: 10px 14px; }
.qc-dash .ibx-paginador-rango { color: #6b7280; font-size: 11.5px; }

.qc-dash .ibx-fila { display: grid; grid-template-columns: 18px 30px 1fr auto; gap: 9px; align-items: center; padding: 10px 14px; border-bottom: 1px solid #f3f4f6; cursor: pointer; }
.qc-dash .ibx-fila:last-child { border-bottom: none; }
.qc-dash .ibx-fila:hover { background: rgba(0, 0, 0, .025); }
.qc-dash .ibx-fila.seleccionada { background: #eff6ff; }
.qc-dash .ibx-fila .avatar { width: 30px; height: 30px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 11px; flex-shrink: 0; }
.qc-dash .ibx-fila-texto { min-width: 0; }
.qc-dash .ibx-fila-texto b, .qc-dash .ibx-fila-texto strong, .qc-dash .ibx-fila-texto small { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.qc-dash .ibx-fila-texto b { font-size: 12.5px; color: #4b5563; font-weight: 400; }
.qc-dash .ibx-fila.no-leido .ibx-fila-texto b, .qc-dash .ibx-fila.no-leido .ibx-fila-texto strong { color: #111827; font-weight: 600; }
.qc-dash .ibx-fila-texto strong { font-size: 12.5px; font-weight: 400; margin-top: 2px; color: #4b5563; }
.qc-dash .ibx-fila-texto small { font-size: 11px; font-weight: 400; margin-top: 2px; color: #6b7280; }
.qc-dash .ibx-fila-fecha { font-size: 10.5px; color: #6b7280; white-space: nowrap; }

.qc-dash .ibx-lectura { background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; height: calc(100vh - 174px); min-height: 420px; overflow-y: auto; }
.qc-dash .ibx-lectura-vacio { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; height: 100%; padding: 40px 20px; color: #9ca3af; }
.qc-dash .ibx-lectura-vacio svg { width: 46px; height: 46px; margin-bottom: 14px; opacity: .6; }
.qc-dash .ibx-lectura-vacio h3 { font-size: 14px; font-weight: 500; color: #6b7280; margin: 0 0 6px; }
.qc-dash .ibx-lectura-vacio p { font-size: 12px; margin: 0; max-width: 260px; }

.qc-dash .ibx-lectura-acciones { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 12px 16px; border-bottom: 1px solid #f3f4f6; }
.qc-dash .ibx-volver { display: none; color: #6b7280; font-size: 12px; text-decoration: none; align-items: center; gap: 4px; margin-right: 6px; }
.qc-dash .ibx-volver svg { width: 14px; height: 14px; }
.qc-dash .ibx-accion-btn {
  display: inline-flex; align-items: center; gap: 5px; background: transparent; border: 1px solid #d1d5db; color: #374151;
  font-size: 11.5px; padding: 7px 11px; border-radius: 6px; cursor: pointer;
}
.qc-dash .ibx-accion-btn svg { width: 13px; height: 13px; }
.qc-dash .ibx-accion-btn:hover:not(:disabled) { background: #f3f4f6; color: #111827; }
.qc-dash .ibx-accion-btn.ibx-accion-icono { padding: 7px; margin-left: auto; }
.qc-dash .ibx-accion-btn.ibx-accion-icono + .ibx-accion-btn.ibx-accion-icono { margin-left: 0; }
.qc-dash .ibx-accion-btn.peligro:hover:not(:disabled) { color: #dc2626; border-color: #dc2626; }
.qc-dash .ibx-lectura-cuerpo { padding: 16px; }
.qc-dash .ibx-lectura-cuerpo h2 { font-size: 16px; font-weight: 600; color: #111827; margin: 0 0 12px; }
.qc-dash .ibx-adjuntos-titulo { color: #6b7280; font-size: 11.5px; margin: 4px 0 8px; }
.qc-dash .ibx-adjuntos-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 8px; }
.qc-dash .ibx-adjunto { display: flex; align-items: center; gap: 8px; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; padding: 8px 10px; }
.qc-dash .ibx-adjunto svg.doc { color: #2563eb; width: 17px; height: 17px; flex-shrink: 0; }
.qc-dash .ibx-adjunto-info { min-width: 0; }
.qc-dash .ibx-adjunto-info b { display: block; color: #111827; font-size: 11.5px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qc-dash .ibx-adjunto-info small { color: #6b7280; font-size: 10px; }

/* ── Lista de Tickets (/dashboard/tickets), rediseño tipo ARIA -- pedido
   de Victor 2026-08-31 (captura real "My Tickets" de referencia). Los 5
   KPI reusan .kpis/.kpi tal cual (misma grilla de 5 columnas que ya usa
   el dashboard), sin el link "Ver detalle"/"Fase siguiente" del pie --
   kpiTicketsCard() no lo genera, no hace falta CSS nuevo para eso. ── */
/* Buscador + Filtros + tabs en una sola línea -- pedido explícito de
   Victor (en ARIA están en dos líneas separadas). */
.qc-dash .tkl-barra { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }
.qc-dash .tkl-buscador { flex: 1; min-width: 200px; }
.qc-dash .tkl-tabs { display: flex; gap: 4px; flex-wrap: wrap; }
.qc-dash .tkl-tabs .ibx-tab { border: 1px solid transparent; border-radius: 7px; padding: 8px 12px; margin-right: 0; }
.qc-dash .tkl-tabs .ibx-tab.activo { background: #eff6ff; border-color: #2563eb; }

.qc-dash .tkl-tabla { background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; overflow: hidden; }
.qc-dash .tkl-thead, .qc-dash .tkl-fila {
  display: grid; grid-template-columns: .55fr 1.7fr .8fr .95fr .95fr .75fr .8fr; gap: 10px; align-items: center;
}
.qc-dash .tkl-thead { padding: 11px 16px; color: #6b7280; font-size: 10.5px; text-transform: uppercase; letter-spacing: .03em; border-bottom: 1px solid #f3f4f6; }
.qc-dash .tkl-fila { padding: 13px 16px; border-bottom: 1px solid #f3f4f6; cursor: pointer; }
.qc-dash .tkl-fila:last-child { border-bottom: none; }
.qc-dash .tkl-fila:hover { background: rgba(0, 0, 0, .025); }
.qc-dash .tkl-id { color: #6b7280; font-size: 11.5px; font-family: monospace; }
.qc-dash .tkl-subject { min-width: 0; }
.qc-dash .tkl-subject b { display: block; color: #111827; font-size: 12.5px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qc-dash .tkl-subject small { display: block; color: #6b7280; font-size: 11px; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qc-dash .tkl-depto { color: #374151; font-size: 12px; }
.qc-dash .tkl-persona { display: flex; align-items: center; gap: 7px; color: #374151; font-size: 12px; min-width: 0; }
.qc-dash .tkl-persona span.avatar { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 10px; flex-shrink: 0; }
.qc-dash .tkl-vacio { color: #9ca3af; }
.qc-dash .tkl-estado { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 500; }
.qc-dash .tkl-estado i { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.qc-dash .tkl-estado.verde { color: #059669; } .qc-dash .tkl-estado.verde i { background: #19d48c; }
.qc-dash .tkl-estado.amarillo { color: #b45309; } .qc-dash .tkl-estado.amarillo i { background: #f0bd24; }
.qc-dash .tkl-estado.gris { color: #6b7280; } .qc-dash .tkl-estado.gris i { background: #9ca3af; }
.qc-dash .tkl-actualizado { display: flex; align-items: center; justify-content: space-between; color: #6b7280; font-size: 12px; }
.qc-dash .tkl-actualizado svg { width: 15px; height: 15px; color: #9ca3af; flex-shrink: 0; }

/* Pie con paginador -- pedido de Victor (captura real de ARIA): "Previous
   | Página X de Y | Next" + selector "N / página". El selector reusa
   .filtro-correo-menu/.filtro-correo-opcion (el mismo popover ya usado
   para Filtros/tabs de email) en vez de un <select> nativo -- pedido
   explícito: "que el dropdown sea moderno". */
.qc-dash .tkl-pie { display: flex; align-items: center; justify-content: space-between; padding: 13px 16px; border-top: 1px solid #f3f4f6; color: #6b7280; font-size: 12.5px; flex-wrap: wrap; gap: 10px; }
.qc-dash .tkl-paginador { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.qc-dash .tkl-pag-btn {
  display: inline-flex; align-items: center; gap: 5px; background: transparent; border: 1px solid #d1d5db; color: #374151;
  border-radius: 7px; padding: 7px 12px; font-size: 12px; cursor: pointer;
}
.qc-dash .tkl-pag-btn svg { width: 14px; height: 14px; }
.qc-dash .tkl-pag-btn:hover:not(:disabled) { background: #f3f4f6; color: #111827; }
.qc-dash .tkl-pag-btn:disabled { opacity: .4; cursor: not-allowed; }
/* Abre hacia ARRIBA (top:auto + bottom), no hacia abajo como el default
   de .filtro-correo-menu -- este botón vive al pie de la página/tabla,
   así que abrir hacia abajo lo sacaba de la pantalla. Hallazgo de
   Victor. */
.qc-dash .tkl-porpagina-menu { left: auto; right: 0; top: auto; bottom: calc(100% + 6px); min-width: 110px; }

/* ═══════════════════════════════════════════════════════════════════════════
   Modo oscuro — Emails, Tickets (lista + detalle)
   ─────────────────────────────────────────────────────────────────────────── */
html.dark-mode .qc-dash .ticket-detalle .meta { color: #8fa0b8; }
html.dark-mode .qc-dash .ticket-detalle .descripcion, html.dark-mode .qc-dash .ibx-lectura-cuerpo .descripcion { background: #091827; border-color: #162b45; color: #c2ccda; }
html.dark-mode .qc-dash .ticket-detalle .correo-meta-texto b, html.dark-mode .qc-dash .ibx-lectura-cuerpo .correo-meta-texto b { color: #eef4ff; }
html.dark-mode .qc-dash .ticket-detalle .correo-meta-texto small, html.dark-mode .qc-dash .ibx-lectura-cuerpo .correo-meta-texto small { color: #8fa0b8; }
html.dark-mode .qc-dash .ticket-detalle .correo-fecha, html.dark-mode .qc-dash .ibx-lectura-cuerpo .correo-fecha { color: #8fa0b8; }
html.dark-mode .qc-dash .ticket-detalle .pill-reply { border-color: #162b45; background: #091827; color: #c2ccda; }
html.dark-mode .qc-dash .ticket-detalle .pill-reply:hover { background: #0d2036; color: #eef4ff; }
html.dark-mode .qc-dash .ticket-detalle .icon-circle { border-color: #162b45; background: #091827; color: #8fa0b8; }
html.dark-mode .qc-dash .ticket-detalle .icon-circle:hover { color: #eef4ff; background: #0d2036; }
html.dark-mode .qc-dash .ticket-detalle .icon-circle.peligro:hover { color: #ff4c43; border-color: #ff4c43; }
html.dark-mode .qc-dash .reply { border-bottom-color: #112238; color: #c2ccda; }
html.dark-mode .qc-dash .reply small { color: #667991; }
html.dark-mode .qc-dash .reply-form textarea { background: #091827; border-color: #162b45; color: #eef4ff; }
html.dark-mode .qc-dash .reply-form textarea::placeholder { color: #526176; }
html.dark-mode .qc-dash .reply-form textarea:hover:not(:disabled) { border-color: #1e5ca5; }
html.dark-mode .qc-dash .reply-form textarea:focus-visible { border-color: #3e96ff; box-shadow: 0 0 0 3px rgba(62, 150, 255, .18); }
html.dark-mode .qc-dash .reply-form textarea:active:not(:disabled) { border-color: #3e96ff; }
html.dark-mode .qc-dash .reply-form textarea:disabled { background: #071321; }
html.dark-mode .qc-dash .reply-form textarea.is-error { border-color: #ff4c43; }
html.dark-mode .qc-dash .reply-form textarea.is-error:focus-visible { box-shadow: 0 0 0 3px rgba(255, 76, 67, .18); }
html.dark-mode .qc-dash .reply-form textarea.is-success { border-color: #19d48c; }
html.dark-mode .qc-dash .reply-form button, html.dark-mode .qc-dash .acciones button { border-color: #1e5ca5; color: #3e96ff; }
html.dark-mode .clip-adjuntar { border-color: #223b5c; color: #8fa0b8; }
html.dark-mode .clip-adjuntar:hover { color: #eef4ff; background: #0d2036; }
html.dark-mode .qc-dash .adjunto-chip { background: #17304d; color: #a9c6ee; }
html.dark-mode .qc-dash .adjunto-aviso { color: #f0b429; }
html.dark-mode .qc-dash .tk2-volver { color: #3e96ff; }
html.dark-mode .qc-dash .tk2-titlerow h1 { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-meta { color: #8fa0b8; }
html.dark-mode .qc-dash .tk2-meta span:not(:first-child)::before { color: #3c4c62; }
html.dark-mode .qc-dash .tk2-pill-alta { background: #ff413826; color: #ff8078; }
html.dark-mode .qc-dash .tk2-pill-media { background: #f0bd2426; color: #f0bd24; }
html.dark-mode .qc-dash .tk2-pill-baja { background: #19d48c26; color: #19d48c; }
html.dark-mode .qc-dash .tk2-btn-responder { background: #1e5ca5; }
html.dark-mode .qc-dash .tk2-btn-responder:hover:not(:disabled) { background: #256bbf; }
html.dark-mode .qc-dash .tk2-btn-outline { border-color: #223b5c; color: #c2ccda; }
html.dark-mode .qc-dash .tk2-btn-outline:hover:not(:disabled) { background: #0d2036; color: #eef4ff; }
html.dark-mode .qc-dash .tk2-btn-responder:focus-visible, html.dark-mode .qc-dash .tk2-btn-outline:focus-visible { box-shadow: 0 0 0 3px rgba(62, 150, 255, .3); }
html.dark-mode .qc-dash .tk2-editor { background: #0c1626; border-color: #162b45; }
html.dark-mode .qc-dash .tk2-editor-head { border-bottom-color: #112238; }
html.dark-mode .qc-dash .tk2-editor-head b { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-editor form.reply-form button.enviar { background: #1e5ca5; }
html.dark-mode .qc-dash .tk2-editor form.reply-form button.enviar:hover:not(:disabled) { background: #256bbf; }
html.dark-mode .qc-dash .tk2-editor form.reply-form button.cancelar { border-color: #223b5c; color: #c2ccda; }
html.dark-mode .qc-dash .tk2-editor form.reply-form button.cancelar:hover { background: #0d2036; color: #eef4ff; }
html.dark-mode .qc-dash .tk2-mensajes-label { color: #526176; border-top-color: #162b45; }
html.dark-mode .qc-dash .tk2-msg { background: #0c1626; border-color: #162b45; }
html.dark-mode .qc-dash .tk2-msg-quien b { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-creador { background: #1e5ca526; color: #3e96ff; }
html.dark-mode .qc-dash .tk2-msg-fecha { color: #526176; }
html.dark-mode .qc-dash .tk2-msg-texto { color: #c2ccda; }
html.dark-mode .qc-dash .tk2-adjunto { background: #091827; border-color: #162b45; }
html.dark-mode .qc-dash .tk2-adjunto svg.doc { color: #3e96ff; }
html.dark-mode .qc-dash .tk2-adjunto-info b { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-adjunto-info small { color: #8fa0b8; }
html.dark-mode .qc-dash .tk2-adjunto-btn { border-color: #223b5c; color: #8fa0b8; }
html.dark-mode .qc-dash .tk2-adjunto-btn:hover:not(:disabled) { color: #eef4ff; background: #0d2036; }
html.dark-mode .qc-dash .tk2-inicio { color: #526176; }
html.dark-mode .qc-dash .tk2-inicio::before, html.dark-mode .qc-dash .tk2-inicio::after { background: #162b45; }
html.dark-mode .qc-dash .tk2-panel { background: linear-gradient(#0c1626 0%, #09111d 24%); border-color: #162b45; }
html.dark-mode .qc-dash .tk2-panel h3 { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-campo label { color: #667991; }
html.dark-mode .qc-dash .tk2-campo-valor { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-campo-valor svg { color: #667991; }
html.dark-mode .qc-dash .tk2-dot.gris { background: #667991; }
html.dark-mode .qc-dash .tk2-asignado b { color: #eef4ff; }
html.dark-mode .qc-dash .tk2-asignado small { color: #8fa0b8; }
html.dark-mode .qc-dash .tk2-actividad li::before { border-color: #3e96ff; background: #0c1626; }
html.dark-mode .qc-dash .tk2-actividad-texto b { color: #c2ccda; }
html.dark-mode .qc-dash .tk2-actividad-texto small { color: #667991; }
html.dark-mode .qc-dash .ibx-header h1 { color: #eef4ff; }
html.dark-mode .qc-dash .ibx-buscador svg { color: #526176; }
html.dark-mode .qc-dash .ibx-buscador input { background: #091827; border-color: #162b45; color: #eef4ff; }
html.dark-mode .qc-dash .ibx-buscador input::placeholder { color: #526176; }
html.dark-mode .qc-dash .ibx-buscador input:hover { border-color: #1e5ca5; }
html.dark-mode .qc-dash .ibx-buscador input:focus-visible { border-color: #3e96ff; box-shadow: 0 0 0 3px rgba(62, 150, 255, .18); }
html.dark-mode .qc-dash .ibx-btn-outline { border-color: #223b5c; color: #c2ccda; }
html.dark-mode .qc-dash .ibx-btn-outline:hover { background: #0d2036; color: #eef4ff; }
html.dark-mode .qc-dash .ibx-btn-primario { background: #1e5ca5; }
html.dark-mode .qc-dash .ibx-btn-primario:hover { background: #256bbf; }
html.dark-mode .qc-dash .ibx-lista { background: linear-gradient(#0c1626 0%, #09111d 24%); border-color: #162b45; }
html.dark-mode .qc-dash .ibx-lista-toolbar { border-bottom-color: #112238; }
html.dark-mode .qc-dash .ibx-toolbar-btn { color: #8fa0b8; }
html.dark-mode .qc-dash .ibx-toolbar-btn:hover:not(:disabled) { background: #0d2036; color: #eef4ff; }
html.dark-mode .qc-dash .ibx-paginador { border-top-color: #112238; }
html.dark-mode .qc-dash .ibx-paginador-rango { color: #8fa0b8; }
html.dark-mode .qc-dash .ibx-fila { border-bottom-color: #112238; }
html.dark-mode .qc-dash .ibx-fila:hover { background: rgba(255, 255, 255, .02); }
html.dark-mode .qc-dash .ibx-fila.seleccionada { background: #12203a; }
html.dark-mode .qc-dash .ibx-fila-texto b { color: #c2ccda; }
html.dark-mode .qc-dash .ibx-fila.no-leido .ibx-fila-texto b, html.dark-mode .qc-dash .ibx-fila.no-leido .ibx-fila-texto strong { color: #eef4ff; }
html.dark-mode .qc-dash .ibx-fila-texto strong { color: #c2ccda; }
html.dark-mode .qc-dash .ibx-fila-texto small { color: #667991; }
html.dark-mode .qc-dash .ibx-fila-fecha { color: #667991; }
html.dark-mode .qc-dash .ibx-lectura { background: linear-gradient(#0c1626 0%, #09111d 24%); border-color: #162b45; }
html.dark-mode .qc-dash .ibx-lectura-vacio { color: #526176; }
html.dark-mode .qc-dash .ibx-lectura-vacio h3 { color: #8fa0b8; }
html.dark-mode .qc-dash .ibx-lectura-acciones { border-bottom-color: #112238; }
html.dark-mode .qc-dash .ibx-volver { color: #8fa0b8; }
html.dark-mode .qc-dash .ibx-accion-btn { border-color: #223b5c; color: #c2ccda; }
html.dark-mode .qc-dash .ibx-accion-btn:hover:not(:disabled) { background: #0d2036; color: #eef4ff; }
html.dark-mode .qc-dash .ibx-accion-btn.peligro:hover:not(:disabled) { color: #ff4c43; border-color: #ff4c43; }
html.dark-mode .qc-dash .ibx-lectura-cuerpo h2 { color: #eef4ff; }
html.dark-mode .qc-dash .ibx-adjuntos-titulo { color: #8fa0b8; }
html.dark-mode .qc-dash .ibx-adjunto { background: #091827; border-color: #162b45; }
html.dark-mode .qc-dash .ibx-adjunto svg.doc { color: #3e96ff; }
html.dark-mode .qc-dash .ibx-adjunto-info b { color: #eef4ff; }
html.dark-mode .qc-dash .ibx-adjunto-info small { color: #8fa0b8; }
html.dark-mode .qc-dash .tkl-tabs .ibx-tab.activo { background: #12203a; border-color: #1e5ca5; }
html.dark-mode .qc-dash .tkl-tabla { background: linear-gradient(#0c1626 0%, #09111d 24%); border-color: #162b45; }
html.dark-mode .qc-dash .tkl-thead { color: #667991; border-bottom-color: #112238; }
html.dark-mode .qc-dash .tkl-fila { border-bottom-color: #112238; }
html.dark-mode .qc-dash .tkl-fila:hover { background: rgba(255, 255, 255, .02); }
html.dark-mode .qc-dash .tkl-id { color: #667991; }
html.dark-mode .qc-dash .tkl-subject b { color: #eef4ff; }
html.dark-mode .qc-dash .tkl-subject small { color: #8fa0b8; }
html.dark-mode .qc-dash .tkl-depto { color: #c2ccda; }
html.dark-mode .qc-dash .tkl-persona { color: #c2ccda; }
html.dark-mode .qc-dash .tkl-vacio { color: #526176; }
html.dark-mode .qc-dash .tkl-estado.verde { color: #19d48c; }
html.dark-mode .qc-dash .tkl-estado.amarillo { color: #f0bd24; }
html.dark-mode .qc-dash .tkl-estado.gris { color: #8fa0b8; } html.dark-mode .qc-dash .tkl-estado.gris i { background: #667991; }
html.dark-mode .qc-dash .tkl-actualizado { color: #8fa0b8; }
html.dark-mode .qc-dash .tkl-actualizado svg { color: #526176; }
html.dark-mode .qc-dash .tkl-pie { border-top-color: #112238; color: #8fa0b8; }
html.dark-mode .qc-dash .tkl-pag-btn { border-color: #223b5c; color: #c2ccda; }
html.dark-mode .qc-dash .tkl-pag-btn:hover:not(:disabled) { background: #0d2036; color: #eef4ff; }

/* ── Panel de control de Mis Proyectos (/dashboard/proyectos), rediseño
   2026-08-31 -- idea de un mockup de ChatGPT (layout de 4 columnas
   fusionadas + franja de productividad), datos y lógica 100% reales de
   Quantum (ver comentarios en el JS, calcularPanelProyectos). Mismos
   tokens de color que el resto del dashboard. ── */
.qc-dash .ppanel-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; align-items: stretch; margin-bottom: 12px; }
.qc-dash .pcol { min-height: 360px; background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; display: flex; flex-direction: column; overflow: hidden; }
.qc-dash .pcol-head { display: flex; align-items: center; gap: 12px; padding: 15px 15px 13px; border-bottom: 1px solid #f3f4f6; }
.qc-dash .pcol-head em { width: 36px; height: 36px; border-radius: 9px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: #f5f3ff; color: #7c3aed; }
.qc-dash .pcol-head em svg { width: 18px; height: 18px; }
.qc-dash .pcol.progreso .pcol-head em { background: #eff6ff; color: #2563eb; }
.qc-dash .pcol.completados .pcol-head em { background: #ecfdf5; color: #059669; }
.qc-dash .pcol.bloqueados .pcol-head em { background: #fffbeb; color: #d97706; }
/* 24px/500 (era 24px/700) -- medido en vivo contra .kpi > b del Dashboard
   real (no contra el mockup de ChatGPT, que traía 27px/750): mismo tipo de
   número grande, debe pesar igual en toda la app. */
.qc-dash .pcol-head b { display: block; font-size: 24px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; color: #111827; }
/* 12px/500 (era 13px/600) -- medido contra .kpi > strong del Dashboard. */
.qc-dash .pcol-head strong { display: block; font-size: 12px; font-weight: 500; margin-top: 4px; color: #111827; }
/* 10.4px (era 10.5px) -- ya coincidía prácticamente con .kpi > small. */
.qc-dash .pcol-head small { display: block; font-size: 10.4px; color: #6b7280; margin-top: 2px; }
/* 13px/500 (era 12px/600) -- sin análogo exacto en el Dashboard, pero
   ningún header de la app usa bold (.panel h2 es 13px/500); se sigue ese
   patrón en vez del 700 del mockup de ChatGPT. */
.qc-dash .pcol-section { display: flex; align-items: center; justify-content: space-between; padding: 12px 15px 8px; font-size: 13px; font-weight: 500; color: #374151; }
.qc-dash .pcol-section a { font-size: 11px; font-weight: 500; }
.qc-dash .pcol-list { flex: 1; padding: 0 13px; }
/* Scroll infinito de Completados -- alto fijo (no crece con cada tanda
   cargada) + scroll propio, en vez de "+N más -> Ver todo". */
.qc-dash .pcol-list-scroll { max-height: 240px; overflow-y: auto; }
.qc-dash .pcol-cargando-mas { padding: 10px 0; text-align: center; color: #9ca3af; font-size: 10.5px; }
.qc-dash .pcol-cargando-mas.pcol-error { color: #dc2626; }
.qc-dash .pcol-cargando-mas button { background: transparent; border: none; color: #2563eb; font: inherit; font-size: 10.5px; font-weight: 600; cursor: pointer; padding: 0; margin-left: 4px; }
.qc-dash .pcol-row { display: flex; align-items: center; gap: 9px; padding: 9px 0; border-top: 1px solid #f3f4f6; cursor: pointer; }
.qc-dash .pcol-list .pcol-row:first-child { border-top: none; }
.qc-dash .pcol-row:hover { background: rgba(0, 0, 0, .025); }
.qc-dash .pcol-house { width: 32px; height: 32px; border-radius: 7px; background: #f3f4f6; color: #6b7280; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.qc-dash .pcol-house svg { width: 15px; height: 15px; }
.qc-dash .pcol-house.azul { background: #eff6ff; color: #2563eb; }
.qc-dash .pcol-copy { min-width: 0; flex: 1; }
.qc-dash .pcol-copy strong, .qc-dash .pcol-copy span, .qc-dash .pcol-copy small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 13px/400 (era 12.5px/500) -- medido contra .mail b/.pname del Dashboard:
   los títulos de fila en toda la app pesan 400, no 500. */
.qc-dash .pcol-copy strong { font-size: 13px; font-weight: 400; color: #111827; }
/* 12.5px (era 11px) -- medido contra .mail strong/.project small. */
.qc-dash .pcol-copy span { font-size: 12.5px; font-weight: 400; color: #6b7280; margin-top: 2px; }
/* 9px (era 10px) -- medido contra .mail small. */
.qc-dash .pcol-copy small { font-size: 9px; color: #9ca3af; margin-top: 3px; }
.qc-dash .pcol-tag { flex-shrink: 0; font-size: 10.5px; color: #6b7280; white-space: nowrap; }
/* Badge tipo pill de la columna Pendientes -- misma mecánica que .priority
   del mockup (10px/700/radius 999px), pero con los 2 tonos reales que
   tenemos (sin empezar / ya hubo actividad) en vez de una prioridad
   inventada. Colores tomados literales de .priority.high/.priority.normal. */
.qc-dash .pcol-tag.urgente, .qc-dash .pcol-tag.normal { font-size: 10px; font-weight: 700; padding: 5px 8px; border-radius: 999px; white-space: nowrap; }
.qc-dash .pcol-tag.urgente { background: #fee2e2; color: #b91c1c; }
.qc-dash .pcol-tag.normal { background: #fef3c7; color: #92400e; }
/* 28px (era 26px) -- exacto contra .check del mockup (exclusivo de esta
   tarjeta, no compartido con las otras 3 columnas). */
.qc-dash .pcol-check { width: 28px; height: 28px; border-radius: 50%; background: #ecfdf5; color: #059669; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.qc-dash .pcol-check svg { width: 13px; height: 13px; }
.qc-dash .pcol-lock { width: 28px; height: 28px; border-radius: 50%; background: #fef2f2; color: #dc2626; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.qc-dash .pcol-lock svg { width: 13px; height: 13px; }
.qc-dash .pcol-row.bloqueado .pcol-copy small { color: #9ca3af; }
.qc-dash .pcol-vacio { padding: 22px 0; text-align: center; color: #9ca3af; font-size: 11.5px; }
.qc-dash .pcol-footer { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 11px 15px; border-top: 1px solid #f3f4f6; color: #6b7280; font-size: 11px; }
.qc-dash .pcol-footer a { font-weight: 600; }

/* Bloque "trabajo activo" de la columna En progreso -- calcado de
   .active-work/.detail/.progress-track/.open-btn del mockup real
   (references/quantum_mis_proyectos_dashboard_html_css/styles.css),
   valores literales de esa hoja, no una aproximación con tokens propios. */
.qc-dash .pcol-activo { display: flex; flex-direction: column; align-items: stretch; flex: 1; border-top: none; padding: 3px 0 15px; }
.qc-dash .pcol-activo-card { margin: 0 14px; padding: 13px; border: 1px solid #dbeafe; border-radius: 9px; background: #eff6ff; }
.qc-dash .pcol-activo-titulo { display: flex; align-items: center; gap: 10px; padding-bottom: 11px; border-bottom: 1px solid #dbeafe; }
.qc-dash .pcol-detalle { padding-top: 10px; }
.qc-dash .pcol-detalle span { display: block; font-size: 10px; color: #6b7280; }
.qc-dash .pcol-detalle strong { display: block; font-size: 12px; margin-top: 3px; color: #111827; font-variant-numeric: tabular-nums; }
.qc-dash .pcol-detalle strong.pcol-elapsed { color: #2563eb; font-size: 18px; margin-top: 4px; }
.qc-dash .pcol-track { height: 5px; border-radius: 10px; background: #dbeafe; margin-top: 10px; overflow: hidden; }
.qc-dash .pcol-track i { display: block; height: 100%; background: #2563eb; border-radius: 10px; }
/* Texto centrado (era text-align:left) -- pedido de Victor: "como esta
   el mockup". La flecha se posiciona con position:absolute en vez de
   float:right para no volver a correr el texto hacia la izquierda. */
.qc-dash .pcol-abrir { margin: 10px 14px 0; height: 38px; border-radius: 8px; border: 1px solid #93c5fd; background: #ffffff; color: #2563eb; font: inherit; font-size: 12px; font-weight: 650; cursor: pointer; padding: 0 12px; text-align: center; position: relative; }
.qc-dash .pcol-abrir span { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); display: inline-flex; align-items: center; }
.qc-dash .pcol-abrir svg { width: 14px; height: 14px; }
.qc-dash .pcol-abrir:hover { background: #eff6ff; }

/* minmax(0, Nfr) en vez de Nfr solo -- una columna de grid con fr puro
   respeta el min-content del contenido (acá, el ancho del texto "Mi
   productividad" + el dropdown), no la proporción declarada; con eso la
   primera columna se estaba comiendo la mitad del ancho real en vez de
   ~26%. Mismo fix clásico de "grid blowout" ya aplicado antes en este
   archivo (ver .mail div/.ticket div, min-width:0). */
.qc-dash .prod { margin-bottom: 12px; background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px 18px; display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1.5fr) minmax(0, 1.7fr); gap: 22px; align-items: center; }
.qc-dash .prod-stats { display: flex; gap: 22px; }
.qc-dash .prod.rango-abierto { position: relative; z-index: 30; }
.qc-dash .prod-head { display: flex; align-items: center; gap: 11px; }
.qc-dash .prod-head em { width: 36px; height: 36px; border-radius: 9px; background: #eff6ff; color: #2563eb; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.qc-dash .prod-head em svg { width: 17px; height: 17px; }
.qc-dash .prod-head h2 { margin: 0; font-size: 14.5px; color: #111827; }
.qc-dash .rango-wrap { margin-top: 5px; }
.qc-dash .rango-btn { display: inline-flex; align-items: center; gap: 6px; background: transparent; border: none; color: #6b7280; font: inherit; font-size: 11.5px; cursor: pointer; padding: 0; }
.qc-dash .rango-btn:hover { color: #374151; }
.qc-dash .rango-btn svg { width: 13px; height: 13px; }
/* Selector de rango -- dropdown de dos paneles (mockup de Norden, mismo
   diseño). El bug real reportado por Victor era que .rango-menu no tenía
   position:absolute y empujaba el alto de .prod al abrirse -- de ahí que
   esta regla, antes ausente, sea la pieza central del fix. */
.qc-dash .rango-menu {
  position: absolute; top: calc(100% + 8px); left: 0;
  background: #ffffff; border: 1px solid #e5e7eb; border-radius: 10px;
  box-shadow: 0 14px 34px rgba(0, 0, 0, .12); z-index: 40; overflow: hidden;
}
.qc-dash .rango-menu-cuerpo { display: flex; }
.qc-dash .rango-presets { width: 168px; flex-shrink: 0; padding: 8px; display: flex; flex-direction: column; gap: 2px; border-right: 1px solid #e5e7eb; }
.qc-dash .rango-preset-btn { text-align: left; background: transparent; border: none; color: #374151; font: inherit; font-size: 12.5px; padding: 8px 10px; border-radius: 6px; cursor: pointer; }
.qc-dash .rango-preset-btn:hover { background: #f3f4f6; }
.qc-dash .rango-preset-btn.activo { background: #eff6ff; color: #1d4ed8; font-weight: 600; }
.qc-dash .rango-cal-wrap { width: 300px; flex-shrink: 0; padding: 12px 14px 14px; }
.qc-dash .cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.qc-dash .cal-header span { font-size: 12.5px; font-weight: 600; color: #111827; text-transform: capitalize; }
.qc-dash .cal-nav { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; background: transparent; border: none; color: #6b7280; border-radius: 6px; cursor: pointer; padding: 0; }
.qc-dash .cal-nav:hover { background: #f3f4f6; color: #111827; }
.qc-dash .cal-nav svg { width: 14px; height: 14px; }
.qc-dash .cal-semana { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); margin-bottom: 2px; }
.qc-dash .cal-semana span { text-align: center; font-size: 9.5px; color: #6b7280; text-transform: uppercase; letter-spacing: .02em; }
.qc-dash .cal-fila { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
.qc-dash .cal-dia { width: 100%; aspect-ratio: 1; background: transparent; border: none; color: #374151; font: inherit; font-size: 11.5px; cursor: pointer; border-radius: 6px; font-variant-numeric: tabular-nums; }
.qc-dash .cal-dia:hover { background: #f3f4f6; }
.qc-dash .cal-dia.fuera { color: #d1d5db; }
.qc-dash .cal-dia.finde { color: #2563eb; }
.qc-dash .cal-dia.fuera.finde { color: #dbeafe; }
.qc-dash .cal-dia.hoy { box-shadow: inset 0 0 0 1px #2563eb; }
.qc-dash .cal-dia.enrango { background: #eff6ff; border-radius: 0; }
.qc-dash .cal-dia.sel { background: #1d4ed8; color: #fff; font-weight: 600; }
.qc-dash .cal-footer { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; padding-top: 10px; border-top: 1px solid #e5e7eb; }
.qc-dash .cal-footer button { background: transparent; border: none; color: #6b7280; font: inherit; font-size: 11.5px; cursor: pointer; padding: 6px 8px; border-radius: 6px; display: inline-flex; align-items: center; gap: 5px; }
.qc-dash .cal-footer button:hover { background: #f3f4f6; color: #111827; }
.qc-dash .cal-footer button svg { width: 12px; height: 12px; }
.qc-dash .cal-footer .cal-btn-primario { background: #1d4ed8; color: #fff; font-weight: 600; }
.qc-dash .cal-footer .cal-btn-primario:hover { background: #2563eb; }
.qc-dash .cal-footer .cal-btn-primario[disabled] { opacity: .4; cursor: default; pointer-events: none; }
.qc-dash .prod-stat { border-left: 1px solid #e5e7eb; padding-left: 18px; flex: 1; min-width: 0; }
.qc-dash .prod-stat b { display: block; font-size: 19px; font-weight: 700; color: #111827; font-variant-numeric: tabular-nums; }
.qc-dash .prod-stat span { display: block; font-size: 10.5px; color: #6b7280; margin-top: 4px; line-height: 1.35; }
.qc-dash .prod-chart { color: #2563eb; }
.qc-dash .prod-chart svg { width: 100%; height: 55px; display: block; }
.qc-dash .prod-chart svg circle { fill: currentColor; }
.qc-dash .prod-chart-labels { display: flex; justify-content: space-between; color: #6b7280; font-size: 9px; margin-top: 4px; }

/* ═══════════════════════════════════════════════════════════════════════════
   Modo oscuro — Mis Proyectos
   ─────────────────────────────────────────────────────────────────────────── */
html.dark-mode .qc-dash .pcol { background: linear-gradient(#0c1626 0%, #09111d 24%); border-color: #162b45; }
html.dark-mode .qc-dash .pcol-head { border-bottom-color: #112238; }
html.dark-mode .qc-dash .pcol-head em { background: #17213a; color: #9a72ff; }
html.dark-mode .qc-dash .pcol.progreso .pcol-head em { background: #12366b; color: #4d9aff; }
html.dark-mode .qc-dash .pcol.completados .pcol-head em { background: #103e2b; color: #19d48c; }
html.dark-mode .qc-dash .pcol.bloqueados .pcol-head em { background: #442b16; color: #f0a34a; }
html.dark-mode .qc-dash .pcol-head b { color: #eef4ff; }
html.dark-mode .qc-dash .pcol-head strong { color: #eef4ff; }
html.dark-mode .qc-dash .pcol-head small { color: #8fa0b8; }
html.dark-mode .qc-dash .pcol-section { color: #c2ccda; }
html.dark-mode .qc-dash .pcol-cargando-mas { color: #526176; }
html.dark-mode .qc-dash .pcol-cargando-mas.pcol-error { color: #ff8178; }
html.dark-mode .qc-dash .pcol-cargando-mas button { color: #4d9aff; }
html.dark-mode .qc-dash .pcol-row { border-top-color: #112238; }
html.dark-mode .qc-dash .pcol-row:hover { background: rgba(255, 255, 255, .02); }
html.dark-mode .qc-dash .pcol-house { background: #142744; color: #738aa5; }
html.dark-mode .qc-dash .pcol-house.azul { background: #103b73; color: #8fc1ff; }
html.dark-mode .qc-dash .pcol-copy strong { color: #eef4ff; }
html.dark-mode .qc-dash .pcol-copy span { color: #8fa0b8; }
html.dark-mode .qc-dash .pcol-copy small { color: #667991; }
html.dark-mode .qc-dash .pcol-tag { color: #8fa0b8; }
html.dark-mode .qc-dash .pcol-tag.urgente { background: #542022; color: #ff938c; }
html.dark-mode .qc-dash .pcol-tag.normal { background: #4b301b; color: #f3b36c; }
html.dark-mode .qc-dash .pcol-check { background: #0e4a2d; color: #55e39d; }
html.dark-mode .qc-dash .pcol-lock { background: #5b281f; color: #ff8178; }
html.dark-mode .qc-dash .pcol-row.bloqueado .pcol-copy small { color: #71859c; }
html.dark-mode .qc-dash .pcol-vacio { color: #526176; }
html.dark-mode .qc-dash .pcol-footer { border-top-color: #112238; color: #8fa0b8; }
html.dark-mode .qc-dash .pcol-activo-card { border-color: #1a3555; background: #0b1929; }
html.dark-mode .qc-dash .pcol-activo-titulo { border-bottom-color: #172b43; }
html.dark-mode .qc-dash .pcol-detalle span { color: #8296ad; }
html.dark-mode .qc-dash .pcol-detalle strong { color: #eef4ff; }
html.dark-mode .qc-dash .pcol-detalle strong.pcol-elapsed { color: #3f94ff; }
html.dark-mode .qc-dash .pcol-track { background: #08111d; }
html.dark-mode .qc-dash .pcol-track i { background: #3f94ff; }
html.dark-mode .qc-dash .pcol-abrir { border-color: #1c5eaa; background: #0b203b; color: #4d9cff; }
html.dark-mode .qc-dash .pcol-abrir:hover { background: #0e2745; }
html.dark-mode .qc-dash .prod { background: linear-gradient(#0c1626 0%, #09111d 24%); border-color: #162b45; }
html.dark-mode .qc-dash .prod-head em { background: #102c52; color: #72afff; }
html.dark-mode .qc-dash .prod-head h2 { color: #eef4ff; }
html.dark-mode .qc-dash .rango-btn { color: #8fa0b8; }
html.dark-mode .qc-dash .rango-btn:hover { color: #c2ccda; }
html.dark-mode .qc-dash .rango-menu { background: #0b1a2c; border-color: #162b45; box-shadow: 0 14px 34px rgba(0, 0, 0, .45); }
html.dark-mode .qc-dash .rango-presets { border-right-color: #162b45; }
html.dark-mode .qc-dash .rango-preset-btn { color: #c2ccda; }
html.dark-mode .qc-dash .rango-preset-btn:hover { background: #0f2440; }
html.dark-mode .qc-dash .rango-preset-btn.activo { background: #102c52; color: #eef4ff; }
html.dark-mode .qc-dash .cal-header span { color: #eef4ff; }
html.dark-mode .qc-dash .cal-nav { color: #8fa0b8; }
html.dark-mode .qc-dash .cal-nav:hover { background: #102c52; color: #eef4ff; }
html.dark-mode .qc-dash .cal-semana span { color: #667991; }
html.dark-mode .qc-dash .cal-dia { color: #c2ccda; }
html.dark-mode .qc-dash .cal-dia:hover { background: #102c52; }
html.dark-mode .qc-dash .cal-dia.fuera { color: #3c4a5e; }
html.dark-mode .qc-dash .cal-dia.finde { color: #72afff; }
html.dark-mode .qc-dash .cal-dia.fuera.finde { color: #2a3a52; }
html.dark-mode .qc-dash .cal-dia.hoy { box-shadow: inset 0 0 0 1px #3e96ff; }
html.dark-mode .qc-dash .cal-dia.enrango { background: #102c52; }
html.dark-mode .qc-dash .cal-dia.sel { background: #1e5ca5; }
html.dark-mode .qc-dash .cal-footer { border-top-color: #162b45; }
html.dark-mode .qc-dash .cal-footer button { color: #8fa0b8; }
html.dark-mode .qc-dash .cal-footer button:hover { background: #102c52; color: #eef4ff; }
html.dark-mode .qc-dash .cal-footer .cal-btn-primario { background: #1e5ca5; }
html.dark-mode .qc-dash .cal-footer .cal-btn-primario:hover { background: #256bbf; }
html.dark-mode .qc-dash .prod-stat { border-left-color: #19304a; }
html.dark-mode .qc-dash .prod-stat b { color: #eef4ff; }
html.dark-mode .qc-dash .prod-stat span { color: #8fa0b8; }
html.dark-mode .qc-dash .prod-chart { color: #4798ff; }
html.dark-mode .qc-dash .prod-chart-labels { color: #667991; }
@media (max-width: 850px) {
  html.dark-mode .qc-dash .rango-presets { border-bottom-color: #162b45; }
}

/* ── Responsive — sólo el contenido; el sidebar no cambia (pedido de Victor) ── */
@media (max-width: 1250px) {
  .qc-dash .kpis { grid-template-columns: repeat(3, 1fr); }
  .qc-dash .topgrid { grid-template-columns: 1fr 1.2fr; }
  .qc-dash .bottomgrid { grid-template-columns: 1.3fr 1fr 1fr; }
  .qc-dash .activity { grid-column: 1 / -1; }
  .qc-dash .ppanel-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .qc-dash .prod { grid-template-columns: 1fr; gap: 14px; }
  .qc-dash .prod-stats { flex-wrap: wrap; }
}
@media (max-width: 850px) {
  .qc-dash .topgrid, .qc-dash .bottomgrid { grid-template-columns: 1fr; }
  .qc-dash .activity { grid-column: auto; }
  .qc-dash .kpis { grid-template-columns: repeat(2, 1fr); }
  .qc-dash .ppanel-grid { grid-template-columns: 1fr; }
  .qc-dash .tk2-grid { grid-template-columns: 1fr; }
  /* Bandeja de dos paneles: bajo 850px se apilan -- la lista se oculta
     mientras hay un email abierto (que ya trae "Volver" visible acá) y
     se muestra de nuevo al volver a /dashboard/inbox sin selección. */
  .qc-dash .ibx-grid { grid-template-columns: 1fr; }
  .qc-dash .ibx-volver { display: inline-flex; }
  body:has(.ibx-lectura-acciones) .qc-dash .ibx-lista { display: none; }
  /* Selector de rango: bajo 850px las dos columnas (468px) no caben sin
     desbordar -- se apilan y se limita el ancho al viewport disponible. */
  .qc-dash .rango-menu { max-width: calc(100vw - 40px); }
  .qc-dash .rango-menu-cuerpo { flex-direction: column; }
  .qc-dash .rango-presets { width: 100%; flex-direction: row; flex-wrap: wrap; border-right: none; border-bottom: 1px solid #e5e7eb; }
  .qc-dash .rango-cal-wrap { width: 100%; box-sizing: border-box; }
}
@media (max-width: 600px) {
  .qc-dash .heading { flex-direction: column; align-items: flex-start; }
  .qc-dash .kpis { grid-template-columns: 1fr; }
  .qc-dash .thead { display: none; }
  .qc-dash .project { grid-template-columns: 1fr 1fr; }
  .qc-dash .pname { grid-column: 1 / -1; }
  .qc-dash .project > div:nth-child(4), .qc-dash .project > div:nth-child(5) { display: none; }
  .qc-dash .tkl-thead { display: none; }
  .qc-dash .tkl-fila { grid-template-columns: 1fr auto; }
  .qc-dash .tkl-id, .qc-dash .tkl-depto, .qc-dash .tkl-persona, .qc-dash .tkl-actualizado svg { display: none; }
  .qc-dash .tkl-subject { grid-column: 1 / -1; }
}

/* ══ Workspace de proyecto (/dashboard/{id}) ══════════════════════════════
   Mockup real: references/1 Proyecto ChatGPT Image...png +
   references/quantum_higo2_project_workspace/{index.html,styles.css}.
   Tipografía de fila/tarjeta sigue la convención ya establecida del
   Dashboard (13px/400 títulos de fila, .panel h2 para encabezados) en vez
   de copiar literal los pesos del mockup -- mismo criterio aplicado ya a
   las 4 columnas de Mis Proyectos. Colores de estado/pill sí son literales
   del mockup (contenido específico de esta página, sin equivalente ya
   establecido en el resto de la app). */
/* Valores medidos con sonda contra el mockup servido en /mockup-ref
   (comparación tarjeta por tarjeta con Victor, 2026-09-01). El weight del
   h1 se queda en el 600 estándar de la app a pedido explícito de Victor
   ("el weight de los titulos no se cambia, ya lo usamos para todas las
   paginas") -- todo lo demás va literal al mockup. */
.qc-dash .ficha-volver { color: #6b7280; font-size: 14px; display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; }
.qc-dash .ficha-volver svg { width: 15px; height: 15px; }
.qc-dash .ficha-volver:hover { color: #111827; }
/* "Volver a Mis Proyectos" y el estado en la misma fila -- pedido de
   Victor, 2026-09-01 ("debe estar alineado a Volver a mis proyectos").
   Título/subtítulo viven en el header persistente, no acá. */
.qc-dash .ficha-volver-fila { display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap; margin: 18px 0 22px; }
.qc-dash .ficha-estado { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.qc-dash .ficha-estado-pill { font-size: 12px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase; display: inline-flex; align-items: center; gap: 6px; }
.qc-dash .ficha-estado-pill::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
.qc-dash .ficha-estado-pill.amarillo { color: #b45309; }
.qc-dash .ficha-estado-pill.azul { color: #2563eb; }
.qc-dash .ficha-estado-pill.verde { color: #059669; }

.qc-dash .ficha-grid { display: grid; grid-template-columns: minmax(0, 1fr) 332px; gap: 16px; align-items: start; }
.qc-dash .ficha-cards { display: grid; grid-template-columns: 1fr 1fr 1.08fr; gap: 15px; margin-bottom: 15px; }
.qc-dash .ficha-cards .panel { padding: 18px; }
.qc-dash .ficha-cards .panel h2 { height: auto; padding: 0; border: none; margin: 0 0 13px; }
/* align-items:flex-start (era center) -- pedido de Victor: cuando el
   valor envuelve a 2 líneas ("Extras": "Piscina, terraza, open
   kitchen."), el label quedaba centrado contra las 2 líneas en vez de
   alineado arriba, como está "Estado" (una sola línea). */
.qc-dash .ficha-dato { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; padding: 8px 0; border-bottom: 1px solid #f3f4f6; font-size: 12.5px; }
.qc-dash .ficha-dato:last-child { border-bottom: none; }
.qc-dash .ficha-dato span { color: #6b7280; display: flex; align-items: center; gap: 7px; }
.qc-dash .ficha-dato span svg { width: 14px; height: 14px; color: #9ca3af; flex-shrink: 0; }
.qc-dash .ficha-dato b { color: #111827; font-weight: 500; text-align: right; }
.qc-dash .ficha-dato b.amarillo { color: #b45309; }
.qc-dash .ficha-progreso { display: flex; align-items: center; gap: 18px; }
.qc-dash .ficha-progreso ul { list-style: none; margin: 0; padding: 0; font-size: 11.5px; color: #4b5563; flex: 1; min-width: 0; }
.qc-dash .ficha-progreso ul li { display: flex; align-items: center; padding: 5px 0; white-space: nowrap; }
.qc-dash .ficha-progreso ul li i { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; flex-shrink: 0; }
.qc-dash .ficha-progreso ul li b { margin-left: auto; padding-left: 10px; color: #111827; font-weight: 500; }
.qc-dash .ficha-progreso small { display: block; color: #9ca3af; margin-top: 10px; font-size: 10.5px; }
.qc-dash .ficha-progreso-barra { height: 6px; background: #e5e7eb; border-radius: 9px; overflow: hidden; margin-top: 6px; }
.qc-dash .ficha-progreso-barra i { display: block; height: 100%; background: linear-gradient(90deg, #4e6eff, #20c985); }

.qc-dash .ficha-sidebar { display: flex; flex-direction: column; gap: 15px; }
.qc-dash .ficha-sidebar .panel { padding: 18px; }
.qc-dash .ficha-sidebar .panel.activity { padding: 0; min-height: 0; }
.qc-dash .ficha-sidebar .panel.activity h2 { margin: 0; padding: 16px 18px; border-bottom: 1px solid #f3f4f6; height: auto; }
.qc-dash .ficha-tour-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 13px; }
/* padding/height/border reseteados (era sólo margin) -- .panel h2 base
   trae padding-left:15px + height:46px + borde pensados para tarjetas sin
   padding propio; las de la sidebar ya tienen padding:18px, quedaba
   doblemente indentado contra "Proyecto"/"Datos técnicos". */
.qc-dash .ficha-tour-head h2 { margin: 0 !important; padding: 0; height: auto; border: none; }
/* Mismo estilo/tamaño que .qcdp-pill (Pendiente/Completado de Documentos)
   -- pedido explícito de Victor: quedaba 27px de alto contra 23px (padding
   5px vs 4px, weight 400 vs 600, radius 18 vs 20, con borde de más). Sin
   borde, igual que esos pills. */
.qc-dash .ficha-tour-disponible { color: #059669; background: #ecfdf5; border-radius: 20px; padding: 4px 9px; font-size: 10px; font-weight: 600; white-space: nowrap; }
.qc-dash .ficha-tour-sin { color: #6b7280; background: #f3f4f6; border-radius: 20px; padding: 4px 9px; font-size: 10px; font-weight: 600; white-space: nowrap; }
/* Estado intermedio (1-4 de 5 ambientes) -- mismos tonos ámbar ya
   usados para "en gestión"/"pendiente" en el resto de la ficha. */
.qc-dash .ficha-tour-incompleto { color: #92400e; background: #fef3c7; border-radius: 20px; padding: 4px 9px; font-size: 10px; font-weight: 600; white-space: nowrap; }
/* Medido contra el mockup real: alto 205px (era 150), gradiente beige
   cálido simulando una foto (era marrón oscuro, no leía como preview),
   texto "360°" 26px/800 con text-shadow (era un ícono). */
.qc-dash .ficha-tour-preview { height: 205px; margin-bottom: 13px; border-radius: 8px; background: linear-gradient(145deg, #81766b, #d2c0aa 45%, #5b5752); display: flex; align-items: center; justify-content: center; color: #eaf1fb; font-size: 26px; font-weight: 800; text-shadow: 0 2px 6px rgba(51, 51, 51, .8); }
.qc-dash .ficha-tour-btn { display: flex; align-items: center; justify-content: center; gap: 7px; width: 100%; box-sizing: border-box; text-align: center; background: #1457d8; color: #fff; border: 1px solid #245dba; border-radius: 8px; padding: 10px 13px; font: inherit; font-size: 13.3px; font-weight: 600; text-decoration: none; cursor: pointer; }
.qc-dash .ficha-tour-btn:hover { background: #1a63f0; }
.qc-dash .ficha-tour-publico { display: flex; align-items: center; justify-content: center; gap: 5px; margin-top: 9px; color: #2563eb; font-size: 11.5px; text-decoration: none; }
.qc-dash .ficha-tour-publico:hover { text-decoration: underline; }
.qc-dash .ficha-tour-publico svg { width: 11px; height: 11px; }
.qc-dash .ficha-tour-btn svg { width: 13px; height: 13px; }
/* Íconos de estado en Actividad reciente -- check verde/reloj ámbar como
   la captura del mockup. */
.qc-dash .ficha-sidebar .activity p svg.ficha-act-verde { color: #059669; }
.qc-dash .ficha-sidebar .activity p svg.ficha-act-ambar { color: #92400e; }
.qc-dash .ficha-sidebar .activity p svg.ficha-act-roja { color: #dc2626; }
.qc-dash .ficha-sidebar .activity p svg.ficha-act-gris { color: #9ca3af; }
.qc-dash .ficha-sidebar .activity p svg.ficha-act-azul { color: #2563eb; }

/* Fila resumen "Tour 360° · N cambios" (agrupa todos los eventos del tour
   en una sola línea de Actividad reciente, pedido de Victor para que la
   lista no se llene con un evento por ambiente) + su detalle desplegable. */
.qc-dash .ficha-sidebar .activity .ficha-act-grupo { cursor: pointer; }
.qc-dash .ficha-sidebar .activity .ficha-act-grupo:hover { background: #f9fafb; }
.qc-dash .ficha-sidebar .activity .ficha-act-caret { font-style: normal; margin-left: auto; color: #9ca3af; font-size: 11px; flex-shrink: 0; }
.qc-dash .ficha-sidebar .activity .ficha-act-detalle { background: #f9fafb; max-height: 220px; overflow-y: auto; }
.qc-dash .ficha-sidebar .activity .ficha-act-detalle p { padding-left: 30px; }

/* Documentos de Diseño y Planificación en oscuro -- design-planning-tab.js
   pintarOscuro(), mismos filas/estado que el tab claro de otros roles. */
.qc-dash .qcdp-cargando { padding: 18px; color: #6b7280; font-size: 12.5px; }
.qc-dash .qcdp-cab { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px 12px; }
/* padding/height/border reseteados -- mismo bug de siempre: heredaba
   padding-left:15px + height:46px + borde de .panel h2 base (pensada para
   tarjetas sin padding propio), quedaba desalineado contra "Proyecto" y
   con una línea que no debía llevar. Tamaño 21px (era 13px) -- medido
   contra el mockup real (.docs .sect h2), "un poco más grande" que el
   resto según Victor; weight se queda en 500 y mayúsculas, misma
   convención que las demás tarjetas de esta página (no 700 del mockup). */
.qc-dash .qcdp-cab h2 { margin: 0; padding: 0; height: auto; border: none; font-size: 16px; font-weight: 500; color: #111827; text-transform: uppercase; letter-spacing: .02em; }
/* 13px (era 12px) -- mismo tamaño que los títulos de las otras
   tarjetas (PROYECTO/DATOS TÉCNICOS/...), pedido de Victor. */
.qc-dash .qcdp-cab b { color: #2563eb; font-size: 13px; font-weight: 600; }
.qc-dash .qcdp-barra { height: 6px; margin: 0 18px 8px; background: #e5e7eb; border-radius: 9px; overflow: hidden; }
.qc-dash .qcdp-barra i { display: block; height: 100%; background: linear-gradient(90deg, #4e6eff, #20c985); border-radius: 9px; }
.qc-dash .qcdp-titulo-seccion { margin: 0; padding: 12px 18px 6px; font-size: 11px; font-weight: 600; color: #dc2626; letter-spacing: .03em; }
.qc-dash .qcdp-titulo-seccion.qcdp-completados { color: #059669; border-top: 1px solid #f3f4f6; padding-top: 18px; margin-top: 6px; }
.qc-dash .qcdp-fila { min-height: 53px; padding: 0 18px; border-top: 1px solid #f3f4f6; display: grid; grid-template-columns: 26px minmax(140px, 1fr) auto 130px 108px 20px; align-items: center; gap: 9px; }
/* Ícono de archivo tintado por estado (caja redondeada con fondo, como la
   captura del mockup) -- el HTML de referencia no lo traía, catalogado con
   crops de PIL de la imagen. */
.qc-dash .qcdp-icono { width: 26px; height: 26px; border-radius: 6px; display: flex; align-items: center; justify-content: center; color: #6b7280; background: #f3f4f6; }
.qc-dash .qcdp-icono.pendiente { color: #b91c1c; background: #fee2e2; }
.qc-dash .qcdp-icono.en_gestion { color: #92400e; background: #fef3c7; }
.qc-dash .qcdp-icono.obtenido { color: #059669; background: #ecfdf5; }
.qc-dash .qcdp-icono.no_aplica { color: #9ca3af; background: #f3f4f6; }
/* min-width:0 en nombre-textos (no en .qcdp-nombre, que ahora es flex) --
   así el elipsis de strong/small sigue funcionando con el caret al lado. */
.qc-dash .qcdp-nombre { min-width: 0; display: flex; align-items: flex-start; gap: 6px; }
.qc-dash .qcdp-nombre-textos { min-width: 0; }
.qc-dash .qcdp-nombre strong { display: block; font-size: 13px; font-weight: 400; color: #111827; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qc-dash .qcdp-nombre small { display: block; font-size: 11px; color: #6b7280; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Caret de historial (pedido de Victor, 2026-09-01: "debe desplegarse el
   row para mostrar la lista de fechas y documentos subidos") -- solo
   aparece si hay más de una subida para ese documento (ver filaOscura). */
.qc-dash .qcdp-caret-btn { background: none; border: none; padding: 2px 0 0; cursor: pointer; color: #9ca3af; flex-shrink: 0; }
.qc-dash .qcdp-caret-btn:hover { color: #111827; }
/* 15px (era 10px) -- pedido de Victor: "el icono para desplegar" un poco
   más grande, sigue siendo el mismo glifo ▸, no un ícono nuevo. */
.qc-dash .qcdp-caret { display: inline-block; font-size: 15px; transition: transform 120ms ease-out; }
.qc-dash .qcdp-caret-abierto { transform: rotate(90deg); }
.qc-dash .qcdp-caret-spacer { display: inline-block; width: 10px; flex-shrink: 0; }
.qc-dash .qcdp-historial { padding: 2px 18px 10px 61px; border-top: 1px dashed #f3f4f6; margin-top: 2px; }
.qc-dash .qcdp-historial-fila { display: flex; align-items: center; gap: 12px; padding: 6px 0; font-size: 11.5px; }
.qc-dash .qcdp-historial-fecha { color: #6b7280; min-width: 130px; }
.qc-dash .qcdp-historial-ver { color: #2563eb; text-decoration: none; display: inline-flex; align-items: center; gap: 4px; }
.qc-dash .qcdp-historial-ver:hover { text-decoration: underline; }
.qc-dash .qcdp-historial-sin { color: #d1d5db; }
.qc-dash .qcdp-historial-borrar { margin-left: auto; background: none; border: none; color: #9ca3af; cursor: pointer; font-size: 16px; line-height: 1; padding: 0; }
.qc-dash .qcdp-historial-borrar:hover { color: #dc2626; }
.qc-dash .qcdp-historial-vacio { padding: 6px 0; font-size: 11.5px; color: #9ca3af; font-style: italic; }
/* Toggle "No aplica" (pedido de Victor, 2026-08-31) -- vive dentro del
   historial desplegado, no en la fila colapsada: evita agregar una
   columna más al grid de 6 de .qcdp-fila. */
.qc-dash .qcdp-no-aplica-fila { padding: 6px 0 0; border-top: 1px dashed #f3f4f6; margin-top: 4px; }
.qc-dash .qcdp-no-aplica-btn { background: none; border: none; padding: 0; font: inherit; font-size: 11.5px; font-weight: 500; color: #6b7280; cursor: pointer; text-decoration: underline; }
.qc-dash .qcdp-no-aplica-btn:hover { color: #111827; }
.qc-dash .qcdp-pill { font-size: 10px; font-weight: 600; padding: 4px 9px; border-radius: 20px; white-space: nowrap; justify-self: start; }
.qc-dash .qcdp-pill.pendiente { color: #b91c1c; background: #fee2e2; }
.qc-dash .qcdp-pill.en_gestion { color: #92400e; background: #fef3c7; }
.qc-dash .qcdp-pill.obtenido { color: #059669; background: #ecfdf5; }
.qc-dash .qcdp-pill.no_aplica { color: #6b7280; background: #f3f4f6; }
.qc-dash .qcdp-select { background: #ffffff; color: #111827; border: 1px solid #d1d5db; border-radius: 7px; padding: 7px; font: inherit; font-size: 11px; width: 100%; box-sizing: border-box; }
/* height 26px -- mismo alto que .qcdp-icono (pedido de Victor: "los
   botones deben ser del mismo alto que los iconos de documentos"). */
.qc-dash .qcdp-btn { background: transparent; border: 1px solid #2563eb; color: #2563eb; border-radius: 7px; height: 26px; padding: 0 9px; box-sizing: border-box; font: inherit; font-size: 11px; font-weight: 500; cursor: pointer; text-decoration: none; text-align: center; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; gap: 5px; }
.qc-dash .qcdp-btn:hover { background: rgba(37, 99, 235, .08); }
.qc-dash .qcdp-time { font-size: 10px; color: #9ca3af; white-space: nowrap; }
.qc-dash .qcdp-borrar { background: transparent; border: none; color: #9ca3af; cursor: pointer; font-size: 17px; line-height: 1; padding: 0; }
.qc-dash .qcdp-borrar:hover { color: #dc2626; }
.qc-dash .qcdp-pie { padding: 14px 18px 18px; }
.qc-dash .qcdp-agregar { background: transparent; border: none; color: #059669; font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer; padding: 0; }
.qc-dash .qcdp-form-agregar { display: flex; align-items: center; gap: 8px; }
.qc-dash .qcdp-input { flex: 1; min-width: 0; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 7px; color: #111827; font: inherit; font-size: 12.5px; padding: 8px 10px; box-sizing: border-box; }
.qc-dash .qcdp-cancelar { background: transparent; border: none; color: #6b7280; font: inherit; font-size: 11.5px; cursor: pointer; padding: 0 4px; }

@media (max-width: 1250px) {
  .qc-dash .ficha-grid { grid-template-columns: 1fr; }
  .qc-dash .ficha-sidebar { display: grid; grid-template-columns: 1fr 1fr; }
}
@media (max-width: 850px) {
  .qc-dash .ficha-cards { grid-template-columns: 1fr 1fr; }
  .qc-dash .ficha-cards .panel:last-child { grid-column: 1 / -1; }
  .qc-dash .ficha-sidebar { grid-template-columns: 1fr; }
  .qc-dash .qcdp-fila { grid-template-columns: 26px 1fr auto; }
  .qc-dash .qcdp-select, .qc-dash .qcdp-time { display: none; }
}
@media (max-width: 600px) {
  .qc-dash .ficha-cards { grid-template-columns: 1fr; }
  .qc-dash .ficha-volver-fila { display: block; }
  .qc-dash .ficha-estado { margin-top: 14px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   Modo oscuro — Workspace de proyecto (ficha) + Documentos
   ─────────────────────────────────────────────────────────────────────────── */
html.dark-mode .qc-dash .ficha-volver { color: #aab7c8; }
html.dark-mode .qc-dash .ficha-volver:hover { color: #dbe4ee; }
html.dark-mode .qc-dash .ficha-estado-pill.amarillo { color: #f4b51b; }
html.dark-mode .qc-dash .ficha-estado-pill.azul { color: #4d9aff; }
html.dark-mode .qc-dash .ficha-estado-pill.verde { color: #20d37d; }
html.dark-mode .qc-dash .ficha-dato { border-bottom-color: #112238; }
html.dark-mode .qc-dash .ficha-dato span { color: #8fa0b8; }
html.dark-mode .qc-dash .ficha-dato span svg { color: #667991; }
html.dark-mode .qc-dash .ficha-dato b { color: #eef4ff; }
html.dark-mode .qc-dash .ficha-dato b.amarillo { color: #f4b51b; }
html.dark-mode .qc-dash .ficha-progreso ul { color: #c2ccda; }
html.dark-mode .qc-dash .ficha-progreso ul li b { color: #eef4ff; }
html.dark-mode .qc-dash .ficha-progreso small { color: #8192a8; }
html.dark-mode .qc-dash .ficha-progreso-barra { background: #172941; }
html.dark-mode .qc-dash .ficha-sidebar .panel.activity h2 { border-bottom-color: #112238; }
html.dark-mode .qc-dash .ficha-tour-disponible { color: #28d391; background: #0c3028; }
html.dark-mode .qc-dash .ficha-tour-sin { color: #667991; background: #10202f; }
html.dark-mode .qc-dash .ficha-tour-incompleto { color: #f2b31b; background: #3a2b13; }
html.dark-mode .qc-dash .ficha-tour-publico { color: #5aa0ff; }
html.dark-mode .qc-dash .ficha-sidebar .activity p svg.ficha-act-verde { color: #26d38b; }
html.dark-mode .qc-dash .ficha-sidebar .activity p svg.ficha-act-ambar { color: #f2b31b; }
html.dark-mode .qc-dash .ficha-sidebar .activity p svg.ficha-act-roja { color: #ff6b5e; }
html.dark-mode .qc-dash .ficha-sidebar .activity p svg.ficha-act-gris { color: #667a94; }
html.dark-mode .qc-dash .ficha-sidebar .activity p svg.ficha-act-azul { color: #5aa0ff; }
html.dark-mode .qc-dash .ficha-sidebar .activity .ficha-act-grupo:hover { background: rgba(255, 255, 255, .03); }
html.dark-mode .qc-dash .ficha-sidebar .activity .ficha-act-caret { color: #667a94; }
html.dark-mode .qc-dash .ficha-sidebar .activity .ficha-act-detalle { background: rgba(255, 255, 255, .02); }
html.dark-mode .qc-dash .qcdp-cargando { color: #8fa0b8; }
html.dark-mode .qc-dash .qcdp-cab h2 { color: #eef4ff; }
html.dark-mode .qc-dash .qcdp-cab b { color: #5aa0ff; }
html.dark-mode .qc-dash .qcdp-barra { background: #172941; }
html.dark-mode .qc-dash .qcdp-titulo-seccion { color: #ff706c; }
html.dark-mode .qc-dash .qcdp-titulo-seccion.qcdp-completados { color: #2bd594; border-top-color: #17263a; }
html.dark-mode .qc-dash .qcdp-fila { border-top-color: #17263a; }
html.dark-mode .qc-dash .qcdp-icono { color: #5f7896; background: #142031; }
html.dark-mode .qc-dash .qcdp-icono.pendiente { color: #ff706c; background: #351b24; }
html.dark-mode .qc-dash .qcdp-icono.en_gestion { color: #f2b31b; background: #3a2b13; }
html.dark-mode .qc-dash .qcdp-icono.obtenido { color: #26d38b; background: #0d3028; }
html.dark-mode .qc-dash .qcdp-icono.no_aplica { color: #667a94; background: #16233b; }
html.dark-mode .qc-dash .qcdp-nombre strong { color: #eef4ff; }
html.dark-mode .qc-dash .qcdp-nombre small { color: #8fa0b8; }
html.dark-mode .qc-dash .qcdp-caret-btn { color: #667a94; }
html.dark-mode .qc-dash .qcdp-caret-btn:hover { color: #eef4ff; }
html.dark-mode .qc-dash .qcdp-historial { border-top-color: #17263a; }
html.dark-mode .qc-dash .qcdp-historial-fecha { color: #8fa0b8; }
html.dark-mode .qc-dash .qcdp-historial-ver { color: #5aa0ff; }
html.dark-mode .qc-dash .qcdp-historial-sin { color: #3a4a60; }
html.dark-mode .qc-dash .qcdp-historial-borrar { color: #526176; }
html.dark-mode .qc-dash .qcdp-historial-borrar:hover { color: #ff4c43; }
html.dark-mode .qc-dash .qcdp-historial-vacio { color: #526176; }
html.dark-mode .qc-dash .qcdp-no-aplica-fila { border-top-color: #17263a; }
html.dark-mode .qc-dash .qcdp-no-aplica-btn { color: #8fa0b8; }
html.dark-mode .qc-dash .qcdp-no-aplica-btn:hover { color: #eef4ff; }
html.dark-mode .qc-dash .qcdp-pill.pendiente { color: #ff706c; background: #351b24; }
html.dark-mode .qc-dash .qcdp-pill.en_gestion { color: #f2b31b; background: #3a2b13; }
html.dark-mode .qc-dash .qcdp-pill.obtenido { color: #26d38b; background: #0d3028; }
html.dark-mode .qc-dash .qcdp-pill.no_aplica { color: #8fa0b8; background: #16233b; }
html.dark-mode .qc-dash .qcdp-select { background: #111e31; color: #d4dfed; border-color: #2a3c56; }
html.dark-mode .qc-dash .qcdp-btn { border-color: #245dba; color: #5aa0ff; }
html.dark-mode .qc-dash .qcdp-btn:hover { background: rgba(90, 160, 255, .08); }
html.dark-mode .qc-dash .qcdp-time { color: #9aaabd; }
html.dark-mode .qc-dash .qcdp-borrar { color: #526176; }
html.dark-mode .qc-dash .qcdp-borrar:hover { color: #ff4c43; }
html.dark-mode .qc-dash .qcdp-agregar { color: #29d493; }
html.dark-mode .qc-dash .qcdp-input { background: #091827; border-color: #162b45; color: #eef4ff; }
html.dark-mode .qc-dash .qcdp-cancelar { color: #8fa0b8; }

/* /dashboard/{id}/tour -- editor real de Tour 360° embebido (property-
   tour.js, montado vía window.QuantumTour.montarEn). Esto sólo le da lugar
   para crecer dentro de nuestro layout con flex:1 -- el panel en sí trae su
   propio claro/oscuro, ver el bloque de abajo. */
/* max-height (no solo min-height) es lo que realmente importa acá: un flex
   column con SOLO un mínimo puede crecer sin techo si su contenido lo pide
   -- y con varios ambientes en la lista, eso empujaba a #qc-tour-stage (la
   misma fila de grid) a una altura absurda, más alta que ancha pese a que
   la panorámica siempre es 2:1 (8192x4096), con toda la página scrolleando
   en vez de la lista de ambientes por dentro (reportado por Victor: "un
   scroller que me hace escrolear abajo y arriba"). Con el techo puesto,
   #qc-tour-sidebar (overflow-y:auto + min-height:0, ver property-tour.js)
   sí puede scrollear internamente como estaba pensado. Confirmado en vivo
   con una sonda de DOM antes de aplicar: 903x1426 (portrait) -> 903x503
   (paisaje, ~2:1) apenas se agrega el tope. */
.qc-dash-tour { display: flex; flex-direction: column; min-height: calc(100vh - 170px); max-height: calc(100vh - 170px); }
.qc-dash .ficha-tour-editor { display: flex; flex-direction: column; flex: 1; margin-top: 16px; min-height: 0; }

/* ═══════════════════════════════════════════════════════════════════════════
   Modo oscuro — Tour 360° (property-tour.js)
   ───────────────────────────────────────────────────────────────────────────
   property-tour.js escribe todo como estilos inline (archivo autocontenido,
   sin depender de esta hoja) -- acá se restauran los valores oscuros
   originales con !important, único mecanismo que le gana a un estilo en
   línea sin !important propio. Alcance: chrome de panel (barra, "Ambientes",
   estado vacío del viewer), popups (confirmar/renombrar/nuevo ambiente) y el
   modal de Publicar -- todos siguen el tema de la página. Minimapa/editbar/
   picker de hotspots quedan oscuros en los dos modos a propósito: son overlays
   FLOTANDO SOBRE LA FOTO 360° real (o su placeholder), no chrome de página --
   mismo criterio que los controles/subtítulos de un reproductor de video, que
   no cambian con el tema del sitio porque necesitan contraste garantizado
   contra una imagen arbitraria debajo, no contra el fondo de la página.
   ═══════════════════════════════════════════════════════════════════════════ */
html.dark-mode #qc-tour-toolbar { background: #0e192c !important; border-color: #1b2b42 !important; color: #fff !important; }
html.dark-mode #qc-tour-edit-checkmark { border-color: #33445e !important; }
html.dark-mode #qc-tour-ambientes-panel { background: linear-gradient(#0b1729, #091424) !important; border-color: #1b2c44 !important; color: #fff !important; }
html.dark-mode #qc-tour-add-scene-btn { border-color: #2b405f !important; background: #0e1c30 !important; color: #fff !important; }
html.dark-mode #qc-tour-empty-card { border-color: #35475f !important; }
html.dark-mode #qc-tour-empty-card > div:first-child { border-color: #8b9bb0 !important; color: #8b9bb0 !important; }
html.dark-mode #qc-tour-empty-title { color: #fff !important; }
html.dark-mode #qc-tour-empty-card p { color: #8292a8 !important; }
html.dark-mode #qc-tour-empty-add-btn, html.dark-mode #qc-tour-inline-add-btn { background: #071326 !important; border-color: #2864bc !important; color: #4e9aff !important; }
html.dark-mode .qc-tour-scene-label { background: #0e172b !important; color: #fff !important; }
html.dark-mode #qc-tour-empty-viewer {
  border-color: #36465e !important;
  background: radial-gradient(circle at 50% 45%, rgba(34, 53, 80, .17), transparent 36%), linear-gradient(145deg, #0b1422, #08111e) !important;
}
html.dark-mode #qc-tour-empty-viewer > div:first-child { color: #8f9bae !important; }
html.dark-mode #qc-tour-empty-viewer-title { color: #fff !important; }
html.dark-mode #qc-tour-empty-viewer p { color: #8494a9 !important; }
html.dark-mode .qc-tour-inline-popup { background: #0e172b !important; color: #fff !important; border: none !important; box-shadow: 0 4px 16px rgba(0, 0, 0, .5) !important; }
html.dark-mode .qc-tour-inline-popup .qc-popup-cancel { background: #444 !important; color: #fff !important; }
html.dark-mode #qc-tour-publish-modal > div { background: #0e172b !important; color: #fff !important; }
html.dark-mode #qc-tour-publish-modal label { color: #9ca3af !important; }
html.dark-mode #qc-tour-scene-name-modal > div { background: #0e172b !important; color: #fff !important; }
html.dark-mode #qc-tour-scene-name-modal .qc-scene-name-input { background: #111 !important; border-color: #444 !important; color: #eef4ff !important; }
html.dark-mode #qc-tour-scene-name-modal .qc-popup-cancel { background: #333 !important; color: #eef4ff !important; }
html.dark-mode #qc-pub-title, html.dark-mode #qc-pub-width, html.dark-mode #qc-pub-height { border-color: #444 !important; }
html.dark-mode #qc-tour-embed-divider { border-top-color: #334155 !important; }
html.dark-mode #qc-pub-warning { color: #f59e0b !important; }
html.dark-mode #qc-pub-autosave-note { background: #0f2540 !important; border-color: #1d3a5f !important; color: #8ec1ff !important; }

/* ═══════════════════════════════════════════════════════════════════════════
   Campana de notificaciones / "Centro de Alertas" (arquitecto.js:
   abrirNotificaciones) -- estructura del mockup references/Bell ChatGPT
   Image Sep 1, 2026 at 12_10_29 PM.png (tabs, secciones Nuevas/Anteriores,
   "Marcar todas como leídas", ícono en círculo de color), pero con la
   paleta YA establecida de la app, no los colores del mockup (pedido
   explícito de Victor). Los tres colores de los círculos de ícono son los
   mismos, exactos (getComputedStyle en vivo, no a ojo), que ya usan las
   tarjetas KPI del Dashboard: .kpi.green (Tickets), .kpi.blue (Emails),
   .kpi.purple (ya en el bundle, sin uso semántico fijo -- se reusa acá
   para Documentos, que no comparte color con Tickets ni Emails).
   El wrapper del popover reusa las mismas clases Tailwind que menuUsuario
   (bg-white rounded-xl border border-gray-200 ...), ya themadas en los dos
   modos vía quantum-theme.css -- acá solo el contenido interno, con clases
   propias porque no vienen del bundle compilado.
   ═══════════════════════════════════════════════════════════════════════════ */
.qc-notif-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 14px 16px; font-size: 14px; font-weight: 600; color: #111827; border-bottom: 1px solid #e5e7eb; flex-shrink: 0; }
.qc-notif-marcar { font-size: 11.5px; font-weight: 500; color: #2563eb; background: none; border: none; cursor: pointer; padding: 0; }
.qc-notif-marcar:hover { text-decoration: underline; }
/* Tabs -- píldora sólida para el activo + badge circular de conteo, mismo
   lenguaje visual que el badge de la propia campana (círculo de acento con
   número blanco), no un número en negrita inline. */
.qc-notif-tabs { display: flex; gap: 6px; padding: 10px 12px; border-bottom: 1px solid #e5e7eb; flex-shrink: 0; }
.qc-notif-tab { display: flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; color: #6b7280; background: none; border: 1px solid transparent; border-radius: 999px; padding: 6px 12px; cursor: pointer; }
.qc-notif-tab:hover { background: #f3f4f6; }
.qc-notif-tab.activo { background: #fff; border-color: #e5e7eb; color: #111827; font-weight: 600; box-shadow: 0 1px 2px rgba(0, 0, 0, .05); }
.qc-notif-tab-badge { font-style: normal; display: inline-flex; align-items: center; justify-content: center; min-width: 17px; height: 17px; padding: 0 4px; border-radius: 999px; background: var(--q-accent, #2563eb); color: #fff; font-size: 10px; font-weight: 600; }
.qc-notif-error { padding: 8px 16px; font-size: 11px; color: #b91c1c; background: #fee2e2; flex-shrink: 0; }
.qc-notif-lista { overflow-y: auto; overscroll-behavior: contain; flex: 1 1 auto; min-height: 0; padding: 4px 10px 10px; }
.qc-notif-seccion { padding: 10px 6px 6px; font-size: 10px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: #9ca3af; }
/* Cada notificación es su propia tarjeta (borde + radio), separada por
   margen -- no una fila plana con línea divisoria. Confirmado contra el
   mockup: mismo fondo que el panel, el "card" lo da solo el borde. */
.qc-notif-item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; margin-bottom: 6px; text-decoration: none; position: relative; border: 1px solid #e5e7eb; border-radius: 12px; }
.qc-notif-item:last-child { margin-bottom: 0; }
.qc-notif-item:hover { background: #f9fafb; }
.qc-notif-icon { display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 999px; flex-shrink: 0; }
.qc-notif-icon svg { width: 16px; height: 16px; }
.qc-notif-ico-ticket { background: #ecfdf5; color: #059669; }
.qc-notif-ico-correo { background: #eff6ff; color: #2563eb; }
.qc-notif-ico-doc { background: #f5f3ff; color: #7c3aed; }
.qc-notif-txt { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; padding-right: 12px; }
.qc-notif-fila1 { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.qc-notif-fila1 b { font-size: 12.5px; font-weight: 500; color: #374151; line-height: 1.35; }
.qc-notif-fila1 em { font-style: normal; font-size: 10.5px; color: #9ca3af; white-space: nowrap; flex-shrink: 0; }
.qc-notif-txt > small { font-size: 11px; color: #6b7280; line-height: 1.35; }
.qc-notif-sub2 { color: #9ca3af !important; }
.qc-notif-item.nuevo { border-color: #dbeafe; }
.qc-notif-item.nuevo .qc-notif-fila1 b { color: #111827; font-weight: 600; }
.qc-notif-dot { position: absolute; top: 14px; right: 12px; width: 7px; height: 7px; border-radius: 999px; background: var(--q-accent, #2563eb); }
.qc-notif-vacio { padding: 28px 16px; text-align: center; color: #9ca3af; font-size: 12px; }

html.dark-mode .qc-notif-head { color: #eef4ff; border-bottom-color: #1b2b42; }
html.dark-mode .qc-notif-marcar { color: #5aa0ff; }
html.dark-mode .qc-notif-tabs { border-bottom-color: #1b2b42; }
html.dark-mode .qc-notif-tab { color: #7086a3; }
html.dark-mode .qc-notif-tab:hover { background: rgba(255, 255, 255, .04); }
html.dark-mode .qc-notif-tab.activo { background: rgba(255, 255, 255, .07); border-color: #2a3c56; color: #eef4ff; box-shadow: none; }
html.dark-mode .qc-notif-error { color: #ff8f89; background: #351b24; }
html.dark-mode .qc-notif-seccion { color: #667a94; }
html.dark-mode .qc-notif-item { border-color: #1b2b42; }
html.dark-mode .qc-notif-item:hover { background: rgba(255, 255, 255, .03); }
html.dark-mode .qc-notif-item.nuevo { border-color: #24405f; }
html.dark-mode .qc-notif-ico-ticket { background: #103c34; color: #19d48c; }
html.dark-mode .qc-notif-ico-correo { background: #17365d; color: #3e8cff; }
html.dark-mode .qc-notif-ico-doc { background: #2a1d4d; color: #9b6cff; }
html.dark-mode .qc-notif-fila1 b { color: #c3cee0; }
html.dark-mode .qc-notif-fila1 em { color: #7086a3; }
html.dark-mode .qc-notif-txt > small { color: #8fa0b8; }
html.dark-mode .qc-notif-sub2 { color: #667a94 !important; }
html.dark-mode .qc-notif-item.nuevo .qc-notif-fila1 b { color: #fff; }
html.dark-mode .qc-notif-vacio { color: #667a94; }

/* ═══════════════════════════════════════════════════════════════════════════
   Badges del menú lateral (Emails/Tickets) -- pedido de Victor sobre
   references/Inbox number ChatGPT Image Sep 1, 2026 at 12_29_53 PM.png.
   Mismos colores que .qc-notif-ico-correo/.qc-notif-ico-ticket (y las
   tarjetas KPI del Dashboard, .kpi.blue/.green) -- no se inventa una
   paleta nueva. Cuando el item está activo (bg-indigo-600, ver ITEM_ACTIVO
   en arquitecto.js) el badge de color chocaría con el sólido de acento, así
   que se vuelve un chip translúcido blanco -- selector sobre la clase
   Tailwind del propio item, mismo patrón que quantum-theme.css usa en otros
   lados de este proyecto para engancharse a clases del bundle.
   ═══════════════════════════════════════════════════════════════════════════ */
.qc-nav-badge { margin-left: auto; display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; font-size: 11px; font-weight: 600; }
.qc-nav-badge-emails { background: #eff6ff; color: #2563eb; }
.qc-nav-badge-tickets { background: #ecfdf5; color: #059669; }
a.bg-indigo-600 .qc-nav-badge { background: rgba(255, 255, 255, .25); color: #fff; }

html.dark-mode .qc-nav-badge-emails { background: #17365d; color: #3e8cff; }
html.dark-mode .qc-nav-badge-tickets { background: #103c34; color: #19d48c; }
