/* ============================================================
   DICE.fm look & feel para Pretix (Ticketrona)
   Pegar en: Configuración del evento → Apariencia / Display
              → "CSS personalizado" (Custom CSS)
   Referencia: https://dice.fm/event/nv9k6l-imb-festival-madrid-...
   Página objetivo:
   https://tickets.ticketrona.com/organizacion1/test-redsys-1/
   ============================================================ */

@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');

:root {
    --dc-bg:           #000000;
    --dc-surface:      #1a1a1a;
    --dc-surface-2:    #111111;
    --dc-border:       rgba(255, 255, 255, 0.2);
    --dc-border-soft:  rgba(255, 255, 255, 0.08);
    --dc-text:         #ffffff;
    --dc-text-muted:   rgba(255, 255, 255, 0.66);
    --dc-text-dim:     rgba(255, 255, 255, 0.4);
    --dc-yellow:       #f2ef1d;
    --dc-yellow-hover: #fffd5b;
    --dc-radius:       16px;
    --dc-radius-btn:   100px;
    --dc-font:         'Inter', Helvetica, Arial, sans-serif;

    /* Miniatura del evento durante la compra. */
    --dc-logo-checkout: 160px;

    /* ---- Halo de la portada -------------------------------------
       En dice.fm el arte del evento se repite de fondo a todo ancho,
       ampliado y desenfocado al 40 %, y se funde a negro hacia abajo.
       Pretix sólo pinta la imagen una vez y el CSS no puede leer el
       src de un <img>, así que la URL va aquí a mano: es la misma
       imagen que has subido al evento (clic derecho sobre la portada
       → "Copiar dirección de la imagen").

           --dc-hero-image: url("https://tickets.…/logo.png");

       Si se deja en `none`, la portada mantiene un halo neutro y el
       resto del tema no cambia. */
    --dc-hero-image:   none;
    --dc-hero-height:  720px;
}

/* ---------- Base ---------- */
html,
body {
    /* `clip` (y no `hidden`) recorta el halo ampliado sin crear un
       contenedor de scroll. */
    overflow-x: clip;
    background-color: var(--dc-bg) !important;
    color: var(--dc-text) !important;
    font-family: var(--dc-font) !important;
    font-weight: 400;
    -webkit-font-smoothing: antialiased;
}

/* Halo neutro: lo que se ve cuando no se ha puesto la imagen del
   evento en --dc-hero-image. Con imagen queda por debajo de ella. */
body {
    position: relative;
    background-image: radial-gradient(120% 60% at 50% 0%,
                                      rgba(255, 255, 255, 0.09) 0%,
                                      rgba(255, 255, 255, 0.03) 35%,
                                      transparent 70%) !important;
    background-repeat: no-repeat !important;
    background-attachment: scroll !important;
}

/* El arte del evento, ampliado y borroso, fundiéndose a negro: es el
   degradado de la cabecera de dice.fm. Las paradas del fundido son las
   mismas que usa DICE, sólo que aplicadas como máscara de la imagen en
   vez de como capa negra encima. */
body::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: var(--dc-hero-height);
    z-index: 0;
    pointer-events: none;
    background-image: var(--dc-hero-image);
    background-size: cover;
    background-position: center top;
    background-repeat: no-repeat;
    opacity: 0.4;
    filter: blur(18px);
    /* la escala esconde el borde blando que deja el desenfoque */
    transform: scale(1.08);
    transform-origin: top center;
    -webkit-mask-image: linear-gradient(to bottom,
                        #000 0%, #000 37%,
                        rgba(0, 0, 0, 0.925) 45%,
                        rgba(0, 0, 0, 0.80) 53%,
                        rgba(0, 0, 0, 0.62) 62%,
                        rgba(0, 0, 0, 0.46) 70%,
                        rgba(0, 0, 0, 0.26) 81%,
                        transparent 100%);
            mask-image: linear-gradient(to bottom,
                        #000 0%, #000 37%,
                        rgba(0, 0, 0, 0.925) 45%,
                        rgba(0, 0, 0, 0.80) 53%,
                        rgba(0, 0, 0, 0.62) 62%,
                        rgba(0, 0, 0, 0.46) 70%,
                        rgba(0, 0, 0, 0.26) 81%,
                        transparent 100%);
}

a {
    color: var(--dc-text);
}

a:hover,
a:focus {
    color: var(--dc-yellow);
    text-decoration: none;
}

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: var(--dc-font);
    color: var(--dc-text);
    font-weight: 400;
    letter-spacing: -0.02em;
}

