/* ── Speaker bio popup ──────────────────────────────────────────────────────── */

/* Magnific Popup inline content wrapper */
.mfp-speaker-bio .mfp-content {
    max-width: 820px;
    width: 90%;
    margin: 0 auto;
}

.speaker-popup {
    background: #fff;
    border-radius: 16px;
    padding: 48px 44px;
    position: relative;
    box-shadow: 0 24px 72px rgba(0, 0, 0, .22);
    color: #1a1a2e;
    max-height: 82vh;
    overflow: hidden;       /* clips to border-radius — never scrolls itself */
    display: flex;
    flex-direction: column;
}

.speaker-popup-wrap {
    position: relative;
    overflow-y: auto;       /* scrolls here instead — no border-radius to lose */
    min-height: 0;          /* required for flex overflow to work in all browsers */
}

/* Hide the outer MFP close button — the card has its own X and clicking the
   backdrop also closes. JS hides it via inline style in the open callback;
   this CSS rule is the belt-and-suspenders fallback. */
.mfp-speaker-bio .mfp-close:not(.speaker-popup-close) {
    display: none !important;
}

/* Close button — top-right corner of the white card */
.speaker-popup .speaker-popup-close {
    position: absolute;
    top: 16px;
    right: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    line-height: 1;
    font-size: 15px;
    background: rgba(26, 26, 46, 0.08);
    border: none;
    border-radius: 50%;
    color: #1a1a2e;
    opacity: 0.7;
    cursor: pointer;
    z-index: 2;
    transition: background .2s, opacity .2s;
}

.speaker-popup .speaker-popup-close:hover {
    background: rgba(26, 26, 46, 0.16);
    opacity: 1;
}

.speaker-popup .speaker-popup-close i {
    pointer-events: none;
}

/* Inner layout: image left, content right */
.speaker-popup-inner {
    display: flex;
    gap: 36px;
    align-items: flex-start;
}

/* Circular headshot */
.speaker-popup-image {
    flex-shrink: 0;
    width: 160px;
}

.speaker-popup-image img {
    width: 160px;
    height: 160px;
    border-radius: 50%;
    object-fit: cover;
    display: block;
}

/* Content column */
.speaker-popup-content {
    flex: 1;
    min-width: 0;
}

.speaker-popup-name {
    font-size: 1.9em;
    font-weight: 700;
    margin: 0 0 8px;
    line-height: 1.2;
    color: inherit;
}

.speaker-popup-job {
    font-weight: 600;
    font-size: .95em;
    margin-bottom: 4px;
    opacity: .9;
}

.speaker-popup-company {
    font-weight: 600;
    font-size: .95em;
    margin-bottom: 16px;
    opacity: .9;
}

.speaker-popup-bio {
    font-size: .95em;
    line-height: 1.75;
    margin-top: 8px;
    opacity: .85;
    text-align: left;
}

.speaker-popup-bio p:last-child {
    margin-bottom: 0;
}

/* "View full profile" link */
.speaker-popup-profile-link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 20px;
    font-weight: 600;
    font-size: .88em;
    text-decoration: none;
    opacity: .7;
    transition: opacity .2s;
}

.speaker-popup-profile-link:hover {
    opacity: 1;
}

/* Arrow trigger styling — keep same look but show pointer */
.speaker-popup-trigger {
    cursor: pointer;
}

/* When popup is disabled: pointer-events:none prevents the card from ever
   becoming the hovered element, which kills all theme hover effects (overlays,
   colour shifts, transforms) without touching the theme CSS directly.
   Social links and buttons inside regain pointer-events so they stay clickable. */
.gcs-no-popup {
    pointer-events: none !important;
    cursor: default !important;
}
.gcs-no-popup a,
.gcs-no-popup button {
    pointer-events: auto !important;
}

/* ── Speaker popup open/close animation (matches schedule popup feel) ─────── */

/* Backdrop */
.mfp-speaker-bio.mfp-bg {
    opacity: 0;
    transition: opacity 0.22s ease;
}
.mfp-speaker-bio.mfp-ready.mfp-bg {
    opacity: 0.72;
}
.mfp-speaker-bio.mfp-removing.mfp-bg {
    opacity: 0;
    transition: opacity 0.18s ease;
}

/* Popup card — zoom + subtle upward slide on open */
.mfp-speaker-bio.mfp-wrap .mfp-content {
    opacity: 0;
    transform: scale(0.88) translateY(12px);
    transition:
        opacity    0.24s ease,
        transform  0.24s cubic-bezier(0.34, 1.45, 0.64, 1);
}
.mfp-speaker-bio.mfp-wrap.mfp-ready .mfp-content {
    opacity: 1;
    transform: scale(1) translateY(0);
}
.mfp-speaker-bio.mfp-wrap.mfp-removing .mfp-content {
    opacity: 0;
    transform: scale(0.93) translateY(6px);
    transition:
        opacity   0.18s ease,
        transform 0.18s ease;
}

