:root {
  --bg: #f7f8fa;
  --surface: #ffffff;
  --surface-muted: #eef1f3;
  --ink: #14181d;
  --muted: #626c78;
  --line: #e2e6ea;
  --accent: #087f8c;
  --accent-strong: #05616b;
  --green: #2f9e44;
  --blue: #277da1;
  --yellow: #f9c74f;
  --orange: #f9844a;
  --red: #d9480f;
  --gray: #adb5bd;
  --shadow: 0 1px 2px rgba(20, 30, 38, 0.05), 0 1px 1px rgba(20, 30, 38, 0.04);
  --shadow-float: 0 16px 40px rgba(20, 30, 38, 0.16);
}

/* Modo oscuro: preferencia PERSONAL de cada usuario (guardada en su perfil,
   ver users.theme_preference), no del hotel -- por eso se activa con un
   atributo en <html> puesto por JS al cargar sesion, no por
   prefers-color-scheme. Mismos nombres de variable que :root a proposito:
   todo lo que ya usa var(--x) se adapta solo, sin tocar cada regla. */
html[data-theme="dark"] {
  --bg: #10161a;
  --surface: #1a2126;
  --surface-muted: #212a30;
  --ink: #e9eef1;
  --muted: #93a1ab;
  --line: #2c363d;
  --gray: #5c6a73;
  /* --accent-strong se usa como COLOR DE TEXTO directo sobre --surface (ej.
     .ghost-button) -- el valor de modo claro (#05616b) es un teal oscuro
     pensado para leerse sobre blanco, casi invisible sobre superficie
     oscura (contraste real medido: 2.27, deberia ser 4.5+). --accent en
     cambio se usa sobre todo como FONDO de boton con texto blanco encima,
     eso ya funciona igual en los dos temas y no necesita cambiar. */
  --accent-strong: #5eead4;
  --shadow: 0 1px 2px rgba(0, 0, 0, 0.35), 0 1px 1px rgba(0, 0, 0, 0.25);
  --shadow-float: 0 16px 40px rgba(0, 0, 0, 0.55);
}

* {
  box-sizing: border-box;
}

html,
body {
  min-height: 100%;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

button,
input,
select {
  font: inherit;
}

/* Los <button> NO heredan color por defecto en ningun navegador (a
   diferencia del resto de los elementos, que si heredan de body) -- sin esto
   cualquier boton sin un color explicito propio (ej. .reservation-row, que es
   un <button> entero) cae al color de texto nativo del boton del sistema,
   que en la mayoria de los navegadores es negro fijo sin importar el fondo.
   En modo claro pasaba desapercibido (negro sobre blanco es casi el mismo
   --ink); en modo oscuro se volvia texto negro sobre fondo oscuro,
   ilegible. Una clase mas especifica (.primary-button, etc.) sigue pudiendo
   pisar esto sin problema. */
button {
  cursor: pointer;
  color: inherit;
}

/* Base para CUALQUIER input/select/textarea que no tenga una regla mas
   especifica (varios quedaban con el fondo blanco nativo del navegador en
   modo oscuro porque nunca tuvieron una regla de color propia -- en claro
   pasaba desapercibido porque el blanco nativo coincidia con el tema). Una
   clase mas especifica sigue pudiendo pisar esto sin problema. */
input,
select,
textarea {
  background: var(--surface);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 8px;
}

/* Campo bloqueado (ej. la entrada del mostrador, siempre hoy) -- distinto de
   var(--surface) para que se note de un vistazo que no se puede tocar, sin
   llegar al tratamiento mas apagado de un :disabled real. */
input:read-only {
  background: var(--surface-muted);
  cursor: not-allowed;
}

.app-shell {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

/* Navbar superior (reemplaza a la vieja barra lateral) — compacto a
   proposito para no restarle alto util a las vistas debajo. */
.topnav {
  display: flex;
  align-items: center;
  gap: 18px;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
  padding: 6px 16px;
  min-height: 50px;
  position: sticky;
  top: 0;
  z-index: 40;
}

.brand {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  flex: 0 0 auto;
}

.brand-logo-wrap {
  position: relative;
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 30px;
  height: 30px;
}

.brand-logo-fallback {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

.brand-logo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}

.brand strong {
  display: block;
  font-size: 13px;
  letter-spacing: 0.03em;
  color: var(--ink);
}

.brand span {
  display: block;
  color: var(--muted);
  font-size: 10px;
  max-width: 150px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.topnav-list {
  display: flex;
  align-items: center;
  gap: 2px;
  flex: 1 1 auto;
  min-width: 0;
}

.topnav-group {
  position: relative;
}

.topnav-item {
  display: flex;
  align-items: center;
  gap: 7px;
  min-height: 36px;
  padding: 0 12px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--muted);
  font-weight: 700;
  font-size: 13px;
  text-align: left;
  white-space: nowrap;
}

.topnav-item:hover,
.topnav-item.active {
  background: var(--surface-muted);
  color: var(--accent-strong);
}

/* Circulo de notificacion con la cantidad de chats de WhatsApp sin
   responder (ver updateChatUnreadBadge en app.js) — mismo criterio de
   "sin responder" que whatsappLeadStatusInfo: ultimo mensaje entrante sin
   ninguna respuesta (bot o humana) despues. */
.nav-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 99px;
  background: var(--red);
  color: white;
  font-size: 11px;
  font-weight: 800;
  line-height: 1;
}

.nav-icon {
  width: 17px;
  height: 17px;
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: inherit;
}

.nav-icon svg {
  width: 100%;
  height: 100%;
}

.main {
  min-width: 0;
  padding: 16px;
}

.topbar {
  display: flex;
  justify-content: space-between;
  gap: 18px;
  align-items: center;
  margin-bottom: 24px;
}

.topbar h1,
.panel h2 {
  margin: 0;
  line-height: 1.15;
  font-weight: 800;
}

.panel h2 {
  font-size: 19px;
}

.topbar h1 {
  font-size: 30px;
  letter-spacing: -0.01em;
}

.eyebrow {
  margin: 0 0 6px;
  color: var(--muted);
  font-size: 12px;
  font-weight: 800;
  letter-spacing: 0;
  text-transform: uppercase;
}

.topbar-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.primary-button,
.ghost-button,
.icon-button,
.segment {
  min-height: 38px;
  border-radius: 10px;
  border: 1px solid transparent;
  transition: 150ms ease;
}

.primary-button {
  background: var(--accent);
  color: white;
  border-color: var(--accent);
  padding: 0 14px;
  font-weight: 700;
}

.primary-button:hover {
  background: var(--accent-strong);
}

.ghost-button {
  background: var(--surface);
  color: var(--accent-strong);
  border-color: var(--line);
  padding: 0 12px;
  font-weight: 700;
}

.ghost-button:hover {
  border-color: var(--accent);
}

.ghost-button.danger-text {
  color: var(--red);
}

.ghost-button.danger-text:hover {
  border-color: var(--red);
}

.icon-button {
  width: 38px;
  background: var(--surface);
  border-color: var(--line);
  color: var(--ink);
  font-weight: 900;
}

.view {
  display: none;
}

.view.active {
  display: block;
}

#planning,
#listados {
  position: relative;
}

.metric-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(160px, 1fr));
  gap: 14px;
  margin-bottom: 18px;
}

.metric {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 16px;
  box-shadow: var(--shadow);
}

.metric span {
  color: var(--muted);
  font-size: 13px;
}

.metric strong {
  display: block;
  margin-top: 8px;
  font-size: 28px;
  font-weight: 800;
  letter-spacing: -0.01em;
}

.metric small {
  color: var(--muted);
}

.two-column,
.stats-layout,
.settings-grid,
.reservations-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px;
}

#inicio .panel + .panel {
  margin-top: 18px;
}

.inhouse-summary {
  color: var(--muted);
  font-size: 13px;
}

.inhouse-list {
  display: grid;
  gap: 8px;
  margin-top: 4px;
}

.inhouse-row {
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--surface);
  overflow: hidden;
}

/* Header SIEMPRE visible, compacto -- lo unico que hace falta para priorizar
   de un vistazo con muchas habitaciones en estadia a la vez: donde, quien, y
   los 3 estados que importan (combinada/sale hoy/saldo). Es un <button>
   entero (no un div con onclick) para que expandir/colapsar sea accesible
   por teclado gratis. El resto de la info (contacto, extras, notas,
   acciones) vive en .inhouse-card-body, un hermano NO un hijo -- adentro hay
   inputs/botones propios, y un <button> no puede anidar otro botón valido. */
.inhouse-row-summary {
  display: grid;
  grid-template-columns: minmax(90px, 160px) minmax(180px, 1fr) auto auto;
  align-items: center;
  gap: 12px;
  width: 100%;
  padding: 12px 14px;
  border: none;
  background: transparent;
  text-align: left;
  cursor: pointer;
  font: inherit;
  color: inherit;
}

.inhouse-row-summary:hover {
  background: color-mix(in srgb, var(--accent) 6%, var(--surface));
}

