/* =============================================================
   EXHIBITOR LOGIN PORTAL — .exh-portal-* / .exh-*
   Shared by 13 pages: exhibitor-login.php, exhibitor-dashboard.php,
   and the 11 stall-detail forms. Split out of css/common.css on
   2026-09-06 (mobile perf audit). Frontend-only design pass — reuses
   existing tokens/.form-control, no new brand hex. Semantic status
   colors (green/amber) follow the precedent already set by
   #pop_enq_success/.notice-box elsewhere in this file/
   Education_awards.php.
   ============================================================= */

.exh-portal-main {
    padding: calc(var(--nav-height) + 40px) var(--edge-pad) 80px;
    box-sizing: border-box;
    width: 100%;
}

.exh-portal-wide  { max-width: 1180px; margin: 0 auto; }
.exh-portal-form  { max-width: 780px;  margin: 0 auto; }
.exh-portal-form.exh-portal-form--wide { max-width: 940px; }   /* Exhibitor Badge's 4-column officials grid needs the room */
.exh-portal-form.exh-portal-form--xwide { max-width: 1080px; }   /* Electricity's 5-column rate table (booth type, 2 rates, kW input, total) needs the room */

/* --- Intro header (eyebrow + h1 + subtext) --- */
.exh-portal-intro {
    max-width: 620px;
    margin: 0 auto 32px;
    text-align: center;
}

.exh-portal-intro--left {
    max-width: none;
    margin: 0 0 28px;
    text-align: left;
}

.exh-portal-intro h1 {
    font-size: clamp(1.9rem, 3.4vw, 2.6rem);
    font-weight: 800;
    color: var(--text-dark);
    line-height: 1.15;
    letter-spacing: -0.02em;
    margin-bottom: 12px;
}

.exh-portal-intro--left h1 { font-size: clamp(1.6rem, 2.8vw, 2.1rem); }

.exh-portal-subtext {
    font-size: 0.98rem;
    color: var(--text-gray);
    line-height: 1.6;
    max-width: 520px;
    margin: 0 auto;
}

.exh-portal-intro--left .exh-portal-subtext { max-width: none; margin: 0; }

.exh-back-link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 0.85rem;
    font-weight: 700;
    color: var(--brand-blue);
    text-decoration: none;
    margin-bottom: 18px;
    transition: color var(--trans-base);
}

.exh-back-link:hover { color: var(--brand-purple); text-decoration: underline; }
.exh-back-link svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }

/* --- Card container --- */
.exh-portal-card {
    background: #ffffff;
    border-radius: var(--radius-md);
    border: 1px solid rgba(20, 83, 188, 0.08);
    box-shadow: 0 4px 32px rgba(20, 83, 188, 0.07), 0 1px 4px rgba(0, 0, 0, 0.04);
    padding: 36px 40px;
}

.exh-login-card { max-width: 460px; margin: 0 auto; }

/* --- Fields --- */
.exh-field { margin-bottom: 20px; }
.exh-field:last-child { margin-bottom: 0; }

.exh-field label {
    display: block;
    font-size: 0.85rem;
    font-weight: 700;
    color: var(--text-dark);
    margin-bottom: 7px;
}

.exh-req { color: var(--brand-red); }

.exh-field-hint {
    font-size: 0.75rem;
    color: var(--text-gray);
    margin-top: 5px;
    display: block;
}

.exh-field-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 18px;
}

select.form-control { cursor: pointer; }

.exh-input-suffix-wrap { position: relative; }
.exh-input-suffix-wrap .form-control { padding-right: 50px; }
.exh-input-suffix {
    position: absolute;
    right: 14px;
    top: 50%;
    transform: translateY(-50%);
    font-size: 0.82rem;
    font-weight: 700;
    color: var(--text-gray);
    pointer-events: none;
}

/* --- Password show/hide --- */
.exh-password-wrap { position: relative; }
.exh-password-wrap .form-control { padding-right: 46px; }
.exh-password-toggle {
    position: absolute;
    right: 8px;
    top: 50%;
    transform: translateY(-50%);
    background: none;
    border: none;
    cursor: pointer;
    color: var(--text-gray);
    padding: 7px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    transition: color var(--trans-base), background var(--trans-base);
}
.exh-password-toggle:hover { color: var(--brand-blue); background: rgba(20, 83, 188, 0.08); }
.exh-password-toggle svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
/* Same [hidden]-vs-author-display conflict as .exh-login-error above: the
   button's display:flex context otherwise leaves the inactive show/hide
   icon rendering alongside the active one instead of being removed. */
.exh-password-toggle svg[hidden] { display: none; }

/* --- Inline alert banners --- */
.exh-login-error,
.exh-form-error {
    background: #fdecea;
    border: 1px solid rgba(213, 16, 36, 0.3);
    color: var(--brand-red);
    border-radius: var(--radius-sm);
    padding: 12px 16px;
    font-size: 0.85rem;
    font-weight: 600;
    margin-bottom: 18px;
    display: flex;
    align-items: center;
    gap: 8px;
}

.exh-form-success {
    background: #eafaf0;
    border: 1px solid rgba(40, 167, 69, 0.3);
    color: #1a7a31;
    border-radius: var(--radius-sm);
    padding: 12px 16px;
    font-size: 0.85rem;
    font-weight: 600;
    margin-bottom: 18px;
    display: flex;
    align-items: center;
    gap: 8px;
}

/* display:flex above has equal specificity to the UA [hidden] rule and
   would otherwise win the cascade (author styles load after UA styles),
   rendering an empty box even while the hidden attribute is set. */