h1, .h1 { font-size: 56px; line-height: 1.05; font-weight: 400; }
h2, .h2 { font-size: 28px; line-height: 1.2; font-weight: 400; }
h3, .h3 { font-size: 20px; font-weight: 500; }
h4, .h4 { font-size: 16px; font-weight: 600; }

p, li { color: var(--dc-text-muted); }
strong, b { color: var(--dc-text); font-weight: 600; }

/* ---------- Contenedor principal ---------- */
.container.main-box {
    position: relative;
    z-index: 1;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding-top: 20px;
}

.page-header-links,
.page-header-links-outside {
    background: transparent !important;
    border: none !important;
}

/* ---------- Logo / portada del evento ---------- */
.page-header.pager-header-with-logo {
    background: transparent !important;
    border: none !important;
    padding: 0 !important;
    margin: 0 0 28px 0;
    text-align: center;
}

.page-header.pager-header-with-logo .event-logo {
    display: block;
    margin: 0 auto;
    border-radius: 8px;
    max-width: 100%;
    height: auto;
}

/* Durante la compra la imagen es sólo una referencia: si se deja a
   todo ancho, un arte cuadrado ocupa la pantalla entera y el
   formulario empieza fuera de la vista. Se queda en una miniatura,
   centrada igual que en la portada. Marca la página el
   <ol class="checkout-flow">, los pasos que Pretix pinta en todas las
   pantallas del proceso. */
main#content:has(.checkout-flow) .page-header.pager-header-with-logo .event-logo {
    max-width: var(--dc-logo-checkout);
}

/* ---------- Título del evento ---------- */
h2.content-header {
    font-size: 48px;
    font-weight: 400;
    line-height: 1.05;
    color: var(--dc-text);
    text-transform: none;
    letter-spacing: -0.02em;
    padding-bottom: 0;
    margin-top: 28px;
    border-bottom: none;
}

h2.content-header small {
    display: block;
    margin-top: 12px;
    color: var(--dc-yellow);
    font-size: 22px;
    font-weight: 400;
    letter-spacing: 0;
    text-transform: none;
}

h2.content-header small time {
    color: var(--dc-yellow);
}

/* ---------- Alertas (modo prueba) ---------- */
/* Pretix pinta el icono del aviso como una banda de color en ::before,
   pegada al borde izquierdo y a toda la altura. Sin reservarle sitio se
   come las primeras palabras del texto, sobre todo en móvil. */
.alert {
    position: relative;
    border-radius: 12px;
    border: 1px solid var(--dc-border-soft);
    padding: 14px 18px 14px 68px;
    overflow: hidden;
}

.alert::before {
    width: 44px !important;
    border-radius: 12px 0 0 12px;
}

.alert-warning::before,
.alert-testmode::before,
.alert-info::before,
.alert-success::before {
    background-color: var(--dc-yellow) !important;
}

.alert-danger::before {
    background-color: #ff5050 !important;
}

.alert-warning,
.alert-testmode {
    background: rgba(242, 239, 29, 0.06) !important;
    border-color: rgba(242, 239, 29, 0.4) !important;
    color: var(--dc-text-muted) !important;
}

.alert-warning strong,
.alert-testmode strong {
    color: var(--dc-yellow);
}

.alert-success {
    background: rgba(255, 255, 255, 0.04) !important;
    border-color: var(--dc-border) !important;
    color: var(--dc-text) !important;
}

.alert-info {
    background: rgba(255, 255, 255, 0.04) !important;
    border-color: var(--dc-border) !important;
    color: var(--dc-text-muted) !important;
}

.alert-danger {
    background: rgba(255, 80, 80, 0.10) !important;
    border-color: rgba(255, 80, 80, 0.45) !important;
    color: #ffc8c8 !important;
}

/* ---------- Texto general ---------- */
main#content p,
main#content li {
    color: var(--dc-text-muted);
    font-size: 16px;
    line-height: 1.55;
}

main#content strong {
    color: var(--dc-text);
}

/* ---------- Tarjetas de entradas (product-row) ---------- */
section.item-category {
    margin-top: 32px;
}

section.item-category > h3 {
    color: var(--dc-text);
    text-transform: none;
    letter-spacing: 0;
    font-size: 22px;
    font-weight: 400;
    margin-bottom: 18px;
    opacity: 1;
}

article.product-row {
    background: var(--dc-surface) !important;
    border: 1px solid var(--dc-border-soft) !important;
    border-radius: var(--dc-radius);
    padding: 20px 24px !important;
    margin: 0 0 12px 0 !important;
    transition: border-color .15s ease, background .15s ease;
}