.inhouse-row-room {
  font-weight: 800;
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.inhouse-row-guest {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.inhouse-row-guest strong {
  font-size: 14px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.inhouse-row-guest span {
  color: var(--muted);
  font-size: 12px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.inhouse-row-tags {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 4px;
}

.inhouse-row-chevron {
  width: 18px;
  height: 18px;
  color: var(--muted);
  flex-shrink: 0;
  transition: transform 150ms ease;
}

.inhouse-row.expanded .inhouse-row-chevron {
  transform: rotate(180deg);
}

.inhouse-card-body {
  display: none;
  gap: 10px;
  padding: 12px 14px 14px;
  border-top: 1px solid var(--line);
}

.inhouse-row.expanded .inhouse-card-body {
  display: grid;
}

@media (max-width: 640px) {
  .inhouse-row-summary {
    grid-template-columns: 1fr auto;
    grid-template-areas:
      "room chevron"
      "guest guest"
      "tags tags";
    row-gap: 6px;
  }

  /* grid-area solo ACA adentro, nunca en la regla de escritorio de arriba --
     un grid-area con un nombre que no matchea ningun grid-template-areas del
     contenedor (el layout de escritorio no tiene, usa las 4 columnas
     explicitas en orden de DOM) igual le genera pistas implicitas fantasma
     al grid, rompiendo el ancho de las columnas reales (bug real
     encontrado: las 3 primeras columnas del header quedaban todas con el
     mismo ancho, con 3 pistas de mas en 0px). */
  .inhouse-row-room {
    grid-area: room;
  }

  .inhouse-row-guest {
    grid-area: guest;
  }

  .inhouse-row-tags {
    grid-area: tags;
    justify-content: flex-start;
  }

  .inhouse-row-chevron {
    grid-area: chevron;
  }
}

.inhouse-extras {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.inhouse-notes-label {
  display: block;
  font-size: 12px;
  color: var(--muted);
  font-weight: 700;
}

.inhouse-notes {
  display: block;
  width: 100%;
  margin-top: 4px;
  min-height: 52px;
  resize: vertical;
  font-family: inherit;
  font-size: 13px;
  font-weight: 400;
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 8px;
}

.inhouse-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.inhouse-actions .inhouse-checkout {
  margin-left: auto;
}

.inhouse-actions .inhouse-checkout:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.reservations-layout.detail-open {
  grid-template-columns: minmax(360px, 0.95fr) minmax(420px, 1.05fr);
}

.reservations-layout > .panel {
  min-width: 0;
}

.panel {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 18px;
  box-shadow: var(--shadow);
}

.panel-header,
.conversation-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 14px;
  margin-bottom: 16px;
}

.panel-header > div,
.conversation-header > div {
  min-width: 0;
}

.panel-header h2 {
  overflow-wrap: anywhere;
}

.task-list,
.alert-list,
.cleaning-board,
.knowledge-list {
  display: grid;
  gap: 10px;
}

.task,
.alert-item,
.cleaning-card,
.conversation-item,
.knowledge-list div {
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: 10px;
}

.task {
  display: grid;
  grid-template-columns: 26px 1fr auto;
  align-items: center;
  gap: 10px;
  padding: 12px;
}

.check {
  display: grid;
  place-items: center;
  width: 22px;
  height: 22px;
  border: 1px solid var(--line);
  border-radius: 8px;
  color: white;
}

.task.done {
  opacity: 0.58;
}

.task.done .check {
  background: var(--green);
  border-color: var(--green);
}

.task strong,
.alert-item strong,
.conversation-item strong,
.cleaning-card strong {
  display: block;
}

.task span,
.alert-item span,
.conversation-item span,
.cleaning-card span {
  color: var(--muted);
  font-size: 13px;
}

.pill {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  padding: 0 8px;
  border-radius: 99px;
  color: white;
  font-size: 12px;
  font-weight: 800;
}

.task .pill {
  color: white;
  font-size: 11px;
}

.pill.red {
  background: var(--red);
}

.pill.orange {
  background: var(--orange);
}

.pill.blue {
  background: var(--blue);
}

.pill.green {
  background: var(--green);
}

/* Un color por cada estado real de reserva (statusClass), no solo 4 colores
   genericos compartidos entre varios estados distintos — asi "Confirmada",
   "Check-in realizado", "En estadia" y "Check-out realizado" (antes todos
   verdes) se distinguen de un vistazo. */
.pill.pre-reserva {
  background: #f9c74f;
  color: #402d00;
}

.pill.pendiente {
  background: #c1440e;
}

.pill.confirmada {
  background: var(--green);
}

.pill.en-curso {
  background: var(--blue);
}

.pill.finalizada {
  background: #5c6670;
}

.pill.vencida {
  background: var(--red);
}

.pill.cancelada {
  background: #495057;
}

/* Chat: lead sin reserva vinculada todavia (ver whatsappLeadStatusInfo). */
.pill.lead-new {
  background: var(--muted);
}

.alert-item {
  padding: 13px;
  border-left: 4px solid var(--orange);
}

.alert-item.alert-orange {
  border-left-color: var(--orange);
}

.alert-item.alert-red {
  border-left-color: var(--red);
}

.alert-item.alert-blue {
  border-left-color: var(--blue);
}

.alert-item.good {
  border-left-color: var(--green);
}

.toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 14px;
}

.toolbar-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.search-field {
  min-width: 280px;
}

.hidden {
  display: none !important;
}

.compact-panel {
  margin-bottom: 14px;
}

.reservation-form {
  display: grid;
  grid-template-columns: repeat(4, minmax(140px, 1fr));
  gap: 12px;
}

.reservation-form label,
.detail-form label {
  color: var(--muted);
  font-size: 13px;
  font-weight: 700;
}

.reservation-form input,
.reservation-form select,
.detail-form input,
.detail-form select,
.detail-form textarea {
  min-height: 40px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
  margin-top: 6px;
}

.detail-form textarea {
  min-height: 74px;
  padding: 10px;
  resize: vertical;
}

.wide {
  grid-column: span 2;
}

.segmented {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.segment {
  background: var(--surface);
  border-color: var(--line);
  padding: 0 12px;
  color: var(--muted);
  font-weight: 700;
}

.segment.active {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
  color: var(--accent-strong);
}

.planning-wrap {
  overflow-x: scroll;
  overflow-y: auto;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: var(--shadow);
  position: relative;
  max-height: calc(100vh - 240px);
  scrollbar-gutter: stable;
}

.planning-wrap::-webkit-scrollbar {
  width: 14px;
  height: 14px;
}

.planning-wrap::-webkit-scrollbar-track {
  background: var(--surface-muted);
}

.planning-wrap::-webkit-scrollbar-thumb {
  background: var(--gray);
  border: 3px solid var(--surface-muted);
  border-radius: 999px;
}

.planning-wrap::-webkit-scrollbar-thumb:hover {
  background: var(--muted);
}

.planning-scrollbar {
  height: 22px;
  margin-bottom: 8px;
  overflow-x: scroll;
  overflow-y: hidden;
  background: var(--surface-muted);
  border: 1px solid var(--line);
  border-radius: 10px;
  scrollbar-gutter: stable;
}

#planning-scrollbar-spacer {
  height: 1px;
}

.planning-scrollbar::-webkit-scrollbar {
  height: 14px;
}

.planning-scrollbar::-webkit-scrollbar-track {
  background: var(--surface-muted);
}

.planning-scrollbar::-webkit-scrollbar-thumb {
  background: var(--gray);
  border: 3px solid var(--surface-muted);
  border-radius: 999px;
}

.planning-scrollbar::-webkit-scrollbar-thumb:hover {
  background: var(--muted);
}

.planning-grid {
  min-width: 1234px;
}

.mini-calendar {
  position: absolute;
  right: 16px;
  top: 74px;
  z-index: 8;
  width: min(340px, calc(100vw - 48px));
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  box-shadow: var(--shadow-float);
  padding: 12px;
}

.mini-calendar-header {
  display: grid;
  grid-template-columns: 92px 1fr 92px;
  align-items: center;
  gap: 8px;
  margin-bottom: 10px;
}

.mini-calendar-header strong {
  text-align: center;
  color: var(--ink);
  font-size: 14px;
  font-weight: 900;
  letter-spacing: 0;
  text-transform: uppercase;
}

.mini-calendar-header .ghost-button {
  min-height: 34px;
  padding: 0 9px;
  font-size: 12px;
}

.mini-calendar-weekdays,
.mini-calendar-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 5px;
}

.mini-calendar-weekdays span {
  color: var(--muted);
  font-size: 11px;
  font-weight: 800;
  text-align: center;
}

.calendar-day {
  min-height: 34px;
  border: 1px solid transparent;
  border-radius: 10px;
  background: var(--surface-muted);
  color: var(--ink);
  font-weight: 700;
}

.calendar-day:hover {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.calendar-day.muted {
  color: var(--gray);
  background: var(--surface-muted);
}

.calendar-day.today {
  background: var(--accent);
  color: white;
}

.planning-header,
.planning-row {
  display: grid;
  grid-template-columns: 142px repeat(14, 78px);
}

.planning-header {
  position: sticky;
  top: 0;
  z-index: 5;
}

.planning-row {
  position: relative;
  min-height: 34px;
}

.cell {
  min-height: 34px;
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  padding: 4px;
  background: var(--surface);
  font-size: 11px;
}

.cell.header {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--surface-muted);
  color: var(--muted);
  font-weight: 800;
}

.cell.header.date-header {
  display: grid;
  place-items: center;
  align-content: center;
  gap: 1px;
  padding: 3px 2px;
  text-align: center;
}

.rack-month {
  display: block;
  color: var(--muted);
  font-size: 8px;
  font-weight: 900;
  line-height: 1;
}

.rack-day {
  display: block;
  color: var(--ink);
  font-size: 13px;
  line-height: 1;
}

.cell.room {
  position: sticky;
  left: 0;
  z-index: 3;
  background: var(--surface-muted);
  font-weight: 800;
  text-align: center;
}

.reservation-block {
  position: absolute;
  top: 4px;
  z-index: 2;
  display: block;
  min-height: 26px;
  border: 0;
  border-radius: 8px;
  color: #102027;
  text-align: left;
  padding: 3px 5px;
  font-size: 10px;
  font-weight: 800;
  overflow: hidden;
}

.reservation-block small {
  display: block;
  margin-top: 1px;
  font-size: 9px;
  color: rgba(16, 32, 39, 0.7);
  white-space: nowrap;
}

.reservation-block.pre-reserva {
  background: var(--yellow);
}

.reservation-block.pendiente {
  background: var(--orange);
  color: white;
}

.reservation-block.confirmada {
  background: #8ce99a;
}

.reservation-block.en-curso {
  background: #90e0ef;
}

.reservation-block.vencida {
  background: #ff8787;
}

.reservation-block.cancelada {
  /* --gray es la unica variable de este set de estados que cambia bastante
     entre temas (gris medio-claro en claro, medio-oscuro en oscuro) -- el
     resto de los estados usa colores pasteles fijos (no ligados al tema) por
     lo que el texto oscuro heredado de .reservation-block les queda bien
     siempre. Este es el unico que necesita un color de texto que se adapte
     al tema, igual que finalizada de abajo. */
  background: var(--gray);
  color: var(--ink);
}

.reservation-block.finalizada {
  background: var(--surface-muted);
  color: var(--muted);
}

/* El <small> de "Check out · N noches" tiene su propio color hardcodeado
   (ver regla .reservation-block small mas abajo, pensada para los estados de
   fondo pastel fijo) que en estos dos estados pisaba el color ya correcto
   del bloque padre -- se veia como texto casi negro sobre un fondo que en
   modo oscuro tambien es oscuro. */
.reservation-block.cancelada small,
.reservation-block.finalizada small {
  color: inherit;
}

/* Nombre truncado a una linea — si se deja envolver a 2 lineas, el bloque
   crece mas alto que su fila y se pisa visualmente con la habitacion de abajo. */
.reservation-block-name {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* "!" rojo: reserva confirmada sin ningun pago de seña registrado todavia. */
.deposit-warning {
  display: inline-block;
  color: var(--red);
  font-weight: 900;
  margin-right: 3px;
}

.reservation-row-status {
  display: flex;
  align-items: center;
  gap: 4px;
}

.reservation-list {
  display: grid;
  gap: 10px;
}

.reservation-row {
  display: grid;
  grid-template-columns: minmax(160px, 1.2fr) minmax(140px, 0.8fr) minmax(120px, 0.8fr) auto;
  align-items: center;
  gap: 12px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  padding: 12px;
  text-align: left;
  min-height: 72px;
}

.reservation-row.active {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.reservation-row strong,
.detail-summary strong {
  display: block;
}

.reservation-row span:not(.pill),
.detail-summary span:not(.pill),
.listing-table span:not(.pill) {
  color: var(--muted);
  font-size: 13px;
}

.reservation-detail {
  align-self: start;
  position: sticky;
  top: 18px;
  min-width: 0;
  max-height: calc(100vh - 110px);
  overflow: auto;
}

/* El padding superior lo pone el propio header (ver .panel-header mas abajo)
   para que su fondo blanco lo cubra al quedar pegado arriba — position:sticky
   ignora el margen negativo de un hijo al calcular donde "pegarlo", asi que
   compensar el padding del contenedor con margen negativo no funciona.
   Selector con dos clases a proposito: hay una regla ".panel { padding:14px }"
   mas abajo en el archivo (seccion "UI polish pass") que gana por orden de
   cascada a cualquier ".reservation-detail" suelto sin importar donde se
   ubique — subir la especificidad evita depender de la posicion. */
.panel.reservation-detail {
  padding-top: 0;
}

.detail-summary {
  display: grid;
  gap: 8px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface-muted);
  margin-bottom: 14px;
}

.detail-form {
  display: grid;
  gap: 12px;
}

.detail-actions {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}

/* Ritmo vertical unico entre form/extras/pagos/actividad/zona de peligro --
   antes cada bloque tenia su propio margin-top suelto (4px, 12px, ninguno)
   sin relacion entre si, lo que se sentia desprolijo. Un solo gap ademas
   hace que reordenar secciones (ver renderReservationDetail) no dependa de
   arrastrar el margen correcto con cada bloque. */
.detail-sections {
  display: grid;
  gap: 14px;
}

/* Chat/CRM de WhatsApp: layout de altura FIJA (no min-height) a proposito —
   solo con una altura definida los hijos flex (.conversation-list y
   .messages) pueden tener scroll propio via flex:1+overflow:auto; con
   min-height el panel crecia con el contenido y terminaba scrolleando la
   pagina entera en vez de cada columna por separado. */
.chat-layout {
  display: grid;
  grid-template-columns: 300px 1fr;
  gap: 14px;
  height: calc(100vh - 88px);
  min-height: 460px;
}

.conversation-list-col,
.conversation-panel {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: hidden;
}

.conversation-search-bar {
  flex: 0 0 auto;
  padding: 8px;
  border-bottom: 1px solid var(--line);
}

.conversation-search-bar input {
  width: 100%;
  min-height: 32px;
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 0 10px;
  font-size: 12px;
  color: var(--ink);
  background: var(--surface-muted);
}

.conversation-list {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: 6px;
  display: grid;
  /* minmax(0, 1fr), no solo 1fr: sin el 0 explicito, la columna implicita de
     grid crece para acomodar el contenido mas ancho de sus items (un pill de
     estado largo, un telefono) en vez de quedarse en el ancho del
     contenedor — eso es lo que generaba scroll horizontal feo en la lista. */
  grid-template-columns: minmax(0, 1fr);
  align-content: start;
  gap: 4px;
}

.conversation-item {
  width: 100%;
  text-align: left;
  padding: 8px 9px;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 2px;
}

.conversation-item.active {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

/* Chat sin responder (ultimo mensaje del huesped, ver whatsappLeadStatusInfo
   y updateChatUnreadBadge): mismo criterio que el circulo del boton "Chat"
   del navbar, pero visible directamente en la lista para no tener que abrir
   cada chat para saber cuales necesitan respuesta. */
.conversation-item.unread {
  border-left: 3px solid var(--red);
  background: color-mix(in srgb, var(--red) 8%, var(--surface));
}

.conversation-item.unread.active {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.conversation-item.unread .conversation-preview {
  color: var(--ink);
  font-weight: 700;
}

.conversation-unread-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--red);
}

.conversation-item-top {
  display: flex;
  align-items: center;
  gap: 6px;
}

.conversation-item-top strong {
  min-width: 0;
  flex: 1 1 auto;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 12.5px;
}

.conversation-preview {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.conversation-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}

.conversation-panel {
  min-width: 0;
}

/* Header compacto: nombre + estado + accion de "tomar control" entran todos
   en la misma fila (pedido explicito), y al quedar fuera de .messages (el
   unico hijo con overflow:auto) se mantiene fijo arriba sin necesitar
   position:sticky. */
.conversation-header {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  row-gap: 6px;
  gap: 10px;
  padding: 10px 14px;
  margin-bottom: 0;
  border-bottom: 1px solid var(--line);
}

.conversation-identity {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
  flex: 1 1 auto;
}

.conversation-name {
  font-size: 15px;
  font-weight: 800;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 260px;
}

.conversation-name-input {
  min-height: 30px;
  max-width: 220px;
  border: 1px solid var(--accent);
  border-radius: 8px;
  padding: 0 8px;
  font-size: 13px;
  font-weight: 700;
  color: var(--ink);
}

.conversation-name-edit {
  min-height: 26px;
  width: 26px;
  flex: 0 0 auto;
  padding: 0;
}

.conversation-name-edit svg {
  width: 14px;
  height: 14px;
}

.conversation-lead-status {
  flex: 0 0 auto;
  white-space: nowrap;
}

.conversation-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
}

.conversation-actions .ghost-button {
  min-height: 30px;
  padding: 0 10px;
  font-size: 12px;
}

.bot-badge {
  min-height: 26px;
  display: inline-flex;
  align-items: center;
  padding: 0 9px;
  border-radius: 99px;
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  color: var(--accent-strong);
  font-size: 11px;
  font-weight: 800;
  white-space: nowrap;
}

.bot-badge.off {
  background: color-mix(in srgb, var(--orange) 12%, var(--surface));
  color: var(--orange);
}

.conversation-subheader {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 6px 14px;
  border-bottom: 1px solid var(--line);
}

/* Selector de "vincular a reserva": vive en la misma linea que el nombre y
   "Tomar control" (pedido explicito, para no sumar una fila mas al header) —
   angosto y sin label visible a proposito; el resumen de la reserva
   vinculada (codigo/estado/fechas/saldo, ver renderConversationLinkSummary)
   ahora es el "title" del propio select en vez de una linea aparte, para no
   volver a sumarle alto al header. */
.conversation-link-select {
  flex: 0 0 auto;
  min-height: 30px;
  max-width: 138px;
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 0 6px;
  font-size: 11.5px;
  color: var(--ink);
  background: var(--surface);
}

.conversation-item .pill.conversation-tag,
.conversation-item .pill.conversation-lead-status {
  margin-top: 0;
  color: white;
  font-size: 10px;
  min-height: 18px;
  padding: 0 6px;
  flex: 0 1 auto;
  min-width: 0;
  max-width: 100px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.detected-data {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.data-chip {
  border: 1px solid var(--line);
  border-radius: 99px;
  padding: 4px 9px;
  font-size: 11px;
  color: var(--muted);
}

.messages {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: 12px 14px;
  background: var(--surface-muted);
  display: flex;
  flex-direction: column;
  gap: 7px;
}

.message {
  max-width: 72%;
  border-radius: 10px;
  padding: 7px 10px;
  font-size: 13px;
  line-height: 1.35;
  white-space: pre-wrap;
}

.message.user {
  align-self: flex-start;
  background: var(--surface);
  border: 1px solid var(--line);
}

.message.bot {
  align-self: flex-end;
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--accent) 40%, var(--line));
}

.message.human {
  align-self: flex-end;
  background: color-mix(in srgb, var(--blue) 12%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--blue) 40%, var(--line));
}

.reply-box {
  flex: 0 0 auto;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 8px;
  padding: 10px 14px;
  border-top: 1px solid var(--line);
}

.reply-box input,
.form-grid input {
  min-height: 40px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
}

.cleaning-board {
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  align-items: start;
}

.cleaning-column {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 12px;
  box-shadow: var(--shadow);
  display: grid;
  gap: 8px;
  align-content: start;
}

.cleaning-column h2 {
  margin: 0 0 4px;
  font-size: 17px;
}

.cleaning-empty {
  margin: 0;
  color: var(--muted);
  font-size: 13px;
  font-style: italic;
}

.cleaning-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 8px;
}