.exh-login-error[hidden],
.exh-form-error[hidden],
.exh-form-success[hidden] { display: none; }

/* --- Submit button + loading spinner ---
   Was width:100% (stretched edge-to-edge across the card — 780px on the
   11 stall-detail forms), unlike every other CTA sitewide (.site-cta-btn/
   .as-cta-btn are content-width pills). Shrink-wrapped + centered now,
   full-width again only on narrow mobile (below) for a comfortable tap
   target. */
.exh-submit-btn {
    width: fit-content;
    min-width: 220px;
    height: 52px;
    padding: 0 44px;
    margin: 8px auto 0;
    border: none;
    border-radius: var(--radius-pill);
    background: var(--brand-blue);
    color: #ffffff;
    font-family: inherit;
    font-size: 0.95rem;
    font-weight: 700;
    letter-spacing: 0.3px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    transition: transform var(--trans-base), box-shadow var(--trans-base), opacity var(--trans-base);
    box-shadow: 0 10px 26px rgba(20, 83, 188, 0.22);
}

.exh-submit-btn:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 14px 32px rgba(20, 83, 188, 0.3); }
.exh-submit-btn:disabled { opacity: 0.75; cursor: not-allowed; }

.exh-btn-spinner {
    width: 16px;
    height: 16px;
    border-radius: 50%;
    border: 2.5px solid rgba(255, 255, 255, 0.4);
    border-top-color: #ffffff;
    display: none;
    animation: exh-spin 0.8s linear infinite;
    flex-shrink: 0;
}

.exh-submit-btn.is-loading .exh-btn-spinner { display: inline-block; }
.exh-submit-btn.is-loading .exh-btn-label { opacity: 0.85; }

@keyframes exh-spin { to { transform: rotate(360deg); } }

.exh-login-help {
    text-align: center;
    font-size: 0.85rem;
    color: var(--text-gray);
    margin-top: 22px;
}
.exh-login-help a { color: var(--brand-blue); font-weight: 700; text-decoration: none; }
.exh-login-help a:hover { text-decoration: underline; }

/* --- Dashboard: welcome banner + progress --- */
.exh-dash-banner {
    background: var(--grad-main);
    border-radius: var(--radius-md);
    padding: 32px 36px;
    color: #ffffff;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
    margin-bottom: 28px;
    box-shadow: 0 20px 50px rgba(20, 83, 188, 0.2);
}

.exh-dash-welcome h1 { font-size: clamp(1.5rem, 2.6vw, 2rem); font-weight: 800; margin-bottom: 6px; line-height: 1.2; }
.exh-dash-welcome p  { font-size: 0.92rem; opacity: 0.92; }

.exh-dash-logout {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(255, 255, 255, 0.15);
    border: 1.5px solid rgba(255, 255, 255, 0.4);
    color: #ffffff;
    font-size: 0.85rem;
    font-weight: 700;
    text-decoration: none;
    padding: 10px 20px;
    border-radius: var(--radius-pill);
    transition: background var(--trans-base), transform var(--trans-base);
    flex-shrink: 0;
}
.exh-dash-logout:hover { background: rgba(255, 255, 255, 0.28); transform: translateY(-1px); }
.exh-dash-logout svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

.exh-dash-progress {
    display: flex;
    align-items: center;
    gap: 14px;
    margin-bottom: 32px;
    flex-wrap: wrap;
}

.exh-dash-progress-label { font-size: 0.85rem; font-weight: 700; color: var(--text-dark); white-space: nowrap; }

.exh-dash-progress-bar {
    flex: 1;
    min-width: 180px;
    height: 8px;
    border-radius: var(--radius-pill);
    background: #eef0f6;
    overflow: hidden;
}

.exh-dash-progress-fill { height: 100%; background: var(--grad-main); border-radius: var(--radius-pill); }

/* --- Dashboard: 10-card grid --- */
.exh-dash-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 22px;
}

.exh-dash-card {
    background: #ffffff;
    border: 1.5px solid #edf0f6;
    border-radius: var(--radius-md);
    padding: 28px 26px;
    display: flex;
    flex-direction: column;
    gap: 12px;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04), 0 8px 24px rgba(0, 0, 0, 0.05);
    transition: transform var(--trans-base), box-shadow var(--trans-base), border-color var(--trans-base);
    content-visibility: auto;
    contain-intrinsic-size: 0 220px;
}

.exh-dash-card:hover {
    transform: translateY(-4px);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05), 0 20px 44px rgba(0, 0, 0, 0.09);
    border-color: rgba(20, 83, 188, 0.18);
}

.exh-dash-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }

.exh-dash-icon {
    width: 50px;
    height: 50px;
    border-radius: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    background: rgba(20, 83, 188, 0.09);
}
.exh-dash-icon svg { width: 24px; height: 24px; fill: var(--brand-blue); }
.exh-dash-icon--purple { background: rgba(130, 41, 102, 0.09); }
.exh-dash-icon--purple svg { fill: var(--brand-purple); }
.exh-dash-icon--red { background: rgba(213, 16, 36, 0.09); }
.exh-dash-icon--red svg { fill: var(--brand-red); }