article.product-row:hover {
    border-color: var(--dc-border) !important;
    background: #202020 !important;
}

article.product-row .product-description h4 {
    color: var(--dc-text);
    text-transform: none;
    font-weight: 600;
    letter-spacing: 0;
    font-size: 17px;
    margin: 0 0 4px 0;
}

article.product-row .product-description {
    color: var(--dc-text-muted);
}

article.product-row .price {
    color: var(--dc-text);
    font-weight: 700;
    font-size: 18px;
    text-align: right;
}

article.product-row .price p {
    margin: 0;
    color: var(--dc-text) !important;
}

/* ---------- Selector de cantidad (-, input, +) ---------- */
.availability-box {
    text-align: right;
    display: flex;
    justify-content: flex-end;
    align-items: center;
}

.input-item-count-group {
    display: inline-flex;
    align-items: center;
    border: 1px solid var(--dc-border);
    border-radius: var(--dc-radius-btn);
    overflow: hidden;
    background: transparent;
    max-width: 100%;
    flex-wrap: nowrap;
}

.input-item-count-group .btn,
.input-item-count-dec,
.input-item-count-inc {
    background: transparent !important;
    color: var(--dc-text) !important;
    border: none !important;
    border-radius: 0 !important;
    padding: 6px 10px !important;
    min-width: 32px;
    font-weight: 700;
    font-size: 15px;
    line-height: 1;
    flex: 0 0 auto;
}

.input-item-count-group .btn:hover {
    background: rgba(242, 239, 29, 0.12) !important;
    color: var(--dc-yellow) !important;
}

.input-item-count {
    background: transparent !important;
    color: var(--dc-text) !important;
    border: none !important;
    border-left: 1px solid var(--dc-border) !important;
    border-right: 1px solid var(--dc-border) !important;
    box-shadow: none !important;
    text-align: center;
    width: 42px !important;
    min-width: 0;
    /* Este campo va dentro de la cápsula de -/+ y manda su alto, así que
       se queda fuera del mínimo de 44px del resto de campos. */
    min-height: 0;
    padding: 6px 0 !important;
    font-weight: 600;
    font-size: 14px;
    flex: 0 1 auto;
}

/* En desktop la columna .col-md-2 es muy estrecha; ampliamos un poco la
   columna de cantidad sacándolo de la columna de precio. */
@media (min-width: 992px) {
    article.product-row .col-md-8 { width: 58.333%; }
    article.product-row .col-md-2.price { width: 16.666%; }
    article.product-row .col-md-2.availability-box { width: 25%; }
}

/* ---------- Botones (estilo "Buy now" pill) ---------- */
.btn {
    font-family: var(--dc-font);
    border-radius: var(--dc-radius-btn);
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    padding: 10px 22px;
    font-size: 13px;
    transition: background .15s, color .15s, border-color .15s, transform .1s;
}

.btn-lg {
    padding: 16px 28px !important;
    font-size: 14px !important;
}

.btn:active {
    transform: translateY(1px);
}

.btn-primary,
.btn-primary:focus,
#btn-add-to-cart {
    background: var(--dc-yellow) !important;
    border: 2px solid var(--dc-yellow) !important;
    color: #000 !important;
}

.btn-primary:hover,
#btn-add-to-cart:hover {
    background: var(--dc-yellow-hover) !important;
    border-color: var(--dc-yellow-hover) !important;
    color: #000 !important;
}

.btn-default {
    background: transparent !important;
    border: 2px solid var(--dc-border) !important;
    color: var(--dc-text) !important;
}

.btn-default:hover,
.btn-default:focus {
    background: rgba(255, 255, 255, 0.06) !important;
    border-color: rgba(255, 255, 255, 0.5) !important;
    color: var(--dc-text) !important;
}

.btn-success {
    background: var(--dc-yellow) !important;
    border: 2px solid var(--dc-yellow) !important;
    color: #000 !important;
}

.btn-success:hover {
    background: var(--dc-yellow-hover) !important;
    border-color: var(--dc-yellow-hover) !important;
}

/* ---------- Inputs ---------- */
.form-control {
    background: var(--dc-surface) !important;
    border: 1px solid var(--dc-border-soft) !important;
    color: var(--dc-text) !important;
    border-radius: 10px;
    box-shadow: none !important;
    padding: 12px 14px;
    font-size: 15px;
    /* Bootstrap fija `height: 34px` en los campos. Con el relleno de
       12px del tema sólo quedan ~8px para el texto: en los <input> se
       nota poco, pero un <select> (el prefijo de país del teléfono)
       recorta la línea por la mitad. La altura la marca el contenido. */
    height: auto;
    min-height: 44px;
}