/* Nested speaker overlay card — same zoom animation */
.gcs-nested-speaker-overlay .speaker-popup {
    transform: scale(0.88) translateY(12px);
    transition:
        transform 0.24s cubic-bezier(0.34, 1.45, 0.64, 1);
}
.gcs-nested-speaker-overlay.gcs-visible .speaker-popup {
    transform: scale(1) translateY(0);
}

/* Override MFP's white X cursor (invisible on light backgrounds) with a dark version */
.mfp-wrap.mfp-close-btn-in,
.modals-overlay,
.modal-custom-overlay {
    cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cline x1='8' y1='8' x2='24' y2='24' stroke='%23333' stroke-width='2.5' stroke-linecap='round'/%3E%3Cline x1='24' y1='8' x2='8' y2='24' stroke='%23333' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E") 16 16, pointer !important;
}

/* Speaker bio popup — use a normal cursor on the backdrop instead of the X */
.mfp-wrap.mfp-speaker-bio,
.mfp-wrap.mfp-speaker-bio.mfp-close-btn-in,
.mfp-bg.mfp-speaker-bio {
    cursor: default !important;
}

/* ── Responsive ─────────────────────────────────────────────────────────────── */
@media (max-width: 640px) {
    .speaker-popup {
        padding: 32px 24px;
    }

    .speaker-popup-inner {
        flex-direction: column;
        align-items: center;
        text-align: center;
    }

    .speaker-popup-image {
        width: 120px;
    }

    .speaker-popup-image img {
        width: 120px;
        height: 120px;
    }

    .speaker-popup-name {
        font-size: 1.5em;
    }

    .speaker-popup-profile-link {
        justify-content: center;
    }
}

/* ── Fix: Style 2 job title hidden on mobile in some themes ─────────────────── */
.speaker-style-2 .speaker-job {
    display: block !important;
}

/* ── Custom Speaker Style ────────────────────────────────────────────────────── */

.gcs-speaker-search-wrap {
    margin-bottom: 28px;
    text-align: center;
}

.gcs-speaker-search {
    width: 100%;
    max-width: 420px;
    padding: 11px 20px 11px 62px;
    border: 1.5px solid rgba(0, 0, 0, .1);
    border-radius: 100px;
    font-size: .92em;
    background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") no-repeat 24px center;
    outline: none;
    transition: border-color .2s, box-shadow .2s;
    display: inline-block;
}

.gcs-speaker-search:focus {
    border-color: rgba(0, 0, 0, .25);
    box-shadow: 0 2px 10px rgba(0, 0, 0, .06);
}

.gcs-speaker-hidden {
    display: none !important;
}

.gcs-no-results {
    text-align: center;
    padding: 40px 0;
    opacity: .5;
    font-size: .95em;
    width: 100%;
    display: none;
}

.speaker-custom-style {
    text-align: center;
    padding: 24px 12px 20px;
    border-radius: 12px;
    cursor: pointer;
    transition: transform .2s ease;
    overflow: hidden;
}

.speaker-custom-style:hover {
    transform: translateY(-3px);
}

.speaker-custom-avatar {
    width: 96px;
    height: 96px;
    border-radius: 50%;
    overflow: hidden;
    margin: 0 auto 14px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, .1);
}

.speaker-custom-avatar img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* Constrain the info block so text is always bounded by the grid cell. */
.speaker-custom-info {
    width: 100%;
    min-width: 0;
}

.speaker-custom-name {
    font-size: 1em;
    font-weight: 700;
    margin: 0 0 5px;
    line-height: 1.3;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    overflow-wrap: break-word;
    word-break: break-word;
}

/* Job title and company show in full (no line limit or "…"), wrapping as needed. */
.speaker-custom-job {
    font-size: .85em;
    opacity: .75;
    margin-bottom: 2px;
    overflow-wrap: break-word;
    word-break: break-word;
}

.speaker-custom-company {
    font-size: .85em;
    opacity: .75;
    overflow-wrap: break-word;
    word-break: break-word;
}

/* Override CSS Grid with flexbox so partial last rows can be centered */
.gcs-custom-speaker-row {
    display: flex !important;
    flex-wrap: wrap;
    justify-content: center;
    align-items: flex-start !important;
    /* Force column-gap to exactly match the value subtracted in make_w() so
       items + gaps = 100% on every row, preventing justify-content:center from
       distributing leftover space differently per row. */
    column-gap: var(--gcs-gap, 30px) !important;
}