.exh-dash-badge {
    font-size: 0.7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    padding: 5px 12px;
    border-radius: var(--radius-pill);
    white-space: nowrap;
}
.exh-dash-badge--submitted { background: rgba(40, 167, 69, 0.12); color: #1a7a31; }
.exh-dash-badge--pending   { background: rgba(85, 85, 85, 0.09); color: var(--text-gray); }
.exh-dash-badge--locked    { background: rgba(85, 85, 85, 0.09); color: var(--text-gray); }

/* --- "Catalog Details first" gate (inc/exhibitor-catalog-gate.php sets
   .exh-catalog-done on <html> once Catalog Details is saved) --- */
.exh-catalog-done .exh-if-pending,
html:not(.exh-catalog-done) .exh-if-done { display: none; }

/* Gated page opened directly by URL: hide everything while the redirect fires. */
.exh-gate-blocked .exh-portal-main { display: none; }

html:not(.exh-catalog-done) .exh-dash-card--gated { opacity: 0.55; }
html:not(.exh-catalog-done) .exh-dash-card--gated:hover {
    transform: none;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04), 0 8px 24px rgba(0, 0, 0, 0.05);
    border-color: #edf0f6;
}
.exh-dash-card-btn.exh-dash-card-btn--locked,
.exh-dash-card-btn.exh-dash-card-btn--locked:hover {
    background: #e3e6ec;
    color: var(--text-gray);
    cursor: not-allowed;
    transform: none;
}
.exh-dash-lock-hint {
    font-size: 0.76rem;
    color: var(--text-gray);
    font-style: italic;
}

.exh-dash-required {
    display: inline-block;
    font-size: 0.62rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.3px;
    color: var(--brand-red);
    background: rgba(213, 16, 36, 0.09);
    border-radius: var(--radius-pill);
    padding: 2px 8px;
}

/* flex + gap (not an inline pill with margin-left) so "Mandatory" sits flush-left
   when a long title like "Catalog (Show guide) Details" pushes it onto its own line. */
.exh-dash-card h3 { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; font-size: 1.05rem; font-weight: 700; color: var(--text-dark); margin: 0; }
.exh-dash-card p  { font-size: 0.88rem; color: var(--text-gray); line-height: 1.6; margin: 0; flex: 1; }

.exh-dash-card-btn {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 0.85rem;
    font-weight: 700;
    color: #ffffff;
    background: var(--brand-blue);
    padding: 9px 20px;
    border-radius: var(--radius-pill);
    text-decoration: none;
    margin-top: 4px;
    transition: background var(--trans-base), transform var(--trans-base);
}
.exh-dash-card-btn:hover { background: var(--brand-purple); transform: translateY(-1px); }