.cleaning-actions .ghost-button {
  min-height: 30px;
  padding: 0 9px;
  font-size: 12px;
}

.cleaning-card {
  padding: 12px;
  margin-bottom: 10px;
}

.cleaning-actions {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  margin-top: 10px;
}

.cleaning-actions button {
  width: 100%;
}

.tariff-hint {
  margin: -6px 0 16px;
  color: var(--muted);
  font-size: 13px;
  max-width: 760px;
}

/* Tarifas: una tarjeta por temporada en vez de una tabla de 9 columnas con
   scroll horizontal — pedido explicito del usuario ("poco intuitivo y poco
   practico"). Cada tarjeta agrupa fechas + precio normal/promo por tipo de
   habitacion, en vez de obligar a leer una fila entera de izquierda a
   derecha para entender una sola temporada. */
.season-cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
  gap: 16px;
  margin-bottom: 24px;
  align-items: start;
}

.season-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: var(--shadow);
  padding: 16px;
  display: grid;
  gap: 14px;
}

.season-card-header {
  display: flex;
  align-items: center;
  gap: 8px;
}

.season-name {
  flex: 1 1 auto;
  min-height: 38px;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  font-weight: 800;
  font-size: 15px;
  color: var(--ink);
  background: var(--surface);
}

.season-card-dates {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.season-card-dates label {
  display: grid;
  gap: 5px;
  flex: 1 1 120px;
  color: var(--muted);
  font-size: 12px;
  font-weight: 800;
}

.season-card-dates input {
  min-height: 38px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
  font-weight: 400;
}

.season-price-table {
  width: 100%;
  border-collapse: collapse;
}

.season-price-table th {
  text-align: left;
  color: var(--muted);
  font-size: 11px;
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  padding: 0 0 6px;
  border-bottom: 1px solid var(--line);
}

.season-price-table td {
  padding: 7px 0;
  border-bottom: 1px solid var(--line);
  vertical-align: middle;
}

.season-price-table tr:last-child td {
  border-bottom: none;
}

.season-room-type {
  font-size: 13px;
  font-weight: 700;
  white-space: nowrap;
  padding-right: 10px;
}

.season-price {
  min-height: 36px;
  width: 100%;
  max-width: 108px;
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 0 9px;
  color: var(--ink);
  background: var(--surface);
  font-size: 13.5px;
}

.season-promo-price {
  border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
}

.season-promo-price::placeholder {
  color: var(--muted);
  font-size: 12px;
}

.season-promo-cell {
  display: flex;
  align-items: center;
  gap: 8px;
}

.season-promo-percent {
  min-height: 36px;
  width: 54px;
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 0 6px;
  color: var(--muted);
  background: var(--surface);
  font-size: 12px;
}

.season-promo-percent::placeholder {
  color: var(--muted);
}

.season-card-footer {
  display: flex;
  justify-content: flex-end;
}

.promo-discount-hint {
  font-size: 11px;
  font-weight: 800;
  color: var(--green);
  white-space: nowrap;
}

.promo-discount-hint.warn {
  color: var(--red);
}

.promo-discount-hint.hidden {
  display: none;
}

.extras-list {
  display: grid;
  gap: 10px;
}

.extra-row {
  display: grid;
  grid-template-columns: 1fr 140px 180px auto auto;
  gap: 8px;
  align-items: center;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px 12px;
}

.extra-row input,
.extra-row select {
  min-height: 38px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
}

.users-list {
  display: grid;
  gap: 10px;
  margin-bottom: 14px;
}

.user-row {
  display: grid;
  grid-template-columns: 1fr auto auto auto;
  gap: 10px;
  align-items: center;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px 12px;
}

.user-row-identity {
  display: flex;
  align-items: baseline;
  gap: 8px;
  min-width: 0;
}

.user-row-name {
  font-weight: 700;
  font-size: 13.5px;
}

.user-row-role {
  color: var(--muted);
  font-size: 12px;
  text-transform: capitalize;
}

.users-add-form {
  display: grid;
  grid-template-columns: 1fr 140px 140px auto;
  gap: 8px;
}

.users-add-form input,
.users-add-form select {
  min-height: 38px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
}

.form-grid textarea {
  margin-top: 6px;
  width: 100%;
  min-height: 90px;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px;
  color: var(--ink);
  background: var(--surface);
  font: inherit;
  resize: vertical;
}

.funnel,
.channel-bars {
  display: grid;
  gap: 12px;
}

.funnel-row,
.channel-row {
  display: grid;
  gap: 6px;
}

.bar-track {
  height: 12px;
  background: var(--surface-muted);
  border-radius: 99px;
  overflow: hidden;
}

.bar-fill {
  height: 100%;
  background: var(--accent);
}

/* ===== Panel de Estadisticas ===== */
.stats-kpi-grid {
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  margin-bottom: 0;
}

.metric {
  position: relative;
}

.stat-trend {
  display: block;
  margin-top: 8px;
  font-size: 12px;
  font-weight: 700;
}

.stat-trend.up {
  color: var(--green);
}

.stat-trend.down {
  color: var(--red);
}

.stat-trend.neutral {
  color: var(--accent-strong);
}

.stat-trend.flat {
  color: var(--muted);
}

.stats-pair {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px;
}

@media (min-width: 981px) {
  .stats-pair {
    grid-template-columns: 1fr 1fr;
  }
}

.stats-chart {
  width: 100%;
}

.stats-chart-svg {
  width: 100%;
  height: auto;
  display: block;
}

.stats-grid-line {
  stroke: var(--line);
  stroke-width: 1;
}

.stats-axis-label {
  fill: var(--muted);
  font-size: 11px;
}

.stats-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  margin-bottom: 10px;
}