.form-control:focus {
    border-color: var(--dc-yellow) !important;
    box-shadow: 0 0 0 3px rgba(242, 239, 29, 0.2) !important;
    background: var(--dc-surface) !important;
}

.form-control::placeholder {
    color: var(--dc-text-dim);
}

select.form-control,
textarea.form-control {
    background: var(--dc-surface) !important;
    color: var(--dc-text) !important;
}

select.form-control option {
    background: var(--dc-surface-2);
    color: var(--dc-text);
}

textarea.form-control {
    min-height: 88px;
}

/* Prefijo de un campo compuesto (el icono del vale de compra, por
   ejemplo). Bootstrap lo deja en gris claro: sin esto queda una caja
   blanca pegada al campo. */
.input-group-addon {
    background: var(--dc-surface-2);
    border: 1px solid var(--dc-border-soft);
    color: var(--dc-text-muted);
    border-radius: 10px 0 0 10px;
}

.input-group .form-control:not(:first-child) {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
}

.input-group .form-control:not(:last-child) {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

input[type="checkbox"],
input[type="radio"] {
    accent-color: var(--dc-yellow);
}

/* ---------- Bloque "Si ya ha pedido una entrada" ---------- */
aside.front-page {
    background: var(--dc-surface) !important;
    border: 1px solid var(--dc-border-soft);
    border-radius: var(--dc-radius);
    padding: 24px;
    margin-top: 40px;
}

aside.front-page h2,
aside.front-page .h3 {
    color: var(--dc-text);
    text-transform: none;
    letter-spacing: 0;
    font-size: 20px;
    font-weight: 600;
    margin-top: 0;
}

aside.front-page p {
    color: var(--dc-text-muted);
}

/* ---------- Footer ---------- */
footer {
    margin-top: 60px;
    padding-top: 24px;
    border-top: 1px solid var(--dc-border-soft);
    color: var(--dc-text-dim);
}

footer nav ul {
    list-style: none;
    padding: 0;
    text-align: center;
}

footer nav ul li {
    display: inline-block;
    margin: 0 12px;
}

footer a {
    color: var(--dc-text-dim) !important;
    font-size: 13px;
}

footer a:hover {
    color: var(--dc-yellow) !important;
}

/* ---------- Modales ---------- */
.modal-card,
.modal-content {
    background: var(--dc-surface) !important;
    color: var(--dc-text) !important;
    border-radius: var(--dc-radius) !important;
    border: 1px solid var(--dc-border-soft) !important;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.8) !important;
}

.modal-card-icon .fa {
    color: var(--dc-yellow);
}

.modal-card-title,
.modal-card-content h2,
.modal-card-content h3 {
    color: var(--dc-text);
}

.modal-card-description,
.modal-card-content p {
    color: var(--dc-text-muted);
}

.fa,
.info-row-icon {
    color: var(--dc-yellow);
}

/* ============================================================
   CHECKOUT (questions / payment / confirm)
   ============================================================ */

/* ---------- Wizard ---------- */
.checkout-flow {
    display: flex;
    justify-content: space-between;
    list-style: none;
    padding: 0;
    margin: 24px 0 36px 0;
    position: relative;
}

.checkout-flow::before {
    content: '';
    position: absolute;
    top: 16px;
    left: 8%;
    right: 8%;
    height: 1px;
    background: var(--dc-border-soft);
    z-index: 0;
}

.checkout-step {
    position: relative;
    z-index: 1;
    flex: 1;
    text-align: center;
    color: var(--dc-text-dim);
}

.checkout-step-icon {
    width: 34px !important;
    height: 34px !important;
    line-height: 32px !important;
    border-radius: 50% !important;
    background: var(--dc-bg) !important;
    border: 1px solid var(--dc-border) !important;
    color: var(--dc-text-dim) !important;
    margin: 0 auto 8px auto;
    display: inline-block;
    text-align: center;
    font-size: 14px;
}

.checkout-step.step-current .checkout-step-icon,
.checkout-step.step-done .checkout-step-icon {
    background: var(--dc-yellow) !important;
    border-color: var(--dc-yellow) !important;
    color: #000 !important;
}

.checkout-step.step-current .checkout-step-label,
.checkout-step.step-done .checkout-step-label {
    color: var(--dc-text);
    font-weight: 600;
}