/* --- Stall Facia: char counter + signboard preview --- */
.exh-char-counter { font-size: 0.75rem; color: var(--text-gray); text-align: right; margin-top: 4px; }
.exh-char-counter.exh-limit-near { color: #b8860b; }
.exh-char-counter.exh-limit-hit  { color: var(--brand-red); font-weight: 700; }

.exh-facia-preview {
    margin-top: 24px;
    padding: 36px 24px;
    border-radius: var(--radius-sm);
    background: linear-gradient(135deg, #0a1836 0%, #1453BC 100%);
    text-align: center;
}
.exh-facia-preview-label {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 1px;
    color: rgba(255, 255, 255, 0.55);
    margin-bottom: 12px;
}
.exh-facia-preview-line1 { color: #ffffff; font-weight: 800; letter-spacing: 0.5px; word-break: break-word; font-size: 1.4rem; }

/* --- Quantity steppers (currently unused by any page: furniture + AV Rental now use rate-card tables) --- */
.exh-furn-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }

.exh-furn-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 16px 18px;
    border: 1.5px solid #edf0f6;
    border-radius: var(--radius-sm);
    background: #fafbff;
}
.exh-furn-item-name { font-weight: 700; font-size: 0.92rem; color: var(--text-dark); }

.exh-furn-stepper { display: flex; align-items: center; gap: 10px; }
.exh-furn-btn {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    border: 1.5px solid var(--brand-blue);
    background: #ffffff;
    color: var(--brand-blue);
    font-size: 1.1rem;
    font-weight: 700;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    padding: 0;
    transition: background var(--trans-base), color var(--trans-base);
}
.exh-furn-btn:hover:not(:disabled) { background: var(--brand-blue); color: #ffffff; }
.exh-furn-btn:disabled { opacity: 0.35; cursor: not-allowed; }
.exh-furn-qty { width: 30px; text-align: center; font-weight: 800; font-size: 1rem; color: var(--text-dark); }

.exh-furn-total {
    margin-top: 20px;
    padding: 16px 20px;
    background: rgba(20, 83, 188, 0.06);
    border-radius: var(--radius-sm);
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-weight: 700;
    color: var(--brand-blue);
}

/* --- Furniture: rate card table --- */
.exh-rate-card { margin-bottom: 28px; }
/* A rate card WITHOUT .exh-rate-card--util is never a query container, so the stacked-card @container block below can't match it and its table stays a table at every width (Catalog Advertisement). */
.exh-rate-card--util { container-type: inline-size; }   /* Electricity: lets the rate table's stacked layout key off the card's width (see the @container block near the end) */
.exh-rate-card-title { font-size: 1.15rem; font-weight: 800; color: var(--text-dark); margin-bottom: 4px; }
.exh-rate-card-sub { font-size: 0.85rem; color: var(--text-gray); margin-bottom: 20px; }

.exh-rate-table-wrap { overflow-x: auto; border: 1.5px solid #edf0f6; border-radius: var(--radius-sm); }
.exh-rate-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }

.exh-rate-table thead th {
    background: #fafbff;
    color: var(--text-gray);
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.6px;
    text-align: left;
    padding: 12px 16px;
    border-bottom: 1.5px solid #edf0f6;
}
.exh-rate-table thead th:last-child { text-align: right; }

.exh-rate-table td,
.exh-rate-table tbody th[scope="row"] {
    padding: 12px 16px;
    border-bottom: 1px solid #edf0f6;
    text-align: left;
    vertical-align: top;
    color: var(--text-gray);
}
.exh-rate-table tbody th[scope="row"] { font-weight: 600; color: var(--text-dark); }

.exh-rate-table th:first-child,
.exh-rate-table td:first-child { width: 64px; text-align: center; }

.exh-rate-table td.exh-rate-price {
    text-align: right;
    font-weight: 700;
    color: var(--brand-blue);
    white-space: nowrap;
}

.exh-rate-section th {
    background: var(--brand-blue);
    color: #ffffff;
    font-size: 0.85rem;
    font-weight: 800;
    letter-spacing: 0.8px;
    text-transform: uppercase;
    text-align: left;
    padding: 12px 16px;
}

.exh-rate-table tbody:last-of-type tr:last-child > * { border-bottom: 0; }

/* --- Electricity: utilities charges (reuses the .exh-rate-* table; text first column, centered price columns) --- */
.exh-rate-table.exh-rate-table--util th:first-child { width: auto; text-align: left; }
.exh-rate-table.exh-rate-table--util thead th:not(:first-child),
.exh-rate-table.exh-rate-table--util td { text-align: center; }
.exh-rate-table.exh-rate-table--util td.exh-rate-included,
.exh-rate-table.exh-rate-table--util thead th { white-space: nowrap; }
/* Electricity Requirement column: compact kW input inside the rate table; cells middle-aligned so the taller input lines up with the price text */
.exh-rate-table.exh-rate-table--util td,
.exh-rate-table.exh-rate-table--util tbody th[scope="row"] { vertical-align: middle; }
.exh-rate-table.exh-rate-table--util tbody th[scope="row"] { min-width: 220px; }   /* keeps booth names to ~2 lines instead of being squeezed by the nowrap headers; the card scrolls sideways before it crushes them */
.exh-rate-req .exh-input-suffix-wrap { width: 112px; margin: 0 auto; }
.exh-rate-req .form-control {
    padding: 8px 38px 8px 12px;
    border-radius: 8px;
    font-size: 0.9rem;
    font-weight: 600;
    text-align: left;
}
.exh-rate-req .exh-input-suffix { right: 10px; }
.exh-rate-table.exh-rate-table--util td.exh-rate-total {
    white-space: nowrap;
    font-size: 0.95rem;
    font-weight: 800;
    color: var(--text-dark);
}
/* "Payable Amount" footer row: sum of the Total Charges, label right-aligned next to the amount like an invoice total */
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand th,
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand td {
    background: rgba(20, 83, 188, 0.06);
    border-top: 1.5px solid #edf0f6;
    border-bottom: 0;
    padding-top: 16px;
    padding-bottom: 16px;
    vertical-align: middle;
}
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand th {
    text-align: right;
    font-size: 0.95rem;
    font-weight: 800;
    color: var(--text-dark);
}
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand td.exh-rate-total {
    font-size: 1.1rem;
    color: var(--brand-blue);
}
.exh-rate-th-sub {   /* "Incl. 18% GST" under the Total Charges header */
    display: block;
    margin-top: 2px;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0;
    text-transform: none;
    color: var(--brand-blue);
}
.exh-rate-per {
    margin-left: 2px;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--text-gray);
}
.exh-rate-section .exh-rate-unit {
    margin-left: 8px;
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0;
    text-transform: none;
    opacity: 0.85;
}

.exh-rate-notes {
    margin-top: 18px;
    padding: 14px 18px;
    background: #fafbff;
    border: 1.5px solid #edf0f6;
    border-radius: var(--radius-sm);
}
.exh-rate-notes-title { font-size: 0.85rem; font-weight: 800; color: var(--text-dark); margin-bottom: 6px; }
.exh-rate-notes ul { list-style: disc; padding-left: 18px; margin: 0; }
.exh-rate-notes li { font-size: 0.82rem; line-height: 1.6; color: var(--text-gray); }

/* --- Furniture: the Electricity table (--util) plus an item column with a click-to-enlarge thumbnail, a left-aligned description, and a Sub Total / GST / Payable footer.
       The source PNGs are 240px with wide white margins, so thumbnails are drawn at 88px to keep the product legible. --- */
.exh-rate-table.exh-rate-table--furn tbody th[scope="row"] { min-width: 290px; }
.exh-rate-table.exh-rate-table--furn thead th:nth-child(2),
.exh-rate-table.exh-rate-table--furn td.exh-rate-desc { text-align: left; }
.exh-rate-table.exh-rate-table--furn td.exh-rate-desc { min-width: 150px; }
.exh-rate-item { display: flex; align-items: center; gap: 14px; }
.exh-rate-thumb {
    flex: none;
    width: 88px;
    height: 88px;
    padding: 0;
    background: #ffffff;
    border: 1.5px solid #edf0f6;
    border-radius: var(--radius-sm);
    overflow: hidden;
    cursor: zoom-in;
    transition: transform 0.2s ease;
}
.exh-rate-thumb:hover { transform: scale(1.05); }
.exh-rate-thumb:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 2px; }
.exh-rate-thumb img { display: block; width: 100%; height: 100%; object-fit: contain; }
.exh-rate-item-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.exh-rate-item-name { font-weight: 600; color: var(--text-dark); }
.exh-rate-item-no { font-size: 0.74rem; font-weight: 600; color: var(--text-gray); }