.stats-legend-vertical {
  flex-direction: column;
  gap: 8px;
  margin-bottom: 0;
}

.stats-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  color: var(--muted);
}

.stats-legend-item i {
  width: 10px;
  height: 10px;
  border-radius: 3px;
  display: inline-block;
}

.stats-donut-wrap {
  display: flex;
  align-items: center;
  gap: 24px;
  flex-wrap: wrap;
}

.stats-donut-svg {
  width: 180px;
  height: 180px;
  flex: none;
}

.stats-channel-table {
  display: grid;
  gap: 4px;
}

.stats-channel-row {
  display: grid;
  grid-template-columns: 1.4fr 0.8fr 1fr 1fr;
  gap: 8px;
  align-items: center;
  padding: 10px 6px;
  border-bottom: 1px solid var(--line);
  font-size: 14px;
}

.stats-channel-row.stats-channel-head {
  color: var(--muted);
  font-size: 12px;
  text-transform: uppercase;
  border-bottom: 1px solid var(--line);
}

.stats-muted {
  color: var(--muted);
}

.stats-empty {
  color: var(--muted);
  font-size: 14px;
  padding: 18px 0;
  text-align: center;
}

.form-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
}

.form-grid label {
  color: var(--muted);
  font-size: 13px;
  font-weight: 700;
}

.form-grid input {
  margin-top: 6px;
}

.knowledge-list div {
  padding: 12px;
}

.knowledge-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

.knowledge-item .icon-button {
  min-height: 28px;
  width: 28px;
  flex: 0 0 auto;
}

.knowledge-add-form {
  display: flex;
  gap: 8px;
  margin-top: 12px;
}

.knowledge-add-form input {
  flex: 1 1 auto;
  min-height: 38px;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
}

.settings-hint {
  margin: 0 0 14px;
  color: var(--muted);
  font-size: 13px;
  line-height: 1.5;
}

.status-warning-text {
  color: var(--red);
  font-weight: 700;
}

.settings-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.whatsapp-qr-box {
  margin-bottom: 14px;
}

.whatsapp-qr-box img {
  width: 220px;
  height: 220px;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px;
  background: var(--surface);
}

.availability-result {
  align-self: end;
  min-height: 40px;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px 12px;
  background: var(--surface-muted);
  color: var(--muted);
  font-size: 13px;
}

.room-table-wrap {
  overflow-x: auto;
}

.room-status-select {
  min-height: 34px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  color: var(--ink);
  padding: 0 8px;
}

.room-notes-input {
  min-height: 34px;
  width: 100%;
  min-width: 160px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  color: var(--ink);
  padding: 0 8px;
}

tr.room-inactive {
  opacity: 0.55;
}

tr.room-inactive td:first-child strong::after {
  content: " (inactiva)";
  color: var(--muted);
  font-weight: 700;
  font-size: 11px;
  text-transform: uppercase;
}

.payment-list {
  display: grid;
  gap: 8px;
  align-content: start;
}

/* Fila de titulos de columna sobre el registro -- mismas columnas que
   #payment-list .payment-row de abajo, tienen que coincidir si se cambia
   una de las dos. */
.payment-list-header {
  display: grid;
  grid-template-columns: 90px minmax(160px, 1fr) 130px 110px 100px 64px;
  gap: 12px;
  padding: 0 12px 6px;
  font-size: 11px;
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--muted);
}

.payment-list-header span:last-child {
  text-align: right;
}

.payment-row {
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 11px;
  background: var(--surface);
}

.payment-row strong,
.payment-row span,
.payment-row small {
  display: block;
}

.payment-row span,
.payment-row small {
  color: var(--muted);
  font-size: 13px;
  margin-top: 3px;
}