.gcs-custom-speaker-row .grid-item {
    flex: 0 0 var(--gcs-w, calc(100% / 3));
    max-width: var(--gcs-w, calc(100% / 3));
    min-width: 0;
    box-sizing: border-box;
}

@media (max-width: 1024px) {
    .gcs-custom-speaker-row .grid-item {
        flex: 0 0 var(--gcs-wt, 50%);
        max-width: var(--gcs-wt, 50%);
    }
}

@media (max-width: 767px) {
    .gcs-custom-speaker-row .grid-item {
        /* --gcs-wm is set by PHP from the Elementor mobile column setting.
           Fallback 50% matches Elementor's default 2-column responsive behaviour. */
        flex: 0 0 var(--gcs-wm, 50%);
        max-width: var(--gcs-wm, 50%);
    }
}

/* ── Schedule widgets: speaker alignment ────────────────────────────────────── */

/* Align headshots from the top so circles in the same row share the same
   baseline regardless of how many speakers are in each entry. */
.elementor-widget-evevit-schedule-tabs .item-image-wrapper,
.elementor-widget-evevit-schedule-sticky .item-image-wrapper,
.elementor-widget-evevit-schedules .item-image-wrapper {
    align-items: flex-start !important;
}

/* Align the overlapping-circle inner row from the top as well. */
.elementor-widget-evevit-schedule-sticky .item-image-inner,
.elementor-widget-evevit-schedules .item-image-inner {
    align-items: flex-start !important;
}

/* ── Schedule-tabs: speaker name + job shown permanently below the circle ──── */

/* Wrapper: non-overlapping grid with consistent columns */
.elementor-widget-evevit-schedule-tabs .item-image-wrapper {
    display: flex;
    flex-wrap: wrap;
    gap: 24px;
    padding-left: 0;
    align-items: flex-start;
}

/* Each speaker block: circle on top, name/job centred below.
   Fixed width ensures all items are the same column width so second-row
   items line up with first-row items regardless of text length; 150px fits
   typical names, job titles and companies on one line (phones: see below).
   !important on margin-left overrides the theme's .item-image:not(:first-child)
   { margin-left: -10px } rule (higher specificity). */
.elementor-widget-evevit-schedule-tabs .item-image,
.elementor-widget-evevit-schedule-tabs .item-image:not(:first-child) {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    margin-left: 0 !important;
    flex: 0 0 150px;
    width: 150px;
}

/* Phones: speakers fill the row in equal columns (two across on an iPhone),
   each centred in its column, instead of packing left and leaving an empty
   strip on the right. Extra selector step out-ranks the theme's display:flex
   on the wrapper, which loads after this file. */
@media (max-width: 767px) {
    .elementor-widget-evevit-schedule-tabs .item-wrapper .item-image-wrapper {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
        gap: 24px 16px;
        justify-items: center;
    }

    /* Each speaker takes its whole column (~148px on an iPhone instead of
       100px) so the name, job and company fit more per line. */
    .elementor-widget-evevit-schedule-tabs .item-wrapper .item-image-wrapper .item-image {
        flex: none;
        width: 100%;
    }

    /* "Skilled Speakers" label (when not hidden in Enhancements): own row. */
    .elementor-widget-evevit-schedule-tabs .item-wrapper .item-image-wrapper .speaker-text {
        grid-column: 1 / -1;
        justify-self: start;
        margin-left: 0;
        max-width: none;
    }
}

/* Show the speaker info permanently (no tooltip needed) */
.elementor-widget-evevit-schedule-tabs .tooltipster-speaker-content {
    display: block !important;
    position: static !important;
    opacity: 1 !important;
    visibility: visible !important;
    transform: none !important;
    margin-top: 10px;
    text-align: center;
    pointer-events: none;
}

.elementor-widget-evevit-schedule-tabs .tooltipster-speaker-content .name {
    font-size: 13px;
    font-weight: 600;
    line-height: 1.3;
    margin-bottom: 3px;
    word-break: break-word;
}

.elementor-widget-evevit-schedule-tabs .tooltipster-speaker-content .job {
    font-size: 12px;
    opacity: .7;
    line-height: 1.4;
    word-break: break-word;
}

.elementor-widget-evevit-schedule-tabs .tooltipster-speaker-content .company {
    font-size: 12px; /* the global .company 14px rule skips this widget */
    opacity: .7;
    line-height: 1.4;
    word-break: break-word;
}