/* Sub Total and GST rows above the Payable Amount row: lighter than the grand total, same right-aligned label next to the amount */
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub th,
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub td {
    border: 0;
    padding-top: 10px;
    padding-bottom: 10px;
    vertical-align: middle;
}
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub:first-child > * { border-top: 1.5px solid #edf0f6; }
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub th { text-align: right; font-size: 0.9rem; font-weight: 700; color: var(--text-dark); }
.exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub td.exh-rate-total { font-size: 0.95rem; }

/* Click-to-enlarge popup (native <dialog>) */
.exh-lightbox {
    width: min(92vw, 380px);
    margin: auto;   /* the sitewide `* { margin: 0 }` reset removes the dialog's built-in auto margin, which is what centers it */
    padding: 0;
    border: 0;
    border-radius: 16px;
    background: #ffffff;
    color: var(--text-dark);
    box-shadow: 0 24px 64px rgba(10, 18, 40, 0.3);
}
.exh-lightbox::backdrop { background: rgba(10, 18, 40, 0.6); }
.exh-lightbox[open] { animation: exh-lightbox-in 0.2s ease-out; }
@keyframes exh-lightbox-in { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: none; } }
.exh-lightbox-body { position: relative; padding: 28px 24px 22px; text-align: center; }
.exh-lightbox-body img { display: block; width: 100%; max-width: 320px; height: auto; aspect-ratio: 1; margin: 0 auto; object-fit: contain; }
.exh-lightbox-caption { margin-top: 12px; font-size: 1rem; font-weight: 700; color: var(--text-dark); }
.exh-lightbox-close {
    position: absolute;
    top: 8px;
    right: 8px;
    width: 36px;
    height: 36px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: #f1f4fa;
    color: var(--text-dark);
    font-size: 1.4rem;
    line-height: 1;
    cursor: pointer;
}
.exh-lightbox-close:hover { background: #e3e8f4; }
.exh-lightbox-close:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 2px; }

/* --- Internet / Hospitality: radio cards + yes/no toggle ---
   Both are <label>s inside .exh-field, so they are scoped as `.exh-field .x`
   to out-rank the generic `.exh-field label` rule (display:block;
   margin-bottom:7px; 0.85rem) — a bare `.x` class lost that specificity
   contest, so display:flex/align-items never applied (radio dot sat above its
   label, buttons were uneven heights). */