/* Fila del REGISTRO principal (#payment-list, la vista Pagos) -- grid de
   columnas fecha/reserva/metodo/monto/comprobante/anular. El detalle de una
   reserva puntual (.detail-payments-list) sigue usando la misma clase base
   .payment-row pero con el layout flex de .payment-row-main de abajo, mas
   chico -- no ligar estas reglas a esa otra lista sin querer. */
#payment-list .payment-row {
  display: grid;
  grid-template-columns: 90px minmax(160px, 1fr) 130px 110px 100px 64px;
  align-items: center;
  gap: 12px;
  transition: 150ms ease;
  cursor: pointer;
  text-align: left;
  width: 100%;
  font: inherit;
}

#payment-list .payment-row:hover {
  border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
  background: color-mix(in srgb, var(--accent) 6%, var(--surface));
}

.payment-row-actions {
  display: flex;
  justify-content: flex-end;
  gap: 4px;
}

.view-proof {
  color: var(--muted);
}

.view-proof:hover {
  color: var(--accent-strong);
}

.edit-payment {
  color: var(--muted);
}

.edit-payment:hover {
  color: var(--accent-strong);
}

.view-proof svg,
.edit-payment svg {
  width: 16px;
  height: 16px;
}

.payment-row-date {
  font-size: 13px;
  color: var(--muted);
}

.payment-row-guest {
  min-width: 0;
}

.payment-row-guest strong {
  font-size: 13.5px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.payment-row-guest span,
.payment-row-guest small {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.payment-method-badge {
  justify-self: start;
}

.payment-row .payment-method-badge {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  color: var(--accent-strong);
  border-radius: 999px;
  padding: 4px 10px;
  font-size: 12px;
  font-weight: 700;
  white-space: nowrap;
}

.payment-row-amount {
  font-size: 14px;
  text-align: right;
}

.payment-row-main {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.payment-row-main > div {
  min-width: 0;
}

.delete-payment {
  flex: 0 0 auto;
  min-height: 32px;
  width: 32px;
  color: var(--red);
}

.payment-proof-missing {
  flex: 0 0 auto;
  font-size: 11px;
  color: var(--red);
  border: 1px dashed var(--red);
  border-radius: 10px;
  padding: 4px 8px;
  white-space: nowrap;
}

.payment-reservation-picker {
  position: relative;
  margin-bottom: 14px;
}

.payment-search-results {
  display: none;
  position: absolute;
  z-index: 5;
  left: 0;
  right: 0;
  top: calc(100% + 4px);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: var(--shadow-float);
  padding: 6px;
  max-height: 280px;
  overflow-y: auto;
  flex-direction: column;
  gap: 4px;
}

.payment-search-results.visible {
  display: flex;
}

.payment-search-result {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  border: none;
  background: transparent;
  border-radius: 10px;
  padding: 8px 10px;
  text-align: left;
  cursor: pointer;
  font: inherit;
  color: var(--ink);
}

.payment-search-result:hover {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.payment-search-result strong {
  display: block;
  font-size: 13px;
}

.payment-search-result span {
  display: block;
  font-size: 12px;
  color: var(--muted);
  margin-top: 2px;
}

.payment-search-result .balance-clear {
  color: var(--green);
  font-weight: 700;
  font-size: 12px;
  white-space: nowrap;
}

.payment-search-result .balance-due {
  font-size: 12px;
  white-space: nowrap;
}

.payment-selected-reservation {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-top: 10px;
  border: 1px solid var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  border-radius: 10px;
  padding: 10px 12px;
}

.payment-selected-reservation strong {
  display: block;
  font-size: 13px;
}

.payment-selected-reservation span {
  display: block;
  font-size: 12px;
  color: var(--muted);
  margin-top: 2px;
}

.payment-form {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
  margin-top: 16px;
}

.payment-form label {
  display: grid;
  gap: 5px;
  color: var(--muted);
  font-size: 13px;
  font-weight: 700;
  min-width: 0;
}

.payment-form input,
.payment-form select {
  min-height: 40px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 0 10px;
  color: var(--ink);
  background: var(--surface);
  font: inherit;
}

.payment-form input[type="file"] {
  padding: 8px 10px;
  min-height: 40px;
}

.payment-form .wide,
.payment-proof-field,
.payment-form-actions {
  grid-column: 1 / -1;
}

.payment-proof-hint {
  font-size: 11px;
  font-weight: 500;
  color: var(--muted);
}

.payment-proof-hint.ok {
  color: var(--green);
  font-weight: 700;
}

.payment-proof-preview {
  margin-top: 4px;
}

.payment-proof-preview img {
  max-width: 160px;
  max-height: 160px;
  border-radius: 10px;
  border: 1px solid var(--line);
  display: block;
}

.payment-form-actions {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 4px;
}

.primary-button:disabled {
  background: var(--gray);
  border-color: var(--gray);
  color: #f1f3f5;
  cursor: not-allowed;
  box-shadow: none;
}

.primary-button:disabled:hover {
  background: var(--gray);
}

.ghost-button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.ghost-button:disabled:hover {
  border-color: var(--line);
}

@media (max-width: 900px) {
  .payment-form {
    grid-template-columns: 1fr;
  }

  .payment-form-actions {
    flex-direction: column-reverse;
  }

  .payment-form-actions button {
    width: 100%;
  }

  .payment-list-header {
    display: none;
  }

  #payment-list .payment-row {
    grid-template-columns: 1fr auto;
    grid-template-areas:
      "guest amount"
      "date method"
      "proof actions";
    row-gap: 6px;
  }

  .payment-row-guest {
    grid-area: guest;
  }

  .payment-row-amount {
    grid-area: amount;
  }

  .payment-row-date {
    grid-area: date;
  }

  .payment-row .payment-method-badge {
    grid-area: method;
    justify-self: end;
  }

  .view-proof,
  .payment-proof-missing {
    grid-area: proof;
    justify-self: start;
  }

  .payment-row-actions {
    grid-area: actions;
  }
}

.print-area {
  overflow-x: auto;
}

.listing-heading {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  align-items: flex-start;
  margin-bottom: 14px;
}

.listing-table {
  width: 100%;
  min-width: 720px;
  border-collapse: collapse;
}

.listing-table th,
.listing-table td {
  border-bottom: 1px solid var(--line);
  padding: 10px;
  text-align: left;
  vertical-align: top;
}

.listing-table th {
  color: var(--muted);
  font-size: 12px;
  text-transform: uppercase;
}

.toast {
  position: fixed;
  right: 18px;
  bottom: 18px;
  transform: translateY(12px);
  opacity: 0;
  pointer-events: none;
  background: #122026;
  color: white;
  border-radius: 10px;
  padding: 12px 14px;
  box-shadow: var(--shadow-float);
  transition: 170ms ease;
  z-index: 20;
}

.toast.visible {
  transform: translateY(0);
  opacity: 1;
}

.pms-confirm-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(16, 32, 39, 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  z-index: 50;
}

.pms-confirm-modal {
  background: var(--surface);
  border-radius: 10px;
  padding: 20px;
  width: min(380px, 100%);
  box-shadow: var(--shadow);
  animation: popoverIn 180ms cubic-bezier(0.16, 1, 0.3, 1);
}

.pms-confirm-modal h3 {
  margin: 0 0 8px;
  font-size: 16px;
}

.pms-confirm-modal p {
  margin: 0;
  color: var(--muted);
  font-size: 13px;
  line-height: 1.5;
  white-space: pre-line;
}

/* Mismo backdrop que pmsConfirm (.pms-confirm-backdrop), contenido propio:
   una imagen grande centrada en vez de un dialogo chico de texto. */
.proof-viewer-modal {
  position: relative;
  max-width: min(90vw, 640px);
  max-height: 90vh;
  animation: popoverIn 180ms cubic-bezier(0.16, 1, 0.3, 1);
}

.proof-viewer-modal img {
  display: block;
  max-width: 100%;
  max-height: 90vh;
  border-radius: 10px;
  box-shadow: var(--shadow-float);
}

.proof-viewer-close {
  position: absolute;
  top: -14px;
  right: -14px;
  background: var(--surface);
  border: 1px solid var(--line);
  box-shadow: var(--shadow);
}

.pms-confirm-actions {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 18px;
}

.pms-confirm-actions .danger-button {
  background: var(--red);
  border-color: var(--red);
  color: white;
}

.delete-reservation-payments {
  margin-top: 14px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(217, 72, 15, 0.06);
}

.delete-reservation-payments.hidden {
  display: none;
}

.checkbox-field {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 13px;
  cursor: pointer;
}

.checkbox-field input[type="checkbox"] {
  margin-top: 2px;
}

.delete-reservation-payments small {
  display: block;
  margin-top: 6px;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.4;
}

/* UI polish pass */

textarea {
  font: inherit;
}

.main {
  padding: 24px;
}

.topbar {
  margin-bottom: 20px;
}

.topbar h1 {
  font-size: 30px;
}

.primary-button {
  box-shadow: 0 2px 6px rgba(8, 127, 140, 0.18);
}

.metric-grid {
  grid-template-columns: repeat(4, minmax(150px, 1fr));
  gap: 12px;
  margin-bottom: 16px;
}

.metric,
.panel {
  padding: 18px;
}

.metric strong {
  margin-top: 7px;
  font-size: 25px;
}

.panel-header {
  align-items: center;
  margin-bottom: 14px;
}

.task,
.reservation-row,
.cleaning-card {
  padding: 11px;
}

.toolbar {
  margin-bottom: 12px;
  background: color-mix(in srgb, var(--surface) 76%, transparent);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 12px;
  box-shadow: var(--shadow);
}

.toolbar-actions {
  flex-wrap: wrap;
  justify-content: flex-end;
}

.toolbar-title h2 {
  margin: 0;
  font-size: 18px;
}

.compact-field {
  display: grid;
  min-width: 160px;
  color: var(--muted);
  font-size: 12px;
  font-weight: 800;
  gap: 5px;
}

.compact-field select {
  min-height: 38px;
  width: 100%;
  min-width: 160px;
  border: 1px solid var(--line);
  border-radius: 10px;
  color: var(--ink);
  appearance: none;
  background:
    linear-gradient(45deg, transparent 50%, var(--muted) 50%) calc(100% - 16px) 17px / 6px 6px no-repeat,
    linear-gradient(135deg, var(--muted) 50%, transparent 50%) calc(100% - 10px) 17px / 6px 6px no-repeat,
    var(--surface);
  padding: 0 30px 0 10px;
}

.compact-field input {
  min-height: 38px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  color: var(--ink);
  background: var(--surface);
  padding: 0 10px;
}

.planning-search-summary,
.reservation-search-summary:not(:empty) {
  margin: 0 0 10px;
  border: 1px solid color-mix(in srgb, var(--accent) 40%, var(--line));
  border-radius: 10px;
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  color: var(--accent-strong);
  padding: 10px 12px;
  font-size: 13px;
}

.reservation-block.search-match {
  outline: 2px solid rgba(8, 127, 140, 0.35);
  outline-offset: 2px;
}

.reservation-form {
  grid-template-columns: repeat(5, minmax(130px, 1fr));
}

.planning-row:nth-child(even) .cell:not(.room) {
  background: var(--surface-muted);
}

.cell.header {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.cell.room {
  background: var(--surface-muted);
}

.reservation-block {
  box-shadow: 0 1px 3px rgba(16, 32, 39, 0.14);
}

.reservation-list {
  gap: 8px;
}

.reservation-row {
  grid-template-columns: minmax(180px, 1.25fr) minmax(150px, 0.8fr) minmax(140px, 0.8fr) auto;
  transition: 150ms ease;
}

.reservation-row:hover {
  border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
  transform: translateY(-1px);
}

/* Con el detalle abierto, la lista comparte ancho con el panel -- antes cada
   fila igual mostraba las 6 lineas de la vista completa (nombre+habitacion,
   fechas+noches, total+saldo) apiladas en una sola columna angosta, dando
   filas mucho mas altas que las original 64px de min-height (el numero solo
   marca un piso, no un techo). Se reduce a las 2 lineas que importan para
   ubicar una reserva de un vistazo (nombre+fecha, estado) -- el resto
   (habitacion, noches, canal, total, saldo) ya se ve de entrada al abrir el
   detalle con un click, no hace falta duplicarlo en la lista comprimida. */
.reservations-layout.detail-open .reservation-row {
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: 2px 8px;
  min-height: 0;
  padding: 8px 10px;
}

.reservations-layout.detail-open .reservation-row > div {
  min-width: 0;
}

.reservations-layout.detail-open .reservation-row strong {
  font-size: 13px;
  line-height: 1.2;
}

.reservations-layout.detail-open .reservation-row span {
  display: block;
  margin-top: 2px;
  font-size: 12px;
  line-height: 1.25;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.reservations-layout.detail-open .reservation-row > div:first-child span,
.reservations-layout.detail-open .reservation-row > div:nth-child(2) span {
  display: none;
}

.reservations-layout.detail-open .reservation-row > div:nth-child(2) {
  grid-column: 1;
  grid-row: 2;
}

.reservations-layout.detail-open .reservation-row > div:nth-child(3) {
  display: none;
}

.reservations-layout.detail-open .reservation-row .reservation-row-status {
  grid-column: 2;
  grid-row: 1 / span 2;
  align-self: center;
}

.reservations-layout.detail-open .reservation-row .pill {
  white-space: nowrap;
  min-height: 22px;
  font-size: 11px;
  padding: 0 7px;
}

.reservation-detail .panel-header {
  align-items: flex-start;
  gap: 10px;
  /* Tiene que coincidir con el padding real de .panel (18px, ver seccion
     "UI polish pass" mas arriba en el archivo). */
  padding: 18px 18px 10px;
  border-bottom: 1px solid var(--line);
  border-radius: 10px 10px 0 0;
  position: sticky;
  top: 0;
  z-index: 5;
  background: var(--surface);
}

.reservation-detail .panel-header-title {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  min-width: 0;
}

.reservation-detail .panel-header-title .icon-button {
  flex-shrink: 0;
  font-size: 16px;
  line-height: 1;
}

.reservation-detail .detail-danger-zone {
  margin-top: 4px;
  padding-top: 14px;
  border-top: 1px dashed var(--line);
  display: flex;
  justify-content: flex-end;
}

.reservation-detail .panel-header h2 {
  font-size: 20px;
  line-height: 1.15;
}

.reservation-detail .detail-summary {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
  padding: 10px;
}

.reservation-detail .detail-summary div {
  min-width: 0;
}

.reservation-detail .detail-summary strong {
  font-size: 12px;
}

.reservation-detail .detail-summary span {
  display: block;
  font-size: 12px;
  line-height: 1.3;
}

.reservation-detail .detail-form {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.reservation-detail .detail-form label {
  min-width: 0;
  font-size: 12px;
}

.reservation-detail .detail-form input,
.reservation-detail .detail-form select {
  min-height: 36px;
}

.reservation-detail .detail-form textarea,
.reservation-detail .detail-actions,
.reservation-detail .detail-form .detail-block {
  grid-column: 1 / -1;
}

.detail-block-fields {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.detail-block-readonly {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--line);
}

.detail-dl-cols {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.detail-group-rooms {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 4px;
}

.detail-group-room-row {
  display: flex;
  align-items: center;
  gap: 8px;
}

.detail-group-room-tag {
  flex: 0 0 auto;
  min-width: 36px;
  font-size: 12px;
  font-weight: 600;
  color: var(--muted);
  text-align: center;
}

.detail-group-room-select {
  flex: 1 1 auto;
}

.detail-hint {
  display: block;
  margin-top: 6px;
  color: var(--muted);
  font-weight: 400;
}

.reservation-detail .detail-form textarea {
  min-height: 68px;
}

.detail-summary {
  gap: 7px;
}

.balance-banner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 4px;
}

.balance-banner strong {
  display: block;
  font-size: 14px;
}

.balance-banner span {
  display: block;
  font-size: 12px;
  margin-top: 2px;
}

.balance-banner.due {
  background: color-mix(in srgb, var(--orange) 12%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--orange) 40%, var(--line));
  color: var(--orange);
}

.balance-banner.due span {
  color: var(--orange);
}

.balance-banner.paid {
  background: color-mix(in srgb, var(--green) 12%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--green) 40%, var(--line));
  color: var(--green);
}

.balance-banner.paid span {
  color: var(--green);
}

.balance-banner-amount {
  font-size: 20px;
  font-weight: 800;
  white-space: nowrap;
}

.balance-banner-amount.ok {
  font-size: 22px;
}

.detail-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
}

.detail-block {
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px 12px;
  min-width: 0;
}

.detail-block h3 {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--muted);
  margin: 0 0 8px;
}

.detail-dl {
  display: grid;
  gap: 8px;
}

.detail-dl > div {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.detail-dl dt {
  color: var(--muted);
  font-size: 11px;
}

.detail-dl dd {
  margin: 0;
  font-size: 13px;
  text-align: left;
  min-width: 0;
  overflow-wrap: anywhere;
}

.balance-due {
  color: var(--red);
  font-weight: 800;
}

.reservation-row .balance-due {
  font-weight: 800;
}

.detail-form-title {
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--muted);
  margin: 6px 0 -2px;
}

@media (max-width: 900px) {
  .detail-grid {
    grid-template-columns: 1fr;
  }
}

.detail-extras {
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px;
  display: grid;
  gap: 8px;
}

.detail-extras h3 {
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--muted);
  margin: 0 0 8px;
}

.detail-extras-list {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.walkin-extras-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.walkin-extra-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 6px 10px;
  font-size: 12px;
  font-weight: 600;
  color: var(--ink);
  cursor: pointer;
}

.walkin-extra-item:has(input:checked) {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  color: var(--accent-strong);
}

.walkin-extra-item input {
  width: auto;
  min-height: auto;
  margin: 0;
}

.detail-payments {
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px;
  display: grid;
  gap: 8px;
}

.detail-payments h3 {
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--muted);
  margin: 0 0 8px;
}