/* Suppress the floating tooltipster popup so it doesn't appear on hover */
.elementor-widget-evevit-schedule-tabs .tooltipster-base {
    display: none !important;
}

/* Kill hover animations/transforms on the speaker thumbnails so there are no
   zoom or overlay effects that compete with the always-visible label */
.elementor-widget-evevit-schedule-tabs .item-image,
.elementor-widget-evevit-schedule-tabs .item-image *,
.elementor-widget-evevit-schedule-tabs .item-image img {
    transition: none !important;
    transform: none !important;
    animation: none !important;
}

.elementor-widget-evevit-schedule-tabs .item-image::before,
.elementor-widget-evevit-schedule-tabs .item-image::after {
    display: none !important;
}

/* Tooltipster tooltip: constrain speaker name/job/company inside the rendered
   tooltip popup so long text wraps rather than stretching the box.
   Targets only the tooltip widget, NOT the hidden source div in the DOM
   (which lives inside .item-image and must not gain a layout width). */
.evevit-tooltipster-wrap .tooltipster-content .name,
.evevit-tooltipster-wrap .tooltipster-content .job,
.evevit-tooltipster-wrap .tooltipster-content .company {
    max-width: 180px;
    word-break: break-word;
    overflow-wrap: break-word;
    white-space: normal;
}

/* ── Schedule share button ───────────────────────────────────────────────────── */

/* Position share button absolutely alongside the + button — identical size */
.schedules-button-share {
    position: absolute;
    top: 30px;
    right: 74px; /* 30px (popup right) + 34px (popup width) + 10px gap */
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: #EDEBE8;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background .2s;
    color: #555;
}

.schedules-button-share:hover {
    background: #DBD9D6;
    color: #111;
}

/* ⓘ Details button: same colours as the share button beside it. "div." makes
   this beat the theme's .schedules-button-popup (which loads after this file)
   while staying weaker than the Elementor "Details Button" colour controls
   ({{WRAPPER}} .schedules-button-popup), so those still win when set. */
div.schedules-button-popup {
    background-color: #EDEBE8;
    color: #555;
}

div.schedules-button-popup:hover {
    background-color: #DBD9D6;
    color: #111;
}

/* Increase right padding on grid + sticky schedule items to fit both buttons */
.elementor-widget-evevit-schedules .schedule-content .schedules-item,
.elementor-widget-evevit-schedule-sticky .schedule-content-inner .schedules-item {
    padding-right: clamp(125px, 12vmax, 175px);
}

/* Tabs: the share + ⓘ buttons sit at the card's top-right, level with the
   title, so only the title keeps clear of them (the description and speakers
   below use the full width). Buttons span 108px from the card edge; the
   theme's 30px wrapper padding + 90px here leaves a 12px gap. */
.elementor-widget-evevit-schedule-tabs .item-wrapper .title-schedules {
    padding-right: 90px;
}

/* Tabs mobile: theme moves both buttons to bottom — override to keep them at top */
@media (max-width: 650px) {
    .elementor-widget-evevit-schedule-tabs .schedules-button-popup {
        top: 30px !important;
        bottom: auto !important;
    }
    .elementor-widget-evevit-schedule-tabs .schedules-button-share {
        top: 30px;
        bottom: auto;
        right: 74px;
    }
    /* The card stacks here, so both buttons sit over the dark Time panel
       above and the title needs no room for them. */
    .elementor-widget-evevit-schedule-tabs .item-wrapper .title-schedules {
        padding-right: 0;
    }
}

@media (max-width: 640px) {
    .schedules-button-share {
        right: 70px; /* stays 34px tall to match + button */
    }
    .schedules-button-share svg {
        width: 12px;
        height: 12px;
    }
}

.gcs-share-toast {
    position: fixed;
    bottom: 24px;
    left: 50%;
    transform: translateX(-50%) translateY(12px);
    background: #1a1a2e;
    color: #fff;
    padding: 10px 22px;
    border-radius: 100px;
    font-size: .85em;
    opacity: 0;
    pointer-events: none;
    transition: opacity .25s, transform .25s;
    z-index: 99999;
    white-space: nowrap;
}

.gcs-share-toast.gcs-visible {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}

/* ── Schedule popup: constrain width ────────────────────────────────────────── */

/* Theme sets max-width: 1480px — reduce to something more comfortable */
.schedule-popup-main .schedule-popup {
    max-width: 900px !important;
}

/* ── Schedule popup: close button (match speaker popup design) ──────────────── */

/* Give the flex wrapper its own positioning context so the absolutely-
   positioned close button anchors to the actual content bounds, not to the
   transparent outer padding of .schedule-popup. */