.exh-radio-options { display: flex; gap: 14px; flex-wrap: wrap; }
.exh-field .exh-radio-card {
    flex: 1;
    min-width: 160px;
    min-height: 56px;
    margin: 0;
    border: 2px solid #dde3ef;
    border-radius: var(--radius-sm);
    padding: 0 18px;
    cursor: pointer;
    transition: border-color var(--trans-base), background-color var(--trans-base), color var(--trans-base);
    display: flex;
    align-items: center;
    gap: 10px;
    background: #fafbff;
    font-weight: 700;
    font-size: 0.9rem;
    line-height: 1.2;
    color: var(--text-dark);
}
.exh-field .exh-radio-card:hover { border-color: var(--brand-blue); }
.exh-field .exh-radio-card:focus-within { outline: 2px solid var(--brand-blue); outline-offset: 2px; }
.exh-field .exh-radio-card.is-sel { border-color: var(--brand-blue); background: #eef3fd; color: var(--brand-blue); }
.exh-radio-card input { accent-color: var(--brand-blue); width: 16px; height: 16px; margin: 0; flex-shrink: 0; }

.exh-toggle-row { display: flex; gap: 14px; }
.exh-field .exh-toggle-opt {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 96px;
    min-height: 48px;
    margin: 0;
    border: 2px solid #dde3ef;
    border-radius: var(--radius-sm);
    padding: 0 26px;
    background: #fafbff;
    font-weight: 700;
    font-size: 0.9rem;
    line-height: 1.2;
    color: var(--text-dark);
    cursor: pointer;
    user-select: none;
    position: relative;
    transition: border-color var(--trans-base), background-color var(--trans-base), color var(--trans-base);
}
.exh-field .exh-toggle-opt:hover { border-color: var(--brand-blue); }
.exh-field .exh-toggle-opt:focus-within { outline: 2px solid var(--brand-blue); outline-offset: 2px; }
/* visually hidden, not display:none, so the radio stays keyboard-focusable (arrow keys) */
.exh-toggle-opt input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.exh-field .exh-toggle-opt.is-sel-yes { border-color: #28a745; background: #eafaf0; color: #1a7a31; }
.exh-field .exh-toggle-opt.is-sel-no  { border-color: var(--brand-red); background: #fdecea; color: var(--brand-red); }

/* --- Fabrication Design: upload zone + status badges --- */
.exh-upload-zone {
    border: 2px dashed rgba(20, 83, 188, 0.3);
    border-radius: var(--radius-sm);
    background: rgba(20, 83, 188, 0.04);
    padding: 36px 24px;
    text-align: center;
    cursor: pointer;
    transition: border-color var(--trans-base), background var(--trans-base);
    position: relative;
}
.exh-upload-zone:hover,
.exh-upload-zone.is-dragover { border-color: var(--brand-blue); background: rgba(20, 83, 188, 0.09); }
.exh-upload-zone input[type="file"] { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.exh-upload-icon { width: 42px; height: 42px; margin: 0 auto 12px; fill: none; stroke: var(--brand-blue); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; display: block; }
.exh-upload-zone strong { display: block; font-size: 0.95rem; color: var(--text-dark); margin-bottom: 4px; }
.exh-upload-zone span { font-size: 0.78rem; color: var(--text-gray); }

.exh-upload-list { margin-top: 16px; display: flex; flex-direction: column; gap: 10px; }
.exh-upload-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 16px;
    border: 1.5px solid #edf0f6;
    border-radius: var(--radius-sm);
    background: #fafbff;
}
.exh-upload-item-icon {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    border-radius: 9px;
    background: rgba(20, 83, 188, 0.09);
    display: flex;
    align-items: center;
    justify-content: center;
}
.exh-upload-item-icon svg { width: 18px; height: 18px; fill: none; stroke: var(--brand-blue); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.exh-upload-item-info { flex: 1; min-width: 0; }
.exh-upload-item-name { display: block; font-size: 0.86rem; font-weight: 700; color: var(--text-dark); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.exh-upload-item-size { display: block; font-size: 0.74rem; color: var(--text-gray); }
.exh-upload-item-remove {
    flex-shrink: 0;
    background: none;
    border: none;
    cursor: pointer;
    color: var(--text-gray);
    padding: 6px;
    display: flex;
    border-radius: 50%;
    transition: color var(--trans-base), background var(--trans-base);
}
.exh-upload-item-remove:hover { color: var(--brand-red); background: rgba(213, 16, 36, 0.08); }
.exh-upload-item-remove svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }

.exh-status-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    padding: 6px 14px;
    border-radius: var(--radius-pill);
    margin-bottom: 18px;
}
.exh-status-badge--pending  { background: #fff8e1; color: #6d4c00; }
.exh-status-badge--approved { background: rgba(40, 167, 69, 0.12); color: #1a7a31; }
.exh-status-badge--rejected { background: rgba(213, 16, 36, 0.1); color: var(--brand-red); }

.exh-not-applicable {
    text-align: center;
    padding: 48px 24px;
    border: 1.5px dashed var(--border-color);
    border-radius: var(--radius-sm);
    background: #fafbfc;
}
.exh-not-applicable svg { width: 40px; height: 40px; fill: none; stroke: #c5cfe8; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; margin-bottom: 14px; }
.exh-not-applicable h3 { font-size: 1.05rem; font-weight: 700; color: var(--text-dark); margin-bottom: 8px; }
.exh-not-applicable p  { font-size: 0.88rem; color: var(--text-gray); }

/* --- Catalog Details: logo file picker preview --- */
.exh-logo-preview { margin-top: 14px; display: none; align-items: center; gap: 14px; }
.exh-logo-preview.is-visible { display: flex; }
.exh-logo-preview img {
    width: 64px;
    height: 64px;
    object-fit: contain;
    border-radius: var(--radius-sm);
    border: 1.5px solid var(--border-color);
    background: #fafbff;
    padding: 6px;
}
.exh-logo-preview-name { font-size: 0.82rem; color: var(--text-gray); word-break: break-all; }

/* --- Official Details: spreadsheet-style officials grid ---
   Bordered cells, grey row-number gutter + header band, borderless inputs
   that show an inset blue "selected cell" outline on focus. The wrapper
   scrolls horizontally on narrow screens (table keeps its min-width). */
.exh-sheet-wrap { overflow-x: auto; border: 1px solid #c5cfe8; border-radius: var(--radius-sm); }
.exh-sheet { width: 100%; min-width: 600px; table-layout: fixed; border-collapse: collapse; font-size: 0.9rem; }
.exh-sheet-col-num { width: 6%; }
.exh-sheet-col-act { width: 6%; }

.exh-sheet th,
.exh-sheet td { border: 1px solid #dfe4ef; padding: 0; }
.exh-sheet tr:first-child > * { border-top: 0; }
.exh-sheet tr > *:first-child { border-left: 0; }
.exh-sheet tr > *:last-child { border-right: 0; }
.exh-sheet tbody tr:last-child > * { border-bottom: 0; }

.exh-sheet thead th {
    background: #f1f4fa;
    color: var(--text-gray);
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    text-align: left;
    padding: 12px 10px;
    white-space: nowrap;
}
.exh-sheet td.exh-sheet-num,
.exh-sheet th.exh-sheet-num { background: #f1f4fa; color: var(--text-gray); font-size: 0.8rem; font-weight: 700; text-align: center; padding: 0; }
.exh-sheet td.exh-sheet-act,
.exh-sheet th.exh-sheet-act { text-align: center; background: #fafbff; }

/* Cells are <textarea rows="1">, auto-grown by the page's script — text wraps (and breaks inside
   long unbroken strings like emails) rather than being clipped; the row grows with the tallest cell. */
.exh-sheet-input {
    display: block;
    width: 100%;
    min-height: 48px;
    padding: 13px 12px;
    border: 0;
    border-radius: 0;
    background: transparent;
    color: var(--text-dark);
    font-family: inherit;
    font-size: 0.9rem;
    line-height: 1.4;
    overflow: hidden;
    resize: none;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
    outline: none;
}
.exh-sheet-input:focus { background: #ffffff; outline: 2px solid var(--brand-blue); outline-offset: -2px; }
.exh-sheet-input.is-invalid { background: #fdecea; outline: 2px solid var(--brand-red); outline-offset: -2px; }

.exh-sheet-remove {
    background: none;
    border: none;
    cursor: pointer;
    color: var(--text-gray);
    padding: 6px;
    display: inline-flex;
    border-radius: 50%;
    transition: color var(--trans-base), background-color var(--trans-base);
}
.exh-sheet-remove:hover:not(:disabled) { color: var(--brand-red); background: rgba(213, 16, 36, 0.08); }
.exh-sheet-remove:disabled { opacity: 0.3; cursor: not-allowed; }
.exh-sheet-remove svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }

.exh-add-row-btn {
    margin-top: 14px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 20px;
    border: 1.5px solid var(--brand-blue);
    border-radius: var(--radius-pill);
    background: #ffffff;
    color: var(--brand-blue);
    font-family: inherit;
    font-size: 0.88rem;
    font-weight: 700;
    cursor: pointer;
    transition: background-color var(--trans-base), color var(--trans-base);
}
.exh-add-row-btn:hover:not(.is-maxed) { background: var(--brand-blue); color: #ffffff; }
.exh-add-row-btn.is-maxed { opacity: 0.45; }
.exh-add-row-btn svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; }

/* --- Small popup (native <dialog>) — Official Details "maximum officials" notice --- */
.exh-modal {
    /* common.css's global `* { margin: 0 }` strips the <dialog> UA default `margin: auto`, which is what centers it */
    margin: auto;
    width: calc(100% - 32px);
    max-width: 380px;
    padding: 32px 28px 26px;
    border: 0;
    border-radius: var(--radius-md);
    background: #ffffff;
    color: var(--text-dark);
    text-align: center;
    box-shadow: 0 24px 60px rgba(0, 0, 0, 0.28);
}
.exh-modal::backdrop { background: rgba(10, 24, 54, 0.55); }
.exh-modal h3 { font-size: 1.1rem; font-weight: 800; color: var(--text-dark); margin: 0 0 10px; }
.exh-modal p  { font-size: 0.95rem; line-height: 1.6; color: var(--text-gray); margin: 0 0 22px; }
.exh-modal-btn {
    min-width: 120px;
    height: 44px;
    padding: 0 32px;
    border: none;
    border-radius: var(--radius-pill);
    background: var(--brand-blue);
    color: #ffffff;
    font-family: inherit;
    font-size: 0.9rem;
    font-weight: 700;
    cursor: pointer;
    transition: opacity var(--trans-base);
}
.exh-modal-btn:hover { opacity: 0.9; }

/* --- Selection summary popup (built by exhShowSummary() in js/exhibitor-portal-forms.js) ---
   Shown after any of the 11 forms validates: lists what was chosen, then a blue "Proceed to Next" button.
   The scrolling list sits between a fixed heading and fixed buttons, so the CTA is always visible. */
.exh-summary {
    max-width: 540px;
    max-height: calc(100vh - 32px);
    padding: 0;
    text-align: left;
    overflow: hidden;
}
.exh-summary[open] { display: flex; flex-direction: column; }
.exh-summary h3 { padding: 26px 28px 0; margin: 0 0 6px; }
.exh-summary .exh-summary-lead { padding: 0 28px; margin: 0 0 16px; }
.exh-summary-list {
    flex: 1 1 auto;
    min-height: 0;
    margin: 0;
    padding: 0 28px;
    overflow-y: auto;
}
.exh-summary-row {
    display: grid;
    grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
    gap: 4px 18px;
    padding: 11px 0;
    border-top: 1px solid var(--border-color);
}
.exh-summary-row dt { font-size: 0.82rem; font-weight: 700; color: var(--text-gray); overflow-wrap: anywhere; }
.exh-summary-row dd { margin: 0; font-size: 0.92rem; font-weight: 600; color: var(--text-dark); overflow-wrap: anywhere; white-space: pre-line; }
.exh-summary-row.is-strong dt,
.exh-summary-row.is-strong dd { color: var(--brand-blue); font-weight: 800; }
.exh-summary-actions {
    display: flex;
    justify-content: flex-end;
    flex-wrap: wrap;
    gap: 12px;
    padding: 18px 28px 24px;
    border-top: 1px solid var(--border-color);
    background: #ffffff;
}
.exh-summary .exh-modal-btn { display: inline-flex; align-items: center; justify-content: center; text-decoration: none; }
.exh-modal-btn--ghost { background: #ffffff; color: var(--brand-blue); box-shadow: inset 0 0 0 2px var(--brand-blue); }
.exh-modal-btn:focus-visible { outline: 3px solid rgba(20, 83, 188, 0.4); outline-offset: 2px; }

@media (max-width: 600px) {
    .exh-summary h3,
    .exh-summary .exh-summary-lead,
    .exh-summary-list,
    .exh-summary-actions { padding-left: 20px; padding-right: 20px; }
    .exh-summary-row { grid-template-columns: 1fr; }
    .exh-summary-actions .exh-modal-btn { flex: 1 1 100%; }
}

/* --- Responsive --- */
@media (max-width: 991px) {
    .exh-dash-grid { grid-template-columns: repeat(2, 1fr); }
}

/* Catalog Advertisement's table never turns into stacked cards, so on phones it is tightened to fit 4 columns instead */
@media (max-width: 600px) {
    .exh-rate-card:has(.exh-rate-table--keep) { padding-left: 14px; padding-right: 14px; }
    .exh-rate-table--keep { font-size: 0.8rem; }
    .exh-rate-table.exh-rate-table--keep td.exh-rate-price { white-space: normal; }   /* "INR" drops above the figure so the 4 columns fit without sideways scrolling */
    .exh-rate-table.exh-rate-table--keep td.exh-rate-total { white-space: normal; }
    .exh-rate-table.exh-rate-table--keep thead th { padding: 10px 6px; font-size: 0.62rem; letter-spacing: 0.2px; white-space: normal; }
    .exh-rate-table.exh-rate-table--keep td,
    .exh-rate-table.exh-rate-table--keep tbody th[scope="row"] { padding: 10px 6px; }
    .exh-rate-table.exh-rate-table--keep tbody th[scope="row"] { min-width: 0; }
    .exh-rate-table--keep .exh-rate-req .exh-input-suffix-wrap { width: 60px; }
    .exh-rate-table--keep .exh-rate-req .form-control { padding: 8px 6px; text-align: center; }
    .exh-rate-table--keep .exh-rate-req .exh-input-suffix { display: none; }   /* the "ad" unit is implied by the column on a phone */
    .exh-rate-table.exh-rate-table--keep td.exh-rate-total { font-size: 0.82rem; }
}

@media (max-width: 700px) {
    .exh-portal-card { padding: 26px 22px; }
    .exh-sheet { min-width: 720px; }   /* wider than the phone: the grid scrolls sideways inside the card, keeping cells roomy so rows stay short */
    .exh-field-row { grid-template-columns: 1fr; }
    .exh-dash-grid { grid-template-columns: 1fr; }
    .exh-dash-banner { flex-direction: column; align-items: flex-start; }
    .exh-radio-options { flex-direction: column; }
    .exh-furn-grid { grid-template-columns: 1fr; }
    .exh-rate-table { font-size: 0.82rem; }
    .exh-rate-table thead th,
    .exh-rate-table td,
    .exh-rate-table tbody th[scope="row"],
    .exh-rate-section th { padding: 10px 8px; }
    .exh-rate-table th:first-child,
    .exh-rate-table td:first-child { width: 40px; }
    .exh-submit-btn { width: 100%; min-width: 0; }
}

/* --- Electricity rate table: when the card is too narrow for its 5 columns (laptop-narrow windows, tablets, phones), each row becomes a stacked card
       with a label per value, so nothing is cropped or scrolled. The card is the query container, so the switch follows its real width, not the window's. --- */
@container (max-width: 860px) {
    .exh-rate-card .exh-rate-table.exh-rate-table--util,
    .exh-rate-card .exh-rate-table.exh-rate-table--util tbody { display: block; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util thead {   /* column headers become per-value labels below; kept for screen readers */
        display: block; position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
    }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tr { display: block; padding: 14px 16px; border-bottom: 1px solid #edf0f6; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tbody:last-of-type tr:last-child { border-bottom: 0; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tr.exh-rate-section { padding: 0; border-bottom: 0; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-section th { display: block; padding: 12px 16px; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tbody th[scope="row"] {
        display: block; min-width: 0; padding: 0 0 8px; border: 0; font-size: 0.95rem;
    }
    .exh-rate-card .exh-rate-table.exh-rate-table--util td {
        display: flex; align-items: center; justify-content: space-between; gap: 12px;
        padding: 6px 0; border: 0; text-align: right;
    }
    .exh-rate-card .exh-rate-table.exh-rate-table--util td[data-label]::before {
        content: attr(data-label); flex: 1; text-align: left; white-space: normal;
        font-size: 0.74rem; font-weight: 700; letter-spacing: 0.4px; text-transform: uppercase; color: var(--text-gray);
    }
    .exh-rate-card .exh-rate-table.exh-rate-table--util td.exh-rate-included { display: block; padding: 0; text-align: left; white-space: normal; font-size: 0.9rem; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util td.exh-rate-req .exh-input-suffix-wrap { flex: none; margin: 0; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tfoot { display: block; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tr.exh-rate-grand {   /* label left, amount right */
        display: flex; align-items: center; justify-content: space-between; gap: 12px;
        padding: 0; border-bottom: 0; background: rgba(20, 83, 188, 0.06); border-top: 1.5px solid #edf0f6;
    }
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand th,
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand td { display: block; padding: 14px 16px; border-top: 0; background: transparent; text-align: left; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-grand td { text-align: right; }

    /* Furniture: the item's thumbnail + name lead each card, the description sits under it, then the labelled lines; Sub Total / GST rows match the Payable row */
    .exh-rate-card .exh-rate-table.exh-rate-table--furn tbody th[scope="row"] { padding-bottom: 6px; }
    .exh-rate-card .exh-rate-table.exh-rate-table--furn .exh-rate-thumb { width: 72px; height: 72px; }
    .exh-rate-card .exh-rate-table.exh-rate-table--furn td.exh-rate-desc { display: block; min-width: 0; padding: 0 0 8px; text-align: left; font-size: 0.88rem; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tr.exh-rate-sub {
        display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0; border-bottom: 0;
    }
    .exh-rate-card .exh-rate-table.exh-rate-table--util tr.exh-rate-sub:first-child { border-top: 1.5px solid #edf0f6; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub:first-child > * { border-top: 0; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub th,
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub td { display: block; padding: 10px 16px; text-align: left; }
    .exh-rate-card .exh-rate-table.exh-rate-table--util .exh-rate-sub td { text-align: right; }
}

@media (prefers-reduced-motion: reduce) {
    .exh-btn-spinner { animation: none; opacity: 0.7; }
    .exh-dash-card:hover,
    .exh-dash-logout:hover,
    .exh-dash-card-btn:hover,
    .exh-submit-btn:hover:not(:disabled) { transform: none; }
    .exh-rate-thumb:hover { transform: none; }
    .exh-lightbox[open] { animation: none; }
}

/* Originally interleaved with the sitewide .pf-* partner-modal
   CSS in common.css (between its two rule blocks) — moved here
   with the rest of the .exh-* portal styles since it's the same
   component family. */
/* Exhibitor Login Portal intro header — .exh-portal-intro--left is the
   deliberately left-aligned variant used by all 11 exhibitor-portal form pages
   (paired with a form/card below, not a 2-column layout), with no mobile
   treatment previously. Center it on mobile only; desktop --left stays as
   designed. (2026-09-04 mobile/perf pass — flagged by multiple exhibitor
   page audits as a real gap, fixed once here since it's a shared class.) */
@media (max-width: 600px) {
    .exh-portal-intro--left {
        text-align: center;
        max-width: 820px;
        margin-inline: auto;
    }
    .exh-portal-intro--left .exh-portal-subtext { text-align: center; max-width: 700px; margin: 0 auto; }
}