.checkout-step-label {
    font-size: 11px;
    line-height: 1.3;
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

/* ---------- Paneles ---------- */
.panel,
.panel-default {
    background: var(--dc-surface) !important;
    border: 1px solid var(--dc-border-soft) !important;
    border-radius: var(--dc-radius) !important;
    box-shadow: none !important;
    color: var(--dc-text);
    margin-bottom: 16px;
    overflow: hidden;
}

.panel-heading,
summary.panel-heading {
    background: transparent !important;
    border-bottom: 1px solid var(--dc-border-soft) !important;
    color: var(--dc-text) !important;
    padding: 16px 20px !important;
    cursor: pointer;
    list-style: none;
}

summary.panel-heading::-webkit-details-marker {
    display: none;
}

summary.panel-heading::after {
    content: '\f078';
    font-family: FontAwesome;
    float: right;
    color: var(--dc-text-dim);
    transition: transform .2s ease;
}

details[open] > summary.panel-heading::after {
    transform: rotate(180deg);
}

.panel-title,
.panel-heading h2,
.panel-heading h3 {
    color: var(--dc-text);
    font-size: 16px;
    font-weight: 600;
    margin: 0;
    text-transform: none;
    letter-spacing: 0;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.panel-title .fa,
.panel-title i {
    color: var(--dc-yellow);
    margin-right: 8px;
}

.panel-title a,
.panel-title .h6 {
    font-size: 12px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--dc-text-dim) !important;
    margin-left: auto;
}

.panel-title a:hover {
    color: var(--dc-yellow) !important;
}

.panel-title a .fa {
    margin-right: 4px;
    color: inherit;
}

.panel-body {
    background: transparent !important;
    color: var(--dc-text) !important;
    padding: 20px !important;
}

/* ---------- Carrito ---------- */
details.panel.cart {
    background: var(--dc-surface) !important;
}

#cart-deadline-short {
    color: var(--dc-yellow);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
}

#cart-deadline {
    color: var(--dc-text-dim);
    font-size: 13px;
    margin: 12px 0 6px 0;
}

#cart-extend-form.text-muted {
    color: var(--dc-text-dim) !important;
}

.inline-dialog {
    background: var(--dc-surface) !important;
    color: var(--dc-text) !important;
    border: 1px solid var(--dc-border-soft) !important;
    border-radius: var(--dc-radius) !important;
}

.cart-row {
    color: var(--dc-text);
    padding: 10px 0;
    border-bottom: 1px solid var(--dc-border-soft);
}

.cart-row.total {
    border-top: 1px solid var(--dc-border);
    border-bottom: none;
    margin-top: 8px;
    padding-top: 14px;
    font-size: 16px;
}

.cart-row .product strong,
.cart-row .totalprice strong,
.cart-row .singleprice {
    color: var(--dc-text);
}

.cart-row .text-muted {
    color: var(--dc-text-dim) !important;
}

/* Cantidad de una línea del carrito: quitar/poner una entrada con el
   número en medio. Son botones normales, así que heredan el relleno de
   22px de `.btn` y no caben en su celda: el "+" se caía a la línea de
   abajo. Aquí van como iconos, sin relleno lateral ni interletraje. */
.cart-row .count {
    white-space: nowrap;
}

.cart-row .count form {
    display: inline-block;
}

.cart-row .count .btn {
    padding: 4px 8px;
    min-width: 0;
    letter-spacing: 0;
    font-size: 14px;
    vertical-align: middle;
}

#cart-foldable-container,
.sneak-peek-content {
    background: transparent !important;
}

.sneak-peek-container .sneak-peek-content,
.sneak-peek-content {
    -webkit-mask-image: none !important;
    mask-image: none !important;
}

.sneak-peek-content::before,
.sneak-peek-content::after,
.sneak-peek-container::before,
.sneak-peek-container::after {
    background: transparent !important;
    background-image: none !important;
    display: none !important;
    content: none !important;
}