.schedule-popup-main .schedule-popup-wrap {
    position: relative;
}

.schedule-popup-main .schedule-popup-close.mfp-close {
    position: absolute !important;
    top: 16px !important;
    right: 16px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: 32px !important;
    height: 32px !important;
    min-width: 32px !important;
    line-height: 1 !important;
    padding: 0 !important;
    font-size: 0 !important;
    background: rgba(26, 26, 46, 0.08) !important;
    border: none !important;
    border-radius: 50% !important;
    color: #1a1a2e !important;
    opacity: 0.7 !important;
    cursor: pointer;
    z-index: 10 !important;
    transition: background .2s, opacity .2s;
}

.schedule-popup-main .schedule-popup-close.mfp-close:hover {
    background: rgba(26, 26, 46, 0.16) !important;
    opacity: 1 !important;
}

.schedule-popup-main .schedule-popup-close.mfp-close i {
    color: #1a1a2e !important;
    font-size: 15px !important;
    pointer-events: none;
}

/* ── Schedule popup: pinned header with the X (like the speaker popup) ──────
   The white card is capped at the screen height and its text scrolls inside
   it, so the X (anchored to the card's top-right) never scrolls away. A white
   band at the top of the text stays put as the text scrolls under it, so the
   text never runs behind the X. The band replaces the theme's top padding. */

.schedule-popup-main .popup-content-inner {
    max-height: calc(100vh - 120px);  /* .schedule-popup has 60px top + bottom padding */
    max-height: calc(100dvh - 120px);
}

.schedule-popup-main .popup-content-inner .popup-inner {
    overflow-y: auto;
    overscroll-behavior: contain;
    padding-top: 0;
}

.schedule-popup-main .popup-content-inner .popup-inner::before {
    content: '';
    display: block;
    position: sticky;
    top: 0;
    z-index: 5;  /* above the text, below the X (z-index 10) */
    height: max(64px, clamp(30px, 5vmax, 80px));  /* clears the X; theme's padding when larger */
    background: #fff;  /* the card's colour (.popup-content-inner) */
}

/* Phones: the image (if any) stacks above the text, so the whole card scrolls
   and the band pins to the card's top instead. */
@media (max-width: 768px) {
    .schedule-popup-main .popup-content-inner {
        max-height: calc(100vh - 30px);  /* theme's 15px top + bottom padding here */
        max-height: calc(100dvh - 30px);
        overflow-y: auto;
        overscroll-behavior: contain;
    }

    .schedule-popup-main .popup-content-inner .popup-inner {
        overflow-y: visible;
    }
}

/* ── Schedule tabs: day date pill — override theme uppercase ────────────────── */

.elementor-widget-evevit-schedule-tabs .schedules-day-time {
    text-transform: none !important;
}

/* ── Schedule tabs: fixed-width meta panel — prevents long location/track text
   from widening the left column unevenly across session cards. ──────────────── */

.elementor-widget-evevit-schedule-tabs .item-meta {
    flex-shrink: 0 !important;
    width: 280px;
    min-width: 0;
    box-sizing: border-box;
}

/* Keep the session time on a single line regardless of font size */
.elementor-widget-evevit-schedule-tabs .item-meta .time-schedules h5 {
    white-space: nowrap;
    overflow: hidden;
}

/* Allow location and track values to wrap within the fixed column */
.elementor-widget-evevit-schedule-tabs .item-meta .schedules-location span + span,
.elementor-widget-evevit-schedule-tabs .item-meta .schedules-track span + span {
    white-space: normal !important;
    word-break: break-word;
    overflow-wrap: break-word;
}

/* ── Schedule tabs: Track — same 2-line column layout as Event Location ─────── */

.elementor-widget-evevit-schedule-tabs .item-meta .schedules-track {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: 20px;
}

.elementor-widget-evevit-schedule-tabs .item-meta .schedules-track span + span {
    font-weight: 600;
    letter-spacing: -0.02em;
    font-size: 20px;
    line-height: 1.3;
}

/* Space between Track and Event Location */
.elementor-widget-evevit-schedule-tabs .item-meta .schedules-location {
    margin-top: 20px;
}

/* Track and Location follow Time at the top of the panel (their margin-top
   spaces them) instead of the theme pushing them to the bottom. */
.elementor-widget-evevit-schedule-tabs .schedules-item .item-meta .time-schedules {
    margin-bottom: 0;
}

/* Session title, type badges and the dark Time / Track / Location panel open
   the details popup like the ⓘ button (schedule-filter.js) — clickable, but
   no link styling. */