.detail-payments-list {
  display: grid;
  gap: 8px;
}

.detail-payments .payment-row {
  padding: 8px;
}

.extra-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  border-radius: 999px;
  padding: 4px 8px;
  font-size: 12px;
  color: var(--ink);
  border: 1px solid transparent;
}

/* Extra recien tildado en el detalle de reserva, todavia sin presionar
   "Guardar cambios" -- borde punteado para que se note que es un borrador,
   mismo color de fondo que el resto para no verse "roto". */
.extra-chip.pending {
  border: 1px dashed var(--accent);
}

.extra-chip button {
  border: none;
  background: transparent;
  color: var(--muted);
  width: 16px;
  height: 16px;
  min-height: 16px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  font-size: 12px;
  padding: 0;
}

.extra-chip button:hover {
  background: rgba(217, 72, 15, 0.12);
  color: var(--red);
}

.extra-chip.add-extra,
.extra-chip.inhouse-add-extra {
  border: 1px dashed var(--line);
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-weight: 700;
}

.extra-chip.add-extra:hover,
.extra-chip.inhouse-add-extra:hover {
  border-color: var(--accent);
  color: var(--accent-strong);
}

.detail-form-title {
  grid-column: 1 / -1;
}

.toolbar-group {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.toolbar-divider {
  width: 1px;
  align-self: stretch;
  background: var(--line);
}

/* Sesion real (reemplaza al viejo selector de rol simulado) — chip oscuro y
   compacto a la derecha del navbar, mismo contraste de antes pero mas chico
   para no restarle alto al navbar. */
.session-box {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
  padding: 5px 6px 5px 10px;
  border-radius: 8px;
  background: #16262d;
  border: 1px solid rgba(255, 255, 255, 0.08);
  flex: 0 0 auto;
  margin-left: auto;
}

/* Dentro del dropdown de Ajustes el session-box ya no es un item mas de una
   fila horizontal (el navbar) sino el pie de una columna vertical — ocupa
   todo el ancho disponible en vez de flotar pegado a la derecha. */
.topnav-dropdown .session-box {
  width: 100%;
  margin-left: 0;
  margin-top: 2px;
  justify-content: space-between;
  flex-wrap: wrap;
  row-gap: 8px;
}

.topnav-dropdown .personalization-box {
  flex: 1 1 100%;
  justify-content: space-between;
}

.topnav-dropdown-divider {
  height: 1px;
  background: var(--line);
  margin: 4px 4px 6px;
}

/* Boton "+ Ingreso por mostrador" reubicado donde antes vivia el chip de
   sesion — mismo empuje a la derecha del navbar. */
.topnav-cta {
  margin-left: auto;
  flex: 0 0 auto;
}

.session-box-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.session-box-info strong {
  font-size: 12px;
  color: #edf6f8;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.session-box-info span {
  font-size: 10px;
  color: #8fa4ab;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.session-box .ghost-button {
  flex: 0 0 auto;
  padding: 4px 8px;
  font-size: 11px;
  min-height: 26px;
  border-color: rgba(255, 255, 255, 0.18);
  color: #c8d6dc;
  background: transparent;
}

.session-box .ghost-button:hover {
  border-color: var(--accent);
  color: white;
}

/* El chip de sesion es un cuadro oscuro fijo (background propio arriba, no
   sigue el tema de la pagina) -- por eso estos controles usan su propia
   paleta clara-sobre-oscuro en vez de var(--ink)/var(--surface), que
   asumirian un fondo claro. */
.personalization-box {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
}

.theme-toggle {
  display: flex;
  gap: 2px;
  background: rgba(255, 255, 255, 0.06);
  border-radius: 7px;
  padding: 2px;
}

.theme-toggle-option {
  border: none;
  background: transparent;
  color: #8fa4ab;
  font-size: 10px;
  font-weight: 700;
  padding: 4px 7px;
  border-radius: 5px;
  cursor: pointer;
}

.theme-toggle-option.active {
  background: var(--accent);
  color: white;
}

/* Tarifas/Usuarios no tenian NINGUN ajuste para pantallas angostas -- las
   filas de grid fijo (extra-row, users-add-form, user-row) se aprietan mal
   con varias columnas de ancho fijo, y la fila de precio+promo+% de Tarifas
   queda muy justa. Se resuelve apilando en columna y dejando scroll
   horizontal como ultimo recurso en la tabla de precios, nunca contenido
   cortado o inutilizable. */
@media (max-width: 640px) {
  .season-price-table {
    display: block;
    overflow-x: auto;
  }

  .season-promo-cell {
    flex-wrap: wrap;
    row-gap: 6px;
  }

  .extra-row,
  .users-add-form {
    grid-template-columns: 1fr;
  }

  .user-row {
    grid-template-columns: 1fr;
    justify-items: start;
  }

  .user-row-identity {
    flex-wrap: wrap;
  }
}

/* Login de dos pasos: hotel -> usuario -> contraseña */
.login-screen {
  position: fixed;
  inset: 0;
  display: grid;
  place-items: center;
  background: linear-gradient(160deg, #122026 0%, #05616b 100%);
  padding: 20px;
  z-index: 100;
}

.login-card {
  width: 100%;
  max-width: 380px;
  background: var(--surface);
  border-radius: 14px;
  padding: 28px 26px;
  box-shadow: var(--shadow);
  display: grid;
  gap: 14px;
}

.login-brand {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 4px;
}

.login-brand strong {
  font-size: 15px;
  letter-spacing: 0.03em;
  color: var(--ink);
}

.login-card h1 {
  font-size: 18px;
  margin: 0;
}

.login-hint {
  margin: -6px 0 4px;
  color: var(--muted);
  font-size: 13px;
}

.login-step {
  display: grid;
  gap: 10px;
}

.login-step label {
  display: grid;
  gap: 4px;
  font-size: 12px;
  font-weight: 700;
  color: var(--muted);
}

.login-step input {
  min-height: 38px;
  border-radius: 8px;
  border: 1px solid var(--line);
  padding: 0 10px;
  font-size: 14px;
  color: var(--ink);
}

.login-step input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.pin-input {
  font-size: 22px !important;
  letter-spacing: 0.5em;
  text-align: center;
  font-weight: 700;
  /* type="text" (no type="password") a proposito, para que el gestor de
     contraseñas del navegador no ofrezca autocompletar/sugerir una
     contraseña guardada en un campo que en realidad espera un PIN numerico
     — esto enmascara visualmente igual, sin depender de type="password". */
  -webkit-text-security: disc;
}

.login-back {
  justify-self: start;
  padding: 4px 8px;
  min-height: 28px;
  font-size: 12px;
}

.login-error {
  margin: 0;
  font-size: 12px;
  font-weight: 700;
  color: var(--red);
}

.login-user-list {
  display: grid;
  gap: 8px;
}

.login-user-btn {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  padding: 10px 12px;
  border-radius: 8px;
  border: 1px solid var(--line);
  background: var(--surface);
  text-align: left;
}

.login-user-btn strong {
  font-size: 13px;
  color: var(--ink);
}

.login-user-btn span {
  font-size: 11px;
  color: var(--muted);
}

.login-user-btn:hover {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

/* Actividad reciente (auditoria) en el detalle de reserva */
.detail-audit {
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px;
  display: grid;
  gap: 8px;
  margin-top: 12px;
}

.audit-log-list {
  display: grid;
  gap: 6px;
}

.audit-log-row {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px;
  padding: 6px 8px;
  border-radius: 6px;
  background: var(--surface-muted);
  font-size: 12px;
}

.audit-log-row strong {
  color: var(--accent-strong);
}

.audit-log-row span {
  color: var(--ink);
  flex: 1 1 auto;
}

.audit-log-row small {
  color: var(--muted);
  white-space: nowrap;
}

.activity-list {
  max-height: 70vh;
  overflow-y: auto;
  padding-right: 4px;
}

.reservation-block:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 10px rgba(16, 32, 39, 0.16);
}

.reservation-block.dragging {
  opacity: 0.55;
  filter: saturate(0.85);
  cursor: grabbing;
}

.planning-row.drop-target .cell:not(.room) {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.planning-row.drop-target .cell.room {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  color: var(--accent-strong);
}

.planning-row.hover-row .cell {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.planning-row.hover-row .cell.room {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.cell.hover-col {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.cell.header.hover-col {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
}

.cell.header.today {
  background: var(--accent);
  color: white;
}

/* .rack-month/.rack-day tienen su propio color (--muted/--ink, pensado para
   el fondo normal de .cell.header) que le ganaba por especificidad al
   "color: white" heredado de aca arriba -- la columna de HOY quedaba con el
   mes en gris apagado y el numero en el color de texto normal encima del
   turquesa solido, en vez de blanco. */
.cell.header.today .rack-month,
.cell.header.today .rack-day {
  color: white;
}

.reservation-popover {
  position: absolute;
  z-index: 20;
  width: min(348px, calc(100vw - 48px));
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  box-shadow: var(--shadow-float);
  padding: 12px;
  animation: popoverIn 220ms cubic-bezier(0.16, 1, 0.3, 1);
}

.popover-header {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  align-items: flex-start;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--line);
}

.popover-header h3 {
  margin: 0;
  font-size: 17px;
  line-height: 1.15;
}

.popover-header .icon-button {
  min-height: 30px;
  width: 30px;
}

.popover-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
  margin-top: 10px;
}

.popover-grid div,
.popover-contact {
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface-muted);
  padding: 8px;
}

.popover-grid span,
.popover-contact span {
  display: block;
  color: var(--muted);
  font-size: 11px;
  font-weight: 800;
}

.popover-grid strong,
.popover-contact strong {
  display: block;
  margin-top: 3px;
  color: var(--ink);
  font-size: 13px;
  line-height: 1.2;
}

.popover-contact {
  margin-top: 8px;
}

.popover-actions {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  gap: 8px;
  margin-top: 10px;
}

@keyframes popoverIn {
  from {
    opacity: 0;
    transform: translateY(8px) scale(0.98);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

@media print {
  body {
    background: var(--surface);
  }

  .topnav,
  .topbar,
  .toolbar,
  .view:not(#listados),
  .mini-calendar,
  .toast {
    display: none !important;
  }

  .app-shell,
  .main {
    display: block;
    padding: 0;
  }

  #listados,
  #listados.view {
    display: block !important;
  }

  .panel {
    border: 0;
    box-shadow: none;
    padding: 0;
  }
}

@media (max-width: 980px) {
  .main {
    padding: 14px;
  }

  .topbar {
    flex-wrap: wrap;
    row-gap: 10px;
  }

  .topbar-title-group {
    flex: 1 1 100%;
  }

  .metric-grid {
    grid-template-columns: repeat(2, minmax(140px, 1fr));
  }

  .reservations-layout.detail-open {
    grid-template-columns: 1fr;
  }

  .reservation-form,
  .payment-form {
    grid-template-columns: 1fr;
  }

  .wide {
    grid-column: auto;
  }

  .chat-layout {
    grid-template-columns: 1fr;
    grid-template-rows: 38vh 1fr;
  }
}

.nav-caret {
  color: var(--muted);
  transition: transform 150ms ease;
  font-size: 11px;
}

.topnav-parent.open .nav-caret {
  transform: rotate(180deg);
}

/* Dropdown flotante (reemplaza al viejo submenu inline de la barra lateral
   vertical) — anclado al boton padre via .topnav-group{position:relative}. */
.topnav-dropdown {
  display: none;
  flex-direction: column;
  gap: 1px;
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  min-width: 190px;
  padding: 6px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: var(--shadow-float);
  z-index: 45;
}

.topnav-dropdown.open {
  display: flex;
}

.topnav-dropdown-item {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  min-height: 34px;
  padding: 6px 10px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--ink);
  text-align: left;
  font-size: 13px;
  font-weight: 600;
}

.topnav-dropdown-item:hover,
.topnav-dropdown-item.active {
  background: var(--surface-muted);
  color: var(--accent-strong);
}

.date-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 38px;
  padding: 0 12px;
  border-radius: 10px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  font-weight: 700;
}

.date-badge:hover {
  border-color: var(--accent);
}

.calendar-day.selected {
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.housekeeping-table {
  width: 100%;
  min-width: 980px;
  border-collapse: collapse;
}

.housekeeping-table th,
.housekeeping-table td {
  border-bottom: 1px solid var(--line);
  padding: 10px;
  text-align: left;
  vertical-align: top;
}

.housekeeping-table th {
  color: var(--muted);
  font-size: 12px;
  text-transform: uppercase;
}

.housekeeping-table td span {
  color: var(--muted);
  font-size: 12px;
}

.housekeeping-staff-select {
  min-height: 34px;
  min-width: 130px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  color: var(--ink);
  padding: 0 8px;
}

.housekeeping-event {
  border-left: 3px solid var(--line);
  padding: 4px 0 4px 8px;
  margin-bottom: 6px;
  font-size: 13px;
}

.housekeeping-event:last-child {
  margin-bottom: 0;
}

.housekeeping-event strong {
  margin-right: 4px;
}

.housekeeping-event span {
  display: block;
}

.housekeeping-event.entrada {
  border-left-color: var(--green);
}

.housekeeping-event.salida {
  border-left-color: var(--orange);
}

.housekeeping-event.cliente {
  border-left-color: var(--blue);
}

.service-tag-list {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  min-width: 160px;
}

.service-tag {
  min-height: 26px;
  border: 1px solid var(--line);
  border-radius: 99px;
  background: var(--surface);
  color: var(--muted);
  padding: 0 10px;
  font-size: 11px;
  font-weight: 700;
}

.service-tag.active {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  color: var(--accent-strong);
}

.housekeeping-notes-input {
  min-height: 34px;
  width: 100%;
  min-width: 140px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  color: var(--ink);
  padding: 0 8px;
}

.topbar-title-group {
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
}

.mobile-nav-toggle {
  display: none;
  flex: 0 0 auto;
}

.sidebar-backdrop {
  display: none;
}

/* En desktop, topnav-collapsible es "invisible" para el layout (display:
   contents) — sus hijos (topnav-list, session-box) participan directo del
   flex del .topnav padre, como si no estuvieran envueltos. En mobile pasa a
   ser el panel desplegable propiamente dicho. */
.topnav-collapsible {
  display: flex;
  align-items: center;
  gap: 18px;
  flex: 1 1 auto;
  min-width: 0;
}

@media (max-width: 980px) {
  .mobile-nav-toggle {
    display: inline-flex;
  }

  .topnav-collapsible {
    display: none;
    position: fixed;
    top: 50px;
    left: 0;
    right: 0;
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    background: var(--surface);
    border-bottom: 1px solid var(--line);
    box-shadow: var(--shadow-float);
    padding: 10px 16px 14px;
    z-index: 55;
    max-height: calc(100vh - 50px);
    overflow-y: auto;
  }

  .topnav-collapsible.mobile-open {
    display: flex;
  }

  .topnav-list {
    flex-direction: column;
    align-items: stretch;
    gap: 2px;
  }

  .topnav-dropdown {
    position: static;
    box-shadow: none;
    border: 0;
    padding-left: 14px;
    margin-top: 2px;
    min-width: 0;
  }

  /* En el panel movil el boton de mostrador es un item apilado mas, no un
     elemento empujado a la derecha (eso solo tiene sentido en el navbar
     horizontal de escritorio). */
  .topnav-cta {
    width: 100%;
    margin-left: 0;
    margin-top: 6px;
    justify-content: center;
  }

  /* z-index 30, NO 50: #sidebar-backdrop es hermano de <header class="topnav">
     (z-index:40), no descendiente. .topnav-collapsible vive DENTRO de .topnav
     y por lo tanto queda atrapado en el stacking context de .topnav (z:40) —
     si el backdrop tuviera z-index mayor a 40 pintaria por encima de TODO el
     header, tapando el panel movil abierto (y sus botones quedarian debajo
     del velo oscuro, recibiendo el click que en realidad cierra el menu en
     vez de navegar). Por debajo de .topnav a proposito para que el header
     (y su panel desplegable) siempre queden arriba del velo.
  */
  .sidebar-backdrop.visible {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(6, 12, 15, 0.45);
    z-index: 30;
  }
}

/* ---------------------------------------------------------------------------
   Vista Clientes (base de clientes)

   Todo el color sale de las variables de tema, asi que claro/oscuro sale solo.
   Dos reglas que se respetan a proposito en cada grid de aca (ver
   feedback_visual_layout_verification): las columnas usan minmax(0, ...) para
   que una celda pueda ENCOGERSE por debajo de su contenido, y toda celda de
   texto trunca con ellipsis. Sin las dos, un nombre o un mail largo desborda
   su pista y pinta encima de la celda vecina — exactamente el bug que tuvo el
   header "Comprobante" de Pagos.
--------------------------------------------------------------------------- */
/* Aviso de "este cliente ya existe" al cargar una reserva nueva (Planning y
   Mostrador) — ver findMatchingGuest() en app.js. Usa las mismas variables de
   tema que el resto (nunca colores fijos), y trunca su texto con ellipsis en
   vez de dejarlo desbordar cuando el nombre es largo. */
.guest-match-hint {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px 12px;
  border: 1px solid color-mix(in srgb, var(--accent) 40%, var(--line));
  background: color-mix(in srgb, var(--accent) 10%, var(--surface));
  border-radius: 10px;
  padding: 8px 12px;
  font-size: 13px;
  color: var(--ink);
}

.guest-match-hint span {
  min-width: 0;
  flex: 1 1 220px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.guest-match-hint .ghost-button {
  padding: 4px 10px;
  font-size: 12px;
  flex: 0 0 auto;
}

/* Enlace en linea dentro de un titulo (ej. "Ver ficha del cliente" en el
   detalle de reserva). Hereda el tamaño del contexto para no romper el alto
   del <h3> que lo contiene. */
.link-button {
  background: none;
  border: 0;
  padding: 0;
  margin-left: 8px;
  font: inherit;
  font-size: 0.8rem;
  font-weight: 500;
  color: var(--accent-strong);
  text-decoration: underline;
  cursor: pointer;
}

.link-button:hover {
  color: var(--accent);
}

.guests-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.35fr);
  gap: 18px;
  align-items: start;
}

.guests-list-panel,
.guest-detail-panel {
  min-width: 0;
}

.guests-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 10px;
}

.guest-row {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
  grid-auto-rows: min-content;
  gap: 4px 12px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  color: inherit;
  padding: 10px 12px;
  text-align: left;
  cursor: pointer;
  transition: 150ms ease;
}

.guest-row:hover {
  border-color: var(--accent);
}

.guest-row.active {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 10%, var(--surface));
}

.guest-row-name,
.guest-row-meta,
.guest-row-stats {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.guest-row-name {
  font-weight: 600;
  color: var(--ink);
}

.guest-row-meta,
.guest-row-stats {
  font-size: 0.82rem;
  color: var(--muted);
}

.guest-row-meta {
  text-align: right;
}

.guest-row-pills {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.guest-row-pills:empty {
  display: none;
}

.pill.guest-tag {
  background: color-mix(in srgb, var(--accent) 18%, var(--surface));
  color: var(--accent-strong);
  border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line));
}

.guest-detail-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}