.sneak-peek-container:not(.details-open) .sneak-peek-content {
    -webkit-mask-image: linear-gradient(to bottom, #000 50%, transparent 100%) !important;
            mask-image: linear-gradient(to bottom, #000 50%, transparent 100%) !important;
}

/* El botón "Mostrar carrito completo" va en absoluto sobre la vista
   previa del carrito: necesita fondo propio o se le transparentan las
   filas por debajo. El degradado arranca en el mismo color del panel
   con alfa 0 —si cambias --dc-surface, cámbialo también aquí— para que
   no aparezca un velo gris. */
.sneak-peek-trigger {
    margin: 0;
    padding: 28px 20px 12px;
    border-top: none;
    background: linear-gradient(to bottom,
                rgba(26, 26, 26, 0) 0%,
                var(--dc-surface) 55%) !important;
}

.sneak-peek-trigger .btn-default {
    width: 100%;
}

/* ---------- Formularios ---------- */
.form-horizontal .control-label,
.control-label,
label {
    color: var(--dc-text) !important;
    font-weight: 500;
    letter-spacing: 0;
    font-size: 14px;
}

/* El <i> del "obligatorio" es display:inline de serie: al partirse en
   dos líneas, la píldora se monta sobre el campo. */
.label-required {
    display: inline-block !important;
    width: auto !important;
    vertical-align: middle;
    color: #000 !important;
    background: var(--dc-yellow);
    font-style: normal;
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    margin-left: 6px;
    letter-spacing: 0.08em;
    border-radius: 100px;
    padding: 2px 8px;
}

.form-group {
    margin-bottom: 20px;
}

.form-group.has-error .form-control {
    border-color: #ff5050 !important;
    box-shadow: 0 0 0 3px rgba(255, 80, 80, 0.2) !important;
}

.form-group.has-error .control-label,
.form-group.has-error .help-block {
    color: #ff8c8c !important;
}

.help-block {
    color: var(--dc-text-dim) !important;
    font-size: 12px;
    margin-top: 6px;
}

.help-block p {
    margin: 0;
    color: var(--dc-text-dim) !important;
    font-size: 12px !important;
}

/* ---------- list-group / método de pago ---------- */
.list-group {
    background: transparent !important;
    border-radius: 0 0 var(--dc-radius) var(--dc-radius);
    margin: 0;
    padding: 0;
}

.list-group-item {
    background: transparent !important;
    border: none !important;
    border-top: 1px solid var(--dc-border-soft) !important;
    color: var(--dc-text) !important;
    padding: 16px 20px;
}

.list-group-item:first-child {
    border-top: none !important;
}

.list-group-item h4,
.list-group-item h5 {
    color: var(--dc-text);
}

.list-group-item p,
.list-group-item .text-center {
    color: var(--dc-text-muted) !important;
}

/* ---------- Botonera del checkout ---------- */
/* Pretix la pinta con `flex-direction: row-reverse` y sin permitir
   saltos de línea: cuando los botones no caben —el carrito de la
   portada con "Vaciar carrito" y "Canjear vale de compra" a la vez, más
   aún si la portada va a dos columnas— el desbordamiento se va hacia la
   IZQUIERDA y el botón se sale del panel. Con `wrap` los secundarios
   bajan de línea; `wrap-reverse` mantiene el botón principal abajo a la
   derecha, que es donde se espera. */
.checkout-button-row {
    margin-top: 28px;
    padding-top: 24px;
    border-top: 1px solid var(--dc-border-soft);
    flex-wrap: wrap-reverse;
    align-items: center;
    gap: 12px;
}

.checkout-button-secondary {
    flex-wrap: wrap;
}

.checkout-button-row p {
    margin: 0;
}

.checkout-button-row .btn-lg {
    padding: 16px 28px;
    font-size: 14px;
}

/* ---------- Tablas ---------- */
table,
.table {
    color: var(--dc-text);
    background: transparent;
}

table th,
.table th {
    color: var(--dc-text);
    border-bottom: 1px solid var(--dc-border) !important;
}

table td,
.table td {
    border-top: 1px solid var(--dc-border-soft) !important;
    color: var(--dc-text-muted);
}

/* ---------- Otros ajustes finos ---------- */
hr {
    border-top-color: var(--dc-border-soft);
}

.text-muted {
    color: var(--dc-text-dim) !important;
}

::selection {
    background: var(--dc-yellow);
    color: #000;
}
/* ============================================================
   DICE.fm — complemento: portada a DOS COLUMNAS

   El reparto de dice.fm:

   Izquierda : imagen del evento, pegajosa al hacer scroll.
   Derecha   : título y fecha, debajo la ubicación y los horarios
               (bloques .info-row), debajo las entradas (productos +
               botón de compra) y, al final, la descripción.

   Se pega DESPUÉS de dice-pretix.css, en el mismo campo "CSS
   personalizado" del evento. Es independiente: si se quita, el tema
   sigue funcionando con la portada de una columna.

   Sólo actúa en escritorio (≥992px), sólo en la página de entradas
   (usa :has() para detectar que hay productos) y sólo si el evento NO
   tiene plano de butacas: el plano necesita el ancho completo. En
   navegadores sin :has() no se aplica nada y se ve la portada normal.
   ============================================================ */

@media (min-width: 992px) {

    main#content:has(article.product-row):not(:has(.panel-seating)) {
        display: grid;
        /* imagen : contenido — sube el primer valor para dar más
           sitio a la imagen, o el segundo para el contenido */
        grid-template-columns: minmax(0, 4fr) minmax(0, 8fr);
        column-gap: 48px;
        row-gap: 0;
        align-items: start;
    }

    /* Columna izquierda por defecto (ahí sólo queda la imagen). */
    main#content:has(article.product-row):not(:has(.panel-seating)) > * {
        grid-column: 1;
        min-width: 0;
    }

    /* La columna derecha va por filas fijas, en el orden de dice.fm:

           1  título y fecha
           2  ubicación / fecha y hora (bloques .info-row)
           3  carrito, si hay algo dentro
           4  entradas y botón de compra
           5  descripción del evento

       Las filas que no existen en un evento concreto (sin carrito, sin
       descripción…) se quedan a cero: `row-gap` es 0 y el espaciado lo
       ponen los márgenes de cada bloque. */
    main#content:has(article.product-row):not(:has(.panel-seating)) > h2.content-header {
        grid-column: 2;
        grid-row: 1;
        text-align: left;
        margin: 0 0 24px 0;
        font-size: 36px;
    }

    /* Ubicación, fecha y hora: suben junto al título, como en dice.fm.
       Es el único <div> hijo de main que lleva filas .info-row. */
    main#content:has(article.product-row):not(:has(.panel-seating)) > div:has(> .info-row) {
        grid-column: 2;
        grid-row: 2;
        margin: 0 0 32px 0;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > details.cart {
        grid-column: 2;
        grid-row: 3;
        margin: 0 0 24px 0;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > form {
        grid-column: 2;
        grid-row: 4;
        margin: 0;
    }

    /* La descripción baja por debajo del botón de compra. Es el <div>
       hijo de main con párrafos propios: el de la ubicación los lleva
       dentro de .info-row, y el aviso de modo de pruebas es .alert. */
    main#content:has(article.product-row):not(:has(.panel-seating)) > div:has(> p):not(.alert):not(:has(.info-row)) {
        grid-column: 2;
        grid-row: 5;
        margin: 40px 0 0 0;
    }

    /* La imagen abarca todas las filas de la columna derecha y acompaña
       al scroll, como el artwork de dice.fm, pero sin pasar de los
       bloques finales ("Canjear vale de compra", "Si ya ha pedido una
       entrada"): al llegar a ellos se queda parada y la página sigue
       subiendo.

       Quien se pega es el <div> de dentro, no la cabecera. Chromium no
       frena un `position: sticky` en el borde de su celda de la
       retícula —lo deja correr hasta el fondo de la retícula entera, y
       la imagen acaba montándose sobre esos bloques en pantallas
       bajas—, así que la cabecera se estira (`align-self: stretch`)
       hasta donde terminan sus 51 filas y hace de tope del <div>
       pegajoso, que es un bloque normal y ahí sí se detiene. */
    main#content:has(article.product-row):not(:has(.panel-seating)) > .page-header.pager-header-with-logo {
        grid-row: 1 / span 51;
        align-self: stretch;
        margin: 0 0 24px 0;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > .page-header.pager-header-with-logo > div:not(.clearfix) {
        position: sticky;
        top: 24px;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > .page-header .event-logo {
        width: 100%;
        max-width: 100%;
        height: auto;
    }

    /* Los bloques finales ocupan todo el ancho. Van después de las dos
       columnas, así que no desplazan nada: se colocan solos, en las
       filas libres que quedan por debajo del texto.
       Ojo: cualquier elemento a 1/-1 colocado ANTES rompería el reparto
       de columnas.

       Cada bloque lleva su fila: Pretix pinta uno ("Si ya ha pedido una
       entrada") o dos —el de canjear el vale de compra aparece sólo si
       el evento tiene vales—, y compartiendo fila se montarían uno
       encima del otro. */
    main#content:has(article.product-row):not(:has(.panel-seating)) > aside.front-page {
        grid-column: 1 / -1;
        margin-top: 40px;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > aside.front-page:nth-of-type(1) {
        grid-row: 52;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > aside.front-page:nth-of-type(2) {
        grid-row: 53;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > aside.front-page:nth-of-type(3) {
        grid-row: 54;
    }

    /* El pie cierra la página, a todo ancho y por debajo de los bloques
       finales. Colocado a mano por lo mismo: la colocación automática lo
       metería en la columna de la imagen. */
    main#content:has(article.product-row):not(:has(.panel-seating)) > footer {
        grid-column: 1 / -1;
        grid-row: 55;
    }

    /* Fecha, hora y recinto (bloques .info-row de Pretix), separados por
       la línea fina del tema. */
    main#content:has(article.product-row):not(:has(.panel-seating)) .info-row {
        border-top: 1px solid var(--dc-border-soft);
        padding: 12px 0;
        margin: 0;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) .info-row:last-child {
        border-bottom: 1px solid var(--dc-border-soft);
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) section.item-category > h3 {
        text-align: left;
    }

    /* La columna es más estrecha: se reparten nombre, precio y cantidad. */
    main#content:has(article.product-row):not(:has(.panel-seating)) article.product-row .col-md-8 {
        width: 50%;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) article.product-row .col-md-2.price {
        width: 22%;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) article.product-row .col-md-2.availability-box {
        width: 28%;
    }

    /* El botón de compra ocupa toda la columna: si se queda en su tercio
       de Bootstrap, el texto parte en dos líneas. */
    main#content:has(article.product-row):not(:has(.panel-seating)) .front-page .col-md-4.col-md-offset-8 {
        width: 100%;
        margin-left: 0;
    }

    /* ---------- Eventos SIN h2.content-header ----------
       Cuando el evento tiene logo grande, Pretix no genera el título
       visible: mete el nombre y las fechas en un <h1 class="sr-only">
       dentro de la cabecera, oculto salvo para lectores de pantalla.
       Aquí desmontamos la cabecera (display:contents) para repartir su
       título a la columna derecha y su imagen a la izquierda. */
    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header.pager-header-with-logo,
    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header.pager-header-with-logo > div:not(.clearfix) {
        display: contents;
    }

    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header .clearfix {
        display: none;
    }

    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header h1 {
        grid-column: 2;
        grid-row: 1;
        position: static;
        width: auto;
        height: auto;
        overflow: visible;
        clip: auto;
        clip-path: none;
        white-space: normal;
        margin: 0 0 24px 0;
        padding: 0;
        text-align: left;
        font-size: 36px;
        font-weight: 400;
        letter-spacing: -0.02em;
        color: var(--dc-text);
    }

    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header h1 small,
    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header h1 small time {
        display: block;
        margin-top: 12px;
        font-size: 22px;
        font-weight: 400;
        letter-spacing: 0;
        color: var(--dc-yellow);
    }

    /* Aquí la cabecera está desmontada, así que el tope de la imagen lo
       hace el enlace que la envuelve: se estira hasta el final de las
       51 filas y la imagen se pega dentro de él. Si el evento no lleva
       enlace en la imagen, es ella la que va en la retícula y se pega
       ella misma. */
    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header > div > a {
        grid-column: 1;
        grid-row: 1 / span 51;
        align-self: stretch;
        display: block;
        margin-bottom: 24px;
    }

    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header > div > a > .event-logo {
        position: sticky;
        top: 24px;
    }

    main#content:not(:has(h2.content-header)):has(article.product-row):not(:has(.panel-seating)) > .page-header > div > .event-logo {
        grid-column: 1;
        grid-row: 1 / span 51;
        align-self: start;
        position: sticky;
        top: 24px;
        display: block;
        margin-bottom: 24px;
    }

    /* Un evento sin ningún título deja la fila 1 vacía; con `row-gap`
       a 0 no ocupa nada y el resto de la columna sube solo. */
}

/* ============================================================
   PORTADA EN MÓVIL — el mismo orden, en una sola columna

   Debajo de 992px no hay dos columnas, pero el orden que sirve
   Pretix deja la descripción entre el título y las entradas: hay que
   bajar toda la descripción para llegar a comprar. Con una retícula
   de una columna repetimos el orden de escritorio: título, ubicación
   y horarios, entradas con su botón y, al final, la descripción.
   ============================================================ */

@media (max-width: 991px) {

    main#content:has(article.product-row):not(:has(.panel-seating)) {
        display: grid;
        grid-template-columns: minmax(0, 1fr);
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > h2.content-header {
        order: 1;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > div:has(> .info-row) {
        order: 2;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > details.cart {
        order: 3;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > form {
        order: 4;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > div:has(> p):not(.alert):not(:has(.info-row)) {
        order: 5;
        margin-top: 40px;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > aside.front-page {
        order: 6;
    }

    main#content:has(article.product-row):not(:has(.panel-seating)) > footer {
        order: 7;
    }
}