.elementor-widget-evevit-schedule-tabs .title-schedules,
.elementor-widget-evevit-schedule-tabs .schedules-session-types,
.elementor-widget-evevit-schedule-tabs .schedules-item .item-meta {
    cursor: pointer;
}

.elementor-widget-evevit-schedule-tabs .title-schedules:focus {
    outline: none;
}

.elementor-widget-evevit-schedule-tabs .title-schedules:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 3px;
}

/* ── Schedule popup: speaker names open the bio popup ───────────────────────── */

.schedule-speaker-link {
    cursor: pointer;
    text-decoration: none;
    transition: opacity .15s;
}

.schedule-speaker-link:hover {
    opacity: 0.65;
}

/* Stacked speaker overlay — sits above the open schedule popup (MFP z-index
   is 1042/1043) and fades in/out independently so the schedule popup stays open. */
.gcs-nested-speaker-overlay {
    position: fixed;
    inset: 0;
    z-index: 1050;
    background: rgba(0, 0, 0, 0.55);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    box-sizing: border-box;
    opacity: 0;
    transition: opacity .22s ease;
}

.gcs-nested-speaker-overlay.gcs-visible {
    opacity: 1;
}

/* Match the same max-width as .mfp-speaker-bio .mfp-content */
.gcs-nested-speaker-overlay .speaker-popup {
    max-width: 820px;
    width: 90%;
    display: flex !important; /* override mfp-hide which sets display:none */
}

/* ── Speaker style 1 / 2 overrides ─────────────────────────────────────────── */

/* Hide the arrow link — popup trigger is the whole card */
.speaker-link {
    display: none !important;
}

/* Company text size & weight (schedule inline view). The Schedule Tabs widget
   is left out so its Speaker Style controls in Elementor can set the size. */
.company:not(.elementor-widget-evevit-schedule-tabs .company) {
    font-size: 14px !important;
}

/* Speaker card company */
.speaker-company {
    font-size: 14px !important;
    font-weight: 500;
}

/* Speaker name — allow it to take full width in the flex header row */
.speaker-infor-wrap .speaker-name {
    width: 100%;
    max-width: 100%;
    flex: 1;
    margin-bottom: 12px;
}

.speaker-name {
    padding-bottom: 10px;
    text-transform: none;
}

.speaker-job {
    margin-bottom: 0 !important;
    text-transform: none;
}

/* Custom style — no all-caps on names */
.speaker-custom-name {
    text-transform: none;
}

/* Search input — tighten left padding so text sits closer to the icon */
.gcs-speaker-search {
    padding-left: 47px !important;
}

.gcs-schedule-search {
    padding-left: 47px !important;
}

/* ── Schedule session search ────────────────────────────────────────────────── */

.gcs-schedule-search-wrap {
    margin-bottom: 24px;
    text-align: center;
}

.gcs-schedule-search {
    width: 100%;
    max-width: 480px;
    padding: 11px 20px 11px 47px;
    border: 1.5px solid rgba(0, 0, 0, .1);
    border-radius: 100px;
    font-size: .92em;
    background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") no-repeat 20px center;
    outline: none;
    transition: border-color .2s, box-shadow .2s;
    display: inline-block;
    box-sizing: border-box;
}

.gcs-schedule-search:focus {
    border-color: rgba(0, 0, 0, .25);
    box-shadow: 0 2px 10px rgba(0, 0, 0, .06);
}

.gcs-search-no-results-msg {
    margin: 16px 0 0;
    text-align: center;
    opacity: .5;
    font-size: .95em;
}

/* Hide non-matching session rows */
.schedules-item.gcs-search-hidden {
    display: none !important;
}

/* Hide sessions filtered out */
.schedules-item.gcs-filter-hidden {
    display: none !important;
}

/* ── Description "…more" inline button ──────────────────────────────────────── */

/* Scoped under .schedules-description to out-rank the Elementor kit's global
   ".elementor-kit-N button" (and :hover/:focus) background and radius. */
.schedules-description .gcs-desc-more,
.schedules-description .gcs-desc-toggle {
    -webkit-appearance: none;
    appearance: none;
    display: inline;
    background: none;
    border: none;
    border-radius: 0;
    padding: 0;
    margin: 0;
    box-shadow: none;
    font-family: inherit;
    font-size: inherit;
    font-weight: inherit;
    color: inherit;
    cursor: pointer;
    text-decoration: none;
    vertical-align: baseline;
    line-height: inherit;
}

.schedules-description .gcs-desc-more:hover,
.schedules-description .gcs-desc-more:focus,
.schedules-description .gcs-desc-toggle:hover,
.schedules-description .gcs-desc-toggle:focus {
    color: inherit !important;
    background: none !important;
}