.guest-detail-head h3 {
  margin: 2px 0 0;
  min-width: 0;
  overflow-wrap: anywhere;
}

.guest-metrics {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: 10px;
  margin: 14px 0;
}

.guest-metric {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface-muted);
  min-width: 0;
}

.guest-metric strong {
  font-size: 1.05rem;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.guest-metric span {
  font-size: 0.76rem;
  color: var(--muted);
}

.guest-form {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
}

.guest-field-wide {
  grid-column: 1 / -1;
}

.guest-form textarea {
  resize: vertical;
  font: inherit;
}

.guest-form-actions {
  grid-column: 1 / -1;
  display: flex;
  justify-content: flex-end;
}

.guest-history {
  margin-top: 18px;
  border-top: 1px solid var(--line);
  padding-top: 14px;
}

.guest-history h4 {
  margin: 0 0 10px;
  font-size: 0.95rem;
}

.guest-history h4 small {
  font-weight: 400;
  color: var(--muted);
}

.guest-stays {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.guest-stay {
  display: grid;
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) auto minmax(0, 0.9fr);
  align-items: center;
  gap: 10px;
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  color: inherit;
  padding: 10px 12px;
  text-align: left;
  cursor: pointer;
  transition: 150ms ease;
}

.guest-stay:hover {
  border-color: var(--accent);
}

.guest-stay span:not(.pill) {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 0.85rem;
}

.guest-stay-dates {
  font-weight: 600;
  color: var(--ink);
}

.guest-stay-room,
.guest-stay-total {
  color: var(--muted);
}

.guest-stay-total {
  text-align: right;
}

@media (max-width: 980px) {
  .guests-layout {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (max-width: 640px) {
  .guest-row,
  .guest-stay {
    grid-template-columns: minmax(0, 1fr);
  }

  .guest-row-meta,
  .guest-stay-total {
    text-align: left;
  }

  .guest-form {
    grid-template-columns: minmax(0, 1fr);
  }
}