
/* ── module nav (page-wrapper.twig) ─────────────────────────────────────── */
.conf-nav {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-bottom: 20px;
    padding: 6px;
    background: #f7f8fa;
    border: 1px solid #e0e0e0;
    border-radius: 8px;
}

.conf-nav-item {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 8px 14px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 500;
    color: #555;
    text-decoration: none;
    transition: background 0.12s, color 0.12s;
}

.conf-nav-item:hover {
    background: #e9ecf1;
    color: #222;
    text-decoration: none;
}

.conf-nav-item i {
    font-size: 13px;
}

.conf-nav-active {
    background: #22699b;
    color: #fff;
}

.conf-nav-active:hover {
    background: #236593;
    color: #fff;
}

.conf-page-title {
    margin: 0 0 16px;
}

/* ── public conference page (page-conference.twig) ─────────────────────── */
.conf-hero { margin-bottom: 24px; }
.conf-hero-title { margin: 0 0 4px; }
.conf-hero-series { color: #5c6b7a; font-size: 15px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
.conf-hero-dates { color: #555; font-size: 16px; margin-top: 4px; }
.conf-past-badge { margin-top: 8px; display: inline-block; }

.conf-pricing-card {
    border: 1px solid #dbe4ec; border-radius: 10px; background: #f7fafd;
    padding: 20px 24px; margin: 20px 0; max-width: 420px;
}
.conf-pricing-earlybird { border-color: #22699b; background: #eef6fc; }
/* Registration closed on a conference that is still upcoming. Deliberately
   muted rather than a warning colour: nothing has gone wrong, there is simply
   nothing to click, and a red box next to a live agenda reads as an error. */
.conf-pricing-closed { border-color: #d6d9dd; background: #f4f5f6; }
.conf-pricing-closed .conf-pricing-note { margin: 0; color: #5c6b7a; }
.conf-pricing-label { font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: #22699b; }
.conf-pricing-amount { font-size: 40px; font-weight: 700; line-height: 1.1; margin: 4px 0; }
.conf-pricing-compare { color: #5c6b7a; font-size: 14px; }
.conf-pricing-note { font-size: 14px; color: #445; margin: 12px 0; }
.conf-register-btn { margin-top: 6px; }

.conf-earlybird-announcement { font-size: 17px; line-height: 1.55; margin-bottom: 8px; }

.conf-venue { margin: 28px 0; }
.conf-venue-name { font-size: 17px; font-weight: 600; }
.conf-venue-address { color: #555; margin-top: 4px; font-style: normal; line-height: 1.4; }
.conf-venue-map-link { display: inline-block; margin-top: 4px; font-size: 13px; }
.conf-venue-map-link .fa { margin-right: 4px; }
.conf-venue-description { color: #555; margin-top: 4px; }

.conf-agenda { margin-top: 32px; }
.conf-agenda-day { margin: 26px 0 10px; padding-bottom: 6px; border-bottom: 2px solid #dbe4ec; }
.conf-slot { margin: 0 0 18px; padding-left: 14px; border-left: 3px solid #dbe4ec; }
.conf-slot-time { font-weight: 700; color: #1c3d5a; margin-bottom: 6px; }
.conf-slot-room { font-weight: 400; color: #5c6b7a; margin-left: 8px; font-size: 14px; }
.conf-session { margin: 8px 0 12px; }
.conf-session-title { font-size: 16px; font-weight: 600; }
.conf-session-description { color: #555; font-size: 14px; margin: 3px 0; }
.conf-session-empty { color: #6f6f85; font-style: italic; }
.conf-session-speakers { font-size: 14px; margin-top: 4px; }
.conf-speaker-pic { width: 26px; height: 26px; border-radius: 50%; object-fit: cover; vertical-align: middle; margin-right: 5px; }
.conf-speaker-name { font-weight: 600; }
.conf-speaker-affiliation { color: #5c6b7a; }

/* ── Schedule Grid ─────────────────────────────────────────────── */
.conf-grid-legend { font-size: .85rem; color: #666; }
.conf-grid-swatch { display: inline-block; width: 12px; height: 12px; border-radius: 2px; vertical-align: middle; margin: 0 2px 0 8px; }
.conf-grid-swatch-ok { background: #cfe8d4; border: 1px solid #63a36e; }
.conf-grid-swatch-conflict { background: #f6d2d2; border: 1px solid #ce7f7f; }

.conf-grid-day { margin: 1.5rem 0; }
.conf-grid-scroll { overflow-x: auto; border: 1px solid #e3e8ee; border-radius: 6px; }
.conf-grid-table { border-collapse: collapse; width: 100%; table-layout: fixed; font-size: .8rem; }
.conf-grid-table th, .conf-grid-table td { border: 1px solid #eef1f4; }
.conf-grid-time-col, .conf-grid-time-cell { width: 62px; min-width: 62px; text-align: right; padding: 0 6px; color: #6e6e6e; white-space: nowrap; background: #fafbfc; }
.conf-grid-room-col { background: #f4f6f8; padding: 6px 4px; text-align: center; font-weight: 600; position: sticky; top: 0; }
.conf-grid-row { height: 8px; }              /* 5-min rows are short; blocks span many */
.conf-grid-row-hour td { border-top: 1px solid #d6dce2; }
.conf-grid-time-cell { height: 8px; line-height: 8px; }

.conf-grid-cell { padding: 0; }
.conf-grid-empty { cursor: pointer; }
.conf-grid-empty:hover { background: #eaf3ff; }

.conf-grid-block { cursor: grab; vertical-align: top; padding: 3px 5px; border-radius: 3px;
    background: #cfe8d4; border: 1px solid #63a36e !important; overflow: hidden; position: relative; }
.conf-grid-block:active { cursor: grabbing; }
.conf-grid-block-title { display: block; font-weight: 600; line-height: 1.15; color: #234a2c; }
.conf-grid-block-flag { position: absolute; top: 2px; right: 3px; color: #b3541e; }
.conf-grid-conflict-room, .conf-grid-conflict-speaker, .conf-grid-conflict-both {
    background: #f6d2d2; border-color: #ce7f7f !important; }
.conf-grid-conflict-room .conf-grid-block-title,
.conf-grid-conflict-speaker .conf-grid-block-title,
.conf-grid-conflict-both .conf-grid-block-title { color: #7a2b2b; }

.conf-grid-dragging { opacity: .5; }
.conf-grid-drop-hint { outline: 2px dashed #4a90d9; outline-offset: -2px; background: #eaf3ff; }

.conf-grid-tray { margin: 1.5rem 0; padding: 12px; background: #fafbfc; border: 1px solid #e3e8ee; border-radius: 6px; }
.conf-grid-tray-items { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.conf-grid-tray-item { cursor: grab; padding: 4px 10px; background: #fff; border: 1px solid #c9d3dc; border-radius: 14px; font-size: .85rem; }
.conf-grid-tray-item:active { cursor: grabbing; }

.conf-grid-pick-list { list-style: none; padding: 0; margin: 10px 0; }
.conf-grid-pick-list li { margin: 4px 0; }
.conf-grid-cell-label { color: #555; font-weight: 600; }

.conf-grid-daypicker { margin: 1rem 0; display: flex; align-items: center; gap: 10px; }
.conf-grid-day-select { display: inline-block; width: auto; min-width: 220px; }

/* ── attendee roster ── */
.conf-roster-counts { margin: -6px 0 14px; }
.conf-roster-counts .badge { margin-right: 6px; }
.conf-roster-toggle { min-width: 84px; cursor: pointer; }
.conf-roster-table .fa-cutlery, .conf-roster-table .fa-wheelchair { margin-right: 6px; color: #6e6e6e; }

/* ── public registration ── */
.conf-register { max-width: 560px; }
.conf-register-price { font-size: 1.1rem; margin: 8px 0 16px; }
.conf-register-form .form-group { margin-bottom: 12px; }
.conf-roster-pay { display: inline-block; margin-top: 3px; }
.conf-roster-pay-paid { color: #2b7a2b; }
.conf-roster-pay-pending { color: #96660a; }
.conf-roster-pay-failed { color: #b32b2b; }
.conf-roster-method { color: #6e6e6e; font-style: italic; }
.conf-roster-checkpaid { margin-top: 3px; }
.conf-pay-methods .radio { margin: 4px 0; }
.conf-pay-method-boxes { list-style: none; padding-left: 0; }
.conf-pay-method-boxes li { display: block; margin: 3px 0; }

/* ── order history + receipts ── */
.conf-orders-table td { vertical-align: top; }
.conf-orders-pay { white-space: nowrap; }
.conf-signin { max-width: 460px; }
.conf-signin-form .form-group { margin-bottom: 12px; }
.conf-my-links { list-style: none; padding-left: 0; }
.conf-my-links li { padding: 6px 0; }

/* ── Admin submenu ─────────────────────────────────────────────────────────
   The Admin nav item owns a dropdown of the admin pages, plus a second row
   that appears while you're inside the section.

   z-index note: the dropdown sits at 2 ON PURPOSE. The level-1 modal stack is
   3 (screen) / 4 (window) / 5 (close), so anything higher here would let the
   nav dropdown float over an open modal and through its backdrop. 2 keeps it
   above ordinary page content (auto/0) and below the modal. */
.conf-nav-group {
    position: relative;
    display: inline-flex;
}

.conf-nav-caret {
    font-size: 11px;
    opacity: 0.75;
    margin-left: 2px;
}

.conf-nav-submenu {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 210px;
    margin-top: 4px;
    padding: 5px;
    background: #ffffff;
    border: 1px solid #e0e0e0;
    border-radius: 8px;
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12);
    z-index: 2;
}

.conf-nav-group:hover .conf-nav-submenu,
.conf-nav-group:focus-within .conf-nav-submenu {
    display: block;
}

.conf-nav-subitem {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 11px;
    border-radius: 5px;
    font-size: 13px;
    font-weight: 500;
    color: #555;
    text-decoration: none;
    white-space: nowrap;
}

.conf-nav-subitem.conf-nav-active {
    /* .conf-nav-subitem and .conf-nav-active are both (0,1,0) and the subitem
       rule comes later, so the active item drew #555 on #22699b — 1.6:1.
       This pairing outranks both. */
    color: #fff;
}

.conf-nav-subitem:hover {
    background: #e9ecf1;
    color: #222;
    text-decoration: none;
}

.conf-nav-subitem i {
    width: 15px;
    text-align: center;
    font-size: 12px;
}

/* second row: the section's pages, shown while you're inside the section */
.conf-subnav {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin: -14px 0 20px;
    padding: 6px;
    background: #ffffff;
    border: 1px solid #e0e0e0;
    border-radius: 8px;
}

.conf-subnav-item {
    font-size: 12.5px;
    padding: 6px 12px;
}

/* Small screens keep the dropdown as-is: tapping Admin navigates into the
   section, and the second row above then carries the admin pages — so no
   hover is required and the links aren't duplicated on the page. */

/* ── sponsors admin ── */
.conf-tier-block { border: 1px solid #e0e0e0; border-radius: 8px; padding: 12px; margin-bottom: 14px; }
.conf-tier-head { display: flex; justify-content: space-between; align-items: center; }
.conf-tier-name { font-weight: 700; font-size: 15px; }
.conf-tier-descr { margin: 6px 0 0; font-size: 13px; }
.conf-tier-empty { margin: 8px 0 0; font-size: 13px; }
.conf-tier-orphans { border-color: #e6c07a; }
.conf-sponsor-table { margin-top: 10px; margin-bottom: 0; }
.conf-sponsor-thumb { max-width: 80px; max-height: 50px; }
.conf-sponsor-chooser { list-style: none; padding-left: 0; }
.conf-sponsor-chooser li { padding: 5px 0; }

/* ── sponsors in the site footer ── */
.conf-sponsors { margin: 18px 0 6px; text-align: center; }
.conf-sponsors-heading { margin: 0 0 10px; font-size: 14px; letter-spacing: 1px; text-transform: uppercase; color: #ffffff }
.conf-sponsors-tier { margin-bottom: 14px; }
.conf-sponsors-tier-name { font-size: 12px; text-transform: uppercase; letter-spacing: 1px;
    opacity: 0.8; margin-bottom: 6px; }
.conf-sponsors-tier-descr { font-size: 12px; opacity: 0.75; margin-bottom: 6px; }
.conf-sponsors-row { display: flex; flex-wrap: wrap; gap: 18px; justify-content: center; align-items: center; }
.conf-sponsor { display: inline-flex; align-items: center; }
.conf-sponsors-row img { max-height: 54px; max-width: 170px; width: auto; background: #fff;
    padding: 5px; border-radius: 4px; }
.conf-sponsor-name { font-weight: 600; }
.conf-roster-note { color: #6b6b6b; font-style: italic; }  /* #777 was 4.48:1 — just under the 4.5 floor */

/* Roster filter bar — conference / payment / registration state. Inline row that
   wraps on narrow screens; selects sized to their content rather than full width. */
.conf-roster-filters {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 10px;
    margin: 0 0 12px;
    padding: 10px 12px;
    background: #f7f9fa;
    border: 1px solid #e3e8ea;
    border-radius: 4px;
}
.conf-roster-filters label { margin: 0; font-weight: normal; }
.conf-roster-filters label > span {
    display: block;
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: #5f6f77;
    margin-bottom: 2px;
}
.conf-roster-filters select { width: auto; min-width: 150px; }
.conf-roster-filter-actions { margin-left: auto; }
.conf-roster-conf a { font-weight: 600; }

/* attachments admin */
.conf-attachments .conf-att-icon { width: 28px; color: #666; }
.conf-attachments .conf-att-description { color: #555; max-width: 380px; }
.conf-attachments .conf-att-target { max-width: 260px; word-break: break-all; }
.conf-attachments .conf-att-actions { white-space: nowrap; }
.conf-att-session-title { font-size: 15px; font-weight: 600; margin-top: 22px; }
.conf-att-add-session { margin: 10px 0 6px; }

/* ── Speaker area ──────────────────────────────────────────────────────────
   The signed-in speaker's own sessions. Card-per-session so a speaker with
   three talks can tell at a glance where one ends and the next begins — the
   materials tables would otherwise run together.
   ------------------------------------------------------------------------ */
.conf-my-speaker {
    margin: 16px 0 22px;
    padding: 14px 16px;
    background: #f7f9fa;
    border: 1px solid #e3e8ea;
    border-radius: 4px;
}
.conf-my-speaker h3 { margin-top: 0; font-size: 16px; }
.conf-my-speaking-list { list-style: none; padding-left: 0; margin-bottom: 12px; }
.conf-my-speaking-list li { padding: 3px 0; }
.conf-my-speaker p.text-muted { margin: 8px 0 0; font-size: 13px; }

.conf-speaking-card {
    margin: 0 0 26px;
    padding: 16px 18px;
    border: 1px solid #e3e8ea;
    border-left: 3px solid #2e6d8e;
    border-radius: 4px;
    background: #fff;
}
.conf-speaking-head { margin-bottom: 12px; }
.conf-speaking-title { margin: 0 0 4px; font-size: 18px; }
.conf-speaking-meta {
    margin: 0;
    color: #5f6f77;
    font-size: 13px;
}
.conf-speaking-cospeakers { margin: 4px 0 0; font-size: 13px; color: #555; }
.conf-speaking-abstract {
    margin: 0 0 12px;
    padding: 10px 12px;
    background: #fbfcfc;
    border: 1px solid #eef1f2;
    border-radius: 3px;
}
.conf-speaking-abstract > :first-child { margin-top: 0; }
.conf-speaking-abstract > :last-child { margin-bottom: 0; }
.conf-speaking-note { margin: 6px 0 0; font-size: 12px; }
.conf-speaking-subhead {
    margin: 20px 0 8px;
    font-size: 15px;
    font-weight: 600;
    border-top: 1px solid #eef1f2;
    padding-top: 14px;
}
.conf-speaking-footer { margin-top: 20px; font-size: 13px; }

@media (max-width: 600px) {
    .conf-speaking-card { padding: 12px; }
    /* the materials table has 5 columns and won't fit — let it scroll inside
       the card rather than pushing the whole page sideways */
    .conf-speaking-card .conf-attachments { display: block; overflow-x: auto; }
}

/* my details */
.conf-my-photo {
    max-width: 120px;
    border-radius: 3px;
    margin: 0 0 12px;
}
.conf-my-details { margin: 0 0 16px; }
.conf-my-details dt {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: #5f6f77;
    font-weight: 600;
    margin-top: 10px;
}
.conf-my-details dd { margin: 2px 0 0; }
.conf-my-profile-footer { margin-top: 18px; font-size: 13px; }

/* ── View as (admin impersonation) ─────────────────────────────────────────
   Deliberately loud and sticky. An admin who forgets they are carrying
   someone else's session can save edits under that person's name, so this bar
   is the one piece of chrome that must not be missable or scrollable away.
   ------------------------------------------------------------------------ */
.conf-viewas-bar {
    position: sticky;
    top: 0;
    /* Level-1 modal stack in general.css is #modal-screen 3 / #modal 4 /
       #modal-close 5. At 3 this bar ties the screen and loses the tie-break,
       because the modal is appended to <body> and so comes later in the DOM —
       which is what keeps it from floating over an open modal. Anything
       higher (it was 6) parks the bar on top of the modal. */
    z-index: 3;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin: 0 0 14px;
    padding: 10px 14px;
    background: #8a3b12;
    color: #fff;
    border-radius: 3px;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .25);
    font-size: 14px;
}
.conf-viewas-bar strong { color: #fff; }
.conf-viewas-label {
    text-transform: uppercase;
    letter-spacing: .06em;
    font-size: 11px;
    font-weight: 700;
    opacity: .9;
}
.conf-viewas-email { opacity: .85; font-size: 13px; }
.conf-viewas-warn {
    flex-basis: 100%;
    font-size: 12px;
    opacity: .9;
}
.conf-viewas-exit { margin-left: auto; }

/* entry points in the admin lists.
   btn-default renders near-white on white in the mdsg theme, which left this
   button effectively invisible next to Profile and Remove — give it its own
   border and ink rather than relying on the theme's neutral button. */
a.conf-viewas-btn {
    white-space: nowrap;
    background: #fff;
    border: 1px solid #8a3b12;
    color: #8a3b12;
}
a.conf-viewas-btn:hover,
a.conf-viewas-btn:focus {
    background: #8a3b12;
    border-color: #8a3b12;
    color: #fff;
}
.conf-session-speakers { list-style: none; padding-left: 0; margin: 0; }
.conf-session-speakers li { padding: 1px 0; }
.conf-viewas-inline {
    font-size: 11px;
    white-space: nowrap;
    /* was opacity:.75, which computed to 3.01:1 — under the 4.5:1 floor.
       Full-strength color instead; the smaller size still reads secondary. */
    text-decoration: underline;
}

@media (max-width: 600px) {
    .conf-viewas-bar { font-size: 13px; }
    .conf-viewas-exit { margin-left: 0; }
}

/* ── My Conference layout + side nav ───────────────────────────────────────
   Every signed-in page (hub, sessions, registrations, details) renders
   through Conference::my_page(), which pairs this sidebar with the page
   content — so the same links are reachable from all of them.
   ------------------------------------------------------------------------ */
.conf-my-layout {
    display: flex;
    align-items: flex-start;
    gap: 24px;
}
.conf-my-sidebar { flex: 0 0 200px; }
/* min-width:0 lets the main column shrink instead of forcing the flex row
   wider than the page — without it the materials table pushes the sidebar
   off-screen on narrow viewports */
.conf-my-main { flex: 1 1 auto; min-width: 0; }
.conf-my-main > :first-child { margin-top: 0; }

.conf-my-nav {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 8px;
    background: #f7f8fa;
    border: 1px solid #e0e0e0;
    border-radius: 8px;
    position: sticky;
    top: 16px;
}
.conf-my-nav-item {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 9px 12px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 500;
    color: #555;
    text-decoration: none;
    transition: background .12s, color .12s;
}
.conf-my-nav-item:hover,
.conf-my-nav-item:focus {
    background: #e9ecf1;
    color: #222;
    text-decoration: none;
}
.conf-my-nav-item i { width: 15px; text-align: center; font-size: 13px; }
.conf-my-nav-active,
.conf-my-nav-active:hover,
.conf-my-nav-active:focus { background: #22699b; color: #fff; }

/* Sign out leaves the area rather than navigating inside it, so it sits
   below a rule instead of reading as one more destination. */
.conf-my-nav-signout {
    margin-top: 6px;
    padding-top: 12px;
    border-top: 1px solid #e0e0e0;
    border-radius: 0 0 6px 6px;
    color: #8a3b12;
}
.conf-my-nav-signout:hover,
.conf-my-nav-signout:focus { background: #f6e8e2; color: #8a3b12; }

@media (max-width: 700px) {
    /* stack: the nav becomes a wrapping strip above the content, and stops
       being sticky so it does not eat vertical space on a small screen */
    .conf-my-layout { flex-direction: column; gap: 14px; }
    .conf-my-sidebar { flex: 1 1 auto; width: 100%; }
    .conf-my-nav { flex-direction: row; flex-wrap: wrap; position: static; }
    .conf-my-nav-item { padding: 8px 11px; }
    .conf-my-nav-signout {
        margin-top: 0;
        padding-top: 8px;
        border-top: 0;
        border-radius: 6px;
        margin-left: auto;
    }
}

/* ── My schedule (personal agenda) ─────────────────────────────────────── */
.conf-schedule-summary { margin: 0 0 4px; font-size: 15px; }
/* self-contained: the theme's .badge is white-on-white here, so the count
   carries its own colors rather than inheriting a broken one */
.conf-schedule-count {
    display: inline-block;
    min-width: 24px;
    padding: 2px 8px;
    border-radius: 11px;
    background: #22699b;
    color: #fff;
    font-size: 13px;
    font-weight: 700;
    text-align: center;
}
.conf-schedule-warn { color: #8a3b12; margin-left: 8px; font-weight: 600; }
.conf-schedule-hint { font-size: 12px; margin: 0 0 18px; }
.conf-schedule-conf h3 { margin: 22px 0 4px; }
.conf-schedule-day {
    margin: 18px 0 8px;
    padding-bottom: 5px;
    border-bottom: 2px solid #dbe4ec;
    font-size: 15px;
    font-weight: 600;
}
.conf-schedule-list { list-style: none; padding-left: 0; margin: 0; }
.conf-schedule-item {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 12px;
    margin-bottom: 8px;
    border: 1px solid #e3e8ea;
    border-left: 3px solid #dbe4ec;
    border-radius: 4px;
    background: #fff;
}
/* a picked session should be findable at a glance when scanning the list */
.conf-schedule-picked { border-left-color: #2b7a2b; background: #f6fbf6; }
.conf-schedule-when {
    flex: 0 0 165px;
    font-size: 12px;
    color: #4a5b63;
    font-weight: 600;
    line-height: 1.45;
}
.conf-schedule-body { flex: 1 1 auto; min-width: 0; }
.conf-schedule-title { display: block; font-size: 15px; }
.conf-schedule-speakers { font-size: 13px; color: #5f6f77; margin-top: 2px; }
.conf-schedule-abstract { font-size: 13px; color: #555; margin-top: 5px; }
.conf-schedule-abstract > :first-child { margin-top: 0; }
.conf-schedule-abstract > :last-child { margin-bottom: 0; }
.conf-schedule-clash { margin-top: 6px; font-size: 12px; color: #8a3b12; font-weight: 600; }
.conf-schedule-action { flex: 0 0 auto; }
.conf-schedule-toggle { white-space: nowrap; }

/* ── People (directory + private notes) ────────────────────────────────── */
.conf-people-filters { margin: 0 0 16px; }
.conf-people-list { list-style: none; padding-left: 0; margin: 0; }
.conf-person {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 12px;
    margin-bottom: 8px;
    border: 1px solid #e3e8ea;
    border-radius: 4px;
    background: #fff;
}
.conf-person-saved { border-left: 3px solid #2b7a2b; }
.conf-person-photo { flex: 0 0 48px; }
.conf-person-photo img {
    width: 48px; height: 48px;
    border-radius: 50%;
    object-fit: cover;
}
/* initials stand in for a missing photo so the rows stay aligned */
.conf-person-initials {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 48px; height: 48px;
    border-radius: 50%;
    background: #e3e8ea;
    color: #4a5b63;
    font-weight: 700;
    font-size: 15px;
}
.conf-person-body { flex: 1 1 auto; min-width: 0; }
.conf-person-name { font-size: 15px; }
.conf-person-affiliation { font-size: 13px; color: #5f6f77; }
.conf-person-email { font-size: 13px; margin-top: 2px; word-break: break-all; }
.conf-person-note {
    margin-top: 8px;
    padding: 8px 10px;
    background: #fffdf2;
    border: 1px solid #f0e6c8;
    border-radius: 3px;
    font-size: 13px;
    color: #4a4331;
}
.conf-person-note-label {
    display: block;
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: #786d4b;
    font-weight: 700;
    margin-bottom: 2px;
}
.conf-person-actions {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    gap: 5px;
    align-items: stretch;
}
.conf-person-actions .btn { white-space: nowrap; }
.conf-people-privacy { margin-top: 18px; font-size: 12px; }

/* the privacy block in the My details form */
.conf-my-privacy {
    margin: 18px 0 6px;
    padding: 12px 14px;
    border: 1px solid #e3e8ea;
    border-radius: 4px;
    background: #fafbfc;
}
.conf-my-privacy legend {
    width: auto;
    padding: 0 6px;
    margin-bottom: 4px;
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: #5f6f77;
    border: 0;
}
.conf-my-privacy-note { margin: 8px 0 0; font-size: 12px; }

@media (max-width: 700px) {
    .conf-schedule-item, .conf-person { flex-wrap: wrap; }
    .conf-schedule-when { flex-basis: 100%; }
    .conf-schedule-action, .conf-person-actions { flex-basis: 100%; }
    .conf-person-actions { flex-direction: row; }
}

/* ── People: search toolbar + pager ────────────────────────────────────── */
.conf-people-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    margin: 0 0 14px;
}
.conf-people-search {
    position: relative;
    flex: 1 1 280px;
    min-width: 220px;
}
.conf-people-search input {
    padding-left: 32px;
    padding-right: 30px;
}
/* the browser's own clear button would sit on top of ours */
.conf-people-search input[type="search"]::-webkit-search-cancel-button { display: none; }
.conf-people-search-icon {
    position: absolute;
    left: 11px;
    top: 50%;
    transform: translateY(-50%);
    color: #647279;
    pointer-events: none;
    font-size: 13px;
}
.conf-people-clear {
    position: absolute;
    right: 6px;
    top: 50%;
    transform: translateY(-50%);
    border: 0;
    background: none;
    color: #647279;
    font-size: 19px;
    line-height: 1;
    padding: 0 6px;
    cursor: pointer;
}
.conf-people-clear:hover { color: #444; }
.conf-people-filters { flex: 0 0 auto; margin: 0; }
.conf-people-count { margin: 0 0 10px; font-size: 13px; }

/* dim rather than blank the list while a search is in flight — replacing it
   with a spinner makes the page jump on every keystroke */
.conf-people-loading { opacity: .45; transition: opacity .12s; }

.conf-pager {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 4px;
    margin: 18px 0 4px;
}
.conf-pager a, .conf-pager span {
    display: inline-block;
    padding: 6px 11px;
    border-radius: 5px;
    font-size: 13px;
    text-decoration: none;
    color: #22699b;
}
.conf-pager a:hover { background: #e9ecf1; text-decoration: none; }
.conf-pager .conf-pager-current {
    /* Specificity, not preference: ".conf-pager a, .conf-pager span" above is
       (0,1,1) and was overriding a bare .conf-pager-current (0,1,0), so the
       current page rendered #22699b on #22699b — invisible. */
    background: #22699b;
    color: #fff;
    font-weight: 700;
}
.conf-pager-gap { color: #647279; padding: 6px 2px; }
.conf-pager-step { font-weight: 600; }
.conf-pager-disabled { color: #858f94; pointer-events: none; }
.conf-pager-pages { display: inline-flex; flex-wrap: wrap; gap: 2px; }

@media (max-width: 700px) {
    .conf-people-toolbar { flex-direction: column; align-items: stretch; }
    .conf-people-filters { display: flex; gap: 6px; }
    .conf-people-filters .btn { flex: 1 1 auto; }
}

/* the roster's search field sits in the existing filter bar, so it inherits
   that bar's label layout and just needs room to breathe */
.conf-roster-search-label { flex: 1 1 260px; min-width: 200px; }
.conf-roster-search-label .conf-people-search { display: block; }
.conf-roster-filters .conf-people-search input { width: 100%; }

/* Roster count pills. The mdsg theme's .badge is white-on-transparent, so
   these carry their own colors rather than inheriting an invisible one —
   the same reason .conf-schedule-count and the "View as" button do. */
.conf-count {
    display: inline-block;
    padding: 3px 9px;
    margin-right: 5px;
    border-radius: 11px;
    font-size: 12px;
    font-weight: 700;
    color: #fff;
}
.conf-count-ok   { background: #2b7a2b; }
.conf-count-warn { background: #96660a; }
.conf-count-info { background: #22699b; }

/* ── Badge repair (508) ────────────────────────────────────────────────────
   The mdsg theme renders .badge as WHITE TEXT ON A TRANSPARENT BACKGROUND —
   a 1:1 contrast ratio, i.e. completely invisible. Fifteen badges across nine
   Conference templates were silently blank because of it: the "Speaker" tag on
   the roster, "Registered"/"Invited" on the speakers admin, "Active"/"Past" on
   the conferences list, and so on.

   Scoped to .conf-module so this repairs the Conference module without
   changing the theme for every other app. Every pairing below clears 4.5:1
   with white text.
   ------------------------------------------------------------------------ */
.conf-module .badge {
    display: inline-block;
    padding: 3px 8px;
    border-radius: 10px;
    font-size: 11px;
    font-weight: 700;
    line-height: 1.5;
    color: #fff;
    background: #5f6f77;          /* 5.22:1 */
}
.conf-module .badge-success   { background: #2b7a2b; }  /* 5.36:1 */
.conf-module .badge-info      { background: #22699b; }  /* 4.66:1 */
.conf-module .badge-warning   { background: #96660a; }  /* 5.00:1 */
.conf-module .badge-danger    { background: #a32323; }  /* 7.44:1 */
.conf-module .badge-secondary { background: #5f6f77; }  /* 5.22:1 */
.conf-module .badge-default   { background: #5f6f77; }  /* 5.22:1 */

/* ── Theme text-utility repair (508) ───────────────────────────────────────
   Bootstrap's defaults are far below the 4.5:1 floor on white:
   .text-warning #ffc107 is 1.63:1 and .text-info #0dcaf0 is 1.96:1 — the
   payment-methods admin was warning "not configured" in text nobody could
   read. danger/success/primary sit right ON 4.5, with no margin for the
   tinted panels they get used in, so they are nudged too.

   Scoped to .conf-module: repairs this module without restyling every other
   app on the site.
   ------------------------------------------------------------------------ */
.conf-module .text-warning { color: #9f6100 !important; }   /* 5.02:1 */
.conf-module .text-info { color: #00789e !important; }   /* 5.02:1 */
.conf-module .text-danger { color: #d32c3c !important; }   /* 5.01:1 */
.conf-module .text-success { color: #117f4c !important; }   /* 5.04:1 */
.conf-module .text-primary { color: #0465f4 !important; }   /* 5.03:1 */

/* Theme colors that clear 4.5:1 on pure white but dip below it on the tinted
   panels this module uses (abstract boxes #fbfcfc, the speaker card #f7f9fa,
   note cards #fffdf2). Nudged so they hold on every tint here.

   a:not([class]) deliberately spares the nav items, buttons and pager, which
   all carry their own (already-compliant) colors — an unqualified
   ".conf-module a" would outrank them and undo the work above. */
.conf-module .text-muted { color: #5e676f !important; }
.conf-module a:not([class]) { color: #005ae9; }

/* ── Conference hub (the admin "view level") ───────────────────────────── */
.conf-hub-head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 20px;
}
.conf-hub-title { margin: 0 0 4px; }
.conf-hub-meta { margin: 0; color: #5f6f77; font-size: 14px; }
.conf-hub-seq {
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    margin-right: 8px;
}
.conf-hub-actions { display: flex; gap: 6px; flex-wrap: wrap; }

.conf-hub-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
    gap: 12px;
    margin-bottom: 20px;
}
.conf-hub-tile {
    display: block;
    padding: 16px 18px;
    border: 1px solid #e3e8ea;
    border-radius: 6px;
    background: #fff;
    text-decoration: none;
    color: inherit;
    transition: border-color .12s, box-shadow .12s;
}
.conf-hub-tile:hover,
.conf-hub-tile:focus {
    border-color: #22699b;
    box-shadow: 0 2px 6px rgba(0,0,0,.08);
    text-decoration: none;
    color: inherit;
}
.conf-hub-icon { display: block; font-size: 18px; color: #22699b; margin-bottom: 8px; }
.conf-hub-count { display: block; font-size: 26px; font-weight: 700; line-height: 1.1; }
.conf-hub-label { display: block; font-size: 14px; font-weight: 600; }
/* tiles with no number need the label to carry the weight of the heading */
.conf-hub-label-only { font-size: 15px; margin-top: 2px; }
.conf-hub-sub { display: block; font-size: 12px; color: #5f6f77; margin-top: 3px; }
.conf-hub-flag {
    display: inline-block;
    margin-top: 6px;
    margin-right: 4px;
    padding: 2px 8px;
    border-radius: 10px;
    background: #96660a;      /* 5.00:1 with white */
    color: #fff;
    font-size: 11px;
    font-weight: 700;
}
.conf-hub-note { font-size: 13px; }

/* ── Conference picker ─────────────────────────────────────────────────── */
.conf-picker-list { list-style: none; padding-left: 0; margin: 16px 0; }
.conf-picker-item {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 13px 16px;
    margin-bottom: 7px;
    border: 1px solid #e3e8ea;
    border-radius: 5px;
    background: #fff;
    text-decoration: none;
    color: inherit;
}
.conf-picker-item:hover,
.conf-picker-item:focus {
    border-color: #22699b;
    background: #f7fafd;
    text-decoration: none;
    color: inherit;
}
.conf-picker-main { flex: 1 1 auto; min-width: 0; }
.conf-picker-seq { color: #5f6f77; margin-left: 8px; font-size: 13px; }
.conf-picker-meta {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: 8px;
    color: #5f6f77;
    font-size: 13px;
}
.conf-picker-go { color: #22699b; }

@media (max-width: 700px) {
    .conf-picker-item { flex-wrap: wrap; }
    .conf-picker-meta { flex-basis: 100%; }
}

/* ── Scientific posters ────────────────────────────────────────────────── */
.conf-posters-intro { margin: -6px 0 10px; font-size: 15px; }
.conf-posters-count { margin: 0 0 14px; font-size: 13px; }

/* numbered so the list is citable ("poster 12") without storing a number */
.conf-poster-list { padding-left: 0; list-style: none; counter-reset: poster; margin: 0; }
.conf-poster {
    counter-increment: poster;
    position: relative;
    padding: 16px 18px 16px 52px;
    margin-bottom: 10px;
    border: 1px solid #e3e8ea;
    border-left: 3px solid #22699b;
    border-radius: 4px;
    background: #fff;
}
.conf-poster::before {
    content: counter(poster);
    position: absolute;
    left: 16px;
    top: 17px;
    min-width: 24px;
    padding: 2px 6px;
    border-radius: 10px;
    background: #eef1f4;
    color: #4a5b63;
    font-size: 12px;
    font-weight: 700;
    text-align: center;
}
.conf-poster-title { margin: 0 0 5px; font-size: 16px; line-height: 1.35; }
.conf-poster-presenter { margin: 0; font-weight: 600; }
.conf-poster-affiliation { font-weight: 400; color: #5f6f77; }
.conf-poster-authors { margin: 3px 0 0; font-size: 13px; color: #5f6f77; font-style: italic; }
.conf-poster-abstract { margin: 7px 0 0; font-size: 13px; color: #555; }
.conf-poster-download { margin: 8px 0 0; font-size: 13px; }
.conf-poster-download .fa { margin-right: 5px; }

/* attendee-facing card */
.conf-poster-card {
    padding: 16px 18px;
    margin-bottom: 14px;
    border: 1px solid #e3e8ea;
    border-left: 3px solid #2b7a2b;
    border-radius: 4px;
    background: #fff;
}
/* still in review — amber edge so its state is legible at a glance */
.conf-poster-pending { border-left-color: #96660a; background: #fffdf7; }
.conf-poster-card-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin-bottom: 2px;
}
.conf-poster-card-title { margin: 0; font-size: 16px; }
.conf-poster-card-meta { margin: 0 0 6px; font-size: 13px; }
.conf-poster-note { margin: 8px 0 0; font-size: 12px; }
.conf-poster-card-actions { margin-top: 12px; display: flex; gap: 6px; flex-wrap: wrap; }

@media (max-width: 700px) {
    .conf-poster { padding-left: 18px; }
    .conf-poster::before { position: static; display: inline-block; margin-bottom: 6px; }
}

/* ── Past conferences archive ──────────────────────────────────────────── */
.conf-archive-intro { margin: -4px 0 18px; font-size: 14px; }
.conf-archive-series { margin-bottom: 26px; }
.conf-archive-series-title {
    margin: 0 0 10px;
    padding-bottom: 6px;
    border-bottom: 2px solid #dbe4ec;
    font-size: 15px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: #22699b;
}
.conf-archive-list { list-style: none; padding-left: 0; margin: 0; }
.conf-archive-item {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 14px 16px;
    margin-bottom: 8px;
    border: 1px solid #e3e8ea;
    border-left: 3px solid #dbe4ec;
    border-radius: 4px;
    background: #fff;
}
.conf-archive-item:hover { border-left-color: #22699b; }
.conf-archive-main { flex: 1 1 auto; min-width: 0; }
.conf-archive-title { margin: 0 0 3px; font-size: 16px; line-height: 1.3; }
.conf-archive-seq { color: #5f6f77; font-weight: 400; }
.conf-archive-meta { margin: 0; font-size: 13px; color: #5f6f77; }
.conf-archive-counts { margin: 5px 0 0; font-size: 12px; }
/* separated with a middot rather than pills — these are incidental detail,
   not status, and pills would compete with the title */
.conf-archive-count:not(:last-child)::after {
    content: '·';
    margin: 0 6px;
    color: #b8c2c7;
}
.conf-archive-action { flex: 0 0 auto; }
/* the button text is "View" for everyone; the conference name is there for
   screen readers so the links are distinguishable out of context */
.conf-archive-sr {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}

@media (max-width: 700px) {
    .conf-archive-item { flex-wrap: wrap; }
    .conf-archive-action { flex-basis: 100%; }
}

/* ── Public conference two-column layout ──────────────────────────────────
   Hero spans the full width; below it the prose and agenda take the main
   column while the rail carries what a visitor acts on. minmax(0, 1fr) not
   1fr: a wide agenda row (long session titles, speaker lists) would
   otherwise blow the column past its track and squeeze the rail. */
.conf-layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 320px;
    gap: 32px;
    align-items: start;
}

.conf-main { min-width: 0; }

.conf-rail { min-width: 0; }

/* first block in the rail sits flush with the first block in main */
.conf-rail > *:first-child { margin-top: 0; }

/* the pricing card sizes itself for a full-width column; in the rail it is
   the column, so let it fill rather than stop short at its own max-width */
.conf-rail .conf-pricing-card {
    max-width: none;
    margin: 0 0 24px;
}

.conf-rail .conf-venue { margin: 0 0 24px; }

/* full-width in the rail so they read as the column's actions, not stray links */
.conf-rail-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    margin: 0 0 12px;
    padding: 10px 16px;
    font-weight: 600;
}

.conf-rail-btn:last-child { margin-bottom: 24px; }

/* Darkens the button rather than lightening it: the label is white, so any
   button dark enough to carry it stays legible when darkened further — a
   translucent WHITE pill would wash out under a lighter theme button. */
.conf-rail-btn-count {
    padding: 1px 8px;
    border-radius: 10px;
    background: rgba(0, 0, 0, 0.28);
    font-size: 0.8rem;
    font-weight: 700;
}

/* .btn-default is a LIGHT button with dark text, so the same darkening would
   swallow the count — tint it instead and keep the button's own text color */
.conf-rail-btn-count-light {
    background: rgba(0, 0, 0, 0.1);
    color: inherit;
}

/* ── Embedded media (kind = 'embed') ─────────────────────────────────────── */
.conf-session-media { margin: 0 0 28px; }

.conf-embed { margin: 0 0 24px; }

/* aspect-ratio comes from the provider (16/9 video, 4/3 Flickr player) and is
   set inline; the iframe just fills whatever box that makes */
.conf-embed-frame {
    position: relative;
    width: 100%;
    background: #000;
    border-radius: 4px;
    overflow: hidden;
}
.conf-embed-frame iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
}

.conf-embed-caption {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 4px 14px;
    margin-top: 8px;
    font-size: 14px;
}
.conf-embed-title { font-weight: 600; }
.conf-embed-source { white-space: nowrap; }
.conf-embed-source .fa { margin-right: 4px; }
.conf-embed-description { flex-basis: 100%; color: #41525f; }

/* sits above the pricing card, so it needs the gap the card would have given */
.conf-contact-btn { margin-bottom: 16px; }

/* ── Lodging block, directly under Venue in the rail ─────────────────────── */
.conf-lodging { margin: 0 0 24px; }
.conf-lodging h3 { margin: 0 0 6px; }

.conf-lodging-at-venue { margin: 0 0 8px; color: #41525f; }
.conf-lodging-at-venue .fa { margin-right: 5px; }

.conf-lodging-instructions {
    margin: 8px 0 10px;
    font-size: 14px;
    line-height: 1.45;
}

/* the booking link is an action like the rail's other buttons, but secondary
   to Register — .btn-default, not .btn-primary */
.conf-lodging-btn { margin-bottom: 0; }

/* conference-level files and links, bottom of the rail */
.conf-rail-materials { margin: 0 0 20px; }

.conf-rail-materials-heading {
    margin: 0 0 8px;
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: #41525f;
}

.conf-rail-materials-list {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 14px;
}

.conf-rail-materials-list li + li {
    margin-top: 6px;
    padding-top: 6px;
    border-top: 1px solid #dfe4e8;
}

.conf-rail-materials-list .fa { margin-right: 5px; }

.conf-rail-materials-size {
    margin-left: 4px;
    color: #41525f;
    font-size: 12px;
    white-space: nowrap;
}

/* the way back up, shown only on a conference's sub-pages */
.conf-rail-home {
    display: inline-block;
    margin: 4px 0 24px;
    font-size: 14px;
}
.conf-rail-home .fa { margin-right: 4px; }

/* ── Agenda page ─────────────────────────────────────────────────────────── */
.conf-agenda-back { margin: 0 0 20px; font-size: 14px; }
.conf-agenda-back .fa { margin-right: 4px; }

.conf-session-materials {
    margin: 8px 0 0;
    padding-left: 18px;
    font-size: 14px;
}
.conf-session-materials .fa { margin-right: 4px; }

/* ── Session detail page ─────────────────────────────────────────────────── */
.conf-session-page .conf-session-description { margin: 0 0 28px; line-height: 1.6; }

.conf-speaker-card {
    display: flex;
    gap: 16px;
    padding: 16px 0;
    border-top: 1px solid #dfe4e8;
}
.conf-speaker-card:last-child { border-bottom: 1px solid #dfe4e8; }

.conf-speaker-card-pic {
    flex: 0 0 auto;
    width: 72px;
    height: 72px;
    object-fit: cover;
    border-radius: 50%;
}

.conf-speaker-card-body { min-width: 0; }
.conf-speaker-card-name { font-size: 17px; font-weight: 600; }
.conf-speaker-card-affiliation { color: #41525f; font-size: 14px; }
.conf-speaker-card-bio { margin-top: 6px; line-height: 1.5; }

@media (max-width: 700px) {
    .conf-speaker-card { flex-wrap: wrap; }
}

@media (max-width: 900px) {
    .conf-layout {
        grid-template-columns: 1fr;
        gap: 0;
    }
    /* price and venue ahead of a long agenda rather than buried under it */
    .conf-rail { order: -1; }
}

/* ── "Also coming up" band ─────────────────────────────────────────────────
   Deliberately quieter than the featured conference around it: this is a
   signpost, not a second sales pitch competing with the page it sits on. */
.conf-also {
    margin: 0 0 24px;
    padding: 12px 16px;
    background: #f4f6f8;
    border-left: 4px solid #22699b;
    border-radius: 3px;
}

.conf-also-heading {
    margin: 0 0 8px;
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: #41525f;
}

.conf-also-list {
    margin: 0;
    padding: 0;
    list-style: none;
}

.conf-also-item + .conf-also-item {
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px solid #dfe4e8;
}

/* whole row is the target, so the hit area matches what looks clickable */
.conf-also-link {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 4px 12px;
    padding: 2px 0;
    color: #1c4f75;
    text-decoration: none;
}

.conf-also-link:hover,
.conf-also-link:focus {
    color: #143b58;
}

.conf-also-link:hover .conf-also-title,
.conf-also-link:focus .conf-also-title {
    text-decoration: underline;
}

.conf-also-link:focus-visible {
    outline: 2px solid #22699b;
    outline-offset: 2px;
}

.conf-also-title {
    font-weight: 600;
}

.conf-also-seq {
    font-weight: 400;
    color: #41525f;
}

.conf-also-when {
    color: #41525f;
    font-size: 0.9rem;
}

/* the only urgent thing in the band, so the only thing allowed to shout */
.conf-also-deadline {
    padding: 1px 8px;
    border-radius: 10px;
    background: #8a4b08;
    color: #ffffff;
    font-size: 0.75rem;
    font-weight: 600;
    white-space: nowrap;
}

@media (max-width: 700px) {
    .conf-also-link { gap: 2px; }
    .conf-also-when,
    .conf-also-deadline { flex-basis: 100%; }
    .conf-also-deadline { align-self: flex-start; }
}

/* The poster year switcher lived here. It went with the markup: posters are
   reached from inside a conference now, so the page is that conference's
   posters rather than a cross-year archive showing one of them. */