.gcs-desc-ellipsis {
    color: inherit !important;
}

.gcs-desc-more-label {
    text-decoration: underline;
}

/* Two-line "read more" collapsed preview: the formatted description's
   paragraphs and list items run together as one line of text, so the preview
   is two lines and "… read more" follows the last word. gcs-desc-full (set by
   schedule-description.js) renders it as written instead. */
.gcs-desc-clamp:not(.gcs-desc-full) .gcs-desc-body,
.gcs-desc-clamp:not(.gcs-desc-full) .gcs-desc-body :is(p, div, ul, ol, li, h1, h2, h3, h4, h5, h6, blockquote) {
    display: inline;
    margin: 0;
    padding: 0;
}

/* Word gap where a block starts (e.g. text followed by a list); the browser
   collapses doubled or line-leading spaces. */
.gcs-desc-clamp:not(.gcs-desc-full) .gcs-desc-body :is(p, div, ul, ol, li, h1, h2, h3, h4, h5, h6, blockquote)::before {
    content: ' ';
}

/* Plain CSS clamp until the script has measured the box (also covers hidden
   day tabs and no-JS). 2 lines, 5 on phones — keep in sync with
   schedule-description.js. */
.gcs-desc-clamp:not(.gcs-desc-ready) .gcs-desc-body {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
}

@media (max-width: 767px) {
    .gcs-desc-clamp:not(.gcs-desc-ready) .gcs-desc-body {
        -webkit-line-clamp: 5;
        line-clamp: 5;
    }
}

/* Formatted descriptions on the schedule: no stray gap under a last
   paragraph or list (the popup keeps it, to space it from the Content). */
.schedules-description > :last-child,
.gcs-desc-body > :last-child {
    margin-bottom: 0;
}

/* ── Filter toggle button ────────────────────────────────────────────────────── */

.gcs-filter-toggle-wrap {
    margin-bottom: 0;
}

.gcs-filter-toggle-wrap.gcs-filter-align-center {
    text-align: center;
}

.gcs-filter-toggle-wrap.gcs-filter-align-left {
    text-align: left;
}

.gcs-filter-toggle-btn {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 9px 20px;
    border-radius: 100px;
    border: none;
    background: #fff;
    font-family: inherit;
    font-size: .85em;
    font-weight: 600;
    line-height: 1;
    letter-spacing: .01em;
    color: inherit;
    cursor: pointer;
    transition:
        background   .16s ease,
        color        .16s ease,
        box-shadow   .16s ease;
    outline: none;
    margin-bottom: 12px;
    box-shadow:
        0 1px 3px rgba(0, 0, 0, .06),
        0 0 0 1px rgba(0, 0, 0, .04);
}

.gcs-filter-toggle-btn:hover {
    box-shadow: 0 2px 8px rgba(0, 0, 0, .09);
}

