body { background: #fafafa; }
.navbar .nav-link { color: #444; }
.navbar .nav-link.active, .nav-link:hover { color: var(--brand-primary); }

/* =========================================================
   Landing (pre-login)
   ========================================================= */

.landing-hero{
  position: relative;
  overflow: hidden;
  border: 1px solid rgba(0,0,0,.06);
  border-radius: 24px;
  background: #fff;
  padding: 3.5rem 1.25rem;
  min-height: 60vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

.landing-hero::before{
  content: "";
  position: absolute;
  inset: -40% -40% -40% -40%;
  background:
    radial-gradient(circle at 25% 25%, rgba(0, 121, 157, .18), transparent 55%),
    radial-gradient(circle at 75% 10%, rgba(228, 37, 44, .12), transparent 55%);
  filter: blur(2px);
  opacity: .9;
  pointer-events: none;
}

.landing-hero__inner{ position: relative; z-index: 1; max-width: 760px; }
.landing-hero__logo{ height: 90px; max-width: 100%; object-fit: contain; }
.landing-hero__title{ font-weight: 800; letter-spacing: .2px; }
.landing-hero__subtitle{ color: #6c757d; max-width: 560px; margin: 0 auto; }
.landing-hero__hint{ font-size: .95rem; }

@media (min-width: 768px){
  .landing-hero{ padding: 4.5rem 2rem; min-height: 65vh; }
  .landing-hero__logo{ height: 110px; }
}

.artist-avatar {
  width: 56px; height: 56px; border-radius: 50%; object-fit: cover;
  border: 2px solid #eee;
}
.artist-hero{
  border: 1px solid rgba(0,0,0,.06);
  background: #fff;
  border-radius: 18px;
  padding: 1rem;
}

.artist-hero-photo{
  width: 120px;
  height: 120px;
  border-radius: 18px;
  object-fit: cover;
  border: 1px solid #eee;
  background: #fff;
}

.artist-mini{
  width: 28px;
  height: 28px;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid #eee;
  background: #fff;
}
.cover-square {
  width: 64px; height: 64px; object-fit: cover; border-radius: 10px; border: 1px solid #eee;
}

.clickable-row{ cursor: pointer; }

/* =========================================================
   Discográfica / Canciones
   ========================================================= */

/* Tablas de repertorio (canciones / álbumes): cada artista es una tabla independiente, así que con
   el layout automático las columnas quedaban con distinto ancho en cada bloque. Con table-layout
   fijo + anchos idénticos en las columnas de datos, todas las tablas alinean igual entre artistas. */
.repertorio-table{ table-layout: fixed; min-width: 880px; }
.repertorio-table th, .repertorio-table td{ overflow-wrap: break-word; }

.song-hero{
  border: 1px solid rgba(0,0,0,.06);
  background: #fff;
  border-radius: 18px;
  padding: 1rem;
}

.song-hero-cover{
  width: 160px;
  height: 160px;
  border-radius: 18px;
  object-fit: cover;
  border: 1px solid #eee;
  background: #fff;
}

.song-platform{
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: .3rem;
  border-radius: 12px;
}
/* Logos de plataforma en color (PNG). Inactivo = mismo logo en gris y clicable (mete enlace a mano). */
.song-platform i{ font-size: 28px; }
.song-platform img{ width: 30px; height: 30px; object-fit: contain; display: block; transition: filter .12s ease, opacity .12s ease; }
.song-platform.active:hover{ opacity: .85; }
.song-platform.disabled{ color: #adb5bd !important; cursor: pointer; }
.song-platform.disabled img{ filter: grayscale(1); opacity: .35; }
.song-platform.disabled:hover img{ opacity: .6; }

/* Cabecera de canción: un solo logo por plataforma (enlace) y, en Spotify/Apple/Amazon, las
   reproducciones + flecha de tendencia semanal debajo. TikTok/YouTube: solo logo, mismo tamaño. */
.song-platforms{ display: flex; align-items: flex-start; gap: .9rem; flex-wrap: wrap; }
.song-plat{ display: flex; flex-direction: column; align-items: center; gap: .1rem; }
.song-plat-num{ font-size: .78rem; line-height: 1; color: #495057; white-space: nowrap; display: inline-flex; align-items: center; gap: .2rem; }
.song-plat-num .cm-empty{ color: #adb5bd; }
.cm-up{ color: #1a9e46; }
.cm-down{ color: #d6293e; }
.cm-flat{ color: #e0a800; }

/* Barra de estados (ficha canción) */
.song-status-bar {
  border: 1px dashed #ddd;
  border-radius: 12px;
  padding: 10px;
  background: #fafafa;
}

.song-status-item {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border: 1px solid #e6e6e6;
  border-radius: 999px;
  padding: 6px 10px;
  background: #fff;
  text-decoration: none;
}

button.song-status-item {
  border: 1px solid #e6e6e6;
  border-radius: 999px;
  padding: 6px 10px;
  background: #fff;
  text-decoration: none;
}

button.song-status-item:hover,
.song-status-item:hover {
  background: #f3f3f3;
}

button.song-status-item:focus {
  box-shadow: none;
}

.song-status-item i {
  font-size: 18px;
}
.station-logo {
  width: 56px; height: 56px; object-fit: contain; background: #fff; border-radius: 8px; border: 1px solid #eee;
}

/* Select2 */
.select2-container .select2-selection--multiple .select2-selection__choice__display img,
.select2-results__option .thumb {
  width: 24px; height: 24px; border-radius: 50%; object-fit: cover; margin-right: 8px; border: 1px solid #eee;
}

/* Para ticketeras: mostrar el logo completo (no circular) */
.select2-results__option .thumb.thumb-square,
.select2-container .select2-selection--multiple .select2-selection__choice__display img.thumb-square,
.select2-container--default .select2-selection--single .select2-selection__rendered img.thumb-square {
  border-radius: 6px !important;
  object-fit: contain !important;
  background: #fff;
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
  background-color: var(--brand-primary);
}

/* Select2 en modales Bootstrap: asegurar el desplegable por encima del modal */
.select2-container--open {
  z-index: 1060;
}
.btn-primary, .bg-primary { background-color: var(--brand-primary); border-color: var(--brand-primary); }
.btn-outline-primary { color: var(--brand-primary); border-color: var(--brand-primary); }
.btn-outline-primary:hover { background-color: var(--brand-primary); border-color: var(--brand-primary); }

/* Plegables */
.toggle-artist .chevron { transition: transform .2s ease; }
.toggle-artist.collapsed .chevron { transform: rotate(-90deg); }
.opacity-50 { opacity: .6 !important; }

.card .artist-avatar { width: 50px; height: 50px; }
.card .station-logo { width: 48px; height: 48px; }
.card .card-body { padding: .9rem 1rem; }  /* compacta las tarjetas */

.logo-chip { position: relative; display: inline-block; }
.logo-chip .station-logo { width: 40px; height: 40px; object-fit: contain; }

.logo-chip { position: relative; display: inline-block; }
.logo-chip .station-logo { width: 40px; height: 40px; object-fit: contain; }

.municipio-strong { font-weight: 700; color: inherit; }

.logo-chip { position: relative; display: inline-block; }
.logo-chip .station-logo { width: 40px; height: 40px; object-fit: contain; }

/* Festival: pantone pedido */
.badge-festival { background-color: #00779d !important; color: #fff !important; }

/* Municipio: solo negrita, color estándar */
.fw-semibold { font-weight: 600; }

.badge-venue { background-color: #f1f3f5; color: #212529; }

/* Home */
.hover-card { transition: transform .12s, box-shadow .12s; }
.hover-card:hover { transform: translateY(-2px); box-shadow: 0 .5rem 1rem rgba(0,0,0,.1); }

/* =========================================================
   Dashboard (home tras login)
   ========================================================= */

.dash-hero{
  border: 1px solid rgba(0,0,0,.06);
  background: #fff;
  border-radius: 18px;
  padding: 1.25rem;
}

.dash-hero__logo{ height: 44px; object-fit: contain; }

.dash-hero__title{ font-weight: 800; margin: 0; }

.dash-hero__subtitle{ margin: 0; color: #6c757d; }

.dash-section-title{
  font-weight: 700;
  letter-spacing: .2px;
}

.dash-tile{
  border: 1px solid rgba(0,0,0,.06);
  background: #fff;
  border-radius: 16px;
  padding: 1rem;
  height: 100%;
}

.dash-tile:hover{ box-shadow: 0 .5rem 1rem rgba(0,0,0,.08); transform: translateY(-2px); }

.dash-tile{
  transition: transform .12s ease, box-shadow .12s ease;
}

.dash-tile__icon{
  width: 44px;
  height: 44px;
  border-radius: 12px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(0,0,0,.04);
}

.dash-tile__title{ font-weight: 700; margin: 0; }
.dash-tile__text{ color: #6c757d; margin: 0; }

/* =========================================================
   FIX: Avatar (thumb) gigante en Select2 en selección SIMPLE
   (Alta concierto + Editar concierto)
   ========================================================= */

/* Evita desbordes del contenido renderizado en selección simple */
.select2-container--default .select2-selection--single .select2-selection__rendered{
  display: flex;
  align-items: center;
  gap: 8px;
  overflow: hidden;          /* CLAVE: impide que la imagen se salga */
}

/* Tamaño fijo del avatar cuando Select2 está en modo single */
.select2-container--default .select2-selection--single .select2-selection__rendered img.thumb{
  width: 24px !important;
  height: 24px !important;
  border-radius: 50% !important;
  object-fit: cover !important;
  flex: 0 0 auto;
}

/* =========================================================
   Reporte de ventas: métricas en una sola línea
   ========================================================= */

.metrics-inline{
  display: flex;
  flex-wrap: nowrap;
  gap: .75rem;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  padding-bottom: .25rem;
}

.metrics-inline .metric{
  flex: 0 0 auto;
  min-width: 110px;
  text-align: center;
  border: 1px solid rgba(0,0,0,.06);
  border-radius: 12px;
  background: #fff;
  padding: .5rem .65rem;
}

/* === Ventas: resaltado de estado en listado === */
.sales-card-updated {
  background-color: #ffffff;
  border-left: 4px solid #2ecc71;
}

.sales-card-pending {
  background-color: #fff8d6; /* amarillo clarito */
  border-left: 4px solid #f0c419;
}

.sales-card-never {
  background-color: #e8f1ff; /* azul clarito */
  border-left: 4px solid #0d6efd;
}

.sales-card-soldout {
  background-color: #fde8e8; /* rojo clarito */
  border-left: 4px solid #dc3545;
}

.badge-status-soldout {
  background-color: #dc3545 !important;
  color: #fff !important;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
}

.badge-status-no-data {
  background-color: #0d6efd !important;
  color: #fff !important;
  font-weight: 600;
}

/* Discográfica > Ingresos */
.cover-square {
  width: 56px;
  height: 56px;
  object-fit: cover;
  border-radius: 8px;
  border: 1px solid rgba(0,0,0,.08);
  background: #fff;
}

.income-table td {
  vertical-align: middle;
}

/* =========================================================
   Personal / nuevas secciones / bases de datos
   ========================================================= */
.user-nav-avatar{
  width: 36px;
  height: 36px;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid rgba(0,0,0,.08);
  background: #fff;
}

.user-nav-avatar--lg{
  width: 56px;
  height: 56px;
}

.user-nav-menu{
  min-width: 320px;
}

.home-user-card,
.personnel-card,
.media-card,
.metric-card,
.operations-card,
.invoice-preview-frame{
  border: 1px solid rgba(0,0,0,.06);
  background: #fff;
  border-radius: 18px;
}

.home-user-card{
  padding: 1.25rem;
}

.home-user-avatar{
  width: 92px;
  height: 92px;
  border-radius: 22px;
  object-fit: cover;
  border: 1px solid rgba(0,0,0,.08);
  background: #fff;
}

.metric-card{
  padding: 1rem;
  height: 100%;
}

.metric-card__value{
  font-size: 1.7rem;
  font-weight: 800;
  line-height: 1;
}

.metric-card__label{
  color: #6c757d;
  font-size: .95rem;
}

.quick-link-card,
.section-shortcut-card{
  display: block;
  border: 1px solid rgba(0,0,0,.06);
  background: #fff;
  border-radius: 16px;
  padding: 1rem;
  text-decoration: none;
  color: inherit;
  height: 100%;
  transition: transform .12s ease, box-shadow .12s ease;
}

.quick-link-card:hover,
.section-shortcut-card:hover,
.personnel-card:hover,
.media-card:hover{
  transform: translateY(-2px);
  box-shadow: 0 .75rem 1.4rem rgba(17,24,39,.08);
}

.personnel-card,
.media-card{
  display: block;
  text-decoration: none;
  color: inherit;
  padding: 1rem;
  height: 100%;
  transition: transform .12s ease, box-shadow .12s ease;
}

.personnel-card__avatar,
.media-card__logo{
  width: 64px;
  height: 64px;
  border-radius: 16px;
  object-fit: cover;
  border: 1px solid rgba(0,0,0,.08);
  background: #fff;
}

.media-card__logo{
  object-fit: contain;
}

.personnel-card__meta,
.media-card__meta{
  color: #6c757d;
  font-size: .92rem;
}

.access-table th,
.access-table td{
  vertical-align: middle;
}

.access-table .form-check-input:checked{
  background-color: #198754;
  border-color: #198754;
}

.invoice-preview-frame{
  min-height: 360px;
  overflow: hidden;
}

.invoice-preview-frame iframe,
.invoice-preview-frame embed,
.invoice-preview-frame object,
.invoice-preview-frame img{
  width: 100%;
  min-height: 360px;
  border: 0;
  object-fit: contain;
  background: #fff;
}

.operations-empty{
  border: 1px dashed rgba(0,0,0,.12);
  border-radius: 18px;
  background: rgba(248,249,250,.8);
  padding: 1.25rem;
}

.contact-chip{
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 999px;
  padding: .2rem .6rem;
  background: #fff;
  font-size: .83rem;
}

.media-history-item{
  border: 1px solid rgba(0,0,0,.06);
  border-radius: 16px;
  padding: .95rem 1rem;
  background: #fff;
}


.logo-country-wrap{
  position: relative;
  display: inline-block;
  line-height: 0;
}
.country-flag-badge{
  position: absolute;
  right: -6px;
  bottom: -6px;
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background: #fff;
  border: 1px solid rgba(0,0,0,.12);
  box-shadow: 0 2px 8px rgba(0,0,0,.14);
  font-size: 14px;
  line-height: 1;
  z-index: 2;
}
.select2-country-flag{
  display: inline-block;
  width: 1.8rem;
  margin-right: .35rem;
  text-align: center;
}
.marketing-option-card{
  cursor: pointer;
  border: 1px solid rgba(0,0,0,.12);
  border-radius: 16px;
  padding: 1rem;
  text-align: center;
  min-height: 120px;
  background: #fff;
  transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.marketing-option-card:hover,
.marketing-option-card:has(input:checked){
  border-color: var(--brand-primary, #0d6efd);
  box-shadow: 0 .5rem 1rem rgba(0,0,0,.08);
  transform: translateY(-1px);
}
.marketing-option-card input{ margin-bottom: .5rem; }
.marketing-option-card i{ font-size: 1.65rem; display: block; margin-bottom: .5rem; }
.marketing-action-card{
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 18px;
  background: #fff;
  padding: 1rem;
}
.marketing-action-card.is-unconsolidated{
  background: #f8f9fa;
}
.marketing-split-euro{
  display:inline-flex;
  width: 28px;
  height: 28px;
  align-items:center;
  justify-content:center;
  border-radius:999px;
  border:1px solid rgba(0,0,0,.08);
  background:#fff7e6;
}

/* =========================================================
   Correcciones generales 2026-05-29
   ========================================================= */
:root{ --default-photo-bg:#f3f4f6; --default-photo-fg:#c4c8cf; }
/* OJO: NO añadir fondo a img[data-default-photo="1"] — ese atributo lo llevan también fotos y LOGOS
   reales (marca «candidata a fallback»), y el fondo gris se veía detrás de los logos transparentes.
   Los placeholders de persona ya no necesitan fondo: van OCULTOS (política «hueco omitido»). */
.default-photo-bg,
img.default-photo{
  background: var(--default-photo-bg) !important;
}
/* Imagen sustituida por el placeholder (fallback): conserva SIEMPRE la caja del hueco en el que
   está — mismo ancho/alto que la imagen original, sin padding. El padding:10% anterior se calculaba
   sobre el ANCHO DEL CONTENEDOR y en imágenes sin ancho fijo (logos de vinculaciones, personal…)
   inflaba la imagen hasta un "cuadrado gris grande" que además aplastaba el texto de al lado. */
.image-fallback{
  background: var(--default-photo-bg) !important;
  object-fit: cover !important;
}
/* POLÍTICA GLOBAL: si alguien/algo NO tiene imagen o logo, el hueco SE OMITE (no se enseña el avatar
   gris de persona) — solo las PORTADAS conservan su placeholder (cover_placeholder.svg, que no matchea
   esta regla). Cubre tanto lo renderizado por el servidor («x or DEFAULT_PHOTO_URL») como lo que el JS
   sustituye tras agotar los reintentos. Excepción puntual: data-placeholder-ok="1" lo mantiene visible. */
img[src*="/img/placeholder_photo"]:not([data-placeholder-ok]){ display: none !important; }
/* …y si la imagen omitida vivía en el marco de avatar del panel de vinculaciones, se omite el marco
   entero (si no, quedaba un hueco redondo vacío). */
.entity-link-avatar:has(> img[src*="/img/placeholder_photo"]:not([data-placeholder-ok])){ display: none; }
/* Imagen que ha fallado y aún no ha sido procesada por initImageFallbacks (capturador temprano del
   <head>): invisible pero conservando su caja — nunca se ve el icono roto del navegador. */
img.img-error-pending{ visibility: hidden; }

/* Los menús de tres puntos deben mostrarse por encima de tablas, cards y modales. */
.dropdown-menu{ z-index: 3000 !important; }
.modal .dropdown-menu{ z-index: 4000 !important; }
.card,
.card-body,
.list-group,
.list-group-item,
.table-responsive.dropdown-friendly,
.dropdown{ overflow: visible; }
.table-responsive .dropdown{ position: static; }
.table-responsive .dropdown-menu{ position: fixed !important; }

/* Tarjetas visuales seleccionables del asistente de actividad. */
.activity-choice-card,
.visual-choice-card{
  cursor: pointer;
  transition: border-color .12s ease, box-shadow .12s ease, background-color .12s ease, transform .12s ease;
}
.activity-choice-card:hover,
.visual-choice-card:hover{
  border-color: var(--brand-primary) !important;
  box-shadow: 0 .25rem .8rem rgba(0,0,0,.08);
  transform: translateY(-1px);
}
.activity-choice-card.is-selected,
.visual-choice-card.is-selected{
  border-color: var(--brand-primary) !important;
  box-shadow: 0 0 0 .18rem rgba(13,110,253,.16);
  background: #f8fbff !important;
}

/* Menú superior con orden por uso y desbordamiento controlado. */
.navbar-nav-primary{ min-width: 0; flex-wrap: nowrap; }
.navbar-nav-primary > .nav-item{ white-space: nowrap; }
.nav-overflow-dropdown.d-none{ display:none !important; }
.nav-overflow-dropdown .dropdown-menu{ max-height: calc(100vh - 90px); overflow:auto; }
@media (min-width: 992px){
  #navMain{ min-width:0; }
  #navMain .navbar-nav-primary{ overflow: visible; }
}

/* Recintos en modo visualización. */
.venue-card-link{ color: inherit; text-decoration: none; }
.venue-card-link:hover{ color: inherit; text-decoration: none; }
.venue-card-link:hover .venue-card{ box-shadow: 0 .5rem 1.1rem rgba(0,0,0,.08); transform: translateY(-1px); }
.venue-card{ transition: box-shadow .12s ease, transform .12s ease; }

/* =========================================================
   Hoja de ruta + One-sheet 2026-05-29
   ========================================================= */
.social-links-strip{display:flex;gap:.45rem;align-items:center;flex-wrap:wrap;margin-top:.45rem;}
.social-link-icon{width:34px;height:34px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:#fff;border:1px solid rgba(0,0,0,.08);text-decoration:none;color:#111;}
.social-link-icon:hover{transform:translateY(-1px);box-shadow:0 .25rem .7rem rgba(0,0,0,.08);}
.platform-instagram{color:#c13584}.platform-facebook{color:#1877f2}.platform-tiktok{color:#111}.platform-x{color:#111}.platform-youtube{color:#ff0000}.platform-spotify{color:#1db954}.platform-apple{color:#111}.platform-amazon{color:#00a8e1}.platform-bandsintown{color:#00b4b3}
.onesheet-toolbar{position:relative;z-index:3;}
.onesheet-preview{border-radius:24px;overflow:hidden;border:1px solid rgba(0,0,0,.08);background:#fff;}
.onesheet-hero{min-height:360px;background-size:cover;background-position:center;position:relative;display:flex;align-items:flex-end;padding:2rem;color:#fff;}
.onesheet-hero:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,.55) 100%);}
.onesheet-hero-content{position:relative;z-index:1;width:100%;}
.onesheet-title{font-size:clamp(2.3rem,6vw,5rem);font-weight:900;line-height:.95;text-shadow:0 8px 26px rgba(0,0,0,.25);}
.onesheet-stats{display:flex;gap:.75rem;flex-wrap:wrap;margin-top:1rem;}
.onesheet-stat{background:rgba(255,255,255,.94);color:#111;border-radius:18px;padding:.7rem .9rem;min-width:135px;box-shadow:0 8px 24px rgba(0,0,0,.12);}
.onesheet-stat strong{font-size:1.15rem;display:block;}
.onesheet-body{padding:2rem;}
.onesheet-section{margin-bottom:2rem;}
.onesheet-section h5{font-weight:800;margin-bottom:1rem;}
.onesheet-bio{max-width:760px;margin:0 auto;text-align:justify;line-height:1.75;}
.onesheet-award{display:flex;gap:.75rem;align-items:center;border-bottom:1px solid rgba(0,0,0,.08);padding:.7rem 0;}
.onesheet-award img{width:42px;height:42px;object-fit:contain;border-radius:10px;background:#f8f9fa;}
.onesheet-release-cover{width:120px;height:120px;border-radius:18px;object-fit:cover;}
.onesheet-video-thumb{aspect-ratio:16/9;background-size:cover;background-position:center;border-radius:16px;display:grid;place-items:center;overflow:hidden;}
.onesheet-video-thumb a{width:48px;height:48px;border-radius:999px;background:#ff0000;color:#fff;display:grid;place-items:center;text-decoration:none;box-shadow:0 6px 18px rgba(0,0,0,.18);}
.onesheet-gallery img{width:100%;height:170px;object-fit:cover;border-radius:16px;}
.onesheet-press{border:1px solid rgba(0,0,0,.08);border-radius:18px;padding:.8rem;height:100%;background:#fff;}
.onesheet-press img{width:100%;height:130px;object-fit:cover;border-radius:14px;margin-bottom:.7rem;}
.onesheet-contact{border-left:1px solid currentColor;padding-left:1rem;min-height:100%;}
.onesheet-footer-logos img{max-height:48px;max-width:160px;object-fit:contain;}
.tour-card{border:1px solid rgba(0,0,0,.08);border-radius:20px;background:#fff;padding:1rem;transition:box-shadow .12s ease,transform .12s ease;}
.tour-card:hover{box-shadow:0 .55rem 1.2rem rgba(0,0,0,.08);transform:translateY(-1px);}
.tour-card-img{width:68px;height:68px;border-radius:18px;object-fit:cover;background:#f3f4f6;border:1px solid rgba(0,0,0,.06);}
@media print{.onesheet-toolbar{display:none!important}.onesheet-preview{border:0!important;box-shadow:none!important;border-radius:0}.onesheet-body{padding:1rem}}
/* ===== Hoja de ruta v2 (Agenda / Logística / Hoteles / Personal) ===== */
.rm-panel{--rm-line:#e33d48;}
.rm-nav{display:flex;gap:.4rem;flex-wrap:wrap;margin-bottom:1rem;}
.rm-nav button{border:1px solid rgba(0,0,0,.1);background:#fff;border-radius:999px;padding:.45rem .95rem;font-weight:600;color:#495057;display:inline-flex;align-items:center;gap:.4rem;font-size:.9rem;}
.rm-nav button i{opacity:.8;}
.rm-nav button.active{background:var(--brand-accent,#007ca2);border-color:var(--brand-accent,#007ca2);color:#fff;}
.rm-toolbar{display:flex;justify-content:space-between;align-items:center;gap:.6rem;flex-wrap:wrap;margin-bottom:.8rem;}
.rm-add{border:0;border-radius:999px;background:var(--brand-primary,#e33d48);color:#fff;font-weight:600;padding:.45rem .9rem;display:inline-flex;align-items:center;gap:.4rem;}
.rm-add.sm{padding:.3rem .7rem;font-size:.85rem;}
.rm-empty{color:#8a9099;text-align:center;padding:2.2rem 1rem;border:1px dashed #d4d9df;border-radius:16px;background:#fbfcfd;}

/* Tira de días tipo calendario */
.rm-agenda{display:flex;flex-direction:column;gap:1.1rem;}
.rm-dayblock{border:1px solid rgba(0,0,0,.07);border-radius:18px;background:#fff;overflow:hidden;}
.rm-dayblock.rm-dragover{outline:2px dashed var(--brand-accent,#007ca2);outline-offset:-4px;}
.rm-dayhead{display:flex;align-items:center;gap:.8rem;padding:.7rem .95rem;border-bottom:1px solid rgba(0,0,0,.06);background:#f8f9fb;}
.rm-cal{width:52px;flex:0 0 auto;border-radius:12px;overflow:hidden;border:1px solid rgba(0,0,0,.1);text-align:center;background:#fff;}
.rm-cal .wd{display:block;background:var(--brand-primary,#e33d48);color:#fff;font-size:.62rem;font-weight:700;text-transform:uppercase;padding:.12rem 0;letter-spacing:.04em;}
.rm-cal .num{display:block;font-size:1.25rem;font-weight:800;line-height:1.1;padding-top:.1rem;}
.rm-cal .mo{display:block;font-size:.62rem;color:#6c757d;text-transform:uppercase;padding-bottom:.15rem;font-weight:700;}
.rm-dayhead .lbl{font-weight:700;}
.rm-dayitems{padding:.5rem .6rem .7rem;display:flex;flex-direction:column;gap:.5rem;min-height:16px;}

/* Item de agenda */
.rm-item{display:grid;grid-template-columns:42px 1fr auto;gap:.7rem;align-items:start;border:1px solid rgba(0,0,0,.07);border-left:5px solid var(--rm-line);border-radius:14px;padding:.6rem .75rem;background:#fff;cursor:pointer;position:relative;}
.rm-item.provisional{background:repeating-linear-gradient(45deg,#fffdf3,#fffdf3 10px,#fff8dd 10px,#fff8dd 20px);border-style:dashed;}
.rm-item.cancelled{opacity:.6;}
.rm-item.cancelled .rm-title{text-decoration:line-through;}
.rm-item.dragging{opacity:.4;}
.rm-ico{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:.9rem;background:var(--rm-line);}
.rm-item .rm-time{font-weight:700;font-size:.9rem;color:#212529;}
.rm-item .rm-time .tbc{color:#b8860b;}
.rm-title{font-weight:600;}
.rm-sub{font-size:.82rem;color:#6c757d;}
.rm-tags{display:flex;gap:.3rem;flex-wrap:wrap;margin-top:.2rem;}
.rm-tag{font-size:.7rem;font-weight:700;border-radius:6px;padding:.05rem .4rem;background:#eef1f4;color:#495057;text-transform:uppercase;letter-spacing:.02em;}
.rm-tag.live{background:#ffe3e5;color:#c62330;}
.rm-tag.sing{background:#e5f3ff;color:#0d6efd;}
.rm-tag.plus1{background:#e9f7ef;color:#198754;}
.rm-tag.tbc{background:#fff3cd;color:#997404;}
.rm-item .rm-meta{display:flex;gap:.5rem;align-items:center;color:#adb5bd;font-size:.8rem;}
.rm-transport-line{display:flex;align-items:center;gap:.45rem;font-size:.83rem;color:#495057;margin-top:.15rem;flex-wrap:wrap;}
.rm-transport-line img{height:16px;max-width:52px;object-fit:contain;}

/* Hoteles */
.rm-hotel{display:flex;gap:.9rem;border:1px solid rgba(0,0,0,.08);border-radius:16px;padding:.8rem;background:#fff;position:relative;}
.rm-hotel .ph{width:110px;height:82px;border-radius:12px;object-fit:cover;background:#f1f3f5;flex:0 0 auto;}
.rm-stars{color:#f5b301;font-size:.8rem;}
.rm-hotel .rm-menu{position:absolute;top:.5rem;right:.5rem;}

/* Personal */
.rm-group-title{font-weight:700;color:#6c757d;text-transform:uppercase;font-size:.72rem;letter-spacing:.04em;margin:.9rem 0 .35rem;}
.rm-person{display:flex;align-items:center;gap:.7rem;border:1px solid rgba(0,0,0,.07);border-radius:12px;padding:.5rem .7rem;background:#fff;}
.rm-person .av{width:40px;height:40px;border-radius:50%;object-fit:cover;background:#e9ecef;display:grid;place-items:center;color:#adb5bd;flex:0 0 auto;}
.rm-person .nm{font-weight:600;}
.rm-person .rl{font-size:.8rem;color:#6c757d;}
.rm-person .ct{font-size:.8rem;color:#6c757d;}

/* Adjuntos / choices / pickers */
.rm-att{display:inline-flex;align-items:center;gap:.4rem;background:#f1f3f5;border-radius:8px;padding:.2rem .5rem;font-size:.82rem;margin:.2rem .3rem .2rem 0;}
.rm-choice-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.55rem;}
.rm-choice{border:1px solid rgba(0,0,0,.1);border-radius:14px;background:#fff;padding:.8rem .5rem;text-align:center;cursor:pointer;display:flex;flex-direction:column;gap:.35rem;align-items:center;}
.rm-choice:hover{border-color:var(--brand-accent,#007ca2);background:#f7fcfe;}
.rm-choice i{font-size:1.4rem;}
.rm-result{display:flex;align-items:center;gap:.55rem;padding:.4rem .5rem;border-radius:10px;cursor:pointer;}
.rm-result:hover{background:#f1f3f5;}
.rm-result img,.rm-result .noimg{width:30px;height:30px;border-radius:50%;object-fit:cover;background:#e9ecef;display:grid;place-items:center;color:#adb5bd;flex:0 0 auto;}
.rm-chip{display:inline-flex;align-items:center;gap:.4rem;background:#eef4f7;border:1px solid #d5e6ec;border-radius:999px;padding:.25rem .6rem;font-size:.85rem;}
.rm-song{display:flex;align-items:center;gap:.5rem;border:1px solid rgba(0,0,0,.08);border-radius:10px;padding:.35rem .5rem;background:#fff;cursor:grab;}
.rm-song.dragging{opacity:.4;}
.rm-song img{width:30px;height:30px;border-radius:6px;object-fit:cover;background:#e9ecef;flex:0 0 auto;}
.rm-song .h{color:#ced4da;cursor:grab;}
.rm-pass{display:grid;grid-template-columns:1fr auto;gap:.5rem;align-items:center;border:1px solid rgba(0,0,0,.08);border-radius:10px;padding:.4rem .55rem;margin-bottom:.4rem;}
/* Configurador de días (rueda ⚙): mini-calendario multi-selección */
.rm-calgrid{display:grid;grid-template-columns:repeat(7,1fr);gap:.25rem;}
.rm-calwd{text-align:center;font-size:.72rem;font-weight:700;color:#98a2b3;padding-bottom:.2rem;}
.rm-calcell{aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;gap:.2rem;border:1px solid rgba(0,0,0,.08);border-radius:8px;cursor:pointer;font-size:.85rem;user-select:none;transition:background .12s,border-color .12s;}
.rm-calcell:hover{border-color:var(--brand-primary,#e33d48);}
.rm-calcell.on{background:var(--brand-primary,#e33d48);border-color:var(--brand-primary,#e33d48);color:#fff;font-weight:600;}
.rm-calcell.locked{cursor:not-allowed;}
.rm-calcell.locked.on{background:#8a95a5;border-color:#8a95a5;}
.rm-calcell.locked .fa-lock{font-size:.62rem;opacity:.85;}
@media print{.rm-nav,.rm-add,.rm-item .rm-menu,.rm-hotel .rm-menu{display:none!important}}

/* Hotfix 2026-05-29: dropdowns portaled to body so 3-dot menus are never clipped by cards/list rows. */
.dropdown-menu-portal-active{
  position: fixed !important;
  z-index: 12000 !important;
  display: block !important;
  max-height: calc(100vh - 24px);
  overflow: auto;
  box-shadow: 0 .75rem 2rem rgba(15,23,42,.18);
}
.dropdown-menu-portal-placeholder{display:none!important;}

/* Recintos: nombres largos en tarjetas/listados visuales. */
.venue-card-title,
.venue-name-truncate{
  display:block;
  min-width:0;
  max-width:100%;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.venue-search-card{cursor:pointer;}

/* Invitaciones */
.invitation-panel { border-radius: 1.2rem; }
.artist-chip { display:inline-flex; align-items:center; gap:.35rem; border:1px solid #e3e6eb; border-radius:999px; padding:.18rem .55rem; background:#fff; font-size:.84rem; color:#1e2530; }
.artist-chip img, .tiny-avatar { width:24px; height:24px; object-fit:cover; border-radius:50%; background:#eef0f3; }
.tiny-avatar { width:18px; height:18px; }
.artist-avatar-inline{ width:22px; height:22px; object-fit:cover; border-radius:50%; vertical-align:middle; border:1px solid #eee; background:#eef0f3; margin-right:.15rem; }
/* Mini-ficha de vínculos: logo/foto pequeña de lo vinculado + relación/cargo, bajo el nombre */
.linked-mini{ display:flex; flex-direction:column; gap:1px; margin-top:2px; min-width:0; }
.linked-mini-item{ display:inline-flex; align-items:center; gap:.3rem; font-size:.72rem; line-height:1.25; color:#6b7280; min-width:0; max-width:100%; }
.linked-mini-item img{ height:16px; width:16px; flex:0 0 auto; }
.linked-mini-item img.is-photo{ border-radius:50%; object-fit:cover; background:#eef0f3; border:1px solid #eef0f3; }
.linked-mini-item img.is-logo{ width:auto; max-width:40px; object-fit:contain; background:transparent; }
.linked-mini-text{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
.linked-mini-text b{ color:#374151; font-weight:600; }
.linked-mini-more{ font-size:.68rem; color:#9aa0a6; }
/* Vínculo del invitado en listas de invitaciones (logo pequeño + relación, bajo el nombre) */
.invitation-linked-mini{ display:inline-flex; align-items:center; gap:.3rem; margin-top:2px; font-size:.72rem; line-height:1.25; color:#6b7280; max-width:100%; }
.invitation-linked-mini img{ height:16px; width:16px; flex:0 0 auto; }
.invitation-linked-mini img.is-photo{ border-radius:50%; object-fit:cover; background:#eef0f3; border:1px solid #eef0f3; }
.invitation-linked-mini img.is-logo{ width:auto; max-width:40px; object-fit:contain; background:transparent; }
/* Asignación EN PROCESO (sin guardar): AMARILLO. La previsualización mientras arrastras es amarillo
   punteado; una butaca ya elegida en esta sesión (staged) es amarillo sólido. Se diferencia así de
   las butacas ya asignadas ANTES (que van con el color y la foto del invitado). Al guardar/recargar
   todo pasa al aspecto normal. */
.invitation-seat.is-drag-sel{ outline:2px dashed #e0a800; outline-offset:1px; background:#fff3cd !important; border-color:#e0a800 !important; color:#7a5b00 !important; }
.invitation-seat.is-drag-sel i, .invitation-seat.is-drag-sel span{ color:#7a5b00 !important; }
.invitation-seat.is-staged{ background:#ffdf7e !important; border-color:#e0a800 !important; color:#7a5b00 !important; }
.invitation-seat.is-staged i, .invitation-seat.is-staged span{ color:#7a5b00 !important; }
/* Identidad sobre el plano MIENTRAS se asigna: la butaca amarilla lleva dentro la foto/logo del
   invitado (se oculta el icono de butaca) y sobre el primer asiento de cada tramo va una
   etiquetita con foto + nombre + logo del vínculo. */
.invitation-seat{ position:relative; }
.invitation-seat.is-staged.has-staged-photo > i{ display:none; }
/* FRANJA de propietario en el ASIGNADOR (idéntica a los bloques del mapa: nombre + logo del vínculo
   y línea de color abarcando todo el tramo). Se dibuja por JS sobre butacas amarillas (en proceso)
   y sobre las ya asignadas/enviadas. Las filas reservan hueco arriba para la franja. */
#assignAllModal .invitation-seat-row{ padding-top: 1.15rem; }
#assignAllModal .invitation-seat-grid--line{ position: relative; }
.seat-owner-strip{ position:absolute; z-index:4; pointer-events:none; display:flex; flex-direction:column; }
.seat-owner-strip .invitation-seat-block-name{ width:100%; min-width:0; }
.seat-owner-strip .invitation-seat-block-line{ width:100%; }
.invitation-linked-mini span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
/* Solicitudes pedidas para OTRA persona de la oficina (vista de solo lectura en "Mis solicitudes") */
.invitation-office-row{ border-left:3px solid var(--brand-accent); background:rgba(0,124,162,.045); }
/* Materiales de canción (rediseño) */
.mat-module{ border:1px solid #e9ecef; border-radius:.6rem; padding:.6rem .75rem; background:#fff; }
.mat-module__head{ display:flex; align-items:center; justify-content:space-between; gap:.5rem; flex-wrap:wrap; margin-bottom:.4rem; }
.mat-file{ display:flex; align-items:center; justify-content:space-between; gap:.75rem; flex-wrap:wrap; }
.mat-file__main{ display:flex; align-items:center; gap:.6rem; flex-wrap:wrap; min-width:0; flex:1; }
.mat-file__name{ font-size:.85rem; color:#1e2530; word-break:break-word; }
.mat-file__audio{ height:34px; max-width:240px; }
.mat-stemfile{ display:flex; align-items:center; justify-content:space-between; gap:.6rem; flex-wrap:wrap; padding:.25rem 0; border-top:1px dashed #eef0f3; }
.mat-stemfile:first-child{ border-top:0; }
.mat-stemfile__name{ font-size:.82rem; color:#3a424d; word-break:break-word; }
.mat-empty{ font-size:.82rem; color:#8a94a6; }
.mat-subhead{ font-size:.72rem; letter-spacing:.04em; text-transform:uppercase; color:#8a94a6; margin-bottom:.4rem; }
.mat-cover{ position:relative; border:1px solid #e9ecef; border-radius:.7rem; padding:.75rem; display:flex; align-items:center; gap:.75rem; min-height:96px; background:#fff; }
.mat-cover__img{ width:84px; height:84px; object-fit:cover; border-radius:.6rem; border:1px solid #eee; }
.mat-cover__placeholder{ width:84px; height:84px; border-radius:.6rem; border:1px dashed #d4d9e0; display:flex; align-items:center; justify-content:center; color:#c2c8d2; font-size:1.5rem; }
.mat-cover__body{ flex:1; min-width:0; }
.mat-cover__badge{ position:absolute; top:.5rem; right:.5rem; font-size:.68rem; font-weight:600; padding:.1rem .45rem; border-radius:999px; background:#eef0f3; color:#6b7280; }
.mat-cover__badge--main{ background:var(--brand-primary, #E33D48); color:#fff; }
.invitation-manage-list { display:flex; flex-direction:column; gap:.75rem; }
.invitation-manage-row { display:block; color:inherit; border:1px solid #e3e6eb; border-radius:1rem; padding:1rem; background:#fff; transition:box-shadow .15s ease, transform .15s ease; }
.invitation-manage-row:hover { color:inherit; transform:translateY(-1px); box-shadow:0 8px 24px rgba(20,25,35,.08); }
.invitation-counts { display:grid; grid-template-columns:repeat(4,minmax(82px,1fr)); gap:.5rem; min-width:min(100%, 460px); }
.invitation-counts > div { border:1px solid #e6e9ee; border-radius:.8rem; padding:.6rem .7rem; text-align:center; background:#fafafa; }
.invitation-counts span { display:block; font-size:1.35rem; font-weight:800; line-height:1; }
.invitation-counts small { display:block; color:#697280; margin-top:.25rem; }
.invitation-counts--large span { font-size:1.55rem; }
.invitation-category-card, .invitation-home-card, .invitation-public-info { border:1px solid #e4e7ec; border-radius:1rem; padding:1rem; background:#fff; }
.invitation-public-info { display:flex; flex-direction:column; gap:.2rem; height:100%; background:#fafafa; }
.invitation-ticket-module { border-radius:1rem; }
.invitation-seat-grid { display:flex; flex-wrap:wrap; gap:.5rem; align-items:flex-end; min-width:0; max-width:100%; }
.invitation-seat { display:inline-flex; align-items:center; gap:.35rem; padding:.45rem .6rem; border-radius:.65rem; border:1px solid #dfe4ea; text-decoration:none; font-size:.85rem; }
.invitation-seat--available { color:#16803a; background:#effaf2; }
.invitation-seat--assigned { color:#8a6800; background:#fff7d6; }
.invitation-seat--sent, .invitation-seat--delivered, .invitation-seat--picked_up { color:#b42318; background:#fff1f0; }
.invitation-seat--lost { color:#6b7280; background:#eef0f3; border-style:dashed; text-decoration:line-through; opacity:.75; }
/* Bloqueada: no cuenta como disponible ni se puede asignar/enviar/imprimir hasta desbloquearla. */
.invitation-seat--blocked { color:#374151; background:#e2e5ea; border-color:#9ca3af; }
/* Simulador · módulo Resultados: título de subsección (Comisionistas / Gastos) */
.simp-sec { font-weight:700; font-size:.92rem; color:#111; border-top:1px solid #eef0f2; padding-top:.65rem; margin-bottom:.35rem; }
.simp-sec i { color:var(--brand-accent, #007CA2); }
/* Fusión de duplicados (bases de datos) */
.merge-fab { position:absolute; top:.45rem; right:.55rem; z-index:3; }
.merge-fab .btn { --bs-btn-padding-y:.12rem; --bs-btn-padding-x:.45rem; }
.merge-surv { transition:.15s ease; }
.merge-surv.is-picked { border-color:#16a34a !important; box-shadow:0 0 0 .18rem rgba(22,163,74,.15); }
.merge-val { border:1px solid #e3e7ec; background:#fff; border-radius:.5rem; padding:.3rem .55rem; font-size:.88rem; word-break:break-word; }
.merge-val.is-picked { border-color:#E33D48; background:#fdeced; box-shadow:inset 0 0 0 1px #E33D48; }
.merge-val--empty { background:#f8f9fa; }
.invitation-seat.is-pending { opacity:.5; pointer-events:none; }
#inv-tab-tickets.is-selecting { -webkit-user-select:none; user-select:none; }
#inv-tab-tickets.is-selecting .invitation-seat[data-ticket-id] { cursor:pointer; touch-action:none; }
.invitation-seat.is-checked { outline:3px solid #007CA2; outline-offset:1px; box-shadow:0 0 0 .14rem rgba(0,124,162,.3); }
.invitation-bulk-bar { position:sticky; top:.5rem; z-index:6; background:#fff; }
.invitation-option-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:.75rem; }
.invitation-option, .invitation-event-option, .invitation-icon-option, .invitation-radio-option { border:1px solid #dfe4ea; border-radius:1rem; background:#fff; padding:.85rem; cursor:pointer; transition:.15s ease; text-align:left; color:#18202b; }
.invitation-option:hover, .invitation-event-option:hover, .invitation-icon-option:hover, .invitation-radio-option:hover, .invitation-option.is-selected, .invitation-event-option.is-selected, .invitation-icon-option.is-selected { border-color:#e83b4b; box-shadow:0 0 0 .18rem rgba(232,59,75,.12); }
.invitation-option img { width:46px; height:46px; border-radius:50%; object-fit:cover; background:#eef0f3; display:block; margin-bottom:.45rem; }
.invitation-icon-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(145px,1fr)); gap:.75rem; }
.invitation-icon-option, .invitation-radio-option { display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; min-height:104px; gap:.5rem; }
.invitation-icon-option i, .invitation-radio-option i { font-size:1.8rem; color:#e83b4b; }
.invitation-radio-option input { position:absolute; opacity:0; pointer-events:none; }
.invitation-radio-option:has(input:checked) { border-color:#e83b4b; box-shadow:0 0 0 .18rem rgba(232,59,75,.12); }
/* Dropzone de subida de invitaciones (arrastrar PDFs o pinchar para seleccionar) */
.inv-dropzone { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:.3rem; border:2px dashed #cfd6de; border-radius:1rem; background:#fbfcfd; padding:1.5rem 1rem; text-align:center; cursor:pointer; transition:.15s ease; color:#42505f; margin:0; width:100%; }
.inv-dropzone:hover { border-color:#e83b4b; background:rgba(232,59,75,.04); }
.inv-dropzone.file-drop-hover, .inv-dropzone.is-dragover { border-color:#e83b4b; background:rgba(232,59,75,.08); box-shadow:0 0 0 .2rem rgba(232,59,75,.12); }
.inv-dropzone > i { font-size:2rem; color:#e83b4b; }
.inv-dropzone__title { font-weight:700; }
.inv-dropzone__hint { font-size:.82rem; color:#6c757d; }
.inv-dropzone__browse { color:#e83b4b; text-decoration:underline; font-weight:600; }
.inv-file-chip { display:inline-flex; align-items:center; gap:.35rem; background:#f1f3f5; border:1px solid #e9ecef; border-radius:.6rem; padding:.2rem .5rem; margin:.2rem .25rem 0 0; font-size:.8rem; max-width:100%; }
.inv-file-chip i { color:#e83b4b; flex:0 0 auto; }
.inv-file-chip span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* Zona de categoría en «Invitaciones» resaltada al arrastrarle PDFs encima */
.invitation-ticket-module.is-catdrop { outline:2px dashed #e83b4b; outline-offset:3px; background:rgba(232,59,75,.05); }
.inv-catdrop-hint { display:none; margin-top:.5rem; padding:.4rem .6rem; border-radius:.6rem; background:rgba(232,59,75,.08); border:1px dashed #e83b4b; color:#b42318; font-size:.82rem; font-weight:600; }
.invitation-ticket-module.is-catdrop .inv-catdrop-hint { display:block; }
.invitation-event-picker { display:flex; flex-direction:column; gap:.65rem; max-height:55vh; overflow:auto; padding-right:.25rem; }
.invitation-event-option { width:100%; display:flex; justify-content:space-between; align-items:center; gap:1rem; }
.public-invitation-page { background:#f6f7f9; }
.public-invitation-shell { background:#fff; border-radius:1.5rem; padding:clamp(1rem,3vw,2rem); box-shadow:0 16px 48px rgba(20,25,35,.08); }
.public-invitation-logo { max-height:58px; max-width:190px; object-fit:contain; }
.dropdown-menu { z-index: 5000 !important; }
@media (max-width: 768px) { .invitation-counts { grid-template-columns:repeat(2,1fr); min-width:100%; } .invitation-event-option { align-items:flex-start; } }

/* Invitaciones · correcciones 2026-06 */
.invitation-availability-fixed { position: relative; z-index: 2; }
.dropdown-menu-app33, .dropdown-menu { z-index: 3000; }
.invitation-search-picker { position: relative; }
.invitation-search-results { display: flex; flex-direction: column; gap: .35rem; margin-top: .5rem; max-height: 260px; overflow: auto; }
.invitation-search-result { width: 100%; display: flex; align-items: center; gap: .65rem; padding: .55rem .7rem; border: 1px solid #e2e6ec; border-radius: .8rem; background: #fff; text-align: left; }
.invitation-search-result:hover { border-color: #e83b4b; box-shadow: 0 0 0 .16rem rgba(232,59,75,.1); }
.invitation-search-result img { width: 38px; height: 38px; border-radius: 50%; object-fit: cover; background: #eef0f3; }
.invitation-search-result small { display: block; color: #6b7280; }
.invitation-ticket-thumb { width: 54px; height: 54px; border-radius: 1rem; display: grid; place-items: center; background: #fff1f2; color: #e83b4b; font-size: 1.4rem; }
.invitation-sector { border: 1px solid #e4e8ee; border-radius: 1rem; padding: .9rem; background: #f1f4f8; max-width: 100%; overflow-x: auto; }
/* Cada fila como una tarjeta blanca dentro de la caja del sector: separadas visualmente pero
   claramente agrupadas bajo el mismo sector. */
.invitation-seat-row { display: grid; grid-template-columns: minmax(70px, 110px) 1fr auto; gap: .75rem; align-items: center; padding: .55rem .7rem; margin-bottom: .55rem; background: #fff; border: 1px solid #e9edf2; border-radius: .75rem; }
.invitation-seat-row:last-child { margin-bottom: 0; }
.invitation-row-label { font-weight: 700; color: #49515d; }
/* Butaca asignada/enviada: borde inferior con el color del invitado + chip debajo de la fila. */
.invitation-seat--owned { border-color: var(--asg, #999); }
/* Bloque de butacas del mismo invitado: nombre + línea fina de color ENCIMA uniéndolas. */
.invitation-seat-block { display: inline-flex; flex-direction: column; align-items: stretch; gap: .12rem; vertical-align: bottom; max-width: 100%; }
.invitation-seat-block-name { width: 0; min-width: 100%; box-sizing: border-box; text-align: center; font-size: .66rem; font-weight: 600; color: var(--asg, #555); line-height: 1.1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0 .15rem; }
.invitation-seat-block-line { width: 100%; height: 3px; border-radius: 3px; background: var(--asg, #999); }
.inv-seat-block-linklogo { height:12px; width:auto; max-width:22px; vertical-align:-2px; margin:0 2px; object-fit:contain; }
.inv-seat-block-linklogo.is-photo { height:13px; width:13px; border-radius:50%; object-fit:cover; }
.invitation-seat-block-seats { display: flex; gap: .35rem; flex-wrap: wrap; }
/* Contadores de sin numerar (Pista/Grada): clicables, despliegan el detalle. */
.inv-unnum-count { cursor: pointer; border: 0; font-size: .82rem; padding: .45rem .7rem; }
.inv-unnum-count.active { box-shadow: 0 0 0 2px rgba(0,0,0,.18) inset; }
/* Personas en una fila de invitación (invitado / a quién se envía / quién la pidió): compacto. */
.invitation-people { font-size: .82rem; row-gap: .25rem; }
.inv-person { display: inline-flex; align-items: center; gap: .3rem; min-width: 0; }
.inv-person > a, .inv-person > strong, .inv-person > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.inv-person-ava { width: 20px; height: 20px; flex: 0 0 auto; object-fit: cover; background: #eef0f3; border: 1px solid #eef0f3; }
.inv-person-ava.is-photo { border-radius: 50%; }
.inv-person-ava.is-logo { width: auto; max-width: 34px; border-radius: 4px; object-fit: contain; background: transparent; border: 0; }
.inv-person-sep { color: #c4c9d0; }
/* Listado de peticiones (pestaña Invitados): tarjetas separadas y más legibles. */
.inv-request-list { display: flex; flex-direction: column; gap: .6rem; }
.inv-request-list .list-group-item { border: 1px solid #e6e8ec; border-radius: 12px; margin-top: 0; box-shadow: 0 1px 2px rgba(16,24,40,.04); }
.inv-name-line { row-gap: .3rem; }
.inv-name-line .invitation-linked-mini { margin-top: 0; }
.inv-qty-badge { background: #495057; color: #fff; }         /* nº de entradas en gris oscuro (no rojo) */
/* Cabeceras de sección (Compromisos / Peticiones / listado de invitaciones): mismo aspecto y tamaños,
   y en móvil los botones ocupan el ancho para que queden alineados y no apretados. */
.inv-section-head h5 { font-size: 1.05rem; }
.inv-section-head .btn { white-space: nowrap; }
@media (max-width: 575.98px) {
  .inv-section-head { align-items: stretch; }
  .inv-section-head > div { width: 100%; }
  .inv-section-head .btn, .inv-section-head form { flex: 1 1 auto; }
  .inv-section-head form .btn { width: 100%; }
}
/* Leaflet (GLOBAL): evita que reglas de <img> de la app deformen los tiles y hagan que el mapa
   salga "desperdigado" en cuadrados fuera de su sitio (simulaciones, cuadrantes, mapa de recinto…). */
.leaflet-container img { max-width: none !important; max-height: none !important; }
.leaflet-container .leaflet-tile,
.leaflet-container .leaflet-marker-icon,
.leaflet-container .leaflet-image-layer { max-width: none !important; }
/* Red de seguridad: si por lo que sea una imagen del mapa recibiera las clases del sistema de
   fallback de imágenes, NUNCA debe ocultarse ni pintarse el fondo gris (dejaría el mapa en gris). */
.leaflet-container img.img-error-pending { visibility: visible !important; }
.leaflet-container img.image-fallback { background: none !important; }
/* Agrupación del listado de invitados por tipo de invitación (categoría). */
.inv-cat-group-header { display:flex; flex-wrap:wrap; align-items:center; gap:.4rem; font-weight:600; font-size:.9rem; color:#495057; margin:.6rem 0 .1rem; padding-top:.2rem; }
.inv-cat-group-header:first-child { margin-top:0; }
.inv-cat-swatch { display:inline-block; width:12px; height:12px; border-radius:3px; flex:0 0 auto; }
/* "Bocadillo" claro por tipo de entrada (Pista/Grada/Palcos) con su icono en rojo y nombre en negro;
   dentro, cada categoría con sombreado de su color. Estética común con el correo y los enlaces. */
.inv-zone-bubble { border:1px solid #e6e9ee; background:#fafbfc; border-radius:14px; padding:.75rem .9rem; }
.inv-zone-head { font-weight:800; color:#111; margin-bottom:.5rem; }
.inv-zone-head i { color:#e83b4b; }
/* Icono ÚNICO por tipo de invitación (Pista/Grada/Palcos): mismo SVG en rojo en toda la app. */
.inv-zone-ico { height:1.05em; width:auto; vertical-align:-0.16em; }
.inv-zone-ico--lg { height:1.2em; }
.inv-qty-cell { border-radius:8px; padding:.5rem .6rem; }
.inv-request-list .list-group-item.inv-cat-row { border-left-width:5px; }
/* Arrastrar solicitudes entre categorías */
.inv-cat-group { border-radius:12px; padding:.15rem .1rem .3rem; transition:background .12s ease, box-shadow .12s ease; }
.inv-cat-group.inv-dragover { background:#eef6ff; box-shadow: inset 0 0 0 2px #9ec5fe; }
.inv-cat-group.inv-cat-locked { background:#f6f7f9; box-shadow: inset 0 0 0 1px #e2e6ea; opacity:.85; }
.inv-cat-group.inv-cat-locked .inv-cat-dropzone { min-height:0; }
/* Compromisos: cada uno como tarjeta bien separada y diferenciada. */
.inv-commitment-list { display:flex; flex-direction:column; gap:1rem; }
.inv-commitment-card { border:1px solid #e2e6ea; border-radius:14px; padding:.9rem 1rem; background:#fff; box-shadow:0 1px 3px rgba(16,24,40,.06); border-left:4px solid #ced4da; }
.inv-commitment-card + .inv-commitment-card { margin-top:0; }
.inv-cat-dropzone { display:flex; flex-direction:column; gap:.6rem; min-height:8px; }
.inv-cat-row.inv-dragging { opacity:.45; }
.inv-cat-empty { border:1px dashed #d4d9df; border-radius:10px; }
.inv-dl-done { color: #1c9d5b; font-size: 1rem; }            /* icono de descarga (verde) al descargarse */
.inv-reforwarded { color: #007CA2; font-size: 1rem; margin-right: 2px; } /* invitado reenvió (azul) */
/* Butaca con FOTO del invitado dentro: la foto ocupa el sitio del icono (ARRIBA) y el número va
   debajo — mismo orden icono→número que el resto de butacas. */
.invitation-seat--photo { flex-direction: column; gap: .08rem; padding: .22rem .3rem; }
.invitation-seat--photo .invitation-seat-num { font-size: .66rem; font-weight: 700; line-height: 1; }
.invitation-seat-photo { width: 24px; height: 24px; border-radius: 50%; object-fit: cover; border: 2px solid var(--asg, #fff); background: #fff; }
.invitation-assign-strip { grid-column: 2; display: flex; flex-wrap: wrap; gap: .35rem; margin-top: .4rem; }
.invitation-assign-chip { display: inline-flex; align-items: center; gap: .4rem; max-width: 280px; padding: .15rem .55rem .15rem .2rem; border: 1px solid #e4e8ee; border-left: 4px solid var(--asg, #999); border-radius: 999px; background: #fff; font-size: .74rem; line-height: 1.15; }
.invitation-assign-chip > img { width: 22px; height: 22px; border-radius: 50%; object-fit: cover; flex: 0 0 auto; background: #eef0f3; border: 1px solid #eef0f3; }
.invitation-assign-chip > i { width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--asg, #999); color: #fff; font-size: .62rem; flex: 0 0 auto; }
.invitation-assign-txt { min-width: 0; display: flex; flex-direction: column; }
.invitation-assign-name { font-weight: 600; color: #111; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.invitation-assign-link { color: #6b7280; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.invitation-seat-grid--numbered { gap: .35rem; }
.invitation-seat { cursor: pointer; }
.invitation-seat--missing { color: #9aa3af; background: #eef0f3; border-style: dashed; }
.invitation-seat-gap { display: inline-flex; align-items: center; justify-content: center; min-width: 74px; padding: .35rem .55rem; border-radius: .65rem; color: #9aa3af; font-size: .78rem; background: transparent; }
/* Separador de «escalera» en el plano de butacas (p. ej. Cádiz Music Stadium, entre la 17 y la 19). */
.invitation-stair { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; align-self: stretch; gap: 2px; margin: 0 .2rem; padding: .15rem .45rem; line-height: 1; color: #55606b; font-size: .55rem; font-weight: 800; text-transform: uppercase; letter-spacing: .04em; white-space: nowrap; border-left: 2px dashed var(--brand-accent); border-right: 2px dashed var(--brand-accent); background: rgba(0,124,162,.06); border-radius: .35rem; }
.invitation-stair i { font-size: 1rem; color: var(--brand-accent); }
.invitation-seat.is-selected { outline: 3px solid rgba(232,59,75,.22); transform: translateY(-1px); }
/* ---- Plano de butacas alineado: cada fila en UNA sola línea y columnas de ancho fijo, para que
   el sector se vea como un plano completo (una fila debajo de otra, alineadas). El sector hace
   scroll horizontal si es muy ancho. ---- */
/* Contenido principal: aprovechar mejor el ancho de la ventana (antes ~1140px = medio en pantallas
   grandes). Se limita a 1600px para no perder legibilidad en monitores muy anchos. */
.app-main { width: 100%; max-width: 1600px; margin-left: auto; margin-right: auto; }
/* overflow:hidden → la etiqueta de escenario queda SIEMPRE dentro del sombreado del mapa (no sobresale
   por arriba/lados). Las filas siguen con su propio scroll horizontal interno. */
.invitation-sector--plan { position: relative; --seatw: 2.5rem; overflow: hidden; }
/* SOLO las filas hacen scroll horizontal; la cabecera (nombre + rueda de ajustes) queda fija arriba,
   así la rueda siempre está visible arriba a la derecha aunque desplaces el mapa. */
/* position:relative → la etiqueta de ESCENARIO se posiciona DENTRO del área del mapa (la «sombra
   gris»), por debajo de la cabecera/rueda y sin sobresalir por arriba. overflow-x:auto la recorta al
   área del mapa; al ser hija del contenedor de scroll queda fija en el viewport del mapa (visible
   siempre en el punto marcado aunque se desplace). */
.invitation-sector-rows { position: relative; display: flex; flex-direction: column; gap: .5rem; overflow-x: auto; }
/* Cabecera OPACA y por ENCIMA del escenario: si la etiqueta de escenario cae donde el título o la
   rueda, queda tapada por debajo (no por encima). El fondo iguala al del sector. */
.invitation-sector--plan .invitation-sector-head { position: relative; z-index: 6; background: #f1f4f8; border-radius: .5rem; }
.invitation-sector-config-btn { position: relative; z-index: 7; }
/* Cada fila como una LÍNEA a lo ancho del contenido (no del contenedor): todas las filas del sector
   comparten ancho (misma rejilla) y el sector entero hace scroll horizontal como un plano completo. */
.invitation-sector--plan .invitation-seat-row { display: flex; align-items: center; gap: .5rem; width: max-content; min-width: 100%; grid-template-columns: none; }
.invitation-sector--plan .invitation-row-label { min-width: 4.5rem; flex: 0 0 auto; }
.invitation-seat-grid--line { flex-wrap: nowrap; gap: .28rem; align-items: stretch; }
.invitation-seat-grid--line .invitation-seat,
.invitation-seat-grid--line .invitation-seat--missing,
.invitation-seat-grid--line .invitation-seat--hole { width: var(--seatw); min-width: var(--seatw); flex: 0 0 auto; justify-content: center; padding: .35rem .1rem; gap: .1rem; }
.invitation-seat-grid--line .invitation-seat-block { margin: 0; }
.invitation-seat-grid--line .invitation-seat-block-seats { gap: .28rem; flex-wrap: nowrap; }
.invitation-seat-grid--line .invitation-seat--photo { width: var(--seatw); min-width: var(--seatw); }
.invitation-seat-row .invitation-row-label { position: sticky; left: 0; z-index: 2; background: #fff; padding-right: .3rem; }
/* Butaca IMPRESA (naranja): funciona como enviada (no reutilizable) pero se distingue. */
.invitation-seat--printed { color: #b45309; background: #fff4e5; border-color: #fdba74; }
/* Butaca apagada (config): existe físicamente pero no la ofrecemos. Hueco: no hay asiento. */
.invitation-seat--off { background: #d7dbe2; border: 1px solid #c3c9d2; border-style: solid; color: #7b838f; opacity: 1; }
.invitation-seat--hole { background: transparent; border: 1px dashed #e3e7ec; color: transparent; }
/* Espaciador de alineación (columna insertada en otra fila): invisible pero ocupa el mismo ancho. */
.invitation-seat--spacer { background: transparent; border: 1px solid transparent; color: transparent; }
.invitation-seat--spacer i { visibility: hidden; }
/* Etiqueta de ESCENARIO: se coloca en un punto libre del marco del sector (left/top en % por estilo
   en línea). Negra, texto/icono en blanco. */
.invitation-stage { position: absolute; z-index: 3; transform: translate(-50%,-50%); background: #111; color: #fff; font-size: .6rem; font-weight: 800; letter-spacing: .06em; padding: .2rem .6rem; border-radius: .45rem; display: inline-flex; align-items: center; box-shadow: 0 2px 6px rgba(0,0,0,.25); white-space: nowrap; pointer-events: none; }
/* Cuando la etiqueta de ESCENARIO cae en un borde del mapa, se reserva sitio en ese borde
   (la viñeta del sector crece un poco y el plano se desplaza) para que la etiqueta quede SIEMPRE
   dentro del fondo gris, pegada al plano y sin tapar butacas ni chocar con la rueda de ajustes. */
.invitation-sector-rows.stage-pad-top { padding-top: 2.2rem; }
.invitation-sector-rows.stage-pad-bottom { padding-bottom: 2.2rem; }
.invitation-sector-rows.stage-pad-left { padding-left: 3.6rem; }
.invitation-sector-rows.stage-pad-right { padding-right: 3.6rem; }
.invitation-stage i { color: #fff; }
.invitation-stage-arrow { margin-right: .35rem; display: inline-block; }
.invitation-stage-dir i:first-child { display: inline-block; }
/* Indicador de dirección del ESCENARIO: chip negro con flecha, siempre visible en la cabecera del
   sector (para saber dónde cae el escenario aunque no se vea el borde por el scroll o en el mapa de
   asignación). */
.invitation-stage-dir { display: inline-flex; align-items: center; gap: .3rem; background: #111; color: #fff; font-size: .62rem; font-weight: 800; letter-spacing: .04em; text-transform: uppercase; padding: .18rem .5rem; border-radius: .4rem; white-space: nowrap; }
.invitation-stage-dir i { color: #fff; }
/* ---- Configurador del plano (popup de la rueda) ---- */
.plan-editor-grid { display: flex; flex-direction: column; gap: .5rem; overflow-x: auto; padding: .5rem; background: #f1f4f8; border-radius: .8rem; }
/* Mapa completo del configurador: marco relativo (para el escenario) con las filas scrollables. */
.plan-editor-map { position: relative; background: #f1f4f8; border-radius: .8rem; }
.plan-editor-rows { display: flex; flex-direction: column; gap: .4rem; overflow-x: auto; padding: .6rem; }
.plan-tool { display: inline-flex; align-items: center; padding: .3rem .55rem; border: 1px solid #cfd6df; border-radius: .5rem; background: #fff; cursor: grab; font-size: .8rem; user-select: none; }
.plan-tool:active { cursor: grabbing; }
.plan-tool.active { border-color: #e83b4b; box-shadow: 0 0 0 .16rem rgba(232,59,75,.2) inset; }
.plan-tool--stage { background: #111; color: #fff; border-color: #111; }
.plan-tool--stage i { color: #fff; }
.plan-cell.is-empty { color: #c5ccd6; background: #fff; border-style: dashed; }
.plan-cell-end { color: #9aa3af; border-style: dashed; cursor: copy; }
.plan-stage-marker { z-index: 5; }
.plan-editor-row { display: flex; align-items: stretch; gap: .28rem; }
.plan-editor-row .plan-editor-label { position: sticky; left: 0; z-index: 2; background: #f1f4f8; font-weight: 700; color: #49515d; min-width: 4rem; display: flex; align-items: center; }
.plan-cell { width: 2.5rem; min-width: 2.5rem; flex: 0 0 auto; display: inline-flex; flex-direction: column; align-items: center; justify-content: center; padding: .3rem .1rem; border-radius: .55rem; border: 1px solid #dfe4ea; background: #fff; font-size: .7rem; cursor: pointer; user-select: none; }
.plan-cell.is-seat { color: #16803a; background: #effaf2; }
.plan-cell.is-off { color: #7b838f; background: #d7dbe2; }
.plan-cell.is-hole { color: transparent; background: transparent; border-style: dashed; }
.plan-cell.is-missing { color: #aeb6c0; background: #eef1f5; }
.plan-cell.is-spacer { background: transparent; border-color: transparent; }
.plan-cell.is-spacer i, .plan-cell.is-hole i { visibility: hidden; }
.plan-cell .fa-couch { font-size: .9rem; }
.plan-cell-num { font-size: .58rem; line-height: 1; margin-top: 1px; }
.plan-cell-boundary { width: .7rem; min-width: .7rem; flex: 0 0 auto; align-self: stretch; cursor: pointer; border-radius: .2rem; position: relative; }
.plan-cell-boundary:hover { background: rgba(0,124,162,.12); }
.plan-cell-boundary.has-stair { background: rgba(0,124,162,.14); border-left: 2px dashed var(--brand-accent); border-right: 2px dashed var(--brand-accent); }
.plan-cell-boundary.has-stair::after { content: "\f6d0"; font-family: "Font Awesome 6 Free"; font-weight: 900; color: var(--brand-accent); font-size: .7rem; position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); }
/* Feedback del arrastre en el configurador: fantasma pegado al cursor + resaltado del punto EXACTO
   donde caerá la herramienta (borde de escalera / celda) y previsualización del escenario. */
.plan-drag-ghost{ position:fixed; z-index:99999; pointer-events:none; transform:translate(10px,12px); display:inline-flex; align-items:center; gap:.3rem; padding:.25rem .55rem; border-radius:.5rem; background:#fff; border:1px solid var(--brand-accent); color:#222; font-size:.78rem; font-weight:600; box-shadow:0 4px 14px rgba(0,0,0,.22); }
.plan-cell-boundary.is-drop-stair{ background:rgba(0,124,162,.28); border-left:2px dashed var(--brand-accent); border-right:2px dashed var(--brand-accent); box-shadow:0 0 0 2px rgba(0,124,162,.25); }
.plan-cell.is-drop-hint, .plan-cell-boundary.is-drop-hint{ outline:2px dashed var(--brand-accent); outline-offset:1px; background:rgba(0,124,162,.14); }
.plan-stage-marker.is-preview{ opacity:.65; pointer-events:none; }
/* Filas-separadoras (pasillos entre filas) + zona de drop «Entre filas». La banda solo se ve al
   arrastrar una herramienta (clase is-tooldrag en el mapa); al pasar por encima se resalta. */
.plan-editor-gap{ height:.5rem; margin:-.06rem 0; border-radius:.4rem; display:flex; align-items:center; justify-content:center; font-size:.62rem; font-weight:700; color:transparent; border:1px dashed transparent; transition:height .1s, background-color .1s, color .1s; }
.plan-editor-gap span{ opacity:0; pointer-events:none; }
.plan-editor-map.is-tooldrag .plan-editor-gap{ height:1.05rem; border-color:#c7cfd9; color:#9aa3af; }
.plan-editor-map.is-tooldrag .plan-editor-gap span{ opacity:1; }
.plan-editor-gap.is-drop-gap{ height:1.5rem; background:rgba(0,124,162,.14); border-color:var(--brand-accent); color:var(--brand-accent); box-shadow:0 0 0 2px rgba(0,124,162,.2); }
.plan-editor-gap.is-drop-gap span{ opacity:1; }
.plan-editor-row--sep .plan-editor-label{ color:#aeb6c0; font-weight:700; }
.plan-editor-row--sep .plan-cell{ border-color:transparent; background:transparent; }
.plan-editor-row--sep .plan-cell.is-hole{ border-style:dashed; border-color:#c3ccd6; }
/* En el mapa (visión/asignación) la fila-separadora es un pasillo fino, sin tarjeta. */
.invitation-seat-row--sep{ background:transparent; border-color:transparent; box-shadow:none; padding-top:.12rem; padding-bottom:.12rem; margin-bottom:.2rem; }
.plan-editor-stage-pick { display: flex; gap: .4rem; flex-wrap: wrap; }
.plan-editor-mode.active { box-shadow: 0 0 0 .16rem rgba(232,59,75,.2) inset; }
/* Popup de acciones de la selección múltiple (junto a la selección). */
.inv-selection-pop { position: fixed; z-index: 6000; background: #fff; border: 1px solid #e2e6ec; border-radius: .9rem; box-shadow: 0 12px 40px rgba(16,24,40,.18); padding: .5rem; display: none; flex-direction: column; gap: .3rem; min-width: 210px; }
.inv-selection-pop.show { display: flex; }
.inv-selection-pop .inv-sel-count { font-size: .78rem; color: #6b7280; padding: .1rem .3rem .3rem; border-bottom: 1px solid #eef0f3; margin-bottom: .2rem; }
.inv-selection-pop button { text-align: left; }
.assignment-source-list { display: flex; flex-direction: column; gap: .6rem; max-height: 60vh; overflow: auto; }
.assignment-source { position: relative; border: 1px solid #e1e6ed; border-radius: 1rem; padding: .75rem; background: #fff; cursor: grab; }
.assignment-source.is-selected, .assignment-source:hover { border-color: #e83b4b; box-shadow: 0 0 0 .16rem rgba(232,59,75,.1); }
.assignment-source.is-active { border-color: #e83b4b; box-shadow: 0 0 0 .2rem rgba(232,59,75,.18); }
/* Estado de asignación de la tarjeta según «Asignadas X/T»: parcial = AMARILLO, completa = VERDE.
   (A 0: etiqueta gris y fondo blanco, sin clase.) */
.assignment-source.assign-state-partial { border-color: #ffc107; background: #fff9e6; }
.assignment-source.assign-state-partial .assign-src-progress { background: #ffc107; color: #3a2f00; border-color: #e0a800; }
.assignment-source.assign-state-full { border-color: #16803a; background: #effaf3; }
.assignment-source.assign-state-full .assign-src-progress { background: #d7f2df; color: #116330; border-color: #a9dcb9; }
/* Tarjeta de solicitud del asignador (invitado con foto+nombre, vínculo, «pedidas por», nota).
   Columna de etiquetas a la derecha: «Pendiente de aprobar» ARRIBA y el nº de invitaciones DEBAJO,
   centrado (nunca se solapan); bajo ellas, la etiqueta «Asignadas X/T». */
/* La flag va ABSOLUTA en la esquina y TODAS las tarjetas reservan la misma banda superior en la
   columna de etiquetas: así el nº de invitaciones y «Asignadas X/X» quedan ALINEADOS entre tarjetas,
   tengan o no «Pendiente de aprobar». */
.assignment-source-flag { position: absolute; top: .5rem; right: .6rem; display: inline-flex; align-items: center; font-size: .6rem; font-weight: 800; letter-spacing: .02em; text-transform: uppercase; background: #ffc107; color: #3a2f00; border-radius: .4rem; padding: .12rem .4rem; white-space: nowrap; }
.assign-src-tags { display: flex; flex-direction: column; align-items: center; gap: .3rem; margin-left: auto; flex: 0 0 auto; padding-top: 1.15rem; }
.assign-src-progress-row { display: inline-flex; align-items: center; gap: .3rem; }
/* Botón VERDE de asignación automática, al lado de «Asignadas X/X». */
.assign-src-auto { border: 1px solid #16803a; background: #e7f6ec; color: #16803a; border-radius: 50%; width: 1.55rem; height: 1.55rem; display: inline-flex; align-items: center; justify-content: center; font-size: .72rem; cursor: pointer; flex: 0 0 auto; }
.assign-src-auto:hover { background: #16803a; color: #fff; }
.assign-src-head { display: flex; align-items: flex-start; gap: .5rem; }
.assign-src-photo { width: 34px; height: 34px; border-radius: 9px; object-fit: contain; flex: 0 0 auto; background: transparent; border: 0; }
.assign-src-name { font-weight: 700; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding-top: .3rem; }
.assign-src-qty { flex: 0 0 auto; }
.assign-src-link { margin-top: .35rem; }
.assign-src-requester { display: flex; align-items: center; gap: .35rem; margin-top: .3rem; font-size: .74rem; color: #6b7280; min-width: 0; }
.assign-src-requester img { width: 18px; height: 18px; border-radius: 50%; object-fit: cover; flex: 0 0 auto; background: #eef0f3; }
.assign-src-requester span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.assign-src-note { margin-top: .3rem; font-size: .74rem; color: #555; }
/* «Asignadas X/T»: SIEMPRE visible. Gris a 0 (fondo de tarjeta blanco); el color llega con las
   clases de estado de la tarjeta (parcial amarillo / completa verde). La ✕ desasigna todo. */
.assign-src-progress { display: inline-flex; align-items: center; gap: .3rem; padding: .12rem .2rem .12rem .55rem; border-radius: 999px; font-size: .72rem; font-weight: 700; background: #eef0f3; color: #6b7280; border: 1px solid #e1e6ed; white-space: nowrap; }
.assign-src-cancel { border: 0; background: transparent; color: inherit; line-height: 1; padding: .05rem .32rem; border-radius: 50%; cursor: pointer; }
.assign-src-cancel:hover { background: rgba(0,0,0,.1); }
/* Columnas del asignador con SCROLL INDEPENDIENTE: la lista de solicitudes (izquierda) llega hasta
   el final de la pantalla y se desliza por dentro; el área de planos (derecha) igual. Así, al
   moverte por el plano, la solicitud que estás asignando sigue visible con su contador. */
#assignAllModal .assignment-source-list { max-height: calc(100vh - 250px); }
#assignAllModal .assignment-drop-zone { max-height: calc(100vh - 250px); overflow-y: auto; }
.invitation-remaining { min-height: 1.2rem; }
.assignment-drop-zone { min-height: 260px; border: 1px dashed #cfd6df; border-radius: 1rem; padding: .9rem; background: #fafbfc; }
.assignment-unnumbered-pool { display: flex; flex-wrap: wrap; gap: .45rem; }
.assignment-result-list .alert { border-radius: .8rem; }
.invitation-category-table td { vertical-align: middle; }
.public-invitation-page .d-none { display: none !important; }
@media (max-width: 768px) { .invitation-seat-row { grid-template-columns: 1fr; } }

/* App_33 · Ajustes invitaciones / modales 2026-06-08 */
.invitation-ticket-preview {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: min(85vh, 1100px);
  min-height: 480px;
  background: #f8f9fa;
  overflow: hidden;
}
.invitation-pdf-toolbar {
  display: flex;
  gap: .35rem;
  padding: .4rem;
  border-bottom: 1px solid #dee2e6;
  background: #fff;
  flex: 0 0 auto;
}
.invitation-pdf-scroll {
  flex: 1 1 auto;
  overflow: auto;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  padding: .75rem;
}
.invitation-pdf-scroll canvas {
  box-shadow: 0 2px 10px rgba(0,0,0,.15);
  background: #fff;
}
.invitation-pdf-scroll iframe { width: 100%; height: 100%; min-height: 460px; border: 0; }
.modal.app33-modal-stack,
.modal.show.app33-modal-stack {
  z-index: var(--app33-modal-z, 1065) !important;
}
.modal-backdrop.app33-modal-backdrop-stack {
  z-index: var(--app33-backdrop-z, 1060) !important;
}
.modal .modal-content {
  isolation: isolate;
}
.dropdown-menu-app33,
.dropdown-menu.show {
  z-index: 3000 !important;
}
.invitation-search-picker .invitation-search-results {
  position: relative;
  z-index: 5;
}
.invitation-category-table select[name="ticket_kind[]"] {
  min-width: 220px;
}
.status-borrador {
  background: #dbeafe;
  color: #1d4ed8;
}

/* Hotfix 2026-06-11 · Dropdowns globales / botones de tres puntitos
   Los menús se portalean al body y se posicionan con coordenadas fijas para
   que no los recorten cards, tablas, listados ni modales. */
.dropdown-menu.dropdown-menu-portal-active,
.dropdown-menu[data-app33-portaled="1"] {
  position: fixed !important;
  z-index: 24000 !important;
  inset: auto !important;
  right: auto !important;
  bottom: auto !important;
  margin: 0 !important;
  transform: none !important;
  max-height: calc(100vh - 16px) !important;
  overflow: auto !important;
  overscroll-behavior: contain;
  box-shadow: 0 .9rem 2.4rem rgba(15, 23, 42, .20) !important;
  border: 1px solid rgba(15, 23, 42, .12);
  will-change: left, top;
}
.dropdown-menu.dropdown-menu-portal-active:not([data-app33-positioned="1"]),
.dropdown-menu[data-app33-portaled="1"]:not([data-app33-positioned="1"]) {
  visibility: hidden !important;
}
.dropdown-menu.dropdown-menu-portal-active[data-app33-positioned="1"],
.dropdown-menu[data-app33-portaled="1"][data-app33-positioned="1"] {
  visibility: visible !important;
}
.dropdown-menu.dropdown-menu-portal-active .dropdown-item,
.dropdown-menu[data-app33-portaled="1"] .dropdown-item {
  white-space: nowrap;
}
.dropdown-menu.dropdown-menu-portal-active form,
.dropdown-menu[data-app33-portaled="1"] form {
  margin: 0;
}
.dropdown-menu.dropdown-menu-portal-active form .dropdown-item,
.dropdown-menu[data-app33-portaled="1"] form .dropdown-item {
  width: 100%;
  text-align: left;
}
.card,
.card-body,
.list-group,
.list-group-item,
.invitation-manage-row,
.invitation-category-card,
.invitation-ticket-module,
.invitation-availability-fixed,
.entity-link-card,
.bag-expense-row,
.roadmap-card {
  overflow: visible;
}

/* =========================================================
   Refinamiento estético v2 — "moderno con color de marca"
   (manteniendo colores #E33D48 / #007CA2 y la estructura Bootstrap)
   ========================================================= */
:root{
  --brand-primary-d:#c5313b;   /* rojo hover */
  --brand-accent-d:#016585;    /* teal hover */
  --ink:#1b2330;
  --muted-2:#5b6472;
  --line-2:#e9edf3;
  --radius-2:14px;
  --shadow-sm-2:0 1px 2px rgba(16,24,40,.04), 0 1px 3px rgba(16,24,40,.06);
  --shadow-md-2:0 12px 32px rgba(20,30,55,.10);
}
body{ color:var(--ink); background:#f5f7fb; }
h1,h2,h3,h4,h5,.h1,.h2,.h3,.h4,.h5{ letter-spacing:-.2px; }

/* Botones */
.btn{ font-weight:600; border-radius:10px; transition:all .15s ease; }
.btn-lg{ border-radius:12px; }
.btn-primary{ background-color:var(--brand-primary); border-color:var(--brand-primary); }
.btn-primary:hover,.btn-primary:focus{ background-color:var(--brand-primary-d); border-color:var(--brand-primary-d); box-shadow:0 8px 18px rgba(227,61,72,.22); transform:translateY(-1px); }
.btn-outline-primary:hover{ box-shadow:0 8px 18px rgba(227,61,72,.16); }

/* Tarjetas */
.card{ border:1px solid var(--line-2); border-radius:var(--radius-2); box-shadow:var(--shadow-sm-2); }
.card.border-0{ border:0; }

/* Navbar */
.navbar.bg-white{ border-bottom:1px solid var(--line-2); box-shadow:0 1px 0 rgba(16,24,40,.03); }
.navbar .navbar-brand img{ height:34px !important; }
.navbar .nav-link{ font-weight:600; color:#475063; border-radius:9px; padding-left:.72rem; padding-right:.72rem; transition:color .15s, background .15s; }
.navbar .nav-link:hover{ color:var(--brand-primary); }
.navbar .nav-link.active{ color:var(--brand-primary); background:rgba(227,61,72,.08); }

/* Dashboard (inicio) */
.dash-hero{ border:1px solid var(--line-2); border-radius:18px; box-shadow:var(--shadow-sm-2);
  background:
    radial-gradient(120% 150% at 0% 0%, rgba(0,124,162,.08), transparent 46%),
    radial-gradient(120% 150% at 100% 0%, rgba(227,61,72,.07), transparent 46%), #fff; }
.dash-tile{ border:1px solid var(--line-2); border-radius:14px; box-shadow:var(--shadow-sm-2); }
.dash-tile:hover{ box-shadow:var(--shadow-md-2); transform:translateY(-3px); border-color:transparent; }
.dash-tile__icon{ color:var(--brand-accent); background:rgba(0,124,162,.10); font-size:1.05rem; }
.metric-card{ border:1px solid var(--line-2)!important; border-radius:14px; background:#fff; box-shadow:var(--shadow-sm-2); }
.metric-card__value{ color:var(--brand-primary); font-weight:800; }

/* Detalles */
.badge.text-bg-light{ border:1px solid var(--line-2); }
.form-control:focus,.form-select:focus{ border-color:var(--brand-accent); box-shadow:0 0 0 .2rem rgba(0,124,162,.15); }
.alert{ border-radius:12px; }

/* =========================================================
   Fichas (concierto/canción/álbum/artista) — estructura común
   cabecera "hero" + pestañas + campos consolidados
   ========================================================= */
.ficha-hero{ position:relative; display:flex; gap:1.1rem; align-items:center; flex-wrap:wrap;
  border:1px solid var(--line-2); border-radius:18px; padding:1.1rem 1.25rem; margin-bottom:1rem;
  background:
    radial-gradient(120% 160% at 0% 0%, rgba(0,124,162,.08), transparent 46%),
    radial-gradient(120% 160% at 100% 0%, rgba(227,61,72,.07), transparent 46%), #fff;
  box-shadow:var(--shadow-sm-2); }
.ficha-hero__media{ flex:0 0 auto; width:96px; height:96px; border-radius:20px; object-fit:cover;
  background:#f1f3f8; border:1px solid var(--line-2); }
.ficha-hero__media--round{ border-radius:50%; }
.ficha-hero__body{ flex:1 1 280px; min-width:0; }
.ficha-hero__eyebrow{ text-transform:uppercase; letter-spacing:.4px; font-size:.72rem; font-weight:700; color:var(--muted-2); }
.ficha-hero__title{ font-size:1.55rem; font-weight:800; letter-spacing:-.4px; margin:.1rem 0 .35rem; color:var(--ink); }
.ficha-hero__facts{ display:flex; flex-wrap:wrap; gap:.35rem .9rem; color:var(--muted-2); font-size:.9rem; }
.ficha-hero__facts i{ color:var(--brand-accent); width:1rem; text-align:center; margin-right:.25rem; }
.ficha-hero__actions{ display:flex; gap:.5rem; flex-wrap:wrap; align-items:center; }

/* Pestañas de ficha (sobre el contenido en tarjeta) */
.ficha-tabs.nav-tabs{ border-bottom:0; gap:.25rem; }
.ficha-tabs.nav-tabs .nav-link{ border:1px solid transparent; border-radius:11px 11px 0 0; font-weight:600;
  color:var(--muted-2); padding:.55rem .95rem; }
.ficha-tabs.nav-tabs .nav-link:hover{ color:var(--brand-primary); background:rgba(227,61,72,.05); }
.ficha-tabs.nav-tabs .nav-link.active{ color:var(--brand-primary); background:#fff; border-color:var(--line-2);
  border-bottom-color:#fff; }
.ficha-tabpane{ background:#fff; border:1px solid var(--line-2); border-radius:0 14px 14px 14px; padding:1.1rem; }

/* Tarjeta de sección con cabecera + botón editar */
.ficha-section{ border:1px solid var(--line-2); border-radius:14px; background:#fff; box-shadow:var(--shadow-sm-2); margin-bottom:1rem; }
.ficha-section__head{ display:flex; align-items:center; justify-content:space-between; gap:.5rem;
  padding:.75rem 1rem; border-bottom:1px solid var(--line-2); }
.ficha-section__title{ font-size:1rem; font-weight:700; margin:0; color:var(--ink); display:flex; align-items:center; gap:.5rem; }
.ficha-section__title i{ color:var(--brand-accent); }
.ficha-section__body{ padding:1rem; }

/* Campos consolidados (solo lectura): etiqueta arriba, valor debajo */
.ficha-fields{ display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:.85rem 1.4rem; }
.ficha-field__label{ font-size:.72rem; text-transform:uppercase; letter-spacing:.3px; color:var(--muted-2); font-weight:700; }
.ficha-field__value{ font-weight:600; color:var(--ink); }
.ficha-empty{ display:flex; align-items:center; gap:.6rem; color:var(--muted-2); padding:.4rem 0; }
.ficha-empty i{ color:#c2cad6; }

/* =========================================================
   Vinculaciones (entity links) — diseño visual de marca
   ========================================================= */
.entity-link-list{ display:flex; flex-direction:column; gap:.5rem; }
.entity-link-row{ display:flex; align-items:center; gap:.5rem; padding:.5rem .65rem; border:1px solid var(--line-2);
  border-radius:14px; background:#fff; box-shadow:var(--shadow-sm-2); transition:box-shadow .15s, transform .15s, border-color .15s; }
.entity-link-row:hover{ box-shadow:var(--shadow-md-2); transform:translateY(-1px); border-color:transparent; }
.entity-link-row-main{ display:flex; align-items:center; gap:.7rem; min-width:0; flex:1; text-decoration:none; color:inherit; }
.entity-link-avatar{ position:relative; flex:0 0 auto; width:46px; height:46px; }
/* Sin fondo: los logos transparentes (PNG) se ven tal cual, sin caja gris detrás. Las FOTOS
   (artista/recinto, clase is-photo) sí rellenan su marco con recorte. */
.entity-link-avatar img{ width:46px; height:46px; border-radius:12px; object-fit:contain; background:transparent; border:0; }
.entity-link-avatar img.is-photo{ object-fit:cover; border:1px solid var(--line-2); }
.entity-link-avatar > i{ position:absolute; right:-4px; bottom:-4px; width:20px; height:20px; border-radius:50%;
  background:var(--brand-accent); color:#fff; font-size:.62rem; display:flex; align-items:center; justify-content:center; box-shadow:0 2px 5px rgba(0,0,0,.15); }
.entity-link-avatar--sm{ width:40px; height:40px; }
.entity-link-avatar--sm img{ width:40px; height:40px; }
.entity-link-name{ display:block; font-weight:600; color:var(--ink); }
.entity-link-meta{ display:block; font-size:.82rem; color:var(--muted-2); }
.entity-link-relation{ color:var(--brand-primary); font-weight:700; }
.entity-link-more{ border:1px solid var(--line-2); background:#fff; color:var(--muted-2); border-radius:9px; }
.entity-link-more:hover{ color:var(--brand-primary); border-color:var(--brand-primary); }
.entity-link-empty{ display:flex; align-items:center; gap:.8rem; padding:1rem 1.1rem; border:1px dashed var(--line-2);
  border-radius:14px; color:var(--muted-2); background:#fbfcfe; }
.entity-link-empty > i{ font-size:1.4rem; color:#c2cad6; }

/* Modal vincular */
.entity-link-type-row{ display:flex; flex-wrap:wrap; gap:.5rem; }
.entity-link-type-btn{ display:flex; flex-direction:column; align-items:center; gap:.3rem; min-width:88px; padding:.6rem .5rem;
  border:1px solid var(--line-2); border-radius:12px; background:#fff; color:var(--muted-2); font-size:.8rem; font-weight:600; cursor:pointer; transition:all .15s; }
.entity-link-type-btn i{ font-size:1.15rem; color:var(--brand-accent); }
.entity-link-type-btn:hover{ border-color:var(--brand-accent); transform:translateY(-1px); }
.entity-link-type-btn.is-active{ border-color:var(--brand-primary); background:rgba(227,61,72,.06); color:var(--brand-primary); }
.entity-link-type-btn.is-active i{ color:var(--brand-primary); }
.entity-link-results{ max-height:260px; overflow-y:auto; border:1px solid var(--line-2); border-radius:12px; }
.entity-link-results:empty{ display:none; }
.el-result{ display:flex; align-items:center; gap:.6rem; width:100%; text-align:left; padding:.5rem .6rem; border:0;
  border-bottom:1px solid var(--line-2); background:#fff; cursor:pointer; }
.el-result:last-child{ border-bottom:0; }
.el-result:hover{ background:rgba(0,124,162,.06); }
.el-result img{ width:38px; height:38px; border-radius:10px; object-fit:cover; background:#f1f3f8; border:1px solid var(--line-2); flex:0 0 auto; }
.el-selected-card{ display:flex; align-items:center; gap:.6rem; padding:.5rem .65rem; border:1px solid var(--brand-accent);
  border-radius:12px; background:rgba(0,124,162,.05); }
.el-selected-card img{ width:42px; height:42px; border-radius:10px; object-fit:cover; background:#f1f3f8; flex:0 0 auto; }
.entity-link-create{ border:1px dashed var(--line-2); border-radius:12px; padding:.7rem; background:#fbfcfe; }

/* Login / autenticación */
.auth-wrap{ max-width:460px; margin:2.5rem auto; }
.auth-card{ border-radius:20px; box-shadow:0 24px 60px rgba(20,30,55,.12); position:relative; overflow:hidden; }
.auth-card::before{ content:""; position:absolute; left:0; right:0; top:0; height:5px;
  background:linear-gradient(90deg, var(--brand-primary), var(--brand-accent)); }
.auth-logos{ display:flex; align-items:center; justify-content:center; gap:14px; }
.auth-logo{ height:30px; object-fit:contain; }
.auth-sep{ width:1px; height:28px; background:var(--line-2); }
.auth-eyebrow{ display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700;
  letter-spacing:.4px; text-transform:uppercase; color:var(--brand-accent-d);
  background:rgba(0,124,162,.10); padding:5px 12px; border-radius:999px; }
.auth-title{ font-weight:820; letter-spacing:-.3px; }

/* =========================================================
   Accesos del personal (permisos por sección/pestaña)
   ========================================================= */
.acc-toolbar{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-bottom:14px; }
.acc-search{ flex:1; min-width:200px; position:relative; }
.acc-search input{ width:100%; border:1px solid var(--line-2); border-radius:11px; padding:10px 14px 10px 36px; }
.acc-search .fa{ position:absolute; left:13px; top:12px; color:var(--muted-2); }
.acc-legend{ display:flex; gap:18px; flex-wrap:wrap; font-size:12px; color:var(--muted-2); margin:0 2px 12px; }
.acc-legend i.dot{ display:inline-block; width:11px; height:11px; border-radius:3px; margin-right:5px; vertical-align:-1px; }
.acc-sec{ background:#fff; border:1px solid var(--line-2); border-radius:14px; margin-bottom:12px; box-shadow:var(--shadow-sm-2); overflow:hidden; }
.acc-sec__head{ display:flex; align-items:center; gap:12px; padding:13px 16px; cursor:pointer; user-select:none; }
.acc-sec__head:hover{ background:#fafbfd; }
.acc-chev{ transition:transform .2s; color:var(--muted-2); width:14px; text-align:center; }
.acc-sec.open .acc-chev{ transform:rotate(90deg); }
.acc-sec__ic{ width:38px; height:38px; border-radius:11px; display:grid; place-items:center; font-size:16px; background:rgba(0,124,162,.10); color:var(--brand-accent); }
.acc-sec__name{ font-weight:700; }
.acc-sec__count{ font-size:12px; color:var(--muted-2); }
.acc-sec__masters{ margin-left:auto; display:flex; gap:14px; align-items:center; }
.acc-sec__body{ display:none; border-top:1px solid var(--line-2); padding:4px 16px 12px; }
.acc-sec.open .acc-sec__body{ display:block; }
.acc-row{ display:grid; grid-template-columns:1fr auto; gap:10px; align-items:center; padding:9px 4px; border-bottom:1px dashed var(--line-2); }
.acc-row:last-child{ border-bottom:0; }
.acc-row.sub .acc-rl{ padding-left:18px; }
.acc-row.head .acc-rl{ font-size:11px; text-transform:uppercase; letter-spacing:.3px; color:var(--muted-2); }
.acc-rl{ font-size:14px; font-weight:600; }
.acc-rl .tagn{ font-size:10px; font-weight:700; color:var(--amber,#E0922F); background:rgba(224,146,47,.13); padding:1px 7px; border-radius:999px; margin-left:8px; text-transform:uppercase; }
.acc-grouphdr{ font-size:11.5px; font-weight:700; text-transform:uppercase; letter-spacing:.3px; color:var(--muted-2); padding:10px 4px 4px; }
.acc-perms{ display:flex; gap:14px; align-items:center; }
.acc-perm{ width:52px; display:flex; justify-content:center; }
.acc-mlab{ font-size:9.5px; color:var(--muted-2); font-weight:700; text-transform:uppercase; text-align:center; width:52px; }
.acc-na{ color:#c2c9d4; text-align:center; width:40px; }
.sw{ position:relative; width:40px; height:23px; flex:0 0 auto; display:inline-block; }
.sw input{ opacity:0; width:0; height:0; position:absolute; }
.sw .tr{ position:absolute; inset:0; background:#cfd6e0; border-radius:999px; transition:.18s; cursor:pointer; }
.sw .tr::before{ content:""; position:absolute; width:17px; height:17px; left:3px; top:3px; background:#fff; border-radius:50%; transition:.18s; box-shadow:0 1px 2px rgba(0,0,0,.25); }
.sw input:checked + .tr::before{ transform:translateX(17px); }
.sw.view input:checked + .tr{ background:var(--brand-accent); }
.sw.econ input:checked + .tr{ background:var(--amber,#E0922F); }
.sw.edit input:checked + .tr{ background:var(--brand-primary); }
.sw input:disabled + .tr{ opacity:.4; cursor:not-allowed; background:#e5e9f0; }
.sw input:indeterminate + .tr{ background:linear-gradient(90deg,var(--brand-accent) 50%,#cfd6e0 50%); }
.acc-note{ font-size:12.5px; color:var(--muted-2); margin-top:14px; padding:10px 12px; background:#fff; border:1px dashed var(--line-2); border-radius:10px; }

/* =========================================================
   Indicador de carga global
   ========================================================= */
#globalLoader{ position:fixed; inset:0; z-index:3000; display:flex; align-items:center; justify-content:center;
  background:rgba(255,255,255,.70); backdrop-filter:blur(2px); -webkit-backdrop-filter:blur(2px);
  opacity:0; visibility:hidden; pointer-events:none; transition:opacity .12s ease, visibility 0s linear .12s; }
#globalLoader.show{ opacity:1; visibility:visible; pointer-events:auto; transition:opacity .12s ease, visibility 0s; }
#globalLoader .gl-box{ display:flex; flex-direction:column; align-items:center; gap:14px; }
/* Iconos musicales que «laten» en cadena con los colores corporativos (rojo/azul alternos). */
#globalLoader .gl-icons{ display:flex; gap:16px; font-size:24px; }
#globalLoader .gl-icons i{ color:#c9d2dc; animation:glbeat 1.5s ease-in-out infinite; }
#globalLoader .gl-icons i:nth-child(odd){ --gl-on:var(--brand-primary); }
#globalLoader .gl-icons i:nth-child(even){ --gl-on:var(--brand-accent); }
#globalLoader .gl-icons i:nth-child(1){ animation-delay:0s; }
#globalLoader .gl-icons i:nth-child(2){ animation-delay:.15s; }
#globalLoader .gl-icons i:nth-child(3){ animation-delay:.3s; }
#globalLoader .gl-icons i:nth-child(4){ animation-delay:.45s; }
#globalLoader .gl-icons i:nth-child(5){ animation-delay:.6s; }
#globalLoader .gl-icons i:nth-child(6){ animation-delay:.75s; }
@keyframes glbeat{ 0%,55%,100%{ color:#c9d2dc; transform:translateY(0) scale(1); }
  22%{ color:var(--gl-on, var(--brand-primary)); transform:translateY(-7px) scale(1.22); } }
/* Barra de carga: barrido continuo mientras «piensa»; con .determinate la anchura es el % real. */
#globalLoader .gl-bar{ width:240px; height:9px; border-radius:6px; background:#e7ecf2; overflow:hidden; position:relative; }
#globalLoader .gl-bar-fill{ position:absolute; top:0; left:0; bottom:0; width:42%; border-radius:6px;
  background:linear-gradient(90deg, var(--brand-primary), var(--brand-accent)); animation:glsweep 1.4s ease-in-out infinite; }
#globalLoader.determinate .gl-bar-fill{ animation:none; left:0; transition:width .18s ease; }
@keyframes glsweep{ 0%{ transform:translateX(-110%); } 100%{ transform:translateX(340%); } }
#globalLoader .gl-text{ font-weight:700; color:var(--brand-accent-d); font-size:14px; letter-spacing:.3px; font-variant-numeric:tabular-nums; }
@media (prefers-reduced-motion: reduce){ #globalLoader .gl-icons i, #globalLoader .gl-bar-fill{ animation:none; } }

/* =========================================================
   Fase 2 — estética global de componentes (toda la web)
   ========================================================= */

/* Tablas: cabeceras sutiles, filas con hover, líneas suaves */
.table { --bs-table-bg: transparent; margin-bottom: 0; }
.table > thead th,
.table > thead td {
  font-size: 11.5px; text-transform: uppercase; letter-spacing: .4px;
  font-weight: 700; color: var(--muted-2);
  background: #f7f9fc; border-bottom: 1px solid var(--line-2); border-top: 0;
  white-space: nowrap;
}
.table > tbody > tr { border-color: var(--line-2); }
.table > tbody > tr > td { vertical-align: middle; }
.table-hover > tbody > tr:hover > * { background: rgba(0,124,162,.045); }
.table-responsive { border-radius: 12px; }

/* Pestañas internas: estilo "subrayado" con color de marca */
.nav-tabs { border-bottom: 2px solid var(--line-2); gap: 2px; }
.nav-tabs .nav-link {
  border: 0; border-bottom: 2px solid transparent; margin-bottom: -2px;
  color: var(--muted-2); font-weight: 600; border-radius: 9px 9px 0 0; padding: .55rem .95rem;
}
.nav-tabs .nav-link:hover { color: var(--brand-primary); background: rgba(227,61,72,.05); border-color: transparent; }
.nav-tabs .nav-link.active {
  color: var(--brand-primary); background: transparent;
  border-bottom: 2px solid var(--brand-primary);
}

/* Pills (botones-pestaña tipo enlace) */
.nav-pills .nav-link.active { background: var(--brand-primary); }

/* Listas */
.list-group-item { border-color: var(--line-2); }
.list-group-item-action:hover { background: rgba(0,124,162,.04); }

/* Dropdowns */
.dropdown-menu { border: 1px solid var(--line-2); border-radius: 12px; box-shadow: var(--shadow-md-2); padding: 6px; }
.dropdown-item { border-radius: 8px; padding: .5rem .7rem; font-weight: 500; }
.dropdown-item.text-danger:hover { background: rgba(227,61,72,.08); color: var(--brand-primary) !important; }

/* Formularios: etiquetas y ayudas más claras */
.form-label { font-weight: 600; font-size: 13.5px; color: #39414f; margin-bottom: .3rem; }
.form-control, .form-select { border-color: var(--line-2); border-radius: 10px; }
.form-text { color: var(--faint, #6b7382); }
.input-group-text { background: #f7f9fc; border-color: var(--line-2); }

/* Cabecera de página unificada (para secciones que la adopten) */
.page-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 22px; }
.page-head h1, .page-head h2, .page-head h3 { margin: 0; font-weight: 820; letter-spacing: -.4px; }

/* Badges un poco más redondeados */
.badge { border-radius: 7px; font-weight: 600; }
.badge.rounded-pill { border-radius: 999px; }

/* Nombre/foto de artista clicable (lleva a su ficha). Solo cursor; sin cambiar color ni estilo.
   El comportamiento lo añade static/js/artist_links.js sobre [data-artist-link]. */
[data-artist-link]{ cursor:pointer; }

/* ===================== Agenda / calendario de actividades ===================== */
/* Usado en Inicio (color por artista) y en la pestaña Agenda del artista (color por tipo).
   Lo pinta static/js/agenda_calendar.js; --c lleva el color de cada artista/tipo. */
.agenda-cal-root__loading{ padding:.75rem 0; }

.agenda-top{ display:flex; flex-wrap:wrap; gap:.4rem; margin-bottom:.9rem; }
.agenda-chip{ display:inline-flex; align-items:center; gap:.4rem; padding:.25rem .65rem .25rem .4rem; border:1px solid #e3e6eb; border-radius:999px; background:#fff; font-size:.82rem; line-height:1; cursor:pointer; color:#333; transition:box-shadow .12s ease, opacity .12s ease; }
.agenda-chip img{ width:22px;height:22px;border-radius:50%;object-fit:cover;flex:0 0 auto; }
.agenda-chip i{ color:var(--c); }
.agenda-chip__dot{ width:10px;height:10px;border-radius:50%;background:var(--c);flex:0 0 auto; }
.agenda-chip.is-on{ box-shadow:0 0 0 1.5px var(--c) inset; }
.agenda-chip:not(.is-on){ opacity:.5; filter:grayscale(.55); }

.agenda-body{ display:flex; gap:1rem; align-items:flex-start; }
.agenda-side{ flex:0 0 230px; max-width:230px; display:flex; flex-direction:column; gap:.35rem; }
.agenda-side__title{ font-size:.72rem; text-transform:uppercase; letter-spacing:.04em; color:#8a909a; font-weight:700; margin-bottom:.15rem; }
.agenda-cal{ flex:1 1 auto; min-width:0; }

/* Filtros por tipo (lateral en Inicio) */
.agenda-type{ display:flex; align-items:center; gap:.5rem; padding:.42rem .55rem; border:1px solid #e3e6eb; border-radius:.6rem; background:#fff; cursor:pointer; font-size:.84rem; text-align:left; color:#333; }
.agenda-type i{ color:var(--c); width:1.1em; text-align:center; }
.agenda-type__dot{ width:10px;height:10px;border-radius:50%;background:var(--c);flex:0 0 auto; }
.agenda-type.is-on{ border-color:var(--c); }
.agenda-type:not(.is-on){ opacity:.5; filter:grayscale(.55); }
.agenda-type--plain i{ color:#6b7280; }
.agenda-type--plain.is-on{ border-color:#c7ccd4; background:#f8f9fb; }

/* Asistente del botón + (añadir actividad / bloqueo / otro) */
.agenda-add-choices{ display:grid; grid-template-columns:1fr 1fr 1fr; gap:.6rem; }
.agenda-add-choice{ display:flex; flex-direction:column; align-items:center; gap:.25rem; text-align:center; padding:1rem .5rem; border:1px solid #e3e6eb; border-radius:.75rem; background:#fff; cursor:pointer; transition:border-color .12s ease, box-shadow .12s ease; }
.agenda-add-choice:hover{ border-color:var(--brand-primary); box-shadow:0 4px 14px rgba(20,25,35,.08); }
.agenda-add-choice i{ font-size:1.5rem; color:var(--brand-primary); }
.agenda-add-choice span{ font-weight:600; }
.agenda-add-choice small{ color:#8a909a; line-height:1.15; }
@media (max-width:540px){ .agenda-add-choices{ grid-template-columns:1fr; } }

/* Listado de eventos (lateral en la ficha de artista) */
.agenda-listitem{ display:flex; align-items:center; gap:.55rem; padding:.45rem .55rem; border:1px solid #eef0f3; border-left:4px solid var(--c); border-radius:.55rem; text-decoration:none; color:inherit; background:#fff; transition:box-shadow .12s ease; }
.agenda-listitem:hover{ box-shadow:0 4px 14px rgba(20,25,35,.08); color:inherit; }
.agenda-listitem__icon{ width:30px;height:30px;border-radius:.45rem;display:flex;align-items:center;justify-content:center;background:#f1f3f6;flex:0 0 auto; }
.agenda-listitem__icon i{ color:var(--c); }
.agenda-listitem__cover{ width:34px;height:34px;border-radius:.4rem;object-fit:cover;flex:0 0 auto; }
.agenda-listitem__body{ min-width:0; display:flex; flex-direction:column; }
.agenda-listitem__title{ font-weight:600; font-size:.85rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.agenda-listitem__sub{ font-size:.74rem; color:#6b7280; }
.agenda-listitem__date{ font-weight:600; color:#444; }
.agenda-listitem__del{ margin-left:auto; flex:0 0 auto; border:0; background:transparent; color:#b0b6bf; cursor:pointer; padding:.15rem .3rem; border-radius:.35rem; }
.agenda-listitem__del:hover{ color:#dc3545; background:#fbe9eb; }

/* Cabecera de navegación (agenda del artista: 4 semanas, flechas por meses) */
.agenda-cal__nav{ display:flex; align-items:center; justify-content:space-between; gap:.5rem; margin-bottom:8px; }
.agenda-cal__range{ font-weight:600; font-size:.9rem; color:#333; }
.agenda-cal__arrows{ display:flex; gap:.35rem; margin-left:auto; }
.agenda-nav-btn{ width:32px; height:32px; border:1px solid #d7dbe1; border-radius:.5rem; background:#fff; color:#444; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.agenda-nav-btn:hover:not(:disabled){ background:#f3f4f6; }
.agenda-nav-btn:disabled{ opacity:.4; cursor:default; }

/* Cuadrícula del calendario (lunes a domingo) */
.agenda-cal__head{ display:grid; grid-template-columns:repeat(7,1fr); gap:6px; margin-bottom:6px; }
.agenda-cal__dow{ text-align:center; font-size:.72rem; font-weight:700; color:#8a909a; text-transform:uppercase; }
.agenda-cal__grid{ display:grid; grid-template-columns:repeat(7,1fr); gap:6px; }
.agenda-cal__day{ min-height:94px; border:1px solid #e9ecf1; border-radius:.5rem; padding:4px; background:#fff; display:flex; flex-direction:column; gap:3px; overflow:hidden; }
.agenda-cal__day.is-out{ background:#f6f7f9; opacity:.55; }
.agenda-cal__day.is-today{ border-color:var(--brand-primary); box-shadow:0 0 0 2px rgba(227,61,72,.18); }
.agenda-cal__day.is-blocked{ background:repeating-linear-gradient(45deg,#f1f2f4,#f1f2f4 7px,#e7e9ec 7px,#e7e9ec 14px); }
.agenda-cal__num{ font-size:.74rem; font-weight:700; color:#6b7280; }
.agenda-cal__day.is-today .agenda-cal__num{ color:var(--brand-primary); }
.agenda-cal__events{ display:flex; flex-direction:column; gap:3px; }
.agenda-event{ display:flex; align-items:center; gap:5px; padding:2px 5px; border-radius:.4rem; background:var(--c); color:#fff; font-size:.72rem; line-height:1.2; text-decoration:none; overflow:hidden; }
.agenda-event:hover{ filter:brightness(1.07); color:#fff; }
.agenda-event__icon{ flex:0 0 auto; font-size:.7rem; }
.agenda-event__avatar{ width:15px;height:15px;border-radius:50%;object-fit:cover;flex:0 0 auto;border:1px solid rgba(255,255,255,.7); }
.agenda-event__cover{ width:16px;height:16px;border-radius:3px;object-fit:cover;flex:0 0 auto; }
.agenda-event__title{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.agenda-event__dot{ width:8px;height:8px;border-radius:50%;flex:0 0 auto;margin-left:auto;border:1px solid rgba(255,255,255,.75); }

/* Tooltip flotante */
.agenda-tip{ position:fixed; z-index:3000; max-width:264px; background:#1f2430; color:#fff; padding:.55rem .65rem; border-radius:.5rem; box-shadow:0 8px 24px rgba(0,0,0,.28); font-size:.78rem; pointer-events:none; }
.agenda-tip__head{ font-size:.66rem; text-transform:uppercase; letter-spacing:.04em; opacity:.8; margin-bottom:.15rem; }
.agenda-tip__title{ font-weight:700; }
.agenda-tip__sub{ opacity:.85; }
.agenda-tip__meta{ margin-top:.25rem; opacity:.92; }

/* Pills de estado (globales; antes solo inline en la ficha de artista) */
.agenda-status{ display:inline-block; padding:.04rem .4rem; border-radius:999px; font-size:.7rem; font-weight:600; }
.status-hablado{ background:#ffe8a1; color:#7a5b00; }
.status-reservado{ background:#cfe2ff; color:#084298; }
.status-confirmado{ background:#d1e7dd; color:#0f5132; }
.agenda-event__dot.status-hablado{ background:#ffc107; }
.agenda-event__dot.status-reservado{ background:#0d6efd; }
.agenda-event__dot.status-confirmado{ background:#198754; }

@media (max-width:768px){
  .agenda-body{ flex-direction:column; }
  .agenda-side{ flex:1 1 auto; max-width:none; width:100%; }
  .agenda-cal__day{ min-height:70px; }
  .agenda-event__title{ display:none; }
}

/* ===================== Fotos / vídeos (galería) ===================== */
.fotos-gallery{ display:grid; gap:.75rem; }
.fotos-grid2{ grid-template-columns:repeat(2,1fr); }
.fotos-grid3{ grid-template-columns:repeat(3,1fr); }
.fotos-list{ grid-template-columns:1fr; }
@media (max-width:575px){ .fotos-grid2,.fotos-grid3{ grid-template-columns:repeat(2,1fr); } }

.fotos-tile{ position:relative; border:1px solid #e6e6e6; border-radius:.6rem; overflow:hidden; background:#fff; cursor:pointer; transition:box-shadow .15s, border-color .15s; }
.fotos-tile:hover{ box-shadow:0 4px 14px rgba(0,0,0,.12); }
.fotos-tile--selected{ border-color:var(--brand-accent); box-shadow:0 0 0 2px var(--brand-accent) inset; }
.fotos-tile--dragging{ opacity:.45; }
.fotos-tile--discarded .fotos-tile__frame{ opacity:.5; filter:grayscale(.4); }
.fotos-tile__frame{ position:relative; aspect-ratio:1/1; background:#f2f2f2; }
.fotos-tile__media{ width:100%; height:100%; object-fit:cover; display:block; }
.fotos-tile__check{ position:absolute; top:.4rem; left:.4rem; z-index:3; margin:0; background:rgba(255,255,255,.85); border-radius:.35rem; padding:.1rem .25rem; line-height:1; }
.fotos-tile__title{ font-size:.8rem; padding:.35rem .5rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.fotos-tile__play{ position:absolute; inset:0; display:flex; align-items:center; justify-content:center; color:#fff; font-size:1.6rem; text-shadow:0 1px 4px rgba(0,0,0,.6); pointer-events:none; }

/* modo lista: fila horizontal */
.fotos-list .fotos-tile{ display:flex; align-items:center; }
.fotos-list .fotos-tile__frame{ width:64px; height:64px; aspect-ratio:auto; flex:0 0 auto; }
.fotos-list .fotos-tile__title{ flex:1 1 auto; white-space:normal; }
.fotos-list .fotos-tile__check{ position:static; background:none; order:-1; margin:0 .25rem 0 .5rem; }

/* álbumes */
.fotos-album{ border:1px solid #e6e6e6; border-radius:.6rem; padding:.75rem; margin-bottom:1rem; background:#fafafa; }
.fotos-album__head{ display:flex; align-items:center; gap:.75rem; margin-bottom:.6rem; }
.fotos-album__cover{ width:54px; height:54px; border-radius:.45rem; overflow:hidden; background:#e9e9e9; display:flex; align-items:center; justify-content:center; color:#999; }
.fotos-album__cover img{ width:100%; height:100%; object-fit:cover; }
.fotos-album__name{ font-weight:600; }

/* dropzone subida */
.fotos-dropzone{ border:2px dashed #cfcfcf; border-radius:.6rem; padding:1.6rem; text-align:center; color:#666; cursor:pointer; transition:border-color .15s, background .15s; }
.fotos-dropzone:hover,.fotos-dropzone--over{ border-color:var(--brand-accent); background:#f0f9fc; }
.fotos-filelist{ display:flex; flex-direction:column; gap:.4rem; }
.fotos-fileitem{ display:flex; align-items:center; gap:.6rem; border:1px solid #eee; border-radius:.45rem; padding:.3rem .5rem; }
.fotos-fileitem__thumb{ width:40px; height:40px; border-radius:.35rem; overflow:hidden; background:#f0f0f0; display:flex; align-items:center; justify-content:center; color:#999; flex:0 0 auto; }
.fotos-fileitem__thumb img{ width:100%; height:100%; object-fit:cover; }
.fotos-fileitem__name{ flex:1 1 auto; font-size:.85rem; }

/* buscador fotógrafo */
.fotos-typeahead{ max-height:260px; overflow:auto; }
.fotos-chip{ display:inline-flex; align-items:center; gap:.4rem; background:#f1f1f1; border-radius:999px; padding:.15rem .6rem .15rem .2rem; }
.fotos-social{ font-size:.85rem; white-space:nowrap; text-decoration:none; }
.fotos-avatar{ width:24px; height:24px; border-radius:50%; overflow:hidden; background:#e2e2e2; display:inline-flex; align-items:center; justify-content:center; color:#999; font-size:.7rem; flex:0 0 auto; }
.fotos-avatar img{ width:100%; height:100%; object-fit:cover; }

/* detalle */
.fotos-detail-media{ background:#000; border-radius:.5rem; overflow:hidden; display:flex; align-items:center; justify-content:center; min-height:260px; }
.fotos-detail-media__el{ max-width:100%; max-height:74vh; display:block; }
.fotos-detail-table th{ white-space:nowrap; }

/* Playlisting · toggles de plataforma (mostrar/ocultar) */
.pl-platform-btn{
  display:inline-flex; align-items:center; gap:.45rem;
  border:1.5px solid #dfe3e8; background:#fff; border-radius:999px;
  padding:.3rem .75rem; font-size:.85rem; font-weight:600; color:#2b3036;
  cursor:pointer; transition:opacity .15s ease, border-color .15s ease, background-color .15s ease;
}
.pl-platform-btn .pl-platform-logo{ height:16px; width:auto; }
.pl-platform-btn .pl-platform-eye{ font-size:.8rem; color:#198754; }
.pl-platform-btn:hover{ border-color:#bcc2c8; }
.pl-platform-btn.active{ border-color:var(--brand-accent); background:rgba(0,124,162,.08); color:#15394a; }
.pl-platform-btn:not(.active){ opacity:.55; background:#f4f5f6; }
.pl-platform-btn:not(.active) .pl-platform-logo{ filter:grayscale(1); }
.pl-platform-btn:not(.active) .pl-platform-name{ text-decoration:line-through; }
.pl-platform-btn:not(.active) .pl-platform-eye{ color:#adb5bd; }

/* lista agregada de fotos en la ficha del artista */
.fotos-artist-list{ display:flex; flex-direction:column; gap:.6rem; }
.fotos-artist-group{ display:flex; gap:.85rem; align-items:stretch; border:1px solid #e6e6e6; border-radius:.6rem; padding:.6rem; text-decoration:none; color:inherit; background:#fff; transition:box-shadow .15s; }
.fotos-artist-group:hover{ box-shadow:0 4px 14px rgba(0,0,0,.1); }
.fotos-artist-group__cover{ width:84px; height:84px; border-radius:.5rem; overflow:hidden; background:#eee; flex:0 0 auto; display:flex; align-items:center; justify-content:center; color:#aaa; }
.fotos-artist-group__cover img{ width:100%; height:100%; object-fit:cover; }
.fotos-artist-group__body{ flex:1 1 auto; min-width:0; }
.fotos-artist-group__thumbs{ display:flex; gap:.3rem; flex-wrap:wrap; }
.fotos-artist-group__thumb{ width:34px; height:34px; border-radius:.3rem; overflow:hidden; background:#f0f0f0; display:inline-block; }
.fotos-artist-group__thumb img{ width:100%; height:100%; object-fit:cover; }

/* Ficha de artista · iconos de redes (desde Chartmetric) abajo-derecha del hero */
.artist-social-hero{ position:absolute; right:1.25rem; bottom:1rem; display:flex; align-items:center;
  gap:.6rem; flex-wrap:wrap; justify-content:flex-end; max-width:62%; }
.artist-social-icon{ font-size:1.2rem; line-height:1; display:inline-flex; align-items:center;
  justify-content:center; text-decoration:none; transition:transform .12s ease, opacity .12s ease; }
.artist-social-icon:hover{ transform:translateY(-1px); opacity:.82; }
.artist-social-sep{ width:1px; height:18px; background:var(--line-2); margin:0 .2rem; }
@media (max-width: 767.98px){
  .artist-social-hero{ position:static; right:auto; bottom:auto; max-width:100%;
    justify-content:flex-start; margin-top:.75rem; flex-basis:100%; }
}

/* fotos · álbum menú + selector de portada */
.fotos-album__head{ position:relative; }
.fotos-album__menu{ margin-left:auto; }
.fotos-cover-picker{ display:flex; flex-wrap:wrap; gap:.4rem; }
.fotos-cover-picker__opt{ width:56px; height:56px; border-radius:.4rem; overflow:hidden; border:2px solid transparent; cursor:pointer; }
.fotos-cover-picker__opt img{ width:100%; height:100%; object-fit:cover; }
.fotos-cover-picker__opt--sel{ border-color:var(--brand-accent); }
.fotos-note span{ word-break:break-word; }

/* fotos · badge de estado de aprobación */
.fotos-tile__badge{ position:absolute; top:.4rem; right:.4rem; z-index:3; border-radius:50%; width:24px; height:24px; display:inline-flex; align-items:center; justify-content:center; padding:0; }
.fotos-list .fotos-tile__badge{ position:static; margin-left:auto; margin-right:.5rem; }

/* invitaciones · fuente pendiente de aprobar en el modal de asignación */
/* «Pendiente de aprobar» ya NO tiñe la tarjeta (solo lleva su etiqueta); el amarillo/verde de fondo
   lo dan ahora los estados de asignación (.assign-state-partial / .assign-state-full). */

/* Invitaciones · etiquetas de estado (pendientes / taquilla / enviadas) delante de los contadores */
.invitation-status-and-counts{ display:flex; align-items:center; gap:.85rem; flex-wrap:wrap; justify-content:flex-end; }
/* Columna de etiquetas de estado: ancho fijo para que todas queden alineadas y los contadores
   empiecen siempre en el mismo punto. Los badges ocupan todo el ancho (mismo tamaño) y el texto
   se ajusta en varias líneas en vez de cortarse. */
.invitation-status-flags{ display:flex; flex-direction:column; gap:.35rem; align-items:stretch; text-align:center; width:148px; flex:0 0 148px; }
.invitation-manage-flag{ font-size:.78rem; padding:.4rem .5rem; white-space:normal; line-height:1.2; display:block; width:100%; }
@media (max-width: 768px){ .invitation-status-flags{ width:100%; flex:0 0 100%; } }
/* Etiquetas de estado por petición/categoría (gestión): mismo tamaño para que queden alineadas. */
.inv-status-pill{ display:inline-flex; align-items:center; justify-content:center; min-width:116px; text-align:center; }
/* Inicio · "Invitaciones pendientes de gestionar": todas las etiquetas al mismo ancho (rellenan la
   columna de estado, que tiene ancho fijo) para que las tarjetas queden alineadas (singular/plural y
   nº de dígitos ya no descuadran). */
.home-inv-badges{ width:186px; flex:0 0 186px; }
.home-inv-badge{ display:inline-flex; align-items:center; justify-content:center; width:100%; text-align:center; white-space:normal; }
@media (max-width: 575.98px){ .home-inv-badges{ width:140px; flex-basis:140px; } }
/* Contador de cada categoría comprometida: ancho fijo para que las filas queden alineadas. */
.inv-cmt-count{ min-width:52px; text-align:center; flex:0 0 auto; }

/* ==========================================================================
   Red de seguridad RESPONSIVE (móvil): que el contenido no se salga de sus
   recuadros ni se corte. Muchos usuarios usan la app desde el móvil.
   ========================================================================== */
img, svg, video, canvas { max-width: 100%; }
img[style*="width:"] { height: auto; }

@media (max-width: 767.98px) {
  /* Márgenes del contenido más ajustados para ganar ancho útil. */
  main.container, main.container-fluid { padding-left: .8rem; padding-right: .8rem; }
  .card-body { padding: .85rem; }
  .modal-body { padding: .9rem; }

  /* Cortar palabras/URLs/tokens largos para que no empujen el ancho de su caja.
     (No se aplica a celdas de tabla: ahí preferimos el scroll horizontal.) */
  .card-body, .list-group-item, .modal-body, .alert, p, dd, .small, .text-muted,
  .badge, .dropdown-item, .form-text { overflow-wrap: anywhere; }

  /* Botones y grupos que no quepan que bajen de línea en vez de desbordar. */
  .btn-group, .d-flex.flex-nowrap { flex-wrap: wrap !important; }

  /* Píldoras de estado: reducir el ancho mínimo en pantallas estrechas. */
  .inv-status-pill { min-width: 96px; }

  /* Imágenes con ancho fijo en línea: que no superen su contenedor. */
  img[style*="width:"] { max-width: 100%; }
}

@media (max-width: 420px) {
  .inv-status-pill { min-width: 78px; font-size: .72rem; }
  .inv-cmt-count { min-width: 42px; }
}

/* Al imprimir, el envoltorio responsive no debe recortar la tabla. */
@media print { .table-responsive { overflow: visible !important; } }

/* Utilidad usada en varias plantillas para permitir encoger/truncar dentro de flex. */
.min-w-0 { min-width: 0 !important; }

/* iOS/iPad: sin un cursor "clicable" en el body, Safari NO dispara el click fuera de un
   dropdown y el menú de los tres puntos se queda abierto/superpuesto. Con cursor:pointer en
   táctiles, Bootstrap recibe el click y cierra el menú al tocar fuera. (Invisible en táctil.) */
@media (pointer: coarse) { body { cursor: pointer; } }

/* ===== Mapa de butacas del recinto (pestaña Ticketing de la ficha; static/js/venue_map.js) ===== */
.vmap-toolbar { display: flex; align-items: center; justify-content: space-between; gap: .75rem; flex-wrap: wrap; margin-bottom: .5rem; }
.vmap-stats { display: flex; gap: 1rem; font-size: .85rem; color: #6b7683; }
.vmap-stats b { color: #1e252d; font-variant-numeric: tabular-nums; }
.vmap-zoom { display: flex; align-items: center; gap: .3rem; }
.vmap-body { display: flex; gap: .75rem; align-items: stretch; }
.vmap-canvas { position: relative; flex: 1 1 auto; min-width: 0; height: 68vh; min-height: 380px; user-select: none; -webkit-user-select: none; }
.vmap-canvas svg { position: absolute; inset: 0; width: 100%; height: 100%; background: #f1f4f8; border: 1px solid #e2e7ee; border-radius: .8rem; touch-action: none; cursor: grab; display: block; }
.vmap-canvas svg:active { cursor: grabbing; }
.vmap-tip { position: absolute; left: .6rem; bottom: .6rem; pointer-events: none; background: #111; color: #fff; font-size: .74rem; padding: .3rem .6rem; border-radius: .45rem; white-space: nowrap; display: none; z-index: 5; opacity: .92; }
.vmap-side { flex: 0 0 300px; max-height: 68vh; overflow-y: auto; border: 1px solid #e2e7ee; border-radius: .8rem; padding: .7rem .8rem; background: #fff; }
.vmap-h { font-size: .72rem; text-transform: uppercase; letter-spacing: .07em; color: #6b7683; margin: 1rem 0 .45rem; }
.vmap-h:first-child { margin-top: 0; }
.vmap-tools { display: flex; flex-wrap: wrap; gap: .35rem; align-items: center; }
.vmap-param { display: grid; grid-template-columns: 7rem 1fr 3rem; align-items: center; gap: .5rem; margin: .3rem 0; font-size: .78rem; }
.vmap-param label { color: #6b7683; margin: 0; }
.vmap-param output { text-align: right; font-variant-numeric: tabular-nums; font-size: .75rem; }
.vmap-param input[type=range] { width: 100%; accent-color: var(--brand-primary); }
.vmap-param input[type=text] { grid-column: 2 / 4; }
.vmap-numrow { display: grid; grid-template-columns: 7rem 1fr 1fr 1fr; gap: .4rem; align-items: center; margin: .35rem 0; font-size: .78rem; }
.vmap-numrow label { color: #6b7683; margin: 0; }
.vmap-ringn { width: 4.2rem; }
@media (max-width: 900px) {
  .vmap-body { flex-direction: column; }
  .vmap-side { flex: 0 0 auto; max-height: none; }
  .vmap-canvas { height: 52vh; }
}

/* Mapa del recinto v2: modos, categorías y contador */
.vmap-seg { display: inline-flex; border: 1px solid #e2e7ee; border-radius: .6rem; overflow: hidden; }
.vmap-seg button { border: 0; background: transparent; padding: .32rem .8rem; cursor: pointer; font-weight: 600; font-size: .82rem; color: #1e252d; }
.vmap-seg button.on { background: var(--brand-primary); color: #fff; }
.vmap-seg--full { display: grid; grid-template-columns: 1fr 1fr; }  /* 2x2: la última ya no se corta */
.vmap-seg--full button { white-space: nowrap; }
.vmap-chip { position: absolute; pointer-events: none; background: var(--brand-primary); color: #fff; font-weight: 800; font-size: .85rem; padding: .3rem .6rem; border-radius: .55rem; transform: translate(12px, -32px); display: none; z-index: 6; font-variant-numeric: tabular-nums; box-shadow: 0 4px 12px rgba(0,0,0,.25); }
.vmap-cats { display: flex; flex-direction: column; gap: .3rem; }
.vmap-cat { display: flex; align-items: center; gap: .5rem; border: 1px solid #e2e7ee; border-radius: .6rem; padding: .38rem .55rem; cursor: pointer; background: #fff; }
.vmap-cat.on { border-color: var(--brand-primary); box-shadow: 0 0 0 .14rem rgba(227,61,72,.16); }
.vmap-cat .sw { width: 1rem; height: 1rem; border-radius: .3rem; flex: 0 0 auto; border: 1px solid rgba(0,0,0,.15); }
.vmap-cat .nm { font-size: .82rem; font-weight: 600; flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vmap-addcat { display: flex; gap: .4rem; margin-top: .45rem; align-items: center; }
.vmap-addcat input[type=color] { width: 2.2rem; height: 1.95rem; border: 1px solid #e2e7ee; border-radius: .5rem; padding: .1rem; background: #fff; }
.vmap-summary { border: 1px solid #e2e7ee; border-radius: .7rem; overflow: hidden; }
/* OJO: clase propia .vmap-srow (NO "row"): la .row de Bootstrap mete flex-wrap + gutters y rompia las filas del resumen. */
.vmap-summary .vmap-srow { display: flex; flex-wrap: nowrap; align-items: center; gap: .5rem; padding: .38rem .6rem; font-size: .8rem; border-top: 1px solid #eef1f5; margin: 0; }
.vmap-summary .vmap-srow.head { border-top: 0; background: #f5f7fa; font-weight: 700; }
.vmap-summary .sw { width: .75rem; height: .75rem; border-radius: .25rem; flex: 0 0 auto; }
.vmap-summary .n { margin-left: auto; font-variant-numeric: tabular-nums; font-weight: 600; }
.vmap-numrow--2 { grid-template-columns: 7rem 1fr 1fr; }

/* Mapa del recinto: tarjeta flotante de SELECCIÓN (total seleccionado, arrastrable a una categoría) */
.vmap-canvas .vmap-selpop { position: absolute; top: .55rem; right: .55rem; z-index: 7; display: none; width: 192px; background: #fff; border: 2px solid #e0a800; border-radius: .7rem; padding: .5rem .6rem; box-shadow: 0 8px 24px rgba(0,0,0,.18); cursor: grab; touch-action: none; user-select: none; }
.vmap-selpop.show { display: block; }
.vmap-selpop.dragging { cursor: grabbing; opacity: .88; }
.vmap-selpop-head { display: flex; justify-content: space-between; align-items: center; gap: .4rem; }
.vmap-selpop-head b { font-variant-numeric: tabular-nums; }
.vmap-selpop-x { border: 0; background: transparent; font-weight: 700; color: #6b7683; cursor: pointer; line-height: 1; }
.vmap-selpop-hint { font-size: .72rem; color: #6b7683; margin-top: .15rem; }
.vmap-cat.drop-hint { border-color: #e0a800; box-shadow: 0 0 0 .18rem rgba(224,168,0,.25); background: #fff9e6; }

/* Mapa del recinto: controles flotantes arriba a la IZQUIERDA (zoom +/−, girar, enderezar, ver
   todo y deshacer) — estilo mapa (Leaflet/Google Maps). */
.vmap-canvas .vmap-ctrls { position: absolute; top: .55rem; left: .55rem; z-index: 6; display: flex; flex-direction: column; gap: .4rem; }
.vmap-canvas .vmap-ctrl-group { display: flex; flex-direction: column; background: #fff; border: 1px solid #e2e7ee; border-radius: .55rem; overflow: hidden; box-shadow: 0 2px 8px rgba(16,24,40,.12); }
.vmap-canvas .vmap-ctrls button { width: 2.15rem; height: 2.15rem; border: 0; background: #fff; color: #49515d; font-size: .95rem; line-height: 1; display: flex; align-items: center; justify-content: center; cursor: pointer; padding: 0; }
.vmap-canvas .vmap-ctrl-group button + button { border-top: 1px solid #eceff3; }
.vmap-canvas .vmap-ctrls button:hover:not(:disabled) { background: #eef3f8; color: var(--brand-accent); }
.vmap-canvas .vmap-ctrls button:disabled { opacity: .45; cursor: default; }
.vmap-canvas .vmap-undo { border: 0; background: #fff; }

/* Mapa del recinto: parámetro con slider + campo numérico editable (sin tope) */
.vmap-param--num { grid-template-columns: 6.4rem 1fr 4.2rem; }
.vmap-param--num .vmap-numin { padding: .18rem .3rem; font-size: .75rem; text-align: right; }

/* Mapa del recinto: menú contextual del botón derecho (Copiar / Pegar / Duplicar / Eliminar) */
.vmap-canvas .vmap-ctx { position: absolute; z-index: 8; display: none; flex-direction: column; gap: 2px; min-width: 160px; background: #fff; border: 1px solid #e2e7ee; border-radius: .6rem; box-shadow: 0 10px 32px rgba(16,24,40,.18); padding: .3rem; }
.vmap-ctx button { border: 0; background: transparent; text-align: left; padding: .35rem .6rem; border-radius: .4rem; font-size: .82rem; cursor: pointer; }
.vmap-ctx button:hover:not(:disabled) { background: #f2f5f8; }
.vmap-ctx button:disabled { opacity: .45; cursor: default; }

/* Mapa del recinto: fantasma al ARRASTRAR una herramienta desde el panel + ✕ de categoría */
.vmap-toolghost { position: fixed; z-index: 9999; pointer-events: none; transform: translate(12px, 14px); background: #fff; border: 1px solid var(--brand-accent); border-radius: .5rem; padding: .25rem .55rem; font-size: .78rem; font-weight: 600; box-shadow: 0 4px 14px rgba(0,0,0,.22); }
.vmap-cat .vmap-cat-x { border: 0; background: transparent; color: #a5aeb8; font-weight: 700; line-height: 1; cursor: pointer; padding: 0 .15rem; flex: 0 0 auto; }
.vmap-cat .vmap-cat-x:hover { color: var(--brand-primary); }

/* ===== Módulo de RESULTADO (compartido simulación ↔ ficha de concierto/actividad) =====
   Promovidas a global desde simulacion_detail.html para reutilizar sim_partners.js y la
   tabla por % de aforo en las fichas. */
.sim-stat { background:#f8f9fa; border:1px solid #eef0f2; border-radius:14px; padding:.5rem .9rem; min-width:120px; }
.sim-stat__n { font-size:1.25rem; font-weight:700; line-height:1.1; }
.sim-stat__l { font-size:.72rem; text-transform:uppercase; letter-spacing:.02em; color:#6c757d; }
.sim-bar { background:#f1f3f5; border-radius:6px; height:18px; overflow:hidden; min-width:60px; }
.sim-bar__fill { height:100%; border-radius:6px; min-width:2px; }
.sim-bar__fill.pos { background:linear-gradient(90deg,#34d399,#047857); }
.sim-bar__fill.neg { background:linear-gradient(90deg,#fca5a5,#dc2626); }
.sim-result-table td, .sim-result-table th { vertical-align:middle; }
.sim-amt { border-bottom:1px dotted #b9c0c6; cursor:help; }
.simp-slider-wrap { position:relative; padding-top:34px; }
.simp-range { -webkit-appearance:none; appearance:none; width:100%; height:14px; border-radius:8px; outline:none; }
.simp-range::-webkit-slider-thumb { -webkit-appearance:none; appearance:none; width:22px; height:22px; border-radius:50%; background:#fff; border:3px solid #212529; cursor:pointer; box-shadow:0 1px 4px rgba(0,0,0,.25); }
.simp-range::-moz-range-thumb { width:22px; height:22px; border-radius:50%; background:#fff; border:3px solid #212529; cursor:pointer; }
.simp-be { position:absolute; top:0; transform:translateX(-50%); text-align:center; z-index:2; pointer-events:none; }
.simp-be__label { display:inline-block; background:#212529; color:#fff; border-radius:6px; font-size:.68rem; padding:.1rem .4rem; white-space:nowrap; }
.simp-be__arrow { display:block; width:0; height:0; margin:0 auto; border-left:6px solid transparent; border-right:6px solid transparent; border-top:7px solid #212529; }
.sim-partner-img { height:30px; max-width:100px; object-fit:contain; background:transparent; }
.sim-partner-img--ph { display:inline-flex; align-items:center; justify-content:center; width:30px; color:#adb5bd; }
.simp-table th, .simp-table td { padding-top:.55rem; padding-bottom:.55rem; vertical-align:middle; }
.simp-table .simp-name { white-space:normal; word-break:break-word; }
.simp-table .simp-logo { flex:0 0 auto; display:inline-flex; align-items:center; }

/* ===== Enterticket: barras de estado de la venta (pestaña Ticketing y compradores) ===== */
.et-bar { background:#f1f3f5; border-radius:8px; height:18px; overflow:hidden; min-width:80px; position:relative; }
.et-bar__fill { height:100%; border-radius:8px; min-width:2px; background:linear-gradient(90deg,#7cc4e8,#007CA2); transition:width .5s ease; }
.et-bar__fill.hot { background:linear-gradient(90deg,#fbbf24,#f59e0b); }   /* ≥85%: quedan pocas */
.et-bar__fill.full { background:linear-gradient(90deg,#34d399,#047857); }  /* 100%: agotada */
.et-bar__pct { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; font-size:.7rem; font-weight:700; color:#1f2937; text-shadow:0 0 3px rgba(255,255,255,.8); pointer-events:none; }

/* ===== Reporte de ventas: filtros por chips (estilo gestión de invitaciones) ===== */
.sales-chip-row { display:flex; flex-wrap:wrap; gap:.4rem; }
.sales-chip {
  display:inline-flex; align-items:center; gap:.4rem; max-width:100%;
  padding:.2rem .6rem .2rem .3rem; border:1px solid #dee2e6; border-radius:999px;
  background:#fff; color:#495057; font-size:.85rem; line-height:1.1; cursor:pointer;
  transition:background .15s, border-color .15s, color .15s, opacity .15s;
}
.sales-chip img, .sales-chip__ico {
  width:24px; height:24px; border-radius:50%; object-fit:cover; flex:0 0 auto;
  display:inline-flex; align-items:center; justify-content:center; background:#eef0f3; color:#6c757d;
}
.sales-chip__t { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:14rem; }
.sales-chip--sm { padding:.2rem .7rem; }
.sales-chip--sm .sales-chip__ico { width:18px; height:18px; font-size:.72rem; }
/* Artistas/eventos: activo = resaltado; inactivo = atenuado (se ve que está apagado). */
.sales-chip.active { background:var(--brand-primary,#E33D48); border-color:var(--brand-primary,#E33D48); color:#fff; }
.sales-chip.active .sales-chip__ico { background:rgba(255,255,255,.25); color:#fff; }
.sales-chip:not(.active) { opacity:.55; }
.sales-chip:hover { border-color:var(--brand-primary,#E33D48); }
.sales-search { min-width:min(260px,100%); }

/* Cabecera de grupo (agrupar por tipo / por artista) */
.sales-group-header {
  font-weight:700; font-size:.95rem; margin:1rem 0 .5rem; padding-bottom:.3rem;
  border-bottom:2px solid #eef0f2; color:#1f2937;
}
.sales-group-header__n { color:#adb5bd; font-weight:600; font-size:.85rem; }

/* Móvil: que el contenido se adapte SIN deformar fotos ni logos. */
@media (max-width:576px) {
  .sales-chip__t { max-width:9rem; }
  .sales-card .artist-avatar { width:42px; height:42px; }
  .sales-card .station-logo { width:38px; height:38px; }
}
.sales-card .artist-avatar, .sales-card .station-logo { object-fit:contain; }
.sales-card .artist-avatar { object-fit:cover; }

/* Socios (participaciones): logo + % apilados, SIN badge superpuesto. El nombre y el % van en el
   title -> tooltip al pasar el ratón por el logo. */
.socio-chip { display:inline-flex; flex-direction:column; align-items:center; gap:1px; text-decoration:none; }
.socio-chip .station-logo { width:38px; height:38px; object-fit:contain; }
.socio-chip__pct { font-size:.68rem; font-weight:700; color:#495057; line-height:1.1; }
.socio-chip__pct--prom { color:var(--brand-accent,#007CA2); }

/* Marcador del punto de empate sobre la barra de venta. */
.et-bar__mark { position:absolute; top:-2px; bottom:-2px; width:2px; background:#111827; opacity:.6; z-index:2; }