.gcs-filter-toggle-btn:focus-visible {
    outline: 2px solid var(--e-global-color-accent, #1a1a2e);
    outline-offset: 2px;
}

.gcs-filter-toggle-btn.gcs-filter-toggle-open {
    background: var(--e-global-color-accent, #1a1a2e);
    color: #fff;
    box-shadow: 0 3px 12px rgba(0, 0, 0, .18);
}

.gcs-filter-toggle-btn svg {
    flex-shrink: 0;
    transition: transform .2s ease;
}

.gcs-filter-toggle-btn.gcs-filter-toggle-open svg {
    transform: rotate(180deg);
}

.gcs-filter-active-count {
    display: none;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 100px;
    background: var(--e-global-color-accent, #1a1a2e);
    color: #fff;
    font-size: .72em;
    font-weight: 700;
    line-height: 18px;
    text-align: center;
    box-sizing: border-box;
}

.gcs-filter-active-count.gcs-has-active {
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.gcs-filter-toggle-open .gcs-filter-active-count {
    background: rgba(255, 255, 255, 0.25);
    color: #fff;
}

/* ── Session filter bar ──────────────────────────────────────────────────────── */

.gcs-filter-bar {
    margin-bottom: 28px;
    padding: 18px 24px;
    background: #fff;
    border-radius: 16px;
    box-shadow:
        0 1px 3px rgba(0, 0, 0, .06),
        0 4px 20px rgba(0, 0, 0, .05),
        0 0 0 1px rgba(0, 0, 0, .04);
}

.gcs-filter-inner {
    display: flex;
    align-items: center;
    gap: 20px;
    flex-wrap: wrap;
}

.gcs-filter-groups {
    display: flex;
    gap: 28px;
    flex-wrap: wrap;
    flex: 1;
    min-width: 0;
}

/* Left-aligned: groups stack naturally */
.gcs-filter-align-left .gcs-filter-groups {
    justify-content: flex-start;
}

/* Center-aligned: collapse flex-grow so the groups don't expand to full width,
   then center the inner row and the groups themselves */
.gcs-filter-align-center .gcs-filter-inner {
    justify-content: center;
}

.gcs-filter-align-center .gcs-filter-groups {
    flex: 0 1 auto;
    justify-content: center;
}

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

.gcs-filter-group + .gcs-filter-group {
    padding-left: 0;
    border-left: none;
}

.gcs-filter-group-label {
    font-size: .72em;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
    opacity: .4;
    white-space: nowrap;
    flex-shrink: 0;
    line-height: 1;
}

.gcs-filter-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

/* ── Filter pill ─────────────────────────────────────────────────────────────── */

.gcs-filter-pill {
    display: inline-flex;
    align-items: center;
    padding: 6px 15px;
    border-radius: 100px;
    border: 1.5px solid rgba(0, 0, 0, .13);
    background: transparent;
    font-family: inherit;
    font-size: .81em;
    font-weight: 500;
    line-height: 1;
    letter-spacing: .01em;
    color: inherit;
    cursor: pointer;
    transition:
        border-color .16s ease,
        background    .16s ease,
        color         .16s ease,
        box-shadow    .16s ease,
        transform     .12s ease;
    outline: none;
    -webkit-user-select: none;
    user-select: none;
}

.gcs-filter-pill:hover {
    border-color: rgba(0, 0, 0, .32);
    background: rgba(0, 0, 0, .04);
    transform: translateY(-1px);
    box-shadow: 0 2px 8px rgba(0, 0, 0, .07);
}

.gcs-filter-pill:focus-visible {
    outline: 2px solid var(--e-global-color-accent, #1a1a2e);
    outline-offset: 2px;
}

.gcs-filter-pill.gcs-filter-active {
    background: var(--e-global-color-accent, #1a1a2e);
    border-color: var(--e-global-color-accent, #1a1a2e);
    color: #fff;
    box-shadow: 0 3px 12px rgba(0, 0, 0, .18);
}

.gcs-filter-pill.gcs-filter-active:hover {
    opacity: .87;
    transform: translateY(-1px);
}

/* ── Clear button ─────────────────────────────────────────────────────────────── */

.gcs-filter-clear {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 6px 13px;
    border-radius: 100px;
    border: 1.5px solid rgba(0, 0, 0, .1);
    background: transparent;
    font-family: inherit;
    font-size: .79em;
    font-weight: 500;
    line-height: 1;
    cursor: pointer;
    color: inherit;
    opacity: .5;
    transition: opacity .18s ease, border-color .18s ease;
    outline: none;
}

.gcs-filter-clear:hover {
    opacity: 1;
    border-color: rgba(0, 0, 0, .3);
}

.gcs-filter-clear svg {
    flex-shrink: 0;
}

/* ── No-filter-results message ───────────────────────────────────────────────── */

.gcs-filter-no-results {
    width: 100%;
    padding: 56px 0 40px;
    text-align: center;
    opacity: .38;
    font-size: .95em;
    margin: 0;
}

/* ── Responsive ──────────────────────────────────────────────────────────────── */

@media (max-width: 600px) {
    .gcs-filter-bar {
        padding: 14px 16px;
    }

    .gcs-filter-group + .gcs-filter-group {
        padding-top: 12px;
    }

    .gcs-filter-groups {
        flex-direction: column;
        gap: 12px;
    }

    .gcs-filter-group {
        flex-direction: column;
        align-items: flex-start;
        gap: 8px;
    }
}

/* ── Schedule anchor: offset native browser hash-scroll for sticky header ──────
   scroll-margin-top tells the browser to leave this much space above the element
   when scrolling it into view via a fragment link.  JS refines the value after
   measuring the actual header height; 120 px is the CSS fallback.             */
[id^="anchor-schedule-popup-"] {
    scroll-margin-top: 120px;
}

/* ── Session type badges ─────────────────────────────────────────────────────── */

.schedules-session-type-badge {
    display: inline-block;
    padding: 3px 10px;
    border-radius: 100px;
    font-size: .76em;
    font-weight: 600;
    letter-spacing: .03em;
    background: rgba(0, 0, 0, .07);
    color: inherit;
    line-height: 1.5;
    white-space: nowrap;
}

/* In schedule tabs card — sits between title and description */
.schedules-session-types {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    margin: 5px 0 8px;
}

/* In schedule popup meta section */
.popup-session-types {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    margin-top: 8px;
    padding-top: 4px;
}
